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

Source Code for Module up2date_client.tui

   1  # 
   2  # TUI for RHN Registration 
   3  # Copyright (c) 2000--2020 Red Hat, Inc. 
   4  # 
   5  # This software is licensed to you under the GNU General Public License, 
   6  # version 2 (GPLv2). There is NO WARRANTY for this software, express or 
   7  # implied, including the implied warranties of MERCHANTABILITY or FITNESS 
   8  # FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2 
   9  # along with this software; if not, see 
  10  # http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt. 
  11  # 
  12  # Red Hat trademarks are not licensed under GPLv2. No permission is 
  13  # granted to use or replicate Red Hat trademarks that are incorporated 
  14  # in this software or its documentation. 
  15  # 
  16   
  17  from os import geteuid 
  18  import sys 
  19   
  20  import gettext 
  21  t = gettext.translation('rhn-client-tools', fallback=True) 
  22  # Python 3 translations don't have a ugettext method 
  23  if not hasattr(t, 'ugettext'): 
  24      t.ugettext = t.gettext 
  25  _ = t.ugettext 
  26   
  27  import snack 
  28  import signal 
  29   
  30  from up2date_client import rhnreg, hardware 
  31  from up2date_client import up2dateErrors 
  32  from up2date_client import up2dateUtils 
  33  from up2date_client import pkgUtils 
  34  from up2date_client import up2dateLog 
  35  from up2date_client import config 
  36  from up2date_client.config import convert_url_from_puny 
  37  from up2date_client import up2dateAuth 
  38  from rhn import rpclib 
  39  from rhn.connections import idn_puny_to_unicode 
  40  from rhn.i18n import sstr 
  41  from up2date_client.pmPlugin import PM_PLUGIN_NAME, PM_PLUGIN_CONF 
  42  from up2date_client.rhnreg_constants import * 
  43   
  44  log = up2dateLog.initLog() 
  45  cfg = config.initUp2dateConfig() 
  46   
47 -def ErrorWindow(screen, errmsg):
48 snack.ButtonChoiceWindow(screen, sstr(ERROR), sstr(u"%s" % errmsg), 49 [sstr(BACK)])
50
51 -def FatalErrorWindow(screen, errmsg):
52 snack.ButtonChoiceWindow(screen, sstr(FATAL_ERROR), sstr(u"%s" % errmsg), 53 [sstr(OK)]) 54 screen.finish() 55 sys.exit(1)
56
57 -def WarningWindow(screen, errmsg):
58 snack.ButtonChoiceWindow(screen, sstr(WARNING), sstr("%s" % errmsg), 59 [sstr(OK)]) 60 screen.finish()
61 62
63 -def ConfirmQuitWindow(screen):
64 button = snack.ButtonChoiceWindow(screen, sstr(CONFIRM_QUIT), 65 sstr(CONFIRM_QUIT_SURE) + "\n" + \ 66 sstr(WHY_REGISTER_SEC) + "\n" + \ 67 sstr(WHY_REGISTER_SEC_TXT) + "\n\n" + \ 68 sstr(WHY_REGISTER_DLD) + "\n" + \ 69 sstr(WHY_REGISTER_DLD_TXT) + "\n\n" + \ 70 sstr(WHY_REGISTER_SUPP) + "\n" + \ 71 sstr(WHY_REGISTER_SUPP_TXT) + "\n\n" + \ 72 sstr(WHY_REGISTER_COMP) + "\n" + \ 73 sstr(WHY_REGISTER_COMP_TXT) + "\n\n" + \ 74 sstr(CONFIRM_QUIT_WILLNOT) + "\n" + \ 75 sstr(WHY_REGISTER_TIP), 76 [sstr(CONTINUE_REGISTERING), sstr(REGISTER_LATER2)], 77 width = 70) 78 79 if button == sstr(REGISTER_LATER2).lower(): 80 screen.finish() 81 return 1 82 else: 83 return 0
84 85
86 -def tui_call_wrapper(screen, func, *params):
87 88 try: 89 results = func(*params) 90 except up2dateErrors.CommunicationError: 91 ErrorWindow(screen, HOSTED_CONNECTION_ERROR % config.getServerlURL()[0]) 92 raise sys.exc_info()[1] 93 except up2dateErrors.SSLCertificateVerifyFailedError: 94 ErrorWindow(screen, e.errmsg) 95 raise sys.exc_info()[1] 96 except up2dateErrors.NoBaseChannelError: 97 e = sys.exc_info()[1] 98 FatalErrorWindow(screen, e.errmsg + '\n' + 99 BASECHANNELERROR % (up2dateUtils.getArch(), 100 up2dateUtils.getOSRelease(), 101 up2dateUtils.getVersion())) 102 except up2dateErrors.SSLCertificateFileNotFound: 103 e = sys.exc_info()[1] 104 ErrorWindow(screen, e.errmsg + '\n\n' + 105 SSL_CERT_FILE_NOT_FOUND_ERRER) 106 raise e 107 108 return results
109
110 -class WindowSkipException(Exception):
111 pass
112
113 -class AlreadyRegisteredWindow:
114 name = "AlreadyRegisteredWindow" 115
116 - def __init__(self, screen, tui):
117 118 if not rhnreg.registered() or tui.test: 119 raise WindowSkipException() 120 121 self.screen = screen 122 self.tui = tui 123 size = snack._snack.size() 124 125 systemIdXml = rpclib.xmlrpclib.loads(up2dateAuth.getSystemId()) 126 oldUsername = systemIdXml[0][0]['username'] 127 oldsystemId = systemIdXml[0][0]['system_id'] 128 129 toplevel = snack.GridForm(self.screen, sstr(SYSTEM_ALREADY_SETUP), 1, 2) 130 self.bb = snack.ButtonBar(self.screen, 131 [(sstr(YES_CONT), "next"), 132 (sstr(NO_CANCEL), "exit")]) 133 toplevel.add(self.bb, 0, 1, growx = 1) 134 135 tb = snack.Textbox(size[0]-30, size[1]-20, 136 sstr(SYSTEM_ALREADY_REGISTERED + "\n\n" 137 + _("Spacewalk Location:") + " " + convert_url_from_puny(self.tui.serverURL) + "\n" 138 + _("Login:") + " " + oldUsername + "\n" 139 + _("System ID:") + " " + oldsystemId + "\n\n" 140 + SYSTEM_ALREADY_REGISTERED_CONT + "\n"), 141 1, 1) 142 toplevel.add(tb, 0, 0, padding = (0, 0, 0, 1)) 143 144 self.g = toplevel
145
146 - def saveResults(self):
147 pass
148
149 - def run(self):
150 log.log_debug("Running %s" % self.name) 151 152 result = self.g.runOnce() 153 button = self.bb.buttonPressed(result) 154 155 if result == "F12": 156 return "next" 157 158 return button
159
160 -class SatelliteUrlWindow:
161 name = "SatelliteUrlWindow" 162
163 - def __init__(self, screen, tui):
164 self.screen = screen 165 self.tui = tui 166 self.tui.alreadyRegistered = 0 167 168 self.server = convert_url_from_puny(self.tui.serverURL) 169 fixed_server_url = rhnreg.makeNiceServerUrl(self.server) 170 171 #Save the config only if the url is different 172 if fixed_server_url != self.server: 173 self.server = fixed_server_url 174 config.setServerURL(self.server) 175 cfg.save() 176 177 size = snack._snack.size() 178 179 toplevel = snack.GridForm(screen, sstr(SATELLITE_URL_WINDOW), 180 1, 4) 181 182 prompt_text = SATELLITE_URL_TEXT 183 url_label = SATELLITE_URL_PROMPT 184 ssl_label = SATELLITE_URL_PROMPT2 185 186 label = snack.Textbox(size[0]-10, 3, 187 sstr(prompt_text), 188 scroll = 0, wrap = 1) 189 190 toplevel.add(label, 0, 0, anchorLeft = 1) 191 192 # spacer 193 label = snack.Label(sstr("")) 194 toplevel.add(label, 0, 1) 195 196 grid = snack.Grid(2, 3) 197 198 label = snack.Label(sstr(url_label)) 199 grid.setField(label, 0, 0, padding = (0, 0, 1, 0), 200 anchorRight = 1) 201 202 self.urlEntry = snack.Entry(40) 203 self.urlEntry.set(self.server) 204 grid.setField(self.urlEntry, 1, 0, anchorLeft = 1) 205 206 label = snack.Label(sstr(ssl_label)) 207 grid.setField(label, 0, 1, padding = (0, 0, 1, 0), 208 anchorRight = 1) 209 210 self.sslEntry = snack.Entry(40) 211 self.sslEntry.set(tui.sslCACert) 212 grid.setField(self.sslEntry, 1, 1, anchorLeft = 1) 213 214 toplevel.add(grid, 0, 2) 215 216 # BUTTON BAR 217 self.bb = snack.ButtonBar(screen, 218 [(sstr(NEXT), "next"), 219 (sstr(BACK), "back"), 220 (sstr(CANCEL), "cancel")]) 221 222 toplevel.add(self.bb, 0, 3, padding = (0, 1, 0, 0), 223 growx = 1) 224 225 226 self.g = toplevel
227
228 - def validateFields(self):
229 if self.urlEntry.value() == "": 230 snack.ButtonChoiceWindow(self.screen, sstr(ERROR), 231 sstr(SATELLITE_REQUIRED), 232 buttons = [sstr(OK)]) 233 self.g.setCurrent(self.urlEntry) 234 return 0 235 236 if (self.urlEntry.value()[:5] == 'https' and 237 self.sslEntry.value() == ""): 238 snack.ButtonChoiceWindow(self.screen, sstr(ERROR), 239 sstr(SSL_REQUIRED), 240 buttons = [sstr(OK)]) 241 self.g.setCurrent(self.sslEntry) 242 return 0 243 return 1
244
245 - def saveResults(self):
246 serverEntry = self.urlEntry.value() 247 # fix up the server url, E.G. if someone left off /XMLRPC 248 fixed_server_url = rhnreg.makeNiceServerUrl(serverEntry) 249 if fixed_server_url != serverEntry: 250 serverEntry = fixed_server_url 251 252 self.tui.serverURL = serverEntry 253 self.tui.sslCACert = self.sslEntry.value() 254 config.setServerURL(serverEntry) 255 config.setSSLCACert(self.sslEntry.value()) 256 cfg.save()
257
258 - def run(self):
259 log.log_debug("Running %s" % self.name) 260 self.screen.refresh() 261 valid = 0 262 while not valid: 263 result = self.g.run() 264 button = self.bb.buttonPressed(result) 265 266 if result == "F12": 267 button = "next" 268 269 if button == "next": 270 valid = self.validateFields() 271 272 else: 273 break 274 275 self.screen.popWindow() 276 277 return button
278
279 -class AlreadyRegisteredSubscriptionManagerWindow:
280 name = "AlreadyRegisteredSubscriptionManagerWindow" 281
282 - def __init__(self, screen, tui):
283 284 if not rhnreg.rhsm_registered() or tui.test: 285 raise WindowSkipException() 286 287 self.screen = screen 288 self.tui = tui 289 size = snack._snack.size() 290 291 toplevel = snack.GridForm(self.screen, sstr(SYSTEM_ALREADY_SETUP), 1, 2) 292 self.bb = snack.ButtonBar(self.screen, 293 [(sstr(YES_CONT), "next"), 294 (sstr(NO_CANCEL), "exit")]) 295 toplevel.add(self.bb, 0, 1, growx = 1) 296 297 tb = snack.Textbox(size[0]-30, size[1]-20, 298 sstr(WARNING + "\n\n" 299 + RHSM_SYSTEM_ALREADY_REGISTERED + "\n\n" 300 + SYSTEM_ALREADY_REGISTERED_CONT + "\n"), 301 1, 1) 302 toplevel.add(tb, 0, 0, padding = (0, 0, 0, 1)) 303 304 self.g = toplevel
305
306 - def saveResults(self):
307 pass
308
309 - def run(self):
310 log.log_debug("Running %s" % self.name) 311 312 result = self.g.runOnce() 313 button = self.bb.buttonPressed(result) 314 315 if result == "F12": 316 return "next" 317 318 return button
319
320 -class ConnectWindow:
321 name = "ConnectWindow" 322
323 - def __init__(self, screen, tui):
324 self.screen = screen 325 self.tui = tui 326 size = snack._snack.size() 327 328 self.server = convert_url_from_puny(self.tui.serverURL) 329 330 self.proxy = cfg['httpProxy'] 331 332 toplevel = snack.GridForm(self.screen, sstr(CONNECT_WINDOW), 1, 1) 333 334 text = CONNECT_WINDOW_TEXT % self.server + "\n\n" 335 336 if self.proxy: 337 text += CONNECT_WINDOW_TEXT2 % self.proxy 338 339 tb = snack.Textbox(size[0]-30, size[1]-20, 340 sstr(text), 341 1, 1) 342 343 toplevel.add(tb, 0, 0, padding = (0, 0, 0, 1)) 344 345 self.g = toplevel
346 347
348 - def run(self):
349 log.log_debug("Running %s" % self.name) 350 351 # We draw and display the window. The window gets displayed as 352 # long as we are attempting to connect to the server. Once we 353 # connect the window is gone. 354 result = self.g.draw() 355 self.screen.refresh() 356 # try to connect given the server url and ssl cert provided. If 357 # unsuccessful, return to previous screen to allow user to fix. 358 try: 359 tui_call_wrapper(self.screen, rhnreg.getCaps) 360 except: 361 return "back" 362 363 self.screen.popWindow() 364 365 # Just return next, although the user wouldn't have actually pressed 366 # anything. 367 return "next"
368
369 - def saveResults(self):
370 pass
371
372 -class StartWindow:
373 name = "StartWindow" 374
375 - def __init__(self, screen, tui):
376 self.screen = screen 377 self.tui = tui 378 size = snack._snack.size() 379 toplevel = snack.GridForm(self.screen, sstr(START_REGISTER_WINDOW), 380 1, 2) 381 382 start_register_text = sstr(START_REGISTER_TEXT) 383 384 tb = snack.Textbox(size[0]-10, size[1]-14, start_register_text, 1, 1) 385 toplevel.add(tb, 0, 0, padding = (0, 0, 0, 1)) 386 387 self.bb = snack.ButtonBar(self.screen, 388 [(sstr(WHY_REGISTER), "why_register"), 389 (sstr(NEXT), "next"), 390 (sstr(CANCEL), "cancel")]) 391 toplevel.add(self.bb, 0, 1, growx = 1) 392 393 self.g = toplevel
394
395 - def saveResults(self):
396 pass
397 398
399 - def run(self):
400 log.log_debug("Running %s" % self.name) 401 result = self.g.runOnce() 402 button = self.bb.buttonPressed(result) 403 404 if result == "F12": 405 return "next" 406 elif button == "why_register": 407 why_reg_win = WhyRegisterWindow(self.screen, self.tui) 408 why_reg_win.run() 409 return button 410 411 return button
412
413 -class WhyRegisterWindow:
414 name = "WhyRegisterWindow" 415
416 - def __init__(self, screen, tui):
417 self.screen = screen 418 self.tui = tui 419 size = snack._snack.size() 420 toplevel = snack.GridForm(self.screen, sstr(WHY_REGISTER_WINDOW), 421 1, 2) 422 423 424 why_register_text = WHY_REGISTER_TEXT + "\n\n" + \ 425 WHY_REGISTER_SEC + "\n" + \ 426 WHY_REGISTER_SEC_TXT + "\n\n" + \ 427 WHY_REGISTER_DLD + "\n" + \ 428 WHY_REGISTER_DLD_TXT + "\n\n" + \ 429 WHY_REGISTER_SUPP + "\n" + \ 430 WHY_REGISTER_SUPP_TXT + "\n\n" + \ 431 WHY_REGISTER_COMP + "\n" + \ 432 WHY_REGISTER_COMP_TXT + "\n\n" + \ 433 WHY_REGISTER_TIP 434 435 tb = snack.Textbox(size[0]-10, size[1]-14, sstr(why_register_text), 1, 1) 436 437 toplevel.add(tb, 0, 0, padding = (0, 0, 0, 1)) 438 439 440 self.bb = snack.ButtonBar(self.screen, 441 [(sstr(BACK_REGISTER), "back")]) 442 toplevel.add(self.bb, 0, 1, growx = 1) 443 444 self.g = toplevel
445
446 - def run(self):
447 log.log_debug("Running %s" % self.name) 448 result = self.g.runOnce() 449 button = self.bb.buttonPressed(result) 450 451 return button
452 453
454 -class InfoWindow:
455 name = "InfoWindow" 456
457 - def __init__(self, screen, tui):
458 self.screen = screen 459 self.tui = tui 460 self.tui.alreadyRegistered = 0 461 462 self.server = self.tui.serverURL 463 464 size = snack._snack.size() 465 466 toplevel = snack.GridForm(screen, sstr(REGISTER_WINDOW), 1, 4) 467 468 decoded_server = convert_url_from_puny(self.server) 469 url = self.server 470 if decoded_server != self.server: 471 url += " (%s)" % decoded_server 472 login_prompt = LOGIN_PROMPT % url 473 login_label = LOGIN 474 login_tip = LOGIN_TIP 475 476 label = snack.Textbox(size[0]-10, 3, 477 sstr(login_prompt), 478 scroll = 0, wrap = 1) 479 480 toplevel.add(label, 0, 0, anchorLeft = 1) 481 482 grid = snack.Grid(2, 3) 483 484 label = snack.Label(sstr(login_label)) 485 grid.setField(label, 0, 0, padding = (0, 0, 1, 0), 486 anchorRight = 1) 487 488 self.userNameEntry = snack.Entry(20) 489 self.userNameEntry.set(tui.userName) 490 grid.setField(self.userNameEntry, 1, 0, anchorLeft = 1) 491 492 label = snack.Label(sstr(PASSWORD)) 493 grid.setField(label, 0, 1, padding = (0, 0, 1, 0), 494 anchorRight = 1) 495 496 try: 497 self.passwordEntry = snack.Entry(20, password = 1) 498 except TypeError: 499 self.passwordEntry = snack.Entry(20, hidden = 1) 500 self.passwordEntry.set(tui.password) 501 grid.setField(self.passwordEntry, 1, 1, anchorLeft = 1) 502 503 toplevel.add(grid, 0, 1) 504 505 label = snack.TextboxReflowed(size[0]-10, sstr(login_tip)) 506 toplevel.add(label, 0, 2, anchorLeft=1) 507 508 # BUTTON BAR 509 self.bb = snack.ButtonBar(screen, 510 [(sstr(NEXT), "next"), 511 (sstr(BACK), "back"), 512 (sstr(CANCEL), "cancel")]) 513 514 toplevel.add(self.bb, 0, 3, padding = (0, 1, 0, 0), 515 growx = 1) 516 517 518 self.g = toplevel
519 520
521 - def validateFields(self):
522 if self.userNameEntry.value() == "": 523 snack.ButtonChoiceWindow(self.screen, sstr(ERROR), 524 sstr(USER_REQUIRED), 525 buttons = [sstr(OK)]) 526 self.g.setCurrent(self.userNameEntry) 527 return 0 528 if self.passwordEntry.value() == "": 529 snack.ButtonChoiceWindow(self.screen, sstr(ERROR), 530 sstr(PASSWORD_REQUIRED), 531 buttons = [sstr(OK)]) 532 self.g.setCurrent(self.passwordEntry) 533 return 0 534 535 536 try: 537 self.tui.alreadyRegistered = rhnreg.reserveUser(self.userNameEntry.value(), self.passwordEntry.value()) 538 except up2dateErrors.ValidationError: 539 e = sys.exc_info()[1] 540 snack.ButtonChoiceWindow(self.screen, sstr(_("Error")), sstr(_("The server indicated an error:\n")) + sstr(e.errmsg), buttons = [sstr(_("OK"))]) 541 self.g.setCurrent(self.userNameEntry) 542 return 0 543 except up2dateErrors.CommunicationError: 544 e = sys.exc_info()[1] 545 FatalErrorWindow(self.screen, _("There was an error communicating with the registration server:\n") + e.errmsg) 546 return 1
547 548
549 - def saveResults(self):
550 self.tui.userName = self.userNameEntry.value() 551 self.tui.password = self.passwordEntry.value()
552
553 - def run(self):
554 log.log_debug("Running %s" % self.name) 555 self.screen.refresh() 556 valid = 0 557 while not valid: 558 result = self.g.run() 559 button = self.bb.buttonPressed(result) 560 561 if result == "F12": 562 button = "next" 563 564 if button == "next": 565 valid = self.validateFields() 566 567 else: 568 break 569 570 self.screen.popWindow() 571 return button
572
573 -class OSReleaseWindow:
574 name = "OSReleaseWindow" 575
576 - def __init__(self, screen, tui):
577 578 self.tui = tui 579 if not rhnreg.server_supports_eus(): 580 log.log_debug("Server does not support EUS, skipping OSReleaseWindow") 581 raise WindowSkipException() 582 583 self.available_channels = rhnreg.getAvailableChannels( 584 tui.userName, tui.password) 585 if len(self.available_channels['channels']) < 1: 586 log.log_debug("No available EUS channels, skipping OSReleaseWindow") 587 raise WindowSkipException() 588 589 self.screen = screen 590 self.size = snack._snack.size() 591 592 self.selectChannel = False 593 594 toplevel = snack.GridForm(self.screen, sstr(SELECT_OSRELEASE), 1, 7) 595 self.g = toplevel 596 597 self.ostext = snack.TextboxReflowed(self.size[0]-10, sstr(OS_VERSION)) 598 toplevel.add(self.ostext, 0, 0, anchorLeft = 1) 599 optiontext1 = sstr(LIMITED_UPDATES) 600 601 if self.tui.limited_updates_button: 602 self.limited_updates_button = snack.SingleRadioButton(optiontext1, 603 None, isOn = 1) 604 else: 605 self.limited_updates_button = snack.SingleRadioButton(optiontext1, 606 None) 607 608 toplevel.add(self.limited_updates_button, 0, 1, padding = (0, 1, 0, 1), 609 anchorLeft = 1) 610 611 self.sublabel = snack.Label(sstr(MINOR_RELEASE)) 612 toplevel.add(self.sublabel, 0, 2, anchorLeft = 1) 613 614 self.channelList = snack.Listbox(self.size[1]-22, 1, 615 width = self.size[0]-10) 616 toplevel.add(self.channelList, 0, 3) 617 618 for key, value in sorted(self.available_channels['channels'].items(), key=lambda a:a[0]): 619 if key in self.available_channels['receiving_updates']: 620 value = value + "*" 621 self.channelList.append(" " + value, key) 622 623 self.tip = snack.TextboxReflowed(self.size[0]-10, sstr(CHANNEL_PAGE_TIP)) 624 toplevel.add(self.tip, 0, 4, anchorLeft = 1) 625 626 optiontext2 = sstr(ALL_UPDATES) 627 628 if self.tui.all_updates_button: 629 self.all_updates_button = snack.SingleRadioButton(optiontext2, 630 self.limited_updates_button, isOn=1) 631 else: 632 self.all_updates_button = snack.SingleRadioButton(optiontext2, 633 self.limited_updates_button) 634 635 toplevel.add(self.all_updates_button, 0, 5, padding = (0, 0, 0, 1), 636 anchorLeft = 1) 637 638 #self.warning = snack.TextboxReflowed(self.size[0]-10, 639 # sstr(CHANNEL_PAGE_WARNING)) 640 #toplevel.add(self.warning, 0, 9, anchorLeft = 1) 641 642 643 self.bb = snack.ButtonBar(screen, 644 [(sstr(NEXT), "next"), 645 (sstr(BACK), "back"), 646 (sstr(CANCEL), "cancel")]) 647 toplevel.add(self.bb, 0, 6, growx = 1) 648 649 self.screen.refresh()
650 651 652
653 - def run(self):
654 log.log_debug("Running %s" % self.name) 655 self.screen.refresh() 656 valid = "cancel" 657 while valid == "cancel": 658 result = self.g.run() 659 button = self.bb.buttonPressed(result) 660 661 if result == "F12": 662 button = "next" 663 664 if button == "next": 665 valid = self.validateFields() 666 else: 667 break 668 669 self.screen.popWindow() 670 return button
671
672 - def validateFields(self):
673 msgbox = "ok" 674 later_release = False 675 if self.limited_updates_button.selected(): 676 later_release = self.channelList.current() != \ 677 self.available_channels['default_channel'] 678 679 title = sstr(CONFIRM_OS_RELEASE_SELECTION) 680 if later_release: 681 msgbox = snack.ButtonChoiceWindow(self.screen, title, 682 sstr(CONFIRM_OS_WARNING) % self.channelList.current(), 683 buttons =[sstr(OK), sstr(CANCEL)]) 684 return msgbox 685 686 if self.all_updates_button.selected() or later_release: 687 msgbox = snack.ButtonChoiceWindow(self.screen, title, 688 sstr(CONFIRM_OS_ALL), buttons =[sstr(OK), sstr(CANCEL)]) 689 return msgbox 690 return msgbox
691
692 - def saveResults(self):
693 # if limited updates save the channel and selction 694 # for future use 695 self.tui.other.pop('channel', None) 696 if self.limited_updates_button.selected(): 697 log.log_debug("Selected Channel %s" % self.channelList.current()) 698 self.tui.other['channel'] = self.channelList.current() 699 self.tui.limited_updates_button = self.limited_updates_button.selected() 700 self.tui.all_updates_button = 0 701 702 # saving data for all updates button 703 if self.all_updates_button.selected(): 704 self.tui.all_updates_button = self.all_updates_button.selected() 705 self.tui.limited_updates_button = 0
706 707
708 -class HardwareWindow:
709 name = "HardwareWindow" 710
711 - def __init__(self, screen, tui):
712 self.screen = screen 713 self.tui = tui 714 size = snack._snack.size() 715 716 #get the virtualization uuid and set it to other. 717 (virt_uuid, virt_type) = rhnreg.get_virt_info() 718 if not virt_uuid is None: 719 self.tui.other['virt_uuid'] = virt_uuid 720 self.tui.other['virt_type'] = virt_type 721 722 # read all hardware in 723 tui.hardware = hardware.Hardware() 724 725 toplevel = snack.GridForm(screen, sstr(HARDWARE_WINDOW), 1, 7) 726 727 text = snack.TextboxReflowed(70, sstr(HARDWARE_WINDOW_DESC1)) 728 729 toplevel.add(text, 0, 0, anchorLeft = 1) 730 731 grid = snack.Grid(2, 2) 732 733 label = snack.Label(sstr(_("Profile name:"))) 734 grid.setField(label, 0, 0, padding = (0, 0, 1, 0), anchorRight = 1) 735 736 self.profileEntry = snack.Entry(40) 737 grid.setField(self.profileEntry, 1, 0, anchorLeft = 1) 738 739 toplevel.add(grid, 0, 1, anchorLeft = 1) 740 741 if tui.includeHardware: 742 self.hardwareButton = snack.Checkbox(sstr(HARDWARE_WINDOW_CHECKBOX), isOn = 1) 743 else: 744 self.hardwareButton = snack.Checkbox(sstr(HARDWARE_WINDOW_CHECKBOX)) 745 746 toplevel.add(self.hardwareButton, 0, 2, padding = (0, 1, 0, 0), 747 anchorLeft = 1) 748 749 label = snack.Label(sstr(DESELECT)) 750 toplevel.add(label, 0, 3, anchorLeft = 1, padding = (0, 0, 0, 1)) 751 752 grid = snack.Grid(4, 3) 753 hardware_text = '' 754 755 hardware_text += _("Version: ") + sstr(up2dateUtils.getVersion()) + " " 756 self.versionLabel = snack.Label(sstr(_("Version: "))) 757 grid.setField(self.versionLabel, 0, 0, padding = (0, 0, 1, 0), anchorLeft = 1) 758 759 self.versionLabel2 = snack.Label(sstr(up2dateUtils.getVersion())) 760 grid.setField(self.versionLabel2, 1, 0, anchorLeft = 1) 761 762 hardware_text += _("CPU model: ") 763 764 for hw in tui.hardware: 765 if hw['class'] == 'CPU': 766 hardware_text += hw['model'] +"\n" 767 768 hardware_text += _("Hostname: ") 769 770 for hw in tui.hardware: 771 if hw['class'] == 'NETINFO': 772 unicode_hostname = idn_puny_to_unicode(hw['hostname']) 773 hardware_text += unicode_hostname + "\n" 774 775 if tui.profileName != "": 776 self.profileEntry.set(tui.profileName) 777 else: 778 self.profileEntry.set(sstr(unicode_hostname)) 779 780 hardware_text += _("CPU speed: ") 781 782 for hw in tui.hardware: 783 if hw['class'] == 'CPU': 784 hardware_text += _("%d MHz") % hw['speed'] + " " 785 786 hardware_text += _("IP Address: ") 787 788 for hw in tui.hardware: 789 if hw['class'] == 'NETINFO': 790 if hw['ipaddr']: 791 hardware_text += hw['ipaddr'] + " " 792 elif hw['ip6addr']: 793 hardware_text += hw['ip6addr'] + " " 794 795 hardware_text += _("Memory: ") 796 797 for hw in tui.hardware: 798 if hw['class'] == 'MEMORY': 799 hardware_text += _("%s megabytes") % hw['ram'] 800 801 tb = snack.TextboxReflowed(80, sstr(hardware_text)) 802 toplevel.add(tb, 0, 4) 803 804 self.additionalHWLabel = snack.TextboxReflowed(size[0]-10, sstr(HARDWARE_WINDOW_DESC2)) 805 806 toplevel.add(self.additionalHWLabel, 0, 5, padding = (0, 1, 0, 0), 807 anchorLeft = 1) 808 809 # BUTTON BAR 810 self.bb = snack.ButtonBar(screen, 811 [(sstr(NEXT), "next"), 812 (sstr(BACK), "back"), 813 (sstr(CANCEL), "cancel")]) 814 toplevel.add(self.bb, 0, 6, padding = (0, 1, 0, 0), 815 growx = 1) 816 817 self.g = toplevel
818 819 # self.screen.gridWrappedWindow(toplevel, 'HardwareWindow', 80, 14) 820
821 - def saveResults(self):
822 self.tui.profileName = self.profileEntry.value() 823 self.tui.includeHardware = self.hardwareButton.selected()
824
825 - def run(self):
826 log.log_debug("Running %s" % self.name) 827 result = self.g.runOnce() 828 button = self.bb.buttonPressed(result) 829 830 if result == "F12": 831 return "next" 832 return button
833
834 -class PackagesWindow:
835 name = "PackagesWindow" 836
837 - def __init__(self, screen, tui):
838 self.screen = screen 839 self.tui = tui 840 size = snack._snack.size() 841 toplevel = snack.GridForm(screen, sstr(PACKAGES_WINDOW), 1, 5) 842 self.g = toplevel 843 844 845 text = snack.TextboxReflowed(size[0]-10, sstr(PACKAGES_WINDOW_DESC1)) 846 847 toplevel.add(text, 0, 0, anchorLeft = 1) 848 849 self.packagesButton = snack.Checkbox(sstr(PACKAGES_WINDOW_DESC2), 1) 850 toplevel.add(self.packagesButton, 0, 1, padding = (0, 1, 0, 1), 851 anchorLeft = 1) 852 853 label = snack.Label(sstr(PACKAGES_WINDOW_UNCHECK)) 854 toplevel.add(label, 0, 2, anchorLeft = 1) 855 856 #self.packageList = snack.Listbox(size[1]-18, 1, width = size[0]-10) 857 self.packageList = snack.CheckboxTree(size[1]-18, 1) 858 toplevel.add(self.packageList, 0, 3) 859 860 # do we need to read the packages from disk? 861 if tui.packageList == []: 862 self.pwin = snack.GridForm(screen, sstr(PACKAGES_WINDOW_PKGLIST), 1, 1) 863 864 self.scale = snack.Scale(40, 100) 865 self.pwin.add(self.scale, 0, 0) 866 self.pwin.draw() 867 self.screen.refresh() 868 getArch = 0 869 if rhnreg.cfg['supportsExtendedPackageProfile']: 870 getArch = 1 871 tui.packageList = pkgUtils.getInstalledPackageList(getArch=getArch) 872 self.screen.popWindow() 873 874 for package in tui.packageList: 875 self.packageList.append("%s-%s-%s" % (sstr(package['name']), 876 sstr(package['version']), 877 sstr(package['release'])), 878 item = sstr(package['name']), 879 selected = 1) 880 881 # BUTTON BAR 882 self.bb = snack.ButtonBar(screen, 883 [(sstr(NEXT), "next"), 884 (sstr(BACK), "back"), 885 (sstr(CANCEL), "cancel")]) 886 toplevel.add(self.bb, 0, 4, padding = (0, 1, 0, 0), 887 growx = 1)
888 889 890
891 - def setScale(self, amount, total):
892 self.scale.set(int(((amount * 1.0)/ total) * 100)) 893 self.pwin.draw() 894 self.screen.refresh()
895 896
897 - def saveResults(self):
898 self.tui.includePackages = self.packagesButton.selected() 899 selection = self.packageList.getSelection() 900 for pkg in self.tui.packageList: 901 if pkg['name'] in selection: 902 self.tui.selectedPackages.append(pkg)
903 904
905 - def run(self):
906 log.log_debug("Running %s" % self.name) 907 result = self.g.runOnce() 908 button = self.bb.buttonPressed(result) 909 910 if result == "F12": 911 return "next" 912 return button
913
914 -class SendWindow:
915 name = "SendWindow" 916
917 - def __init__(self, screen, tui):
918 self.screen = screen 919 self.tui = tui 920 size = snack._snack.size() 921 922 toplevel = snack.GridForm(screen, sstr(SEND_WINDOW), 1, 2) 923 924 text = snack.TextboxReflowed(size[0]-15, sstr(SEND_WINDOW_DESC)) 925 toplevel.add(text, 0, 0) 926 927 # BUTTON BAR 928 self.bb = snack.ButtonBar(screen, 929 [(sstr(NEXT), "next"), 930 (sstr(BACK), "back"), 931 (sstr(CANCEL), "cancel")]) 932 toplevel.add(self.bb, 0, 1, padding = (0, 1, 0, 0), 933 growx = 1) 934 935 self.g = toplevel
936
937 - def saveResults(self):
938 pass
939 940
941 - def run(self):
942 log.log_debug("Running %s" % self.name) 943 result = self.g.runOnce() 944 button = self.bb.buttonPressed(result) 945 946 if result == "F12": 947 return "next" 948 return button
949
950 -class SendingWindow:
951 name = "SendingWindow" 952
953 - def __init__(self, screen, tui):
954 self.screen = screen 955 self.tui = tui 956 size = snack._snack.size() 957 958 self.pwin = snack.GridForm(screen, sstr(SENDING_WINDOW), 1, 1) 959 960 self.scale = snack.Scale(40, 100) 961 self.pwin.add(self.scale, 0, 0)
962
963 - def run(self):
964 log.log_debug("Running %s" % self.name) 965 966 self.pwin.draw() 967 self.screen.refresh() 968 969 reg_info = None 970 try: 971 # reg_info dict contains: 'system_id', 'channels', 972 # 'failed_channels', 'slots', 'failed_slots' 973 log.log_debug('other is %s' % str(self.tui.other)) 974 975 reg_info = rhnreg.registerSystem2(self.tui.userName, self.tui.password, 976 self.tui.profileName, 977 other = self.tui.other) 978 reg_info = reg_info.rawDict 979 980 systemId = sstr(reg_info['system_id']) 981 982 except up2dateErrors.CommunicationError: 983 e = sys.exc_info()[1] 984 FatalErrorWindow(self.screen, 985 _("Problem registering system:\n") + e.errmsg) 986 except up2dateErrors.RhnUuidUniquenessError: 987 e = sys.exc_info()[1] 988 FatalErrorWindow(self.screen, 989 _("Problem registering system:\n") + e.errmsg) 990 except up2dateErrors.InsuffMgmntEntsError: 991 e = sys.exc_info()[1] 992 FatalErrorWindow(self.screen, 993 _("Problem registering system:\n") + e.errmsg) 994 except up2dateErrors.RegistrationDeniedError: 995 e = sys.exc_info()[1] 996 FatalErrorWindow(self.screen, 997 _("Problem registering system:\n") + e.errmsg) 998 except up2dateErrors.ActivationKeyUsageLimitError: 999 FatalErrorWindow(self.screen, 1000 ACT_KEY_USAGE_LIMIT_ERROR) 1001 except: 1002 log.log_exception(*sys.exc_info()) 1003 FatalErrorWindow(self.screen, _("Problem registering system.")) 1004 1005 # write the system id out. 1006 if not rhnreg.writeSystemId(systemId): 1007 FatalErrorWindow(self.screen, 1008 _("Problem writing out system id to disk.")) 1009 1010 self.setScale(1, 4) 1011 1012 # include the info from the oeminfo file as well 1013 self.oemInfo = rhnreg.getOemInfo() 1014 1015 self.setScale(2, 4) 1016 1017 # maybe upload hardware profile 1018 if self.tui.includeHardware: 1019 try: 1020 rhnreg.sendHardware(systemId, self.tui.hardware) 1021 except up2dateErrors.CommunicationError: 1022 e = sys.exc_info()[1] 1023 FatalErrorWindow(self.screen, 1024 _("Problem sending hardware profile:\n") + e.errmsg) 1025 except: 1026 log.log_exception(*sys.exc_info()) 1027 FatalErrorWindow(self.screen, 1028 _("Problem sending hardware profile.")) 1029 1030 self.setScale(3, 4) 1031 1032 # build up package list if necessary 1033 if self.tui.includePackages: 1034 try: 1035 rhnreg.sendPackages(systemId, self.tui.selectedPackages) 1036 except up2dateErrors.CommunicationError: 1037 e = sys.exc_info()[1] 1038 FatalErrorWindow(self.screen, _("Problem sending package list:\n") + e.errmsg) 1039 except: 1040 log.log_exception(*sys.exc_info()) 1041 FatalErrorWindow(self.screen, _("Problem sending package list.")) 1042 1043 li = None 1044 try: 1045 li = up2dateAuth.updateLoginInfo() 1046 except up2dateErrors.InsuffMgmntEntsError: 1047 FatalErrorWindow(self.screen, sys.exc_info()[1]) 1048 1049 # Send virtualization information to the server. 1050 rhnreg.sendVirtInfo(systemId) 1051 1052 # enable yum-rhn-plugin / dnf-plugin-spacewalk 1053 try: 1054 self.tui.pm_plugin_present, self.tui.pm_plugin_conf_changed = rhnreg.pluginEnable() 1055 except IOError: 1056 e = sys.exc_info()[1] 1057 WarningWindow(self.screen, _("Could not open %s\n%s is not enabled.\n") % (PM_PLUGIN_CONF, PM_PLUGIN_NAME) + e.errmsg) 1058 self.tui.pm_plugin_conf_error = 1 1059 1060 rhnreg.spawnRhnCheckForUI() 1061 self.setScale(4, 4) 1062 1063 # Pop the pwin (Progress bar window) 1064 self.screen.popWindow() 1065 1066 self.tui.reg_info = reg_info 1067 1068 return "next"
1069
1070 - def saveResults(self):
1071 pass
1072
1073 - def setScale(self, amount, total):
1074 self.scale.set(int(((amount * 1.0)/ total) * 100)) 1075 self.pwin.draw() 1076 self.screen.refresh()
1077 1078
1079 -class FinishWindow:
1080 name = "FinishWindow" 1081
1082 - def __init__(self, screen, tui):
1083 self.screen = screen 1084 self.tui = tui 1085 size = snack._snack.size() 1086 1087 toplevel = snack.GridForm(screen, sstr(FINISH_WINDOW), 1088 1, 2) 1089 1090 text = snack.TextboxReflowed(size[0]-11, sstr(FINISH_WINDOW_TEXT_TUI)) 1091 toplevel.add(text, 0, 0) 1092 1093 # BUTTON BAR 1094 self.bb = snack.ButtonBar(screen, 1095 [(sstr(_("Finish")), "next")]) 1096 toplevel.add(self.bb, 0, 1, padding = (0, 1, 0, 0), 1097 growx = 1) 1098 1099 self.g = toplevel
1100
1101 - def saveResults(self):
1102 pass
1103 1104
1105 - def run(self):
1106 log.log_debug("Running %s" % self.name) 1107 result = self.g.runOnce() 1108 button = self.bb.buttonPressed(result) 1109 1110 if result == "F12": 1111 return "next" 1112 return button
1113
1114 -class ReviewWindow:
1115 name = "ReviewWindow" 1116
1117 - def __init__(self, screen, tui):
1118 self.screen = screen 1119 self.tui = tui 1120 self.reg_info = tui.reg_info 1121 size = snack._snack.size() 1122 1123 toplevel = snack.GridForm(screen, sstr(REVIEW_WINDOW), 1, 2) 1124 review_window_text = '' 1125 1126 if not self.tui.pm_plugin_present: 1127 review_window_text += PM_PLUGIN_WARNING + "\n\n" 1128 if self.tui.pm_plugin_conf_error: 1129 review_window_text += PM_PLUGIN_CONF_ERROR + "\n\n" 1130 if self.tui.pm_plugin_conf_changed: 1131 review_window_text += PM_PLUGIN_CONF_CHANGED + "\n\n" 1132 1133 # Build up the review_window_text based on the data in self.reg_info 1134 review_window_text += REVIEW_WINDOW_PROMPT + "\n\n" 1135 1136 # Create and add the text for what channels the system was 1137 # subscribed to. 1138 if len(self.reg_info['channels']) > 0: 1139 channel_list = "" 1140 for channel in self.reg_info['channels']: 1141 channel_list += channel + "\n" 1142 1143 channels = CHANNELS_TITLE + "\n" + \ 1144 OK_CHANNELS + "\n" + \ 1145 "%s\n" 1146 1147 log.log_debug("server type is %s " % self.tui.serverType) 1148 channels += CHANNELS_SAT_WARNING 1149 1150 review_window_text += channels % channel_list + "\n\n" 1151 1152 if len(self.reg_info['system_slots']) > 0: 1153 slot_list = "" 1154 for slot in self.reg_info['system_slots']: 1155 if slot == 'enterprise_entitled': 1156 slot_list += MANAGEMENT + "\n" 1157 elif slot == 'virtualization_host': 1158 slot_list += VIRT + "\n" 1159 else: 1160 slot_list += slot + "\n" 1161 review_window_text += SLOTS % slot_list + "\n\n" 1162 1163 if len(self.reg_info['universal_activation_key']) > 0: 1164 act_key_list = "" 1165 for act_key in self.reg_info['universal_activation_key']: 1166 act_key_list += act_key 1167 review_window_text += ACTIVATION_KEY % (act_key_list) 1168 1169 self.review_window = snack.Textbox(size[0]-10, size[1]-14, sstr(review_window_text), 1, 1) 1170 1171 toplevel.add(self.review_window, 0, 0, padding = (0, 1, 0, 0)) 1172 1173 # BUTTON BAR 1174 self.bb = snack.ButtonBar(screen, [(sstr(OK), "next")]) 1175 toplevel.add(self.bb, 0, 1, padding = (0, 1, 0, 0), 1176 growx = 1) 1177 1178 self.g = toplevel
1179
1180 - def saveResults(self):
1181 return 1
1182
1183 - def run(self):
1184 log.log_debug("Running %s" % self.name) 1185 result = self.g.runOnce() 1186 button = self.bb.buttonPressed(result) 1187 1188 if result == "F12": 1189 button = "next" 1190 if not self.tui.pm_plugin_present: 1191 button = "exit" 1192 if self.tui.pm_plugin_conf_error: 1193 button = "exit" 1194 1195 return button
1196
1197 -class Tui:
1198 name = "RHN_REGISTER_TUI" 1199
1200 - def __init__(self, screen, test):
1201 self.screen = screen 1202 self.test = test 1203 self.size = snack._snack.size() 1204 self.drawFrame() 1205 self.alreadyRegistered = 0 1206 try: 1207 self.serverType = rhnreg.getServerType() 1208 except up2dateErrors.InvalidProtocolError: 1209 FatalErrorWindow(screen, _("You specified an invalid protocol." + 1210 "Only https and http are allowed.")) 1211 1212 self.windows = [ 1213 AlreadyRegisteredSubscriptionManagerWindow, 1214 AlreadyRegisteredWindow, 1215 StartWindow, 1216 SatelliteUrlWindow, 1217 ConnectWindow, 1218 InfoWindow, 1219 OSReleaseWindow, 1220 HardwareWindow, 1221 PackagesWindow, 1222 SendWindow, 1223 SendingWindow, 1224 ReviewWindow, 1225 FinishWindow 1226 ] 1227 self.serverURL = config.getServerlURL()[0] 1228 1229 if not cfg['sslCACert']: 1230 cfg.set('sslCACert', '/usr/share/rhn/RHN-ORG-TRUSTED-SSL-CERT') 1231 self.sslCACert = cfg['sslCACert']
1232
1233 - def __del__(self):
1234 self.screen.finish()
1235 1236
1237 - def drawFrame(self):
1238 self.welcomeText = COPYRIGHT_TEXT 1239 self.screen.drawRootText(0, 0, sstr(self.welcomeText)) 1240 self.screen.pushHelpLine(sstr(_(" <Tab>/<Alt-Tab> between elements | <Space> selects | <F12> next screen")))
1241 1242
1243 - def initResults(self):
1244 self.userName = "" 1245 self.password = "" 1246 1247 self.oemInfo = {} 1248 self.productInfo = { 1249 "entitlement_num" : "", 1250 "registration_num" : "", 1251 "first_name" : "", 1252 "last_name" : "", 1253 "company" : "", 1254 "address" : "", 1255 "city" : "", 1256 "state" : "", 1257 "zip" : "", 1258 "country" : "", 1259 } 1260 1261 self.other = {} 1262 self.other['registration_number'] = '' 1263 1264 self.profileName = "" 1265 self.includeHardware = 1 1266 1267 self.limited_updates_button = 1 1268 self.all_updates_button = 0 1269 self.includePackages = 0 1270 self.packageList = [] 1271 self.selectedPackages = [] 1272 self.pm_plugin_present = 1 1273 self.pm_plugin_conf_error = 0 1274 self.pm_plugin_conf_changed = 0
1275
1276 - def run(self):
1277 log.log_debug("Running %s" % self.name) 1278 self.initResults() 1279 1280 direction = "forward" 1281 1282 try: 1283 index = 0 1284 while index < len(self.windows): 1285 1286 win = None 1287 try: 1288 win = self.windows[index](self.screen, self) 1289 except WindowSkipException: 1290 if direction == "forward": 1291 index = index + 1 1292 else: 1293 index = index - 1 1294 continue 1295 1296 log.log_debug("index is %s" % index) 1297 1298 result = win.run() 1299 log.log_debug("Result %s" % result) 1300 1301 if result == "back": 1302 if index > 0: 1303 index = index - 1 1304 1305 # If we're on the info window, "back" means go back 1306 # to the satellite url window, not back to the 1307 # temporary connection test window. 1308 if (index > 0 and 1309 self.windows[index].name == ConnectWindow.name): 1310 index -= 1 1311 1312 direction = "backward" 1313 1314 elif result == "exit": 1315 return 1316 1317 elif result == "cancel": 1318 log.log_debug("Caught a cancel request") 1319 1320 # Show the confirm quit window 1321 if ConfirmQuitWindow(self.screen) == 1: 1322 return 1323 1324 elif result == "next": 1325 index = index + 1 1326 win.saveResults() 1327 direction = "forward" 1328 1329 finally: 1330 self.screen.finish()
1331 1332
1333 -def main():
1334 test = 0 1335 signal.signal(signal.SIGINT, signal.SIG_IGN) 1336 1337 if len(sys.argv) > 1: 1338 if sys.argv[1] == "-t" or sys.argv[1] == "--test": 1339 test = 1 1340 1341 screen = snack.SnackScreen() 1342 1343 if geteuid() != 0 and not test: 1344 FatalErrorWindow(screen, _("You must run the RHN registration program as root.")) 1345 1346 tui = Tui(screen, test) 1347 tui.run()
1348 1349 1350 if __name__ == "__main__": 1351 main() 1352