/[smeserver]/cdrom.image/updates/anaconda
ViewVC logotype

Annotation of /cdrom.image/updates/anaconda

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


Revision 1.7 - (hide annotations) (download)
Wed Apr 5 01:20:27 2006 UTC (18 years, 7 months ago) by slords
Branch: MAIN
CVS Tags: HEAD
Changes since 1.6: +0 -0 lines
FILE REMOVED
Update anaconda to be in sync with 4.3 and FC4

1 charlieb 1.1 #!/usr/bin/python
2     #
3     # anaconda: The Red Hat Linux Installation program
4     #
5     # (in alphabetical order...)
6     #
7     # Brent Fox <bfox@redhat.com>
8     # Mike Fulbright <msf@redhat.com>
9     # Jakub Jelinek <jakub@redhat.com>
10     # Jeremy Katz <katzj@redhat.com>
11     # Erik Troan <ewt@redhat.com>
12     # Matt Wilson <msw@specifixinc.com>
13     #
14     # ... And many others
15     #
16     # Copyright 1999-2004 Red Hat, Inc.
17     #
18     # This software may be freely redistributed under the terms of the GNU
19     # library public license.
20     #
21     # You should have received a copy of the GNU Library Public License
22     # along with this program; if not, write to the Free Software
23     # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
24     #
25    
26     # This toplevel file is a little messy at the moment...
27    
28     import sys, os
29    
30     # keep up with process ID of miniwm if we start it
31    
32     miniwm_pid = None
33     # helper function to duplicate diagnostic output
34     def dup_log(format, *args):
35     if args:
36     sys.stdout.write ("%s\n" % (format % args))
37     else:
38     sys.stdout.write ("%s\n" % format)
39     apply(log, (format,) + args)
40    
41     # start miniWM
42     def startMiniWM(root='/'):
43     (rd, wr) = os.pipe()
44     childpid = os.fork()
45     if not childpid:
46     if os.access("./mini-wm", os.X_OK):
47     cmd = "./mini-wm"
48     elif os.access(root + "/usr/bin/mini-wm", os.X_OK):
49     cmd = root + "/usr/bin/mini-wm"
50     else:
51     return None
52    
53     os.dup2(wr, 1)
54     os.close(wr)
55     args = [cmd, '--display', ':1']
56     os.execv(args[0], args)
57     sys.exit (1)
58     else:
59     # We need to make sure that mini-wm is the first client to
60     # connect to the X server (see bug #108777). Wait for mini-wm
61     # to write back an acknowledge token.
62     os.read(rd, 1)
63    
64     return childpid
65    
66     # startup vnc X server
67     def startVNCServer(vncpassword=None, root='/', vncconnecthost=None,
68     vncconnectport=None):
69    
70     def set_vnc_password(root, passwd, passwd_file):
71     (pid, fd) = os.forkpty()
72    
73     if not pid:
74     os.execv(root + "/usr/bin/vncpasswd", [root + "/usr/bin/vncpasswd", passwd_file])
75     sys.exit(1)
76    
77     # read password prompt
78     os.read(fd, 1000)
79    
80     # write password
81     os.write(fd, passwd + "\n")
82    
83     # read challenge again, and newline
84     os.read(fd, 1000)
85     os.read(fd, 1000)
86    
87     # write password again
88     os.write(fd, passwd + "\n")
89    
90     # read remaining output
91     os.read(fd, 1000)
92    
93     # wait for status
94     try:
95     (pid, status) = os.waitpid(pid, 0)
96     except OSError, (errno, msg):
97     print __name__, "waitpid:", msg
98    
99     return status
100    
101    
102     dup_log(_("Starting VNC..."))
103    
104     # figure out host info
105     connxinfo = None
106     srvname = None
107     try:
108     import network
109    
110     # try to load /tmp/netinfo and see if we can sniff out network info
111     netinfo = network.Network()
112     srvname = None
113     if netinfo.hostname != "localhost.localdomain":
114     srvname = "%s" % (netinfo.hostname,)
115     else:
116     for dev in netinfo.netdevices.keys():
117     try:
118     ip = isys.getIPAddress(dev)
119     log("ip of %s is %s" %(dev, ip))
120     except Exception, e:
121     log("Got an exception trying to get the ip addr of %s: "
122     "%s" %(dev, e))
123     continue
124     if ip == '127.0.0.1' or ip is None:
125     continue
126     srvname = ip
127     break
128    
129     if srvname is not None:
130     connxinfo = "%s:1" % (srvname,)
131    
132     except:
133     log("Unable to determine VNC server network info")
134    
135     # figure out product info
136     if srvname is not None:
137     desktopname = _("%s %s installation on host %s") % (product.productName, product.productVersion, srvname)
138     else:
139     desktopname = _("%s %s installation") % (product.productName, product.productVersion)
140    
141     vncpid = os.fork()
142    
143     if not vncpid:
144     args = [ root + "/usr/bin/Xvnc", ":1", "-nevershared",
145     "-depth", "16", "-geometry", "800x600",
146     "IdleTimeout=0", "-auth", "/dev/null", "-once",
147     "DisconnectClients=false", "desktop=%s" % (desktopname,)]
148    
149     # set passwd if necessary
150     if vncpassword is not None:
151     try:
152     rc = set_vnc_password(root, vncpassword, "/tmp/vncpasswd_file")
153     except Exception, e:
154     dup_log("Unknown exception setting vnc password.")
155     log("Exception was: %s" %(e,))
156     rc = 1
157    
158     if rc:
159     dup_log(_("Unable to set vnc password - using no password!"))
160     dup_log(_("Make sure your password is at least 6 characters in length."))
161     else:
162     args = args + ["-rfbauth", "/tmp/vncpasswd_file"]
163     else:
164     # needed if no password specified
165     args = args + ["SecurityTypes=None",]
166    
167     tmplogFile = "/tmp/vncserver.log"
168     try:
169     err = os.open(tmplogFile, os.O_RDWR | os.O_CREAT)
170     if err < 0:
171     sys.stderr.write("error opening %s\n", tmplogFile)
172     else:
173     os.dup2(err, 2)
174     os.close(err)
175     except:
176     # oh well
177     pass
178    
179     os.execv(args[0], args)
180     sys.exit (1)
181    
182     if vncpassword is None:
183     dup_log(_("\n\nWARNING!!! VNC server running with NO PASSWORD!\n"
184     "You can use the vncpassword=<password> boot option\n"
185     "if you would like to secure the server.\n\n"))
186    
187     dup_log(_("The VNC server is now running."))
188    
189     if vncconnecthost is not None:
190     dup_log(_("Attempting to connect to vnc client on host %s...") % (vncconnecthost,))
191    
192     hostarg = vncconnecthost
193     if vncconnectport is not None:
194     hostarg = hostarg + ":" + vncconnectport
195    
196     argv = ["/usr/bin/vncconfig", "-display", ":1", "-connect", hostarg]
197     ntries = 0
198     while 1:
199     output=iutil.execWithCapture(argv[0], argv, catchfd=2)
200     outfields = string.split(string.strip(output), ' ')
201     if outfields[0] == "connecting" and outfields[-1] == "failed":
202     ntries += 1
203     if ntries > 50:
204     dup_log(_("Giving up attempting to connect after 50 tries!\n"))
205     if connxinfo is not None:
206     dup_log(_("Please manually connect your vnc client to %s to begin the install.") % (connxinfo,))
207     else:
208     dup_log(_("Please manually connect your vnc client to begin the install."))
209     break
210    
211     dup_log(output)
212     dup_log(_("Will try to connect again in 15 seconds..."))
213     time.sleep(15)
214     continue
215     else:
216     dup_log(_("Connected!"))
217     break
218     else:
219     if connxinfo is not None:
220     dup_log(_("Please connect to %s to begin the install...") % (connxinfo,))
221     else:
222     dup_log(_("Please connect to begin the install..."))
223    
224     os.environ["DISPLAY"]=":1"
225     doStartupX11Actions()
226    
227     # function to handle X startup special issues for anaconda
228     def doStartupX11Actions():
229     global miniwm_pid
230    
231     # now start up mini-wm
232     try:
233     miniwm_pid = startMiniWM()
234     log("Started mini-wm")
235     except:
236     miniwm_pid = None
237     log("Unable to start mini-wm")
238    
239     # test to setup dpi
240     # cant do this if miniwm didnt run because otherwise when
241     # we open and close an X connection in the xutils calls
242     # the X server will exit since this is the first X
243     # connection (if miniwm isnt running)
244     if miniwm_pid is not None:
245     import xutils
246    
247     try:
248     if xutils.screenWidth() > 640:
249     dpi = "96"
250     else:
251     dpi = "75"
252    
253    
254     xutils.setRootResource('Xcursor.size', '24')
255     xutils.setRootResource('Xcursor.theme', 'Bluecurve')
256     xutils.setRootResource('Xcursor.theme_core', 'true')
257    
258     xutils.setRootResource('Xft.antialias', '1')
259     xutils.setRootResource('Xft.dpi', dpi)
260     xutils.setRootResource('Xft.hinting', '1')
261     xutils.setRootResource('Xft.hintstyle', 'hintslight')
262     xutils.setRootResource('Xft.rgba', 'none')
263     except:
264     sys.stderr.write("X SERVER STARTED, THEN FAILED");
265     raise RuntimeError, "X server failed to start"
266    
267     def doShutdownX11Actions():
268     global miniwm_pid
269    
270     if miniwm_pid is not None:
271     try:
272     os.kill(miniwm_pid, 15)
273     os.waitpid(miniwm_pid, 0)
274     except:
275     pass
276    
277    
278     def setupRhplUpdates():
279     import glob
280    
281     # get the python version. first of /usr/lib/python*, strip off the
282     # first 15 chars
283     pyvers = glob.glob("/usr/lib/python*")
284     pyver = pyvers[0][15:]
285    
286     try:
287     os.mkdir("/tmp/updates")
288     except:
289     pass
290     try:
291     os.mkdir("/tmp/updates/rhpl")
292     except:
293     pass
294     if os.access("/mnt/source/RHupdates/rhpl", os.X_OK):
295     for f in os.listdir("/mnt/source/RHupdates/rhpl"):
296     os.symlink("/mnt/source/RHupdates/rhpl/%s" %(f,),
297     "/tmp/updates/rhpl/%s" %(f,))
298    
299     if os.access("/usr/lib64/python%s/site-packages/rhpl" %(pyver,), os.X_OK):
300     libdir = "lib64"
301     else:
302     libdir = "lib"
303    
304     for f in os.listdir("/usr/%s/python%s/site-packages/rhpl" %(libdir,pyver)):
305     if os.access("/tmp/updates/rhpl/%s" %(f,), os.R_OK):
306     continue
307     elif f.endswith(".pyc") and os.access("/tmp/updates/rhpl/%s" %(f[:-1],), os.R_OK):
308     # dont copy .pyc files we are replacing with updates
309     continue
310    
311     os.symlink("/usr/%s/python%s/site-packages/rhpl/%s" %(libdir, pyver,f),
312     "/tmp/updates/rhpl/%s" %(f,))
313    
314     # For anaconda in test mode
315     if (os.path.exists('isys')):
316     sys.path.append('isys')
317     sys.path.append('textw')
318     sys.path.append('iw')
319     else:
320     sys.path.append('/usr/lib/anaconda')
321     sys.path.append('/usr/lib/anaconda/textw')
322     sys.path.append('/usr/lib/anaconda/iw')
323    
324     if (os.path.exists('booty')):
325     sys.path.append('booty')
326     sys.path.append('booty/edd')
327     else:
328     sys.path.append('/usr/lib/booty')
329    
330     sys.path.append('/usr/share/system-config-keyboard')
331    
332     try:
333     import updates_disk_hook
334     except ImportError:
335     pass
336    
337     # pull this in to get product name and versioning
338     import product
339    
340     # do this early to keep our import footprint as small as possible
341     # Python passed my path as argv[0]!
342     # if sys.argv[0][-7:] == "syslogd":
343     if len(sys.argv) > 1:
344     if sys.argv[1] == "--syslogd":
345     from syslogd import Syslogd
346     root = sys.argv[2]
347     output = sys.argv[3]
348     syslog = Syslogd (root, open (output, "a"))
349     # this never returns
350    
351     # this handles setting up RHupdates for rhpl to minimize the set needed
352     if (os.access("/mnt/source/RHupdates/rhpl", os.X_OK) or
353     os.access("/tmp/updates/rhpl", os.X_OK)):
354     setupRhplUpdates()
355    
356     import signal, traceback, string, isys, iutil, time
357    
358     from exception import handleException
359     import dispatch
360     from flags import flags
361     from anaconda_log import anaconda_log
362    
363     from rhpl.log import log
364     from rhpl.translate import _, textdomain, addPoPath
365    
366     if os.path.isdir("/mnt/source/RHupdates/po"):
367     log("adding RHupdates/po")
368     addPoPath("/mnt/source/RHupdates/po")
369     if os.path.isdir("/tmp/updates/po"):
370     log("adding /tmp/updates/po")
371     addPoPath("/tmp/updates/po")
372     textdomain("anaconda")
373    
374     # reset python's default SIGINT handler
375     signal.signal(signal.SIGINT, signal.SIG_DFL)
376    
377     # Silly GNOME stuff
378     if os.environ.has_key('HOME') and not os.environ.has_key("XAUTHORITY"):
379     os.environ['XAUTHORITY'] = os.environ['HOME'] + '/.Xauthority'
380     os.environ['HOME'] = '/tmp'
381     os.environ['LC_NUMERIC'] = 'C'
382     os.environ["GCONF_GLOBAL_LOCKS"] = "1"
383    
384     if os.environ.has_key ("ANACONDAARGS"):
385     theargs = string.split (os.environ["ANACONDAARGS"])
386     else:
387     theargs = sys.argv[1:]
388    
389     # we can't let the LD_PRELOAD hang around because it will leak into
390     # rpm %post and the like. ick :/
391     if os.environ.has_key("LD_PRELOAD"):
392     del os.environ["LD_PRELOAD"]
393    
394     # we need to do this really early so we make sure its done before rpm
395     # is imported
396     iutil.writeRpmPlatform()
397    
398     try:
399     (args, extra) = isys.getopt(theargs, 'CGTRxtdr:fm:',
400     [ 'graphical', 'text', 'test', 'debug', 'nofallback',
401     'method=', 'rootpath=', 'pcic=', "overhead=",
402     'testpath=', 'mountfs', 'traceonly', 'kickstart=',
403     'lang=', 'keymap=', 'kbdtype=', 'module=', 'class=',
404     'expert', 'serial', 'lowres', 'nofb', 'rescue', 'nomount',
405     'autostep', 'resolution=', 'skipddc', 'noselinux', 'selinux',
406     'vnc', 'vncconnect=', 'vnc=', 'cmdline', 'headless',
407     'virtpconsole='])
408     except TypeError, msg:
409     sys.stderr.write("Error %s\n:" % msg)
410     sys.exit(-1)
411    
412     if extra:
413     sys.stderr.write("Unexpected arguments: %s\n" % extra)
414     sys.exit(-1)
415    
416     # Save the arguments in case we need to reexec anaconda for kon
417     os.environ["ANACONDAARGS"] = string.join(sys.argv[1:])
418    
419     # remove the arguments - gnome_init doesn't understand them
420     savedargs = sys.argv[1:]
421     sys.argv = sys.argv[:1]
422     sys.argc = 1
423    
424     # Parameters for the main anaconda routine
425     #
426     rootPath = '/mnt/sysimage' # where to instal packages
427     extraModules = [] # kernel modules to use
428     debug = 0 # start up pdb immediately
429     traceOnly = 0 # don't run, just list modules we use
430     nofallback = 0 # if GUI mode fails, exit
431     rescue = 0 # run in rescue mode
432     rescue_nomount = 0 # don't automatically mount device in rescue
433     runres = '800x600' # resolution to run the GUI install in
434     runres_override = 0 # was run resolution overridden by user?
435     skipddc = 0 # if true skip ddcprobe (locks some machines)
436     instClass = None # the install class to use
437     progmode = 'install' # 'rescue', or 'install'
438     method = None # URL representation of install method
439     logFile = None # may be a file object or a file name
440     display_mode = None
441     graphical_failed = 0
442    
443    
444     # should we ever try to probe for X stuff? this will give us a convenient
445     # out eventually to circumvent all probing and just fall back to text mode
446     # on hardware where we break things if we probe
447 charlieb 1.3 isHeadless = 1
448 charlieb 1.1
449     # probing for hardware on an s390 seems silly...
450     if iutil.getArch() == "s390":
451     isHeadless = 1
452    
453     #
454     # xcfg - xserver info (?)
455     # mousehw - mouseinfo info
456     # videohw - videocard info
457     # monitorhw - monitor info
458     # lang - language to use for install/machine default
459     # keymap - kbd map
460     #
461     xcfg = None
462     monitorhw = None
463     videohw = None
464     mousehw = None
465     lang = None
466     method = None
467     keymap = None
468     kbdtype = None
469     progmode = None
470     customClass = None
471     kbd = None
472     ksfile = None
473     vncpassword = None
474     vncconnecthost = None
475     vncconnectport = None
476    
477     #
478     # parse off command line arguments
479     #
480     for n in args:
481     (str, arg) = n
482    
483     if (str == '--class'):
484     customClass = arg
485     elif (str == '-d' or str == '--debug'):
486     debug = 1
487     elif (str == '--expert'):
488     flags.expert = 1
489     elif (str == '--graphical'):
490     display_mode = 'g'
491     elif (str == '--keymap'):
492     keymap = arg
493     elif (str == '--kickstart'):
494     from kickstart import Kickstart
495     ksfile = arg
496     instClass = Kickstart(ksfile, flags.serial)
497     elif (str == '--lang'):
498     lang = arg
499     elif (str == '--lowres'):
500     runres = '640x480'
501     elif (str == '-m' or str == '--method'):
502     method = arg
503     if method[0] == '@':
504     # ftp installs pass the password via a file in /tmp so
505     # ps doesn't show it
506     filename = method[1:]
507     method = open(filename, "r").readline()
508     method = method[:len(method) - 1]
509     os.unlink(filename)
510     elif (str == '--module'):
511     (path, name) = string.split(arg, ":")
512     extraModules.append((path, name))
513     elif (str == '--nofallback'):
514     nofallback = 1
515     elif (str == "--nomount"):
516     rescue_nomount = 1
517     elif (str == '--rescue'):
518     progmode = 'rescue'
519     elif (str == '--resolution'):
520     # run native X server at specified resolution, ignore fb
521     runres = arg
522     runres_override = 1
523     elif (str == '--noselinux'):
524     flags.selinux = 0
525     elif (str == '--selinux'):
526     flags.selinux = 1
527     elif (str == "--skipddc"):
528     skipddc = 1
529     elif (str == "--autostep"):
530     flags.autostep = 1
531     elif (str == '-r' or str == '--rootpath'):
532     rootPath = arg
533     flags.setupFilesystems = 0
534     flags.rootpath = 1
535     logFile = sys.stderr
536     elif (str == '--traceonly'):
537     traceOnly = 1
538     elif (str == '--serial'):
539     flags.serial = 1
540     elif (str == '-t' or str == '--test'):
541     flags.test = 1
542     flags.setupFilesystems = 0
543     logFile = "/tmp/anaconda-debug.log"
544     elif (str == '-T' or str == '--text'):
545     display_mode = 't'
546     elif (str == "-C" or str == "--cmdline"):
547     display_mode = 'c'
548     elif (str == '--kbdtype'):
549     kbdtype = arg
550     elif (str == '--virtpconsole'):
551     flags.virtpconsole = arg
552     elif (str == '--headless'):
553     isHeadless = 1
554     elif (str == '--vnc'):
555     flags.usevnc = 1
556    
557     # see if there is a vnc password file
558     try:
559     pfile = open("/tmp/vncpassword.dat", "r")
560     vncpassword=pfile.readline().strip()
561     pfile.close()
562     os.unlink("/tmp/vncpassword.dat")
563     except:
564     vncpassword=None
565     pass
566    
567     # check length of vnc password
568     if vncpassword is not None and len(vncpassword) < 6:
569     from snack import *
570    
571     screen = SnackScreen()
572     ButtonChoiceWindow(screen, _('VNC Password Error'),
573     _('You need to specify a vnc password of at least 6 characters long.\n\n'
574     'Press <return> to reboot your system.\n'),
575     buttons = (_("OK"),))
576     screen.finish()
577     sys.exit(0)
578     elif (str == '--vncconnect'):
579     cargs = string.split(arg, ":")
580     vncconnecthost = cargs[0]
581     if len(cargs) > 1:
582     if len(cargs[1]) > 0:
583     vncconnectport = cargs[1]
584    
585     # set up anaconda logging
586     anaconda_log.open (logFile)
587     log.handler=anaconda_log
588    
589     #
590     # must specify install, rescue mode
591     #
592    
593     if (progmode == 'rescue'):
594     if (not method):
595     sys.stderr.write('--method required for rescue mode\n')
596     sys.exit(1)
597    
598     import rescue, instdata, configFileData
599    
600     configFile = configFileData.configFileData()
601     configFileData = configFile.getConfigData()
602    
603     id = instdata.InstallData([], "fd0", configFileData, method)
604     rescue.runRescue(rootPath, not rescue_nomount, id)
605    
606     # shouldn't get back here
607     sys.exit(1)
608     else:
609     if (not method):
610     sys.stderr.write('no install method specified\n')
611     sys.exit(1)
612    
613     #
614     # Here we have a hook to pull in second half of kickstart file via https
615     # if desired.
616     #
617     if ksfile is not None:
618     from kickstart import pullRemainingKickstartConfig, KSAppendException
619     from kickstart import parseKickstartVNC
620    
621     try:
622     rc=pullRemainingKickstartConfig(ksfile)
623     except KSAppendException, msg:
624     rc = msg
625     except:
626     rc = _("Unknown Error")
627    
628     if rc is not None:
629     dup_log(_("Error pulling second part of kickstart config: %s!") % (rc,))
630     sys.exit(1)
631    
632     # now see if they enabled vnc via the kickstart file. Note that command
633     # line options for password, connect host and port override values in
634     # kickstart file
635     (ksusevnc, ksvncpasswd, ksvnchost, ksvncport) = parseKickstartVNC(ksfile)
636    
637     if ksusevnc:
638     flags.usevnc = 1
639    
640     if vncpassword == None:
641     vncpassword = ksvncpasswd
642    
643     if vncconnecthost == None:
644     vncconnecthost = ksvnchost
645    
646     if vncconnectport == None:
647     vncconnectport = ksvncport
648    
649     #
650     # Determine install method - GUI or TUI
651     #
652     # use GUI by default except for install methods that were traditionally
653     # text based due to the requirement of a small stage 2
654     #
655     # if display_mode wasnt set by command line parameters then set default
656     #
657    
658     if display_mode is None:
659     if (method and
660     method.startswith('ftp://') or
661     method.startswith('http://')):
662     display_mode = 't'
663     else:
664     display_mode = 'g'
665    
666     if (debug):
667     import pdb
668     pdb.set_trace()
669    
670     # let people be stupid
671     ## # don't let folks do anything stupid on !s390
672     ## if (not flags.test and os.getpid() > 90 and flags.setupFilesystems and
673     ## not iutil.getArch() == "s390"):
674     ## sys.stderr.write(
675     ## "You're running me on a live system! that's incredibly stupid.\n")
676     ## sys.exit(1)
677    
678     import isys
679     import instdata
680     import floppy
681     import vnc
682    
683     if not isHeadless:
684     try:
685     import xsetup
686     import rhpl.xhwstate as xhwstate
687     except ImportError:
688     isHeadless = 1
689     import rhpl.keyboard as keyboard
690    
691     # handle traceonly and exit
692     if traceOnly:
693    
694     if display_mode == 'g':
695     sys.stderr.write("traceonly is only supported for text mode\n")
696     sys.exit(0)
697    
698     # prints a list of all the modules imported
699     from text import InstallInterface
700     from text import stepToClasses
701     import pdb
702     import warnings
703     import image
704     import harddrive
705     import urlinstall
706     import mimetools
707     import mimetypes
708     import syslogd
709     import installclass
710     import re
711     import rescue
712     import configFileData
713     import kickstart
714     import whiteout
715     import findpackageset
716     import libxml2
717     import cmdline
718     import encodings.utf_8
719    
720     installclass.availableClasses()
721    
722     if display_mode == 't':
723     for step in stepToClasses.keys():
724     if stepToClasses[step]:
725     (mod, klass) = stepToClasses[step]
726     exec "import %s" % mod
727    
728     for module in sys.__dict__['modules'].keys ():
729     if module not in [ "__builtin__", "__main__" ]:
730     foo = repr (sys.__dict__['modules'][module])
731     bar = string.split (foo, "'")
732     if len (bar) > 3:
733     print bar[3]
734    
735     sys.exit(0)
736    
737     log("Display mode = %s", display_mode)
738     log("Method = %s", method)
739    
740     #
741     # override display mode if machine cannot nicely run X
742     #
743     if (not flags.test):
744     if (iutil.memInstalled() < isys.MIN_GUI_RAM):
745     dup_log(_("You do not have enough RAM to use the graphical "
746     "installer. Starting text mode."))
747     display_mode = 't'
748     time.sleep(2)
749    
750    
751     if iutil.memInstalled() < isys.MIN_RAM:
752     from snack import *
753    
754     screen = SnackScreen()
755     ButtonChoiceWindow(screen, _('Fatal Error'),
756     _('You do not have enough RAM to install Red Hat '
757     'Linux on this machine.\n'
758     '\n'
759     'Press <return> to reboot your system.\n'),
760     buttons = (_("OK"),))
761     screen.finish()
762     sys.exit(0)
763    
764     #
765     # handle class passed from loader
766     #
767     if customClass:
768     import installclass
769    
770     classes = installclass.availableClasses(showHidden=1)
771     for (className, objectClass, logo) in classes:
772     if className == customClass:
773     instClass = objectClass(flags.expert)
774    
775     if not instClass:
776     sys.stderr.write("installation class %s not available\n" % customClass)
777     sys.stderr.write("\navailable classes:\n")
778     for (className, objectClass, logo) in classes:
779     sys.stderr.write("\t%s\n" % className)
780     sys.exit(1)
781    
782     #
783     # if no instClass declared by user figure it out based on other cmdline args
784     #
785     if not instClass:
786     from installclass import DefaultInstall, availableClasses
787     instClass = DefaultInstall(flags.expert)
788    
789     if len(availableClasses(showHidden = 1)) < 2:
790     (cname, cobject, clogo) = availableClasses(showHidden = 1)[0]
791     log("%s is only installclass, using it" %(cname,))
792     instClass = cobject(flags.expert)
793    
794    
795     # this lets install classes force text mode instlls
796     if instClass.forceTextMode:
797     dup_log(_("Install class forcing text mode installation"))
798     display_mode = 't'
799    
800     #
801     # find out what video hardware is available to run installer
802     #
803    
804     # XXX kind of hacky - need to remember if we're running on an existing
805     # X display later to avoid some initilization steps
806     if os.environ.has_key('DISPLAY') and display_mode == 'g':
807     x_already_set = 1
808     else:
809     x_already_set = 0
810    
811     if not isHeadless:
812     #
813     # Probe what is available for X and setup a hardware state
814     #
815     # try to probe interesting hw
816     import rhpl.xserver as xserver
817     skipddcprobe = (skipddc or (x_already_set and flags.test))
818     skipmouseprobe = not (not os.environ.has_key('DISPLAY') or flags.setupFilesystems)
819    
820     (videohw, monitorhw, mousehw) = xserver.probeHW(skipDDCProbe=skipddcprobe,
821     skipMouseProbe = skipmouseprobe)
822     # if the len(videocards) is zero, then let's assume we're isHeadless
823     if len(videohw.videocards) == 0:
824     print _("No video hardware found, assuming headless")
825     videohw = None
826     monitorhw = None
827     mousehw = None
828     isHeadless = 1
829     else:
830     # setup a X hw state for use later with configuration.
831     try:
832     xcfg = xhwstate.XF86HardwareState(defcard=videohw,
833     defmon=monitorhw)
834     except Exception, e:
835     print _("Unable to instantiate a X hardware state object.")
836     xcfg = None
837     else:
838     videohw = None
839     monitorhw = None
840     mousehw = None
841     xcfg = None
842    
843     # keyboard
844     kbd = keyboard.Keyboard()
845     if keymap:
846     kbd.set(keymap)
847    
848     #
849     # delay to let use see status of attempt to probe hw
850     #
851     time.sleep(3)
852    
853    
854     #
855     # now determine if we're going to run in GUI or TUI mode
856     #
857     # if no X server, we have to use text mode
858     if not (flags.test or flags.rootpath) and (iutil.getArch() != "s390" and not os.access("/mnt/runtime/usr/X11R6/bin/Xorg", os.X_OK)):
859     dup_log(_("Graphical installation not available... "
860     "Starting text mode."))
861     time.sleep(2)
862     display_mode = 't'
863    
864     if not isHeadless:
865     # if no mouse we force text mode
866     mousedev = mousehw.get()
867     if ksfile is None and not flags.usevnc and not os.environ.has_key("DISPLAY") and display_mode == 'g' and mousedev[0] == "No - mouse":
868     # ask for the mouse type
869     import rhpl.mouse as mouse
870    
871     while 1:
872     mouserc = mouse.mouseWindow(mousehw)
873     if mouserc == 0:
874     dup_log(_("No mouse was detected. A mouse is required for "
875     "graphical installation. Starting text mode."))
876     display_mode = 't'
877     time.sleep(2)
878     break
879     elif mouserc == -1:
880     # rescan
881     mousehw.probe()
882     mousedev = mousehw.get()
883     if mousedev[0] != "No - mouse":
884     dup_log(_("Detected mouse type: %s"), mousehw.shortDescription())
885     time.sleep(5)
886     break
887     else:
888     dup_log(_("Using mouse type: %s"), mousehw.shortDescription())
889     break
890    
891    
892     else: # s390/iSeries checks
893     if display_mode == 'g' and not (os.environ.has_key('DISPLAY') or
894     flags.usevnc):
895     dup_log("DISPLAY variable not set. Starting text mode!")
896     display_mode = 't'
897     graphical_failed = 1
898     time.sleep(2)
899    
900     # if DISPLAY not set either vnc server failed to start or we're not
901     # running on a redirected X display, so start local X server
902     if display_mode == 'g' and not os.environ.has_key('DISPLAY') and not flags.usevnc:
903     import rhpl.monitor as monitor
904    
905     # if no monitor probed lets guess based on runres
906     hsync = monitorhw.getMonitorHorizSync()
907     vsync = monitorhw.getMonitorVertSync()
908     res_supported = monitor.monitor_supports_mode(hsync, vsync, runres)
909    
910     if not res_supported:
911     import rhpl.guesslcd as guesslcd
912    
913     # pick a monitor spec that is adequate for requested runres
914     (hsync, vsync) = guesslcd.getSyncForRes(runres)
915     monitorhw.setSpecs(hsync, vsync)
916    
917     # recreate X config object
918     xcfg = xhwstate.XF86HardwareState(defcard=videohw,
919     defmon=monitorhw)
920     xcfg.set_resolution(runres)
921    
922     # make sure we can write log to ramfs
923     if os.access("/tmp/ramfs", os.W_OK):
924     xlogfile = "/tmp/ramfs/X.log"
925     else:
926     xlogfile = None
927    
928     xsetup_failed = xserver.startXServer(videohw, monitorhw, mousehw, kbd,
929     runres,
930     xStartedCB=doStartupX11Actions,
931     xQuitCB=doShutdownX11Actions,
932     logfile=xlogfile)
933    
934     if xsetup_failed:
935     dup_log(" X startup failed, falling back to text mode")
936     display_mode = 't'
937     graphical_failed = 1
938     time.sleep(2)
939    
940     if display_mode == 't' and graphical_failed:
941     ret = vnc.askVncWindow()
942     if ret != -1:
943     display_mode = 'g'
944     flags.usevnc = 1
945     if ret is not None:
946     vncpassword = ret
947    
948     # if they want us to use VNC do that now
949     if display_mode == 'g' and flags.usevnc:
950     # dont run vncpassword if in test mode
951     if flags.test:
952     vncpassword = None
953    
954     startVNCServer(vncpassword=vncpassword,
955     vncconnecthost=vncconnecthost,
956     vncconnectport=vncconnectport)
957    
958    
959     #
960     # read in anaconda configuration file
961     #
962     import configFileData
963     configFile = configFileData.configFileData()
964     configFileData = configFile.getConfigData()
965    
966     # setup links required for all install types
967     for i in ( "services", "protocol", "nsswitch.conf", "joe", "selinux"):
968     try:
969     os.symlink ("../mnt/runtime/etc/" + i, "/etc/" + i)
970     except:
971     pass
972    
973     #
974     # setup links required by graphical mode if installing and verify display mode
975     #
976     if (display_mode == 'g'):
977     print _("Starting graphical installation...")
978     if not flags.test and flags.setupFilesystems:
979     for i in ( "imrc", "im_palette.pal", "gtk-2.0", "pango", "fonts",
980     "fb.modes"):
981     try:
982     if os.path.exists("/mnt/runtime/etc/%s" %(i,)):
983     os.symlink ("../mnt/runtime/etc/" + i, "/etc/" + i)
984     except:
985     pass
986    
987     # display splash screen
988    
989     if nofallback:
990     from splashscreen import splashScreenShow
991     splashScreenShow(configFileData)
992    
993     from gui import InstallInterface
994     else:
995     try:
996     from splashscreen import splashScreenShow
997     splashScreenShow(configFileData)
998    
999     from gui import InstallInterface
1000     except Exception, e:
1001     log("Exception starting GUI installer: %s" %(e,))
1002     # if we're not going to really go into GUI mode, we need to get
1003     # back to vc1 where the text install is going to pop up.
1004     if not x_already_set:
1005     isys.vtActivate (1)
1006     dup_log("GUI installer startup failed, falling back to text mode.")
1007     display_mode = 't'
1008     if 'DISPLAY' in os.environ.keys():
1009     del os.environ['DISPLAY']
1010     time.sleep(2)
1011    
1012     if (display_mode == 't'):
1013     from text import InstallInterface
1014    
1015     if (display_mode == 'c'):
1016     from cmdline import InstallInterface
1017    
1018    
1019     # go ahead and set up the interface
1020     intf = InstallInterface ()
1021    
1022     # imports after setting up the path
1023     if method:
1024     if method.startswith('cdrom://'):
1025     from image import CdromInstallMethod
1026     methodobj = CdromInstallMethod(method[8:], intf.messageWindow,
1027     intf.progressWindow, rootPath)
1028     elif method.startswith('nfs:/'):
1029     from image import NfsInstallMethod
1030     methodobj = NfsInstallMethod(method[5:], rootPath)
1031     elif method.startswith('nfsiso:/'):
1032     from image import NfsIsoInstallMethod
1033     methodobj = NfsIsoInstallMethod(method[8:], intf.messageWindow, rootPath)
1034     elif method.startswith('ftp://') or method.startswith('http://'):
1035     from urlinstall import UrlInstallMethod
1036     methodobj = UrlInstallMethod(method, rootPath)
1037     methodobj.setIntf(intf)
1038     elif method.startswith('hd://'):
1039     tmpmethod = method[5:]
1040    
1041     i = string.index(tmpmethod, ":")
1042     drive = tmpmethod[0:i]
1043     tmpmethod = tmpmethod[i+1:]
1044    
1045     i = string.index(tmpmethod, "/")
1046     type = tmpmethod[0:i]
1047     dir = tmpmethod[i+1:]
1048    
1049     from harddrive import HardDriveInstallMethod
1050     methodobj = HardDriveInstallMethod(drive, type, dir, intf.messageWindow,
1051     rootPath)
1052     elif method.startswith('oldhd://'):
1053     tmpmethod = method[8:]
1054    
1055     i = string.index(tmpmethod, ":")
1056     drive = tmpmethod[0:i]
1057     tmpmethod = tmpmethod[i+1:]
1058    
1059     i = string.index(tmpmethod, "/")
1060     type = tmpmethod[0:i]
1061     dir = tmpmethod[i+1:]
1062    
1063     from harddrive import OldHardDriveInstallMethod
1064     methodobj = OldHardDriveInstallMethod(drive, type, dir, rootPath)
1065     else:
1066     print "unknown install method:", method
1067     sys.exit(1)
1068    
1069     floppyDevice = floppy.probeFloppyDevice()
1070    
1071     # create device nodes for detected devices if we're not running in test mode
1072     if not flags.test and flags.setupFilesystems:
1073     iutil.makeDriveDeviceNodes()
1074    
1075     id = instClass.installDataClass(extraModules, floppyDevice, configFileData, method)
1076    
1077     id.x_already_set = x_already_set
1078    
1079     if mousehw:
1080     id.setMouse(mousehw)
1081    
1082     if videohw:
1083     id.setVideoCard(videohw)
1084    
1085     if monitorhw:
1086     id.setMonitor(monitorhw)
1087    
1088     #
1089     # not sure what to do here - somehow we didnt detect anything
1090     #
1091     if xcfg is None and not isHeadless:
1092     try:
1093     xcfg = xhwstate.XF86HardwareState()
1094     except Exception, e:
1095     print _("Unable to instantiate a X hardware state object.")
1096     xcfg = None
1097    
1098     if xcfg is not None:
1099     #
1100     # XXX - hack - here we want to enforce frame buffer requirement on ppc
1101     # pick 640x480x8bpp cause that is what frame buffer inits to
1102     # when the machine reboots
1103     if iutil.getArch() == "ppc":
1104     cardname = "Framebuffer driver (generic)"
1105     xcfg.set_videocard_card(cardname)
1106     xcfg.set_videocard_name(cardname)
1107     xcfg.set_colordepth(8)
1108     xcfg.set_resolution("640x480")
1109    
1110     xsetup = xsetup.XSetup(xcfg)
1111    
1112     # HACK - if user overrides resolution then use it and disable
1113     # choosing a sane default for them
1114     if runres_override:
1115     xsetup.imposed_sane_default = 1
1116    
1117     id.setXSetup(xsetup)
1118    
1119     if kbd:
1120     id.setKeyboard(kbd)
1121    
1122     instClass.setInstallData(id)
1123    
1124     dispatch = dispatch.Dispatcher(intf, id, methodobj, rootPath)
1125    
1126     if lang:
1127     dispatch.skipStep("language", permanent = 1)
1128     instClass.setLanguage(id, lang)
1129    
1130     if keymap:
1131     dispatch.skipStep("keyboard", permanent = 1)
1132     instClass.setKeyboard(id, keymap)
1133    
1134     # Skip the disk options in rootpath mode
1135     if flags.rootpath:
1136     dispatch.skipStep("partitionmethod", permanent = 1)
1137     dispatch.skipStep("partitionmethodsetup", permanent = 1)
1138     dispatch.skipStep("autopartition", permanent = 1)
1139     dispatch.skipStep("autopartitionexecute", permanent = 1)
1140     dispatch.skipStep("fdisk", permanent = 1)
1141     dispatch.skipStep("bootloadersetup", permanent = 1)
1142     dispatch.skipStep("bootloader", permanent = 1)
1143     dispatch.skipStep("bootloaderadvanced", permanent = 1)
1144     dispatch.skipStep("upgbootloader", permanent = 1)
1145    
1146 gordonr 1.6 ## set up the headless case
1147     #if isHeadless == 1:
1148     # id.setHeadless(isHeadless)
1149     # instClass.setAsHeadless(dispatch, isHeadless)
1150 charlieb 1.1
1151     instClass.setSteps(dispatch)
1152    
1153     # We shouldn't need this again
1154     # XXX
1155     #del id
1156    
1157     #
1158     # XXX This is surely broken
1159     #
1160     #if iutil.getArch() == "sparc":
1161     # import kudzu
1162     # mice = kudzu.probe (kudzu.CLASS_MOUSE, kudzu.BUS_UNSPEC, kudzu.PROBE_ONE);
1163     # if mice:
1164     # (mouseDev, driver, descr) = mice[0]
1165     # if mouseDev == 'sunmouse':
1166     # instClass.addToSkipList("mouse")
1167     # instClass.setMouseType("Sun - Mouse", "sunmouse")
1168    
1169     # comment out the next line to make exceptions non-fatal
1170     sys.excepthook = lambda type, value, tb, dispatch=dispatch, intf=intf: handleException(dispatch, intf, (type, value, tb))
1171    
1172     try:
1173     intf.run(id, dispatch, configFileData)
1174     except SystemExit, code:
1175     intf.shutdown()
1176     except:
1177     handleException(dispatch, intf, sys.exc_info())
1178    
1179     del intf

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