From 6fa4ba262e8f9b280c8bbd44cd42d613b224f974 Mon Sep 17 00:00:00 2001 From: Jan Schneider Date: Mon, 29 Jan 2018 00:04:12 +0100 Subject: [PATCH] Upload and install addon from file --- addon/lib/rmupdate.tcl | 17 ++++-- addon/www/index.html | 128 +++++++++++++++++++++++++++++------------ addon/www/rest.cgi | 18 +++++- 3 files changed, 119 insertions(+), 44 deletions(-) diff --git a/addon/lib/rmupdate.tcl b/addon/lib/rmupdate.tcl index d1df189..0b4a922 100644 --- a/addon/lib/rmupdate.tcl +++ b/addon/lib/rmupdate.tcl @@ -971,14 +971,19 @@ proc ::rmupdate::install_addon {{addon_id ""} {download_url ""}} { set_running_installation "Addon ${addon_id}" - write_log 3 "Downloading addon from ${download_url}." - set archive_file "/tmp/${addon_id}.tar.gz" - if {[file exists $archive_file]} { - file delete $archive_file + set archive_file "" + regexp {^file://(.*)$} $download_url match archive_file + if { [info exists archive_file] && $archive_file != "" } { + write_log 3 "Installing addon from local file ${archive_file}." + } else { + write_log 3 "Downloading addon from ${download_url}." + set archive_file "/tmp/${addon_id}.tar.gz" + if {[file exists $archive_file]} { + file delete $archive_file + } + exec /usr/bin/wget "${download_url}" --no-check-certificate --quiet --output-document=$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]} { diff --git a/addon/www/index.html b/addon/www/index.html index 6449247..3bd9b74 100644 --- a/addon/www/index.html +++ b/addon/www/index.html @@ -257,44 +257,80 @@ along with this program. If not, see . }); } - function install_addon(addon_id, download_url) { + function upload_and_install_addon() { + + } + + function install_addon(addon_id, download_url, file_input) { if (!running_installation) { display_message('info', i18next.t('installing_addon', {'addon_id': addon_id}), 6000000); - $('[data-update-addon-id="' + addon_id + '"]').addClass('loading'); - $('[data-update-addon-id="' + addon_id + '"]').addClass('disabled'); - $('[data-uninstall-addon-id="' + addon_id + '"]').addClass('disabled'); + if (addon_id) { + $('[data-update-addon-id="' + addon_id + '"]').addClass('loading'); + $('[data-update-addon-id="' + addon_id + '"]').addClass('disabled'); + $('[data-uninstall-addon-id="' + addon_id + '"]').addClass('disabled'); + } + if (download_url) { + $('#install-addon-url-button').addClass('loading'); + } + if (file_input) { + $('#install-addon-file-button').addClass('loading'); + } $('#install-addon-url-button').addClass('disabled'); - rest("POST", "/install_addon", JSON.stringify({"addon_id":addon_id, "download_url":download_url}), - function(data) { - //console.info(data); - $('[data-update-addon-id="' + addon_id + '"]').removeClass('loading'); - $('[data-update-addon-id="' + addon_id + '"]').removeClass('disabled'); - $('[data-uninstall-addon-id="' + addon_id + '"]').removeClass('disabled'); - $('#install-addon-url-button').removeClass('disabled'); - display_message('success', data, 6000000); - if (addon_id) { - $('#tr-' + addon_id).removeClass('warning'); - $('#tr-' + addon_id).addClass('positive'); - $('#button-update-' + addon_id).removeClass('green'); - $('#button-update-' + addon_id).addClass('gray'); - $('#button-update-' + addon_id).contents().last()[0].textContent = i18next.t('reinstall'); - $('#label-version-' + addon_id).text($('#label-available-version-' + addon_id).text()); - } - else { - $('#install-addon-url-input').val(''); - get_addon_info(); - } - }, - 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'); - $('[data-uninstall-addon-id="' + addon_id + '"]').removeClass('disabled'); - $('#install-addon-url-input').val(''); - $('#install-addon-url-button').removeClass('disabled'); - default_error_callback(xhr, ajaxOptions, thrownError); + $('#install-addon-file-button').addClass('disabled'); + var success_callback = function(data) { + //console.info(data); + $('[data-update-addon-id="' + addon_id + '"]').removeClass('loading'); + $('[data-update-addon-id="' + addon_id + '"]').removeClass('disabled'); + $('[data-uninstall-addon-id="' + addon_id + '"]').removeClass('disabled'); + $('#install-addon-url-button').removeClass('disabled'); + $('#install-addon-url-button').removeClass('loading'); + $('#install-addon-file-button').removeClass('disabled'); + $('#install-addon-file-button').removeClass('loading'); + display_message('success', data, 6000000); + if (addon_id) { + $('#tr-' + addon_id).removeClass('warning'); + $('#tr-' + addon_id).addClass('positive'); + $('#button-update-' + addon_id).removeClass('green'); + $('#button-update-' + addon_id).addClass('gray'); + $('#button-update-' + addon_id).contents().last()[0].textContent = i18next.t('reinstall'); + $('#label-version-' + addon_id).text($('#label-available-version-' + addon_id).text()); } - ); + else { + $('#install-addon-url-input').val(''); + $('#install-addon-file-input').val(''); + get_addon_info(); + } + } + var error_callback = 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'); + $('[data-uninstall-addon-id="' + addon_id + '"]').removeClass('disabled'); + $('#install-addon-url-input').val(''); + $('#install-addon-file-input').val(''); + $('#install-addon-url-button').removeClass('disabled'); + $('#install-addon-url-button').removeClass('loading'); + $('#install-addon-file-button').removeClass('disabled'); + $('#install-addon-file-button').removeClass('loading'); + default_error_callback(xhr, ajaxOptions, thrownError); + } + + if (file_input) { + $.ajax({ + url: 'rest.cgi?/install_addon_archive', + data: file_input.files[0], + type: 'POST', + processData: false, + contentType: 'application/octet-stream', + success: success_callback, + error: error_callback + }); + } + else { + rest("POST", "/install_addon", JSON.stringify({"addon_id":addon_id, "download_url":download_url}), + success_callback, error_callback + ); + } } } @@ -423,6 +459,8 @@ along with this program. If not, see . installing_addon: 'Installing addon {{addon_id}}.', uninstalling_addon: 'Uninstalling addon {{addon_id}}.', install_addon_from_url: 'Install addon from url', + install_addon_from_file: 'Install addon from file', + choose_addon_file: 'Choose and install addon-file', } }, de: { @@ -466,6 +504,8 @@ along with this program. If not, see . installing_addon: 'Installiere Addon {{addon_id}}.', uninstalling_addon: 'Deinstalliere Addon {{addon_id}}.', install_addon_from_url: 'Addon von URL installieren', + install_addon_from_file: 'Addon aus Datei installieren', + choose_addon_file: 'Addon-Datei auswählen und installieren', } } } @@ -477,6 +517,8 @@ along with this program. If not, see . $('div').localize(); $('th').localize(); $('label').localize(); + $('#install-addon-url-button').contents().last()[0].textContent = i18next.t('install'); + $('#install-addon-file-button').contents().last()[0].textContent = i18next.t('choose_addon_file'); }); rest("GET", "/version", null, function(version) { @@ -565,6 +607,7 @@ along with this program. If not, see . +

@@ -573,10 +616,23 @@ along with this program. If not, see .
+ +

+ +
+
+

+
+ + +