[pve-devel] [PATCH] - preserve authorized_key key order - identify double keys by key and not by comment

Stefan Priebe s.priebe at profihost.ag
Mon Aug 27 11:40:00 CEST 2012


Signed-off-by: Stefan Priebe <s.priebe at profihost.ag>
---
 data/PVE/Cluster.pm |   26 ++++++++++++--------------
 1 file changed, 12 insertions(+), 14 deletions(-)

diff --git a/data/PVE/Cluster.pm b/data/PVE/Cluster.pm
index a877d41..4d5b9ac 100644
--- a/data/PVE/Cluster.pm
+++ b/data/PVE/Cluster.pm
@@ -1002,29 +1002,27 @@ sub ssh_merge_keys {
 
     my $data = '';
     if (-f $sshauthkeys) {
-	$data = PVE::Tools::file_get_contents($sshauthkeys, 128*1024);
-	chomp($data);
+        $data = PVE::Tools::file_get_contents($sshauthkeys, 128*1024);
+        chomp($data);
     }
 
     # always add ourself
     if (-f $ssh_rsa_id) {
-	my $pub = PVE::Tools::file_get_contents($ssh_rsa_id);
-	chomp($pub);
-	$data .= "\n$pub\n";
+        my $pub = PVE::Tools::file_get_contents($ssh_rsa_id);
+        chomp($pub);
+        $data .= "\n$pub\n";
     }
 
     my $newdata = "";
     my $vhash = {};
-    while ($data && $data =~ s/^((.*?)(\n|$))//) {
-	my $line = "$2\n";
-	if ($line =~ m/^ssh-rsa\s+\S+\s+(\S+)$/) {
-	    $vhash->{$1} = $line;
-	} else {
-	    $newdata .= $line;
-	}
+    my @lines = split(/\n/, $data);
+    foreach my $line (@lines) {
+        if ($line =~ m/^ssh-rsa\s+(\S+)\s+\S+$/) { 
+            next if ($vhash->{$1});
+            $vhash->{$1} = 1;
+        } 
+        $newdata .= $line . "\n";
     }
-    
-    $newdata .= join("", values(%$vhash));
 
     PVE::Tools::file_set_contents($sshauthkeys, $newdata, 0600);
 }
-- 
1.7.9.5




More information about the pve-devel mailing list