Module: KL

Defined in:
lib/kldockeragent.rb,
lib/kldockeragent/net.rb,
lib/kldockeragent/agent.rb,
lib/kldockeragent/helper.rb,
lib/kldockeragent/commands.rb

Defined Under Namespace

Modules: Agent Classes: Api, Notifier, Server

Class Method Summary collapse

Class Method Details

.Command_notifyStatusObject



22
23
24
25
26
27
28
29
30
31
32
33
# File 'lib/kldockeragent/commands.rb', line 22

def KL.Command_notifyStatus
	KL.logger.info '[command] Sending instance update...'
	data = KL.prepare_agent_data
	uri = "#{KL.config['notifier']['server']}/api/1.0/nodes/data"
	headers_auth = KL.getAuthorizationHeaders('/api/1.0/nodes/data', data.to_json)
	res = KL.net_post_json(uri, data.to_json, headers_auth)
	if res.is_a?(Net::HTTPSuccess)
		KL.logger.info '[command] Agent notification successfully executed.'
	else
		KL.logger.info '[command] An error has occurred trying to notify update.'
	end
end

.Command_registerNewAgentObject



2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# File 'lib/kldockeragent/commands.rb', line 2

def KL.Command_registerNewAgent
	KL.logger.info '[command] Registering new agent...'
	agent = KL::Agent.getUUID
	data = KL.prepare_agent_register_data(agent)
	uri = "#{KL.config['notifier']['server']}/api/1.0/nodes/register"
	res = KL.net_post_json(uri, data.to_json)

	if res.is_a?(Net::HTTPSuccess)
		response = JSON.parse(res.body)
		registry = {
			agent: agent,
			server: response['code']
		}
		KL.create_registry_file(registry)
		KL.logger.info '[command] Agent registration has been completed correctly'
	else
		KL.logger.info '[command] An error has occurred trying to register agent.'
	end
end

.configObject



34
35
36
37
38
39
40
# File 'lib/kldockeragent/helper.rb', line 34

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

.create_default_config(file, logger) ⇒ Object



6
7
8
9
10
11
12
13
14
15
16
# File 'lib/kldockeragent/helper.rb', line 6

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

.create_registry_file(data) ⇒ Object



65
66
67
68
69
70
71
72
73
74
75
# File 'lib/kldockeragent/helper.rb', line 65

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

.generateHash(url, json_data, private_key) ⇒ Object



104
105
106
107
108
# File 'lib/kldockeragent/helper.rb', line 104

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

.getApplicationIdObject



82
83
84
85
86
87
88
89
90
# File 'lib/kldockeragent/helper.rb', line 82

def KL.getApplicationId
	if (KL.server_registered)
		registry = KL.getRegistryData
		id = registry['agent']
	else
		id = SecureRandom.uuid
	end
	id
end

.getAuthorizationHeaders(url, json_data) ⇒ Object



92
93
94
95
96
97
98
99
100
101
102
# File 'lib/kldockeragent/helper.rb', line 92

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

.getRegistryDataObject



77
78
79
80
# File 'lib/kldockeragent/helper.rb', line 77

def KL.getRegistryData
	json_reg = JSON.parse(File.open("#{KL.home}/kldockeragent.registry").read)
	json_reg
end

.homeObject



29
30
31
32
# File 'lib/kldockeragent/helper.rb', line 29

def KL.home
	home = ((Process.euid == 0 and File.directory?('/var')) ? '/var/kldockerpagent' : File.expand_path(Dir.home + '/.kldockeragent'))
	home
end

.loggerObject



18
19
20
21
22
23
24
25
26
27
# File 'lib/kldockeragent/helper.rb', line 18

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

.net_post_json(url, data, headers = []) ⇒ Object



4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# File 'lib/kldockeragent/net.rb', line 4

def KL.net_post_json(url, data, headers = [])
	KL.logger.info "[net] Posting JSON to #{url} => #{data}"
	
	uri = URI(url)
	
	req = Net::HTTP::Post.new(uri)
	req.content_type = 'application/json'
	req.body = data
	req['X-Kytoonlabs-Docker-Agent'] = KL::Agent.getUUID[0..13].gsub(/\s\w+\s*$/, '')
	headers.each do |key, value|
		req[key] = value
	end

	Net::HTTP.start(uri.hostname, uri.port, :use_ssl => uri.scheme == 'https') do |http|
			 @res = http.request req
	end
	KL.logger.info "[net] Response Code: #{@res.code}, Response Body: #{@res.body}"
	@res
end

.prepare_agent_dataObject



110
111
112
113
114
115
116
117
118
# File 'lib/kldockeragent/helper.rb', line 110

def KL.prepare_agent_data
	data = {
		system_info: KL.Request_getSystemInfo,
		docker_info: KL.Request_getDockerListAllApplications,
		agent_version: KL::Agent.getVersion
	}
	data

end

.prepare_agent_register_data(hash) ⇒ Object



53
54
55
56
57
58
59
60
61
62
63
# File 'lib/kldockeragent/helper.rb', line 53

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

.publish_json(json_object, st = 200) ⇒ Object



48
49
50
51
52
# File 'lib/kldockeragent/helper.rb', line 48

def KL.publish_json(json_object, st = 200)
	status st
	content_type :json
	json_object.to_json   
end

.Request_getDockerListAllApplicationsObject



120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
# File 'lib/kldockeragent/helper.rb', line 120

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

.Request_getSystemInfoObject



137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
# File 'lib/kldockeragent/helper.rb', line 137

def KL.Request_getSystemInfo
	usw = Usagewatch
	info = {}
	if KL::Agent.is_linux
		info['os'] = 'linux'
		info['diskused'] = usw.uw_diskused.to_s
		info['diskused_perc'] = usw.uw_diskused_perc.to_s
		info['cpuused'] = usw.uw_cpuused.to_s
		info['memused'] = usw.uw_memused.to_s
		#info['cputop'] = usw.uw_cputop
		#info['memtop'] = usw.uw_memtop
	else
		info['os'] = 'not linux'
	end 
	info
end

.server_registeredObject



42
43
44
45
46
# File 'lib/kldockeragent/helper.rb', line 42

def KL.server_registered
	registryFile = "#{KL.home}/kldockeragent.registry"
	reg = File.exist?(registryFile)
	reg
end