diff --git a/airtime_mvc/application/models/airtime/map/CcFilesTableMap.php b/airtime_mvc/application/models/airtime/map/CcFilesTableMap.php index 348d2482e..e9ddfeb9a 100644 --- a/airtime_mvc/application/models/airtime/map/CcFilesTableMap.php +++ b/airtime_mvc/application/models/airtime/map/CcFilesTableMap.php @@ -44,7 +44,7 @@ class CcFilesTableMap extends TableMap { $this->addColumn('FTYPE', 'DbFtype', 'VARCHAR', true, 128, ''); $this->addForeignKey('DIRECTORY', 'DbDirectory', 'INTEGER', 'cc_music_dirs', 'ID', false, null, null); $this->addColumn('FILEPATH', 'DbFilepath', 'LONGVARCHAR', false, null, ''); - $this->addColumn('IMPORT_STATUS', 'DbImportStatus', 'INTEGER', true, null, 0); + $this->addColumn('IMPORT_STATUS', 'DbImportStatus', 'INTEGER', true, null, 1); $this->addColumn('CURRENTLYACCESSING', 'DbCurrentlyaccessing', 'INTEGER', true, null, 0); $this->addForeignKey('EDITEDBY', 'DbEditedby', 'INTEGER', 'cc_subjs', 'ID', false, null, null); $this->addColumn('MTIME', 'DbMtime', 'TIMESTAMP', false, 6, null); diff --git a/airtime_mvc/application/models/airtime/om/BaseCcFiles.php b/airtime_mvc/application/models/airtime/om/BaseCcFiles.php index 59ea2b6c8..523e27e28 100644 --- a/airtime_mvc/application/models/airtime/om/BaseCcFiles.php +++ b/airtime_mvc/application/models/airtime/om/BaseCcFiles.php @@ -66,7 +66,7 @@ abstract class BaseCcFiles extends BaseObject implements Persistent /** * The value for the import_status field. - * Note: this column has a database default value of: 0 + * Note: this column has a database default value of: 1 * @var int */ protected $import_status; @@ -524,7 +524,7 @@ abstract class BaseCcFiles extends BaseObject implements Persistent $this->mime = ''; $this->ftype = ''; $this->filepath = ''; - $this->import_status = 0; + $this->import_status = 1; $this->currentlyaccessing = 0; $this->length = '00:00:00'; $this->file_exists = true; @@ -2892,7 +2892,7 @@ abstract class BaseCcFiles extends BaseObject implements Persistent return false; } - if ($this->import_status !== 0) { + if ($this->import_status !== 1) { return false; } diff --git a/airtime_mvc/application/modules/rest/controllers/MediaController.php b/airtime_mvc/application/modules/rest/controllers/MediaController.php index f092574b3..33dd9a9f6 100644 --- a/airtime_mvc/application/modules/rest/controllers/MediaController.php +++ b/airtime_mvc/application/modules/rest/controllers/MediaController.php @@ -6,7 +6,13 @@ class Rest_MediaController extends Zend_Rest_Controller //fields that are not modifiable via our RESTful API private $blackList = array( 'id', + 'directory', + 'filepath', 'file_exists', + 'hidden', + 'mtime', + 'utime', + 'lptime', 'silan_check', 'soundcloud_id', 'is_scheduled', @@ -147,9 +153,18 @@ class Rest_MediaController extends Zend_Rest_Controller } $file = CcFilesQuery::create()->findPk($id); - if ($file) + //validate fields + $requestData = json_decode($this->getRequest()->getRawBody(), true); + //TODO: rename EditAudioMD form? + $fileForm = new Application_Form_EditAudioMD(); + $fileForm->startForm($file->getDbId()); + $fileForm->populate($requestData); + + if (!$fileForm->isValidPartial($requestData)) { + $file->setDbImportStatus(2)->save(); + $this->invalidDataResponse(); + } else if ($file) { - $requestData = json_decode($this->getRequest()->getRawBody(), true); $file->fromArray($this->validateRequestData($requestData), BasePeer::TYPE_FIELDNAME); //Our RESTful API takes "full_path" as a field, which we then split and translate to match @@ -179,6 +194,7 @@ class Rest_MediaController extends Zend_Rest_Controller ->setHttpResponseCode(200) ->appendBody(json_encode($this->sanitizeResponse($file))); } else { + $file->setDbImportStatus(2)->save(); $this->fileNotFoundResponse(); } } @@ -284,6 +300,13 @@ class Rest_MediaController extends Zend_Rest_Controller $resp->setHttpResponseCode(404); $resp->appendBody("ERROR: Media not found."); } + + private function invalidDataResponse() + { + $resp = $this->getResponse(); + $resp->setHttpResponseCode(400); + $resp->appendBody("ERROR: Invalid data"); + } private function processUploadedFile($callbackUrl, $originalFilename, $ownerId) { diff --git a/airtime_mvc/build/schema.xml b/airtime_mvc/build/schema.xml index e614748bf..8cf6e6987 100644 --- a/airtime_mvc/build/schema.xml +++ b/airtime_mvc/build/schema.xml @@ -18,7 +18,7 @@ - + diff --git a/airtime_mvc/build/sql/schema.sql b/airtime_mvc/build/sql/schema.sql index 8eb638878..a7a4c0d66 100644 --- a/airtime_mvc/build/sql/schema.sql +++ b/airtime_mvc/build/sql/schema.sql @@ -36,7 +36,7 @@ CREATE TABLE "cc_files" "ftype" VARCHAR(128) default '' NOT NULL, "directory" INTEGER, "filepath" TEXT default '', - "import_status" INTEGER default 0 NOT NULL, + "import_status" INTEGER default 1 NOT NULL, "currentlyaccessing" INTEGER default 0 NOT NULL, "editedby" INTEGER, "mtime" TIMESTAMP(6), diff --git a/python_apps/airtime_analyzer/airtime_analyzer/airtime_analyzer.py b/python_apps/airtime_analyzer/airtime_analyzer/airtime_analyzer.py index 9c6f746e1..66933f55a 100644 --- a/python_apps/airtime_analyzer/airtime_analyzer/airtime_analyzer.py +++ b/python_apps/airtime_analyzer/airtime_analyzer/airtime_analyzer.py @@ -10,19 +10,18 @@ from message_listener import MessageListener class AirtimeAnalyzerServer: # Constants - _CONFIG_PATH = '/etc/airtime/airtime.conf' _LOG_PATH = "/var/log/airtime/airtime_analyzer.log" # Variables _log_level = logging.INFO - def __init__(self, debug=False): + def __init__(self, config_path, debug=False): # Configure logging self.setup_logging(debug) # Read our config file - rabbitmq_config = self.read_config_file() + rabbitmq_config = self.read_config_file(config_path) # Start listening for RabbitMQ messages telling us about newly # uploaded files. @@ -55,9 +54,8 @@ class AirtimeAnalyzerServer: rootLogger.addHandler(consoleHandler) - def read_config_file(self): + def read_config_file(self, config_path): config = ConfigParser.SafeConfigParser() - config_path = AirtimeAnalyzerServer._CONFIG_PATH try: config.readfp(open(config_path)) except IOError as e: diff --git a/python_apps/airtime_analyzer/bin/airtime_analyzer b/python_apps/airtime_analyzer/bin/airtime_analyzer index 23865fdc6..85266e9b0 100755 --- a/python_apps/airtime_analyzer/bin/airtime_analyzer +++ b/python_apps/airtime_analyzer/bin/airtime_analyzer @@ -6,12 +6,14 @@ import os import airtime_analyzer.airtime_analyzer as aa VERSION = "1.0" +DEFAULT_CONFIG_PATH = '/etc/airtime/airtime.conf' print "Airtime Analyzer " + VERSION parser = argparse.ArgumentParser() parser.add_argument("-d", "--daemon", help="run as a daemon", action="store_true") parser.add_argument("--debug", help="log full debugging output", action="store_true") +parser.add_argument("--rmq-config-file", help="specify a configuration file with RabbitMQ settings (default is /etc/airtime/airtime.conf)") args = parser.parse_args() '''Ensure media_monitor isn't running before we start, because it'll move newly uploaded @@ -33,10 +35,15 @@ def check_if_media_monitor_is_running(): check_if_media_monitor_is_running() +#Default config file path +config_path = DEFAULT_CONFIG_PATH +if args.rmq_config_file: + config_path = args.rmq_config_file + if args.daemon: with daemon.DaemonContext(): - analyzer = aa.AirtimeAnalyzerServer(debug=args.debug) + analyzer = aa.AirtimeAnalyzerServer(config_path=config_path, debug=args.debug) else: # Run without daemonizing - analyzer = aa.AirtimeAnalyzerServer(debug=args.debug) + analyzer = aa.AirtimeAnalyzerServer(config_path=config_path, debug=args.debug) diff --git a/python_apps/airtime_analyzer/tools/ftp-upload-hook.sh b/python_apps/airtime_analyzer/tools/ftp-upload-hook.sh index 4d8dc789a..faf677a29 100755 --- a/python_apps/airtime_analyzer/tools/ftp-upload-hook.sh +++ b/python_apps/airtime_analyzer/tools/ftp-upload-hook.sh @@ -1,5 +1,41 @@ #! /bin/bash -path=$1 -filename="${path##*/}" -curl http://localhost/rest/media -u 3188BDIMPJROQP89Z0OX: -X POST -F "file=@$path" -F "name=$filename" +post_file() { + #kill process after 30 minutes (360*5=30 minutes) + max_retry=360 + retry_count=0 + + file_path=${1} + filename="${file_path##*/}" + + #base_instance_path and airtime_conf_path are common to all saas instances + base_instance_path=/mnt/airtimepro/instances/ + airtime_conf_path=/etc/airtime/airtime.conf + + #maps the instance_path to the url + vhost_file=/mnt/airtimepro/system/vhost.map + + #instance_path will look like 1/1384, for example + instance_path=$(echo ${file_path} | grep -Po "(?<=($base_instance_path)).*?(?=/srv)") + + #post request url - http://bananas.airtime.pro/rest/media, for example + url=http:// + url+=$(grep -E $instance_path $vhost_file | awk '{print $1;}') + url+=/rest/media + + #path to specific instance's airtime.conf + instance_conf_path=$base_instance_path$instance_path$airtime_conf_path + + api_key=$(sudo awk -F "=" '/api_key/ {print $2}' $instance_conf_path) + + until curl --max-time 30 $url -u $api_key":" -X POST -F "file=@${file_path}" -F "name=${filename}" + do + retry_count=$[$retry_count+1] + if [ $retry_count -ge $max_retry ]; then + break + fi + sleep 5 + done +} + +post_file "${1}" & diff --git a/python_apps/airtime_analyzer/tools/test-hook-script.sh b/python_apps/airtime_analyzer/tools/test-hook-script.sh new file mode 100755 index 000000000..d3d0ab504 --- /dev/null +++ b/python_apps/airtime_analyzer/tools/test-hook-script.sh @@ -0,0 +1,21 @@ +#! /bin/bash + +post_file() { + file_path=${1} + filename="${file_path##*/}" + + #kill process after 30 minutes (360*5=30 minutes) + max_retry=10 + retry_count=0 + + until curl --max-time 30 http://localhost/rest/media -u 3188BDIMPJROQP89Z0OX: -X POST -F "file=@${file_path}" -F "name=${filename}" + do + retry_count=$[$retry_count+1] + if [ $retry_count -ge $max_retry ]; then + break + fi + sleep 1 + done +} + +post_file "${1}" &