## Copyright (C) 2001, 2002 Red Hat, Inc. ## Copyright (C) 2001, 2002 Harald Hoyer ## This program is free software; you can redistribute it and/or modify ## it under the terms of the GNU General Public License as published by ## the Free Software Foundation; either version 2 of the License, or ## (at your option) any later version. ## This program is distributed in the hope that it will be useful, ## but WITHOUT ANY WARRANTY; without even the implied warranty of ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ## GNU General Public License for more details. ## You should have received a copy of the GNU General Public License ## along with this program; if not, write to the Free Software ## Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. import sys import re from types import ListType from . import Conf # pylint: disable-msg=W0403 if not "/usr/lib/rhs/python" in sys.path: sys.path.append("/usr/lib/rhs/python") class ConfPAP(Conf.Conf): __beginline = """\ ####### system-config-network will overwrite this part!!! (begin) ##########""" __endline = """\ ####### system-config-network will overwrite this part!!! (end) ############""" __beginlineold = '^####### redhat-config-network will overwrite.*' __endlineold = '^####### redhat-config-network will overwrite.*' def __init__(self, filename): self.__beginlineplace = 0 self.__endlineplace = 0 Conf.Conf.__init__(self, filename, '#', ' \t', ' \t') self.chmod(0600) def read(self): Conf.Conf.read(self) self.initvars() self.chmod(0600) # convert old marker to new self.sedline(self.__beginlineold, self.__beginline) self.sedline(self.__endlineold, self.__endline) def findline(self, val): # returns False if no more lines matching pattern while self.line < len(self.lines): if self.lines[self.line] == val: return 1 self.line = self.line + 1 # if while loop terminated, pattern not found. return 0 def real_rewind(self): self.line = 0 def rewind(self): self.line = self.__beginlineplace def initvars(self): # pylint: disable-msg=W0201 self.vars = {} self.__beginlineplace = 0 self.__endlineplace = 0 self.real_rewind() if not self.findline(self.__beginline): self.insertline(self.__beginline) self.__beginlineplace = self.tell() if not self.findline(self.__endline): self.seek(self.__beginlineplace) self.nextline() self.insertline(self.__endline) self.__endlineplace = self.tell() self.real_rewind() while self.findnextcodeline(): if self.tell() >= self.__endlineplace: break # initialize dictionary of variable/name pairs # print self.getline() var = self.getfields() if var and (len(var) >= 3): if not self.vars.has_key(var[0]): self.vars[var[0]] = {} self.vars[var[0]][var[1]] = var[2] self.nextline() self.rewind() def getfields(self): #var = Conf.Conf.getfields(self) var = [] if self.line >= len(self.lines): return [] regexp = re.compile(r'(?P("([^"\\]|\\\S)*?")|([^ "\\]|\\\S)+)( |\t)+' r'(?P("([^"\\]|\\\S)*?")|([^ "\\]|\\\S)+|\*)( |\t)+' r'(?P("([^"\\]|\\\S)*?")|([^ "\\]|\\\S)+)') # FIXED: 465748 - crash if pap-secrets file contains spaces before login m = regexp.match(self.lines[self.line].strip()) if not m: raise Conf.BadFile, "Error occured while parsing %s" % self.filename else: var = [m.group("user"), m.group("server"), m.group("secret")] if len(var) and len(var[0]) and var[0][0] in '\'"': # found quote; strip from beginning and end quote = var[0][0] if var[0][-1] == quote: var[0] = var[0][1:-1] if len(var) >= 2 and len(var[1]) and var[1][0] in '\'"': # found quote; strip from beginning and end quote = var[1][0] if var[1][-1] == quote: var[1] = var[1][1:-1] if len(var) >= 3 and len(var[2]) and var[2][0] in '\'"': # found quote; strip from beginning and end quote = var[2][0] if var[2][-1] == quote: var[2] = var[2][1:-1] return var def insertline(self, line=''): place = self.tell() if place < self.__beginlineplace: self.__beginlineplace = self.__beginlineplace + 1 if place < self.__endlineplace: self.__endlineplace = self.__endlineplace + 1 self.lines.insert(self.line, line) def deleteline(self): place = self.tell() self.lines[self.line:self.line+1] = [] if place < self.__beginlineplace: self.__beginlineplace = self.__beginlineplace -1 if place < self.__endlineplace: self.__endlineplace = self.__endlineplace - 1 def __getitem__(self, varname): if self.vars.has_key(varname): return self.vars[varname] else: return '' def __setitem__(self, varname, svalue): place = self.tell() self.rewind() missing = 1 if isinstance(varname, ListType): login = '\"' + varname[0] + '\"' server = '\"' + varname[1] + '\"' else: login = '\"' + varname + '\"' server = '*' value = '\"' + svalue + '\"' while self.findnextcodeline(): if self.tell() >= self.__endlineplace: break var = self.getfields() if var and (len(var) >= 3): if login == var[0] and server == var[1]: self.setfields([ login, server, value ] ) missing = 0 self.nextline() if missing: self.delallitem(varname) self.seek(self.__endlineplace) self.insertlinelist([ login, server, value ] ) if isinstance(varname, ListType): if not self.vars.has_key(varname[0]): self.vars[varname[0]] = {} self.vars[varname[0]][varname[1]] = svalue else: if not self.vars.has_key(varname): self.vars[varname] = {} self.vars[varname]["*"] = svalue self.seek(place) def __delitem__(self, varname): place = self.tell() self.rewind() if isinstance(varname, ListType): login = varname[0] server = varname[1] else: login = varname server = "*" while self.findnextcodeline(): if self.tell() >= self.__endlineplace: break var = self.getfields() if var and (len(var) >= 3): if login == var[0] and server == var[1]: self.deleteline() self.nextline() if self.vars.has_key(login): if self.vars[login].has_key(server): del self.vars[login][server] if not len(self.vars[login]): del self.vars[login] self.seek(place) def delallitem(self, varname): place = self.tell() self.rewind() # delete *every* instance... if isinstance(varname, ListType): login = varname[0] server = varname[1] else: login = varname server = "*" while self.findnextcodeline(): var = self.getfields() if var and (len(var) >= 3): if login == var[0] and server == var[1]: self.deleteline() self.nextline() if self.vars.has_key(login): if self.vars[login].has_key(server): del self.vars[login][server] if not len(self.vars[login]): del self.vars[login] self.seek(place) def has_key(self, key): if self.vars.has_key(key): return 1 return 0 def keys(self): return self.vars.keys()