Improved database_for_scripts.rb
[mwamko.git] / script / vz-start
blob905289cd0cf19d77e643971f42f099e84290955f
1 #!/usr/bin/env ruby
3 SCRIPT_DIR = File.dirname(File.expand_path(__FILE__))
4 SCRIPT_NAME = $0.split('/')[-1]
6 SSH = '/usr/bin/ssh' # TODO: pipe to ssh istead of using
7 # the vzctl wrappers
8 VZLIST = '/usr/sbin/vzlist'
9 VZCTL = '/usr/sbin/vzctl'
12 require "/etc/mwamko/available_ip_addresses.range"
14 if ARGV.size != 1 and ARGV[1] != '--kill-daemon'
16 STDERR.puts "SYNOPSIS:"
17 STDERR.puts " #{SCRIPT_NAME} \e[4mVEID\e[24m"
18 STDERR.puts " #{SCRIPT_NAME} \e[4mVEID\e[24m --kill-daemon"
19 STDERR.puts ""
20 STDERR.puts "DESCRIPTION:"
21 STDERR.puts " --kill_daemon "
22 STDERR.puts " Kills the daemon and removes related PID files from /tmp"
24 exit
25 end
27 # Check ARGV
28 raise 'Unsafe VEID' if !(ARGV[0] =~ /^[0-9]*$/)
30 $VEID = ARGV[0].to_i
32 if ARGV[1] != '--kill-daemon'
33 # Check against vzlist
34 out = `#{VZLIST} -a --no-header -o veid,status`
36 ve_found = false
37 current_list = out.collect do |line|
39 ve, status = line.strip.split(' ')
40 ve = ve.to_i
41 status = status.strip
43 if $VEID == ve
44 ve_found = true
45 if status != 'stopped'
46 STDERR.puts "VE #{$VEID} is already #{status}"
47 exit
48 end
49 end
50 end
52 if !ve_found
53 STDERR.puts "VE #{$VEID} does not exist on the system"
54 exit
55 end
56 end
59 # All checks passed. Time to define and start the daemon
61 require "#{SCRIPT_DIR}/../lib/ciconia_daemonizer"
63 class CiconiaDaemonizer < Daemon::Base
64 def self.start
65 raise 'no $VEID' if $VEID == nil
67 run_and_record("echo > /dev/null")
69 begin
70 require "#{SCRIPT_DIR}/../lib/database_for_scripts"
71 rescue => detail
72 @@ruby_errors =
73 detail.message + "\n" +
74 detail.backtrace.join("\n")
75 run_and_record("echo > /dev/null")
76 end
78 local_ips = []
79 begin
80 ve = VirtualEnvironment.find_by_veid($VEID.to_i)
81 ve.grab_available_ip
82 OpenVZ.set_ip_in_ve(ve)
84 ve.save!
86 rescue => detail
87 @@ruby_errors =
88 detail.message + "\n" +
89 detail.backtrace.join("\n")
90 run_and_record("echo > /dev/null")
91 end
93 run_and_record("#{VZCTL} start #{$VEID}")
95 # if !@@has_stderr and !@@has_rubyerr
96 # begin
97 # local_ips =
98 # LocalIP.find_all_by_veid($VEID.to_i).collect {|lip| lip.ip}
100 # ip_list =
101 # local_ips.collect { |lip| "--ipadd #{lip}" }.join(' ')
103 # unless ip_list.empty?
104 # run_and_record("#{VZCTL} set #{$VEID} #{ip_list} --save")
105 # end
106 # rescue => detail
107 # @@ruby_errors =
108 # detail.message + "\n" +
109 # detail.backtrace.join("\n")
110 # run_and_record("echo > /dev/null")
111 # end
113 # end
116 p @@std_errors_txt
117 # The part in () is a hack - it ignores vzqouta errors
118 if (@@std_errors_txt =~ /vzquota/ or (!@@has_stderr)) and !@@has_rubyerr
120 # Wait for SSHD to come up
121 loop do
122 if `#{VZCTL} exec #{$VEID} "ps | grep sshd"`.empty?
123 sleep 2
124 else
125 break
129 begin
130 ve = VirtualEnvironment.find_by_veid($VEID.to_i)
131 ve.status = 'started'
132 ve.updated_on = Time.now
134 if ve.setup_needed
135 require "#{SCRIPT_DIR}/../lib/password_gen"
137 upass = PasswordGen.generate_pronounceable
138 uname = User.find(ve.uid).name
140 OpenVZ.set_ve_userpassw(ve.veid, uname, upass)
141 OpenVZ.add_user_to_ve_sudoers(uname, ve.veid)
142 OpenVZ.ve_DNS_config(ve.veid)
143 OpenVZ.ssh_keygen(ve.veid)
145 ve.setup_needed = false
148 ve.save!
150 rescue => detail
151 @@ruby_errors =
152 detail.message + "\n" +
153 detail.backtrace.join("\n")
154 run_and_record("echo > /dev/null")
159 if @@has_rubyerr
160 `mv #{@@pid_file} #{@@pid_file[0..-5]}.rubyerr`
161 elsif @@has_stderr
162 `mv #{@@pid_file} #{@@pid_file[0..-5]}.stderr`
163 elsif @@has_stdout
164 `mv #{@@pid_file} #{@@pid_file[0..-5]}.out`
165 else
166 `rm #{@@pid_file}`
172 def self.stop
173 `kill #{@child_pid}`
178 # The daemon is ready.
179 # Now it is time to run it, respecting the Queueing policy
181 task_identifier = "#{SCRIPT_NAME} #{$VEID}"
183 if ARGV[1] != '--kill-daemon'
184 CiconiaDaemonizer.daemonize(task_identifier, 0)
185 exit
189 # Enter the Queue
190 # * If it is your turn then it is time to daemonize and run
191 # * Else check if the queue is running
192 # * If it is, then put yourself in the queue and exit this script
193 # * If not, then safe start the Queue
194 ##require "#{SCRIPT_DIR}/../lib/queue"
195 ##q = Queue.new(SCRIPT_NAME, task_identifier)
196 ##q.enter
198 ##CiconiaDaemonizer.daemonize(task_identifier, 0) rescue nil
200 # Figure out the next script in the queue
201 # * If there is one then run it
202 ##q.exit