|
|
(3 intermediate revisions by the same user not shown) |
Line 1: |
Line 1: |
− | # dhcp.pm | + | <pre> |
| + | # Dummy.pm |
| # | | # |
− | # The dhcp plugin | + | # This file is a sample for VNUML extension plugins. It can be used |
| + | # as a template to implement custom user plugins. Note that, in order |
| + | # to conform the VNUML plugins API, the modules has to implement all |
| + | # the methods. |
| | | |
− | package dhcp; | + | package dummy; |
| | | |
| @ISA = qw(Exporter); | | @ISA = qw(Exporter); |
Line 14: |
Line 18: |
| finalizePlugin); | | finalizePlugin); |
| | | |
− | ###########################################################
| |
− | # Modules no import
| |
− | ###########################################################
| |
| use strict; | | use strict; |
− | use Net::Netmask;
| |
− | use XML::DOM; # XML management library
| |
− | use File::Basename; # File management library
| |
− | use Switch;
| |
− | use Socket; # To resolve hostnames to IPs
| |
− | use XML::DOM::ValParser; # To check DTD
| |
− |
| |
− |
| |
− | ###########################################################
| |
− | # Global variables
| |
− | ###########################################################
| |
− |
| |
− | my $globalNode;
| |
− | my $valid_fail;
| |
− |
| |
− |
| |
− | ###########################################################
| |
− | # Subroutines
| |
− | ###########################################################
| |
− |
| |
− | ###########################################################
| |
− | # createPlugin
| |
− | #
| |
− | # To be called always, just before starting procesing the scenario specification
| |
− | #
| |
− | # Arguments:
| |
− | # - the operation mode ("t","x","d" or "P")
| |
− | # - the plugin configuration file
| |
− | #
| |
− | # Returns:
| |
− | # - an error message or 0 if all is ok
| |
− | #
| |
− | ###########################################################
| |
| | | |
| + | # createPlugin |
| + | # |
| + | # To be called always, just before starting procesing the scenario specification |
| + | # |
| + | # Arguments: |
| + | # - the operation mode ("t","x","d" or "P") |
| + | # - the plugin configuration file |
| + | # |
| + | # Returns: |
| + | # - an error message or 0 if all is ok |
| + | # |
| sub createPlugin { | | sub createPlugin { |
| | | |
− | my $self = shift; | + | my $self = shift; |
| my $mode = shift; | | my $mode = shift; |
| my $conf = shift; | | my $conf = shift; |
− | | + | |
− | my $error; | + | # Sample code |
− | | + | print "dummy plugin: creating in mode $mode with file $conf\n"; |
− | print "dhcp: $conf\n"; | + | |
− | eval { | + | # Example of error message returning: |
− | $error = &checkConfigFile($conf);
| |
− | }; | |
− | | |
− | if ($@) {
| |
− | $error = $@;
| |
− | }
| |
− | return $error;
| |
− | }
| |
− | | |
− | ###########################################################
| |
− | # bootingCreateFiles
| |
| # | | # |
− | # To be called during "t" mode, for each vm in the scenario | + | # return "an error has occur in dummy plugin" |
| # | | # |
− | # Arguments: | + | return 0; |
− | # - vm name
| + | } |
− | #
| |
− | # Returns:
| |
− | # - a hashname which keys are absolute pathnames of files in vm filesystem and
| |
− | # values the the pathname of the file in the host filesystem. The file in the
| |
− | # host filesytesm is removed after VNUML processed it, so temporal files in
| |
− | # /tmp are preferable)
| |
− | #
| |
− | ###########################################################
| |
| | | |
| + | # bootingCreateFiles |
| + | # |
| + | # To be called during "t" mode, for each vm in the scenario |
| + | # |
| + | # Arguments: |
| + | # - vm name |
| + | # |
| + | # Returns: |
| + | # - a hashname which kyes are absolute pathnames of files in vm filesystem and |
| + | # values the the pathname of the file in the host filesystem. The file in the |
| + | # host filesytesm is removed after VNUML processed it, so temporal files in |
| + | # /tmp are preferable) |
| + | # |
| sub bootingCreateFiles { | | sub bootingCreateFiles { |
| | | |
− | my $self = shift; | + | my $self = shift; |
− | my $vm = shift; | + | my $vm = shift; |
− | | + | |
| my %files; | | my %files; |
− | my $type; | + | |
− | | + | # Sample code |
− | my $virtualmList = $globalNode->getElementsByTagName("vm"); | + | print "dummy plugin: booting create files for vm $vm\n"; |
− | my $longitud = $virtualmList->getLength;
| + | system("touch /tmp/boot1.$vm"); |
− | | + | system("touch /tmp/boot2.$vm"); |
− | for ( my $m = 0 ; $m < $longitud ; $m++ ){ | + | |
− |
| + | $files{"/etc/init.d/boot1"} = "/tmp/boot1.$vm"; |
− | my $virtualm = $virtualmList->item($m);
| + | $files{"/etc/init.d/boot2"} = "/tmp/boot2.$vm"; |
− | my $virtualm_name = $virtualm->getAttribute("name");
| + | |
− | | |
− | if ( $virtualm_name eq $vm ){
| |
− |
| |
− | $type = $virtualm->getAttribute("type");
| |
− | | |
− | switch ($type) {
| |
− | | |
− | case "dhcp3" {
| |
− | | |
− | my $serverTagList = $virtualm->getElementsByTagName("server");
| |
− | my $numservers = $serverTagList->getLength;
| |
− | if ( $numservers == 1 ) {
| |
− | | |
− | # open filehandle to create /etc/dhcp3/dhcpd.conf file
| |
− | my $server_file = "/tmp/$vm" . "_server.conf";
| |
− | chomp( my $date = `date` );
| |
− | open( SERVER, ">$server_file" ) or $files{"ERROR"} = "Cannot open $server_file file";
| |
− | | |
− | # server.conf file defaults
| |
− | print SERVER "# server.conf file generated by dhcp.pm VNUML plugin at $date\n\n";
| |
− | print SERVER "ddns-update-style none;\n";
| |
− | print SERVER "default-lease-time 120;\n";
| |
− | print SERVER "max-lease-time 120;\n";
| |
− | #print SERVER "log-facility local7;\n\n";
| |
− | | |
− | # extract configuration from subnet blocks in dhcp_conf.xml
| |
− | my $server = $serverTagList->item(0);
| |
− | my $subnetTagList = $server->getElementsByTagName("subnet");
| |
− | my $numsubnets = $subnetTagList->getLength;
| |
− | | |
− | for ( my $ns=0; $ns < $numsubnets ; $ns++ ) {
| |
− | my $subnet = $subnetTagList->item($ns);
| |
− | my $ipTagList = $subnet->getElementsByTagName("ip");
| |
− | my $numip = $ipTagList->getLength;
| |
− | | |
− | # subnet declaration
| |
− | my $ipTag = $ipTagList->item($0);
| |
− | my $subnetmask = $ipTag->getAttribute("mask");
| |
− | my $subnetbaseip = $ipTag->getFirstChild->getData;
| |
− | my $block = new Net::Netmask("$subnetbaseip"."/"."$subnetmask");
| |
− |
| |
− | my $baseip = $block->base();
| |
− | my $mask = $block->mask();
| |
− | print SERVER "subnet $baseip netmask $mask {\n";
| |
− | | |
− | # extract ip ranges in subnet
| |
− | my $rangeTagList = $subnet->getElementsByTagName("range");
| |
− | my $numranges = $rangeTagList->getLength;
| |
− |
| |
− | for ( my $nr = 0; $nr < $numranges ; $nr++ ) {
| |
− | my $rangeTag = $rangeTagList->item($nr);
| |
− | my $firstTagList = $rangeTag->getElementsByTagName("first");
| |
− | my $firstTag = $firstTagList->item(0);
| |
− | my $firstip = $firstTag->getFirstChild->getData;
| |
− | my $lastTagList = $rangeTag->getElementsByTagName("last");
| |
− | my $lastTag = $lastTagList->item(0);
| |
− | my $lastip = $lastTag->getFirstChild->getData;
| |
− | print SERVER " range $firstip $lastip;\n";
| |
− | }
| |
− | | |
− | # extract routers in subnet (if any)
| |
− | my $routerTagList = $subnet->getElementsByTagName("router");
| |
− | my $numrouters = $routerTagList->getLength;
| |
− |
| |
− | if ( $numrouters > 0 ) {
| |
− | print SERVER " option routers";
| |
− | for ( my $nr = 0; $nr < $numrouters ; $nr++ ) {
| |
− | if ( $nr > 0 ) {
| |
− | print SERVER ",";
| |
− | }
| |
− | my $routerTag = $routerTagList->item($nr);
| |
− | my $router = $routerTag->getFirstChild->getData;
| |
− | print SERVER " $router";
| |
− | }
| |
− | print SERVER ";\n";
| |
− | }
| |
− | | |
− | # extract dns in subnet (if any)
| |
− | my $dnsTagList = $subnet->getElementsByTagName("dns");
| |
− | my $numdns = $dnsTagList->getLength;
| |
− | if ( $numdns > 0 ) {
| |
− | print SERVER " option domain-name-servers";
| |
− | for ( my $nd = 0; $nd < $numdns ; $nd++ ) {
| |
− | if ( $nd > 0 ) {
| |
− | print SERVER ",";
| |
− | }
| |
− | my $dnsTag = $dnsTagList->item($nd);
| |
− | my $dns = $dnsTag->getFirstChild->getData;
| |
− | print SERVER " $dns";
| |
− | }
| |
− | print SERVER ";\n";
| |
− | }
| |
− | | |
− | # extract domain in subnet (if specified)
| |
− | my $domainTagList = $subnet->getElementsByTagName("domain");
| |
− | my $numdomains = $domainTagList->getLength;
| |
− | if ( $numdomains == 1 ) {
| |
− | my $domainTag = $domainTagList->item(0);
| |
− | my $domain = $domainTag->getFirstChild->getData;
| |
− | print SERVER " option domain-name \"$domain\";\n";
| |
− | }
| |
− | | |
− | # end subnet declaration in configuration file
| |
− | print SERVER "}\n\n";
| |
− | | |
− | # extract hosts in subnet (if any)
| |
− | my $hostTagList = $subnet->getElementsByTagName("host");
| |
− | my $numhosts = $hostTagList->getLength;
| |
− | for ( my $nh = 0; $nh < $numhosts ; $nh++ ) {
| |
− | my $hostTag = $hostTagList->item($nh);
| |
− | my $hostname = $hostTag->getAttribute("name");
| |
− | my $hostmac = $hostTag->getAttribute("mac");
| |
− | my $hostip = $hostTag->getAttribute("ip");
| |
− | | |
− | # ignore unmatching host declarations
| |
− | if ( $block->match($hostip) ) {
| |
− | print SERVER "host $hostname {\n hardware ethernet $hostmac;\n fixed-address $hostip;\n}\n\n";
| |
− | }
| |
− | }
| |
− | | |
− | }
| |
− | close(SERVER);
| |
− | $files{"/etc/dhcp3/dhcpd.conf"} = $server_file;
| |
− | }
| |
− | | |
− | my $relayTagList = $virtualm->getElementsByTagName("relay");
| |
− | my $numrelays = $relayTagList->getLength;
| |
− | if ( $numrelays == 1 ) {
| |
− | | |
− | # Build file /etc/default/dhcp3-relay.conf
| |
− | my $relay_file = "/tmp/$vm" . "_relay.conf";
| |
− | chomp( my $date = `date` );
| |
− | open( RELAY, ">$relay_file" ) or $files{"ERROR"} = "Cannot open $relay_file file";
| |
− | print RELAY "# relay.conf file generated by dhcp.pm VNUML plugin at $date\n";
| |
− | print RELAY "SERVERS=\"";
| |
− | my $relay = $relayTagList->item(0);
| |
− | my $toserverTagList = $relay->getElementsByTagName("toserver");
| |
− | my $numtoservers = $toserverTagList->getLength;
| |
− | | |
− | for ( my $nt = 0; $nt < $numtoservers ; $nt++ ) {
| |
− | my $toserverTag = $toserverTagList->item($nt);
| |
− | my $toserverData = $toserverTag->getFirstChild->getData;
| |
− | print RELAY "$toserverData ";
| |
− | }
| |
− | | |
− | print RELAY "\"\n";
| |
− | close(RELAY);
| |
− | $files{"/etc/default/dhcp3-relay"} = $relay_file;
| |
− | }
| |
− | | |
− | my $clientTagList = $virtualm->getElementsByTagName("client");
| |
− | my $numclients = $clientTagList->getLength;
| |
− | if ( $numclients == 1 ) {
| |
− | # Build file /etc/dhcp3/dhclient.conf
| |
− | my $client_file = "/tmp/$vm" . "_client.conf";
| |
− | chomp( my $date = `date` );
| |
− | open( CLIENT, ">$client_file" ) or $files{"ERROR"} = "Cannot open $client_file file";
| |
− | print CLIENT "# Configuration file for /sbin/dhclient, which is included in Debian's dhcp3-client package.\n";
| |
− | print CLIENT "# client.conf file generated by dhcp.pm VNUML plugin at $date\n\n";
| |
− | print CLIENT "send host-name \"<hostname>\";\n";
| |
− | print CLIENT "request subnet-mask, broadcast-address, time-offset, routers, domain-name, domain-name-servers, domain-search, host-name, netbios-name-servers, netbios-scope, interface-mtu;\n";
| |
− | print CLIENT "retry 10;\n";
| |
− | close(CLIENT);
| |
− | $files{"/etc/dhcp3/dhclient.conf"} = $client_file;
| |
− |
| |
− | }
| |
− | }else{
| |
− | $files{"ERROR"} = "Your choice $type for $vm is not a recognized type (yet)\n";
| |
− | }
| |
− | }
| |
− | }
| |
− | } | |
| return %files; | | return %files; |
| } | | } |
| | | |
− | ###########################################################
| + | # bootingCommands |
− | # bootingCommands
| + | # |
− | #
| + | # To be called during "t" mode, for each vm in the scenario |
− | # To be called during "t" mode, for each vm in the scenario
| + | # |
− | #
| + | # Arguments: |
− | # Arguments:
| + | # - vm name |
− | # - vm name
| + | # |
− | #
| + | # Returns: |
− | # Returns:
| + | # - list of commands to execute in the virtual machine at booting time |
− | # - list of commands to execute in the virtual machine at booting time
| + | # |
− | #
| |
− | ###########################################################
| |
− | | |
| sub bootingCommands { | | sub bootingCommands { |
| | | |
| + | my $self = shift; |
| + | my $vm = shift; |
| + | |
| + | my @commands; |
| + | |
| + | # Sample code |
| + | print "dummy plugin: booting commands for vm $vm\n"; |
| + | |
| + | push (@commands,"sh /etc/init.d/boot1"); |
| + | push (@commands,"sh /etc/init.d/boot2"); |
| + | |
| + | return @commands; |
| + | |
| } | | } |
| | | |
| + | # execCreateFiles |
| + | # |
| + | # To be called during "x" mode, for each vm in the scenario |
| + | # |
| + | # Arguments: |
| + | # - vm name |
| + | # - seq command sequence |
| + | # |
| + | # Returns: |
| + | # - a hashname which keys are absolute pathnames of files in vm filesystem and |
| + | # values the the pathname of the file in the host filesystem. The file in the |
| + | # host filesytesm is removed after VNUML processed it, so temporal files in |
| + | # /tmp are preferable) |
| + | # |
| + | sub execCreateFiles { |
| | | |
− | ########################################################### | + | my $self = shift; |
− | # execVmsToUse
| + | my $vm = shift; |
− | #
| |
− | # To be called once during "x" mode
| |
− | #
| |
− | # Arguments:
| |
− | # - seq command sequence
| |
− | #
| |
− | # Returns:
| |
− | # - list of virtual machines where the command has effect
| |
− | #
| |
− | ###########################################################
| |
− | | |
− | sub execVmsToUse {
| |
− | | |
− | my $self = shift; | |
| my $seq = shift; | | my $seq = shift; |
| | | |
− | # Four lists are built, one is returned depending on the executed command
| + | my %files; |
− | my @vm_list = (); | |
− | my @server_vm_list = ();
| |
− | my @relay_vm_list = ();
| |
− | my @client_vm_list = ();
| |
| | | |
− | my $virtualmList=$globalNode->getElementsByTagName("vm"); | + | # Sample code |
− | my $longitud = $virtualmList->getLength; | + | print "dummy plugin: exec create files for vm $vm and seq $seq\n"; |
| + | system("touch /tmp/exec1.$vm.$seq"); |
| + | system("touch /tmp/exec2.$vm.$seq"); |
| | | |
| + | $files{"/etc/init.d/exec1.$seq"} = "/tmp/exec1.$vm.$seq"; |
| + | $files{"/etc/init.d/exec2.$seq"} = "/tmp/exec2.$vm.$seq"; |
| | | |
− | for (my $m=0; $m<$longitud; $m++){ | + | return %files; |
− |
| |
− | my $virtualm = $virtualmList->item($m);
| |
− | my $virtualm_name = $virtualm->getAttribute("name");
| |
− | push (@vm_list,$virtualm_name);
| |
− |
| |
− | my $serverTagList = $virtualm->getElementsByTagName("server");
| |
− | my $numservers = $serverTagList->getLength;
| |
− | my $relayTagList = $virtualm->getElementsByTagName("relay");
| |
− | my $numrelays = $relayTagList->getLength;
| |
− | my $clientTagList = $virtualm->getElementsByTagName("client");
| |
− | my $numclients = $clientTagList->getLength;
| |
− |
| |
− | if ( $numservers == 1 ) {
| |
− | push (@server_vm_list,$virtualm_name);
| |
− | }
| |
− | if ( $numrelays == 1 ) {
| |
− | push (@relay_vm_list,$virtualm_name);
| |
− | }
| |
− | if (!($numclients == 0)) {
| |
− | push (@client_vm_list,$virtualm_name);
| |
− | }
| |
− | }
| |
− |
| |
− | if ($seq eq "start" || $seq eq "restart" || $seq eq "stop" || $seq eq "dhcp-start" || $seq eq "dhcp-restart" || $seq eq "dhcp-stop") {
| |
− | return @vm_list;
| |
− | }elsif ($seq eq "dhcp-server-start"|| $seq eq "dhcp-server-stop" || $seq eq "dhcp-server-restart" || $seq eq "dhcp-server-force-reload"){
| |
− | return @server_vm_list;
| |
− | }elsif ( $seq eq "dhcp-relay-start"|| $seq eq "dhcp-relay-restart"|| $seq eq "dhcp-relay-stop"|| $seq eq "dhcp-relay-force-reload"){
| |
− | return @relay_vm_list;
| |
− | }elsif ($seq eq "dhcp-client-start"||$seq eq "dhcp-client-restart"||$seq eq "dhcp-client-stop"){
| |
− | return @client_vm_list;
| |
− | }else{
| |
− | return ();
| |
− | }
| |
| } | | } |
| | | |
− | | + | # execCommands |
− | | + | # |
− | | + | # To be called during "x" mode, for each vm in the scenario |
− | ###########################################################
| + | # |
− | # execCreateFiles
| + | # Arguments: |
− | #
| + | # - vm name |
− | # To be called during "x" mode, for each vm in the scenario
| + | # - seq command sequence |
− | #
| + | # |
− | # Arguments:
| + | # Returns: |
− | # - vm name
| + | # - list of commands to execute in the virtual machine after <exec> processing |
− | # - seq command sequence
| + | # |
− | #
| |
− | # Returns:
| |
− | # - a hashname which kyes are absolute pathnames of files in vm filesystem and
| |
− | # values the the pathname of the file in the host filesystem. The file in the
| |
− | # host filesytesm is removed after VNUML processed it, so temporal files in
| |
− | # /tmp are preferable)
| |
− | #
| |
− | ###########################################################
| |
− | | |
− | sub execCreateFiles {
| |
− | }
| |
− | | |
− | | |
− | ###########################################################
| |
− | # execCommands
| |
− | #
| |
− | # To be called during "x" mode, for each vm in the scenario
| |
− | #
| |
− | # Arguments:
| |
− | # - vm name
| |
− | # - seq command sequence
| |
− | #
| |
− | # Returns:
| |
− | # - list of commands to execute in the virtual machine after <exec> processing
| |
− | ###########################################################
| |
− | | |
| sub execCommands { | | sub execCommands { |
− | | + | |
| my $self = shift; | | my $self = shift; |
− | my $vm = shift; | + | my $vm = shift; |
− | my $seq = shift; | + | my $seq = shift; |
− | | + | |
| my @commands; | | my @commands; |
− |
| |
− | my $type;
| |
− |
| |
− | my $virtualmList = $globalNode->getElementsByTagName("vm");
| |
− | my $longitud = $virtualmList->getLength;
| |
| | | |
− | for (my $m=0 ; $m<$longitud ; $m++) { | + | # Sample code |
− | | + | print "dummy plugin: exec commands for vm $vm and seq $seq\n"; |
− | my $virtualm = $virtualmList->item($m);
| |
− | my $virtualm_name = $virtualm->getAttribute("name");
| |
− |
| |
− | if ( $vm eq $virtualm_name ) {
| |
− |
| |
− | $type = $virtualm->getAttribute("type");
| |
− |
| |
− | switch ($type) {
| |
− | | |
− | case "dhcp3" {
| |
− | # recognized type
| |
− | }
| |
− | else {
| |
− | unshift( @commands, "Your choice $type for $vm is not a recognized type (yet)\n");
| |
− | }
| |
− | }
| |
− | | |
− | my $serverTagList = $virtualm->getElementsByTagName("server");
| |
− | my $numservers = $serverTagList->getLength;
| |
− | my $relayTagList = $virtualm->getElementsByTagName("relay");
| |
− | my $numrelays = $relayTagList->getLength;
| |
− | my $clientTagList = $virtualm->getElementsByTagName("client");
| |
− | my $numclients = $clientTagList->getLength;
| |
− | | |
− | switch ($seq){
| |
− |
| |
− | case ["start","dhcp-start"]{
| |
− | # Start server, relay and clients in the virtual machine, if any
| |
− | unshift( @commands, "" );
| |
− | if ( $numservers == 1 ) {
| |
− | push( @commands, "/etc/init.d/dhcp3-server start" );
| |
− | }
| |
− | if ( $numrelays == 1 ) {
| |
− | push( @commands, "/etc/init.d/dhcp3-relay start" );
| |
− | }
| |
− | if (!($numclients == 0)) {
| |
− | unshift(@commands, "" );
| |
− | my $client = $clientTagList->item(0);
| |
− | my $ifTagList = $client->getElementsByTagName("if");
| |
− | my $numif = $ifTagList->getLength;
| |
− | for (my $ni=0; $ni<$numif ; $ni++) {
| |
− | my $ifTag = $ifTagList->item($ni);
| |
− | my $ifData = $ifTag->getFirstChild->getData;
| |
− | if (!($ifData == 0)) {
| |
− | push(@commands,"dhclient eth"."$ifData");
| |
− | }
| |
− | }
| |
− | }
| |
− |
| |
− | }
| |
− | case ["restart","dhcp-restart"]{
| |
− | # Restart server, relay and clients in the virtual machine, if any
| |
− | unshift( @commands, "" );
| |
− | if ( $numservers == 1 ) {
| |
− | push( @commands, "/etc/init.d/dhcp3-server restart" );
| |
− | }
| |
− | if ( $numrelays == 1 ) {
| |
− | push( @commands, "/etc/init.d/dhcp3-relay restart" );
| |
− | }
| |
− | if (!($numclients == 0)) {
| |
− | unshift(@commands, "" );
| |
− | my $client = $clientTagList->item(0);
| |
− | my $ifTagList = $client->getElementsByTagName("if");
| |
− | my $numif = $ifTagList->getLength;
| |
− | for (my $ni=0; $ni<$numif ; $ni++) {
| |
− | my $ifTag = $ifTagList->item($ni);
| |
− | my $ifData = $ifTag->getFirstChild->getData;
| |
− | if (!($ifData == 0)) {
| |
− | push(@commands,"dhclient -r");
| |
− | push(@commands,"killall dhclient");
| |
− | push(@commands,"dhclient eth"."$ifData");
| |
− | }
| |
− | }
| |
− | }
| |
− |
| |
− | }
| |
− | case ["stop","dhcp-stop"]{
| |
− | # Stop server and relay in the virtual machine, if any
| |
− | unshift( @commands, "" );
| |
− | if ( $numservers == 1 ) {
| |
− | push( @commands, "/etc/init.d/dhcp3-server stop" );
| |
− | }
| |
− | if ( $numrelays == 1 ) {
| |
− | push( @commands, "/etc/init.d/dhcp3-relay stop" );
| |
− | }
| |
− | if (!($numclients == 0)) {
| |
− | unshift(@commands, "" );
| |
− | my $client = $clientTagList->item(0);
| |
− | my $ifTagList = $client->getElementsByTagName("if");
| |
− | my $numif = $ifTagList->getLength;
| |
− | for (my $ni=0; $ni<$numif ; $ni++) {
| |
− | my $ifTag = $ifTagList->item($ni);
| |
− | my $ifData = $ifTag->getFirstChild->getData;
| |
− | if (!($ifData == 0)) {
| |
− | push(@commands,"dhclient -r");
| |
− | push(@commands,"killall dhclient");
| |
− | }
| |
− | }
| |
− | }
| |
− |
| |
− | }
| |
− | case ("dhcp-server-start"){
| |
− | # Start the server in the virtual machine. Return error if there isn't any.
| |
− | if ( $numservers == 0 ) {
| |
− | unshift( @commands, "$vm is not configured as a dhcp server. Choose the appropriate virtual machine with flag -M name" );
| |
− | }
| |
− | else {
| |
− | unshift( @commands, "" );
| |
− | push( @commands, "/etc/init.d/dhcp3-server start" );
| |
− | }
| |
− | }
| |
− | case ("dhcp-relay-start"){
| |
− | # Start the relay in the virtual machine. Return error if there isn't any.
| |
− | if ( $numrelays == 0 ) {
| |
− | unshift( @commands, "$vm is not configured as a dhcp relay. Choose the appropriate virtual machine with flag -M name" );
| |
− | }
| |
− | else {
| |
− | unshift( @commands, "" );
| |
− | push( @commands, "/etc/init.d/dhcp3-relay start" );
| |
− | }
| |
− | }
| |
− | case ("dhcp-client-start"){
| |
− | # Start the clients in the virtual machine. Return error if there aren't any.
| |
− | if ( $numclients == 0 ) {
| |
− | unshift( @commands, "$vm is not configured as a dhcp client. Choose the appropriate virtual machine with flag -M name" );
| |
− | }
| |
− | else {
| |
− | unshift(@commands, "" );
| |
− | my $client = $clientTagList->item(0);
| |
− | my $ifTagList = $client->getElementsByTagName("if");
| |
− | my $numif = $ifTagList->getLength;
| |
− | for (my $ni=0; $ni<$numif ; $ni++) {
| |
− | my $ifTag = $ifTagList->item($ni);
| |
− | my $ifData = $ifTag->getFirstChild->getData;
| |
− | if (!($ifData == 0)) {
| |
− | push(@commands,"dhclient eth"."$ifData");
| |
− | }
| |
− | }
| |
| | | |
− | }
| + | push (@commands,"sh /etc/init.d/exec1.$seq"); |
− | }
| + | push (@commands,"sh /etc/init.d/exec2.$seq"); |
− | case ("dhcp-server-restart"){
| |
− | # Restart the server in the virtual machine. Return error if there isn't any.
| |
− | if ( $numservers == 0 ) {
| |
− | unshift( @commands, "$vm is not configured as a dhcp server. Choose the appropriate virtual machine with flag -M name" );
| |
− | }
| |
− | else {
| |
− | unshift( @commands, "" );
| |
− | push( @commands, "/etc/init.d/dhcp3-server restart" );
| |
− | }
| |
− | }
| |
− | case ("dhcp-relay-restart"){
| |
− | # Restart the relay in the virtual machine. Return error if there isn't any.
| |
− | if ( $numrelays == 0 ) {
| |
− | unshift( @commands, "$vm is not configured as a dhcp relay. Choose the appropriate virtual machine with flag -M name" );
| |
− | }
| |
− | else {
| |
− | unshift( @commands, "" );
| |
− | push( @commands, "/etc/init.d/dhcp3-relay restart" );
| |
− | }
| |
− | }
| |
− |
| |
− | case ("dhcp-client-restart"){
| |
− | # Start the clients in the virtual machine. Return error if there aren't any.
| |
− | if ( $numclients == 0 ) {
| |
− | unshift( @commands, "$vm is not configured as a dhcp client. Choose the appropriate virtual machine with flag -M name" );
| |
− | }
| |
− | else {
| |
− | unshift(@commands, "" );
| |
− | my $client = $clientTagList->item(0);
| |
− | my $ifTagList = $client->getElementsByTagName("if");
| |
− | my $numif = $ifTagList->getLength;
| |
− | for (my $ni=0; $ni<$numif ; $ni++) {
| |
− | my $ifTag = $ifTagList->item($ni);
| |
− | my $ifData = $ifTag->getFirstChild->getData;
| |
− | if (!($ifData == 0)) {
| |
− | push(@commands,"dhclient -r");
| |
− | push(@commands,"killall dhclient");
| |
− | push(@commands,"dhclient eth"."$ifData");
| |
− | }
| |
− | }
| |
| | | |
− | }
| + | return @commands; |
− | }
| |
− |
| |
− | case ("dhcp-server-stop"){
| |
− | # Stop the server in the virtual machine. Return error if there isn't any.
| |
− | if ( $numservers == 0 ) {
| |
− | unshift( @commands, "$vm is not configured as a dhcp server. Choose the appropriate virtual machine with flag -M name" );
| |
− | }
| |
− | else {
| |
− | unshift( @commands, "" );
| |
− | push( @commands, "/etc/init.d/dhcp3-server stop" );
| |
− | }
| |
− |
| |
− | }
| |
− | case ("dhcp-relay-stop"){
| |
− | # Stop the relay in the virtual machine. Return error if there isn't any.
| |
− | if ( $numrelays == 0 ) {
| |
− | unshift( @commands, "$vm is not configured as a dhcp relay. Choose the appropriate virtual machine with flag -M name" );
| |
− | }
| |
− | else {
| |
− | unshift( @commands, "" );
| |
− | push( @commands, "/etc/init.d/dhcp3-relay stop" );
| |
− | }
| |
− |
| |
− | }
| |
− |
| |
− | case ("dhcp-client-stop"){
| |
− | # Start the clients in the virtual machine. Return error if there aren't any.
| |
− | if ( $numclients == 0 ) {
| |
− | unshift( @commands, "$vm is not configured as a dhcp client. Choose the appropriate virtual machine with flag -M name" );
| |
− | }
| |
− | else {
| |
− | unshift(@commands, "" );
| |
− | my $client = $clientTagList->item(0);
| |
− | my $ifTagList = $client->getElementsByTagName("if");
| |
− | my $numif = $ifTagList->getLength;
| |
− | for (my $ni=0; $ni<$numif ; $ni++) {
| |
− | my $ifTag = $ifTagList->item($ni);
| |
− | my $ifData = $ifTag->getFirstChild->getData;
| |
− | if (!($ifData == 0)) {
| |
− | push(@commands,"dhclient -r");
| |
− | push(@commands,"killall dhclient");
| |
− | }
| |
− | }
| |
− | | |
− | }
| |
− | }
| |
− |
| |
− | case ("dhcp-server-force-reload"){
| |
− | # Force reload of the server in the virtual machine. Return error if there isn't any.
| |
− | if ( $numservers == 0 ) {
| |
− | unshift( @commands, "$vm is not configured as a dhcp server. Choose the appropriate virtual machine with flag -M name" );
| |
− | }
| |
− | else {
| |
− | unshift( @commands, "" );
| |
− | push( @commands, "/etc/init.d/dhcp3-server force-reload" );
| |
− | }
| |
− |
| |
− | }
| |
− | case ("dhcp-relay-force-reload"){
| |
− | # Force reload of the relay in the virtual machine. Return error if there isn't any.
| |
− | if ( $numservers == 0 ) {
| |
− | unshift( @commands, "$vm is not configured as a dhcp relay. Choose the appropriate virtual machine with flag -M name" );
| |
− | }
| |
− | else {
| |
− | unshift( @commands, "" );
| |
− | push( @commands, "/etc/init.d/dhcp3-relay force-reload" );
| |
− | }
| |
− |
| |
− | }else{
| |
− | unshift( @commands, "\nYour choice \"$seq\" is not a recognized command (yet).\nAvailable commands: start, stop, restart, dhcp-start, dhcp-stop, dhcp-restart, dhcp-server-start, dhcp-server-stop, dhcp-server-restart, dhcp-server-force-reload, dhcp-relay-start, dhcp-relay-stop, dhcp-relay-restart, dhcp-relay-force-reload, dhcp-client-start.\n" );
| |
− | }
| |
− | }
| |
− | return @commands;
| |
− | }
| |
− | }
| |
| } | | } |
− |
| |
− |
| |
− |
| |
− |
| |
− |
| |
− | ###########################################################
| |
− | # shutdownCommands
| |
− | #
| |
− | # To be called during "d" mode, for each vm in the scenario
| |
− | #
| |
− | # Arguments:
| |
− | # - vm name
| |
− | #
| |
− | # Returns:
| |
− | # - list of commands to execute in the virtual machine at shutdown time
| |
− | #
| |
− | ###########################################################
| |
| | | |
| + | # shutdownCommand |
| + | # |
| + | # To be called during "d" mode, for each vm in the scenario |
| + | # |
| + | # Arguments: |
| + | # - vm name |
| + | # |
| + | # Returns: |
| + | # - list of commands to execute in the virtual machine at shutdown time |
| + | # |
| sub shutdownCommands { | | sub shutdownCommands { |
| | | |
− | my $self = shift; | + | my $self = shift; |
− | my $vm = shift; | + | my $vm = shift; |
− | | + | |
| my @commands; | | my @commands; |
| + | |
| + | # Sample code |
| + | print "dummy plugin: shutdown commands for vm $vm\n"; |
| + | |
| + | push (@commands,"sh /etc/init.d/shutdown1"); |
| + | push (@commands,"sh /etc/init.d/shutdown2"); |
| + | |
| + | return @commands; |
| | | |
− | my $type;
| |
− |
| |
− | my $virtualmList = $globalNode->getElementsByTagName("vm");
| |
− | my $longitud = $virtualmList->getLength;
| |
− |
| |
− | for ( my $m = 0 ; $m < $longitud ; $m++ ) {
| |
− |
| |
− | my $virtualm = $virtualmList->item($m);
| |
− | my $virtualm_name = $virtualm->getAttribute("name");
| |
− |
| |
− | if ( $vm eq $virtualm_name ) {
| |
− | $type = $virtualm->getAttribute("type");
| |
− |
| |
− | switch ($type) {
| |
− |
| |
− | case "dhcp3" {
| |
− |
| |
− | unshift( @commands, "" );
| |
− | my $serverTagList = $virtualm->getElementsByTagName("server");
| |
− | my $numservers = $serverTagList->getLength;
| |
− |
| |
− | if ( $numservers == 1 ) {
| |
− | push( @commands, "/etc/init.d/dhcp3-server stop" );
| |
− | }
| |
− |
| |
− | my $relayTagList = $virtualm->getElementsByTagName("relay");
| |
− | my $numrelays = $relayTagList->getLength;
| |
− |
| |
− | if ( $numrelays == 1 ) {
| |
− | push( @commands, "/etc/init.d/dhcp3-relay stop" );
| |
− | }
| |
− | }
| |
− | else {
| |
− | unshift( @commands,"Your choice $type for $vm is not a recognized type (yet)\n");
| |
− | }
| |
− |
| |
− | }
| |
− | }
| |
− |
| |
− | return @commands;
| |
− |
| |
− | }
| |
| } | | } |
| | | |
− | #############################################################
| + | # finalizePlugin |
− | # finalizePlugin
| + | # |
− | #
| + | # To be called always, just before ending the procesing the scenario specification |
− | # To be called always, just before ending the procesing the scenario specification
| + | # |
− | #
| + | # Arguments: |
− | # Arguments:
| + | # - none |
− | # - none
| + | # |
− | #
| + | # Returns: |
− | # Returns:
| + | # - none |
− | # - none
| + | # |
− | #
| |
− | #############################################################
| |
− | | |
| sub finalizePlugin { | | sub finalizePlugin { |
| | | |
| + | my $self = shift; |
| + | |
| + | # Sample code |
| + | print "dummy plugin: finishing\n" |
| } | | } |
| | | |
− | #############################################################
| + | 1; |
− | #
| + | </pre> |
− | # Checks existence and semantics in ospf conf file.
| |
− | # Currently this check consist in:
| |
− | #
| |
− | # 1. Configuration file exists.
| |
− | # 2. Check DTD.
| |
− | # 3. IP tag contains mask attribute and data.
| |
− | # 4. Area tag is unique and contains data.
| |
− | #
| |
− | #############################################################
| |
− | | |
− | sub checkConfigFile {
| |
− | | |
− | # 1. Configuration file exists.
| |
− | my $config_file = shift;
| |
− | open( FILEHANDLE, $config_file )
| |
− | or { return "cannot open config file $config_file\n", };
| |
− | close(FILEHANDLE);
| |
− | | |
− | # 2. Check DTD
| |
− | my $parser = new XML::DOM::ValParser;
| |
− | my $dom_tree;
| |
− | $valid_fail = 0;
| |
− | #eval {
| |
− | local $XML::Checker::FAIL = \&validation_fail;
| |
− | $dom_tree = $parser->parsefile($config_file);
| |
− | #};
| |
− | | |
− | if ($valid_fail) {
| |
− | return ("$config_file is not a well-formed DHCP plugin file\n");
| |
− | }
| |
− | | |
− | $globalNode = $dom_tree->getElementsByTagName("dhcp_conf")->item(0);
| |
− | | |
− | return 0;
| |
− | }
| |
− | | |
− | sub validation_fail {
| |
− | my $code = shift;
| |
− | | |
− | # To set flag
| |
− | $valid_fail = 1;
| |
− | | |
− | # To print error message
| |
− | XML::Checker::print_error( $code, @_ );
| |
− | }
| |
− | | |
− | 1
| |