Module: Nuri::Server

Defined in:
lib/nuri/server.rb

Defined Under Namespace

Classes: Handler

Constant Summary collapse

VarDir =
(Process.euid == 0 ? '/var/nuri' : File.expand_path('~/.nuri'))
PIDFile =
"#{VarDir}/nuri.pid"
PlanFile =
"#{VarDir}/plan.json"
LogFile =
"#{VarDir}/nuri.log"
ModelFile =
"#{VarDir}/main.sfp"
ModulesDir =
"#{VarDir}/modules"
ConfigDir =
(Process.euid == 0 ? '/etc/nuri' : File.expand_path('~/.nuri'))
ConfigFile =
"#{ConfigDir}/nuri.yml"
DefaultIntervalTime =
5
DefaultPort =
1313

Instance Method Summary collapse

Instance Method Details

#get_log(total_lines = 0) ⇒ Object



153
154
155
# File 'lib/nuri/server.rb', line 153

def get_log(total_lines=0)
	(File.exist?(LogFile) ? `tail -n #{total_lines} #{LogFile}` : '')
end

#get_model(p = {}) ⇒ Object



149
150
151
# File 'lib/nuri/server.rb', line 149

def get_model(p={})
	(File.exist?(ModelFile) ? File.read(ModelFile) : '')
end

#initObject



22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
# File 'lib/nuri/server.rb', line 22

def init
	Dir.mkdir(ConfigDir, '0755') if not File.exist?(ConfigDir)

	if not File.exist?(ConfigFile)
		# generate and save default configuration file
		config = { "port" => DefaultPort,
		           "interval_time" => 5 }
		File.open(ConfigFile, 'w', 0644) { |f| f.write(YAML.dump(config)) }

		# generate an empty model file
		File.open(ModelFile, 'w', 0644) { |f| f.write('') }
	end

	#if not File.exist?(".git")
	#	system("cd #{ConfigDir}; git init 1>/dev/null 2>/dev/null")
	#	File.open("#{ConfigDir}/.gitignore", 'w', 0644) { |f| f.write("*.pid\n*.log\n") }
	#	system("cd #{ConfigDir}; git add -A . 1>/dev/null 2>/dev/null; git commit -m 'nuri init' 1>/dev/null 2>/dev/null")
	#end
end

#startObject



42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
# File 'lib/nuri/server.rb', line 42

def start
	if not File.exist?(ConfigFile)
		puts "Execute 'nuri init' first!"
		exit!(1)
	end

	if File.exist?(PIDFile)
		pid = File.read(PIDFile).to_i
		begin
			Process.kill 0, pid if pid > 0
			# Nuri server is still running
			puts "Nuri server is already running with PID #{pid}."
			exit!(1)
		rescue
		end
	end

	@logger = WEBrick::Log.new(LogFile, WEBrick::BasicLog::INFO ||
	                                    WEBrick::BasicLog::ERROR ||
	                                    WEBrick::BasicLog::FATAL ||
	                                    WEBrick::BasicLog::WARN)

	@logger.info "Reading configuration file [Wait]"
	@config = YAML.load(File.read(ConfigFile))
	@logger.info "Reading configuration file [OK]"

	['INT', 'KILL', 'HUP'].each { |signal|
		trap(signal) {
			@logger.info "Shutting down Nuri server..."
			@enabled = false
			@web_server.shutdown
		}
	}

	puts "Starting Nuri server..."
	Process.daemon

	File.open("#{PIDFile}", 'w', 0644) { |f| f.write($$.to_s) }

	start_web_server

	start_nuri_server
end

#start_nuri_serverObject



86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
# File 'lib/nuri/server.rb', line 86

def start_nuri_server
	@enabled = true
	@logger.info "Nuri server is running."

	options = { :parallel     => true,
	            :model_file   => ModelFile,
	            :apply        => true,
	            :push_modules => true,
	            :modules_dir  => ModulesDir,
	            :silent       => true }

	interval_time = (@config['interval_time'] ? @config['interval_time'].to_i : DefaultIntervalTime)

	while @enabled
		@logger.info "Executing the model."

		plan = nil
		begin
			#plan = get_plan if File.exist?(ModelFile)

			if plan.is_a?(Hash)
				File.open(PlanFile, 'w', '0644') { |f| f.write(JSON.pretty_generate(plan)) }
				@logger.info "Executing the generated plan in file #{PlanFile}."
				options[:plan] = plan
				if execute_plan(options)
					@logger.info "Execution is success!"
				else
					@logger.info "Execution is failed!"
				end
			end

		rescue Exception => e
			@logger.error "Error: #{e}\n#{e.backtrace.join("\n")}"
		end

		sleep interval_time
	end

	@logger.info "Nuri server has stopped."
end

#start_web_serverObject



127
128
129
130
131
132
133
134
135
136
137
# File 'lib/nuri/server.rb', line 127

def start_web_server
	Thread.new {
		config = { :Host => '0.0.0.0',
		           :Port => (@config['port'] ? @config['port'].to_i : DefaultPort),
		           :ServerType => WEBrick::SimpleServer,
		           :Logger => @logger }
		@web_server = WEBrick::HTTPServer.new(config)
		@web_server.mount('/', Nuri::Server::Handler, self, @logger)
		@web_server.start
	}
end

#stopObject



139
140
141
142
143
144
145
146
147
# File 'lib/nuri/server.rb', line 139

def stop
	begin
		pid = File.read(PIDFile).to_i
		Process.kill 'HUP', pid
		puts "Stopping Nuri server..."
	rescue
		puts "Nuri server is not running."
	end
end