#! /bin/sh # # punani - filesystem scienteer # # Engineering Operations # -E -i spec insert a package to the target filesystem # -E -r spec remove a package # set -euf godmode() { if test "${nosudo-false}" != true -a `id -u` != 0; then echo "!! we require god mode..." >&2 exec sudo "$0" "$@" exit 23 # go to hell fi } # return the 'system' variable # currently be: # arch-like # debian-like guess_system() { if [ -f "/etc/arch-release" ] ;then system="${system+$system, }arch-like" fi if [ -f "/etc/lsb-release" -o -f "/etc/debian_version" ] ;then system="${system+$system, }debian-like" fi } arch_aur_helper() { # pacman is the last fallback helper manager="yaourt clyde packer bauerbill tupac pacaur paktahn pbfetch aurget aurora cower powaur pacman" for i in $manager;do mgr=`which $i` if [ "$mgr" ] ;then echo $mgr return 0 fi done echo "!! no helper found, this should never happen(tm)." return 1 } handle_system () { case "$system" in (*arch-like*) # dryrun # TODO dryrun not dry enough for aur helper if [ "${dryrun-}" ];then pacman () { echo "pacman $@" ; } pkgfile () { echo "pkgfile $@"; } yaourt () { echo "yaourt $@" ; } fi # get dependencies : # we need pkgfile if ! [ `which pkgfile` ] ; then pacman -S --needed --noconfirm pkgtools pkgfile -u fi punani_Scientist_update() { pacman -Sy pkgtool -u } punani_Scientist_search() { pkgfile -s -b $1 if [ "${hard-}" ] ; then mgr=`arch_aur_helper` $mgr -Ss $1 fi } punani_Engineer_insert() { # punani under archlinux first tries to load the packages with the given file name # it needs pkgfile for that # # when trying harder it tries to load the package with the given name directly via yaourt echo "** trying to find package with given file" if pacman -S --needed $(pkgfile -s -b -r $1); then echo "++ finished" exit 0 else echo "!! nothing found in base repos" if [ "${hard-}" ] ; then echo "** trying harder" echo "** trying yaourt directly with given package" mgr=`arch_aur_helper` if $mgr -S $1 ;then echo "++ finished" return 0 else echo "!! giving up...i am sorry" return 1 fi echo else echo "?? When in doubt try $0 -h -Ei $1 " fi fi } punani_Engineer_remove() { pacman -Rcs "`pacman -Ql | grep $1$ | awk '{print $1}'`" if [ "${hard-}" ] ; then echo "** trying harder" echo "** directly delete given package name" pacman -Rcs "$1" fi } ;; (*debian-like*) #if [ "${dryrun-}" ]; then # apt-file () { echo $@; } # apt-get () { echo $@; } #fi if ! which apt-file; then echo "installing dependencies: apt-file" apt-get install --yes apt-file echo "update the apt-file tool" apt-file update fi punani_Scientist_update() { apt-get update apt-file update } punani_Scientist_search() { apt-file search -l -x $1\$ && exit 0 if [ "${hard-}" ] ; then apt-cache search $1 fi } punani_Engineer_insert() { echo "trying to install $1" if apt-get install `apt-file search -l -x $1\$`;then echo "++ finished" else if [ "${hard-}" ] ; then echo "** trying harder" apt-get install $1 fi fi } punani_Engineer_remove() { apt-get remove --purge "`apt-file search -l -x /$1\$`" if [ "${hard-}" ] ; then echo "** trying harder" echo "** directly delete given package name" apt-get remove --purge "$1" fi } ;; (*) email='krebs@syntax-fehler.de' irc_host='irc.freenode.org' irc_channel='#tincspasm' cat >&2 <&2 exit 23;; esac;; (Scientist) case $OPT in (s) command="${ns}_${role}_search";; (y) command="${ns}_${role}_update";; (*) echo 'Error 1: You are made of stupid!' >&2 exit 23;; esac ;; (undefined) case $OPT in (E) role=Engineer;; (S) role=Scientist;; (*) exit 23;; esac ;; (*) echo 'Error 1: You are made of stupid!' >&2 exit 23 ;; esac done } punani $@ case $role in (Engineer) godmode $@;; (Scientist) case $command in (*_update) godmode $@;; esac;; esac shift `echo $OPTIND-1 | bc` guess_system handle_system for name in "$@"; do "$command" "$name" || echo "!! could not install $name" done