postinstall for signing pkgs - noderepo requires myplc - using Provides: on the myplc...
[myplc.git] / plc-map.py
1 #!/usr/bin/env plcsh
2  
3 import Image, ImageDraw
4
5 ####### first - rustic - linear positioning on a map
6 def circle (image, percentX, percentY, radiusX, radiusY, colorIn, colorOut):
7
8     imageX, imageY = image.size
9     centerX = int(imageX*percentX)
10     centerY = int(imageY*percentY)
11     x = max (0, min (centerX,imageX))
12     y = max (0, min (centerY,imageY))
13
14     x1 = x - radiusX
15     x2 = x + radiusX
16     y1 = y - radiusY
17     y2 = y + radiusY
18
19     draw = ImageDraw.Draw (image)
20     draw.chord((x1,y1,x2,y2), 0, 360, fill=colorIn, outline=colorOut )
21     del draw
22
23 latitude={'top':65.,
24           'bottom': 35.5}
25 longitude={'left':-11.,
26            'right':58.}
27     
28 def render_site (site, image, sx, sy, cIn, cOut):
29     if site['longitude'] is not None and site['latitude'] is not None:
30         px=float(longitude['left']-site['longitude'])/float(longitude['left']-longitude['right'])
31         py=float(latitude['top']-site['latitude'])/float(latitude['top']-latitude['bottom'])
32         if (px<0 or py<0 or px>1 or py>1):
33             return
34         
35         circle(image,px,py,sx,sy,cIn,cOut)
36     
37 def make_image():
38     path = '/var/www/html/sites/'
39     original = path + 'map.png'
40     live = path + 'livemap.png'
41
42     # map characteristics, in degrees.
43     # latitude : positive is north
44     # longitude : positive is east 
45
46     # circle radius in pixels
47     sxLocal,syLocal=7,7
48     # circle in and out colors
49     cInLocal , cOutLocal = '#566b8a','#bbbbbb'
50
51     # same for federating / foreign sites
52     sxForeign,syForeign=6,6
53     cInForeign , cOutForeign = '#acb3a4', '#444444'
54  
55     image = Image.open(original)
56
57     for site in GetSites({'~peer_id':None,'enabled':True}):
58         render_site (site, image, sxForeign, syForeign, cInForeign , cOutForeign)
59     # local sites go last to be more visible
60     for site in GetSites({'peer_id':None,'enabled':True}):
61         render_site (site, image, sxLocal, syLocal, cInLocal , cOutLocal)
62         
63     image.save (live)
64
65 ########## second - way simpler - export sites as a list to javascript for rendering with googlemap
66 js_prelude="""
67 function Site (lat,lon,site_id,name,peer_id,peername,nb_nodes) {
68   this.lat=lat;
69   this.lon=lon;
70   this.site_id=site_id;
71   this.name=name;
72   this.peer_id=peer_id;
73   this.peername=peername;
74   this.nb_nodes=nb_nodes;
75 }
76 """
77
78 def locate_peer (peers,peer_id):
79     for peer in peers:
80         if peer['peer_id']==peer_id:
81             return peer
82     return {'peername':'Cannot locate peer'}
83
84 def js_site (site,peers):
85     # some sites come with lat or lon being None
86     lat = site['latitude']
87     if not lat:
88         lat=0
89     lon = site['longitude']
90     if not lon:
91         lon=0
92     # build javascript text
93     jstext="new Site("
94     jstext += str(lat) + "," + str(lon) + ","
95     jstext += str(site['site_id']) + ","
96     # needs html encoding for wierd chars
97     jstext += '"' + site['name'].encode("utf-8") + '"' + ','
98     if not site['peer_id']:
99         jstext += '0,""' +','
100     else:
101         peer=locate_peer(peers,site['peer_id'])
102         jstext += str(site['peer_id']) + ',"' + peer['peername'].encode("utf-8") + '"' + ','
103     jstext += str(len(site['node_ids']))
104     jstext += ')\n'
105     return jstext
106
107 def make_javascript():
108     outputname="/var/www/html/sites/plc-sites.js"
109     f=open(outputname,"w")
110     f.write(js_prelude)
111     columns=['latitude','longitude','site_id','name','peer_id','node_ids']
112     f.write("allSites=new Array(\n")
113     # writes foreign sites first
114     foreign_sites=GetSites({'~peer_id':None},columns)
115     peers=GetPeers({})
116     local_sites=GetSites({'peer_id':None},columns)
117     f.write(",".join([js_site(site,peers) for site in foreign_sites+local_sites]))
118     f.write(");")
119
120 def main ():
121     make_image ()
122     make_javascript ()
123
124 if __name__ == '__main__':
125     main ()