From e1fd58198c48249e0c265c01c2a92933c9c23cab Mon Sep 17 00:00:00 2001 From: Martin Konecny Date: Sat, 31 Mar 2012 22:06:05 -0400 Subject: [PATCH 01/14] CC-3572: pypo user should have shell set to /bin/false -fixed --- python_apps/create-pypo-user.py | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/python_apps/create-pypo-user.py b/python_apps/create-pypo-user.py index a071213cd..94e07d7dc 100644 --- a/python_apps/create-pypo-user.py +++ b/python_apps/create-pypo-user.py @@ -11,13 +11,7 @@ def create_user(username): if (output[0:3] != "uid"): # Make the pypo user print " * Creating user "+username - os.system("adduser --system --quiet --group --shell /bin/bash "+username) - - #set pypo password - p = os.popen('/usr/bin/passwd pypo 1>/dev/null 2>&1', 'w') - p.write('pypo\n') - p.write('pypo\n') - p.close() + os.system("adduser --system --quiet --group "+username) else: print "User already exists." #add pypo to audio group From 57f782d3c23b6a14e592e4d1b7a9b514321a3569 Mon Sep 17 00:00:00 2001 From: Martin Konecny Date: Sun, 1 Apr 2012 00:20:47 -0400 Subject: [PATCH 02/14] CC-3520: Change default password of monit -fixed --- airtime_mvc/application/models/Systemstatus.php | 2 +- .../media-monitor/install/media-monitor-copy-files.py | 7 +++++++ python_apps/monit/monit-airtime-generic.cfg | 5 +++-- python_apps/pypo/install/pypo-copy-files.py | 7 +++++++ 4 files changed, 18 insertions(+), 3 deletions(-) diff --git a/airtime_mvc/application/models/Systemstatus.php b/airtime_mvc/application/models/Systemstatus.php index 8503a98d2..69f229b9c 100644 --- a/airtime_mvc/application/models/Systemstatus.php +++ b/airtime_mvc/application/models/Systemstatus.php @@ -10,7 +10,7 @@ class Application_Model_Systemstatus $ch = curl_init(); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_URL, $url); - curl_setopt($ch, CURLOPT_USERPWD, "admin:monit"); + curl_setopt($ch, CURLOPT_USERPWD, "guest:airtime"); $result = curl_exec($ch); curl_close($ch); diff --git a/python_apps/media-monitor/install/media-monitor-copy-files.py b/python_apps/media-monitor/install/media-monitor-copy-files.py index ecacf6ab1..1d62c42a2 100644 --- a/python_apps/media-monitor/install/media-monitor-copy-files.py +++ b/python_apps/media-monitor/install/media-monitor-copy-files.py @@ -1,6 +1,9 @@ import os import shutil import sys +import subprocess +import random +import string from configobj import ConfigObj if os.geteuid() != 0: @@ -25,6 +28,9 @@ def create_dir(path): except Exception, e: pass +def get_rand_string(length=10): + return ''.join(random.choice(string.ascii_uppercase + string.digits) for x in range(length)) + PATH_INI_FILE = '/etc/airtime/media-monitor.cfg' try: @@ -43,6 +49,7 @@ try: #copy monit files shutil.copy('%s/../../monit/monit-airtime-generic.cfg'%current_script_dir, '/etc/monit/conf.d/') + subprocess.call('sed -i "s/\$admin_pass/%s/g" /etc/monit/conf.d/monit-airtime-generic.cfg' % get_rand_string(), shell=True) if os.environ["disable_auto_start_services"] == "f": shutil.copy('%s/../monit-airtime-media-monitor.cfg'%current_script_dir, '/etc/monit/conf.d/') diff --git a/python_apps/monit/monit-airtime-generic.cfg b/python_apps/monit/monit-airtime-generic.cfg index e4b531587..4bb0c6497 100644 --- a/python_apps/monit/monit-airtime-generic.cfg +++ b/python_apps/monit/monit-airtime-generic.cfg @@ -1,5 +1,6 @@ - set daemon 10 # Poll at 5 second intervals + set daemon 10 # Poll at 10 second intervals set logfile /var/log/monit.log set httpd port 2812 - allow admin:monit + allow admin:$admin_pass + allow guest:airtime read-only diff --git a/python_apps/pypo/install/pypo-copy-files.py b/python_apps/pypo/install/pypo-copy-files.py index 1bef4d1de..7272f73a5 100644 --- a/python_apps/pypo/install/pypo-copy-files.py +++ b/python_apps/pypo/install/pypo-copy-files.py @@ -1,6 +1,9 @@ import os import shutil import sys +import subprocess +import random +import string from configobj import ConfigObj if os.geteuid() != 0: @@ -24,6 +27,9 @@ def create_dir(path): os.makedirs(path) except Exception, e: pass + +def get_rand_string(length=10): + return ''.join(random.choice(string.ascii_uppercase + string.digits) for x in range(length)) PATH_INI_FILE = '/etc/airtime/pypo.cfg' @@ -43,6 +49,7 @@ try: #copy monit files shutil.copy('%s/../../monit/monit-airtime-generic.cfg'%current_script_dir, '/etc/monit/conf.d/') + subprocess.call('sed -i "s/\$admin_pass/%s/g" /etc/monit/conf.d/monit-airtime-generic.cfg' % get_rand_string(), shell=True) shutil.copy('%s/../../monit/monit-airtime-rabbitmq-server.cfg'%current_script_dir, '/etc/monit/conf.d/') if os.environ["disable_auto_start_services"] == "f": shutil.copy('%s/../monit-airtime-liquidsoap.cfg'%current_script_dir, '/etc/monit/conf.d/') From 162c35419d565ff1d7b675745ef947002fe028e1 Mon Sep 17 00:00:00 2001 From: Martin Konecny Date: Mon, 2 Apr 2012 19:04:16 -0400 Subject: [PATCH 03/14] CC-3572: pypo user should have shell set to /bin/false -done --- CREDITS | 8 + VERSION | 2 +- install_minimal/include/airtime-constants.php | 2 +- install_minimal/include/airtime-upgrade.php | 4 + .../upgrades/airtime-2.0.3/UpgradeCommon.php | 252 ++++++++++++++++++ .../airtime-2.0.3/airtime-upgrade.php | 60 +++++ python_apps/api_clients/api_client.py | 2 +- 7 files changed, 327 insertions(+), 3 deletions(-) create mode 100644 install_minimal/upgrades/airtime-2.0.3/UpgradeCommon.php create mode 100644 install_minimal/upgrades/airtime-2.0.3/airtime-upgrade.php diff --git a/CREDITS b/CREDITS index 1e590de8d..f0e45a381 100644 --- a/CREDITS +++ b/CREDITS @@ -1,3 +1,11 @@ +======= +CREDITS +======= +Version 2.0.3 +------------- +Same as previous version. + + ======= CREDITS ======= diff --git a/VERSION b/VERSION index 8c022aa72..f7678dabc 100644 --- a/VERSION +++ b/VERSION @@ -1,2 +1,2 @@ PRODUCT_ID=Airtime -PRODUCT_RELEASE=2.0.2 +PRODUCT_RELEASE=2.0.3 diff --git a/install_minimal/include/airtime-constants.php b/install_minimal/include/airtime-constants.php index b1e5720f8..28e5afb01 100644 --- a/install_minimal/include/airtime-constants.php +++ b/install_minimal/include/airtime-constants.php @@ -1,3 +1,3 @@ getMessage().PHP_EOL; + echo $CC_DBC->getUserInfo().PHP_EOL; + echo "Database connection problem.".PHP_EOL; + echo "Check if database '{$CC_CONFIG['dsn']['database']}' exists". + " with corresponding permissions.".PHP_EOL; + if ($p_exitOnError) { + exit(1); + } + } else { + $CC_DBC->setFetchMode(DB_FETCHMODE_ASSOC); + } + } + + + public static function DbTableExists($p_name) + { + global $CC_DBC; + $sql = "SELECT * FROM ".$p_name; + $result = $CC_DBC->GetOne($sql); + if (PEAR::isError($result)) { + return false; + } + return true; + } + + private static function GetAirtimeSrcDir() + { + return __DIR__."/../../../airtime_mvc"; + } + + public static function MigrateTablesToVersion($dir, $version) + { + echo "Upgrading database, may take several minutes, please wait".PHP_EOL; + + $appDir = self::GetAirtimeSrcDir(); + $command = "php --php-ini $dir/../../airtime-php.ini ". + "$appDir/library/doctrine/migrations/doctrine-migrations.phar ". + "--configuration=$dir/../../DoctrineMigrations/migrations.xml ". + "--db-configuration=$appDir/library/doctrine/migrations/migrations-db.php ". + "--no-interaction migrations:migrate $version"; + system($command); + } + + public static function BypassMigrations($dir, $version) + { + $appDir = self::GetAirtimeSrcDir(); + $command = "php --php-ini $dir/../../airtime-php.ini ". + "$appDir/library/doctrine/migrations/doctrine-migrations.phar ". + "--configuration=$dir/../../DoctrineMigrations/migrations.xml ". + "--db-configuration=$appDir/library/doctrine/migrations/migrations-db.php ". + "--no-interaction --add migrations:version $version"; + system($command); + } + + public static function upgradeConfigFiles(){ + + $configFiles = array(UpgradeCommon::CONF_FILE_AIRTIME, + UpgradeCommon::CONF_FILE_PYPO, + UpgradeCommon::CONF_FILE_LIQUIDSOAP, + UpgradeCommon::CONF_FILE_MEDIAMONITOR, + UpgradeCommon::CONF_FILE_API_CLIENT); + + // Backup the config files + $suffix = date("Ymdhis")."-".UpgradeCommon::VERSION_NUMBER; + foreach ($configFiles as $conf) { + // do not back up monit cfg + if (file_exists($conf)) { + echo "Backing up $conf to $conf$suffix.bak".PHP_EOL; + //copy($conf, $conf.$suffix.".bak"); + exec("cp -p $conf $conf$suffix.bak"); //use cli version to preserve file attributes + } + } + + self::CreateIniFiles(UpgradeCommon::CONF_BACKUP_SUFFIX); + self::MergeConfigFiles($configFiles, $suffix); + } + + /** + * This function creates the /etc/airtime configuration folder + * and copies the default config files to it. + */ + public static function CreateIniFiles($suffix) + { + if (!file_exists("/etc/airtime/")){ + if (!mkdir("/etc/airtime/", 0755, true)){ + echo "Could not create /etc/airtime/ directory. Exiting."; + exit(1); + } + } + + if (!copy(__DIR__."/airtime.conf.$suffix", self::CONF_FILE_AIRTIME)){ + echo "Could not copy airtime.conf to /etc/airtime/. Exiting."; + exit(1); + } + if (!copy(__DIR__."/pypo.cfg.$suffix", self::CONF_FILE_PYPO)){ + echo "Could not copy pypo.cfg to /etc/airtime/. Exiting."; + exit(1); + } + if (!copy(__DIR__."/media-monitor.cfg.$suffix", self::CONF_FILE_MEDIAMONITOR)){ + echo "Could not copy meadia-monitor.cfg to /etc/airtime/. Exiting."; + exit(1); + } + if (!copy(__DIR__."/api_client.cfg.$suffix", self::CONF_FILE_API_CLIENT)){ + echo "Could not copy api_client.cfg to /etc/monit/conf.d/. Exiting."; + exit(1); + } + } + + private static function MergeConfigFiles($configFiles, $suffix) { + foreach ($configFiles as $conf) { + // we want to use new liquidsoap.cfg so don't merge + // also for monit + if( $conf == self::CONF_FILE_LIQUIDSOAP){ + continue; + } + if (file_exists("$conf$suffix.bak")) { + + if($conf === self::CONF_FILE_AIRTIME) { + // Parse with sections + $newSettings = parse_ini_file($conf, true); + $oldSettings = parse_ini_file("$conf$suffix.bak", true); + } + else { + $newSettings = self::ReadPythonConfig($conf); + $oldSettings = self::ReadPythonConfig("$conf$suffix.bak"); + } + + $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) { + // skip airtim_dir as we want to use new value + if($sectionKey != "airtime_dir"){ + if(isset($oldSettings[$section][$sectionKey])) { + self::UpdateIniValue($conf, $sectionKey, $oldSettings[$section][$sectionKey]); + } + } + } + } + else { + self::UpdateIniValue($conf, $section, $oldSettings[$section]); + } + } + } + } + } + } + + private static function ReadPythonConfig($p_filename) + { + $values = array(); + + $fh = fopen($p_filename, 'r'); + + while(!feof($fh)){ + $line = fgets($fh); + if(substr(trim($line), 0, 1) == '#' || trim($line) == ""){ + continue; + }else{ + $info = explode('=', $line, 2); + $values[trim($info[0])] = trim($info[1]); + } + } + + return $values; + } + + /** + * This function updates an INI style config file. + * + * A property and the value the property should be changed to are + * supplied. If the property is not found, then no changes are made. + * + * @param string $p_filename + * The path the to the file. + * @param string $p_property + * The property to look for in order to change its value. + * @param string $p_value + * The value the property should be changed to. + * + */ + private static function UpdateIniValue($p_filename, $p_property, $p_value) + { + $lines = file($p_filename); + $n=count($lines); + foreach ($lines as &$line) { + if ($line[0] != "#"){ + $key_value = explode("=", $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); + } + + public static function queryDb($p_sql){ + global $CC_DBC; + + $result = $CC_DBC->getRow($p_sql, $fetchmode=DB_FETCHMODE_ASSOC); + if (PEAR::isError($result)) { + echo "Error executing $sql. Exiting."; + exit(1); + } + + return $result; + } +} diff --git a/install_minimal/upgrades/airtime-2.0.3/airtime-upgrade.php b/install_minimal/upgrades/airtime-2.0.3/airtime-upgrade.php new file mode 100644 index 000000000..e10b110a2 --- /dev/null +++ b/install_minimal/upgrades/airtime-2.0.3/airtime-upgrade.php @@ -0,0 +1,60 @@ + Date: Mon, 2 Apr 2012 19:08:46 -0400 Subject: [PATCH 04/14] CC-3492: sudo airtime-log -t does not bring up show-recorder.log info -fixed --- utils/airtime-log.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/utils/airtime-log.php b/utils/airtime-log.php index 93b226ef0..476824cee 100644 --- a/utils/airtime-log.php +++ b/utils/airtime-log.php @@ -15,7 +15,7 @@ require_once('Zend/Loader/Autoloader.php'); $autoloader = Zend_Loader_Autoloader::getInstance(); $log_files = array("media-monitor" => "/var/log/airtime/media-monitor/media-monitor.log", - "recorder" => "/var/log/airtime/show-recorder/show-recorder.log", + "recorder" => "/var/log/airtime/pypo/show-recorder.log", "playout" => "/var/log/airtime/pypo/pypo.log", "liquidsoap" => "/var/log/airtime/pypo-liquidsoap/ls_script.log", "web" => "/var/log/airtime/zendphp.log"); From c66f0c783f71c83306c9daf0a537c0e22b71d359 Mon Sep 17 00:00:00 2001 From: Martin Konecny Date: Mon, 2 Apr 2012 19:25:27 -0400 Subject: [PATCH 05/14] CC-3573: Use posix_geteuid instead of "whoami" to detect who is running PHP script -done --- install_minimal/airtime-install | 2 +- install_minimal/airtime-uninstall | 2 +- install_minimal/include/AirtimeInstall.php | 2 +- install_minimal/include/airtime-copy-files.sh | 2 +- install_minimal/include/airtime-initialize.sh | 2 +- install_minimal/include/airtime-remove-files.sh | 2 +- install_minimal/include/airtime-uninitialize.sh | 2 +- install_minimal/include/airtime-upgrade.php | 2 +- utils/airtime-check-system.php | 2 +- utils/airtime-import/airtime-import.py | 2 +- utils/airtime-log.php | 2 +- utils/phone_home_stat.php | 2 +- 12 files changed, 12 insertions(+), 12 deletions(-) diff --git a/install_minimal/airtime-install b/install_minimal/airtime-install index 57f912c1c..6b54a9573 100755 --- a/install_minimal/airtime-install +++ b/install_minimal/airtime-install @@ -2,7 +2,7 @@ #-e Causes bash script to exit if any of the installers #return with a non-zero return value. -if [ `whoami` != 'root' ]; then +if [[ $EUID -ne 0 ]]; then echo "Please run as root user." exit 1 fi diff --git a/install_minimal/airtime-uninstall b/install_minimal/airtime-uninstall index fb5af754f..b99f04246 100755 --- a/install_minimal/airtime-uninstall +++ b/install_minimal/airtime-uninstall @@ -1,7 +1,7 @@ #!/bin/bash #Check if root user -if [ `whoami` != 'root' ]; then +if [[ $EUID -ne 0 ]]; then echo "Please run as root user." exit 1 fi diff --git a/install_minimal/include/AirtimeInstall.php b/install_minimal/include/AirtimeInstall.php index dc5869165..35567004a 100644 --- a/install_minimal/include/AirtimeInstall.php +++ b/install_minimal/include/AirtimeInstall.php @@ -33,7 +33,7 @@ class AirtimeInstall public static function ExitIfNotRoot() { // Need to check that we are superuser before running this. - if(exec("whoami") != "root"){ + if(posix_geteuid() != 0){ echo "Must be root user.\n"; exit(1); } diff --git a/install_minimal/include/airtime-copy-files.sh b/install_minimal/include/airtime-copy-files.sh index ad4f571d4..57339eff5 100755 --- a/install_minimal/include/airtime-copy-files.sh +++ b/install_minimal/include/airtime-copy-files.sh @@ -2,7 +2,7 @@ #-e Causes bash script to exit if any of the installers #return with a non-zero return value. -if [ `whoami` != 'root' ]; then +if [[ $EUID -ne 0 ]]; then echo "Please run as root user." exit 1 fi diff --git a/install_minimal/include/airtime-initialize.sh b/install_minimal/include/airtime-initialize.sh index 56be18066..82b03ee88 100755 --- a/install_minimal/include/airtime-initialize.sh +++ b/install_minimal/include/airtime-initialize.sh @@ -2,7 +2,7 @@ #-e Causes bash script to exit if any of the installers #return with a non-zero return value. -if [ `whoami` != 'root' ]; then +if [[ $EUID -ne 0 ]]; then echo "Please run as root user." exit 1 fi diff --git a/install_minimal/include/airtime-remove-files.sh b/install_minimal/include/airtime-remove-files.sh index 93e9efb60..11d9f93ad 100755 --- a/install_minimal/include/airtime-remove-files.sh +++ b/install_minimal/include/airtime-remove-files.sh @@ -2,7 +2,7 @@ #-e Causes bash script to exit if any of the installers #return with a non-zero return value. -if [ `whoami` != 'root' ]; then +if [[ $EUID -ne 0 ]]; then echo "Please run as root user." exit 1 fi diff --git a/install_minimal/include/airtime-uninitialize.sh b/install_minimal/include/airtime-uninitialize.sh index d26256367..1713ae7f2 100755 --- a/install_minimal/include/airtime-uninitialize.sh +++ b/install_minimal/include/airtime-uninitialize.sh @@ -2,7 +2,7 @@ #-e Causes bash script to exit if any of the installers #return with a non-zero return value. -if [ `whoami` != 'root' ]; then +if [[ $EUID -ne 0 ]]; then echo "Please run as root user." exit 1 fi diff --git a/install_minimal/include/airtime-upgrade.php b/install_minimal/include/airtime-upgrade.php index 5b356c225..f4d03c3c3 100644 --- a/install_minimal/include/airtime-upgrade.php +++ b/install_minimal/include/airtime-upgrade.php @@ -11,7 +11,7 @@ require_once(__DIR__.'/airtime-constants.php'); require_once(dirname(__FILE__).'/AirtimeIni.php'); require_once(dirname(__FILE__).'/AirtimeInstall.php'); -if(exec("whoami") != "root"){ +if(posix_geteuid() != 0){ echo "Must be root user.\n"; exit(1); } diff --git a/utils/airtime-check-system.php b/utils/airtime-check-system.php index 4f7237fc0..3ed877cd4 100644 --- a/utils/airtime-check-system.php +++ b/utils/airtime-check-system.php @@ -32,7 +32,7 @@ class AirtimeCheck { public static function ExitIfNotRoot() { // Need to check that we are superuser before running this. - $user = exec("whoami"); + $user = posix_getlogin(); if($user != "root" && $user != "www-data"){ echo "Must be root user.\n"; exit(1); diff --git a/utils/airtime-import/airtime-import.py b/utils/airtime-import/airtime-import.py index 083156192..6340da445 100644 --- a/utils/airtime-import/airtime-import.py +++ b/utils/airtime-import/airtime-import.py @@ -18,7 +18,7 @@ logging.disable(50) # add ch to logger logger.addHandler(ch) -if (commands.getoutput("whoami") != 'root'): +if (posix_geteuid() != 0): print 'Must be a root user.' sys.exit() diff --git a/utils/airtime-log.php b/utils/airtime-log.php index 476824cee..3e13ca502 100644 --- a/utils/airtime-log.php +++ b/utils/airtime-log.php @@ -30,7 +30,7 @@ array_filter($log_files, "file_exists"); function exitIfNotRoot() { // Need to check that we are superuser before running this. - if(exec("whoami") != "root"){ + if(posix_geteuid() != 0){ echo "Must be root user.\n"; exit(1); } diff --git a/utils/phone_home_stat.php b/utils/phone_home_stat.php index 98bc242f5..3a0e6526a 100644 --- a/utils/phone_home_stat.php +++ b/utils/phone_home_stat.php @@ -101,7 +101,7 @@ if(Application_Model_Preference::GetPlanLevel() == 'disabled'){ function exitIfNotRoot() { // Need to check that we are superuser before running this. - if(exec("whoami") != "root"){ + if(posix_geteuid() != 0){ echo "Must be root user.\n"; exit(1); } From 9e816df587d3bd15f6384b135c71b8b1ff9e4522 Mon Sep 17 00:00:00 2001 From: Martin Konecny Date: Mon, 2 Apr 2012 19:38:15 -0400 Subject: [PATCH 06/14] remove unneede script files --- .../upgrades/airtime-2.0.3/UpgradeCommon.php | 252 ------------------ .../airtime-2.0.3/airtime-upgrade.php | 17 +- 2 files changed, 4 insertions(+), 265 deletions(-) delete mode 100644 install_minimal/upgrades/airtime-2.0.3/UpgradeCommon.php diff --git a/install_minimal/upgrades/airtime-2.0.3/UpgradeCommon.php b/install_minimal/upgrades/airtime-2.0.3/UpgradeCommon.php deleted file mode 100644 index 75fe5012c..000000000 --- a/install_minimal/upgrades/airtime-2.0.3/UpgradeCommon.php +++ /dev/null @@ -1,252 +0,0 @@ -getMessage().PHP_EOL; - echo $CC_DBC->getUserInfo().PHP_EOL; - echo "Database connection problem.".PHP_EOL; - echo "Check if database '{$CC_CONFIG['dsn']['database']}' exists". - " with corresponding permissions.".PHP_EOL; - if ($p_exitOnError) { - exit(1); - } - } else { - $CC_DBC->setFetchMode(DB_FETCHMODE_ASSOC); - } - } - - - public static function DbTableExists($p_name) - { - global $CC_DBC; - $sql = "SELECT * FROM ".$p_name; - $result = $CC_DBC->GetOne($sql); - if (PEAR::isError($result)) { - return false; - } - return true; - } - - private static function GetAirtimeSrcDir() - { - return __DIR__."/../../../airtime_mvc"; - } - - public static function MigrateTablesToVersion($dir, $version) - { - echo "Upgrading database, may take several minutes, please wait".PHP_EOL; - - $appDir = self::GetAirtimeSrcDir(); - $command = "php --php-ini $dir/../../airtime-php.ini ". - "$appDir/library/doctrine/migrations/doctrine-migrations.phar ". - "--configuration=$dir/../../DoctrineMigrations/migrations.xml ". - "--db-configuration=$appDir/library/doctrine/migrations/migrations-db.php ". - "--no-interaction migrations:migrate $version"; - system($command); - } - - public static function BypassMigrations($dir, $version) - { - $appDir = self::GetAirtimeSrcDir(); - $command = "php --php-ini $dir/../../airtime-php.ini ". - "$appDir/library/doctrine/migrations/doctrine-migrations.phar ". - "--configuration=$dir/../../DoctrineMigrations/migrations.xml ". - "--db-configuration=$appDir/library/doctrine/migrations/migrations-db.php ". - "--no-interaction --add migrations:version $version"; - system($command); - } - - public static function upgradeConfigFiles(){ - - $configFiles = array(UpgradeCommon::CONF_FILE_AIRTIME, - UpgradeCommon::CONF_FILE_PYPO, - UpgradeCommon::CONF_FILE_LIQUIDSOAP, - UpgradeCommon::CONF_FILE_MEDIAMONITOR, - UpgradeCommon::CONF_FILE_API_CLIENT); - - // Backup the config files - $suffix = date("Ymdhis")."-".UpgradeCommon::VERSION_NUMBER; - foreach ($configFiles as $conf) { - // do not back up monit cfg - if (file_exists($conf)) { - echo "Backing up $conf to $conf$suffix.bak".PHP_EOL; - //copy($conf, $conf.$suffix.".bak"); - exec("cp -p $conf $conf$suffix.bak"); //use cli version to preserve file attributes - } - } - - self::CreateIniFiles(UpgradeCommon::CONF_BACKUP_SUFFIX); - self::MergeConfigFiles($configFiles, $suffix); - } - - /** - * This function creates the /etc/airtime configuration folder - * and copies the default config files to it. - */ - public static function CreateIniFiles($suffix) - { - if (!file_exists("/etc/airtime/")){ - if (!mkdir("/etc/airtime/", 0755, true)){ - echo "Could not create /etc/airtime/ directory. Exiting."; - exit(1); - } - } - - if (!copy(__DIR__."/airtime.conf.$suffix", self::CONF_FILE_AIRTIME)){ - echo "Could not copy airtime.conf to /etc/airtime/. Exiting."; - exit(1); - } - if (!copy(__DIR__."/pypo.cfg.$suffix", self::CONF_FILE_PYPO)){ - echo "Could not copy pypo.cfg to /etc/airtime/. Exiting."; - exit(1); - } - if (!copy(__DIR__."/media-monitor.cfg.$suffix", self::CONF_FILE_MEDIAMONITOR)){ - echo "Could not copy meadia-monitor.cfg to /etc/airtime/. Exiting."; - exit(1); - } - if (!copy(__DIR__."/api_client.cfg.$suffix", self::CONF_FILE_API_CLIENT)){ - echo "Could not copy api_client.cfg to /etc/monit/conf.d/. Exiting."; - exit(1); - } - } - - private static function MergeConfigFiles($configFiles, $suffix) { - foreach ($configFiles as $conf) { - // we want to use new liquidsoap.cfg so don't merge - // also for monit - if( $conf == self::CONF_FILE_LIQUIDSOAP){ - continue; - } - if (file_exists("$conf$suffix.bak")) { - - if($conf === self::CONF_FILE_AIRTIME) { - // Parse with sections - $newSettings = parse_ini_file($conf, true); - $oldSettings = parse_ini_file("$conf$suffix.bak", true); - } - else { - $newSettings = self::ReadPythonConfig($conf); - $oldSettings = self::ReadPythonConfig("$conf$suffix.bak"); - } - - $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) { - // skip airtim_dir as we want to use new value - if($sectionKey != "airtime_dir"){ - if(isset($oldSettings[$section][$sectionKey])) { - self::UpdateIniValue($conf, $sectionKey, $oldSettings[$section][$sectionKey]); - } - } - } - } - else { - self::UpdateIniValue($conf, $section, $oldSettings[$section]); - } - } - } - } - } - } - - private static function ReadPythonConfig($p_filename) - { - $values = array(); - - $fh = fopen($p_filename, 'r'); - - while(!feof($fh)){ - $line = fgets($fh); - if(substr(trim($line), 0, 1) == '#' || trim($line) == ""){ - continue; - }else{ - $info = explode('=', $line, 2); - $values[trim($info[0])] = trim($info[1]); - } - } - - return $values; - } - - /** - * This function updates an INI style config file. - * - * A property and the value the property should be changed to are - * supplied. If the property is not found, then no changes are made. - * - * @param string $p_filename - * The path the to the file. - * @param string $p_property - * The property to look for in order to change its value. - * @param string $p_value - * The value the property should be changed to. - * - */ - private static function UpdateIniValue($p_filename, $p_property, $p_value) - { - $lines = file($p_filename); - $n=count($lines); - foreach ($lines as &$line) { - if ($line[0] != "#"){ - $key_value = explode("=", $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); - } - - public static function queryDb($p_sql){ - global $CC_DBC; - - $result = $CC_DBC->getRow($p_sql, $fetchmode=DB_FETCHMODE_ASSOC); - if (PEAR::isError($result)) { - echo "Error executing $sql. Exiting."; - exit(1); - } - - return $result; - } -} diff --git a/install_minimal/upgrades/airtime-2.0.3/airtime-upgrade.php b/install_minimal/upgrades/airtime-2.0.3/airtime-upgrade.php index e10b110a2..429563cf7 100644 --- a/install_minimal/upgrades/airtime-2.0.3/airtime-upgrade.php +++ b/install_minimal/upgrades/airtime-2.0.3/airtime-upgrade.php @@ -15,15 +15,6 @@ * format, and that's what this upgrade script will be for. */ -set_include_path(__DIR__.'/../../../airtime_mvc/library' . PATH_SEPARATOR . get_include_path()); -set_include_path(__DIR__.'/../../../airtime_mvc/application/models' . PATH_SEPARATOR . get_include_path()); -set_include_path(__DIR__.'/../../../airtime_mvc/application/configs' . PATH_SEPARATOR . get_include_path()); -require_once 'conf.php'; -require_once 'propel/runtime/lib/Propel.php'; -Propel::init(__DIR__."/propel/airtime-conf.php"); - -require_once 'UpgradeCommon.php'; - class AirtimeStorWatchedDirsUpgrade{ public static function start(){ @@ -36,8 +27,6 @@ class AirtimeStorWatchedDirsUpgrade{ class AirtimeConfigFileUpgrade{ public static function start(){ - echo "* Updating configFiles\n"; - UpgradeCommon::upgradeConfigFiles(); } } @@ -47,6 +36,10 @@ class AirtimeConfigFileUpgrade{ class AirtimeMiscUpgrade{ public static function start(){ + self::modifyPypo(); + } + + public static function modifyPypo(){ echo "* Modifying User Pypo".PHP_EOL; exec("usermod -s /bin/false pypo"); exec("passwd --delete pypo"); @@ -54,7 +47,5 @@ class AirtimeMiscUpgrade{ } -UpgradeCommon::connectToDatabase(); -UpgradeCommon::SetDefaultTimezone(); AirtimeConfigFileUpgrade::start(); AirtimeMiscUpgrade::start(); From 6e127bbfdc9f690b909bfa054b1121c70303d833 Mon Sep 17 00:00:00 2001 From: Martin Konecny Date: Tue, 3 Apr 2012 10:40:44 -0400 Subject: [PATCH 07/14] cc-3473: use euid in airtime-check-system --- utils/airtime-check-system.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/utils/airtime-check-system.php b/utils/airtime-check-system.php index 3ed877cd4..c14e9715d 100644 --- a/utils/airtime-check-system.php +++ b/utils/airtime-check-system.php @@ -32,8 +32,9 @@ class AirtimeCheck { public static function ExitIfNotRoot() { // Need to check that we are superuser before running this. + $euid = posix_geteuid(); $user = posix_getlogin(); - if($user != "root" && $user != "www-data"){ + if($euid != 0 && $user != "www-data"){ echo "Must be root user.\n"; exit(1); } From f59af0db291c963de915d9ec59756a51b122252c Mon Sep 17 00:00:00 2001 From: Martin Konecny Date: Tue, 3 Apr 2012 10:54:23 -0400 Subject: [PATCH 08/14] CC-3520: Change default password of monit -upgrade script done --- .../airtime-2.0.3/airtime-upgrade.php | 20 ++++++++++++++++++- .../airtime-2.0.3/monit-airtime-generic.cfg | 6 ++++++ 2 files changed, 25 insertions(+), 1 deletion(-) create mode 100644 install_minimal/upgrades/airtime-2.0.3/monit-airtime-generic.cfg diff --git a/install_minimal/upgrades/airtime-2.0.3/airtime-upgrade.php b/install_minimal/upgrades/airtime-2.0.3/airtime-upgrade.php index 429563cf7..5639dd88f 100644 --- a/install_minimal/upgrades/airtime-2.0.3/airtime-upgrade.php +++ b/install_minimal/upgrades/airtime-2.0.3/airtime-upgrade.php @@ -37,6 +37,7 @@ class AirtimeMiscUpgrade{ public static function start(){ self::modifyPypo(); + self::modifyMonitPassword(); } public static function modifyPypo(){ @@ -44,8 +45,25 @@ class AirtimeMiscUpgrade{ exec("usermod -s /bin/false pypo"); exec("passwd --delete pypo"); } + + public static function modifyMonitPassword(){ + echo "* Generating Monit password".PHP_EOL; + copy(__DIR__."/monit-airtime-generic.cfg", "/etc/monit/conf.d/monit-airtime-generic.cfg"); + $pass = self::GenerateRandomString(10); + exec("sed -i 's/\$admin_pass/$pass/g' /etc/monit/conf.d/monit-airtime-generic.cfg"); + } + + public static function GenerateRandomString($p_len=20, $p_chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789') + { + $string = ''; + for ($i = 0; $i < $p_len; $i++) + { + $pos = mt_rand(0, strlen($p_chars)-1); + $string .= $p_chars{$pos}; + } + return $string; + } } - AirtimeConfigFileUpgrade::start(); AirtimeMiscUpgrade::start(); diff --git a/install_minimal/upgrades/airtime-2.0.3/monit-airtime-generic.cfg b/install_minimal/upgrades/airtime-2.0.3/monit-airtime-generic.cfg new file mode 100644 index 000000000..4bb0c6497 --- /dev/null +++ b/install_minimal/upgrades/airtime-2.0.3/monit-airtime-generic.cfg @@ -0,0 +1,6 @@ + set daemon 10 # Poll at 10 second intervals + set logfile /var/log/monit.log + + set httpd port 2812 + allow admin:$admin_pass + allow guest:airtime read-only From 05d0835cb86e4c0876f4ae7653f0c3d6b36ef50a Mon Sep 17 00:00:00 2001 From: Martin Konecny Date: Tue, 3 Apr 2012 11:48:14 -0400 Subject: [PATCH 09/14] CC-3586: airtime show recorder monit file should be removed -fixed --- install_minimal/upgrades/airtime-2.0.3/airtime-upgrade.php | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/install_minimal/upgrades/airtime-2.0.3/airtime-upgrade.php b/install_minimal/upgrades/airtime-2.0.3/airtime-upgrade.php index 5639dd88f..603aa6670 100644 --- a/install_minimal/upgrades/airtime-2.0.3/airtime-upgrade.php +++ b/install_minimal/upgrades/airtime-2.0.3/airtime-upgrade.php @@ -53,6 +53,11 @@ class AirtimeMiscUpgrade{ exec("sed -i 's/\$admin_pass/$pass/g' /etc/monit/conf.d/monit-airtime-generic.cfg"); } + public static function updateMonitConfFiles(){ + echo "* Updating Monit Conf Files".PHP_EOL; + @unlink("/etc/monit/conf.d/monit-airtime-show-recorder.cfg"); + } + public static function GenerateRandomString($p_len=20, $p_chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789') { $string = ''; From f1d410a64676980b0d455e28127958feea621763 Mon Sep 17 00:00:00 2001 From: Martin Konecny Date: Tue, 3 Apr 2012 12:00:08 -0400 Subject: [PATCH 10/14] 2.0.3 changelog --- changelog | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/changelog b/changelog index 66a9dadff..7e73679ef 100644 --- a/changelog +++ b/changelog @@ -1,3 +1,8 @@ +2.0.3 - April 3rd, 2012 + * Bug Fixes: + * monit user should have read-only permissions by default + * pypo user's shell should be /bin/false by default + 2.0.2 - February 28, 2012 * Bug Fixes: * Fixed Airtime could stop automatically playing after 24 hours if the web interface isn't used (regression in 2.0.1). @@ -8,6 +13,7 @@ * Other * Various optimizations to make Airtime feel snappier in the browser. Various views should load much quicker. + 2.0.1 - February 14, 2012 * Changes: * Widgets should have a version string so users can make sure widgets are up to date From 93904e3adc28c84d1ce59c41b23b4a9d69bec72e Mon Sep 17 00:00:00 2001 From: Martin Konecny Date: Tue, 3 Apr 2012 12:28:03 -0400 Subject: [PATCH 11/14] cc-3586: remove monit show-recorder file --- install_minimal/upgrades/airtime-2.0.3/airtime-upgrade.php | 1 + 1 file changed, 1 insertion(+) diff --git a/install_minimal/upgrades/airtime-2.0.3/airtime-upgrade.php b/install_minimal/upgrades/airtime-2.0.3/airtime-upgrade.php index 603aa6670..dffd187f8 100644 --- a/install_minimal/upgrades/airtime-2.0.3/airtime-upgrade.php +++ b/install_minimal/upgrades/airtime-2.0.3/airtime-upgrade.php @@ -38,6 +38,7 @@ class AirtimeMiscUpgrade{ public static function start(){ self::modifyPypo(); self::modifyMonitPassword(); + self::updateMonitConfFiles(); } public static function modifyPypo(){ From 5737053561fe3bfac925929cfbb8f37cba707755 Mon Sep 17 00:00:00 2001 From: Martin Konecny Date: Tue, 3 Apr 2012 13:45:13 -0400 Subject: [PATCH 12/14] cc-3573: incorrect function used in airtime-import.py --- utils/airtime-import/airtime-import.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/utils/airtime-import/airtime-import.py b/utils/airtime-import/airtime-import.py index 6340da445..ee1fb6cdf 100644 --- a/utils/airtime-import/airtime-import.py +++ b/utils/airtime-import/airtime-import.py @@ -18,7 +18,7 @@ logging.disable(50) # add ch to logger logger.addHandler(ch) -if (posix_geteuid() != 0): +if (os.geteuid() != 0): print 'Must be a root user.' sys.exit() From d9d8211a3bd15d9f374e8a829fbfcbbf77c0638d Mon Sep 17 00:00:00 2001 From: Martin Konecny Date: Wed, 4 Apr 2012 15:25:57 -0400 Subject: [PATCH 13/14] CC-3601: Pypo schedule needs to be sorted before pushing -fixed --- python_apps/pypo/pypopush.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/python_apps/pypo/pypopush.py b/python_apps/pypo/pypopush.py index 24f48c7cb..e40897d68 100644 --- a/python_apps/pypo/pypopush.py +++ b/python_apps/pypo/pypopush.py @@ -79,8 +79,9 @@ class PypoPush(Thread): tcoming = time.gmtime(timenow + self.push_ahead) str_tnow_s = "%04d-%02d-%02d-%02d-%02d-%02d" % (tnow[0], tnow[1], tnow[2], tnow[3], tnow[4], tnow[5]) str_tcoming_s = "%04d-%02d-%02d-%02d-%02d-%02d" % (tcoming[0], tcoming[1], tcoming[2], tcoming[3], tcoming[4], tcoming[5]) - - for pkey in schedule: + + sorted_schedule = sorted(schedule.keys()) + for pkey in sorted_schedule: plstart = schedule[pkey]['start'][0:19] if str_tnow_s <= plstart and plstart < str_tcoming_s: From 60d521a88af183953ae3c2dff6fae946fa2a5c36 Mon Sep 17 00:00:00 2001 From: Martin Konecny Date: Thu, 5 Apr 2012 20:42:15 -0400 Subject: [PATCH 14/14] CC-3575: Use invoke-rc.d to start and stop services, rather than calling init scripts directly -done --- install_minimal/airtime-install | 6 +++--- install_minimal/include/airtime-initialize.sh | 2 +- .../install/media-monitor-initialize.py | 7 ++----- .../install/media-monitor-uninitialize.py | 2 +- .../install/media-monitor-uninstall.py | 2 +- python_apps/pypo/install/pypo-initialize.py | 13 ++----------- python_apps/pypo/install/pypo-uninitialize.py | 2 +- python_apps/pypo/install/pypo-uninstall.py | 2 +- 8 files changed, 12 insertions(+), 24 deletions(-) diff --git a/install_minimal/airtime-install b/install_minimal/airtime-install index 6b54a9573..c40d90cff 100755 --- a/install_minimal/airtime-install +++ b/install_minimal/airtime-install @@ -126,13 +126,13 @@ fi #We don't want any of our python services running if we are doing an upgrade/reinstall. #They will be automatically restarted later on. if [ -e /etc/init.d/airtime-media-monitor ]; then - /etc/init.d/airtime-media-monitor stop > /dev/null 2>&1 + invoke-rc.d airtime-media-monitor stop > /dev/null 2>&1 fi if [ -e /etc/init.d/airtime-playout ]; then - /etc/init.d/airtime-playout stop > /dev/null 2>&1 + invoke-rc.d airtime-playout stop > /dev/null 2>&1 fi if [ -e /etc/init.d/airtime-show-recorder ]; then - /etc/init.d/airtime-show-recorder stop > /dev/null 2>&1 + invoke-rc.d airtime-show-recorder stop > /dev/null 2>&1 fi diff --git a/install_minimal/include/airtime-initialize.sh b/install_minimal/include/airtime-initialize.sh index 82b03ee88..a709c50c7 100755 --- a/install_minimal/include/airtime-initialize.sh +++ b/install_minimal/include/airtime-initialize.sh @@ -46,7 +46,7 @@ fi # so we can ensure they can register with monit to monitor them when they start. # If monit is already running, this step is still useful as we need monit to # reload its config files. -/etc/init.d/monit restart +invoke-rc.d monit restart #give monit some time to boot-up before issuing commands sleep 1 diff --git a/python_apps/media-monitor/install/media-monitor-initialize.py b/python_apps/media-monitor/install/media-monitor-initialize.py index b4eb7a581..4f7c7391d 100644 --- a/python_apps/media-monitor/install/media-monitor-initialize.py +++ b/python_apps/media-monitor/install/media-monitor-initialize.py @@ -14,11 +14,8 @@ try: #Start media-monitor daemon print "* Waiting for media-monitor processes to start..." - """ - p = Popen("/etc/init.d/airtime-media-monitor stop", shell=True) - sts = os.waitpid(p.pid, 0)[1] - """ - p = Popen("/etc/init.d/airtime-media-monitor start-no-monit", shell=True) + + p = Popen("invoke-rc.d airtime-media-monitor start-no-monit", shell=True) sts = os.waitpid(p.pid, 0)[1] except Exception, e: print e diff --git a/python_apps/media-monitor/install/media-monitor-uninitialize.py b/python_apps/media-monitor/install/media-monitor-uninitialize.py index f147673c8..a7cca67dc 100644 --- a/python_apps/media-monitor/install/media-monitor-uninitialize.py +++ b/python_apps/media-monitor/install/media-monitor-uninitialize.py @@ -9,7 +9,7 @@ if os.geteuid() != 0: try: print "Waiting for media-monitor processes to stop...", if (os.path.exists('/etc/init.d/airtime-media-monitor')): - p = Popen("/etc/init.d/airtime-media-monitor stop", shell=True) + p = Popen("invoke-rc.d airtime-media-monitor stop", shell=True) sts = os.waitpid(p.pid, 0)[1] print "OK" else: diff --git a/python_apps/media-monitor/install/media-monitor-uninstall.py b/python_apps/media-monitor/install/media-monitor-uninstall.py index ed6fa4195..d2a201316 100644 --- a/python_apps/media-monitor/install/media-monitor-uninstall.py +++ b/python_apps/media-monitor/install/media-monitor-uninstall.py @@ -29,7 +29,7 @@ try: print 'Error loading config file: ', e sys.exit(1) - os.system("/etc/init.d/airtime-media-monitor stop") + os.system("invoke-rc.d airtime-media-monitor stop") os.system("rm -f /etc/init.d/airtime-media-monitor") os.system("update-rc.d -f airtime-media-monitor remove >/dev/null 2>&1") diff --git a/python_apps/pypo/install/pypo-initialize.py b/python_apps/pypo/install/pypo-initialize.py index acf3cf50d..3273b5da3 100644 --- a/python_apps/pypo/install/pypo-initialize.py +++ b/python_apps/pypo/install/pypo-initialize.py @@ -117,17 +117,8 @@ try: #restart airtime-playout print "* Waiting for pypo processes to start..." - """ - if os.environ["liquidsoap_keep_alive"] == "f": - print " * Restarting any previous Liquidsoap instances" - p = Popen("/etc/init.d/airtime-playout stop > /dev/null 2>&1", shell=True) - sts = os.waitpid(p.pid, 0)[1] - else: - print " * Keeping any previous Liquidsoap instances running" - p = Popen("/etc/init.d/airtime-playout pypo-stop > /dev/null 2>&1", shell=True) - sts = os.waitpid(p.pid, 0)[1] - """ - p = Popen("/etc/init.d/airtime-playout start-no-monit > /dev/null 2>&1", shell=True) + + p = Popen("invoke-rc.d airtime-playout start-no-monit > /dev/null 2>&1", shell=True) sts = os.waitpid(p.pid, 0)[1] except Exception, e: diff --git a/python_apps/pypo/install/pypo-uninitialize.py b/python_apps/pypo/install/pypo-uninitialize.py index 864d94a3d..2329e88e7 100644 --- a/python_apps/pypo/install/pypo-uninitialize.py +++ b/python_apps/pypo/install/pypo-uninitialize.py @@ -10,7 +10,7 @@ try: #stop pypo and liquidsoap processes print "Waiting for pypo processes to stop...", if (os.path.exists('/etc/init.d/airtime-playout')): - p = Popen("/etc/init.d/airtime-playout stop", shell=True) + p = Popen("invoke-rc.d airtime-playout stop", shell=True) sts = os.waitpid(p.pid, 0)[1] print "OK" else: diff --git a/python_apps/pypo/install/pypo-uninstall.py b/python_apps/pypo/install/pypo-uninstall.py index 9b4429598..f3306d9c7 100644 --- a/python_apps/pypo/install/pypo-uninstall.py +++ b/python_apps/pypo/install/pypo-uninstall.py @@ -30,7 +30,7 @@ try: print 'Error loading config file: ', e sys.exit(1) - os.system("/etc/init.d/airtime-playout stop") + os.system("invoke-rc.d airtime-playout stop") os.system("rm -f /etc/init.d/airtime-playout") os.system("update-rc.d -f airtime-playout remove >/dev/null 2>&1")