[pve-devel] [PATCH manager v3 2/5] add xtermjs to pveproxy dirs

2017-12-11 Thread Dominik Csapak
Signed-off-by: Dominik Csapak 
---
 PVE/Service/pveproxy.pm | 9 -
 1 file changed, 8 insertions(+), 1 deletion(-)

diff --git a/PVE/Service/pveproxy.pm b/PVE/Service/pveproxy.pm
index 7d39900a..ec1eb9a5 100755
--- a/PVE/Service/pveproxy.pm
+++ b/PVE/Service/pveproxy.pm
@@ -51,6 +51,7 @@ my $basedirs = {
 manager => '/usr/share/pve-manager',
 docs => '/usr/share/pve-docs',
 fontawesome => '/usr/share/fonts-font-awesome',
+xtermjs => '/usr/share/pve-xtermjs',
 };
 
 sub init {
@@ -79,6 +80,7 @@ sub init {
 add_dirs($dirs, '/pve2/fa/css/' =>  "$basedirs->{fontawesome}/css/");
 add_dirs($dirs, '/pve-docs/' => "$basedirs->{docs}/");
 add_dirs($dirs, '/novnc/' => "$basedirs->{novnc}/");
+add_dirs($dirs, '/xtermjs/' => "$basedirs->{xtermjs}/");
 
 $self->{server_config} = {
title => 'Proxmox VE API',
@@ -192,6 +194,9 @@ sub get_index {
$mobile = $args->{mobile} ? 1 : 0;
 }
 
+my $novnc = defined($args->{console}) && $args->{novnc};
+my $xtermjs = defined($args->{console}) && $args->{xtermjs};
+
 my $page = '';
 my $template = Template->new({ABSOLUTE => 1});
 
@@ -218,8 +223,10 @@ sub get_index {
 # by default, load the normal index
 my $dir = $basedirs->{manager};
 
-if (defined($args->{console}) && $args->{novnc}) {
+if ($novnc) {
$dir = $basedirs->{novnc};
+} elsif ($xtermjs) {
+   $dir = $basedirs->{xtermjs};
 } elsif ($mobile) {
$dir = "$basedirs->{manager}/touch";
 }
-- 
2.11.0


___
pve-devel mailing list
pve-devel@pve.proxmox.com
https://pve.proxmox.com/cgi-bin/mailman/listinfo/pve-devel


[pve-devel] [PATCH qemu-server v3 1/2] add termproxy api call

2017-12-11 Thread Dominik Csapak
for xtermjs web client

Signed-off-by: Dominik Csapak 
---
 PVE/API2/Qemu.pm | 95 
 1 file changed, 95 insertions(+)

diff --git a/PVE/API2/Qemu.pm b/PVE/API2/Qemu.pm
index 5f9d105..2b23c6b 100644
--- a/PVE/API2/Qemu.pm
+++ b/PVE/API2/Qemu.pm
@@ -609,6 +609,7 @@ __PACKAGE__->register_method({
{ subdir => 'status' },
{ subdir => 'unlink' },
{ subdir => 'vncproxy' },
+   { subdir => 'termproxy' },
{ subdir => 'migrate' },
{ subdir => 'resize' },
{ subdir => 'move' },
@@ -1483,6 +1484,100 @@ __PACKAGE__->register_method({
 }});
 
 __PACKAGE__->register_method({
+name => 'termproxy',
+path => '{vmid}/termproxy',
+method => 'POST',
+protected => 1,
+permissions => {
+   check => ['perm', '/vms/{vmid}', [ 'VM.Console' ]],
+},
+description => "Creates a TCP proxy connections.",
+parameters => {
+   additionalProperties => 0,
+   properties => {
+   node => get_standard_option('pve-node'),
+   vmid => get_standard_option('pve-vmid'),
+   serial=> {
+   optional => 1,
+   type => 'string',
+   enum => [qw(serial0 serial1 serial2 serial3)],
+   description => "opens a serial terminal (defaults to display)",
+   },
+   },
+},
+returns => {
+   additionalProperties => 0,
+   properties => {
+   user => { type => 'string' },
+   ticket => { type => 'string' },
+   port => { type => 'integer' },
+   upid => { type => 'string' },
+   },
+},
+code => sub {
+   my ($param) = @_;
+
+   my $rpcenv = PVE::RPCEnvironment::get();
+
+   my $authuser = $rpcenv->get_user();
+
+   my $vmid = $param->{vmid};
+   my $node = $param->{node};
+   my $serial = $param->{serial};
+
+   my $conf = PVE::QemuConfig->load_config($vmid, $node); # check if VM 
exists
+
+   if (!defined($serial)) {
+   if ($conf->{vga} && $conf->{vga} =~ m/^serial\d+$/) {
+   $serial = $conf->{vga};
+   }
+   }
+
+   my $authpath = "/vms/$vmid";
+
+   my $ticket = PVE::AccessControl::assemble_vnc_ticket($authuser, 
$authpath);
+
+   my ($remip, $family);
+
+   if ($node ne 'localhost' && $node ne PVE::INotify::nodename()) {
+   ($remip, $family) = PVE::Cluster::remote_node_ip($node);
+   } else {
+   $family = PVE::Tools::get_host_address_family($node);
+   }
+
+   my $port = PVE::Tools::next_vnc_port($family);
+
+   my $remcmd = $remip ?
+   ['/usr/bin/ssh', '-e', 'none', '-t', $remip, '--'] : [];
+
+   my $termcmd = [ '/usr/sbin/qm', 'terminal', $vmid];
+   push @$termcmd, '-iface', $serial if $serial;
+
+   my $realcmd = sub {
+   my $upid = shift;
+
+   syslog('info', "starting qemu termproxy $upid\n");
+
+   my $cmd = ['/usr/bin/termproxy', $port, '--path', $authpath,
+  '--perm', 'VM.Console', '--'];
+   push @$cmd, @$remcmd, @$termcmd;
+
+   PVE::Tools::run_command($cmd);
+   };
+
+   my $upid = $rpcenv->fork_worker('vncproxy', $vmid, $authuser, $realcmd, 
1);
+
+   PVE::Tools::wait_for_vnc_port($port);
+
+   return {
+   user => $authuser,
+   ticket => $ticket,
+   port => $port,
+   upid => $upid,
+   };
+}});
+
+__PACKAGE__->register_method({
 name => 'vncwebsocket',
 path => '{vmid}/vncwebsocket',
 method => 'GET',
-- 
2.11.0


___
pve-devel mailing list
pve-devel@pve.proxmox.com
https://pve.proxmox.com/cgi-bin/mailman/listinfo/pve-devel


[pve-devel] [PATCH manager v3 1/5] add termproxy api call for nodes

2017-12-11 Thread Dominik Csapak
and add dependency for pve-xtermjs

Signed-off-by: Dominik Csapak 
---
 PVE/API2/Nodes.pm | 97 +++
 debian/control|  1 +
 2 files changed, 98 insertions(+)

diff --git a/PVE/API2/Nodes.pm b/PVE/API2/Nodes.pm
index a97620ef..f11fd169 100644
--- a/PVE/API2/Nodes.pm
+++ b/PVE/API2/Nodes.pm
@@ -155,6 +155,7 @@ __PACKAGE__->register_method ({
{ name => 'rrddata' },# fixme: remove?
{ name => 'replication' },
{ name => 'vncshell' },
+   { name => 'termproxy' },
{ name => 'spiceshell' },
{ name => 'time' },
{ name => 'dns' },
@@ -758,6 +759,102 @@ __PACKAGE__->register_method ({
};
 }});
 
+__PACKAGE__->register_method ({
+name => 'termproxy',
+path => 'termproxy',
+method => 'POST',
+protected => 1,
+permissions => {
+   description => "Restricted to users on realm 'pam'",
+   check => ['perm', '/nodes/{node}', [ 'Sys.Console' ]],
+},
+description => "Creates a VNC Shell proxy.",
+parameters => {
+   additionalProperties => 0,
+   properties => {
+   node => get_standard_option('pve-node'),
+   upgrade => {
+   type => 'boolean',
+   description => "Run 'apt-get dist-upgrade' instead of normal 
shell.",
+   optional => 1,
+   default => 0,
+   },
+   },
+},
+returns => {
+   additionalProperties => 0,
+   properties => {
+   user => { type => 'string' },
+   ticket => { type => 'string' },
+   port => { type => 'integer' },
+   upid => { type => 'string' },
+   },
+},
+code => sub {
+   my ($param) = @_;
+
+   my $rpcenv = PVE::RPCEnvironment::get();
+
+   my ($user, undef, $realm) = 
PVE::AccessControl::verify_username($rpcenv->get_user());
+
+   raise_perm_exc("realm != pam") if $realm ne 'pam';
+
+   my $node = $param->{node};
+
+   my $authpath = "/nodes/$node";
+
+   my $ticket = PVE::AccessControl::assemble_vnc_ticket($user, $authpath);
+
+   my ($remip, $family);
+
+   if ($node ne 'localhost' && $node ne PVE::INotify::nodename()) {
+   ($remip, $family) = PVE::Cluster::remote_node_ip($node);
+   } else {
+   $family = PVE::Tools::get_host_address_family($node);
+   }
+
+   my $port = PVE::Tools::next_vnc_port($family);
+
+   my $remcmd = $remip ?
+   ['/usr/bin/ssh', '-e', 'none', '-t', $remip , '--'] : [];
+
+   my $concmd;
+
+   if ($user eq 'root@pam') {
+   if ($param->{upgrade}) {
+   my $upgradecmd = "pveupgrade --shell";
+   $concmd = [ '/bin/bash', '-c', $upgradecmd ];
+   } else {
+   $concmd = [ '/bin/login', '-f', 'root' ];
+   }
+   } else {
+   $concmd = [ '/bin/login' ];
+   }
+
+   my $realcmd = sub {
+   my $upid = shift;
+
+   syslog ('info', "starting termproxy $upid\n");
+
+   my $cmd = ['/usr/bin/termproxy', $port, '--path', $authpath,
+  '--perm', 'Sys.Console',  '--'];
+   push  @$cmd, @$remcmd, @$concmd;
+
+   PVE::Tools::run_command($cmd);
+   };
+
+   my $upid = $rpcenv->fork_worker('vncshell', "", $user, $realcmd);
+
+   PVE::Tools::wait_for_vnc_port($port);
+
+   return {
+   user => $user,
+   ticket => $ticket,
+   port => $port,
+   upid => $upid,
+   };
+}});
+
 __PACKAGE__->register_method({
 name => 'vncwebsocket',
 path => 'vncwebsocket',
diff --git a/debian/control b/debian/control
index 9e399edc..88875342 100644
--- a/debian/control
+++ b/debian/control
@@ -59,6 +59,7 @@ Depends: apt-transport-https,
  pve-docs,
  pve-firewall,
  pve-ha-manager,
+ pve-xtermjs (>= 0.1-1),
  qemu-server (>= 1.1-1),
  rsync,
  spiceterm,
-- 
2.11.0


___
pve-devel mailing list
pve-devel@pve.proxmox.com
https://pve.proxmox.com/cgi-bin/mailman/listinfo/pve-devel


[pve-devel] [PATCH manager v3 3/5] add new xtermjs viewer window to Utils

2017-12-11 Thread Dominik Csapak
Signed-off-by: Dominik Csapak 
---
 www/manager6/Utils.js | 14 ++
 1 file changed, 14 insertions(+)

diff --git a/www/manager6/Utils.js b/www/manager6/Utils.js
index 3efe4e71..578ba81e 100644
--- a/www/manager6/Utils.js
+++ b/www/manager6/Utils.js
@@ -1156,6 +1156,8 @@ Ext.define('PVE.Utils', { utilities: {
 
if (viewer === 'html5') {
PVE.Utils.openVNCViewer(vmtype, vmid, nodename, vmname);
+   } else if (viewer === 'xtermjs') {
+   PVE.Utils.openXtermJSviewer(vmtype, vmid, nodename, vmname);
} else if (viewer === 'vv') {
var url;
var params = { proxy: PVE.Utils.windowHostname() };
@@ -1188,6 +1190,18 @@ Ext.define('PVE.Utils', { utilities: {
return dv;
 },
 
+openXtermJSviewer: function(vmtype, vmid, nodename, vmname) {
+   var url = Ext.urlEncode({
+   console: vmtype, // kvm, lxc, upgrade or shell
+   xtermjs: 1,
+   vmid: vmid,
+   vmname: vmname,
+   node: nodename
+   });
+   var nw = window.open("?" + url, '_blank', 
'toolbar=no,location=no,status=no,menubar=no,resizable=yes,width=800,height=420');
+   nw.focus();
+},
+
 openVNCViewer: function(vmtype, vmid, nodename, vmname) {
var url = Ext.urlEncode({
console: vmtype, // kvm, lxc, upgrade or shell
-- 
2.11.0


___
pve-devel mailing list
pve-devel@pve.proxmox.com
https://pve.proxmox.com/cgi-bin/mailman/listinfo/pve-devel


[pve-devel] [PATCH container v3 1/1] add termproxy api call for lxc

2017-12-11 Thread Dominik Csapak
Signed-off-by: Dominik Csapak 
---
 src/PVE/API2/LXC.pm | 84 +
 1 file changed, 84 insertions(+)

diff --git a/src/PVE/API2/LXC.pm b/src/PVE/API2/LXC.pm
index a1897c7..733826e 100644
--- a/src/PVE/API2/LXC.pm
+++ b/src/PVE/API2/LXC.pm
@@ -463,6 +463,7 @@ __PACKAGE__->register_method({
{ subdir => 'config' },
{ subdir => 'status' },
{ subdir => 'vncproxy' },
+   { subdir => 'termproxy' },
{ subdir => 'vncwebsocket' },
{ subdir => 'spiceproxy' },
{ subdir => 'migrate' },
@@ -760,6 +761,89 @@ __PACKAGE__->register_method ({
};
 }});
 
+__PACKAGE__->register_method ({
+name => 'termproxy',
+path => '{vmid}/termproxy',
+method => 'POST',
+protected => 1,
+permissions => {
+   check => ['perm', '/vms/{vmid}', [ 'VM.Console' ]],
+},
+description => "Creates a TCP proxy connection.",
+parameters => {
+   additionalProperties => 0,
+   properties => {
+   node => get_standard_option('pve-node'),
+   vmid => get_standard_option('pve-vmid'),
+   },
+},
+returns => {
+   additionalProperties => 0,
+   properties => {
+   user => { type => 'string' },
+   ticket => { type => 'string' },
+   port => { type => 'integer' },
+   upid => { type => 'string' },
+   },
+},
+code => sub {
+   my ($param) = @_;
+
+   my $rpcenv = PVE::RPCEnvironment::get();
+
+   my $authuser = $rpcenv->get_user();
+
+   my $vmid = $param->{vmid};
+   my $node = $param->{node};
+
+   my $authpath = "/vms/$vmid";
+
+   my $ticket = PVE::AccessControl::assemble_vnc_ticket($authuser, 
$authpath);
+
+   my ($remip, $family);
+
+   if ($node ne 'localhost' && $node ne PVE::INotify::nodename()) {
+   ($remip, $family) = PVE::Cluster::remote_node_ip($node);
+   } else {
+   $family = PVE::Tools::get_host_address_family($node);
+   }
+
+   my $port = PVE::Tools::next_vnc_port($family);
+
+   my $remcmd = $remip ?
+   ['/usr/bin/ssh', '-e', 'none', '-t', $remip, '--'] : [];
+
+   my $conf = PVE::LXC::Config->load_config($vmid, $node);
+   my $concmd = PVE::LXC::get_console_command($vmid, $conf, 1);
+
+   my $shcmd = [ '/usr/bin/dtach', '-A',
+ "/var/run/dtach/vzctlconsole$vmid",
+ '-r', 'winch', '-z', @$concmd];
+
+   my $realcmd = sub {
+   my $upid = shift;
+
+   syslog ('info', "starting lxc termproxy $upid\n");
+
+   my $cmd = ['/usr/bin/termproxy', $port, '--path', $authpath,
+  '--perm', 'VM.Console', '--'];
+   push @$cmd, @$remcmd, @$shcmd;
+
+   PVE::Tools::run_command($cmd);
+   };
+
+   my $upid = $rpcenv->fork_worker('vncproxy', $vmid, $authuser, $realcmd, 
1);
+
+   PVE::Tools::wait_for_vnc_port($port);
+
+   return {
+   user => $authuser,
+   ticket => $ticket,
+   port => $port,
+   upid => $upid,
+   };
+}});
+
 __PACKAGE__->register_method({
 name => 'vncwebsocket',
 path => '{vmid}/vncwebsocket',
-- 
2.11.0


___
pve-devel mailing list
pve-devel@pve.proxmox.com
https://pve.proxmox.com/cgi-bin/mailman/listinfo/pve-devel


[pve-devel] [PATCH qemu-server v3 2/2] enable vncproxy with vncterm for serial ports

2017-12-11 Thread Dominik Csapak
this enables the output via vncterm when the vm has
configured a serial port

Signed-off-by: Dominik Csapak 
---
 PVE/API2/Qemu.pm | 14 +++---
 1 file changed, 11 insertions(+), 3 deletions(-)

diff --git a/PVE/API2/Qemu.pm b/PVE/API2/Qemu.pm
index 2b23c6b..8ff6bd4 100644
--- a/PVE/API2/Qemu.pm
+++ b/PVE/API2/Qemu.pm
@@ -1429,14 +1429,22 @@ __PACKAGE__->register_method({
 
if ($conf->{vga} && ($conf->{vga} =~ m/^serial\d+$/)) {
 
-   die "Websocket mode is not supported in vga serial mode!" if 
$websocket;
 
my $termcmd = [ '/usr/sbin/qm', 'terminal', $vmid, '-iface', 
$conf->{vga} ];
-   #my $termcmd = "/usr/bin/qm terminal -iface $conf->{vga}";
+
$cmd = ['/usr/bin/vncterm', '-rfbport', $port,
'-timeout', $timeout, '-authpath', $authpath,
-   '-perm', 'Sys.Console', '-c', @$remcmd, @$termcmd];
+   '-perm', 'Sys.Console'];
+
+   if ($param->{websocket}) {
+   $ENV{PVE_VNC_TICKET} = $ticket; # pass ticket to vncterm
+   push @$cmd, '-notls', '-listen', 'localhost';
+   }
+
+   push @$cmd, '-c', @$remcmd, @$termcmd;
+
PVE::Tools::run_command($cmd);
+
} else {
 
$ENV{LC_PVE_TICKET} = $ticket if $websocket; # set ticket with 
"qm vncproxy"
-- 
2.11.0


___
pve-devel mailing list
pve-devel@pve.proxmox.com
https://pve.proxmox.com/cgi-bin/mailman/listinfo/pve-devel


[pve-devel] [PATCH manager v3 4/5] add xtermjs flag to VNCConsole iframe

2017-12-11 Thread Dominik Csapak
so that we can open an xtermjs iframe instead of novnc

Signed-off-by: Dominik Csapak 
---
 www/manager6/VNCConsole.js | 6 +-
 1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/www/manager6/VNCConsole.js b/www/manager6/VNCConsole.js
index 4b1b39ef..1438dd0c 100644
--- a/www/manager6/VNCConsole.js
+++ b/www/manager6/VNCConsole.js
@@ -10,6 +10,8 @@ Ext.define('PVE.noVncConsole', {
 
 layout: 'fit',
 
+xtermjs: false,
+
 border: false,
 
 initComponent : function() {
@@ -31,11 +33,13 @@ Ext.define('PVE.noVncConsole', {
// at same time (to avoid performance problems)
var box = Ext.create('Ext.ux.IFrame', { itemid : "vncconsole" });
 
+   var type = me.xtermjs ? 'xtermjs' : 'novnc';
+
Ext.apply(me, {
items: box,
listeners: {
activate: function() {
-   var url = '/?console=' + me.consoleType + '=1=' 
+ me.nodename + '=scale';
+   var url = '/?console=' + me.consoleType + '&' + type + 
'=1=' + me.nodename + '=scale';
if (me.vmid) {
url += '='+ me.vmid;
}
-- 
2.11.0


___
pve-devel mailing list
pve-devel@pve.proxmox.com
https://pve.proxmox.com/cgi-bin/mailman/listinfo/pve-devel


[pve-devel] [PATCH v3 3/3] fix error message

2017-12-11 Thread Dominik Csapak
status_line is a method and cannot be expanded in a string

Signed-off-by: Dominik Csapak 
---
 src/PVE/CLI/termproxy.pm | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/src/PVE/CLI/termproxy.pm b/src/PVE/CLI/termproxy.pm
index 1628337..28935b4 100644
--- a/src/PVE/CLI/termproxy.pm
+++ b/src/PVE/CLI/termproxy.pm
@@ -30,7 +30,8 @@ sub verify_ticket {
 my $res = $ua->post ('http://localhost:85/api2/json/access/ticket', 
Content => $params);
 
 if (!$res->is_success) {
-   die "Authentication failed: '$res->status_line'\n";
+   my $err = $res->status_line;
+   die "Authentication failed: '$err'\n";
 }
 }
 
-- 
2.11.0


___
pve-devel mailing list
pve-devel@pve.proxmox.com
https://pve.proxmox.com/cgi-bin/mailman/listinfo/pve-devel


[pve-devel] [PATCH v3 0/3] multiple fixes

2017-12-11 Thread Dominik Csapak
this series fixes some things with the pve-xtermjs package

* really fix the dependency for libpve-access-control (RPCEnvironment was in 
there)
* fix the error message for the authentication
* make the 'perm' parameter really optional

changes from v2:
do not use a default for 'perm', but make it a 'real' optional parameter
do not make 'path' a default parameter and remove the default path

changes from v1:
remove setup_environment altogether since we don't need it

Dominik Csapak (3):
  remove dependcy to libpve-access-control
  make perm an optional parameter
  fix error message

 src/PVE/CLI/termproxy.pm | 36 
 src/bin/termproxy|  2 --
 2 files changed, 16 insertions(+), 22 deletions(-)

-- 
2.11.0


___
pve-devel mailing list
pve-devel@pve.proxmox.com
https://pve.proxmox.com/cgi-bin/mailman/listinfo/pve-devel


[pve-devel] applied: [PATCH v3 0/3] multiple fixes

2017-12-11 Thread dietmar

applied

___
pve-devel mailing list
pve-devel@pve.proxmox.com
https://pve.proxmox.com/cgi-bin/mailman/listinfo/pve-devel


[pve-devel] applied: [PATCH manager] Fix #1589: auth_handler: raise exception on init_request error

2017-12-11 Thread Fabian Grünbichler

___
pve-devel mailing list
pve-devel@pve.proxmox.com
https://pve.proxmox.com/cgi-bin/mailman/listinfo/pve-devel


[pve-devel] applied: [PATCH] auth_handler: respond with passed error if we get a PVE::Exception

2017-12-11 Thread Fabian Grünbichler

___
pve-devel mailing list
pve-devel@pve.proxmox.com
https://pve.proxmox.com/cgi-bin/mailman/listinfo/pve-devel


[pve-devel] [PATCH v3 1/3] remove dependcy to libpve-access-control

2017-12-11 Thread Dominik Csapak
since we do not use any functionality of the RPCEnvironment, we remove it

Signed-off-by: Dominik Csapak 
---
 src/PVE/CLI/termproxy.pm | 5 -
 src/bin/termproxy| 2 --
 2 files changed, 7 deletions(-)

diff --git a/src/PVE/CLI/termproxy.pm b/src/PVE/CLI/termproxy.pm
index 3932f55..382270d 100644
--- a/src/PVE/CLI/termproxy.pm
+++ b/src/PVE/CLI/termproxy.pm
@@ -3,7 +3,6 @@ package PVE::CLI::termproxy;
 use strict;
 use warnings;
 
-use PVE::RPCEnvironment;
 use PVE::CLIHandler;
 use PVE::JSONSchema qw(get_standard_option);
 use PVE::PTY;
@@ -17,10 +16,6 @@ use constant MAX_QUEUE_LEN => 16*1024;
 use constant DEFAULT_PATH => '/';
 use constant DEFAULT_PERM => 'Sys.Console';
 
-sub setup_environment {
-PVE::RPCEnvironment->setup_default_cli_env();
-}
-
 sub verify_ticket {
 my ($ticket, $user, $path, $perm) = @_;
 
diff --git a/src/bin/termproxy b/src/bin/termproxy
index 6af56c6..a28bcd9 100755
--- a/src/bin/termproxy
+++ b/src/bin/termproxy
@@ -3,8 +3,6 @@
 use strict;
 use warnings;
 
-use PVE::AccessControl;
-
 use PVE::CLI::termproxy;
 
 PVE::CLI::termproxy->run_cli_handler();
-- 
2.11.0


___
pve-devel mailing list
pve-devel@pve.proxmox.com
https://pve.proxmox.com/cgi-bin/mailman/listinfo/pve-devel


[pve-devel] [PATCH v3 2/3] make perm an optional parameter

2017-12-11 Thread Dominik Csapak
and only pass it to the api call if it exists,
also delete the default path, since it is non-optional (and thus
a default makes no sense)

Signed-off-by: Dominik Csapak 
---
 src/PVE/CLI/termproxy.pm | 28 ++--
 1 file changed, 14 insertions(+), 14 deletions(-)

diff --git a/src/PVE/CLI/termproxy.pm b/src/PVE/CLI/termproxy.pm
index 382270d..1628337 100644
--- a/src/PVE/CLI/termproxy.pm
+++ b/src/PVE/CLI/termproxy.pm
@@ -13,19 +13,21 @@ use IO::Socket::IP;
 use base qw(PVE::CLIHandler);
 
 use constant MAX_QUEUE_LEN => 16*1024;
-use constant DEFAULT_PATH => '/';
-use constant DEFAULT_PERM => 'Sys.Console';
 
 sub verify_ticket {
 my ($ticket, $user, $path, $perm) = @_;
 
 my $ua = LWP::UserAgent->new();
 
-my $res = $ua->post ('http://localhost:85/api2/json/access/ticket', 
Content => {
-username => $user,
-password => $ticket,
-path => $path,
-privs => $perm, });
+my $params = {
+   username => $user,
+   password => $ticket,
+   path => $path,
+};
+
+$params->{privs} = $perm if $perm;
+
+my $res = $ua->post ('http://localhost:85/api2/json/access/ticket', 
Content => $params);
 
 if (!$res->is_success) {
die "Authentication failed: '$res->status_line'\n";
@@ -207,13 +209,12 @@ __PACKAGE__->register_method ({
},
path => {
type => 'string',
-   description => "The Authentication path. (default: 
'".DEFAULT_PATH."')",
-   default => DEFAULT_PATH,
+   description => "The Authentication path.",
},
perm => {
type => 'string',
-   description => "The Authentication Permission. (default: 
'".DEFAULT_PERM."')",
-   default => DEFAULT_PERM,
+   description => "The Authentication Permission.",
+   optional => 1,
},
'extra-args' => get_standard_option('extra-args'),
},
@@ -229,9 +230,8 @@ __PACKAGE__->register_method ({
die "No command given\n";
}
 
-   my $path = $param->{path} // DEFAULT_PATH;
-   my $perm = $param->{perm} // DEFAULT_PERM;
-   my ($queue, $handle) = listen_and_authenticate($param->{port}, 10, 
$path, $perm);
+   my ($queue, $handle) = listen_and_authenticate($param->{port}, 10,
+   $param->{path}, $param->{perm});
 
run_pty($cmd, $handle, $queue);
 
-- 
2.11.0


___
pve-devel mailing list
pve-devel@pve.proxmox.com
https://pve.proxmox.com/cgi-bin/mailman/listinfo/pve-devel


[pve-devel] [PATCH v3] add new xtermjs client

2017-12-11 Thread Dominik Csapak
this series adds support for the xtermjs terminal client for the host shell,
container consoles, and serial terminal for qemu vms

this series depends on the 'pve-xtermjs' package
to be found under: https://git.proxmox.com/?p=pve-xtermjs.git;a=summary

changes since v2:
* added path to termproxy call
* added '--' to ssh

changes since v1:

* added dependecy in pve-manager for pve-xtermjs
* whitespace fixes
* removed leftover/unecessary code
* reworked consolebutton

pve-manager:

Dominik Csapak (5):
  add termproxy api call for nodes
  add xtermjs to pveproxy dirs
  add new xtermjs viewer window to Utils
  add xtermjs flag to VNCConsole iframe
  add xtermjs to consolebutton

 PVE/API2/Nodes.pm| 97 
 PVE/Service/pveproxy.pm  |  9 +++-
 debian/control   |  1 +
 www/manager6/Utils.js| 14 ++
 www/manager6/VNCConsole.js   |  6 ++-
 www/manager6/button/ConsoleButton.js | 74 +++
 www/manager6/lxc/Config.js   | 30 +++
 www/manager6/node/Config.js  |  9 
 8 files changed, 198 insertions(+), 42 deletions(-)

pve-container:

Dominik Csapak (1):
  add termproxy api call for lxc

 src/PVE/API2/LXC.pm | 84 +
 1 file changed, 84 insertions(+)

qemu-server:

Dominik Csapak (2):
  add termproxy api call
  enable vncproxy with vncterm for serial ports

 PVE/API2/Qemu.pm | 109 +--
 1 file changed, 106 insertions(+), 3 deletions(-)

-- 
2.11.0


___
pve-devel mailing list
pve-devel@pve.proxmox.com
https://pve.proxmox.com/cgi-bin/mailman/listinfo/pve-devel


Re: [pve-devel] [PATCH 1/3] remove dependcy to libpve-access-control

2017-12-11 Thread Dietmar Maurer
I think PVE::RESTEnvironment is (should be) an Abstract class, so I am
not sure if we can use it that way.

> On December 11, 2017 at 10:58 AM Dominik Csapak  wrote:
> 
> 
> and use PVE::RESTEnvironment instead of
> PVE::RPCEnvironment for setup_default_cli_env
> 
> Signed-off-by: Dominik Csapak 
> ---
>  src/PVE/CLI/termproxy.pm | 4 ++--
>  src/bin/termproxy| 2 --
>  2 files changed, 2 insertions(+), 4 deletions(-)
> 
> diff --git a/src/PVE/CLI/termproxy.pm b/src/PVE/CLI/termproxy.pm
> index 3932f55..fc98976 100644
> --- a/src/PVE/CLI/termproxy.pm
> +++ b/src/PVE/CLI/termproxy.pm
> @@ -3,7 +3,7 @@ package PVE::CLI::termproxy;
>  use strict;
>  use warnings;
>  
> -use PVE::RPCEnvironment;
> +use PVE::RESTEnvironment;
>  use PVE::CLIHandler;
>  use PVE::JSONSchema qw(get_standard_option);
>  use PVE::PTY;
> @@ -18,7 +18,7 @@ use constant DEFAULT_PATH => '/';
>  use constant DEFAULT_PERM => 'Sys.Console';
>  
>  sub setup_environment {
> -PVE::RPCEnvironment->setup_default_cli_env();
> +PVE::RESTEnvironment->setup_default_cli_env();
>  }
>  
>  sub verify_ticket {
> diff --git a/src/bin/termproxy b/src/bin/termproxy
> index 6af56c6..a28bcd9 100755
> --- a/src/bin/termproxy
> +++ b/src/bin/termproxy
> @@ -3,8 +3,6 @@
>  use strict;
>  use warnings;
>  
> -use PVE::AccessControl;
> -
>  use PVE::CLI::termproxy;
>  
>  PVE::CLI::termproxy->run_cli_handler();
> -- 
> 2.11.0
> 
> 
> ___
> pve-devel mailing list
> pve-devel@pve.proxmox.com
> https://pve.proxmox.com/cgi-bin/mailman/listinfo/pve-devel

___
pve-devel mailing list
pve-devel@pve.proxmox.com
https://pve.proxmox.com/cgi-bin/mailman/listinfo/pve-devel


[pve-devel] [PATCH widget toolkit] HelpButton: be backward compatible with PVE help mapping

2017-12-11 Thread Thomas Lamprecht
pve-doc-generator used pveOnlineHelp as variable name while the
widget toolkit expects proxmoxOnlineHelp, allow both for now.

As its not quite clear when the switch to the widget toolkit happens
this is more flexible than changing the generator and adding a
versioned build dependency in pve-manager for it.
We normally do not bump pve-docs during releases either.

Signed-off-by: Thomas Lamprecht 
CC: Dominik Csapak 
---
 button/HelpButton.js | 18 --
 1 file changed, 16 insertions(+), 2 deletions(-)

diff --git a/button/HelpButton.js b/button/HelpButton.js
index dcb6f6e..1bf3f32 100644
--- a/button/HelpButton.js
+++ b/button/HelpButton.js
@@ -41,11 +41,25 @@ Ext.define('Proxmox.button.Help', {
}
 },
 
+getOnlineHelpInfo: function (ref) {
+   var helpMap;
+   if (typeof proxmoxOnlineHelpInfo !== 'undefined') {
+   helpMap = proxmoxOnlineHelpInfo;
+   } else if (typeof pveOnlineHelpInfo !== 'undefined') {
+   // be backward compatible with older pve-doc-generators
+   helpMap = pveOnlineHelpInfo;
+   } else {
+   throw "no global OnlineHelpInfo map declared";
+   }
+
+   return helpMap[ref];
+},
+
 // this sets the link and the tooltip text
 setOnlineHelp:function(blockid) {
var me = this;
 
-   var info = proxmoxOnlineHelpInfo[blockid];
+   var info = me.getOnlineHelpInfo(blockid);
if (info) {
me.onlineHelp = blockid;
var title = info.title;
@@ -67,7 +81,7 @@ Ext.define('Proxmox.button.Help', {
var docsURI;
 
if (me.onlineHelp) {
-   var info = proxmoxOnlineHelpInfo[me.onlineHelp];
+   var info = me.getOnlineHelpInfo(me.onlineHelp);
if (info) {
docsURI = window.location.origin + info.link;
}
-- 
2.11.0


___
pve-devel mailing list
pve-devel@pve.proxmox.com
https://pve.proxmox.com/cgi-bin/mailman/listinfo/pve-devel


[pve-devel] [PATCH 3/3] fix error message

2017-12-11 Thread Dominik Csapak
status_line is a method and cannot be expanded in a string

Signed-off-by: Dominik Csapak 
---
 src/PVE/CLI/termproxy.pm | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/src/PVE/CLI/termproxy.pm b/src/PVE/CLI/termproxy.pm
index dae1dfd..473d2f8 100644
--- a/src/PVE/CLI/termproxy.pm
+++ b/src/PVE/CLI/termproxy.pm
@@ -37,7 +37,8 @@ sub verify_ticket {
 my $res = $ua->post ('http://localhost:85/api2/json/access/ticket', 
Content => $params);
 
 if (!$res->is_success) {
-   die "Authentication failed: '$res->status_line'\n";
+   my $err = $res->status_line;
+   die "Authentication failed: '$err'\n";
 }
 }
 
-- 
2.11.0


___
pve-devel mailing list
pve-devel@pve.proxmox.com
https://pve.proxmox.com/cgi-bin/mailman/listinfo/pve-devel


[pve-devel] [RFC PATCH] Explain that concurrent modifications of the VM config are the error cause

2017-12-11 Thread Emmanuel Kasper
Signed-off-by: Emmanuel Kasper 
---
While doing PVE trainings last week, I noticed that this error message
was not clear to most people when it popped up on the GUI.

Reusing here the wording that apt uses when called multiple times
( Unable to lock the administration directory (/var/lib/dpkg/), 
is another process using it?) 

Is is worth to return the PID of the process holding the flock ? 

 src/PVE/Tools.pm | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/PVE/Tools.pm b/src/PVE/Tools.pm
index 6d579d8..9bce28f 100644
--- a/src/PVE/Tools.pm
+++ b/src/PVE/Tools.pm
@@ -196,7 +196,7 @@ sub lock_file_full {
weaken $lockhash->{$filename};
$local_fh = eval { run_with_timeout($timeout, $get_locked_file) };
if ($@) {
-   $@ = "can't lock file '$filename' - $@";
+   $@ = "can't lock file '$filename', is another process using it ? - 
$@";
return undef;
}
$check = 1;
-- 
2.11.0


___
pve-devel mailing list
pve-devel@pve.proxmox.com
https://pve.proxmox.com/cgi-bin/mailman/listinfo/pve-devel


[pve-devel] [PATCH docs] scan-extjs: rename pveOnlineHelpInfo to proxmoxOnlineHelpInfo

2017-12-11 Thread Thomas Lamprecht
For the swap to the widget toolkit.

Signed-off-by: Thomas Lamprecht 
---

It's probably better to apply this only after the switch happened, we
added a backward compatible check there to cope with an non-renamed
variable

 asciidoc-pve.in | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/asciidoc-pve.in b/asciidoc-pve.in
index 83f59eb..b3062f4 100644
--- a/asciidoc-pve.in
+++ b/asciidoc-pve.in
@@ -570,7 +570,7 @@ if ($clicmd eq 'compile-wiki') {
 my $data_str =  to_json($res_data, { pretty => 1,  canonical => 1 });
 chomp $data_str;
 
-print "var pveOnlineHelpInfo = ${data_str};\n";
+print "var proxmoxOnlineHelpInfo = ${data_str};\n";
 
 } elsif ($clicmd eq 'chapter-table') {
 
-- 
2.11.0


___
pve-devel mailing list
pve-devel@pve.proxmox.com
https://pve.proxmox.com/cgi-bin/mailman/listinfo/pve-devel


[pve-devel] [PATCH v2 1/3] remove dependcy to libpve-access-control

2017-12-11 Thread Dominik Csapak
since we do not use any functionality of the RPCEnvironment, we remove it

Signed-off-by: Dominik Csapak 
---
changes from v1:
do not use RESTHandler, but remove the call instead
 src/PVE/CLI/termproxy.pm | 5 -
 src/bin/termproxy| 2 --
 2 files changed, 7 deletions(-)

diff --git a/src/PVE/CLI/termproxy.pm b/src/PVE/CLI/termproxy.pm
index 3932f55..382270d 100644
--- a/src/PVE/CLI/termproxy.pm
+++ b/src/PVE/CLI/termproxy.pm
@@ -3,7 +3,6 @@ package PVE::CLI::termproxy;
 use strict;
 use warnings;
 
-use PVE::RPCEnvironment;
 use PVE::CLIHandler;
 use PVE::JSONSchema qw(get_standard_option);
 use PVE::PTY;
@@ -17,10 +16,6 @@ use constant MAX_QUEUE_LEN => 16*1024;
 use constant DEFAULT_PATH => '/';
 use constant DEFAULT_PERM => 'Sys.Console';
 
-sub setup_environment {
-PVE::RPCEnvironment->setup_default_cli_env();
-}
-
 sub verify_ticket {
 my ($ticket, $user, $path, $perm) = @_;
 
diff --git a/src/bin/termproxy b/src/bin/termproxy
index 6af56c6..a28bcd9 100755
--- a/src/bin/termproxy
+++ b/src/bin/termproxy
@@ -3,8 +3,6 @@
 use strict;
 use warnings;
 
-use PVE::AccessControl;
-
 use PVE::CLI::termproxy;
 
 PVE::CLI::termproxy->run_cli_handler();
-- 
2.11.0


___
pve-devel mailing list
pve-devel@pve.proxmox.com
https://pve.proxmox.com/cgi-bin/mailman/listinfo/pve-devel


[pve-devel] [PATCH v2 0/3] multiple fixes

2017-12-11 Thread Dominik Csapak
this series fixes some things with the pve-xtermjs package

* really fix the dependency for libpve-access-control (RPCEnvironment was in 
there)
* fix the error message for the authentication
* make the paramters really optional

changes from v1:
remove setup_environment altogether since we don't need it

Dominik Csapak (3):
  remove dependcy to libpve-access-control
  make path and perm optional parameters
  fix error message

 src/PVE/CLI/termproxy.pm | 24 +---
 src/bin/termproxy|  2 --
 2 files changed, 13 insertions(+), 13 deletions(-)

-- 
2.11.0


___
pve-devel mailing list
pve-devel@pve.proxmox.com
https://pve.proxmox.com/cgi-bin/mailman/listinfo/pve-devel


[pve-devel] [PATCH v2 3/3] fix error message

2017-12-11 Thread Dominik Csapak
status_line is a method and cannot be expanded in a string

Signed-off-by: Dominik Csapak 
---
 src/PVE/CLI/termproxy.pm | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/src/PVE/CLI/termproxy.pm b/src/PVE/CLI/termproxy.pm
index 7378821..c524671 100644
--- a/src/PVE/CLI/termproxy.pm
+++ b/src/PVE/CLI/termproxy.pm
@@ -32,7 +32,8 @@ sub verify_ticket {
 my $res = $ua->post ('http://localhost:85/api2/json/access/ticket', 
Content => $params);
 
 if (!$res->is_success) {
-   die "Authentication failed: '$res->status_line'\n";
+   my $err = $res->status_line;
+   die "Authentication failed: '$err'\n";
 }
 }
 
-- 
2.11.0


___
pve-devel mailing list
pve-devel@pve.proxmox.com
https://pve.proxmox.com/cgi-bin/mailman/listinfo/pve-devel


[pve-devel] [PATCH v2 2/3] make path and perm optional parameters

2017-12-11 Thread Dominik Csapak
and only pass perm to the api call if it is not empty

Signed-off-by: Dominik Csapak 
---
 src/PVE/CLI/termproxy.pm | 16 +++-
 1 file changed, 11 insertions(+), 5 deletions(-)

diff --git a/src/PVE/CLI/termproxy.pm b/src/PVE/CLI/termproxy.pm
index 382270d..7378821 100644
--- a/src/PVE/CLI/termproxy.pm
+++ b/src/PVE/CLI/termproxy.pm
@@ -21,11 +21,15 @@ sub verify_ticket {
 
 my $ua = LWP::UserAgent->new();
 
-my $res = $ua->post ('http://localhost:85/api2/json/access/ticket', 
Content => {
-username => $user,
-password => $ticket,
-path => $path,
-privs => $perm, });
+my $params = {
+   username => $user,
+   password => $ticket,
+   path => $path,
+};
+
+$params->{privs} = $perm if $perm;
+
+my $res = $ua->post ('http://localhost:85/api2/json/access/ticket', 
Content => $params);
 
 if (!$res->is_success) {
die "Authentication failed: '$res->status_line'\n";
@@ -209,11 +213,13 @@ __PACKAGE__->register_method ({
type => 'string',
description => "The Authentication path. (default: 
'".DEFAULT_PATH."')",
default => DEFAULT_PATH,
+   optional => 1,
},
perm => {
type => 'string',
description => "The Authentication Permission. (default: 
'".DEFAULT_PERM."')",
default => DEFAULT_PERM,
+   optional => 1,
},
'extra-args' => get_standard_option('extra-args'),
},
-- 
2.11.0


___
pve-devel mailing list
pve-devel@pve.proxmox.com
https://pve.proxmox.com/cgi-bin/mailman/listinfo/pve-devel


[pve-devel] [PATCH 1/3] remove dependcy to libpve-access-control

2017-12-11 Thread Dominik Csapak
and use PVE::RESTEnvironment instead of
PVE::RPCEnvironment for setup_default_cli_env

Signed-off-by: Dominik Csapak 
---
 src/PVE/CLI/termproxy.pm | 4 ++--
 src/bin/termproxy| 2 --
 2 files changed, 2 insertions(+), 4 deletions(-)

diff --git a/src/PVE/CLI/termproxy.pm b/src/PVE/CLI/termproxy.pm
index 3932f55..fc98976 100644
--- a/src/PVE/CLI/termproxy.pm
+++ b/src/PVE/CLI/termproxy.pm
@@ -3,7 +3,7 @@ package PVE::CLI::termproxy;
 use strict;
 use warnings;
 
-use PVE::RPCEnvironment;
+use PVE::RESTEnvironment;
 use PVE::CLIHandler;
 use PVE::JSONSchema qw(get_standard_option);
 use PVE::PTY;
@@ -18,7 +18,7 @@ use constant DEFAULT_PATH => '/';
 use constant DEFAULT_PERM => 'Sys.Console';
 
 sub setup_environment {
-PVE::RPCEnvironment->setup_default_cli_env();
+PVE::RESTEnvironment->setup_default_cli_env();
 }
 
 sub verify_ticket {
diff --git a/src/bin/termproxy b/src/bin/termproxy
index 6af56c6..a28bcd9 100755
--- a/src/bin/termproxy
+++ b/src/bin/termproxy
@@ -3,8 +3,6 @@
 use strict;
 use warnings;
 
-use PVE::AccessControl;
-
 use PVE::CLI::termproxy;
 
 PVE::CLI::termproxy->run_cli_handler();
-- 
2.11.0


___
pve-devel mailing list
pve-devel@pve.proxmox.com
https://pve.proxmox.com/cgi-bin/mailman/listinfo/pve-devel


[pve-devel] [PATCH 2/3] make path and perm optional parameters

2017-12-11 Thread Dominik Csapak
and only pass perm to the api call if it is not empty

Signed-off-by: Dominik Csapak 
---
the optional privs parameter is needed for non-pve environments,
where no privs exist
 src/PVE/CLI/termproxy.pm | 16 +++-
 1 file changed, 11 insertions(+), 5 deletions(-)

diff --git a/src/PVE/CLI/termproxy.pm b/src/PVE/CLI/termproxy.pm
index fc98976..dae1dfd 100644
--- a/src/PVE/CLI/termproxy.pm
+++ b/src/PVE/CLI/termproxy.pm
@@ -26,11 +26,15 @@ sub verify_ticket {
 
 my $ua = LWP::UserAgent->new();
 
-my $res = $ua->post ('http://localhost:85/api2/json/access/ticket', 
Content => {
-username => $user,
-password => $ticket,
-path => $path,
-privs => $perm, });
+my $params = {
+   username => $user,
+   password => $ticket,
+   path => $path,
+};
+
+$params->{privs} = $perm if $perm;
+
+my $res = $ua->post ('http://localhost:85/api2/json/access/ticket', 
Content => $params);
 
 if (!$res->is_success) {
die "Authentication failed: '$res->status_line'\n";
@@ -214,11 +218,13 @@ __PACKAGE__->register_method ({
type => 'string',
description => "The Authentication path. (default: 
'".DEFAULT_PATH."')",
default => DEFAULT_PATH,
+   optional => 1,
},
perm => {
type => 'string',
description => "The Authentication Permission. (default: 
'".DEFAULT_PERM."')",
default => DEFAULT_PERM,
+   optional => 1,
},
'extra-args' => get_standard_option('extra-args'),
},
-- 
2.11.0


___
pve-devel mailing list
pve-devel@pve.proxmox.com
https://pve.proxmox.com/cgi-bin/mailman/listinfo/pve-devel


[pve-devel] [PATCH 0/3] multiple fixes

2017-12-11 Thread Dominik Csapak
this series fixes some things with the pve-xtermjs package

* really fix the dependency for libpve-access-control (RPCEnvironment was in 
there)
* fix the error message for the authentication
* make the paramters really optional

Dominik Csapak (3):
  remove dependcy to libpve-access-control
  make path and perm optional parameters
  fix error message

 src/PVE/CLI/termproxy.pm | 23 +++
 src/bin/termproxy|  2 --
 2 files changed, 15 insertions(+), 10 deletions(-)

-- 
2.11.0


___
pve-devel mailing list
pve-devel@pve.proxmox.com
https://pve.proxmox.com/cgi-bin/mailman/listinfo/pve-devel


Re: [pve-devel] [PATCH v2 2/3] make path and perm optional parameters

2017-12-11 Thread Thomas Lamprecht
On 12/11/2017 11:28 AM, Dominik Csapak wrote:
> and only pass perm to the api call if it is not empty
> 
> Signed-off-by: Dominik Csapak 
> ---
>  src/PVE/CLI/termproxy.pm | 16 +++-
>  1 file changed, 11 insertions(+), 5 deletions(-)
> 
> diff --git a/src/PVE/CLI/termproxy.pm b/src/PVE/CLI/termproxy.pm
> index 382270d..7378821 100644
> --- a/src/PVE/CLI/termproxy.pm
> +++ b/src/PVE/CLI/termproxy.pm
> @@ -21,11 +21,15 @@ sub verify_ticket {
>  
>  my $ua = LWP::UserAgent->new();
>  
> -my $res = $ua->post ('http://localhost:85/api2/json/access/ticket', 
> Content => {
> -  username => $user,
> -  password => $ticket,
> -  path => $path,
> -  privs => $perm, });
> +my $params = {
> + username => $user,
> + password => $ticket,
> + path => $path,
> +};
> +
> +$params->{privs} = $perm if $perm;

but $perm is, as $path, always defined to the default value (DEFAULT_PERM)
by this methods callers caller (exec). Or will it get used in another
context in the future?

> +
> +my $res = $ua->post ('http://localhost:85/api2/json/access/ticket', 
> Content => $params);
>  
>  if (!$res->is_success) {
>   die "Authentication failed: '$res->status_line'\n";
> @@ -209,11 +213,13 @@ __PACKAGE__->register_method ({
>   type => 'string',
>   description => "The Authentication path. (default: 
> '".DEFAULT_PATH."')",
>   default => DEFAULT_PATH,
> + optional => 1,
>   },
>   perm => {
>   type => 'string',
>   description => "The Authentication Permission. (default: 
> '".DEFAULT_PERM."')",
>   default => DEFAULT_PERM,
> + optional => 1,
>   },
>   'extra-args' => get_standard_option('extra-args'),
>   },
> 


___
pve-devel mailing list
pve-devel@pve.proxmox.com
https://pve.proxmox.com/cgi-bin/mailman/listinfo/pve-devel


[pve-devel] [RFC manager 23/28] use RestProxy from widget toolkit

2017-12-11 Thread Thomas Lamprecht
Split PVE specific models, which where not moved to the general
widget toolkit, in a separate file, data/Models.js

Signed-off-by: Thomas Lamprecht 
---
 www/manager6/Makefile  |   2 +-
 www/manager6/ceph/Monitor.js   |   2 +-
 www/manager6/ceph/OSD.js   |   2 +-
 www/manager6/ceph/Pool.js  |   4 +-
 www/manager6/ceph/Status.js|   2 +-
 www/manager6/data/Models.js|  31 +
 www/manager6/data/PVEProxy.js  | 102 -
 www/manager6/data/RRDStore.js  |   2 +-
 www/manager6/data/ResourceStore.js |   2 +-
 www/manager6/dc/ACLView.js |   2 +-
 www/manager6/dc/Backup.js  |   2 +-
 www/manager6/dc/Health.js  |   2 +-
 www/manager6/dc/Log.js |   4 +-
 www/manager6/dc/SecurityGroups.js  |   2 +-
 www/manager6/dc/StorageView.js |   2 +-
 www/manager6/dc/Summary.js |   2 +-
 www/manager6/dc/Tasks.js   |   4 +-
 www/manager6/form/BridgeSelector.js|   2 +-
 www/manager6/form/CephPoolSelector.js  |   2 +-
 www/manager6/form/FileSelector.js  |   2 +-
 www/manager6/form/GlobalSearchField.js |   2 +-
 www/manager6/form/GroupSelector.js |   2 +-
 www/manager6/form/IPRefSelector.js |   2 +-
 www/manager6/form/NodeSelector.js  |   2 +-
 www/manager6/form/PoolSelector.js  |   2 +-
 www/manager6/form/RoleSelector.js  |   2 +-
 www/manager6/form/SecurityGroupSelector.js |   2 +-
 www/manager6/form/SnapshotSelector.js  |   2 +-
 www/manager6/form/StorageSelector.js   |   2 +-
 www/manager6/form/USBSelector.js   |   2 +-
 www/manager6/form/UserSelector.js  |   2 +-
 www/manager6/grid/BackupView.js|   2 +-
 www/manager6/grid/FirewallAliases.js   |   2 +-
 www/manager6/grid/FirewallRules.js |   4 +-
 www/manager6/grid/PoolMembers.js   |   2 +-
 www/manager6/grid/Replication.js   |   2 +-
 www/manager6/ha/GroupSelector.js   |   2 +-
 www/manager6/ha/Status.js  |   2 +-
 www/manager6/node/APT.js   |   2 +-
 www/manager6/node/Disks.js |   4 +-
 www/manager6/node/NetworkView.js   |   2 +-
 www/manager6/node/ServiceView.js   |   2 +-
 www/manager6/node/Tasks.js |   4 +-
 www/manager6/panel/IPSet.js|   4 +-
 www/manager6/storage/ContentView.js|   4 +-
 www/manager6/storage/GlusterFsEdit.js  |   2 +-
 www/manager6/storage/IScsiEdit.js  |   2 +-
 www/manager6/storage/LVMEdit.js|   4 +-
 www/manager6/storage/LvmThinEdit.js|   4 +-
 www/manager6/storage/NFSEdit.js|   2 +-
 www/manager6/storage/ZFSPoolEdit.js|   2 +-
 51 files changed, 90 insertions(+), 161 deletions(-)
 create mode 100644 www/manager6/data/Models.js
 delete mode 100644 www/manager6/data/PVEProxy.js

diff --git a/www/manager6/Makefile b/www/manager6/Makefile
index 89b4667a..e8dbdf86 100644
--- a/www/manager6/Makefile
+++ b/www/manager6/Makefile
@@ -16,7 +16,7 @@ JSSRC=
\
lxc/CmdMenu.js  \
node/CmdMenu.js \
VNCConsole.js   \
-   data/PVEProxy.js\
+   data/Models.js  \
data/UpdateQueue.js \
data/UpdateStore.js \
data/ResourceStore.js   \
diff --git a/www/manager6/ceph/Monitor.js b/www/manager6/ceph/Monitor.js
index 31d968cc..c4f091f9 100644
--- a/www/manager6/ceph/Monitor.js
+++ b/www/manager6/ceph/Monitor.js
@@ -72,7 +72,7 @@ Ext.define('PVE.node.CephMonList', {
storeid: 'ceph-mon-list' + nodename,
model: 'ceph-mon-list',
proxy: {
-type: 'pve',
+type: 'proxmox',
 url: "/api2/json/nodes/" + nodename + "/ceph/mon"
}
});
diff --git a/www/manager6/ceph/OSD.js b/www/manager6/ceph/OSD.js
index 4e333262..1bef7e0b 100644
--- a/www/manager6/ceph/OSD.js
+++ b/www/manager6/ceph/OSD.js
@@ -42,7 +42,7 @@ Ext.define('PVE.form.CephDiskSelector', {
filterOnLoad: true,
model: 'ceph-disk-list',
proxy: {
-type: 'pve',
+type: 'proxmox',
 url: "/api2/json/nodes/" + nodename + "/ceph/disks",
extraParams: { type: me.diskType }
},
diff --git a/www/manager6/ceph/Pool.js b/www/manager6/ceph/Pool.js
index 6b844e89..4f6ac277 100644
--- a/www/manager6/ceph/Pool.js
+++ b/www/manager6/ceph/Pool.js
@@ -157,7 +157,7 @@ Ext.define('PVE.node.CephPoolList', {

[pve-devel] [RFC manager 22/28] use ObjectStore from widget toolkit

2017-12-11 Thread Thomas Lamprecht
Signed-off-by: Thomas Lamprecht 
---
 www/manager6/Makefile   |  1 -
 www/manager6/data/ObjectStore.js| 35 ---
 www/manager6/ha/Status.js   |  2 +-
 www/manager6/lxc/Config.js  |  2 +-
 www/manager6/node/Config.js |  2 +-
 www/manager6/qemu/Config.js |  2 +-
 www/manager6/storage/ContentView.js |  2 +-
 www/manager6/storage/Summary.js |  2 +-
 8 files changed, 6 insertions(+), 42 deletions(-)
 delete mode 100644 www/manager6/data/ObjectStore.js

diff --git a/www/manager6/Makefile b/www/manager6/Makefile
index 56183720..89b4667a 100644
--- a/www/manager6/Makefile
+++ b/www/manager6/Makefile
@@ -19,7 +19,6 @@ JSSRC=
\
data/PVEProxy.js\
data/UpdateQueue.js \
data/UpdateStore.js \
-   data/ObjectStore.js \
data/ResourceStore.js   \
data/RRDStore.js\
form/VLanField.js   \
diff --git a/www/manager6/data/ObjectStore.js b/www/manager6/data/ObjectStore.js
deleted file mode 100644
index 6db1e6ce..
--- a/www/manager6/data/ObjectStore.js
+++ /dev/null
@@ -1,35 +0,0 @@
-/* This store encapsulates data items which are organized as an Array of 
key-values Objects
- * ie data[0] contains something like {key: "keyboard", value: "da"}
-*
-* Designed to work with the KeyValue model and the JsonObject data reader
-*/
-Ext.define('PVE.data.ObjectStore',  {
-extend: 'PVE.data.UpdateStore',
-
-constructor: function(config) {
-   var me = this;
-
-config = config || {};
-
-   if (!config.storeid) {
-   config.storeid =  'pve-store-' + (++Ext.idSeed);
-   }
-
-Ext.applyIf(config, {
-   model: 'KeyValue',
-proxy: {
-type: 'pve',
-   url: config.url,
-   extraParams: config.extraParams,
-reader: {
-   type: 'jsonobject',
-   rows: config.rows,
-   readArray: config.readArray,
-   rootProperty: config.root || 'data'
-   }
-}
-});
-
-me.callParent([config]);
-}
-});
diff --git a/www/manager6/ha/Status.js b/www/manager6/ha/Status.js
index f8418887..915c26e3 100644
--- a/www/manager6/ha/Status.js
+++ b/www/manager6/ha/Status.js
@@ -9,7 +9,7 @@ Ext.define('PVE.ha.Status', {
 initComponent: function() {
var me = this;
 
-   me.rstore = Ext.create('PVE.data.ObjectStore', {
+   me.rstore = Ext.create('Proxmox.data.ObjectStore', {
interval: me.interval,
model: 'pve-ha-status',
storeid: 'pve-store-' + (++Ext.idSeed),
diff --git a/www/manager6/lxc/Config.js b/www/manager6/lxc/Config.js
index 0ffc4841..58c59962 100644
--- a/www/manager6/lxc/Config.js
+++ b/www/manager6/lxc/Config.js
@@ -25,7 +25,7 @@ Ext.define('PVE.lxc.Config', {
 
var base_url = '/nodes/' + nodename + '/lxc/' + vmid;
 
-   me.statusStore = Ext.create('PVE.data.ObjectStore', {
+   me.statusStore = Ext.create('Proxmox.data.ObjectStore', {
url: '/api2/json' + base_url + '/status/current',
interval: 1000
});
diff --git a/www/manager6/node/Config.js b/www/manager6/node/Config.js
index 49f1186f..6bdffa44 100644
--- a/www/manager6/node/Config.js
+++ b/www/manager6/node/Config.js
@@ -14,7 +14,7 @@ Ext.define('PVE.node.Config', {
 
var caps = Ext.state.Manager.get('GuiCap');
 
-   me.statusStore = Ext.create('PVE.data.ObjectStore', {
+   me.statusStore = Ext.create('Proxmox.data.ObjectStore', {
url: "/api2/json/nodes/" + nodename + "/status",
interval: 1000
});
diff --git a/www/manager6/qemu/Config.js b/www/manager6/qemu/Config.js
index db0f3152..3b75b885 100644
--- a/www/manager6/qemu/Config.js
+++ b/www/manager6/qemu/Config.js
@@ -25,7 +25,7 @@ Ext.define('PVE.qemu.Config', {
 
var base_url = '/nodes/' + nodename + "/qemu/" + vmid;
 
-   me.statusStore = Ext.create('PVE.data.ObjectStore', {
+   me.statusStore = Ext.create('Proxmox.data.ObjectStore', {
url: '/api2/json' + base_url + '/status/current',
interval: 1000
});
diff --git a/www/manager6/storage/ContentView.js 
b/www/manager6/storage/ContentView.js
index d5e27f4d..fb4e62f0 100644
--- a/www/manager6/storage/ContentView.js
+++ b/www/manager6/storage/ContentView.js
@@ -401,7 +401,7 @@ Ext.define('PVE.storage.ContentView', {
}
});
 
-   me.statusStore = Ext.create('PVE.data.ObjectStore', {
+   me.statusStore = Ext.create('Proxmox.data.ObjectStore', {
url: '/api2/json/nodes/' + nodename + '/storage/' + storage + 
'/status'
});
 
diff --git 

[pve-devel] [RFC manager 04/28] use Checkbox from widget toolkit

2017-12-11 Thread Thomas Lamprecht
Signed-off-by: Thomas Lamprecht 
---
 www/manager6/Makefile |  1 -
 www/manager6/ceph/OSD.js  |  4 ++--
 www/manager6/ceph/Pool.js |  2 +-
 www/manager6/dc/ACLView.js|  2 +-
 www/manager6/dc/AuthEdit.js   |  4 ++--
 www/manager6/dc/Backup.js |  2 +-
 www/manager6/dc/UserEdit.js   |  2 +-
 www/manager6/form/Checkbox.js | 44 ---
 www/manager6/grid/FirewallOptions.js  |  2 +-
 www/manager6/grid/FirewallRules.js|  4 ++--
 www/manager6/grid/Replication.js  |  2 +-
 www/manager6/ha/GroupEdit.js  |  4 ++--
 www/manager6/lxc/CreateWizard.js  |  2 +-
 www/manager6/lxc/MPEdit.js| 10 
 www/manager6/lxc/Network.js   |  2 +-
 www/manager6/lxc/Options.js   |  6 ++---
 www/manager6/node/NetworkEdit.js  |  4 ++--
 www/manager6/panel/IPSet.js   |  2 +-
 www/manager6/qemu/HDEdit.js   |  8 +++
 www/manager6/qemu/HDMove.js   |  2 +-
 www/manager6/qemu/MemoryEdit.js   |  2 +-
 www/manager6/qemu/NetworkEdit.js  |  4 ++--
 www/manager6/qemu/Options.js  | 16 ++---
 www/manager6/qemu/ProcessorEdit.js|  2 +-
 www/manager6/qemu/Snapshot.js |  2 +-
 www/manager6/storage/DirEdit.js   |  4 ++--
 www/manager6/storage/GlusterFsEdit.js |  2 +-
 www/manager6/storage/IScsiEdit.js |  2 +-
 www/manager6/storage/LVMEdit.js   |  4 ++--
 www/manager6/storage/LvmThinEdit.js   |  2 +-
 www/manager6/storage/NFSEdit.js   |  2 +-
 www/manager6/storage/RBDEdit.js   |  4 ++--
 www/manager6/storage/SheepdogEdit.js  |  2 +-
 www/manager6/storage/ZFSEdit.js   |  6 ++---
 www/manager6/storage/ZFSPoolEdit.js   |  4 ++--
 www/manager6/window/Restore.js|  2 +-
 36 files changed, 62 insertions(+), 107 deletions(-)
 delete mode 100644 www/manager6/form/Checkbox.js

diff --git a/www/manager6/Makefile b/www/manager6/Makefile
index 0deea6a5..a5ebf1af 100644
--- a/www/manager6/Makefile
+++ b/www/manager6/Makefile
@@ -27,7 +27,6 @@ JSSRC=
\
data/ResourceStore.js   \
data/RRDStore.js\
form/VLanField.js   \
-   form/Checkbox.js\
form/TextField.js   \
form/IntegerField.js\
form/RRDTypeSelector.js \
diff --git a/www/manager6/ceph/OSD.js b/www/manager6/ceph/OSD.js
index cb358eab..57f6f065 100644
--- a/www/manager6/ceph/OSD.js
+++ b/www/manager6/ceph/OSD.js
@@ -116,7 +116,7 @@ Ext.define('PVE.CephCreateOsd', {
emptyText: 'use OSD disk'
},
{
-   xtype: 'pvecheckbox',
+   xtype: 'proxmoxcheckbox',
name: 'bluestore',
fieldLabel: 'Bluestore',
uncheckedValue: '0',
@@ -139,7 +139,7 @@ Ext.define('PVE.CephRemoveOsd', {
 method: 'DELETE',
 items: [
{
-   xtype: 'pvecheckbox',
+   xtype: 'proxmoxcheckbox',
name: 'cleanup',
checked: true,
labelWidth: 130,
diff --git a/www/manager6/ceph/Pool.js b/www/manager6/ceph/Pool.js
index cd84ee6d..d4be5208 100644
--- a/www/manager6/ceph/Pool.js
+++ b/www/manager6/ceph/Pool.js
@@ -49,7 +49,7 @@ Ext.define('PVE.CephCreatePool', {
allowBlank: false
},
{
-   xtype: 'pvecheckbox',
+   xtype: 'proxmoxcheckbox',
fieldLabel: gettext('Add Storages'),
name: 'add_storages'
}
diff --git a/www/manager6/dc/ACLView.js b/www/manager6/dc/ACLView.js
index f6688f94..acc6de50 100644
--- a/www/manager6/dc/ACLView.js
+++ b/www/manager6/dc/ACLView.js
@@ -47,7 +47,7 @@ Ext.define('PVE.dc.ACLAdd', {
 
if (!me.path) {
items.push({
-   xtype: 'pvecheckbox',
+   xtype: 'proxmoxcheckbox',
name: 'propagate',
checked: true,
uncheckedValue: 0,
diff --git a/www/manager6/dc/AuthEdit.js b/www/manager6/dc/AuthEdit.js
index 91a722e2..9c2ee9bd 100644
--- a/www/manager6/dc/AuthEdit.js
+++ b/www/manager6/dc/AuthEdit.js
@@ -83,7 +83,7 @@ Ext.define('PVE.dc.AuthEdit', {
}
 
 column1.push({
-xtype: 'pvecheckbox',
+xtype: 'proxmoxcheckbox',
 fieldLabel: gettext('Default'),
 name: 'default',
 uncheckedValue: 0
@@ -115,7 +115,7 @@ Ext.define('PVE.dc.AuthEdit', {
submitEmptyText: false
},
{
-xtype: 'pvecheckbox',
+xtype: 'proxmoxcheckbox',
 fieldLabel: 'SSL',
 name: 'secure',
 uncheckedValue: 0

[pve-devel] [RFC manager 25/28] use LogView from widget toolkit

2017-12-11 Thread Thomas Lamprecht
Signed-off-by: Thomas Lamprecht 
---
 www/manager6/Makefile|   1 -
 www/manager6/grid/Replication.js |   2 +-
 www/manager6/lxc/Config.js   |   2 +-
 www/manager6/node/Config.js  |   6 +-
 www/manager6/panel/LogView.js| 274 ---
 www/manager6/qemu/Config.js  |   2 +-
 6 files changed, 6 insertions(+), 281 deletions(-)
 delete mode 100644 www/manager6/panel/LogView.js

diff --git a/www/manager6/Makefile b/www/manager6/Makefile
index ca204c9e..fb4cba39 100644
--- a/www/manager6/Makefile
+++ b/www/manager6/Makefile
@@ -97,7 +97,6 @@ JSSRC=
\
panel/IPSet.js  \
panel/ConfigPanel.js\
grid/BackupView.js  \
-   panel/LogView.js\
ceph/Pool.js\
ceph/OSD.js \
ceph/Monitor.js \
diff --git a/www/manager6/grid/Replication.js b/www/manager6/grid/Replication.js
index 1998e28b..47353c5d 100644
--- a/www/manager6/grid/Replication.js
+++ b/www/manager6/grid/Replication.js
@@ -198,7 +198,7 @@ Ext.define('PVE.grid.ReplicaView', {
showLog: function(button, event, rec) {
var me = this.getView();
var controller = this;
-   var logView = Ext.create('PVE.panel.LogView', {
+   var logView = Ext.create('Proxmox.panel.LogView', {
border: false,
url: "/api2/extjs/nodes/" + me.nodename + "/replication/" + 
rec.data.id + "/log"
});
diff --git a/www/manager6/lxc/Config.js b/www/manager6/lxc/Config.js
index 58c59962..bc7f6cda 100644
--- a/www/manager6/lxc/Config.js
+++ b/www/manager6/lxc/Config.js
@@ -262,7 +262,7 @@ Ext.define('PVE.lxc.Config', {
iconCls: 'fa fa-list',
onlineHelp: 'chapter_pve_firewall',
itemId: 'firewall-fwlog',
-   xtype: 'pveLogView',
+   xtype: 'proxmoxLogView',
url: '/api2/extjs' + base_url + '/firewall/log'
}
);
diff --git a/www/manager6/node/Config.js b/www/manager6/node/Config.js
index 6bdffa44..f6e40acd 100644
--- a/www/manager6/node/Config.js
+++ b/www/manager6/node/Config.js
@@ -182,7 +182,7 @@ Ext.define('PVE.node.Config', {
groups: ['services'],
disabled: !caps.nodes['Sys.Syslog'],
itemId: 'syslog',
-   xtype: 'pveLogView',
+   xtype: 'proxmoxLogView',
url: "/api2/extjs/nodes/" + nodename + "/syslog",
log_select_timespan: 1
});
@@ -279,7 +279,7 @@ Ext.define('PVE.node.Config', {
if (caps.nodes['Sys.Syslog']) {
me.items.push(
{
-   xtype: 'pveLogView',
+   xtype: 'proxmoxLogView',
title: gettext('Log'),
iconCls: 'fa fa-list',
groups: ['firewall'],
@@ -293,7 +293,7 @@ Ext.define('PVE.node.Config', {
iconCls: 'fa fa-list',
groups: ['ceph'],
onlineHelp: 'chapter_pveceph',
-   xtype: 'pveLogView',
+   xtype: 'proxmoxLogView',
url: "/api2/extjs/nodes/" + nodename + "/ceph/log"
});
}
diff --git a/www/manager6/panel/LogView.js b/www/manager6/panel/LogView.js
deleted file mode 100644
index 4be7c50f..
--- a/www/manager6/panel/LogView.js
+++ /dev/null
@@ -1,274 +0,0 @@
-/*
- * Display log entries in a panel with scrollbar
- * The log entries are automatically refreshed via a background task,
- * with newest entries comming at the bottom
- */
-Ext.define('PVE.panel.LogView', {
-extend: 'Ext.panel.Panel',
-
-alias: ['widget.pveLogView'],
-
-pageSize: 500,
-
-lineHeight: 16,
-
-viewInfo: undefined,
-
-scrollToEnd: true,
-
-autoScroll: true,
-
-layout: 'auto',
-
-bodyPadding: 5,
-
-getMaxDown: function(scrollToEnd) {
-var me = this;
-
-   var target = me.getTargetEl();
-   var dom = target.dom;
-   if (scrollToEnd) {
-   dom.scrollTop = dom.scrollHeight - dom.clientHeight;
-   }
-
-   var maxDown = dom.scrollHeight - dom.clientHeight - 
-   dom.scrollTop;
-
-   return maxDown;
-},
-
-updateView: function(start, end, total, text) {
-var me = this;
-
-   if (me.destroyed) { // return if element is not there anymore
-   return;
-   }
-
-   var el = me.dataCmp.el;
-
-   if (me.viewInfo && me.viewInfo.start === start &&
-   me.viewInfo.end === end && me.viewInfo.total === total &&
-   me.viewInfo.textLength === text.length) {
-   return; // same content
- 

[pve-devel] [RFC manager 18/28] use DiffStore from widget toolkit

2017-12-11 Thread Thomas Lamprecht
The alias stayed the same (store.diff) so we need to change direct
usage of 'PVE.data.DiffStore' only.

Signed-off-by: Thomas Lamprecht 
---
 www/manager6/Makefile|   1 -
 www/manager6/ceph/Monitor.js |   2 +-
 www/manager6/ceph/Pool.js|   2 +-
 www/manager6/data/DiffStore.js   | 114 ---
 www/manager6/dc/Log.js   |   4 +-
 www/manager6/dc/Summary.js   |   2 +-
 www/manager6/dc/Tasks.js |   2 +-
 www/manager6/grid/Replication.js |   2 +-
 www/manager6/ha/Resources.js |   2 +-
 www/manager6/ha/StatusView.js|   2 +-
 www/manager6/node/ServiceView.js |   2 +-
 11 files changed, 10 insertions(+), 125 deletions(-)
 delete mode 100644 www/manager6/data/DiffStore.js

diff --git a/www/manager6/Makefile b/www/manager6/Makefile
index e987ec44..d1e488a7 100644
--- a/www/manager6/Makefile
+++ b/www/manager6/Makefile
@@ -21,7 +21,6 @@ JSSRC=
\
data/PVEProxy.js\
data/UpdateQueue.js \
data/UpdateStore.js \
-   data/DiffStore.js   \
data/ObjectStore.js \
data/ResourceStore.js   \
data/RRDStore.js\
diff --git a/www/manager6/ceph/Monitor.js b/www/manager6/ceph/Monitor.js
index 042c5198..31d968cc 100644
--- a/www/manager6/ceph/Monitor.js
+++ b/www/manager6/ceph/Monitor.js
@@ -77,7 +77,7 @@ Ext.define('PVE.node.CephMonList', {
}
});
 
-   var store = Ext.create('PVE.data.DiffStore', {
+   var store = Ext.create('Proxmox.data.DiffStore', {
rstore: rstore,
sorters: [{ property: 'name'}]
});
diff --git a/www/manager6/ceph/Pool.js b/www/manager6/ceph/Pool.js
index 78931acd..6b844e89 100644
--- a/www/manager6/ceph/Pool.js
+++ b/www/manager6/ceph/Pool.js
@@ -162,7 +162,7 @@ Ext.define('PVE.node.CephPoolList', {
}
});
 
-   var store = Ext.create('PVE.data.DiffStore', { rstore: rstore });
+   var store = Ext.create('Proxmox.data.DiffStore', { rstore: rstore });
 
PVE.Utils.monStoreErrors(me, rstore);
 
diff --git a/www/manager6/data/DiffStore.js b/www/manager6/data/DiffStore.js
deleted file mode 100644
index c93617a7..
--- a/www/manager6/data/DiffStore.js
+++ /dev/null
@@ -1,114 +0,0 @@
-/*
- * The DiffStore is a in-memory store acting as proxy between a real store
- * instance and a component.
- * Its purpose is to redisplay the component *only* if the data has been 
changed
- * inside the real store, to avoid the annoying visual flickering of using
- * the real store directly.
- *
- * Implementation:
- * The DiffStore monitors via mon() the 'load' events sent by the real store.
- * On each 'load' event, the DiffStore compares its own content with the target
- * store (call to cond_add_item()) and then fires a 'refresh' event.
- * The 'refresh' event will automatically trigger a view refresh on the 
component
- * who binds to this store.
- */
-
-/* Config properties:
- * rstore: the realstore which will autorefresh its content from the API
- * Only works if rstore has a model and use 'idProperty'
- * sortAfterUpdate: sort the diffstore before rendering the view
- */
-Ext.define('PVE.data.DiffStore', {
-extend: 'Ext.data.Store',
-alias: 'store.diff',
-
-sortAfterUpdate: false,
-
-constructor: function(config) {
-   var me = this;
-
-   config = config || {};
-
-   if (!config.rstore) {
-   throw "no rstore specified";
-   }
-
-   if (!config.rstore.model) {
-   throw "no rstore model specified";
-   }
-
-   var rstore = config.rstore;
-
-   Ext.apply(config, {
-   model: rstore.model,
-   proxy: { type: 'memory' }
-   });
-
-   me.callParent([config]);
-
-   var first_load = true;
-
-   var cond_add_item = function(data, id) {
-   var olditem = me.getById(id);
-   if (olditem) {
-   olditem.beginEdit();
-   Ext.Array.each(me.model.prototype.fields, function(field) {
-   if (olditem.data[field.name] !== data[field.name]) {
-   olditem.set(field.name, data[field.name]);
-   }
-   });
-   olditem.endEdit(true);
-   olditem.commit(); 
-   } else {
-   var newrec = Ext.create(me.model, data);
-   var pos = (me.appendAtStart && !first_load) ? 0 : 
me.data.length;
-   me.insert(pos, newrec);
-   }
-   };
-
-   var loadFn = function(s, records, success) {
-
-   if (!success) {
-   return;
-   }
-
-   me.suspendEvents();
-
-   // getSource returns null if data is not filtered
-   // if it is 

[pve-devel] [RFC manager 14/28] use windowEdit from widget toolkit

2017-12-11 Thread Thomas Lamprecht
Signed-off-by: Thomas Lamprecht 
---
 www/manager6/Makefile |   1 -
 www/manager6/ceph/Monitor.js  |   2 +-
 www/manager6/ceph/OSD.js  |   4 +-
 www/manager6/ceph/Pool.js |   2 +-
 www/manager6/dc/ACLView.js|   2 +-
 www/manager6/dc/AuthEdit.js   |   2 +-
 www/manager6/dc/Backup.js |   2 +-
 www/manager6/dc/GroupEdit.js  |   2 +-
 www/manager6/dc/PoolEdit.js   |   2 +-
 www/manager6/dc/SecurityGroups.js |   2 +-
 www/manager6/dc/UserEdit.js   |   2 +-
 www/manager6/dc/UserView.js   |   2 +-
 www/manager6/grid/FirewallAliases.js  |   2 +-
 www/manager6/grid/FirewallOptions.js  |   6 +-
 www/manager6/grid/FirewallRules.js|   4 +-
 www/manager6/grid/PoolMembers.js  |   4 +-
 www/manager6/grid/Replication.js  |   2 +-
 www/manager6/ha/GroupEdit.js  |   2 +-
 www/manager6/ha/ResourceEdit.js   |   2 +-
 www/manager6/lxc/DNS.js   |   4 +-
 www/manager6/lxc/MPEdit.js|   2 +-
 www/manager6/lxc/Network.js   |   2 +-
 www/manager6/lxc/Options.js   |  10 +-
 www/manager6/lxc/ResourceEdit.js  |   4 +-
 www/manager6/node/DNSEdit.js  |   2 +-
 www/manager6/node/NetworkEdit.js  |   2 +-
 www/manager6/node/Subscription.js |   2 +-
 www/manager6/node/TimeEdit.js |   2 +-
 www/manager6/panel/IPSet.js   |   6 +-
 www/manager6/qemu/BootOrderEdit.js|   2 +-
 www/manager6/qemu/CDEdit.js   |   2 +-
 www/manager6/qemu/CPUOptions.js   |   2 +-
 www/manager6/qemu/DisplayEdit.js  |   2 +-
 www/manager6/qemu/HDEdit.js   |   2 +-
 www/manager6/qemu/HDEfi.js|   2 +-
 www/manager6/qemu/HDThrottle.js   |   2 +-
 www/manager6/qemu/KeyboardEdit.js |   2 +-
 www/manager6/qemu/MemoryEdit.js   |   2 +-
 www/manager6/qemu/NetworkEdit.js  |   2 +-
 www/manager6/qemu/OSTypeEdit.js   |   2 +-
 www/manager6/qemu/Options.js  |  22 +--
 www/manager6/qemu/ProcessorEdit.js|   2 +-
 www/manager6/qemu/QemuBiosEdit.js |   2 +-
 www/manager6/qemu/ScsiHwEdit.js   |   2 +-
 www/manager6/qemu/Smbios1Edit.js  |   2 +-
 www/manager6/qemu/USBEdit.js  |   2 +-
 www/manager6/storage/DirEdit.js   |   2 +-
 www/manager6/storage/GlusterFsEdit.js |   2 +-
 www/manager6/storage/IScsiEdit.js |   2 +-
 www/manager6/storage/LVMEdit.js   |   2 +-
 www/manager6/storage/LvmThinEdit.js   |   2 +-
 www/manager6/storage/NFSEdit.js   |   2 +-
 www/manager6/storage/RBDEdit.js   |   2 +-
 www/manager6/storage/SheepdogEdit.js  |   2 +-
 www/manager6/storage/ZFSEdit.js   |   2 +-
 www/manager6/storage/ZFSPoolEdit.js   |   2 +-
 www/manager6/window/Edit.js   | 308 --
 www/manager6/window/NotesEdit.js  |   2 +-
 www/manager6/window/Restore.js|   2 +-
 www/manager6/window/StartupEdit.js|   2 +-
 60 files changed, 81 insertions(+), 390 deletions(-)
 delete mode 100644 www/manager6/window/Edit.js

diff --git a/www/manager6/Makefile b/www/manager6/Makefile
index e8673a75..4e850ce2 100644
--- a/www/manager6/Makefile
+++ b/www/manager6/Makefile
@@ -84,7 +84,6 @@ JSSRC=
\
panel/InputPanel.js \
panel/GaugeWidget.js\
panel/HealthWidget.js   \
-   window/Edit.js  \
window/LoginWindow.js   \
window/TaskViewer.js\
window/Wizard.js\
diff --git a/www/manager6/ceph/Monitor.js b/www/manager6/ceph/Monitor.js
index 7e755425..a9737983 100644
--- a/www/manager6/ceph/Monitor.js
+++ b/www/manager6/ceph/Monitor.js
@@ -1,5 +1,5 @@
 Ext.define('PVE.CephCreateMon', {
-extend: 'PVE.window.Edit',
+extend: 'Proxmox.window.Edit',
 alias: ['widget.pveCephCreateMon'],
 
 subject: 'Ceph Monitor/Manager',
diff --git a/www/manager6/ceph/OSD.js b/www/manager6/ceph/OSD.js
index 57f6f065..cf72a91b 100644
--- a/www/manager6/ceph/OSD.js
+++ b/www/manager6/ceph/OSD.js
@@ -74,7 +74,7 @@ Ext.define('PVE.form.CephDiskSelector', {
 });
 
 Ext.define('PVE.CephCreateOsd', {
-extend: 'PVE.window.Edit',
+extend: 'Proxmox.window.Edit',
 alias: ['widget.pveCephCreateOsd'],
 
 subject: 'Ceph OSD',
@@ -130,7 +130,7 @@ Ext.define('PVE.CephCreateOsd', {
 });
 
 Ext.define('PVE.CephRemoveOsd', {
-extend: 'PVE.window.Edit',
+extend: 'Proxmox.window.Edit',
 alias: ['widget.pveCephRemoveOsd'],
 
 isRemove: true,
diff --git a/www/manager6/ceph/Pool.js b/www/manager6/ceph/Pool.js
index d4be5208..78931acd 100644
--- a/www/manager6/ceph/Pool.js
+++ b/www/manager6/ceph/Pool.js
@@ -1,5 +1,5 @@
 Ext.define('PVE.CephCreatePool', {
-extend: 'PVE.window.Edit',
+extend: 'Proxmox.window.Edit',
  

[pve-devel] [RFC manager 15/28] use TaskViewer & TaskProgress window from widget toolkit

2017-12-11 Thread Thomas Lamprecht
Signed-off-by: Thomas Lamprecht 
---
 www/manager6/Makefile   |   1 -
 www/manager6/ceph/Monitor.js|   4 +-
 www/manager6/ceph/OSD.js|   2 +-
 www/manager6/dc/Tasks.js|   2 +-
 www/manager6/lxc/CreateWizard.js|   2 +-
 www/manager6/lxc/MPResize.js|   2 +-
 www/manager6/lxc/Snapshot.js|   2 +-
 www/manager6/lxc/SnapshotTree.js|   4 +-
 www/manager6/node/APT.js|   2 +-
 www/manager6/node/Disks.js  |   2 +-
 www/manager6/node/ServiceView.js|   2 +-
 www/manager6/node/Tasks.js  |   2 +-
 www/manager6/qemu/HDMove.js |   2 +-
 www/manager6/qemu/Snapshot.js   |   2 +-
 www/manager6/qemu/SnapshotTree.js   |   4 +-
 www/manager6/storage/ContentView.js |   2 +-
 www/manager6/window/Backup.js   |   2 +-
 www/manager6/window/BulkAction.js   |   2 +-
 www/manager6/window/Migrate.js  |   2 +-
 www/manager6/window/MigrateAll.js   |   2 +-
 www/manager6/window/Restore.js  |   2 +-
 www/manager6/window/SafeDestroy.js  |   2 +-
 www/manager6/window/TaskViewer.js   | 223 
 23 files changed, 24 insertions(+), 248 deletions(-)
 delete mode 100644 www/manager6/window/TaskViewer.js

diff --git a/www/manager6/Makefile b/www/manager6/Makefile
index 4e850ce2..23a9f79f 100644
--- a/www/manager6/Makefile
+++ b/www/manager6/Makefile
@@ -85,7 +85,6 @@ JSSRC=
\
panel/GaugeWidget.js\
panel/HealthWidget.js   \
window/LoginWindow.js   \
-   window/TaskViewer.js\
window/Wizard.js\
window/NotesEdit.js \
window/Backup.js\
diff --git a/www/manager6/ceph/Monitor.js b/www/manager6/ceph/Monitor.js
index a9737983..042c5198 100644
--- a/www/manager6/ceph/Monitor.js
+++ b/www/manager6/ceph/Monitor.js
@@ -96,7 +96,7 @@ Ext.define('PVE.node.CephMonList', {
params: { service: "mon." + rec.data.name },
success: function(response, options) {
var upid = response.result.data;
-   var win = Ext.create('PVE.window.TaskProgress', { upid: 
upid });
+   var win = Ext.create('Proxmox.window.TaskProgress', { upid: 
upid });
win.show();
},
failure: function(response, opts) {
@@ -151,7 +151,7 @@ Ext.define('PVE.node.CephMonList', {
method: 'DELETE',
success: function(response, options) {
var upid = response.result.data;
-   var win = Ext.create('PVE.window.TaskProgress', { upid: 
upid });
+   var win = Ext.create('Proxmox.window.TaskProgress', { 
upid: upid });
win.show();
},
failure: function(response, opts) {
diff --git a/www/manager6/ceph/OSD.js b/www/manager6/ceph/OSD.js
index cf72a91b..4e333262 100644
--- a/www/manager6/ceph/OSD.js
+++ b/www/manager6/ceph/OSD.js
@@ -403,7 +403,7 @@ Ext.define('PVE.node.CephOsdTree', {
method: 'POST',
success: function(response, options) {
var upid = response.result.data;
-   var win = Ext.create('PVE.window.TaskProgress', { upid: 
upid });
+   var win = Ext.create('Proxmox.window.TaskProgress', { upid: 
upid });
win.show();
me.mon(win, 'close', reload, me);
},
diff --git a/www/manager6/dc/Tasks.js b/www/manager6/dc/Tasks.js
index 5d65bd2e..35e54e1e 100644
--- a/www/manager6/dc/Tasks.js
+++ b/www/manager6/dc/Tasks.js
@@ -43,7 +43,7 @@ Ext.define('PVE.dc.Tasks', {
return;
}
 
-   var win = Ext.create('PVE.window.TaskViewer', { 
+   var win = Ext.create('Proxmox.window.TaskViewer', {
upid: rec.data.upid
});
win.show();
diff --git a/www/manager6/lxc/CreateWizard.js b/www/manager6/lxc/CreateWizard.js
index 31f54248..e172ce4a 100644
--- a/www/manager6/lxc/CreateWizard.js
+++ b/www/manager6/lxc/CreateWizard.js
@@ -320,7 +320,7 @@ Ext.define('PVE.lxc.CreateWizard', {
success: function(response, opts){
var upid = response.result.data;
 
-   var win = Ext.create('PVE.window.TaskViewer', {
+   var win = 
Ext.create('Proxmox.window.TaskViewer', {
upid: upid
});
win.show();
diff --git a/www/manager6/lxc/MPResize.js b/www/manager6/lxc/MPResize.js
index bcda4b60..b1f9b9b7 100644
--- a/www/manager6/lxc/MPResize.js
+++ 

[pve-devel] [RFC manager 26/28] use InputPanel from widget toolkit

2017-12-11 Thread Thomas Lamprecht
Signed-off-by: Thomas Lamprecht 
---
 www/manager6/Makefile |   1 -
 www/manager6/dc/ACLView.js|   2 +-
 www/manager6/dc/AuthEdit.js   |   2 +-
 www/manager6/dc/Backup.js |   2 +-
 www/manager6/dc/SecurityGroups.js |   2 +-
 www/manager6/dc/UserEdit.js   |   2 +-
 www/manager6/grid/FirewallAliases.js  |   2 +-
 www/manager6/grid/FirewallRules.js|   4 +-
 www/manager6/ha/GroupEdit.js  |   2 +-
 www/manager6/ha/ResourceEdit.js   |   2 +-
 www/manager6/lxc/DNS.js   |   2 +-
 www/manager6/lxc/MPEdit.js|   2 +-
 www/manager6/lxc/Network.js   |   2 +-
 www/manager6/lxc/ResourceEdit.js  |   4 +-
 www/manager6/panel/IPSet.js   |   2 +-
 www/manager6/panel/InputPanel.js  | 124 --
 www/manager6/qemu/BootOrderEdit.js|   2 +-
 www/manager6/qemu/CDEdit.js   |   2 +-
 www/manager6/qemu/CPUOptions.js   |   2 +-
 www/manager6/qemu/HDEdit.js   |   2 +-
 www/manager6/qemu/HDEfi.js|   2 +-
 www/manager6/qemu/HDThrottle.js   |   2 +-
 www/manager6/qemu/MemoryEdit.js   |   2 +-
 www/manager6/qemu/NetworkEdit.js  |   2 +-
 www/manager6/qemu/OSTypeEdit.js   |   2 +-
 www/manager6/qemu/ProcessorEdit.js|   2 +-
 www/manager6/qemu/Smbios1Edit.js  |   2 +-
 www/manager6/qemu/USBEdit.js  |   2 +-
 www/manager6/storage/DirEdit.js   |   2 +-
 www/manager6/storage/GlusterFsEdit.js |   2 +-
 www/manager6/storage/IScsiEdit.js |   2 +-
 www/manager6/storage/LVMEdit.js   |   2 +-
 www/manager6/storage/LvmThinEdit.js   |   2 +-
 www/manager6/storage/NFSEdit.js   |   2 +-
 www/manager6/storage/RBDEdit.js   |   2 +-
 www/manager6/storage/SheepdogEdit.js  |   2 +-
 www/manager6/storage/ZFSEdit.js   |   2 +-
 www/manager6/storage/ZFSPoolEdit.js   |   2 +-
 www/manager6/window/StartupEdit.js|   2 +-
 39 files changed, 39 insertions(+), 164 deletions(-)
 delete mode 100644 www/manager6/panel/InputPanel.js

diff --git a/www/manager6/Makefile b/www/manager6/Makefile
index fb4cba39..a5d63332 100644
--- a/www/manager6/Makefile
+++ b/www/manager6/Makefile
@@ -76,7 +76,6 @@ JSSRC=
\
panel/RunningChart.js   \
panel/InfoWidget.js \
panel/TemplateStatusView.js \
-   panel/InputPanel.js \
panel/HealthWidget.js   \
window/LoginWindow.js   \
window/Wizard.js\
diff --git a/www/manager6/dc/ACLView.js b/www/manager6/dc/ACLView.js
index 6ab6e93c..878a6309 100644
--- a/www/manager6/dc/ACLView.js
+++ b/www/manager6/dc/ACLView.js
@@ -55,7 +55,7 @@ Ext.define('PVE.dc.ACLAdd', {
});
}
 
-   var ipanel = Ext.create('PVE.panel.InputPanel', {
+   var ipanel = Ext.create('Proxmox.panel.InputPanel', {
items: items,
onlineHelp: 'pveum_permission_management'
});
diff --git a/www/manager6/dc/AuthEdit.js b/www/manager6/dc/AuthEdit.js
index d44820d2..f7fba8ce 100644
--- a/www/manager6/dc/AuthEdit.js
+++ b/www/manager6/dc/AuthEdit.js
@@ -190,7 +190,7 @@ Ext.define('PVE.dc.AuthEdit', {
 fieldLabel: 'Yubico URL'
 });
 
-   var ipanel = Ext.create('PVE.panel.InputPanel', {
+   var ipanel = Ext.create('Proxmox.panel.InputPanel', {
column1: column1,
column2: column2,
columnB: [{
diff --git a/www/manager6/dc/Backup.js b/www/manager6/dc/Backup.js
index 1622d6b7..833d062a 100644
--- a/www/manager6/dc/Backup.js
+++ b/www/manager6/dc/Backup.js
@@ -193,7 +193,7 @@ Ext.define('PVE.dc.BackupEdit', {
];
/*jslint confusion: false*/
 
-   var ipanel = Ext.create('PVE.panel.InputPanel', {
+   var ipanel = Ext.create('Proxmox.panel.InputPanel', {
onlineHelp: 'chapter_vzdump',
column1: column1,
column2:  column2,
diff --git a/www/manager6/dc/SecurityGroups.js 
b/www/manager6/dc/SecurityGroups.js
index 54066b5a..4c4d0199 100644
--- a/www/manager6/dc/SecurityGroups.js
+++ b/www/manager6/dc/SecurityGroups.js
@@ -42,7 +42,7 @@ Ext.define('PVE.SecurityGroupEdit', {
});
 }
 
-   var ipanel = Ext.create('PVE.panel.InputPanel', {
+   var ipanel = Ext.create('Proxmox.panel.InputPanel', {
// InputPanel does not have a 'create' property, does it need a 
'isCreate'
isCreate: me.isCreate,
items: items 
diff --git a/www/manager6/dc/UserEdit.js b/www/manager6/dc/UserEdit.js
index 4b467104..d46d0465 100644
--- a/www/manager6/dc/UserEdit.js
+++ b/www/manager6/dc/UserEdit.js
@@ -151,7 +151,7 @@ Ext.define('PVE.dc.UserEdit', {
 });
 }
 
-   var ipanel = Ext.create('PVE.panel.InputPanel', {
+   

[pve-devel] [RFC manager 10/28] lxc/Options: cleanup & use a few new features from ObjectGrid

2017-12-11 Thread Thomas Lamprecht
Use also same store update interval as qemu/Options

Signed-off-by: Thomas Lamprecht 
---
 www/manager6/lxc/Options.js | 52 +++--
 1 file changed, 12 insertions(+), 40 deletions(-)

diff --git a/www/manager6/lxc/Options.js b/www/manager6/lxc/Options.js
index 5e66147a..9752d98c 100644
--- a/www/manager6/lxc/Options.js
+++ b/www/manager6/lxc/Options.js
@@ -148,44 +148,8 @@ Ext.define('PVE.lxc.Options', {
 
var baseurl = 'nodes/' + nodename + '/lxc/' + vmid + '/config';
 
-   var reload = function() {
-   me.rstore.load();
-   };
-
var sm = Ext.create('Ext.selection.RowModel', {});
 
-   var run_editor = function() {
-   var rec = sm.getSelection()[0];
-   if (!rec) {
-   return;
-   }
-
-   var rowdef = rows[rec.data.key];
-   if (!rowdef.editor) {
-   return;
-   }
-
-   var win;
-   if (Ext.isString(rowdef.editor)) {
-   win = Ext.create(rowdef.editor, {
-   pveSelNode: me.pveSelNode,
-   confid: rec.data.key,
-   url: '/api2/extjs/' + baseurl
-   });
-   } else {
-   var config = Ext.apply({
-   pveSelNode: me.pveSelNode,
-   confid: rec.data.key,
-   url: '/api2/extjs/' + baseurl
-   }, rowdef.editor);
-   win = Ext.createWidget(rowdef.editor.xtype, config);
-   win.load();
-   }
-
-   win.show();
-   win.on('destroy', reload);
-   };
-
var edit_btn = new PVE.button.Button({
text: gettext('Edit'),
disabled: true,
@@ -194,21 +158,29 @@ Ext.define('PVE.lxc.Options', {
var rowdef = rows[rec.data.key];
return !!rowdef.editor;
},
-   handler: run_editor
+   handler: me.run_editor
});
 
Ext.apply(me, {
-   url: "/api2/json/nodes/" + nodename + "/lxc/" + vmid + "/config",
+   url: "/api2/json/" + baseurl,
selModel: sm,
+   interval: 5000,
tbar: [ edit_btn ],
rows: rows,
+   editorConfig: {
+   url: '/api2/extjs/' + baseurl
+   },
listeners: {
-   itemdblclick: run_editor,
-   activate: reload
+   itemdblclick: me.run_editor
}
});
 
me.callParent();
+
+   me.on('activate', me.rstore.startUpdate);
+   me.on('destroy', me.rstore.stopUpdate);
+   me.on('deactivate', me.rstore.stopUpdate);
+
 }
 });
 
-- 
2.11.0


___
pve-devel mailing list
pve-devel@pve.proxmox.com
https://pve.proxmox.com/cgi-bin/mailman/listinfo/pve-devel


[pve-devel] [RFC manager 05/28] use RRDTypeSelector from widget toolkit

2017-12-11 Thread Thomas Lamprecht
Signed-off-by: Thomas Lamprecht 
---
 www/manager6/Makefile|  1 -
 www/manager6/data/RRDStore.js|  2 +-
 www/manager6/form/RRDTypeSelector.js | 49 
 www/manager6/lxc/Summary.js  |  2 +-
 www/manager6/node/Summary.js |  2 +-
 www/manager6/panel/RRDView.js|  2 +-
 www/manager6/qemu/Summary.js |  2 +-
 www/manager6/storage/Summary.js  |  2 +-
 8 files changed, 6 insertions(+), 56 deletions(-)
 delete mode 100644 www/manager6/form/RRDTypeSelector.js

diff --git a/www/manager6/Makefile b/www/manager6/Makefile
index a5ebf1af..df7329e0 100644
--- a/www/manager6/Makefile
+++ b/www/manager6/Makefile
@@ -29,7 +29,6 @@ JSSRC=
\
form/VLanField.js   \
form/TextField.js   \
form/IntegerField.js\
-   form/RRDTypeSelector.js \
form/ComboGrid.js   \
form/KVComboBox.js  \
form/Boolean.js \
diff --git a/www/manager6/data/RRDStore.js b/www/manager6/data/RRDStore.js
index f9f80685..3caf0f4d 100644
--- a/www/manager6/data/RRDStore.js
+++ b/www/manager6/data/RRDStore.js
@@ -89,7 +89,7 @@ Ext.define('PVE.data.RRDStore', {
throw "no rrdurl specified";
}
 
-   var stateid = 'pveRRDTypeSelection';
+   var stateid = 'proxmoxRRDTypeSelection';
var sp = Ext.state.Manager.getProvider();
var stateinit = sp.get(stateid);
 
diff --git a/www/manager6/form/RRDTypeSelector.js 
b/www/manager6/form/RRDTypeSelector.js
deleted file mode 100644
index a912c710..
--- a/www/manager6/form/RRDTypeSelector.js
+++ /dev/null
@@ -1,49 +0,0 @@
-Ext.define('PVE.form.RRDTypeSelector', {
-extend: 'Ext.form.field.ComboBox',
-alias: ['widget.pveRRDTypeSelector'],
-
-displayField: 'text',
-valueField: 'id',
-editable: false,
-queryMode: 'local',
-value: 'hour',
-stateEvents: [ 'select' ],
-stateful: true,
-stateId: 'pveRRDTypeSelection',
-store: {
-   type: 'array',
-   fields: [ 'id', 'timeframe', 'cf', 'text' ],
-   data : [
-   [ 'hour', 'hour', 'AVERAGE', "Hour (average)" ],
-   [ 'hourmax', 'hour', 'MAX', "Hour (max)" ],
-   [ 'day', 'day', 'AVERAGE', "Day (average)" ],
-   [ 'daymax', 'day', 'MAX', "Day (max)" ],
-   [ 'week', 'week', 'AVERAGE', "Week (average)" ],
-   [ 'weekmax', 'week', 'MAX', "Week (max)" ],
-   [ 'month', 'month', 'AVERAGE', "Month (average)" ],
-   [ 'monthmax', 'month', 'MAX', "Month (max)" ],
-   [ 'year', 'year', 'AVERAGE', "Year (average)" ],
-   [ 'yearmax', 'year', 'MAX', "Year (max)" ]
-   ]
-   },
-// save current selection in the state Provider so RRDView can read it
-getState: function() {
-   var ind = this.getStore().findExact('id', this.getValue());
-   var rec = this.getStore().getAt(ind);
-   if (!rec) {
-   return;
-   }
-   return {
-   id: rec.data.id,
-   timeframe: rec.data.timeframe,
-   cf: rec.data.cf
-   };
-},
-// set selection based on last saved state
-applyState : function(state) {
-   if (state && state.id) {
-   this.setValue(state.id);
-   }
-}
-});
-
diff --git a/www/manager6/lxc/Summary.js b/www/manager6/lxc/Summary.js
index e9292b2b..509ef576 100644
--- a/www/manager6/lxc/Summary.js
+++ b/www/manager6/lxc/Summary.js
@@ -73,7 +73,7 @@ Ext.define('PVE.lxc.Summary', {
});
 
Ext.apply(me, {
-   tbar: [ '->' , { xtype: 'pveRRDTypeSelector' } ],
+   tbar: [ '->' , { xtype: 'proxmoxRRDTypeSelector' } ],
plugins: {
ptype: 'lazyitems',
items: [
diff --git a/www/manager6/node/Summary.js b/www/manager6/node/Summary.js
index 6e67b74a..0d2d77cd 100644
--- a/www/manager6/node/Summary.js
+++ b/www/manager6/node/Summary.js
@@ -92,7 +92,7 @@ Ext.define('PVE.node.Summary', {
});
 
Ext.apply(me, {
-   tbar: [version_btn, '->', { xtype: 'pveRRDTypeSelector' } ],
+   tbar: [version_btn, '->', { xtype: 'proxmoxRRDTypeSelector' } ],
plugins: {
ptype: 'lazyitems',
items: [
diff --git a/www/manager6/panel/RRDView.js b/www/manager6/panel/RRDView.js
index 9fd3c47a..fb4f2f4f 100644
--- a/www/manager6/panel/RRDView.js
+++ b/www/manager6/panel/RRDView.js
@@ -13,7 +13,7 @@ Ext.define('PVE.panel.RRDView', {
throw "no rrdurl specified";
}
 
-   var stateid = 'pveRRDTypeSelection';
+   var stateid = 'proxmoxRRDTypeSelection';
var sp = Ext.state.Manager.getProvider();
var 

[pve-devel] [RFC manager 09/28] lxc/Resources: cleanup & use new features from ObjectGrid

2017-12-11 Thread Thomas Lamprecht
Signed-off-by: Thomas Lamprecht 
---
 www/manager6/lxc/Resources.js | 87 ++-
 1 file changed, 20 insertions(+), 67 deletions(-)

diff --git a/www/manager6/lxc/Resources.js b/www/manager6/lxc/Resources.js
index ad7712b6..e9411e16 100644
--- a/www/manager6/lxc/Resources.js
+++ b/www/manager6/lxc/Resources.js
@@ -5,22 +5,6 @@ Ext.define('PVE.lxc.RessourceView', {
 
 onlineHelp: 'pct_configuration',
 
-renderKey: function(key, metaData, rec, rowIndex, colIndex, store) {
-   var me = this;
-   var rows = me.rows;
-   var rowdef = rows[key] || {};
-
-   metaData.tdAttr = "valign=middle";
-
-   if (rowdef.tdCls) {
-   metaData.tdCls = rowdef.tdCls;
-   if (rowdef.tdCls == 'pve-itype-icon-storage') {
-   var value = me.getObjectValue(key, '', true);
-   }
-   }
-   return rowdef.header || key;
-},
-
 initComponent : function() {
var me = this;
var i, confid;
@@ -43,7 +27,6 @@ Ext.define('PVE.lxc.RessourceView', {
memory: {
header: gettext('Memory'),
editor: caps.vms['VM.Config.Memory'] ? 'PVE.lxc.MemoryEdit' : 
undefined,
-   never_delete: true,
defaultValue: 512,
tdCls: 'pve-itype-icon-memory',
renderer: function(value) {
@@ -53,7 +36,6 @@ Ext.define('PVE.lxc.RessourceView', {
swap: {
header: gettext('Swap'),
editor: caps.vms['VM.Config.Memory'] ? 'PVE.lxc.MemoryEdit' : 
undefined,
-   never_delete: true,
defaultValue: 512,
tdCls: 'pve-itype-icon-swap',
renderer: function(value) {
@@ -62,7 +44,6 @@ Ext.define('PVE.lxc.RessourceView', {
},
cores: {
header: gettext('Cores'),
-   never_delete: true,
editor: caps.vms['VM.Config.CPU'] ? 'PVE.lxc.CPUEdit' : 
undefined,
defaultValue: '',
tdCls: 'pve-itype-icon-processor',
@@ -73,7 +54,6 @@ Ext.define('PVE.lxc.RessourceView', {
},
cpulimit: {
header: gettext('CPU limit'),
-   never_delete: true,
editor: caps.vms['VM.Config.CPU'] ? 'PVE.lxc.CPUEdit' : 
undefined,
defaultValue: 0,
tdCls: 'pve-itype-icon-processor',
@@ -84,7 +64,6 @@ Ext.define('PVE.lxc.RessourceView', {
},
cpuunits: {
header: gettext('CPU units'),
-   never_delete: true,
editor: caps.vms['VM.Config.CPU'] ? 'PVE.lxc.CPUEdit' : 
undefined,
defaultValue: 1024,
tdCls: 'pve-itype-icon-processor'
@@ -120,40 +99,12 @@ Ext.define('PVE.lxc.RessourceView', {
};
}
 
-   var reload = function() {
-   me.rstore.load();
-   };
-
var baseurl = 'nodes/' + nodename + '/lxc/' + vmid + '/config';
 
-   var sm = Ext.create('Ext.selection.RowModel', {});
-
-   var run_editor = function() {
-   var rec = sm.getSelection()[0];
-   if (!rec) {
-   return;
-   }
-
-   var rowdef = rows[rec.data.key];
-   if (!rowdef.editor) {
-   return;
-   }
-
-   var editor = rowdef.editor;
-
-   var win = Ext.create(editor, {
-   pveSelNode: me.pveSelNode,
-   confid: rec.data.key,
-   unprivileged: me.getObjectValue('unprivileged'),
-   url: '/api2/extjs/' + baseurl
-   });
-
-   win.show();
-   win.on('destroy', reload);
-   };
+   me.selModel = Ext.create('Ext.selection.RowModel', {});
 
var run_resize = function() {
-   var rec = sm.getSelection()[0];
+   var rec = me.selModel.getSelection()[0];
if (!rec) {
return;
}
@@ -165,8 +116,6 @@ Ext.define('PVE.lxc.RessourceView', {
});
 
win.show();
-
-   win.on('destroy', reload);
};
 
var run_remove = function(b, e, rec) {
@@ -177,9 +126,6 @@ Ext.define('PVE.lxc.RessourceView', {
params: {
'delete': rec.data.key
},
-   callback: function() {
-   reload();
-   },
failure: function (response, opts) {
Ext.Msg.alert('Error', response.htmlStatus);
}
@@ -188,7 +134,7 @@ Ext.define('PVE.lxc.RessourceView', {
 
var edit_btn = new PVE.button.Button({
text: gettext('Edit'),
-   selModel: sm,
+   selModel: me.selModel,
disabled: true,
enableFn: function(rec) {
if (!rec) {
@@ -197,19 +143,19 @@ Ext.define('PVE.lxc.RessourceView', {
var rowdef = rows[rec.data.key];
return 

[pve-devel] [RFC manager 19/28] use TimezoneStore from widget toolkit

2017-12-11 Thread Thomas Lamprecht
Signed-off-by: Thomas Lamprecht 
---
 www/manager6/Makefile  |   1 -
 www/manager6/data/TimezoneStore.js | 418 -
 www/manager6/node/TimeEdit.js  |   2 +-
 3 files changed, 1 insertion(+), 420 deletions(-)
 delete mode 100644 www/manager6/data/TimezoneStore.js

diff --git a/www/manager6/Makefile b/www/manager6/Makefile
index d1e488a7..0ac5e372 100644
--- a/www/manager6/Makefile
+++ b/www/manager6/Makefile
@@ -16,7 +16,6 @@ JSSRC=
\
lxc/CmdMenu.js  \
node/CmdMenu.js \
VNCConsole.js   \
-   data/TimezoneStore.js   \
data/reader/JsonObject.js   \
data/PVEProxy.js\
data/UpdateQueue.js \
diff --git a/www/manager6/data/TimezoneStore.js 
b/www/manager6/data/TimezoneStore.js
deleted file mode 100644
index 79be8b7e..
--- a/www/manager6/data/TimezoneStore.js
+++ /dev/null
@@ -1,418 +0,0 @@
-Ext.define('Timezone', {
-extend: 'Ext.data.Model',
-fields: ['zone']
-});
-
-Ext.define('PVE.data.TimezoneStore', {
-extend: 'Ext.data.Store',
-model: 'Timezone',
-data: [
-   ['Africa/Abidjan'],
-   ['Africa/Accra'],
-   ['Africa/Addis_Ababa'],
-   ['Africa/Algiers'],
-   ['Africa/Asmara'],
-   ['Africa/Bamako'],
-   ['Africa/Bangui'],
-   ['Africa/Banjul'],
-   ['Africa/Bissau'],
-   ['Africa/Blantyre'],
-   ['Africa/Brazzaville'],
-   ['Africa/Bujumbura'],
-   ['Africa/Cairo'],
-   ['Africa/Casablanca'],
-   ['Africa/Ceuta'],
-   ['Africa/Conakry'],
-   ['Africa/Dakar'],
-   ['Africa/Dar_es_Salaam'],
-   ['Africa/Djibouti'],
-   ['Africa/Douala'],
-   ['Africa/El_Aaiun'],
-   ['Africa/Freetown'],
-   ['Africa/Gaborone'],
-   ['Africa/Harare'],
-   ['Africa/Johannesburg'],
-   ['Africa/Kampala'],
-   ['Africa/Khartoum'],
-   ['Africa/Kigali'],
-   ['Africa/Kinshasa'],
-   ['Africa/Lagos'],
-   ['Africa/Libreville'],
-   ['Africa/Lome'],
-   ['Africa/Luanda'],
-   ['Africa/Lubumbashi'],
-   ['Africa/Lusaka'],
-   ['Africa/Malabo'],
-   ['Africa/Maputo'],
-   ['Africa/Maseru'],
-   ['Africa/Mbabane'],
-   ['Africa/Mogadishu'],
-   ['Africa/Monrovia'],
-   ['Africa/Nairobi'],
-   ['Africa/Ndjamena'],
-   ['Africa/Niamey'],
-   ['Africa/Nouakchott'],
-   ['Africa/Ouagadougou'],
-   ['Africa/Porto-Novo'],
-   ['Africa/Sao_Tome'],
-   ['Africa/Tripoli'],
-   ['Africa/Tunis'],
-   ['Africa/Windhoek'],
-   ['America/Adak'],
-   ['America/Anchorage'],
-   ['America/Anguilla'],
-   ['America/Antigua'],
-   ['America/Araguaina'],
-   ['America/Argentina/Buenos_Aires'],
-   ['America/Argentina/Catamarca'],
-   ['America/Argentina/Cordoba'],
-   ['America/Argentina/Jujuy'],
-   ['America/Argentina/La_Rioja'],
-   ['America/Argentina/Mendoza'],
-   ['America/Argentina/Rio_Gallegos'],
-   ['America/Argentina/Salta'],
-   ['America/Argentina/San_Juan'],
-   ['America/Argentina/San_Luis'],
-   ['America/Argentina/Tucuman'],
-   ['America/Argentina/Ushuaia'],
-   ['America/Aruba'],
-   ['America/Asuncion'],
-   ['America/Atikokan'],
-   ['America/Bahia'],
-   ['America/Bahia_Banderas'],
-   ['America/Barbados'],
-   ['America/Belem'],
-   ['America/Belize'],
-   ['America/Blanc-Sablon'],
-   ['America/Boa_Vista'],
-   ['America/Bogota'],
-   ['America/Boise'],
-   ['America/Cambridge_Bay'],
-   ['America/Campo_Grande'],
-   ['America/Cancun'],
-   ['America/Caracas'],
-   ['America/Cayenne'],
-   ['America/Cayman'],
-   ['America/Chicago'],
-   ['America/Chihuahua'],
-   ['America/Costa_Rica'],
-   ['America/Cuiaba'],
-   ['America/Curacao'],
-   ['America/Danmarkshavn'],
-   ['America/Dawson'],
-   ['America/Dawson_Creek'],
-   ['America/Denver'],
-   ['America/Detroit'],
-   ['America/Dominica'],
-   ['America/Edmonton'],
-   ['America/Eirunepe'],
-   ['America/El_Salvador'],
-   ['America/Fortaleza'],
-   ['America/Glace_Bay'],
-   ['America/Godthab'],
-   ['America/Goose_Bay'],
-   ['America/Grand_Turk'],
-  

[pve-devel] [RFC manager 06/28] use KVCombobox from widget toolkit

2017-12-11 Thread Thomas Lamprecht
Signed-off-by: Thomas Lamprecht 
---
 www/manager6/Makefile  |  1 -
 www/manager6/dc/AuthEdit.js|  2 +-
 www/manager6/dc/Backup.js  |  4 +-
 www/manager6/dc/OptionView.js  |  2 +-
 www/manager6/form/BackupModeSelector.js|  2 +-
 www/manager6/form/Boolean.js   |  2 +-
 www/manager6/form/BusTypeSelector.js   |  2 +-
 www/manager6/form/CPUModelSelector.js  |  2 +-
 www/manager6/form/CacheTypeSelector.js |  2 +-
 www/manager6/form/CompressionSelector.js   |  2 +-
 www/manager6/form/ContentTypeSelector.js   |  2 +-
 www/manager6/form/DayOfWeekSelector.js |  2 +-
 www/manager6/form/DiskFormatSelector.js|  2 +-
 www/manager6/form/DisplaySelector.js   |  2 +-
 www/manager6/form/EmailNotificationSelector.js |  2 +-
 www/manager6/form/FirewallPolicySelector.js|  2 +-
 www/manager6/form/KVComboBox.js| 72 --
 www/manager6/form/NetworkCardSelector.js   |  2 +-
 www/manager6/form/QemuBiosSelector.js  |  2 +-
 www/manager6/form/ScsiHwSelector.js|  2 +-
 www/manager6/form/VNCKeyboardSelector.js   |  2 +-
 www/manager6/form/iScsiProviderSelector.js |  2 +-
 www/manager6/grid/FirewallOptions.js   |  2 +-
 www/manager6/grid/FirewallRules.js |  4 +-
 www/manager6/ha/ResourceEdit.js|  2 +-
 www/manager6/lxc/MPEdit.js |  6 +--
 www/manager6/lxc/Options.js|  2 +-
 www/manager6/qemu/BootOrderEdit.js |  6 +--
 www/manager6/qemu/Clone.js |  2 +-
 www/manager6/qemu/HDEdit.js|  2 +-
 30 files changed, 34 insertions(+), 107 deletions(-)
 delete mode 100644 www/manager6/form/KVComboBox.js

diff --git a/www/manager6/Makefile b/www/manager6/Makefile
index df7329e0..c1c6f869 100644
--- a/www/manager6/Makefile
+++ b/www/manager6/Makefile
@@ -30,7 +30,6 @@ JSSRC=
\
form/TextField.js   \
form/IntegerField.js\
form/ComboGrid.js   \
-   form/KVComboBox.js  \
form/Boolean.js \
form/CompressionSelector.js \
form/PoolSelector.js\
diff --git a/www/manager6/dc/AuthEdit.js b/www/manager6/dc/AuthEdit.js
index 9c2ee9bd..86d04b7c 100644
--- a/www/manager6/dc/AuthEdit.js
+++ b/www/manager6/dc/AuthEdit.js
@@ -126,7 +126,7 @@ Ext.define('PVE.dc.AuthEdit', {
// Two Factor Auth settings
 
 column2.push({
-xtype: 'pveKVComboBox',
+xtype: 'proxmoxKVComboBox',
 name: 'tfa',
deleteEmpty: !me.isCreate,
value: '',
diff --git a/www/manager6/dc/Backup.js b/www/manager6/dc/Backup.js
index 27ca2f20..539aad31 100644
--- a/www/manager6/dc/Backup.js
+++ b/www/manager6/dc/Backup.js
@@ -26,8 +26,8 @@ Ext.define('PVE.dc.BackupEdit', {
 
/*jslint confusion: true*/
// 'value' can be assigned a string or an array
-   var selModeField =  Ext.create('PVE.form.KVComboBox', {
-   xtype: 'pveKVComboBox',
+   var selModeField =  Ext.create('Proxmox.form.KVComboBox', {
+   xtype: 'proxmoxKVComboBox',
comboItems: [
['include', gettext('Include selected VMs')],
['all', gettext('All')],
diff --git a/www/manager6/dc/OptionView.js b/www/manager6/dc/OptionView.js
index a24b542f..58d6b61d 100644
--- a/www/manager6/dc/OptionView.js
+++ b/www/manager6/dc/OptionView.js
@@ -60,7 +60,7 @@ Ext.define('PVE.dc.ConsoleViewerEdit', {
Ext.applyIf(me, {
subject: gettext('Console Viewer'),
items: {
-   xtype: 'pveKVComboBox',
+   xtype: 'proxmoxKVComboBox',
name: 'console',
value: '__default__',
fieldLabel: gettext('Console Viewer'),
diff --git a/www/manager6/form/BackupModeSelector.js 
b/www/manager6/form/BackupModeSelector.js
index c97b691d..ca57dda9 100644
--- a/www/manager6/form/BackupModeSelector.js
+++ b/www/manager6/form/BackupModeSelector.js
@@ -1,5 +1,5 @@
 Ext.define('PVE.form.BackupModeSelector', {
-extend: 'PVE.form.KVComboBox',
+extend: 'Proxmox.form.KVComboBox',
 alias: ['widget.pveBackupModeSelector'],
 comboItems: [
 ['snapshot', gettext('Snapshot')],
diff --git a/www/manager6/form/Boolean.js b/www/manager6/form/Boolean.js
index 37f794bf..5ae73fe7 100644
--- a/www/manager6/form/Boolean.js
+++ b/www/manager6/form/Boolean.js
@@ -1,6 +1,6 @@
 // boolean type including 'Default' (delete property from file)
 Ext.define('PVE.form.Boolean', {
-extend: 'PVE.form.KVComboBox',
+extend: 'Proxmox.form.KVComboBox',
 

[pve-devel] [RFC manager 21/28] use JsonObject reader from widget toolkit

2017-12-11 Thread Thomas Lamprecht
Alias stayed the same and we had only a single direct user
(ObjectStore) which uses said alias to refer to this reader.

Also ObjectStore itself will get replaced by the proxmox widget
toolkit version in the next patch anyway.

Signed-off-by: Thomas Lamprecht 
---
 www/manager6/Makefile  |   1 -
 www/manager6/data/reader/JsonObject.js | 127 -
 2 files changed, 128 deletions(-)
 delete mode 100644 www/manager6/data/reader/JsonObject.js

diff --git a/www/manager6/Makefile b/www/manager6/Makefile
index 0ac5e372..56183720 100644
--- a/www/manager6/Makefile
+++ b/www/manager6/Makefile
@@ -16,7 +16,6 @@ JSSRC=
\
lxc/CmdMenu.js  \
node/CmdMenu.js \
VNCConsole.js   \
-   data/reader/JsonObject.js   \
data/PVEProxy.js\
data/UpdateQueue.js \
data/UpdateStore.js \
diff --git a/www/manager6/data/reader/JsonObject.js 
b/www/manager6/data/reader/JsonObject.js
deleted file mode 100644
index 0aa0952f..
--- a/www/manager6/data/reader/JsonObject.js
+++ /dev/null
@@ -1,127 +0,0 @@
-/* A reader to store a single JSON Object (hash) into a storage.
- * Also accepts an array containing a single hash. 
- *
- * So it can read:
- *
- * example1: {data1: "xyz", data2: "abc"} 
- * returns [{key: "data1", value: "xyz"}, {key: "data2", value: "abc"}]
- *
- * example2: [ {data1: "xyz", data2: "abc"} ] 
- * returns [{key: "data1", value: "xyz"}, {key: "data2", value: "abc"}]
- *
- * If you set 'readArray', the reader expexts the object as array:
- *
- * example3: [ { key: "data1", value: "xyz", p2: "cde" },  { key: "data2", 
value: "abc", p2: "efg" }]
- * returns [{key: "data1", value: "xyz", p2: "cde}, {key: "data2", value: 
"abc", p2: "efg"}]
- *
- * Note: The records can contain additional properties (like 'p2' above) when 
you use 'readArray'
- *
- * Additional feature: specify allowed properties with default values with 
'rows' object
- *
- * var rows = {
- *   memory: {
- * required: true,
- * defaultValue: 512
- *   }
- * }
- *
- */
-
-Ext.define('PVE.data.reader.JsonObject', {
-extend: 'Ext.data.reader.Json',
-alias : 'reader.jsonobject',
-
-readArray: false,
-
-rows: undefined,
-
-constructor: function(config) {
-var me = this;
-
-Ext.apply(me, config || {});
-
-   me.callParent([config]);
-},
-
-getResponseData: function(response) {
-   var me = this;
-
-   var data = [];
-try {
-var result = Ext.decode(response.responseText);
-// get our data items inside the server response
-var root = result[me.getRootProperty()];
-
-   if (me.readArray) {
-
-   var rec_hash = {};
-   Ext.Array.each(root, function(rec) {
-   if (Ext.isDefined(rec.key)) {
-   rec_hash[rec.key] = rec;
-   }
-   });
-
-   if (me.rows) {
-   Ext.Object.each(me.rows, function(key, rowdef) {
-   var rec = rec_hash[key];
-   if (Ext.isDefined(rec)) {
-   if (!Ext.isDefined(rec.value)) {
-   rec.value = rowdef.defaultValue;
-   }
-   data.push(rec);
-   } else if (Ext.isDefined(rowdef.defaultValue)) {
-   data.push({key: key, value: rowdef.defaultValue} );
-   } else if (rowdef.required) {
-   data.push({key: key, value: undefined });
-   }
-   });
-   } else {
-   Ext.Array.each(root, function(rec) {
-   if (Ext.isDefined(rec.key)) {
-   data.push(rec);
-   }
-   });
-   }
-   
-   } else { 
-   
-   var org_root = root;
-
-   if (Ext.isArray(org_root)) {
-   if (root.length == 1) {
-   root = org_root[0];
-   } else {
-   root = {};
-   }
-   }
-
-   if (me.rows) {
-   Ext.Object.each(me.rows, function(key, rowdef) {
-   if (Ext.isDefined(root[key])) {
-   data.push({key: key, value: root[key]});
-   } else if (Ext.isDefined(rowdef.defaultValue)) {
-   data.push({key: key, value: rowdef.defaultValue});
-   } else if (rowdef.required) {
-   data.push({key: key, value: 

[pve-devel] [RFC manager 17/28] use HelpButton from widget toolkit

2017-12-11 Thread Thomas Lamprecht
Proxmox.button.Help renamed the css class for the button styling, as
this class is only used rarely and the widget toolkit does not
provides a (shared) css file itself, just rename it here too.

Signed-off-by: Thomas Lamprecht 
---
 www/css/ext6-pve.css  |  2 +-
 www/manager6/Makefile |  1 -
 www/manager6/Workspace.js |  2 +-
 www/manager6/button/HelpButton.js | 78 ---
 www/manager6/panel/ConfigPanel.js |  2 +-
 www/manager6/qemu/Clone.js|  2 +-
 www/manager6/window/Backup.js |  2 +-
 www/manager6/window/Migrate.js|  6 +--
 www/manager6/window/Settings.js   |  4 +-
 www/manager6/window/Wizard.js |  2 +-
 10 files changed, 11 insertions(+), 90 deletions(-)
 delete mode 100644 www/manager6/button/HelpButton.js

diff --git a/www/css/ext6-pve.css b/www/css/ext6-pve.css
index 4d0faf3a..3d8d33b2 100644
--- a/www/css/ext6-pve.css
+++ b/www/css/ext6-pve.css
@@ -366,7 +366,7 @@
 top: 2px;
 }
 
-.pve-inline-button .x-btn-inner {
+.proxmox-inline-button .x-btn-inner {
 color: black;
 }
 
diff --git a/www/manager6/Makefile b/www/manager6/Makefile
index 23a9f79f..e987ec44 100644
--- a/www/manager6/Makefile
+++ b/www/manager6/Makefile
@@ -9,7 +9,6 @@ JSSRC=  \
menu/MenuItem.js\
button/ConsoleButton.js \
button/Split.js \
-   button/HelpButton.js\
controller/StorageEdit.js   \
qemu/SendKeyMenu.js \
qemu/CmdMenu.js \
diff --git a/www/manager6/Workspace.js b/www/manager6/Workspace.js
index fa27fae9..2046cc66 100644
--- a/www/manager6/Workspace.js
+++ b/www/manager6/Workspace.js
@@ -323,7 +323,7 @@ Ext.define('PVE.StdWorkspace', {
}
},
{
-   xtype: 'pveHelpButton',
+   xtype: 'proxmoxHelpButton',
hidden: false,
baseCls: 'x-btn',
iconCls: 'fa fa-book 
x-btn-icon-el-default-toolbar-small ',
diff --git a/www/manager6/button/HelpButton.js 
b/www/manager6/button/HelpButton.js
deleted file mode 100644
index 048a7d39..
--- a/www/manager6/button/HelpButton.js
+++ /dev/null
@@ -1,78 +0,0 @@
-/* help button pointing to an online documentation
-   for components contained in a modal window
-*/
-/*global
-  pveOnlineHelpInfo
-*/
-Ext.define('PVE.button.Help', {
-extend: 'Ext.button.Button',
-alias: 'widget.pveHelpButton',
-text: gettext('Help'),
-// make help button less flashy by styling it like toolbar buttons
-iconCls: ' x-btn-icon-el-default-toolbar-small fa fa-question-circle',
-cls: 'x-btn-default-toolbar-small pve-inline-button',
-hidden: true,
-listenToGlobalEvent: true,
-controller: {
-   xclass: 'Ext.app.ViewController',
-   listen: {
-   global: {
-   pveShowHelp: 'onPveShowHelp',
-   pveHideHelp: 'onPveHideHelp'
-   }
-   },
-   onPveShowHelp: function(helpLink) {
-   var me = this.getView();
-   if (me.listenToGlobalEvent === true) {
-   me.setOnlineHelp(helpLink);
-   me.show();
-   }
-   },
-   onPveHideHelp: function() {
-   var me = this.getView();
-   if (me.listenToGlobalEvent === true) {
-   me.hide();
-   }
-   }
-},
-
-// this sets the link and
-// sets the tooltip text
-setOnlineHelp:function(blockid) {
-   var me = this;
-
-   var info = pveOnlineHelpInfo[blockid];
-   if (info) {
-   me.onlineHelp = blockid;
-   var title = info.title;
-   if (info.subtitle) {
-   title += ' - ' + info.subtitle;
-   }
-   me.setTooltip(title);
-   }
-},
-
-// helper to set the onlineHelp via a config object
-setHelpConfig: function(config) {
-   var me = this;
-   me.setOnlineHelp(config.onlineHelp);
-},
-
-handler: function() {
-   var me = this;
-   var docsURI;
-
-   if (me.onlineHelp) {
-   var info = pveOnlineHelpInfo[me.onlineHelp];
-   if (info) {
-   docsURI = window.location.origin + info.link;
-   }
-   }
-
-   if (docsURI) {
-   window.open(docsURI);
-   } else {
-   Ext.Msg.alert(gettext('Help'), gettext('No Help available'));
-   }
-}
-});
diff --git a/www/manager6/panel/ConfigPanel.js 
b/www/manager6/panel/ConfigPanel.js
index c659af21..e3c71eef 100644
--- a/www/manager6/panel/ConfigPanel.js
+++ b/www/manager6/panel/ConfigPanel.js
@@ -190,7 +190,7 @@ Ext.define('PVE.panel.Config', {
baseCls: 

[pve-devel] [RFC manager 24/28] use GaugeWidget from widget toolkit

2017-12-11 Thread Thomas Lamprecht
Signed-off-by: Thomas Lamprecht 
---
 www/manager6/Makefile |  1 -
 www/manager6/ceph/Status.js   |  2 +-
 www/manager6/dc/Summary.js|  2 +-
 www/manager6/panel/GaugeWidget.js | 96 ---
 4 files changed, 2 insertions(+), 99 deletions(-)
 delete mode 100644 www/manager6/panel/GaugeWidget.js

diff --git a/www/manager6/Makefile b/www/manager6/Makefile
index e8dbdf86..ca204c9e 100644
--- a/www/manager6/Makefile
+++ b/www/manager6/Makefile
@@ -77,7 +77,6 @@ JSSRC=
\
panel/InfoWidget.js \
panel/TemplateStatusView.js \
panel/InputPanel.js \
-   panel/GaugeWidget.js\
panel/HealthWidget.js   \
window/LoginWindow.js   \
window/Wizard.js\
diff --git a/www/manager6/ceph/Status.js b/www/manager6/ceph/Status.js
index d83b1cdb..72b3fb49 100644
--- a/www/manager6/ceph/Status.js
+++ b/www/manager6/ceph/Status.js
@@ -121,7 +121,7 @@ Ext.define('PVE.node.CephStatus', {
items: [
{
flex: 1,
-   xtype: 'pveGauge',
+   xtype: 'proxmoxGauge',
itemId: 'space',
title: gettext('Usage')
},
diff --git a/www/manager6/dc/Summary.js b/www/manager6/dc/Summary.js
index 310bd267..a1d71fca 100644
--- a/www/manager6/dc/Summary.js
+++ b/www/manager6/dc/Summary.js
@@ -29,7 +29,7 @@ Ext.define('PVE.dc.Summary', {
bodyPadding: '0 0 10 0',
layout: 'hbox',
defaults: {
-   xtype: 'pveGauge',
+   xtype: 'proxmoxGauge',
flex: 1
},
items:[
diff --git a/www/manager6/panel/GaugeWidget.js 
b/www/manager6/panel/GaugeWidget.js
deleted file mode 100644
index 0d809720..
--- a/www/manager6/panel/GaugeWidget.js
+++ /dev/null
@@ -1,96 +0,0 @@
-Ext.define('PVE.panel.GaugeWidget', {
-extend: 'Ext.panel.Panel',
-alias: 'widget.pveGauge',
-
-defaults: {
-   style: {
-   'text-align':'center'
-   }
-},
-items: [
-   {
-   xtype: 'box',
-   itemId: 'title',
-   data: {
-   title: ''
-   },
-   tpl: '{title}'
-   },
-   {
-   xtype: 'polar',
-   height: 120,
-   border: false,
-   itemId: 'chart',
-   series: [{
-   type: 'gauge',
-   value: 0,
-   colors: ['#f5f5f5'],
-   sectors: [0],
-   donut: 90,
-   needleLength: 100,
-   totalAngle: Math.PI
-   }],
-   sprites: [{
-   id: 'valueSprite',
-   type: 'text',
-   text: '',
-   textAlign: 'center',
-   textBaseline: 'bottom',
-   x: 125,
-   y: 110,
-   fontSize: 30
-   }]
-   },
-   {
-   xtype: 'box',
-   itemId: 'text'
-   }
-],
-
-header: false,
-border: false,
-
-warningThreshold: 0.6,
-criticalThreshold: 0.9,
-warningColor: '#fc0',
-criticalColor: '#FF6C59',
-defaultColor: '#c2ddf2',
-backgroundColor: '#f5f5f5',
-
-initialValue: 0,
-
-
-updateValue: function(value, text) {
-   var me = this;
-   var color = me.defaultColor;
-
-   if (value >= me.criticalThreshold) {
-   color = me.criticalColor;
-   } else if (value >= me.warningThreshold) {
-   color = me.warningColor;
-   }
-
-   me.chart.series[0].setColors([color, me.backgroundColor]);
-   me.chart.series[0].setValue(value*100);
-
-   me.valueSprite.setText(' '+(value*100).toFixed(0) + '%');
-   me.valueSprite.setAttributes({x: me.chart.getWidth()/2, 
y:me.chart.getHeight()-20}, true);
-
-   if (text !== undefined) {
-   me.text.setHtml(text);
-   }
-},
-
-initComponent: function() {
-   var me = this;
-
-   me.callParent();
-
-   if (me.title) {
-   me.getComponent('title').update({title: me.title});
-   }
-   me.text = me.getComponent('text');
-   me.chart = me.getComponent('chart');
-   me.valueSprite = me.chart.getSurface('chart').get('valueSprite');
-}
-});
-- 
2.11.0


___
pve-devel mailing list
pve-devel@pve.proxmox.com
https://pve.proxmox.com/cgi-bin/mailman/listinfo/pve-devel


[pve-devel] [RFC manager 08/28] dc/OptionView: cleanup & use new features from ObjectGrid

2017-12-11 Thread Thomas Lamprecht
Signed-off-by: Thomas Lamprecht 
---
 www/manager6/Toolkit.js   |   6 +
 www/manager6/Utils.js |   6 +
 www/manager6/dc/OptionView.js | 255 --
 3 files changed, 56 insertions(+), 211 deletions(-)

diff --git a/www/manager6/Toolkit.js b/www/manager6/Toolkit.js
index 56b06686..5ab03e29 100644
--- a/www/manager6/Toolkit.js
+++ b/www/manager6/Toolkit.js
@@ -55,6 +55,12 @@ Ext.apply(Ext.form.field.VTypes, {
 MacAddressMask: /[a-fA-F0-9:]/,
 MacAddressText: gettext('Example') + ': 01:23:45:67:89:ab',
 
+MacPrefix:  function(v) {
+   return (/^[a-f0-9]{2}(?::[a-f0-9]{2}){0,2}:?$/i).test(v);
+},
+MacPrefixMask: /[a-fA-F0-9:]/,
+MacPrefixText: gettext('Example') + ': 02:8f',
+
 BridgeName: function(v) {
 return (/^vmbr\d{1,4}$/).test(v);
 },
diff --git a/www/manager6/Utils.js b/www/manager6/Utils.js
index 94bae5b2..9076046b 100644
--- a/www/manager6/Utils.js
+++ b/www/manager6/Utils.js
@@ -315,6 +315,12 @@ Ext.define('PVE.Utils', { utilities: {
}
 },
 
+console_viewer_array: function() {
+   return Ext.Array.map(['__default__','vv', 'html5'], function(v) {
+   return [v, PVE.Utils.render_console_viewer(v)];
+   });
+},
+
 render_kvm_vga_driver: function (value) {
if (!value) {
return PVE.Utils.defaultText;
diff --git a/www/manager6/dc/OptionView.js b/www/manager6/dc/OptionView.js
index 988ff530..1b13572a 100644
--- a/www/manager6/dc/OptionView.js
+++ b/www/manager6/dc/OptionView.js
@@ -1,231 +1,64 @@
-Ext.define('PVE.dc.HttpProxyEdit', {
-extend: 'PVE.window.Edit',
-
-initComponent : function() {
-   var me = this;
-
-   Ext.applyIf(me, {
-   subject: gettext('HTTP proxy'),
-   items: {
-   xtype: 'pvetextfield',
-   name: 'http_proxy',
-   vtype: 'HttpProxy',
-   emptyText: PVE.Utils.noneText,
-   deleteEmpty: true,
-   value: '',
-   fieldLabel: gettext('HTTP proxy')
-   }
-   });
-
-   me.callParent();
-
-   me.load();
-}
-});
-
-Ext.define('PVE.dc.KeyboardEdit', {
-extend: 'PVE.window.Edit',
-
-initComponent : function() {
-   var me = this;
-
-   Ext.applyIf(me, {
-   subject: gettext('Keyboard Layout'),
-   items: {
-   xtype: 'VNCKeyboardSelector',
-   name: 'keyboard',
-   value: '__default__',
-   fieldLabel: gettext('Keyboard Layout')
-   }
-   });
-
-   me.callParent();
-
-   me.load();
-}
-});
-
-Ext.define('PVE.dc.ConsoleViewerEdit', {
-extend: 'PVE.window.Edit',
-
-initComponent : function() {
-   var me = this;
-
-   var data = [];
-
-   Ext.Array.each(['__default__','vv', 'html5'], function(value) {
-   data.push([value, PVE.Utils.render_console_viewer(value)]);
-   });
-
-   Ext.applyIf(me, {
-   subject: gettext('Console Viewer'),
-   items: {
-   xtype: 'proxmoxKVComboBox',
-   name: 'console',
-   value: '__default__',
-   fieldLabel: gettext('Console Viewer'),
-   comboItems: data
-   }
-   });
-
-   me.callParent();
-
-   me.load();
-}
-});
-
-Ext.define('PVE.dc.EmailFromEdit', {
-extend: 'PVE.window.Edit',
-
-initComponent : function() {
-   var me = this;
-
-   Ext.applyIf(me, {
-   subject: gettext('Email from address'),
-   items: {
-   xtype: 'pvetextfield',
-   name: 'email_from',
-   vtype: 'pveMail',
-   emptyText: 'root@$hostname',
-   deleteEmpty: true,
-   value: '',
-   fieldLabel: gettext('Email from address')
-   }
-   });
-
-   me.callParent();
-
-   me.load();
-}
-});
-
-Ext.define('PVE.dc.MacPrefixEdit', {
-extend: 'PVE.window.Edit',
-
-initComponent : function() {
-   var me = this;
-
-   Ext.applyIf(me, {
-   subject: gettext('MAC address prefix'),
-   items: {
-   xtype: 'pvetextfield',
-   name: 'mac_prefix',
-   regex: /^[a-f0-9]{2}(?::[a-f0-9]{2}){0,2}:?$/i,
-   regexText: gettext('Example') + ': 02:8f',
-   emptyText: PVE.Utils.noneText,
-   deleteEmpty: true,
-   value: '',
-   fieldLabel: gettext('MAC address prefix')
-   }
-   });
-
-   me.callParent();
-
-   me.load();
-}
-});
-
 Ext.define('PVE.dc.OptionView', {
 extend: 'Proxmox.grid.ObjectGrid',
 alias: ['widget.pveDcOptionView'],
 
 onlineHelp: 'datacenter_configuration_file',
 
+monStoreErrors: true,
+
 initComponent : function() {
var me = this;
 
-   var reload = function() {
-   me.rstore.load();
-   };
-
-   var rows = {
- 

[pve-devel] [RFC manager 07/28] use ObjectGrid from widget toolkit

2017-12-11 Thread Thomas Lamprecht
Signed-off-by: Thomas Lamprecht 
---
 www/manager6/Makefile  |   1 -
 www/manager6/dc/OptionView.js  |   2 +-
 www/manager6/grid/FirewallOptions.js   |   2 +-
 www/manager6/grid/ObjectGrid.js| 132 -
 www/manager6/grid/PendingObjectGrid.js |   2 +-
 www/manager6/lxc/DNS.js|   2 +-
 www/manager6/lxc/Options.js|   2 +-
 www/manager6/lxc/Resources.js  |   2 +-
 www/manager6/node/DNSView.js   |   2 +-
 www/manager6/node/Subscription.js  |   2 +-
 www/manager6/node/TimeView.js  |   2 +-
 www/manager6/pool/StatusView.js|   2 +-
 www/manager6/window/TaskViewer.js  |   2 +-
 13 files changed, 11 insertions(+), 144 deletions(-)
 delete mode 100644 www/manager6/grid/ObjectGrid.js

diff --git a/www/manager6/Makefile b/www/manager6/Makefile
index c1c6f869..efc44364 100644
--- a/www/manager6/Makefile
+++ b/www/manager6/Makefile
@@ -96,7 +96,6 @@ JSSRC=
\
window/Settings.js  \
window/StartupEdit.js   \
panel/NotesView.js  \
-   grid/ObjectGrid.js  \
grid/PendingObjectGrid.js   \
grid/ResourceGrid.js\
grid/PoolMembers.js \
diff --git a/www/manager6/dc/OptionView.js b/www/manager6/dc/OptionView.js
index 58d6b61d..988ff530 100644
--- a/www/manager6/dc/OptionView.js
+++ b/www/manager6/dc/OptionView.js
@@ -126,7 +126,7 @@ Ext.define('PVE.dc.MacPrefixEdit', {
 });
 
 Ext.define('PVE.dc.OptionView', {
-extend: 'PVE.grid.ObjectGrid',
+extend: 'Proxmox.grid.ObjectGrid',
 alias: ['widget.pveDcOptionView'],
 
 onlineHelp: 'datacenter_configuration_file',
diff --git a/www/manager6/grid/FirewallOptions.js 
b/www/manager6/grid/FirewallOptions.js
index f37af204..c0966a96 100644
--- a/www/manager6/grid/FirewallOptions.js
+++ b/www/manager6/grid/FirewallOptions.js
@@ -1,5 +1,5 @@
 Ext.define('PVE.FirewallOptions', {
-extend: 'PVE.grid.ObjectGrid',
+extend: 'Proxmox.grid.ObjectGrid',
 alias: ['widget.pveFirewallOptions'],
 
 fwtype: undefined, // 'dc', 'node' or 'vm'
diff --git a/www/manager6/grid/ObjectGrid.js b/www/manager6/grid/ObjectGrid.js
deleted file mode 100644
index f4e7e901..
--- a/www/manager6/grid/ObjectGrid.js
+++ /dev/null
@@ -1,132 +0,0 @@
-/* Renders a list of key values objets
-
-mandatory config parameters:
-rows: an object container where each propery is a key-value object we want to 
render
-   var rows = {
-   keyboard: {
-   header: gettext('Keyboard Layout'),
-   editor: 'PVE.dc.KeyboardEdit',
-   renderer: PVE.Utils.render_kvm_language,
-   required: true
-   },
-
-optional:
-disabled: setting this parameter to true will disable selection and focus on 
the
-pveObjectGrid as well as greying out input elements.
-Useful for a readonly tabular display
-
-*/
-
-Ext.define('PVE.grid.ObjectGrid', {
-extend: 'Ext.grid.GridPanel',
-alias: ['widget.pveObjectGrid'],
-disabled: false,
-hideHeaders: true,
-
-getObjectValue: function(key, defaultValue) {
-   var me = this;
-   var rec = me.store.getById(key);
-   if (rec) {
-   return rec.data.value;
-   }
-   return defaultValue;
-},
-
-renderKey: function(key, metaData, record, rowIndex, colIndex, store) {
-   var me = this;
-   var rows = me.rows;
-   var rowdef = (rows && rows[key]) ?  rows[key] : {};
-   return rowdef.header || key;
-},
-
-renderValue: function(value, metaData, record, rowIndex, colIndex, store) {
-   var me = this;
-   var rows = me.rows;
-   var key = record.data.key;
-   var rowdef = (rows && rows[key]) ?  rows[key] : {};
-
-   var renderer = rowdef.renderer;
-   if (renderer) {
-   return renderer(value, metaData, record, rowIndex, colIndex, store);
-   }
-
-   return value;
-},
-
-initComponent : function() {
-   var me = this;
-
-   var rows = me.rows;
-
-   if (!me.rstore) {
-   if (!me.url) {
-   throw "no url specified";
-   }
-
-   me.rstore = Ext.create('PVE.data.ObjectStore', {
-   url: me.url,
-   interval: me.interval,
-   extraParams: me.extraParams,
-   rows: me.rows
-   });
-   }
-
-   var rstore = me.rstore;
-
-   var store = Ext.create('PVE.data.DiffStore', { rstore: rstore,
-   sorters: [],
-   filters: []
-   });
-
-   if (rows) {
-   Ext.Object.each(rows, function(key, rowdef) {
-   if (Ext.isDefined(rowdef.defaultValue)) {
-   store.add({ key: key, value: rowdef.defaultValue });
-  

[pve-devel] [RFC manager 11/28] grid/FireWallOptions: cleanup & use new features from ObjectGrid

2017-12-11 Thread Thomas Lamprecht
switch add_boolean and add_integer row to a simple wrapper.
We really use it often and can save quite some lines with it so it
does not make sense to remove it completely yet.

Signed-off-by: Thomas Lamprecht 
---
 www/manager6/grid/FirewallOptions.js | 125 ++-
 1 file changed, 22 insertions(+), 103 deletions(-)

diff --git a/www/manager6/grid/FirewallOptions.js 
b/www/manager6/grid/FirewallOptions.js
index c0966a96..7ff98ec6 100644
--- a/www/manager6/grid/FirewallOptions.js
+++ b/www/manager6/grid/FirewallOptions.js
@@ -23,65 +23,17 @@ Ext.define('PVE.FirewallOptions', {
throw "unknown firewall option type";
}
 
-   var rows = {};
+   me.rows = {};
 
-   var add_boolean_row = function(name, text, defaultValue, labelWidth) {
-   rows[name] = {
-   header: text,
-   required: true,
-   defaultValue: defaultValue || 0,
-   renderer: PVE.Utils.format_enabled_toggle,
-   editor: {
-   xtype: 'pveWindowEdit',
-   subject: text,
-   fieldDefaults: { labelWidth: labelWidth || 100 },
-   items: {
-   xtype: 'proxmoxcheckbox',
-   defaultValue: defaultValue || 0,
-   checked: defaultValue ? true : false,
-   name: name,
-   uncheckedValue: 0,
-   fieldLabel: text
-   }
-   }
-   };
+   var add_boolean_row = function(name, text, defaultValue) {
+   me.add_boolean_row(name, text, { defaultValue: defaultValue });
};
-
-   var add_integer_row = function(name, text, labelWidth, minValue) {
-   rows[name] = {
-   header: text,
-   required: true,
-   renderer: function(value) {
-   return value || PVE.Utils.defaultText;
-   },
-   editor: {
-   xtype: 'pveWindowEdit',
-   subject: text,
-   fieldDefaults: { labelWidth: labelWidth || 100 },
-   items: {
-   xtype: 'pveIntegerField',
-   name: name,
-   minValue: minValue,
-   fieldLabel: text,
-   emptyText: gettext('Default'),
-   getSubmitData: function() {
-   var me = this;
-   var val = me.getSubmitValue();
-   if (val !== null && val !== '') {
-   var data = {};
-   data[name] = val;
-   return data;
-   } else {
-   return { 'delete' : name };
-   }
-   }
-   }
-   }
-   };
+   var add_integer_row = function(name, text, minValue) {
+   me.add_boolean_row(name, text, { minValue: minValue });
};
 
var add_log_row = function(name, labelWidth) {
-   rows[name] = {
+   me.rows[name] = {
header: name,
required: true,
defaultValue: 'nolog',
@@ -107,9 +59,9 @@ Ext.define('PVE.FirewallOptions', {
add_boolean_row('nosmurfs', gettext('SMURFS filter'), 1);
add_boolean_row('tcpflags', gettext('TCP flags filter'), 0);
add_boolean_row('ndp', 'NDP', 1);
-   add_integer_row('nf_conntrack_max', 'nf_conntrack_max', 120, 32768);
-   add_integer_row('nf_conntrack_tcp_timeout_established', 
-   'nf_conntrack_tcp_timeout_established', 250, 7875);
+   add_integer_row('nf_conntrack_max', 'nf_conntrack_max', 32768);
+   add_integer_row('nf_conntrack_tcp_timeout_established',
+   'nf_conntrack_tcp_timeout_established', 7875);
add_log_row('log_level_in');
add_log_row('log_level_out');
add_log_row('tcp_flags_log_level', 120);
@@ -125,10 +77,10 @@ Ext.define('PVE.FirewallOptions', {
add_log_row('log_level_out');
} else if (me.fwtype === 'dc') {
add_boolean_row('enable', gettext('Firewall'), 0);
-   } 
- 
+   }
+
if (me.fwtype === 'dc' || me.fwtype === 'vm') {
-   rows.policy_in = {
+   me.rows.policy_in = {
header: gettext('Input Policy'),
required: true,
defaultValue: 'DROP',
@@ -144,7 +96,7 @@ Ext.define('PVE.FirewallOptions', {
}
};
 
-   rows.policy_out = {
+   me.rows.policy_out = {
header: gettext('Output Policy'),
required: true,
defaultValue: 'ACCEPT',
@@ -161,47 +113,10 @@ Ext.define('PVE.FirewallOptions', 

[pve-devel] [RFC manager 12/28] qemu/Options: cleanup & use new features from ObjectGrid

2017-12-11 Thread Thomas Lamprecht
Ther's a little delay with the revert button on pending changes, but
that was the case previously too, so don't worry for that in this
patch

Signed-off-by: Thomas Lamprecht 
---
 www/manager6/qemu/Options.js | 51 
 1 file changed, 9 insertions(+), 42 deletions(-)

diff --git a/www/manager6/qemu/Options.js b/www/manager6/qemu/Options.js
index b8d32ec3..8af2f7e7 100644
--- a/www/manager6/qemu/Options.js
+++ b/www/manager6/qemu/Options.js
@@ -72,7 +72,7 @@ Ext.define('PVE.qemu.Options', {
header: gettext('Start/Shutdown order'),
defaultValue: '',
renderer: PVE.Utils.render_kvm_startup,
-   editor: caps.vms['VM.Config.Options'] && 
caps.nodes['Sys.Modify'] ? 
+   editor: caps.vms['VM.Config.Options'] && 
caps.nodes['Sys.Modify'] ?
{
xtype: 'pveWindowStartupEdit',
onlineHelp: 'qm_startup_and_shutdown'
@@ -301,47 +301,10 @@ Ext.define('PVE.qemu.Options', {
 
var baseurl = 'nodes/' + nodename + '/qemu/' + vmid + '/config';
 
-   var reload = function() {
-   me.rstore.load();
-   };
-
-   var run_editor = function() {
-   var sm = me.getSelectionModel();
-   var rec = sm.getSelection()[0];
-   if (!rec) {
-   return;
-   }
-
-   var rowdef = rows[rec.data.key];
-   if (!rowdef.editor) {
-   return;
-   }
-
-   var win;
-   if (Ext.isString(rowdef.editor)) {
-   win = Ext.create(rowdef.editor, {
-   pveSelNode: me.pveSelNode,
-   confid: rec.data.key,
-   url: '/api2/extjs/' + baseurl
-   });
-   } else {
-   var config = Ext.apply({
-   pveSelNode: me.pveSelNode,
-   confid: rec.data.key,
-   url: '/api2/extjs/' + baseurl
-   }, rowdef.editor);
-   win = Ext.createWidget(rowdef.editor.xtype, config);
-   win.load();
-   }
-
-   win.show();
-   win.on('destroy', reload);
-   };
-
var edit_btn = new Ext.Button({
text: gettext('Edit'),
disabled: true,
-   handler: run_editor
+   handler: me.run_editor
});
 
 var revert_btn = new PVE.button.Button({
@@ -366,7 +329,7 @@ Ext.define('PVE.qemu.Options', {
 'revert': revert
 },
 callback: function() {
-reload();
+me.reload();
 },
 failure: function (response, opts) {
 Ext.Msg.alert('Error',response.htmlStatus);
@@ -398,8 +361,11 @@ Ext.define('PVE.qemu.Options', {
cwidth1: 250,
tbar: [ edit_btn, revert_btn ],
rows: rows,
+   editorConfig: {
+   url: "/api2/extjs/" + baseurl
+   },
listeners: {
-   itemdblclick: run_editor,
+   itemdblclick: me.run_editor,
selectionchange: set_button_status
}
});
@@ -407,7 +373,8 @@ Ext.define('PVE.qemu.Options', {
me.callParent();
 
me.on('activate', me.rstore.startUpdate);
-   me.on('destroy', me.rstore.stopUpdate); 
+   me.on('destroy', me.rstore.stopUpdate);
+   me.on('deactivate', me.rstore.stopUpdate);
 
me.rstore.on('datachanged', function() {
set_button_status();
-- 
2.11.0


___
pve-devel mailing list
pve-devel@pve.proxmox.com
https://pve.proxmox.com/cgi-bin/mailman/listinfo/pve-devel


[pve-devel] [RFC manager 00/28] Integrate widget toolkit into PVE webUI

2017-12-11 Thread Thomas Lamprecht
This is my split of the widget toolkit (re)integration.

I looked at the following shared modules, compared the changes made
since the fork and switched the usage to them.

./form/LanguageSelector.js
./form/BondModeSelector.js
./form/Checkbox.js
./form/RRDTypeSelector.js
./form/KVComboBox.js
./grid/ObjectGrid.js
./grid/PendingObjectGrid.js
./window/Edit.js
./window/TaskViewer.js
./window/PasswordEdit.js
./button/HelpButton.js
./data/DiffStore.js
./data/TimezoneStore.js
./data/reader/JsonObject.js
./data/ObjectStore.js
./data/ProxmoxProxy.js
./panel/GaugeWidget.js
./panel/LogView.js
./panel/InputPanel.js


Dominiks initial patch to allow the use of the toolkit is included
here, to ease testing.
Especially the addition of ObjectGrud resulted in some bigger cleanups
in users of that module.

This series depends on the not yet applied 'HelpButton: be backward
compatible with PVE help mapping' widget toolkit patch of mine on top
of a latest commit build.

Quite some modules had none to minor changes at all, I tried to test
after each module switch - but as there are so many components not all
could be sanely tested.

cheers,
Thomas

Dominik Csapak (1):
  add proxmox-widget-toolkit to pve gui

Thomas Lamprecht (27):
  use LanguageSelector from widget toolkit
  use BondModeSelector & BondPolicySelector from widget toolkit
  use Checkbox from widget toolkit
  use RRDTypeSelector from widget toolkit
  use KVCombobox from widget toolkit
  use ObjectGrid from widget toolkit
  dc/OptionView: cleanup & use new features from ObjectGrid
  lxc/Resources: cleanup & use new features from ObjectGrid
  lxc/Options: cleanup & use a few new features from ObjectGrid
  grid/FireWallOptions: cleanup & use new features from ObjectGrid
  qemu/Options: cleanup & use new features from ObjectGrid
  use PendingObjectGrid from widget toolkit
  use windowEdit from widget toolkit
  use TaskViewer & TaskProgress window from widget toolkit
  use window.PasswordEdit from widget toolkit
  use HelpButton from widget toolkit
  use DiffStore from widget toolkit
  use TimezoneStore from widget toolkit
  TimeEdit: use schematic declaration
  use JsonObject reader from widget toolkit
  use ObjectStore from widget toolkit
  use RestProxy from widget toolkit
  use GaugeWidget from widget toolkit
  use LogView from widget toolkit
  use InputPanel from widget toolkit
  RealmComboBox: use schematic declaration and ViewController
  buildsys: we need pve-doc-generator to build package

 PVE/Service/pveproxy.pm|   3 +
 debian/control |   2 +
 www/css/ext6-pve.css   |   2 +-
 www/index.html.tpl |   8 +
 www/manager6/Makefile  |  19 +-
 www/manager6/Toolkit.js|   6 +
 www/manager6/Utils.js  |  42 +--
 www/manager6/Workspace.js  |   2 +-
 www/manager6/button/HelpButton.js  |  78 -
 www/manager6/ceph/Monitor.js   |  10 +-
 www/manager6/ceph/OSD.js   |  12 +-
 www/manager6/ceph/Pool.js  |  10 +-
 www/manager6/ceph/Status.js|   4 +-
 www/manager6/data/DiffStore.js | 114 ---
 www/manager6/data/Models.js|  31 ++
 www/manager6/data/ObjectStore.js   |  35 ---
 www/manager6/data/PVEProxy.js  | 102 --
 www/manager6/data/RRDStore.js  |   4 +-
 www/manager6/data/ResourceStore.js |   2 +-
 www/manager6/data/TimezoneStore.js | 418 -
 www/manager6/data/reader/JsonObject.js | 127 
 www/manager6/dc/ACLView.js |   8 +-
 www/manager6/dc/AuthEdit.js|  10 +-
 www/manager6/dc/Backup.js  |  12 +-
 www/manager6/dc/GroupEdit.js   |   2 +-
 www/manager6/dc/Health.js  |   2 +-
 www/manager6/dc/Log.js |   8 +-
 www/manager6/dc/OptionView.js  | 257 +++
 www/manager6/dc/PoolEdit.js|   2 +-
 www/manager6/dc/SecurityGroups.js  |   6 +-
 www/manager6/dc/StorageView.js |   2 +-
 www/manager6/dc/Summary.js |   6 +-
 www/manager6/dc/Tasks.js   |   8 +-
 www/manager6/dc/UserEdit.js|   6 +-
 www/manager6/dc/UserView.js|  55 +---
 www/manager6/form/BackupModeSelector.js|   2 +-
 www/manager6/form/BondModeSelector.js  |  42 ---
 www/manager6/form/Boolean.js   |   2 +-
 www/manager6/form/BridgeSelector.js|   2 +-
 www/manager6/form/BusTypeSelector.js   |   2 +-
 www/manager6/form/CPUModelSelector.js  |   2 +-
 www/manager6/form/CacheTypeSelector.js |   2 +-
 www/manager6/form/CephPoolSelector.js  |   2 +-
 

[pve-devel] [RFC manager 28/28] buildsys: we need pve-doc-generator to build package

2017-12-11 Thread Thomas Lamprecht
E.g., for asciidoc-pver scan-extjs to generate the OnlineHelp info map

Signed-off-by: Thomas Lamprecht 
---
 debian/control | 1 +
 1 file changed, 1 insertion(+)

diff --git a/debian/control b/debian/control
index 5952adc3..5ea61972 100644
--- a/debian/control
+++ b/debian/control
@@ -2,6 +2,7 @@ Source: pve-manager
 Section: admin
 Priority: optional
 Build-Depends: liblocale-po-perl,
+   pve-doc-generator,
 Maintainer: Proxmox Support Team 
 
 Package: pve-manager
-- 
2.11.0


___
pve-devel mailing list
pve-devel@pve.proxmox.com
https://pve.proxmox.com/cgi-bin/mailman/listinfo/pve-devel


[pve-devel] [RFC manager 27/28] RealmComboBox: use schematic declaration and ViewController

2017-12-11 Thread Thomas Lamprecht
Signed-off-by: Thomas Lamprecht 
---
 www/manager6/form/RealmComboBox.js | 53 +++---
 1 file changed, 26 insertions(+), 27 deletions(-)

diff --git a/www/manager6/form/RealmComboBox.js 
b/www/manager6/form/RealmComboBox.js
index 8d0c71a8..39c47329 100644
--- a/www/manager6/form/RealmComboBox.js
+++ b/www/manager6/form/RealmComboBox.js
@@ -1,7 +1,30 @@
+/*global Proxmox*/
 Ext.define('PVE.form.RealmComboBox', {
 extend: 'Ext.form.field.ComboBox',
 alias: ['widget.pveRealmComboBox'],
 
+controller: {
+   xclass: 'Ext.app.ViewController',
+
+   init: function(view) {
+   view.store.on('load', this.onLoad, view);
+   },
+
+   onLoad: function(store, records, success) {
+   var me = this;
+   var val = me.getValue();
+   if (!val || !me.store.findRecord('realm', val)) {
+   var def = 'pam';
+   Ext.each(records, function(rec) {
+   if (rec.data && rec.data['default']) {
+   def = rec.data.realm;
+   }
+   });
+   me.setValue(def);
+   }
+   }
+},
+
 fieldLabel: gettext('Realm'),
 name: 'realm',
 queryMode: 'local',
@@ -32,32 +55,8 @@ Ext.define('PVE.form.RealmComboBox', {
return rec && rec.data && rec.data.tfa ? rec.data.tfa : undefined;
 },
 
-initComponent: function() {
-   var me = this;
-
-   me.store = Ext.create('Ext.data.Store', {
-   model: 'pve-domains'
-   });
-
-   me.callParent();
-
-   me.store.load({
-   callback: function(r, o, success) {
-   if (success) {
-   var def = me.getValue();
-   if (!def || !me.store.findRecord('realm', def)) {
-   def = 'pam';
-   Ext.each(r, function(record) {
-   if (record.data && record.data["default"]) { 
-   def = record.data.realm;
-   }
-   });
-   }
-   if (def) {
-   me.setValue(def);
-   }
-   }
-   }
-   });
+store: {
+   model: 'pve-domains',
+   autoLoad: true
 }
 });
-- 
2.11.0


___
pve-devel mailing list
pve-devel@pve.proxmox.com
https://pve.proxmox.com/cgi-bin/mailman/listinfo/pve-devel


[pve-devel] [RFC manager 13/28] use PendingObjectGrid from widget toolkit

2017-12-11 Thread Thomas Lamprecht
Signed-off-by: Thomas Lamprecht 
---
 www/manager6/Makefile  |  1 -
 www/manager6/grid/PendingObjectGrid.js | 95 --
 www/manager6/qemu/HardwareView.js  |  2 +-
 www/manager6/qemu/Options.js   |  2 +-
 4 files changed, 2 insertions(+), 98 deletions(-)
 delete mode 100644 www/manager6/grid/PendingObjectGrid.js

diff --git a/www/manager6/Makefile b/www/manager6/Makefile
index efc44364..e8673a75 100644
--- a/www/manager6/Makefile
+++ b/www/manager6/Makefile
@@ -96,7 +96,6 @@ JSSRC=
\
window/Settings.js  \
window/StartupEdit.js   \
panel/NotesView.js  \
-   grid/PendingObjectGrid.js   \
grid/ResourceGrid.js\
grid/PoolMembers.js \
grid/FirewallRules.js   \
diff --git a/www/manager6/grid/PendingObjectGrid.js 
b/www/manager6/grid/PendingObjectGrid.js
deleted file mode 100644
index 102b9b0d..
--- a/www/manager6/grid/PendingObjectGrid.js
+++ /dev/null
@@ -1,95 +0,0 @@
-Ext.define('PVE.grid.PendingObjectGrid', {
-extend: 'Proxmox.grid.ObjectGrid',
-alias: ['widget.pvePendingObjectGrid'],
-
-getObjectValue: function(key, defaultValue, pending) {
-   var me = this;
-   var rec = me.store.getById(key);
-   if (rec) {
-   var value = (pending && Ext.isDefined(rec.data.pending) && 
(rec.data.pending !== '')) ? 
-   rec.data.pending : rec.data.value;
-
-if (Ext.isDefined(value) && (value !== '')) {
-   return value;
-} else {
-   return defaultValue;
-}
-   }
-   return defaultValue;
-},
-
-hasPendingChanges: function(key) {
-   var me = this;
-   var rows = me.rows;
-   var rowdef = (rows && rows[key]) ?  rows[key] : {};
-   var keys = rowdef.multiKey ||  [ key ];
-   var pending = false;
-
-   Ext.Array.each(keys, function(k) {
-   var rec = me.store.getById(k);
-   if (rec && rec.data && Ext.isDefined(rec.data.pending) && 
(rec.data.pending !== '')) {
-   pending = true;
-   return false; // break
-   }
-   });
-
-   return pending;
-},
-
-renderValue: function(value, metaData, record, rowIndex, colIndex, store) {
-   var me = this;
-   var rows = me.rows;
-   var key = record.data.key;
-   var rowdef = (rows && rows[key]) ?  rows[key] : {};
-   var renderer = rowdef.renderer;
-   var current = '';
-   var pendingdelete = '';
-   var pending = '';
-
-   if (renderer) {
-   current = renderer(value, metaData, record, rowIndex, colIndex, 
store, false);
-   if (me.hasPendingChanges(key)) {
-   pending = renderer(record.data.pending, metaData, record, 
rowIndex, colIndex, store, true);
-   }
-   if (pending == current) {
-   pending = undefined;
-   }
-   } else {
-   current = value || '';
-   pending = record.data.pending;
-   }
-
-   if (record.data['delete']) {
-   pendingdelete = ''+ 
current +'';
-   }
-
-   if (pending || pendingdelete) {
-   return current + '' + (pending || '') + 
pendingdelete + '';
-   } else {
-   return current;
-   }
-},
-
-initComponent : function() {
-   var me = this;
-
-   var rows = me.rows;
-
-   if (!me.rstore) {
-   if (!me.url) {
-   throw "no url specified";
-   }
-
-   me.rstore = Ext.create('PVE.data.ObjectStore', {
-   model: 'KeyValuePendingDelete',
-   readArray: true,
-   url: me.url,
-   interval: me.interval,
-   extraParams: me.extraParams,
-   rows: me.rows
-   });
-   }
-
-   me.callParent();
-   }
-});
diff --git a/www/manager6/qemu/HardwareView.js 
b/www/manager6/qemu/HardwareView.js
index 112410c2..e8d714f8 100644
--- a/www/manager6/qemu/HardwareView.js
+++ b/www/manager6/qemu/HardwareView.js
@@ -1,5 +1,5 @@
 Ext.define('PVE.qemu.HardwareView', {
-extend: 'PVE.grid.PendingObjectGrid',
+extend: 'Proxmox.grid.PendingObjectGrid',
 alias: ['widget.PVE.qemu.HardwareView'],
 
 onlineHelp: 'qm_virtual_machines_settings',
diff --git a/www/manager6/qemu/Options.js b/www/manager6/qemu/Options.js
index 8af2f7e7..b4d0442f 100644
--- a/www/manager6/qemu/Options.js
+++ b/www/manager6/qemu/Options.js
@@ -1,6 +1,6 @@
 /*jslint confusion: true */
 Ext.define('PVE.qemu.Options', {
-extend: 'PVE.grid.PendingObjectGrid',
+extend: 'Proxmox.grid.PendingObjectGrid',
 alias: ['widget.PVE.qemu.Options'],
 
 onlineHelp: 'qm_options',
-- 
2.11.0



[pve-devel] [RFC manager 16/28] use window.PasswordEdit from widget toolkit

2017-12-11 Thread Thomas Lamprecht
Signed-off-by: Thomas Lamprecht 
---
 www/manager6/dc/UserView.js | 55 +
 1 file changed, 1 insertion(+), 54 deletions(-)

diff --git a/www/manager6/dc/UserView.js b/www/manager6/dc/UserView.js
index 740465f4..1fc8a2d2 100644
--- a/www/manager6/dc/UserView.js
+++ b/www/manager6/dc/UserView.js
@@ -1,56 +1,3 @@
-Ext.define('PVE.window.PasswordEdit', {
-extend: 'Proxmox.window.Edit',
-
-initComponent : function() {
-   var me = this;
-
-   if (!me.userid) {
-   throw "no userid specified";
-   }
-
-   var verifypw;
-   var pwfield;
-
-   var validate_pw = function() {
-   if (verifypw.getValue() !== pwfield.getValue()) {
-   return gettext("Passwords does not match");
-   }
-   return true;
-   };
-
-   verifypw = Ext.createWidget('textfield', { 
-   inputType: 'password',
-   fieldLabel: gettext('Confirm password'), 
-   name: 'verifypassword',
-   submitValue: false,
-   validator: validate_pw
-   });
-
-   pwfield = Ext.createWidget('textfield', { 
-   inputType: 'password',
-   fieldLabel: gettext('Password'), 
-   minLength: 5,
-   name: 'password',
-   validator: validate_pw
-   });
-
-   Ext.apply(me, {
-   subject: gettext('Password'),
-   url: '/api2/extjs/access/password',
-   items: [
-   pwfield, verifypw,
-   {
-   xtype: 'hiddenfield',
-   name: 'userid',
-   value: me.userid
-   }
-   ]
-   });
-
-   me.callParent();
-}
-});
-
 Ext.define('PVE.dc.UserView', {
 extend: 'Ext.grid.GridPanel',
 
@@ -140,7 +87,7 @@ Ext.define('PVE.dc.UserView', {
disabled: true,
selModel: sm,
handler: function(btn, event, rec) {
-   var win = Ext.create('PVE.window.PasswordEdit',{
+   var win = Ext.create('Proxmox.window.PasswordEdit', {
 userid: rec.data.userid
});
win.on('destroy', reload);
-- 
2.11.0


___
pve-devel mailing list
pve-devel@pve.proxmox.com
https://pve.proxmox.com/cgi-bin/mailman/listinfo/pve-devel


[pve-devel] [RFC manager 20/28] TimeEdit: use schematic declaration

2017-12-11 Thread Thomas Lamprecht
Signed-off-by: Thomas Lamprecht 
---
 www/manager6/node/TimeEdit.js | 47 +--
 1 file changed, 23 insertions(+), 24 deletions(-)

diff --git a/www/manager6/node/TimeEdit.js b/www/manager6/node/TimeEdit.js
index e2d884d5..f05dc16e 100644
--- a/www/manager6/node/TimeEdit.js
+++ b/www/manager6/node/TimeEdit.js
@@ -2,6 +2,28 @@ Ext.define('PVE.node.TimeEdit', {
 extend: 'Proxmox.window.Edit',
 alias: ['widget.pveNodeTimeEdit'],
 
+subject: gettext('Time zone'),
+
+width: 400,
+
+autoLoad: true,
+
+fieldDefaults: {
+   labelWidth: 70
+},
+
+items: {
+   xtype: 'combo',
+   fieldLabel: gettext('Time zone'),
+   name: 'timezone',
+   queryMode: 'local',
+   store: Ext.create('Proxmox.data.TimezoneStore'),
+   displayField: 'zone',
+   forceSelection: true,
+   editable: false,
+   allowBlank: false
+},
+
 initComponent : function() {
var me = this;
 
@@ -9,31 +31,8 @@ Ext.define('PVE.node.TimeEdit', {
if (!nodename) {
throw "no node name specified";
}
-
-   Ext.applyIf(me, {
-   subject: gettext('Time zone'),
-   url: "/api2/extjs/nodes/" + nodename + "/time",
-   fieldDefaults: {
-   labelWidth: 70
-},
-   width: 400,
-   items: {
-   xtype: 'combo',
-   fieldLabel: gettext('Time zone'),
-   name: 'timezone',
-   queryMode: 'local',
-   store: Ext.create('Proxmox.data.TimezoneStore'),
-   valueField: 'zone',
-   displayField: 'zone',
-   triggerAction: 'all',
-   forceSelection: true,
-   editable: false,
-   allowBlank: false
-   }
-   });
+   me.url = "/api2/extjs/nodes/" + nodename + "/time";
 
me.callParent();
-
-   me.load();
 }
 });
-- 
2.11.0


___
pve-devel mailing list
pve-devel@pve.proxmox.com
https://pve.proxmox.com/cgi-bin/mailman/listinfo/pve-devel


[pve-devel] [RFC manager 02/28] use LanguageSelector from widget toolkit

2017-12-11 Thread Thomas Lamprecht
Signed-off-by: Thomas Lamprecht 
---
 www/manager6/Makefile |  1 -
 www/manager6/Utils.js | 42 ---
 www/manager6/form/LanguageSelector.js |  5 -
 www/manager6/window/LoginWindow.js|  2 +-
 4 files changed, 1 insertion(+), 49 deletions(-)
 delete mode 100644 www/manager6/form/LanguageSelector.js

diff --git a/www/manager6/Makefile b/www/manager6/Makefile
index 6f5b72ca..dc2069f8 100644
--- a/www/manager6/Makefile
+++ b/www/manager6/Makefile
@@ -59,7 +59,6 @@ JSSRC=
\
form/IPProtocolSelector.js  \
form/CPUModelSelector.js\
form/VNCKeyboardSelector.js \
-   form/LanguageSelector.js\
form/DisplaySelector.js \
form/CacheTypeSelector.js   \
form/SnapshotSelector.js\
diff --git a/www/manager6/Utils.js b/www/manager6/Utils.js
index 3efe4e71..94bae5b2 100644
--- a/www/manager6/Utils.js
+++ b/www/manager6/Utils.js
@@ -315,48 +315,6 @@ Ext.define('PVE.Utils', { utilities: {
}
 },
 
-language_map: {
-   zh_CN: 'Chinese',
-   ca: 'Catalan',
-   da: 'Danish',
-   en: 'English',
-   eu: 'Euskera (Basque)',
-   fr: 'French',
-   de: 'German',
-   it: 'Italian',
-   ja: 'Japanese',
-   nb: 'Norwegian (Bokmal)',
-   nn: 'Norwegian (Nynorsk)',
-   fa: 'Persian (Farsi)',
-   pl: 'Polish',
-   pt_BR: 'Portuguese (Brazil)',
-   ru: 'Russian',
-   sl: 'Slovenian',
-   es: 'Spanish',
-   sv: 'Swedish',
-   tr: 'Turkish'
-},
-
-render_language: function (value) {
-   if (!value) {
-   return PVE.Utils.defaultText + ' (English)';
-   }
-   var text = PVE.Utils.language_map[value];
-   if (text) {
-   return text + ' (' + value + ')';
-   }
-   return value;
-},
-
-language_array: function() {
-   var data = [['__default__', PVE.Utils.render_language('')]];
-   Ext.Object.each(PVE.Utils.language_map, function(key, value) {
-   data.push([key, PVE.Utils.render_language(value)]);
-   });
-
-   return data;
-},
-
 render_kvm_vga_driver: function (value) {
if (!value) {
return PVE.Utils.defaultText;
diff --git a/www/manager6/form/LanguageSelector.js 
b/www/manager6/form/LanguageSelector.js
deleted file mode 100644
index 5e30ee67..
--- a/www/manager6/form/LanguageSelector.js
+++ /dev/null
@@ -1,5 +0,0 @@
-Ext.define('PVE.form.LanguageSelector', {
-extend: 'PVE.form.KVComboBox',
-alias: ['widget.pveLanguageSelector'],
-comboItems: PVE.Utils.language_array()
-});
diff --git a/www/manager6/window/LoginWindow.js 
b/www/manager6/window/LoginWindow.js
index 29fd187f..4db3c8e4 100644
--- a/www/manager6/window/LoginWindow.js
+++ b/www/manager6/window/LoginWindow.js
@@ -171,7 +171,7 @@ Ext.define('PVE.window.LoginWindow', {
name: 'realm'
},
{
-   xtype: 'pveLanguageSelector',
+   xtype: 'proxmoxLanguageSelector',
fieldLabel: gettext('Language'),
value: Ext.util.Cookies.get('PVELangCookie') || 'en',
name: 'lang',
-- 
2.11.0


___
pve-devel mailing list
pve-devel@pve.proxmox.com
https://pve.proxmox.com/cgi-bin/mailman/listinfo/pve-devel


[pve-devel] [RFC manager 01/28] add proxmox-widget-toolkit to pve gui

2017-12-11 Thread Thomas Lamprecht
From: Dominik Csapak 

we will use components from proxmox-widget-toolkit rather than
directly from pve-manager

Signed-off-by: Dominik Csapak 
Signed-off-by: Thomas Lamprecht 
---
 PVE/Service/pveproxy.pm | 3 +++
 debian/control  | 1 +
 www/index.html.tpl  | 8 
 3 files changed, 12 insertions(+)

diff --git a/PVE/Service/pveproxy.pm b/PVE/Service/pveproxy.pm
index 7d39900a..e9bf00ce 100755
--- a/PVE/Service/pveproxy.pm
+++ b/PVE/Service/pveproxy.pm
@@ -111,6 +111,9 @@ sub init {
'/favicon.ico' => {
file => "$basedirs->{manager}/images/favicon.ico",
},
+   '/proxmoxlib.js' => {
+   file => 
"/usr/share/javascript/proxmox-widget-toolkit/proxmoxlib.js",
+   },
},
dirs => $dirs,
 };
diff --git a/debian/control b/debian/control
index 9e399edc..5952adc3 100644
--- a/debian/control
+++ b/debian/control
@@ -54,6 +54,7 @@ Depends: apt-transport-https,
  novnc-pve,
  perl (>= 5.10.0-19),
  postfix | mail-transport-agent,
+ proxmox-widget-toolkit (>= 1.0-8),
  pve-cluster (>= 5.0-17),
  pve-container,
  pve-docs,
diff --git a/www/index.html.tpl b/www/index.html.tpl
index 6bbdea18..c4f4602a 100644
--- a/www/index.html.tpl
+++ b/www/index.html.tpl
@@ -23,6 +23,14 @@
 
 
 [% END %]
+
+Proxmox = {
+   Setup: { auth_cookie_name: 'PVEAuthCookie' },
+   UserName: '[% username %]',
+   CSRFPreventionToken: '[% token %]'
+};
+
+
 
 
 
-- 
2.11.0


___
pve-devel mailing list
pve-devel@pve.proxmox.com
https://pve.proxmox.com/cgi-bin/mailman/listinfo/pve-devel


[pve-devel] [RFC manager 03/28] use BondModeSelector & BondPolicySelector from widget toolkit

2017-12-11 Thread Thomas Lamprecht
widget name stayed the same, so no need to change

Signed-off-by: Thomas Lamprecht 
---
 www/manager6/Makefile |  1 -
 www/manager6/form/BondModeSelector.js | 42 ---
 2 files changed, 43 deletions(-)
 delete mode 100644 www/manager6/form/BondModeSelector.js

diff --git a/www/manager6/Makefile b/www/manager6/Makefile
index dc2069f8..0deea6a5 100644
--- a/www/manager6/Makefile
+++ b/www/manager6/Makefile
@@ -47,7 +47,6 @@ JSSRC=
\
form/ControllerSelector.js  \
form/EmailNotificationSelector.js   \
form/RealmComboBox.js   \
-   form/BondModeSelector.js\
form/ViewSelector.js\
form/NodeSelector.js\
form/FileSelector.js\
diff --git a/www/manager6/form/BondModeSelector.js 
b/www/manager6/form/BondModeSelector.js
deleted file mode 100644
index 021d613c..
--- a/www/manager6/form/BondModeSelector.js
+++ /dev/null
@@ -1,42 +0,0 @@
-Ext.define('PVE.form.BondModeSelector', {
-extend: 'PVE.form.KVComboBox',
-alias: ['widget.bondModeSelector'],
-  
-openvswitch: false,
-
-initComponent: function() {
-   var me = this;
-
-   if (me.openvswitch) {
-   me.comboItems = [
-  ['active-backup', 'active-backup'],
-  ['balance-slb', 'balance-slb'],
-  ['lacp-balance-slb', 'LACP (balance-slb)'],
-  ['lacp-balance-tcp', 'LACP (balance-tcp)']
-  ];
-   } else {
-me.comboItems = [
-   ['balance-rr', 'balance-rr'], 
-   ['active-backup', 'active-backup'], 
-   ['balance-xor', 'balance-xor'], 
-   ['broadcast', 'broadcast'], 
-   ['802.3ad', 'LACP (802.3ad)'], 
-   ['balance-tlb', 'balance-tlb'], 
-   ['balance-alb', 'balance-alb']
-   ];
-   }
- 
-   me.callParent();
-}
-});
-
-Ext.define('PVE.form.BondPolicySelector', {
-extend: 'PVE.form.KVComboBox',
-alias: ['widget.bondPolicySelector'],
-comboItems: [
-   ['layer2', 'layer2'],
-   ['layer2+3', 'layer2+3'], 
-   ['layer3+4', 'layer3+4']
-]
-});
-
-- 
2.11.0


___
pve-devel mailing list
pve-devel@pve.proxmox.com
https://pve.proxmox.com/cgi-bin/mailman/listinfo/pve-devel


Re: [pve-devel] [PATCH manager] api: nodes/subscription: implement reasonable access rights

2017-12-11 Thread Thomas Lamprecht
any comments?

On 11/30/2017 08:20 AM, Thomas Lamprecht wrote:
> Allow users which have Sys.Audit on a specific node to get the
> subscription status and those with Sys.Modify to set and check
> (update) it.
> 
> This mirrors the required permissions from other node specific
> actions, e.g., APT (package management).
> 
> We always showed the Subscription Panel and all its elements in the
> WebUI, so no need for change there.
> 
> Signed-off-by: Thomas Lamprecht 
> ---
>  PVE/API2/Subscription.pm | 9 +
>  1 file changed, 9 insertions(+)
> 
> diff --git a/PVE/API2/Subscription.pm b/PVE/API2/Subscription.pm
> index bedc6a5b..9d24dce8 100644
> --- a/PVE/API2/Subscription.pm
> +++ b/PVE/API2/Subscription.pm
> @@ -91,6 +91,9 @@ __PACKAGE__->register_method ({
>  name => 'get',
>  path => '',
>  method => 'GET',
> +permissions => {
> + check => ['perm', '/nodes/{node}', [ 'Sys.Audit' ]],
> +},
>  description => "Read subscription info.",
>  proxyto => 'node',
>  permissions => { user => 'all' },
> @@ -128,6 +131,9 @@ __PACKAGE__->register_method ({
>  name => 'update',
>  path => '',
>  method => 'POST',
> +permissions => {
> + check => ['perm', '/nodes/{node}', [ 'Sys.Modify' ]],
> +},
>  description => "Update subscription info.",
>  proxyto => 'node',
>  protected => 1,
> @@ -179,6 +185,9 @@ __PACKAGE__->register_method ({
>  name => 'set',
>  path => '',
>  method => 'PUT',
> +permissions => {
> + check => ['perm', '/nodes/{node}', [ 'Sys.Modify' ]],
> +},
>  description => "Set subscription key.",
>  proxyto => 'node',
>  protected => 1,
> 


___
pve-devel mailing list
pve-devel@pve.proxmox.com
https://pve.proxmox.com/cgi-bin/mailman/listinfo/pve-devel


[pve-devel] applied: [PATCH container v3 1/1] add termproxy api call for lxc

2017-12-11 Thread Wolfgang Bumiller
applied

On Mon, Dec 11, 2017 at 02:55:31PM +0100, Dominik Csapak wrote:
> Signed-off-by: Dominik Csapak 
> ---
>  src/PVE/API2/LXC.pm | 84 
> +
>  1 file changed, 84 insertions(+)
> 
> diff --git a/src/PVE/API2/LXC.pm b/src/PVE/API2/LXC.pm
> index a1897c7..733826e 100644
> --- a/src/PVE/API2/LXC.pm
> +++ b/src/PVE/API2/LXC.pm
> @@ -463,6 +463,7 @@ __PACKAGE__->register_method({
>   { subdir => 'config' },
>   { subdir => 'status' },
>   { subdir => 'vncproxy' },
> + { subdir => 'termproxy' },
>   { subdir => 'vncwebsocket' },
>   { subdir => 'spiceproxy' },
>   { subdir => 'migrate' },
> @@ -760,6 +761,89 @@ __PACKAGE__->register_method ({
>   };
>  }});
>  
> +__PACKAGE__->register_method ({
> +name => 'termproxy',
> +path => '{vmid}/termproxy',
> +method => 'POST',
> +protected => 1,
> +permissions => {
> + check => ['perm', '/vms/{vmid}', [ 'VM.Console' ]],
> +},
> +description => "Creates a TCP proxy connection.",
> +parameters => {
> + additionalProperties => 0,
> + properties => {
> + node => get_standard_option('pve-node'),
> + vmid => get_standard_option('pve-vmid'),
> + },
> +},
> +returns => {
> + additionalProperties => 0,
> + properties => {
> + user => { type => 'string' },
> + ticket => { type => 'string' },
> + port => { type => 'integer' },
> + upid => { type => 'string' },
> + },
> +},
> +code => sub {
> + my ($param) = @_;
> +
> + my $rpcenv = PVE::RPCEnvironment::get();
> +
> + my $authuser = $rpcenv->get_user();
> +
> + my $vmid = $param->{vmid};
> + my $node = $param->{node};
> +
> + my $authpath = "/vms/$vmid";
> +
> + my $ticket = PVE::AccessControl::assemble_vnc_ticket($authuser, 
> $authpath);
> +
> + my ($remip, $family);
> +
> + if ($node ne 'localhost' && $node ne PVE::INotify::nodename()) {
> + ($remip, $family) = PVE::Cluster::remote_node_ip($node);
> + } else {
> + $family = PVE::Tools::get_host_address_family($node);
> + }
> +
> + my $port = PVE::Tools::next_vnc_port($family);
> +
> + my $remcmd = $remip ?
> + ['/usr/bin/ssh', '-e', 'none', '-t', $remip, '--'] : [];
> +
> + my $conf = PVE::LXC::Config->load_config($vmid, $node);
> + my $concmd = PVE::LXC::get_console_command($vmid, $conf, 1);
> +
> + my $shcmd = [ '/usr/bin/dtach', '-A',
> +   "/var/run/dtach/vzctlconsole$vmid",
> +   '-r', 'winch', '-z', @$concmd];
> +
> + my $realcmd = sub {
> + my $upid = shift;
> +
> + syslog ('info', "starting lxc termproxy $upid\n");
> +
> + my $cmd = ['/usr/bin/termproxy', $port, '--path', $authpath,
> +'--perm', 'VM.Console', '--'];
> + push @$cmd, @$remcmd, @$shcmd;
> +
> + PVE::Tools::run_command($cmd);
> + };
> +
> + my $upid = $rpcenv->fork_worker('vncproxy', $vmid, $authuser, $realcmd, 
> 1);
> +
> + PVE::Tools::wait_for_vnc_port($port);
> +
> + return {
> + user => $authuser,
> + ticket => $ticket,
> + port => $port,
> + upid => $upid,
> + };
> +}});
> +
>  __PACKAGE__->register_method({
>  name => 'vncwebsocket',
>  path => '{vmid}/vncwebsocket',
> -- 
> 2.11.0

___
pve-devel mailing list
pve-devel@pve.proxmox.com
https://pve.proxmox.com/cgi-bin/mailman/listinfo/pve-devel


Re: [pve-devel] [PATCH V4 guset-common] Remove noerr form replication.

2017-12-11 Thread Thomas Lamprecht
On 12/07/2017 12:06 PM, Wolfgang Link wrote:
> We will handle this errors in the API and decide what to do.

Most stuff is indentation change, so mail look more noisy than it is.

In general OK, *but* we need a to handle package versions of this, i.e.:
The package version of guest-common which adds this needs to break earlier
managers and the version of pve-manager which adds the manager patches needs
to add a versioned dependency on guest-common in the respective control file.
It's just the saner and user-friendlier way to do things.

Reviewed-by: Thomas Lamprecht 

> ---
>  PVE/Replication.pm | 95 
> +++---
>  1 file changed, 41 insertions(+), 54 deletions(-)
> 
> diff --git a/PVE/Replication.pm b/PVE/Replication.pm
> index c25ed44..9bc4e61 100644
> --- a/PVE/Replication.pm
> +++ b/PVE/Replication.pm
> @@ -304,7 +304,7 @@ sub replicate {
>  }
>  
>  my $run_replication_nolock = sub {
> -my ($guest_class, $jobcfg, $iteration, $start_time, $logfunc, $noerr, 
> $verbose) = @_;
> +my ($guest_class, $jobcfg, $iteration, $start_time, $logfunc, $verbose) 
> = @_;
>  
>  my $jobid = $jobcfg->{id};
>  
> @@ -313,79 +313,66 @@ my $run_replication_nolock = sub {
>  # we normaly write errors into the state file,
>  # but we also catch unexpected errors and log them to syslog
>  # (for examply when there are problems writing the state file)
> -eval {
> - my $state = PVE::ReplicationState::read_job_state($jobcfg);
>  
> - PVE::ReplicationState::record_job_start($jobcfg, $state, $start_time, 
> $iteration);
> +my $state = PVE::ReplicationState::read_job_state($jobcfg);
> +
> +PVE::ReplicationState::record_job_start($jobcfg, $state, $start_time, 
> $iteration);
>  
> - my $t0 = [gettimeofday];
> +my $t0 = [gettimeofday];
>  
> - mkdir $PVE::ReplicationState::replicate_logdir;
> - my $logfile = PVE::ReplicationState::job_logfile_name($jobid);
> - open(my $logfd, '>', $logfile) ||
> - die "unable to open replication log '$logfile' - $!\n";
> +mkdir $PVE::ReplicationState::replicate_logdir;
> +my $logfile = PVE::ReplicationState::job_logfile_name($jobid);
> +open(my $logfd, '>', $logfile) ||
> + die "unable to open replication log '$logfile' - $!\n";
>  
> - my $logfunc_wrapper = sub {
> - my ($msg) = @_;
> +my $logfunc_wrapper = sub {
> + my ($msg) = @_;
>  
> - my $ctime = get_log_time();
> - print $logfd "$ctime $jobid: $msg\n";
> - if ($logfunc) {
> - if ($verbose) {
> - $logfunc->("$ctime $jobid: $msg");
> - } else {
> - $logfunc->($msg);
> - }
> + my $ctime = get_log_time();
> + print $logfd "$ctime $jobid: $msg\n";
> + if ($logfunc) {
> + if ($verbose) {
> + $logfunc->("$ctime $jobid: $msg");
> + } else {
> + $logfunc->($msg);
>   }
> - };
> + }
> +};
>  
> - $logfunc_wrapper->("start replication job");
> +$logfunc_wrapper->("start replication job");
>  
> - eval {
> - $volumes = replicate($guest_class, $jobcfg, $state, $start_time, 
> $logfunc_wrapper);
> - };
> - my $err = $@;
> +eval {
> + $volumes = replicate($guest_class, $jobcfg, $state, $start_time, 
> $logfunc_wrapper);
> +};
> +my $err = $@;
>  
> - if ($err) {
> - my $msg = "end replication job with error: $err";
> - chomp $msg;
> - $logfunc_wrapper->($msg);
> - } else {
> - $logfunc_wrapper->("end replication job");
> - }
> +if ($err) {
> + my $msg = "end replication job with error: $err";
> + chomp $msg;
> + $logfunc_wrapper->($msg);
> +} else {
> + $logfunc_wrapper->("end replication job");
> +}
>  
> - PVE::ReplicationState::record_job_end($jobcfg, $state, $start_time, 
> tv_interval($t0), $err);
> +PVE::ReplicationState::record_job_end($jobcfg, $state, $start_time, 
> tv_interval($t0), $err);
>  
> - close($logfd);
> +close($logfd);
>  
> - die $err if $err && !$noerr;
> -};
> -if (my $err = $@) {
> - if ($noerr) {
> - warn "$jobid: got unexpected replication job error - $err";
> - } else {
> - die $err;
> - }
> -}
> +die $err if $err;
>  
>  return $volumes;
>  };
>  
>  sub run_replication {
> -my ($guest_class, $jobcfg, $iteration, $start_time, $logfunc, $noerr, 
> $verbose) = @_;
> +my ($guest_class, $jobcfg, $iteration, $start_time, $logfunc, $verbose) 
> = @_;
>  
>  my $volumes;
>  
> -eval {
> - my $timeout = 2; # do not wait too long - we repeat periodically anyways
> - $volumes = PVE::GuestHelpers::guest_migration_lock(
> - $jobcfg->{guest}, $timeout, $run_replication_nolock,
> - $guest_class, $jobcfg, $iteration, $start_time, $logfunc, $noerr, 
> $verbose);
> -};
> -if (my 

[pve-devel] applied: [PATCH manager] api: nodes/subscription: implement reasonable access rights

2017-12-11 Thread Wolfgang Bumiller
applied

On Thu, Nov 30, 2017 at 08:20:34AM +0100, Thomas Lamprecht wrote:
> Allow users which have Sys.Audit on a specific node to get the
> subscription status and those with Sys.Modify to set and check
> (update) it.
> 
> This mirrors the required permissions from other node specific
> actions, e.g., APT (package management).
> 
> We always showed the Subscription Panel and all its elements in the
> WebUI, so no need for change there.
> 
> Signed-off-by: Thomas Lamprecht 
> ---
>  PVE/API2/Subscription.pm | 9 +
>  1 file changed, 9 insertions(+)
> 
> diff --git a/PVE/API2/Subscription.pm b/PVE/API2/Subscription.pm
> index bedc6a5b..9d24dce8 100644
> --- a/PVE/API2/Subscription.pm
> +++ b/PVE/API2/Subscription.pm
> @@ -91,6 +91,9 @@ __PACKAGE__->register_method ({
>  name => 'get',
>  path => '',
>  method => 'GET',
> +permissions => {
> + check => ['perm', '/nodes/{node}', [ 'Sys.Audit' ]],
> +},
>  description => "Read subscription info.",
>  proxyto => 'node',
>  permissions => { user => 'all' },
> @@ -128,6 +131,9 @@ __PACKAGE__->register_method ({
>  name => 'update',
>  path => '',
>  method => 'POST',
> +permissions => {
> + check => ['perm', '/nodes/{node}', [ 'Sys.Modify' ]],
> +},
>  description => "Update subscription info.",
>  proxyto => 'node',
>  protected => 1,
> @@ -179,6 +185,9 @@ __PACKAGE__->register_method ({
>  name => 'set',
>  path => '',
>  method => 'PUT',
> +permissions => {
> + check => ['perm', '/nodes/{node}', [ 'Sys.Modify' ]],
> +},
>  description => "Set subscription key.",
>  proxyto => 'node',
>  protected => 1,
> -- 
> 2.11.0

___
pve-devel mailing list
pve-devel@pve.proxmox.com
https://pve.proxmox.com/cgi-bin/mailman/listinfo/pve-devel


Re: [pve-devel] [PATCH V4 manager 1/2] Indentation cleanup.

2017-12-11 Thread Thomas Lamprecht
On 12/07/2017 12:06 PM, Wolfgang Link wrote:
> ---
>  PVE/API2/Replication.pm | 14 +++---
>  1 file changed, 7 insertions(+), 7 deletions(-)
> 
> diff --git a/PVE/API2/Replication.pm b/PVE/API2/Replication.pm
> index f396615d..38449892 100644
> --- a/PVE/API2/Replication.pm
> +++ b/PVE/API2/Replication.pm
> @@ -77,15 +77,15 @@ sub run_jobs {
>  my $iteration = $now // time();
>  
>  my $code = sub {
> -   my $start_time = $now // time();
> + my $start_time = $now // time();
>  
> -   PVE::ReplicationState::purge_old_states();
> + PVE::ReplicationState::purge_old_states();
>  
> -   while (my $jobcfg = PVE::ReplicationState::get_next_job($iteration, 
> $start_time)) {
> -   my $guest_class = $lookup_guest_class->($jobcfg->{vmtype});
> -   PVE::Replication::run_replication($guest_class, $jobcfg, 
> $iteration, $start_time, $logfunc, 1, $verbose);
> -   $start_time = $now // time();
> -   }
> + while (my $jobcfg = PVE::ReplicationState::get_next_job($iteration, 
> $start_time)) {
> + my $guest_class = $lookup_guest_class->($jobcfg->{vmtype});
> + PVE::Replication::run_replication($guest_class, $jobcfg, 
> $iteration, $start_time, $logfunc, 1, $verbose);
> + $start_time = $now // time();
> + }
>  };
>  
>  my $res = PVE::Tools::lock_file($pvesr_lock_path, 60, $code);
> 


Reviewed-by: Thomas Lamprecht 

___
pve-devel mailing list
pve-devel@pve.proxmox.com
https://pve.proxmox.com/cgi-bin/mailman/listinfo/pve-devel


Re: [pve-devel] [PATCH qemu-server v3 1/2] add termproxy api call

2017-12-11 Thread Wolfgang Bumiller
applied both, will follow up with a patch to remove the ^O escape
key from qm terminal when used with xtermjs

On Mon, Dec 11, 2017 at 02:55:32PM +0100, Dominik Csapak wrote:
> for xtermjs web client
> 
> Signed-off-by: Dominik Csapak 
> ---
>  PVE/API2/Qemu.pm | 95 
> 
>  1 file changed, 95 insertions(+)
> 
> diff --git a/PVE/API2/Qemu.pm b/PVE/API2/Qemu.pm
> index 5f9d105..2b23c6b 100644
> --- a/PVE/API2/Qemu.pm
> +++ b/PVE/API2/Qemu.pm
> @@ -609,6 +609,7 @@ __PACKAGE__->register_method({
>   { subdir => 'status' },
>   { subdir => 'unlink' },
>   { subdir => 'vncproxy' },
> + { subdir => 'termproxy' },
>   { subdir => 'migrate' },
>   { subdir => 'resize' },
>   { subdir => 'move' },
> @@ -1483,6 +1484,100 @@ __PACKAGE__->register_method({
>  }});
>  
>  __PACKAGE__->register_method({
> +name => 'termproxy',
> +path => '{vmid}/termproxy',
> +method => 'POST',
> +protected => 1,
> +permissions => {
> + check => ['perm', '/vms/{vmid}', [ 'VM.Console' ]],
> +},
> +description => "Creates a TCP proxy connections.",
> +parameters => {
> + additionalProperties => 0,
> + properties => {
> + node => get_standard_option('pve-node'),
> + vmid => get_standard_option('pve-vmid'),
> + serial=> {
> + optional => 1,
> + type => 'string',
> + enum => [qw(serial0 serial1 serial2 serial3)],
> + description => "opens a serial terminal (defaults to display)",
> + },
> + },
> +},
> +returns => {
> + additionalProperties => 0,
> + properties => {
> + user => { type => 'string' },
> + ticket => { type => 'string' },
> + port => { type => 'integer' },
> + upid => { type => 'string' },
> + },
> +},
> +code => sub {
> + my ($param) = @_;
> +
> + my $rpcenv = PVE::RPCEnvironment::get();
> +
> + my $authuser = $rpcenv->get_user();
> +
> + my $vmid = $param->{vmid};
> + my $node = $param->{node};
> + my $serial = $param->{serial};
> +
> + my $conf = PVE::QemuConfig->load_config($vmid, $node); # check if VM 
> exists
> +
> + if (!defined($serial)) {
> + if ($conf->{vga} && $conf->{vga} =~ m/^serial\d+$/) {
> + $serial = $conf->{vga};
> + }
> + }
> +
> + my $authpath = "/vms/$vmid";
> +
> + my $ticket = PVE::AccessControl::assemble_vnc_ticket($authuser, 
> $authpath);
> +
> + my ($remip, $family);
> +
> + if ($node ne 'localhost' && $node ne PVE::INotify::nodename()) {
> + ($remip, $family) = PVE::Cluster::remote_node_ip($node);
> + } else {
> + $family = PVE::Tools::get_host_address_family($node);
> + }
> +
> + my $port = PVE::Tools::next_vnc_port($family);
> +
> + my $remcmd = $remip ?
> + ['/usr/bin/ssh', '-e', 'none', '-t', $remip, '--'] : [];
> +
> + my $termcmd = [ '/usr/sbin/qm', 'terminal', $vmid];
> + push @$termcmd, '-iface', $serial if $serial;
> +
> + my $realcmd = sub {
> + my $upid = shift;
> +
> + syslog('info', "starting qemu termproxy $upid\n");
> +
> + my $cmd = ['/usr/bin/termproxy', $port, '--path', $authpath,
> +'--perm', 'VM.Console', '--'];
> + push @$cmd, @$remcmd, @$termcmd;
> +
> + PVE::Tools::run_command($cmd);
> + };
> +
> + my $upid = $rpcenv->fork_worker('vncproxy', $vmid, $authuser, $realcmd, 
> 1);
> +
> + PVE::Tools::wait_for_vnc_port($port);
> +
> + return {
> + user => $authuser,
> + ticket => $ticket,
> + port => $port,
> + upid => $upid,
> + };
> +}});
> +
> +__PACKAGE__->register_method({
>  name => 'vncwebsocket',
>  path => '{vmid}/vncwebsocket',
>  method => 'GET',
> -- 
> 2.11.0

___
pve-devel mailing list
pve-devel@pve.proxmox.com
https://pve.proxmox.com/cgi-bin/mailman/listinfo/pve-devel


Re: [pve-devel] [PATCH manager v3 1/5] add termproxy api call for nodes

2017-12-11 Thread Wolfgang Bumiller
applied whole series

On Mon, Dec 11, 2017 at 02:55:26PM +0100, Dominik Csapak wrote:
> and add dependency for pve-xtermjs
> 
> Signed-off-by: Dominik Csapak 
> ---
>  PVE/API2/Nodes.pm | 97 
> +++
>  debian/control|  1 +
>  2 files changed, 98 insertions(+)
> 
> diff --git a/PVE/API2/Nodes.pm b/PVE/API2/Nodes.pm
> index a97620ef..f11fd169 100644
> --- a/PVE/API2/Nodes.pm
> +++ b/PVE/API2/Nodes.pm
> @@ -155,6 +155,7 @@ __PACKAGE__->register_method ({
>   { name => 'rrddata' },# fixme: remove?
>   { name => 'replication' },
>   { name => 'vncshell' },
> + { name => 'termproxy' },
>   { name => 'spiceshell' },
>   { name => 'time' },
>   { name => 'dns' },
> @@ -758,6 +759,102 @@ __PACKAGE__->register_method ({
>   };
>  }});
>  
> +__PACKAGE__->register_method ({
> +name => 'termproxy',
> +path => 'termproxy',
> +method => 'POST',
> +protected => 1,
> +permissions => {
> + description => "Restricted to users on realm 'pam'",
> + check => ['perm', '/nodes/{node}', [ 'Sys.Console' ]],
> +},
> +description => "Creates a VNC Shell proxy.",
> +parameters => {
> + additionalProperties => 0,
> + properties => {
> + node => get_standard_option('pve-node'),
> + upgrade => {
> + type => 'boolean',
> + description => "Run 'apt-get dist-upgrade' instead of normal 
> shell.",
> + optional => 1,
> + default => 0,
> + },
> + },
> +},
> +returns => {
> + additionalProperties => 0,
> + properties => {
> + user => { type => 'string' },
> + ticket => { type => 'string' },
> + port => { type => 'integer' },
> + upid => { type => 'string' },
> + },
> +},
> +code => sub {
> + my ($param) = @_;
> +
> + my $rpcenv = PVE::RPCEnvironment::get();
> +
> + my ($user, undef, $realm) = 
> PVE::AccessControl::verify_username($rpcenv->get_user());
> +
> + raise_perm_exc("realm != pam") if $realm ne 'pam';
> +
> + my $node = $param->{node};
> +
> + my $authpath = "/nodes/$node";
> +
> + my $ticket = PVE::AccessControl::assemble_vnc_ticket($user, $authpath);
> +
> + my ($remip, $family);
> +
> + if ($node ne 'localhost' && $node ne PVE::INotify::nodename()) {
> + ($remip, $family) = PVE::Cluster::remote_node_ip($node);
> + } else {
> + $family = PVE::Tools::get_host_address_family($node);
> + }
> +
> + my $port = PVE::Tools::next_vnc_port($family);
> +
> + my $remcmd = $remip ?
> + ['/usr/bin/ssh', '-e', 'none', '-t', $remip , '--'] : [];
> +
> + my $concmd;
> +
> + if ($user eq 'root@pam') {
> + if ($param->{upgrade}) {
> + my $upgradecmd = "pveupgrade --shell";
> + $concmd = [ '/bin/bash', '-c', $upgradecmd ];
> + } else {
> + $concmd = [ '/bin/login', '-f', 'root' ];
> + }
> + } else {
> + $concmd = [ '/bin/login' ];
> + }
> +
> + my $realcmd = sub {
> + my $upid = shift;
> +
> + syslog ('info', "starting termproxy $upid\n");
> +
> + my $cmd = ['/usr/bin/termproxy', $port, '--path', $authpath,
> +'--perm', 'Sys.Console',  '--'];
> + push  @$cmd, @$remcmd, @$concmd;
> +
> + PVE::Tools::run_command($cmd);
> + };
> +
> + my $upid = $rpcenv->fork_worker('vncshell', "", $user, $realcmd);
> +
> + PVE::Tools::wait_for_vnc_port($port);
> +
> + return {
> + user => $user,
> + ticket => $ticket,
> + port => $port,
> + upid => $upid,
> + };
> +}});
> +
>  __PACKAGE__->register_method({
>  name => 'vncwebsocket',
>  path => 'vncwebsocket',
> diff --git a/debian/control b/debian/control
> index 9e399edc..88875342 100644
> --- a/debian/control
> +++ b/debian/control
> @@ -59,6 +59,7 @@ Depends: apt-transport-https,
>   pve-docs,
>   pve-firewall,
>   pve-ha-manager,
> + pve-xtermjs (>= 0.1-1),
>   qemu-server (>= 1.1-1),
>   rsync,
>   spiceterm,
> -- 
> 2.11.0

___
pve-devel mailing list
pve-devel@pve.proxmox.com
https://pve.proxmox.com/cgi-bin/mailman/listinfo/pve-devel


[pve-devel] [PATCH dab appliances] add ubuntu-artful-standard-64

2017-12-11 Thread Thomas Lamprecht
Signed-off-by: Thomas Lamprecht 
---

Needs my not yet applied DAB patch "add support for Ubuntu 17.10
(artful)" to generate the actual template

 ubuntu-artful-standard-64/Makefile | 19 +++
 ubuntu-artful-standard-64/dab.conf | 13 +
 2 files changed, 32 insertions(+)
 create mode 100644 ubuntu-artful-standard-64/Makefile
 create mode 100644 ubuntu-artful-standard-64/dab.conf

diff --git a/ubuntu-artful-standard-64/Makefile 
b/ubuntu-artful-standard-64/Makefile
new file mode 100644
index 000..26fffb0
--- /dev/null
+++ b/ubuntu-artful-standard-64/Makefile
@@ -0,0 +1,19 @@
+BASEDIR:=$(shell dab basedir)
+
+all: info/init_ok
+   dab bootstrap
+   dab finalize
+
+info/init_ok: dab.conf
+   dab init
+   touch $@
+
+.PHONY: clean
+clean:
+   dab clean
+   rm -f *~
+
+.PHONY: dist-clean
+dist-clean:
+   dab dist-clean
+   rm -f *~
diff --git a/ubuntu-artful-standard-64/dab.conf 
b/ubuntu-artful-standard-64/dab.conf
new file mode 100644
index 000..6571d2c
--- /dev/null
+++ b/ubuntu-artful-standard-64/dab.conf
@@ -0,0 +1,13 @@
+Suite: artful
+CacheDir: ../cache
+#Source: http://archive.ubuntu.com/ubuntu SUITE main restricted universe 
multiverse
+#Source: http://archive.ubuntu.com/ubuntu SUITE-updates main restricted 
universe multiverse
+#Source: http://archive.ubuntu.com/ubuntu SUITE-security main restricted 
universe multiverse
+Architecture: amd64
+Name: ubuntu-17.10-standard
+Version: 17.10-1
+Section: system
+Maintainer: Proxmox Support Team 
+Infopage: http://pve.proxmox.com/wiki/Ubuntu_Artful_Standard
+Description: Ubuntu Artful (standard)
+ A small Ubuntu Artful system including all standard packages.
-- 
2.11.0


___
pve-devel mailing list
pve-devel@pve.proxmox.com
https://pve.proxmox.com/cgi-bin/mailman/listinfo/pve-devel


Re: [pve-devel] [PATCH V4 manager 2/2] Send an email when a replication job fails.

2017-12-11 Thread Thomas Lamprecht
On 12/07/2017 12:07 PM, Wolfgang Link wrote:
> A email notification will be send for each job when the job fails.
> This message will only send when an error occurs and the fail count is on 1.
> ---
>  PVE/API2/Replication.pm  | 18 --
>  PVE/CLI/pvesr.pm | 11 ++-
>  bin/init.d/pvesr.service |  2 +-
>  3 files changed, 27 insertions(+), 4 deletions(-)
> 
> diff --git a/PVE/API2/Replication.pm b/PVE/API2/Replication.pm
> index 38449892..8c049363 100644
> --- a/PVE/API2/Replication.pm
> +++ b/PVE/API2/Replication.pm
> @@ -72,7 +72,7 @@ sub run_single_job {
>  
>  # passing $now and $verbose is useful for regression testing
>  sub run_jobs {
> -my ($now, $logfunc, $verbose) = @_;
> +my ($now, $logfunc, $verbose, $mail) = @_;
>  
>  my $iteration = $now // time();
>  
> @@ -83,7 +83,21 @@ sub run_jobs {
>  
>   while (my $jobcfg = PVE::ReplicationState::get_next_job($iteration, 
> $start_time)) {
>   my $guest_class = $lookup_guest_class->($jobcfg->{vmtype});
> - PVE::Replication::run_replication($guest_class, $jobcfg, 
> $iteration, $start_time, $logfunc, 1, $verbose);
> +
> + eval {
> + PVE::Replication::run_replication($guest_class, $jobcfg, 
> $iteration, $start_time, $logfunc, $verbose);
> + };
> + if (my $err = $@) {
> + warn "$jobcfg->{id}: got unexpected replication job error - 
> $err";
> + my $state = PVE::ReplicationState::read_state();
> + my $jobstate = PVE::ReplicationState::extract_job_state($state, 
> $jobcfg);
> + eval {
> + PVE::Tools::sendmail('root', "Replication Job: 
> $jobcfg->{id} failed", $err)
> + if $jobstate->{fail_count} == 1 && $mail;
> + };



> + warn ": $@" if $@;
 
Is the colon + space above intended?

> + };
^^^
nit: semicolon not needed for if branch.

Looks OK otherwise:
Reviewed-by: Thomas Lamprecht 


> +
>   $start_time = $now // time();
>   }
>  };
> diff --git a/PVE/CLI/pvesr.pm b/PVE/CLI/pvesr.pm
> index 7da94404..cb79e2bf 100644
> --- a/PVE/CLI/pvesr.pm
> +++ b/PVE/CLI/pvesr.pm
> @@ -221,12 +221,21 @@ __PACKAGE__->register_method ({
>   default => 0,
>   optional => 1,
>   },
> + mail => {
> + description => "Send an email notification in case of a 
> failure.",
> + type => 'boolean',
> + default => 0,
> + optional => 1,
> + },
>   },
>  },
>  returns => { type => 'null' },
>  code => sub {
>   my ($param) = @_;
>  
> + die "Mail and id are mutually exclusive!\n"
> + if $param->{id} && $param->{mail};
> +
>   my $logfunc;
>  
>   if ($param->{verbose}) {
> @@ -242,7 +251,7 @@ __PACKAGE__->register_method ({
>  
>   } else {
>  
> - PVE::API2::Replication::run_jobs(undef, $logfunc);
> + PVE::API2::Replication::run_jobs(undef, $logfunc, 0, 
> $param->{mail});
>   }
>  
>   return undef;
> diff --git a/bin/init.d/pvesr.service b/bin/init.d/pvesr.service
> index 5706d426..e0c082af 100644
> --- a/bin/init.d/pvesr.service
> +++ b/bin/init.d/pvesr.service
> @@ -4,4 +4,4 @@ ConditionPathExists=/usr/bin/pvesr
>  
>  [Service]
>  Type=oneshot
> -ExecStart=/usr/bin/pvesr run
> +ExecStart=/usr/bin/pvesr run --mail 1
> 


___
pve-devel mailing list
pve-devel@pve.proxmox.com
https://pve.proxmox.com/cgi-bin/mailman/listinfo/pve-devel