New script for findmespot.com tracking devices
[ais.git] / bin / extras / spot.py
1 #!/usr/bin/env python
2 # -*- coding: utf-8 -*-
3
4 from __future__ import division
5 import sys
6 from ais.ntools import read_cfg
7 from ais.common import add_nmea1, AIS_STATUS_NOT_AVAILABLE, AIS_ROT_NOT_AVAILABLE, AIS_SOG_NOT_AVAILABLE, AIS_LATLON_SCALE, AIS_COG_NOT_AVAILABLE, AIS_NO_HEADING
8
9 SPOT_CONFIG_FILE = '/etc/ais/spot'
10 SPOT_TIMESTAMP_FILE = '/var/lib/ais/spot/timestamp'
11 SPOT_LOG_DIR = '/var/lib/ais/spot/'
12
13 def spot_xml_to_python(xmlstring):
14     '''
15     Takes an xml document fetched on
16     https://share.findmespot.com/messageService/guestlinkservlet
17     an convert it (returns) a list of dictionaries with the message content.
18     '''
19     import xml.etree.ElementTree
20     py_doc = []
21     tree = xml.etree.ElementTree.fromstring(xmlstring)
22     for msg in tree.findall('message'):
23         msg_dict = {}
24         for child in msg.getchildren():
25             msg_dict[child.tag] = child.text
26         py_doc.append(msg_dict)
27     return py_doc
28
29
30 __logfile__ = None
31 def getLogFile():
32     import os
33     from datetime import datetime
34     global __logfile__
35     if __logfile__ is None:
36         logfilename = os.path.join(SPOT_LOG_DIR, datetime.utcnow().strftime('%Y%m%d.log'))
37         __logfile__ = file(logfilename, 'a')
38     return __logfile__
39
40
41 cfg = read_cfg(SPOT_CONFIG_FILE)
42 xmlurl = cfg['url']
43
44 import urllib2
45 xmlsourcebytes = urllib2.urlopen(xmlurl).read()
46 xmlsource = unicode(xmlsourcebytes, 'UTF-8')
47
48
49 try:
50     timestampfile = open(SPOT_TIMESTAMP_FILE, 'r+b')
51     old_timestamp = long(timestampfile.read())
52 except IOError:
53     print >> sys.stderr, "Can't read old time stamp"
54     timestampfile = open(SPOT_TIMESTAMP_FILE, 'wb')
55     old_timestamp = 0L
56 max_timestamp = old_timestamp
57
58 for msg in spot_xml_to_python(xmlsource):
59     esn = msg.get('esn', None)
60     if esn is None:
61         print >> sys.stderr, 'No esn in message', msg
62         continue
63     strmmsi = cfg.get('esn_'+esn, None)
64     if strmmsi is None:
65         print >> sys.stderr, 'ens', ens, 'is not registered in', SPOT_CONFIG_FILE, msg
66     #print strmmsi, ':', msg
67     timestamp = long(msg['timeInGMTSecond'])
68     if timestamp > old_timestamp:
69         getLogFile().write(repr(msg)+'\n')
70         print 'New message:', msg
71         add_nmea1(strmmsi,
72             timestamp,
73             AIS_STATUS_NOT_AVAILABLE,
74             AIS_ROT_NOT_AVAILABLE,
75             AIS_SOG_NOT_AVAILABLE,
76             int(float(msg['latitude']) * AIS_LATLON_SCALE),
77             int(float(msg['longitude']) * AIS_LATLON_SCALE),
78             AIS_COG_NOT_AVAILABLE,
79             AIS_NO_HEADING,
80             'ST01',
81             )
82     if timestamp > max_timestamp:
83         max_timestamp = timestamp
84
85 timestampfile.seek(0)
86 timestampfile.write(str(max_timestamp))