diff options
Diffstat (limited to 'abs/core/LinHES-system')
| -rwxr-xr-x | abs/core/LinHES-system/PKGBUILD | 8 | ||||
| -rw-r--r-- | abs/core/LinHES-system/add_storage.py | 426 | 
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() + + + +  | 
