Blame tools/mib2svg.cgi.in

Packit 022b05
#!/usr/bin/perl -w -T
Packit 022b05
use strict;
Packit 022b05
use CGI qw(:standard);
Packit 022b05
#set this for testing purposes only
Packit 022b05
#use CGI::Carp qw(fatalsToBrowser);
Packit 022b05
use File::Temp;
Packit 022b05
Packit 022b05
#some security-settings
Packit 022b05
$CGI::POST_MAX = 1024 * 100;
Packit 022b05
$ENV{'PATH'} = '/bin:/usr/bin:/usr/local/bin';
Packit 022b05
Packit 022b05
#gather all mibs in smipath into @mibnames
Packit 022b05
my $smipath = "@smipath@";
Packit 022b05
my @smidirs = split(/:/,$smipath);
Packit 022b05
my @mibnames;
Packit 022b05
foreach my $dir (@smidirs) {
Packit 022b05
    opendir(MIBDIR,$dir);
Packit 022b05
    my @entries = grep !/^\.\.?\z/, readdir(MIBDIR);
Packit 022b05
    closedir(MIBDIR);
Packit 022b05
    @mibnames = (@mibnames, @entries);
Packit 022b05
}
Packit 022b05
Packit 022b05
if (param()) {
Packit 022b05
    #params present.
Packit 022b05
    my @options;
Packit 022b05
    my $localfh;
Packit 022b05
    my $localfn;
Packit 022b05
    my @mibs = param('mibs');
Packit 022b05
    my $width = param('width');
Packit 022b05
    my $height = param('height');
Packit 022b05
Packit 022b05
    #parse options and add safe strings to the options-array
Packit 022b05
    if (param('deprobs')) {
Packit 022b05
	if (param('deprobs') eq "deprecated") {
Packit 022b05
	    @options = (@options, "--svg-show-deprecated");
Packit 022b05
	} elsif (param('deprobs') eq "obsolete") {
Packit 022b05
	    @options = (@options, "--svg-show-depr-obsolete");
Packit 022b05
	}
Packit 022b05
    }
Packit 022b05
Packit 022b05
    if (param('static')) {
Packit 022b05
	@options = (@options, "--svg-static-output");
Packit 022b05
    }
Packit 022b05
Packit 022b05
    if ($width =~ /(\d+)/) {
Packit 022b05
	if ($1 <= 2147483647) {
Packit 022b05
	    @options = (@options, "--svg-width=$1");
Packit 022b05
	}
Packit 022b05
    }
Packit 022b05
    if ($height =~ /(\d+)/) {
Packit 022b05
	if ($1 <= 2147483647) {
Packit 022b05
	    @options = (@options, "--svg-height=$1");
Packit 022b05
	}
Packit 022b05
    }
Packit 022b05
Packit 022b05
    #parse selected MIBs
Packit 022b05
    foreach my $mibname (@mibnames) {
Packit 022b05
	foreach my $mib (@mibs) {
Packit 022b05
	    if ($mibname eq $mib) {
Packit 022b05
		$mibname =~ /([\w\-]+)/;
Packit 022b05
		@options = (@options, "$1");
Packit 022b05
	    }
Packit 022b05
	}
Packit 022b05
    }
Packit 022b05
Packit 022b05
    #handle file upload
Packit 022b05
    if (param('uploadmib')) {
Packit 022b05
	my $remotefh = upload('uploadmib');
Packit 022b05
	($localfh, $localfn)
Packit 022b05
	    = File::Temp->tempfile('tempMIBXXXX', DIR => '/tmp', UNLINK => 1)
Packit 022b05
		or die "Error opening outfile\n";
Packit 022b05
	while (<$remotefh>) {
Packit 022b05
	    print $localfh $_;
Packit 022b05
	}
Packit 022b05
	close $remotefh;
Packit 022b05
	close $localfh;
Packit 022b05
	@options = (@options, $localfn);
Packit 022b05
    }
Packit 022b05
Packit 022b05
    #call smidump
Packit 022b05
    my $res = open (SMIDUMP, "-|");
Packit 022b05
    die "Couldn't open pipe to subprocess" unless defined($res);
Packit 022b05
    exec "@prefix@/bin/smidump",'-u','-f','svg',@options
Packit 022b05
	or die "Couldn't exec smidump" if $res == 0;
Packit 022b05
    my @svg = <SMIDUMP>;
Packit 022b05
    close (SMIDUMP);
Packit 022b05
Packit 022b05
    #serve svg
Packit 022b05
    my $svglength = @svg;
Packit 022b05
    if ($svglength eq 0) {
Packit 022b05
	print header;
Packit 022b05
	print start_html("MIB to SVG");
Packit 022b05
	print h2("Sorry, smidump output contained no data.");
Packit 022b05
	print end_html;
Packit 022b05
    } else {
Packit 022b05
	#FIXME - or + ?
Packit 022b05
	print header(-TYPE => "image/svg-xml");
Packit 022b05
	print "@svg";
Packit 022b05
    }
Packit 022b05
Packit 022b05
} else {
Packit 022b05
    #no params present
Packit 022b05
    #send form
Packit 022b05
    print header;
Packit 022b05
    print start_html("MIB to SVG");
Packit 022b05
    print h2("Generate a SVG Diagram from MIB Modules");
Packit 022b05
    print start_multipart_form();
Packit 022b05
Packit 022b05
    print p("select one or more MIBs: ", scrolling_list(
Packit 022b05
	-NAME => "mibs",
Packit 022b05
	-VALUES => [@mibnames],
Packit 022b05
	-SIZE => 10,
Packit 022b05
	-MULTIPLE => 1,
Packit 022b05
    ));
Packit 022b05
Packit 022b05
    print p("or upload a MIB: ", filefield(
Packit 022b05
	-NAME => "uploadmib"
Packit 022b05
    ));
Packit 022b05
Packit 022b05
    print p("diagram width: ", textfield(
Packit 022b05
	-NAME => "width",
Packit 022b05
	-DEFAULT => "1100"
Packit 022b05
    ));
Packit 022b05
    print p("diagram height: ", textfield(
Packit 022b05
	-NAME => "height",
Packit 022b05
	-DEFAULT => "700"
Packit 022b05
    ));
Packit 022b05
Packit 022b05
    print p(radio_group(
Packit 022b05
	-NAME => "deprobs",
Packit 022b05
	-VALUES => [ qw(none deprecated obsolete) ],
Packit 022b05
	-LINEBREAK => 1,
Packit 022b05
	-LABELS => {
Packit 022b05
	    none => "show only current objects",
Packit 022b05
	    deprecated => "show current and deprecated objects",
Packit 022b05
	    obsolete => "show all objects",
Packit 022b05
	},
Packit 022b05
    ));
Packit 022b05
Packit 022b05
    print p(checkbox(
Packit 022b05
	-NAME => "static",
Packit 022b05
	-LABEL => "generate a smaller, non-interactive SVG diagram",
Packit 022b05
    ));
Packit 022b05
Packit 022b05
    print p(submit("generate SVG"), reset("reset form"));
Packit 022b05
    print end_form;
Packit 022b05
    print end_html;
Packit 022b05
}