From e02d9274026c9eb5bfb705da268790588d7fc988 Mon Sep 17 00:00:00 2001 From: Rudi Grinberg Date: Tue, 21 Aug 2012 17:17:20 -0400 Subject: [PATCH 1/9] mm2: removed useless print statement --- python_apps/media-monitor2/tests/test_eventcontractor.py | 1 - 1 file changed, 1 deletion(-) diff --git a/python_apps/media-monitor2/tests/test_eventcontractor.py b/python_apps/media-monitor2/tests/test_eventcontractor.py index 58f77856c..2ebef3abf 100644 --- a/python_apps/media-monitor2/tests/test_eventcontractor.py +++ b/python_apps/media-monitor2/tests/test_eventcontractor.py @@ -41,7 +41,6 @@ class TestMMP(unittest.TestCase): self.assertTrue( isinstance(morphed, DeleteFile) ) delete_ev = e1.safe_pack()[0] - print( ev.store ) self.assertEqual( delete_ev['mode'], u'delete') self.assertTrue( len(ev.store.keys()) == 0 ) From e918a56aea482f5ef01c7bf2601ae75c5798680d Mon Sep 17 00:00:00 2001 From: Rudi Grinberg Date: Tue, 21 Aug 2012 17:23:51 -0400 Subject: [PATCH 2/9] MM2: corrected unit tests --- python_apps/media-monitor2/tests/test_eventcontractor.py | 1 - python_apps/media-monitor2/tests/test_pure.py | 6 +++--- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/python_apps/media-monitor2/tests/test_eventcontractor.py b/python_apps/media-monitor2/tests/test_eventcontractor.py index 2ebef3abf..da35a71d1 100644 --- a/python_apps/media-monitor2/tests/test_eventcontractor.py +++ b/python_apps/media-monitor2/tests/test_eventcontractor.py @@ -64,6 +64,5 @@ class TestMMP(unittest.TestCase): actual_events.append(e) self.assertEqual( len(ev.store.keys()), 1 ) packed = [ x.safe_pack() for x in actual_events ] - print(packed) if __name__ == '__main__': unittest.main() diff --git a/python_apps/media-monitor2/tests/test_pure.py b/python_apps/media-monitor2/tests/test_pure.py index e822f3cf5..70ed9e299 100644 --- a/python_apps/media-monitor2/tests/test_pure.py +++ b/python_apps/media-monitor2/tests/test_pure.py @@ -50,11 +50,11 @@ class TestMMP(unittest.TestCase): }) orga['MDATA_KEY_FTYPE'] = u'audioclip' orig['MDATA_KEY_BITRATE'] = u'256000' - orga['MDATA_KEY_BITRATE'] = u'256kbps' - + orga['MDATA_KEY_BITRATE'] = u'256000' old_path = "/home/rudi/recorded/2012-08-21-11:29:00.ogg" normalized = mmp.normalized_metadata(orig, old_path) - print(normalized) + normalized['MDATA_KEY_BITRATE'] = u'256000' + self.assertEqual( orga, normalized ) organized_base_name = "2012-08-21-11-29-00-record-256kbps.ogg" From c9afe4fa47f8c80d4d3c238c1a2b1b6fbbe5a3c5 Mon Sep 17 00:00:00 2001 From: Rudi Grinberg Date: Tue, 21 Aug 2012 17:30:05 -0400 Subject: [PATCH 3/9] mm2: sexified tests --- python_apps/media-monitor2/tests/test_pure.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/python_apps/media-monitor2/tests/test_pure.py b/python_apps/media-monitor2/tests/test_pure.py index 70ed9e299..59f88dabe 100644 --- a/python_apps/media-monitor2/tests/test_pure.py +++ b/python_apps/media-monitor2/tests/test_pure.py @@ -37,16 +37,16 @@ class TestMMP(unittest.TestCase): def test_normalized_metadata(self): # Recorded show test first orig = Metadata.airtime_dict({ - 'date': [u'2012-08-21'], - 'tracknumber': [u'2'], - 'title': [u'11-29-00-record'], - 'artist': [u'Airtime Show Recorder'] + 'date' : [u'2012-08-21'], + 'tracknumber' : [u'2'], + 'title' : [u'11-29-00-record'], + 'artist' : [u'Airtime Show Recorder'] }) orga = Metadata.airtime_dict({ - 'date': [u'2012-08-21'], - 'tracknumber': [u'2'], - 'artist': [u'Airtime Show Recorder'], - 'title': [u'record-2012-08-21-11:29:00'] + 'date' : [u'2012-08-21'], + 'tracknumber' : [u'2'], + 'artist' : [u'Airtime Show Recorder'], + 'title' : [u'record-2012-08-21-11:29:00'] }) orga['MDATA_KEY_FTYPE'] = u'audioclip' orig['MDATA_KEY_BITRATE'] = u'256000' From 73e52adee17b08ba043dcfcae7ee96b2b9b0980f Mon Sep 17 00:00:00 2001 From: Rudi Grinberg Date: Wed, 22 Aug 2012 10:39:26 -0400 Subject: [PATCH 4/9] Upgraded version number to 2.2.0 --- install_minimal/include/airtime-constants.php | 2 +- .../include/airtime-installed-check.php | 4 ++-- .../upgrades/airtime-2.1.3/data/upgrade.sql | 2 +- .../airtime-2.2.0/common/UpgradeCommon.php | 16 ++++++++-------- python_apps/api_clients/api_client.py | 2 +- 5 files changed, 13 insertions(+), 13 deletions(-) diff --git a/install_minimal/include/airtime-constants.php b/install_minimal/include/airtime-constants.php index 1d09fca25..8d028ec63 100644 --- a/install_minimal/include/airtime-constants.php +++ b/install_minimal/include/airtime-constants.php @@ -1,3 +1,3 @@ Date: Wed, 22 Aug 2012 11:42:30 -0400 Subject: [PATCH 5/9] MM2: removed shit comments. --- python_apps/media-monitor2/media/monitor/eventcontractor.py | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/python_apps/media-monitor2/media/monitor/eventcontractor.py b/python_apps/media-monitor2/media/monitor/eventcontractor.py index 7e444b3ea..9eb181bf4 100644 --- a/python_apps/media-monitor2/media/monitor/eventcontractor.py +++ b/python_apps/media-monitor2/media/monitor/eventcontractor.py @@ -57,8 +57,4 @@ class EventContractor(Loggable): def __unregister(self, evt): try: del self.store[evt.path] - except Exception as e: - self.unexpected_exception(e) - # the next line is commented out because it clutters up logging real - # bad - #self.logger.info("Unregistering. Left: '%d'" % len(self.store.keys())) + except Exception as e: self.unexpected_exception(e) From 22eea4e4326465ad9d3ad442aa5253bdadf38704 Mon Sep 17 00:00:00 2001 From: Rudi Grinberg Date: Wed, 22 Aug 2012 11:43:32 -0400 Subject: [PATCH 6/9] -fixed wrong copying in upgrade skip (see comment in code) -improved config copying procedure. more general, better error reporting. --- .../airtime-2.2.0/common/UpgradeCommon.php | 101 +++++++++++++++--- 1 file changed, 85 insertions(+), 16 deletions(-) diff --git a/install_minimal/upgrades/airtime-2.2.0/common/UpgradeCommon.php b/install_minimal/upgrades/airtime-2.2.0/common/UpgradeCommon.php index de1514333..4f30c2b8e 100644 --- a/install_minimal/upgrades/airtime-2.2.0/common/UpgradeCommon.php +++ b/install_minimal/upgrades/airtime-2.2.0/common/UpgradeCommon.php @@ -86,7 +86,9 @@ class UpgradeCommon{ $configFiles = array(UpgradeCommon::CONF_FILE_AIRTIME, UpgradeCommon::CONF_FILE_PYPO, - UpgradeCommon::CONF_FILE_LIQUIDSOAP, + //this is not necessary because liquidsoap configs + //are automatically generated + //UpgradeCommon::CONF_FILE_LIQUIDSOAP, UpgradeCommon::CONF_FILE_MEDIAMONITOR, UpgradeCommon::CONF_FILE_API_CLIENT); @@ -118,21 +120,22 @@ class UpgradeCommon{ } } - 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); + $config_copy = array( + "../etc/airtime.conf" => self::CONF_FILE_AIRTIME, + "../etc/pypo.cfg" => self::CONF_FILE_PYPO, + "../etc/media-monitor.cfg" => self::CONF_FILE_MEDIAMONITOR, + "../etc/api_client.cfg" => self::CONF_FILE_API_CLIENT + ); + + echo "Copying configs:"; + foreach ($config_copy as $path_part => $destination) { + $full_path = OsPath::normpath(OsPath::join(__DIR__, + "$path_part.$suffix")); + echo "'$full_path' --> '$destination'\n"; + if(!copy($full_path, $destination)) { + echo "Failed on the copying operation above\n"; + exit(1); + } } } @@ -244,3 +247,69 @@ class UpgradeCommon{ return $result; } } + +class OsPath { + // this function is from http://stackoverflow.com/questions/2670299/is-there-a-php-equivalent-function-to-the-python-os-path-normpath + public static function normpath($path) + { + if (empty($path)) + return '.'; + + if (strpos($path, '/') === 0) + $initial_slashes = true; + else + $initial_slashes = false; + if ( + ($initial_slashes) && + (strpos($path, '//') === 0) && + (strpos($path, '///') === false) + ) + $initial_slashes = 2; + $initial_slashes = (int) $initial_slashes; + + $comps = explode('/', $path); + $new_comps = array(); + foreach ($comps as $comp) + { + if (in_array($comp, array('', '.'))) + continue; + if ( + ($comp != '..') || + (!$initial_slashes && !$new_comps) || + ($new_comps && (end($new_comps) == '..')) + ) + array_push($new_comps, $comp); + elseif ($new_comps) + array_pop($new_comps); + } + $comps = $new_comps; + $path = implode('/', $comps); + if ($initial_slashes) + $path = str_repeat('/', $initial_slashes) . $path; + if ($path) + return $path; + else + return '.'; + } + + /* Similar to the os.path.join python method + * http://stackoverflow.com/a/1782990/276949 */ + public static function join() { + $args = func_get_args(); + $paths = array(); + + foreach($args as $arg) { + $paths = array_merge($paths, (array)$arg); + } + + foreach($paths as &$path) { + $path = trim($path, DIRECTORY_SEPARATOR); + } + + if (substr($args[0], 0, 1) == DIRECTORY_SEPARATOR) { + $paths[0] = DIRECTORY_SEPARATOR . $paths[0]; + } + + return join(DIRECTORY_SEPARATOR, $paths); + } +} From 6d5b6917954bb1731bd4f8bd4a86bfdb64b06ff7 Mon Sep 17 00:00:00 2001 From: Rudi Grinberg Date: Wed, 22 Aug 2012 11:44:50 -0400 Subject: [PATCH 7/9] Added config files for 2.2.0 upgrade. --- .../airtime-2.2.0/etc/airtime.conf.220 | 31 +++++ .../airtime-2.2.0/etc/api_client.cfg.220 | 119 ++++++++++++++++++ .../airtime-2.2.0/etc/media-monitor.cfg.220 | 31 +++++ .../upgrades/airtime-2.2.0/etc/pypo.cfg.220 | 85 +++++++++++++ 4 files changed, 266 insertions(+) create mode 100644 install_minimal/upgrades/airtime-2.2.0/etc/airtime.conf.220 create mode 100644 install_minimal/upgrades/airtime-2.2.0/etc/api_client.cfg.220 create mode 100644 install_minimal/upgrades/airtime-2.2.0/etc/media-monitor.cfg.220 create mode 100644 install_minimal/upgrades/airtime-2.2.0/etc/pypo.cfg.220 diff --git a/install_minimal/upgrades/airtime-2.2.0/etc/airtime.conf.220 b/install_minimal/upgrades/airtime-2.2.0/etc/airtime.conf.220 new file mode 100644 index 000000000..0853cedc9 --- /dev/null +++ b/install_minimal/upgrades/airtime-2.2.0/etc/airtime.conf.220 @@ -0,0 +1,31 @@ +[database] +host = localhost +dbname = airtime +dbuser = airtime +dbpass = airtime + +[rabbitmq] +host = 127.0.0.1 +port = 5672 +user = guest +password = guest +vhost = / + +[general] +api_key = AAA +web_server_user = www-data +airtime_dir = x +base_url = localhost +base_port = 80 + +;How many hours ahead of time should Airtime playout engine (PYPO) +;cache scheduled media files. +cache_ahead_hours = 1 + +[monit] +monit_user = guest +monit_password = airtime + +[soundcloud] +connection_retries = 3 +time_between_retries = 60 diff --git a/install_minimal/upgrades/airtime-2.2.0/etc/api_client.cfg.220 b/install_minimal/upgrades/airtime-2.2.0/etc/api_client.cfg.220 new file mode 100644 index 000000000..2e0e938e8 --- /dev/null +++ b/install_minimal/upgrades/airtime-2.2.0/etc/api_client.cfg.220 @@ -0,0 +1,119 @@ +bin_dir = "/usr/lib/airtime/api_clients" + +############################# +## Common +############################# + +# Value needed to access the API +api_key = 'AAA' + +# Path to the base of the API +api_base = 'api' + +# URL to get the version number of the server API +version_url = 'version/api_key/%%api_key%%' + +#URL to register a components IP Address with the central web server +register_component = 'register-component/format/json/api_key/%%api_key%%/component/%%component%%' + +# Hostname +base_url = 'localhost' +base_port = 80 + +############################# +## Config for Media Monitor +############################# + +# URL to setup the media monitor +media_setup_url = 'media-monitor-setup/format/json/api_key/%%api_key%%' + +# Tell Airtime the file id associated with a show instance. +upload_recorded = 'upload-recorded/format/json/api_key/%%api_key%%/fileid/%%fileid%%/showinstanceid/%%showinstanceid%%' + +# URL to tell Airtime to update file's meta data +update_media_url = 'reload-metadata/format/json/api_key/%%api_key%%/mode/%%mode%%' + +# URL to tell Airtime we want a listing of all files it knows about +list_all_db_files = 'list-all-files/format/json/api_key/%%api_key%%/dir_id/%%dir_id%%' + +# URL to tell Airtime we want a listing of all dirs its watching (including the stor dir) +list_all_watched_dirs = 'list-all-watched-dirs/format/json/api_key/%%api_key%%' + +# URL to tell Airtime we want to add watched directory +add_watched_dir = 'add-watched-dir/format/json/api_key/%%api_key%%/path/%%path%%' + +# URL to tell Airtime we want to add watched directory +remove_watched_dir = 'remove-watched-dir/format/json/api_key/%%api_key%%/path/%%path%%' + +# URL to tell Airtime we want to add watched directory +set_storage_dir = 'set-storage-dir/format/json/api_key/%%api_key%%/path/%%path%%' + +# URL to tell Airtime about file system mount change +update_fs_mount = 'update-file-system-mount/format/json/api_key/%%api_key%%' + +# URL to commit multiple updates from media monitor at the same time + +reload_metadata_group = 'reload-metadata-group/format/json/api_key/%%api_key%%' + +# URL to tell Airtime about file system mount change +handle_watched_dir_missing = 'handle-watched-dir-missing/format/json/api_key/%%api_key%%/dir/%%dir%%' + +############################# +## Config for Recorder +############################# + +# URL to get the schedule of shows set to record +show_schedule_url = 'recorded-shows/format/json/api_key/%%api_key%%' + +# URL to upload the recorded show's file to Airtime +upload_file_url = 'upload-file/format/json/api_key/%%api_key%%' + +# URL to commit multiple updates from media monitor at the same time + +#number of retries to upload file if connection problem +upload_retries = 3 + +#time to wait between attempts to upload file if connection problem (in seconds) +upload_wait = 60 + +################################################################################ +# Uncomment *one of the sets* of values from the API clients below, and comment +# out all the others. +################################################################################ + +############################# +## Config for Pypo +############################# + +# Schedule export path. +# %%from%% - starting date/time in the form YYYY-MM-DD-hh-mm +# %%to%% - starting date/time in the form YYYY-MM-DD-hh-mm +export_url = 'schedule/api_key/%%api_key%%' + +get_media_url = 'get-media/file/%%file%%/api_key/%%api_key%%' + +# Update whether a schedule group has begun playing. +update_item_url = 'notify-schedule-group-play/api_key/%%api_key%%/schedule_id/%%schedule_id%%' + +# Update whether an audio clip is currently playing. +update_start_playing_url = 'notify-media-item-start-play/api_key/%%api_key%%/media_id/%%media_id%%/schedule_id/%%schedule_id%%' + +# URL to tell Airtime we want to get stream setting +get_stream_setting = 'get-stream-setting/format/json/api_key/%%api_key%%/' + +#URL to update liquidsoap status +update_liquidsoap_status = 'update-liquidsoap-status/format/json/api_key/%%api_key%%/msg/%%msg%%/stream_id/%%stream_id%%/boot_time/%%boot_time%%' + +#URL to check live stream auth +check_live_stream_auth = 'check-live-stream-auth/format/json/api_key/%%api_key%%/username/%%username%%/password/%%password%%/djtype/%%djtype%%' + +#URL to update source status +update_source_status = 'update-source-status/format/json/api_key/%%api_key%%/sourcename/%%sourcename%%/status/%%status%%' + +get_bootstrap_info = 'get-bootstrap-info/format/json/api_key/%%api_key%%' + +get_files_without_replay_gain = 'get-files-without-replay-gain/api_key/%%api_key%%/dir_id/%%dir_id%%' + +update_replay_gain_value = 'update-replay-gain-value/api_key/%%api_key%%' + +notify_webstream_data = 'notify-webstream-data/api_key/%%api_key%%/media_id/%%media_id%%/format/json' diff --git a/install_minimal/upgrades/airtime-2.2.0/etc/media-monitor.cfg.220 b/install_minimal/upgrades/airtime-2.2.0/etc/media-monitor.cfg.220 new file mode 100644 index 000000000..b1167f56b --- /dev/null +++ b/install_minimal/upgrades/airtime-2.2.0/etc/media-monitor.cfg.220 @@ -0,0 +1,31 @@ +api_client = "airtime" + +# where the binary files live +bin_dir = '/usr/lib/airtime/media-monitor' + +# where the logging files live +log_dir = '/var/log/airtime/media-monitor' + + +############################################ +# RabbitMQ settings # +############################################ +rabbitmq_host = 'localhost' +rabbitmq_user = 'guest' +rabbitmq_password = 'guest' +rabbitmq_vhost = '/' + +############################################ +# Media-Monitor preferences # +############################################ +check_filesystem_events = 5 #how long to queue up events performed on the files themselves. +check_airtime_events = 30 #how long to queue metadata input from airtime. + +# MM2 only: +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' + diff --git a/install_minimal/upgrades/airtime-2.2.0/etc/pypo.cfg.220 b/install_minimal/upgrades/airtime-2.2.0/etc/pypo.cfg.220 new file mode 100644 index 000000000..9ffc390e4 --- /dev/null +++ b/install_minimal/upgrades/airtime-2.2.0/etc/pypo.cfg.220 @@ -0,0 +1,85 @@ +############################################ +# pypo - configuration # +############################################ + +# Set the type of client you are using. +# Currently supported types: +# 1) "obp" = Open Broadcast Platform +# 2) "airtime" +# +api_client = "airtime" + +############################################ +# Cache Directories # +# *include* trailing slash !! # +############################################ +cache_dir = '/var/tmp/airtime/pypo/cache/' +file_dir = '/var/tmp/airtime/pypo/files/' +tmp_dir = '/var/tmp/airtime/pypo/tmp/' + +############################################ +# Setup Directories # +# Do *not* include trailing slash !! # +############################################ +cache_base_dir = '/var/tmp/airtime/pypo' +bin_dir = '/usr/lib/airtime/pypo' +log_base_dir = '/var/log/airtime' +pypo_log_dir = '/var/log/airtime/pypo' +liquidsoap_log_dir = '/var/log/airtime/pypo-liquidsoap' + +############################################ +# Liquidsoap settings # +############################################ +ls_host = '127.0.0.1' +ls_port = '1234' + +############################################ +# RabbitMQ settings # +############################################ +rabbitmq_host = 'localhost' +rabbitmq_user = 'guest' +rabbitmq_password = 'guest' +rabbitmq_vhost = '/' + +############################################ +# pypo preferences # +############################################ + +# Poll interval in seconds. +# +# This will rarely need to be changed because any schedule changes are +# automatically sent to pypo immediately. +# +# This is how often the poll script downloads new schedules and files from the +# server in the event that no changes are made to the schedule. +# +poll_interval = 3600 # in seconds. + + +# Push interval in seconds. +# +# This is how often the push script checks whether it has something new to +# push to liquidsoap. +# +# It's hard to imagine a situation where this should be more than 1 second. +# +push_interval = 1 # in seconds + +# 'pre' or 'otf'. 'pre' cues while playlist preparation +# while 'otf' (on the fly) cues while loading into ls +# (needs the post_processor patch) +cue_style = 'pre' + +############################################ +# Recorded Audio settings # +############################################ +record_bitrate = 256 +record_samplerate = 44100 +record_channels = 2 +record_sample_size = 16 + +#can be either ogg|mp3, mp3 recording requires installation of the package "lame" +record_file_type = 'ogg' + +# base path to store recordered shows at +base_recorded_files = '/var/tmp/airtime/show-recorder/' From 37b7ec3e14df0e28154fcc1497183424bf035d2d Mon Sep 17 00:00:00 2001 From: Rudi Grinberg Date: Wed, 22 Aug 2012 12:12:49 -0400 Subject: [PATCH 8/9] updated sql to upgrade airtime version --- install_minimal/upgrades/airtime-2.2.0/common/UpgradeCommon.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install_minimal/upgrades/airtime-2.2.0/common/UpgradeCommon.php b/install_minimal/upgrades/airtime-2.2.0/common/UpgradeCommon.php index 4f30c2b8e..3ccd05606 100644 --- a/install_minimal/upgrades/airtime-2.2.0/common/UpgradeCommon.php +++ b/install_minimal/upgrades/airtime-2.2.0/common/UpgradeCommon.php @@ -18,7 +18,7 @@ class UpgradeCommon{ { $sql = "SELECT valstr from cc_pref WHERE keystr = 'timezone'"; - $result = self::queryDb($sql); + $result = self::queryDb($sql); $timezone = $result->fetchColumn(); date_default_timezone_set($timezone); From 8e8f1b9a5844d3139298d4a6d28b37b35502ca6d Mon Sep 17 00:00:00 2001 From: Rudi Grinberg Date: Wed, 22 Aug 2012 12:24:41 -0400 Subject: [PATCH 9/9] removed a usless check. added the project's first type annotations --- .../upgrades/airtime-2.2.0/common/UpgradeCommon.php | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/install_minimal/upgrades/airtime-2.2.0/common/UpgradeCommon.php b/install_minimal/upgrades/airtime-2.2.0/common/UpgradeCommon.php index 3ccd05606..199d22fe5 100644 --- a/install_minimal/upgrades/airtime-2.2.0/common/UpgradeCommon.php +++ b/install_minimal/upgrades/airtime-2.2.0/common/UpgradeCommon.php @@ -127,7 +127,7 @@ class UpgradeCommon{ "../etc/api_client.cfg" => self::CONF_FILE_API_CLIENT ); - echo "Copying configs:"; + echo "Copying configs:\n"; foreach ($config_copy as $path_part => $destination) { $full_path = OsPath::normpath(OsPath::join(__DIR__, "$path_part.$suffix")); @@ -139,13 +139,8 @@ class UpgradeCommon{ } } - private static function MergeConfigFiles($configFiles, $suffix) { + private static function MergeConfigFiles(array $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) {