Mini Shell
#
# 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()
Zerion Mini Shell 1.0