import datetime import email.parser import email.utils import os import base64 import hashlib # import mailbox # import re # import sys # import time # import random # import docing from lxml import etree from lxml.builder import ElementMaker import filing # import dating from emailer import Emailer from nitpo import Nitpo from nixer import Nixer from profile import Profile # from kapro import Kapro # from reports import Reports from xpaths import Xpaths import subprocess class Pupro(Nitpo): def __init__(self, do_verbose=False): """find data about """ super().__init__() self.do_verbose = do_verbose self.profile = Profile(do_verbose=do_verbose) self.nixer = Nixer(do_verbose=do_verbose) self.xpaths = Xpaths() self.emailer = Emailer(do_verbose=do_verbose) self.check_conf('folders', 'profile') self.check_conf('folders', 'pupro') self.check_conf('salt', 'profile') # self.live_dir = self.parser = etree.XMLParser(remove_blank_text=True) self.N = "{%s}" % self.const['ns'] self.E = ElementMaker(nsmap={None: self.const['ns']}) #mbox_fufi = self.conf['files']['bouncebox'] #rfc = r'[Rr][Ff][Cc]822; *([^\n ]+)' self.docs = {} return None def build_records(self): """do all profiles""" for root, dirs, banas in os.walk(self.conf['folders']['profile']): for bana in banas: if bana == 'omnibus.xml': continue if not bana.endswith(".xml"): continue fufi = root + '/' + bana bounce_fufi = self.nixer.bounce_from_profile_fufi(fufi) if os.path.isfile(bounce_fufi): if self.do_verbose: print(f"pupro sees {bounce_fufi}") continue doc = filing.parse_lax(fufi, parser=self.parser) if doc is None: continue self.make_record(doc) # self.dump_all() for headlet in self.docs: self.make_live_file(headlet) def make_live_file(self, headlet): # profiles_ele = etree.Element(self.N + 'profiles') profiles_ele = self.E(self.N + 'profiles') for handle in sorted(self.docs[headlet]): profiles_ele.append(self.docs[headlet][handle]) out_fudi = self.conf['folders']['pupro'] out_fufi = out_fudi + '/' + headlet + '.xml' profiles_doc = etree.ElementTree(profiles_ele) filing.install_xml(profiles_ele, out_fufi) # print(docing.show(profiles_ele)) #quit() def make_record(self, doc): docs = self.docs profile_ele = doc.getroot() emad = profile_ele.attrib['emad'] emad_salted = self.conf['salt']['profile'].encode() + emad.encode() emad_dig = hashlib.md5(emad_salted).digest() encmad = base64.urlsafe_b64encode(emad_dig).decode()[:-2] ## head letter headlet = self.first_part(encmad) profile_ele.attrib['emad'] = encmad ## remove handles on surks xp = '//n:surk' surk_eles = self.xpaths.all(profile_ele, xp) for surk_ele in surk_eles: if 'id' in surk_ele.attrib: del(surk_ele.attrib['id']) ## spro v is the default if 'spro' in surk_ele.attrib: if surk_ele.attrib['spro'] == 'v': del(surk_ele.attrib['spro']) ## remove name element xp = '//n:surk/*' subsurk_eles = self.xpaths.all(profile_ele, xp) for subsurk_ele in subsurk_eles: subsurk_ele.getparent().remove(subsurk_ele) if headlet not in docs: docs[headlet] = {} docs[headlet][encmad] = profile_ele self.docs = docs return docs def first_part(self, string): """take first char, but avoid - and _""" for char in string: if char == '-' or char == '_': continue return char return char