summaryrefslogtreecommitdiffstats
path: root/abs/core/LinHES-system/remove_storage.py
diff options
context:
space:
mode:
authorBritney Fransen <brfransen@gmail.com>2017-03-09 19:52:37 (GMT)
committerBritney Fransen <brfransen@gmail.com>2017-03-09 19:52:37 (GMT)
commit90d2d0a5437b2c5d2eabcd02e90d241a069753ca (patch)
tree6f00a3721a007e6e71c9d5535c3bed59360307c8 /abs/core/LinHES-system/remove_storage.py
parent6872f58e91980db8ece16adb22eb5afbfd550b4d (diff)
downloadlinhes_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-xabs/core/LinHES-system/remove_storage.py184
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()