From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from firstgate.proxmox.com (firstgate.proxmox.com [212.224.123.68]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits)) (No client certificate requested) by lists.proxmox.com (Postfix) with ESMTPS id 3225A60723 for ; Mon, 14 Dec 2020 16:00:17 +0100 (CET) Received: from firstgate.proxmox.com (localhost [127.0.0.1]) by firstgate.proxmox.com (Proxmox) with ESMTP id 285B59EA0 for ; Mon, 14 Dec 2020 16:00:17 +0100 (CET) Received: from gaia.proxmox.com (212-186-127-178.static.upcbusiness.at [212.186.127.178]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by firstgate.proxmox.com (Proxmox) with ESMTPS id EAE0C9E95 for ; Mon, 14 Dec 2020 16:00:14 +0100 (CET) Received: from gaia.proxmox.com (localhost.localdomain [127.0.0.1]) by gaia.proxmox.com (8.15.2/8.15.2/Debian-14~deb10u1) with ESMTP id 0BEExSYZ925105; Mon, 14 Dec 2020 15:59:28 +0100 Received: (from oguz@localhost) by gaia.proxmox.com (8.15.2/8.15.2/Submit) id 0BEExSfa925104; Mon, 14 Dec 2020 15:59:28 +0100 From: Oguz Bektas To: pbs-devel@lists.proxmox.com Date: Mon, 14 Dec 2020 15:59:27 +0100 Message-Id: <20201214145927.925057-1-o.bektas@proxmox.com> X-Mailer: git-send-email 2.20.1 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-SPAM-LEVEL: Spam detection results: 1 AWL -0.652 Adjusted score from AWL reputation of From: address KAM_DMARC_STATUS 0.01 Test Rule for DKIM or SPF Failure with Strict Alignment KAM_LAZY_DOMAIN_SECURITY 1 Sending domain does not have any anti-forgery methods KHOP_HELO_FCRDNS 0.399 Relay HELO differs from its IP's reverse DNS NO_DNS_FOR_FROM 0.379 Envelope sender has no MX or A DNS records SPF_HELO_NONE 0.001 SPF: HELO does not publish an SPF Record SPF_NONE 0.001 SPF: sender does not publish an SPF Record Subject: [pbs-devel] [PATCH backup] ui: add datastore copy/paste functionality for adding remotes X-BeenThere: pbs-devel@lists.proxmox.com X-Mailman-Version: 2.1.29 Precedence: list List-Id: Proxmox Backup Server development discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 14 Dec 2020 15:00:17 -0000 add "Show Datastore Information" button on datastore summary. when clicked it shows - host x509 fingerprint - hostname - datastore name and encodes this info to json base64. the b64 blob can be then pasted in the "Remotes" menu when adding a remote. when pasted, it fills the encoded information in the form. code was largely adapted from the cluster join functionality in PVE. Signed-off-by: Oguz Bektas --- www/Makefile | 2 + www/datastore/Summary.js | 35 +++++++++++- www/window/DataStoreRemoteInfo.js | 88 +++++++++++++++++++++++++++++++ www/window/RemoteEdit.js | 55 +++++++++++++++++-- 4 files changed, 175 insertions(+), 5 deletions(-) create mode 100644 www/window/DataStoreRemoteInfo.js diff --git a/www/Makefile b/www/Makefile index ec9f469d..0d65c958 100644 --- a/www/Makefile +++ b/www/Makefile @@ -34,6 +34,7 @@ JSSRC= \ window/BackupGroupChangeOwner.js \ window/CreateDirectory.js \ window/DataStoreEdit.js \ + window/DataStoreRemoteInfo.js \ window/FileBrowser.js \ window/NotesEdit.js \ window/RemoteEdit.js \ @@ -66,6 +67,7 @@ JSSRC= \ datastore/Content.js \ datastore/OptionView.js \ datastore/Panel.js \ + datastore/Summary.js \ datastore/DataStoreListSummary.js \ datastore/DataStoreList.js \ ServerStatus.js \ diff --git a/www/datastore/Summary.js b/www/datastore/Summary.js index 25a7b6e5..ecbba863 100644 --- a/www/datastore/Summary.js +++ b/www/datastore/Summary.js @@ -185,7 +185,40 @@ Ext.define('PBS.DataStoreSummary', { padding: 5, }, - tbar: ['->', { xtype: 'proxmoxRRDTypeSelector' }], + tbar: [ + { + xtype: 'button', + text: gettext('Show Datastore Information'), + handler: function() { + let me = this; + let panel = me.up('panel'); + Proxmox.Utils.API2Request({ + url: '/api2/extjs/nodes/localhost/status', + method: 'GET', + waitMsgTarget: panel, + failure: function(e) { + console.log(e); + }, + success: function(response) { + let fingerprint = response.result.data.info.fingerprint; + let hostname = window.location.hostname; + let datastore = panel.datastore; + Ext.create('PBS.DataStoreRemoteInfoWindow', { + remoteInfo: { + ipAddress: hostname, + fingerprint: fingerprint, + datastore: datastore, + }, + }).show(); + }, + }); + }, + }, + '->', + { + xtype: 'proxmoxRRDTypeSelector', + }, + ], items: [ { diff --git a/www/window/DataStoreRemoteInfo.js b/www/window/DataStoreRemoteInfo.js new file mode 100644 index 00000000..df8dd4e8 --- /dev/null +++ b/www/window/DataStoreRemoteInfo.js @@ -0,0 +1,88 @@ +Ext.define('PBS.DataStoreRemoteInfoWindow', { + extend: 'Ext.window.Window', + modal: true, + width: 600, + title: gettext('Datastore Remote Information'), + mixins: ['Proxmox.Mixin.CBind'], + remoteInfo: { + ipAddress: undefined, + fingerprint: undefined, + datastore: undefined, + }, + layout: 'form', + bodyPadding: '10 0', + items: [ + { + xtype: 'container', + layout: 'form', + border: false, + padding: '0 10 10 10', + items: [ + { + xtype: 'textfield', + fieldLabel: gettext('x509 Fingerprint'), + inputId: 'fingerprintField', + cbind: { + value: '{remoteInfo.fingerprint}', + }, + editable: false, + }, + { + xtype: 'textfield', + fieldLabel: gettext('Hostname'), + editable: true, + inputId: 'hostnameField', + cbind: { + value: '{remoteInfo.ipAddress}', + }, + }, + { + xtype: 'textfield', + fieldLabel: gettext('Datastore Name'), + inputId: 'datastoreField', + cbind: { + value: '{remoteInfo.datastore}', + }, + editable: false, + }, + { + xtype: 'textarea', + inputId: 'SerializedRemoteInfo', + fieldLabel: gettext('Remote Information'), + grow: true, + editable: false, + cbind: { + remoteInfo: '{remoteInfo}', + }, + listeners: { + afterrender: function(field) { + var jsons = Ext.JSON.encode(field.remoteInfo); + var base64s = Ext.util.Base64.encode(jsons); + field.setValue(base64s) + }, + }, + }, + ], + }, + ], + buttons: [ + { + xtype: 'button', + iconCls: 'fa fa-clipboard', + handler: function(b) { + var el = document.getElementById('SerializedRemoteInfo'); + el.select(); + document.execCommand("copy"); + }, + text: gettext('Copy'), + }, + { + text: gettext('Ok'), + handler: function() { + this.up('window').close(); + }, + }, + ], +}); + + diff --git a/www/window/RemoteEdit.js b/www/window/RemoteEdit.js index 4a4d8114..30cffda4 100644 --- a/www/window/RemoteEdit.js +++ b/www/window/RemoteEdit.js @@ -11,6 +11,39 @@ Ext.define('PBS.window.RemoteEdit', { fieldDefaults: { labelWidth: 120 }, + viewModel: { + parent: null, + data: { + info: { + ipAddress: '', + fingerprint: '', + datastore: '', + }, + }, + }, + + controller: { + xclass: 'Ext.app.ViewController', + control: { + 'textarea[name=serializedinfo]': { + change: 'deserializeInfo', + }, + }, + deserializeInfo: function(field, value) { + let vm = this.getViewModel(); + let jsons = Ext.util.Base64.decode(value); + let remoteInfo = Ext.JSON.decode(jsons, true); + + let info = { + ipAddress: remoteInfo.ipAddress, + fingerprint: remoteInfo.fingerprint, + datastore: remoteInfo.datastore, + }; + + vm.set('info', info); + }, + }, + cbindData: function(initialConfig) { let me = this; @@ -26,7 +59,7 @@ Ext.define('PBS.window.RemoteEdit', { }; }, - items: { + items: [{ xtype: 'inputpanel', column1: [ { @@ -47,6 +80,9 @@ Ext.define('PBS.window.RemoteEdit', { submitValue: false, vtype: 'HostPort', fieldLabel: gettext('Host'), + bind: { + value: '{info.ipAddress}', + }, listeners: { change: function(field, newvalue) { let host = newvalue; @@ -86,7 +122,6 @@ Ext.define('PBS.window.RemoteEdit', { name: 'port', }, ], - column2: [ { xtype: 'proxmoxtextfield', @@ -105,7 +140,6 @@ Ext.define('PBS.window.RemoteEdit', { }, }, ], - columnB: [ { xtype: 'proxmoxtextfield', @@ -114,6 +148,10 @@ Ext.define('PBS.window.RemoteEdit', { deleteEmpty: '{!isCreate}', }, fieldLabel: gettext('Fingerprint'), + bind: { + value: '{info.fingerprint}', + }, + }, { xtype: 'proxmoxtextfield', @@ -124,7 +162,16 @@ Ext.define('PBS.window.RemoteEdit', { fieldLabel: gettext('Comment'), }, ], - }, + }, + { + xtype: 'textarea', + name: 'serializedinfo', + fieldLabel: gettext('Remote Info Blob'), + submitValue: false, + emptyText: gettext('Paste encoded Remote Information here'), + value: '', + }, + ], setValues: function(values) { let me = this; -- 2.20.1