diff --git a/airtime_mvc/application/controllers/ScheduleController.php b/airtime_mvc/application/controllers/ScheduleController.php index 1a75f27e7..8ed12e0ed 100644 --- a/airtime_mvc/application/controllers/ScheduleController.php +++ b/airtime_mvc/application/controllers/ScheduleController.php @@ -491,11 +491,11 @@ class ScheduleController extends Zend_Controller_Action 'add_show_genre' => $show->getGenre(), 'add_show_description' => $show->getDescription())); - $startsDateTime = new DateTime($show->getStartDate()." ".$show->getStartTime(), new DateTimeZone(date_default_timezone_get())); - $endsDateTime = new DateTime($show->getEndDate()." ".$show->getEndTime(), new DateTimeZone(date_default_timezone_get())); - - //$startsDateTime->setTimezone(new DateTimeZone(date_default_timezone_get())); - //$endsDateTime->setTimezone(new DateTimeZone(date_default_timezone_get())); + $startsDateTime = new DateTime($show->getStartDate()." ".$show->getStartTime(), new DateTimeZone("UTC")); + $endsDateTime = new DateTime($show->getEndDate()." ".$show->getEndTime(), new DateTimeZone("UTC")); + + $startsDateTime->setTimezone(new DateTimeZone(date_default_timezone_get())); + $endsDateTime->setTimezone(new DateTimeZone(date_default_timezone_get())); $formWhen->populate(array('add_show_start_date' => $startsDateTime->format("Y-m-d"), 'add_show_start_time' => $startsDateTime->format("H:i"), @@ -595,12 +595,14 @@ class ScheduleController extends Zend_Controller_Action $show = new Application_Model_Show($data['add_show_id']); $startDateModified = true; - if ($data['add_show_id'] != -1 && !array_key_exists('add_show_start_date', $data)){ - //show is being updated and changing the start date was disabled, since the - //array key does not exist. We need to repopulate this entry from the db. - $data['add_show_start_date'] = $show->getStartDate(); - $startDateModified = false; - } + if ($data['add_show_id'] != -1 && !array_key_exists('add_show_start_date', $data)){ + //show is being updated and changing the start date was disabled, since the + //array key does not exist. We need to repopulate this entry from the db. + //The start date will be return in UTC time, so lets convert it to local time. + $dt = Application_Model_DateHelper::ConvertToLocalDateTime($show->getStartDate()); + $data['add_show_start_date'] = $dt->format("Y-m-d"); + $startDateModified = false; + } $data['add_show_hosts'] = $this->_getParam('hosts'); $data['add_show_day_check'] = $this->_getParam('days'); diff --git a/airtime_mvc/application/models/Show.php b/airtime_mvc/application/models/Show.php index 1be148b2b..3dcff227c 100644 --- a/airtime_mvc/application/models/Show.php +++ b/airtime_mvc/application/models/Show.php @@ -448,7 +448,7 @@ class Application_Model_Show { } /** - * Get the start date of the current show. + * Get the start date of the current show in UTC timezone. * * @return string * The start date in the format YYYY-MM-DD @@ -457,38 +457,49 @@ class Application_Model_Show { global $CC_DBC; $showId = $this->getId(); - $sql = "SELECT first_show FROM cc_show_days" + $sql = "SELECT first_show, start_time, timezone FROM cc_show_days" ." WHERE show_id = $showId" - ." ORDER BY first_show"; + ." ORDER BY first_show" + ." LIMIT 1"; - $firstDate = $CC_DBC->GetOne($sql); + $rows = $CC_DBC->GetAll($sql); - if (is_null($firstDate)){ + if (count($rows) == 0){ return ""; } else { - return $firstDate; + $row = $rows[0]; + + $dt = new DateTime($row["first_show"]." ".$row["start_time"], new DateTimeZone($row["timezone"])); + $dt->setTimezone(new DateTimeZone("UTC")); + return $dt->format("Y-m-d"); } } - + /** - * Get the start time of the current show. + * Get the start time of the current show in UTC timezone. * * @return string - * The start time in the format HH:MM:SS + * The start time in the format HH:MM */ + public function getStartTime(){ global $CC_DBC; $showId = $this->getId(); - $sql = "SELECT start_time FROM cc_show_days" - ." WHERE show_id = $showId"; + $sql = "SELECT first_show, start_time, timezone FROM cc_show_days" + ." WHERE show_id = $showId" + ." ORDER BY first_show" + ." LIMIT 1"; - $startTime = $CC_DBC->GetOne($sql); + $rows = $CC_DBC->GetAll($sql); - if (is_null($startTime)){ + if (count($rows) == 0){ return ""; } else { - return $startTime; + $row = $rows[0]; + $dt = new DateTime($row["first_show"]." ".$row["start_time"], new DateTimeZone($row["timezone"])); + $dt->setTimezone(new DateTimeZone("UTC")); + return $dt->format("H:i"); } } @@ -540,7 +551,7 @@ class Application_Model_Show { */ public function isStartDateTimeInPast(){ $date = new Application_Model_DateHelper; - $current_timestamp = $date->getTimestamp(); + $current_timestamp = $date->getUtcTimestamp(); return ($current_timestamp > ($this->getStartDate()." ".$this->getStartTime())); } @@ -619,9 +630,9 @@ class Application_Model_Show { $sql .= "WHERE show_id = $p_data[add_show_id]"; $CC_DBC->query($sql); - $oldStartDateTimeEpoch = strtotime($this->getStartDate()." ".$this->getStartTime()); - $newStartDateTimeEpoch = strtotime($p_data['add_show_start_date']." ".$p_data['add_show_start_time']); - $diff = $newStartDateTimeEpoch - $oldStartDateTimeEpoch; + $dtOld = new DateTime($this->getStartDate()." ".$this->getStartTime(), new DateTimeZone("UTC")); + $dtNew = new DateTime($p_data['add_show_start_date']." ".$p_data['add_show_start_time'], new DateTimeZone(date_default_timezone_get())); + $diff = $dtOld->getTimestamp() - $dtNew->getTimestamp(); $sql = "UPDATE cc_show_instances " ."SET starts = starts + INTERVAL '$diff sec', " diff --git a/airtime_mvc/public/js/airtime/dashboard/versiontooltip.js b/airtime_mvc/public/js/airtime/dashboard/versiontooltip.js index 6087bb6a2..1032a83f7 100644 --- a/airtime_mvc/public/js/airtime/dashboard/versiontooltip.js +++ b/airtime_mvc/public/js/airtime/dashboard/versiontooltip.js @@ -8,9 +8,9 @@ function getContent() { var msg = ""; if(isUpToDate()) { msg = "You are running the latest version"; - } else if(diff <= 2) { + } else if(diff == 1) { msg = "New version available: " + link; - } else if(diff == 3) { + } else if(diff == 2) { msg = "This version will soon be obsolete.
Please upgrade to " + link; } else { msg = "This version is no longer supported.
Please upgrade to " + link; @@ -44,7 +44,7 @@ function getLatestVersion() { * Returns the download link to latest release in HTML */ function getLatestLink() { - return "" + getLatestVersion() + ""; + return "" + getLatestVersion() + ""; } /** @@ -58,6 +58,13 @@ function isUpToDate() { return (diff == 0 && current == latest) || diff < 0; } +/** + * Opens the link in a new window + */ +function openLatestLink() { + window.open($("#version-link").html()); +} + /** * Sets up the tooltip for version notification */ diff --git a/airtime_mvc/public/js/fullcalendar/fullcalendar.js b/airtime_mvc/public/js/fullcalendar/fullcalendar.js index f13a705c9..4cbc52436 100644 --- a/airtime_mvc/public/js/fullcalendar/fullcalendar.js +++ b/airtime_mvc/public/js/fullcalendar/fullcalendar.js @@ -399,7 +399,9 @@ function Calendar(element, options, eventSources) { elementOuterWidth = element.outerWidth(); header.updateTitle(currentView.title); - var today = new Date(); + //adjusting this date ensures that the "today" button is greyed out on the + //correct day. + var today = adjustDateToServerDate(new Date(), options["serverTimezoneOffset"]); if (today >= currentView.start && today < currentView.end) { header.disableButton('today'); }else{ @@ -581,7 +583,8 @@ function Calendar(element, options, eventSources) { function today() { - date = new Date(); + //adjusting this date ensures that clicking "today" takes us to the correct date. + date = adjustDateToServerDate(new Date(), options["serverTimezoneOffset"]); renderView(); } diff --git a/dev_tools/fabric/fab_liquidsoap_compile.py b/dev_tools/fabric/fab_liquidsoap_compile.py index f62068cb9..fb4146897 100644 --- a/dev_tools/fabric/fab_liquidsoap_compile.py +++ b/dev_tools/fabric/fab_liquidsoap_compile.py @@ -55,7 +55,7 @@ def create_fresh_os(vm_name, debian=False): download_if_needed(vdi_dir, xml_dir, vm_name, vm_vdi_file, vm_xml_file) - """ + if not os.path.exists("%s/vm_registered"%vdi_dir): local("VBoxManage registervm %s"%os.path.join(xml_dir, vm_xml_file), capture=True) local('VBoxManage storagectl "%s" --name "SATA Controller" --add sata'%vm_name) @@ -63,9 +63,8 @@ def create_fresh_os(vm_name, debian=False): local("VBoxManage modifyvm %s --snapshotfolder %s"%(vm_name, vdi_snapshot_dir)) local("VBoxManage snapshot %s take fresh_install"%vm_name) local("touch %s/vm_registered"%vdi_dir) - """ - #local('VBoxManage snapshot %s restore fresh_install'%vm_name) + local('VBoxManage snapshot %s restore fresh_install'%vm_name) local('VBoxManage startvm %s'%vm_name) print "Please wait while attempting to acquire IP address" @@ -87,8 +86,6 @@ def create_fresh_os(vm_name, debian=False): if debian: append('/etc/apt/sources.list', "deb http://www.debian-multimedia.org squeeze main non-free", use_sudo=True) - - def ubuntu_lucid_32(fresh_os=True): if (fresh_os): create_fresh_os('Ubuntu_10.04_32') @@ -96,6 +93,14 @@ def ubuntu_lucid_32(fresh_os=True): def ubuntu_lucid_64(fresh_os=True): if (fresh_os): create_fresh_os('Ubuntu_10.04_64') + +def ubuntu_maverick_32(fresh_os=True): + if (fresh_os): + create_fresh_os('Ubuntu_10.10_32') + +def ubuntu_maverick_64(fresh_os=True): + if (fresh_os): + create_fresh_os('Ubuntu_10.10_64') def ubuntu_natty_32(fresh_os=True): if (fresh_os): @@ -105,6 +110,18 @@ def ubuntu_natty_64(fresh_os=True): if (fresh_os): create_fresh_os('Ubuntu_11.04_64') +def ubuntu_oneiric_32(fresh_os=True): + if (fresh_os): + create_fresh_os('Ubuntu_11.10_32') + +def ubuntu_oneiric_64(fresh_os=True): + if (fresh_os): + create_fresh_os('Ubuntu_11.10_64') + +def debian_squeeze_32(fresh_os=True): + if (fresh_os): + create_fresh_os('Debian_Squeeze_32', debian=True) + def debian_squeeze_64(fresh_os=True): if (fresh_os): create_fresh_os('Debian_Squeeze_64', debian=True) @@ -114,12 +131,14 @@ def compile_liquidsoap(filename="liquidsoap"): sudo('apt-get update') sudo('apt-get upgrade -y --force-yes') - sudo('sudo apt-get install -y --force-yes libocamlcvs-ocaml-dev ocaml-findlib libao-ocaml-dev libportaudio-ocaml-dev ' + \ + sudo('sudo apt-get install -y --force-yes ocaml-findlib libao-ocaml-dev libportaudio-ocaml-dev ' + \ 'libmad-ocaml-dev libtaglib-ocaml-dev libalsa-ocaml-dev libtaglib-ocaml-dev libvorbis-ocaml-dev ' + \ 'libspeex-dev libspeexdsp-dev speex libladspa-ocaml-dev festival festival-dev ' + \ 'libsamplerate-dev libxmlplaylist-ocaml-dev libxmlrpc-light-ocaml-dev libflac-dev ' + \ 'libxml-dom-perl libxml-dom-xpath-perl icecast2 patch autoconf libmp3lame-dev ' + \ 'libcamomile-ocaml-dev libcamlimages-ocaml-dev libtool libpulse-dev libjack-dev camlidl') + + #libocamlcvs-ocaml-dev root = '/home/martin/src' run('mkdir -p %s' % root) diff --git a/dev_tools/fabric/fab_release_test.py b/dev_tools/fabric/fab_release_test.py index 5b583027f..25592c9e9 100644 --- a/dev_tools/fabric/fab_release_test.py +++ b/dev_tools/fabric/fab_release_test.py @@ -53,6 +53,13 @@ def download_if_needed(vdi_dir, xml_dir, vm_name, vm_vdi_file, vm_xml_file): def create_fresh_os(vm_name, update_virtualenv=False, debian=False): + """ + remove known_hosts because if two virtual machines get the same ip address, + then they will most likey have a different host key, and ssh will fail, warning + about a possible man in the middle attack. + """ + local("rm ~/.ssh/known_hosts") + vm_vdi_file = '%s.vdi'%vm_name vm_xml_file = '%s.xml'%vm_name vdi_dir = os.path.expanduser('~/tmp/vms/%s'%vm_name) @@ -89,9 +96,14 @@ def create_fresh_os(vm_name, update_virtualenv=False, debian=False): local("VBoxManage modifyvm %s --snapshotfolder %s"%(vm_name, vdi_snapshot_dir)) local("VBoxManage snapshot %s take fresh_install"%vm_name) local("touch %s/vm_registered"%vdi_dir) + + local('VBoxManage snapshot %s restore fresh_install'%vm_name) + + + local('VBoxManage modifyvm "%s" --bridgeadapter1 eth0'%vm_name) local('VBoxManage startvm %s'%vm_name) print "Please wait while attempting to acquire IP address" @@ -128,6 +140,14 @@ def ubuntu_lucid_32(fresh_os=True): def ubuntu_lucid_64(fresh_os=True): if (fresh_os): create_fresh_os('Ubuntu_10.04_64', update_virtualenv=True) + +def ubuntu_maverick_32(fresh_os=True): + if (fresh_os): + create_fresh_os('Ubuntu_10.10_32') + +def ubuntu_maverick_64(fresh_os=True): + if (fresh_os): + create_fresh_os('Ubuntu_10.10_64') def ubuntu_natty_32(fresh_os=True): if (fresh_os): @@ -137,6 +157,14 @@ def ubuntu_natty_64(fresh_os=True): if (fresh_os): create_fresh_os('Ubuntu_11.04_64') +def ubuntu_oneiric_32(fresh_os=True): + if (fresh_os): + create_fresh_os('Ubuntu_11.10_32') + +def ubuntu_oneiric_64(fresh_os=True): + if (fresh_os): + create_fresh_os('Ubuntu_11.10_64') + def debian_squeeze_32(fresh_os=True): if (fresh_os): create_fresh_os('Debian_Squeeze_32', debian=True) diff --git a/dev_tools/fabric/run.sh b/dev_tools/fabric/run.sh index 85b7bc4a8..cfcd66132 100755 --- a/dev_tools/fabric/run.sh +++ b/dev_tools/fabric/run.sh @@ -2,10 +2,10 @@ exec 2>&1 -target="airtime_195_tar" -airtime_versions=("" "airtime_182_tar" "airtime_194_tar") -ubuntu_versions=("ubuntu_lucid_32" "ubuntu_natty_32") - +target="airtime_git_branch" +#airtime_versions=("" "airtime_182_tar" "airtime_194_tar") +airtime_versions=("") +ubuntu_versions=("ubuntu_lucid_32" "ubuntu_lucid_64" "ubuntu_maverick_32" "ubuntu_maverick_64" "ubuntu_natty_32" "ubuntu_natty_64" "ubuntu_oneiric_32" "ubuntu_oneiric_64" "debian_squeeze_32" "debian_squeeze_64") num1=${#ubuntu_versions[@]} num2=${#airtime_versions[@]} diff --git a/dev_tools/fabric/run2.sh b/dev_tools/fabric/run2.sh index 1f1cd3f56..6e4a0f521 100755 --- a/dev_tools/fabric/run2.sh +++ b/dev_tools/fabric/run2.sh @@ -2,15 +2,13 @@ exec 2>&1 -ubuntu_versions=("ubuntu_lucid_32" "ubuntu_lucid_64" "ubuntu_natty_32" "ubuntu_natty_64") - +ubuntu_versions=("debian_squeeze_32") num1=${#ubuntu_versions[@]} - mkdir -p ./upgrade_logs2 for i in $(seq 0 $(($num1 -1))); do - fab -f fab_liquidsoap_compile.py ${ubuntu_versions[$i]} compile_liquidsoap:${ubuntu_versions[$i]} shutdown 2>&1 | tee "./upgrade_logs2/${ubuntu_versions[$i]}.log" + fab -f fab_liquidsoap_compile.py ${ubuntu_versions[$i]} compile_liquidsoap:filename=${ubuntu_versions[$i]} shutdown 2>&1 | tee "./upgrade_logs2/${ubuntu_versions[$i]}.log" done diff --git a/python_apps/pypo/install/pypo-initialize.py b/python_apps/pypo/install/pypo-initialize.py index cdb13a9ec..c0f3e88c8 100644 --- a/python_apps/pypo/install/pypo-initialize.py +++ b/python_apps/pypo/install/pypo-initialize.py @@ -79,7 +79,7 @@ PATH_INI_FILE = '/etc/airtime/pypo.cfg' PATH_LIQUIDSOAP_BIN = '/usr/lib/airtime/pypo/bin/liquidsoap_bin' #any debian/ubuntu codename in this et will automatically use the natty liquidsoap binary -codenames_for_natty_binary = set(["natty", "oneiric", "precise", "squeeze"]) +arch_map = dict({"32bit":"i386", "64bit":"amd64"}) # load config file try: @@ -91,29 +91,19 @@ except Exception, e: try: #select appropriate liquidsoap file for given system os/architecture architecture = platform.architecture()[0] - #natty = is_natty() + arch = arch_map[architecture] print "* Detecting OS: ...", (codename, fullname) = get_os_codename() - print " Found %s" % fullname - natty = codename in codenames_for_natty_binary - - if architecture == '64bit' and natty: - print " * Installing 64-bit liquidsoap binary (Natty)" - shutil.copy("%s/liquidsoap-natty-amd64"%PATH_LIQUIDSOAP_BIN, "%s/liquidsoap"%PATH_LIQUIDSOAP_BIN) - elif architecture == '32bit' and natty: - print " * Installing 32-bit liquidsoap binary (Natty)" - shutil.copy("%s/liquidsoap-natty-i386"%PATH_LIQUIDSOAP_BIN, "%s/liquidsoap"%PATH_LIQUIDSOAP_BIN) - elif architecture == '64bit' and not natty: - print " * Installing 64-bit liquidsoap binary" - shutil.copy("%s/liquidsoap-amd64"%PATH_LIQUIDSOAP_BIN, "%s/liquidsoap"%PATH_LIQUIDSOAP_BIN) - elif architecture == '32bit' and not natty: - print " * Installing 32-bit liquidsoap binary" - shutil.copy("%s/liquidsoap-i386"%PATH_LIQUIDSOAP_BIN, "%s/liquidsoap"%PATH_LIQUIDSOAP_BIN) - else: - print "Unknown system architecture." - sys.exit(1) + print " Found %s (%s) on %s architecture" % (fullname, codename, arch) + print " * Installing Liquidsoap binary" + if (os.path.exists("%s/liquidsoap_%s_%s"%(PATH_LIQUIDSOAP_BIN, codename, arch))): + shutil.copy("%s/liquidsoap_%s_%s"%(PATH_LIQUIDSOAP_BIN, codename, arch), "%s/liquidsoap"%PATH_LIQUIDSOAP_BIN) + else: + print "Unsupported system architecture." + sys.exit(1) + #initialize init.d scripts p = Popen("update-rc.d airtime-playout defaults >/dev/null 2>&1", shell=True) sts = os.waitpid(p.pid, 0)[1] diff --git a/python_apps/pypo/liquidsoap_bin/liquidsoap-amd64 b/python_apps/pypo/liquidsoap_bin/liquidsoap_lucid_amd64 similarity index 100% rename from python_apps/pypo/liquidsoap_bin/liquidsoap-amd64 rename to python_apps/pypo/liquidsoap_bin/liquidsoap_lucid_amd64 diff --git a/python_apps/pypo/liquidsoap_bin/liquidsoap-i386 b/python_apps/pypo/liquidsoap_bin/liquidsoap_lucid_i386 similarity index 100% rename from python_apps/pypo/liquidsoap_bin/liquidsoap-i386 rename to python_apps/pypo/liquidsoap_bin/liquidsoap_lucid_i386 diff --git a/python_apps/pypo/liquidsoap_bin/liquidsoap_maverick_amd64 b/python_apps/pypo/liquidsoap_bin/liquidsoap_maverick_amd64 new file mode 100755 index 000000000..f1cfb7bc5 Binary files /dev/null and b/python_apps/pypo/liquidsoap_bin/liquidsoap_maverick_amd64 differ diff --git a/python_apps/pypo/liquidsoap_bin/liquidsoap_maverick_i386 b/python_apps/pypo/liquidsoap_bin/liquidsoap_maverick_i386 new file mode 100755 index 000000000..ac09e7a6d Binary files /dev/null and b/python_apps/pypo/liquidsoap_bin/liquidsoap_maverick_i386 differ diff --git a/python_apps/pypo/liquidsoap_bin/liquidsoap-natty-amd64 b/python_apps/pypo/liquidsoap_bin/liquidsoap_natty_amd64 similarity index 100% rename from python_apps/pypo/liquidsoap_bin/liquidsoap-natty-amd64 rename to python_apps/pypo/liquidsoap_bin/liquidsoap_natty_amd64 diff --git a/python_apps/pypo/liquidsoap_bin/liquidsoap-natty-i386 b/python_apps/pypo/liquidsoap_bin/liquidsoap_natty_i386 similarity index 100% rename from python_apps/pypo/liquidsoap_bin/liquidsoap-natty-i386 rename to python_apps/pypo/liquidsoap_bin/liquidsoap_natty_i386 diff --git a/python_apps/pypo/liquidsoap_bin/liquidsoap_oneiric_amd64 b/python_apps/pypo/liquidsoap_bin/liquidsoap_oneiric_amd64 new file mode 100755 index 000000000..8d153881e Binary files /dev/null and b/python_apps/pypo/liquidsoap_bin/liquidsoap_oneiric_amd64 differ diff --git a/python_apps/pypo/liquidsoap_bin/liquidsoap_oneiric_i386 b/python_apps/pypo/liquidsoap_bin/liquidsoap_oneiric_i386 new file mode 100755 index 000000000..3fc7a4a81 Binary files /dev/null and b/python_apps/pypo/liquidsoap_bin/liquidsoap_oneiric_i386 differ diff --git a/python_apps/pypo/liquidsoap_bin/liquidsoap_squeeze_amd64 b/python_apps/pypo/liquidsoap_bin/liquidsoap_squeeze_amd64 new file mode 100755 index 000000000..2454190d1 Binary files /dev/null and b/python_apps/pypo/liquidsoap_bin/liquidsoap_squeeze_amd64 differ diff --git a/python_apps/pypo/liquidsoap_bin/liquidsoap_squeeze_i386 b/python_apps/pypo/liquidsoap_bin/liquidsoap_squeeze_i386 new file mode 100755 index 000000000..7f119078d Binary files /dev/null and b/python_apps/pypo/liquidsoap_bin/liquidsoap_squeeze_i386 differ