Hackfut Security File Manager
Current Path:
/usr/bin
usr
/
bin
/
📁
..
📄
GET
(15.84 KB)
📄
Mail
(408.89 KB)
📄
[
(53.6 KB)
📄
aclocal
(35.62 KB)
📄
aclocal-1.16
(35.62 KB)
📄
addr2line
(33.42 KB)
📄
agentxtrap
(24.54 KB)
📄
animate
(11.84 KB)
📄
ar
(61.96 KB)
📄
arch
(37.34 KB)
📄
arpaname
(11.82 KB)
📄
as
(889.91 KB)
📄
aspell
(159.5 KB)
📄
at
(1.25 KB)
📄
atq
(1.25 KB)
📄
atrm
(1.25 KB)
📄
autoconf
(14.42 KB)
📄
autoheader
(8.33 KB)
📄
autom4te
(31.43 KB)
📄
automake
(251.9 KB)
📄
automake-1.16
(251.9 KB)
📄
autoreconf
(20.57 KB)
📄
autoscan
(16.72 KB)
📄
autoupdate
(33.08 KB)
📄
awk
(669.77 KB)
📄
b2sum
(57.69 KB)
📄
base32
(41.47 KB)
📄
base64
(41.48 KB)
📄
basename
(37.41 KB)
📄
bash
(1.1 MB)
📄
bashbug-64
(7.18 KB)
📄
batch
(137 B)
📄
bison
(437.72 KB)
📄
bunzip2
(36.86 KB)
📄
byacc
(108.48 KB)
📄
bzcat
(36.86 KB)
📄
bzcmp
(2.08 KB)
📄
bzdiff
(2.08 KB)
📄
bzgrep
(1.64 KB)
📄
bzip2
(36.86 KB)
📄
bzip2recover
(16.44 KB)
📄
bzless
(1.23 KB)
📄
bzmore
(1.23 KB)
📄
c++
(1.21 MB)
📄
c++filt
(28.89 KB)
📄
c89
(224 B)
📄
c99
(215 B)
📄
cagefs_enter.proxied
(1.27 KB)
📄
cal
(65.98 KB)
📄
captoinfo
(85.31 KB)
📄
cat
(37.46 KB)
📄
catchsegv
(3.21 KB)
📄
cc
(1.21 MB)
📄
chcon
(70.34 KB)
📄
chgrp
(66.29 KB)
📄
chmod
(62.2 KB)
📄
chown
(70.29 KB)
📄
chrt
(37.19 KB)
📄
cksum
(37.39 KB)
📄
cldetect
(10.34 KB)
📄
clear
(12.54 KB)
📄
clusterdb
(70.23 KB)
📄
cmp
(103.76 KB)
📄
col
(29.01 KB)
📄
colcrt
(16.48 KB)
📄
colrm
(24.88 KB)
📄
column
(49.47 KB)
📄
combinediff
(55.44 KB)
📄
comm
(41.56 KB)
📄
compare
(11.85 KB)
📄
composite
(11.84 KB)
📄
conjure
(11.84 KB)
📄
convert
(11.84 KB)
📄
cp
(147.98 KB)
📄
cpan
(8.17 KB)
📄
cpp
(1.21 MB)
📄
createdb
(70.22 KB)
📄
createuser
(74.63 KB)
📄
crontab
(1.49 KB)
📄
crontab.cagefs
(54.16 KB)
📄
csplit
(53.68 KB)
📄
ctags
(272.94 KB)
📄
curl
(230.08 KB)
📄
cut
(49.52 KB)
📄
date
(105.96 KB)
📄
dbiprof
(6.06 KB)
📄
dd
(77.97 KB)
📄
dehtmldiff
(1.32 KB)
📄
delv
(42.46 KB)
📄
df
(91.09 KB)
📄
diff
(268.01 KB)
📄
diff3
(128.6 KB)
📄
dig
(162.18 KB)
📄
dir
(139.9 KB)
📄
dircolors
(49.55 KB)
📄
dirname
(33.36 KB)
📄
display
(11.84 KB)
📄
dnstap-read
(20.43 KB)
📄
dropdb
(66.02 KB)
📄
dropuser
(65.99 KB)
📄
du
(107 KB)
📄
easy_install-3
(0 B)
📄
echo
(37.35 KB)
📄
editdiff
(2 KB)
📄
egrep
(28 B)
📄
enc2xs
(40.97 KB)
📄
enchant
(21.08 KB)
📄
enchant-lsmod
(13.09 KB)
📄
env
(41.35 KB)
📄
eps2eps
(639 B)
📄
eqn
(232.16 KB)
📄
espdiff
(1.53 KB)
📄
ex
(1.13 MB)
📄
expand
(41.59 KB)
📄
expr
(49.57 KB)
📄
factor
(85.97 KB)
📄
false
(33.32 KB)
📄
fc-cache
(132 B)
📄
fc-cache-64
(20.35 KB)
📄
fc-cat
(16.35 KB)
📄
fc-conflist
(12.25 KB)
📄
fc-list
(12.25 KB)
📄
fc-match
(16.26 KB)
📄
fc-pattern
(12.26 KB)
📄
fc-query
(12.24 KB)
📄
fc-scan
(12.26 KB)
📄
fc-validate
(16.26 KB)
📄
fgrep
(28 B)
📄
file
(24.69 KB)
📄
filterdiff
(51.95 KB)
📄
find
(223.27 KB)
📄
fixcvsdiff
(1.83 KB)
📄
flex
(428.45 KB)
📄
flex++
(428.45 KB)
📄
flipdiff
(55.44 KB)
📄
flock
(33.2 KB)
📄
fmt
(45.49 KB)
📄
fold
(41.42 KB)
📄
free
(20.79 KB)
📄
freetype-config
(4.31 KB)
📄
funzip
(36.63 KB)
📄
g++
(1.21 MB)
📄
gawk
(669.77 KB)
📄
gcc
(1.21 MB)
📄
gcc-ar
(36.66 KB)
📄
gcc-nm
(36.66 KB)
📄
gcc-ranlib
(36.66 KB)
📄
gcov
(1.31 MB)
📄
gcov-dump
(570.96 KB)
📄
gcov-tool
(607.77 KB)
📄
gem
(542 B)
📄
gencat
(24.84 KB)
📄
geoiplookup
(21.89 KB)
📄
geoiplookup6
(21.65 KB)
📄
geqn
(232.16 KB)
📄
getconf
(32.46 KB)
📄
getent
(33.13 KB)
📄
getopt
(20.53 KB)
📄
ghostscript
(12.35 KB)
📄
git
(3.67 MB)
📄
git-receive-pack
(3.67 MB)
📄
git-shell
(2.13 MB)
📄
git-upload-archive
(3.67 MB)
📄
git-upload-pack
(3.67 MB)
📄
gm
(7.82 KB)
📄
gmake
(235.32 KB)
📄
gneqn
(908 B)
📄
gnroff
(3.23 KB)
📄
gpg
(1.04 MB)
📄
gpg-agent
(419.3 KB)
📄
gpg-error
(34.16 KB)
📄
gpg-zip
(3.44 KB)
📄
gpgsplit
(87.02 KB)
📄
gpgv
(451.51 KB)
📄
gpic
(293.84 KB)
📄
gprof
(103.35 KB)
📄
grep
(193.63 KB)
📄
grepdiff
(51.95 KB)
📄
groff
(124.92 KB)
📄
grops
(191.14 KB)
📄
grotty
(141.9 KB)
📄
groups
(37.39 KB)
📄
gs
(12.35 KB)
📄
gsnd
(277 B)
📄
gsoelim
(42.55 KB)
📄
gtar
(448.99 KB)
📄
gtbl
(154.61 KB)
📄
gtroff
(805.02 KB)
📄
gunzip
(2.29 KB)
📄
gzexe
(6.23 KB)
📄
gzip
(94.67 KB)
📄
h2ph
(28.69 KB)
📄
h2xs
(59.44 KB)
📄
head
(45.5 KB)
📄
hexdump
(57.51 KB)
📄
host
(142.3 KB)
📄
hostid
(33.34 KB)
📄
hostname
(21.16 KB)
📄
hunspell
(144.7 KB)
📄
iconv
(61.43 KB)
📄
id
(45.44 KB)
📄
identify
(11.84 KB)
📄
idn
(39.41 KB)
📄
ifnames
(4.03 KB)
📄
import
(11.84 KB)
📄
infocmp
(61.05 KB)
📄
infotocap
(85.31 KB)
📄
install
(156.16 KB)
📄
instmodsh
(4.1 KB)
📄
interdiff
(55.44 KB)
📄
ionice
(28.98 KB)
📄
ipcrm
(28.99 KB)
📄
ipcs
(53.4 KB)
📄
isosize
(24.88 KB)
📄
ispell
(988 B)
📄
join
(53.7 KB)
📄
kill
(37.28 KB)
📄
ld
(1.71 MB)
📄
ld.bfd
(1.71 MB)
📄
ldd
(5.31 KB)
📄
less
(173.76 KB)
📄
lessecho
(12.4 KB)
📄
lesskey
(21.99 KB)
📄
lesspipe.sh
(3.07 KB)
📄
lex
(428.45 KB)
📄
libnetcfg
(15.41 KB)
📄
libtool
(359.11 KB)
📄
libtoolize
(126.17 KB)
📄
link
(33.34 KB)
📄
ln
(70.5 KB)
📄
locale
(56.45 KB)
📄
localedef
(307.47 KB)
📄
logger
(49.98 KB)
📄
login
(40.96 KB)
📄
logname
(33.34 KB)
📄
look
(16.46 KB)
📄
ls
(139.91 KB)
📄
lsdiff
(51.95 KB)
📄
m4
(185.56 KB)
📄
mail
(408.89 KB)
📄
mailx
(408.89 KB)
📄
make
(235.32 KB)
📄
make-dummy-cert
(610 B)
📄
mariadb
(4.34 MB)
📄
mariadb-access
(109.34 KB)
📄
mariadb-admin
(3.88 MB)
📄
mariadb-binlog
(4.14 MB)
📄
mariadb-check
(3.88 MB)
📄
mariadb-conv
(3.59 MB)
📄
mariadb-convert-table-format
(4.12 KB)
📄
mariadb-dump
(3.97 MB)
📄
mariadb-dumpslow
(8.05 KB)
📄
mariadb-embedded
(22.61 MB)
📄
mariadb-find-rows
(3.21 KB)
📄
mariadb-hotcopy
(34.15 KB)
📄
mariadb-import
(3.87 MB)
📄
mariadb-plugin
(3.57 MB)
📄
mariadb-secure-installation
(13.49 KB)
📄
mariadb-setpermission
(17.56 KB)
📄
mariadb-show
(3.87 MB)
📄
mariadb-slap
(3.89 MB)
📄
mariadb-tzinfo-to-sql
(3.57 MB)
📄
mariadb-waitpid
(3.55 MB)
📄
mcookie
(33.27 KB)
📄
md5sum
(45.54 KB)
📄
mesg
(16.36 KB)
📄
mkdir
(82.7 KB)
📄
mkfifo
(66.46 KB)
📄
mknod
(70.47 KB)
📄
mktemp
(45.66 KB)
📄
mogrify
(11.84 KB)
📄
montage
(11.84 KB)
📄
more
(44.94 KB)
📄
msql2mysql
(1.41 KB)
📄
mv
(143.96 KB)
📄
my_print_defaults
(3.56 MB)
📄
mysql
(4.34 MB)
📄
mysql_config
(4.51 KB)
📄
mysql_find_rows
(3.21 KB)
📄
mysql_waitpid
(3.55 MB)
📄
mysqlaccess
(109.34 KB)
📄
mysqladmin
(3.88 MB)
📄
mysqlbinlog
(4.14 MB)
📄
mysqlcheck
(3.88 MB)
📄
mysqldump
(3.97 MB)
📄
mysqlimport
(3.87 MB)
📄
mysqlshow
(3.87 MB)
📄
mytop
(71.95 KB)
📄
namei
(33.1 KB)
📄
nano
(247.94 KB)
📄
neqn
(908 B)
📄
net-snmp-create-v3-user
(3.15 KB)
📄
nice
(37.33 KB)
📄
nl
(45.55 KB)
📄
nm
(50.38 KB)
📄
nohup
(37.41 KB)
📄
nproc
(37.41 KB)
📄
nroff
(3.23 KB)
📄
nslookup
(146.26 KB)
📄
nsupdate
(73.05 KB)
📄
numfmt
(65.64 KB)
📄
objcopy
(240.07 KB)
📄
objdump
(419.76 KB)
📄
od
(73.8 KB)
📄
openssl
(745.95 KB)
📄
pango-list
(11.88 KB)
📄
pango-view
(57.44 KB)
📄
passwd
(1.25 KB)
📄
paste
(37.4 KB)
📄
patch
(206.46 KB)
📄
pathchk
(37.34 KB)
📄
pdf2dsc
(698 B)
📄
pdf2ps
(909 B)
📄
perl
(12.43 KB)
📄
perl5.26.3
(12.43 KB)
📄
perlbug
(44.39 KB)
📄
perldoc
(118 B)
📄
perlivp
(10.56 KB)
📄
perlml
(6.61 KB)
📄
perlthanks
(44.39 KB)
📄
pg_dump
(399.43 KB)
📄
pg_dumpall
(107.11 KB)
📄
pg_restore
(173.34 KB)
📄
pgrep
(28.84 KB)
📄
php
(937 B)
📄
pic
(293.84 KB)
📄
piconv
(8.08 KB)
📄
pinentry
(2.35 KB)
📄
pinentry-curses
(77.89 KB)
📄
ping
(66.13 KB)
📄
pinky
(41.46 KB)
📄
pip-3
(0 B)
📄
pip3
(0 B)
📄
pkg-config
(40.04 KB)
📄
pkgconf
(40.04 KB)
📄
pkill
(28.84 KB)
📄
pl2pm
(4.43 KB)
📄
pmap
(32.78 KB)
📄
pod2html
(4.04 KB)
📄
pod2man
(14.68 KB)
📄
pod2text
(10.55 KB)
📄
pod2usage
(3.86 KB)
📄
podchecker
(3.57 KB)
📄
podselect
(2.47 KB)
📄
post-grohtml
(238.73 KB)
📄
pr
(82.15 KB)
📄
pre-grohtml
(130.55 KB)
📄
precat
(5.52 KB)
📄
preunzip
(5.52 KB)
📄
prezip
(5.52 KB)
📄
prezip-bin
(11.98 KB)
📄
printenv
(33.32 KB)
📄
printf
(53.56 KB)
📄
prove
(13.24 KB)
📄
ps
(134.75 KB)
📄
ps2ascii
(631 B)
📄
ps2epsi
(2.69 KB)
📄
ps2pdf
(272 B)
📄
ps2pdf12
(215 B)
📄
ps2pdf13
(215 B)
📄
ps2pdf14
(215 B)
📄
ps2pdfwr
(1.07 KB)
📄
ps2ps
(647 B)
📄
ps2ps2
(669 B)
📄
psql
(644.33 KB)
📄
ptx
(78 KB)
📄
pwd
(37.42 KB)
📄
pwdx
(12.68 KB)
📄
pydoc-3
(0 B)
📄
pydoc3
(0 B)
📄
python2
(7.84 KB)
📄
python2.7
(7.84 KB)
📄
python3
(11.59 KB)
📄
python3.6
(11.59 KB)
📄
python3.6m
(11.59 KB)
📄
pyvenv-3
(0 B)
📄
ranlib
(61.97 KB)
📄
raw
(16.5 KB)
📄
readelf
(624.54 KB)
📄
readlink
(45.88 KB)
📄
realpath
(49.94 KB)
📄
recode
(47.03 KB)
📄
recountdiff
(3.36 KB)
📄
rediff
(42.85 KB)
📄
reindexdb
(70.32 KB)
📄
rename
(16.5 KB)
📄
renew-dummy-cert
(725 B)
📄
renice
(16.46 KB)
📄
replace
(3.54 MB)
📄
reset
(24.76 KB)
📄
rev
(12.46 KB)
📄
rm
(70.38 KB)
📄
rmdir
(45.46 KB)
📄
rnano
(247.94 KB)
📄
ruby
(11.84 KB)
📄
run-with-aspell
(85 B)
📄
runcon
(37.38 KB)
📄
rvi
(1.13 MB)
📄
rview
(1.13 MB)
📄
scalar
(2.18 MB)
📄
scl
(36.87 KB)
📄
scl_enabled
(258 B)
📄
scl_source
(1.82 KB)
📄
scp
(102.84 KB)
📄
screen
(482.46 KB)
📄
script
(36.8 KB)
📄
sdiff
(105.33 KB)
📄
sed
(115.27 KB)
📄
selectorctl
(7.63 KB)
📄
seq
(53.45 KB)
📄
setsid
(16.38 KB)
📄
setterm
(45.13 KB)
📄
sftp
(159.74 KB)
📄
sh
(1.1 MB)
📄
sha1sum
(45.55 KB)
📄
sha224sum
(45.58 KB)
📄
sha256sum
(45.58 KB)
📄
sha384sum
(45.59 KB)
📄
sha512sum
(45.59 KB)
📄
shred
(61.85 KB)
📄
shuf
(58.09 KB)
📄
size
(33.25 KB)
📄
skill
(28.8 KB)
📄
slabtop
(20.84 KB)
📄
sleep
(37.4 KB)
📄
snice
(28.8 KB)
📄
snmpconf
(25.44 KB)
📄
soelim
(42.55 KB)
📄
sort
(123.48 KB)
📄
spell
(122 B)
📄
splain
(18.7 KB)
📄
split
(58.05 KB)
📄
splitdiff
(3.38 KB)
📄
sprof
(28.67 KB)
📄
sqlite3
(1.28 MB)
📄
ssh
(757.5 KB)
📄
ssh-add
(346.11 KB)
📄
ssh-agent
(325.58 KB)
📄
ssh-copy-id
(10.44 KB)
📄
ssh-keygen
(427.19 KB)
📄
ssh-keyscan
(428.52 KB)
📄
stat
(86.16 KB)
📄
stdbuf
(49.5 KB)
📄
strace
(1.94 MB)
📄
stream
(11.83 KB)
📄
strings
(37.43 KB)
📄
strip
(240.09 KB)
📄
stty
(77.61 KB)
📄
sum
(45.53 KB)
📄
sync
(37.35 KB)
📄
tabs
(16.55 KB)
📄
tac
(41.49 KB)
📄
tail
(74.13 KB)
📄
tar
(448.99 KB)
📄
taskset
(37.26 KB)
📄
tbl
(154.61 KB)
📄
tclsh
(9.04 KB)
📄
tclsh8.6
(9.04 KB)
📄
tee
(41.48 KB)
📄
test
(53.55 KB)
📄
tic
(85.31 KB)
📄
timeout
(41.85 KB)
📄
tload
(16.76 KB)
📄
tmpwatch
(35.47 KB)
📄
toe
(16.45 KB)
📄
top
(121.7 KB)
📄
touch
(93.94 KB)
📄
tput
(24.8 KB)
📄
tr
(49.63 KB)
📄
troff
(805.02 KB)
📄
true
(33.33 KB)
📄
truncate
(41.36 KB)
📄
tset
(24.76 KB)
📄
tsort
(41.49 KB)
📄
tty
(33.31 KB)
📄
tzselect
(15.01 KB)
📄
uapi
(1.25 KB)
📄
ul
(20.59 KB)
📄
uname
(37.33 KB)
📄
unexpand
(45.61 KB)
📄
uniq
(49.64 KB)
📄
unlink
(33.34 KB)
📄
unversioned-python
(0 B)
📄
unwrapdiff
(5.8 KB)
📄
unzip
(201.88 KB)
📄
unzipsfx
(101.48 KB)
📄
uptime
(12.59 KB)
📄
users
(37.4 KB)
📄
utmpdump
(28.66 KB)
📄
vacuumdb
(78.46 KB)
📄
vdir
(139.91 KB)
📄
vi
(1.13 MB)
📄
view
(1.13 MB)
📄
vmstat
(36.79 KB)
📄
watch
(29.19 KB)
📄
wc
(49.64 KB)
📄
wget
(521.41 KB)
📄
whereis
(29.27 KB)
📄
which
(29.38 KB)
📄
who
(53.59 KB)
📄
whoami
(33.34 KB)
📄
word-list-compress
(11.99 KB)
📄
x86_64-redhat-linux-c++
(1.21 MB)
📄
x86_64-redhat-linux-g++
(1.21 MB)
📄
x86_64-redhat-linux-gcc
(1.21 MB)
📄
x86_64-redhat-linux-gcc-8
(1.21 MB)
📄
xargs
(74.11 KB)
📄
xmlcatalog
(20.38 KB)
📄
xmllint
(73.37 KB)
📄
xmlwf
(36.96 KB)
📄
xsltproc
(28.47 KB)
📄
xsubpp
(4.96 KB)
📄
yacc
(108.48 KB)
📄
yes
(33.37 KB)
📄
zcat
(1.94 KB)
📄
zcmp
(1.64 KB)
📄
zdiff
(5.74 KB)
📄
zegrep
(29 B)
📄
zfgrep
(29 B)
📄
zforce
(2.03 KB)
📄
zgrep
(7.4 KB)
📄
zip
(229 KB)
📄
zipcloak
(102.91 KB)
📄
zipgrep
(2.88 KB)
📄
zipinfo
(201.88 KB)
📄
zipnote
(97.76 KB)
📄
zipsplit
(97.76 KB)
📄
zless
(2.15 KB)
📄
zmore
(1.8 KB)
📄
znew
(4.45 KB)
📄
zsoelim
(42.55 KB)
Editing: snmpconf
#!/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}; } } }
Upload File
Create Folder