#!/usr/bin/env perl
my
$prov
= Provision::Unix->new(
debug
=> 0 );
my
$util
=
$prov
->get_util;
Getopt::Long::GetOptions(
'action=s'
=> \
my
$action
,
'name=s'
=> \
my
$name
,
'ip=s'
=> \
my
$ip
,
'template=s'
=> \
my
$template
,
'config=s'
=> \
my
$config
,
'cpu=s'
=> \
my
$cpu
,
'disk_root=s'
=> \
my
$disk_root
,
'disk_size=s'
=> \
my
$disk_size
,
'ram=s'
=> \
my
$ram
,
'hostname=s'
=> \
my
$hostname
,
'password=s'
=> \
my
$password
,
'nameservers=s'
=> \
my
$nameservers
,
'searchdomain=s'
=> \
my
$searchdomain
,
'new_node=s'
=> \
my
$new_node
,
'connection_test'
=> \
my
$connection_test
,
'verbose'
=> \
my
$debug
,
'version'
=> \
my
$version
,
'help'
=> \
my
$help
,
) or
die
'error parsing command line options'
;
pod2usage( {
-verbose
=> 3 } )
if
$help
;
$prov
->get_version() and
exit
if
$version
;
$EUID
== 0 or
die
'Virtual OS functions require root privileges.'
;
my
$vos
= Provision::Unix::VirtualOS->new(
prov
=>
$prov
);
my
%actions
=
map
{
$_
=> 1 }
qw/ create destroy start stop restart reinstall
disable enable modify probe mount unmount console set_password migrate
create_snapshot destroy_snapshot mount_snapshot unmount_snapshot
unmount_inactive_snapshots
transition untransition
get_config publish_arp /
;
my
$questions
= {
action
=>
"the action to perform: \n\tcreate, destroy\n\tstart, stop, restart\n\tdisable, enable, mount, unmount, modify, console, probe"
,
name
=>
"the virtual environment name/ID"
,
ip
=>
"the IP address[es] (space delimited)"
,
ram
=>
'RAM (in MB)'
,
cpu
=>
'# of CPU cores available to this VE'
,
template
=>
"the OS template/tarball to use"
,
config
=>
"the configuration file"
,
disk_root
=>
"the path to the virtual OS root"
,
disk_size
=>
"the disk size (limit) "
,
hostname
=>
"the virtual hostname"
,
password
=>
"the root password"
,
nameservers
=>
"the nameservers (for /etc/resolv.conf)"
,
searchdomain
=>
"the search domain (for /etc/resolv.conf)"
,
};
$action
||=
$util
->ask(
$questions
->{action},
default
=>
'create'
);
$action
=
lc
(
$action
);
$action
=~ s/\s//g;
pod2usage( {
-verbose
=> 1 } )
if
!
$actions
{
$action
};
$name
||=
$util
->ask(
$questions
->{name} );
$debug
=
defined
$debug
?
$debug
: 0;
my
%request
= (
debug
=>
$debug
,
fatal
=> 0,
name
=>
lc
(
$name
) );
create()
if
$action
eq
'create'
||
$action
eq
'reinstall'
;
modify()
if
$action
eq
'modify'
;
set_password()
if
$action
eq
'set_password'
;
migrate()
if
$action
eq
'migrate'
;
publish_arp()
if
$action
eq
'publish_arp'
;
foreach
(
keys
%request
) {
delete
$request
{
$_
}
if
!
defined
$request
{
$_
}; };
print
Dumper(
$vos
->
$action
(
%request
) );
$prov
->error(
"dump error log"
,
fatal
=> 0 )
if
$debug
;
print
"done.\n"
;
exit
;
sub
create {
$request
{ip} =
$ip
||
$util
->ask(
$questions
->{ip} );
$request
{hostname} =
$hostname
||
$util
->ask(
$questions
->{hostname} );
$request
{template} =
$template
||
$util
->ask(
$questions
->{template},
default
=>
'centos-5-i386-default'
);
$request
{config} =
$config
||
$util
->ask(
$questions
->{config} );
$request
{cpu} =
$cpu
||
$util
->ask(
$questions
->{cpu} );
$request
{ram} =
$ram
;
$request
{disk_size} =
$disk_size
;
if
( !
$request
{config} ) {
$request
{ram} ||=
$util
->ask(
$questions
->{ram} );
$request
{disk_size} ||=
$util
->ask(
$questions
->{disk_size} );
};
$request
{nameservers} =
$nameservers
||
$util
->ask(
$questions
->{nameservers} );
$request
{searchdomain} =
$searchdomain
||
$util
->ask(
$questions
->{searchdomain} );
$request
{password} =
$password
||
$util
->ask(
$questions
->{password} );
warn
"creating!\n"
;
$prov
->audit(
"dispatching creation request"
);
}
sub
migrate {
$request
{new_node} =
$new_node
||
$util
->ask(
"the destination HW node hostname or IP"
);
$request
{connection_test} =
$connection_test
||
$util
->ask(
"only test the connection"
,
default
=> 0 );
}
sub
modify {
$request
{ip} =
$ip
||
$util
->ask(
$questions
->{ip} );
$request
{ram} =
$ram
||
$util
->ask(
$questions
->{ram} );
$request
{disk_size} =
$disk_size
||
$util
->ask(
$questions
->{disk_size} );
$request
{nameservers} =
$nameservers
||
$util
->ask(
$questions
->{nameservers} );
$request
{searchdomain} =
$searchdomain
||
$util
->ask(
$questions
->{searchdomain} );
$request
{hostname} =
$hostname
||
$util
->ask(
$questions
->{hostname} );
$request
{cpu} =
$cpu
||
$util
->ask(
$questions
->{cpu} );
$request
{password} =
$password
||
$util
->ask(
$questions
->{password} );
}
sub
publish_arp {
delete
$request
{name};
$request
{ip} =
$ip
||
$util
->ask(
$questions
->{ip} );
};
sub
set_password {
$request
{password} =
$password
||
$util
->ask(
$questions
->{password} );
}
Hide Show 80 lines of Pod