addexternalnetwork.in 3.45 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
#!/usr/bin/perl -w
#
# Copyright (c) 2012 University of Utah and the Flux Group.
# 
# {{{EMULAB-LICENSE
# 
# This file is part of the Emulab network testbed software.
# 
# This file is free software: you can redistribute it and/or modify it
# under the terms of the GNU Affero General Public License as published by
# the Free Software Foundation, either version 3 of the License, or (at
# your option) any later version.
# 
# This file is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Affero General Public
# License for more details.
# 
# You should have received a copy of the GNU Affero General Public License
# along with this file.  If not, see <http://www.gnu.org/licenses/>.
# 
# }}}
#
use strict;
use English;
use Getopt::Std;
use File::Temp qw(tempfile);

#
# Add a generic device to the DB. 
#
sub usage()
{
34
    print STDERR "Usage: addexternalnetwork [-d] [-n] [-w external_wire_urn] [-i external_interface_urn] [-t vm-type] <network_id> <node_id> <external_manager> <vlan-vlan[,vlan-vlan]*>\n";
35 36 37 38 39
    print STDERR "Options:\n";
    print STDERR " -d       - Turn on debugging\n";
    print STDERR " -n       - Dry run mode\n";
    exit(-1);
}
40
my $optlist   = "hdnw:i:t:";
41 42 43 44 45 46
my $debug     = 0;
my $impotent  = 0;
my $network;
my $node_id;
my $external;
my $vlans;
47 48
my $wire;
my $iface;
49
my $vmtype;
50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96

# Protos
sub fatal($);
sub CreateType($$);
sub CreateNode();

#
# Configure variables
#
my $TB		   = "@prefix@";

#
# Testbed Support libraries
#
use lib "@prefix@/lib";
use emdb;
use EmulabConstants;
use emutil;
use User;
use Node;

#
# Turn off line buffering on output
#
$| = 1;

#
# Untaint the path
# 
$ENV{'PATH'} = "/bin:/sbin:/usr/bin:";

#
# Parse command arguments. 
#
my %options = ();
if (! getopts($optlist, \%options)) {
    usage();
}
if (defined($options{'h'})) {
    usage();
}
if (defined($options{'d'})) {
    $debug = 1;
}
if (defined($options{'n'})) {
    $impotent = 1;
}
97 98 99 100 101 102
if (defined($options{'w'})) {
    $wire = $options{'w'};
}
if (defined($options{'i'})) {
    $iface = $options{'i'};
}
103 104 105
if (defined($options{'t'})) {
    $vmtype = $options{'t'};
}
106 107 108 109 110
usage()
    if (scalar(@ARGV) != 4);

($network, $node_id, $external, $vlans) = @ARGV;

111
if ($vlans =~ /([0-9,\-]+)/) {
112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135
} else {
    usage();
}

#
# Verify user, must be admin.
#
my $this_user = User->ThisUser();
if (! defined($this_user)) {
    fatal("You ($UID) do not exist!");
}
if (!$this_user->IsAdmin()) {
    fatal("You are not a testbed administrator!");
}

#
# The node may not already exist.
#
my $node = Node->Lookup($node_id);
if (! defined($node)) {
    fatal("Node doesn't exist in the DB");
}

my $type = $node->type();
136 137 138
if (defined($vmtype)) {
    $type = $vmtype;
}
139 140 141 142 143 144 145 146 147 148 149 150 151

sub fatal($)
{
    my ($mesg) = $_[0];

    die("*** $0:\n".
	"    $mesg\n");
}

$network = DBQuoteSpecial($network);
$node_id = DBQuoteSpecial($node_id);
$type = DBQuoteSpecial($type);
$external = DBQuoteSpecial($external);
152
$vlans = DBQuoteSpecial($vlans);
153 154

my $query = "REPLACE INTO external_networks SET node_id=$node_id, ".
155
    "node_type=$type, vlans=$vlans, ".
156
    "external_manager=$external, network_id=$network";
157 158 159 160 161 162 163 164
if (defined($wire)) {
    $wire = DBQuoteSpecial($wire);
    $query = $query . ", external_wire=$wire";
}
if (defined($iface)) {
    $iface = DBQuoteSpecial($iface);
    $query = $query . ", external_interface=$iface";
}
165 166 167 168 169 170 171

if ($debug) {
    print STDERR $query . "\n";
}
if (! $impotent) {
    DBQueryWarn($query);
}