2
# check-new-release-gtk - this is called periodically in the background
3
# (currently by update-notifier every 48h) to
4
# gather information about new releases of Ubuntu
5
# or to nag about no longer supported versions
7
# Copyright (c) 2010,2011 Canonical
9
# Author: Michael Vogt <mvo@ubuntu.com>
11
# This program is free software; you can redistribute it and/or
12
# modify it under the terms of the GNU General Public License as
13
# published by the Free Software Foundation; either version 2 of the
14
# License, or (at your option) any later version.
16
# This program is distributed in the hope that it will be useful,
17
# but WITHOUT ANY WARRANTY; without even the implied warranty of
18
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19
# GNU General Public License for more details.
21
# You should have received a copy of the GNU General Public License
22
# along with this program; if not, write to the Free Software
23
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
26
from __future__ import print_function
28
from gi.repository import Gio
29
from gi.repository import GObject
30
from gi.repository import Gtk
36
import UpdateManager.GtkProgress
39
from optparse import OptionParser
41
from DistUpgrade.utils import init_proxy
43
from UpdateManager.DistUpgradeFetcher import DistUpgradeFetcherGtk
44
from UpdateManager.MetaReleaseGObject import MetaRelease
45
from UpdateManager.SimpleGtk3builderApp import SimpleGtkbuilderApp
47
from gettext import gettext as _
49
GObject.threads_init()
51
# overwrite default upgrade fetcher and make it not show the
52
# release notes by default
53
class DistUpgradeFetcher(DistUpgradeFetcherGtk):
54
def showReleaseNotes(self):
59
class CheckNewReleaseGtk(SimpleGtkbuilderApp):
60
""" Gtk verson of the release notes check/download """
62
# the timeout until we give up
65
def __init__(self, options):
66
SimpleGtkbuilderApp.__init__(self, options.datadir+"/gtkbuilder/UpgradePromptDialog.ui", "update-manager")
68
logging.debug("running with devel=%s proposed=%s" % (
69
options.devel_release, options.proposed_release))
70
m = MetaRelease(useDevelopmentRelease=options.devel_release,
71
useProposed=options.proposed_release)
72
m.connect("new-dist-available", self.new_dist_available)
76
self.show_uri(options.test_uri)
78
GObject.timeout_add_seconds(self.FETCH_TIMEOUT, self.timeout, None)
80
def new_dist_available(self, meta_release, new_dist):
81
logging.debug("new_dist_available: %s" % new_dist)
82
self.new_dist = new_dist
83
client = Gio.Settings("com.ubuntu.update-manager")
84
ignore_dist = client.get_string("check-new-release-ignore")
85
# only honor the ignore list if the distro is still supported, otherwise
87
if (ignore_dist == new_dist.name and
88
meta_release.no_longer_supported is None):
89
logging.warn("found new dist '%s' but it is on the ignore list" % new_dist.name)
92
self.window_main.set_title(_("Ubuntu %(version)s Upgrade Available") % {'version': new_dist.version})
93
self.linkbutton_release_notes.set_uri(new_dist.releaseNotesURI)
94
html_uri = new_dist.releaseNotesHtmlUri
96
logging.warn("no ReleaseNotesHtmlUri found")
98
self.show_uri(html_uri)
99
# show alert on unsupported distros
100
if meta_release.no_longer_supported is not None:
101
from UpdateManager.UpdateManager import show_dist_no_longer_supported_dialog
102
self.window_main.realize()
103
show_dist_no_longer_supported_dialog(self.window_main)
106
from gi.repository import WebKit
107
self.webkit_view = WebKit.WebView()
108
self.webkit_view.show()
109
settings = self.webkit_view.get_settings()
110
settings.set_property("enable-plugins", False)
111
# FIXME: do we want to have it in a Gtk.ScrolledWindow ?
112
#self.alignment_webkit_view.add(self.webkit_view)
113
self.scrolledwindow_webkit_view.add(self.webkit_view)
115
def on_button_upgrade_now_clicked(self, button):
116
logging.debug("upgrade now")
117
progress=UpdateManager.GtkProgress.GtkAcquireProgress(self, _("Downloading the release upgrade tool"))
118
fetcher = DistUpgradeFetcher(new_dist=self.new_dist,
124
def on_button_ask_me_later_clicked(self, button):
125
logging.debug("ask me later")
126
# check again in a week
127
next_check = time.time() + 7*24*60*60
128
client = Gio.Settings("com.ubuntu.update-notifier")
129
client.set_int("release-check-time", int(next_check))
132
def on_button_dont_upgrade_clicked(self, button):
133
#print("don't upgrade")
134
s = _("You have declined the upgrade to Ubuntu %s") % self.new_dist.version
135
self.dialog_really_do_not_upgrade.set_markup("<b>%s</b>" % s)
136
if self.dialog_really_do_not_upgrade.run() == Gtk.ResponseType.OK:
137
client = Gio.Settings("com.ubuntu.update-manager")
138
client.set_string("check-new-release-ignore", self.new_dist.name)
141
def on_linkbutton_release_notes_clicked(self, linkbutton):
142
# gtk will do the right thing if uri is set
145
def window_delete_event_cb(self, window, event):
148
def show_uri(self, uri):
149
logging.debug("using uri '%s'" % uri)
150
self.webkit_view.open(uri)
151
self.webkit_view.connect("load-finished", self._on_load_finished)
153
def _on_load_finished(self, view, frame):
154
self.window_main.show_all()
155
# hide redundant release notes button
156
self.linkbutton_release_notes.hide()
158
def timeout(self, user_data):
159
if self.new_dist is None:
160
logging.warn("timeout reached, exiting")
163
if __name__ == "__main__":
165
Gtk.init_check(sys.argv)
167
gettext.bindtextdomain("update-manager", "/usr/share/locale")
168
gettext.textdomain("update-manager")
171
locale.setlocale(locale.LC_ALL, "")
177
parser = OptionParser()
178
#FIXME: Workaround a bug in optparser which doesn't handle unicode/str
179
# correctly, see http://bugs.python.org/issue4391
180
# Shoudl be resolved by Python3
181
enc = locale.getpreferredencoding()
182
parser.add_option ("-d", "--devel-release", action="store_true",
183
dest="devel_release", default=False,
184
help=_("Check if upgrading to the latest devel release "
185
"is possible").decode(enc))
186
parser.add_option ("-p", "--proposed", action="store_true",
187
dest="proposed_release", default=False,
188
help=_("Try upgrading to the latest release using "
189
"the upgrader from $distro-proposed").decode(enc))
190
# mostly useful for development
191
parser.add_option ("", "--datadir", default="/usr/share/update-manager")
192
parser.add_option ("", "--test-uri")
193
parser.add_option ("", "--debug", action="store_true", default=False,
194
help=_("Add debug output").decode(enc))
195
(options, args) = parser.parse_args()
198
logging.basicConfig(level=logging.DEBUG)
201
cnr = CheckNewReleaseGtk(options)