/usr/local/CPAN/Provision-Unix/Provision/Unix/VirtualOS/FreeBSD/Ezjail.pm
package Provision::Unix::VirtualOS::FreeBSD::Ezjail;
our $VERSION = '0.11';
use warnings;
use strict;
use English qw( -no_match_vars );
use Params::Validate qw(:all);
my ( $prov, $vos, $util );
sub new {
my $class = shift;
my %p = validate( @_, { 'vos' => { type => OBJECT }, } );
$vos = $p{vos};
$prov = $vos->{prov};
my $self = { prov => $prov };
bless( $self, $class );
$prov->audit( $class . sprintf( " loaded by %s, %s, %s", caller ) );
$util = $prov->get_util;
return $self;
}
sub create {
my $self = shift;
# Templates in ezjail are 'flavours' or archives
# ezjail-admin create -f default [-r jailroot] [-i|c -s 512]
# ezjail-admin create -a archive
my $admin = $util->find_bin( 'ezjail-admin', debug => 0 );
my $jails_root = _get_jails_root() || '/usr/jails';
if ( $vos->{disk_root}
&& $vos->{disk_root} ne "$jails_root/$vos->{name}" )
{
$admin .= " -r $vos->{disk_root}";
}
my $template = $vos->{template} || 'default';
if ($template) {
if ( -d "$jails_root/flavours/$template" ) {
$prov->audit("detected ezjail flavour $template");
$admin .= " -f $template";
}
elsif ( -f "$jails_root/$template.tgz" ) {
$prov->audit("installing from archive $template");
$admin .= " -a $jails_root/$template.tgz";
}
else {
$prov->error( "You chose the template ($template) but it is not defined as a flavor in $jails_root/flavours or an archive at $jails_root/$template.tgz"
);
}
}
$admin .= " -s $vos->{disk_size}" if $vos->{disk_size};
$prov->audit("cmd: $admin $vos->{name} $vos->{ip}");
return 1 if $vos->{test_mode};
return $util->syscmd( $admin );
}
sub is_present {
my $self = shift;
my $homedir = $self->get_ve_home();
return $homedir if -d $homedir;
return;
};
sub console {
my $self = shift;
my $ctid = $vos->{name};
my $cmd = $util->find_bin( 'ezjail-admin', debug => 0 );
exec "$cmd console $ctid";
};
sub get_ve_home {
my $self = shift;
my $ctid = $vos->{name};
return "/usr/jails/$vos->{name}";
};
sub _get_jails_root {
my $r = `grep '^ezjail_jaildir' /usr/local/etc/ezjail.conf`;
if ($r) {
chomp $r;
( undef, $r ) = split /=/, $r;
return $r;
}
return undef;
}
1;
__END__