senseobservationsystems/commonsense-ruby-lib

View on GitHub
bin/cs-console

Summary

Maintainability
Test Coverage
#!/usr/bin/env ruby

# (C) Ahmy Yulrizka (ahmy@sense-os.nl)

$0 = 'pry'

begin
  require 'pry'
rescue LoadError
  require 'rubygems'
  require 'pry'
end

require 'cs'
require 'logger'
require 'optparse'
require 'digest/md5'

DEBUG = Logger::DEBUG
ERROR = Logger::ERROR
FATAL = Logger::FATAL
INFO = Logger::INFO
UNKNOWN = Logger::UNKNOWN
WARN = Logger::WARN

CS::load_CLI

##
# OPTION Parsing
##
OPTIONS = {
  config_file: "#{ENV['HOME']}/.cs.yml",
  log_level: INFO,
  base_uri: 'https://api.sense-os.nl'
}

OptionParser.new do |opts|
  opts.banner = "Usage: cs console [options]"

  opts.on("-c", "--config", "Config file default to #{OPTIONS[:config_file]}") do |v|
    OPTIONS[:config_file] = v
  end

  opts.on("-v", "--verbosity <log_level>", "Log verbosity. <log_level> is one of: debug, error, fatal, info, unknown, warns. Default to info") do |v|
    mapping = {
      "debug" => DEBUG,
      "error" => ERROR,
      "fatal" => FATAL,
      "info" => INFO,
      "unknown" => UNKNOWN,
      "warns" => WARN
    }

    level = mapping[v.downcase]
    OPTIONS[:log_level] = level
  end

  opts.on("-b", "--base-uri COMMONSENSE_URI", "Commonsense URI") do |v|
    OPTIONS[:base_uri] = v
    puts "API : #{OPTIONS[:base_uri]}"
  end

  opts.separator ""
  opts.on_tail("-h", "--help", "Show this message") do
    puts opts
    exit
  end
end.parse!

##
# Helper Method
##

STDOUT_LOGGER = Logger.new(STDOUT)
STDOUT_LOGGER.level = OPTIONS[:log_level]

def print_error(message)
    STDERR.puts "Error: #{message}"
end

def config(key=nil)
  CS::CLI::Config::get(key)
end

def new_client(user=nil)
  client = CS::Client.new(base_uri: OPTIONS[:base_uri])

  if user == false
    return client
  end

  user_creds = nil
  if user == false
    return client
  elsif user == nil # load default user
    default_user = config["default_user"]
    user_creds = config["users"][default_user] rescue nil
  else # load user by reference
    user_creds = config["users"][user]
  end


  username = user_creds["username"]
  password = user_creds["password_md5"]

  if password.nil? || password.empty?
    password = user_creds["password"]
    password = Digest::MD5.hexdigest(password)
  end


  if client.login!(username, password, false)
    STDOUT.puts "Successfully logged in with user '#{username}'"
  else
    print_error("Failed login with user #{username} -> #{client.session.errors}")
  end

  client.session.logger = STDOUT_LOGGER
  client
end

def set_log_level(level)
  OPTIONS[:log_level] = level
  STDOUT_LOGGER.level = level
end

def const_to_level_log(value)
  mapping = {
    DEBUG => "debug",
    ERROR => "error",
    FATAL => "fatal",
    INFO => "info",
    UNKNOWN => "unknown",
    WARN => "warns"
  }

  mapping[value]
end

def log_level?
  const_to_level_log(OPTIONS[:log_level])
end

##
# MAIN
##

begin
  CS::CLI::Config::load_config(OPTIONS[:config_file])
rescue => e
  if File.exists?(OPTIONS[:config_file])
    throw e
  end
end

puts "CS console #{CS::VERSION}"
puts

# Process command line options and run Pry
Pry::CLI.parse_options