1798ae7ad665515de27a3f23029a9bcc90f618e8
[ussd-widget] / ussd-common / src / usr / bin / ussdquery.py
1 #!/usr/bin/python
2 # -*- coding: utf-8 -*-
3 ## This program is free software; you can redistribute it and/or modify
4 ## it under the terms of the GNU General Public License as published
5 ## by the Free Software Foundation; version 2 and higer.
6 ##
7 ## Guseynov Alexey (kibergus bark-bark gmail.com) 2010
8
9 import pexpect
10 import time
11 from subprocess import *
12 import sys
13 import gsmdecode
14 import re
15 import fcntl
16
17 if len(sys.argv) != 2 and len(sys.argv) != 3:
18     print "Usage: ussdquery.py <ussd number> [<language>]\nAllowed languages: German, English, Italian, French, Spanish, Dutch, Swedish, Danish, Portuguese, Finnish, Norwegian, Greek, Turkish, Reserved1, Reserved2, Unspecified"
19     sys.exit()
20
21 language = 15
22 if len(sys.argv) == 3:
23         if sys.argv[2] == "German":
24                 language = 0
25         elif sys.argv[2] == "English":
26                 language = 1
27         elif sys.argv[2] == "Italian":
28                 language = 2
29         elif sys.argv[2] == "French":
30                 language = 3
31         elif sys.argv[2] == "Spanish":
32                 language = 4
33         elif sys.argv[2] == "Dutch":
34                 language = 5
35         elif sys.argv[2] == "Swedish":
36                 language = 6
37         elif sys.argv[2] == "Danish":
38                 language = 7
39         elif sys.argv[2] == "Portuguese":
40                 language = 8
41         elif sys.argv[2] == "Finnish":
42                 language = 9
43         elif sys.argv[2] == "Norwegian":
44                 language = 10
45         elif sys.argv[2] == "Greek":
46                 language = 11
47         elif sys.argv[2] == "Turkish":
48                 language = 12
49         elif sys.argv[2] == "Reserved1":
50                 language = 13
51         elif sys.argv[2] == "Reserved2":
52                 language = 14
53         elif sys.argv[2] == "Unspecified":
54                 language = 15
55         else:
56                 print >> sys.stderr, "Language unknown, falling back to unspecified."
57
58 # We have only one modem, simultaneous acces wouldn't bring anything good
59 lockf = open("/tmp/ussdquery.lock", 'a')
60 fcntl.flock(lockf,fcntl.LOCK_EX)
61
62 # Operations should timeout in 30 seconds.
63 # I'm not shure, that readline uses timeouts
64 child = None
65 response = ""
66 retry = 5
67 while response != "OK" and retry > 0 :
68         if child == None :
69                 # OK response should be recieved shortly
70                 child = pexpect.spawn('pnatd', [], 2)
71         try :
72                 child.send('at\r');
73                 # Read our "at" command
74                 child.readline();
75                 # Read OK response
76                 response = child.readline().strip()
77         except pexpect.TIMEOUT:
78                 child.kill(9)
79                 child = None
80                 response = ""
81         if response != "OK" :
82                 time.sleep(0.5)
83                 retry -= 1
84
85 if response != "OK" :
86         print >> sys.stderr, "Couldn't init modem."
87         if child != None:
88                 child.kill(9)
89         fcntl.flock(lockf,fcntl.LOCK_UN)
90         lockf.close()
91         sys.exit (-1)
92
93 child.timeout = 30
94
95 try :
96         child.send('at+cusd=1,"'+(sys.argv[1])+'",'+str(language)+'\r')
97         # Read our query echoed back
98         child.readline()
99
100         #Read and parse reply
101         replystring = child.readline().decode('string_escape')
102 except pexpect.TIMEOUT:
103         print >> sys.stderr, "Timeout. Modem didn't reply."
104         child.kill(9)
105         fcntl.flock(lockf,fcntl.LOCK_UN)
106         lockf.close()
107         sys.exit (-2)
108
109 child.sendeof()
110 fcntl.flock(lockf,fcntl.LOCK_UN)
111 lockf.close()
112
113 #replystring = "+CUSD: 0,\"OCTATOK 165.65 p.\n 3BOHu 333! HOBbIu PA3DEL: ХuT-nAPAD MY3bIKu (3p. MuHYTA)\",1"
114
115 if replystring.strip() == "ERROR" :
116         print >> sys.stderr, "Modem returned ERROR. Query not executed."
117         sys.exit (-3)
118
119 try:
120         reresult = re.match("(?s)^\\+CUSD: \\d+,\"(.*)\",(\\d+)$", replystring.strip())
121         reply = reresult.group(1)
122         encoding = reresult.group(2)
123 except:
124         print >> sys.stderr, "Couldn't parse modem answer."
125         sys.exit (-4)
126
127 # Decoding ansver
128 reply = gsmdecode.decode(reply, int(encoding))
129
130 print reply
131