import string
import os

class LiloConfiguration:
   def __repr__ (self, tab = 0):
       s = ""
       for n in self.order:
           if (tab):
               s = s + '\t'
           if n[0] == '#':
               s = s + n[1:]
           else:
               s = s + n
               if self.items[n]:
                   s = s + "=" + self.items[n]
           s = s + '\n'
       for image in self.images:
           (type, name, cl) = image
           s = s + "\n%s=%s\n" % (type, name)
           s = s + cl.__repr__(1)
       return s

   def addEntry(self, item, val = None):
       if not self.items.has_key(item):
           self.order.append(item)
       if (val):
           self.items[item] = str(val)
       else:
           self.items[item] = None

   def addImage (self, type, name, config):
       self.images.append((type, name, config))

   def delImage (self, name):
       for entry in self.images:
           type, label, config = entry
           if label == name:
               self.images.remove (entry)

   def write(self, file):
       f = open(file, "w")
       f.write(self.__repr__())
       f.close()
       os.chmod(file, 0644)

   def read (self, file):
       f = open(file, "r")
       image = None
       for l in f.readlines():
           l = l[:-1]
           orig = l
           while (l and (l[0] == ' ' or l[0] == '\t')):
               l = l[1:]
           if (not l or l[0] == '#'):
               self.order.append('#' + orig)
               continue
           fields = string.split(l, '=', 1)
           if (len(fields) == 2):
               if (fields[0] == "image"):
                   image = LiloConfiguration()
                   self.addImage(fields[0], fields[1], image)
                   args = None
               elif (fields[0] == "other"):
                   image = LiloConfiguration()
                   self.addImage(fields[0], fields[1], image)
                   args = None
               else:
                   args = (fields[0], fields[1])
           else:
               args = (l,)

           if (args and image):
               apply(image.addEntry, args)
           elif args:
               apply(self.addEntry, args)

       f.close()

   def __init__(self):
       self.order = []
       self.images = []                # more (type, name, LiloConfiguration) pair
       self.items = {}

if __name__ == "__main__":
   config = LiloConfiguration ()
   config.read ('lilo.conf')
   print config
   config.delImage ('/boot/vmlinuz-2.2.5-15')
   print '----------------------------------'
   print config
   config.delImage ('/dev/hda3')
   print '----------------------------------'
   print config