# import copy import os # import sys import glob from lxml import etree import subprocess from datetime import datetime import docing import filing from nitpo import Nitpo from surks import Surks from profile import Profile from xpaths import Xpaths class Maino(Nitpo): def __init__(self, do_verbose=False): """mail notifications from the web interface""" super().__init__() if not self.has_conf('folders', 'maino'): raise Exception('maino needs ะค[folders][maino]') self.folder = self.conf['folders']['maino'] self.profile = Profile() self.N = "{%s}" % self.const['ns'] self.surks = Surks() # self.profile = Profile() # self.event = {} self.xpaths = Xpaths() self.emad = None ## mtime of the profile fufi before changes self.mtime = None ## the maino documnet self.web_ele = None self.do_verbose = do_verbose def dump(self, ele, emad=None): """has to be called before the new profile is saved""" if emad is None: raise Exception("I don't handle a None emad (yet)") self.emad = emad self.web_ele = ele relfi = self.profile.relfi_from_emad(emad) profile_fufi = self.profile.fufi_from_emad(emad) self.mtime = self.add_mtime(profile_fufi) self.fidate = self.add_fidate() digest = self.add_digest() now = self.add_now() out_fufi = self.folder + '/' + relfi string = docing.show(self.web_ele) out_fufi = filing.write_verfi(out_fufi, string, self.folder, dig=digest) self.emad = None self.mtime = None self.web_ele = None return out_fufi def add_mtime(self, fufi): mtime_ele = self.xpaths.none_or_one(self.web_ele, '/*/n:mtime') if mtime_ele is None: mtime_ele = etree.SubElement(self.web_ele, self.N + 'mtime') mtime = filing.mtime(fufi) mtime_ele.text = mtime self.mtime = mtime return mtime def add_fidate(self): fidate_ele = self.xpaths.none_or_one(self.web_ele, '/*/n:fidate') if fidate_ele is None: fidate_ele = etree.SubElement(self.web_ele, self.N + 'fidate') profile_ele = self.xpaths.none_or_one(self.web_ele, '/n:web/n:profile[1]') fidate = self.surks.get_fidate(profile_ele) fidate_ele.text = fidate return fidate def add_digest(self): digest = filing.digest(self.emad + '_' + self.mtime) digest_ele = self.xpaths.none_or_one(self.web_ele, '/*/n:digest') if digest_ele is None: digest_ele = etree.SubElement(self.web_ele, self.N + 'digest') digest_ele.text = digest return digest def add_now(self): now_ele = self.xpaths.none_or_one(self.web_ele, '/*/n:now') if now_ele is None: now_ele = etree.SubElement(self.web_ele, self.N + 'now') now = self.now() now_ele.text = now return now def get_asar(self): """associative array of chaid and fufis, chaid given in URL""" glob_string = self.folder + '/??????????????????????' asar = {} links = glob.glob(glob_string) for link in links: fufi = self.folder + '/' + os.readlink(link) chaid = link[-22:] asar[chaid] = fufi return asar def read_timeset(self, web_ele): """get as atime to mainos mtime and mtime to fidate""" self.web_ele = web_ele tf = self.const['tf'] mtime_ele = self.xpaths.none_or_one(self.web_ele, '/*/n:mtime') mtime = int(datetime.strptime(mtime_ele.text, tf).strftime("%s")) fidate_ele = self.xpaths.none_or_one(self.web_ele, '/*/n:fidate') fidate = int(datetime.strptime(fidate_ele.text, tf).strftime("%s")) self.web_ele = None return (mtime, fidate) def clear(self, chaid): asar = self.get_asar() if chaid not in asar: return False fufi = asar[chaid] if os.path.isfile(fufi): subprocess.run(f"/bin/gzip {fufi}", shell=True) return True