nouzove pouzitelna verze
[krypto.git] / robot.py
1 #!/usr/bin/env python
2
3 """Mailove rozhrani pro sadu kryptoanalytickych nastroju."""
4
5 import os
6 import sys
7 import re
8 import smtplib
9 import email
10 from email.mime.text import MIMEText
11 from time import asctime
12 import pickle
13
14 from ocesavac import ocesat
15 from spolecne import ABECEDA
16
17 class settings:
18     pass
19
20 settings = pickle.load(open('./robot_settings'))
21 os.chdir(settings.path)
22
23 def posli_mail(komu, predmet, text, loguj=None):
24     msg = MIMEText(text)
25     msg['Subject'] = predmet
26     msg['From'] = settings.name + " <" + settings.mail  + ">"
27     msg['To'] = komu
28     smtplib.SMTP('localhost').sendmail(settings.mail, komu, msg.as_string())
29     if loguj:
30         soubor = open(loguj, 'w')
31         soubor.write(msg.as_string())
32         soubor.close()
33
34 # Cteni mailu
35 mail = email.message_from_file(sys.stdin)
36 predmet, _, opsny = mail['Subject'].strip().upper().partition(' ')
37 odesilatel = mail['From']
38 if predmet != settings.subject:
39     sys.exit()
40
41 if opsny == 'H':
42     posli_mail(odesilatel, "Napoveda", ''.join("Napoveda:\n"
43                "Prikazy robotovi vkladejte do predmetu zpravy "
44                "zaslane na adresu ", 
45                settings.mail, ".\nNa velikosti pismen nezalezi."
46                "\n\nSeznam prikazu:\n"
47                "\"", settings.subject, "\"   Analyza zpravy z tela mailu.\n" 
48                "\"", settings.subject, " X\" Vynuti analyzu bez mezer.\n"
49                "\"", settings.subject, " M\" Vynuti analyzu s mezerami.\n"
50                "\"", settings.subject, " B\" Vypise cetnost vsech bigramu.\n"
51                "\"", settings.subject, " P\" Vypise vsechny posunuti textu.\n"
52                "\"", settings.subject, " A\" Vypise uplne vsechno co dava "
53                "alespon trochu smysl (nedoporucuji).\n"
54                "\"", settings.subject, " H\" Tato napoveda.\n"
55                "\nVolby (mimo \"H\") je mozno libovolne kombinovat.\n"
56                "Napriklad \"", settings.subject, " LXB\" analyzuje posledni "
57                "prijatou zpravu s vynucenim analyzy bez mezer a navic vypise "
58                "cetnosti bigramu.\n"
59                "\nS pozdravem\nVas Robot\n"))
60     sys.exit()
61
62 if 'L' in opsny:
63     mail = pickle.load(open('./msg_last.tmp'))
64     m1 = re.match(r".*\<(.*)\>.*", mail['From'])
65     m2 = re.match(r".*\<(.*)\>.*", odesilatel)
66     if m1:
67         f1 = m1.group(1)
68     else:
69         f1 = mail['From']
70     if m2:
71         f2 = m2.group(1)
72     else:
73         f2 = odesilatel
74     if (f1 != f2):
75         posli_mail(odesilatel, "Omluva", "Omlouvam se,"
76                    " ale Vase zprava uz bohuzel neni na serveru ulozena.\n")
77         sys.exit()
78
79 if mail.is_multipart():
80     telo = mail.get_payload(0).get_payload().strip()
81 else:
82     telo = mail.get_payload().strip()
83
84 if len(ocesat(telo, False)) < 2:
85     posli_mail(odesilatel, "Omluva", "Omlouvam se,"
86                    " ale Vase zprava je prilis kratka.\n")
87     sys.exit()
88 zprava = telo.upper()
89
90 # TODO zpracovat zpravu a odeslat vysledek
91 #pridat "\nS pozdravem\nVas Robot"
92
93 posli_mail(odesilatel,
94            "Analyza Vasi zpravy",
95            "\n".join(analyza),
96            './robot_last.tmp')
97
98 f = open('./msg_last.tmp', 'w')
99 pickle.dump(mail, f)
100 f.close()
101
102 f = open('./robot.log', 'a')
103 m = re.match(r".*\<(.*)\>.*", odesilatel)
104 if m:
105     odesilatel2 = m.group(1)
106 else:
107     odesilatel2 = odesilatel
108 f.write(asctime() + " " +  odesilatel2 + " " + opsny + "\n")
109 f.close()