Commit d174b128 authored by Leigh B Stoller's avatar Leigh B Stoller

Mama (Mike) needs a brand new script.

parent 4cca01f2
#
# Copyright (c) 2000-2017 University of Utah and the Flux Group.
# Copyright (c) 2000-2018 University of Utah and the Flux Group.
#
# {{{EMULAB-LICENSE
#
......@@ -58,7 +58,8 @@ SBIN_SCRIPTS = vlandiff vlansync withadminprivs export_tables cvsupd.pl \
runsonxen pxelinux_makeconf attend atten \
addrfdevice addrfpath reserve announce createimagealias \
predict test-reserve notify-reservations \
deprecate_image pushrootkey addinterface addwire cnetwatch
deprecate_image pushrootkey addinterface addwire cnetwatch \
addswitch
WEB_SBIN_SCRIPTS= webnewnode webdeletenode webspewconlog webarchive_list \
webspewimage webdumpdescriptor webemulabfeature \
......
#!/usr/bin/perl -w
#
# Copyright (c) 2003-2018 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 Date::Parse;
use Time::Local;
use Data::Dumper;
use File::Temp qw(tempfile);
#
# Add a generic device to the DB.
#
sub usage()
{
print STDERR "Usage: addswitch -t <type> [-S <stack>] <switch_id>\n";
print STDERR "Usage: addswitch -r <switch_id>\n";
print STDERR "Options:\n";
print STDERR " -d - Turn on debugging\n";
print STDERR " -r - Remove switch instead.\n";
print STDERR " -n - Dry run mode\n";
print STDERR " -t type - Type name (eg: cisco-ios, whatever)\n";
print STDERR " Type is created if it does not exist.\n";
print STDERR " -1 - Indicate a layer one switch instead\n";
print STDERR " -S stack - Add switch to switch stack.\n";
print STDERR " Stack (type) must already exist, use mysql.\n";
exit(-1);
}
my $optlist = "t:dnr1S:";
my $debug = 0;
my $impotent = 0;
my $remove = 0;
my $layer1 = 0;
my $stack;
my $type;
# Protos
sub fatal($);
sub CreateType($);
sub CreateSwitch();
#
# Configure variables
#
my $TB = "@prefix@";
#
# Testbed Support libraries
#
use lib "@prefix@/lib";
use emdb;
use EmulabConstants;
use emutil;
use User;
use Node;
use NodeType;
#
# 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;
}
if (defined($options{'t'})) {
$type = $options{'t'};
}
if (defined($options{'S'})) {
$stack = $options{'S'};
}
if (defined($options{'1'})) {
$layer1 = 1;
}
if (defined($options{'r'})) {
$remove = 1;
}
usage()
if (@ARGV != 1);
usage()
if (!$remove && !defined($type));
my $node_id = $ARGV[0];
#
# 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!");
}
#
# Remove and done.
#
if ($remove) {
my $switch = Node->Lookup($node_id);
if (!defined($switch)) {
print STDERR "Switch does not exist in the DB\n";
exit(0);
}
$switch->Delete();
# Must also delete from the switch_stacks table.
DBQueryFatal("delete from switch_stacks where node_id='$node_id'");
exit(0);
}
#
# The node may not already exist.
#
if (Node->Lookup($node_id)) {
fatal("Switch already exists in the DB");
}
# Stack (type) must already exist, has to be created by hand with mysql.
if (defined($stack)) {
my $query_result =
DBQueryFatal("select stack_type from switch_stack_types ".
"where stack_id='$stack'");
if (!$query_result->numrows) {
fatal("Stack does not exist in the switch_stack_types table");
}
}
#
# Create the type if it does not exist.
#
my $nodetype = NodeType->Lookup($type);
if (!defined($nodetype)) {
CreateType($type);
$nodetype = NodeType->Lookup($type);
}
CreateSwitch();
exit(0);
#
# Add a new node type.
#
sub CreateType($)
{
my ($type) = @_;
my $protocol = ($layer1 ? "wire" : "ethernet");
#
# Defaults work for almost everything.
#
if ($debug || $impotent) {
print "Creating switch type: $type\n";
}
if (!$impotent) {
DBQueryFatal("replace into node_types set ".
" class='switch', type='$type', isswitch='1'");
}
#
# Device nodes are neither rebootable nor imageable.
#
if ($debug || $impotent) {
print "Adding false attributes rebootable/imageable\n";
print "Adding forwarding_protocols: $protocol\n";
}
if (!$impotent) {
DBQueryFatal("replace into node_type_attributes values ".
" ('$type','rebootable','0','boolean')");
DBQueryFatal("replace into node_type_attributes values ".
" ('$type','imageable','0','boolean')");
DBQueryFatal("replace into node_type_attributes values ".
" ('$type','forwarding_protocols','$protocol','string')");
}
return 0;
}
#
# Create the switch
#
sub CreateSwitch()
{
my $blob = {
"type" => $type,
"role" => ($layer1 ? "widearea_switch" : "testswitch"),
"initial_eventstate" => TBDB_NODESTATE_ISUP(),
};
my $node;
print "Creating new node $node_id\n";
if (!$impotent) {
$node = Node->Create($node_id, undef, $blob);
if (!defined($node)) {
fatal("Could not create new node");
}
if (defined($stack)) {
print STDERR "Adding to stack: $stack\n";
if (!DBQueryWarn("replace into switch_stacks set ".
" node_id='$node_id', stack_id='$stack'")) {
$node->Delete();
fatal("Could not add switch to stack");
}
}
if ($debug) {
print STDERR "$node\n";
}
}
return 0;
}
sub fatal($)
{
my ($mesg) = $_[0];
die("*** $0:\n".
" $mesg\n");
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment