remove build dir
parent
385c884acd
commit
7a865c53ea
@ -1,10 +0,0 @@
|
|||||||
Package: vanilla-first-setup
|
|
||||||
Version: 0.0.1
|
|
||||||
Architecture: amd64
|
|
||||||
Maintainer: Mirko Brombin <send@mirko.pm>
|
|
||||||
Installed-Size: 65
|
|
||||||
Depends: dconf-gsettings-backend | gsettings-backend, python3, python3-gi, libadwaita-1, gir1.2-gtk-4.0, gir1.2-adw-1
|
|
||||||
Section: utils
|
|
||||||
Priority: optional
|
|
||||||
Homepage: https://github.com/mirkobrombin/vanilla-first-setup/
|
|
||||||
Description: This utility is meant to be used in Ubuntu Vanilla GNOME as a first-setup wizard.
|
|
@ -1,24 +0,0 @@
|
|||||||
3f84a85bd8dcb22475ca07a2d69063ac usr/bin/vanilla-first-setup
|
|
||||||
e53214a91cfee2c537138e64d0d2357e usr/bin/vanilla-first-setup-processor
|
|
||||||
f62ae2de8dd39b794fa94951db288612 usr/share/appdata/io.github.vanilla-os.FirstSetup.appdata.xml
|
|
||||||
572c7ac7342d5e999af8cf5fc99fc7ba usr/share/applications/io.github.vanilla-os.FirstSetup.desktop
|
|
||||||
632c1335ca45192e9b887308023c156c usr/share/doc/vanilla-first-setup/changelog.gz
|
|
||||||
62ed186d7529beecf72bcf7c48b53a76 usr/share/doc/vanilla-first-setup/copyright
|
|
||||||
3ff815595db45e9dcd137d06f9d8718c usr/share/glib-2.0/schemas/io.github.vanilla-os.FirstSetup.gschema.xml
|
|
||||||
a3cd0585c74138a988a7225dd57fc171 usr/share/icons/hicolor/scalable/apps/io.github.vanilla-os.FirstSetup.svg
|
|
||||||
a3cd0585c74138a988a7225dd57fc171 usr/share/icons/hicolor/symbolic/apps/io.github.vanilla-os.FirstSetup-symbolic.svg
|
|
||||||
75fdbd9173045311c140056e34292035 usr/share/io.github.vanilla-os.FirstSetup/vanilla-first-setup.gresource
|
|
||||||
d41d8cd98f00b204e9800998ecf8427e usr/share/io.github.vanilla-os.FirstSetup/vanilla_first_setup/__init__.py
|
|
||||||
cacabd792fe13148f625e90b1d63e343 usr/share/io.github.vanilla-os.FirstSetup/vanilla_first_setup/main.py
|
|
||||||
d41d8cd98f00b204e9800998ecf8427e usr/share/io.github.vanilla-os.FirstSetup/vanilla_first_setup/models/__init__.py
|
|
||||||
655cc3575fd9547bcc28605a40adecb4 usr/share/io.github.vanilla-os.FirstSetup/vanilla_first_setup/models/config.py
|
|
||||||
19a9c8ef77a0b94b9bd9da204bf619be usr/share/io.github.vanilla-os.FirstSetup/vanilla_first_setup/models/preset.py
|
|
||||||
d41d8cd98f00b204e9800998ecf8427e usr/share/io.github.vanilla-os.FirstSetup/vanilla_first_setup/utils/__init__.py
|
|
||||||
24bb5bd4e6d6262c1b454b3656ab24e0 usr/share/io.github.vanilla-os.FirstSetup/vanilla_first_setup/utils/apt.py
|
|
||||||
4d805e042731d213eb5139530d8aa638 usr/share/io.github.vanilla-os.FirstSetup/vanilla_first_setup/utils/checks.py
|
|
||||||
7823cbc7898533c975d6a44bc5805480 usr/share/io.github.vanilla-os.FirstSetup/vanilla_first_setup/utils/configurator.py
|
|
||||||
d757da1b73916417336840cc67295681 usr/share/io.github.vanilla-os.FirstSetup/vanilla_first_setup/utils/flatpak.py
|
|
||||||
f2595187532f527875795277675234a5 usr/share/io.github.vanilla-os.FirstSetup/vanilla_first_setup/utils/processor.py
|
|
||||||
0ebff648510796f3d38e84739469f97e usr/share/io.github.vanilla-os.FirstSetup/vanilla_first_setup/utils/run_async.py
|
|
||||||
ebbd22d7a8847f604900387b8c9d86a2 usr/share/io.github.vanilla-os.FirstSetup/vanilla_first_setup/utils/snap.py
|
|
||||||
f07c8b3e157f197d2cefd0a89862b3c1 usr/share/io.github.vanilla-os.FirstSetup/vanilla_first_setup/window.py
|
|
@ -1,43 +0,0 @@
|
|||||||
#!/usr/bin/python3
|
|
||||||
|
|
||||||
# vanilla-first-setup.in
|
|
||||||
#
|
|
||||||
# Copyright 2022 mirkobrombin
|
|
||||||
#
|
|
||||||
# This program is free software: you can redistribute it and/or modify
|
|
||||||
# it under the terms of the GNU General Public License as published by
|
|
||||||
# the Free Software Foundationat version 3 of the License.
|
|
||||||
#
|
|
||||||
# This program is distributed in the hope that it will be useful,
|
|
||||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
# GNU General Public License for more details.
|
|
||||||
#
|
|
||||||
# You should have received a copy of the GNU General Public License
|
|
||||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
import os
|
|
||||||
import sys
|
|
||||||
import signal
|
|
||||||
import locale
|
|
||||||
import gettext
|
|
||||||
|
|
||||||
VERSION = '0.0.1'
|
|
||||||
pkgdatadir = '/usr/share/io.github.vanilla-os.FirstSetup'
|
|
||||||
localedir = '/usr/share/locale'
|
|
||||||
|
|
||||||
sys.path.insert(1, pkgdatadir)
|
|
||||||
signal.signal(signal.SIGINT, signal.SIG_DFL)
|
|
||||||
locale.bindtextdomain('vanilla_first_setup', localedir)
|
|
||||||
locale.textdomain('vanilla_first_setup')
|
|
||||||
gettext.install('vanilla_first_setup', localedir)
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
|
||||||
import gi
|
|
||||||
|
|
||||||
from gi.repository import Gio
|
|
||||||
resource = Gio.Resource.load(os.path.join(pkgdatadir, 'vanilla-first-setup.gresource'))
|
|
||||||
resource._register()
|
|
||||||
|
|
||||||
from vanilla_first_setup import main
|
|
||||||
sys.exit(main.main(VERSION))
|
|
@ -1,45 +0,0 @@
|
|||||||
#!/usr/bin/python3
|
|
||||||
|
|
||||||
# vanilla-first-setup-processor.in
|
|
||||||
#
|
|
||||||
# Copyright 2022 mirkobrombin
|
|
||||||
#
|
|
||||||
# This program is free software: you can redistribute it and/or modify
|
|
||||||
# it under the terms of the GNU General Public License as published by
|
|
||||||
# the Free Software Foundationat version 3 of the License.
|
|
||||||
#
|
|
||||||
# This program is distributed in the hope that it will be useful,
|
|
||||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
# GNU General Public License for more details.
|
|
||||||
#
|
|
||||||
# You should have received a copy of the GNU General Public License
|
|
||||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
import os
|
|
||||||
import sys
|
|
||||||
import signal
|
|
||||||
import locale
|
|
||||||
import gettext
|
|
||||||
import argparse
|
|
||||||
|
|
||||||
VERSION = '0.0.1'
|
|
||||||
pkgdatadir = '/usr/share/io.github.vanilla-os.FirstSetup'
|
|
||||||
localedir = '/usr/share/locale'
|
|
||||||
|
|
||||||
sys.path.insert(1, pkgdatadir)
|
|
||||||
signal.signal(signal.SIGINT, signal.SIG_DFL)
|
|
||||||
locale.bindtextdomain('vanilla_first_setup', localedir)
|
|
||||||
locale.textdomain('vanilla_first_setup')
|
|
||||||
gettext.install('vanilla_first_setup', localedir)
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
|
||||||
from vanilla_first_setup.utils.configurator import Configurator
|
|
||||||
from vanilla_first_setup.models.config import Config
|
|
||||||
|
|
||||||
parser = argparse.ArgumentParser()
|
|
||||||
parser.add_argument('config', help='The configuration string (e.g. snap::True|flatpak::False|apport::True)')
|
|
||||||
args = parser.parse_args()
|
|
||||||
|
|
||||||
config = Config.from_str(args.config)
|
|
||||||
Configurator(config).apply()
|
|
@ -1,30 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<component type="desktop">
|
|
||||||
<id>io.github.vanilla-os.FirstSetup.desktop</id>
|
|
||||||
<metadata_license>CC0-1.0</metadata_license>
|
|
||||||
<project_license>GPL-3.0-only</project_license>
|
|
||||||
<name translatable="no">Vanilla OS First Setup</name>
|
|
||||||
<summary>Tweak your Ubuntu Vanilla GNOME installation.</summary>
|
|
||||||
<developer_name translatable="no">Mirko Brombin</developer_name>
|
|
||||||
<description>
|
|
||||||
<p>No description</p>
|
|
||||||
</description>
|
|
||||||
<screenshots/>
|
|
||||||
<translation type="gettext">io.github.vanilla-os.FirstSetup</translation>
|
|
||||||
<content_rating type="oars-1.1"/>
|
|
||||||
<recommends>
|
|
||||||
<control>pointing</control>
|
|
||||||
<control>keyboard</control>
|
|
||||||
<control>touch</control>
|
|
||||||
</recommends>
|
|
||||||
<requires>
|
|
||||||
<display_length compare="ge">768</display_length>
|
|
||||||
</requires>
|
|
||||||
<releases>
|
|
||||||
<release version="1.0.1" date="2022-09-03">
|
|
||||||
<description>
|
|
||||||
<p>First release</p>
|
|
||||||
</description>
|
|
||||||
</release>
|
|
||||||
</releases>
|
|
||||||
</component>
|
|
@ -1,8 +0,0 @@
|
|||||||
[Desktop Entry]
|
|
||||||
Name=Vanilla OS First Setup
|
|
||||||
Exec=vanilla-first-setup
|
|
||||||
Icon=io.github.vanilla-os.FirstSetup
|
|
||||||
Terminal=false
|
|
||||||
Type=Application
|
|
||||||
Categories=GTK;
|
|
||||||
StartupNotify=true
|
|
Binary file not shown.
@ -1,23 +0,0 @@
|
|||||||
Format: http://dep.debian.net/deps/dep5
|
|
||||||
Upstream-Name: Vanilla OS First Setup
|
|
||||||
Source: https://github.com/mirko-brombin/vanilla-first-setup
|
|
||||||
|
|
||||||
Files: *
|
|
||||||
Copyright: 2022 Mirko Brombin <send@mirko.pm>
|
|
||||||
License: GPL-3.0
|
|
||||||
|
|
||||||
License: GPL-3.0
|
|
||||||
This program is free software: you can redistribute it and/or modify
|
|
||||||
it under the terms of the GNU General Public License as published by
|
|
||||||
the Free Software Foundation, either version 3 of the License.
|
|
||||||
.
|
|
||||||
This package is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
GNU General Public License for more details.
|
|
||||||
.
|
|
||||||
You should have received a copy of the GNU General Public License
|
|
||||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
.
|
|
||||||
On Debian systems, the complete text of the GNU General
|
|
||||||
Public License version 3 can be found in "/usr/share/common-licenses/GPL-3".
|
|
@ -1,5 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<schemalist gettext-domain="vanilla-first-setup">
|
|
||||||
<schema id="io.github.vanilla-os.FirstSetup" path="/io/github/vanilla-os/FirstSetup/">
|
|
||||||
</schema>
|
|
||||||
</schemalist>
|
|
@ -1,18 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<svg viewBox="0 0 500 500" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<ellipse style="fill: rgb(221, 72, 20);" cx="250.444" cy="246.003" rx="214.92" ry="214.92"/>
|
|
||||||
<g transform="matrix(1, 0, 0, 1, -119.704704, -266.193634)" id="layer1">
|
|
||||||
<g transform="translate(925.8326,120.8762)" id="g3963">
|
|
||||||
<g transform="matrix(2.269061, 0, 0, 2.269061, -671.41095, 251.059219)" style="fill: black; fill-opacity: 1; fill-rule: nonzero; stroke: none; stroke-miterlimit: 4;" id="g3771">
|
|
||||||
<g style="fill:black;fill-opacity:1" id="g3773">
|
|
||||||
<path d="M 86.068,0 C 61.466,0 56.851,35.041 70.691,35.041 C 84.529,35.041 110.671,0 86.068,0 z " style="fill-opacity: 1; fill: rgb(255, 255, 255);" id="path3775"/>
|
|
||||||
<path d="M 45.217,30.699 C 52.586,31.149 60.671,2.577 46.821,4.374 C 32.976,6.171 37.845,30.249 45.217,30.699 z " style="fill-opacity: 1; fill: rgb(255, 255, 255);" id="path3777"/>
|
|
||||||
<path d="M 11.445,48.453 C 16.686,46.146 12.12,23.581 3.208,29.735 C -5.7,35.89 6.204,50.759 11.445,48.453 z " style="fill-opacity: 1; fill: rgb(255, 255, 255);" id="path3779"/>
|
|
||||||
<path d="M 26.212,36.642 C 32.451,35.37 32.793,9.778 21.667,14.369 C 10.539,18.961 19.978,37.916 26.212,36.642 L 26.212,36.642 z " style="fill-opacity: 1; fill: rgb(255, 255, 255);" id="path3781"/>
|
|
||||||
<path d="M 58.791,93.913 C 59.898,102.367 52.589,106.542 45.431,101.092 C 22.644,83.743 83.16,75.088 79.171,51.386 C 75.86,31.712 15.495,37.769 8.621,68.553 C 3.968,89.374 27.774,118.26 52.614,118.26 C 64.834,118.26 78.929,107.226 81.566,93.248 C 83.58,82.589 57.867,86.86 58.791,93.913 L 58.791,93.913 z " style="fill-opacity: 1; fill: rgb(255, 255, 255);" id="path3783"/>
|
|
||||||
</g>
|
|
||||||
</g>
|
|
||||||
<text x="-406.52405" y="527.92285" style="font-size: 25.8884px; font-style: normal; font-weight: normal; fill: black; fill-opacity: 1; stroke: none; stroke-width: 1pt; stroke-linecap: butt; stroke-linejoin: miter; stroke-opacity: 1; font-family: "Bitstream Vera Sans"; white-space: pre;" id="text3797"> </text>
|
|
||||||
</g>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 2.0 KiB |
@ -1,18 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<svg viewBox="0 0 500 500" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<ellipse style="fill: rgb(221, 72, 20);" cx="250.444" cy="246.003" rx="214.92" ry="214.92"/>
|
|
||||||
<g transform="matrix(1, 0, 0, 1, -119.704704, -266.193634)" id="layer1">
|
|
||||||
<g transform="translate(925.8326,120.8762)" id="g3963">
|
|
||||||
<g transform="matrix(2.269061, 0, 0, 2.269061, -671.41095, 251.059219)" style="fill: black; fill-opacity: 1; fill-rule: nonzero; stroke: none; stroke-miterlimit: 4;" id="g3771">
|
|
||||||
<g style="fill:black;fill-opacity:1" id="g3773">
|
|
||||||
<path d="M 86.068,0 C 61.466,0 56.851,35.041 70.691,35.041 C 84.529,35.041 110.671,0 86.068,0 z " style="fill-opacity: 1; fill: rgb(255, 255, 255);" id="path3775"/>
|
|
||||||
<path d="M 45.217,30.699 C 52.586,31.149 60.671,2.577 46.821,4.374 C 32.976,6.171 37.845,30.249 45.217,30.699 z " style="fill-opacity: 1; fill: rgb(255, 255, 255);" id="path3777"/>
|
|
||||||
<path d="M 11.445,48.453 C 16.686,46.146 12.12,23.581 3.208,29.735 C -5.7,35.89 6.204,50.759 11.445,48.453 z " style="fill-opacity: 1; fill: rgb(255, 255, 255);" id="path3779"/>
|
|
||||||
<path d="M 26.212,36.642 C 32.451,35.37 32.793,9.778 21.667,14.369 C 10.539,18.961 19.978,37.916 26.212,36.642 L 26.212,36.642 z " style="fill-opacity: 1; fill: rgb(255, 255, 255);" id="path3781"/>
|
|
||||||
<path d="M 58.791,93.913 C 59.898,102.367 52.589,106.542 45.431,101.092 C 22.644,83.743 83.16,75.088 79.171,51.386 C 75.86,31.712 15.495,37.769 8.621,68.553 C 3.968,89.374 27.774,118.26 52.614,118.26 C 64.834,118.26 78.929,107.226 81.566,93.248 C 83.58,82.589 57.867,86.86 58.791,93.913 L 58.791,93.913 z " style="fill-opacity: 1; fill: rgb(255, 255, 255);" id="path3783"/>
|
|
||||||
</g>
|
|
||||||
</g>
|
|
||||||
<text x="-406.52405" y="527.92285" style="font-size: 25.8884px; font-style: normal; font-weight: normal; fill: black; fill-opacity: 1; stroke: none; stroke-width: 1pt; stroke-linecap: butt; stroke-linejoin: miter; stroke-opacity: 1; font-family: "Bitstream Vera Sans"; white-space: pre;" id="text3797"> </text>
|
|
||||||
</g>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 2.0 KiB |
Binary file not shown.
@ -1,72 +0,0 @@
|
|||||||
# main.py
|
|
||||||
#
|
|
||||||
# Copyright 2022 mirkobrombin
|
|
||||||
#
|
|
||||||
# This program is free software: you can redistribute it and/or modify
|
|
||||||
# it under the terms of the GNU General Public License as published by
|
|
||||||
# the Free Software Foundationat version 3 of the License.
|
|
||||||
#
|
|
||||||
# This program is distributed in the hope that it will be useful,
|
|
||||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
# GNU General Public License for more details.
|
|
||||||
#
|
|
||||||
# You should have received a copy of the GNU General Public License
|
|
||||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
from vanilla_first_setup.window import FirstSetupWindow
|
|
||||||
from gi.repository import Gtk, Gio, Adw
|
|
||||||
import sys
|
|
||||||
import gi
|
|
||||||
import logging
|
|
||||||
|
|
||||||
gi.require_version('Gtk', '4.0')
|
|
||||||
gi.require_version('Adw', '1')
|
|
||||||
|
|
||||||
|
|
||||||
logging.basicConfig(level=logging.INFO)
|
|
||||||
|
|
||||||
|
|
||||||
class FirstSetupApplication(Adw.Application):
|
|
||||||
"""The main application singleton class."""
|
|
||||||
|
|
||||||
def __init__(self):
|
|
||||||
super().__init__(application_id='io.github.vanilla-os.FirstSetup',
|
|
||||||
flags=Gio.ApplicationFlags.FLAGS_NONE)
|
|
||||||
self.create_action('quit', self.close, ['<primary>q'])
|
|
||||||
|
|
||||||
def do_activate(self):
|
|
||||||
"""Called when the application is activated.
|
|
||||||
|
|
||||||
We raise the application's main window, creating it if
|
|
||||||
necessary.
|
|
||||||
"""
|
|
||||||
win = self.props.active_window
|
|
||||||
if not win:
|
|
||||||
win = FirstSetupWindow(application=self)
|
|
||||||
win.present()
|
|
||||||
|
|
||||||
def create_action(self, name, callback, shortcuts=None):
|
|
||||||
"""Add an application action.
|
|
||||||
|
|
||||||
Args:
|
|
||||||
name: the name of the action
|
|
||||||
callback: the function to be called when the action is
|
|
||||||
activated
|
|
||||||
shortcuts: an optional list of accelerators
|
|
||||||
"""
|
|
||||||
action = Gio.SimpleAction.new(name, None)
|
|
||||||
action.connect("activate", callback)
|
|
||||||
self.add_action(action)
|
|
||||||
if shortcuts:
|
|
||||||
self.set_accels_for_action(f"app.{name}", shortcuts)
|
|
||||||
|
|
||||||
def close(self, *args):
|
|
||||||
"""Close the application."""
|
|
||||||
self.quit()
|
|
||||||
|
|
||||||
|
|
||||||
def main(version):
|
|
||||||
"""The application's entry point."""
|
|
||||||
app = FirstSetupApplication()
|
|
||||||
return app.run(sys.argv)
|
|
@ -1,25 +0,0 @@
|
|||||||
class Config:
|
|
||||||
|
|
||||||
def __init__(self, snap: bool, flatpak: bool, apport: bool):
|
|
||||||
self.snap = snap
|
|
||||||
self.flatpak = flatpak
|
|
||||||
self.apport = apport
|
|
||||||
|
|
||||||
def get_str(self) -> str:
|
|
||||||
return "snap::{0}|flatpak::{1}|apport::{2}".format(
|
|
||||||
self.snap, self.flatpak, self.apport
|
|
||||||
)
|
|
||||||
|
|
||||||
@classmethod
|
|
||||||
def from_str(cls, config_str: str) -> 'Config':
|
|
||||||
items = config_str.split('|')
|
|
||||||
|
|
||||||
snap = items[0].split('::')[1]
|
|
||||||
flatpak = items[1].split('::')[1]
|
|
||||||
apport = items[2].split('::')[1]
|
|
||||||
|
|
||||||
return cls(
|
|
||||||
snap=bool(snap),
|
|
||||||
flatpak=bool(flatpak),
|
|
||||||
apport=bool(apport)
|
|
||||||
)
|
|
@ -1,5 +0,0 @@
|
|||||||
class Preset:
|
|
||||||
|
|
||||||
snap: bool = True
|
|
||||||
flatpak: bool = True
|
|
||||||
apport: bool = True
|
|
@ -1,44 +0,0 @@
|
|||||||
import subprocess
|
|
||||||
|
|
||||||
|
|
||||||
class Apt:
|
|
||||||
|
|
||||||
@staticmethod
|
|
||||||
def install(packages: list):
|
|
||||||
subprocess.run(
|
|
||||||
['sudo', 'apt', 'install'] + packages,
|
|
||||||
env={'DEBIAN_FRONTEND': 'noninteractive'},
|
|
||||||
check=True
|
|
||||||
)
|
|
||||||
|
|
||||||
@staticmethod
|
|
||||||
def remove(packages: list):
|
|
||||||
subprocess.run(
|
|
||||||
['sudo', 'apt', 'remove'] + packages,
|
|
||||||
env={'DEBIAN_FRONTEND': 'noninteractive'},
|
|
||||||
check=True
|
|
||||||
)
|
|
||||||
|
|
||||||
@staticmethod
|
|
||||||
def purge(packages: list):
|
|
||||||
subprocess.run(
|
|
||||||
['sudo', 'apt', 'purge'] + packages,
|
|
||||||
env={'DEBIAN_FRONTEND': 'noninteractive'},
|
|
||||||
check=True
|
|
||||||
)
|
|
||||||
|
|
||||||
@staticmethod
|
|
||||||
def update():
|
|
||||||
subprocess.run(
|
|
||||||
['sudo', 'apt', 'update'],
|
|
||||||
env={'DEBIAN_FRONTEND': 'noninteractive'},
|
|
||||||
check=True
|
|
||||||
)
|
|
||||||
|
|
||||||
@staticmethod
|
|
||||||
def upgrade():
|
|
||||||
subprocess.run(
|
|
||||||
['sudo', 'apt', 'upgrade'],
|
|
||||||
env={'DEBIAN_FRONTEND': 'noninteractive'},
|
|
||||||
check=True
|
|
||||||
)
|
|
@ -1,13 +0,0 @@
|
|||||||
import shutil
|
|
||||||
|
|
||||||
|
|
||||||
def is_snap_installed():
|
|
||||||
return shutil.which('snap') is not None
|
|
||||||
|
|
||||||
|
|
||||||
def is_flatpak_installed():
|
|
||||||
return shutil.which('flatpak') is not None
|
|
||||||
|
|
||||||
|
|
||||||
def is_apport_installed():
|
|
||||||
return shutil.which('apport') is not None
|
|
@ -1,99 +0,0 @@
|
|||||||
import os
|
|
||||||
import time
|
|
||||||
import logging
|
|
||||||
|
|
||||||
from vanilla_first_setup.utils import checks
|
|
||||||
from vanilla_first_setup.utils.apt import Apt
|
|
||||||
from vanilla_first_setup.utils.flatpak import Flatpak
|
|
||||||
from vanilla_first_setup.utils.snap import Snap
|
|
||||||
|
|
||||||
|
|
||||||
logger = logging.getLogger("FirstSetup::Configurator")
|
|
||||||
|
|
||||||
|
|
||||||
class Configurator:
|
|
||||||
|
|
||||||
def __init__(self, config: 'Config', fake: bool = False):
|
|
||||||
self.config = config
|
|
||||||
self.fake = fake
|
|
||||||
|
|
||||||
def apply(self):
|
|
||||||
self.__enable_snap() if self.config.snap else self.__disable_snap()
|
|
||||||
self.__enable_flatpak() if self.config.flatpak else self.__disable_flatpak()
|
|
||||||
self.__enable_apport() if self.config.apport else self.__disable_apport()
|
|
||||||
|
|
||||||
def __fake(self, msg: str):
|
|
||||||
time.sleep(1)
|
|
||||||
logger.info(f"Fake: {msg}")
|
|
||||||
|
|
||||||
def __enable_snap(self):
|
|
||||||
if self.fake:
|
|
||||||
return self.__fake("Fake: Snap enabled")
|
|
||||||
|
|
||||||
if not checks.is_snap_installed():
|
|
||||||
Apt.install(['snapd', 'gnome-software-plugin-snap'])
|
|
||||||
Apt.update()
|
|
||||||
|
|
||||||
if not self.config.flatpak:
|
|
||||||
Snap.install(['snap-store'])
|
|
||||||
|
|
||||||
def __disable_snap(self):
|
|
||||||
if self.fake:
|
|
||||||
return self.__fake("Fake: Snap disabled")
|
|
||||||
|
|
||||||
if checks.is_snap_installed():
|
|
||||||
Apt.purge(['snapd'])
|
|
||||||
|
|
||||||
def __enable_flatpak(self):
|
|
||||||
if self.fake:
|
|
||||||
return self.__fake("Fake: Flatpak enabled")
|
|
||||||
|
|
||||||
if not checks.is_flatpak_installed():
|
|
||||||
Apt.install(['flatpak'])
|
|
||||||
Apt.update()
|
|
||||||
Flatpak.add_repo("https://flathub.org/repo/flathub.flatpakrepo")
|
|
||||||
|
|
||||||
def __disable_flatpak(self):
|
|
||||||
if self.fake:
|
|
||||||
return self.__fake("Fake: Flatpak disabled")
|
|
||||||
|
|
||||||
if checks.is_flatpak_installed():
|
|
||||||
Apt.purge(['flatpak'])
|
|
||||||
|
|
||||||
def __enable_apport(self):
|
|
||||||
if self.fake:
|
|
||||||
return self.__fake("Fake: Apport enabled")
|
|
||||||
|
|
||||||
if not checks.is_apport_installed():
|
|
||||||
Apt.install(['apport'])
|
|
||||||
Apt.update()
|
|
||||||
|
|
||||||
def __disable_apport(self):
|
|
||||||
if self.fake:
|
|
||||||
return self.__fake("Fake: Apport disabled")
|
|
||||||
|
|
||||||
if checks.is_apport_installed():
|
|
||||||
Apt.purge(['apport'])
|
|
||||||
|
|
||||||
def __disable_on_startup(self):
|
|
||||||
if self.fake:
|
|
||||||
return self.__fake("Fake: Disable on startup")
|
|
||||||
|
|
||||||
autostart_file = os.path.expanduser("~/.config/autostart/vanilla-first-setup.desktop")
|
|
||||||
if os.path.exists(autostart_file):
|
|
||||||
os.remove(autostart_file)
|
|
||||||
|
|
||||||
def __enable_on_startup(self):
|
|
||||||
if self.fake:
|
|
||||||
return self.__fake("Fake: Enable on startup")
|
|
||||||
|
|
||||||
autostart_file = os.path.expanduser("~/.config/autostart/vanilla-first-setup.desktop")
|
|
||||||
if not os.path.exists(autostart_file):
|
|
||||||
with open(autostart_file, "w") as f:
|
|
||||||
f.write("[Desktop Entry]")
|
|
||||||
f.write("Type=Application")
|
|
||||||
f.write("Name=Vanilla OS First Setup")
|
|
||||||
f.write("Exec=vanilla-first-setup")
|
|
||||||
f.write("Terminal=false")
|
|
||||||
f.write("X-GNOME-Autostart-enabled=true")
|
|
||||||
|
|
@ -1,25 +0,0 @@
|
|||||||
import subprocess
|
|
||||||
|
|
||||||
|
|
||||||
class Flatpak:
|
|
||||||
|
|
||||||
@staticmethod
|
|
||||||
def install(packages: list):
|
|
||||||
subprocess.run(
|
|
||||||
['flatpak', 'install', '--user'] + packages,
|
|
||||||
check=True
|
|
||||||
)
|
|
||||||
|
|
||||||
@staticmethod
|
|
||||||
def remove(packages: list):
|
|
||||||
subprocess.run(
|
|
||||||
['flatpak', 'remove', '--user'] + packages,
|
|
||||||
check=True
|
|
||||||
)
|
|
||||||
|
|
||||||
@staticmethod
|
|
||||||
def add_repo(repo: str):
|
|
||||||
subprocess.run(
|
|
||||||
['flatpak', 'remote-add', '--user', '--if-not-exists', repo],
|
|
||||||
check=True
|
|
||||||
)
|
|
@ -1,18 +0,0 @@
|
|||||||
import subprocess
|
|
||||||
|
|
||||||
|
|
||||||
class Processor:
|
|
||||||
|
|
||||||
def __init__(self, config: 'Config'):
|
|
||||||
self.__config = config
|
|
||||||
|
|
||||||
def run(self):
|
|
||||||
proc = subprocess.run(
|
|
||||||
["pkexec", "vanilla-first-setup-processor", self.__config.get_str()],
|
|
||||||
check=True
|
|
||||||
)
|
|
||||||
|
|
||||||
if proc.returncode != 0:
|
|
||||||
return False, "Error executing the Vanilla OS First Setup Processor"
|
|
||||||
|
|
||||||
return True
|
|
@ -1,70 +0,0 @@
|
|||||||
# run_async.py
|
|
||||||
#
|
|
||||||
# Copyright 2022 brombinmirko <send@mirko.pm>
|
|
||||||
#
|
|
||||||
# This program is free software: you can redistribute it and/or modify
|
|
||||||
# it under the terms of the GNU General Public License as published by
|
|
||||||
# the Free Software Foundation, in version 3 of the License.
|
|
||||||
#
|
|
||||||
# This program is distributed in the hope that it will be useful,
|
|
||||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
# GNU General Public License for more details.
|
|
||||||
#
|
|
||||||
# You should have received a copy of the GNU General Public License
|
|
||||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
#
|
|
||||||
|
|
||||||
import os
|
|
||||||
import sys
|
|
||||||
import threading
|
|
||||||
import traceback
|
|
||||||
import logging
|
|
||||||
|
|
||||||
from gi.repository import GLib
|
|
||||||
|
|
||||||
logger = logging.getLogger("FirstSetup::Async")
|
|
||||||
|
|
||||||
|
|
||||||
class RunAsync(threading.Thread):
|
|
||||||
"""
|
|
||||||
This class is used to execute a function asynchronously.
|
|
||||||
It takes a function, a callback and a list of arguments as input.
|
|
||||||
"""
|
|
||||||
|
|
||||||
def __init__(self, task_func, callback=None, *args, **kwargs):
|
|
||||||
if "DEBUG_MODE" in os.environ:
|
|
||||||
import faulthandler
|
|
||||||
faulthandler.enable()
|
|
||||||
|
|
||||||
self.source_id = None
|
|
||||||
assert threading.current_thread() is threading.main_thread()
|
|
||||||
|
|
||||||
super(RunAsync, self).__init__(target=self.__target, args=args, kwargs=kwargs)
|
|
||||||
|
|
||||||
self.task_func = task_func
|
|
||||||
|
|
||||||
self.callback = callback if callback else lambda r, e: None
|
|
||||||
self.daemon = kwargs.pop("daemon", True)
|
|
||||||
|
|
||||||
self.start()
|
|
||||||
|
|
||||||
def __target(self, *args, **kwargs):
|
|
||||||
result = None
|
|
||||||
error = None
|
|
||||||
|
|
||||||
logger.debug(f"Running async job [{self.task_func}].")
|
|
||||||
|
|
||||||
try:
|
|
||||||
result = self.task_func(*args, **kwargs)
|
|
||||||
except Exception as exception:
|
|
||||||
logger.error("Error while running async job: "
|
|
||||||
f"{self.task_func}\nException: {exception}")
|
|
||||||
|
|
||||||
error = exception
|
|
||||||
_ex_type, _ex_value, trace = sys.exc_info()
|
|
||||||
traceback.print_tb(trace)
|
|
||||||
traceback_info = '\n'.join(traceback.format_tb(trace))
|
|
||||||
|
|
||||||
self.source_id = GLib.idle_add(self.callback, result, error)
|
|
||||||
return self.source_id
|
|
@ -1,18 +0,0 @@
|
|||||||
import subprocess
|
|
||||||
|
|
||||||
|
|
||||||
class Snap:
|
|
||||||
|
|
||||||
@staticmethod
|
|
||||||
def install(packages: list):
|
|
||||||
subprocess.run(
|
|
||||||
['snap', 'install'] + packages,
|
|
||||||
check=True
|
|
||||||
)
|
|
||||||
|
|
||||||
@staticmethod
|
|
||||||
def remove(packages: list):
|
|
||||||
subprocess.run(
|
|
||||||
['snap', 'remove'] + packages,
|
|
||||||
check=True
|
|
||||||
)
|
|
@ -1,94 +0,0 @@
|
|||||||
# window.py
|
|
||||||
#
|
|
||||||
# Copyright 2022 mirkobrombin
|
|
||||||
#
|
|
||||||
# This program is free software: you can redistribute it and/or modify
|
|
||||||
# it under the terms of the GNU General Public License as published by
|
|
||||||
# the Free Software Foundationat version 3 of the License.
|
|
||||||
#
|
|
||||||
# This program is distributed in the hope that it will be useful,
|
|
||||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
# GNU General Public License for more details.
|
|
||||||
#
|
|
||||||
# You should have received a copy of the GNU General Public License
|
|
||||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
from gi.repository import Gtk, Gio, Adw
|
|
||||||
|
|
||||||
from vanilla_first_setup.models.preset import Preset
|
|
||||||
from vanilla_first_setup.models.config import Config
|
|
||||||
from vanilla_first_setup.utils.processor import Processor
|
|
||||||
from vanilla_first_setup.utils.run_async import RunAsync
|
|
||||||
|
|
||||||
|
|
||||||
@Gtk.Template(resource_path='/io/github/vanilla-os/FirstSetup/gtk/window.ui')
|
|
||||||
class FirstSetupWindow(Adw.ApplicationWindow):
|
|
||||||
__gtype_name__ = 'FirstSetupWindow'
|
|
||||||
|
|
||||||
carousel = Gtk.Template.Child()
|
|
||||||
btn_start = Gtk.Template.Child()
|
|
||||||
btn_save = Gtk.Template.Child()
|
|
||||||
btn_close = Gtk.Template.Child()
|
|
||||||
switch_snap = Gtk.Template.Child()
|
|
||||||
switch_flatpak = Gtk.Template.Child()
|
|
||||||
switch_apport = Gtk.Template.Child()
|
|
||||||
page_welcome = -1
|
|
||||||
page_configuration = 0
|
|
||||||
page_progress = 1
|
|
||||||
page_done = 2
|
|
||||||
spinner = Gtk.Template.Child()
|
|
||||||
|
|
||||||
def __init__(self, **kwargs):
|
|
||||||
super().__init__(**kwargs)
|
|
||||||
self.__config = Config(
|
|
||||||
snap=Preset.snap,
|
|
||||||
flatpak=Preset.flatpak,
|
|
||||||
apport=Preset.apport
|
|
||||||
)
|
|
||||||
self.__buiild_ui()
|
|
||||||
self.__connect_signals()
|
|
||||||
|
|
||||||
def __buiild_ui(self):
|
|
||||||
self.switch_snap.set_active(Preset.snap)
|
|
||||||
self.switch_flatpak.set_active(Preset.flatpak)
|
|
||||||
self.switch_apport.set_active(Preset.apport)
|
|
||||||
|
|
||||||
def __connect_signals(self):
|
|
||||||
self.btn_start.connect('clicked', self.__on_btn_start_clicked)
|
|
||||||
self.btn_save.connect('clicked', self.on_btn_save_clicked)
|
|
||||||
self.btn_close.connect('clicked', self.on_btn_close_clicked)
|
|
||||||
self.switch_snap.connect('state-set', self.__on_switch_snap_state_set)
|
|
||||||
self.switch_flatpak.connect(
|
|
||||||
'state-set', self.__on_switch_flatpak_state_set)
|
|
||||||
self.switch_apport.connect(
|
|
||||||
'state-set', self.__on_switch_apport_state_set)
|
|
||||||
|
|
||||||
def __show_page(self, page: int):
|
|
||||||
_page = self.carousel.get_nth_page(page + 1)
|
|
||||||
self.carousel.scroll_to(_page, True)
|
|
||||||
|
|
||||||
def __on_btn_start_clicked(self, widget):
|
|
||||||
self.__show_page(self.page_configuration)
|
|
||||||
|
|
||||||
def on_btn_save_clicked(self, widget):
|
|
||||||
def on_done(result, error=None):
|
|
||||||
self.spinner.stop()
|
|
||||||
self.__show_page(self.page_done)
|
|
||||||
|
|
||||||
self.__show_page(self.page_progress)
|
|
||||||
self.spinner.start()
|
|
||||||
|
|
||||||
RunAsync(Processor(self.__config).run, on_done)
|
|
||||||
|
|
||||||
def __on_switch_snap_state_set(self, widget, state):
|
|
||||||
self.__config.snap = state
|
|
||||||
|
|
||||||
def __on_switch_flatpak_state_set(self, widget, state):
|
|
||||||
self.__config.flatpak = state
|
|
||||||
|
|
||||||
def __on_switch_apport_state_set(self, widget, state):
|
|
||||||
self.__config.apport = state
|
|
||||||
|
|
||||||
def on_btn_close_clicked(self, widget):
|
|
||||||
self.get_application().quit()
|
|
Loading…
Reference in New Issue