Commit 6ccabef7 authored by Leigh Stoller's avatar Leigh Stoller

Merge branch 'master' of git-public.flux.utah.edu:/flux/git/emulab-devel

parents 2cd9ae73 2364ad56
......@@ -17,6 +17,7 @@ use vars qw(@ISA @EXPORT);
my $TB = "@prefix@";
my $BOSSNODE = "@BOSSNODE@";
my $TBDOCBASE = "@TBDOCBASE@";
my $ELVIN_COMPAT= @ELVIN_COMPAT@;
my $ASSIGN = "$TB/libexec/assign";
......@@ -235,17 +236,27 @@ sub MapResources($$$$)
foreach my $ref (@{ $solution->{'node'} }) {
my $virtual_id = $ref->{'virtual_id'};
my $node_uuid = $ref->{'component_uuid'};
my $node_urn = $ref->{'component_uuid'};
my $cm_urn = $ref->{'component_manager_uuid'};
my $noderef = $nodemap{$virtual_id};
#
# This writes the solution back into the original rspec.
#
$noderef->{'component_uuid'} = $node_uuid;
$noderef->{'component_urn'} = $node_uuid;
$noderef->{'component_uuid'} = $node_urn;
$noderef->{'component_urn'} = $node_urn;
$noderef->{'component_manager_uuid'} = $cm_urn;
if (exists($noderef->{'disk_image'})) {
my $osid = $noderef->{'disk_image'}->{'name'};
my ($auth,$type,$id) = GeniHRN::Parse($node_urn);
my $urn = GeniHRN::Generate($auth, "image", "emulab-ops");
$urn .= "//" . $osid;
$noderef->{'disk_image'}->{'name'} = $urn;
}
if (exists($ref->{'interface'})) {
my $interfaces = $ref->{'interface'};
......@@ -557,6 +568,8 @@ sub MapNodes($$)
"-s $BOSSNODE -k $eventkey,$keyhash -u '$sliver_urn'";
$cmd .= " -j " . $node->node_id()
if ($node->isvirtnode());
$cmd .= " -e 16509"
if ($ELVIN_COMPAT);
GeniXML::SetText("startup_command", $ref, "$cmd boot");
......
#
# EMULAB-COPYRIGHT
# Copyright (c) 2000-2007 University of Utah and the Flux Group.
# Copyright (c) 2000-2010 University of Utah and the Flux Group.
# All rights reserved.
#
......@@ -41,6 +41,7 @@ install:
@$(MAKE) -C stated install
@$(MAKE) -C linktest install
@$(MAKE) -C program-agent install
@$(MAKE) -C proxy install
client: trafgen-fetch client-subdirs
client-install: client client-install-subdirs
......@@ -51,6 +52,7 @@ control-install:
@$(MAKE) -C sched control-install
@$(MAKE) -C linktest control-install
@$(MAKE) -C program-agent control-install
@$(MAKE) -C proxy control-install
post-install:
@$(MAKE) -C linktest post-install
......
This diff is collapsed.
/*
* EMULAB-COPYRIGHT
* Copyright (c) 2000-2008 University of Utah and the Flux Group.
* Copyright (c) 2000-2010 University of Utah and the Flux Group.
* All rights reserved.
*/
......@@ -20,6 +20,8 @@
#include <sys/time.h>
#include <pubsub/pubsub.h>
#define EVENT_LIBRARY_VERSION "1.0"
#ifndef MAXHOSTNAMELEN
#define MAXHOSTNAMELEN 64
#endif /* MAXHOSTNAMELEN */
......@@ -135,6 +137,14 @@ int address_tuple_free(address_tuple_t);
event_notification_put_string(handle, note, "___SENDER___", buf)
#define event_notification_clr_sender(handle, note) \
event_notification_remove(handle, note, "___SENDER___")
#define event_notification_get_version(handle, note, buf, len) \
event_notification_get_string(handle, note, "___VERSION___", buf, len)
#define event_notification_set_version(handle, note, buf) \
event_notification_put_string(handle, note, "___VERSION___", buf)
#define event_notification_clr_version(handle, note) \
event_notification_remove(handle, note, "___VERSION___")
#endif /* ifndef NO_EVENT_MACROS */
#endif /* ifndef SWIG */
......
#
# EMULAB-COPYRIGHT
# Copyright (c) 2000-2009 University of Utah and the Flux Group.
# Copyright (c) 2000-2010 University of Utah and the Flux Group.
# All rights reserved.
#
......@@ -12,7 +12,7 @@ SUBDIR = event/proxy
SYSTEM := $(shell uname -s)
PROGRAMS = evproxy proxytest eventping evproxyplab
ifneq ($(SYSTEM),Linux)
PROGRAMS +=
PROGRAMS += version0_gateway
endif
include $(OBJDIR)/Makeconf
......@@ -87,11 +87,19 @@ evproxyplab.o: evproxyplab.cc
evproxyplab-debug: evproxyplab.o ../lib/libevent.a ../lib/event.h
$(CPPC) $(LDFLAGS) -o $@ evproxyplab.o $(LIBS)
version0_gateway: version0_gateway.c
$(CC) $(CFLAGS) $(PLDFLAGS) -pthread -o $@ $< -L/usr/local/lib \
-lpubsub_r -lm
eventping-debug: eventping.o
$(CC) $(LDFLAGS) -o $@ eventping.o -pthread $(LIBS)
$(PROGRAMS): ../lib/libevent.a ../lib/event.h
control-install: $(INSTALL_SBINDIR)/version0_gateway
install: $(INSTALL_DIR)/opsdir/sbin/version0_gateway
client: evproxy$(EXE) evproxyplab$(EXE)
client-install: client
$(INSTALL_PROGRAM) evproxy$(EXE) $(DESTDIR)$(CLIENT_BINDIR)/evproxy$(EXE)
......@@ -99,3 +107,8 @@ client-install: client
clean:
/bin/rm -f *.o $(PROGRAMS) *-debug
$(INSTALL_DIR)/opsdir/sbin/%: %
@echo "Installing $<"
-mkdir -p $(INSTALL_DIR)/opsdir/sbin
$(INSTALL) $< $@
......@@ -506,6 +506,15 @@ sub ConvertRspec($)
if (exists($ifaceref->{$key}));
}
}
if (exists($ref->{'disk_image'})) {
my $osref = $ref->{'disk_image'};
my $os = GeniXML::AddElement("disk_image", $node);
foreach my $key ('name') {
GeniXML::SetText($key, $os, $osref->{$key})
if (exists($osref->{$key}));
}
}
}
if (exists($rspec->{'link'})) {
foreach my $linkref (@{ $rspec->{'link'} }) {
......
......@@ -337,6 +337,11 @@ sub Create($$$$;$)
foreach my $keyref (@{ $keys }) {
my $key = $keyref->{'key'};
my $type = $keyref->{'type'};
next
if (! (defined($key) && defined($type) &&
$key ne "" && $type ne ""));
chomp($key);
chomp($type);
......@@ -387,6 +392,11 @@ sub Modify($$$$)
foreach my $keyref (@{ $keys }) {
my $key = $keyref->{'key'};
my $type = $keyref->{'type'};
next
if (! (defined($key) && defined($type) &&
$key ne "" && $type ne ""));
chomp($key);
chomp($type);
......
......@@ -309,6 +309,46 @@ sub RegisterSlices()
}
}
sub ReportLockedSlices()
{
my $msg = "";
my $query_result =
GeniDB::DBQueryWarn("select idx,locked from geni_slices ".
"where locked is not null and ".
" DATE_SUB(NOW(),INTERVAL 1 DAY) >= locked");
if (!$query_result) {
Fatal("ReportLockedSlices: Error getting info from the DB.");
}
return
if (!$query_result->numrows);
while (my ($idx, $locked) = $query_result->fetchrow_array()) {
my $slice = GeniSlice->Lookup($idx);
if (!defined($slice)) {
# Slice is gone, lets not worry.
next;
}
my $urn = $slice->urn();
$msg .= "$urn : $locked\n";
print STDERR "$urn : locked since $locked\n";
}
return
if ($msg eq "");
#
# Send a message to the testbed list.
#
SENDMAIL($TBOPS,
"ProtoGENI expire daemon: Locked Slices",
"The following CM slices have been locked for a long time\n\n".
$msg,
$TBOPS);
}
while (1) {
next
if (NoLogins());
......@@ -320,6 +360,7 @@ while (1) {
ExpireSlices();
ShutdownSlices();
RegisterSlices();
ReportLockedSlices();
# Be certain stale info is gone.
Experiment->FlushAll();
......
<rspec xmlns="http://protogeni.net/resources/rspec/0.1">
<node virtual_id="bbg1"
component_urn="urn:publicid:IDN+emulab.net+node+bbg1"
virtualization_type="emulab-vnode"
exclusive="1">
<interface virtual_id="virt0"/>
</node>
<node virtual_id="bbg2"
component_urn="urn:publicid:IDN+emulab.net+node+bbg2"
virtualization_type="emulab-vnode"
exclusive="1">
<interface virtual_id="virt0"/>
</node>
<link virtual_id="link0">
<bandwidth>1000000</bandwidth>
<interface_ref
virtual_interface_id="virt0"
virtual_node_id="bbg1"
/>
<interface_ref
virtual_interface_id="virt0"
virtual_node_id="bbg2"
/>
</link>
</rspec>
<rspec xmlns="http://protogeni.net/resources/rspec/0.1">
<rspec xmlns="http://protogeni.net/resources/rspec/0.2">
<node virtual_id="geni1"
virtualization_type="emulab-vnode">
</node>"
<disk_image
name="urn:publicid:IDN+emulab.net+image+emulab-ops//FEDORA8-OVZ-STD" />
</node>
<node virtual_id="geni2"
virtualization_type="emulab-vnode">
<disk_image
name="urn:publicid:IDN+emulab.net+image+emulab-ops//FEDORA8-OVZ-STD" />
</node>
<link virtual_id="link0" link_type="tunnel">
<interface_ref virtual_node_id="geni1"
virtual_interface_id="virt0"
tunnel_ip="192.168.1.1" />
<interface_ref virtual_node_id="geni2" " +\
<interface_ref virtual_node_id="geni2"
virtual_interface_id="virt0"
tunnel_ip="192.168.1.2" />
</link>
......
......@@ -303,7 +303,10 @@ def resolve_slice( name, selfcredential ):
params = {}
params["credential"] = mycredential
params["type"] = "Slice"
params["hrn"] = name
if name.startswith("urn:"):
params["urn"] = name
else:
params["hrn"] = name
rval,response = do_method("sa", "Resolve", params)
if rval:
Fatal("Slice does not exist");
......
......@@ -27,6 +27,7 @@ ACCEPTSLICENAME=1
debug = 0
impotent = 1
rspec = None
execfile( "test-common.py" )
......@@ -41,13 +42,7 @@ elif len(REQARGS) == 1:
except IOError, e:
print >> sys.stderr, args[ 0 ] + ": " + e.strerror
sys.exit( 1 )
else:
rspec = "<rspec xmlns=\"http://protogeni.net/resources/rspec/0.1\"> " +\
" <node virtual_id=\"geni1\" "+\
" virtualization_type=\"emulab-vnode\" " +\
" startup_command=\"/bin/ls > /tmp/foo\"> " +\
" </node>" +\
"</rspec>"
pass
#
# Get a credential for myself, that allows me to do things at the SA.
......@@ -116,21 +111,21 @@ if rval:
slivercred = response["value"]
print "Got the sliver credential"
#
# Renew the sliver, for kicks
#
valid_until = time.strftime("%Y%m%dT%H:%M:%S",time.gmtime(time.time() + 6000));
print "Renewing the Sliver until " + valid_until
params = {}
params["credentials"] = (slicecred,)
params["slice_urn"] = SLICEURN
params["expiration"] = valid_until
rval,response = do_method("cm", "RenewSlice", params, version="2.0")
if rval:
Fatal("Could not renew sliver")
if rspec == None:
#
# Do a resolve to get the manifest urn.
#
print "Resolving the sliver at the CM to get the manifest"
params = {}
params["credentials"] = (slicecred,)
params["urn"] = myslice["sliver_urn"]
rval,response = do_method("cm", "Resolve", params, version="2.0")
if rval:
Fatal("Could not get resolve slice")
pass
mysliver = response["value"]
rspec = mysliver["manifest"];
pass
print "Sliver has been renewed"
#
# Update the sliver, getting a ticket back
......
......@@ -48,7 +48,7 @@ endif
# Force dependencies to make sure configure regenerates if the .in file
# is changed.
#
all: $(RC_SCRIPTS) $(OPS_SCRIPTS) capture.sh
all: $(RC_SCRIPTS) $(OPS_SCRIPTS) capture.sh 3.v0_gateway.sh
include $(TESTBED_SRCDIR)/GNUmakerules
......@@ -80,6 +80,9 @@ subboss-install: $(addprefix $(INSTALL_RCDIR)/, $(SUBBOSS_SCRIPTS))
clrhouse-install: $(INSTALL_RCDIR)/2.mysql-server.sh \
$(INSTALL_RCDIR)/1.mysql-client.sh
gateway-install: $(INSTALL_RCDIR)/3.v0_gateway.sh
tipserv-install: $(addprefix $(INSTALL_RCDIR)/, $(TIP_SCRIPTS))
else
install control-install subboss-install clrhouse-install tipserv-install:
......
......@@ -1245,6 +1245,12 @@ sub GenVirtNodes($)
else {
$ref->{'virtualization_type'} = 'raw';
$ref->{'exclusive'} = 1;
if (defined($vnode->_osinfo())) {
my $osname = $vnode->_osinfo()->osname();
$ref->{'disk_image'} = {"name" => $osname};
}
}
if (@ifaces) {
......@@ -5197,17 +5203,20 @@ sub InitializePhysNode($$$)
if ($self->regression()) {
$rsrvsets{"rsrv_time"} = 0;
}
my $setstr = join(",", map("$_='" . $nodesets{$_} . "'", keys(%nodesets)));
$self->printdb(" $setstr\n");
DBQueryWarn("update nodes set $setstr where node_id='$pnodename'")
if ($self->verbose()) {
my $setstr = join(",",
map("$_='" . $nodesets{$_} . "'", keys(%nodesets)));
$self->printdb(" $setstr\n");
}
$pnode->Update(\%nodesets) == 0
or return -1 if (!$self->impotent());
$setstr = join(",", map("$_='" . $rsrvsets{$_} . "'", keys(%rsrvsets)));
$self->printdb(" $setstr\n");
DBQueryWarn("update reserved set $setstr where node_id='$pnodename'")
if ($self->verbose()) {
my $setstr =
join(",", map("$_='" . $rsrvsets{$_} . "'", keys(%rsrvsets)));
$self->printdb(" $setstr\n");
}
$pnode->ModifyReservation(\%rsrvsets) == 0
or return -1 if (!$self->impotent());
#
......
......@@ -156,7 +156,7 @@ control-script-install: dir-install bossnode
$(INSTALL) bossnode $(ETCDIR)/bossnode
PGENIFILES = rc.ifconfig rc.topomap rc.progagent rc.pgeni \
rc.tarfiles rc.rpms
rc.tarfiles rc.rpms rc.trafgen
pgeni-tarball:
-rm -f $(TBROOT)/www/downloads/geniclient.tar
......
......@@ -182,8 +182,14 @@ sub doboot()
# with a local interface.
push(@ifacemap, "$iface $inet $mac");
}
elsif ($ifconfig->{ISVIRT}
&& (INXENVM() || (GENVNODE() && GENVNODETYPE() eq 'openvz'))) {
elsif ($ifconfig->{ISVIRT} &&
(INXENVM() || SHADOW() ||
(GENVNODE() && GENVNODETYPE() eq 'openvz'))) {
#
#
#
#
# Yes, these are veths, but we config them from the inside just
# like for a phys node!
......@@ -379,7 +385,7 @@ sub mygetifconfig($)
for (my $tries = 0; $tries < $maxtries; $tries++) {
my $bad = 0;
foreach my $ifconfig (@ifacelist) {
if (!INXENVM() &&
if (!INXENVM() &&
$ifconfig->{ISVIRT} &&
$ifconfig->{ITYPE} eq "vlan" && $ifconfig->{VTAG} == 0) {
$bad++;
......
#!/usr/bin/perl -w
#
# EMULAB-COPYRIGHT
# Copyright (c) 2004 University of Utah and the Flux Group.
# Copyright (c) 2004-2010 University of Utah and the Flux Group.
# All rights reserved.
#
use English;
......@@ -153,14 +153,14 @@ sub dokeyhash()
#
# Write a file so the node knows the key.
#
my $oldumask = umask(0227);
my $oldumask = umask((FAKEJAILED() ? 0227 : 0222));
if (system("echo '$keyhash' > ". TMKEYHASH)) {
fatal("Could not write " . TMKEYHASH);
}
umask($oldumask);
return 0;
}
+}
#
# Get the event key
......@@ -190,7 +190,7 @@ sub doeventkey()
#
# Write a file so the node knows the key.
#
my $oldumask = umask(0227);
my $oldumask = umask((FAKEJAILED() ? 0227 : 0222));
if (system("echo -n '$eventkey' > ". TMEVENTKEY)) {
fatal("Could not write " . TMEVENTKEY);
......
......@@ -188,6 +188,7 @@ sub doboot()
print "Starting Program Agent ...\n";
my $server = getlocalevserver();
my $port = "";
if (SHADOW()) {
my $boss = $ENV{'BOSSNAME'};
......@@ -196,6 +197,14 @@ sub doboot()
}
my ($domain) = ($boss =~ /^[^\.]+\.(.*)$/);
$server = "event-server.${domain}";
#
# See if we need to connect to the compatability gateway.
# Version 0, no elvin compat.
#
if (exists($ENV{'V0_COMPAT'})) {
$port = "-p " . $ENV{'V0_COMPAT'};
}
}
#
......@@ -225,7 +234,7 @@ sub doboot()
"-v $vname -r -p $elvind_port -t $TOKEN");
}
else {
system("$PAGENT -e $pid/$eid -s $server -l $LOGFILE ".
system("$PAGENT -e $pid/$eid -s $server $port -l $LOGFILE ".
"-v $vname -t $TOKEN ".
"-d -i $PIDFILE -k " . TMEVENTKEY() . " -c $CONFIG");
exit(0)
......
#!/usr/bin/perl -w
#
# EMULAB-COPYRIGHT
# Copyright (c) 2004, 2008 University of Utah and the Flux Group.
# Copyright (c) 2004-2010 University of Utah and the Flux Group.
# All rights reserved.
#
use English;
......@@ -46,7 +46,7 @@ use librc;
# Not all clients support this.
#
exit(0)
if (MFS() || (REMOTE() && !REMOTEDED()));
if (MFS() || (REMOTE() && !(REMOTEDED() || FAKEJAILED() || JAILED())));
# Now safe to do this since MFS does not have full perl install.
require Socket;
......@@ -161,8 +161,27 @@ sub doboot()
$SIG{INT} = \&Pcleanup;
$SIG{HUP} = \&Pcleanup;
my $evserver = getlocalevserver();
my $evport = "";
if (SHADOW()) {
my $boss = $ENV{'BOSSNAME'};
if (!defined($boss)) {
fatal("BOSSNAME is not set in the environment");
}
my ($domain) = ($boss =~ /^[^\.]+\.(.*)$/);
$evserver = "event-server.${domain}";
#
# See if we need to connect to the compatability gateway.
# Version 0, no elvin compat.
#
if (exists($ENV{'V0_COMPAT'})) {
$evport = "-p " . $ENV{'V0_COMPAT'};
}
}
# We connect to the local elvind and talk to the master via the proxy.
my $cmdline = "$BINDIR/trafgen -s " . getlocalevserver();
my $cmdline = "$BINDIR/trafgen -s $evserver $evport";
if ($pid) {
$cmdline .= " -E $pid/$eid -k " . TMEVENTKEY();
}
......
......@@ -18,12 +18,13 @@ sub usage()
" -s server -u urn [-j vnodeid] boot|shutdown|reconfig|reset\n";
exit(1);
}
my $optlist = "s:j:u:k:";
my $optlist = "s:j:u:k:e:";
my $vnodeid;
my $server;
my $action;
my $eventkey;
my $keyhash;
my $v0_compat;
my $urn;
# Turn off line buffering on output
......@@ -50,6 +51,8 @@ use libtestbed;
# Script specific goo.
my $RCDIR = "$BINDIR/rc";
my $LOGFILE = "$LOGDIR/pgeniboot.debug";
my $PAGENT = "$BINDIR/program-agent";
my @SAVEARGV = @ARGV;
# Protos.
sub doboot();
......@@ -71,6 +74,9 @@ if (defined($options{'k'})) {
if (defined($options{'u'})) {
$urn = $options{'u'};
}
if (defined($options{'e'})) {
$v0_compat = $options{'e'};
}
if (defined($options{'j'})) {
$vnodeid = $options{'j'};
libsetup_setvnodeid($vnodeid);
......@@ -85,6 +91,18 @@ usage()
# For tmcc client.
$ENV{'BOSSNAME'} = $server;
my @BOOTSCRIPTS = ("rc.misc", "rc.topomap",
"rc.tarfiles", "rc.rpms",
"rc.route", "rc.ifconfig", "rc.hostnames",
"rc.trafgen", "rc.progagent");
# For event clients. See progagent and trafgen.
if (defined($v0_compat) &&
system("strings $PAGENT | grep -q -s 'Emulab Event Library:'") &&
system("strings $PAGENT | grep -q -s '___elvin_ordered___'")) {
$ENV{'V0_COMPAT'} = $v0_compat;
}
#
# We want to save all of the output off
#
......@@ -167,6 +185,26 @@ sub doboot()
}
my $optarg = (defined($vnodeid) ? "-j $vnodeid" : "");
#
# Generate a script to shut this down.
#
my $shutdown_script = "$VARDIR/shadow/boot/rc.shutdown";
if (open(FOO, ">$shutdown_script")) {
if ($SAVEARGV[$#SAVEARGV] eq "boot") {
pop(@SAVEARGV);
}
push(@SAVEARGV, "shutdown");
print FOO "#!/bin/sh\n";
print FOO "$PROGRAM_NAME @SAVEARGV\n";
close(FOO);
chmod(0755, $shutdown_script);
print "Created $shutdown_script\n";
}
else {
BootFatal(-1, "Could not create $shutdown_script");
}
if (-x "$BINDIR/watchdog") {
print("Starting testbed update watchdog\n");
system("$BINDIR/watchdog $optarg start");
......@@ -227,12 +265,7 @@ sub doboot()
}
}
my @bootscripts = ("rc.misc", "rc.topomap",
"rc.tarfiles", "rc.rpms",
"rc.route", "rc.ifconfig", "rc.hostnames",
"rc.progagent");
foreach my $script (@bootscripts) {
foreach my $script (@BOOTSCRIPTS) {
next
if (!-x "$BINDIR/rc/$script");
......@@ -255,6 +288,22 @@ sub doboot()
#
sub doshutdown()
{
my %TMCCTIMEOUT = ("timeout" => 5);
my $optarg = (defined($vnodeid) ? "-j $vnodeid" : "");
foreach my $script (reverse(@BOOTSCRIPTS)) {
next
if (!-x "$BINDIR/rc/$script");
print "Running $BINDIR/rc/$script $optarg shutdown\n";
system("$BINDIR/rc/$script $optarg shutdown");
}
print("Informing Emulab Control that we are are rebooting\n");
if (tmcc(TMCCCMD_STATE, "SHUTDOWN", undef, %TMCCTIMEOUT) < 0) {
fatal("Error sending SHUTDOWN to Emulab Control!");
}
}
#
......
......@@ -4275,6 +4275,7 @@ COMMAND_PROTOTYPE(donseconfigs)
COMMAND_PROTOTYPE(dostate)
{
char newstate[128]; /* More then we will ever need */
int i;
#ifdef EVENTSYS
address_tuple_t tuple;
#endif
......@@ -4291,6 +4292,17 @@ COMMAND_PROTOTYPE(dostate)
error("DOSTATE: %s: Bad arguments\n", reqp->nodeid);
return 1;
}
/*
* Sanity check. No special or weird chars.
*/
for (i = 0; i < strlen(newstate); i++) {
if (! (isalnum(newstate[i]) ||
newstate[i] == '_' || newstate[i] == '-')) {
error("DOSTATE: %s: Bad state name\n", reqp->nodeid);
return 1;
}
}
#ifdef EVENTSYS
/*
* Send the state out via an event
......
<?PHP
#
# EMULAB-COPYRIGHT
# Copyright (c) 2003, 2005, 2006, 2007 University of Utah and the Flux Group.
# Copyright (c) 2003-2010 University of Utah and the Flux Group.
# All rights reserved.
#
require("defs.php3");
......@@ -27,7 +27,6 @@ if (! $isadmin) {
# Verify page arguments.
#
$optargs = OptionalPageArguments("selected", PAGEARG_ARRAY,
"remap", PAGEARG_ARRAY,
"delete", PAGEARG_STRING,
"calc", PAGEARG_STRING,
"create", PAGEARG_STRING,
......@@ -36,8 +35,7 @@ $optargs = OptionalPageArguments("selected", PAGEARG_ARRAY,
"swap", PAGEARG_STRING,
"newtype", PAGEARG_STRING,
"newprefix", PAGEARG_STRING,
"addnumber", PAGEARG_STRING,
"renumber", PAGEARG_STRING);
"addnumber", PAGEARG_STRING);
#
# Standard Testbed Header
......@@ -83,7 +81,7 @@ if (count($selected_nodes)) {
} else {
if (isset($delete) || isset($calc) || isset($create) ||
isset($research) || isset($swap<