diff --git a/utils/newnode.in b/utils/newnode.in index a5a066ff0481a5e28da77d915c79913c02e7fd26..49f98874f866e35ef908f66d9221380e8a91940f 100644 --- a/utils/newnode.in +++ b/utils/newnode.in @@ -28,6 +28,14 @@ my $dhcpd_conf = "/usr/local/etc/dhpcd.conf"; my $dhcpd_template = "/usr/local/etc/dhcpd.conf.template"; my $dhcpd_rc = "/usr/local/etc/rc.d/2.dhcpd.sh"; +my $sudo = "/usr/local/bin/sudo"; + +# +# Initial event system state to put the nodes into +# +my $INITIAL_STATE = "SHUTDOWN"; +my $INITIAL_OPMODE = "MINIMAL"; + if (!TBAdmin()) { die "Sorry, only testbed administrators can run this script!\n"; } @@ -36,6 +44,13 @@ if (@ARGV < 1) { die "Usage: $0 <node_id> ...\n"; } +# +# The user has to be able to run sudo, so they can restart dhcpd. +# +if (system "$sudo -s /bin/pwd < /dev/null") { + die "You must be able to sudo to root to use this script\n"; +} + my @node_ids = @ARGV; # @@ -81,7 +96,7 @@ NODE: foreach my $node_id (@node_ids) { # # Grab the node's MACs from the new_interfaces table # - $query_result = DBQueryFatal("SELECT iface, MAC, interface_type, " . + $query_result = DBQueryFatal("SELECT card, MAC, interface_type, " . "switch_id, switch_card, switch_port " . "FROM new_interfaces WHERE new_node_id='$new_node_id'"); if (!$query_result->num_rows()) { @@ -90,7 +105,7 @@ NODE: foreach my $node_id (@node_ids) { } my %interfaces; - while (my ($iface, $MAC, $iface_type, $switch_id, $switch_card, + while (my ($card, $MAC, $iface_type, $switch_id, $switch_card, $switch_port) = $query_result->fetchrow()) { # # Get some more information about this interface type @@ -98,7 +113,7 @@ NODE: foreach my $node_id (@node_ids) { my $iface_query = DBQueryFatal("SELECT max_speed, full_duplex " . "FROM interface_types WHERE type='$iface_type'"); if (!$iface_query->num_rows()) { - warn "Node $node_id failed: Interface $iface is of unknown type " . + warn "Node $node_id failed: Interface $card is of unknown type " . "$iface_type"; next NODE; } @@ -108,7 +123,7 @@ NODE: foreach my $node_id (@node_ids) { # # Stash it away... # - $interfaces{$iface} = [$MAC, $iface_type, $max_speed, $full_duplex, + $interfaces{$card} = [$MAC, $iface_type, $max_speed, $full_duplex, $switch_id, $switch_card, $switch_port]; } @@ -129,13 +144,13 @@ NODE: foreach my $node_id (@node_ids) { # DBQueryFatal("INSERT INTO nodes SET node_id='$node_id', type='$type', " . - "phys_nodeid='$node_id', role='testnode', priority=$priority"); + "phys_nodeid='$node_id', role='testnode', priority=$priority" . + "eventstate='$INITIAL_STATE', op_mode='$INITIAL_OPMODE'"); - while (my ($iface, $aref) = each %interfaces) { + while (my ($card, $aref) = each %interfaces) { my ($MAC, $iface_type, $speed, $duplex, $switch_id, $switch_card, $switch_port) = @$aref; - $iface =~ /(\d+)$/; - my $card = $1; + my $iface = "eth$card"; my $iface_IP = ""; my $wire_type = "Node"; if ($card == $control_net) { @@ -186,8 +201,8 @@ if (!@succeeded_nodes) { # if (! -f $dhcpd_template) { warn "Warning: $dhcpd_template does not exist\n"; - warn "You'll need to re-run dhcpd_makeconf manually, then free the new\n"; - warn "nodes from emulab-ops/hwdown\n"; + warn "You'll need to re-run dhcpd_makeconf manually, free the new\n"; + warn "nodes from emulab-ops/hwdown, then reboot them.\n"; } else { print "Re-generating dhcpd.conf\n"; open(CONF,"$dhcpd_makeconf $dhcpd_template|") or die "Unable to fork: $!\n"; @@ -198,14 +213,20 @@ if (! -f $dhcpd_template) { print CONF @conf; close CONF; - print "Restarting dhcpd\n"; - system "$dhcpd_rc stop"; - system "$dhcpd_rc start"; + if ($> == 0) { + print "Restarting dhcpd\n"; + system "$sudo $dhcpd_rc stop"; + sleep 2; + system "$sudo $dhcpd_rc start"; - # - # Now, free all the nodes we just made from hwdown, so that they can reload - # - system "$nfree emulab-ops hwdown " . join(" ",@succeeded_nodes); + # + # Now, free all the nodes we just made from hwdown, so that they can reload + # + system "$nfree emulab-ops hwdown " . join(" ",@succeeded_nodes); + } else { + warn "Warning: You will need to restart dhcpd, free the nodes\n"; + warn "from emulab-ops/hwdown, then reboot them.\n"; + } }