module Proxy::RemoteExecution::Ssh

Constants

VERSION

Public Class Methods

ca_public_key_file() click to toggle source
# File lib/smart_proxy_remote_execution_ssh.rb, line 28
def ca_public_key_file
  path = Plugin.settings.ssh_user_ca_public_key_file
  File.expand_path(path) if present?(path)
end
cert_file() click to toggle source
# File lib/smart_proxy_remote_execution_ssh.rb, line 24
def cert_file
  File.expand_path("#{private_key_file}-cert.pub")
end
job_storage() click to toggle source
# File lib/smart_proxy_remote_execution_ssh.rb, line 114
def job_storage
  @job_storage ||= Proxy::RemoteExecution::Ssh::JobStorage.new
end
private_key_file() click to toggle source
# File lib/smart_proxy_remote_execution_ssh.rb, line 16
def private_key_file
  File.expand_path(Plugin.settings.ssh_identity_key_file)
end
public_key_file() click to toggle source
# File lib/smart_proxy_remote_execution_ssh.rb, line 20
def public_key_file
  File.expand_path("#{private_key_file}.pub")
end
requires_configured_ssh?() click to toggle source
# File lib/smart_proxy_remote_execution_ssh.rb, line 103
def requires_configured_ssh?
  Plugin.settings.mode == :ssh || Plugin.settings.cockpit_integration
end
validate!() click to toggle source
# File lib/smart_proxy_remote_execution_ssh.rb, line 9
def validate!
  validate_mode!
  validate_ssh_settings!
  validate_mqtt_settings!
  validate_socket_path!
end
validate_mode!() click to toggle source
# File lib/smart_proxy_remote_execution_ssh.rb, line 33
def validate_mode!
  Plugin.settings.mode = Plugin.settings.mode.to_sym

  unless Plugin::MODES.include? Plugin.settings.mode
    raise "Mode has to be one of #{Plugin::MODES.join(', ')}, given #{Plugin.settings.mode}"
  end
end
validate_mqtt_settings!() click to toggle source
# File lib/smart_proxy_remote_execution_ssh.rb, line 41
def validate_mqtt_settings!
  return unless with_mqtt?

  raise 'mqtt_broker has to be set when pull-mqtt mode is used' if Plugin.settings.mqtt_broker.nil?
  raise 'mqtt_port has to be set when pull-mqtt mode is used' if Plugin.settings.mqtt_port.nil?

  if Plugin.settings.mqtt_tls.nil?
    Plugin.settings.mqtt_tls = [[:foreman_ssl_cert, :ssl_certificate], [:foreman_ssl_key, :ssl_private_key],
                                [:foreman_ssl_ca, :ssl_ca_file]].all? do |(client, server)|
      ::Proxy::SETTINGS[client] || ::Proxy::SETTINGS[server]
    end
  end
end
validate_socket_path!() click to toggle source
# File lib/smart_proxy_remote_execution_ssh.rb, line 107
def validate_socket_path!
  return unless Plugin.settings.mode == :'ssh'

  socket_path = File.expand_path(Plugin.settings.socket_working_dir)
  raise "Socket path #{socket_path} is too long" if socket_path.length > Plugin::SOCKET_PATH_MAX_LENGTH
end
validate_ssh_log_level!() click to toggle source
# File lib/smart_proxy_remote_execution_ssh.rb, line 82
def validate_ssh_log_level!
  wanted_level = Plugin.settings.ssh_log_level.to_s
  levels = Plugin::SSH_LOG_LEVELS
  unless levels.include? wanted_level
    raise "Wrong value '#{Plugin.settings.ssh_log_level}' for ssh_log_level, must be one of #{levels.join(', ')}"
  end

  current = ::Proxy::SETTINGS.log_level.to_s.downcase

  # regular log levels correspond to upcased ssh logger levels
  ssh, regular = [wanted_level, current].map do |wanted|
    levels.each_with_index.find { |value, _index| value == wanted }.last
  end

  if ssh < regular
    raise 'ssh_log_level cannot be more verbose than regular log level'
  end

  Plugin.settings.ssh_log_level = Plugin.settings.ssh_log_level.to_sym
end
validate_ssh_settings!() click to toggle source
# File lib/smart_proxy_remote_execution_ssh.rb, line 55
def validate_ssh_settings!
  return unless requires_configured_ssh?
  unless private_key_file
    raise "settings for `ssh_identity_key` not set"
  end

  unless File.exist?(private_key_file)
    raise "SSH private key file #{private_key_file} doesn't exist.\n"\
      "You can generate one with `ssh-keygen -t rsa -b 4096 -f #{private_key_file} -N ''`"
  end

  unless File.exist?(public_key_file)
    raise "SSH public key file #{public_key_file} doesn't exist"
  end

  if present?(Plugin.settings.ssh_user_ca_public_key_file)
    { ca_public_key_file: 'CA public key', cert_file: 'certificate' }.each do |file, label|
      file_path = public_send(file)
      unless file_path && File.exist?(file_path)
        raise "SSH #{label} file '#{file_path}' doesn't exist"
      end
    end
  end

  validate_ssh_log_level!
end
with_mqtt?() click to toggle source
# File lib/smart_proxy_remote_execution_ssh.rb, line 118
def with_mqtt?
  Proxy::RemoteExecution::Ssh::Plugin.settings.mode == :'pull-mqtt'
end

Private Class Methods

present?(value) click to toggle source
# File lib/smart_proxy_remote_execution_ssh.rb, line 124
def present?(value)
  value && !value.empty?
end