~ubuntu-core-dev/update-notifier/ubuntu

« back to all changes in this revision

Viewing changes to data/backend_helper.py

  • Committer: Balint Reczey
  • Date: 2020-06-11 18:46:02 UTC
  • Revision ID: balint.reczey@canonical.com-20200611184602-2rv1zan3xu723x2u
Moved to git at https://git.launchpad.net/update-notifier

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
#!/usr/bin/python3
2
 
 
3
 
import argparse
4
 
import logging
5
 
import os
6
 
import subprocess
7
 
import sys
8
 
 
9
 
HAVE_APTDAEMON = False
10
 
try:
11
 
    import aptdaemon.gtk3widgets
12
 
    HAVE_APTDAEMON = True
13
 
except ImportError:
14
 
    pass
15
 
 
16
 
 
17
 
# show updates
18
 
def show_updates():
19
 
    """ show updates using update-manager """
20
 
    cmd = ["update-manager", "--no-update"]
21
 
    res = subprocess.call(cmd)
22
 
    return (res == 0)
23
 
 
24
 
 
25
 
# install all updates
26
 
def _install_all_updates_aptdaemon():
27
 
    from gi.repository import Gtk
28
 
    from aptdaemon import client, enums
29
 
    from aptdaemon.gtk3widgets import AptProgressDialog
30
 
    client = client.AptClient()
31
 
    trans = client.upgrade_system(safe_mode=True)
32
 
    dia = AptProgressDialog(trans)
33
 
    dia.connect("finished", Gtk.main_quit)
34
 
    dia.run()
35
 
    Gtk.main()
36
 
    return trans.exit == enums.EXIT_SUCCESS
37
 
 
38
 
 
39
 
def _install_all_updates_synaptic():
40
 
    cmd = ["/usr/bin/synaptic-pkexec",
41
 
           "--dist-upgrade-mode",
42
 
           "--non-interactive",
43
 
           "--hide-main-window",
44
 
           "-o", "Synaptic::AskRelated=true",
45
 
           ]
46
 
    return subprocess.call(cmd)
47
 
 
48
 
 
49
 
def install_all_updates():
50
 
    """ install all updates either with synaptic or aptdaemon """
51
 
    if HAVE_APTDAEMON:
52
 
        return _install_all_updates_aptdaemon()
53
 
    else:
54
 
        return _install_all_updates_synaptic()
55
 
 
56
 
 
57
 
# check updates
58
 
def _check_updates_aptdaemon():
59
 
    from gi.repository import Gtk
60
 
    from aptdaemon import client, enums
61
 
    from aptdaemon.gtk3widgets import AptProgressDialog
62
 
    client = client.AptClient()
63
 
    trans = client.update_cache()
64
 
    dia = AptProgressDialog(trans)
65
 
    dia.connect("finished", Gtk.main_quit)
66
 
    dia.run()
67
 
    Gtk.main()
68
 
    return trans.exit == enums.EXIT_SUCCESS
69
 
 
70
 
 
71
 
def _check_updates_gtk():
72
 
    cmd = ["/usr/bin/synaptic-pkexec",
73
 
           "--update-at-startup",
74
 
           "--non-interactive",
75
 
           "--hide-main-window",
76
 
           ]
77
 
    subprocess.call(cmd)
78
 
 
79
 
 
80
 
def check_updates():
81
 
    """ check for updates either with aptdaemon or synaptic """
82
 
    if HAVE_APTDAEMON:
83
 
        return _check_updates_aptdaemon()
84
 
    else:
85
 
        return _check_updates_gtk()
86
 
 
87
 
 
88
 
# start packagemanager
89
 
def start_packagemanager():
90
 
    if os.path.exists("/usr/bin/synaptic-pkexec"):
91
 
        cmd = ["/usr/bin/synaptic-pkexec"]
92
 
        return subprocess.call(cmd)
93
 
    elif os.path.exists("/usr/bin/software-center"):
94
 
        return subprocess.call(["/usr/bin/software-center"])
95
 
    else:
96
 
        logging.error("neither synaptic nor software-center installed")
97
 
 
98
 
 
99
 
# add cdrom
100
 
def _add_cdrom_sp(mount_path):
101
 
    from gi.repository import Gtk
102
 
    import dbus
103
 
    import dbus.mainloop.glib
104
 
    bus = dbus.SystemBus(mainloop=dbus.mainloop.glib.DBusGMainLoop())
105
 
    proxy = bus.get_object("com.ubuntu.SoftwareProperties", "/")
106
 
    backend = dbus.Interface(proxy, "com.ubuntu.SoftwareProperties")
107
 
    backend.AddCdromSource()
108
 
    backend.connect_to_signal(
109
 
        "SourcesListModified", Gtk.main_quit)
110
 
    backend.connect_to_signal(
111
 
        "CdromScanFailed", Gtk.main_quit)
112
 
    Gtk.main()
113
 
    if os.path.exists("/usr/bin/software-center"):
114
 
        subprocess.call(["/usr/bin/software-center"])
115
 
 
116
 
 
117
 
def _add_cdrom_synaptic(mount_path):
118
 
    cmd = ["/usr/bin/synaptic-pkexec", "--add-cdrom", mount_path]
119
 
    return subprocess.call(cmd)
120
 
 
121
 
 
122
 
def add_cdrom(mount_path):
123
 
    if os.path.exists("/usr/bin/synaptic-pkexec"):
124
 
        _add_cdrom_synaptic(mount_path)
125
 
    else:
126
 
        _add_cdrom_sp(mount_path)
127
 
 
128
 
 
129
 
if __name__ == "__main__":
130
 
 
131
 
    parser = argparse.ArgumentParser(
132
 
        description='backend helper for update-notifier')
133
 
    parser.add_argument(
134
 
        '--debug', default=False, action="store_true",
135
 
        help='extra debug output')
136
 
    subparser = parser.add_subparsers(title="Commands")
137
 
    # show_update  - update-manager
138
 
    command = subparser.add_parser("show_updates")
139
 
    command.set_defaults(command="show_updates")
140
 
    # install_all - synaptic/aptdaemon install noninteractivly
141
 
    command = subparser.add_parser("install_all_updates")
142
 
    command.set_defaults(command="install_all_updates")
143
 
    # check_updates - synaptic --reload/aptdaemon reload
144
 
    command = subparser.add_parser("check_updates")
145
 
    command.set_defaults(command="check_updates")
146
 
    # start_pkgmanager
147
 
    command = subparser.add_parser("start_packagemanager")
148
 
    command.set_defaults(command="start_packagemanager")
149
 
    # add_cdrom
150
 
    command = subparser.add_parser("add_cdrom")
151
 
    command.add_argument("mount_path")
152
 
    command.set_defaults(command="add_cdrom")
153
 
 
154
 
    args = parser.parse_args()
155
 
    if args.debug:
156
 
        logging.basicConfig(level=logging.DEBUG)
157
 
    else:
158
 
        logging.basicConfig(level=logging.INFO)
159
 
 
160
 
    func_name = args.command
161
 
    f_kwargs = {}
162
 
    f = globals()[func_name]
163
 
    if args.command == "add_cdrom":
164
 
        f_kwargs["mount_path"] = args.mount_path
165
 
    res = f(**f_kwargs)
166
 
 
167
 
    if not res:
168
 
        sys.exit(1)