]> git.proxmox.com Git - pve-common.git/blobdiff - src/PVE/Tools.pm
PVE::Tools::encrypt_pw() - new helper copied from pve-access-control
[pve-common.git] / src / PVE / Tools.pm
index 69c87304396129fe7dc7d70847299fb0db256b84..406aa2aa7834bba3af1bd6796b196ab90408c385 100644 (file)
@@ -350,6 +350,7 @@ sub run_command {
     my $output;
     my $afterfork;
     my $noerr;
+    my $keeplocale;
 
     eval {
 
@@ -374,6 +375,8 @@ sub run_command {
                $afterfork = $param{$p};
            } elsif ($p eq 'noerr') {
                $noerr = $param{$p};
+           } elsif ($p eq 'keeplocale') {
+               $keeplocale = $param{$p};
            } else {
                die "got unknown parameter '$p' for run_command\n";
            }
@@ -397,13 +400,10 @@ sub run_command {
        my $writer = $input && $input =~ m/^<&/ ? $input : IO::File->new();
        my $error  = IO::File->new();
 
-       # try to avoid locale related issues/warnings
-       my $lang = $param{lang} || 'C';
-
        my $orig_pid = $$;
 
        eval {
-           local $ENV{LC_ALL} = $lang;
+           local $ENV{LC_ALL} = 'C' if !$keeplocale;
 
            # suppress LVM warnings like: "File descriptor 3 left open";
            local $ENV{LVM_SUPPRESS_FD_WARNINGS} = "1";
@@ -1443,4 +1443,18 @@ sub enter_systemd_scope {
     die "systemd job never completed\n" if !$done;
 }
 
+my $salt_starter = time();
+
+sub encrypt_pw {
+    my ($pw) = @_;
+
+    $salt_starter++;
+    my $salt = substr(Digest::SHA::sha1_base64(time() + $salt_starter + $$), 0, 8);
+
+    # crypt does not want '+' in salt (see 'man crypt')
+    $salt =~ s/\+/X/g;
+
+    return crypt(encode("utf8", $pw), "\$5\$$salt\$");
+}
+
 1;