module Keyble

Public Instance Methods

cache() click to toggle source
# File lib/keyble.rb, line 46
def cache
  @cache ||=
    if (File.exist?(cache_file_path))
      read(cache_file_path)
    else
      { }
    end
end
cache_file_path() click to toggle source
# File lib/keyble.rb, line 42
def cache_file_path
  @cache_file_path or File.expand_path(".keyble", ENV['HOME'])
end
cache_file_path=(value) click to toggle source
# File lib/keyble.rb, line 38
def cache_file_path=(value)
  @cache_file_path = value
end
cache_merge!(data) click to toggle source
# File lib/keyble.rb, line 55
def cache_merge!(data)
  cache.merge!(data)

  cache
end
cache_save!() click to toggle source
# File lib/keyble.rb, line 61
def cache_save!
  return unless (@cache)

  write(cache_file_path, @cache)
end
keys_add(keys, servers) click to toggle source
# File lib/keyble.rb, line 95
def keys_add(keys, servers)
  keys_reassign(servers) do |server, existing_keys|
    existing_keys.merge(keys)
  end
end
keys_display(keys) click to toggle source
# File lib/keyble.rb, line 124
def keys_display(keys)
  longest_key = keys.keys.collect { |k| k.to_s.length }.sort[-1]

  keys.sort.each do |key, line|
    puts "%-#{longest_key}s  %s" % [ key, line.split(/\s+/)[1][-20, 20] ]
  end
end
keys_get(servers) click to toggle source
# File lib/keyble.rb, line 67
def keys_get(servers)
  result = { }

  servers.each do |server|
    Net::SCP.start(server, nil) do |scp|
      result[server] = parse(scp.download!(ssh_authorized_keys_path))
    end
  end

  result
end
keys_import(file) click to toggle source
# File lib/keyble.rb, line 115
def keys_import(file)
  imported = read(file)

  cache_merge!(imported)
  cache_save!

  imported
end
keys_reassign(servers) { |server, dup| ... } click to toggle source
# File lib/keyble.rb, line 79
def keys_reassign(servers)
  servers.each do |server|
    Net::SCP.start(server, nil) do |scp|
      existing = parse(scp.download!(ssh_authorized_keys_path))

      merged = yield(server, existing.dup)

      if (merged != existing)
        authorized_keys = StringIO.new(merged.values.join("\n"))

        scp.upload!(authorized_keys, ssh_authorized_keys_path)
      end
    end
  end
end
keys_remove(keys, servers) click to toggle source
# File lib/keyble.rb, line 101
def keys_remove(keys, servers)
  if (keys.respond_to?(:keys))
    keys = keys.keys
  end

  keys_reassign(servers) do |server, existing_keys|
    keys.each do |key|
      existing_keys.delete(key)
    end

    existing_keys
  end
end
parse(data) click to toggle source
# File lib/keyble.rb, line 2
def parse(data)
  result = { }

  data.split(/\r?\n/).collect do |line|
    type, key, comment = line.split(/\s+/)

    if (comment and !comment.empty? and comment.match(/\S+\@\S+/))
      result[comment] = line
    end
  end

  result
end
read(path) click to toggle source
# File lib/keyble.rb, line 16
def read(path)
  result = { }

  File.open(path) do |f|
    result = parse(f.read)
  end

  result
end
ssh_authorized_keys_path() click to toggle source
# File lib/keyble.rb, line 34
def ssh_authorized_keys_path
  ".ssh/authorized_keys"
end
write(path, data) click to toggle source
# File lib/keyble.rb, line 26
def write(path, data)
  File.open(path, 'w') do |f|
    data.each do |key, line|
      f.puts(line)
    end
  end
end