Skip to content
GitLab
Projects
Groups
Snippets
Help
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
emulab-stable
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Analytics
Analytics
Repository
Value Stream
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Commits
Open sidebar
emulab
emulab-stable
Commits
1e8d93dd
Commit
1e8d93dd
authored
Jun 18, 2010
by
Ryan Jackson
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
add libxmlrpc stuff for subboss
parent
e99c2f4f
Changes
7
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
7081 additions
and
1730 deletions
+7081
-1730
GNUmakefile.in
GNUmakefile.in
+1
-0
configure
configure
+5904
-1723
configure.in
configure.in
+8
-5
tbsetup/GNUmakefile.in
tbsetup/GNUmakefile.in
+7
-0
tbsetup/subboss_frisbeeimage.in
tbsetup/subboss_frisbeeimage.in
+148
-0
tbsetup/subboss_frisbeelauncher.in
tbsetup/subboss_frisbeelauncher.in
+564
-0
xmlrpc/emulabserver.py.in
xmlrpc/emulabserver.py.in
+449
-2
No files found.
GNUmakefile.in
View file @
1e8d93dd
...
...
@@ -238,6 +238,7 @@ endif
@$(MAKE) -C tmcd subboss-install
@$(MAKE) -C rc.d subboss-install
@$(MAKE) -C dhcpd subboss-install
@$(MAKE) -C tbsetup client-install
# Hack: this should probably be done by a subboss-install
# script, but there isn't a huge need for that yet
@rm -f $(INSTALL_RCDIR)/isc-dhcpd
...
...
configure
View file @
1e8d93dd
This diff is collapsed.
Click to expand it.
configure.in
View file @
1e8d93dd
...
...
@@ -101,7 +101,7 @@ AC_SUBST(optional_subdirs)
# These get defined in the definitions file (--with-TBDEFS).
# NB: See AC_DEFINE_UNQUOTED() calls below, if you want a variable
# to appear in config.h.
#
#
AC_SUBST(TBDBNAME)
AC_SUBST(TBERRORLOGDBNAME)
AC_SUBST(TBADMINGROUP)
...
...
@@ -156,6 +156,7 @@ AC_SUBST(ELABINELAB)
AC_SUBST(OUTERBOSS_NODENAME)
AC_SUBST(OUTERBOSS_XMLRPCPORT)
AC_SUBST(OUTERBOSS_SSLCERTNAME)
AC_SUBST(SUBBOSS_SSLCERTNAME)
AC_SUBST(PLABSUPPORT)
AC_SUBST(PUBSUPPORT)
AC_SUBST(WIKISUPPORT)
...
...
@@ -250,7 +251,7 @@ AC_SUBST(TBERRORSEMAIL_NOSLASH)
#
# Defaults for for above variables.
#
#
TBERRORLOGDBNAME="errorlog"
TBADMINGROUP="flux"
CLIENT_ETCDIR="/etc/emulab"
...
...
@@ -270,6 +271,7 @@ ELABINELAB=0
OUTERBOSS_NODENAME=""
OUTERBOSS_XMLRPCPORT=3069
OUTERBOSS_SSLCERTNAME="/etc/outer_emulab.pem"
SUBBOSS_SSLCERTNAME="/etc/subboss.pem"
PLABSUPPORT=0
PUBSUPPORT=0
WIKISUPPORT=0
...
...
@@ -431,7 +433,7 @@ AC_SUBST(LOG_TESTBED)
# If the private network is different then the control network, we need
# an extra subnet decl for it in dhcpd.conf.template. This is enormously
# crude and simplistic, but works for the local case!
#
#
if test "$PRIVATE_NETWORK" != "$CONTROL_NETWORK"; then
DHCPD_CONTROLNET_DECL="subnet $PRIVATE_NETWORK netmask $PRIVATE_NETMASK {}"
fi
...
...
@@ -660,7 +662,7 @@ AC_SUBST(OPT_CFLAGS)
#
# Disable event system. Relies on Elvin. On by default.
#
#
AC_ARG_ENABLE(events,
[ --disable-events Disable events (requires Elvin libraries)])
...
...
@@ -715,7 +717,7 @@ fi
# Enable Windows support.
# Right now this means NTFS support in imagezip, maybe more things later.
# Relies on Linux NTFS library.
#
#
AC_ARG_ENABLE(windows,
[ --enable-windows Enable Windows XP support (default)])
...
...
@@ -868,6 +870,7 @@ outfiles="$outfiles Makeconf GNUmakefile \
tbsetup/wanlinkinfo tbsetup/wanassign \
tbsetup/swapexp tbsetup/endexp tbsetup/elabinelab \
tbsetup/frisbeelauncher tbsetup/eventsys.proxy tbsetup/frisbeeimage \
tbsetup/subboss_frisbeelauncher tbsetup/subboss_frisbeeimage \
tbsetup/snmpit.proxy tbsetup/snmpit_remote.pm \
tbsetup/snmpit tbsetup/ns2ir/GNUmakefile \
tbsetup/ns2ir/parse.tcl tbsetup/ns2ir/tb_compat.tcl \
...
...
tbsetup/GNUmakefile.in
View file @
1e8d93dd
...
...
@@ -48,6 +48,8 @@ ifeq ($(ISMAINSITE),1)
SBIN_STUFF += repos_daemon
endif
SUBBOSS_SBIN_STUFF = subboss_frisbeelauncher subboss_frisbeeimage
CTRLSBIN_STUFF = console_setup.proxy sfskey_update.proxy \
savelogs.proxy eventsys.proxy
...
...
@@ -266,6 +268,11 @@ endif
chown root $(INSTALL_SBINDIR)/nfstrace
chmod u+s $(INSTALL_SBINDIR)/nfstrace
#
# Subboss installation
#
subboss-install: $(addprefix $(INSTALL_SBINDIR)/, $(SUBBOSS_SBIN_STUFF))
#
# Control node installation (okay, plastic)
#
...
...
tbsetup/subboss_frisbeeimage.in
0 → 100644
View file @
1e8d93dd
#!/usr/bin/perl -wT
#
# EMULAB-COPYRIGHT
# Copyright (c) 2000-2002, 2004, 2006, 2007 University of Utah and the Flux Group.
# All rights reserved.
#
use
English
;
use
Getopt::
Std
;
#
# Ask outer emulab for an image we do not happen to have locally.
#
sub
usage
()
{
print
STDOUT
"
Usage: frisbeeimage [-d] imageid filename
\n
";
exit
(
-
1
);
}
my
$optlist
=
"
d
";
my
$debug
=
1
;
#
# Configure variables
#
my
$TB
=
"
@prefix
@
";
my
$TBOPS
=
"
@TBOPSEMAIL
@
";
my
$RPCSERVER
=
"
@OUTERBOSS_NODENAME
@
";
my
$RPCPORT
=
"
@OUTERBOSS_XMLRPCPORT
@
";
my
$RPCCERT
=
"
@OUTERBOSS_SSLCERTNAME
@
";
# un-taint path
$ENV
{'
PATH
'}
=
'
/bin:/usr/bin:/usr/local/bin:/usr/site/bin
';
delete
@ENV
{'
IFS
',
'
CDPATH
',
'
ENV
',
'
BASH_ENV
'};
#
# Turn off line buffering on output
#
$|
=
1
;
#
# We don't want to run this script unless its the real version.
#
if
(
$EUID
!=
0
)
{
die
("
Must be root! Maybe its a development version?
\n
");
}
# Load the Testbed support stuff.
use
lib
"
@prefix
@/lib
";
use
libtestbed
;
use
libxmlrpc
;
# Locals
my
$FRISBEE
=
"
$TB
/sbin/frisbee
";
my
$SAVEUID
=
$UID
;
my
$loadaddr
;
my
$loadport
;
my
$mcastif
;
#
# Parse command arguments. Once we return from getopts, all that should
# left are the required arguments.
#
%options
=
();
if
(
!
getopts
(
$optlist
,
\
%options
))
{
usage
();
}
if
(
defined
(
$options
{"
d
"}))
{
$debug
=
1
;
}
if
(
!
@ARGV
)
{
usage
();
}
my
(
$imageid
,
$filename
)
=
@ARGV
;
#
# Untaint the arguments.
#
if
(
$imageid
=~
/^([-\@\w\+\.]+)$/
)
{
$imageid
=
$
1
;
}
else
{
die
("
Tainted argument
$imageid
!
\n
");
}
my
$mcast_ip_file
=
"
/var/emulab/boot/myip
";
if
(
!
-
e
$mcast_ip_file
)
{
die
("
$mcast_ip_file
does not exist!
");
}
$mcastif
=
`
cat
$mcast_ip_file
`;
chomp
(
$mcastif
);
if
(
$mcastif
=~
/^([\d\.]+)$/
)
{
$mcastif
=
$
1
;
}
else
{
die
("
Could not parse outer IP:
$mcastif
!
");
}
#
# Ask the outer Emulab to lauch a frisbee and return the loadinfo to us.
#
libxmlrpc::
Config
({"
server
"
=>
$RPCSERVER
,
"
verbose
"
=>
1
,
"
cert
"
=>
$RPCCERT
,
"
portnum
"
=>
$RPCPORT
});
my
$rval
=
libxmlrpc::
CallMethod
("
subboss
",
"
frisbeelauncher
",
{"
imageid
"
=>
"
$imageid
"});
if
(
!
defined
(
$rval
))
{
die
("
Could not fire up frisbee on boss!
");
}
#
# The return value is the loadaddr. Parse that into something we
# can pass to the frisbee client.
#
if
(
$rval
=~
/^(.*):(\d*)$/
)
{
$loadaddr
=
$
1
;
$loadport
=
$
2
;
}
else
{
die
("
Could not parse loadinfo from server:
$rval
!
");
}
if
(
$debug
)
{
print
"
$FRISBEE
-N -i
$mcastif
-m
$loadaddr
-p
$loadport
$filename
\n
";
}
# XXX HACK
$filename
=~
/(.*)/
;
$filename
=
$
1
;
$SIG
{
HUP
}
=
$SIG
{
INT
}
=
$SIG
{
TERM
}
=
\
&cleanup
;
system
(
$FRISBEE
,
'
-N
',
'
-i
',
$mcastif
,
'
-m
',
$loadaddr
,
'
-p
',
$loadport
,
$filename
);
if
(
$?
)
{
die
("
Error downloading image data from outer Emulab!
");
}
exit
(
0
);
sub
cleanup
{
tbwarn
("
Download interrupted,
$filename
removed
");
$SIG
{
HUP
}
=
$SIG
{
INT
}
=
$SIG
{
TERM
}
=
'
IGNORE
';
kill
('
TERM
',
0
);
unlink
(
$filename
);
exit
(
-
1
);
}
tbsetup/subboss_frisbeelauncher.in
0 → 100755
View file @
1e8d93dd
#!/usr/bin/perl -wT
#
# EMULAB-COPYRIGHT
# Copyright (c) 2000-2007 University of Utah and the Flux Group.
# All rights reserved.
#
use
strict
;
use
Getopt::
Std
;
use
POSIX
'
setsid
';
# For &daemonize
use
POSIX
"
:sys_wait_h
";
# For &WNOHANG
use
Sys::
Syslog
;
use
English
;
use
Socket
;
use
Errno
qw(EADDRINUSE)
;
#
# This also kills a running frisbee.
#
sub
usage
()
{
print
"
Usage: $0 [-d] [-k] <imageid> <path> <size> <mtime>
\n
";
print
"
-k: Kill running frisbee.
\n
";
print
"
-d: Print debugging output.
\n
";
exit
(
1
);
}
my
$optlist
=
"
dk
";
my
$debug
=
0
;
my
$killmode
=
0
;
# Configure variables
my
$TB
=
"
@prefix
@
";
my
$TBOPS
=
"
@TBOPSEMAIL
@
";
my
$MY_IP
;
my
$BASEADDR
=
"
@FRISEBEEMCASTADDR
@
";
my
$BASEPORT
=
"
@FRISEBEEMCASTPORT
@
";
my
$RPCSERVER
=
"
@OUTERBOSS_NODENAME
@
";
my
$RPCPORT
=
"
@OUTERBOSS_XMLRPCPORT
@
";
my
$RPCCERT
=
"
@SUBBOSS_SSLCERTNAME
@
";
#
# Untaint the path
#
$ENV
{'
PATH
'}
=
"
/bin:/usr/bin
";
delete
@ENV
{'
IFS
',
'
CDPATH
',
'
ENV
',
'
BASH_ENV
'};
#
# Turn off line buffering on output
#
$|
=
1
;
use
lib
"
@prefix
@/lib
";
use
libtestbed
;
use
libxmlrpc
;
use
libtmcc
;
#use libtblog;
# Protos.
sub
PickAddress
($$);
sub
SetPid
($);
sub
SetSyncFlag
($);
sub
ClearSyncFlag
();
sub
TestBusy
();
sub
ClearPid
();
sub
ClearAddress
();
sub
Fatal
($);
sub
debug
($);
sub
GetImageInfo
($$);
# Defines
my
$FRISBEED
=
"
$TB
/sbin/frisbeed
";
my
$LOGFILE
=
"
$TB
/log/frisbeelauncher
";
my
$FRISBEEIMAGE
=
"
$TB
/sbin/frisbeeimage
";
my
$child_pid
=
0
;
my
$dlfilename
=
0
;
my
$STD_BW
=
72000000
;
# 71.6Mb/sec w/1000HZ kernel
my
$USR_BW
=
54000000
;
# 53.7Mb/sec w/1000HZ kernel
my
$mcast_ip_file
=
"
/var/emulab/boot/myip
";
if
(
!
-
e
$mcast_ip_file
)
{
die
("
$mcast_ip_file
does not exist!
");
}
$MY_IP
=
`
cat
$mcast_ip_file
`;
chomp
(
$MY_IP
);
if
(
$MY_IP
=~
/^([\d\.]+)$/
)
{
$MY_IP
=
$
1
;
}
else
{
die
("
Could not parse outer IP:
$MY_IP
!
");
}
#
# Ask the outer Emulab to lauch a frisbee and return the loadinfo to us.
#
libxmlrpc::
Config
({"
server
"
=>
$RPCSERVER
,
"
verbose
"
=>
1
,
"
cert
"
=>
$RPCCERT
,
"
portnum
"
=>
$RPCPORT
});
#
# Parse command arguments. Once we return from getopts, all that should be
# left are the required arguments.
#
my
%options
=
();
if
(
!
getopts
(
$optlist
,
\
%options
))
{
usage
();
}
if
(
defined
(
$options
{"
d
"}))
{
$debug
=
1
;
}
if
(
defined
(
$options
{"
k
"}))
{
$killmode
=
1
;
}
usage
()
if
(
!
@ARGV
);
#
# Grab the Image.
#
# XXX hack: use map + regex to get around taint check
my
(
$imageid
,
$filename
,
$size
,
$mtime
)
=
map
{
/(.*)/
;
$
1
}
@ARGV
;
#
# Get node ID via tmcc
#
my
@tmp
;
if
(
tmcc
(
TMCCCMD_NODEID
,
undef
,
\
@tmp
)
!=
0
)
{
Fatal
("
Error getting subboss_id!
\n
");
}
my
(
$subbossid
)
=
@tmp
;
chomp
$subbossid
;
#if (!$killmode && ! -R $filename) {
# Fatal("You do not have permission to read the image file for".
# "$imageid: $filename\n");
#}
#
# When running inside an inner Emulab, try to get the image from the
# outer emulab when it does not exist locally. Of course, it could still
# be a bogus image.
#
# We do this before going into the background as that is what os_setup
# expects. Note that we set a signal handler so we can remove any partially
# downloaded image if interrupted. We also record our pid so that -k will
# work in another frisbeelauncher instance.
#
my
$naddress
;
my
$address
;
my
$pid
;
if
(
!
$killmode
)
{
#
# Pick an address to use before locking the DB. Die if unsucessful,
# set address if sucessful. If something goes wrong later or there is
# already a laucher active, we will wind up wasting this address,
# but hey, we can make more!
#
$naddress
=
PickAddress
(
$subbossid
,
$imageid
);
# Try to discover if some other process is handling this address
$address
=
$$naddress
{"
address
"};
$pid
=
$$naddress
{"
frisbee_pid
"};
#
# Keep the current frisbeed running for another time period.
#
if
(
$pid
&&
$address
)
{
debug
("
A server (
$address
) is already running for image
$imageid
\n
");
exit
(
0
);
}
if
(
-
e
$filename
)
{
my
@img_stat
=
stat
$filename
;
if
(
!
@img_stat
)
{
Fatal
("
Unable to get size and mtime for
$imageid
:
$filename
\n
");
}
my
$img_size
=
$img_stat
[
7
];
my
$img_mtime
=
$img_stat
[
9
];
if
((
$img_size
!=
$size
)
||
(
$img_mtime
<
$mtime
))
{
if
(
!
unlink
$filename
)
{
Fatal
("
Unable to unlink
$imageid
:
$filename
for updating
\n
");
}
}
}
if
(
!
-
e
$filename
)
{
debug
("
Fetching image
$filename
(
$imageid
) from boss
\n
");
$SIG
{
HUP
}
=
$SIG
{
INT
}
=
$SIG
{
TERM
}
=
\
&cleanup
;
SetSyncFlag
(
1
);
SetPid
(
$PID
);
$EUID
=
$UID
;
$dlfilename
=
$filename
;
system
(
$FRISBEEIMAGE
,
$imageid
,
$filename
);
ClearPid
();
ClearSyncFlag
();
$dlfilename
=
0
;
$EUID
=
0
;
if
(
$?
)
{
# XXX clear address if sync failed?
Fatal
("
No such image file:
$filename
!
");
}
}
}
else
{
my
$result
=
GetImageInfo
(
$subbossid
,
$imageid
);
my
$address
=
$$result
{"
address
"};
my
$pid
=
$$result
{"
frisbee_pid
"};
# Nothing running.
exit
(
0
)
if
(
!
$address
&&
!
$pid
);
if
(
!
$address
&&
$pid
)
{
#
# This makes no sense. Just send email.
#
my
$mesg
=
"
Inconsistent DB state. PID (
$pid
) but no load address!
";
SENDMAIL
(
$TBOPS
,
"
Frisbee Killer Failed!
",
"
Image:
$imageid
\n
"
.
$mesg
);
Fatal
(
$mesg
);
}
if
(
$address
&&
!
$pid
)
{
#
# Okay, minor problem. It is possible we caught the launcher between
# setting the address and setting the pid. Wait a moment, and then
# try again. If still no pid, bail.
#
sleep
(
1
);
# XXX add call to get address and pid
$result
=
GetImageInfo
(
$imageid
,
$subbossid
);
$address
=
$$result
{"
address
"};
$pid
=
$$result
{"
frisbee_pid
"};
# Okay, situation resolved itself; other frisbeelauncher bailed.
exit
(
0
)
if
(
!
$address
&&
!
$pid
);
#
# Still inconsistent so bail.
#
if
(
$address
&&
!
$pid
)
{
my
$mesg
=
"
Inconsistent DB state. Load address but no PID!
";
SENDMAIL
(
$TBOPS
,
"
Frisbee Killer Failed!
",
"
Image:
$imageid
\n
"
.
$mesg
);
Fatal
(
$mesg
);
}
}
#
# Okay, address and pid. We could clear the pid from the DB,
# preventing another killer from thinking it is running, but not
# much point since it is not likely to happen. If it turns out to
# be a problem we can change the way this works.
#
if
(
!
kill
('
TERM
',
$pid
))
{
SENDMAIL
(
$TBOPS
,
"
Frisbee Killer Failed!
",
"
Failed to stop frisbee daemon for
$imageid
\n
"
.
"
Could not kill(TERM) process
$pid
: $? $!
");
Fatal
("
Failed to stop frisbee daemon for
$imageid
!
");
}
exit
(
0
);
}
# Ok, no process is already running for this image, we will use the new
# address chosen earlier.
#
debug
("
Picked address
$address
\n
");
# Run in the background
if
(
my
$childpid
=
TBBackGround
(
$LOGFILE
))
{
#
# Delay a moment, and they look for an exit status.
# This is intended to catch startup problems.
#
# XXX TBBackGround should do this!
#
sleep
(
1
);
my
$foo
=
waitpid
(
$childpid
,
&WNOHANG
);
if
(
$foo
)
{
#ClearAddress();
Fatal
("
Error $? backgrounding frisbeelauncher!
");
}
exit
(
0
);
}
#XXX TBdbfork();
# Set up a signal handler that will clean up in case we get killed
$SIG
{
HUP
}
=
$SIG
{
INT
}
=
$SIG
{
TERM
}
=
\
&cleanup
;
# Set our pid. This happens outside the lock which could lead to races,
# but that is unlikely. Look for it above though.
SetPid
(
$PID
);
#
# Drop root permissions, if we have them
#
if
(
$EUID
==
0
)
{
$EUID
=
$UID
;
}
my
@args
=
('
-i
',
$MY_IP
);
#
# Select the appropriate bandwidth
#
if
(
$filename
=~
/^$TB\/images/
)
{
push
@args
,
('
-W
',
$STD_BW
);
}
#
# Force multicast keepalives
# XXX Should we do this for subbosses?
#
push
@args
,
('
-K
',
'
15
');
my
$firsttry
=
1
;
# Now, we actually launch Frisbee
while
(
1
)
{
#
# Each time the server exits, test the busy bit to see if
# it should keep going. This has to be done with tables locked
# since another caller is going to bump it.
#
last
if
(
!
TestBusy
());
if
(
$child_pid
=
fork
())
{
# Wait for child to exit
waitpid
(
$child_pid
,
0
);
if
(
$?
)
{
#
# If this is the first time we are firing up this server
# and the port is already in use, try another port.
#
# If a server was running, died, and now we can no longer
# get the port, something else might be wrong so just die
# in the usual way.
#
my
$err
=
$?
;
if
(
$firsttry
&&
(
$err
>>
8
)
==
EADDRINUSE
())
{
warn
("
Frisbeed bind failed for address
$address
,
"
.
"
picking another address
\n
");
ClearAddress
();
$address
=
PickAddress
(
$subbossid
,
$imageid
);
next
;
}
#SENDMAIL($TBOPS, "Frisbeed Failed!",
# "Image: $imageid\n".
# "Address: $address\n\n".
# "Process $child_pid exited with value $err.\n".
# "Please look at the syslog for frisbeed!\n\n".
# "NOTE: Another frisbeed will not start!\n");
print
STDERR
"
Frisbeed Failed!
",
"
Image:
$imageid
\n
"
.
"
Address:
$address
\n\n
"
.
"
Process
$child_pid
exited with value
$err
.
\n
"
.
"
Please look at the syslog for frisbeed!
\n\n
"
.
"
NOTE: Another frisbeed will not start!
\n
";
#
# Dump early. This will leave the address in
# in the DB, so that another one will not start
# until the matter is resolved by someone.
#
ClearPid
();
exit
(
1
);
}
else
{
$firsttry
=
0
;
}
}
else
{
print
STDERR
"
WTF???
\n
";
# Child branch
# The database format for address is host:port - however,
# we need to give them as seperate arguments to frisbeed.
if
(
$address
=~
/(.*):(.*)/
)
{
my
$addr
=
$
1
;
my
$port
=
$
2
;
print
STDERR
"
$FRISBEED
@args
-m
$addr
-p
$port
$filename
";
if
(
!
exec
(
$FRISBEED
,
@args
,
'
-m
',
$addr
,
'
-p
',
$port
,
$filename
))
{
#Fatal("$$: Unable to exec $FRISBEED");
print
STDERR
"
$$: Unable to exec
$FRISBEED
\n
";
}
}
Fatal
("
$$: Bad address format:
$address
!
");
}
}