rtecheck.in 4.3 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
#!/usr/bin/perl -w

#
# Copyright (c) 2000-2017 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/>.
# 
# }}}
#
use strict;
use English;
use Getopt::Std;
use Socket;
use File::Basename;
use File::Temp qw(tempfile unlink0 :POSIX );

#
# Do an RTE check on a geni-lib script; generate rspec from geni-lib,
# then convert rspec back to geni-lib, and compare the two scripts to
# see if are equal. 
#
sub usage()
{
    print STDERR "Usage: rtecheck [options] infile\n";
    print STDERR "Options:\n";
    print STDERR "  -d       - Turn on debugging\n";
42
    print STDERR "  -g       - Print intermediate geni-lib script\n";
43 44 45
 
    exit(-1);
}
46
my $optlist    = "dg";
47
my $debug      = 0;
48
my $printgl    = 0;
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

#
# Configure variables
#
my $TB              = "@prefix@";
my $TBOPS           = "@TBOPSEMAIL@";
my $MAINSITE        = @TBMAINSITE@;
my $RUNGENILIB      = "$TB/bin/rungenilib";
my $RSPECTOGENILIB  = "$TB/bin/rspec2genilib";
my $DIFF            = "/usr/bin/diff";

# Locals
my $this_user;
my $file;

# Protos
sub fatal($);

#
# Turn off line buffering on output
#
$| = 1;

#
# Untaint the path
# 
$ENV{'PATH'} = "$TB/bin:$TB/sbin:/bin:/usr/bin:/sbin:/usr/sbin";
delete @ENV{'IFS', 'CDPATH', 'ENV', 'BASH_ENV'};

#
# Testbed Support libraries
#
use lib "@prefix@/lib";
use emutil;
use libtestbed;
use GeniXML;

#
# Parse command arguments. Once we return from getopts, all that should
# left are the required arguments.
#
my %options = ();
if (! getopts($optlist, \%options)) {
    usage();
}
if (defined($options{"d"})) {
    $debug = 1;
}
97 98 99
if (defined($options{"g"})) {
    $printgl = 1;
}
100 101 102 103 104 105 106 107 108 109 110 111 112 113 114
usage()
    if (@ARGV != 1);

$file = $ARGV[0];

#
# Must taint check!
#
if ($file =~ /^([-\w\/\.]+)$/) {
    $file = $1;
}
else {
    die("Bad data in argument: $file.");
}

115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138
#
# Exclusion for NS converted files which have the original NS file as
# a comment at the end of the file. Lets find that and strip it out of
# the comparison. If the user uses the topology editor we are going to
# lose the comment block anyway, but thats okay.
#
my ($copyfd, $copyname) = tempfile("/tmp/rtecheckXXXXX", UNLINK => 1);
if (!defined($copyfd)) {
    fatal("Could not open temporary file for geni-lib");
}
open(IN, $file) or
    fatal("Could not open $file for reading: $!");
while (<IN>) {
    if ($_ =~ /^\# Here is the original NS file/) {
	while (<IN>) {
	    next
		if ($_ =~ /^\#$/);
	}
	next;
    }
    print $copyfd $_;
}
close(IN);

139 140 141
#
# First convert to rspec.
#
142
my $rspec = emutil::ExecQuiet("$RUNGENILIB -W $copyname");
143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161
if ($?) {
    print STDERR $rspec;
    print STDERR "Could not convert geni-lib script to an rspec\n";
    # For the web interface.
    exit(1);
}
if ($debug) {
    print $rspec;
}

#
# Now convert back to a geni-lib.
#
my ($fd, $filename) = tempfile("/tmp/rtecheckXXXXX", UNLINK => 1);
if (!defined($fd)) {
    fatal("Could not open temporary file for rspec");
}
print $fd $rspec;

Leigh Stoller's avatar
Leigh Stoller committed
162
my $genilib = emutil::ExecQuiet("$RSPECTOGENILIB -t $filename");
163 164 165 166 167 168
if ($?) {
    print STDERR $genilib;
    print STDERR "Could not convert rspec back to geni-lib\n";
    # For the web interface
    exit(1);
}
169
if ($debug || $printgl) {
170 171 172 173 174 175 176 177 178 179 180 181 182
    print $genilib;
}
unlink0($fd, $filename);

#
# Now compare.
#
($fd, $filename) = tempfile("/tmp/rtecheckXXXXX", UNLINK => 1);
if (!defined($fd)) {
    fatal("Could not open temporary file for geni-lib");
}
print $fd $genilib;

183
my $output = emutil::ExecQuiet("$DIFF -I '^\#\$' -E -B -b $copyname $filename");
184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200
if ($?) {
    print STDERR $output;
    # For the web interface.
    exit(1);
}
if ($debug) {
    print $output;
}
exit(0);

sub fatal($) {
    my ($mesg) = $_[0];

    print STDERR "*** $0:\n".
	         "    $mesg\n";
    exit(-1);
}