From 01740e9b44790cc449ce7a2f414bc9ba062f2d83 Mon Sep 17 00:00:00 2001 From: Britney Fransen Date: Tue, 5 Nov 2013 17:42:22 -0600 Subject: LinHES-system: add_storage.py: add fstype to conf file on install and if it is missing add it. closes #934 other cosmetic changes and clarifications --- abs/core/LinHES-system/PKGBUILD | 4 +- abs/core/LinHES-system/add_storage.py | 187 ++++++++++++++++++++++------------ 2 files changed, 125 insertions(+), 66 deletions(-) diff --git a/abs/core/LinHES-system/PKGBUILD b/abs/core/LinHES-system/PKGBUILD index c8d791e..a28ecfa 100755 --- a/abs/core/LinHES-system/PKGBUILD +++ b/abs/core/LinHES-system/PKGBUILD @@ -1,6 +1,6 @@ pkgname=LinHES-system pkgver=8.0 -pkgrel=30 +pkgrel=31 arch=('i686' 'x86_64') install=system.install pkgdesc="Everything that makes LinHES an automated system" @@ -94,7 +94,7 @@ md5sums=('5ee78704cab0e88ec58d1aab821fc1aa' 'bc69a520add58ede9b060c73e67ace13' '26fdd26e945f0c187f9fdcf98a7a5bef' '47e093e8cfe4b5b96602358e1f540832' - 'a8e486f5d23913242b6edb862bf44c0e' + '2cc4a31e086f2370439156b027dec7cd' '2c005d95312018bef80092136f80f254' '6519d209e151cdc39ae7e1091d189c3e' '8f474e019d5fcb775497aca355d61b0b' diff --git a/abs/core/LinHES-system/add_storage.py b/abs/core/LinHES-system/add_storage.py index 1f166b1..72056f8 100644 --- a/abs/core/LinHES-system/add_storage.py +++ b/abs/core/LinHES-system/add_storage.py @@ -1,8 +1,9 @@ #!/usr/bin/python2 -#Program used to auto_add new storage to mythtv storage groups -#If it's a new disk it will erase the entire disk and reformat +#add_storage.py used to auto add new storage to MythTV storage groups +#If it's a new disk it will erase the entire disk and reformat. # -#Drives that are mount, in fstab, size < 5000 bytes, optical or have already been seen will not be presented as an option. +#Disks that are mounted, in fstab, size < 5000 bytes, optical or +#have already been seen will not be presented as an option. # @@ -290,8 +291,10 @@ class disk_device: return def mkdirs(self,FS_LIST): - print " Creating Directory stucture" + print " Creating directory structure:" + print " %s" %self.new_mount_point for y in FS_LIST: + print " %s" %y new_dir="%s/%s" %(self.new_mount_point,y) try: os.stat(new_dir) @@ -319,7 +322,7 @@ class disk_device: 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) + print " Adding location: %s to storagegroup %s" %(dn,gn) except: print " *Error inserting %s into storage groups" %dn @@ -339,10 +342,11 @@ class disk_device: return def write_config(self): - print " Writing out storage.d conf file" + print " Writing /etc/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','fstype',self.new_fstype) self.config.set('storage','shareable','True') self.config.set('storage','mmount',self.mmount) self.config.set('storage','disk_num',self.disk_num) @@ -352,24 +356,25 @@ class disk_device: self.serial_number.replace(' ','')) configfile="/etc/storage.d/%s" %filename - print " %s" %configfile + print " %s" %configfile with open(configfile, 'wb') as configfile: self.config.write(configfile) return def symlink_disk(self): - print " Creating symlink for disk number" + print " Creating symlink for disk%s" %self.disk_num disk_ln="%s/disk%s" %(self.top_mount_dir,self.disk_num) cmd = "ln -s %s %s" %(self.new_mount_point,disk_ln) - print cmd runcmd(cmd) def symlink(self): pass - print " Creating symlink" - cmd = "ln -s %s/media /myth " %(self.new_mount_point) - runcmd(cmd) - + print " Creating symlink for /myth" + if not os.path.exists("/myth"): + cmd = "ln -s %s/media /myth " %(self.new_mount_point) + runcmd(cmd) + else: + print " Skipping symlink, /myth already exists" #end of class @@ -442,16 +447,15 @@ def prompt_to_add(current_drive,destruction = True): loop = True if destruction : prompt = ''' - Adding the drive will remove all contents on the drive. + Adding the disk will remove all contents on the disk. - Do you wish enable this drive for MythTV storage(Y/N)?: - ''' + Do you wish enable this disk for MythTV storage(Y/N)?:''' else: prompt = ''' ** Preserving existing data ** will not format or partition - Do you wish enable this drive for MythTV storage(Y/N)?: + Do you wish enable this disk for MythTV storage(Y/N)?: ''' while loop: str1 = raw_input(prompt) @@ -470,7 +474,7 @@ def prompt_to_continue(): loop = True #while loop: print "\n\n\n\n" - str1 = raw_input("\n Ready to add additional storage!\n Press Y to continue, anything else to abort:") + str1 = raw_input("\n Ready to add additional storage!\n Press Y to add disk(s), anything else to abort:") #if str1 in ['Y','N','y','n']: # loop = False @@ -487,15 +491,15 @@ def prompt_sg(dir_be_sg,dir_fe_sg): #check for backend storage groups if dir_be_sg != True: loop = True - print "*" * 40 + print "*" * 60 prompt_string=''' - Backend Storage Groups are used for things like - TV Recordings and database backups. + Backend Storage Groups are used for + database backups, TV recordings and streaming. The content on these storage groups will only be available while the system is online. - Do you wish enable this system for Backend Storage Groups(Y/N)?:''' + Do you wish enable Backend Storage Groups(Y/N)?:''' while loop: str1 = raw_input(prompt_string) @@ -514,13 +518,15 @@ def prompt_sg(dir_be_sg,dir_fe_sg): #now for frontend storage groups if dir_fe_sg != True: loop = True + print "" print "+" * 20 prompt_string=''' - Frontend Storage Groups are used for videos. + Frontend Storage Groups are used for artwork and videos. + The content on these storage groups will only be available while the system is online. - Do you wish enable this system for Frontend Storage Groups(Y/N)?:''' + Do you wish enable Frontend Storage Groups(Y/N)?:''' while loop: str1 = raw_input(prompt_string) if str1 in ['Y','N','y','n']: @@ -535,11 +541,14 @@ def prompt_sg(dir_be_sg,dir_fe_sg): dir_fe_sg = False print " ** Will NOT add Frontend Storage Groups!" + print "" + print "*" * 60 + return dir_be_sg,dir_fe_sg def remove_pickle(): try: - print "* Resetting list of known drives." + print "* Resetting list of known disks." os.remove(pickle_file) except: pass @@ -565,6 +574,8 @@ def main(scan_only, destruction, no_mount, install_call , dir_fe_sg, dir_be_sg): process_list=[] no_process_list=[] + print "-" * 60 + print " Scan for Disks" for i in system_drive_list: #print i.mount_path @@ -575,8 +586,16 @@ def main(scan_only, destruction, no_mount, install_call , dir_fe_sg, dir_be_sg): #print "--" if search_for_match(i,known_drive_list) or i.in_use : + if search_for_match(i,known_drive_list) : + dstatus = " Ignoring - Disk has been previously skipped:" + if i.in_use : + dstatus = " Ignoring - Disk is mounted:" + if search_for_match(i,known_drive_list) and i.in_use : + dstatus = " Ignoring - Disk has been previously skipped and is mounted:" + print "\n" - print " Storage is already in use or previously skipped:%s" %i.model + print dstatus + print " model: %s" %i.model print " location: %s" %i.block_path print " size: %s" %i.device_size continue @@ -584,10 +603,11 @@ def main(scan_only, destruction, no_mount, install_call , dir_fe_sg, dir_be_sg): else: if not scan_only: print "\n" - print "-------------------------------------------------------------" - print " Found new hard drive: %s" %i.model - print " location: %s" %i.block_path - print " size: %s " %i.device_size + print " --------------------------------------------------------" + print " Found new disk:" + print " model: %s" %i.model + print " location: %s" %i.block_path + print " size: %s " %i.device_size if prompt_to_add(i,destruction) : print "\n Disk will be added to the storage pool!" @@ -596,15 +616,22 @@ def main(scan_only, destruction, no_mount, install_call , dir_fe_sg, dir_be_sg): no_process_list.append(i) else: process_list.append(i) - print " End of scan" - print "---------------------------------------" + print "\n" + print " End of Scan" + print "-" * 60 if scan_only: if len(process_list) > 0: + print " Unknown or unmounted disks:" f = open('/tmp/scan_report', 'w') for i in process_list: - f.write("drive: %s , location: %s ,size: %s \n" %(i.model,i.block_path,i.device_size)) - print "drive: %s , location: %s ,size: %s \n" %(i.model,i.block_path,i.device_size) + f.write("disk: %s , location: %s ,size: %s \n" %(i.model,i.block_path,i.device_size)) + print "\n" + print " ---------------------------------------------------------" + print " Found new disk:" + print " model: %s" %i.model + print " location: %s" %i.block_path + print " size: %s " %i.device_size f.close() sys.exit(0) @@ -619,7 +646,7 @@ def main(scan_only, destruction, no_mount, install_call , dir_fe_sg, dir_be_sg): system_drive_list.remove(y) write_known_drive_list(system_drive_list) else: - print "\nDid not find any new storage to add.\n" + print "\nDid not find any new disks to add.\n" write_known_drive_list(system_drive_list) #BE = MythBE(db=DB) @@ -630,14 +657,14 @@ def main(scan_only, destruction, no_mount, install_call , dir_fe_sg, dir_be_sg): if len(process_list) > 0: - print " Will add %s disks to systems" %len(process_list) + print "\n Will add %s disk(s) to your system." %len(process_list) dir_be_sg , dir_fe_sg = prompt_sg(dir_be_sg,dir_fe_sg) if prompt_to_continue() == True: write_known_drive_list(system_drive_list) disk_num = last_disk_num() for i in process_list: - print " Drive: %s" %(i.get_name()) + print " Disk: %s" %(i.get_name()) disk_num = disk_num + 1 if destruction == True: i.partition_disk() @@ -713,7 +740,7 @@ def myth_main(no_mount,install_call,dir_fe_sg): host=gethostname() - print " Drive: %s" %(i.get_name()) + print " Disk: %s" %(i.get_name()) i.set_mmount(True) i.set_partition("7") i.set_disk_num(0) @@ -736,7 +763,7 @@ class reconstruct_path: self.conf_file = conf_file parser = SafeConfigParser() parser.read(self.conf_file) - + self.config = ConfigParser.RawConfigParser() self.uuid = parser.get('storage', 'uuid') self.mount_point = parser.get('storage', 'mountpoint') @@ -745,9 +772,22 @@ class reconstruct_path: self.bind = self.myth_mount self.disk_num = parser.get('storage', 'disk_num') self.top_mount_dir = os.path.dirname(self.mount_point) + try: + self.fstype = parser.get('storage', 'fstype') + except: + self.fstype = self.get_fstype() + + def get_fstype(self): + cmd = "fsck -N UUID=%s" %self.uuid + tmpfstype = runcmd(cmd) + tmpfstype = tmpfstype[1].split('/sbin/fsck.') + tmpfstype = tmpfstype[1].split(' ') + self.fstype = tmpfstype[0] + self.write_config() + return self.fstype def get_conf(self): - return self.conf_file + return self.conf_file def get_uuid(self): return self.uuid @@ -809,15 +849,15 @@ class reconstruct_path: f.close() def symlink(self): - print " Creating symlink" + print " Creating symlink for /myth" if not os.path.exists("/myth"): cmd = "ln -s %s/media /myth " %(self.mount_point) runcmd(cmd) else: - print " Skipping symlink, path already present" + print " Skipping symlink, /myth already exists" def symlink_disk(self): - print " Creating symlink for disk number" + print " Creating symlink for disk%s" %self.disk_num disk_ln="%s/disk%s" %(self.top_mount_dir,self.disk_num) cmd = "ln -s %s %s" %(self.mount_point,disk_ln) runcmd(cmd) @@ -825,14 +865,14 @@ class reconstruct_path: def add_fstab(self): #new_fstab_list=['UUID=', 'mount_point', 'auto', 'defaults', '0', '1'] - new_fstab_list=['UUID=', 'mount_point', self.new_fstype, 'defaults', '0', '1'] + new_fstab_list=['UUID=', 'mount_point', self.fstype, 'defaults', '0', '1'] fstab=self.read_fstab() if self.bind == "True": self.symlink() if self.check_in_fstab(fstab,self.uuid) == True: - print " Found storage in fstab, will not add it" + print " Found disk in fstab, will not add it" else: print " Adding storage to fstab" if self.bind == "True" : @@ -861,8 +901,23 @@ class reconstruct_path: runcmd(cmd) return + def write_config(self): + print " Writing /etc/storage.d conf file" + self.config.add_section('storage') + self.config.set('storage','uuid',self.uuid) + self.config.set('storage','mountpoint',self.mount_point) + self.config.set('storage','fstype',self.fstype) + self.config.set('storage','shareable','True') + self.config.set('storage','mmount',self.myth_mount) + self.config.set('storage','disk_num',self.disk_num) + + print " %s" %self.conf_file + with open(self.conf_file, 'wb') as self.conf_file: + self.config.write(self.conf_file) + return + def reconstruct_mounts(no_mount): - print "Recreating devices based on contents of /etc/storage.d" + print "Recreating disks based on contents of /etc/storage.d" for conf_file in glob.glob('%s/*.conf' %storage_dir): print "\n" cf = reconstruct_path(conf_file) @@ -883,26 +938,34 @@ def reconstruct_mounts(no_mount): def usage(): - help='''\n - Add storage is designed to find and setup new disks for mythtv usage. - It's a powerfull tool that could destroy data if not used correctly, so please be careful. + help=''' + add_storage.py finds and sets up disks for MythTV usage. + It's a powerful tool that could destroy data if not used correctly, + so please be careful. + + The file system type for disks added by add_storage.py is + automatically set to the type you selected at install. + Normal operations include (in this order): Partition the disk Format the disk Add disk to /etc/fstab Mount the disk - Create the directory + Create the directories Write out the config file to /etc/storage.d - Add new locations to mythtv storage groups - - options: - - --no_mount : Do not mount the disk, only add it to /etc/fstab and create the dir. - --no_destruction: Will not partition or format the disk. This can be used to import disks from other systems. - --new_init : Erase the list of new disks and rescan. - --report : will scan the disks and print out if it found new storage. - --add_fe_sg : Will only create the storage group dir for videos..excludes tv - --add_be_sg : Will only create the storage group dir for TV, backups, streaming + Add new locations to MythTV storage groups + + Options: + --no_mount: Do not mount the disk, only add it to /etc/fstab + and create the directory. + --no_destruction: Will not partition or format the disk. + This can be used to import disks from other systems. + --new_init: Erase the list of new disks and rescan. + --report: Scan disks and print new found disks. + --add_fe_sg: Create the storage group directories for artwork + and video. Excludes backup, tv and streaming. + --add_be_sg: Create the storage group directories for backup, + tv and streaming. ''' print help sys.exit(0) @@ -961,7 +1024,3 @@ if __name__ == "__main__": reconstruct_mounts(no_mount) else: main(scan_only,destruction,no_mount, install_call, dir_fe_sg, dir_be_sg) - - - - -- cgit v0.12