#!/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()