summaryrefslogtreecommitdiffstats
path: root/abs/core/LinHES-system
diff options
context:
space:
mode:
Diffstat (limited to 'abs/core/LinHES-system')
-rwxr-xr-xabs/core/LinHES-system/PKGBUILD8
-rw-r--r--abs/core/LinHES-system/add_storage.py426
2 files changed, 431 insertions, 3 deletions
diff --git a/abs/core/LinHES-system/PKGBUILD b/abs/core/LinHES-system/PKGBUILD
index ef5b2e8..0640a39 100755
--- a/abs/core/LinHES-system/PKGBUILD
+++ b/abs/core/LinHES-system/PKGBUILD
@@ -1,12 +1,12 @@
pkgname=LinHES-system
pkgver=2
-pkgrel=22
+pkgrel=24
arch=('i686')
MVDIR=$startdir/pkg/usr/LH
BINDIR=$startdir/pkg/usr/bin
install=LinHES.install
pkgdesc="scripts and things related to having an automated system"
-depends=(linhes-sounds xdotool fluxbox tilda keylaunch python_aosd 'linhes-scripts>=7-24' 'runit-scripts>=2.1.1-43')
+depends=(linhes-sounds xdotool fluxbox tilda keylaunch python_aosd 'linhes-scripts>=7-24' 'runit-scripts>=2.1.1-43','udisks')
backup=(etc/modprobe.d/alsa-base)
binfiles="LinHES-start optimize_mythdb.py
myth_mtc.py myth_mtc.sh LinHES-run
@@ -18,7 +18,8 @@ binfiles="LinHES-start optimize_mythdb.py
lh_system_backup_job
lh_system_restore_job
lh_system_host_update
- lh_system_all_host_update"
+ lh_system_all_host_update
+ add_storage.py"
source=(LinHES-session LinHES-profile.sh $binfiles alsa-base myth_mtc.lr)
@@ -69,5 +70,6 @@ md5sums=('71a1fc9b01476b0b2c30596107eeff75'
'9c2294ccfd5359583497a6b03d918a27'
'859a80ddb4c234506379c605114c1343'
'47e093e8cfe4b5b96602358e1f540832'
+ 'a69c93ee6c927d5c08172cc9515d8f32'
'eb879fee9603a05d5420d4ce8ed9e450'
'f1870a9522c79e6b248fcbf81dec3280')
diff --git a/abs/core/LinHES-system/add_storage.py b/abs/core/LinHES-system/add_storage.py
new file mode 100644
index 0000000..9b20546
--- /dev/null
+++ b/abs/core/LinHES-system/add_storage.py
@@ -0,0 +1,426 @@
+#!/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
+#
+#Drives that are mount, in fstab, size < 5000 bytes, optical or have already been seen will not be presented as an option.
+#
+
+
+import dbus
+import pickle
+import commands
+import sys,os
+import random, string
+from MythTV import MythDB, MythBE, Recorded, MythError
+from socket import timeout, gethostname
+
+
+
+pickle_file="/usr/LH/etc/storage.pkl"
+
+
+
+SG_MAP={ 'Default' :'tv',
+ 'LiveTV' :'live_tv',
+ 'Videos' :'video',
+ 'Trailers' :'video/trailers',
+ 'Coverart' :'video/converart',
+ 'Fanart' :'video/fanart',
+ 'Banners' :'video/banners',
+ 'Screenshots':'video/screenshots',
+ 'DB Backups' :'db_backups'}
+FS_LIST=[]
+for key in SG_MAP.keys():
+ FS_LIST.append(SG_MAP[key])
+
+
+
+class disk_device:
+ def __init__(self,device):
+ device_obj = bus.get_object("org.freedesktop.UDisks", device)
+ device_props = dbus.Interface(device_obj, dbus.PROPERTIES_IFACE)
+ 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.is_mounted = self.get_is_mounted(device_props)
+
+ self.parition_size = self.get_partition_size(device_props)
+ self.device_size = self.get_device_size(device_props)
+ self.serial_number = self.get_serial_number(device_props)
+ self.read_only = self.get_is_readonly(device_props)
+ self.is_optical = self.get_is_optical_disc(device_props)
+ self.connection = self.get_connections(device_props)
+ self.block_path = self.get_device_file(device_props)
+ 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()
+
+
+ def get_is_device(self,device_props):
+ return device_props.Get('org.freedesktop.UDisks.Device', "DeviceIsDrive")
+
+ def get_vendor(self,device_props):
+ return device_props.Get('org.freedesktop.UDisks.Device', "DriveVendor")
+
+ def get_model(self,device_props):
+ return device_props.Get('org.freedesktop.UDisks.Device', "DriveModel")
+
+ def get_mounts(self,device_props):
+ return device_props.Get('org.freedesktop.UDisks.Device', "DeviceMountPaths")
+
+ def get_is_mounted(self,device_props):
+ return device_props.Get('org.freedesktop.UDisks.Device', "DeviceIsMounted")
+
+ def get_in_use(self):
+ in_use = False
+ for i in self.fs_map:
+ if i.startswith("["):
+ split_line=i.split()
+ device_path = split_line[5]
+ if self.block_path in device_path:
+ in_use = True
+ break
+ return in_use
+
+
+ def get_partition_size(self,device_props):
+ return device_props.Get('org.freedesktop.UDisks.Device', "PartitionSize")
+
+ def get_device_size(self,device_props):
+ return device_props.Get('org.freedesktop.UDisks.Device', "DeviceSize")
+
+
+ def get_serial_number(self,device_props):
+ serial_number = device_props.Get('org.freedesktop.UDisks.Device', "DriveSerial")
+ random_string = os.urandom(5)
+ if serial_number == '':
+ serial_number = "".join( [random.choice(string.letters) for i in xrange(6)] )
+ serial_number = "NSW%s" %serial_number
+ return serial_number
+
+ def get_is_readonly(self,device_props):
+ return device_props.Get('org.freedesktop.UDisks.Device', "DeviceIsReadOnly")
+
+ def get_is_optical_disc(self,device_props):
+ return device_props.Get('org.freedesktop.UDisks.Device', "DeviceIsOpticalDisc")
+
+ def get_connections(self,device_props):
+ return device_props.Get('org.freedesktop.UDisks.Device', "DriveConnectionInterface")
+
+ def get_device_file(self,device_props):
+ return device_props.Get('org.freedesktop.UDisks.Device', "DeviceFile")
+
+ def get_device_file_path(self,device_props):
+ path = device_props.Get('org.freedesktop.UDisks.Device', "DeviceFileByPath")
+ try:
+ path = path[0]
+ except:
+ path = "None"
+
+ return path
+
+
+ def partition_disk(self):
+ print " Creating new partiton table"
+ cmd = "parted -s -a optimal %s mklabel gpt" %self.block_path
+ runcmd(cmd)
+ cmd = "parted -s -a optimal %s mkpart primary \" 1 -1\"" %self.block_path
+ runcmd(cmd)
+ return
+
+ def get_fsmap(self):
+ cmd = "/sbin/fsck -N"
+ fs_map = runcmd(cmd)[1]
+ fs_map = fs_map.split("\n")
+ return fs_map
+
+ def find_fstype(self,moutpoint):
+ fstype="ext3"
+ mp=['/myth', '/data/media']
+ for i in self.fs_map:
+ if i.startswith("["):
+ split_line=i.split()
+ #find mount_p and remove the last char
+ mount_p = split_line[3][:-1]
+ if mount_p in mp:
+ fstype = split_line[4].split(".")[1]
+ break
+ return fstype
+
+
+ def format_disk(self):
+ fstab = self.read_fstab()
+ #lookup format
+ current_media_mount = self.find_options_type(fstab)[1]
+ new_fstype = self.find_fstype(current_media_mount)
+
+ #do format
+ cmd = "mkfs -t %s %s " %(new_fstype,self.block_partition)
+ print " Formating %s with %s" %(self.block_partition,new_fstype)
+ runcmd(cmd)
+ return
+
+ def find_uuid(self,partition):
+ #logging.info("Finding the UUID for %s...", partition)
+ cmd = "blkid -s UUID %s" %partition
+ tmpuuid = runcmd(cmd)[1]
+ splituuid = tmpuuid.partition("=")
+ uuid = splituuid[2].replace('"', "")
+ # logging.info("The uuid is %s", uuid)
+ if uuid == '':
+ print "Could not find a UUID for device: %s" %partition
+ sys.exit(1)
+
+ return uuid.strip()
+
+ def read_fstab(self):
+ f = open('/etc/fstab', 'r')
+ fstab=f.readlines()
+ f.close()
+ return fstab
+
+ def find_options_type(self,fstab):
+ mp=['/myth', '/data/media']
+ for i in fstab:
+ split_line=i.split()
+ try:
+ if split_line[1] in mp:
+ options = split_line[3]
+ break
+ else:
+ options = "defaults"
+ mount_point = i
+ except:
+ options = "defaults"
+ return options,i
+
+
+ def add_fstab(self):
+ new_fstab_list=['UUID=', 'mount_point', 'auto', 'defaults', '0', '1']
+ fstab=self.read_fstab()
+
+ #determine mount_path
+ self.new_mount_point="/data/media/%s_%s" %(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
+ uuid=self.find_uuid(self.block_partition)
+
+ #construct new line
+ new_fstab_list[0]="UUID=%s" %uuid
+ new_fstab_list[1]=self.new_mount_point
+ new_fstab_list[3]=new_options
+
+ new_fstab_line='\t'.join(new_fstab_list)
+ new_fstab_line="%s\n" %new_fstab_line
+ fstab.append(new_fstab_line)
+
+ #add line to fstab
+ f = open('/etc/fstab', 'w')
+ #f = open('/tmp/fstab', 'w')
+ for i in fstab:
+ f.write(i)
+ #f.write("\n")
+ f.close()
+ return
+
+ def mount_disk(self):
+ try:
+ os.stat(self.new_mount_point)
+ except:
+ os.makedirs(self.new_mount_point)
+ cmd = "mount %s" %self.new_mount_point
+ runcmd(cmd)
+ return
+
+ def mkdirs(self,FS_LIST):
+ print " Creating Directory stucture"
+ for y in FS_LIST:
+ new_dir="%s/%s" %(self.new_mount_point,y)
+ try:
+ os.stat(new_dir)
+ except:
+ os.makedirs(new_dir)
+ cmd="chown -R mythtv:mythtv /%s" %self.new_mount_point
+ runcmd(cmd)
+ cmd="chmod -R 775 /%s" %self.new_mount_point
+ runcmd(cmd)
+
+ def add_sg(self,DB,host,SG_MAP):
+ print " Adding to storage groups"
+ 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:
+ 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
+ return
+
+
+
+def runcmd(cmd):
+ if True :
+ pass
+ else:
+ cmd = "echo "+cmd
+ #print cmd
+ cmdout = commands.getstatusoutput(cmd)
+ #logging.debug(" %s", cmdout)
+ return cmdout
+
+
+
+
+def scan_system():
+
+ ud_manager_obj = bus.get_object("org.freedesktop.UDisks", "/org/freedesktop/UDisks")
+ ud_manager = dbus.Interface(ud_manager_obj, 'org.freedesktop.UDisks')
+ current_drive_list=[]
+ for dev in ud_manager.EnumerateDevices():
+ drive = disk_device(dev)
+
+ if drive.is_device and drive.device_size > 5000 and not drive.is_optical :
+ current_drive_list.append(drive)
+ return current_drive_list
+
+def read_known_list():
+ #reading pickle file
+ known_drive_list=[]
+ try:
+ pkl_file = open(pickle_file, 'rb')
+ known_drive_list = pickle.load(pkl_file)
+ pkl_file.close()
+ except:
+ pass
+ return known_drive_list
+
+
+def write_known_drive_list(known_drive_list):
+ output = open(pickle_file, 'wb')
+ pickle.dump(known_drive_list, output, -1)
+ output.close()
+
+
+def search_for_match(system_drive,known_drive_list):
+ match_drive=False
+ for y in known_drive_list:
+ if system_drive.serial_number.startswith("NSW"):
+ #print "Match_test: hash"
+ system_drive_hash = "%s_%s_%s" %(system_drive.model,system_drive.parition_size,system_drive.device_file_path)
+ 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
+ break
+
+ elif y.serial_number == system_drive.serial_number:
+ #print "Match_test: serial number"
+ match_drive=True
+ break
+
+ return match_drive
+
+
+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)?:")
+
+ if str1 in ['Y','N','y','n']:
+ loop = False
+ break
+ print "\n"
+ if str1 == 'Y' or str1 == 'y':
+ rc = True
+ else:
+ rc = False
+ return rc
+
+def remove_pickle():
+ try:
+ print "Resetting list of known drives."
+
+ os.remove(pickle_file)
+ except:
+ pass
+
+
+#--------------------------------------------
+
+def main():
+ global bus
+ bus = dbus.SystemBus()
+
+ system_drive_list = scan_system()
+ known_drive_list=[]
+ known_drive_list = read_known_list()
+ process_list=[]
+
+
+
+ for i in system_drive_list:
+ #print i.mount_path
+ #print i.is_mounted
+ #print i.in_use
+ #print "--"
+
+ if search_for_match(i,known_drive_list) or i.in_use :
+ #print "Drive matched"
+ #print i.model
+ continue
+ else:
+ print "\n"
+ print "-------------------------------------------------------------"
+ print "Found new hard drive: %s location: %s size: %s \n" %(i.model,i.block_path,i.device_size)
+
+ if prompt_to_add(i) :
+ print "\nDisk will be added to the storage pool!"
+ process_list.append(i)
+
+ if len(process_list) > 0:
+ DB = MythDB()
+ host=gethostname()
+ else:
+ print "\nDid not find any new storage to add.\n"
+ #BE = MythBE(db=DB)
+
+ #save new list to disk_device
+ # write_known_drive_list(system_drive_list)
+
+ for i in process_list:
+ i.partition_disk()
+ i.format_disk()
+ i.add_fstab()
+ i.mount_disk()
+ i.mkdirs(FS_LIST)
+ i.add_sg(DB,host,SG_MAP)
+
+
+
+
+if __name__ == "__main__":
+ if not os.geteuid()==0:
+ sys.exit("\nRoot access is required to run this program\n")
+
+ if "--new_init" in sys.argv :
+ remove_pickle()
+ main()
+
+
+
+