Commit e9a21edc authored by Gary Wong's avatar Gary Wong

Add GPO ops-monitoring support.

The pieces are:

 * A monitoring daemon (clientside/protogeni/shared-node-monitor), which
   runs in each Xen shared node dom0, and gathers node and interface
   statistics.  It communicates these over the event system with...

 * A listening daemon (event/monitoring/shared-node-listener), running
   on the local boss node, and inserts everything it hears into the
   MySQL database "monitoring".  This database is also used by...

 * A site-wide monitoring daemon (protogeni/scripts/mondbd), periodically
   polling the normal testbed database (nodes and interfaces tables) and
   copying snapshots of the important pieces into the monitoring database.

 * The monitoring database is also read by a WWW front end invoked as a
   WSGI process by Apache.  This front end is developed by the GPO and
   modified to work with ProtoGENI, and is maintained in an independent
   repository.
parent 4975f43a
......@@ -204,6 +204,7 @@ LoadModule disk_cache_module libexec/apache22/mod_disk_cache.so
#LoadModule file_cache_module libexec/apache22/mod_file_cache.so
#LoadModule mem_cache_module libexec/apache22/mod_mem_cache.so
LoadModule cgi_module libexec/apache22/mod_cgi.so
LoadModule wsgi_module libexec/apache22/mod_wsgi.so
#
# The following modules are not loaded by default:
......@@ -1656,6 +1657,167 @@ ScriptAlias /protogeni/gtw/pubxmlrpc @prefix@/devel/gtw/protogeni/pubxmlrpc/pubg
SetEnv USER "nobody"
</Directory>
</VirtualHost>
# Yet another virtual host. This one's for GPO monitoring support.
Listen 5001
<VirtualHost @PROTOGENI_RPCNAME@:5001>
# General setup for the virtual host, inherited from global configuration
DocumentRoot "@prefix@/www"
ServerName @PROTOGENI_RPCNAME@
ServerAdmin @TBOPSEMAIL_NOSLASH@
LogLevel warn
ErrorLog @prefix@/log/apache_ssl_error_log
TransferLog @prefix@/log/apache_ssl_access_log
# SSL Engine Switch:
# Enable/Disable SSL for this virtual host.
SSLEngine on
# SSL Protocol support:
# List the enable protocol levels with which clients will be able to
# connect. Disable SSLv2 access by default:
SSLProtocol all -SSLv2
# SSL Cipher Suite:
# List the ciphers that the client is permitted to negotiate.
# See the mod_ssl documentation for a complete list.
SSLCipherSuite ALL:!ADH:!EXPORT:!SSLv2:RC4+RSA:+HIGH:+MEDIUM:+LOW
# Server Certificate:
# Point SSLCertificateFile at a PEM encoded certificate. If
# the certificate is encrypted, then you will be prompted for a
# pass phrase. Note that a kill -HUP will prompt again. A new
# certificate can be generated using the genkey(1) command.
SSLCertificateFile @prefix@/etc/genirpc.pem
# Server Private Key:
# If the key is not combined with the certificate, use this
# directive to point at the key file. Keep in mind that if
# you've both a RSA and a DSA private key you can configure
# both in parallel (to also allow the use of DSA ciphers, etc.)
SSLCertificateKeyFile @prefix@/etc/genirpc.pem
# Server Certificate Chain:
# Point SSLCertificateChainFile at a file containing the
# concatenation of PEM encoded CA certificates which form the
# certificate chain for the server certificate. Alternatively
# the referenced file can be the same as SSLCertificateFile
# when the CA certificates are directly appended to the server
# certificate for convinience.
#SSLCertificateChainFile /etc/pki/tls/certs/server-chain.crt
# Certificate Authority (CA):
# Set the CA certificate verification path where to find CA
# certificates for client authentication or alternatively one
# huge file containing all of them (file must be PEM encoded)
#SSLCACertificateFile /etc/pki/tls/certs/ca-bundle.crt
# Client Authentication (Type):
# Client certificate verification type and depth. Types are
# none, optional, require and optional_no_ca. Depth is a
# number which specifies how deeply to verify the certificate
# issuer chain before deciding the certificate is not valid.
#SSLVerifyClient require
SSLVerifyClient none
SSLVerifyDepth 10
# Access Control:
# With SSLRequire you can do per-directory access control based
# on arbitrary complex boolean expressions containing server
# variable checks and other lookup directives. The syntax is a
# mixture between C and Perl. See the mod_ssl documentation
# for more details.
#<Location />
#SSLRequire ( %{SSL_CIPHER} !~ m/^(EXP|NULL)/ \
# and %{SSL_CLIENT_S_DN_O} eq "Snake Oil, Ltd." \
# and %{SSL_CLIENT_S_DN_OU} in {"Staff", "CA", "Dev"} \
# and %{TIME_WDAY} >= 1 and %{TIME_WDAY} <= 5 \
# and %{TIME_HOUR} >= 8 and %{TIME_HOUR} <= 20 ) \
# or %{REMOTE_ADDR} =~ m/^192\.76\.162\.[0-9]+$/
#</Location>
# SSL Engine Options:
# Set various options for the SSL engine.
# o FakeBasicAuth:
# Translate the client X.509 into a Basic Authorisation. This means that
# the standard Auth/DBMAuth methods can be used for access control. The
# user name is the `one line' version of the client's X.509 certificate.
# Note that no password is obtained from the user. Every entry in the user
# file needs this password: `xxj31ZMTZzkVA'.
# o ExportCertData:
# This exports two additional environment variables: SSL_CLIENT_CERT and
# SSL_SERVER_CERT. These contain the PEM-encoded certificates of the
# server (always existing) and the client (only existing when client
# authentication is used). This can be used to import the certificates
# into CGI scripts.
# o StdEnvVars:
# This exports the standard SSL/TLS related `SSL_*' environment variables.
# Per default this exportation is switched off for performance reasons,
# because the extraction step is an expensive operation and is usually
# useless for serving static content. So one usually enables the
# exportation for CGI and SSI requests only.
# o StrictRequire:
# This denies access when "SSLRequireSSL" or "SSLRequire" applied even
# under a "Satisfy any" situation, i.e. when it applies access is denied
# and no other module can change it.
# o OptRenegotiate:
# This enables optimized SSL connection renegotiation handling when SSL
# directives are used in per-directory context.
#SSLOptions +FakeBasicAuth +ExportCertData +StrictRequire
<Files ~ "\.(cgi|shtml|phtml|php3?)$">
SSLOptions +StdEnvVars
</Files>
# SSL Protocol Adjustments:
# The safe and default but still SSL/TLS standard compliant shutdown
# approach is that mod_ssl sends the close notify alert but doesn't wait for
# the close notify alert from client. When you need a different shutdown
# approach you can use one of the following variables:
# o ssl-unclean-shutdown:
# This forces an unclean shutdown when the connection is closed, i.e. no
# SSL close notify alert is send or allowed to received. This violates
# the SSL/TLS standard but is needed for some brain-dead browsers. Use
# this when you receive I/O errors because of the standard approach where
# mod_ssl sends the close notify alert.
# o ssl-accurate-shutdown:
# This forces an accurate shutdown when the connection is closed, i.e. a
# SSL close notify alert is send and mod_ssl waits for the close notify
# alert of the client. This is 100% SSL/TLS standard compliant, but in
# practice often causes hanging connections with brain-dead browsers. Use
# this only for browsers where you know that their SSL implementation
# works correctly.
# Notice: Most problems of broken clients are also related to the HTTP
# keep-alive facility, so you usually additionally want to disable
# keep-alive for those clients, too. Use variable "nokeepalive" for this.
# Similarly, one has to force some clients to use HTTP/1.0 to workaround
# their broken HTTP/1.1 implementation. Use variables "downgrade-1.0" and
# "force-response-1.0" for this.
SetEnvIf User-Agent ".*MSIE.*" \
nokeepalive ssl-unclean-shutdown \
downgrade-1.0 force-response-1.0
# Per-Server Logging:
# The home of a custom SSL log file. Use this when you want a
# compact non-error SSL logfile on a virtual host basis.
CustomLog @prefix@/log/apache_ssl_request_log \
"%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"
# A bundle of trusted protogeni sites.
SSLCACertificateFile @prefix@/etc/genica.bundle
# Another bundle of CRLs.
SSLCARevocationFile @prefix@/etc/genicrl.bundle
WSGIDaemonProcess localstore threads=5 python-eggs=/usr/local/ops-monitoring/local/eggs
WSGIScriptAlias / /usr/local/ops-monitoring/local/wsgi/localstore.wsgi
<Directory "/usr/local/ops-monitoring/local/wsgi">
WSGIProcessGroup localstore
WSGIApplicationGroup %{GLOBAL}
Order deny,allow
allow from all
</Directory>
</VirtualHost>
</IfDefine>
#
......
#
# Copyright (c) 2013 University of Utah and the Flux Group.
# Copyright (c) 2013-2014 University of Utah and the Flux Group.
#
# {{{EMULAB-LICENSE
#
......@@ -30,23 +30,43 @@ SYSTEM := $(shell uname -s)
# to. But we can reasonably assume that /usr/bin will be in it.
USRBINDIR = $(DESTDIR)/usr/bin
PROGRAMS = shared-node-monitor
include $(OBJDIR)/Makeconf
all:
all: $(PROGRAMS)
include $(TESTBED_SRCDIR)/GNUmakerules
LIBEVENTDIR = $(TESTBED_LIBOBJDIR)/event
# Rules to make sure that some libraries we need from other directories get
# built first
$(LIBEVENTDIR)/%.a:
@$(MAKE) -C $(LIBEVENTDIR) $(@F)
CFLAGS += -I. -I${OBJDIR}
CFLAGS += -I$(TESTBED_LIBSRCDIR)/event
CFLAGS += -I/usr/local/include
LDFLAGS += -L$(TESTBED_LIBOBJDIR)
LDFLAGS += -L$(TESTBED_LIBOBJDIR)/event
LIBS += -levent -lcrypto
LIBS += -lm -L/usr/local/lib -lpubsub
LDFLAGS += $(LDSTATIC)
boss-install:
control-install:
fs-install:
client:
client: shared-node-monitor
client-install: client
-mkdir -p $(USRBINDIR)
$(INSTALL_PROGRAM) $(SRCDIR)/geni-get $(USRBINDIR)
$(INSTALL_PROGRAM) shared-node-monitor $(DESTDIR)$CLIENT_BINDIR)/shared-node-monitor
subboss:
......@@ -55,6 +75,7 @@ subboss-install:
post-install:
clean:
rm -f *.o $(PROGRAMS)
distclean:
......
/*
* Copyright (c) 2014 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/>.
*
* }}}
*/
#include <stdio.h>
#include <string.h>
#include <sys/statfs.h>
#include <sys/time.h>
#include <unistd.h>
#include "event.h"
#define INTERVAL 30
#define MAX_ERRS 0x80
#define INTERFACE_MAX 0x10
struct interface {
long old_rx_b, old_rx_p, old_rx_e, old_rx_d,
old_tx_b, old_tx_p, old_tx_e, old_tx_d;
int used;
} interfaces[ INTERFACE_MAX ];
static void cpu_util( char *buf ) {
static long o0, o3;
FILE *f;
long n0, n1, n2, n3;
f = fopen( "/proc/stat", "r" );
rewind( f );
fscanf( f, "%*s %ld %ld %ld %ld", &n0, &n1, &n2, &n3 );
n0 += n1 + n2;
sprintf( buf, "%.1f", ( 100.0 * ( n0 - o0 ) ) / ( n0 + n3 - o0 - o3 ) );
o0 = n0;
o3 = n3;
fclose( f );
}
static void disk_part_max_used( char *buf ) {
struct statfs s;
statfs( "/", &s );
sprintf( buf, "%.1f", ( 100.0 * ( s.f_blocks - s.f_bfree ) ) /
s.f_blocks );
}
static void mem_used_kb( char *buf ) {
FILE *f;
long tot, fr;
f = fopen( "/proc/meminfo", "r" );
fscanf( f, "%*s %ld %*s\n", &tot );
fscanf( f, "%*s %ld %*s\n", &fr );
fclose( f );
sprintf( buf, "%ld", tot - fr );
}
static void num_vms_allocated( char *buf ) {
FILE *f;
int n;
f = popen( "sudo xl vm-list | wc -l", "r" );
fscanf( f, "%d", &n );
pclose( f );
sprintf( buf, "%d", n - 1 );
}
static void swap_free( char *buf ) {
FILE *f;
long tot, fr;
long n;
char s[ 0x100 ];
f = fopen( "/proc/meminfo", "r" );
while( !feof( f ) ) {
fscanf( f, "%s %ld %*s\n", s, &n );
if( !strcmp( s, "SwapTotal:" ) )
tot = n;
else if( !strcmp( s, "SwapFree:" ) )
fr = n;
}
fclose( f );
sprintf( buf, "%.1f", 100.0 * fr / tot );
}
static void send_notification( event_handle_t h, address_tuple_t tuple,
char *tab, char *id, char *v ) {
event_notification_t notification;
struct timeval tv;
static int err_cnt;
if( !( notification = event_notification_alloc( h, tuple ) ) ) {
fputs( "failed to allocate notification", stderr );
exit( 1 );
}
if( !event_notification_put_string( h, notification, "tab", tab ) )
fputs( "error adding tab", stderr );
if( !event_notification_put_string( h, notification, "id", id ) )
fputs( "error adding id", stderr );
gettimeofday( &tv, NULL );
if( !event_notification_put_int64( h, notification, "ts",
(long long) tv.tv_sec * 1000000 +
tv.tv_usec ) )
fputs( "error adding ts", stderr );
if( !event_notification_put_string( h, notification, "v", v ) )
fputs( "error adding v", stderr );
if( !event_notify( h, notification ) ) {
fputs( "failed to send notification", stderr );
if( ++err_cnt > MAX_ERRS )
exit( 1 );
} else
err_cnt = 0;
event_notification_free( h, notification );
}
extern int main( void ) {
event_handle_t h;
address_tuple_t tuple;
char hostname[ 0x100 ];
char *domain;
char node[ 0x100 ], id[ 0x100 ], interface_id[ 0x100 ];
FILE *f;
char *eid, buf[ 0x100 ];
/* Shared pool experiments are not named consistently... grr. */
if( !eaccess( "/proj/emulab-ops/exp/shared-nodes/tbdata/eventkey", R_OK ) )
eid = "shared-nodes";
else
eid = "shared-node";
sprintf( buf, "/proj/emulab-ops/exp/%s/tbdata/eventkey", eid );
if( !( h = event_register_withkeyfile( "elvin://event-server", 0, buf ) ) ) {
fputs( "failed to register with event-server", stderr );
return 1;
}
if( !( tuple = address_tuple_alloc() ) ) {
fputs( "failed to allocate address tuple", stderr );
return 1;
}
tuple->site = NULL;
sprintf( buf, "emulab-ops/%s", eid );
tuple->expt = buf;
tuple->group = NULL;
tuple->host = NULL;
tuple->objtype = "CUSTOM";
tuple->objname = "MONITOR";
tuple->eventtype = "REPORT";
if( !( f = popen( "/usr/testbed/lib/tmcc nodeid", "r" ) ) ) { /* FIXME config */
perror( "tmcc" );
return 1;
}
fscanf( f, "%s", node );
pclose( f );
gethostname( hostname, sizeof hostname );
for( domain = hostname; *domain != '.'; domain++ )
;
domain++;
for( ; *domain != '.'; domain++ )
;
domain++;
for( ; *domain != '.'; domain++ )
;
domain++;
sprintf( id, "%s_node_%s", domain, node );
sprintf( interface_id, "%s_interface_%s:eth", domain, node );
/* FIXME go into background */
while( 1 ) {
static const struct measurement {
void ( *f )( char * );
char *name;
} m[] = {
{ cpu_util, "ops_node_cpu_util" },
{ disk_part_max_used, "ops_node_disk_part_max_used" },
{ mem_used_kb, "ops_node_mem_used_kb" },
{ num_vms_allocated, "ops_node_num_vms_allocated" },
{ swap_free, "ops_node_swap_free" },
};
int i;
for( i = 0; i < sizeof m / sizeof *m; i++ ) {
char buf[ 0x100 ];
m[ i ].f( buf );
send_notification( h, tuple, m[ i ].name, id, buf );
}
if( !( f = fopen( "/proc/net/dev", "r" ) ) ) {
perror( "/proc/net/dev" );
return 1;
}
do {
int c;
if( fscanf( f, " eth%d:", &i ) == 1 && i < INTERFACE_MAX ) {
long rx_b, rx_p, rx_e, rx_d, tx_b, tx_p, tx_e, tx_d;
struct interface *interface = interfaces + i;
if( fscanf( f, " %ld %ld %ld %ld %*d %*d %*d %*d "
"%ld %ld %ld %ld", &rx_b, &rx_p, &rx_e, &rx_d,
&tx_b, &tx_p, &tx_e, &tx_d ) < 8 )
continue;
if( interface->used ) {
char *p = strchr( interface_id, 0 );
char buf[ 0x100 ];
sprintf( p, "%d", i );
sprintf( buf, "%.1f", ( rx_b - interface->old_rx_b ) /
(double) INTERVAL );
send_notification( h, tuple, "ops_interface_rx_bps",
interface_id, buf );
sprintf( buf, "%.1f", ( rx_p - interface->old_rx_p ) /
(double) INTERVAL );
send_notification( h, tuple, "ops_interface_rx_pps",
interface_id, buf );
sprintf( buf, "%.1f", ( rx_e - interface->old_rx_e ) /
(double) INTERVAL );
send_notification( h, tuple, "ops_interface_rx_eps",
interface_id, buf );
sprintf( buf, "%.1f", ( rx_d - interface->old_rx_d ) /
(double) INTERVAL );
send_notification( h, tuple, "ops_interface_rx_dps",
interface_id, buf );
sprintf( buf, "%.1f", ( tx_b - interface->old_tx_b ) /
(double) INTERVAL );
send_notification( h, tuple, "ops_interface_tx_bps",
interface_id, buf );
sprintf( buf, "%.1f", ( tx_p - interface->old_tx_p ) /
(double) INTERVAL );
send_notification( h, tuple, "ops_interface_tx_pps",
interface_id, buf );
sprintf( buf, "%.1f", ( tx_e - interface->old_tx_e ) /
(double) INTERVAL );
send_notification( h, tuple, "ops_interface_tx_eps",
interface_id, buf );
sprintf( buf, "%.1f", ( tx_d - interface->old_tx_d ) /
(double) INTERVAL );
send_notification( h, tuple, "ops_interface_tx_dps",
interface_id, buf );
*p = 0;
}
interface->old_rx_b = rx_b;
interface->old_rx_p = rx_p;
interface->old_rx_e = rx_e;
interface->old_rx_d = rx_d;
interface->old_tx_b = tx_b;
interface->old_tx_p = tx_p;
interface->old_tx_e = tx_e;
interface->old_tx_d = tx_d;
interface->used = 1;
}
do
c = getc( f );
while( c != '\n' && c != EOF );
} while( !feof( f ) );
fclose( f );
sleep( INTERVAL );
}
return 0;
}
......@@ -656,10 +656,10 @@ TBROBOCOPSEMAIL_NOSLASH
TBROBOCOPSEMAIL
TBOPSEMAIL_NOSLASH
TBOPSEMAIL
IPV6_SUBNET_PREFIX
IPV6_ENABLED
BROWSER_CONSOLE_ENABLE
EC2META_ENABLE
IPV6_ENABLED
IPV6_SUBNET_PREFIX
NOSITECHECKIN
SPEWFROMOPS
FIREWALL_OPS_LOCALRULETMPL
......@@ -687,6 +687,7 @@ NOSTACKMIB
NODE_USAGE_SUPPORT
GMAP_API_KEY
STANDALONE_CLEARINGHOUSE
PROTOGENI_NICKNAME
PROTOGENI_GENIRACK
PROTOGENI_URL
GENI_PUBRPCPORT
......@@ -4936,6 +4937,11 @@ done
;
;
#
# Offer both versions of the email addresses that have the @ escaped
......@@ -5018,8 +5024,8 @@ EXTERNAL_NTPSERVER3="2.pool.ntp.org"
EXTERNAL_NTPSERVER4="3.pool.ntp.org"
NTPDRIFTFILE="/var/db/ntp.drift"
UNIFIED_BOSS_AND_OPS=0
DISABLE_DHCPD_INSTALL=0
DISABLE_NAMED_INSTALL=0
DISABLE_DHCPD_INSTALL=0
DISABLE_NAMED_SETUP=0
FRISEBEEMCASTADDR="234.5.6"
FRISEBEEMCASTPORT=3564
......@@ -5042,6 +5048,7 @@ PROTOGENI_RPCPORT=12369
PROTOGENI_RPCNAME=""
GENI_PUBRPCPORT=12370
PROTOGENI_GENIRACK=0
PROTOGENI_NICKNAME="unknown"
STANDALONE_CLEARINGHOUSE=0
NODE_USAGE_SUPPORT=0
EXP_VIS_SUPPORT=0
......@@ -5130,6 +5137,43 @@ if test -n "$FSDIR_SCRATCH"; then
SCRATCHROOT_DIR="/scratch"
fi
# Try to guess ProtoGENI nickname if it wasn't specified explicitly,
# for backward compatibility (nobody used to care what they were called)
if test x"$PROTOGENI_NICKNAME" = x"unknown"; then
case $OURDOMAIN in
*utah.geniracks.net) PROTOGENI_NICKNAME="utah-ig";;
*utahddc.geniracks.net) PROTOGENI_NICKNAME="utahddc-ig";;
*gpolab.bbn.com) PROTOGENI_NICKNAME="gpo-ig";;
*northwestern.edu) PROTOGENI_NICKNAME="northwestern-ig";;
*lan.sdn.uky.edu) PROTOGENI_NICKNAME="uky-ig";;
*kettering.edu) PROTOGENI_NICKNAME="kettering-ig";;
*rnoc.gatech.edu) PROTOGENI_NICKNAME="gatech-ig";;
*cs.princeton.edu) PROTOGENI_NICKNAME="princeton-ig";;
*clemson.edu) PROTOGENI_NICKNAME="clemson-ig";;
*ku.gpeni.net) PROTOGENI_NICKNAME="kansas-ig";;
*nyu.edu) PROTOGENI_NICKNAME="nyu-ig";;
*uidaho.edu) PROTOGENI_NICKNAME="idaho-ig";;
*maxgigapop.net) PROTOGENI_NICKNAME="max-ig";;
*nysernet.org) PROTOGENI_NICKNAME="nysernet-ig";;
*sox.net) PROTOGENI_NICKNAME="sox-ig";;
*illinois.edu) PROTOGENI_NICKNAME="illinois-ig";;
*rnet.missouri.edu) PROTOGENI_NICKNAME="missouri-ig";;
*wisc.edu) PROTOGENI_NICKNAME="wisconsin-ig";;
*rutgers.edu) PROTOGENI_NICKNAME="rutgers-ig";;
*stanford.edu) PROTOGENI_NICKNAME="stanford-ig";;
*it.cornell.edu) PROTOGENI_NICKNAME="cornell-ig";;
*lsu.edu) PROTOGENI_NICKNAME="lsu-ig";;
*case.edu) PROTOGENI_NICKNAME="cwru-ig";;
*iu.edu) PROTOGENI_NICKNAME="moxi-ig";;
*uchicago.edu) PROTOGENI_NICKNAME="uchicago-ig";;
*metrodatacenter.com) PROTOGENI_NICKNAME="ohmetrodc-ig";;
*nps.edu) PROTOGENI_NICKNAME="nps-ig";;
*osu.edu) PROTOGENI_NICKNAME="osu-ig";;
*umkc.edu) PROTOGENI_NICKNAME="umkc-ig";;
*idre.ucla.edu) PROTOGENI_NICKNAME="ucla-ig";;
esac
fi
#
# These must come after the "eval" above, since the variables are not
# defined until the defs file is taken in.
......@@ -5721,6 +5765,7 @@ else
event/example/tbsend.py event/example/tbrecv.py \
event/example/eventdebug.pl \
event/proxy/GNUmakefile \
event/monitoring/GNUmakefile \
event/nsetrafgen/GNUmakefile \
event/nsetrafgen/nseinput.tcl \
event/nsetrafgen/nse-makepatch \
......
......@@ -255,6 +255,7 @@ AC_SUBST(PROTOGENI_RPCNAME)
AC_SUBST(GENI_PUBRPCPORT)
AC_SUBST(PROTOGENI_URL)
AC_SUBST(PROTOGENI_GENIRACK)
AC_SUBST(PROTOGENI_NICKNAME)
AC_SUBST(STANDALONE_CLEARINGHOUSE)
AC_SUBST(GMAP_API_KEY)
AC_SUBST(NODE_USAGE_SUPPORT)
......@@ -392,6 +393,7 @@ PROTOGENI_RPCPORT=12369
PROTOGENI_RPCNAME=""
GENI_PUBRPCPORT=12370
PROTOGENI_GENIRACK=0
PROTOGENI_NICKNAME="unknown"
STANDALONE_CLEARINGHOUSE=0
NODE_USAGE_SUPPORT=0
EXP_VIS_SUPPORT=0
......@@ -476,6 +478,43 @@ if test -n "$FSDIR_SCRATCH"; then
SCRATCHROOT_DIR="/scratch"
fi
# Try to guess ProtoGENI nickname if it wasn't specified explicitly,
# for backward compatibility (nobody used to care what they were called)
if test x"$PROTOGENI_NICKNAME" = x"unknown"; then
case $OURDOMAIN in
*utah.geniracks.net) PROTOGENI_NICKNAME="utah-ig";;
*utahddc.geniracks.net) PROTOGENI_NICKNAME="utahddc-ig";;
*gpolab.bbn.com) PROTOGENI_NICKNAME="gpo-ig";;
*northwestern.edu) PROTOGENI_NICKNAME="northwestern-ig";;
*lan.sdn.uky.edu) PROTOGENI_NICKNAME="uky-ig";;
*kettering.edu) PROTOGENI_NICKNAME="kettering-ig";;
*rnoc.gatech.edu) PROTOGENI_NICKNAME="gatech-ig";;
*cs.princeton.edu) PROTOGENI_NICKNAME="princeton-ig";;
*clemson.edu) PROTOGENI_NICKNAME="clemson-ig";;
*ku.gpeni.net) PROTOGENI_NICKNAME="kansas-ig";;
*nyu.edu) PROTOGENI_NICKNAME="nyu-ig";;
*uidaho.edu) PROTOGENI_NICKNAME="idaho-ig";;
*maxgigapop.net) PROTOGENI_NICKNAME="max-ig";;
*nysernet.org) PROTOGENI_NICKNAME="nysernet-ig";;
*sox.net) PROTOGENI_NICKNAME="sox-ig";;
*illinois.edu) PROTOGENI_NICKNAME="illinois-ig";;
*rnet.missouri.edu) PROTOGENI_NICKNAME="missouri-ig";;
*wisc.edu) PROTOGENI_NICKNAME="wisconsin-ig";;
*rutgers.edu) PROTOGENI_NICKNAME="rutgers-ig";;
*stanford.edu) PROTOGENI_NICKNAME="stanford-ig";;
*it.cornell.edu) PROTOGENI_NICKNAME="cornell-ig";;
*lsu.edu) PROTOGENI_NICKNAME="lsu-ig";;
*case.edu) PROTOGENI_NICKNAME="cwru-ig";;
*iu.edu) PROTOGENI_NICKNAME="moxi-ig";;
*uchicago.edu) PROTOGENI_NICKNAME="uchicago-ig";;
*metrodatacenter.com) PROTOGENI_NICKNAME="ohmetrodc-ig";;
*nps.edu) PROTOGENI_NICKNAME="nps-ig";;
*osu.edu) PROTOGENI_NICKNAME="osu-ig";;
*umkc.edu) PROTOGENI_NICKNAME="umkc-ig";;
*idre.ucla.edu) PROTOGENI_NICKNAME="ucla-ig";;
esac
fi
#
# These must come after the "eval" above, since the variables are not
# defined until the defs file is taken in.
......@@ -854,6 +893,7 @@ else
event/example/tbsend.py event/example/tbrecv.py \
event/example/eventdebug.pl \
event/proxy/GNUmakefile \
event/monitoring/GNUmakefile \
event/nsetrafgen/GNUmakefile \
event/nsetrafgen/nseinput.tcl \
event/nsetrafgen/nse-makepatch \
......
......@@ -99,6 +99,9 @@ PROTOGENI_ISCLEARINGHOUSE=1
PROTOGENI_EMAIL="geni-dev-utah@flux.utah.edu"
# Set this to the hostname of the clearinghouse web site.
PROTOGENI_WEBSITE="www.emulab.net"
# Set this to the nickname of your ProtoGENI federate. Ask the GPO what
# they call you if you're not sure.
PROTOGENI_NICKNAME="utah-pg"
#
# SSL Certificate stuff. Used to customize config files in ssl directory.
......
......@@ -43,6 +43,9 @@ SUBDIRS += new_sched
endif
endif
SUBDIRS += stated
ifeq ($(PROTOGENI),1)
SUBDIRS += monitoring
endif