require 'webrick' require 'webrick/https' require 'usagewatch' module KL def KL.create_default_config(file, logger) File.open(file, File::RDWR|File::CREAT, 0644) { |f| f.flock(File::LOCK_EX) value = '{"api":{"port":3344,"ssl":false},"notifier":{"server":"https://hub.kytoonlabs.com:4444","rate":120}}' f.rewind f.write(value.to_s) f.flush f.truncate(f.pos) } logger.info "[config] Default config file has been created at {#{file}}" if logger end def KL.logger home = KL.home Dir.mkdir(home, 0700) if not File.exist?(home) logFile = "#{home}/kldockeragent.log" log = WEBrick::Log.new(logFile, WEBrick::BasicLog::INFO || WEBrick::BasicLog::ERROR || WEBrick::BasicLog::FATAL || WEBrick::BasicLog::WARN) log end def KL.home home = ((Process.euid == 0 and File.directory?('/var')) ? '/var/kldockerpagent' : File.expand_path(Dir.home + '/.kldockeragent')) home end def KL.config configFile = "#{KL.home}/kldockeragent.json" KL.create_default_config(configFile, KL.logger) if !File.exist?(configFile) config_json = File.read(configFile) config_data = JSON.parse(config_json) config_data end def KL.server_registered registryFile = "#{KL.home}/kldockeragent.registry" reg = File.exist?(registryFile) reg end def KL.publish_json(json_object, st = 200) status st content_type :json json_object.to_json end def KL.prepare_agent_register_data(hash) data = { private_hash: hash, hostname: `hostname`.gsub("\n",""), system_info: `uname -a`.gsub("\n",""), docker_version: `docker --version`.gsub("\n","").gsub("Docker version ",""), agent_version: KL::Agent.getVersion, ip_address: IPSocket.getaddress(Socket.gethostname) } data end def KL.create_registry_file(data) file = "#{KL.home}/kldockeragent.registry" File.open(file, File::RDWR|File::CREAT, 0644) { |f| f.flock(File::LOCK_EX) f.rewind f.write(data.to_json.to_s) f.flush f.truncate(f.pos) } logger.info "[config] Registry config file has been created at {#{file}}" if logger end def KL.getRegistryData json_reg = JSON.parse(File.open("#{KL.home}/kldockeragent.registry").read) json_reg end def KL.getApplicationId if (KL.server_registered) registry = KL.getRegistryData id = registry['agent'] else id = SecureRandom.uuid end id end def KL.getAuthorizationHeaders(url, json_data) headers = {} if (KL.server_registered) registry = KL.getRegistryData hash_data = KL.generateHash(url, json_data, registry['agent']) auth_code = "#{registry['server']}:#{hash_data}" headers = {} headers['Authorization'] = auth_code end headers end def KL.generateHash(url, json_data, private_key) data = "#{url}#{json_data}" hash_data = OpenSSL::HMAC.hexdigest(OpenSSL::Digest.new('sha1'), private_key, data) hash_data end def KL.prepare_agent_data data = { system_info: KL.Request_getSystemInfo, docker_info: KL.Request_getDockerListAllApplications, agent_version: KL::Agent.getVersion } data end def KL.Request_getDockerListAllApplications filter = '_klac' apps = Array.new query = `docker ps --filter="name=#{filter}" --format="{{.ID}}::{{.Names}}::{{.Status}}::{{.Image}}"` query.gsub!(/\r\n?/, "\n") query.each_line do |line| data = line.split('::') apps.push({ 'id' => data[0], 'name' => data[1].gsub(filter,""), 'status'=>data[2], 'image'=>data[3].gsub("\n","") }) end return apps end def KL.Request_getSystemInfo usw = Usagewatch info = {} if KL::Agent.is_linux info['os'] = 'linux' info['diskused'] = usw.uw_diskused info['diskused_perc'] = usw.uw_diskused_perc info['cpuused'] = usw.uw_cpuused info['memused'] = usw.uw_memused info['cputop'] = usw.uw_cputop info['memtop'] = usw.uw_memtop else info['os'] = 'not linux' end info end end