#!/usr/bin/perl # # A simple configuration file builder based on questions listed in # its own configuration file. It would certainly be easy to use this # for other (non-snmp) programs as well. # use Getopt::Std; use Term::ReadLine; use IO::File; use Data::Dumper; use File::Copy; if ($^O eq 'MSWin32') { eval 'require Win32::Registry;'; if ($@) { print "\nWarning: Perl module Win32::Registry is not installed. This module is\n"; print " required to read the SNMPSHAREPATH and SNMPCONFPATH values from \n"; print " the registry. To use snmpconf without the module you need to\n"; print " define SNMPSHAREPATH and SNMPCONFPATH as environment variables\n"; print " or use the -c and -I command line options.\n"; } } # globals %tokenitems=qw(line 1 info 1 comment 1); %arrayitems=qw(question 1 validanswer 1); # default folder for snmpconf-data if (defined(&my_getenv("SNMPSHAREPATH"))) { $opts{'c'} = &my_getenv("SNMPSHAREPATH") . "/snmpconf-data"; } else { $opts{'c'} = "/usr/share/snmp/snmpconf-data"; } # default config file path if (defined(&my_getenv("SNMPCONFPATH"))) { $confpath = &my_getenv("SNMPCONFPATH"); } else { $confpath = "/usr/share/snmp"; } # home environment variable if (defined(&my_getenv("HOME"))) { $home = &my_getenv("HOME") . "/.snmp"; } else { $home = "(HOME dir - n/a)"; } # read the argument string getopts("qadhfc:piI:r:R:g:G", \%opts); # display help if ($opts{'h'}) { print "$0 [options] [FILETOCREATE...]\n"; print "options:\n"; print " -f overwrite existing files without prompting\n"; print " -i install created files into $confpath.\n"; print " -p install created files into $home.\n"; print " -I DIR install created files into DIR.\n"; print " -a Don't ask any questions, just read in current\n"; print " current .conf files and comment them\n"; print " -r all|none Read in all or none of the .conf files found.\n"; print " -R file,... Read in a particular list of .conf files.\n"; print " -g GROUP Ask a series of GROUPed questions.\n"; print " -G List known GROUPs.\n"; print " -c conf_dir use alternate configuration directory.\n"; print " -q run more quietly with less advice.\n"; print " -d turn on debugging output.\n"; print " -D turn on debugging dumper output.\n"; exit; } # setup terminal interface. $ENV{'PERL_RL'}='o=0' if (!exists($ENV{'PERL_RL'})); $term = new Term::ReadLine 'snmpconf'; # read in configuration file set read_config_files($opts{'c'}, \%filetypes); debug(my_Dumper(\%filetypes)); if ($opts{'G'}) { Print("\nKnown GROUPs of tokens:\n\n"); foreach my $group (keys(%groups)) { print " $group\n"; } Print("\n"); exit; } # # Expand the search path in case it contains multiple directories. # my $ENV_SEPARATOR = ':'; my @searchpath = split(/$ENV_SEPARATOR/, $confpath); push @searchpath, "/etc/snmp"; push @searchpath, "."; push @searchpath, "$home"; # Remove trailing /'s or \'s for (my $i=0; $i <= $#searchpath; $i++) { $searchpath[$i] =~ /(.*?)([\/\\])*$/; $searchpath[$i] = $1; } # Determine persistent directory. Order of preference: # # file in SNMP_PERSISTENT_FILE environment variable # directory defined by persistentDir snmp.conf variable # directory in SNMP_PERSISTENT_DIR environment variable # default PERSISTENT_DIRECTORY directory my $persistentDir = ""; my $persistentFile = ""; # SNMP_PERSISTENT_FILE environment variable if (defined(&my_getenv("SNMP_PERSISTENT_FILE"))) { $persistentFile = &my_getenv("SNMP_PERSISTENT_FILE"); debug ("persistent file: SNMP_PERSISTENT_FILE environment variable set\n"); } # snmp.conf persistentDir if (!($persistentDir) && !($persistentFile)) { foreach my $i (@searchpath) { debug ("Searching file $i/snmp.conf for persistentDir\n"); my $temp = get_persistentDir("$i/snmp.conf"); if ($temp) { debug("persistent directory: set to $temp in $i/snmp.conf\n"); $persistentDir = $temp; last; } } } # SNMP_PERSISTENT_DIR environment variable if (!($persistentDir) && !($persistentFile)) { if (&my_getenv("SNMP_PERSISTENT_DIR")) { $persistentDir = &my_getenv("SNMP_PERSISTENT_DIR"); debug ("persistent directory: SNMP_PERSISTENT_DIR environment variable set\n"); } } # PERSISTENT_DIRECTORY default variable if (!($persistentDir) && !($persistentFile)) { $persistentDir = "/var/lib/net-snmp"; debug ("persistent directory: Using default value\n"); } # Rebuild search path without persistent folder # Note: persistent file handled in Find existing # files to possibly read in section if ($persistentDir) { # Remove trailing /'s or \'s $persistentDir =~ /(.*?)([\/\\])*$/; $persistentDir = $1; debug ("persistent directory: $persistentDir\n"); my @searchpath_old = @searchpath; @searchpath = (); foreach my $path_temp (@searchpath_old) { if ($path_temp eq $persistentDir) { debug("skipping persistent directory $path_temp\n"); next; } push @searchpath, $path_temp; } } # Reset $confpath to the first path $confpath = $searchpath[0]; # # Find existing files to possibly read in. # push @searchpath, $opts{I} if ($opts{I}); foreach my $i (@searchpath) { debug("searching $i\n"); foreach my $ft (keys(%filetypes)) { if ("$i/$ft" eq $persistentFile) { debug("skipping persistent file $i/$ft\n"); next; } debug("searching for $i/$ft\n"); $knownfiles{"$i/$ft"} = $ft if (-f "$i/$ft"); my $localft = $ft; $localft =~ s/.conf/.local.conf/; $knownfiles{"$i/$localft"} = $ft if (-f "$i/$localft"); } } # # Ask the user if they want them to be read in and read them # if (keys(%knownfiles)) { my @files; if (defined($opts{'r'})) { if ($opts{'r'} eq "all" || $opts{'r'} eq "a") { @files = keys(%knownfiles); } elsif ($opts{'r'} ne "none" && $opts{'r'} ne "n") { print "unknown argument to -r: $opts{'r'}\n"; exit(1); } } elsif(defined($opts{'R'})) { @files = split(/\s*,\s*/,$opts{'R'}); foreach my $i (@files) { my $x = $i; $x =~ s/.*\/([^\/]+)$/$1/; $knownfiles{$i} = $x; } Print("reading: ", join(",",@files),"\n"); } else { @files = display_menu(-head => "The following installed configuration files were found:\n", -tail => "Would you like me to read them in? Their content will be merged with the\noutput files created by this session.\n\nValid answer examples: \"all\", \"none\",\"3\",\"1,2,5\"\n", -multiple => 1, -question => 'Read in which', -defaultvalue => 'all', sort keys(%knownfiles)); } foreach my $i (@files) { debug("reading $i\n"); read_config($i, $knownfiles{$i}); } } if ($opts{'g'}) { my @groups = split(/,:\s/,$opts{'g'}); foreach my $group (@groups) { do_group($group); } } elsif ($#ARGV >= 0) { # # loop through requested files. # foreach my $i (@ARGV) { if (!defined($filetypes{$i})) { warn "invalid file: $i\n"; } else { if ($opts{'a'}) { $didfile{$i} = 1; } else { build_file($term, $i, $filetypes{$i}); } } } } else { # # ask user to select file type to operate on. # while(1) { my $line = display_menu(-head => "I can create the following types of configuration files for you.\nSelect the file type you wish to create:\n(you can create more than one as you run this program)\n", -question => 'Select File', -otheranswers => ['quit'], -mapanswers => { 'q' => 'quit' }, keys(%filetypes)); last if ($line eq "quit"); debug("file selected: $line\n"); build_file($term, $line, $filetypes{$line}); } } # # Write out the results to the output files. # output_files(\%filetypes, $term); # # Display the files that have been created for the user. # Print("\n\nThe following files were created:\n\n"); @didfiles = keys(%didfile); foreach my $i (@didfiles) { if ($didfile{$i} ne "1") { if ($opts{'i'} || $opts{'I'}) { $opts{'I'} = "$confpath" if (!$opts{'I'}); if (! (-d "$opts{'I'}") && ! (mkdir ("$opts{'I'}", 0755))) { print "\nCould not create $opts{'I'} directory: $!\n"; print ("File $didfile{$i} left in current directory\n"); } else { move ("$opts{'I'}/$i", "$opts{'I'}/$i.bak") if (-f "$opts{'I'}/$i"); if (move ("$didfile{$i}", "$opts{'I'}")) { print(" $didfile{$i} installed in $opts{'I'}\n"); } else { print "\nCould not move file $didfile{$i} to $opts{'I'}/$i: $!\n"; print ("File $didfile{$i} left in current directory\n"); } } } elsif ($opts{'p'}) { if (! (-d "$home") && ! (mkdir ("$home", 0755))) { print "\nCould not create $home directory: $!\n"; print ("File $didfile{$i} left in current directory\n"); } else { move ("$home/$i", "$home/$i.bak") if (-f "$home/$i"); if (move ("$didfile{$i}", "$home")) { print(" $didfile{$i} installed in $home\n"); } else { print "\nCould not move file $didfile{$i} to $home: $!\n"; print ("File $didfile{$i} left in current directory\n"); } } } else { Print(" $didfile{$i} ", ($i ne $didfile{$i})?"[ from $i specifications]":" ","\n"); if ($opts{'d'}) { open(I,$didfile{$i}); debug(" " . join(" ",<I>) . "\n"); close(I); } } } } if (!$opts{'p'} && !$opts{'i'} && !$opts{'I'}) { Print("\nThese files should be moved to $confpath if you want them used by everyone on the system. In the future, if you add the -i option to the command line I'll copy them there automatically for you. Or, if you want them for your personal use only, copy them to $home . In the future, if you add the -p option to the command line I'll copy them there automatically for you. "); } ########################################################################### # Functions ########################################################################### sub Print { print @_ if (!$opts{'q'}); } # # handle a group of questions # sub get_yn_maybe { my $question = shift; my $ans = "y"; if ($question ne "") { $ans = get_answer($term, $question, valid_answers(qw(yes y no n)), 'y'); } return ($ans =~ /^y/)?1:0; } sub do_group { my $group = shift; die "no such group $group\n" if (!$groups{$group}); foreach my $token (@{$groups{$group}}) { if ($token->[0] eq "message") { Print ("$token->[1] $token->[2]\n"); } elsif ($token->[0] eq "subgroup") { do_group($token->[1]) if (get_yn_maybe($token->[2])); } elsif (defined($tokenmap{$token->[1]})) { if (get_yn_maybe($token->[2])) { do { do_line($token->[1], $tokenmap{$token->[1]}); } until ($token->[0] ne "multiple" || get_answer($term, "Do another $token->[1] line?", valid_answers(qw(yes y no n)), 'y') =~ /n/); } } elsif (defined($filetypes{$token->[1]})) { $didfile{$token->[1]} = 1; } else { die "invalid member $token->[1] of group $group\n"; } } } # # build a particular type of file by operating on sections # sub build_file { my ($term, $filename, $fileconf) = @_; $didfile{$filename} = 1; my (@lines); while(1) { my $line = display_menu(-head => "The configuration information which can be put into $filename is divided\ninto sections. Select a configuration section for $filename\nthat you wish to create:\n", -otheranswers => ['finished'], -mapanswers => { 'f' => 'finished' }, -question => "Select section", -numeric => 1, map { $_->{'title'}[0] } @$fileconf); return @lines if ($line eq "finished"); do_section($fileconf->[$line-1]); } } # # configure a particular section by operating on token types # sub do_section { my $confsect = shift; my @lines; while(1) { Print ("\nSection: $confsect->{'title'}[0]\n"); Print ("Description:\n"); Print (" ", join("\n ",@{$confsect->{'description'}}),"\n"); my $line = display_menu(-head => "Select from:\n", -otheranswers => ['finished','list'], -mapanswers => { 'f' => 'finished', 'l' => 'list' }, -question => 'Select section', -descriptions => [map { $confsect->{$_}{info}[0] } @{$confsect->{'thetokens'}}], @{$confsect->{'thetokens'}}); return @lines if ($line eq "finished"); if ($line eq "list") { print "Lines defined for section \"$confsect->{title}[0]\" so far:\n"; foreach my $i (@{$confsect->{'thetokens'}}) { if ($#{$confsect->{$i}{'results'}} >= 0) { print " ",join("\n ",@{$confsect->{$i}{'results'}}),"\n"; } } next; } do_line($line, $confsect->{$line}); } return; } # # Ask all the questions related to a particular line type # sub do_line { my $token = shift; my $confline = shift; my (@answers, $counter, $i); # debug(my_Dumper($confline)); Print ("\nConfiguring: $token\n"); Print ("Description:\n ",join("\n ",@{$confline->{'info'}}),"\n\n"); for($i=0; $i <= $#{$confline->{'question'}}; $i++) { if (defined($confline->{'question'}[$i]) && $confline->{'question'}[$i] ne "") { my $q = $confline->{'question'}[$i]; $q =~ s/\$(\d+)/$answers[$1]/g; debug("after: $term, $q, ",$confline->{'validanswer'}[$i],"\n"); $answers[$i] = get_answer($term, $q, $confline->{'validanswer'}[$i]); $answers[$i] =~ s/\"/\\\"/g; $answers[$i] = '"' . $answers[$i] . '"' if ($answers[$i] =~ /\s/); } } if ($#{$confline->{'line'}} == -1) { my ($i,$line); for($i=0; $i <= $#{$confline->{'question'}}; $i++) { next if (!defined($confline->{'question'}[$i]) || $confline->{'question'}[$i] eq ""); $line .= " \$" . $i; } push @{$confline->{'line'}}, $line; } foreach my $line (@{$confline->{'line'}}) { my $finished = $line; debug("preline: $finished\n"); debug("answers: ",my_Dumper(\@answers)); $finished =~ s/\$(\d+)/$answers[$1]/g; if ($line =~ s/^eval\s+//) { debug("eval: $finished\n"); $finished = eval $finished; debug("eval results: $finished\n"); } $finished = $token . " " . $finished; Print ("\nFinished Output: $finished\n"); push @{$confline->{'results'}},$finished; } } # # read all sets of config files in the various subdirectories. # sub read_config_files { my $readdir = shift; my $filetypes = shift; opendir(DH, $readdir) || die "no such directory $readdir, did you run make install?\n"; my $dir; my $configfilename="snmpconf-config"; while(defined($dir = readdir(DH))) { next if ($dir =~ /^\./); next if ($dir =~ /CVS/); debug("dir entry: $dir\n"); if (-d "$readdir/$dir" && -f "$readdir/$dir/$configfilename") { my $conffile; # read the top level configuration inforamation about the direcotry. open(I, "$readdir/$dir/$configfilename"); while(<I>) { $conffile = $1 if (/forconffile: (.*)/); } close(I); # no README informatino. if ($conffile eq "") { print STDERR "Warning: No 'forconffile' information in $readdir/$dir/$configfilename\n"; next; } # read all the daat in the directory $filetypes->{$conffile} = read_config_items("$readdir/$dir", $conffile); } else { # no README informatino. print STDERR "Warning: No $configfilename file found in $readdir/$dir\n"; } } closedir DH; } # # read each configuration file in a directory # sub read_config_items { my $itemdir = shift; my $type = shift; opendir(ITEMS, $itemdir); my $file; my @results; while(defined($file = readdir(ITEMS))) { next if ($file =~ /~$/); next if ($file =~ /^snmpconf-config$/); if (-f "$itemdir/$file") { my $res = read_config_item("$itemdir/$file", $type); if (scalar(keys(%$res)) > 0) { push @results, $res; } } } closedir(ITEMS); return \@results; } # # mark a list of tokens as a special "group" # sub read_config_group { my ($fh, $group, $type) = @_; my $line; debug("handling group $group\n"); push (@{$groups{$group}},['filetype', $type]); while($line = <$fh>) { chomp($line); next if ($line =~ /^\s*$/); next if ($line =~ /^\#/); return $line if ($line !~ /^(single|multiple|message|filetype|subgroup)/); my ($type, $token, $rest) = ($line =~ /^(\w+)\s+([^\s]+)\s*(.*)/); debug ("reading group $group : $type -> $token -> $rest\n"); push (@{$groups{$group}}, [$type, $token, $rest]); } return; } # # Parse one file # sub read_config_item { my $itemfile = shift; my $itemcount; my $type = shift; my $fh = new IO::File($itemfile); return if (!defined($fh)); my (%results, $curtoken); debug("tokenitems: ", my_Dumper(\%tokenitems)); topwhile: while($line = <$fh>) { next if ($line =~ /^\s*\#/); my ($token, $rest) = ($line =~ /^(\w+)\s+(.*)/); next if (!defined($token) || !defined($rest)); while ($token eq 'group') { # handle special group list my $next = read_config_group($fh, $rest,$type); if ($next) { ($token, $rest) = ($next =~ /^(\w+)\s+(.*)/); } else { next topwhile; } } debug("token: $token => $rest\n"); if ($token eq 'steal') { foreach my $stealfrom (keys(%{$results{$rest}})) { if (!defined($results{$curtoken}{$stealfrom})) { @{$results{$curtoken}{$stealfrom}} = @{$results{$rest}{$stealfrom}}; } } } elsif (defined($tokenitems{$token})) { if (!defined($curtoken)) { die "error in configuration file $itemfile, no token set\n"; } $rest =~ s/^\#//; push @{$results{$curtoken}{$token}},$rest; } elsif (defined($arrayitems{$token})) { if (!defined($curtoken)) { die "error in configuration file $itemfile, no token set\n"; } my ($num, $newrest) = ($rest =~ /^(\d+)\s+(.*)/); if (!defined($num) || !defined($newrest)) { warn "invalid config line: $line\n"; } else { $results{$curtoken}{$token}[$num] = $newrest; } } elsif ($token =~ /^token\s*$/) { $rest = lc($rest); $curtoken = $rest; if (! exists $results{$curtoken}{'defined'}) { push @{$results{'thetokens'}}, $curtoken; $results{$curtoken}{'defined'} = 1; } $tokenmap{$curtoken} = $results{$curtoken}; debug("current token set to $token\n"); } else { push @{$results{$token}},$rest; } } return \%results; } sub debug { print @_ if ($opts{'d'}); } sub output_files { my $filetypes = shift; my $term = shift; foreach my $ft (keys(%$filetypes)) { next if (!$didfile{$ft}); my $outputf = $ft; if (-f $outputf && !$opts{'f'}) { print "\nError: An $outputf file already exists in this directory.\n\n"; my $ans = get_answer($term,"'overwrite', 'skip', 'rename' or 'append'? ",valid_answers(qw(o overwrite r rename s skip a append))); next if ($ans =~ /^(s|skip)$/i); if ($ans =~ /^(a|append)/) { $outputf = ">$outputf"; } elsif ($ans =~ /^(r|rename)$/i) { # default to rename for error conditions $outputf = $term->readline("Save to what new file name instead (or 'skip')? "); } } $didfile{$ft} = $outputf; open(O,">$outputf") || warn "couldn't write to $outputf\n"; print O "#" x 75,"\n"; print O "#\n# $ft\n"; print O "#\n# - created by the snmpconf configuration program\n#\n"; foreach my $sect (@{$filetypes->{$ft}}) { my $secthelp = 0; foreach my $token (@{$sect->{'thetokens'}}) { if ($#{$sect->{$token}{'results'}} >= 0) { if ($secthelp++ == 0) { print O "#" x 75,"\n# SECTION: ", join("\n# ", @{$sect->{title}}), "\n#\n"; print O "# ", join("\n# ",@{$sect->{description}}), "\n"; } print O "\n# $token: ", join("\n# ",@{$sect->{$token}{info}}), "\n\n"; foreach my $result (@{$sect->{$token}{'results'}}) { print O "$result\n"; } } } print O "\n\n\n"; } if ($#{$unknown{$ft}} > -1) { print O "#\n# Unknown directives read in from other files by snmpconf\n#\n"; foreach my $unknown (@{$unknown{$ft}}) { print O $unknown,"\n"; } } close(O); } } sub get_answer { my ($term, $question, $regexp, $defaultval) = @_; $question .= " (default = $defaultval)" if (defined($defaultval) && $defaultval ne ""); $question .= ": "; my $ans = $term->readline($question); return $defaultval if ($ans eq "" && defined($defaultval) && $defaultval ne ""); while (!(!defined($regexp) || $regexp eq "" || $ans =~ /$regexp/)) { print "invalid answer! It must match this regular expression: $regexp\n"; $ans = $term->readline($question); } return $defaultval if ($ans eq "" && defined($defaultval) && $defaultval ne ""); return $ans; } sub valid_answers { my @list; foreach $i (@_) { push @list, $i if ($i); } return "^(" . join("|",@list) . ")\$"; } sub read_config { my $file = shift; my $filetype = shift; return if (!defined($filetypes{$filetype})); if (! -f $file) { warn "$file does not exist\n"; return; } open(I,$file); while(<I>) { next if (/^\s*\#/); next if (/^\s*$/); chomp; my ($token, $rest) = /^\s*(\w+)\s+(.*)/; $token = lc($token); next if (defined($alllines{$_})); # drop duplicate lines if (defined($tokenmap{$token})) { push @{$tokenmap{$token}{'results'}},$_; } else { push @{$unknown{$filetype}},$_; } $alllines{$_}++; } close(I); } sub display_menu { my %config; while ($#_ > -1 && $_[0] =~ /^-/) { my $key = shift; $config{$key} = shift; } my $count=1; print "\n" if (!defined($config{'-dense'})); if ($config{'-head'}) { print $config{'-head'}; print "\n" if (!defined($config{'-dense'})); } my @answers = @_; my @list; if (defined($config{'-descriptions'}) && ref($config{'-descriptions'}) eq "ARRAY") { @list = @{$config{'-descriptions'}} } else { @list = @_; } foreach my $i (@list) { printf " %2d: $i\n", $count++ if ($i); } print "\n" if (!defined($config{'-dense'})); if (defined($config{'-otheranswers'})) { if (ref($config{'-otheranswers'}) eq 'ARRAY') { print "Other options: ", join(", ", @{$config{'-otheranswers'}}), "\n"; push @answers, @{$config{'-otheranswers'}}; push @answers, keys(%{$config{'-mapanswers'}}); } else { my $maxlen = 0; push @answers,keys(%{$config{'-otheranswers'}}); foreach my $i (keys(%{$config{'-otheranswers'}})) { $maxlen = length($i) if (length($i) > $maxlen); } foreach my $i (keys(%{$config{'-otheranswers'}})) { printf(" %-" . $maxlen . "s: %s\n", $i, $config{'-otheranswers'}{$i}); } } print "\n" if (!defined($config{'-dense'})); } if ($config{'-tail'}) { print $config{'-tail'}; print "\n" if (!defined($config{'-dense'})); } if (defined($config{'-question'})) { while(1) { my $numexpr; if ($config{'-multiple'}) { $numexpr = '[\d\s,]+|all|a|none|n'; } else { $numexpr = '\d+'; } push @answers,"" if ($config{'-defaultvalue'}); $ans = get_answer($term, $config{'-question'}, valid_answers($numexpr,@answers), $config{'-defaultvalue'}); if ($config{'-mapanswers'}{$ans}) { $ans = $config{'-mapanswers'}{$ans}; } if ($ans =~ /^$numexpr$/) { if ($config{'-multiple'}) { my @list = split(/\s*,\s*/,$ans); my @ret; $count = 0; foreach my $i (@_) { $count++; if ($ans eq "all" || $ans eq "a" || grep(/^$count$/,@list)) { push @ret, $i; } } return @ret; } else { if ($ans <= 0 || $ans > $#_+1) { warn "invalid selection: $ans [must be 1-" . ($#_+1) . "]\n"; } else { return $ans if ($config{'-numeric'}); $count = 0; foreach my $i (@_) { $count++; if ($ans eq $count) { return $i; } } } } } else { return $ans; } } } } sub my_Dumper { if ($opts{'D'}) { return Dumper(@_); } else { return "\n"; } } sub get_persistentDir { my $file = shift; my $result = 0; if (! -f $file) { return 0; } open(I,$file); while(<I>) { next if (/^\s*\#/); next if (/^\s*$/); chomp; my ($token, $rest) = /^\s*(\w+)\s+(.*)/; if (lc($token) eq "persistentdir") { $result = $rest; } next; } close(I); return $result; } # Usage: &win32_reg_read("key", "value") # Example: &win32_reg_read("SOFTWARE\\Net-SNMP","SNMPSHAREPATH"); # Returns: Value if found in HKCU or HCLM. Otherwise an empty string. sub win32_reg_read { my $sub_key = shift; my $value = shift; require Win32::Registry; my ($hkey, %key_values, $temp, $no_warn); # Try HKCU first $no_warn = $HKEY_CURRENT_USER; if ($HKEY_CURRENT_USER->Open($sub_key, $hkey)) { $hkey->GetValues(\%key_values); foreach $temp (sort keys %key_values) { if ($temp eq $value) { return $key_values{$temp}[2]; } } $hkey->Close(); } # Try HKLM second $no_warn = $HKEY_LOCAL_MACHINE; if ($HKEY_LOCAL_MACHINE->Open($sub_key, $hkey)) { $hkey->GetValues(\%key_values); foreach $temp (sort keys %key_values) { if ($temp eq $value) { return $key_values{$temp}[2]; } } $hkey->Close(); } return ""; } # Usage: &my_getenv("key") # Example: &my_getenv("SNMPSHAREPATH"); # Returns: Unix: Environment variable value (undef if not defined) # Win32: HKCU\Software\Net-SNMP\(key) or # Win32: HKLM\Software\Net-SNMP\(key) or # Win32: Environment variable value (undef if not defined) sub my_getenv { my $key = shift; # Unix if ($^O ne 'MSWin32') { return $ENV{$key}; } # Windows else { my $temp = &win32_reg_read("SOFTWARE\\Net-SNMP","$key"); if ($temp ne "") { return $temp; } else { return $ENV{$key}; } } }
Name | Type | Size | Permission | Actions |
---|---|---|---|---|
GET | File | 15.84 KB | 0755 |
|
Magick-config | File | 1.43 KB | 0755 |
|
MagickCore-config | File | 1.56 KB | 0755 |
|
MagickWand-config | File | 1.56 KB | 0755 |
|
File | 408.89 KB | 0755 |
|
|
Wand-config | File | 1.42 KB | 0755 |
|
[ | File | 53.67 KB | 0755 |
|
aclocal | File | 35.62 KB | 0755 |
|
aclocal-1.16 | File | 35.62 KB | 0755 |
|
addr2line | File | 33.41 KB | 0755 |
|
agentxtrap | File | 24.53 KB | 0755 |
|
animate | File | 11.84 KB | 0755 |
|
ar | File | 61.96 KB | 0755 |
|
arch | File | 37.41 KB | 0755 |
|
arpaname | File | 11.82 KB | 0755 |
|
as | File | 889.91 KB | 0755 |
|
aspell | File | 159.5 KB | 0755 |
|
at | File | 1.01 KB | 0755 |
|
atq | File | 1.01 KB | 0755 |
|
atrm | File | 1.02 KB | 0755 |
|
autoconf | File | 14.42 KB | 0755 |
|
autoheader | File | 8.33 KB | 0755 |
|
autom4te | File | 31.43 KB | 0755 |
|
automake | File | 251.9 KB | 0755 |
|
automake-1.16 | File | 251.9 KB | 0755 |
|
autoreconf | File | 20.57 KB | 0755 |
|
autoscan | File | 16.72 KB | 0755 |
|
autoupdate | File | 33.08 KB | 0755 |
|
awk | File | 669.77 KB | 0755 |
|
b2sum | File | 57.76 KB | 0755 |
|
base32 | File | 41.55 KB | 0755 |
|
base64 | File | 41.56 KB | 0755 |
|
basename | File | 37.49 KB | 0755 |
|
bash | File | 1.1 MB | 0755 |
|
bashbug-64 | File | 7.18 KB | 0755 |
|
batch | File | 137 B | 0755 |
|
bison | File | 437.72 KB | 0755 |
|
bunzip2 | File | 36.87 KB | 0755 |
|
bzcat | File | 36.87 KB | 0755 |
|
bzcmp | File | 2.08 KB | 0755 |
|
bzdiff | File | 2.08 KB | 0755 |
|
bzgrep | File | 1.64 KB | 0755 |
|
bzip2 | File | 36.87 KB | 0755 |
|
bzip2recover | File | 16.45 KB | 0755 |
|
bzless | File | 1.23 KB | 0755 |
|
bzmore | File | 1.23 KB | 0755 |
|
c++ | File | 1.21 MB | 0750 |
|
c++filt | File | 28.89 KB | 0755 |
|
c89 | File | 224 B | 0750 |
|
c99 | File | 215 B | 0750 |
|
cagefs_enter.proxied | File | 1.03 KB | 0755 |
|
cal | File | 65.98 KB | 0755 |
|
captoinfo | File | 85.31 KB | 0755 |
|
cat | File | 37.54 KB | 0755 |
|
catchsegv | File | 3.21 KB | 0755 |
|
cc | File | 1.2 MB | 0750 |
|
chcon | File | 70.43 KB | 0755 |
|
chgrp | File | 66.35 KB | 0755 |
|
chmod | File | 62.29 KB | 0755 |
|
chown | File | 70.39 KB | 0755 |
|
chrt | File | 37.18 KB | 0755 |
|
cksum | File | 37.46 KB | 0755 |
|
cldetect | File | 10.36 KB | 0755 |
|
clear | File | 12.54 KB | 0755 |
|
clusterdb | File | 70.23 KB | 0755 |
|
cmp | File | 103.76 KB | 0755 |
|
col | File | 29 KB | 0755 |
|
colcrt | File | 16.48 KB | 0755 |
|
colrm | File | 24.88 KB | 0755 |
|
column | File | 49.47 KB | 0755 |
|
comm | File | 41.63 KB | 0755 |
|
compare | File | 11.85 KB | 0755 |
|
composite | File | 11.84 KB | 0755 |
|
conjure | File | 11.84 KB | 0755 |
|
convert | File | 11.84 KB | 0755 |
|
cp | File | 148.05 KB | 0755 |
|
cpan | File | 7.87 KB | 0755 |
|
cpp | File | 1.21 MB | 0755 |
|
createdb | File | 70.22 KB | 0755 |
|
createuser | File | 74.63 KB | 0755 |
|
crontab | File | 1.36 KB | 0755 |
|
crontab.cagefs | File | 54.16 KB | 0755 |
|
csplit | File | 53.76 KB | 0755 |
|
curl | File | 230.08 KB | 0755 |
|
cut | File | 49.59 KB | 0755 |
|
date | File | 106.03 KB | 0755 |
|
dd | File | 78.05 KB | 0755 |
|
delv | File | 42.46 KB | 0755 |
|
df | File | 91.16 KB | 0755 |
|
diff | File | 268.01 KB | 0755 |
|
diff3 | File | 128.6 KB | 0755 |
|
dig | File | 162.19 KB | 0755 |
|
dir | File | 139.97 KB | 0755 |
|
dircolors | File | 49.63 KB | 0755 |
|
dirname | File | 33.44 KB | 0755 |
|
display | File | 11.84 KB | 0755 |
|
dnstap-read | File | 20.43 KB | 0755 |
|
dropdb | File | 66.02 KB | 0755 |
|
dropuser | File | 65.99 KB | 0755 |
|
du | File | 107.1 KB | 0755 |
|
File | 0 B | 0 |
|
|
echo | File | 37.43 KB | 0755 |
|
ed | File | 57.28 KB | 0755 |
|
egrep | File | 28 B | 0755 |
|
enc2xs | File | 40.97 KB | 0755 |
|
enchant | File | 21.08 KB | 0755 |
|
enchant-lsmod | File | 13.09 KB | 0755 |
|
env | File | 41.43 KB | 0755 |
|
eps2eps | File | 639 B | 0755 |
|
eqn | File | 232.16 KB | 0755 |
|
ex | File | 1.13 MB | 0755 |
|
expand | File | 41.66 KB | 0755 |
|
expr | File | 49.65 KB | 0755 |
|
factor | File | 86.05 KB | 0755 |
|
false | File | 33.39 KB | 0755 |
|
fc-cache | File | 132 B | 0755 |
|
fc-cache-64 | File | 20.35 KB | 0755 |
|
fc-cat | File | 16.35 KB | 0755 |
|
fc-conflist | File | 12.25 KB | 0755 |
|
fc-list | File | 12.25 KB | 0755 |
|
fc-match | File | 16.26 KB | 0755 |
|
fc-pattern | File | 12.26 KB | 0755 |
|
fc-query | File | 12.24 KB | 0755 |
|
fc-scan | File | 12.26 KB | 0755 |
|
fc-validate | File | 16.26 KB | 0755 |
|
fgrep | File | 28 B | 0755 |
|
file | File | 24.68 KB | 0755 |
|
find | File | 223.3 KB | 0755 |
|
flex | File | 428.45 KB | 0755 |
|
flex++ | File | 428.45 KB | 0755 |
|
flock | File | 33.2 KB | 0755 |
|
fmt | File | 45.57 KB | 0755 |
|
fold | File | 41.48 KB | 0755 |
|
free | File | 20.79 KB | 0755 |
|
freetype-config | File | 4.31 KB | 0755 |
|
funzip | File | 36.63 KB | 0755 |
|
g++ | File | 1.21 MB | 0750 |
|
gawk | File | 669.77 KB | 0755 |
|
gcc | File | 1.2 MB | 0750 |
|
gcc-ar | File | 36.64 KB | 0755 |
|
gcc-nm | File | 36.65 KB | 0755 |
|
gcc-ranlib | File | 36.65 KB | 0755 |
|
gcov | File | 1.31 MB | 0755 |
|
gcov-dump | File | 566.9 KB | 0755 |
|
gcov-tool | File | 603.72 KB | 0755 |
|
gencat | File | 24.84 KB | 0755 |
|
geoiplookup | File | 21.89 KB | 0755 |
|
geoiplookup6 | File | 21.65 KB | 0755 |
|
geqn | File | 232.16 KB | 0755 |
|
getconf | File | 32.46 KB | 0755 |
|
getent | File | 33.13 KB | 0755 |
|
getopt | File | 20.52 KB | 0755 |
|
ghostscript | File | 12.35 KB | 0755 |
|
git | File | 3.67 MB | 0755 |
|
git-receive-pack | File | 3.67 MB | 0755 |
|
git-shell | File | 2.13 MB | 0755 |
|
git-upload-archive | File | 3.67 MB | 0755 |
|
git-upload-pack | File | 3.67 MB | 0755 |
|
gm | File | 7.82 KB | 0755 |
|
gmake | File | 235.32 KB | 0755 |
|
gneqn | File | 908 B | 0755 |
|
gnroff | File | 3.23 KB | 0755 |
|
gpg | File | 1.04 MB | 0755 |
|
gpg-agent | File | 419.29 KB | 0755 |
|
gpg-error | File | 34.16 KB | 0755 |
|
gpg-zip | File | 3.44 KB | 0755 |
|
gpgsplit | File | 87.02 KB | 0755 |
|
gpgv | File | 451.58 KB | 0755 |
|
gpic | File | 293.84 KB | 0755 |
|
gprof | File | 103.36 KB | 0755 |
|
grep | File | 193.63 KB | 0755 |
|
groff | File | 124.92 KB | 0755 |
|
grops | File | 191.14 KB | 0755 |
|
grotty | File | 141.9 KB | 0755 |
|
groups | File | 37.47 KB | 0755 |
|
gs | File | 12.35 KB | 0755 |
|
gsnd | File | 277 B | 0755 |
|
gsoelim | File | 42.55 KB | 0755 |
|
gtar | File | 449.03 KB | 0755 |
|
gtbl | File | 154.61 KB | 0755 |
|
gtroff | File | 805.02 KB | 0755 |
|
gunzip | File | 2.29 KB | 0755 |
|
gzexe | File | 6.23 KB | 0755 |
|
gzip | File | 94.67 KB | 0755 |
|
h2ph | File | 28.69 KB | 0755 |
|
h2xs | File | 59.44 KB | 0755 |
|
head | File | 45.58 KB | 0755 |
|
hexdump | File | 57.5 KB | 0755 |
|
host | File | 142.3 KB | 0755 |
|
hostid | File | 33.41 KB | 0755 |
|
hostname | File | 21.16 KB | 0755 |
|
hunspell | File | 144.7 KB | 0755 |
|
iconv | File | 61.44 KB | 0755 |
|
id | File | 45.52 KB | 0755 |
|
identify | File | 11.84 KB | 0755 |
|
idn | File | 39.41 KB | 0755 |
|
ifnames | File | 4.03 KB | 0755 |
|
import | File | 11.84 KB | 0755 |
|
infocmp | File | 61.05 KB | 0755 |
|
infotocap | File | 85.31 KB | 0755 |
|
install | File | 156.25 KB | 0755 |
|
instmodsh | File | 4.1 KB | 0755 |
|
ionice | File | 28.98 KB | 0755 |
|
ipcrm | File | 28.99 KB | 0755 |
|
ipcs | File | 53.39 KB | 0755 |
|
isosize | File | 24.88 KB | 0755 |
|
ispell | File | 988 B | 0755 |
|
join | File | 53.77 KB | 0755 |
|
kill | File | 37.27 KB | 0755 |
|
ld | File | 1.71 MB | 0750 |
|
ld.bfd | File | 1.71 MB | 0750 |
|
ldd | File | 5.31 KB | 0755 |
|
less | File | 173.76 KB | 0755 |
|
lessecho | File | 12.4 KB | 0755 |
|
lesskey | File | 21.99 KB | 0755 |
|
lesspipe.sh | File | 3.07 KB | 0755 |
|
lex | File | 428.45 KB | 0755 |
|
libnetcfg | File | 15.41 KB | 0755 |
|
libtool | File | 359.11 KB | 0755 |
|
libtoolize | File | 126.17 KB | 0755 |
|
link | File | 33.41 KB | 0755 |
|
ln | File | 70.57 KB | 0755 |
|
locale | File | 56.45 KB | 0755 |
|
localedef | File | 307.47 KB | 0755 |
|
logger | File | 49.98 KB | 0755 |
|
login | File | 40.96 KB | 0755 |
|
logname | File | 33.42 KB | 0755 |
|
look | File | 16.45 KB | 0755 |
|
ls | File | 139.97 KB | 0755 |
|
m4 | File | 185.56 KB | 0755 |
|
File | 408.89 KB | 0755 |
|
|
mailx | File | 408.89 KB | 0755 |
|
make | File | 235.32 KB | 0755 |
|
make-dummy-cert | File | 610 B | 0755 |
|
mcookie | File | 33.26 KB | 0755 |
|
md5sum | File | 45.62 KB | 0755 |
|
mesg | File | 16.36 KB | 0755 |
|
mkdir | File | 82.79 KB | 0755 |
|
mkfifo | File | 66.56 KB | 0755 |
|
mknod | File | 70.55 KB | 0755 |
|
mktemp | File | 45.73 KB | 0755 |
|
mogrify | File | 11.84 KB | 0755 |
|
montage | File | 11.84 KB | 0755 |
|
more | File | 44.94 KB | 0755 |
|
mv | File | 144.03 KB | 0755 |
|
my_print_defaults | File | 6.2 MB | 0755 |
|
mysql | File | 7.36 MB | 0755 |
|
mysql_config | File | 840 B | 0755 |
|
mysql_config-64 | File | 4.9 KB | 0755 |
|
mysqladmin | File | 7.06 MB | 0755 |
|
mysqlbinlog | File | 7.51 MB | 0755 |
|
mysqlcheck | File | 7.07 MB | 0755 |
|
mysqldump | File | 7.14 MB | 0755 |
|
mysqlimport | File | 7.06 MB | 0755 |
|
mysqlshow | File | 7.05 MB | 0755 |
|
namei | File | 33.1 KB | 0755 |
|
nano | File | 247.94 KB | 0755 |
|
neqn | File | 908 B | 0755 |
|
net-snmp-create-v3-user | File | 3.15 KB | 0755 |
|
nice | File | 37.41 KB | 0755 |
|
nl | File | 45.63 KB | 0755 |
|
nm | File | 50.38 KB | 0755 |
|
nohup | File | 37.48 KB | 0755 |
|
nproc | File | 37.48 KB | 0755 |
|
nroff | File | 3.23 KB | 0755 |
|
nslookup | File | 146.26 KB | 0755 |
|
nsupdate | File | 73.05 KB | 0755 |
|
numfmt | File | 65.71 KB | 0755 |
|
objcopy | File | 240.07 KB | 0755 |
|
objdump | File | 419.76 KB | 0755 |
|
od | File | 73.88 KB | 0755 |
|
openssl | File | 745.95 KB | 0755 |
|
pango-list | File | 11.88 KB | 0755 |
|
pango-view | File | 57.44 KB | 0755 |
|
passwd | File | 1.02 KB | 0755 |
|
paste | File | 37.46 KB | 0755 |
|
patch | File | 206.46 KB | 0755 |
|
pathchk | File | 37.41 KB | 0755 |
|
pdf2dsc | File | 698 B | 0755 |
|
pdf2ps | File | 909 B | 0755 |
|
perl | File | 12.44 KB | 0755 |
|
perl5.26.3 | File | 12.44 KB | 0755 |
|
perlbug | File | 44.39 KB | 0755 |
|
perldoc | File | 118 B | 0755 |
|
perlivp | File | 10.56 KB | 0755 |
|
perlml | File | 6.86 KB | 0755 |
|
perlthanks | File | 44.39 KB | 0755 |
|
pg_dump | File | 399.43 KB | 0755 |
|
pg_dumpall | File | 107.11 KB | 0755 |
|
pg_restore | File | 173.34 KB | 0755 |
|
pgrep | File | 28.84 KB | 0755 |
|
php | File | 937 B | 0755 |
|
pic | File | 293.84 KB | 0755 |
|
piconv | File | 8.08 KB | 0755 |
|
pinentry | File | 2.35 KB | 0755 |
|
pinentry-curses | File | 77.89 KB | 0755 |
|
ping | File | 66.13 KB | 0755 |
|
pinky | File | 41.53 KB | 0755 |
|
File | 0 B | 0 |
|
|
File | 0 B | 0 |
|
|
pkg-config | File | 40.04 KB | 0755 |
|
pkgconf | File | 40.04 KB | 0755 |
|
pkill | File | 28.84 KB | 0755 |
|
pl2pm | File | 4.43 KB | 0755 |
|
pmap | File | 32.78 KB | 0755 |
|
pod2html | File | 4.04 KB | 0755 |
|
pod2latex | File | 10.01 KB | 0755 |
|
pod2man | File | 14.68 KB | 0755 |
|
pod2text | File | 10.55 KB | 0755 |
|
pod2usage | File | 3.86 KB | 0755 |
|
podchecker | File | 3.57 KB | 0755 |
|
podselect | File | 2.47 KB | 0755 |
|
post-grohtml | File | 238.73 KB | 0755 |
|
pr | File | 82.23 KB | 0755 |
|
pre-grohtml | File | 130.55 KB | 0755 |
|
precat | File | 5.52 KB | 0755 |
|
preunzip | File | 5.52 KB | 0755 |
|
prezip | File | 5.52 KB | 0755 |
|
prezip-bin | File | 11.98 KB | 0755 |
|
printenv | File | 33.4 KB | 0755 |
|
printf | File | 53.64 KB | 0755 |
|
prove | File | 13.24 KB | 0755 |
|
ps | File | 134.75 KB | 0755 |
|
ps2ascii | File | 631 B | 0755 |
|
ps2epsi | File | 2.69 KB | 0755 |
|
ps2pdf | File | 272 B | 0755 |
|
ps2pdf12 | File | 215 B | 0755 |
|
ps2pdf13 | File | 215 B | 0755 |
|
ps2pdf14 | File | 215 B | 0755 |
|
ps2pdfwr | File | 1.07 KB | 0755 |
|
ps2ps | File | 647 B | 0755 |
|
ps2ps2 | File | 669 B | 0755 |
|
psql | File | 644.33 KB | 0755 |
|
ptx | File | 78.07 KB | 0755 |
|
pwd | File | 37.5 KB | 0755 |
|
pwdx | File | 12.68 KB | 0755 |
|
File | 0 B | 0 |
|
|
File | 0 B | 0 |
|
|
python2 | File | 7.84 KB | 0755 |
|
python2.7 | File | 7.84 KB | 0755 |
|
python3 | File | 11.59 KB | 0755 |
|
python3.6 | File | 11.59 KB | 0755 |
|
python3.6m | File | 11.59 KB | 0755 |
|
File | 0 B | 0 |
|
|
ranlib | File | 61.98 KB | 0755 |
|
raw | File | 16.49 KB | 0755 |
|
readelf | File | 624.54 KB | 0755 |
|
readlink | File | 45.96 KB | 0755 |
|
realpath | File | 50.02 KB | 0755 |
|
recode | File | 47.03 KB | 0755 |
|
red | File | 89 B | 0755 |
|
reindexdb | File | 70.32 KB | 0755 |
|
rename | File | 16.5 KB | 0755 |
|
renew-dummy-cert | File | 725 B | 0755 |
|
renice | File | 16.46 KB | 0755 |
|
reset | File | 24.76 KB | 0755 |
|
rev | File | 12.45 KB | 0755 |
|
rm | File | 70.47 KB | 0755 |
|
rmdir | File | 45.54 KB | 0755 |
|
rnano | File | 247.94 KB | 0755 |
|
run-with-aspell | File | 85 B | 0755 |
|
runcon | File | 37.45 KB | 0755 |
|
rvi | File | 1.13 MB | 0755 |
|
rview | File | 1.13 MB | 0755 |
|
rvim | File | 2.93 MB | 0755 |
|
scalar | File | 2.18 MB | 0755 |
|
scl | File | 36.87 KB | 0755 |
|
scl_enabled | File | 258 B | 0755 |
|
scl_source | File | 1.82 KB | 0755 |
|
scp | File | 102.84 KB | 0755 |
|
screen | File | 482.46 KB | 0755 |
|
script | File | 36.79 KB | 0755 |
|
sdiff | File | 105.33 KB | 0755 |
|
sed | File | 115.48 KB | 0755 |
|
selectorctl | File | 7.6 KB | 0755 |
|
seq | File | 53.52 KB | 0755 |
|
setsid | File | 16.38 KB | 0755 |
|
setterm | File | 45.12 KB | 0755 |
|
sftp | File | 159.73 KB | 0755 |
|
sh | File | 1.1 MB | 0755 |
|
sha1sum | File | 45.63 KB | 0755 |
|
sha224sum | File | 45.66 KB | 0755 |
|
sha256sum | File | 45.66 KB | 0755 |
|
sha384sum | File | 45.66 KB | 0755 |
|
sha512sum | File | 45.66 KB | 0755 |
|
shred | File | 61.94 KB | 0755 |
|
shuf | File | 58.16 KB | 0755 |
|
size | File | 33.25 KB | 0755 |
|
skill | File | 28.8 KB | 0755 |
|
slabtop | File | 20.84 KB | 0755 |
|
sleep | File | 37.47 KB | 0755 |
|
snice | File | 28.8 KB | 0755 |
|
snmpconf | File | 25.44 KB | 0755 |
|
soelim | File | 42.55 KB | 0755 |
|
sort | File | 123.55 KB | 0755 |
|
spell | File | 122 B | 0755 |
|
splain | File | 18.7 KB | 0755 |
|
split | File | 58.13 KB | 0755 |
|
sprof | File | 28.67 KB | 0755 |
|
sqlite3 | File | 1.28 MB | 0755 |
|
ssh | File | 757.48 KB | 0755 |
|
ssh-add | File | 346.09 KB | 0755 |
|
ssh-agent | File | 325.56 KB | 0755 |
|
ssh-copy-id | File | 10.44 KB | 0755 |
|
ssh-keygen | File | 427.2 KB | 0755 |
|
ssh-keyscan | File | 428.56 KB | 0755 |
|
stat | File | 86.23 KB | 0755 |
|
stdbuf | File | 49.58 KB | 0755 |
|
strace | File | 1.97 MB | 0755 |
|
stream | File | 11.83 KB | 0755 |
|
strings | File | 37.43 KB | 0755 |
|
strip | File | 240.09 KB | 0755 |
|
stty | File | 77.68 KB | 0755 |
|
sum | File | 45.61 KB | 0755 |
|
sync | File | 37.43 KB | 0755 |
|
tabs | File | 16.55 KB | 0755 |
|
tac | File | 41.57 KB | 0755 |
|
tail | File | 74.2 KB | 0755 |
|
tar | File | 449.03 KB | 0755 |
|
taskset | File | 37.25 KB | 0755 |
|
tbl | File | 154.61 KB | 0755 |
|
tclsh | File | 9.04 KB | 0755 |
|
tclsh8.6 | File | 9.04 KB | 0755 |
|
tee | File | 41.55 KB | 0755 |
|
test | File | 53.63 KB | 0755 |
|
tic | File | 85.31 KB | 0755 |
|
time | File | 27.54 KB | 0755 |
|
timeout | File | 41.93 KB | 0755 |
|
tload | File | 16.76 KB | 0755 |
|
tmpwatch | File | 35.47 KB | 0755 |
|
toe | File | 16.45 KB | 0755 |
|
top | File | 121.7 KB | 0755 |
|
touch | File | 94.02 KB | 0755 |
|
tput | File | 24.8 KB | 0755 |
|
tr | File | 49.7 KB | 0755 |
|
tree | File | 81.59 KB | 0755 |
|
troff | File | 805.02 KB | 0755 |
|
true | File | 33.4 KB | 0755 |
|
truncate | File | 41.44 KB | 0755 |
|
tset | File | 24.76 KB | 0755 |
|
tsort | File | 41.57 KB | 0755 |
|
tty | File | 33.39 KB | 0755 |
|
tzselect | File | 15.01 KB | 0755 |
|
uapi | File | 1.02 KB | 0755 |
|
ul | File | 20.58 KB | 0755 |
|
uname | File | 37.41 KB | 0755 |
|
unexpand | File | 45.68 KB | 0755 |
|
uniq | File | 49.72 KB | 0755 |
|
unlink | File | 33.41 KB | 0755 |
|
File | 0 B | 0 |
|
|
unzip | File | 201.87 KB | 0755 |
|
unzipsfx | File | 101.48 KB | 0755 |
|
uptime | File | 12.59 KB | 0755 |
|
users | File | 37.47 KB | 0755 |
|
utmpdump | File | 28.66 KB | 0755 |
|
vacuumdb | File | 78.46 KB | 0755 |
|
vdir | File | 139.97 KB | 0755 |
|
vi | File | 1.13 MB | 0755 |
|
view | File | 1.13 MB | 0755 |
|
vim | File | 2.93 MB | 0755 |
|
vimdiff | File | 2.93 MB | 0755 |
|
vimtutor | File | 2.07 KB | 0755 |
|
vmstat | File | 36.79 KB | 0755 |
|
watch | File | 29.19 KB | 0755 |
|
wc | File | 49.72 KB | 0755 |
|
wget | File | 521.41 KB | 0755 |
|
whereis | File | 29.27 KB | 0755 |
|
which | File | 29.44 KB | 0755 |
|
who | File | 53.68 KB | 0755 |
|
whoami | File | 33.41 KB | 0755 |
|
word-list-compress | File | 11.99 KB | 0755 |
|
x86_64-redhat-linux-c++ | File | 1.21 MB | 0750 |
|
x86_64-redhat-linux-g++ | File | 1.21 MB | 0750 |
|
x86_64-redhat-linux-gcc | File | 1.2 MB | 0750 |
|
x86_64-redhat-linux-gcc-8 | File | 1.2 MB | 0750 |
|
xargs | File | 74.11 KB | 0755 |
|
xmlcatalog | File | 20.38 KB | 0755 |
|
xmllint | File | 73.37 KB | 0755 |
|
xmlwf | File | 32.96 KB | 0755 |
|
xsltproc | File | 28.42 KB | 0755 |
|
xsubpp | File | 4.96 KB | 0755 |
|
xxd | File | 20.52 KB | 0755 |
|
yes | File | 33.45 KB | 0755 |
|
zcat | File | 1.94 KB | 0755 |
|
zcmp | File | 1.64 KB | 0755 |
|
zdiff | File | 5.74 KB | 0755 |
|
zegrep | File | 29 B | 0755 |
|
zfgrep | File | 29 B | 0755 |
|
zforce | File | 2.03 KB | 0755 |
|
zgrep | File | 7.4 KB | 0755 |
|
zip | File | 229 KB | 0755 |
|
zipcloak | File | 102.91 KB | 0755 |
|
zipgrep | File | 2.88 KB | 0755 |
|
zipinfo | File | 201.87 KB | 0755 |
|
zipnote | File | 97.76 KB | 0755 |
|
zipsplit | File | 97.76 KB | 0755 |
|
zless | File | 2.15 KB | 0755 |
|
zmore | File | 1.8 KB | 0755 |
|
znew | File | 4.45 KB | 0755 |
|
zsoelim | File | 42.55 KB | 0755 |
|