1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 from os import geteuid
18 import sys
19
20 import gettext
21 t = gettext.translation('rhn-client-tools', fallback=True)
22
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
50
56
61
62
84
85
109
112
114 name = "AlreadyRegisteredWindow"
115
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
148
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
161 name = "SatelliteUrlWindow"
162
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
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
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
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
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
246 serverEntry = self.urlEntry.value()
247
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
278
280 name = "AlreadyRegisteredSubscriptionManagerWindow"
281
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
308
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
321 name = "ConnectWindow"
322
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
368
371
373 name = "StartWindow"
374
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
397
398
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
414 name = "WhyRegisterWindow"
415
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
452
453
455 name = "InfoWindow"
456
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
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
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
550 self.tui.userName = self.userNameEntry.value()
551 self.tui.password = self.passwordEntry.value()
552
572
574 name = "OSReleaseWindow"
575
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
639
640
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
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
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
693
694
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
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
709 name = "HardwareWindow"
710
712 self.screen = screen
713 self.tui = tui
714 size = snack._snack.size()
715
716
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
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
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
820
822 self.tui.profileName = self.profileEntry.value()
823 self.tui.includeHardware = self.hardwareButton.selected()
824
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
835 name = "PackagesWindow"
836
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
857 self.packageList = snack.CheckboxTree(size[1]-18, 1)
858 toplevel.add(self.packageList, 0, 3)
859
860
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
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
892 self.scale.set(int(((amount * 1.0)/ total) * 100))
893 self.pwin.draw()
894 self.screen.refresh()
895
896
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
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
915 name = "SendWindow"
916
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
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
939
940
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
951 name = "SendingWindow"
952
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
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
972
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
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
1013 self.oemInfo = rhnreg.getOemInfo()
1014
1015 self.setScale(2, 4)
1016
1017
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
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
1050 rhnreg.sendVirtInfo(systemId)
1051
1052
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
1064 self.screen.popWindow()
1065
1066 self.tui.reg_info = reg_info
1067
1068 return "next"
1069
1072
1074 self.scale.set(int(((amount * 1.0)/ total) * 100))
1075 self.pwin.draw()
1076 self.screen.refresh()
1077
1078
1080 name = "FinishWindow"
1081
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
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
1103
1104
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
1115 name = "ReviewWindow"
1116
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
1134 review_window_text += REVIEW_WINDOW_PROMPT + "\n\n"
1135
1136
1137
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
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
1182
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
1198 name = "RHN_REGISTER_TUI"
1199
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
1235
1236
1241
1242
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
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
1306
1307
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
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
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