This commit is contained in:
zawz 2023-02-16 16:54:08 +01:00
parent 0ef4854ae2
commit eb4e8bdb12
8 changed files with 433 additions and 1 deletions

1
.gitignore vendored
View file

@ -1,2 +1,3 @@
Zmakefile
zmakefile
local

48
confbak/confbak Executable file
View file

@ -0,0 +1,48 @@
#!/bin/sh
[ "$DEBUG" = true ] && set -x
[ ! -f "${XDG_CONFIG_HOME-$HOME/.config}/confbak.conf" ] && exit 1
. "${XDG_CONFIG_HOME-$HOME/.config}/confbak.conf"
basedest=~
if [ "$server" != "${server#*:}" ] ; then
basedest=${server#*:}
server=${server%%:*}
fi
HOSTNAME=$(cat /etc/hostname)
if [ -z "$files" ] ; then
files="
$HOSTNAME/etc:/etc:
$HOSTNAME/config:$HOME/.config:
$HOSTNAME/share:$HOME/.local/share:
"
fi
# $1 = dest , $2 = extension
compress_and_send() {
zstd -T0 | ssh "$server" "mkdir -p '$basedest/$(dirname "$1")' && cat > '$basedest/$1.zst'"
}
echo "$files" | while read -r ln ; do
[ -z "$ln" ] && continue
dest=$(echo "$ln" | cut -d: -f1)
folder=$(echo "$ln" | cut -d: -f2)
excludecmd=
for oneex in $(echo "$ln" | cut -d: -f3- | tr , '\n') ; do
excludecmd="$excludecmd --exclude=./$oneex"
done
(
cd "$folder"
sudo tar -cf - $excludecmd . | compress_and_send "$dest.tar"
)
done
echo "$cmds" | while read -r ln ; do
[ -z "$ln" ] && continue
dest=$(echo "$ln" | cut -d: -f1)
cmd=$(echo "$ln" | cut -d: -f2-)
sh -c "$cmd" | compress_and_send "$dest"
done

96
fscp/fscp Executable file
View file

@ -0,0 +1,96 @@
#!/bin/bash
[ "$DEBUG" = true ] && set -x
usage() {
cat << EOF
$0 <src> <dest>
Fast SCP, wrapper script to SCP using tar
Environment config:
COMPRESSION Compression command. Default "gzip"
EOF
}
ssh_exec() {
addr=$1
shift
if [ -n "$addr" ] ; then
ssh "$addr" exec "$(/usr/bin/printf "%q " "$@")"
else
exec "$@"
fi
}
srcscript='
set -e
path=$1
comp=$2
cw=$3
shift 3
cd "$(dirname "$path")"
name=$(basename "$path")
size=$(du -sb "$name" | cut -f1)
sleep 0.1
printf "%s\n" "$name"
sleep 0.1
if [ -d "$name" ] ; then
echo folder
cd "$name"
name=.
else
echo file
fi
sleep 0.1
exec "$@" "$name" | pv -s "$size" -fw $cw | $comp
'
dstscript='
set -e
path=$1
comp=$2
shift 3
name=$(head -n1)
type=$(head -n1)
if [ -d "$path" ] ; then
cd "$path"
else
cd "$(dirname "$path")"
name=$(basename "$path")
fi
if [ $type = folder ] ; then
mkdir -p "$name"
cd "$name"
$comp -d | "$@"
else
$comp -d | "$@" -O "$srcname" > "$name"
fi
'
# $1 = url , $2 = script , $3 = compression , $@ = script args
wrapssh() {
path=$1
script=$2
comp=$3
remote=
shift 3
if [ "$path" != "${path#*:}" ] ; then
remote=${path%%:*}
path=${path#*:}
fi
ssh_exec "$remote" sh -c "$script" sh "$path" "$comp" $(/usr/bin/tput cols) "$@"
}
if [ $# -lt 2 -o "$1" = "-h" -o "$1" = "--help" ] ; then
usage
exit 1
fi
src=$1
dst=$2
comp=${COMPRESSION-gzip}
wrapssh "$src" "$srcscript" "$comp" tar -cf - |
wrapssh "$dst" "$dstscript" "$comp" tar -xf -

73
rbuild/rbuild Executable file
View file

@ -0,0 +1,73 @@
#!/usr/bin/env bash
[ "$DEBUG" = true ] && set -x
set -e
# $1 = addr
ssh_exec() {
addr=$1
code=$2
shift 2
ssh "$addr" sh -c "$(/usr/bin/printf "%q " "$code")" sh "$(/usr/bin/printf "%q " "$@")"
}
BIND=${BIND}
MAP=${MAP}
REMOTE=${REMOTE-zawz@zsv}
IMAGE=${IMAGE-gcc:10-buster}
MODE=${MODE-docker}
TARGET=${TARGET-$(basename "$PWD")}
RESULT=${RESULT-$TARGET}
RESULT_LOCAL=${RESULT_LOCAL-$RESULT}
EXCLUDE=${EXCLUDE-obj}
DOCKER_USER=${DOCKER_USER-$UID}
volume_map=()
while read -r I
do
volume_map[N++]=--volume
volume_map[N++]=$I:$I:ro
done < <(tr ',' '\n' <<< "$BIND")
remotedir=$(ssh_exec "$REMOTE" 'mkdir -p "code/$1">/dev/null ; readlink -f "code/$1"' "$TARGET")
while IFS=: read -r I J
do
I=$(echo "$I" | sed "s|^\./|$remotedir/|g")
volume_map[N++]=--volume
volume_map[N++]=$I:$J:rw
done < <(tr ',' '\n' <<< "$MAP")
rsync -rvlpt --exclude="$EXCLUDE" -e ssh "$PWD/" "$REMOTE:code/$TARGET" >/dev/null
if [ "$MODE" = docker ] ; then
ssh_exec "$REMOTE" '
set -e
path=$1
user=$2
shift 2
cd "code/$path"
cat > .env
docker run --rm --user=$user \
--env-file=.env -w "/$path" \
--volume "$(pwd):/$path" \
"$@"
' "$TARGET" "$DOCKER_USER" "${volume_map[@]}" "$IMAGE" "$@" < <(
for I in $ENVBIND ; do
echo "$I=${!I}"
done
)
else
ssh_exec "$REMOTE" '
path=$1
shift 1
cd "code/$path"
cat > env
. env
set -x
"$@"
' "$target" "$@"
fi
mkdir -p "$(dirname "$RESULT_LOCAL")"
scp "$REMOTE:code/$TARGET/$RESULT" "$RESULT_LOCAL"

View file

@ -85,7 +85,9 @@ domod()
sleep $(echo "scale=3; $N*$interval/1000" | bc) &
sleepjob=$!
statedown=$(xinput query-state "$1" | grep -o '[1-9][0-9]*\]=down' | cut -d ']' -f1 | head -n1)
activewin=$(xdotool getactivewindow)
for cid in $statedown ; do
xdotool mouseup --window $activewin $cid
xdotool click --repeat $N --delay $2 "$cid" &
done
wait $sleepjob

110
zmon/zdu Executable file
View file

@ -0,0 +1,110 @@
#!/bin/sh
fname=$(basename $0)
usage() {
echo "$fname [options] [path]"
echo 'Find the biggest size hog in given path
Options:
-h Display help
-r <val> Size ratio for continuation
-s Print only size
-p Print only path
-k Print raw size (kbyte)
'
}
get_dirsize_list() {
du -d1 $1 2>/dev/null | sort -n
}
ratio=0.5
unset opt_s opt_p opt_k
duopt="xh"
while getopts ":hr:spk" opt
do
case $opt in
h)
usage
exit 0
;;
r)
if [ -z "$OPTARG" ]
then
echo "r needs an argument" >/dev/stderr
exit 2
fi
ratio=$OPTARG
;;
s)
opt_s=y
;;
p)
opt_p=y
;;
k)
duopt="x"
;;
*)
echo "Unknown option: -$opt" >/dev/stderr
exit 2
;;
esac
done
[ -z "$opt_p" ] && [ -z "$opt_s" ] && opt_p=y opt_s=y
shift $((OPTIND-1))
list=""
pval=""
nval=""
cratio=""
dest=""
_step()
{
list=$(get_dirsize_list $1)
if [ "$(echo "$list" | wc -l)" = "1" ]
then
cratio=""
return 0
fi
pval=$(echo "$list" | tail -n1)
nval=$(echo "$list" | tail -n2 | head -n1)
cratio=$(echo "scale=2;$(echo "$nval" | cut -f1)/$(echo "$pval" | cut -f1)" | bc 2>/dev/null)
dest=$(echo "$nval" | cut -f2- | xargs basename 2>/dev/null)
}
path="."
[ -n "$1" ] && path=$1
if ! [ -d $path ]
then
echo "Invalid path" >/dev/stderr
exit 1
fi
_step $path
while [ -n "$cratio" ] && [ "1" -eq "$(echo "$cratio >= $ratio" | bc)" ]
do
path="$path/$dest"
_step $path
done
pval=$(get_dirsize_list $path | tail -n1)
nval=$(find $path -maxdepth 1 -type f -printf '%s %p\n' | awk '{print int(($1+1023)/1024)"\t"$2}' | sort -n | tail -n1)
cratio=$(echo "scale=2;$(echo "$nval" | cut -f1)/$(echo "$pval" | cut -f1)" | bc 2>/dev/null)
if [ -n "$cratio" ] && [ "1" -eq "$(echo "$cratio >= $ratio" | bc)" ]
then
path="$path/$(echo "$nval" | cut -f2- | xargs basename)"
fi
[ -n "$opt_p" ] && printf "%s " "$path" | sed 's|^\./||;s|/./|/|' | tr -s '/'
[ -n "$opt_s" ] && printf "%s" "$(du -"$duopt"d0 "$path" | cut -f1)"
printf "\n"

102
zmon/zmem Executable file
View file

@ -0,0 +1,102 @@
#!/bin/sh
fname=$(basename $0)
usage () {
echo "$fname [options]"
echo 'Display the most memory intensive processes
memory pid process
Options:
-h Display help
-n <int> Top n processes. Default 10
-p <pid> Operate on given process id
-m Full memory map of processes, sorted by usage'
}
nmax=10
unset process map
while getopts ":hn:p:m" opt;
do
case $opt in
h)
usage
exit 0
;;
n)
if ! echo $OPTARG | grep -Eq '^[0-9]+$'
then
error "n argument has to be an integer"
exit 2
fi
if [ -z "$OPTARG" ]
then
error "n needs an argument"
exit 2
fi
if [ "$OPTARG" -lt 1 ]
then
error "n argument has to be greater than 0"
exit 2
fi
nmax=$OPTARG
;;
p)
process=$OPTARG
;;
m)
map=y
;;
\?)
echo "Uknown option: $OPTARG"
usage
exit 1
;;
esac
done
shift $((OPTIND-1))
if [ -n "$process" ] ; then
LIST=$(ps -q $process -eo "rss,pid,comm" | tail -n1)
else
LIST=$(ps -eo "rss,pid,comm" | tail -n+2 | sort -g | tail -n$nmax | tac)
fi
if [ -n "$map" ]
then
plist=$(echo "$LIST" | awk '{print $2}')
flist=""
for i in $plist
do
if [ -z "$flist" ]
then
flist=$(pmap -x $i | tail -n+3 | head -n-2)
else
flist=$(printf "%s\n%s" "$flist" "$(pmap -x $i | tail -n+3 | head -n-2)")
fi
done
echo "$flist" | sort -nk3
else
echo "$LIST" | awk '{
if(int($1/1048576)>0) {
p=int($1/1048576)"G"
}
else if(int($1/1024)>0) {
p=int($1/1024)"M"
}
else {
p=$1"K"
}
printf "%5s %5s %s\n", p, $2, $3
}'
fi

View file

@ -166,7 +166,7 @@ sinkinvolumeset()
}
sinkin_get_indexes()
{
list_sink_inputs | grep -E "(^Sink Input #)|(application.process.binary = )" | grep -F "application.process.binary = \"$1\"" -B1 | grep '^Sink Input' | cut -d'#' -f2
list_sink_inputs | grep -E "(^Sink Input #)|(application.process.binary = )|(application.name = )" | grep -E "(application.process.binary = \"$1\")|(application.name = \"$1\")" -B2 | grep '^Sink Input' | cut -d'#' -f2
}
#############