From 19de887efbc24217f5d507d0c676de0f7d083ae7 Mon Sep 17 00:00:00 2001 From: Albert Santoni Date: Mon, 16 Mar 2015 14:51:57 -0400 Subject: [PATCH] Fixed airtime-import to work without the virtualenv --- utils/airtime-check-system | 13 - utils/airtime-check-system.php | 270 -------------------- utils/airtime-import/airtime-import | 331 ++++++++++++++++++++++++- utils/airtime-import/airtime-import.py | 326 ------------------------ 4 files changed, 318 insertions(+), 622 deletions(-) delete mode 100755 utils/airtime-check-system delete mode 100644 utils/airtime-check-system.php delete mode 100644 utils/airtime-import/airtime-import.py diff --git a/utils/airtime-check-system b/utils/airtime-check-system deleted file mode 100755 index 3c00235c2..000000000 --- a/utils/airtime-check-system +++ /dev/null @@ -1,13 +0,0 @@ -#!/bin/bash -#------------------------------------------------------------------------------- -# This script for a correct system environment for Airtime. -# -# Absolute path to this script -SCRIPT=`readlink -f $0` -# Absolute directory this script is in -SCRIPTPATH=`dirname $SCRIPT` - -invokePwd=$PWD -cd $SCRIPTPATH - -php -q airtime-check-system.php "$@" || exit 1 diff --git a/utils/airtime-check-system.php b/utils/airtime-check-system.php deleted file mode 100644 index 3a4816dcf..000000000 --- a/utils/airtime-check-system.php +++ /dev/null @@ -1,270 +0,0 @@ -status)) { - $data = $p_status->status; - } else { - $data = array(); - } - - if (isset($data->platform)) { - self::output_status("KERNEL_VERSION", $data->platform->release); - self::output_status("MACHINE_ARCHITECTURE", $data->platform->machine); - self::output_status("TOTAL_MEMORY_MBYTES", $data->platform->memory); - self::output_status("TOTAL_SWAP_MBYTES", $data->platform->swap); - self::output_status("AIRTIME_VERSION", $data->airtime_version); - } else { - self::output_status("KERNEL_VERSION", "UNKNOWN"); - self::output_status("MACHINE_ARCHITECTURE", "UNKNOWN"); - self::output_status("TOTAL_MEMORY_MBYTES", "UNKNOWN"); - self::output_status("TOTAL_SWAP_MBYTES", "UNKNOWN"); - self::output_status("AIRTIME_VERSION", "UNKNOWN"); - } - self::output_status("OS", self::CheckOsTypeVersion()); - self::output_status("CPU", self::GetCpuInfo()); - self::output_status("WEB_SERVER", self::GetServerType($p_baseUrl, $p_basePort)); - - if (isset($data->services)) { - $services = $data->services; - } else { - $services = array(); - } - - if (isset($services->pypo) && $services->pypo->process_id != "FAILED") { - self::output_status("PLAYOUT_ENGINE_PROCESS_ID", $data->services->pypo->process_id); - self::output_status("PLAYOUT_ENGINE_RUNNING_SECONDS", $data->services->pypo->uptime_seconds); - self::output_status("PLAYOUT_ENGINE_MEM_PERC", $data->services->pypo->memory_perc); - self::output_status("PLAYOUT_ENGINE_CPU_PERC", $data->services->pypo->cpu_perc); - } else { - self::output_status("PLAYOUT_ENGINE_PROCESS_ID", "FAILED"); - self::output_status("PLAYOUT_ENGINE_RUNNING_SECONDS", "0"); - self::output_status("PLAYOUT_ENGINE_MEM_PERC", "0%"); - self::output_status("PLAYOUT_ENGINE_CPU_PERC", "0%"); - $log = "/var/log/airtime/pypo/pypo.log"; - self::show_log_file($log); - - } - if (isset($services->liquidsoap) && $services->liquidsoap->process_id != "FAILED") { - self::output_status("LIQUIDSOAP_PROCESS_ID", $data->services->liquidsoap->process_id); - self::output_status("LIQUIDSOAP_RUNNING_SECONDS", $data->services->liquidsoap->uptime_seconds); - self::output_status("LIQUIDSOAP_MEM_PERC", $data->services->liquidsoap->memory_perc); - self::output_status("LIQUIDSOAP_CPU_PERC", $data->services->liquidsoap->cpu_perc); - } else { - self::output_status("LIQUIDSOAP_PROCESS_ID", "FAILED"); - self::output_status("LIQUIDSOAP_RUNNING_SECONDS", "0"); - self::output_status("LIQUIDSOAP_MEM_PERC", "0%"); - self::output_status("LIQUIDSOAP_CPU_PERC", "0%"); - $log = "/var/log/airtime/pypo-liquidsoap/ls_script.log"; - self::show_log_file($log); - } - if (isset($services->media_monitor) && $services->media_monitor->process_id != "FAILED") { - self::output_status("MEDIA_MONITOR_PROCESS_ID", $data->services->media_monitor->process_id); - self::output_status("MEDIA_MONITOR_RUNNING_SECONDS", $data->services->media_monitor->uptime_seconds); - self::output_status("MEDIA_MONITOR_MEM_PERC", $data->services->media_monitor->memory_perc); - self::output_status("MEDIA_MONITOR_CPU_PERC", $data->services->media_monitor->cpu_perc); - } else { - self::output_status("MEDIA_MONITOR_PROCESS_ID", "FAILED"); - self::output_status("MEDIA_MONITOR_RUNNING_SECONDS", "0"); - self::output_status("MEDIA_MONITOR_MEM_PERC", "0%"); - self::output_status("MEDIA_MONITOR_CPU_PERC", "0%"); - $log = "/var/log/airtime/media-monitor/media-monitor.log"; - self::show_log_file($log); - } - } - - if (self::$AIRTIME_STATUS_OK){ - self::output_comment("Your installation of Airtime looks OK!"); - exit(0); - } else { - self::output_comment("There appears to be a problem with your Airtime installation."); - self::output_comment("Please visit http://wiki.sourcefabric.org/x/HABQ"); - exit(1); - } - } - - public static function show_log_file($log) { - self::output_comment("Check the log file $log"); - self::output_comment(""); - } - - public static function output_comment($comment){ - if (!is_array($comment)) { - $comment = array($comment); - } - - foreach ($comment as $c) { - echo "-- $c".PHP_EOL; - } - - } - - public static function output_status($key, $value){ - global $showColor; - - $RED = "[0;31m"; - $ORANGE = "[0;33m"; - $GREEN = "[1;32m"; - - $color = $GREEN; - - if ($value == "FAILED"){ - $color = $RED; - self::$AIRTIME_STATUS_OK = false; - } else if ($value == "NOT MONITORED"){ - $color = $ORANGE; - self::$AIRTIME_STATUS_OK = false; - } - - if ($showColor) - echo sprintf("%-31s= %s", $key, self::term_color($value, $color)).PHP_EOL; - else - echo sprintf("%-31s= %s", $key, $value).PHP_EOL; - } - - public static function term_color($text, $color){ - - if($color == ""){ - $color = "[0m"; - } - - return chr(27)."$color$text".chr(27)."[0m"; - } -} diff --git a/utils/airtime-import/airtime-import b/utils/airtime-import/airtime-import index b42ae7a01..a878d7194 100755 --- a/utils/airtime-import/airtime-import +++ b/utils/airtime-import/airtime-import @@ -1,21 +1,326 @@ -#!/bin/bash +#!/usr/bin/python2 import sys +import os +import logging +from configobj import ConfigObj +from optparse import OptionParser, OptionValueError +from api_clients import api_client as apc +import json +import shutil +import commands -virtualenv_bin="/usr/lib/airtime/airtime_virtualenv/bin/" -. ${virtualenv_bin}activate +#sys.path.append('/usr/lib/airtime/media-monitor/mm2/') +from mm2.media.monitor.pure import is_file_supported -invokePwd=$PWD +# create logger +logger = logging.getLogger() -airtime_import_path="/usr/lib/airtime/utils/airtime-import/" -airtime_import_script="airtime-import.py" +# no logging +ch = logging.StreamHandler() +logging.disable(50) -api_client_path="/usr/lib/airtime/" -cd ${airtime_import_path} +# add ch to logger +logger.addHandler(ch) + +if (os.geteuid() != 0): + print 'Must be a root user.' + sys.exit() + +# loading config file +try: + config = ConfigObj('/etc/airtime/airtime.conf') +except Exception, e: + print('Error loading config file: %s', e) + sys.exit() + +api_client = apc.AirtimeApiClient(config) + +#helper functions +# copy or move files +# flag should be 'copy' or 'move' +def copy_or_move_files_to(paths, dest, flag): + try: + for path in paths: + if (path[0] == "/" or path[0] == "~"): + path = os.path.realpath(path) + else: + path = currentDir+path + path = apc.encode_to(path, 'utf-8') + dest = apc.encode_to(dest, 'utf-8') + if(os.path.exists(path)): + if(os.path.isdir(path)): + path = format_dir_string(path) + #construct full path + sub_path = [] + for temp in os.listdir(path): + sub_path.append(path+temp) + copy_or_move_files_to(sub_path, dest, flag) + elif(os.path.isfile(path)): + #copy file to dest + if(is_file_supported(path)): + destfile = dest+os.path.basename(path) + if(flag == 'copy'): + print "Copying %(src)s to %(dest)s..." % {'src':path, 'dest':destfile} + shutil.copyfile(path, destfile) + elif(flag == 'move'): + print "Moving %(src)s to %(dest)s..." % {'src':path, 'dest':destfile} + shutil.move(path, destfile) + else: + print "Cannot find file or path: %s" % path + except Exception as e: + print "Error: ", e + +def format_dir_string(path): + if(path[-1] != '/'): + path = path+'/' + return path + +def helper_get_stor_dir(): + try: + res = api_client.list_all_watched_dirs() + except Exception, e: + return res + + if(res['dirs']['1'][-1] != '/'): + out = res['dirs']['1']+'/' + return out + else: + return res['dirs']['1'] + +def checkOtherOption(args): + for i in args: + if(i[0] == '-'): + return True + +def errorIfMultipleOption(args, msg=''): + if(checkOtherOption(args)): + if(msg != ''): + raise OptionValueError(msg) + else: + raise OptionValueError("This option cannot be combined with other options") + +def printHelp(): + storage_dir = helper_get_stor_dir() + if(storage_dir is None): + storage_dir = "Unknown" + else: + storage_dir += "imported/" + print """ +======================== + Airtime Import Script +======================== +There are two ways to import audio files into Airtime: + +1) Use airtime-import to copy or move files into the storage folder. + + Copied or moved files will be placed into the folder: + %s + + Files will be automatically organized into the structure + "Artist/Album/TrackNumber-TrackName-Bitrate.file_extension". + +2) Use airtime-import to add a folder to the Airtime library ("watch" a folder). + + All the files in the watched folder will be imported to Airtime and the + folder will be monitored to automatically detect any changes. Hence any + changes done in the folder(add, delete, edit a file) will trigger + updates in Airtime library. +""" % storage_dir + parser.print_help() + print "" + +def CopyAction(option, opt, value, parser): + errorIfMultipleOption(parser.rargs) + if(len(parser.rargs) == 0 ): + raise OptionValueError("No argument found. This option requires at least one argument.") + stor = helper_get_stor_dir() + if(stor is None): + print "Unable to connect to the Airtime server." + return + dest = stor+"organize/" + copy_or_move_files_to(parser.rargs, dest, 'copy') + +def MoveAction(option, opt, value, parser): + errorIfMultipleOption(parser.rargs) + if(len(parser.rargs) == 0 ): + raise OptionValueError("No argument found. This option requires at least one argument.") + stor = helper_get_stor_dir() + if(stor is None): + exit("Unable to connect to the Airtime server.") + dest = stor+"organize/" + copy_or_move_files_to(parser.rargs, dest, 'move') + +def WatchAddAction(option, opt, value, parser): + errorIfMultipleOption(parser.rargs) + if(len(parser.rargs) > 1): + raise OptionValueError("Too many arguments. This option requires exactly one argument.") + elif(len(parser.rargs) == 0 ): + raise OptionValueError("No argument found. This option requires exactly one argument.") + path = parser.rargs[0] + if (path[0] == "/" or path[0] == "~"): + path = os.path.realpath(path) + else: + path = currentDir+path + path = apc.encode_to(path, 'utf-8') + if(os.path.isdir(path)): + #os.chmod(path, 0765) + try: + res = api_client.add_watched_dir(path) + except Exception, e: + exit("Unable to connect to the server.") + # sucess + if(res['msg']['code'] == 0): + print "%s added to watched folder list successfully" % path + else: + print "Adding a watched folder failed: %s" % res['msg']['error'] + print "This error most likely caused by wrong permissions" + print "Try fixing this error by chmodding the parent directory(ies)" + else: + print "Given path is not a directory: %s" % path + +def WatchListAction(option, opt, value, parser): + errorIfMultipleOption(parser.rargs) + if(len(parser.rargs) > 0): + raise OptionValueError("This option doesn't take any arguments.") + try: + res = api_client.list_all_watched_dirs() + except Exception, e: + exit("Unable to connect to the Airtime server.") + dirs = res["dirs"].items() + # there will be always 1 which is storage folder + if(len(dirs) == 1): + print "No watch folders found" + else: + for key, v in dirs: + if(key != '1'): + print v + +def WatchRemoveAction(option, opt, value, parser): + errorIfMultipleOption(parser.rargs) + if(len(parser.rargs) > 1): + raise OptionValueError("Too many arguments. This option requires exactly one argument.") + elif(len(parser.rargs) == 0 ): + raise OptionValueError("No argument found. This option requires exactly one argument.") + path = parser.rargs[0] + if (path[0] == "/" or path[0] == "~"): + path = os.path.realpath(path) + else: + path = currentDir+path + path = apc.encode_to(path, 'utf-8') + if(os.path.isdir(path)): + try: + res = api_client.remove_watched_dir(path) + except Exception, e: + exit("Unable to connect to the Airtime server.") + # sucess + if(res['msg']['code'] == 0): + print "%s removed from watch folder list successfully." % path + else: + print "Removing the watch folder failed: %s" % res['msg']['error'] + else: + print "The given path is not a directory: %s" % path + +def StorageSetAction(option, opt, value, parser): + bypass = False + isF = '-f' in parser.rargs + isForce = '--force' in parser.rargs + if(isF or isForce ): + bypass = True + if(isF): + parser.rargs.remove('-f') + if(isForce): + parser.rargs.remove('--force') + if(not bypass): + errorIfMultipleOption(parser.rargs, "Only [-f] and [--force] option is allowed with this option.") + possibleInput = ['y','Y','n','N'] + confirm = raw_input("Are you sure you want to change the storage direcory? (y/N)") + confirm = confirm or 'N' + while(confirm not in possibleInput): + print "Not an acceptable input: %s\n" % confirm + confirm = raw_input("Are you sure you want to change the storage direcory? (y/N) ") + confirm = confirm or 'N' + if(confirm == 'n' or confirm =='N'): + sys.exit(1) + + if(len(parser.rargs) > 1): + raise OptionValueError("Too many arguments. This option requires exactly one argument.") + elif(len(parser.rargs) == 0 ): + raise OptionValueError("No argument found. This option requires exactly one argument.") + + path = parser.rargs[0] + if (path[0] == "/" or path[0] == "~"): + path = os.path.realpath(path) + else: + path = currentDir+path + path = apc.encode_to(path, 'utf-8') + if(os.path.isdir(path)): + try: + res = api_client.set_storage_dir(path) + except Exception, e: + exit("Unable to connect to the Airtime server.") + # success + if(res['msg']['code'] == 0): + print "Successfully set storage folder to %s" % path + else: + print "Setting storage folder failed: %s" % res['msg']['error'] + else: + print "The given path is not a directory: %s" % path + +def StorageGetAction(option, opt, value, parser): + errorIfMultipleOption(parser.rargs) + if(len(parser.rargs) > 0): + raise OptionValueError("This option does not take any arguments.") + print helper_get_stor_dir() + +class OptionValueError(RuntimeError): + def __init__(self, msg): + self.msg = msg + +usage = """[-c|--copy FILE/DIR [FILE/DIR...]] [-m|--move FILE/DIR [FILE/DIR...]] + [--watch-add DIR] [--watch-list] [--watch-remove DIR] + [--storage-dir-set DIR] [--storage-dir-get]""" + +parser = OptionParser(usage=usage, add_help_option=False) +parser.add_option('-c','--copy', action='callback', callback=CopyAction, metavar='FILE', help='Copy FILE(s) into the storage directory.\nYou can specify multiple files or directories.') +parser.add_option('-m','--move', action='callback', callback=MoveAction, metavar='FILE', help='Move FILE(s) into the storage directory.\nYou can specify multiple files or directories.') +parser.add_option('--watch-add', action='callback', callback=WatchAddAction, help='Add DIR to the watched folders list.') +parser.add_option('--watch-list', action='callback', callback=WatchListAction, help='Show the list of folders that are watched.') +parser.add_option('--watch-remove', action='callback', callback=WatchRemoveAction, help='Remove DIR from the watched folders list.') +parser.add_option('--storage-dir-set', action='callback', callback=StorageSetAction, help='Set storage dir to DIR.') +parser.add_option('--storage-dir-get', action='callback', callback=StorageGetAction, help='Show the current storage dir.') +parser.add_option('-h', '--help', dest='help', action='store_true', help='show this help message and exit') + +# pop "--dir" +#sys.argv.pop(1) +# pop "invoked pwd" +currentDir = os.getcwd() #sys.argv.pop(1)+'/' + +if('-l' in sys.argv or '--link' in sys.argv): + print "\nThe [-l][--link] option is deprecated. Please use the --watch-add option.\nTry 'airtime-import -h' for more detail.\n" + sys.exit() +if('-h' in sys.argv): + printHelp() + sys.exit() +if(len(sys.argv) == 1 or '-' not in sys.argv[1]): + printHelp() + sys.exit() + +try: + (option, args) = parser.parse_args() +except Exception, e: + printHelp() + if hasattr(e, 'msg'): + print "Error: "+e.msg + else: + print "Error: ",e + sys.exit() +except SystemExit: + printHelp() + sys.exit() + +if option.help: + printHelp() + sys.exit() -exec 2>&1 -export PYTHONPATH=${api_client_path} -# Note the -u when calling python! we need it to get unbuffered binary stdout and stderr -exec python -u ${airtime_import_path}${airtime_import_script} --dir "$invokePwd" "$@" -# EOF diff --git a/utils/airtime-import/airtime-import.py b/utils/airtime-import/airtime-import.py deleted file mode 100644 index 0aba7d209..000000000 --- a/utils/airtime-import/airtime-import.py +++ /dev/null @@ -1,326 +0,0 @@ -import sys -import os -import logging -from configobj import ConfigObj -from optparse import OptionParser, OptionValueError -from api_clients import api_client as apc -import json -import shutil -import commands - -sys.path.append('/usr/lib/airtime/media-monitor/mm2/') -from media.monitor.pure import is_file_supported - -# create logger -logger = logging.getLogger() - -# no logging -ch = logging.StreamHandler() -logging.disable(50) - -# add ch to logger -logger.addHandler(ch) - -if (os.geteuid() != 0): - print 'Must be a root user.' - sys.exit() - -# loading config file -try: - config = ConfigObj('/etc/airtime/airtime.conf') -except Exception, e: - print('Error loading config file: %s', e) - sys.exit() - -api_client = apc.AirtimeApiClient(config) - -#helper functions -# copy or move files -# flag should be 'copy' or 'move' -def copy_or_move_files_to(paths, dest, flag): - try: - for path in paths: - if (path[0] == "/" or path[0] == "~"): - path = os.path.realpath(path) - else: - path = currentDir+path - path = apc.encode_to(path, 'utf-8') - dest = apc.encode_to(dest, 'utf-8') - if(os.path.exists(path)): - if(os.path.isdir(path)): - path = format_dir_string(path) - #construct full path - sub_path = [] - for temp in os.listdir(path): - sub_path.append(path+temp) - copy_or_move_files_to(sub_path, dest, flag) - elif(os.path.isfile(path)): - #copy file to dest - if(is_file_supported(path)): - destfile = dest+os.path.basename(path) - if(flag == 'copy'): - print "Copying %(src)s to %(dest)s..." % {'src':path, 'dest':destfile} - shutil.copyfile(path, destfile) - elif(flag == 'move'): - print "Moving %(src)s to %(dest)s..." % {'src':path, 'dest':destfile} - shutil.move(path, destfile) - else: - print "Cannot find file or path: %s" % path - except Exception as e: - print "Error: ", e - -def format_dir_string(path): - if(path[-1] != '/'): - path = path+'/' - return path - -def helper_get_stor_dir(): - try: - res = api_client.list_all_watched_dirs() - except Exception, e: - return res - - if(res['dirs']['1'][-1] != '/'): - out = res['dirs']['1']+'/' - return out - else: - return res['dirs']['1'] - -def checkOtherOption(args): - for i in args: - if(i[0] == '-'): - return True - -def errorIfMultipleOption(args, msg=''): - if(checkOtherOption(args)): - if(msg != ''): - raise OptionValueError(msg) - else: - raise OptionValueError("This option cannot be combined with other options") - -def printHelp(): - storage_dir = helper_get_stor_dir() - if(storage_dir is None): - storage_dir = "Unknown" - else: - storage_dir += "imported/" - print """ -======================== - Airtime Import Script -======================== -There are two ways to import audio files into Airtime: - -1) Use airtime-import to copy or move files into the storage folder. - - Copied or moved files will be placed into the folder: - %s - - Files will be automatically organized into the structure - "Artist/Album/TrackNumber-TrackName-Bitrate.file_extension". - -2) Use airtime-import to add a folder to the Airtime library ("watch" a folder). - - All the files in the watched folder will be imported to Airtime and the - folder will be monitored to automatically detect any changes. Hence any - changes done in the folder(add, delete, edit a file) will trigger - updates in Airtime library. -""" % storage_dir - parser.print_help() - print "" - -def CopyAction(option, opt, value, parser): - errorIfMultipleOption(parser.rargs) - if(len(parser.rargs) == 0 ): - raise OptionValueError("No argument found. This option requires at least one argument.") - stor = helper_get_stor_dir() - if(stor is None): - print "Unable to connect to the Airtime server." - return - dest = stor+"organize/" - copy_or_move_files_to(parser.rargs, dest, 'copy') - -def MoveAction(option, opt, value, parser): - errorIfMultipleOption(parser.rargs) - if(len(parser.rargs) == 0 ): - raise OptionValueError("No argument found. This option requires at least one argument.") - stor = helper_get_stor_dir() - if(stor is None): - exit("Unable to connect to the Airtime server.") - dest = stor+"organize/" - copy_or_move_files_to(parser.rargs, dest, 'move') - -def WatchAddAction(option, opt, value, parser): - errorIfMultipleOption(parser.rargs) - if(len(parser.rargs) > 1): - raise OptionValueError("Too many arguments. This option requires exactly one argument.") - elif(len(parser.rargs) == 0 ): - raise OptionValueError("No argument found. This option requires exactly one argument.") - path = parser.rargs[0] - if (path[0] == "/" or path[0] == "~"): - path = os.path.realpath(path) - else: - path = currentDir+path - path = apc.encode_to(path, 'utf-8') - if(os.path.isdir(path)): - #os.chmod(path, 0765) - try: - res = api_client.add_watched_dir(path) - except Exception, e: - exit("Unable to connect to the server.") - # sucess - if(res['msg']['code'] == 0): - print "%s added to watched folder list successfully" % path - else: - print "Adding a watched folder failed: %s" % res['msg']['error'] - print "This error most likely caused by wrong permissions" - print "Try fixing this error by chmodding the parent directory(ies)" - else: - print "Given path is not a directory: %s" % path - -def WatchListAction(option, opt, value, parser): - errorIfMultipleOption(parser.rargs) - if(len(parser.rargs) > 0): - raise OptionValueError("This option doesn't take any arguments.") - try: - res = api_client.list_all_watched_dirs() - except Exception, e: - exit("Unable to connect to the Airtime server.") - dirs = res["dirs"].items() - # there will be always 1 which is storage folder - if(len(dirs) == 1): - print "No watch folders found" - else: - for key, v in dirs: - if(key != '1'): - print v - -def WatchRemoveAction(option, opt, value, parser): - errorIfMultipleOption(parser.rargs) - if(len(parser.rargs) > 1): - raise OptionValueError("Too many arguments. This option requires exactly one argument.") - elif(len(parser.rargs) == 0 ): - raise OptionValueError("No argument found. This option requires exactly one argument.") - path = parser.rargs[0] - if (path[0] == "/" or path[0] == "~"): - path = os.path.realpath(path) - else: - path = currentDir+path - path = apc.encode_to(path, 'utf-8') - if(os.path.isdir(path)): - try: - res = api_client.remove_watched_dir(path) - except Exception, e: - exit("Unable to connect to the Airtime server.") - # sucess - if(res['msg']['code'] == 0): - print "%s removed from watch folder list successfully." % path - else: - print "Removing the watch folder failed: %s" % res['msg']['error'] - else: - print "The given path is not a directory: %s" % path - -def StorageSetAction(option, opt, value, parser): - bypass = False - isF = '-f' in parser.rargs - isForce = '--force' in parser.rargs - if(isF or isForce ): - bypass = True - if(isF): - parser.rargs.remove('-f') - if(isForce): - parser.rargs.remove('--force') - if(not bypass): - errorIfMultipleOption(parser.rargs, "Only [-f] and [--force] option is allowed with this option.") - possibleInput = ['y','Y','n','N'] - confirm = raw_input("Are you sure you want to change the storage direcory? (y/N)") - confirm = confirm or 'N' - while(confirm not in possibleInput): - print "Not an acceptable input: %s\n" % confirm - confirm = raw_input("Are you sure you want to change the storage direcory? (y/N) ") - confirm = confirm or 'N' - if(confirm == 'n' or confirm =='N'): - sys.exit(1) - - if(len(parser.rargs) > 1): - raise OptionValueError("Too many arguments. This option requires exactly one argument.") - elif(len(parser.rargs) == 0 ): - raise OptionValueError("No argument found. This option requires exactly one argument.") - - path = parser.rargs[0] - if (path[0] == "/" or path[0] == "~"): - path = os.path.realpath(path) - else: - path = currentDir+path - path = apc.encode_to(path, 'utf-8') - if(os.path.isdir(path)): - try: - res = api_client.set_storage_dir(path) - except Exception, e: - exit("Unable to connect to the Airtime server.") - # success - if(res['msg']['code'] == 0): - print "Successfully set storage folder to %s" % path - else: - print "Setting storage folder failed: %s" % res['msg']['error'] - else: - print "The given path is not a directory: %s" % path - -def StorageGetAction(option, opt, value, parser): - errorIfMultipleOption(parser.rargs) - if(len(parser.rargs) > 0): - raise OptionValueError("This option does not take any arguments.") - print helper_get_stor_dir() - -class OptionValueError(RuntimeError): - def __init__(self, msg): - self.msg = msg - -usage = """[-c|--copy FILE/DIR [FILE/DIR...]] [-m|--move FILE/DIR [FILE/DIR...]] - [--watch-add DIR] [--watch-list] [--watch-remove DIR] - [--storage-dir-set DIR] [--storage-dir-get]""" - -parser = OptionParser(usage=usage, add_help_option=False) -parser.add_option('-c','--copy', action='callback', callback=CopyAction, metavar='FILE', help='Copy FILE(s) into the storage directory.\nYou can specify multiple files or directories.') -parser.add_option('-m','--move', action='callback', callback=MoveAction, metavar='FILE', help='Move FILE(s) into the storage directory.\nYou can specify multiple files or directories.') -parser.add_option('--watch-add', action='callback', callback=WatchAddAction, help='Add DIR to the watched folders list.') -parser.add_option('--watch-list', action='callback', callback=WatchListAction, help='Show the list of folders that are watched.') -parser.add_option('--watch-remove', action='callback', callback=WatchRemoveAction, help='Remove DIR from the watched folders list.') -parser.add_option('--storage-dir-set', action='callback', callback=StorageSetAction, help='Set storage dir to DIR.') -parser.add_option('--storage-dir-get', action='callback', callback=StorageGetAction, help='Show the current storage dir.') -parser.add_option('-h', '--help', dest='help', action='store_true', help='show this help message and exit') - -# pop "--dir" -sys.argv.pop(1) -# pop "invoked pwd" -currentDir = sys.argv.pop(1)+'/' - -if('-l' in sys.argv or '--link' in sys.argv): - print "\nThe [-l][--link] option is deprecated. Please use the --watch-add option.\nTry 'airtime-import -h' for more detail.\n" - sys.exit() -if('-h' in sys.argv): - printHelp() - sys.exit() -if(len(sys.argv) == 1 or '-' not in sys.argv[1]): - printHelp() - sys.exit() - -try: - (option, args) = parser.parse_args() -except Exception, e: - printHelp() - if hasattr(e, 'msg'): - print "Error: "+e.msg - else: - print "Error: ",e - sys.exit() -except SystemExit: - printHelp() - sys.exit() - -if option.help: - printHelp() - sys.exit() - - - -