class Jailofficer::Jail
defines a singe jail
Attributes
cfgfile[RW]
name[RW]
options[RW]
Public Class Methods
new(name)
click to toggle source
# File lib/jailofficer/jail.rb, line 16 def initialize(name) @name = name @options = { reserved: [] } fileselector loadfile if File.file?(cfgfile) end
Public Instance Methods
create()
click to toggle source
# File lib/jailofficer/jail.rb, line 52 def create writefile rc_add zfs_create end
destroy()
click to toggle source
# File lib/jailofficer/jail.rb, line 58 def destroy rc_del zfs_destroy end
disable()
click to toggle source
# File lib/jailofficer/jail.rb, line 67 def disable rc_del end
enable()
click to toggle source
# File lib/jailofficer/jail.rb, line 63 def enable rc_add end
get(key)
click to toggle source
# File lib/jailofficer/jail.rb, line 28 def get(key) @options[key] end
restart()
click to toggle source
# File lib/jailofficer/jail.rb, line 32 def restart start if stop end
running?()
click to toggle source
# File lib/jailofficer/jail.rb, line 44 def running? running = [] getjails['running'].each do |jail| running << jail['hostname'] end running.include?(@name) end
set(key, value)
click to toggle source
# File lib/jailofficer/jail.rb, line 23 def set(key, value) @options[key] = value writefile end
start()
click to toggle source
# File lib/jailofficer/jail.rb, line 36 def start execute("service jail start #{@name}") end
stop()
click to toggle source
# File lib/jailofficer/jail.rb, line 40 def stop execute("service jail stop #{@name}") end
Private Instance Methods
execute(command)
click to toggle source
# File lib/jailofficer/jail.rb, line 91 def execute(command) shell_env = 'LANG=C' cmd = "#{shell_env} #{command}" _stdout, _stderr, status = Open3.capture3(cmd) status.exitstatus.zero? end
fileselector()
click to toggle source
# File lib/jailofficer/jail.rb, line 104 def fileselector @cfgfile = "#{Config::JCONFDIR}/jail.#{@name}.conf" end
getjails()
click to toggle source
# File lib/jailofficer/jail.rb, line 135 def getjails list_raw = `sysrc jail_list`.split running_raw = JSON.parse(`jls --libxo json`) { list_raw[0].chop => list_raw.drop(1), 'running' => running_raw['jail-information']['jail'] } end
loadfile()
click to toggle source
# File lib/jailofficer/jail.rb, line 108 def loadfile filelines = File.readlines(@cfgfile) filelines.each do |line| if line.match?('=') sl = line.split('=') @options[sl[0].strip] = sl[1].strip.chop else @options[:reserved].append(line.strip.chop) end end @options[:reserved] = @options[:reserved].drop(1).clip @name = filelines[0].strip.partition(' ').first end
rc_add()
click to toggle source
# File lib/jailofficer/jail.rb, line 73 def rc_add Sysrc.set('jail_list', '+=', @name) end
rc_del()
click to toggle source
# File lib/jailofficer/jail.rb, line 77 def rc_del Sysrc.set('jail_list', '-=', @name) end
template()
click to toggle source
# File lib/jailofficer/jail.rb, line 122 def template %{ <%= @name %> { <% @options[:reserved].each do |option| %> <%= option %>; <% end %> <% @options.except(:reserved).each do |key, value| %> <%= key %> = <%= value %>; <% end %> } } end
writefile()
click to toggle source
# File lib/jailofficer/jail.rb, line 98 def writefile cfgcontent = ERB.new(template).result(binding).remove_empty_lines puts cfgcontent File.open(@cfgfile, 'w') { |file| file.write(cfgcontent) } end
zfs_create()
click to toggle source
# File lib/jailofficer/jail.rb, line 81 def zfs_create fs = ZFS(format('%<base>s/%<name>s', { base: Config::BASEVOLUME, name: @name })) fs.create until fs.exist? end
zfs_destroy()
click to toggle source
# File lib/jailofficer/jail.rb, line 86 def zfs_destroy fs = ZFS(format('%<base>s/%<name>s', { base: Config::BASEVOLUME, name: @name })) fs.destroy! if fs.exist? end