diff options
18 files changed, 388 insertions, 5 deletions
| diff --git a/.gitmodules b/.gitmodules index 3b316b96..b59b012a 100644 --- a/.gitmodules +++ b/.gitmodules @@ -31,3 +31,6 @@  [submodule "web"]  	path = web  	url = https://github.com/krebscode/krebscode.github.com +[submodule "sites/paste.retiolum/bump"] +	path = sites/paste.retiolum/bump +	url = git@github.com:makefu/bump.git diff --git a/Reaktor/IRC/ircasy.py b/Reaktor/IRC/ircasy.py index ca607f2b..7821305f 100644 --- a/Reaktor/IRC/ircasy.py +++ b/Reaktor/IRC/ircasy.py @@ -21,7 +21,7 @@ class asybot(asychat):    def __init__(self, server, port, nickname, channels, realname=False, username=False, hostname=False, hammer_interval=10, alarm_timeout=300, kill_timeout=360, loglevel=logging.ERROR):      asychat.__init__(self)      #logger magic -    self.log = logging.getLogger('asybot') +    self.log = logging.getLogger('asybot_' + nickname)      hdlr = logging.handlers.SysLogHandler(facility=logging.handlers.SysLogHandler.LOG_DAEMON)      formatter = logging.Formatter( '%(filename)s: %(levelname)s: %(message)s')      hdlr.setFormatter(formatter) @@ -64,7 +64,10 @@ class asybot(asychat):      self.alarm_timeout = alarm_timeout      self.hammer_interval = hammer_interval      self.kill_timeout = kill_timeout -    signal(SIGALRM, lambda signum, frame: self.alarm_handler()) +    try: +      signal(SIGALRM, lambda signum, frame: self.alarm_handler()) +    except Exception as e: +      print('asybot: ' + str(e))      self.reset_alarm()    def reset_alarm(self): @@ -128,7 +131,8 @@ class asybot(asychat):      self.close()    def reconnect(self): -    self.push('QUIT') +    if self.connected: +      self.push('QUIT')      self.close()      self.create_socket(AF_INET, SOCK_STREAM)      self.connect((self.server, self.port)) diff --git a/news/ircasy.py b/news/ircasy.py new file mode 120000 index 00000000..68231591 --- /dev/null +++ b/news/ircasy.py @@ -0,0 +1 @@ +../Reaktor/IRC/ircasy.py
\ No newline at end of file diff --git a/news/newsbot.py b/news/newsbot.py new file mode 100644 index 00000000..5850e4e9 --- /dev/null +++ b/news/newsbot.py @@ -0,0 +1,239 @@ +from ircasy import asybot +import threading +from asyncore import loop +import logging +import os +import subprocess + +import feedparser +import math +import re +import subprocess +from datetime import datetime +from time import sleep +#testbot = NewsBot('ire', 6667, 'crabman23', ['#retiolum'], loglevel=logging.DEBUG) + + + +## Newsbot Controller Class +class NewsBot(asybot): +    def __init__(self, name, channels=['#test'], server='ire', port=6667, timeout=60, loglevel=logging.ERROR, url_shortener='http://wall'): +        asybot.__init__(self, server, port, name, channels, loglevel=loglevel) +        self.to = timeout +        self.url_shortener = url_shortener +        self.ctrl_chan = channels[0] + +    def send_msg(self, target, msg): +        for line in msg.split('\n'): +            self.PRIVMSG(target, line) + +    def on_privmsg(self, prefix, command, params, rest): +        args_array = rest.split() +        if params[0] == self.nickname: +            answer = self.read_message(args_array) +            self.send_msg(prefix.split('!')[0], answer) +        elif args_array[0].strip(':') == self.nickname: +            answer = self.read_message(args_array[1:]) +            self.send_msg([params[0]], answer) + +    def on_invite(self, prefix, command, params, rest): +        for chan in rest.split(): +            self.push('JOIN ' + chan) + +    def read_message(self, args): +        try: +            if args[0] in [x for x in commands.__dict__.keys() if x.find('_')]: +                func = getattr(commands, args[0]) +                return func(self, args) +            else: +                return 'command not found' +        except Exception as e: +            return 'mimimi: ' + str(e) + +#Commands of NewsBot +class commands(): +    def add(self, args):  +        if args[1] not in bots and args[1] != self.nickname: +            try: +                bot = RssBot(args[2], args[1], [self.ctrl_chan], url_shortener=self.url_shortener) +            except Exception as e: +                return 'add_mimi: ' + str(e) +                sleep +            bots[args[1]] = bot +            bot.start_rss() +            return "bot " + args[1] + " added" +        else: +            return args[1] + ' does already exist' + +    def delete(self, args): +        bots[args[1]].stop() +        del bots[args[1]] +        return "bot " + args[1] + " deleted" + +    def rename(self, args): +        if args[1] in bots: +            if args[2] in bots: +                return args[2] + ' already taken' +            else: +                bots[args[1]].connection.nick(args[2]) +                bots[args[1]].name = args[2] +                bots[args[2]] = bots[args[1]] +                del bots[args[1]] +                return 'renamed ' + args[1] + ' in ' + args[2] +        else: +            return args[1] + ' does not exist' + +    def save(self, args): +        output_buffer = '' +        for bot in bots: +            if bots[bot].loop: +                output_buffer += bot + '|' + bots[bot].url + '|' + ' '.join(bots[bot].channels) + '\n' + +        F = open(feedfile, "w") +        F.writelines(output_buffer) +        F.close() + +        return "bots saved to " + feedfile + +    def caps(self, args): +        return ' '.join([x for x in commands.__dict__.keys() if x.find('_')]) + +    def list(self, args): +        output_buffer = '' +        for bot in bots: +            output_buffer += bot + ' url: ' + bots[bot].url + '\n' +        return output_buffer + +    def info(self, args): +        if args[1] in bots: +            output_buffer = '' +            for data in ['title', 'link', 'updated']: +                if data in bots[args[1]].feed.feed: +                    output_buffer += data + ': ' + bots[args[1]].feed.feed[data] + '\n' +            output_buffer += 'lastnew: ' + bots[args[1]].lastnew.isoformat() + '\n' +            output_buffer += 'rssurl: ' + bots[args[1]].url +            return output_buffer +        else: +            return 'bot not found' + +    def search(self, args): +        output = subprocess.check_output(['./GfindFeeds4bot', args[1]]).decode() +        return output + +    def uptime(self, args): +        output = subprocess.check_output(['uptime']).decode() +        return output + + +##RssBot Class +class RssBot(asybot): +    def __init__(self, rss, name, chans=['#news'], url_shortener="http://localhost", server='ire', port=6667, timeout=60): +        try: +            asybot.__init__(self, server, port, name, chans) +        except Exception as e: +            print(e) +        self.url = rss +        self.to = timeout +        self.oldnews = [] +        self.loop = True +        self.lastnew = datetime.now() +        self.url_shortener = url_shortener + +    def start_rss(self): +        self.upd_loop = threading.Thread(target=self.updateloop) +        self.upd_loop.start() + +    def stop(self): +        self.disconnect() +        self.loop = False + +    def updateloop(self): +        failcount=0 +        while True: +          try: +              self.feed = feedparser.parse(self.url) +              for entry in self.feed.entries: +                  self.oldnews.append(entry.link) +              break +          except: +              print(self.nickname + ': rss timeout occured') +              failcount+=1 +              if failcount>20: +                  print(self.nickname + ' is broken, going to die') +                  self.stop() +                  return +        while self.loop: +            try: +                self.feed = feedparser.parse(self.url) +                for entry in self.feed.entries: +                    if not entry.link in self.oldnews: +                        #try: +                        #    self.send_msg(entry.title + " " + entry.link + " com: " + entry.comments) +                        #except AttributeError: +                        shorturl = self.shortenurl(entry.link) +                        self.sendall(entry.title + ' ' + shorturl) +                        self.oldnews.append(entry.link) +                        self.lastnew = datetime.now() +            except: +                print(self.nickname + ': rss timeout occured') +            sleep(self.to) + +    def shortenurl(self, url): +      while True: +          try: +              shorturl = subprocess.check_output(["curl", "-sS", "-F", "uri=" + url, self.url_shortener]).decode().strip('\n').strip('\r') + '#' + url.partition('://')[2].partition('/')[0] +              return shorturl +          except: +              print('url shortener error') +              sleep(1) + +    def last(self, target, num): +        for feed in [x for x in self.feed.entries][:num]: +            self.send_msg(target, feed.title + ' ' + self.shortenurl(feed.link)) + +    def sendall(self, string): +        self.send_msg(self.channels, string) + +    def send_msg(self, target, string): +        if self.connected: +            for line in string.split('\n'): +                if len(line) < 450: +                    self.PRIVMSG(target, line) +                else: +                    space = 0 +                    for x in range(math.ceil(len(line)/400)): +                        oldspace = space +                        space = line.find(" ", (x+1)*400, (x+1)*400+50) +                        self.PRIVMSG(target, line[oldspace:space]) +        else: +            self.reconnect() +            while not self.connected: +               sleep(3) +               print('waiting for reconnect') +            self.send_msg(string) + +    def on_invite(self, prefix, command, params, rest): +        for chan in rest.split(): +            self.push('JOIN ' + chan) + +feedfile = 'new_feeds' +url_shortener = 'http://wall' +init_channels = ['#news'] + +bots = {} +knews = NewsBot('knews') + +#config file reading +F = open(feedfile, "r") +lines = F.readlines() +F.close() + +for line in lines: +    line = line.strip('\n') +    linear = line.split('|') +    bot = RssBot(linear[1], linear[0], init_channels + linear[2].split(), url_shortener=url_shortener) +    bot.start_rss() +    bots[linear[0]] = bot + +th = threading.Thread(target=loop) +th.start() diff --git a/retiolum/hosts/paste b/retiolum/hosts/paste index b1c08801..99ee7d15 100644 --- a/retiolum/hosts/paste +++ b/retiolum/hosts/paste @@ -1,5 +1,3 @@ -Address = 192.40.56.122 -#Address = pigstarter.de  Subnet = 10.243.0.153  Subnet = 42:9143:b4c0:f981:6030:7aa2:8bc5:4110/128  -----BEGIN RSA PUBLIC KEY----- diff --git a/sites/buildbot.krebsco.de/INSTALLATION.md b/sites/buildbot.krebsco.de/INSTALLATION.md new file mode 100644 index 00000000..b31a3989 --- /dev/null +++ b/sites/buildbot.krebsco.de/INSTALLATION.md @@ -0,0 +1,17 @@ +#?/bin/sh +# something like this + +useradd ci +punani install python-virtualenv  +su ci +virtualenv buildbot +echo ". $HOME/buildbot/bin/activate" >~/.bashrc +pip install buildbot-slave buildbot +buildbot create-master master +# tahoe cp krebs:master.conf master/master.conf +buildbot reconf master +# or reconfigure as many slaves as you wish +buildslave create-slave slave localhost "ubuntu1204-local-slave" <PWD> +buildbot start master +buildslave start slave +# now make sure that docker is up and working diff --git a/sites/gold.krebsco.de/README.md b/sites/gold.krebsco.de/README.md new file mode 100644 index 00000000..6839631a --- /dev/null +++ b/sites/gold.krebsco.de/README.md @@ -0,0 +1,18 @@ +# gold +gold.krebsco.de is a simple file share which provides plugins for +firefox/chromium to rewrite referers. + +# Installation: +copy the nginx config at etc/nginx/sites-available, edit before use + +# Plugins +All krebsgold plugins are stored in /krebs/gold/affiliate/ +For installation follow the instruction at /krebs/gold/affiliate/README.md + +## Chromium +uses userscripts, a modified version of the fsf amazon userscript + +## Affiliatefox +Affiliatefox is a dodgy plugin by some weird german dudes at +http://www.the-angelz.net . it may be removed in the future as the chromium +userscript also works for firefox+greasemonkey diff --git a/sites/gold.krebsco.de/etc/nginx/sites-available/gold.krebsco.de b/sites/gold.krebsco.de/etc/nginx/sites-available/gold.krebsco.de new file mode 100644 index 00000000..1c565bbd --- /dev/null +++ b/sites/gold.krebsco.de/etc/nginx/sites-available/gold.krebsco.de @@ -0,0 +1,12 @@ +server { +  listen <external-ip>:80; +  server_name gold.krebsco.de; +  access_log /var/log/nginx/log/gold.krebsco.log main; +  default_type text/plain; +  autoindex on; +  location / { +    # path to //gold/affiliate/ ,may be a symlink or something +    root  /var/www/gold.krebsco.de; +  } +} + diff --git a/sites/graph.krebsco.de/nginx/sites-available/graph.conf b/sites/graph.krebsco.de/etc/nginx/sites-available/graph.conf index 1b74f53a..1b74f53a 100644 --- a/sites/graph.krebsco.de/nginx/sites-available/graph.conf +++ b/sites/graph.krebsco.de/etc/nginx/sites-available/graph.conf diff --git a/sites/graph.krebsco.de/nginx/sites-available/graph.krebsco.de.conf b/sites/graph.krebsco.de/etc/nginx/sites-available/graph.krebsco.de.conf index 0619908e..0619908e 100644 --- a/sites/graph.krebsco.de/nginx/sites-available/graph.krebsco.de.conf +++ b/sites/graph.krebsco.de/etc/nginx/sites-available/graph.krebsco.de.conf diff --git a/sites/paste.retiolum/README.md b/sites/paste.retiolum/README.md new file mode 100644 index 00000000..3c634f95 --- /dev/null +++ b/sites/paste.retiolum/README.md @@ -0,0 +1,31 @@ +# paste.retiolum + +paste is a minimalistic pastebin with sprunge.us in mind. +This paste may be a supplement to all the 'open' pastebins as the punching +lemma applies to this installation. +The installation always runs on a higher port (4000), to get a really short +hostname, the host which provides this service should have a short name as well +and have an nginx or apache which translates all request to hostname:80 to +localhost:4000. see Nginx Configuration. + +# Sources + +- https://github.com/makefu/bump + +# Installation + +## Environment + +    git clone https://github.com/makefu/bump +    useradd -a bump -m -d /opt/bump +    cd /opt/paste +    virtualenv . +    pip install -r deps.txt + +## Nginx + +see etc/nginx/ + +## Supervisor + +see etc/supervisor.d/ diff --git a/sites/paste.retiolum/bump b/sites/paste.retiolum/bump new file mode 160000 +Subproject 119d2723b510be392ca03d5bca7e1573e533f84 diff --git a/sites/paste.retiolum/etc/nginx/sites-available/paste.conf b/sites/paste.retiolum/etc/nginx/sites-available/paste.conf new file mode 100644 index 00000000..b83abf95 --- /dev/null +++ b/sites/paste.retiolum/etc/nginx/sites-available/paste.conf @@ -0,0 +1,14 @@ +server { +	listen <internal-ip>:80; +	server_name paste paste.retiolum; +	access_log /var/log/nginx/log/paste.log main; +	error_log /var/log/nginx/log/paste_error.log; +	default_type text/plain; +	location / { +    proxy_pass http://127.0.0.1:4000/; +    proxy_redirect off; +    proxy_set_header Host $host; +    proxy_set_header X-Real-IP $remote_addr; +    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; +	} +} diff --git a/sites/paste.retiolum/etc/supervisor.d/bump.supervisor.conf b/sites/paste.retiolum/etc/supervisor.d/bump.supervisor.conf new file mode 100644 index 00000000..6b83d5f2 --- /dev/null +++ b/sites/paste.retiolum/etc/supervisor.d/bump.supervisor.conf @@ -0,0 +1,5 @@ +[program:bump] +command=sh run.sh +user=bump +directory=/opt/bump +autorestart=true diff --git a/sites/tahoe.retiolum/README.md b/sites/tahoe.retiolum/README.md new file mode 100644 index 00000000..01e8ed03 --- /dev/null +++ b/sites/tahoe.retiolum/README.md @@ -0,0 +1,16 @@ +# Tahoe in Retiolum +For all the secret stuff, krebsco is using a tahoe installation with 1 +introducer and a number of tahoe bricks.  + +# Adding new bricks & clients +see //cholerab/tahoe/{brick,client}\_installation + +# Replacing the introducer +if the introducer may die off, all crypto material is saved in  +krebs:tahoe/introducer. There will be a backup somewhere, but bootstrapping +always sucks. + +Follow the generic brick installation, +use the configuration file at conf/tahoe.cfg and copy the crypto material in +the private folder of the installation.  +autostart that shit diff --git a/sites/tahoe.retiolum/conf/tahoe.cfg b/sites/tahoe.retiolum/conf/tahoe.cfg new file mode 100644 index 00000000..f70a94da --- /dev/null +++ b/sites/tahoe.retiolum/conf/tahoe.cfg @@ -0,0 +1,4 @@ +[node] +nickname = intro +web.port =  +web.static = public_html diff --git a/sites/tinc.krebsco.de/README.md b/sites/tinc.krebsco.de/README.md new file mode 100644 index 00000000..3d3d2faa --- /dev/null +++ b/sites/tinc.krebsco.de/README.md @@ -0,0 +1,11 @@ +# tinc.krebsco.de +tinc.krebsco.de is a curl | sh tinc bootstrapper. For more information see +//retiolum/scripts/tinc_setup/README. + +The nginx is pointed to the folder //boot in painload. + +In order to avoid adding an addition file name a special nginx configuration +based on the try_files directive.  + +# Installation +See etc/nginx/sites-available/tinc.krebsco.de.conf diff --git a/sites/tinc.krebsco.de/etc/nginx/sites-available/tinc.krebsco.de.conf b/sites/tinc.krebsco.de/etc/nginx/sites-available/tinc.krebsco.de.conf new file mode 100644 index 00000000..15749985 --- /dev/null +++ b/sites/tinc.krebsco.de/etc/nginx/sites-available/tinc.krebsco.de.conf @@ -0,0 +1,10 @@ +server { +        listen <external-ip>:80; +        server_name tinc.krebsco.de; +        access_log /var/log/nginx/log/boot.krebsco.log main; +        default_type text/plain; +        # this path should be //boot +        root    /var/www/boot.krebsco.de; +        try_files $uri $uri/retiolum.sh ; +} + | 
