diff options
author | Britney Fransen <brfransen@gmail.com> | 2017-03-09 19:52:37 (GMT) |
---|---|---|
committer | Britney Fransen <brfransen@gmail.com> | 2017-03-09 19:52:37 (GMT) |
commit | 90d2d0a5437b2c5d2eabcd02e90d241a069753ca (patch) | |
tree | 6f00a3721a007e6e71c9d5535c3bed59360307c8 /abs/core/LinHES-system/remove_storage.py | |
parent | 6872f58e91980db8ece16adb22eb5afbfd550b4d (diff) | |
download | linhes_pkgbuild-90d2d0a5437b2c5d2eabcd02e90d241a069753ca.zip linhes_pkgbuild-90d2d0a5437b2c5d2eabcd02e90d241a069753ca.tar.gz linhes_pkgbuild-90d2d0a5437b2c5d2eabcd02e90d241a069753ca.tar.bz2 |
LinHES-system: remove_storage.py: initial inclusion
add_storage.py: in reconstruct and reconstruct_sg add some checks for removed in .conf files
Diffstat (limited to 'abs/core/LinHES-system/remove_storage.py')
-rwxr-xr-x | abs/core/LinHES-system/remove_storage.py | 184 |
1 files changed, 184 insertions, 0 deletions
diff --git a/abs/core/LinHES-system/remove_storage.py b/abs/core/LinHES-system/remove_storage.py new file mode 100755 index 0000000..fd4c0b4 --- /dev/null +++ b/abs/core/LinHES-system/remove_storage.py @@ -0,0 +1,184 @@ +#!/usr/bin/python2 +#remove_storage.py removes disks that were added using add_storage.py +# +#Only disks that have a conf file in /etc/storage.d/ are presented +#as choices to remove. + + +import os,sys,commands +import ConfigParser +from ConfigParser import SafeConfigParser +import glob +from socket import gethostname +from MythTV import MythDB + +storage_dir = "/etc/storage.d" + +def runcmd(cmd): + if True : + pass + else: + cmd = "echo "+cmd + #print cmd + cmdout = commands.getstatusoutput(cmd) + #logging.debug(" %s", cmdout) + return cmdout + +def read_fstab(): + f = open('/etc/fstab', 'r') + fstab=f.readlines() + f.close() + return fstab + +def unmount_disk(conf): + if os.path.ismount(conf[1]): + print "Unmounting " + conf[1] + "." + cmd = "umount %s" %conf[1] + runcmd(cmd) + +def remove_fstab_entry(conf): + fstab=read_fstab() + f = open('/etc/fstab', 'w') + for line in fstab: + if not line.startswith("#"): + if line.find(conf[1]) > -1 and line.find(conf[2]) > -1 : + print "Removing " + conf[1] + " from fstab." + else: + f.write(line) + else: + f.write(line) + f.close() + +def remove_SG_entries(conf): + DB = MythDB() + host=gethostname() + with DB as c: + print "Removing " + conf[1] + " storage group\n paths from MythTV database." + c.execute("""delete from storagegroup where hostname = %s and dirname like %s""", (host,conf[1] + '%')) + c.execute("""delete from settings where hostname = %s and value like %s""", (host,'SGweightPerDir:' + host + ':' + conf[1] + '%')) + +def remove_disk_link(conf): + if os.path.islink("/data/storage/disk" + str(conf[0])): + print "Removing link /data/storage/disk%s." %(conf[0]) + cmd = "rm -f /data/storage/disk%s" %(conf[0]) + runcmd(cmd) + +def remove_disk_mount(conf): + print "Removing mountpoint %s." %(conf[1]) + cmd = "rm -rf %s" %(conf[1]) + runcmd(cmd) + +def update_conf_file(conf): + print "Updating %s file\n and running systemconfig." %(conf[4]) + parser = SafeConfigParser() + parser.read(conf[4]) + parser.set('storage','shareable',"False") + parser.set('storage','removed',"True") + with open(conf[4], 'wb') as conf[4]: + parser.write(conf[4]) + cmd = "systemconfig.py -m fileshare" + runcmd(cmd) + +def usage(): + help=''' + remove_storage.py removes disks that were added using add_storage.py. + Only disks that have a conf file in /etc/storage.d/ are presented + as choices to remove. + + Disks removed from the system are not erased or formatted. + + Normal operations include (in this order): + Ask which disk to remove + Unmount the disk if mounted + Remove disk from /etc/fstab + Remove MythTV storage group paths in MythTV database + Remove disk# symlink at /data/storage/ + Remove disk name mountpoint at /data/storage/ + Make shareable = False in /etc/storage.d/DISKNAME.conf + Add removed = True in /etc/stoarge.d/DISKNAME.conf + Run systemconfig.py -m fileshare to update File Shares + + Options: + -h, --help: Show this help message. + ''' + print help + sys.exit(0) + +#-------------------------------------------- + +def main(): + all_confs = [] + + # get conf files that are not disk0 or not removed + for conf_file in glob.glob('%s/*.conf' %storage_dir): + this_conf = [] + parser = SafeConfigParser() + parser.read(conf_file) + mounted = "" + disk_num = parser.get('storage', 'disk_num') + try: + removed = parser.get('storage', 'removed') + except: + removed = False + if disk_num == "0" or removed: + continue + this_conf.append(int(disk_num)) #0 + this_conf.append(parser.get('storage', 'mountpoint')) #1 + this_conf.append(parser.get('storage', 'uuid')) #2 + if os.path.ismount(this_conf[1]): + this_conf.append("(mounted)") #3 + else: + this_conf.append("") #3 + this_conf.append(conf_file) #4 + all_confs.append(this_conf) + + # sort confs on disk num + all_confs.sort(key=lambda x: x[0]) + + # exit if no disks found + if len(all_confs) == 0: + print "\nThere are no disks to remove. Exiting." + sys.exit(0) + + print "\nDisks found in /etc/storage.d/:\n" + + # print list of disks to remove + for i,conf in enumerate(all_confs): + print str(i+1) + ": " + conf[1] + " (disk" + str(conf[0]) + ") " + conf[3] + + # get user input of disk to remove + try: + conf_select=raw_input("\nEnter the number of the disk to remove: ") + conf_select=int(conf_select) + if conf_select > len(all_confs) or conf_select < 1: + conf_select=int("e") + except ValueError: + print "You must enter a number between 1 and " + str(len(all_confs)) + ". Exiting." + sys.exit(0) + + selected_conf = all_confs[conf_select-1] + + # confirm selection + confirm_select=raw_input("\nDisk " + selected_conf[1] + " (disk" + str(selected_conf[0]) + ") will be removed.\nAre you sure you want to remove it (yes/no)? ") + if confirm_select != "yes": + print "Exiting." + sys.exit(0) + + print "" + unmount_disk(selected_conf) + remove_fstab_entry(selected_conf) + remove_SG_entries(selected_conf) + remove_disk_link(selected_conf) + remove_disk_mount(selected_conf) + update_conf_file(selected_conf) + + print "\nDisk " + selected_conf[1] + " has been removed." + +if __name__ == "__main__": + if not os.geteuid()==0: + sys.exit("\nRoot access is required to run this program.\n") + + if "--help" in sys.argv or "-h" in sys.argv: + usage() + else: + main() |