All pastes #741111 Raw Edit

Untitled

public text v1 · immutable
·published 2007-10-18 13:54 UTC
rendered paste body
#!/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 = '<th>Datum</th><th>Trafik in</th><th>Trafik ut</th><th>Total trafik</th><tr><td>....-..-..</td><td>\d{1,4}\.?\d{0,2} [KMG]?B</td><td>\d{1,4}\.?\d{0,2} [KMG]?B</td><td>(\d{1,4}\.\d{2}|0) ([KMG]?B)</td></tr>'

[(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()