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 .
+