#!/usr/bin/python #coding: iso-8859-1 ################################################################################ ### Skript för att stänga av ens Bittorrent-klient innan SGS stryper linan ### ################################################################################ # gjort för att fungera på *nix-system och # # kontrollerar i grundutförandet programmet rtorrent # #Lägg skriptet i din crontab, jag kör det var femte minut, kör man det mer #sällan får man ha större säkerhetsmarginal för trafikgränsen, bara att räkna #lite på det själv. import sys import urllib import re import time import os import string import socket socket.setdefaulttimeout(60) def logga(text, trafik=''): """Skriver till loggfilen som är hårdkodad in i skriptet för tillfället. Returnerar None""" if trafik != '': text = text + ', trafik: ' + trafik try: loggfil = '/home/daniel/scriptlogg' fil = open(loggfil, 'a') fil.write(time.asctime() + ' - ' + text + '\n') fil.close except: print 'Loggningen fungerade inte. Har du ställt in rätt sökväg i skriptet?' def igang(): """Kollar om rtorrent är igång. Returnerar boolean""" psaux = os.popen('ps aux', 'r') for l in psaux.readlines(): if 'rtorrent' in l: return True return False def starta(text='Startade rtorrent'): """Sätter igång i det här fallet rtorrent genom Screen Returnerar None""" if not igang(): #Lite välbehövliga switchar till Screen: -fn gör att flow control stängs #av så att man kan använda C-s och C-q i rtorrent vilket behövs. -d -m #gör att Screen startar i detachat läge. os.spawnlp(os.P_NOWAIT, 'screen', '0', '-fn', '-d', '-m', 'rtorrent') logga(text) def stoppa(text='Stoppade rtorrent', trafik=''): """Dödar rtorrent med SIGINT vilket gör att det kontaktar trackern och avslutar snyggt. Returnerar None""" #Hade gått att göra med en psaux, pipea till grep och sen kolla vad som #returneras, men ska det vara Python så ska det! psaux = os.popen('ps aux', 'r') for l in psaux.readlines(): falt = string.split(l) if falt[10] == 'rtorrent': os.kill(int(falt[1]), 2) logga(text, trafik) ################################################### ###Funktioner har deklarerats, programmet börjar### ################################################### try: html = urllib.urlopen('http://web.sgsnet.se/tvbstats/ip.php').read() except: logga('Statistiken nere? (Eller har de bytt URL, de jäklarna..?)') sys.exit() regexp = '(Suspended)' #Träffar regexpet så ser vi den vackra avstängningssidan. Kan lika gärna stoppa #rtorrent, gör ingen nytta att det står och försöker ansluta. if re.compile(regexp).findall(html): if igang: stoppa('Avstängd') sys.exit() #Om klockan är innan två är det ingen risk att vi kommit över 15GB. Att det inte #ens testas beror på att SGS-statsen rapporterar trafiken som "SAKNAS" ett tag #efter midnatt vilket jäklas med de senare regexpen. Går att ändra om nån känner #att de inte vill låta sin dator löpa amok de första två timmarna av dygnet. if time.localtime()[3] < 2: starta() sys.exit() regexp = 'DatumTrafik inTrafik utTotal trafik....-..-..\d{1,4}\.?\d{0,2} [KMG]?B\d{1,4}\.?\d{0,2} [KMG]?B(\d{1,4}\.\d{2}|0) ([KMG]?B)' [(trafik, enhet)] = re.compile(regexp).findall(html) #Antal GB total trafik du vill att rtorrent ska stanna vid. Kan tas som argument #från kommandoraden i float- eller int-form, annars sätts det till det #hårdkodade värdet i except-blocket nedan. try: grans = float(sys.argv[1]) except (ValueError, IndexError): grans = 12 if float(trafik) >= grans and enhet == 'GB': stoppa( 'Stoppade rtorrent pga trafik', trafik+enhet) else: starta()