nscheck.in 1.95 KB
Newer Older
1
#!/usr/bin/perl -wT
Leigh B. Stoller's avatar
Leigh B. Stoller committed
2 3 4

#
# EMULAB-COPYRIGHT
5
# Copyright (c) 2000-2003 University of Utah and the Flux Group.
Leigh B. Stoller's avatar
Leigh B. Stoller committed
6 7 8
# All rights reserved.
#

9 10 11 12 13 14 15 16
use English;
use Getopt::Std;

#
# Syntax check an NS file.
#
# usage: nscheck <nsfile>
#
17 18 19 20 21
# Exit value is important; 
# $status < 0 - Fatal error. Something went wrong we did not expect.
# $status = 0 - Parsed okay.
# $status > 0 - Parse error. 
#
22 23 24 25 26 27 28 29 30 31 32
sub usage()
{
    print STDOUT "Usage: nscheck <nsfile>\n";
    exit(-1);
}
my  $optlist = "";

#
# Configure variables
#
my $TB       = "@prefix@";
33
my $parser   = "$TB/libexec/parse-ns";
34
my $status   = 0;
35 36 37 38 39 40 41 42 43

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

#
# Untaint the path
# 
44
$ENV{'PATH'} = "/bin:/usr/bin:/sbin:/usr/sbin";
45 46 47 48 49 50 51 52 53 54 55 56 57
delete @ENV{'IFS', 'CDPATH', 'ENV', 'BASH_ENV'};

#
# Parse command arguments. Once we return from getopts, all that should
# left are the required arguments.
#
%options = ();
if (! getopts($optlist, \%options)) {
    usage();
}
if (@ARGV != 1) {
    usage();
}
Leigh B. Stoller's avatar
Leigh B. Stoller committed
58
my ($tempfile) = @ARGV;
59 60 61 62 63 64 65 66

#
# Untaint the arguments.
#
# Note different taint check (allow /).
if ($tempfile =~ /^([-\@\w.\/]+)$/) {
    $tempfile = $1;
}
Leigh B. Stoller's avatar
Leigh B. Stoller committed
67

68 69 70 71 72 73 74 75 76 77 78 79 80 81 82
else {
    fatal("Tainted argument $tempfile");
}

$nsfile    = "foo.ns";

#
# Make a temp dir and copy the NS file into it. We run the scripts
# from that directory cause it writes temp files.
# 
$dirname = "/tmp/parse-$$";

mkdir($dirname, 0775) or
    fatal("Could not mkdir $dirname");

83
if (system("/bin/cp", "$tempfile", "$dirname/$nsfile")) {
84 85 86
    fatal("Could not copy $tempfile to $dirname");
}

87 88 89
chdir($dirname) or
    fatal("Could not chdir to $dirname");

90
#
Leigh B. Stoller's avatar
Leigh B. Stoller committed
91 92
# Run parse in impotent mode on the NS file.  This has no effect but
# will display any errors.
93 94 95
#
# Be sure to exit with >0 staus
#
Leigh B. Stoller's avatar
Leigh B. Stoller committed
96

97
if (system("$parser -n -a $nsfile") != 0) {
98 99
    print "NS Parse failed!\n";
    $status = 1;
100 101 102
}

system("/bin/rm", "-rf", "$dirname");
103
exit $status;
104 105 106 107 108 109

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

    system("/bin/rm", "-rf", "$dirname");
110 111 112

    die("*** $0:\n".
	"    $mesg\n");
113
}