Viewing file: tui.py (43.7 KB) -rw-r--r-- Select action/file-type: (+) | (+) | (+) | Code (+) | Session (+) | (+) | SDB (+) | (+) | (+) | (+) | (+) | (+) |
# # TUI for RHN Registration # Copyright (c) 2000--2020 Red Hat, Inc. # # This software is licensed to you under the GNU General Public License, # version 2 (GPLv2). There is NO WARRANTY for this software, express or # implied, including the implied warranties of MERCHANTABILITY or FITNESS # FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2 # along with this software; if not, see # http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt. # # Red Hat trademarks are not licensed under GPLv2. No permission is # granted to use or replicate Red Hat trademarks that are incorporated # in this software or its documentation. #
from os import geteuid import sys
import gettext t = gettext.translation('rhn-client-tools', fallback=True) # Python 3 translations don't have a ugettext method if not hasattr(t, 'ugettext'): t.ugettext = t.gettext _ = t.ugettext
import snack import signal
from up2date_client import rhnreg, hardware from up2date_client import up2dateErrors from up2date_client import up2dateUtils from up2date_client import pkgUtils from up2date_client import up2dateLog from up2date_client import config from up2date_client.config import convert_url_from_puny from up2date_client import up2dateAuth from rhn import rpclib from rhn.connections import idn_puny_to_unicode from rhn.i18n import sstr from up2date_client.pmPlugin import PM_PLUGIN_NAME, PM_PLUGIN_CONF from up2date_client.rhnreg_constants import *
log = up2dateLog.initLog() cfg = config.initUp2dateConfig()
def ErrorWindow(screen, errmsg): snack.ButtonChoiceWindow(screen, sstr(ERROR), sstr(u"%s" % errmsg), [sstr(BACK)])
def FatalErrorWindow(screen, errmsg): snack.ButtonChoiceWindow(screen, sstr(FATAL_ERROR), sstr(u"%s" % errmsg), [sstr(OK)]) screen.finish() sys.exit(1)
def WarningWindow(screen, errmsg): snack.ButtonChoiceWindow(screen, sstr(WARNING), sstr("%s" % errmsg), [sstr(OK)]) screen.finish()
def ConfirmQuitWindow(screen): button = snack.ButtonChoiceWindow(screen, sstr(CONFIRM_QUIT), sstr(CONFIRM_QUIT_SURE) + "\n" + \ sstr(WHY_REGISTER_SEC) + "\n" + \ sstr(WHY_REGISTER_SEC_TXT) + "\n\n" + \ sstr(WHY_REGISTER_DLD) + "\n" + \ sstr(WHY_REGISTER_DLD_TXT) + "\n\n" + \ sstr(WHY_REGISTER_SUPP) + "\n" + \ sstr(WHY_REGISTER_SUPP_TXT) + "\n\n" + \ sstr(WHY_REGISTER_COMP) + "\n" + \ sstr(WHY_REGISTER_COMP_TXT) + "\n\n" + \ sstr(CONFIRM_QUIT_WILLNOT) + "\n" + \ sstr(WHY_REGISTER_TIP), [sstr(CONTINUE_REGISTERING), sstr(REGISTER_LATER2)], width = 70)
if button == sstr(REGISTER_LATER2).lower(): screen.finish() return 1 else: return 0
def tui_call_wrapper(screen, func, *params):
try: results = func(*params) except up2dateErrors.CommunicationError: ErrorWindow(screen, HOSTED_CONNECTION_ERROR % config.getServerlURL()[0]) raise sys.exc_info()[1] except up2dateErrors.SSLCertificateVerifyFailedError: ErrorWindow(screen, e.errmsg) raise sys.exc_info()[1] except up2dateErrors.NoBaseChannelError: e = sys.exc_info()[1] FatalErrorWindow(screen, e.errmsg + '\n' + BASECHANNELERROR % (up2dateUtils.getArch(), up2dateUtils.getOSRelease(), up2dateUtils.getVersion())) except up2dateErrors.SSLCertificateFileNotFound: e = sys.exc_info()[1] ErrorWindow(screen, e.errmsg + '\n\n' + SSL_CERT_FILE_NOT_FOUND_ERRER) raise e
return results
class WindowSkipException(Exception): pass
class AlreadyRegisteredWindow: name = "AlreadyRegisteredWindow"
def __init__(self, screen, tui):
if not rhnreg.registered() or tui.test: raise WindowSkipException()
self.screen = screen self.tui = tui size = snack._snack.size()
systemIdXml = rpclib.xmlrpclib.loads(up2dateAuth.getSystemId()) oldUsername = systemIdXml[0][0]['username'] oldsystemId = systemIdXml[0][0]['system_id']
toplevel = snack.GridForm(self.screen, sstr(SYSTEM_ALREADY_SETUP), 1, 2) self.bb = snack.ButtonBar(self.screen, [(sstr(YES_CONT), "next"), (sstr(NO_CANCEL), "exit")]) toplevel.add(self.bb, 0, 1, growx = 1)
tb = snack.Textbox(size[0]-30, size[1]-20, sstr(SYSTEM_ALREADY_REGISTERED + "\n\n" + _("Spacewalk Location:") + " " + convert_url_from_puny(self.tui.serverURL) + "\n" + _("Login:") + " " + oldUsername + "\n" + _("System ID:") + " " + oldsystemId + "\n\n" + SYSTEM_ALREADY_REGISTERED_CONT + "\n"), 1, 1) toplevel.add(tb, 0, 0, padding = (0, 0, 0, 1))
self.g = toplevel
def saveResults(self): pass
def run(self): log.log_debug("Running %s" % self.name)
result = self.g.runOnce() button = self.bb.buttonPressed(result)
if result == "F12": return "next"
return button
class SatelliteUrlWindow: name = "SatelliteUrlWindow"
def __init__(self, screen, tui): self.screen = screen self.tui = tui self.tui.alreadyRegistered = 0
self.server = convert_url_from_puny(self.tui.serverURL) fixed_server_url = rhnreg.makeNiceServerUrl(self.server)
#Save the config only if the url is different if fixed_server_url != self.server: self.server = fixed_server_url config.setServerURL(self.server) cfg.save()
size = snack._snack.size()
toplevel = snack.GridForm(screen, sstr(SATELLITE_URL_WINDOW), 1, 4)
prompt_text = SATELLITE_URL_TEXT url_label = SATELLITE_URL_PROMPT ssl_label = SATELLITE_URL_PROMPT2
label = snack.Textbox(size[0]-10, 3, sstr(prompt_text), scroll = 0, wrap = 1)
toplevel.add(label, 0, 0, anchorLeft = 1)
# spacer label = snack.Label(sstr("")) toplevel.add(label, 0, 1)
grid = snack.Grid(2, 3)
label = snack.Label(sstr(url_label)) grid.setField(label, 0, 0, padding = (0, 0, 1, 0), anchorRight = 1)
self.urlEntry = snack.Entry(40) self.urlEntry.set(self.server) grid.setField(self.urlEntry, 1, 0, anchorLeft = 1)
label = snack.Label(sstr(ssl_label)) grid.setField(label, 0, 1, padding = (0, 0, 1, 0), anchorRight = 1)
self.sslEntry = snack.Entry(40) self.sslEntry.set(tui.sslCACert) grid.setField(self.sslEntry, 1, 1, anchorLeft = 1)
toplevel.add(grid, 0, 2)
# BUTTON BAR self.bb = snack.ButtonBar(screen, [(sstr(NEXT), "next"), (sstr(BACK), "back"), (sstr(CANCEL), "cancel")])
toplevel.add(self.bb, 0, 3, padding = (0, 1, 0, 0), growx = 1)
self.g = toplevel
def validateFields(self): if self.urlEntry.value() == "": snack.ButtonChoiceWindow(self.screen, sstr(ERROR), sstr(SATELLITE_REQUIRED), buttons = [sstr(OK)]) self.g.setCurrent(self.urlEntry) return 0
if (self.urlEntry.value()[:5] == 'https' and self.sslEntry.value() == ""): snack.ButtonChoiceWindow(self.screen, sstr(ERROR), sstr(SSL_REQUIRED), buttons = [sstr(OK)]) self.g.setCurrent(self.sslEntry) return 0 return 1
def saveResults(self): serverEntry = self.urlEntry.value() # fix up the server url, E.G. if someone left off /XMLRPC fixed_server_url = rhnreg.makeNiceServerUrl(serverEntry) if fixed_server_url != serverEntry: serverEntry = fixed_server_url
self.tui.serverURL = serverEntry self.tui.sslCACert = self.sslEntry.value() config.setServerURL(serverEntry) config.setSSLCACert(self.sslEntry.value()) cfg.save()
def run(self): log.log_debug("Running %s" % self.name) self.screen.refresh() valid = 0 while not valid: result = self.g.run() button = self.bb.buttonPressed(result)
if result == "F12": button = "next"
if button == "next": valid = self.validateFields()
else: break
self.screen.popWindow()
return button
class AlreadyRegisteredSubscriptionManagerWindow: name = "AlreadyRegisteredSubscriptionManagerWindow"
def __init__(self, screen, tui):
if not rhnreg.rhsm_registered() or tui.test: raise WindowSkipException()
self.screen = screen self.tui = tui size = snack._snack.size()
toplevel = snack.GridForm(self.screen, sstr(SYSTEM_ALREADY_SETUP), 1, 2) self.bb = snack.ButtonBar(self.screen, [(sstr(YES_CONT), "next"), (sstr(NO_CANCEL), "exit")]) toplevel.add(self.bb, 0, 1, growx = 1)
tb = snack.Textbox(size[0]-30, size[1]-20, sstr(WARNING + "\n\n" + RHSM_SYSTEM_ALREADY_REGISTERED + "\n\n" + SYSTEM_ALREADY_REGISTERED_CONT + "\n"), 1, 1) toplevel.add(tb, 0, 0, padding = (0, 0, 0, 1))
self.g = toplevel
def saveResults(self): pass
def run(self): log.log_debug("Running %s" % self.name)
result = self.g.runOnce() button = self.bb.buttonPressed(result)
if result == "F12": return "next"
return button
class ConnectWindow: name = "ConnectWindow"
def __init__(self, screen, tui): self.screen = screen self.tui = tui size = snack._snack.size()
self.server = convert_url_from_puny(self.tui.serverURL)
self.proxy = cfg['httpProxy']
toplevel = snack.GridForm(self.screen, sstr(CONNECT_WINDOW), 1, 1)
text = CONNECT_WINDOW_TEXT % self.server + "\n\n"
if self.proxy: text += CONNECT_WINDOW_TEXT2 % self.proxy
tb = snack.Textbox(size[0]-30, size[1]-20, sstr(text), 1, 1)
toplevel.add(tb, 0, 0, padding = (0, 0, 0, 1))
self.g = toplevel
def run(self): log.log_debug("Running %s" % self.name)
# We draw and display the window. The window gets displayed as # long as we are attempting to connect to the server. Once we # connect the window is gone. result = self.g.draw() self.screen.refresh() # try to connect given the server url and ssl cert provided. If # unsuccessful, return to previous screen to allow user to fix. try: tui_call_wrapper(self.screen, rhnreg.getCaps) except: return "back"
self.screen.popWindow()
# Just return next, although the user wouldn't have actually pressed # anything. return "next"
def saveResults(self): pass
class StartWindow: name = "StartWindow"
def __init__(self, screen, tui): self.screen = screen self.tui = tui size = snack._snack.size() toplevel = snack.GridForm(self.screen, sstr(START_REGISTER_WINDOW), 1, 2)
start_register_text = sstr(START_REGISTER_TEXT)
tb = snack.Textbox(size[0]-10, size[1]-14, start_register_text, 1, 1) toplevel.add(tb, 0, 0, padding = (0, 0, 0, 1))
self.bb = snack.ButtonBar(self.screen, [(sstr(WHY_REGISTER), "why_register"), (sstr(NEXT), "next"), (sstr(CANCEL), "cancel")]) toplevel.add(self.bb, 0, 1, growx = 1)
self.g = toplevel
def saveResults(self): pass
def run(self): log.log_debug("Running %s" % self.name) result = self.g.runOnce() button = self.bb.buttonPressed(result)
if result == "F12": return "next" elif button == "why_register": why_reg_win = WhyRegisterWindow(self.screen, self.tui) why_reg_win.run() return button
return button
class WhyRegisterWindow: name = "WhyRegisterWindow"
def __init__(self, screen, tui): self.screen = screen self.tui = tui size = snack._snack.size() toplevel = snack.GridForm(self.screen, sstr(WHY_REGISTER_WINDOW), 1, 2)
why_register_text = WHY_REGISTER_TEXT + "\n\n" + \ WHY_REGISTER_SEC + "\n" + \ WHY_REGISTER_SEC_TXT + "\n\n" + \ WHY_REGISTER_DLD + "\n" + \ WHY_REGISTER_DLD_TXT + "\n\n" + \ WHY_REGISTER_SUPP + "\n" + \ WHY_REGISTER_SUPP_TXT + "\n\n" + \ WHY_REGISTER_COMP + "\n" + \ WHY_REGISTER_COMP_TXT + "\n\n" + \ WHY_REGISTER_TIP
tb = snack.Textbox(size[0]-10, size[1]-14, sstr(why_register_text), 1, 1)
toplevel.add(tb, 0, 0, padding = (0, 0, 0, 1))
self.bb = snack.ButtonBar(self.screen, [(sstr(BACK_REGISTER), "back")]) toplevel.add(self.bb, 0, 1, growx = 1)
self.g = toplevel
def run(self): log.log_debug("Running %s" % self.name) result = self.g.runOnce() button = self.bb.buttonPressed(result)
return button
class InfoWindow: name = "InfoWindow"
def __init__(self, screen, tui): self.screen = screen self.tui = tui self.tui.alreadyRegistered = 0
self.server = self.tui.serverURL
size = snack._snack.size()
toplevel = snack.GridForm(screen, sstr(REGISTER_WINDOW), 1, 4)
decoded_server = convert_url_from_puny(self.server) url = self.server if decoded_server != self.server: url += " (%s)" % decoded_server login_prompt = LOGIN_PROMPT % url login_label = LOGIN login_tip = LOGIN_TIP
label = snack.Textbox(size[0]-10, 3, sstr(login_prompt), scroll = 0, wrap = 1)
toplevel.add(label, 0, 0, anchorLeft = 1)
grid = snack.Grid(2, 3)
label = snack.Label(sstr(login_label)) grid.setField(label, 0, 0, padding = (0, 0, 1, 0), anchorRight = 1)
self.userNameEntry = snack.Entry(20) self.userNameEntry.set(tui.userName) grid.setField(self.userNameEntry, 1, 0, anchorLeft = 1)
label = snack.Label(sstr(PASSWORD)) grid.setField(label, 0, 1, padding = (0, 0, 1, 0), anchorRight = 1)
try: self.passwordEntry = snack.Entry(20, password = 1) except TypeError: self.passwordEntry = snack.Entry(20, hidden = 1) self.passwordEntry.set(tui.password) grid.setField(self.passwordEntry, 1, 1, anchorLeft = 1)
toplevel.add(grid, 0, 1)
label = snack.TextboxReflowed(size[0]-10, sstr(login_tip)) toplevel.add(label, 0, 2, anchorLeft=1)
# BUTTON BAR self.bb = snack.ButtonBar(screen, [(sstr(NEXT), "next"), (sstr(BACK), "back"), (sstr(CANCEL), "cancel")])
toplevel.add(self.bb, 0, 3, padding = (0, 1, 0, 0), growx = 1)
self.g = toplevel
def validateFields(self): if self.userNameEntry.value() == "": snack.ButtonChoiceWindow(self.screen, sstr(ERROR), sstr(USER_REQUIRED), buttons = [sstr(OK)]) self.g.setCurrent(self.userNameEntry) return 0 if self.passwordEntry.value() == "": snack.ButtonChoiceWindow(self.screen, sstr(ERROR), sstr(PASSWORD_REQUIRED), buttons = [sstr(OK)]) self.g.setCurrent(self.passwordEntry) return 0
try: self.tui.alreadyRegistered = rhnreg.reserveUser(self.userNameEntry.value(), self.passwordEntry.value()) except up2dateErrors.ValidationError: e = sys.exc_info()[1] snack.ButtonChoiceWindow(self.screen, sstr(_("Error")), sstr(_("The server indicated an error:\n")) + sstr(e.errmsg), buttons = [sstr(_("OK"))]) self.g.setCurrent(self.userNameEntry) return 0 except up2dateErrors.CommunicationError: e = sys.exc_info()[1] FatalErrorWindow(self.screen, _("There was an error communicating with the registration server:\n") + e.errmsg) return 1
def saveResults(self): self.tui.userName = self.userNameEntry.value() self.tui.password = self.passwordEntry.value()
def run(self): log.log_debug("Running %s" % self.name) self.screen.refresh() valid = 0 while not valid: result = self.g.run() button = self.bb.buttonPressed(result)
if result == "F12": button = "next"
if button == "next": valid = self.validateFields()
else: break
self.screen.popWindow() return button
class OSReleaseWindow: name = "OSReleaseWindow"
def __init__(self, screen, tui):
self.tui = tui if not rhnreg.server_supports_eus(): log.log_debug("Server does not support EUS, skipping OSReleaseWindow") raise WindowSkipException()
self.available_channels = rhnreg.getAvailableChannels( tui.userName, tui.password) if len(self.available_channels['channels']) < 1: log.log_debug("No available EUS channels, skipping OSReleaseWindow") raise WindowSkipException()
self.screen = screen self.size = snack._snack.size()
self.selectChannel = False
toplevel = snack.GridForm(self.screen, sstr(SELECT_OSRELEASE), 1, 7) self.g = toplevel
self.ostext = snack.TextboxReflowed(self.size[0]-10, sstr(OS_VERSION)) toplevel.add(self.ostext, 0, 0, anchorLeft = 1) optiontext1 = sstr(LIMITED_UPDATES)
if self.tui.limited_updates_button: self.limited_updates_button = snack.SingleRadioButton(optiontext1, None, isOn = 1) else: self.limited_updates_button = snack.SingleRadioButton(optiontext1, None)
toplevel.add(self.limited_updates_button, 0, 1, padding = (0, 1, 0, 1), anchorLeft = 1)
self.sublabel = snack.Label(sstr(MINOR_RELEASE)) toplevel.add(self.sublabel, 0, 2, anchorLeft = 1)
self.channelList = snack.Listbox(self.size[1]-22, 1, width = self.size[0]-10) toplevel.add(self.channelList, 0, 3)
for key, value in sorted(self.available_channels['channels'].items(), key=lambda a:a[0]): if key in self.available_channels['receiving_updates']: value = value + "*" self.channelList.append(" " + value, key)
self.tip = snack.TextboxReflowed(self.size[0]-10, sstr(CHANNEL_PAGE_TIP)) toplevel.add(self.tip, 0, 4, anchorLeft = 1)
optiontext2 = sstr(ALL_UPDATES)
if self.tui.all_updates_button: self.all_updates_button = snack.SingleRadioButton(optiontext2, self.limited_updates_button, isOn=1) else: self.all_updates_button = snack.SingleRadioButton(optiontext2, self.limited_updates_button)
toplevel.add(self.all_updates_button, 0, 5, padding = (0, 0, 0, 1), anchorLeft = 1)
#self.warning = snack.TextboxReflowed(self.size[0]-10, # sstr(CHANNEL_PAGE_WARNING)) #toplevel.add(self.warning, 0, 9, anchorLeft = 1)
self.bb = snack.ButtonBar(screen, [(sstr(NEXT), "next"), (sstr(BACK), "back"), (sstr(CANCEL), "cancel")]) toplevel.add(self.bb, 0, 6, growx = 1)
self.screen.refresh()
def run(self): log.log_debug("Running %s" % self.name) self.screen.refresh() valid = "cancel" while valid == "cancel": result = self.g.run() button = self.bb.buttonPressed(result)
if result == "F12": button = "next"
if button == "next": valid = self.validateFields() else: break
self.screen.popWindow() return button
def validateFields(self): msgbox = "ok" later_release = False if self.limited_updates_button.selected(): later_release = self.channelList.current() != \ self.available_channels['default_channel']
title = sstr(CONFIRM_OS_RELEASE_SELECTION) if later_release: msgbox = snack.ButtonChoiceWindow(self.screen, title, sstr(CONFIRM_OS_WARNING) % self.channelList.current(), buttons =[sstr(OK), sstr(CANCEL)]) return msgbox
if self.all_updates_button.selected() or later_release: msgbox = snack.ButtonChoiceWindow(self.screen, title, sstr(CONFIRM_OS_ALL), buttons =[sstr(OK), sstr(CANCEL)]) return msgbox return msgbox
def saveResults(self): # if limited updates save the channel and selction # for future use self.tui.other.pop('channel', None) if self.limited_updates_button.selected(): log.log_debug("Selected Channel %s" % self.channelList.current()) self.tui.other['channel'] = self.channelList.current() self.tui.limited_updates_button = self.limited_updates_button.selected() self.tui.all_updates_button = 0
# saving data for all updates button if self.all_updates_button.selected(): self.tui.all_updates_button = self.all_updates_button.selected() self.tui.limited_updates_button = 0
class HardwareWindow: name = "HardwareWindow"
def __init__(self, screen, tui): self.screen = screen self.tui = tui size = snack._snack.size()
#get the virtualization uuid and set it to other. (virt_uuid, virt_type) = rhnreg.get_virt_info() if not virt_uuid is None: self.tui.other['virt_uuid'] = virt_uuid self.tui.other['virt_type'] = virt_type
# read all hardware in tui.hardware = hardware.Hardware()
toplevel = snack.GridForm(screen, sstr(HARDWARE_WINDOW), 1, 7)
text = snack.TextboxReflowed(70, sstr(HARDWARE_WINDOW_DESC1))
toplevel.add(text, 0, 0, anchorLeft = 1)
grid = snack.Grid(2, 2)
label = snack.Label(sstr(_("Profile name:"))) grid.setField(label, 0, 0, padding = (0, 0, 1, 0), anchorRight = 1)
self.profileEntry = snack.Entry(40) grid.setField(self.profileEntry, 1, 0, anchorLeft = 1)
toplevel.add(grid, 0, 1, anchorLeft = 1)
if tui.includeHardware: self.hardwareButton = snack.Checkbox(sstr(HARDWARE_WINDOW_CHECKBOX), isOn = 1) else: self.hardwareButton = snack.Checkbox(sstr(HARDWARE_WINDOW_CHECKBOX))
toplevel.add(self.hardwareButton, 0, 2, padding = (0, 1, 0, 0), anchorLeft = 1)
label = snack.Label(sstr(DESELECT)) toplevel.add(label, 0, 3, anchorLeft = 1, padding = (0, 0, 0, 1))
grid = snack.Grid(4, 3) hardware_text = ''
hardware_text += _("Version: ") + sstr(up2dateUtils.getVersion()) + " " self.versionLabel = snack.Label(sstr(_("Version: "))) grid.setField(self.versionLabel, 0, 0, padding = (0, 0, 1, 0), anchorLeft = 1)
self.versionLabel2 = snack.Label(sstr(up2dateUtils.getVersion())) grid.setField(self.versionLabel2, 1, 0, anchorLeft = 1)
hardware_text += _("CPU model: ")
for hw in tui.hardware: if hw['class'] == 'CPU': hardware_text += hw['model'] +"\n"
hardware_text += _("Hostname: ")
for hw in tui.hardware: if hw['class'] == 'NETINFO': unicode_hostname = idn_puny_to_unicode(hw['hostname']) hardware_text += unicode_hostname + "\n"
if tui.profileName != "": self.profileEntry.set(tui.profileName) else: self.profileEntry.set(sstr(unicode_hostname))
hardware_text += _("CPU speed: ")
for hw in tui.hardware: if hw['class'] == 'CPU': hardware_text += _("%d MHz") % hw['speed'] + " "
hardware_text += _("IP Address: ")
for hw in tui.hardware: if hw['class'] == 'NETINFO': if hw['ipaddr']: hardware_text += hw['ipaddr'] + " " elif hw['ip6addr']: hardware_text += hw['ip6addr'] + " "
hardware_text += _("Memory: ")
for hw in tui.hardware: if hw['class'] == 'MEMORY': hardware_text += _("%s megabytes") % hw['ram']
tb = snack.TextboxReflowed(80, sstr(hardware_text)) toplevel.add(tb, 0, 4)
self.additionalHWLabel = snack.TextboxReflowed(size[0]-10, sstr(HARDWARE_WINDOW_DESC2))
toplevel.add(self.additionalHWLabel, 0, 5, padding = (0, 1, 0, 0), anchorLeft = 1)
# BUTTON BAR self.bb = snack.ButtonBar(screen, [(sstr(NEXT), "next"), (sstr(BACK), "back"), (sstr(CANCEL), "cancel")]) toplevel.add(self.bb, 0, 6, padding = (0, 1, 0, 0), growx = 1)
self.g = toplevel
# self.screen.gridWrappedWindow(toplevel, 'HardwareWindow', 80, 14)
def saveResults(self): self.tui.profileName = self.profileEntry.value() self.tui.includeHardware = self.hardwareButton.selected()
def run(self): log.log_debug("Running %s" % self.name) result = self.g.runOnce() button = self.bb.buttonPressed(result)
if result == "F12": return "next" return button
class PackagesWindow: name = "PackagesWindow"
def __init__(self, screen, tui): self.screen = screen self.tui = tui size = snack._snack.size() toplevel = snack.GridForm(screen, sstr(PACKAGES_WINDOW), 1, 5) self.g = toplevel
text = snack.TextboxReflowed(size[0]-10, sstr(PACKAGES_WINDOW_DESC1))
toplevel.add(text, 0, 0, anchorLeft = 1)
self.packagesButton = snack.Checkbox(sstr(PACKAGES_WINDOW_DESC2), 1) toplevel.add(self.packagesButton, 0, 1, padding = (0, 1, 0, 1), anchorLeft = 1)
label = snack.Label(sstr(PACKAGES_WINDOW_UNCHECK)) toplevel.add(label, 0, 2, anchorLeft = 1)
#self.packageList = snack.Listbox(size[1]-18, 1, width = size[0]-10) self.packageList = snack.CheckboxTree(size[1]-18, 1) toplevel.add(self.packageList, 0, 3)
# do we need to read the packages from disk? if tui.packageList == []: self.pwin = snack.GridForm(screen, sstr(PACKAGES_WINDOW_PKGLIST), 1, 1)
self.scale = snack.Scale(40, 100) self.pwin.add(self.scale, 0, 0) self.pwin.draw() self.screen.refresh() getArch = 0 if rhnreg.cfg['supportsExtendedPackageProfile']: getArch = 1 tui.packageList = pkgUtils.getInstalledPackageList(getArch=getArch) self.screen.popWindow()
for package in tui.packageList: self.packageList.append("%s-%s-%s" % (sstr(package['name']), sstr(package['version']), sstr(package['release'])), item = sstr(package['name']), selected = 1)
# BUTTON BAR self.bb = snack.ButtonBar(screen, [(sstr(NEXT), "next"), (sstr(BACK), "back"), (sstr(CANCEL), "cancel")]) toplevel.add(self.bb, 0, 4, padding = (0, 1, 0, 0), growx = 1)
def setScale(self, amount, total): self.scale.set(int(((amount * 1.0)/ total) * 100)) self.pwin.draw() self.screen.refresh()
def saveResults(self): self.tui.includePackages = self.packagesButton.selected() selection = self.packageList.getSelection() for pkg in self.tui.packageList: if pkg['name'] in selection: self.tui.selectedPackages.append(pkg)
def run(self): log.log_debug("Running %s" % self.name) result = self.g.runOnce() button = self.bb.buttonPressed(result)
if result == "F12": return "next" return button
class SendWindow: name = "SendWindow"
def __init__(self, screen, tui): self.screen = screen self.tui = tui size = snack._snack.size()
toplevel = snack.GridForm(screen, sstr(SEND_WINDOW), 1, 2)
text = snack.TextboxReflowed(size[0]-15, sstr(SEND_WINDOW_DESC)) toplevel.add(text, 0, 0)
# BUTTON BAR self.bb = snack.ButtonBar(screen, [(sstr(NEXT), "next"), (sstr(BACK), "back"), (sstr(CANCEL), "cancel")]) toplevel.add(self.bb, 0, 1, padding = (0, 1, 0, 0), growx = 1)
self.g = toplevel
def saveResults(self): pass
def run(self): log.log_debug("Running %s" % self.name) result = self.g.runOnce() button = self.bb.buttonPressed(result)
if result == "F12": return "next" return button
class SendingWindow: name = "SendingWindow"
def __init__(self, screen, tui): self.screen = screen self.tui = tui size = snack._snack.size()
self.pwin = snack.GridForm(screen, sstr(SENDING_WINDOW), 1, 1)
self.scale = snack.Scale(40, 100) self.pwin.add(self.scale, 0, 0)
def run(self): log.log_debug("Running %s" % self.name)
self.pwin.draw() self.screen.refresh()
reg_info = None try: # reg_info dict contains: 'system_id', 'channels', # 'failed_channels', 'slots', 'failed_slots' log.log_debug('other is %s' % str(self.tui.other))
reg_info = rhnreg.registerSystem2(self.tui.userName, self.tui.password, self.tui.profileName, other = self.tui.other) reg_info = reg_info.rawDict
systemId = sstr(reg_info['system_id'])
except up2dateErrors.CommunicationError: e = sys.exc_info()[1] FatalErrorWindow(self.screen, _("Problem registering system:\n") + e.errmsg) except up2dateErrors.RhnUuidUniquenessError: e = sys.exc_info()[1] FatalErrorWindow(self.screen, _("Problem registering system:\n") + e.errmsg) except up2dateErrors.InsuffMgmntEntsError: e = sys.exc_info()[1] FatalErrorWindow(self.screen, _("Problem registering system:\n") + e.errmsg) except up2dateErrors.RegistrationDeniedError: e = sys.exc_info()[1] FatalErrorWindow(self.screen, _("Problem registering system:\n") + e.errmsg) except up2dateErrors.ActivationKeyUsageLimitError: FatalErrorWindow(self.screen, ACT_KEY_USAGE_LIMIT_ERROR) except: log.log_exception(*sys.exc_info()) FatalErrorWindow(self.screen, _("Problem registering system."))
# write the system id out. if not rhnreg.writeSystemId(systemId): FatalErrorWindow(self.screen, _("Problem writing out system id to disk."))
self.setScale(1, 4)
# include the info from the oeminfo file as well self.oemInfo = rhnreg.getOemInfo()
self.setScale(2, 4)
# maybe upload hardware profile if self.tui.includeHardware: try: rhnreg.sendHardware(systemId, self.tui.hardware) except up2dateErrors.CommunicationError: e = sys.exc_info()[1] FatalErrorWindow(self.screen, _("Problem sending hardware profile:\n") + e.errmsg) except: log.log_exception(*sys.exc_info()) FatalErrorWindow(self.screen, _("Problem sending hardware profile."))
self.setScale(3, 4)
# build up package list if necessary if self.tui.includePackages: try: rhnreg.sendPackages(systemId, self.tui.selectedPackages) except up2dateErrors.CommunicationError: e = sys.exc_info()[1] FatalErrorWindow(self.screen, _("Problem sending package list:\n") + e.errmsg) except: log.log_exception(*sys.exc_info()) FatalErrorWindow(self.screen, _("Problem sending package list."))
li = None try: li = up2dateAuth.updateLoginInfo() except up2dateErrors.InsuffMgmntEntsError: FatalErrorWindow(self.screen, sys.exc_info()[1])
# Send virtualization information to the server. rhnreg.sendVirtInfo(systemId)
# enable yum-rhn-plugin / dnf-plugin-spacewalk try: self.tui.pm_plugin_present, self.tui.pm_plugin_conf_changed = rhnreg.pluginEnable() except IOError: e = sys.exc_info()[1] WarningWindow(self.screen, _("Could not open %s\n%s is not enabled.\n") % (PM_PLUGIN_CONF, PM_PLUGIN_NAME) + e.errmsg) self.tui.pm_plugin_conf_error = 1
rhnreg.spawnRhnCheckForUI() self.setScale(4, 4)
# Pop the pwin (Progress bar window) self.screen.popWindow()
self.tui.reg_info = reg_info
return "next"
def saveResults(self): pass
def setScale(self, amount, total): self.scale.set(int(((amount * 1.0)/ total) * 100)) self.pwin.draw() self.screen.refresh()
class FinishWindow: name = "FinishWindow"
def __init__(self, screen, tui): self.screen = screen self.tui = tui size = snack._snack.size()
toplevel = snack.GridForm(screen, sstr(FINISH_WINDOW), 1, 2)
text = snack.TextboxReflowed(size[0]-11, sstr(FINISH_WINDOW_TEXT_TUI)) toplevel.add(text, 0, 0)
# BUTTON BAR self.bb = snack.ButtonBar(screen, [(sstr(_("Finish")), "next")]) toplevel.add(self.bb, 0, 1, padding = (0, 1, 0, 0), growx = 1)
self.g = toplevel
def saveResults(self): pass
def run(self): log.log_debug("Running %s" % self.name) result = self.g.runOnce() button = self.bb.buttonPressed(result)
if result == "F12": return "next" return button
class ReviewWindow: name = "ReviewWindow"
def __init__(self, screen, tui): self.screen = screen self.tui = tui self.reg_info = tui.reg_info size = snack._snack.size()
toplevel = snack.GridForm(screen, sstr(REVIEW_WINDOW), 1, 2) review_window_text = ''
if not self.tui.pm_plugin_present: review_window_text += PM_PLUGIN_WARNING + "\n\n" if self.tui.pm_plugin_conf_error: review_window_text += PM_PLUGIN_CONF_ERROR + "\n\n" if self.tui.pm_plugin_conf_changed: review_window_text += PM_PLUGIN_CONF_CHANGED + "\n\n"
# Build up the review_window_text based on the data in self.reg_info review_window_text += REVIEW_WINDOW_PROMPT + "\n\n"
# Create and add the text for what channels the system was # subscribed to. if len(self.reg_info['channels']) > 0: channel_list = "" for channel in self.reg_info['channels']: channel_list += channel + "\n"
channels = CHANNELS_TITLE + "\n" + \ OK_CHANNELS + "\n" + \ "%s\n"
log.log_debug("server type is %s " % self.tui.serverType) channels += CHANNELS_SAT_WARNING
review_window_text += channels % channel_list + "\n\n"
if len(self.reg_info['system_slots']) > 0: slot_list = "" for slot in self.reg_info['system_slots']: if slot == 'enterprise_entitled': slot_list += MANAGEMENT + "\n" elif slot == 'virtualization_host': slot_list += VIRT + "\n" else: slot_list += slot + "\n" review_window_text += SLOTS % slot_list + "\n\n"
if len(self.reg_info['universal_activation_key']) > 0: act_key_list = "" for act_key in self.reg_info['universal_activation_key']: act_key_list += act_key review_window_text += ACTIVATION_KEY % (act_key_list)
self.review_window = snack.Textbox(size[0]-10, size[1]-14, sstr(review_window_text), 1, 1)
toplevel.add(self.review_window, 0, 0, padding = (0, 1, 0, 0))
# BUTTON BAR self.bb = snack.ButtonBar(screen, [(sstr(OK), "next")]) toplevel.add(self.bb, 0, 1, padding = (0, 1, 0, 0), growx = 1)
self.g = toplevel
def saveResults(self): return 1
def run(self): log.log_debug("Running %s" % self.name) result = self.g.runOnce() button = self.bb.buttonPressed(result)
if result == "F12": button = "next" if not self.tui.pm_plugin_present: button = "exit" if self.tui.pm_plugin_conf_error: button = "exit"
return button
class Tui: name = "RHN_REGISTER_TUI"
def __init__(self, screen, test): self.screen = screen self.test = test self.size = snack._snack.size() self.drawFrame() self.alreadyRegistered = 0 try: self.serverType = rhnreg.getServerType() except up2dateErrors.InvalidProtocolError: FatalErrorWindow(screen, _("You specified an invalid protocol." + "Only https and http are allowed."))
self.windows = [ AlreadyRegisteredSubscriptionManagerWindow, AlreadyRegisteredWindow, StartWindow, SatelliteUrlWindow, ConnectWindow, InfoWindow, OSReleaseWindow, HardwareWindow, PackagesWindow, SendWindow, SendingWindow, ReviewWindow, FinishWindow ] self.serverURL = config.getServerlURL()[0]
if not cfg['sslCACert']: cfg.set('sslCACert', '/usr/share/rhn/CLN-ORG-TRUSTED-SSL-CERT') self.sslCACert = cfg['sslCACert']
def __del__(self): self.screen.finish()
def drawFrame(self): self.welcomeText = COPYRIGHT_TEXT self.screen.drawRootText(0, 0, sstr(self.welcomeText)) self.screen.pushHelpLine(sstr(_(" <Tab>/<Alt-Tab> between elements | <Space> selects | <F12> next screen")))
def initResults(self): self.userName = "" self.password = ""
self.oemInfo = {} self.productInfo = { "entitlement_num" : "", "registration_num" : "", "first_name" : "", "last_name" : "", "company" : "", "address" : "", "city" : "", "state" : "", "zip" : "", "country" : "", }
self.other = {} self.other['registration_number'] = ''
self.profileName = "" self.includeHardware = 1
self.limited_updates_button = 1 self.all_updates_button = 0 self.includePackages = 0 self.packageList = [] self.selectedPackages = [] self.pm_plugin_present = 1 self.pm_plugin_conf_error = 0 self.pm_plugin_conf_changed = 0
def run(self): log.log_debug("Running %s" % self.name) self.initResults()
direction = "forward"
try: index = 0 while index < len(self.windows):
win = None try: win = self.windows[index](self.screen, self) except WindowSkipException: if direction == "forward": index = index + 1 else: index = index - 1 continue
log.log_debug("index is %s" % index)
result = win.run() log.log_debug("Result %s" % result)
if result == "back": if index > 0: index = index - 1
# If we're on the info window, "back" means go back # to the satellite url window, not back to the # temporary connection test window. if (index > 0 and self.windows[index].name == ConnectWindow.name): index -= 1
direction = "backward"
elif result == "exit": return
elif result == "cancel": log.log_debug("Caught a cancel request")
# Show the confirm quit window if ConfirmQuitWindow(self.screen) == 1: return
elif result == "next": index = index + 1 win.saveResults() direction = "forward"
finally: self.screen.finish()
def main(): test = 0 signal.signal(signal.SIGINT, signal.SIG_IGN)
if len(sys.argv) > 1: if sys.argv[1] == "-t" or sys.argv[1] == "--test": test = 1
screen = snack.SnackScreen()
if geteuid() != 0 and not test: FatalErrorWindow(screen, _("You must run the RHN registration program as root."))
tui = Tui(screen, test) tui.run()
if __name__ == "__main__": main()
|