From fb7122669d42309c16347ac125c892825fb9522d Mon Sep 17 00:00:00 2001 From: Jan Schneider Date: Sun, 21 Jan 2018 01:47:07 +0100 Subject: [PATCH] Implement addon update --- addon/lib/rmupdate.tcl | 65 ++++++++++++-- addon/www/index.html | 189 +++++++++++++++++++++++------------------ addon/www/rest.cgi | 7 ++ 3 files changed, 174 insertions(+), 87 deletions(-) diff --git a/addon/lib/rmupdate.tcl b/addon/lib/rmupdate.tcl index 38f9829..608fe73 100644 --- a/addon/lib/rmupdate.tcl +++ b/addon/lib/rmupdate.tcl @@ -29,7 +29,7 @@ namespace eval rmupdate { variable install_log "/usr/local/addons/rmupdate/var/install.log" variable install_lock "/usr/local/addons/rmupdate/var/install.lock" variable log_file "/tmp/rmupdate-addon-log.txt" - variable log_level 0 + variable log_level 4 variable lock_start_port 12100 variable lock_socket variable lock_id_log_file 1 @@ -510,7 +510,6 @@ proc ::rmupdate::get_latest_firmware_version {} { proc ::rmupdate::download_firmware {version} { variable img_dir - variable log_file variable install_log set image_file "${img_dir}/RaspberryMatic-${version}.img" @@ -529,7 +528,7 @@ proc ::rmupdate::download_firmware {version} { regexp {/([^/]+)$} $download_url match archive_file set archive_file "${img_dir}/${archive_file}" file mkdir $img_dir - if {$log_file != ""} { + if {$install_log != ""} { exec /usr/bin/wget "${download_url}" --show-progress --progress=dot:giga --no-check-certificate --quiet --output-document=$archive_file 2>>${install_log} write_install_log "" } else { @@ -733,7 +732,7 @@ proc ::rmupdate::is_firmware_up_to_date {} { return 0 } -proc ::rmupdate::get_addon_info {{fetch_available_versions 0} {fetch_download_url 0} {as_json 0}} { +proc ::rmupdate::get_addon_info {{fetch_available_version 0} {fetch_download_url 0} {as_json 0} {addon_id ""}} { variable rc_dir variable addons_www_dir array set addons {} @@ -741,6 +740,9 @@ proc ::rmupdate::get_addon_info {{fetch_available_versions 0} {fetch_download_ur catch { set data [exec $f info] set id [file tail $f] + if {$addon_id != "" && $addon_id != $id} { + continue + } set addons(${id}::id) $id set addons(${id}::name) "" set addons(${id}::version) "" @@ -757,7 +759,7 @@ proc ::rmupdate::get_addon_info {{fetch_available_versions 0} {fetch_download_ur set keyl "config_url" } set addons(${id}::${keyl}) $value - if {$keyl == "update" && $fetch_available_versions == 1} { + if {$keyl == "update" && $fetch_available_version == 1} { catch { set cgi "${addons_www_dir}/[string range $value 8 end]" set available_version [exec tclsh "$cgi"] @@ -914,6 +916,59 @@ proc ::rmupdate::get_addon_info {{fetch_available_versions 0} {fetch_download_ur } } +proc ::rmupdate::install_addon {addon_id} { + variable rc_dir + + if {[get_running_installation] != ""} { + error "Another install process is running." + } + + set_running_installation "Addon ${addon_id}" + + array set addon [get_addon_info 1 1 0 $addon_id] + set download_url $addon(${addon_id}::download_url) + + write_log 3 "Downloading addon from ${download_url}." + regexp {/([^/]+)$} $download_url match archive_file + set archive_file "/tmp/${archive_file}" + if {[file exists $archive_file]} { + file delete $archive_file + } + + exec /usr/bin/wget "${download_url}" --no-check-certificate --quiet --output-document=$archive_file + + write_log 3 "Extracting archive ${archive_file}." + set tmp_dir "/tmp/rmupdate_addon_install_${addon_id}" + if {[file exists $tmp_dir]} { + file delete -force $tmp_dir + } + file mkdir $tmp_dir + + cd $tmp_dir + exec /bin/tar xzvf "${archive_file}" + + write_log 3 "Running update_script" + file attributes update_script -permissions 0755 + exec ./update_script noreboot + + cd /tmp + + file delete -force $tmp_dir + file delete $archive_file + + write_log 3 "Restarting addon" + if { [catch { + exec "${rc_dir}/${addon_id}" restart + } errormsg] } { + write_log 2 "Addon restart failed: ${errormsg}" + } + + write_log 3 "Addon ${addon_id} successfully installed" + + set_running_installation "" + + return "Addon ${addon_id} successfully installed" +} #puts [rmupdate::get_latest_firmware_version] #puts [rmupdate::get_firmware_info] diff --git a/addon/www/index.html b/addon/www/index.html index 3ae7fdb..c48bf9d 100644 --- a/addon/www/index.html +++ b/addon/www/index.html @@ -143,7 +143,7 @@ along with this program. If not, see . // We are not expecting a response }, function(xhr, ajaxOptions, thrownError) { - console.error("Firmware installation error.") + console.error("Firmware installation error: " + thrownError + ": " + xhr.responseText); $('[data-install-firmware-version="' + running_installation + '"]').removeClass('loading'); //$('#modal-log').modal('hide'); if (running_installation) { @@ -164,8 +164,9 @@ along with this program. If not, see . } function get_firmware_info() { + $('#dimmer-firmware-info').addClass('active'); rest("GET", "/get_firmware_info", null, function(data) { - $('#firmware_info tbody').empty(); + $('#firmware-info tbody').empty(); data.forEach(function(fw) { if (fw.latest) latest_firmware = fw.version; if (fw.installed) current_firmware = fw.version; @@ -190,7 +191,7 @@ along with this program. If not, see . var cls = ''; if (fw.installed) cls = ' class="warning"'; if (fw.latest) cls = ' class="positive"'; - $("#firmware_info tbody").append($('').append( + $("#firmware-info tbody").append($('').append( $('').append($('', {text: fw.version, title: 'Open release info', href: fw.info_url, target: "_blank"})), $('').append($('
').append($(''),$(''))), $('').append($('
').append($(''),$(''))), @@ -215,6 +216,7 @@ along with this program. If not, see . rest("GET", "/get_running_installation", null, function(installation_info) { set_running_installation(installation_info); }); + $('#dimmer-firmware-info').removeClass('active'); }); } @@ -227,55 +229,69 @@ along with this program. If not, see . }); } + function install_addon(addon_id) { + if (!running_installation) { + display_message('info', 'Installing addon ' + addon_id + '.', 6000000); + $('[data-update-addon-id="' + addon_id + '"]').addClass('loading'); + $('[data-update-addon-id="' + addon_id + '"]').addClass('disabled'); + rest("POST", "/install_addon", JSON.stringify({"addon_id":addon_id}), + function(data) { + //console.info(data); + $('[data-update-addon-id="' + addon_id + '"]').removeClass('loading'); + $('[data-update-addon-id="' + addon_id + '"]').removeClass('disabled'); + $('#tr-' + addon_id).removeClass('warning'); + $('#tr-' + addon_id).addClass('positive'); + $('#button-update-' + addon_id).removeClass('green'); + $('#button-update-' + addon_id).addClass('gray'); + $('#label-version-' + addon_id).text($('#label-available-version-' + addon_id).text()); + display_message('success', data, 6000000); + }, + function(xhr, ajaxOptions, thrownError) { + console.error("Addon installation error: " + thrownError + ": " + xhr.responseText); + $('[data-update-addon-id="' + addon_id + '"]').removeClass('loading'); + $('[data-update-addon-id="' + addon_id + '"]').removeClass('disabled'); + default_error_callback(xhr, ajaxOptions, thrownError); + } + ); + } + } + function get_addon_info() { + $('#dimmer-addon-info').addClass('active'); rest("GET", "/get_addon_info", null, function(data) { - $('#addon_info tbody').empty(); + $('#addon-info tbody').empty(); data.forEach(function(addon) { - //if (fw.latest) latest_firmware = fw.version; - //if (fw.installed) current_firmware = fw.version; - //var color = 'yellow'; - //if (fw.latest) color = 'green'; - //if (fw.installed) color = 'gray'; - //var disabled = (fw.image || fw.url ? '' : 'disabled'); - //var binstall = $('
').attr('data-install-firmware-version', fw.version).append($(''), 'install'); - //binstall.click(function() { - // install_firmware(this.getAttribute('data-install-firmware-version')); - //}); - //var bcls = ''; - //if (!fw.image) bcls = 'disabled'; - //if (fw.version == running_installation) bcls = 'loading'; - //var bdelete = $('
').attr('data-delete-version', fw.version).append($(''), 'delete download'); - //bdelete.click(function() { - // delete_firmware_image(this.getAttribute('data-delete-version')); - //}); - // - //var available = (fw.url ? 'checked=""' : '') - //var downloaded = (fw.image ? 'checked=""' : '') - //var cls = ''; - //if (fw.installed) cls = ' class="warning"'; - //if (fw.latest) cls = ' class="positive"'; - var cls = ' class="positive"'; - $("#addon_info tbody").append($('').append( + var color = 'gray'; + if (addon.available_version && (addon.version != addon.available_version)) color = 'green'; + + var disabled = ((addon.available_version && addon.download_url) ? '' : 'disabled'); + var bupdate = $('
') + .attr('data-update-addon-id', addon.id) + .attr('data-update-addon-available-version', addon.available_version) + .append($(''), 'update'); + bupdate.click(function() { + install_addon(this.getAttribute('data-update-addon-id')); + }); + + disabled = ((addon.config_url) ? '' : 'disabled'); + var bconfig = $('
') + .attr('data-addon-config-url', addon.config_url) + .append($(''), 'open config'); + bconfig.click(function() { + var win = window.open(this.getAttribute('data-addon-config-url'), '_blank'); + win.focus(); + }); + + var cls = (((!addon.available_version) || (addon.version == addon.available_version)) ? "positive" : "warning"); + var available_version = ((addon.available_version) ? addon.available_version : "?"); + $("#addon-info tbody").append($('').append( $('').append($('')), - $('').append($('')), - $('').append($('')), - $('').append($('')) + $('').append($('')), + $('').append($('')), + $('').append(bupdate, bconfig) )); }); - //var color = "#d01919"; - //if (current_firmware == latest_firmware) { - // color = "#21BA45"; - //} - //$("#firmware-summary").empty(); - //$("#firmware-summary").append( - // $('
').html('Current installed version: ' + current_firmware + ''), - // $('
').html('Latest available version: ' + latest_firmware) - //); - //if (current_firmware != latest_firmware) { - // $("#firmware-summary").append( - // $('
').click(install_latest_firmware).append($(''), 'Install latest firmware') - // ); - //} + $('#dimmer-addon-info').removeClass('active'); }); } @@ -292,7 +308,7 @@ along with this program. If not, see . }); get_system_info(); get_firmware_info(); - //get_addon_info(); + get_addon_info(); }); @@ -308,44 +324,53 @@ along with this program. If not, see .

Firmwares

- - - - - - - - - - - -
VersionAvailableDownloadedAction
- +
+
+
Loading
+
+ + + + + + + + + + + +
Addon nameInstalled versionAvailable versionAction
+
-
- - -
-
-
- - -