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