Copy the ssh_keys_users facter from Tor
authorPeter Palfrader <peter@palfrader.org>
Sat, 14 Sep 2019 10:51:24 +0000 (12:51 +0200)
committerPeter Palfrader <peter@palfrader.org>
Sat, 14 Sep 2019 10:51:24 +0000 (12:51 +0200)
modules/ssh/lib/facter/ssh_keys_users.rb [new file with mode: 0644]

diff --git a/modules/ssh/lib/facter/ssh_keys_users.rb b/modules/ssh/lib/facter/ssh_keys_users.rb
new file mode 100644 (file)
index 0000000..308a0ec
--- /dev/null
@@ -0,0 +1,34 @@
+require 'etc'
+
+# this fact will iterate over all the known users (as defined by the
+# Etc module) and look in their .ssh directory for public keys. the
+# public keys are exported in a user => [keys] hash, where keys are
+# stored in the array without distinction of type
+Facter.add(:ssh_keys_users) do
+  setcode do
+    keys_hash = {}
+    Etc.passwd { |user|
+      keys = {}
+      Dir.glob(File.join(user.dir, '.ssh', '*.pub')).each { |filepath|
+        if FileTest.file?(filepath)
+          regex = %r{^ssh-(\S+) (\S+)\s?(.+)?$}
+          begin
+            line = File.open(filepath).read.chomp
+            if (match = regex.match(line))
+                keys[File.basename(filepath)] = {
+                    'type' => match[1],
+                    'key' => match[2],
+                    'comment' => match[3],
+                    'line' => line,
+                }
+            end
+          rescue
+            puts "cannot read user SSH key: " + user.name
+          end
+        end
+      }
+      keys_hash[user.name] = keys if not keys.empty?
+    }
+    keys_hash
+  end
+end