From ae627d2aa73ea6862af3985f1c07e95c6d493275 Mon Sep 17 00:00:00 2001 From: tv Date: Tue, 5 Nov 2013 13:07:46 +0100 Subject: //punani: RIP --- .graveyard/punani/Makefile | 9 +++ .graveyard/punani/README.md | 30 +++++++++ .graveyard/punani/autostart/punani-debian | 102 +++++++++++++++++++++++++++++ .graveyard/punani/bin/punani | 70 ++++++++++++++++++++ .graveyard/punani/bot/__init__.py | 105 ++++++++++++++++++++++++++++++ .graveyard/punani/db/punani | 76 +++++++++++++++++++++ .graveyard/punani/doc/releases | 38 +++++++++++ .graveyard/punani/host/dist/arch/getsize | 17 +++++ .graveyard/punani/index.py | 97 +++++++++++++++++++++++++++ 9 files changed, 544 insertions(+) create mode 100644 .graveyard/punani/Makefile create mode 100644 .graveyard/punani/README.md create mode 100755 .graveyard/punani/autostart/punani-debian create mode 100755 .graveyard/punani/bin/punani create mode 100755 .graveyard/punani/bot/__init__.py create mode 100644 .graveyard/punani/db/punani create mode 100644 .graveyard/punani/doc/releases create mode 100755 .graveyard/punani/host/dist/arch/getsize create mode 100755 .graveyard/punani/index.py (limited to '.graveyard') diff --git a/.graveyard/punani/Makefile b/.graveyard/punani/Makefile new file mode 100644 index 00000000..f444b1fc --- /dev/null +++ b/.graveyard/punani/Makefile @@ -0,0 +1,9 @@ + +install: ../bin/punani + +../bin/punani: + ln -snvf ../punani/bin/punani ../bin/punani +debian: + useradd punani||: + cp autostart/punani-debian /etc/init.d/punani + update-rc.d punani defaults diff --git a/.graveyard/punani/README.md b/.graveyard/punani/README.md new file mode 100644 index 00000000..1b70eab7 --- /dev/null +++ b/.graveyard/punani/README.md @@ -0,0 +1,30 @@ +Overview +======= +Punani is a meta packagemanager comprising a server which resolves package +requests and a client containing the logic to find the best suitable packer +on the host system. Packagenames in Punani are binaries in the PATH. All +library packages are named in the Principle of Least Surprise[1]. Different +package names can resolve into the same package. + +If you want to install the `hostname` tool, the query is + punani install hostname +on an archlinux this will result in the call : + pacman --noconfirm -Sy --needed inetutils + +[1] http://de.wikipedia.org/wiki/Principle_of_Least_Surprise + +Punani Client +============ +The punani client will determine which packer are available on the system +and then send a request to the punani server to find out how the given +package is called with the given packer. In addition to that, the client +will add flags to the packers call in order to install packages only when +needed and disable user interaction. + +Punani Server +============ + +The punani server is a web-service which resolves request in the following +manner: + localhost/$packer/$package +The result is the package-name with the given packer or 404 if not found. diff --git a/.graveyard/punani/autostart/punani-debian b/.graveyard/punani/autostart/punani-debian new file mode 100755 index 00000000..53db0336 --- /dev/null +++ b/.graveyard/punani/autostart/punani-debian @@ -0,0 +1,102 @@ +#!/bin/sh +# uses template from /etc/init.d/skeleton +### BEGIN INIT INFO +# Provides: punani +# Required-Start: +# Required-Stop: +# Default-Start: 2 3 4 5 +# Default-Stop: 0 1 6 +# Short-Description: punani +# Description: starts punani daemon +# +### END INIT INFO + +PATH=/sbin:/usr/sbin:/bin:/usr/bin +NAME=punani +USER=punani +DESC="$NAME daemon" +DAEMON=/usr/bin/python +DAEMON_DIR="/krebs/punani" +DAEMON_ARGS="${DAEMON_DIR}/index.py" +PIDFILE=/var/run/$NAME.pid +SCRIPTNAME=/etc/init.d/$NAME + +[ -x "$DAEMON" ] || exit 0 +[ -r /etc/default/$NAME ] && . /etc/default/$NAME +. /lib/init/vars.sh +. /lib/lsb/init-functions + +do_start() +{ + # 0 if daemon has been started + # 1 if daemon was already running + # 2 if daemon could not be started + start-stop-daemon -b -d $DAEMON_DIR -c $USER --start --quiet --make-pidfile --pidfile $PIDFILE --exec $DAEMON --test > /dev/null \ + || return 1 + start-stop-daemon -b -d $DAEMON_DIR -c $USER --start --quiet --make-pidfile --pidfile $PIDFILE --exec $DAEMON -- \ + $DAEMON_ARGS \ + || return 2 +} + +do_stop() +{ + # 0 if daemon has been stopped + # 1 if daemon was already stopped + # 2 if daemon could not be stopped + start-stop-daemon --stop --retry=TERM/30/KILL/5 --pidfile $PIDFILE + RETVAL="$?" + [ "$RETVAL" = 2 ] && return 2 + rm -f $PIDFILE + return "$RETVAL" +} + +do_reload() { + start-stop-daemon --stop --signal 1 --quiet --pidfile $PIDFILE + return 0 +} + +case "$1" in + start) + [ "$VERBOSE" != no ] && log_daemon_msg "Starting $DESC" "$NAME" + do_start + case "$?" in + 0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;; + 2) [ "$VERBOSE" != no ] && log_end_msg 1 ;; + esac + ;; + stop) + [ "$VERBOSE" != no ] && log_daemon_msg "Stopping $DESC" "$NAME" + do_stop + case "$?" in + 0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;; + 2) [ "$VERBOSE" != no ] && log_end_msg 1 ;; + esac + ;; + status) + status_of_proc "$DAEMON" "$NAME" && exit 0 || exit $? + ;; + restart|force-reload) + log_daemon_msg "Restarting $DESC" "$NAME" + do_stop + case "$?" in + 0|1) + do_start + case "$?" in + 0) log_end_msg 0 ;; + 1) log_end_msg 1 ;; + *) log_end_msg 1 ;; + esac + ;; + *) + # Failed to stop + log_end_msg 1 + ;; + esac + ;; + *) + echo "Usage: $SCRIPTNAME {start|stop|status|restart|force-reload}" >&2 + exit 3 + ;; +esac + +: diff --git a/.graveyard/punani/bin/punani b/.graveyard/punani/bin/punani new file mode 100755 index 00000000..23ba5e00 --- /dev/null +++ b/.graveyard/punani/bin/punani @@ -0,0 +1,70 @@ +#! /bin/sh +set -euf + +PUNANI_HOST="${PUNANI_HOST-http://euer.krebsco.de:9111}" +ACTION="$1"; shift +PKGS="$*" + +## find package manager +if ! :; then : # dummy case, so the rest has a common format + +elif for PACKER_CMD in aptitude apt-get + do type $PACKER_CMD 2>/dev/null 1>&2 && break; done; then + INSTALL_PARAM='-y install' + REMOVE_PARAM='-y remove' + +elif for PACKER_CMD in bauerbill packer yaourt pacman + do type $PACKER_CMD 2>/dev/null 1>&2 && break; done; then + INSTALL_PARAM='--noconfirm -S --needed' + REMOVE_PARAM='-Rcs' + +elif for PACKER_CMD in yum + do type $PACKER_CMD 2>/dev/null 1>&2 && break; done; then + INSTALL_PARAM='-y install' + REMOVE_PARAM='-y remove' + +elif for PACKER_CMD in brew + do type $PACKER_CMD 2>/dev/null 1>&2 && break; done; then + INSTALL_PARAM='install' + REMOVE_PARAM='remove' + + + +else + echo "Error 2: no known package manager found; no punani for you!" >&2 + exit 23 +fi + +## find package name +if test -n "$PKGS"; then + for PKG in $PKGS; do + RES="`wget -O- $PUNANI_HOST/$PACKER_CMD/$PKG 2>/dev/null || :`" + if [ ! "$RES" ]; then + echo "Error 2: could not resolve '$PKG'; no punani for you!" >&2 + exit 23 + fi + RESOLVED="${RESOLVED+$RESOLVED }$RES" + done +else + echo "Error 1: no PACKAGE specified." >&2 + ACTION="usage" +fi + +## dispatch +case "$ACTION" in + install) + set -x + for PKG in $RESOLVED; do + sudo $PACKER_CMD $INSTALL_PARAM $PKG || echo "Cannot install $PKG!" + done + ;; + remove) + set -x + for PKG in $RESOLVED; do + sudo $PACKER_CMD $REMOVE_PARAM $PKG || echo "Cannot remove $PKG!" + done + ;; + *) + echo "usage: `basename $0` (install|remove) PACKAGE..." + exit 23 +esac diff --git a/.graveyard/punani/bot/__init__.py b/.graveyard/punani/bot/__init__.py new file mode 100755 index 00000000..4944bba0 --- /dev/null +++ b/.graveyard/punani/bot/__init__.py @@ -0,0 +1,105 @@ +#!/usr/bin/python +from Queue import Queue +from SocketServer import BaseRequestHandler, ThreadingTCPServer +from threading import Thread +from time import sleep, strftime, strptime + +from ircbot import SingleServerIRCBot +from irclib import nm_to_n + + +class PunaniRequestHandler(BaseRequestHandler): + """Handler for Punani messages.""" + + def handle(self): + try: + msg = self.request.recv(1024).strip() + except ValueError: + msg = 'Invalid message.' + else: + self.server.queue.put((self.client_address, msg)) + print ('%s:%d' % self.client_address), str(msg) + + +class PunaniReceiveServer(ThreadingTCPServer): + """UDP server that waits for Punani messages.""" + + def __init__(self): + ThreadingTCPServer.__init__(self, + ('127.0.0.1', 5555), + PunaniRequestHandler) + self.queue = Queue() + + +class PunaniBot(SingleServerIRCBot): + + def __init__(self, server_list, channel_list, nickname='punani-ircbot', + realname='Bob Ross'): + self.reconnection_interval = 30 + SingleServerIRCBot.__init__(self, server_list, nickname, realname) + self.channel_list = channel_list + + def on_welcome(self, conn, event): + """Join channels after connect.""" + print 'Connected to %s:%d.' % conn.socket.getsockname() + for channel, key in self.channel_list: + conn.join(channel, key) + + def on_nicknameinuse(self, conn, event): + """Choose another nickname if conflicting.""" + self._nickname += '_' + conn.nick(self._nickname) + + def on_ctcp(self, conn, event): + """Answer CTCP PING and VERSION queries.""" + whonick = nm_to_n(event.source()) + message = event.arguments()[0].lower() + if message == 'version': + conn.notice(whonick, 'Punani2irc') + elif message == 'ping': + conn.pong(whonick) + + def on_privmsg(self, conn, event): + """React on private messages. + + Die, for example. + """ + whonick = nm_to_n(event.source()) + message = event.arguments()[0] + if message == 'die!': + print 'Shutting down as requested by %s...' % whonick + self.die('Shutting down.') + + def say(self, msg): + """Say message to channels.""" + for channel, key in self.channel_list: + self.connection.privmsg(channel, msg) + + +def process_queue(announce_callback, queue, delay=2): + """Process received messages in queue.""" + while True: + sleep(delay) + try: + addr, msg = queue.get() + except Empty: + continue + #do something with the addr? + announce_callback(str(msg)) +if __name__ == '__main__': + # Set IRC connection parameters. + irc_servers = [('supernode', 6667)] + irc_channels = [('#retiolum', '')] + + # Prepare and start IRC bot. + bot = PunaniBot(irc_servers, irc_channels) + t = Thread(target=bot.start) + t.daemon = True + t.start() + announce = bot.say + + receiver = PunaniReceiveServer() + t = Thread(target=process_queue, args=(announce, receiver.queue)) + t.daemon = True + t.start() + receiver.serve_forever() diff --git a/.graveyard/punani/db/punani b/.graveyard/punani/db/punani new file mode 100644 index 00000000..e5d1f383 --- /dev/null +++ b/.graveyard/punani/db/punani @@ -0,0 +1,76 @@ +{ + "packer-symlinks" : { + "packer" : "yaourt", + "aptitude" : "apt-get", + "bauerbill" : "yaourt" + }, + "super-packer" : { + "yaourt" : "pacman" + }, + "nano" : { + "apt-get" : "nano", + "pacman" : "nano" + }, + "vim" : { + "apt-get" : "vim", + "pacman" : "vim", + "brew" : "vim", + "yum" : "vim" + }, + "zsh" : { + "pacman" : "zsh", + "apt-get" : "zsh" + }, + "git" : { + "pacman" : "git", + "apt-get" : "git-core" + }, + "unison" : { + "apt-get" : "unison", + "pacman" : "unison" + }, + "python" : { + "apt-get" : "python", + "pacman" : "python2" + }, + "python2" : { + "apt-get" : "python", + "pacman" : "python2" + }, + "python3" : { + "apt-get" : "python3", + "pacman" : "python" + }, + "tinc" : { + "apt-get" : "tinc", + "pacman" : "tinc" + }, + "python-notify" : { + "pacman" : "python-notify", + "apt-get" : "python-notify" + }, + "python-dbus" : { + "pacman" : "dbus-python", + "apt-get" : "python-dbus" + }, + "w3m" : { + "pacman" : "w3m", + "apt-get" : "w3m" + }, + "make" : { + "pacman" : "make", + "apt-get" : "make" + }, + "perl-xml-simple" : { + "apt-get" : "libxml-simple-perl", + "pacman" : "perl-xml-simple" + }, + "hostname" : { + "pacman" : "inetutils", + "apt-get" : "hostname" + }, + "pip" : { + "pacman" : "python-pip", + "apt-get" : "python-pip" + } +} diff --git a/.graveyard/punani/doc/releases b/.graveyard/punani/doc/releases new file mode 100644 index 00000000..98c4ea82 --- /dev/null +++ b/.graveyard/punani/doc/releases @@ -0,0 +1,38 @@ +# release files (guess the os distribution) +# from http://linuxmafia.com/faq/Admin/release-files.html +Annvix: /etc/annvix-release +Arch Linux: /etc/arch-release +Arklinux: /etc/arklinux-release +Aurox Linux: /etc/aurox-release +BlackCat: /etc/blackcat-release +Cobalt: /etc/cobalt-release +Conectiva: /etc/conectiva-release +Debian: /etc/debian_version, /etc/debian_release (rare) +Fedora Core: /etc/fedora-release +Gentoo Linux: /etc/gentoo-release +Immunix: /etc/immunix-release +Knoppix: knoppix_version +Linux-From-Scratch: /etc/lfs-release +Linux-PPC: /etc/linuxppc-release +Mandrake: /etc/mandrake-release +Mandriva/Mandrake Linux: /etc/mandriva-release, /etc/mandrake-release, /etc/mandakelinux-release +MkLinux: /etc/mklinux-release +Novell Linux Desktop: /etc/nld-release +PLD Linux: /etc/pld-release +Red Hat: /etc/redhat-release, /etc/redhat_version (rare) +Slackware: /etc/slackware-version, /etc/slackware-release (rare) +SME Server (Formerly E-Smith): /etc/e-smith-release +Solaris SPARC: /etc/release +Sun JDS: /etc/sun-release +SUSE Linux: /etc/SuSE-release, /etc/novell-release +SUSE Linux ES9: /etc/sles-release +Tiny Sofa: /etc/tinysofa-release +TurboLinux: /etc/turbolinux-release +Ubuntu Linux: /etc/lsb-release +UltraPenguin: /etc/ultrapenguin-release +UnitedLinux: /etc/UnitedLinux-release (covers SUSE SLES8) +VA-Linux/RH-VALE: /etc/va-release +Yellow Dog: /etc/yellowdog-release + +# own collection +Angstrom: /etc/angstrom-version diff --git a/.graveyard/punani/host/dist/arch/getsize b/.graveyard/punani/host/dist/arch/getsize new file mode 100755 index 00000000..a2ef8f95 --- /dev/null +++ b/.graveyard/punani/host/dist/arch/getsize @@ -0,0 +1,17 @@ +#! /bin/sh +set -euf +sed -n ' + /^Name/{ + s/^Name *: *\(.*\)$/\1/ + T + h + } + /^Installed Size/{ + s/^Installed Size *: *\(.*\)$/ \1/ + T + H + x + s/\n//g + p + } +' | awk '{print$2$3" "$1}' | sort -n diff --git a/.graveyard/punani/index.py b/.graveyard/punani/index.py new file mode 100755 index 00000000..ff483d37 --- /dev/null +++ b/.graveyard/punani/index.py @@ -0,0 +1,97 @@ +#!/usr/bin/python + +import web +import json +import os +import sys +from bot import * +urls = ( + '/', 'Index', + '/dump','Dump', +# '/reload','Reload', + '/(.+)/(.+)', 'ArchFinder', +) + + +PDB_FILE=os.path.dirname(os.path.abspath(sys.argv[0])) + "/db/punani" +PORT="9111" +CHANNEL="#retiolum" +f = open(PDB_FILE) +pdb = json.load(f) +f.close() +polite = os.environ.get("polite",False) +from socket import * + +def local_announce(msg): + s = socket(AF_INET,SOCK_STREAM) + s.connect(('localhost',5555)) + s.send(msg) + s.close() +class Index: + def GET(self): + ret = """Welcome to the Tightnani API
+Retrieve a package name for your distribution with: /PACKER/PKG""" + return ret + +class Reload: + def GET(self): + f = open(PDB_FILE) + pdb= json.load(f) + f.close() + return "DB reloaded" + + +class Dump: + def GET(self): + return json.dumps(pdb,sort_keys=True,indent=4) + +class ArchFinder: + def GET(self,request_packer,package): + if not request_packer or not package: web.BadRequest() + else: + packer = pdb['packer-symlinks'].get(request_packer,request_packer) #try to resolve similar packers + super_packer = pdb['super-packer'].get(packer,'') + ret = pdb.get(package,{}).get(packer,False) + ret = ret if ret else pdb.get(package,{}).get(super_packer,False) + + if not ret: + try: + if polite: + local_announce("Client `%s` asked for the tool `%s` in packer `%s` but i do not have it in my Database. Please update me!" %(web.ctx.ip, package,packer)) + else: + local_announce("404: no %s/%s for %s" % (request_packer,package,gethostbyaddr(web.ctx.ip)[0])) + except Exception,e: + print ("Got Exception %s: %s" % (str(Exception),(e))) + web.NotFound() + return "not found. i'm so sorry :(" + else: return ret + + + +if __name__ == "__main__": + import sys + # Set IRC connection parameters. + irc_servers = [('supernode.retiolum', 6667)] + irc_channels = [('#retiolum','')] + + # Prepare and start IRC bot. + bot = PunaniBot(irc_servers, irc_channels) + t = Thread(target=bot.start) + t.daemon = True + t.start() + announce = bot.say + + receiver = PunaniReceiveServer() + t = Thread(target=receiver.serve_forever) + t.daemon = True + t.start() + + t = Thread(target=process_queue,args=(announce,receiver.queue)) + t.daemon = True + t.start() + + + sys.argv.append(PORT) + app = web.application(urls,globals()) + app.internalerror = web.debugerror + app.run() -- cgit v1.2.3