| Index: foo/server.py
|
| diff --git a/foo/server.py b/foo/server.py
|
| deleted file mode 100644
|
| index 1fcfc1dc0c973e576ca52eea20f82f2a65fe8534..0000000000000000000000000000000000000000
|
| --- a/foo/server.py
|
| +++ /dev/null
|
| @@ -1,187 +0,0 @@
|
| -import argparse
|
| -import collections
|
| -import cherrypy
|
| -import json
|
| -import os
|
| -import time
|
| -
|
| -genDelta = [
|
| - 0,
|
| - 10,
|
| - 100,
|
| - 1000,
|
| -]
|
| -
|
| -genCount = 4
|
| -maxGenLength = 5
|
| -
|
| -def cleanGeneration(gen, delta):
|
| - for i in range(len(gen) - 1):
|
| - if gen[i + 1]['time'] - gen[i]['time'] < delta:
|
| - e = gen.pop(i + 1)
|
| - os.remove(e['path'])
|
| - return None
|
| - return gen.pop(0)
|
| -
|
| -
|
| -def cleanUpArchives(archives):
|
| - for i, gen in enumerate(archives):
|
| - if len(gen) > maxGenLength:
|
| - e = cleanGeneration(gen, genDelta[i])
|
| - if e:
|
| - if i + 1 < len(archives):
|
| - archives[i + 1].append(e)
|
| -
|
| -def printArchives(archives):
|
| - print '******'
|
| - for i in archives:
|
| - for e in i:
|
| - print e['time']
|
| - print ' -- '
|
| -
|
| -archiveIdx = 0
|
| -def saveData(service):
|
| - global archiveIdx
|
| - archives = service.getArchives()
|
| - lastGeneration = archives[0]
|
| - lastSavedUpdate = -1
|
| - if len(lastGeneration) > 0:
|
| - lastSavedUpdate = lastGeneration[-1]['lastId']
|
| - lastUpdate = service.getLastUpdateId()
|
| - hasChanges = lastSavedUpdate < lastUpdate
|
| -
|
| - if not hasChanges:
|
| - return
|
| -
|
| - timeFormat = '%Y-%m-%e-%H:%M:%S'
|
| - currentTime = time.time()
|
| - path = os.path.join(service.getArchivePath(), 'archive-%s.json' % time.strftime(timeFormat))
|
| - with open(path, 'w') as outfile:
|
| - json.dump(service.getData(), outfile)
|
| - lastGeneration.append({
|
| - 'lastId': lastUpdate,
|
| - 'path': path,
|
| - 'time': archiveIdx,
|
| - 'realtime': currentTime,
|
| - })
|
| - archiveIdx += 1
|
| -
|
| - cleanUpArchives(service.getArchives())
|
| -
|
| -class Service(object):
|
| - exposed = True
|
| -
|
| - def __init__(self, data_dir):
|
| - self.data = None
|
| - self.updates = collections.deque(maxlen=500)
|
| - self.nextUpdateId = 0
|
| - self.idxMap = None
|
| - self.archive_path = os.path.join(data_dir, 'archive')
|
| - if not os.path.exists(self.archive_path):
|
| - os.makedirs(self.archive_path)
|
| - with open(os.path.join(data_dir, 'index')) as inf:
|
| - self.data = json.load(inf)
|
| - self.initIdxMap()
|
| -
|
| - self.archives = []
|
| - for i in range(genCount):
|
| - self.archives.append([])
|
| -
|
| - self.saver = cherrypy.process.plugins.BackgroundTask(2.0 * 60, saveData, [self])
|
| - self.saver.start()
|
| -
|
| - def initIdxMap(self):
|
| - self.idxMap = dict()
|
| - for i, entry in enumerate(self.data):
|
| - self.idxMap[entry['url']] = i
|
| -
|
| - def getArchivePath(self):
|
| - return self.archive_path
|
| -
|
| - def getArchives(self):
|
| - return self.archives
|
| -
|
| - def getData(self):
|
| - return self.data
|
| -
|
| - def getDataResponse(self):
|
| - return {
|
| - 'data': self.data,
|
| - 'nextId': self.nextUpdateId,
|
| - }
|
| -
|
| - def appendUpdate(self, entry, idx):
|
| - self.updates.append({'index': idx, 'id': self.nextUpdateId, 'entry': entry})
|
| - self.nextUpdateId += 1
|
| -
|
| - def update(self, entry):
|
| - key = entry['url']
|
| - idx = self.idxMap[key]
|
| - self.data[idx] = entry
|
| - self.appendUpdate(entry, idx)
|
| - return 'sdf'
|
| -
|
| - @cherrypy.expose
|
| - def getupdates(self, nextId):
|
| - data = None
|
| - updates = None
|
| - nextId = int(nextId)
|
| - newNextId = nextId
|
| -
|
| - if len(self.updates) > 0:
|
| - lastId = self.updates[-1]['id']
|
| - firstId = self.updates[0]['id']
|
| - if firstId > nextId:
|
| - data = self.data
|
| - elif lastId >= nextId:
|
| - updates = list(self.updates)[nextId - firstId:]
|
| - newNextId = lastId + 1
|
| - return json.dumps({'response': {
|
| - 'data': data,
|
| - 'updates': updates,
|
| - 'nextId': newNextId,
|
| - }})
|
| -
|
| -
|
| - @cherrypy.expose
|
| - def message(self):
|
| - cl = cherrypy.request.headers['Content-Length']
|
| - rawbody = cherrypy.request.body.read(int(cl))
|
| - request = json.loads(rawbody)
|
| - action = request['action']
|
| - response = None
|
| - if action == 'getData':
|
| - response = self.getDataResponse()
|
| - if action == 'update':
|
| - response = self.update(request['data'])
|
| - return json.dumps({'response': response})
|
| -
|
| - def getLastUpdateId(self):
|
| - return self.nextUpdateId - 1
|
| -
|
| -
|
| -
|
| -if __name__ == '__main__':
|
| - parser = argparse.ArgumentParser()
|
| - parser.add_argument('--data-dir')
|
| - options = parser.parse_args()
|
| - service = Service(options.data_dir)
|
| - conf = {
|
| - 'global': {
|
| - 'server.socket_host': '0.0.0.0',
|
| - 'server.socket_port': 8081,
|
| - },
|
| - '/': {
|
| - 'tools.response_headers.on': True,
|
| - 'tools.response_headers.headers': [('Content-Type', 'text/plain')],
|
| - },
|
| - '/foo': {
|
| - 'tools.staticdir.on': True,
|
| - 'tools.staticdir.dir': '/usr/local/google/code/dom_distiller/foo',
|
| - },
|
| - '/images': {
|
| - 'tools.staticdir.on': True,
|
| - 'tools.staticdir.dir': os.path.join(os.getcwd(), options.data_dir),
|
| - }
|
| - }
|
| - cherrypy.quickstart(service, '/', conf)
|
|
|