From b4c014dbcc9440c30e74c6fe2761a8cfc7b35ec6 Mon Sep 17 00:00:00 2001 From: Rudi Grinberg Date: Mon, 20 Aug 2012 11:19:57 -0400 Subject: [PATCH 1/8] cc-4227: changed upgrade method. added test stubs for it --- .../media-monitor2/tests/test_upgrade2dot2.py | 5 +++ python_apps/media-monitor2/upgrade2.2.py | 37 ------------------- python_apps/media-monitor2/upgrade2dot2.py | 28 ++++++++++++++ 3 files changed, 33 insertions(+), 37 deletions(-) create mode 100644 python_apps/media-monitor2/tests/test_upgrade2dot2.py delete mode 100644 python_apps/media-monitor2/upgrade2.2.py create mode 100644 python_apps/media-monitor2/upgrade2dot2.py diff --git a/python_apps/media-monitor2/tests/test_upgrade2dot2.py b/python_apps/media-monitor2/tests/test_upgrade2dot2.py new file mode 100644 index 000000000..bad930478 --- /dev/null +++ b/python_apps/media-monitor2/tests/test_upgrade2dot2.py @@ -0,0 +1,5 @@ +import unittest +import upgrade2dot2 + +class TestUpgrade(unittest.TestCase): + pass diff --git a/python_apps/media-monitor2/upgrade2.2.py b/python_apps/media-monitor2/upgrade2.2.py deleted file mode 100644 index 4c243be85..000000000 --- a/python_apps/media-monitor2/upgrade2.2.py +++ /dev/null @@ -1,37 +0,0 @@ -import os -from configobj import ConfigObj -import traceback - -upgrades_config = { - '/etc/airtime/media-monitor.cfg' : - { - 'check_filesystem_events' : 5, - 'check_airtime_events' : 30, - 'touch_interval' : 5, - 'chunking_number' : 450, - 'request_max_wait' : 3.0, - 'rmq_event_wait' : 0.1, - 'logpath' : '/var/log/airtime/media-monitor/media-monitor.log', - 'index_path' : '/var/tmp/airtime/media-monitor/last_index', - }, - '/etc/airtime/api_client.cfg' : - { - 'reload_metadata_group' : - 'reload-metadata-group/format/json/api_key/%%api_key%%', - } -} - -def upgrade(upgrade_data): - for f, values in upgrade_data: - if not os.path.exists(f): - print("Cannot upgrade '%s'. Skipping this file" % f) - continue - try: - cfg = ConfigObj(f) - for k,v in values: - if k not in cfg: cfg[k] = v - except Exception: - print("Error upgrading") - print( traceback.format_exc() ) - -if __name__ == "__main__": upgrade(upgrades_config) diff --git a/python_apps/media-monitor2/upgrade2dot2.py b/python_apps/media-monitor2/upgrade2dot2.py new file mode 100644 index 000000000..88d910d10 --- /dev/null +++ b/python_apps/media-monitor2/upgrade2dot2.py @@ -0,0 +1,28 @@ +import os +from configobj import ConfigObj +import traceback + +upgrades_config = { + '/etc/airtime/media-monitor.cfg' : '../media-monitor/media-monitor.cfg', + '/etc/airtime/api_client.cfg' : '../api_clients/api_client.cfg', +} + +def upgrade(upgrade_data): + """ + Must be ran as sudo. will do upgrade of configuration files by filling in + missing values according to upgrade_data + """ + for source, destination in upgrade_data: + if not os.path.exists(source): + print("Cannot upgrade '%s'. Skipping this file" % source) + continue + try: + cfg_source, cfg_dest = ConfigObj(source), ConfigObj(destination) + for key, val in cfg_source: + if key not in cfg_dest: cfg_dest[key] = val + cfg_dest.write() + except Exception: + print("Error upgrading") + print( traceback.format_exc() ) + +if __name__ == "__main__": upgrade(upgrades_config) From abeef43a5b8ee5699895f01cbf5a96647112f8b3 Mon Sep 17 00:00:00 2001 From: Rudi Grinberg Date: Mon, 20 Aug 2012 12:15:29 -0400 Subject: [PATCH 2/8] cc-4227: fixed small bugs in upgrade script and finished testing --- .../media-monitor2/tests/test_upgrade2dot2.py | 48 ++++++++++++++++++- python_apps/media-monitor2/upgrade2dot2.py | 4 +- 2 files changed, 49 insertions(+), 3 deletions(-) diff --git a/python_apps/media-monitor2/tests/test_upgrade2dot2.py b/python_apps/media-monitor2/tests/test_upgrade2dot2.py index bad930478..fc74d8984 100644 --- a/python_apps/media-monitor2/tests/test_upgrade2dot2.py +++ b/python_apps/media-monitor2/tests/test_upgrade2dot2.py @@ -1,5 +1,51 @@ +from configobj import ConfigObj import unittest +import os import upgrade2dot2 + +def create_cfg(cfg): + config = ConfigObj() + config.filename = cfg['path'] + for k,v in cfg['data'].iteritems(): config[k] = v + return config + class TestUpgrade(unittest.TestCase): - pass + + def setUp(self): + self.source = 'ttt1.cfg' + self.dest = 'ttt2.cfg' + + def test_upgrade(self): + cf = { + 'source' : { + 'path' : self.source, + 'data' : { + 'key1' : 'val1', + 'key2' : 'val2', + 'key3' : 5, + 'key4' : 10,}, + }, + 'dest' : { + 'path' : self.dest, + 'data' : { + 'key1' : 'NEW_VAL', + 'key3' : 25, } + } + } + config1, config2 = create_cfg(cf['source']), create_cfg(cf['dest']) + for c in [config1,config2]: c.write() + self.assertTrue( os.path.exists(cf['source']['path']) ) + self.assertTrue( os.path.exists(cf['dest']['path']) ) + # Finished preparing + upgrade2dot2.upgrade({ cf['source']['path'] : cf['dest']['path'] }) + c1, c2 = ConfigObj(cf['source']['path']), ConfigObj(cf['dest']['path']) + self.assertEqual( c2['key2'], 'val2') + self.assertEqual( c2['key4'], '10') + self.assertEqual( c2['key3'], '25') + + def tearDown(self): + for clean in [ self.source, self.dest ]: + os.unlink(clean) + +if __name__ == '__main__': unittest.main() diff --git a/python_apps/media-monitor2/upgrade2dot2.py b/python_apps/media-monitor2/upgrade2dot2.py index 88d910d10..5283c28b1 100644 --- a/python_apps/media-monitor2/upgrade2dot2.py +++ b/python_apps/media-monitor2/upgrade2dot2.py @@ -12,13 +12,13 @@ def upgrade(upgrade_data): Must be ran as sudo. will do upgrade of configuration files by filling in missing values according to upgrade_data """ - for source, destination in upgrade_data: + for source, destination in upgrade_data.iteritems(): if not os.path.exists(source): print("Cannot upgrade '%s'. Skipping this file" % source) continue try: cfg_source, cfg_dest = ConfigObj(source), ConfigObj(destination) - for key, val in cfg_source: + for key, val in cfg_source.iteritems(): if key not in cfg_dest: cfg_dest[key] = val cfg_dest.write() except Exception: From 6c1e822b6a3b65ccef3731eef727ac6b416c48ef Mon Sep 17 00:00:00 2001 From: Rudi Grinberg Date: Mon, 20 Aug 2012 12:32:16 -0400 Subject: [PATCH 3/8] cc-4227: updated install scripts for upgrade --- .../api_clients/install/api_client_install.py | 7 ++++-- .../install/media-monitor-copy-files.py | 4 +++ .../media-monitor2/tests/test_upgrade2dot2.py | 2 +- python_apps/media-monitor2/upgrade2dot2.py | 25 +++++++++---------- 4 files changed, 22 insertions(+), 16 deletions(-) diff --git a/python_apps/api_clients/install/api_client_install.py b/python_apps/api_clients/install/api_client_install.py index 461dea372..c81b0b47b 100644 --- a/python_apps/api_clients/install/api_client_install.py +++ b/python_apps/api_clients/install/api_client_install.py @@ -2,6 +2,7 @@ import os import shutil import sys from configobj import ConfigObj +import upgrade2dot2 def get_current_script_dir(): return os.path.dirname(os.path.realpath(__file__)) @@ -14,12 +15,14 @@ def copy_dir(src_dir, dest_dir): shutil.copytree(src_dir, dest_dir) PATH_INI_FILE = '/etc/airtime/api_client.cfg' - + current_script_dir = get_current_script_dir() if not os.path.exists(PATH_INI_FILE): shutil.copy('%s/../api_client.cfg'%current_script_dir, PATH_INI_FILE) - + +upgrade2dot2.upgrade('%s/../api_client.cfg'% current_script_dir, PATH_INI_FILE) + """load config file""" try: config = ConfigObj("%s/../api_client.cfg" % current_script_dir) 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 5f3b5d0f0..41ab6e8fc 100644 --- a/python_apps/media-monitor/install/media-monitor-copy-files.py +++ b/python_apps/media-monitor/install/media-monitor-copy-files.py @@ -4,6 +4,7 @@ import sys import subprocess import random import string +import upgrade2dot2 from configobj import ConfigObj if os.geteuid() != 0: @@ -62,6 +63,9 @@ try: mm2_source = os.path.realpath(os.path.join(current_script_dir, "../../media-monitor2")) copy_dir(mm2_source, os.path.join( config["bin_dir"], "mm2" )) + # upgrade mm2 config + upgrade2dot2.upgrade(('%s/../media-monitor.cfg'%current_script_dir), + PATH_INI_FILE) #copy init.d script shutil.copy(config["bin_dir"]+"/airtime-media-monitor-init-d", "/etc/init.d/airtime-media-monitor") diff --git a/python_apps/media-monitor2/tests/test_upgrade2dot2.py b/python_apps/media-monitor2/tests/test_upgrade2dot2.py index fc74d8984..aa6fb57cc 100644 --- a/python_apps/media-monitor2/tests/test_upgrade2dot2.py +++ b/python_apps/media-monitor2/tests/test_upgrade2dot2.py @@ -38,7 +38,7 @@ class TestUpgrade(unittest.TestCase): self.assertTrue( os.path.exists(cf['source']['path']) ) self.assertTrue( os.path.exists(cf['dest']['path']) ) # Finished preparing - upgrade2dot2.upgrade({ cf['source']['path'] : cf['dest']['path'] }) + upgrade2dot2.upgrade(cf['source']['path'], cf['dest']['path'] ) c1, c2 = ConfigObj(cf['source']['path']), ConfigObj(cf['dest']['path']) self.assertEqual( c2['key2'], 'val2') self.assertEqual( c2['key4'], '10') diff --git a/python_apps/media-monitor2/upgrade2dot2.py b/python_apps/media-monitor2/upgrade2dot2.py index 5283c28b1..6b8e684ae 100644 --- a/python_apps/media-monitor2/upgrade2dot2.py +++ b/python_apps/media-monitor2/upgrade2dot2.py @@ -7,22 +7,21 @@ upgrades_config = { '/etc/airtime/api_client.cfg' : '../api_clients/api_client.cfg', } -def upgrade(upgrade_data): +def upgrade(source, destination): """ Must be ran as sudo. will do upgrade of configuration files by filling in missing values according to upgrade_data """ - for source, destination in upgrade_data.iteritems(): - if not os.path.exists(source): - print("Cannot upgrade '%s'. Skipping this file" % source) - continue - try: - cfg_source, cfg_dest = ConfigObj(source), ConfigObj(destination) - for key, val in cfg_source.iteritems(): - if key not in cfg_dest: cfg_dest[key] = val - cfg_dest.write() - except Exception: - print("Error upgrading") - print( traceback.format_exc() ) + if not os.path.exists(source): + print("Cannot upgrade '%s'. Skipping this file" % source) + return + try: + cfg_source, cfg_dest = ConfigObj(source), ConfigObj(destination) + for key, val in cfg_source.iteritems(): + if key not in cfg_dest: cfg_dest[key] = val + cfg_dest.write() + except Exception: + print("Error upgrading") + print( traceback.format_exc() ) if __name__ == "__main__": upgrade(upgrades_config) From 51fc87c6381c0d838b78457c097822987d47e993 Mon Sep 17 00:00:00 2001 From: Rudi Grinberg Date: Mon, 20 Aug 2012 15:02:39 -0400 Subject: [PATCH 4/8] cc-4227: removed unnecessary code --- python_apps/media-monitor2/upgrade2dot2.py | 7 ------- 1 file changed, 7 deletions(-) diff --git a/python_apps/media-monitor2/upgrade2dot2.py b/python_apps/media-monitor2/upgrade2dot2.py index 6b8e684ae..232d930f5 100644 --- a/python_apps/media-monitor2/upgrade2dot2.py +++ b/python_apps/media-monitor2/upgrade2dot2.py @@ -2,11 +2,6 @@ import os from configobj import ConfigObj import traceback -upgrades_config = { - '/etc/airtime/media-monitor.cfg' : '../media-monitor/media-monitor.cfg', - '/etc/airtime/api_client.cfg' : '../api_clients/api_client.cfg', -} - def upgrade(source, destination): """ Must be ran as sudo. will do upgrade of configuration files by filling in @@ -23,5 +18,3 @@ def upgrade(source, destination): except Exception: print("Error upgrading") print( traceback.format_exc() ) - -if __name__ == "__main__": upgrade(upgrades_config) From b2158d48f5390589fe468148392d6926c9c9eb1d Mon Sep 17 00:00:00 2001 From: Rudi Grinberg Date: Mon, 20 Aug 2012 16:05:26 -0400 Subject: [PATCH 5/8] Upgrade Script: Fixed possible bug where values with "=" characters will not be read correctly by the inhouse ini reader. --- install_minimal/include/AirtimeIni.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install_minimal/include/AirtimeIni.php b/install_minimal/include/AirtimeIni.php index b53a37219..8d631f8e4 100644 --- a/install_minimal/include/AirtimeIni.php +++ b/install_minimal/include/AirtimeIni.php @@ -237,7 +237,7 @@ class AirtimeIni $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]); + $info = explode("=", $lines[$i], 2); $values[trim($info[0])] = trim($info[1]); } } From e46f0d2b4d042fed9fd5a44311c637398d2558f2 Mon Sep 17 00:00:00 2001 From: Rudi Grinberg Date: Mon, 20 Aug 2012 16:06:11 -0400 Subject: [PATCH 6/8] cc-4227 Added clause for airtime 2.2.0 in the general upgrade script. --- install_minimal/include/airtime-upgrade.php | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/install_minimal/include/airtime-upgrade.php b/install_minimal/include/airtime-upgrade.php index 66ffa3200..913fcd082 100644 --- a/install_minimal/include/airtime-upgrade.php +++ b/install_minimal/include/airtime-upgrade.php @@ -116,5 +116,8 @@ if (strcmp($version, "2.1.3") < 0){ passthru("php --php-ini $SCRIPTPATH/../airtime-php.ini $SCRIPTPATH/../upgrades/airtime-2.1.3/airtime-upgrade.php"); pause(); } - +if (strcmp($version, "2.2.0") < 0){ + passthru("php --php-ini $SCRIPTPATH/../airtime-php.ini $SCRIPTPATH/../upgrades/airtime-2.2.0/airtime-upgrade.php"); + pause(); +} echo "******************************* Upgrade Complete *******************************".PHP_EOL; From 48ae4a578fc258a6669ed667428478d57f126579 Mon Sep 17 00:00:00 2001 From: Rudi Grinberg Date: Mon, 20 Aug 2012 16:15:14 -0400 Subject: [PATCH 7/8] cc-4227 Added comments. Removed bad/old upgrade code. --- python_apps/api_clients/install/api_client_install.py | 3 --- python_apps/media-monitor/install/media-monitor-copy-files.py | 4 ---- python_apps/media-monitor2/media/monitor/pure.py | 2 ++ 3 files changed, 2 insertions(+), 7 deletions(-) diff --git a/python_apps/api_clients/install/api_client_install.py b/python_apps/api_clients/install/api_client_install.py index c81b0b47b..abc1d07de 100644 --- a/python_apps/api_clients/install/api_client_install.py +++ b/python_apps/api_clients/install/api_client_install.py @@ -2,7 +2,6 @@ import os import shutil import sys from configobj import ConfigObj -import upgrade2dot2 def get_current_script_dir(): return os.path.dirname(os.path.realpath(__file__)) @@ -21,8 +20,6 @@ current_script_dir = get_current_script_dir() if not os.path.exists(PATH_INI_FILE): shutil.copy('%s/../api_client.cfg'%current_script_dir, PATH_INI_FILE) -upgrade2dot2.upgrade('%s/../api_client.cfg'% current_script_dir, PATH_INI_FILE) - """load config file""" try: config = ConfigObj("%s/../api_client.cfg" % current_script_dir) 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 41ab6e8fc..5f3b5d0f0 100644 --- a/python_apps/media-monitor/install/media-monitor-copy-files.py +++ b/python_apps/media-monitor/install/media-monitor-copy-files.py @@ -4,7 +4,6 @@ import sys import subprocess import random import string -import upgrade2dot2 from configobj import ConfigObj if os.geteuid() != 0: @@ -63,9 +62,6 @@ try: mm2_source = os.path.realpath(os.path.join(current_script_dir, "../../media-monitor2")) copy_dir(mm2_source, os.path.join( config["bin_dir"], "mm2" )) - # upgrade mm2 config - upgrade2dot2.upgrade(('%s/../media-monitor.cfg'%current_script_dir), - PATH_INI_FILE) #copy init.d script shutil.copy(config["bin_dir"]+"/airtime-media-monitor-init-d", "/etc/init.d/airtime-media-monitor") diff --git a/python_apps/media-monitor2/media/monitor/pure.py b/python_apps/media-monitor2/media/monitor/pure.py index 2657ec2d7..3f0b8bbe4 100644 --- a/python_apps/media-monitor2/media/monitor/pure.py +++ b/python_apps/media-monitor2/media/monitor/pure.py @@ -273,6 +273,8 @@ def organized_path(old_path, root_path, orig_md): def default_f(dictionary, key): if key in dictionary: return len(dictionary[key]) == 0 else: return True + # We set some metadata elements to a default "unknown" value because we use + # these fields to create a path hence they cannot be empty normal_md = default_to_f(orig_md, path_md, unicode_unknown, default_f) if is_airtime_recorded(normal_md): fname = u'%s-%s-%s.%s' % ( normal_md['MDATA_KEY_YEAR'], From c43e1b3b5ec5652218a201738b79de4ef12ad013 Mon Sep 17 00:00:00 2001 From: Rudi Grinberg Date: Mon, 20 Aug 2012 16:23:51 -0400 Subject: [PATCH 8/8] cc-4227: added new upgrade scripts --- .../airtime-2.2.0/ConfFileUpgrade.php | 16 ++ .../upgrades/airtime-2.2.0/DbUpgrade.php | 24 ++ .../airtime-2.2.0/airtime-upgrade.php | 11 + .../airtime-2.2.0/common/UpgradeCommon.php | 246 ++++++++++++++++++ 4 files changed, 297 insertions(+) create mode 100644 install_minimal/upgrades/airtime-2.2.0/ConfFileUpgrade.php create mode 100644 install_minimal/upgrades/airtime-2.2.0/DbUpgrade.php create mode 100644 install_minimal/upgrades/airtime-2.2.0/airtime-upgrade.php create mode 100644 install_minimal/upgrades/airtime-2.2.0/common/UpgradeCommon.php diff --git a/install_minimal/upgrades/airtime-2.2.0/ConfFileUpgrade.php b/install_minimal/upgrades/airtime-2.2.0/ConfFileUpgrade.php new file mode 100644 index 000000000..8aab3191d --- /dev/null +++ b/install_minimal/upgrades/airtime-2.2.0/ConfFileUpgrade.php @@ -0,0 +1,16 @@ +&1 | grep -v \"will create implicit index\""); + } +} diff --git a/install_minimal/upgrades/airtime-2.2.0/airtime-upgrade.php b/install_minimal/upgrades/airtime-2.2.0/airtime-upgrade.php new file mode 100644 index 000000000..924babbdb --- /dev/null +++ b/install_minimal/upgrades/airtime-2.2.0/airtime-upgrade.php @@ -0,0 +1,11 @@ +fetchColumn(); + + date_default_timezone_set($timezone); + } + + public static function connectToDatabase($p_exitOnError = true) + { + try { + $con = Propel::getConnection(); + } catch (Exception $e) { + echo $e->getMessage().PHP_EOL; + echo "Database connection problem.".PHP_EOL; + echo "Check if database exists with corresponding permissions.".PHP_EOL; + if ($p_exitOnError) { + exit(1); + } + return false; + } + return true; + } + + + public static function DbTableExists($p_name) + { + $con = Propel::getConnection(); + try { + $sql = "SELECT * FROM ".$p_name." LIMIT 1"; + $con->query($sql); + } catch (PDOException $e){ + 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/common/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/common/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__."/../etc/airtime.conf.$suffix", self::CONF_FILE_AIRTIME)){ + echo "Could not copy airtime.conf to /etc/airtime/. Exiting."; + exit(1); + } + if (!copy(__DIR__."/../etc/pypo.cfg.$suffix", self::CONF_FILE_PYPO)){ + echo "Could not copy pypo.cfg to /etc/airtime/. Exiting."; + exit(1); + } + if (!copy(__DIR__."/../etc/media-monitor.cfg.$suffix", self::CONF_FILE_MEDIAMONITOR)){ + echo "Could not copy meadia-monitor.cfg to /etc/airtime/. Exiting."; + exit(1); + } + if (!copy(__DIR__."/../etc/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) { + + 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){ + $con = Propel::getConnection(); + + try { + $result = $con->query($p_sql); + } catch (Exception $e) { + echo "Error executing $p_sql. Exiting."; + exit(1); + } + + return $result; + } +}