| 
									
										
										
										
											2014-05-08 15:34:26 +04:00
										 |  |  | require 'devops-client/name' | 
					
						
							|  |  |  | require "devops-client/version" | 
					
						
							|  |  |  | require "devops-client/handler/handler_factory" | 
					
						
							|  |  |  | require "exceptions/not_found" | 
					
						
							|  |  |  | require "exceptions/invalid_query" | 
					
						
							|  |  |  | require "exceptions/devops_exception" | 
					
						
							|  |  |  | require "optparse" | 
					
						
							|  |  |  | require "devops-client/i18n" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | module DevopsClient | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   DEVOPS_HOME = "#{ENV["HOME"]}/.devops/" | 
					
						
							|  |  |  |   # properties file key=value | 
					
						
							|  |  |  |   @@config_file = File.join(DEVOPS_HOME, "devops-client.conf") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def self.config_file | 
					
						
							|  |  |  |     @@config_file | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def self.run | 
					
						
							|  |  |  |     DevopsClient::get_config_file_option | 
					
						
							|  |  |  |     config = DevopsClient::read_config(@@config_file) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     I18n.language=(config[:locale] || "en") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if ARGV.include? "--completion" | 
					
						
							|  |  |  |       init_completion | 
					
						
							|  |  |  |       exit | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if config[:host].nil? | 
					
						
							|  |  |  |       abort(I18n.t("config.invalid.host"), :file => @@config_file) | 
					
						
							|  |  |  |     end | 
					
						
							| 
									
										
										
										
											2015-11-13 18:49:32 +03:00
										 |  |  |     [:api, :username].each do |key| | 
					
						
							| 
									
										
										
										
											2014-07-11 11:19:01 +04:00
										 |  |  |       if config[key].nil? or config[key].empty? | 
					
						
							| 
									
										
										
										
											2014-05-08 15:34:26 +04:00
										 |  |  |         abort(I18n.t("config.invalid.empty", :file => @@config_file, :key => key)) | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  |     configure_proxy config | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     host = config[:host] | 
					
						
							| 
									
										
										
										
											2014-07-11 11:19:01 +04:00
										 |  |  |     default = {:username => config[:username], :api => config[:api], :host => config[:host], :prefix => ((config[:prefix].nil? or config[:prefix].empty?) ? nil : config[:prefix])} | 
					
						
							| 
									
										
										
										
											2014-05-08 15:34:26 +04:00
										 |  |  |     auth = {:username => config[:username], :password => config[:password], :type => "basic"} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     handler = HandlerFactory.create(ARGV[0], host, auth, default) | 
					
						
							|  |  |  |     result = handler.handle | 
					
						
							|  |  |  |     if result.is_a?(Hash) | 
					
						
							|  |  |  |       puts result["message"] | 
					
						
							|  |  |  |     else | 
					
						
							| 
									
										
										
										
											2016-02-12 16:18:17 +03:00
										 |  |  |       puts result if result | 
					
						
							| 
									
										
										
										
											2014-05-08 15:34:26 +04:00
										 |  |  |     end | 
					
						
							|  |  |  |   rescue OptionParser::InvalidOption => e | 
					
						
							|  |  |  |     puts e.message | 
					
						
							|  |  |  |     exit(11) | 
					
						
							|  |  |  |   rescue NotFound => e | 
					
						
							| 
									
										
										
										
											2018-04-04 22:44:39 +03:00
										 |  |  |     puts e.message | 
					
						
							| 
									
										
										
										
											2014-05-08 15:34:26 +04:00
										 |  |  |     exit(12) | 
					
						
							|  |  |  |   rescue InvalidQuery => e | 
					
						
							|  |  |  |     puts "Invalid query: #{e.message}" | 
					
						
							|  |  |  |     exit(13) | 
					
						
							|  |  |  |   rescue DevopsException => e | 
					
						
							|  |  |  |     puts I18n.t("log.error", :msg => e.message) | 
					
						
							|  |  |  |     exit(14) | 
					
						
							|  |  |  |   rescue => e | 
					
						
							|  |  |  |     puts I18n.t("log.error", :msg => e.message) | 
					
						
							|  |  |  |     raise e | 
					
						
							|  |  |  |   rescue Interrupt | 
					
						
							|  |  |  |     puts "\nInterrupted" | 
					
						
							|  |  |  |     exit(15) | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   PROXY_TYPE_NONE = "none" | 
					
						
							|  |  |  |   PROXY_TYPE_SYSTEM = "system" | 
					
						
							|  |  |  |   PROXY_TYPE_CUSTOM = "custom" | 
					
						
							|  |  |  |   PROXY_TYPES = [PROXY_TYPE_NONE, PROXY_TYPE_SYSTEM, PROXY_TYPE_CUSTOM] | 
					
						
							|  |  |  |   PROXY_ENV = ["all_proxy", "ALL_PROXY", "proxy", "PROXY", "http_proxy", "HTTP_PROXY", "https_proxy", "HTTPS_PROXY"] | 
					
						
							|  |  |  |   def self.configure_proxy config | 
					
						
							|  |  |  |     config[:proxy_type] = PROXY_TYPE_NONE if config[:proxy_type].nil? | 
					
						
							|  |  |  |     case config[:proxy_type] | 
					
						
							|  |  |  |     when PROXY_TYPE_SYSTEM | 
					
						
							|  |  |  |       nil | 
					
						
							|  |  |  |     when PROXY_TYPE_NONE | 
					
						
							|  |  |  |       PROXY_ENV.each {|k| ENV[k] = nil} | 
					
						
							|  |  |  |     when PROXY_TYPE_CUSTOM | 
					
						
							|  |  |  |       ["http_proxy", "HTTP_PROXY"].each {|k| ENV[k] = config[:http_proxy]} | 
					
						
							|  |  |  |     else | 
					
						
							|  |  |  |       abort(I18n.t("config.invalid.proxy_type", :file => @@config_file, :values => PROXY_TYPES.join(", "))) | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def self.read_config file | 
					
						
							|  |  |  |     config = {} | 
					
						
							|  |  |  |     if File.exists? file | 
					
						
							|  |  |  |       File.open(file, "r") do |f| | 
					
						
							|  |  |  |         f.each_line do |line| | 
					
						
							|  |  |  |           line.strip! | 
					
						
							|  |  |  |           next if line.empty? or line.start_with?("#") | 
					
						
							|  |  |  |           buf = line.split("=") | 
					
						
							|  |  |  |           config[buf[0].strip.to_sym] = buf[1].strip if !(buf[1].nil? or buf[1].empty?) | 
					
						
							|  |  |  |         end | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  |     else | 
					
						
							|  |  |  |       config = set_default_config(file) | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  |     config | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def self.set_default_config file | 
					
						
							|  |  |  |     locales = I18n.locales | 
					
						
							| 
									
										
										
										
											2018-04-04 22:44:39 +03:00
										 |  |  |     config = {:api => "v3", :locale => "en"} | 
					
						
							| 
									
										
										
										
											2014-05-08 15:34:26 +04:00
										 |  |  |     I18n.language = config[:locale] | 
					
						
							| 
									
										
										
										
											2014-07-11 11:19:01 +04:00
										 |  |  |     puts I18n.t("log.warn", :msg => I18n.t("config.not_exist", :file => file)) | 
					
						
							| 
									
										
										
										
											2014-05-08 15:34:26 +04:00
										 |  |  |     config[:locale] = begin | 
					
						
							|  |  |  |       l = get_config_parameter(I18n.t("config.property.lang", :langs => locales.join(", ")), config[:locale]) | 
					
						
							|  |  |  |       raise ArgumentError unless locales.include?(l) | 
					
						
							|  |  |  |       I18n.language = l | 
					
						
							|  |  |  |       l | 
					
						
							|  |  |  |     rescue ArgumentError | 
					
						
							|  |  |  |       retry | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  |     config[:host] = get_config_parameter(I18n.t("config.property.host")) | 
					
						
							| 
									
										
										
										
											2014-07-11 11:19:01 +04:00
										 |  |  |     config[:prefix] = get_config_parameter(I18n.t("config.property.prefix")) | 
					
						
							| 
									
										
										
										
											2014-05-08 15:34:26 +04:00
										 |  |  |     config[:api] = get_config_parameter(I18n.t("config.property.api"), config[:api]) | 
					
						
							|  |  |  |     config[:username] = get_config_parameter(I18n.t("config.property.username")) | 
					
						
							|  |  |  |     config[:password] = get_config_parameter(I18n.t("config.property.password")) | 
					
						
							|  |  |  |     begin | 
					
						
							|  |  |  |       config[:proxy_type] = get_config_parameter(I18n.t("config.property.proxy_type")) | 
					
						
							|  |  |  |       raise ArgumentError unless PROXY_TYPES.include?(config[:proxy_type]) | 
					
						
							|  |  |  |     rescue ArgumentError | 
					
						
							|  |  |  |       retry | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  |     if config[:proxy_type] == PROXY_TYPE_CUSTOM | 
					
						
							|  |  |  |       config[:http_proxy] = get_config_parameter(I18n.t("config.property.http_proxy")) | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     dir = File.dirname(@@config_file) | 
					
						
							|  |  |  |     require "fileutils" | 
					
						
							|  |  |  |     FileUtils.mkdir(dir) unless File.exists? dir | 
					
						
							|  |  |  |     File.open(file, "w") do |f| | 
					
						
							|  |  |  |       config.each do |k,v| | 
					
						
							|  |  |  |         f.puts "#{k.to_s}=#{v}" | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  |     puts I18n.t("config.created", :file => file) | 
					
						
							|  |  |  |     config | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def self.get_config_parameter msg, default=nil | 
					
						
							|  |  |  |     print(msg + (default.nil? ? ": " : "(#{default}): ")) | 
					
						
							|  |  |  |     p = STDIN.gets.strip | 
					
						
							|  |  |  |     return (p.empty? ? default : p) | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def self.get_config_file_option | 
					
						
							|  |  |  |     ARGV.each_index do |i| | 
					
						
							|  |  |  |       if ARGV[i] == "-c" or ARGV[i] == "--config" | 
					
						
							|  |  |  |         if ARGV[i+1] !~ /^-.*/ and ARGV[i+i] !~ /^--.*/ | 
					
						
							|  |  |  |           @@config_file = ARGV[i+1] | 
					
						
							|  |  |  |           ARGV.delete_at(i) | 
					
						
							|  |  |  |           ARGV.delete_at(i) | 
					
						
							|  |  |  |         else | 
					
						
							|  |  |  |           puts I18n.t("log.error", :msg => I18n.t("config.invalid.parameter")) | 
					
						
							|  |  |  |           exit(3) | 
					
						
							|  |  |  |         end | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def self.init_completion | 
					
						
							|  |  |  |     spec = Gem::Specification.find_by_name(DevopsClient::NAME) | 
					
						
							|  |  |  |     gem_root = spec.gem_dir | 
					
						
							|  |  |  |     path = File.join(gem_root, "completion", "devops_complete.sh") | 
					
						
							|  |  |  |     require "fileutils" | 
					
						
							|  |  |  |     FileUtils.cp(path, DEVOPS_HOME) | 
					
						
							|  |  |  |     file = File.join(DEVOPS_HOME, "devops_complete.sh") | 
					
						
							|  |  |  |     puts I18n.t("completion.message", :file => file) | 
					
						
							|  |  |  |     puts "\n\e[32m#{I18n.t("completion.put", :file => file)}\e[0m" | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | end |