/[smeserver]/cdrom.image/updates/text.py
ViewVC logotype

Contents of /cdrom.image/updates/text.py

Parent Directory Parent Directory | Revision Log Revision Log | View Revision Graph Revision Graph


Revision 1.3 - (show annotations) (download) (as text)
Fri Jun 9 05:03:00 2006 UTC (17 years, 11 months ago) by gordonr
Branch: MAIN
CVS Tags: HEAD
Changes since 1.2: +0 -0 lines
Content type: text/x-python
FILE REMOVED
See bug 1510 - all changes should be in the anaconda CVS repository

1 #
2 # text.py - text mode frontend to anaconda
3 #
4 # Erik Troan <ewt@redhat.com>
5 # Matt Wilson <msw@redhat.com>
6 #
7 # Copyright 1999-2004 Red Hat, Inc.
8 #
9 # This software may be freely redistributed under the terms of the GNU
10 # library public license.
11 #
12 # You should have received a copy of the GNU Library Public License
13 # along with this program; if not, write to the Free Software
14 # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
15 #
16
17 from snack import *
18 import sys
19 import os
20 import isys
21 import iutil
22 import time
23 import signal
24 import parted
25 import string
26 import kudzu
27 from language import expandLangs
28 from flags import flags
29 from constants_text import *
30 from constants import *
31
32 from rhpl.log import log
33 from rhpl.translate import _, cat, N_
34
35 stepToClasses = {
36 "language" : ("language_text", "LanguageWindow"),
37 "keyboard" : ("keyboard_text", "KeyboardWindow"),
38 "mouse" : ("mouse_text", ("MouseWindow", "MouseDeviceWindow")),
39 "welcome" : ("welcome_text", "WelcomeWindow"),
40 "installtype" : ("installpath_text", "InstallPathWindow"),
41 "autopartition" : ("partition_text", "AutoPartitionWindow"),
42 "custom-upgrade" : ("upgrade_text", "UpgradeExamineWindow"),
43 "addswap" : ("upgrade_text", "UpgradeSwapWindow"),
44 "upgrademigratefs" : ("upgrade_text", "UpgradeMigrateFSWindow"),
45 "fdisk" : ("fdisk_text", "fdiskPartitionWindow"),
46 "partitionmethod" : ("partmethod_text", ("PartitionMethod")),
47 "partition": ("partition_text", ("PartitionWindow")),
48 "zfcpconfig": ("zfcp_text", ("ZFCPWindow")),
49 "findinstall" : ("upgrade_text", ("UpgradeExamineWindow")),
50 # replace with below if you want customize screen
51 # "findinstall" : ("upgrade_text", ("UpgradeExamineWindow",
52 # "CustomizeUpgradeWindow")),
53 "addswap" : ("upgrade_text", "UpgradeSwapWindow"),
54 "upgbootloader": ("upgrade_bootloader_text", "UpgradeBootloaderWindow"),
55 "bootloader" : ("bootloader_text", ("BootloaderChoiceWindow",
56 "BootloaderAppendWindow",
57 "BootloaderPasswordWindow")),
58 "bootloaderadvanced" : ("bootloader_text", ("BootloaderImagesWindow",
59 "BootloaderLocationWindow")),
60 "network" : ("network_text", ("NetworkDeviceWindow", "NetworkGlobalWindow",
61 "HostnameWindow")),
62 "firewall" : ("firewall_text", ("FirewallWindow",
63 "SELinuxWindow")),
64 "languagesupport" : ("language_text", ("LanguageSupportWindow",
65 "LanguageDefaultWindow")),
66 "timezone" : ("timezone_text", "TimezoneWindow"),
67 "accounts" : ("userauth_text", "RootPasswordWindow"),
68 "authentication" : ("userauth_text", ("AuthConfigWindow")),
69 "desktopchoice": ("desktop_choice_text", "DesktopChoiceWindow"),
70 "package-selection" : ("packages_text", "PackageGroupWindow"),
71 "indivpackage" : ("packages_text", ("IndividualPackageWindow")),
72 "dependencies" : ("packages_text", "PackageDepWindow"),
73 "videocard" : ("xconfig_text", "XConfigWindowCard"),
74 "monitor" : ("xconfig_text", "MonitorWindow"),
75 "xcustom" : ("xconfig_text", "XCustomWindow"),
76 "confirminstall" : ("confirm_text", "BeginInstallWindow"),
77 "confirmupgrade" : ("confirm_text", "BeginUpgradeWindow"),
78 "install" : ("progress_text", "setupForInstall"),
79 "bootdisk" : ("bootdisk_text", ("BootDiskWindow")),
80 "complete" : ("complete_text", "FinishedWindow"),
81 }
82
83 if iutil.getArch() == 'sparc':
84 stepToClasses["bootloader"] = ("silo_text", ("SiloAppendWindow",
85 "SiloWindow"
86 "SiloImagesWindow"))
87 if iutil.getArch() == 's390':
88 stepToClasses["bootloader"] = ("zipl_text", ( "ZiplWindow"))
89
90 class InstallWindow:
91 def __call__ (self, screen):
92 raise RuntimeError, "Unimplemented screen"
93
94 class WaitWindow:
95 def pop(self):
96 self.screen.popWindow()
97 self.screen.refresh()
98
99 def __init__(self, screen, title, text):
100 self.screen = screen
101 width = 40
102 if (len(text) < width): width = len(text)
103
104 t = TextboxReflowed(width, text)
105
106 g = GridForm(self.screen, title, 1, 1)
107 g.add(t, 0, 0)
108 g.draw()
109 self.screen.refresh()
110
111 class OkCancelWindow:
112 def getrc(self):
113 return self.rc
114
115 def __init__(self, screen, title, text):
116 rc = ButtonChoiceWindow(screen, title, text,
117 buttons=[TEXT_OK_BUTTON, _("Cancel")])
118 if rc == string.lower(_("Cancel")):
119 self.rc = 1
120 else:
121 self.rc = 0
122
123 class ProgressWindow:
124 def pop(self):
125 self.screen.popWindow()
126 self.screen.refresh()
127 del self.scale
128 self.scale = None
129
130 def set(self, amount):
131 self.scale.set(amount)
132 self.screen.refresh()
133
134 def __init__(self, screen, title, text, total):
135 self.screen = screen
136 width = 55
137 if (len(text) > width): width = len(text)
138
139 t = TextboxReflowed(width, text)
140
141 g = GridForm(self.screen, title, 1, 2)
142 g.add(t, 0, 0, (0, 0, 0, 1), anchorLeft=1)
143
144 self.scale = Scale(width, total)
145 g.add(self.scale, 0, 1)
146
147 g.draw()
148 self.screen.refresh()
149
150 class InstallInterface:
151 def helpWindow(self, screen, key):
152 lang = self.instLanguage.getCurrent()
153 lang = self.instLanguage.getLangNick(lang)
154 self.langSearchPath = expandLangs(lang) + ['C']
155
156 if key == "helponhelp":
157 if self.showingHelpOnHelp:
158 return None
159 else:
160 self.showingHelpOnHelp = 1
161 try:
162 f = None
163
164 if self.configFileData.has_key("helptag"):
165 helpTag = "-%s" % (self.configFileData["helptag"],)
166 else:
167 helpTag = ""
168 arch = "-%s" % (iutil.getArch(),)
169 tags = [ "%s%s" % (helpTag, arch), "%s" % (helpTag,),
170 "%s" % (arch,), "" ]
171
172 # XXX
173 #
174 # HelpWindow can't get to the langauge
175
176 found = 0
177 for path in ("./text-", "/mnt/source/RHupdates/",
178 "/usr/share/anaconda/"):
179 if found:
180 break
181 for lang in self.langSearchPath:
182 for tag in tags:
183 fn = "%shelp/%s/s1-help-screens-%s%s.txt" \
184 % (path, lang, key, tag)
185
186 try:
187 f = open(fn)
188 except IOError, msg:
189 continue
190 found = 1
191 break
192
193 if not f:
194 ButtonChoiceWindow(screen, _("Help not available"),
195 _("No help is available for this "
196 "step of the install."),
197 buttons=[TEXT_OK_BUTTON])
198 return None
199
200 lines = f.readlines()
201 for l in lines:
202 l = l.replace("@RHL@", productName)
203 l = l.replace("@RHLVER@", productVersion)
204 while not string.strip(l[0]):
205 l = l[1:]
206 title = string.strip(l[0])
207 l = l[1:]
208 while not string.strip(l[0]):
209 l = l[1:]
210 f.close()
211
212 height = 10
213 scroll = 1
214 if len(l) < height:
215 height = len(l)
216 scroll = 0
217
218 width = len(title) + 6
219 stream = ""
220 for line in l:
221 line = string.strip(line)
222 stream = stream + line + "\n"
223 if len(line) > width:
224 width = len(line)
225
226 bb = ButtonBar(screen, [TEXT_OK_BUTTON])
227 t = Textbox(width, height, stream, scroll=scroll)
228
229 g = GridFormHelp(screen, title, "helponhelp", 1, 2)
230 g.add(t, 0, 0, padding=(0, 0, 0, 1))
231 g.add(bb, 0, 1, growx=1)
232
233 g.runOnce()
234 self.showingHelpOnHelp = 0
235 except:
236 import traceback
237 (type, value, tb) = sys.exc_info()
238 from string import joinfields
239 list = traceback.format_exception(type, value, tb)
240 text = joinfields(list, "")
241 rc = self.exceptionWindow(_("Exception Occurred"), text)
242 if rc:
243 import pdb
244 pdb.post_mortem(tb)
245 os._exit(1)
246
247 def progressWindow(self, title, text, total):
248 return ProgressWindow(self.screen, title, text, total)
249
250 def messageWindow(self, title, text, type="ok", default = None,
251 custom_icon=None, custom_buttons=[]):
252 if type == "ok":
253 ButtonChoiceWindow(self.screen, title, text,
254 buttons=[TEXT_OK_BUTTON])
255 elif type == "yesno":
256 if default and default == "no":
257 btnlist = [TEXT_NO_BUTTON, TEXT_YES_BUTTON]
258 else:
259 btnlist = [TEXT_YES_BUTTON, TEXT_NO_BUTTON]
260 rc = ButtonChoiceWindow(self.screen, title, text,
261 buttons=btnlist)
262 if rc == "yes":
263 return 1
264 else:
265 return 0
266 elif type == "custom":
267 tmpbut = []
268 for but in custom_buttons:
269 tmpbut.append(string.replace(but,"_",""))
270
271 rc = ButtonChoiceWindow(self.screen, title, text, width=60,
272 buttons=tmpbut)
273
274 idx = 0
275 for b in tmpbut:
276 if string.lower(b) == rc:
277 return idx != 0
278 idx = idx + 1
279 return 0
280 else:
281 return OkCancelWindow(self.screen, title, text)
282
283 def kickstartErrorWindow(self, text):
284 s = _("The following error was found while parsing your "
285 "kickstart configuration:\n\n%s") %(text,)
286 self.messageWindow(_("Error Parsing Kickstart Config"),
287 s,
288 type = "custom",
289 custom_buttons = [("_Reboot")],
290 custom_icon="error")
291
292
293
294 def dumpWindow(self):
295 rc = ButtonChoiceWindow(self.screen, _("Save Crash Dump"),
296 _("Please insert a floppy now. All contents of the disk "
297 "will be erased, so please choose your diskette carefully."),
298 [TEXT_OK_BUTTON, _("Cancel")])
299
300 if rc == string.lower(_("Cancel")):
301 return 1
302
303 return 0
304
305 def exceptionWindow(self, title, text):
306 try:
307 floppyDevices = 0
308 for dev in kudzu.probe(kudzu.CLASS_FLOPPY, kudzu.BUS_UNSPEC,
309 kudzu.PROBE_ALL):
310 if not dev.detached:
311 floppyDevices = floppyDevices + 1
312 except:
313 floppyDevices = 0
314 if floppyDevices > 0 or DEBUG:
315 ugh = "%s\n\n" % (exceptionText,)
316 buttons=[TEXT_OK_BUTTON, _("Save"), _("Debug")]
317 else:
318 ugh = "%s\n\n" % (exceptionTextNoFloppy,)
319 buttons=[TEXT_OK_BUTTON, _("Debug")]
320
321 rc = ButtonChoiceWindow(self.screen, title, ugh + text, buttons)
322 if rc == string.lower(_("Debug")):
323 return 1
324 elif rc == string.lower(_("Save")):
325 return 2
326 return None
327
328 def partedExceptionWindow(self, exc):
329 # if our only option is to cancel, let us handle the exception
330 # in our code and avoid popping up the exception window here.
331 if exc.options == parted.EXCEPTION_CANCEL:
332 return parted.EXCEPTION_UNHANDLED
333 log("parted exception: %s: %s" %(exc.type_string,exc.message))
334 buttons = []
335 buttonToAction = {}
336 flags = ((parted.EXCEPTION_FIX, N_("Fix")),
337 (parted.EXCEPTION_YES, N_("Yes")),
338 (parted.EXCEPTION_NO, N_("No")),
339 (parted.EXCEPTION_OK, N_("OK")),
340 (parted.EXCEPTION_RETRY, N_("Retry")),
341 (parted.EXCEPTION_IGNORE, N_("Ignore")),
342 (parted.EXCEPTION_CANCEL, N_("Cancel")))
343 for flag, errorstring in flags:
344 if exc.options & flag:
345 buttons.append(_(errorstring))
346 buttonToAction[string.lower(_(errorstring))] = flag
347
348 rc = None
349 while not buttonToAction.has_key(rc):
350 rc = ButtonChoiceWindow(self.screen, exc.type_string, exc.message,
351 buttons=buttons)
352
353 return buttonToAction[rc]
354
355
356 def waitWindow(self, title, text):
357 return WaitWindow(self.screen, title, text)
358
359 def drawFrame(self):
360 self.welcomeText = _("%s Released via the GPL") % (productName,)
361 self.screen.drawRootText (0, 0, self.welcomeText)
362 self.screen.drawRootText (len(_(self.welcomeText)), 0,
363 (self.screen.width -
364 len(_(self.welcomeText))) * " ")
365
366 if (os.access("/usr/share/anaconda/help/C/s1-help-screens-lang.txt", os.R_OK)):
367 self.screen.pushHelpLine(_(" <F1> for help | <Tab> between elements | <Space> selects | <F12> next screen"))
368 else:
369 self.screen.pushHelpLine(_(" <Tab>/<Alt-Tab> between elements | <Space> selects | <F12> next screen"))
370
371 def setScreen(self, screen):
372 self.screen = screen
373
374 def shutdown(self):
375 self.screen.finish()
376 self.screen = None
377
378 def __init__(self):
379 signal.signal(signal.SIGINT, signal.SIG_IGN)
380 signal.signal(signal.SIGTSTP, signal.SIG_IGN)
381 self.screen = None
382 self.showingHelpOnHelp = 0
383
384 def __del__(self):
385 if self.screen:
386 self.screen.finish()
387
388 def run(self, id, dispatch, configFileData):
389 # set up for CJK text mode if needed
390 oldlang = None
391 if (flags.setupFilesystems and
392 (id.instLanguage.getFontFile(id.instLanguage.getCurrent()) == "bterm")
393 and not flags.serial and not flags.virtpconsole
394 and not isys.isPsudoTTY(0) and not isys.isVioConsole()):
395 log("starting bterm")
396 rc = 1
397 try:
398 rc = isys.startBterm()
399 time.sleep(1)
400 except Exception, e:
401 log("got an exception starting bterm: %s" %(e,))
402
403 if rc == 1:
404 log("unable to start bterm, falling back to english")
405 oldlang = id.instLanguage.getCurrent()
406 log("old language was %s" %(oldlang,))
407 id.instLanguage.setRuntimeLanguage("English")
408 id.instLanguage.setRuntimeDefaults(oldlang)
409
410 if id.instLanguage.getFontFile(id.instLanguage.getCurrent()) == "none":
411 oldlang = id.instLanguage.getCurrent()
412 id.instLanguage.setRuntimeLanguage("English")
413 id.instLanguage.setRuntimeDefaults(oldlang)
414
415 self.screen = SnackScreen()
416 self.configFileData = configFileData
417 self.screen.helpCallback(self.helpWindow)
418
419 # uncomment this line to make the installer quit on <Ctrl+Z>
420 # handy for quick debugging.
421 # self.screen.suspendCallback(killSelf, self.screen)
422 # uncomment this line to drop into the python debugger on <Ctrl+Z>
423 # --VERY handy--
424 if DEBUG or flags.test:
425 self.screen.suspendCallback(debugSelf, self.screen)
426
427 if flags.serial or flags.virtpconsole or isys.isPsudoTTY(0) or isys.isVioConsole():
428 self.screen.suspendCallback(spawnShell, self.screen)
429
430 # clear out the old root text by writing spaces in the blank
431 # area on the right side of the screen
432 #self.screen.drawRootText (len(_(self.welcomeText)), 0,
433 #(self.screen.width - len(_(self.welcomeText))) * " ")
434 #self.screen.drawRootText (0 - len(_(step[0])), 0, _(step[0]))
435 langname = id.instLanguage.getCurrent()
436 lang = id.instLanguage.getLangNick(langname)
437
438 self.langSearchPath = expandLangs(lang) + ['C']
439 self.instLanguage = id.instLanguage
440
441 # draw the frame after setting up the fallback
442 self.drawFrame()
443
444 # draw the frame after setting up the fallback
445 self.drawFrame()
446
447 if oldlang is not None:
448 ButtonChoiceWindow(self.screen, "Language Unavailable",
449 "%s display is unavailable in text mode. "
450 "The installation will continue in "
451 "English." % (oldlang,),
452 buttons=[TEXT_OK_BUTTON])
453
454
455 id.fsset.registerMessageWindow(self.messageWindow)
456 id.fsset.registerProgressWindow(self.progressWindow)
457 id.fsset.registerWaitWindow(self.waitWindow)
458 parted.exception_set_handler(self.partedExceptionWindow)
459
460 lastrc = INSTALL_OK
461 (step, args) = dispatch.currentStep()
462 while step:
463 (file, classNames) = stepToClasses[step]
464
465 if type(classNames) != type(()):
466 classNames = (classNames,)
467
468 if lastrc == INSTALL_OK:
469 step = 0
470 else:
471 step = len(classNames) - 1
472
473 while step >= 0 and step < len(classNames):
474 # reget the args. they could change (especially direction)
475 (foo, args) = dispatch.currentStep()
476
477 nextWindow = None
478 s = "from %s import %s; nextWindow = %s" % \
479 (file, classNames[step], classNames[step])
480 exec s
481
482 win = nextWindow()
483
484 #log("TUI running step %s (class %s, file %s)" %
485 #(step, file, classNames))
486
487 rc = apply(win, (self.screen, ) + args)
488
489 if rc == INSTALL_NOOP:
490 rc = lastrc
491
492 if rc == INSTALL_BACK:
493 step = step - 1
494 dispatch.dir = DISPATCH_BACK
495 elif rc == INSTALL_OK:
496 step = step + 1
497 dispatch.dir = DISPATCH_FORWARD
498
499 lastrc = rc
500
501 if step == -1:
502 if not dispatch.canGoBack():
503 ButtonChoiceWindow(self.screen, _("Cancelled"),
504 _("I can't go to the previous step "
505 "from here. You will have to try "
506 "again."),
507 buttons=[_("OK")])
508 else:
509 dispatch.gotoPrev()
510 else:
511 dispatch.gotoNext()
512
513 (step, args) = dispatch.currentStep()
514
515 self.screen.finish()
516
517 def killSelf(screen):
518 screen.finish()
519 os._exit(0)
520
521 def debugSelf(screen):
522 screen.suspend()
523 import pdb
524 try:
525 pdb.set_trace()
526 except:
527 sys.exit(-1)
528 screen.resume()
529
530 def spawnShell(screen):
531 screen.suspend()
532 print "\n\nType <exit> to return to the install program.\n"
533 if os.path.exists("/bin/sh"):
534 iutil.execWithRedirect("/bin/sh", ["-/bin/sh"])
535 else:
536 print "Unable to find /bin/sh to execute! Not starting shell"
537 time.sleep(5)
538 screen.resume()

admin@koozali.org
ViewVC Help
Powered by ViewVC 1.2.1 RSS 2.0 feed