[pbs-devel] [PATCH backup] ui: add datastore copy/paste functionality for adding remotes
Oguz Bektas
o.bektas at proxmox.com
Mon Dec 14 15:59:27 CET 2020
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 <o.bektas at proxmox.com>
---
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
More information about the pbs-devel
mailing list