diff --git a/install b/install index 1201bd4e84..3646645aa4 100755 --- a/install +++ b/install @@ -466,7 +466,10 @@ for i in /etc/init/airtime*.template; do mv $i ${i%.template} done -#loudCmd "initctl reload-configuration" +set +e +loudCmd "initctl reload-configuration" +loudCmd "systemctl daemon-reload" #systemd hipsters +set -e if [ ! -d /var/log/airtime ]; then loud "\n-----------------------------------------------------" @@ -504,6 +507,9 @@ loud "\n-----------------------------------------------------" loud " * Configuring PostgreSQL * " loud "-----------------------------------------------------" +# Ensure postgres is running - It isn't after you install the postgres package on Ubuntu 15.04 +loudCmd "service postgresql start" + setupAirtimePostgresUser() { # here-doc to execute this block as postgres user su postgres <<'EOF' diff --git a/installer/lib/requirements-ubuntu-vivid.apt b/installer/lib/requirements-ubuntu-vivid.apt new file mode 100644 index 0000000000..795e1d05e8 --- /dev/null +++ b/installer/lib/requirements-ubuntu-vivid.apt @@ -0,0 +1,69 @@ +apache2 +libapache2-mod-php5 +php5 +libzend-framework-php +php-pear +php5-gd + +lsb-release + +rabbitmq-server + +postgresql +postgresql-client +php5-pgsql + +python +python-virtualenv +python-pip + +libsoundtouch-ocaml +libtaglib-ocaml +libao-ocaml +libmad-ocaml +ecasound +libportaudio2 +libsamplerate0 + +patch + +php5-curl +mpg123 + +icecast2 + +libcamomile-ocaml-data +libpulse0 +vorbis-tools +lsb-release +lsof +vorbisgain +flac +vorbis-tools +pwgen +libfaad2 +php-apc + +lame + +coreutils + +liquidsoap +liquidsoap-plugin-alsa +liquidsoap-plugin-ao +liquidsoap-plugin-faad +liquidsoap-plugin-flac +liquidsoap-plugin-icecast +liquidsoap-plugin-lame +liquidsoap-plugin-mad +liquidsoap-plugin-ogg +liquidsoap-plugin-portaudio +liquidsoap-plugin-pulseaudio +liquidsoap-plugin-taglib +liquidsoap-plugin-voaacenc +liquidsoap-plugin-vorbis + +silan +libopus0 + +sysvinit-utils diff --git a/utils/airtime-check-system b/utils/airtime-check-system deleted file mode 100755 index 3c00235c26..0000000000 --- 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 3a4816dcf2..0000000000 --- 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 b42ae7a01a..a878d71947 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 0aba7d2098..0000000000 --- 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() - - - - diff --git a/utils/airtime-silan b/utils/airtime-silan index efb96ef30b..3bffb0ee20 100755 --- a/utils/airtime-silan +++ b/utils/airtime-silan @@ -1,42 +1,79 @@ -#!/bin/bash -#------------------------------------------------------------------------------- -# Copyright (c) 2011 Sourcefabric O.P.S. -# -# This file is part of the Airtime project. -# http://airtime.sourcefabric.org/ -# -# Airtime is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# Airtime is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Airtime; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -# -#------------------------------------------------------------------------------- -#------------------------------------------------------------------------------- -# This script handles update cue-in/cue-out points for files that already exist -# in Airtime's library. -# -exec 2>&1 -airtime_silan_script="airtime-silan.py" -api_client_path="/usr/lib/airtime/" - -virtualenv_bin="/usr/lib/airtime/airtime_virtualenv/bin/" -. ${virtualenv_bin}activate - -export PYTHONPATH=${api_client_path} - -# Absolute path to this script -SCRIPT=`readlink -f $0` -# Absolute directory this script is in -SCRIPTPATH=`dirname $SCRIPT` - -cd $SCRIPTPATH -python ${airtime_silan_script} +#!/usr/bin/python +from configobj import ConfigObj +from api_clients import api_client as apc + +import logging +import json +import os +import sys +import subprocess +import traceback + +# 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(1) + +# loading config file +try: + config = ConfigObj('/etc/airtime/airtime.conf') +except Exception, e: + print('Error loading config file: %s', e) + sys.exit(1) + +api_client = apc.AirtimeApiClient(config) + +try: + # keep getting few rows at a time for current music_dir (stor + # or watched folder). + subtotal = 0 + while True: + # return a list of pairs where the first value is the + # file's database row id and the second value is the + # filepath + files = api_client.get_files_without_silan_value() + total_files = len(files) + if total_files == 0: break + processed_data = [] + total = 0 + for f in files: + full_path = f['fp'] + # silence detect(set default queue in and out) + try: + command = ['silan', '-b' '-f', 'JSON', full_path] + proc = subprocess.Popen(command, stdout=subprocess.PIPE) + out = proc.communicate()[0].strip('\r\n') + info = json.loads(out) + data = {} + data['cuein'] = str('{0:f}'.format(info['sound'][0][0])) + data['cueout'] = str('{0:f}'.format(info['sound'][-1][1])) + data['length'] = str('{0:f}'.format(info['file duration'])) + processed_data.append((f['id'], data)) + total += 1 + if total % 5 == 0: + print "Total %s / %s files has been processed.." % (total, total_files) + except Exception, e: + print e + print traceback.format_exc() + print "Processed: %d songs" % total + subtotal += total + + try: + print api_client.update_cue_values_by_silan(processed_data) + except Exception ,e: + print e + print traceback.format_exc() + print "Total %d songs Processed" % subtotal + +except Exception, e: + print e + print traceback.format_exc() diff --git a/utils/airtime-silan.py b/utils/airtime-silan.py deleted file mode 100644 index 0cc0d7f8b7..0000000000 --- a/utils/airtime-silan.py +++ /dev/null @@ -1,78 +0,0 @@ -from configobj import ConfigObj -from api_clients import api_client as apc - -import logging -import json -import os -import sys -import subprocess -import traceback - -# 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(1) - -# loading config file -try: - config = ConfigObj('/etc/airtime/airtime.conf') -except Exception, e: - print('Error loading config file: %s', e) - sys.exit(1) - -api_client = apc.AirtimeApiClient(config) - -try: - # keep getting few rows at a time for current music_dir (stor - # or watched folder). - subtotal = 0 - while True: - # return a list of pairs where the first value is the - # file's database row id and the second value is the - # filepath - files = api_client.get_files_without_silan_value() - total_files = len(files) - if total_files == 0: break - processed_data = [] - total = 0 - for f in files: - full_path = f['fp'] - # silence detect(set default queue in and out) - try: - command = ['silan', '-b' '-f', 'JSON', full_path] - proc = subprocess.Popen(command, stdout=subprocess.PIPE) - out = proc.communicate()[0].strip('\r\n') - info = json.loads(out) - data = {} - data['cuein'] = str('{0:f}'.format(info['sound'][0][0])) - data['cueout'] = str('{0:f}'.format(info['sound'][-1][1])) - data['length'] = str('{0:f}'.format(info['file duration'])) - processed_data.append((f['id'], data)) - total += 1 - if total % 5 == 0: - print "Total %s / %s files has been processed.." % (total, total_files) - except Exception, e: - print e - print traceback.format_exc() - print "Processed: %d songs" % total - subtotal += total - - try: - print api_client.update_cue_values_by_silan(processed_data) - except Exception ,e: - print e - print traceback.format_exc() - print "Total %d songs Processed" % subtotal - -except Exception, e: - print e - print traceback.format_exc() diff --git a/utils/airtime-update-db-settings b/utils/airtime-update-db-settings deleted file mode 100755 index 5ed0fcd897..0000000000 --- a/utils/airtime-update-db-settings +++ /dev/null @@ -1,18 +0,0 @@ -#!/bin/bash -#------------------------------------------------------------------------------- -# Determine directories, files -#------------------------------------------------------------------------------- - -virtualenv_bin="/usr/lib/airtime/airtime_virtualenv/bin/" -. ${virtualenv_bin}activate - -# Absolute path to this script -SCRIPT=`readlink -f $0` -# Absolute directory this script is in -SCRIPTPATH=`dirname $SCRIPT` - -#------------------------------------------------------------------------------- -# Do import -#------------------------------------------------------------------------------- -invokePwd=$PWD -cd $SCRIPTPATH && python airtime-update-db-settings.py diff --git a/utils/airtime-update-db-settings.py b/utils/airtime-update-db-settings.py deleted file mode 100644 index d28322fb13..0000000000 --- a/utils/airtime-update-db-settings.py +++ /dev/null @@ -1,87 +0,0 @@ -""" -The purpose of this script is to consolidate into one location where -we need to update database host, dbname, username and password. - -This script reads from /etc/airtime/airtime.conf. -""" -import os -import sys -import ConfigParser -import xml.dom.minidom -from xml.dom.minidom import Node - -if os.geteuid() != 0: - print "Please run this as root." - sys.exit(1) - -airtime_conf = '/etc/airtime/airtime.conf' - -#Read the universal values -parser = ConfigParser.SafeConfigParser() -parser.read(airtime_conf) - -host = 'resources.db.params.host' -dbname = 'resources.db.params.dbname' -username = 'resources.db.params.username' -password = 'resources.db.params.password' - -airtime_dir = parser.get('general', 'airtime_dir') -if os.path.exists(airtime_dir): - print 'Airtime root folder found at %s' % airtime_dir -else: - print 'Could not find Airtime root folder specified by "airtime_dir" in %s' % airtime_conf - sys.exit(1) - -print ("Updating %s/application/configs/application.ini" % airtime_dir) -f = file('%s/application/configs/application.ini' % airtime_dir,'r') -file_lines = [] - -for line in f: - if line[0:len(host)] == host: - line= '%s = "%s"\n' % (host, parser.get('database', 'host')) - elif line[0:len(dbname)] == dbname: - line= '%s = "%s"\n' % (dbname, parser.get('database', 'dbname')) - elif line[0:len(username)] == username: - line= '%s = "%s"\n' % (username, parser.get('database', 'dbuser')) - elif line[0:len(password)] == password: - line= '%s = "%s"\n' % (password, parser.get('database', 'dbpass')) - file_lines.append(line) -f.close() - -f = file('%s/application/configs/application.ini' % airtime_dir, 'w') -f.writelines(file_lines) -f.close() - - -print ("Updating %s/build/build.properties" % airtime_dir) - -f = file('%s/build/build.properties' % airtime_dir, 'r') -file_lines = [] - -db_url = 'propel.database.url' - -for line in f: - if line[0:len(db_url)] == db_url: - line = '%s = pgsql:host=%s dbname=%s user=%s password=%s\n' % \ - (db_url, parser.get('database', 'host'), parser.get('database', 'dbname'), parser.get('database', 'dbuser'), \ - parser.get('database', 'dbpass')) - file_lines.append(line) -f.close() - -f = file('%s/build/build.properties' % airtime_dir, 'w') -f.writelines(file_lines) -f.close() - -print ("Updating %s/build/runtime-conf.xml" % airtime_dir) - -doc = xml.dom.minidom.parse('%s/build/runtime-conf.xml' % airtime_dir) - -node = doc.getElementsByTagName("dsn")[0] -node.firstChild.nodeValue = 'pgsql:host=%s;port=5432;dbname=%s;user=%s;password=%s' % (parser.get('database', 'host'), \ -parser.get('database', 'dbname'), parser.get('database', 'dbuser'), parser.get('database', 'dbpass')) - -xml_file = open('%s/build/runtime-conf.xml' % airtime_dir, "w") -xml_file.writelines(doc.toxml('utf-8')) -xml_file.close() - -print "Success!"