def readKickstart(self, f, reset=True): """Process a kickstart file, given by the filename f.""" if reset: self._reset() # an %include might not specify a full path. if we don't try to figure # out what the path should have been, then we're unable to find it # requiring full path specification, though, sucks. so let's make # the reading "smart" by keeping track of what the path is at each # include depth. if not os.path.exists(f): if self.currentdir.has_key(self._includeDepth - 1): if os.path.exists( os.path.join(self.currentdir[self._includeDepth - 1], f)): f = os.path.join(self.currentdir[self._includeDepth - 1], f) cd = os.path.dirname(f) if not cd.startswith("/"): cd = os.path.abspath(cd) self.currentdir[self._includeDepth] = cd try: s = urlread(f) except grabber.URLGrabError, e: raise KickstartError, formatErrorMsg( 0, msg=_("Unable to open input kickstart file: %s") % e.strerror)
def preprocessKickstart (f): """Preprocess the kickstart file, given by the filename file. This method is currently only useful for handling %ksappend lines, which need to be fetched before the real kickstart parser can be run. Returns the location of the complete kickstart file. """ try: fh = urlopen(f) except grabber.URLGrabError, e: raise KickstartError, formatErrorMsg(0, msg=_("Unable to open input kickstart file: %s") % e.strerror)
def _readSection(self, lineIter, lineno): obj = self._sections[self._state] while True: try: line = lineIter.next() if line == "": # This section ends at the end of the file. if self.version >= version.F8: raise KickstartParseError, formatErrorMsg( lineno, msg=_("Section does not end with %%end.")) self._finalize(obj) except StopIteration: break lineno += 1 # Throw away blank lines and comments, unless the section wants all # lines. if self._isBlankOrComment(line) and not obj.allLines: continue if line.startswith("%"): args = shlex.split(line) if args and args[0] == "%end": # This is a properly terminated section. self._finalize(obj) break elif args and args[0] == "%ksappend": continue elif args and (self._validState(args[0]) or args[0] in ["%include", "%ksappend"]): # This is an unterminated section. if self.version >= version.F8: raise KickstartParseError, formatErrorMsg( lineno, msg=_("Section does not end with %%end.")) # Finish up. We do not process the header here because # kicking back out to STATE_COMMANDS will ensure that happens. lineIter.put(line) lineno -= 1 self._finalize(obj) break else: # This is just a line within a section. Pass it off to whatever # section handles it. obj.handleLine(line) return lineno
def _readSection(self, lineIter, lineno): obj = self._sections[self._state] while True: try: line = lineIter.next() if line == "": # This section ends at the end of the file. if self.version >= version.F8: raise KickstartParseError, formatErrorMsg(lineno, msg=_("Section does not end with %%end.")) self._finalize(obj) except StopIteration: break lineno += 1 # Throw away blank lines and comments, unless the section wants all # lines. if self._isBlankOrComment(line) and not obj.allLines: continue if line.startswith("%"): args = shlex.split(line) if args and args[0] == "%end": # This is a properly terminated section. self._finalize(obj) break elif args and args[0] == "%ksappend": continue elif args and (self._validState(args[0]) or args[0] in ["%include", "%ksappend"]): # This is an unterminated section. if self.version >= version.F8: raise KickstartParseError, formatErrorMsg(lineno, msg=_("Section does not end with %%end.")) # Finish up. We do not process the header here because # kicking back out to STATE_COMMANDS will ensure that happens. lineIter.put(line) lineno -= 1 self._finalize(obj) break else: # This is just a line within a section. Pass it off to whatever # section handles it. obj.handleLine(line) return lineno
def _preprocessStateMachine(lineIter): l = None lineno = 0 # Now open an output kickstart file that we are going to write to one # line at a time. (outF, outName) = tempfile.mkstemp("-ks.cfg", "", "/tmp") while True: try: l = lineIter.next() except StopIteration: break # At the end of the file? if l == "": break lineno += 1 url = None ll = l.strip() if not ll.startswith("%ksappend"): os.write(outF, l) continue # Try to pull down the remote file. try: ksurl = ll.split(' ')[1] except: raise KickstartParseError, formatErrorMsg( lineno, msg=_("Illegal url for %%ksappend: %s") % ll) try: url = grabber.urlopen(ksurl) except grabber.URLGrabError, e: raise KickstartError, formatErrorMsg( lineno, msg=_("Unable to open %%ksappend file: %s") % e.strerror) else: # Sanity check result. Sometimes FTP doesn't catch a file # is missing. try: if url.size < 1: raise KickstartError, formatErrorMsg( lineno, msg=_("Unable to open %%ksappend file")) except: raise KickstartError, formatErrorMsg( lineno, msg=_("Unable to open %%ksappend file")) # If that worked, write the remote file to the output kickstart # file in one burst. Then close everything up to get ready to # read ahead in the input file. This allows multiple %ksappend # lines to exist. if url is not None: os.write(outF, url.read()) url.close()
def _preprocessStateMachine (lineIter): l = None lineno = 0 # Now open an output kickstart file that we are going to write to one # line at a time. (outF, outName) = tempfile.mkstemp("-ks.cfg", "", "/tmp") while True: try: l = lineIter.next() except StopIteration: break # At the end of the file? if l == "": break lineno += 1 url = None ll = l.strip() if not ll.startswith("%ksappend"): os.write(outF, l) continue # Try to pull down the remote file. try: ksurl = ll.split(' ')[1] except: raise KickstartParseError, formatErrorMsg(lineno, msg=_("Illegal url for %%ksappend: %s") % ll) try: url = grabber.urlopen(ksurl) except grabber.URLGrabError, e: raise KickstartError, formatErrorMsg(lineno, msg=_("Unable to open %%ksappend file: %s") % e.strerror) else: # Sanity check result. Sometimes FTP doesn't catch a file # is missing. try: if url.size < 1: raise KickstartError, formatErrorMsg(lineno, msg=_("Unable to open %%ksappend file")) except: raise KickstartError, formatErrorMsg(lineno, msg=_("Unable to open %%ksappend file")) # If that worked, write the remote file to the output kickstart # file in one burst. Then close everything up to get ready to # read ahead in the input file. This allows multiple %ksappend # lines to exist. if url is not None: os.write(outF, url.read()) url.close()
def readKickstart(self, f, reset=True): """Process a kickstart file, given by the filename f.""" if reset: self._reset() # an %include might not specify a full path. if we don't try to figure # out what the path should have been, then we're unable to find it # requiring full path specification, though, sucks. so let's make # the reading "smart" by keeping track of what the path is at each # include depth. if not os.path.exists(f): if self.currentdir.has_key(self._includeDepth - 1): if os.path.exists(os.path.join(self.currentdir[self._includeDepth - 1], f)): f = os.path.join(self.currentdir[self._includeDepth - 1], f) cd = os.path.dirname(f) if not cd.startswith("/"): cd = os.path.abspath(cd) self.currentdir[self._includeDepth] = cd try: s = urlread(f) except grabber.URLGrabError, e: raise KickstartError, formatErrorMsg(0, msg=_("Unable to open input kickstart file: %s") % e.strerror)
def _stateMachine(self, lineIter): # For error reporting. lineno = 0 while True: # Get the next line out of the file, quitting if this is the last line. try: self._line = lineIter.next() if self._line == "": break except StopIteration: break lineno += 1 # Eliminate blank lines, whitespace-only lines, and comments. if self._isBlankOrComment(self._line): self._handleSpecialComments(self._line) continue # Remove any end-of-line comments. sanitized = self._line.split("#")[0] # Then split the line. args = shlex.split(sanitized.rstrip()) if args[0] == "%include": # This case comes up primarily in ksvalidator. if not self.followIncludes: continue if len(args) == 1 or not args[1]: raise KickstartParseError, formatErrorMsg(lineno) self._includeDepth += 1 try: self.readKickstart(args[1], reset=False) except KickstartError: # Handle the include file being provided over the # network in a %pre script. This case comes up in the # early parsing in anaconda. if self.missingIncludeIsFatal: raise self._includeDepth -= 1 continue # Now on to the main event. if self._state == STATE_COMMANDS: if args[0] == "%ksappend": # This is handled by the preprocess* functions, so continue. continue elif args[0][0] == '%': # This is the beginning of a new section. Handle its header # here. newSection = args[0] if not self._validState(newSection): raise KickstartParseError, formatErrorMsg(lineno, msg=_("Unknown kickstart section: %s" % newSection)) self._state = newSection obj = self._sections[self._state] self._tryFunc(lambda: obj.handleHeader(lineno, args)) # This will handle all section processing, kicking us back # out to STATE_COMMANDS at the end with the current line # being the next section header, etc. lineno = self._readSection(lineIter, lineno) else: # This is a command in the command section. Dispatch to it. self._tryFunc(lambda: self.handleCommand(lineno, args)) elif self._state == STATE_END: break