diff --git a/LICENSE_3RD_PARTY b/LICENSE_3RD_PARTY
index 1807bd4e9..87e1080bd 100644
--- a/LICENSE_3RD_PARTY
+++ b/LICENSE_3RD_PARTY
@@ -75,6 +75,10 @@ Non-linked code:
- Web site: http://savonet.sourceforge.net/
- License: GPLv2
+ * RabbitMQ (works with version 1.7.2 and above)
+ - Web site: http://www.rabbitmq.com/
+ - License: Mozilla Public License (http://www.rabbitmq.com/mpl.html)
+
* mp3cut from the package poc-streamer
- Web site: https://bl0rg.net/software/poc/
- License: BSD 3-Clause
diff --git a/airtime_mvc/application/models/Preference.php b/airtime_mvc/application/models/Preference.php
index 8396b370b..19fd6da1f 100644
--- a/airtime_mvc/application/models/Preference.php
+++ b/airtime_mvc/application/models/Preference.php
@@ -315,13 +315,15 @@ class Application_Model_Preference
$outputArray['STATION_DESCRIPTION'] = Application_Model_Preference::GetStationDescription();
// get web server info
- $url = $systemInfoArray["AIRTIME_VERSION_URL"];
- $index = strpos($url,'/api/');
- $url = substr($url, 0, $index);
-
- $headerInfo = get_headers(trim($url),1);
- $outputArray['WEB_SERVER'] = $headerInfo['Server'][0];
-
+ if(isset($systemInfoArray["AIRTIME_VERSION_URL"])){
+ $url = $systemInfoArray["AIRTIME_VERSION_URL"];
+ $index = strpos($url,'/api/');
+ $url = substr($url, 0, $index);
+
+ $headerInfo = get_headers(trim($url),1);
+ $outputArray['WEB_SERVER'] = $headerInfo['Server'][0];
+ }
+
$outputArray['NUM_OF_USERS'] = User::getUserCount();
$outputArray['NUM_OF_SONGS'] = StoredFile::getFileCount();
$outputArray['NUM_OF_PLAYLISTS'] = Playlist::getPlaylistCount();
diff --git a/airtime_mvc/public/js/airtime/library/plupload.js b/airtime_mvc/public/js/airtime/library/plupload.js
index 41818c748..76bdf532b 100644
--- a/airtime_mvc/public/js/airtime/library/plupload.js
+++ b/airtime_mvc/public/js/airtime/library/plupload.js
@@ -24,8 +24,18 @@ $(document).ready(function() {
.append('
' + j.error.message + ' | ');
$("#plupload_error").find("table").append(row);
+ }else{
+ $.get('/Plupload/copyfile/format/json/name/'+file.name, function(json){
+ var jr = jQuery.parseJSON(json);
+ if(jr.error !== undefined) {
+ var row = $("
")
+ .append('' + file.name +' | ')
+ .append('' + jr.error.message + ' | ');
+
+ $("#plupload_error").find("table").append(row);
+ }
+ });
}
- $.get('/Plupload/copyfile/format/json/name/'+file.name);
});
var uploadProgress = false;
diff --git a/install_minimal/include/AirtimeInstall.php b/install_minimal/include/AirtimeInstall.php
index 60438e200..149741a90 100644
--- a/install_minimal/include/AirtimeInstall.php
+++ b/install_minimal/include/AirtimeInstall.php
@@ -65,13 +65,18 @@ class AirtimeInstall
$sql = "SELECT valstr FROM cc_pref WHERE keystr = 'system_version'";
$version = $CC_DBC->GetOne($sql);
- if (PEAR::isError($version)) {
- return null;
- }
- // no version string detected
- if($version == ''){
- $version = false;
+ if ($version == '') {
+ $sql = "SELECT * FROM cc_show_rebroadcast LIMIT 1";
+ $result = $CC_DBC->GetOne($sql);
+ if (!PEAR::isError($result)) {
+ $version = "1.7.0";
+ //echo "Airtime Version: ".$version." ".PHP_EOL;
+ }
+ else {
+ $version = false;
+ }
}
+
return $version;
}
}
diff --git a/install_minimal/include/airtime-install.php b/install_minimal/include/airtime-install.php
index faaad8d0e..ff4f8d731 100644
--- a/install_minimal/include/airtime-install.php
+++ b/install_minimal/include/airtime-install.php
@@ -72,7 +72,7 @@ if (isset($version) && ($version != false) && ($version < AIRTIME_VERSION) && !i
}
if($version === false){
- echo "A version of Airtime older than 1.8.0 detected, please upgrade to 1.8.0 first.\n";
+ echo "A version of Airtime older than 1.7.0 detected, please upgrade to 1.7.0 first.\n";
echo "You will then be able to upgrade to 1.9.0 using this installer.\n";
exit(3);
}
diff --git a/install_minimal/include/airtime-upgrade.php b/install_minimal/include/airtime-upgrade.php
index 856a1a57f..32c68ad33 100644
--- a/install_minimal/include/airtime-upgrade.php
+++ b/install_minimal/include/airtime-upgrade.php
@@ -12,6 +12,7 @@ set_include_path(__DIR__.'/../../airtime_mvc/library/pear' . PATH_SEPARATOR . ge
require_once('DB.php');
require_once(__DIR__.'/../../airtime_mvc/application/configs/constants.php');
require_once(dirname(__FILE__).'/AirtimeIni.php');
+require_once(dirname(__FILE__).'/AirtimeInstall.php');
if(exec("whoami") != "root"){
echo "Must be root user.\n";
@@ -43,6 +44,7 @@ if (PEAR::isError($CC_DBC)) {
$CC_DBC->setFetchMode(DB_FETCHMODE_ASSOC);
}
+/*
$sql = "SELECT valstr FROM cc_pref WHERE keystr = 'system_version'";
$version = $CC_DBC->GetOne($sql);
@@ -52,7 +54,7 @@ if (PEAR::isError($version)) {
if (!$version){
- $sql = "SELECT * FROM ".$p_name;
+ $sql = "SELECT * FROM cc_show_rebroadcast LIMIT 1";
$result = $CC_DBC->GetOne($sql);
if (!PEAR::isError($result)) {
$version = "1.7.0";
@@ -63,6 +65,9 @@ if (!$version){
echo "Airtime Version: ".$version." ".PHP_EOL;
}
}
+*/
+
+$version = AirtimeInstall::GetVersionInstalled();
echo "******************************** Update Begin *********************************".PHP_EOL;
diff --git a/install_minimal/upgrades/airtime-1.8.0/airtime-upgrade.php b/install_minimal/upgrades/airtime-1.8.0/airtime-upgrade.php
index 897555da6..dabbf0b22 100644
--- a/install_minimal/upgrades/airtime-1.8.0/airtime-upgrade.php
+++ b/install_minimal/upgrades/airtime-1.8.0/airtime-upgrade.php
@@ -7,9 +7,56 @@
*/
set_include_path(__DIR__.'/../../../airtime_mvc/library' . PATH_SEPARATOR . get_include_path());
-require_once __DIR__.'/../../../airtime_mvc/application/configs/conf.php';
require_once(dirname(__FILE__).'/../../include/AirtimeInstall.php');
-require_once(dirname(__FILE__).'/../../include/AirtimeIni.php');
+
+global $CC_CONFIG;
+
+function load_airtime_config(){
+ $ini_array = parse_ini_file('/etc/airtime/airtime.conf', true);
+ return $ini_array;
+}
+
+$values = load_airtime_config();
+
+$CC_CONFIG = array(
+
+ // Name of the web server user
+ 'webServerUser' => $values['general']['web_server_user'],
+
+ 'rabbitmq' => $values['rabbitmq'],
+
+ 'baseFilesDir' => $values['general']['base_files_dir'],
+ // main directory for storing binary media files
+ 'storageDir' => $values['general']['base_files_dir']."/stor",
+
+ // Database config
+ 'dsn' => array(
+ 'username' => $values['database']['dbuser'],
+ 'password' => $values['database']['dbpass'],
+ 'hostspec' => $values['database']['host'],
+ 'phptype' => 'pgsql',
+ 'database' => $values['database']['dbname']),
+
+ // prefix for table names in the database
+ 'tblNamePrefix' => 'cc_',
+
+ /* ================================================ storage configuration */
+
+ 'apiKey' => array($values['general']['api_key']),
+ 'apiPath' => '/api/',
+
+ 'soundcloud-client-id' => '2CLCxcSXYzx7QhhPVHN4A',
+ 'soundcloud-client-secret' => 'pZ7beWmF06epXLHVUP1ufOg2oEnIt9XhE8l8xt0bBs',
+
+ 'soundcloud-connection-retries' => $values['soundcloud']['connection_retries'],
+ 'soundcloud-connection-wait' => $values['soundcloud']['time_between_retries'],
+
+ "rootDir" => __DIR__."/../..",
+ 'pearPath' => dirname(__FILE__).'/../../library/pear',
+ 'zendPath' => dirname(__FILE__).'/../../library/Zend',
+ 'phingPath' => dirname(__FILE__).'/../../library/phing',
+
+);
AirtimeInstall::DbConnect(true);
@@ -41,26 +88,18 @@ const CONF_FILE_PYPO = "/etc/airtime/pypo.cfg";
const CONF_FILE_RECORDER = "/etc/airtime/recorder.cfg";
const CONF_FILE_LIQUIDSOAP = "/etc/airtime/liquidsoap.cfg";
-$configFiles = array(AirtimeIni::CONF_FILE_AIRTIME,
- AirtimeIni::CONF_FILE_PYPO,
- AirtimeIni::CONF_FILE_RECORDER,
- AirtimeIni::CONF_FILE_LIQUIDSOAP);
+$configFiles = array(CONF_FILE_AIRTIME,
+ CONF_FILE_PYPO,
+ CONF_FILE_RECORDER,
+ CONF_FILE_LIQUIDSOAP);
-foreach ($configFiles as $conf) {
- if (file_exists($conf)) {
- echo "Backing up $conf to $conf.bak".PHP_EOL;
- exec("cp $conf $conf.bak");
- }
-}
/**
* This function creates the /etc/airtime configuration folder
* and copies the default config files to it.
*/
-function CreateIniFiles()
+function CreateIniFiles($suffix)
{
- global $AIRTIME_PYTHON_APPS;
-
if (!file_exists("/etc/airtime/")){
if (!mkdir("/etc/airtime/", 0755, true)){
echo "Could not create /etc/airtime/ directory. Exiting.";
@@ -68,40 +107,149 @@ function CreateIniFiles()
}
}
- if (!copy("airtime.conf.180", CONF_FILE_AIRTIME)){
- echo "Could not copy airtime.conf to /etc/airtime/. Exiting.";
+ if (!copy(__DIR__."/airtime.conf.$suffix", CONF_FILE_AIRTIME)){
+ echo "Could not copy airtime.conf.$suffix to /etc/airtime/. Exiting.";
exit(1);
}
- if (!copy($AIRTIME_PYTHON_APPS."/pypo/pypo.cfg", CONF_FILE_PYPO)){
- echo "Could not copy pypo.cfg to /etc/airtime/. Exiting.";
+ if (!copy(__DIR__."/pypo.cfg.$suffix", CONF_FILE_PYPO)){
+ echo "Could not copy pypo.cfg.$suffix to /etc/airtime/. Exiting.";
exit(1);
}
- if (!copy($AIRTIME_PYTHON_APPS."/show-recorder/recorder.cfg", CONF_FILE_RECORDER)){
- echo "Could not copy recorder.cfg to /etc/airtime/. Exiting.";
+ if (!copy(__DIR__."/recorder.cfg.$suffix", CONF_FILE_RECORDER)){
+ echo "Could not copy recorder.cfg.$suffix to /etc/airtime/. Exiting.";
exit(1);
}
- if (!copy($AIRTIME_PYTHON_APPS."/pypo/liquidsoap_scripts/liquidsoap.cfg", CONF_FILE_LIQUIDSOAP)){
- echo "Could not copy liquidsoap.cfg to /etc/airtime/. Exiting.";
+ if (!copy(__DIR__."/liquidsoap.cfg.$suffix", CONF_FILE_LIQUIDSOAP)){
+ echo "Could not copy liquidsoap.cfg.$suffix to /etc/airtime/. Exiting.";
exit(1);
}
}
-echo "* Creating INI files".PHP_EOL;
-CreateIniFiles();
+function ReadPythonConfig($p_filename)
+{
+ $values = array();
-AirtimeInstall::InstallPhpCode();
-AirtimeInstall::InstallBinaries();
+ $lines = file($p_filename);
+ $n=count($lines);
+ for ($i=0; $i<$n; $i++) {
+ if (strlen($lines[$i]) && !in_array(substr($lines[$i], 0, 1), array('#', PHP_EOL))){
+ $info = explode("=", $lines[$i]);
+ $values[trim($info[0])] = trim($info[1]);
+ }
+ }
+ return $values;
+}
+
+function UpdateIniValue($p_filename, $p_property, $p_value)
+{
+ $lines = file($p_filename);
+ $n=count($lines);
+ foreach ($lines as &$line) {
+ if ($line[0] != "#"){
+ $key_value = split("=", $line);
+ $key = trim($key_value[0]);
+
+ if ($key == $p_property){
+ $line = "$p_property = $p_value".PHP_EOL;
+ }
+ }
+ }
+
+ $fp=fopen($p_filename, 'w');
+ for($i=0; $i<$n; $i++){
+ fwrite($fp, $lines[$i]);
+ }
+ fclose($fp);
+}
+
+function MergeConfigFiles($configFiles, $suffix)
+{
+ foreach ($configFiles as $conf) {
+ if (file_exists("$conf$suffix.bak")) {
+
+ if($conf === CONF_FILE_AIRTIME) {
+ // Parse with sections
+ $newSettings = parse_ini_file($conf, true);
+ $oldSettings = parse_ini_file("$conf$suffix.bak", true);
+ }
+ else {
+ $newSettings = ReadPythonConfig($conf);
+ $oldSettings = ReadPythonConfig("$conf$suffix.bak");
+ }
+
+ //override some values needed for 1.8.0.
+ if($conf === CONF_FILE_PYPO) {
+
+ $oldSettings['cache_dir'] = '/var/tmp/airtime/pypo/cache/';
+ $oldSettings['file_dir'] = '/var/tmp/airtime/pypo/files/';
+ $oldSettings['tmp_dir'] = '/var/tmp/airtime/pypo/tmp/';
+ }
+ else if($conf === CONF_FILE_RECORDER) {
+
+ $oldSettings['base_recorded_files'] = '/var/tmp/airtime/show-recorder/';
+ }
+
+ $settings = array_keys($newSettings);
+
+ foreach($settings as $section) {
+ if(isset($oldSettings[$section])) {
+ if(is_array($oldSettings[$section])) {
+ $sectionKeys = array_keys($newSettings[$section]);
+ foreach($sectionKeys as $sectionKey) {
+ if(isset($oldSettings[$section][$sectionKey])) {
+ UpdateIniValue($conf, $sectionKey, $oldSettings[$section][$sectionKey]);
+ }
+ }
+ }
+ else {
+ UpdateIniValue($conf, $section, $oldSettings[$section]);
+ }
+ }
+ }
+ }
+ }
+}
+
+function LoadConfig($CC_CONFIG) {
+ $values = parse_ini_file(CONF_FILE_AIRTIME, true);
+
+ // Name of the web server user
+ $CC_CONFIG['webServerUser'] = $values['general']['web_server_user'];
+ $CC_CONFIG['phpDir'] = $values['general']['airtime_dir'];
+ $CC_CONFIG['rabbitmq'] = $values['rabbitmq'];
+
+ $CC_CONFIG['baseFilesDir'] = $values['general']['base_files_dir'];
+ // main directory for storing binary media files
+ $CC_CONFIG['storageDir'] = $values['general']['base_files_dir']."/stor";
+
+ // Database config
+ $CC_CONFIG['dsn']['username'] = $values['database']['dbuser'];
+ $CC_CONFIG['dsn']['password'] = $values['database']['dbpass'];
+ $CC_CONFIG['dsn']['hostspec'] = $values['database']['host'];
+ $CC_CONFIG['dsn']['phptype'] = 'pgsql';
+ $CC_CONFIG['dsn']['database'] = $values['database']['dbname'];
+
+ $CC_CONFIG['apiKey'] = array($values['general']['api_key']);
+
+ $CC_CONFIG['soundcloud-connection-retries'] = $values['soundcloud']['connection_retries'];
+ $CC_CONFIG['soundcloud-connection-wait'] = $values['soundcloud']['time_between_retries'];
+
+ return $CC_CONFIG;
+}
+
+// Backup the config files
+$suffix = date("Ymdhis")."-1.8.0";
+foreach ($configFiles as $conf) {
+ if (file_exists($conf)) {
+ echo "Backing up $conf to $conf$suffix.bak".PHP_EOL;
+ exec("cp $conf $conf$suffix.bak");
+ }
+}
+
+$default_suffix = "180";
+CreateIniFiles($default_suffix);
echo "* Initializing INI files".PHP_EOL;
-AirtimeIni::UpdateIniFiles();
-global $CC_CONFIG;
-$CC_CONFIG = Config::loadConfig($CC_CONFIG);
+MergeConfigFiles($configFiles, $suffix);
-echo "* Creating default storage directory".PHP_EOL;
-AirtimeInstall::InstallStorageDirectory();
-
-$ini = parse_ini_file(__DIR__."/../../include/airtime-install.ini");
-$stor_dir = $ini["storage_dir"];
-
-AirtimeInstall::ChangeDirOwnerToWebserver($stor_dir);
-AirtimeInstall::CreateSymlinksToUtils();
+$CC_CONFIG = LoadConfig($CC_CONFIG);
diff --git a/install_minimal/upgrades/airtime-1.8.0/liquidsoap.cfg.180 b/install_minimal/upgrades/airtime-1.8.0/liquidsoap.cfg.180
new file mode 100644
index 000000000..360ee107f
--- /dev/null
+++ b/install_minimal/upgrades/airtime-1.8.0/liquidsoap.cfg.180
@@ -0,0 +1,38 @@
+###########################################
+# liquidsoap config file #
+###########################################
+
+
+###########################################
+# general settings #
+###########################################
+
+log_file = "/var/log/airtime/pypo-liquidsoap/