You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
307 lines
5.9 KiB
307 lines
5.9 KiB
#!/usr/bin/env bash
|
|
|
|
set -eu
|
|
|
|
VDN_PATH=$(readlink -f $(dirname $(whereis vdn| cut -d ' ' -f 2))/..)
|
|
REVERSE=0
|
|
TRACE=0
|
|
export SLASH=$VDN_PATH/slash
|
|
|
|
help() {
|
|
cat << EOF
|
|
|
|
`basename $0` create slash directoty.
|
|
|
|
`synopsis`
|
|
|
|
-h : affiche cette aide
|
|
-t : lance vdn en mode trace. La capture est placée dans /tmp/vdn.trace (*)
|
|
-r : replace par un shebang classique.
|
|
|
|
(*) le fichier capture (/tmp/vdn.trace) est utilisé s'il existe par `basename $0`.
|
|
|
|
EOF
|
|
}
|
|
|
|
synopsis() {
|
|
cat << EOF
|
|
Usage : `basename $0` [-h] [-r]
|
|
`basename $0` -t
|
|
EOF
|
|
}
|
|
|
|
usage() {
|
|
synopsis
|
|
exit 2
|
|
}
|
|
|
|
|
|
|
|
args() {
|
|
local opt
|
|
while getopts "hrt" opt; do
|
|
case $opt in
|
|
h) help; exit 0;;
|
|
r) REVERSE=1;;
|
|
t) TRACE=1;;
|
|
?) usage;;
|
|
esac
|
|
done
|
|
shift $(($OPTIND - 1))
|
|
}
|
|
|
|
|
|
|
|
getTrace() {
|
|
strace -f -e trace=file $@ 2>&1 | \
|
|
egrep -v 'ENOENT|unfinished|resumed|attached|exited|SIG' | \
|
|
sed -re 's/^.*"(.*)".*$/\1/' | \
|
|
grep -v $VDN_PATH | \
|
|
grep -v $HOME | \
|
|
egrep '^/' | \
|
|
egrep -v '^/proc|^/etc|^/var|^/tmp/|^/run/|^/sys/|^/dev|^.$' | \
|
|
egrep -v '^/home|^/tmp' | \
|
|
sort -u > /tmp/trace.vdn
|
|
}
|
|
|
|
copy() {
|
|
|
|
s=$SLASH
|
|
r='^#'
|
|
while read f; do
|
|
[ -z "$f" ] && continue
|
|
[[ $f =~ $r ]] && continue
|
|
#[ $f = "/bin/bash" ] && continue
|
|
[ -d $f ] && continue
|
|
[ -f $f -o -L $f ] || {
|
|
echo "copy : BAD : $f"
|
|
continue
|
|
}
|
|
|
|
#echo ":$f"
|
|
|
|
d=$(dirname $f)
|
|
[ ! -d $s/$d ] && mkdir -p $s/$d || :
|
|
cp -a $f $s/$d || :
|
|
|
|
if [ -L $f ]; then
|
|
dst=$(readlink $f)
|
|
if [[ $dst =~ ^/ ]]; then
|
|
echo "ABS ($f) > $dst"
|
|
n=$(($(echo $f | sed -re 's/[^/]//g' | wc -c) -2))
|
|
p=$(ruby -e "puts \"../\"*$n")
|
|
b=$(basename $f)
|
|
rm $s/$d/$b
|
|
#ln -sf $s/$dst $s/$d/$b
|
|
ln -sf $p/$dst $s/$d/$b
|
|
echo $dst | copy
|
|
elif [[ $dst =~ ^/ ]]; then
|
|
echo "REL ($f) > $dst"
|
|
echo $dst | copy
|
|
else
|
|
echo $d/$dst | copy
|
|
fi
|
|
fi
|
|
#echo "==> $f"
|
|
done
|
|
}
|
|
|
|
findLibIte() {
|
|
local i e
|
|
|
|
while :; do
|
|
|
|
e=${ALL[$N]}
|
|
|
|
[ -z "$e" ] && break
|
|
|
|
for i in $(ldd $e | grep '=>' | sed -re 's/.*=> *([^ ]*) .*$/\1/g'); do
|
|
[[ ${ALL[@]} =~ (^| )$i( |$) ]] && continue
|
|
ALL+=("$i") # push
|
|
echo -ne "Found lib dependencies: ${#ALL[@]} ...\r" >&2
|
|
done
|
|
N=$((N+1))
|
|
done
|
|
|
|
echo "${ALL[@]}"
|
|
}
|
|
|
|
findShebang() {
|
|
local shebang
|
|
find $VDN_PATH -type f | while read f; do
|
|
shebang=$(dd if=$f bs=1 count=2 2> /dev/null | tr '\0' '\n' )
|
|
reg='#!'
|
|
[[ "$shebang" =~ $reg ]] && echo $f
|
|
done
|
|
}
|
|
|
|
setShebang() {
|
|
local shebang
|
|
while read f; do
|
|
#echo "---"
|
|
#echo $f
|
|
shebang=$(cat $f 2> /dev/null | gawk -e '{ print; exit 0 }' | tr '\0' '\n' 2> /dev/null)
|
|
#echo $shebang
|
|
new=$(echo "$shebang" | sed -re 's/#! */#!/' | gawk -v SHEBANG=$SHEBANG -e '
|
|
/env/ { print SHEBANG" "$2" "$3; exit }
|
|
{ sub(/^.*\//, "", $1); printf SHEBANG" "$1" "$2" "$3 ; exit }
|
|
')
|
|
#echo "new=$new"
|
|
sed -i -re "1s,.*,$new," $f
|
|
|
|
#sed -i -re '1s,(.*) -u,\1\n\nset -eu,' $f
|
|
#head -n 3 $f
|
|
done
|
|
}
|
|
|
|
findElf() {
|
|
local elf
|
|
find $VDN_PATH/slash -type f | while read f; do
|
|
elf=$(dd if=$f bs=1 count=10 2> /dev/null | tr '\0' '\n' )
|
|
reg='ELF'
|
|
[[ "$elf" =~ $reg ]] && echo $f
|
|
done
|
|
}
|
|
|
|
setElf() {
|
|
while read f; do
|
|
|
|
if ! patchelf --print-interpreter $f &> /dev/null; then
|
|
continue
|
|
fi
|
|
|
|
echo "patch $f"
|
|
|
|
patchelf --set-interpreter "/tmp/vdn-slash/lib/x86_64-linux-gnu/ld-2.24.so" $f
|
|
done
|
|
|
|
}
|
|
|
|
|
|
depends() {
|
|
rm -Rf $SLASH
|
|
mkdir $SLASH
|
|
|
|
rm -f /tmp/vdn-list-cmd
|
|
|
|
[ -e /tmp/vdn.trace ] && {
|
|
echo "Read trace"
|
|
cat /tmp/vdn.trace >> /tmp/vdn-list-cmd
|
|
}
|
|
|
|
echo "Scan commands"
|
|
|
|
vdn-find-commands >> /tmp/vdn-list-cmd
|
|
|
|
echo "Add manual dependencies"
|
|
|
|
cat << EOF >> /tmp/vdn-list-cmd
|
|
/bin/bash
|
|
|
|
/bin/ls
|
|
/bin/sh
|
|
/bin/dash
|
|
|
|
/usr/bin/less
|
|
/usr/bin/strace
|
|
|
|
/usr/bin/vim.gtk
|
|
/usr/bin/ldd
|
|
/usr/bin/basename
|
|
|
|
/usr/bin/xclock
|
|
/usr/bin/xauth
|
|
|
|
|
|
/lib/x86_64-linux-gnu/libreadline.so.7
|
|
|
|
/usr/bin/gdk-pixbuf-query-loaders
|
|
|
|
/usr/share/gir-1.0/Gio-2.0.gir
|
|
/lib64/ld-linux-x86-64.so.2
|
|
/usr/bin/python2.7
|
|
/usr/bin/python2.7-config
|
|
/lib/x86_64-linux-gnu/libaudit.so.1
|
|
/lib/x86_64-linux-gnu/libpcre.so.3
|
|
/lib/x86_64-linux-gnu/libprocps.so.6
|
|
/lib/x86_64-linux-gnu/libselinux.so.1
|
|
/lib/x86_64-linux-gnu/libtinfo.so.5
|
|
/lib/x86_64-linux-gnu/libtinfo.so.5.9
|
|
/lib/x86_64-linux-gnu/libnss_dns.so.2
|
|
|
|
/usr/lib/x86_64-linux-gnu/gdk-pixbuf-2.0/2.10.0/loaders/libpixbufloader-png.so
|
|
EOF
|
|
|
|
echo "Find dependencies..."
|
|
|
|
#echo "/bin/bash" > /tmp/vdn-list-cmd
|
|
|
|
#cat /tmp/vdn-list-cmd
|
|
|
|
cat /tmp/vdn-list-cmd | sort -u | {
|
|
declare -a ALL
|
|
N=0
|
|
|
|
while read l; do
|
|
[[ "$l" =~ ^[[:space:]]*$ ]] && continue
|
|
[[ "$l" =~ ^[[:space:]]*# ]] && continue
|
|
ALL+=("$l") # push
|
|
done
|
|
|
|
N=0
|
|
|
|
while :; do
|
|
|
|
set +u
|
|
e=${ALL[$N]}
|
|
set -u
|
|
|
|
[ -z "$e" ] && { break; }
|
|
|
|
for i in $(ldd $e 2> /dev/null | grep '=>' | sed -re 's/.*=> *([^ ]*) .*$/\1/g'); do
|
|
[[ ${ALL[@]} =~ (^| )$i( |$) ]] && continue
|
|
ALL+=("$i") # push
|
|
#echo -e "Found lib dependencies ${#ALL[@]} : $i ...\r" >&2
|
|
done
|
|
N=$((N+1))
|
|
done
|
|
echo ${ALL[@]} | tr ' ' '\n' | sort -u > /tmp/vdn-list-files
|
|
}
|
|
|
|
}
|
|
|
|
|
|
# main
|
|
|
|
args "$@"
|
|
|
|
[ $REVERSE = 1 ] && {
|
|
SHEBANG="#!/usr/bin/env"
|
|
echo "Reverse shebang : $SHEBANG"
|
|
SHEBANG="#!/usr/bin/env"; findShebang | setShebang $SHEBANG
|
|
exit
|
|
}
|
|
|
|
[ $TRACE = 1 ] && {
|
|
|
|
getTrace $@
|
|
|
|
exit
|
|
}
|
|
|
|
|
|
SHEBANG="#!/tmp/vdn-slash/usr/bin/env"
|
|
|
|
depends
|
|
echo "Copy..."; cat /tmp/vdn-list-files | copy
|
|
echo "Patch shebang"; findShebang | setShebang $SHEBANG
|
|
echo "Patch elf"; findElf | setElf
|
|
|
|
echo "Update pixbuf loader module file"
|
|
[ ! -d $VDN_PATH/slash/usr/lib/gdk-pixbuf-2.0/2.10.0/ ] && mkdir -p $VDN_PATH/slash/usr/lib/gdk-pixbuf-2.0/2.10.0/
|
|
gdk-pixbuf-query-loaders $VDN_PATH/slash/usr/lib/x86_64-linux-gnu/gdk-pixbuf-2.0/2.10.0/loaders/* |\
|
|
sed -re "s,$VDN_PATH/slash,/tmp/vdn-slash,"> $VDN_PATH/slash/usr/lib/gdk-pixbuf-2.0/2.10.0/loaders.cache
|
|
#gdk-pixbuf-query-loaders $VDN_PATH/slash/usr/lib/x86_64-linux-gnu/gdk-pixbuf-2.0/2.10.0/loaders/* > $VDN_PATH/slash/usr/lib/x86_64-linux-gnu/gdk-pixbuf-2.0/2.10.0/loaders.cache
|
|
|
|
|