Package up2date_client :: Module gui
[hide private]
[frames] | no frames]

Source Code for Module up2date_client.gui

  1  # 
  2  # GUI for Update Agent 
  3  # Copyright (c) 1999--2016 Red Hat, Inc.  Distributed under GPLv2. 
  4  # 
  5  # Authors: 
  6  #    Preston Brown <pbrown@redhat.com> 
  7  #    Adrian Likins <alikins@redhat.com> 
  8  #    Daniel Benamy <dbenamy@redhat.com> 
  9   
 10  import os 
 11  import sys 
 12   
 13   
 14  import signal 
 15   
 16  try: # python2 
 17      import xmlrpclib 
 18  except ImportError: # python3 
 19      import xmlrpc.client as xmlrpclib 
 20   
 21  import gettext 
 22  t = gettext.translation('rhn-client-tools', fallback=True) 
 23  # Python 3 translations don't have a ugettext method 
 24  if not hasattr(t, 'ugettext'): 
 25      t.ugettext = t.gettext 
 26  _ = t.ugettext 
 27   
 28  from up2date_client import up2dateErrors 
 29  from up2date_client import config 
 30  from up2date_client import rhnreg 
 31  from up2date_client import messageWindow 
 32   
 33  from up2date_client import rhnregGui 
 34  from up2date_client.gtk_compat import gtk, setCursor, getWidgetName 
 35   
 36   
 37   
38 -class Gui(rhnregGui.StartPage, rhnregGui.ChooseServerPage, rhnregGui.LoginPage, 39 rhnregGui.ReviewSubscriptionPage, rhnregGui.CreateProfilePage, 40 rhnregGui.ProvideCertificatePage, rhnregGui.FinishPage, 41 rhnregGui.ChooseChannelPage):
42
43 - def __init__(self):
44 self.cfg = config.initUp2dateConfig() 45 46 gladeFile = "/usr/share/rhn/up2date_client/gui.glade" 47 self.xml = gtk.glade.XML(gladeFile, "mainWin", domain="rhn-client-tools") 48 self.xml.signal_autoconnect ( 49 { "onMainWinCancel" : self.onMainWinCancel, 50 "onMainWinPrepare" : self.onMainWinPrepare, 51 "onMainWinApply" : self.onMainWinApply, 52 } ) 53 54 rhnregGui.StartPage.__init__(self) 55 rhnregGui.ChooseServerPage.__init__(self) 56 rhnregGui.LoginPage.__init__(self) 57 rhnregGui.ChooseChannelPage.__init__(self) 58 rhnregGui.CreateProfilePage.__init__(self) 59 rhnregGui.ReviewSubscriptionPage.__init__(self) 60 rhnregGui.ProvideCertificatePage.__init__(self) 61 rhnregGui.FinishPage.__init__(self) 62 63 # Pack all the pages into the empty druid screens 64 contents = self.startPageVbox() 65 container = self.xml.get_widget("startPageVbox") 66 container.pack_start(contents, True, True, 0) 67 contents = self.chooseServerPageVbox() 68 container = self.xml.get_widget("chooseServerPageVbox") 69 container.pack_start(contents, True, True, 0) 70 contents = self.loginPageVbox() 71 container = self.xml.get_widget("loginPageVbox") 72 container.pack_start(contents, True, True, 0) 73 contents = self.chooseChannelPageVbox() 74 container = self.xml.get_widget("chooseChannelPageVbox") 75 container.pack_start(contents, True, True, 0) 76 self.chooseChannelPageVbox = container 77 contents = self.createProfilePageVbox() 78 container = self.xml.get_widget("createProfilePageVbox") 79 container.pack_start(contents, True, True, 0) 80 contents = self.reviewSubscriptionPageVbox() 81 container = self.xml.get_widget("reviewSubscriptionPageVbox") 82 container.pack_start(contents, True, True, 0) 83 contents = self.provideCertificatePageVbox() 84 container = self.xml.get_widget("provideCertificatePageVbox") 85 container.pack_start(contents, True, True, 0) 86 self.provideCertificatePageVbox = container 87 contents = self.finishPageVbox() 88 container = self.xml.get_widget("finishPageVbox") 89 container.pack_start(contents, True, True, 0) 90 91 self.initProfile = False 92 self.oemInfo = {} 93 self.productInfo = {} 94 self.already_registered_already_shown = False 95 self.rhsm_already_registered_already_shown = False 96 97 self.mainWin = self.xml.get_widget("mainWin") 98 self.mainWin.connect("delete-event", gtk.main_quit) 99 self.mainWin.connect("hide", gtk.main_quit) 100 self.mainWin.connect("close", gtk.main_quit) 101 102 self.pages = dict([(getWidgetName(self.mainWin.get_nth_page(n)), n) 103 for n in range(self.mainWin.get_n_pages())]) 104 105 # Set up cursor changing functions. Overriding functions that aren't in 106 # classes like this could be called a hack, but I think it's the best 107 # we can do with the current overall setup and isn't too bad. 108 def mySetBusyCursor(): 109 setCursor(self.mainWin, gtk.CURSOR_WATCH)
110 def mySetArrowCursor(): 111 setCursor(self.mainWin, gtk.CURSOR_LEFT_PTR)
112 rhnregGui.setBusyCursor = mySetBusyCursor 113 rhnregGui.setArrowCursor = mySetArrowCursor 114 115 self.mainWin.show_all() 116 # GtkAssistant doesn't signal prepare to the first page when starting up 117 self.onStartPagePrepare(None, None, manualPrepare=True) 118 119
120 - def onMainWinCancel(self, mainWin):
121 dialog = rhnregGui.ConfirmQuitDialog(mainWin) 122 if dialog.rc == 1: 123 self.mainWin.set_current_page(self.pages['finishPageVbox']) 124 else: 125 return True
126
127 - def fatalError(self, error, wrap=1):
128 rhnregGui.setArrowCursor() 129 # FIXME 130 if wrap: 131 text = messageWindow.wrap_text(error) 132 else: 133 text = error 134 135 dlg = messageWindow.ErrorDialog(text,self.mainWin) 136 gtk.main_quit() 137 sys.exit(1)
138
139 - def nextPage(self, vbox):
140 # go one page before desired one and 'forward' will move us where we want 141 self.mainWin.set_current_page(self.pages[vbox]-1)
142
143 - def onMainWinPrepare(self, mainWin, vbox):
144 prepare_func = { 145 "startPageVbox": self.onStartPagePrepare, 146 "chooseServerPageVbox" : self.onChooseServerPagePrepare, 147 "loginPageVbox" : self.onLoginPagePrepare, 148 "chooseChannelPageVbox" : self.onChooseChannelPagePrepare, 149 "createProfilePageVbox" : self.onCreateProfilePagePrepare, 150 "reviewSubscriptionPageVbox" : self.onReviewSubscriptionPagePrepare, 151 "finishPageVbox" : self.onFinishPagePrepare, 152 } 153 vboxId = getWidgetName(vbox) 154 if vboxId in prepare_func: 155 prepare_func[vboxId](mainWin, vbox)
156
157 - def onMainWinApply(self, mainWin):
158 forward_func = { 159 "chooseServerPageVbox" : self.onChooseServerPageNext, 160 "loginPageVbox" : self.onLoginPageNext, 161 "chooseChannelPageVbox" : self.onChooseChannelPageNext, 162 "createProfilePageVbox" : self.onCreateProfilePageNext, 163 "provideCertificatePageVbox" : self.onProvideCertificatePageNext, 164 } 165 currentVbox = mainWin.get_nth_page(mainWin.get_current_page()) 166 vboxId = getWidgetName(currentVbox) 167 if vboxId in forward_func: 168 forward_func[vboxId](mainWin, None)
169
170 - def onStartPagePrepare(self, mainWin, vbox, manualPrepare=False):
171 if rhnreg.rhsm_registered() and not self.rhsm_already_registered_already_shown: 172 # Dialog constructor returns when dialog closes 173 dialog = rhnregGui.AlreadyRegisteredSubscriptionManagerDialog() 174 if dialog.rc == 0: 175 sys.exit(0) 176 self.rhsm_already_registered_already_shown = True 177 if rhnreg.registered() and not self.already_registered_already_shown: 178 # Dialog constructor returns when dialog closes 179 dialog = rhnregGui.AlreadyRegisteredDialog() 180 if dialog.rc == 0: 181 sys.exit(0) 182 self.already_registered_already_shown = True
183
184 - def onChooseServerPagePrepare(self, mainWin, vbox):
185 self.chooseServerPagePrepare()
186
187 - def onChooseServerPageNext(self, page, dummy):
188 try: 189 ret = self.chooseServerPageApply() 190 if ret: # something went wrong 191 self.nextPage('chooseServerPageVbox') 192 return 193 if hasattr(self.provideCertificatePageVbox, 'set_visible'): 194 self.provideCertificatePageVbox.set_visible(False) 195 self.nextPage('loginPageVbox') 196 except (up2dateErrors.SSLCertificateVerifyFailedError,\ 197 up2dateErrors.SSLCertificateFileNotFound): 198 self.setUrlInWidget()
199
200 - def onLoginPagePrepare(self, mainWin, vbox):
201 self.loginXml.get_widget("loginUserEntry").grab_focus() 202 self.loginPagePrepare()
203
204 - def onLoginPageNext(self, page, dummy):
205 """This must manually switch pages because another function calls it to 206 advance the druid. It returns True to inform the druid of this. 207 """ 208 ret = self.loginPageVerify() 209 if ret: 210 self.nextPage('loginPageVbox') 211 return 212 213 ret = self.loginPageApply() 214 if ret: 215 self.nextPage('loginPageVbox') 216 return 217 218 self.goToPageAfterLogin()
219 220
221 - def goToPageAfterLogin(self):
222 """This function is used by the create new account dialog so it doesn't 223 need to have any knowledge of the screen mechanism or order. 224 """ 225 if not rhnregGui.ChooseChannelPage.chooseChannelShouldBeShown(self): 226 if hasattr(self.chooseChannelPageVbox, 'set_visible'): 227 self.chooseChannelPageVbox.set_visible(False) 228 else: 229 self.nextPage('createProfilePageVbox')
230
231 - def onChooseChannelPageNext(self, page, dummy):
232 self.chooseChannelPageApply() 233 if self.chose_all_updates or \ 234 self.chose_default_channel is False: 235 dialog = rhnregGui.ConfirmAllUpdatesDialog() 236 if dialog.rc == 0: 237 self.nextPage('chooseChannelPageVbox')
238
239 - def onChooseChannelPagePrepare(self, mainWin, vbox):
240 self.chooseChannelPagePrepare()
241
242 - def onCreateProfilePagePrepare(self, mainWin, vbox):
243 self.createProfilePagePrepare()
244
245 - def onCreateProfilePageNext(self, page, dummy):
246 ret = self.createProfilePageVerify() 247 if ret: 248 return ret 249 ret = self.createProfilePageApply() 250 if ret: 251 return ret
252
253 - def onReviewSubscriptionPagePrepare(self, mainWin, vbox):
254 self.reviewSubscriptionPagePrepare()
255
256 - def onProvideCertificatePageNext(self, page=None, dummy=None):
257 status = self.provideCertificatePageApply() 258 if status == 0: 259 pass 260 elif status == 1: 261 self.nextPage('finishPageVbox') 262 elif status == 3: 263 self.nextPage('chooseServerPageVbox') 264 else: 265 assert status == 2 266 self.nextPage('provideCertificatePageVbox') 267 return
268 269
270 - def onFinishPagePrepare(self, mainWin, vbox):
271 if rhnregGui.hasBaseChannelAndUpdates(): 272 # self.druid.finish.set_label(_("_Finish")) 273 title = _("Updates Configured") 274 else: 275 # self.druid.finish.set_label(_("_Exit")) 276 title = _("Software Updates Not Set Up") 277 self.finishPagePrepare() 278 self.mainWin.set_title(title) 279 self.mainWin.set_page_title(vbox, title)
280 281
282 -def rootWarning():
283 dlg = messageWindow.ErrorDialog(_("You must run rhn_register as root."))
284 # dlg.run_and_close() 285
286 -def errorWindow(msg):
287 dlg = messageWindow.ErrorDialog(messageWindow.wrap_text(msg))
288 # dlg.run_and_close() 289
290 -def main():
291 signal.signal(signal.SIGINT, signal.SIG_DFL) 292 293 if os.geteuid() != 0: 294 rootWarning() 295 sys.exit(1) 296 297 gui = Gui() 298 gtk.main()
299 300 301 if __name__ == "__main__": 302 try: 303 main() 304 except xmlrpclib.ResponseError: 305 print(sys.exc_info()[1]) 306 except IOError: 307 e = sys.exc_info()[1] 308 print(_("There was some sort of I/O error: %s") % e.errmsg) 309