diff options
| -rwxr-xr-x | abs/core/LinHES-system/PKGBUILD | 10 | ||||
| -rw-r--r-- | abs/core/LinHES-system/add_storage.py | 198 | ||||
| -rw-r--r-- | abs/core/LinHES-system/add_storage.readme | 3 | 
3 files changed, 168 insertions, 43 deletions
| diff --git a/abs/core/LinHES-system/PKGBUILD b/abs/core/LinHES-system/PKGBUILD index 3da9578..6e02fdb 100755 --- a/abs/core/LinHES-system/PKGBUILD +++ b/abs/core/LinHES-system/PKGBUILD @@ -1,6 +1,6 @@  pkgname=LinHES-system  pkgver=2 -pkgrel=57 +pkgrel=59  arch=('i686' 'x86_64')  MVDIR=$startdir/pkg/usr/LH  BINDIR=$startdir/pkg/usr/bin @@ -26,7 +26,7 @@ binfiles="LinHES-start optimize_mythdb.py   msg_client.py msg_daemon.py gen_is_xml.py gen_lib_xml.py"  source=(LinHES-session LinHES-profile.sh $binfiles alsa-base myth_mtc.lr - diskspace cacheclean.cron readme_is_xml) + diskspace cacheclean.cron readme_is_xml add_storage.readme)  build() {          cd $startdir/src @@ -51,6 +51,7 @@ build() {          install -m644 -D $startdir/src/alsa-base $startdir/pkg/etc/modprobe.d/alsa-base.conf          install -m644 -D $startdir/src/readme_is_xml $startdir/pkg/etc/gen_is_xml.d/readme_is_xml          install -m644 -D $startdir/src/readme_is_xml $startdir/pkg/etc/gen_gen_xml.d/readme_gen_xml +        install -m644 -D $startdir/src/add_storage.readme $startdir/pkg/etc/storage.d/readme         # install -m755 -D $startdir/src/smolt.cron $startdir/pkg/etc/cron.weekly/smolt.cron          install -m755 -D $startdir/src/cacheclean.cron $startdir/pkg/etc/cron.weekly/cacheclean.cron          install -m755 -D $startdir/src/diskspace $startdir/pkg/etc/cron.tenminutes/diskspace @@ -77,7 +78,7 @@ md5sums=('4921a6e21c71b263b8d23c51c24b939c'           '9c2294ccfd5359583497a6b03d918a27'           '859a80ddb4c234506379c605114c1343'           '47e093e8cfe4b5b96602358e1f540832' -         '6faeba0aeb38e772121f751cabda8683' +         '2b311d0121d4f26c6d6a35e6e612ee97'           'b8f0414427c5d9afdc32ceb3ae56f82a'           '6519d209e151cdc39ae7e1091d189c3e'           'd1cdf28fcb1c88f0e504905771dd6040' @@ -92,4 +93,5 @@ md5sums=('4921a6e21c71b263b8d23c51c24b939c'           'f1870a9522c79e6b248fcbf81dec3280'           '84492954db16740f949d795b74383189'           '02c810c2f47b7c4495fdacaf54189473' -         '1e2ca4dd872a50df6b70528e06df558a') +         '1e2ca4dd872a50df6b70528e06df558a' +         'da432d68962e109e09beb2b71c8c8571') diff --git a/abs/core/LinHES-system/add_storage.py b/abs/core/LinHES-system/add_storage.py index 28d679c..db0d9af 100644 --- a/abs/core/LinHES-system/add_storage.py +++ b/abs/core/LinHES-system/add_storage.py @@ -11,23 +11,24 @@ import pickle  import commands  import sys,os  import random, string +import ConfigParser  from MythTV import MythDB, MythBE, Recorded, MythError  from socket import timeout, gethostname - -pickle_file="/usr/LH/etc/storage.pkl" +storage_dir = "/etc/storage.d" +pickle_file = "%s/storage.pkl" %storage_dir  SG_MAP={ 'Default'    :'tv', -  'LiveTV'     :'live_tv', +  'LiveTV'     :'tv/live',    'Videos'     :'video', -  'Trailers'   :'video/trailers', -  'Coverart'   :'video/converart', -  'Fanart'     :'video/fanart', -  'Banners'    :'video/banners', -  'Screenshots':'video/screenshots', +  'Trailers'   :'video_stuff/trailers', +  'Coverart'   :'video_stuff/converart', +  'Fanart'     :'video_stuff/fanart', +  'Banners'    :'video_stuff/banners', +  'Screenshots':'video_stuff/screenshots',    'DB Backups' :'db_backups'}  FS_LIST=[]  for key in SG_MAP.keys(): @@ -36,15 +37,19 @@ for key in SG_MAP.keys():  class disk_device: -    def  __init__(self,device): +    def  __init__(self,device,storage_dir):          device_obj = bus.get_object("org.freedesktop.UDisks", device)          device_props = dbus.Interface(device_obj, dbus.PROPERTIES_IFACE) +        self.storage_dir = storage_dir +        self.top_mount_dir = "/storage" +        self.config = ConfigParser.RawConfigParser()          self.fs_map = self.get_fsmap()          self.is_device = self.get_is_device(device_props)          self.vendor = self.get_vendor(device_props)          self.model = self.get_model(device_props) -        self.mount_path = self.get_mounts(device_props) +        self.mmount = False +        self.f = self.get_mounts(device_props)          self.is_mounted = self.get_is_mounted(device_props)          self.parition_size = self.get_partition_size(device_props) @@ -57,7 +62,14 @@ class disk_device:          self.device_file_path = self.get_device_file_path(device_props)          self.block_partition="%s1" %self.block_path          self.in_use = self.get_in_use() +        self.uuid='' +        self.new_mount_point='' + +    def set_partition(self,partition): +        self.block_partition = "%s3" %self.block_path +    def set_mmount(self,flag): +        self.mmount = flag      def get_is_device(self,device_props):          return device_props.Get('org.freedesktop.UDisks.Device', "DeviceIsDrive") @@ -74,6 +86,11 @@ class disk_device:      def get_is_mounted(self,device_props):         return device_props.Get('org.freedesktop.UDisks.Device', "DeviceIsMounted") +    def get_name(self): +        filename="%s_%s" %(self.model.replace(' ',''), +                                self.serial_number.replace(' ','')) +        return filename +      def get_in_use(self):          in_use = False          for i in self.fs_map: @@ -82,7 +99,6 @@ class disk_device:                  break          return in_use -      def get_partition_size(self,device_props):          return device_props.Get('org.freedesktop.UDisks.Device', "PartitionSize") @@ -181,7 +197,7 @@ class disk_device:          if uuid == '':              print "Could not find a UUID for device: %s" %partition              sys.exit(1) - +        self.uuid = uuid.strip()          return uuid.strip()      def read_fstab(self): @@ -211,13 +227,13 @@ class disk_device:          fstab=self.read_fstab()          #determine mount_path -        self.new_mount_point="/data/media/%s_%s" %(self.model.replace(' ',''),self.serial_number.replace(' ','')) +        self.new_mount_point="%s/%s_%s" %(self.top_mount_dir,self.model.replace(' ',''),self.serial_number.replace(' ',''))          #determine options          new_options = self.find_options_type(fstab)[0]          #find blkid -        self.block_partition="%s1" %self.block_path +        #self.block_partition="%s1" %self.block_path          uuid=self.find_uuid(self.block_partition)          #construct new line @@ -260,25 +276,65 @@ class disk_device:                  cmd="chmod -R 775 /%s" %self.new_mount_point                  runcmd(cmd) -    def add_sg(self,DB,host,SG_MAP): +    def add_sg(self,DB,host,SG_MAP,weight='0'):          print "    Adding to storage groups" +        sgweight=int(weight)          for key in SG_MAP.iterkeys():              #print key," : ", SG_MAP[key] -            #try: -                gn=key -                hn=host -                dn="%s/%s" %(self.new_mount_point,SG_MAP[key]) -                #print dn -                #print gn -                #print hn -                with DB as c: +            gn=key +            hn=host +            dn="%s/%s" %(self.new_mount_point,SG_MAP[key]) +            #print dn +            #print gn +            #print hn +            with DB as c: +                try: +                    c.execute("""insert into storagegroup (groupname,hostname,dirname) values (%s,%s,%s)""",(gn,hn,dn)) +                    print "        Adding  location: %s  to storagegroup %s" %(dn,gn) +                except: +                    print "        *Error inserting %s into storage groups" %dn + +                if sgweight > 0:                      try: -                        c.execute("""insert into storagegroup (groupname,hostname,dirname) values (%s,%s,%s)""",(gn,hn,dn)) -                        print "        Adding  location: %s  to storagegroup %s" %(dn,gn) +                        #("SGweightPerDir:server2:/mnt/video", 99, "server2"); +                        sgw="SGweightPerDir:%s:%s" %(hn,dn) +                        #print sgw +                        #print sgweight +                        #print hn + +                        c.execute("""insert into settings (value,data,hostname) values (%s,%s,%s)""",(sgw,sgweight,hn)) +                        print "        Adding storage group weight of %s for %s\n" %(sgweight,gn)                      except: -                        print "        Error inserting %s into storage groups" %dn +                        print "        *Error setting storage group weight %s for %s\n" %(sgweight,gn) + +        return + +    def write_config(self): +        print "    Writing out storage.d conf file" +        self.config.add_section('storage') +        self.config.set('storage','uuid',self.uuid) +        self.config.set('storage','mountpoint',self.new_mount_point) +        self.config.set('storage','shareable','True') +        self.config.set('storage','mmount',self.mmount) + + +        filename="%s_%s.conf" %(self.model.replace(' ',''), +                                self.serial_number.replace(' ','')) + +        configfile="/etc/storage.d/%s" %filename +        print "     %s" %configfile +        with open(configfile, 'wb') as configfile: +            self.config.write(configfile)          return +    def symlink(self): +        print "    Creating symlink" +        cmd = "ln -s %s %s/myth " %(self.new_mount_point, self.top_mount_dir) +        runcmd(cmd) + + + +#end of class  def runcmd(cmd): @@ -300,7 +356,7 @@ def scan_system():      ud_manager = dbus.Interface(ud_manager_obj, 'org.freedesktop.UDisks')      current_drive_list=[]      for dev in ud_manager.EnumerateDevices(): -        drive = disk_device(dev) +        drive = disk_device(dev,storage_dir)          if drive.is_device and drive.device_size > 5000 and not drive.is_optical :              current_drive_list.append(drive) @@ -333,7 +389,7 @@ def search_for_match(system_drive,known_drive_list):              y_drive_hash = "%s_%s_%s" %(y.model,y.parition_size,y.device_file_path)              if system_drive_hash == y_drive_hash :                  match_drive = True -                print "No serial number was found, matched using hash method: %s" %system_drive.model +                print "\n*   No serial number was found, matched using hash method: %s" %system_drive.model                  break          elif y.serial_number == system_drive.serial_number: @@ -347,7 +403,7 @@ def search_for_match(system_drive,known_drive_list):  def prompt_to_add(current_drive):      loop = True      while loop: -        str1 = raw_input("     Adding the drive will remove all contents on the drive. \n\nDo you wish enable this drive for MythTV storage(Y/N)?:") +        str1 = raw_input("\n    Adding the drive will remove all contents on the drive. \n    Do you wish enable this drive for MythTV storage(Y/N)?:")          if str1 in ['Y','N','y','n']:              loop = False @@ -361,8 +417,7 @@ def prompt_to_add(current_drive):  def remove_pickle():      try: -        print "Resetting list of known drives." - +        print "* Resetting list of known drives."          os.remove(pickle_file)      except:          pass @@ -390,23 +445,27 @@ def main(scan_only):          #print "--"          if search_for_match(i,known_drive_list) or i.in_use : -            print "    Storage is already in use or previously skipped: %s location: %s size: %s" %(i.model,i.block_path,i.device_size) +            print "\n" +            print "    Storage is already in use or previously skipped:%s" %i.model +            print "        location: %s" %i.block_path +            print "        size: %s" %i.device_size              continue          else: -            print "\n"              if not scan_only:                  print "\n"                  print "-------------------------------------------------------------" - -                print "Found new hard drive: %s location: %s size: %s \n" %(i.model,i.block_path,i.device_size) +                print "    Found new hard drive: %s" %i.model +                print "    location: %s" %i.block_path +                print "    size: %s " %i.device_size                  if prompt_to_add(i) : -                    print "\nDisk will be added to the storage pool!" +                    print "\n    Disk will be added to the storage pool!"                      process_list.append(i)              else:                  process_list.append(i) - +    print "    End of scan" +    print "---------------------------------------"      if scan_only:          if len(process_list) > 0:              f = open('/tmp/scan_report', 'w') @@ -427,20 +486,78 @@ def main(scan_only):      #save new list to disk_device      write_known_drive_list(system_drive_list) - +    if len(process_list) > 0: +        print "\n    Adding storage: \n"      for i in process_list: +        print "    Drive: %s" %(i.get_name())          i.partition_disk()          i.format_disk()          i.add_fstab()          i.mount_disk()          i.mkdirs(FS_LIST) +        i.write_config()          i.add_sg(DB,host,SG_MAP) +        print "-----" + +        #i.add_sg(DB,host,SG_MAP) + +def myth_main(): +    global bus +    bus = dbus.SystemBus() +    #search for root +    f = open('/etc/fstab', 'r') +    fstab=f.readlines() +    f.close() +    for i in fstab: +        split_line=i.split() +        if not split_line: +            continue + +        try: +            if split_line[1] ==  "/" : +                uuid_device = split_line[0] +                break +        except: +            print "Couldn't find / in fstab" +            sys.exit(1) +    if uuid_device.startswith("UUID"): +        uuid_device = uuid_device.split("=")[1] +        cmd = "blkid -U %s" %uuid_device +        device = runcmd(cmd)[1] +    else: +        device = uuid_device.strip() +    #should have something like /dev/sda1 +    #remove all the digits +    device = ''.join([letter for letter in device if not letter.isdigit()]) + + +    system_drive_list = scan_system() +    for i in system_drive_list: +        if i.block_path == device: +            break +    else: +        print "Could'nt find root device in block list" +        sys.exit(1) + +    DB = MythDB() +    host=gethostname() + +    print "    Drive: %s" %(i.get_name()) +    i.set_mmount(True) +    i.set_partition("3") +    i.add_fstab() +    i.mount_disk() +    i.write_config() +    i.add_sg(DB,host,SG_MAP,'99') +    i.symlink() +  if __name__ == "__main__":      scan_only = False +    myth_mount = False      try:          os.remove("/tmp/scan_report")      except: @@ -455,7 +572,10 @@ if __name__ == "__main__":      if "--report" in sys.argv :          scan_only = True -    main(scan_only) +    if "--double_myth" in sys.argv: +        myth_main() +    else: +        main(scan_only) diff --git a/abs/core/LinHES-system/add_storage.readme b/abs/core/LinHES-system/add_storage.readme new file mode 100644 index 0000000..226b14d --- /dev/null +++ b/abs/core/LinHES-system/add_storage.readme @@ -0,0 +1,3 @@ +Files here are autogenerated by add_storage.py. +They will be used by systemconfig to generate nfs,smb and mountpoint recovery. + | 
