2019-06-30 15:03:26 +00:00
|
|
|
__filename__ = "cache.py"
|
|
|
|
__author__ = "Bob Mottram"
|
|
|
|
__license__ = "AGPL3+"
|
|
|
|
__version__ = "0.0.1"
|
|
|
|
__maintainer__ = "Bob Mottram"
|
|
|
|
__email__ = "bob@freedombone.net"
|
|
|
|
__status__ = "Production"
|
|
|
|
|
2019-08-20 09:16:03 +00:00
|
|
|
import os
|
2019-06-30 15:18:40 +00:00
|
|
|
import datetime
|
2019-08-20 09:16:03 +00:00
|
|
|
import commentjson
|
2019-06-30 15:18:40 +00:00
|
|
|
|
2019-08-20 09:16:03 +00:00
|
|
|
def storePersonInCache(baseDir: str,personUrl: str,personJson: {},personCache: {}) -> None:
|
2019-06-30 15:03:26 +00:00
|
|
|
"""Store an actor in the cache
|
|
|
|
"""
|
2019-06-30 15:18:40 +00:00
|
|
|
currTime=datetime.datetime.utcnow()
|
2019-07-06 17:00:22 +00:00
|
|
|
personCache[personUrl]={
|
|
|
|
"actor": personJson,
|
|
|
|
"timestamp": currTime.strftime("%Y-%m-%dT%H:%M:%SZ")
|
|
|
|
}
|
2019-08-20 09:16:03 +00:00
|
|
|
if not baseDir:
|
|
|
|
return
|
|
|
|
|
|
|
|
# store to file
|
|
|
|
cacheFilename=baseDir+'/cache/actors/'+personUrl.replace('/','#')+'.json'
|
|
|
|
if not os.path.isfile(cacheFilename):
|
|
|
|
with open(cacheFilename, 'w') as fp:
|
|
|
|
commentjson.dump(personJson, fp, indent=4, sort_keys=False)
|
2019-06-30 15:03:26 +00:00
|
|
|
|
2019-08-20 09:37:09 +00:00
|
|
|
def getPersonFromCache(baseDir: str,personUrl: str,personCache: {}) -> {}:
|
2019-06-30 15:03:26 +00:00
|
|
|
"""Get an actor from the cache
|
|
|
|
"""
|
2019-08-20 09:37:09 +00:00
|
|
|
# if the actor is not in memory then try to load it from file
|
2019-08-20 09:50:27 +00:00
|
|
|
loadedFromFile=False
|
2019-08-20 09:37:09 +00:00
|
|
|
if not personCache.get(personUrl):
|
|
|
|
cacheFilename=baseDir+'/cache/actors/'+personUrl.replace('/','#')+'.json'
|
|
|
|
if os.path.isfile(cacheFilename):
|
|
|
|
with open(cacheFilename, 'r') as fp:
|
|
|
|
personJson=commentjson.load(fp)
|
|
|
|
storePersonInCache(baseDir,personUrl,personJson,personCache)
|
2019-08-20 09:50:27 +00:00
|
|
|
loadedFromFile=True
|
2019-08-20 09:37:09 +00:00
|
|
|
|
2019-06-30 15:03:26 +00:00
|
|
|
if personCache.get(personUrl):
|
2019-08-20 09:50:27 +00:00
|
|
|
if not loadedFromFile:
|
|
|
|
# update the timestamp for the last time the actor was retrieved
|
|
|
|
currTime=datetime.datetime.utcnow()
|
|
|
|
personCache[personUrl]['timestamp']=currTime.strftime("%Y-%m-%dT%H:%M:%SZ")
|
2019-08-20 09:37:09 +00:00
|
|
|
return personCache[personUrl]['actor']
|
|
|
|
return None
|
|
|
|
|
|
|
|
def expirePersonCache(personCache: {}):
|
|
|
|
"""Expires old entries from the cache in memory
|
|
|
|
"""
|
|
|
|
currTime=datetime.datetime.utcnow()
|
|
|
|
removals=[]
|
|
|
|
for personUrl,cacheJson in personCache.items():
|
2019-07-06 17:00:22 +00:00
|
|
|
cacheTime= \
|
2019-08-20 09:37:09 +00:00
|
|
|
datetime.datetime.strptime(cacheJson['timestamp'], \
|
2019-07-06 17:00:22 +00:00
|
|
|
"%Y-%m-%dT%H:%M:%SZ")
|
2019-06-30 15:18:40 +00:00
|
|
|
daysSinceCached=(currTime - cacheTime).days
|
2019-08-20 09:37:09 +00:00
|
|
|
if daysSinceCached > 2:
|
|
|
|
removals.append(personUrl)
|
|
|
|
if len(removals)>0:
|
|
|
|
for personUrl in removals:
|
|
|
|
del personCache[personUrl]
|
|
|
|
print(str(len(removals))+' actors were expired from the cache')
|
|
|
|
|
2019-08-20 10:28:05 +00:00
|
|
|
def expireCache(baseDir: str,personCache: {}):
|
|
|
|
"""Cache expiry thread
|
|
|
|
"""
|
|
|
|
while True:
|
|
|
|
# once per day
|
|
|
|
time.sleep(60*60*24)
|
|
|
|
expirePersonCache(basedir,personCache)
|
|
|
|
|
2019-08-20 09:37:09 +00:00
|
|
|
def storeWebfingerInCache(handle: str,wf,cachedWebfingers: {}) -> None:
|
|
|
|
"""Store a webfinger endpoint in the cache
|
|
|
|
"""
|
|
|
|
cachedWebfingers[handle]=wf
|
2019-06-30 15:03:26 +00:00
|
|
|
|
2019-07-01 14:30:48 +00:00
|
|
|
def getWebfingerFromCache(handle: str,cachedWebfingers: {}) -> {}:
|
2019-06-30 15:03:26 +00:00
|
|
|
"""Get webfinger endpoint from the cache
|
|
|
|
"""
|
|
|
|
if cachedWebfingers.get(handle):
|
|
|
|
return cachedWebfingers[handle]
|
|
|
|
return None
|