]> git.proxmox.com Git - pve-manager.git/blobdiff - PVE/API2/Nodes.pm
use login instead of bash
[pve-manager.git] / PVE / API2 / Nodes.pm
index 0542e0c091dc6053ee71e294b2622c12ea69d278..c85c9f57715ab00bdb452509b4ffc8789b2a17cf 100644 (file)
@@ -672,7 +672,7 @@ __PACKAGE__->register_method ({
                $upgradecmd = PVE::Tools::shellquote($upgradecmd) if $remip;
                $shcmd = [ '/bin/bash', '-c', $upgradecmd ];
            } else {
-               $shcmd = [ '/bin/bash', '-l' ];
+               $shcmd = [ '/bin/login', '-f', 'root' ];
            }
        } else {
            $shcmd = [ '/bin/login' ];
@@ -702,12 +702,12 @@ __PACKAGE__->register_method ({
            eval { 
                foreach my $k (keys %ENV) {
                    next if $k eq 'PVE_VNC_TICKET';
-                   next if $k eq 'PATH' || $k eq 'TERM' || $k eq 'USER' || $k eq 'HOME';
+                   next if $k eq 'PATH' || $k eq 'TERM' || $k eq 'USER' || $k eq 'HOME' || $k eq 'LANG' || $k eq 'LANGUAGE';
                    delete $ENV{$k};
                }
                $ENV{PWD} = '/';
 
-               PVE::Tools::run_command($cmd, errmsg => "vncterm failed"); 
+               PVE::Tools::run_command($cmd, errmsg => "vncterm failed", keeplocale => 1);
            };
            if (my $err = $@) {
                syslog ('err', $err);
@@ -829,7 +829,7 @@ __PACKAGE__->register_method ({
                my $upgradecmd = "pveupgrade --shell";
                $shcmd = [ '/bin/bash', '-c', $upgradecmd ];
            } else {
-               $shcmd = [ '/bin/bash', '-l' ];
+               $shcmd = [ '/bin/login', '-f', 'root' ];
            }
        } else {
            $shcmd = [ '/bin/login' ];
@@ -1210,55 +1210,76 @@ __PACKAGE__->register_method({
        return PVE::Report::generate();
     }});
 
-my $get_start_stop_list = sub {
-    my ($nodename, $autostart, $vmfilter) = @_;
+# returns a list of VMIDs, those can be filtered by
+# * current parent node
+# * vmid whitelist
+# * guest is a template (default: skip)
+# * guest is HA manged (default: skip)
+my $get_filtered_vmlist = sub {
+    my ($nodename, $vmfilter, $templates, $ha_managed) = @_;
 
     my $vmlist = PVE::Cluster::get_vmlist();
 
-    my $vms;
-
+    my $vms_allowed = {};
     if (defined($vmfilter)) {
-       $vms = {};
        foreach my $vmid (PVE::Tools::split_list($vmfilter)) {
-           $vms->{$vmid} = 1;
+           $vms_allowed->{$vmid} = 1;
        }
     }
 
-    my $resList = {};
+    my $res = {};
     foreach my $vmid (keys %{$vmlist->{ids}}) {
-       next if defined($vms) && !$vms->{$vmid};
-       my $d = $vmlist->{ids}->{$vmid};
-       my $startup;
+       next if %$vms_allowed && !$vms_allowed->{$vmid};
 
-       eval { 
-           return if $d->{node} ne $nodename;
-           
-           my $bootorder = LONG_MAX;
+       my $d = $vmlist->{ids}->{$vmid};
+       next if $nodename && $d->{node} ne $nodename;
 
-           my $conf;
+       eval {
+           my $class;
            if ($d->{type} eq 'lxc') {
-               $conf = PVE::LXC::Config->load_config($vmid);
+               $class = 'PVE::LXC::Config';
            } elsif ($d->{type} eq 'qemu') {
-               $conf = PVE::QemuConfig->load_config($vmid);
+               $class = 'PVE::QemuConfig';
            } else {
                die "unknown VM type '$d->{type}'\n";
            }
 
-           return if $autostart && !$conf->{onboot};
+           my $conf = $class->load_config($vmid);
+           return if !$templates && $class->is_template($conf);
+           return if !$ha_managed && PVE::HA::Config::vm_is_ha_managed($vmid);
 
-           if ($conf->{startup}) {
-               $startup =  PVE::JSONSchema::pve_parse_startup_order($conf->{startup});
-               $startup->{order} = $bootorder if !defined($startup->{order});
-           } else {
-               $startup = { order => $bootorder };
-           }
-
-           $resList->{$startup->{order}}->{$vmid} = $startup;
-           $resList->{$startup->{order}}->{$vmid}->{type} = $d->{type};
+           $res->{$vmid} = $conf;
+           $res->{$vmid}->{type} = $d->{type};
        };
        warn $@ if $@;
     }
 
+    return $res;
+};
+
+# return all VMs which should get started/stopped on power up/down
+my $get_start_stop_list = sub {
+    my ($nodename, $autostart, $vmfilter) = @_;
+
+    my $vmlist = &$get_filtered_vmlist($nodename, $vmfilter);
+
+    my $resList = {};
+    foreach my $vmid (keys %$vmlist) {
+       my $conf = $vmlist->{$vmid};
+
+       next if $autostart && !$conf->{onboot};
+
+       my $startup = {};
+       if ($conf->{startup}) {
+           $startup =  PVE::JSONSchema::pve_parse_startup_order($conf->{startup});
+       }
+
+       $startup->{order} = LONG_MAX if !defined($startup->{order});
+
+       $resList->{$startup->{order}}->{$vmid} = $startup;
+       $resList->{$startup->{order}}->{$vmid}->{type} = $conf->{type};
+    }
+
     return $resList;
 };
 
@@ -1323,23 +1344,8 @@ __PACKAGE__->register_method ({
                foreach my $vmid (sort {$a <=> $b} keys %$vmlist) {
                    my $d = $vmlist->{$vmid};
 
-                   # skip templates
-                   my $conf;
-                   if ($d->{type} eq 'lxc') {
-                       $conf = PVE::LXC::Config->load_config($vmid);
-                       next if PVE::LXC::Config->is_template($conf);
-                   } elsif ($d->{type} eq 'qemu') {
-                       $conf = PVE::QemuConfig->load_config($vmid);
-                       next if PVE::QemuConfig->is_template($conf);
-                   } else {
-                       die "unknown VM type '$d->{type}'\n";
-                   }
-
-                   # skip ha managed VMs (started by pve-ha-manager)
-                   next if PVE::HA::Config::vm_is_ha_managed($vmid);
-
                    PVE::Cluster::check_cfs_quorum(); # abort when we loose quorum
-           
+
                    eval {
                        my $default_delay = 0;
                        my $upid;
@@ -1470,9 +1476,6 @@ __PACKAGE__->register_method ({
                };
 
                foreach my $vmid (sort {$b <=> $a} keys %$vmlist) {
-                   # skip ha managed VMs (stopped by pve-ha-manager)
-                   next if PVE::HA::Config::vm_is_ha_managed($vmid);
-
                    my $d = $vmlist->{$vmid};
                    my $upid;
                    eval { $upid = &$create_stop_worker($nodename, $d->{type}, $vmid, $d->{down}); };
@@ -1585,32 +1588,20 @@ __PACKAGE__->register_method ({
            die "either 'maxworkers' parameter or max_workers in datacenter.cfg must be set!\n";
 
        my $code = sub {
-
            $rpcenv->{type} = 'priv'; # to start tasks in background
 
-           my $migrateList = &$get_start_stop_list($nodename, undef, $param->{vms});
+           my $vmlist = &$get_filtered_vmlist($nodename, $param->{vms}, 1, 1);
 
-           foreach my $order (sort {$b <=> $a} keys %$migrateList) {
-               my $vmlist = $migrateList->{$order};
-               my $workers = {};
-               foreach my $vmid (sort {$b <=> $a} keys %$vmlist) {
-                   my $d = $vmlist->{$vmid};
-                   my $pid;
-                   eval { $pid = &$create_migrate_worker($nodename, $d->{type}, $vmid, $target); };
-                   warn $@ if $@;
-                   next if !$pid;
+           my $workers = {};
+           foreach my $vmid (sort keys %$vmlist) {
+               my $d = $vmlist->{$vmid};
+               my $pid;
+               eval { $pid = &$create_migrate_worker($nodename, $d->{type}, $vmid, $target); };
+               warn $@ if $@;
+               next if !$pid;
 
-                   $workers->{$pid} = 1;
-                   while (scalar(keys %$workers) >= $maxWorkers) {
-                       foreach my $p (keys %$workers) {
-                           if (!PVE::ProcFSTools::check_process_running($p)) {
-                               delete $workers->{$p};
-                           }
-                       }
-                       sleep(1);
-                   }
-               }
-               while (scalar(keys %$workers)) {
+               $workers->{$pid} = 1;
+               while (scalar(keys %$workers) >= $maxWorkers) {
                    foreach my $p (keys %$workers) {
                        if (!PVE::ProcFSTools::check_process_running($p)) {
                            delete $workers->{$p};
@@ -1619,6 +1610,14 @@ __PACKAGE__->register_method ({
                    sleep(1);
                }
            }
+           while (scalar(keys %$workers)) {
+               foreach my $p (keys %$workers) {
+                   if (!PVE::ProcFSTools::check_process_running($p)) {
+                       delete $workers->{$p};
+                   }
+               }
+               sleep(1);
+           }
            return;
        };