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