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/