Skip to content

Instantly share code, notes, and snippets.

@enten
Last active October 10, 2022 19:44
Show Gist options
  • Save enten/208387a8f0626c40838c to your computer and use it in GitHub Desktop.
Save enten/208387a8f0626c40838c to your computer and use it in GitHub Desktop.
set -u
## ========================================================================================
## nygma : a tiNY Great MAnager
## ========================================================================================
PROGNAME="nygma"
PROGVERS="0.0.3"
PROGHELP="Usage: $PROGNAME <Nygfile> [DIR]
Arguments:
<Nyfile> # Path to Nygfile
[DIR] # Path where Nygfile will be executed
Options:
-p|--print # Just print the Nygfile.run created
-y|--yes # Auto-accept
--no-log # Disable the copy of Nygfile.run to [DIR]
-h|--help # Show help
-v|--version # Show version
"
## ----------------------------------------------------------------------------------------
## Environment
## ----------------------------------------------------------------------------------------
NYGMA_ANDROID_TMP_DIR="/data/$PROGNAME/tmp"
NYGMA_ANDROID_WGET_PROXY="http://192.168.1.52/www/enten.github.io/phd/proxy.php?u="
NYGMA_FILENAME="Nygfile"
NYGMA_LOGNAME="nygma.log"
NYGMA_TMP_DIR="/tmp/nygma"
NYGMA_COMMENT_ALIAS="#"
NYGMA_CHANGE_MODE_ALIAS="!"
NYGMA_KEYWORD_PATH="@PATH@"
NYGMA_MODE_SHELL=1
NYGMA_MODE_SHELL_NAME="shell"
NYGMA_MODE_JOKER=1
NYGMA_MODE_JOKER_NAME="joker"
NYGMA_MODE_JOKER_ALIAS="."
NYGMA_MODE_JOKER_BIN=
NYGMA_MODE_REQUIRE=1
NYGMA_MODE_REQUIRE_NAME="require"
NYGMA_MODE_PULL=1
NYGMA_MODE_PULL_NAME="pull"
NYGMA_MODE_PULL_SRC=
NYGMA_MODE_PULL_DIR=
NYGMA_MODE_PULL_CHMOD=664
NYGMA_MODE_WGET=1
NYGMA_MODE_WGET_NAME="wget"
NYGMA_MODE_WGET_PROXY=
NYGMA_MODE_SED=1
NYGMA_MODE_SED_NAME="sed"
NYGMA_MODE_SED_FILE=
NYGMA_SRC=
NYGMA_DIR=
NYGMA_DIR_ESCAPED=
NYGMA_OPTIONS=
NYGMA_OPT_LOG=1
NYGMA_OPT_PRINT=0
NYGMA_OPT_YES=0
NYGMA_BUFFER_IN=
NYGMA_BUFFER_OUT=
NYGMA_MODE=
NYGMA_PARSING_START=
NYGMA_PARSING_END=
NYGMA_PARSING_DURATION=
## ----------------------------------------------------------------------------------------
## Main functions
## ----------------------------------------------------------------------------------------
main() {
checkAndroid
if [ "$ANDROID_HOST" = "1" ]; then
NYGMA_TMP_DIR="$NYGMA_ANDROID_TMP_DIR"
NYGMA_MODE_WGET_PROXY="$NYGMA_ANDROID_WGET_PROXY"
fi
parseCommand "$@"
init
run
additions
wrap
[ "$NYGMA_OPT_PRINT" = "1" ] && printBuffer && quit
confirm
execute
quit
}
parseCommand() {
NYGMA_OPTIONS=$(getopt -o hlpvy -l help,no-log,print,version,yes -- "$@")
if [ $? -ne 0 ]; then
notFound
fi
eval set -- "$NYGMA_OPTIONS"
while :; do
case "$1" in
-h|--help) echo "$PROGHELP" ; exit ;;
--no-log) NYGMA_OPT_LOG=0 ; shift ;;
-p|--print) NYGMA_OPT_PRINT=1 ; shift ;;
-v|--version) echo "$PROGVERS" ; exit ;;
-y|--yes) NYGMA_OPT_YES=1 ; shift ;;
*) break ;;
esac
done
shift
case "$#" in
0) NYGMA_SRC="$(pwd)/$NYGMA_FILENAME" ; NYGMA_DIR="$(pwd)" ;;
1) NYGMA_SRC="$1" ; NYGMA_DIR="$(pwd)" ;;
2) NYGMA_SRC="$1" ; NYGMA_DIR="$2" ;;
*) notFound ;;
esac
[ -d "$NYGMA_SRC" ] && NYGMA_SRC="$NYGMA_SRC/$NYGMA_FILENAME"
}
init() {
mkdir -p "$NYGMA_TMP_DIR" >/dev/null 2>&1
NYGMA_BUFFER_IN="$NYGMA_TMP_DIR/$(cat /proc/sys/kernel/random/uuid)"
NYGMA_BUFFER_OUT="$NYGMA_TMP_DIR/$(cat /proc/sys/kernel/random/uuid)"
case "$NYGMA_SRC" in
http*)
if ! wget -q $NYGMA_SRC -O $NYGMA_BUFFER_IN; then
fail "Failed to download Nygfile from $NYGMA_SRC"
fi
;;
*)
[ ! -e "$NYGMA_SRC" ] && fail "Failed to found Nygfile at $NYGMA_SRC"
cat $NYGMA_SRC > $NYGMA_BUFFER_IN
[ "${NYGMA_SRC:0:1}" != "/" ] && NYGMA_SRC="$(readlink -f $NYGMA_SRC)"
esac
if [ "${NYGMA_DIR:0:1}" != "/" ]; then
if [ ! -e "$NYGMA_DIR" ]; then
mkdir -p $NYGMA_DIR >/dev/null && NYGMA_DIR="$(readlink -f $NYGMA_DIR)" && rmdir $NYGMA_DIR >/dev/null
else
NYGMA_DIR="$(readlink -f $NYGMA_DIR)"
fi
fi
NYGMA_DIR_ESCAPED="${NYGMA_DIR//\//\\/}"
NYGMA_MODE=
}
run() {
writeCmdMkdirBuffer "$NYGMA_DIR"
while read line; do
[ -z "$line" ] && continue
# TODO: make an optimization with sed?
[ "$(echo "$line" | grep "$NYGMA_KEYWORD_PATH")" != "" ] && line=$(echo $line | sed -e "s/$NYGMA_KEYWORD_PATH/$NYGMA_DIR_ESCAPED/g")
[ "${line:0:1}" = "$NYGMA_COMMENT_ALIAS" ] && continue
[ "${line:0:1}" = "$NYGMA_CHANGE_MODE_ALIAS" ] && changeMode $line && continue
[ ! -z "$NYGMA_MODE" ] && $NYGMA_MODE"ModeRun" $line && continue
noneModeRun $line
done < $NYGMA_BUFFER_IN
}
additions() {
writeCommentBuffer "-- nygma additions"
if [ "$NYGMA_OPT_LOG" = "1" ]; then
writeCmdCopyBuffer "$NYGMA_BUFFER_IN" "$NYGMA_DIR/Nygfile"
writeCmdCopyBuffer "$NYGMA_BUFFER_OUT" "$NYGMA_DIR/Nygfile.run"
fi
}
wrap() {
local result="$NYGMA_TMP_DIR/$(cat /proc/sys/kernel/random/uuid)"
echo "# -- generated by $PROGNAME ($PROGVERS) at $(date "+%D %T")" >> $result
echo "# NYGMA_SRC = $NYGMA_SRC" >> $result
echo "# NYGMA_DIR = $NYGMA_DIR" >> $result
echo "# NYGMA_BUFFER_IN = $NYGMA_BUFFER_IN" >> $result
echo "# NYGMA_BUFFER_OUT = $NYGMA_BUFFER_OUT" >> $result
echo "# NYGMA_MODE_WGET_PROXY = $NYGMA_MODE_WGET_PROXY" >> $result
#cat "$NYGMA_BUFFER_OUT" >> $result
printBuffer >> $result
echo "# -- end" >> $result
cat "$result" > $NYGMA_BUFFER_OUT
rm -f $result >/dev/null 2>&1
}
confirm() {
echo "-----------------------"
echo "1. Nygfile interpreted"
echo "-----------------------"
printBuffer
[ "$NYGMA_OPT_YES" = "1" ] && return
if ! type "read" >/dev/null 2>&1; then
return
fi
local response
echo ""
echo -n "Are you sure? [y/N] "
read response
case $response in
[yY][eE][sS]|[yY])
echo "OK" ;;
*)
echo "Cancel." ; quit ;;
esac
}
execute() {
NYGMA_PARSING_START=$(now)
echo ""
echo "-----------------------------"
echo "2. Nygfile execution starting"
echo "-----------------------------"
echo "$(cat $NYGMA_BUFFER_OUT)" | sh
NYGMA_PARSING_END=$(now)
NYGMA_PARSING_DURATION=$(($NYGMA_PARSING_END - $NYGMA_PARSING_START))
echo "--"
echo "Done (in $NYGMA_PARSING_DURATION second$([ "$NYGMA_PARSING_DURATION" != "1" ] && echo "s"))"
echo ""
}
## ----------------------------------------------------------------------------------------
## Support functions
## ----------------------------------------------------------------------------------------
now() {
date "+%s"
}
quit() {
removeBuffers
exit
}
warn() {
for i in "$@" ; do
echo "$i" >&2
done
}
fail() {
for i in "$@"; do
echo "$i" 1>&2
done
removeBuffers
exit 1
}
notFound() {
fail "ERROR: command not found" "--" "$PROGHELP"
}
removeBuffers() {
rm -f $NYGMA_BUFFER_IN $NYGMA_BUFFER_OUT >/dev/null 2>&1
}
printBuffer() {
cat "$NYGMA_BUFFER_OUT"
}
writeBuffer() {
echo "$@" >> $NYGMA_BUFFER_OUT
}
writeBlBuffer() {
writeBuffer " "
}
writeCommentBuffer() {
writeBuffer "# $@"
}
writeCmdMkdirBuffer() {
writeBuffer "if [ ! -e \"$1\" ]; then"
writeBuffer " mkdir -p $1 >/dev/null 2>&1"
writeBuffer "fi"
}
writeCmdCopyBuffer() {
writeBuffer "if [ -e \"$1\" ]; then"
writeBuffer " cp $1 $2 >/dev/null 2>&1"
writeBuffer "fi"
}
writeCmdRequireBuffer() {
writeCommentBuffer "required '$i'"
writeBuffer "if ! type $1 >/dev/null 2>&1; then"
writeBuffer " echo \"required tool '$1' is missing\" 1>&2"
writeBuffer " exit 1"
writeBuffer "fi"
}
writeCmdSedBuffer() {
local file="$1"
local search="$2"
local replace="$3"
local searchEscaped="${search//\//\\/}"
local replaceEscaped="${replace//\//\\/}"
writeCommentBuffer "replace '$search' by '$replace'"
writeBuffer "if [ -e \"$file\" ]; then"
writeBuffer " sed -i 's/$searchEscaped/$replaceEscaped/' $file"
writeBuffer "fi"
}
writeCmdWgetBuffer() {
local remote="$1"
local local="$2"
local chmod="$3"
local remoteProxy="$remote"
[ ! -z "$NYGMA_MODE_WGET_PROXY" ] && remoteProxy="$NYGMA_MODE_WGET_PROXY"$remote
writeCommentBuffer "$remote > $local ($chmod)"
writeCmdMkdirBuffer "$(dirname $local)"
writeBuffer "if wget -q $remoteProxy -O $local ; then"
writeBuffer " chmod $chmod $local"
writeBuffer "else"
writeBuffer " echo \"Download $remote failed!\" >&2 "
writeBuffer " rm -f $local >/dev/null 2>&1"
writeBuffer "fi"
}
changeMode() {
[ "$1" != "$NYGMA_CHANGE_MODE_ALIAS" ] && noneModeRun $@ && return
local mode="$2"
[ "$mode" = "$NYGMA_MODE_JOKER_ALIAS" ] && mode="$NYGMA_MODE_JOKER_NAME"
if [ "$mode" = "$PROGNAME" ]; then
nygmaModeRun $@
return
fi
local available=$(set | grep "$(echo NYGMA_MODE_$(echo $mode | tr 'a-z' 'A-Z'))=1")
if [ -z "$available" ]; then
NYGMA_MODE=
writeCommentBuffer "unknown mode '$mode'"
noneModeRun $@
return
fi
local initFunc=$mode"ModeInit"
local runFunc=$mode"ModeRun"
NYGMA_MODE="$mode"
if type $initFunc >/dev/null 2>&1; then
$initFunc $@
[ -z "$NYGMA_MODE" ] && noneModeRun $@ && return
fi
if ! type $runFunc >/dev/null 2>&1; then
NYGMA_MODE=
writeCommentBuffer "no method '$runFunc' to active '$mode' mode"
noneModeRun $@
return
fi
writeCommentBuffer "MODE '$NYGMA_MODE'"
}
nygmaModeRun() {
[ "$1" != "$NYGMA_CHANGE_MODE_ALIAS" ] && NYGMA_MODE= && noneModeRun $@ && return
[ "$2" != "$PROGNAME" ] && NYGMA_MODE= && noneModeRun $@ && return
[ $# -lt 3 ] && NYGMA_MODE= && noneModeRun $@ && return
local nygSrc="$3"
local nygDir="$NYGMA_DIR"
[ 3 -lt $# ] && nygDir="$4"
[ "${nygDir:0:1}" != "/" ] && nygDir="$NYGMA_DIR/$nygDir"
writeBlBuffer
for j in "$($0 "$(readlink -f $nygSrc)" "$nygDir" "-p" "--no-log")"; do
writeBuffer "$j"
done
writeBlBuffer
}
noneModeRun() {
writeCommentBuffer "ignored: $@"
}
shellModeRun() {
writeBuffer "$@"
}
jokerModeInit() {
[ "$1" != "$NYGMA_CHANGE_MODE_ALIAS" ] && NYGMA_MODE= && return
[ "$2" != "$NYGMA_MODE_JOKER_ALIAS" ] && NYGMA_MODE= && return
shift ; shift
if [ $# -lt 1 ]; then
NYGMA_MODE=
writeCommentBuffer "no minimum args to active $NYGMA_MODE_JOKER_NAME mode"
return
fi
local bin="$1"
if ! type $bin >/dev/null 2>&1; then
NYGMA_MODE=
writeCommentBuffer "'$bin' to active $NYGMA_MODE_JOKER_NAME mode was not found"
return
fi
NYGMA_MODE_JOKER_BIN="$bin"
}
jokerModeRun() {
shellModeRun "$NYGMA_MODE_JOKER_BIN $@"
}
requireModeRun() {
for i in "$@"; do
writeCmdRequireBuffer "$i"
done
}
pullModeInit() {
[ "$1" != "$NYGMA_CHANGE_MODE_ALIAS" ] && NYGMA_MODE= && return
[ "$2" != "$NYGMA_MODE_PULL_NAME" ] && NYGMA_MODE= && return
shift ; shift
if [ $# -lt 1 ]; then
NYGMA_MODE=
writeCommentBuffer "no minimum args to active $NYGMA_MODE_PULL_NAME mode"
return
fi
NYGMA_MODE_PULL_SRC="$1"
NYGMA_MODE_PULL_DIR="$NYGMA_DIR"
[ 1 -lt $# ] && [ ! -z "$2" ] && NYGMA_MODE_PULL_DIR="$2"
[ "${NYGMA_MODE_PULL_DIR:0:1}" != "/" ] && NYGMA_MODE_PULL_DIR="$NYGMA_DIR/$NYGMA_MODE_PULL_DIR"
}
pullModeRun() {
[ $# -lt 1 ] && noneModeRun $@ && return
local remote="$NYGMA_MODE_PULL_SRC/$1"
local local="$NYGMA_MODE_PULL_DIR/$1"
local chmod=$NYGMA_MODE_PULL_CHMOD
[ 1 -lt $# ] && local="$2"
[ "${local:0:1}" != "/" ] && local="$NYGMA_MODE_PULL_DIR/$local"
[ 2 -lt $# ] && chmod=$3
writeCmdWgetBuffer "$remote" "$local" "$chmod"
}
wgetModeRun() {
[ $# -lt 1 ] && noneModeRun $@ && return
local remote="$1"
local local="$NYGMA_DIR/$(basename $1)"
local chmod=$NYGMA_MODE_PULL_CHMOD
[ 1 -lt $# ] && local="$2"
[ "${local:0:1}" != "/" ] && local="$NYGMA_DIR/$local"
[ 2 -lt $# ] && chmod=$3
writeCmdWgetBuffer "$remote" "$local" "$chmod"
}
sedModeInit() {
[ "$1" != "$NYGMA_CHANGE_MODE_ALIAS" ] && NYGMA_MODE= && return
[ "$2" != "$NYGMA_MODE_SED_NAME" ] && NYGMA_MODE= && return
shift ; shift
if [ $# -lt 1 ]; then
NYGMA_MODE=
writeCommentBuffer "no minimum args to active $NYGMA_MODE_SED_NAME mode"
return
fi
NYGMA_MODE_SED_FILE="$1"
[ "${NYGMA_MODE_SED_FILE:0:1}" != "/" ] && NYGMA_MODE_SED_FILE="$NYGMA_DIR/$NYGMA_MODE_SED_FILE"
}
sedModeRun() {
[ $# -lt 2 ] && noneModeRun $@ && return
writeCmdSedBuffer "$NYGMA_MODE_SED_FILE" "$1" "$2"
}
## ----------------------------------------------------------------------------------------
## checkdroid - https://gist.github.com/enten/67c4e332908b248a59a9#file-checkdroid
## ----------------------------------------------------------------------------------------
ANDROID_HOST=0
ANDROID_BUSYBOX=/system/bin/busybox
ANDROID_BUSYBOX_APPLETS="acpid add-shell addgroup adduser adjtimex arp arping ash awk base64 basename beep blkid blockdev bootchartd brctl bunzip2 bzcat bzip2 cal cat catv chat chattr chgrp chmod chown chpasswd chpst chroot chrt chvt cksum clear cmp comm conspy cp cpio crond crontab cryptpw cttyhack cut date dc dd deallocvt delgroup deluser depmod devmem df dhcprelay diff dirname dmesg dnsd dnsdomainname dos2unix du dumpkmap dumpleases echo ed egrep eject env envdir envuidgid ether-wake expand expr fakeidentd false fbset fbsplash fdflush fdformat fdisk fgconsole fgrep find findfs flock fold free freeramdisk fsck fsck.minix fsync ftpd ftpget ftpput fuser getopt getty grep groups gunzip gzip halt hd hdparm head hexdump hostid hostname httpd hush hwclock id ifconfig ifdown ifenslave ifplugd ifup inetd init insmod install ionice iostat ip ipaddr ipcalc ipcrm ipcs iplink iproute iprule iptunnel kbd_mode kill killall killall5 klogd last less linux32 linux64 linuxrc ln loadfont loadkmap logger login logname logread losetup lpd lpq lpr ls lsattr lsmod lsof lspci lsusb lzcat lzma lzop lzopcat makedevs makemime man md5sum mdev mesg microcom mkdir mkdosfs mke2fs mkfifo mkfs.ext2 mkfs.minix mkfs.vfat mknod mkpasswd mkswap mktemp modinfo modprobe more mount mountpoint mpstat mt mv nameif nanddump nandwrite nbd-client nc netstat nice nmeter nohup nslookup ntpd od openvt passwd patch pgrep pidof ping ping6 pipe_progress pivot_root pkill pmap popmaildir poweroff powertop printenv printf ps pscan pstree pwd pwdx raidautorun rdate rdev readahead readlink readprofile realpath reboot reformime remove-shell renice reset resize rev rm rmdir rmmod route rpm rpm2cpio rtcwake run-parts runlevel runsv runsvdir rx script scriptreplay sed sendmail seq setarch setconsole setfont setkeycodes setlogcons setserial setsid setuidgid sh sha1sum sha256sum sha3sum sha512sum showkey slattach sleep smemcap softlimit sort split start-stop-daemon stat strings stty su sulogin sum sv svlogd swapoff swapon switch_root sync sysctl syslogd tac tail tar tcpsvd tee telnet telnetd test tftp tftpd time timeout top touch tr traceroute traceroute6 true tty ttysize tunctl udhcpc udhcpd udpsvd umount uname unexpand uniq unix2dos unlzma unlzop unxz unzip uptime users usleep uudecode uuencode vconfig vi vlock volname wall watch watchdog wc wget which who whoami whois xargs xz xzcat yes zcat zcip"
checkAndroid() {
[ ! -e "/system/bin/adb" ] && return
ANDROID_HOST=1
if ! type $ANDROID_BUSYBOX >/dev/null 2>&1; then
echo "FAILED! this program needs busybox to work on Android" 1>&2
exit 1
fi
for i in $ANDROID_BUSYBOX_APPLETS; do
eval "alias '$i=$ANDROID_BUSYBOX $i'"
done
}
## ----------------------------------------------------------------------------------------
## One main to rule them all...
## ----------------------------------------------------------------------------------------
main "$@"
## ========================================================================================
## ----------------------------------------------------------------------------------------
## Nygfile example
## ----------------------------------------------------------------------------------------
# ! require
# mv
#
# ! wget
# http://enten.fr/index.html blabla.html
#
# ! nygma Nygfile2 a
#
# ! pull https://raw.githubusercontent.com/lxc/lxc/master x
# templates/lxc-download.in
# templates/lxc-download.in templates/lxc-download.in2 777
# templates/lxc-download.in bin/lxc-download2 777
#
# ! pull http://enten.fr/
# phd/app/android/archlinux bin/archlinux 777
#
# ! shell
# echo "test"
# echo "ceci est un test"
# echo "@LXCHOOKDIR@" >> @PATH@/x/templates/lxc-download.in2
# echo "@LOCALSTATEDIR@" >> @PATH@/x/templates/lxc-download.in2
#
# ! xx
# bla bla
#
# ! sed x/templates/lxc-download.in2
# @LOCALSTATEDIR@ @PATH@/var
# @LXCTEMPLATECONFIG@ @PATH@/share/lxc/config
# @LXCHOOKDIR@ @PATH@/share/lxc/hooks
#
# ! . mv
# @PATH@/x/templates/lxc-download.in2 @PATH@/x/templates/lxc-download.in3
# @PATH@/x/templates/lxc-download.in @PATH@/x/templates/lxc.sh
#
## ----------------------------------------------------------------------------------------
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment