newmote.in 3.08 KB
Newer Older
1 2
#!/usr/bin/perl -wT
#
3
# Copyright (c) 2005-2017 University of Utah and the Flux Group.
4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
# 
# {{{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/>.
# 
# }}}
23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 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 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129
#

#
# newmote -
#

use lib '@prefix@/lib';
my $TB = '@prefix@';
 
use libdb;
use English;
use Getopt::Std;

# un-taint path
$ENV{'PATH'} = "/bin:/usr/bin:/usr/local/bin:$TB/bin";
delete @ENV{'IFS', 'CDPATH', 'ENV', 'BASH_ENV'};
 
use strict;

#
# Constants
#
my $DEBUG  = 1;

#
# Experiments we might put nodes into
#
my $PID_HWDOWN = NODEDEAD_PID();
my $EID_HWDOWN = NODEDEAD_EID();

my $nalloc = "$TB/bin/nalloc";
my $phys_nodeid = "";
my $do_nalloc = 1;

#
# Handle command-line arguments
# TODO: Allow a user to specify some of their own arguments to uisp
#
sub usage() {
    print STDERR "Usage: $0 [-hdf] [-p phys] <type> <motes...>\n";
    exit(2);
}

my $optlist = "dhfp:";

my %options = ();
if (! getopts($optlist, \%options)) {
    usage();
}
if (defined($options{"d"})) {
    $DEBUG = 1;
}
if (defined($options{"h"})) {
    usage();
}
if (defined($options{"f"})) {
    $do_nalloc = 0;
}
if (defined($options{"p"})) {
    $phys_nodeid = $options{"p"};

    if ($phys_nodeid =~ /^([-\w]+)$/) {
	$phys_nodeid = $1;
    }
    else {
	die("*** Bad phys_nodeid: $phys_nodeid.\n");
    }
}

if (@ARGV < 2) {
    usage();
}

my $type = shift(@ARGV);
my @node_ids = @ARGV;

if ($type =~ /^([-\w]+)$/) {
    $type = $1;
}
else {
    die("*** Bad mote type: $type.\n");
}

foreach my $node_id (@node_ids) {
    if ($node_id =~ /^([-\w]+)$/) {
	$node_id = $1;
    }
    else {
	die("*** Bad node id: $node_id.\n");
    }

    my $pnode;
    if ($phys_nodeid eq "") {
	$pnode = $node_id;
    } else {
	$pnode = $phys_nodeid;
    }
    
    DBQueryFatal("REPLACE INTO nodes SET ".
		 "node_id='$node_id',type='$type',phys_nodeid='$pnode',".
		 "role='testnode',def_boot_osid='emulab-ops-TinyOS-STD',".
		 "bootstatus='okay',status='up',status_timestamp=NOW(),".
		 "failureaction='fatal',routertype='none',eventstate='ISUP',".
		 "state_timestamp=NOW(),op_mode='ALWAYSUP',".
		 "op_mode_timestamp=NOW(),allocstate='FREE',".
		 "allocstate_timestamp=NOW()");

130 131
    DBQueryFatal("REPLACE INTO `partitions` SET ".
		 "node_id='$node_id',`partition`=1,".
132 133 134 135 136 137 138 139 140 141
		 "osid='emulab-ops-TinyOS-STD'");
    
    DBQueryFatal("REPLACE INTO tiplines SET ".
		 "tipname='$node_id',node_id='$node_id',".
		 "server='@USERNODE@'"); # XXX Better subst for user node

    if ($do_nalloc) {
	system "$nalloc $PID_HWDOWN $EID_HWDOWN $node_id";
    }
}