es3 fájl kibontása automatikusan

Fórumok

Sziasztok,

es3 (Microsec-es) kiterjesztésű fájlokat szeretnék automatikusan kibontani Centos alatt.

Van esetleg erre egy kipróbált megoldás?

 

Köszönöm

Hozzászólások

Szerintem írj rá Python script-et.

Amelyet egy shell script indít, amiben AWK-val keresel az es3-ban, az eredményt Perl-lel csócsálod a Pythonnak való átadás előtt, amely Python visszaadott eredményét egy PHP-script hozza megfelelő formára.

Esetleg kis JS még befigyelhetne.

Mit jelent a "kibontas" egy tomoritetlen XML eseten? A benne levo, base64 encode-olt dolgokat szeretned kulon-kulon file-ba tenni, es valamivel feldolgozni?

A mar emlitett python nem eleg? (van xml-hez, file-hoz, meg base64-hez is modul)

When you tear out a man's tongue, you are not proving him a liar, you're only telling the world that you fear what he might say. -George R.R. Martin

Pontosan amit leírtál. Elvileg több fájl is lehet az es3-ban és azokat szeretnénk kicsomagolva látni és használni. Mindezt a háttérben, nem az e-signos programmal.

 

Így néz ki az eleje:

<es:Format>
    <es:MIME-Type type="application" subtype="pdf" extension="pdf"/>
    </es:Format>
    <es:SourceSize sizeValue="8243" sizeUnit="B"/>
    <es:BaseTransform>
    <es:Transform Algorithm="zip"/>
    <es:Transform Algorithm="base64"/> 

from lxml import etree
import base64

x=etree.parse('/media/12T/nyos/3trol/ment/es3ak/vegzes.es3')
nss={'es':'https://www.microsec.hu/ds/e-szigno30#','ds':'http://www.w3.org/2000/09/xmldsig#'}
#docs=x.xpath('//es:Documents/es:Document[es:DocumentProfile]',namespaces=nss)
b64=base64.decodestring(x.xpath('//ds:Object',namespaces=nss)[3].text.encode('utf-8'))
with open('/tmp/test.zip','wb') as f:
  f.write(b64)

Kerestem egy es3-at a gepemen, inditottam egy python3 interpretert (interaktiv modban), aztan elkezdtem vele jatszani.

Eloszor tisztessegesen elkezdtem bejarni a DOM-ot, ugyanis van egy es:Documents tag, azon belul vannak a es:Document tag-ek, es annak vannak mindenfele node-jai (es:Title, meg amiket irtal, es:Format, stb..), es ami a lenyeg: a ds:Object, amiben maga a base64 enkodolt adat van.

Aztan nem akartam bonyolitani, es inkabb kivalasztottam az egyik objectet, base64 decode-oltam, es kiirtam file-ba a tartalmat. Ez egy zip, amit kibontva kaptam egy nagyon ronda nevu (A l├йtes├нt┼С okirat - v├бltoz├бsokkal egybefoglalt - hat├бlyos├нtott sz├╢vege.pdf) PDF-et. Utobbi a zipfile modullal is kibonthato, de ezzel mar nem akarok tokolni.

Az xpath fuggveny a fenti kodban amugy egy listat ad meg, amin forral vegig lehet menni ugye.. szoval nem egy varazslat mindent kinyerni a file-bol. es:MIME-Type alapjan el lehetne agazni, es es:Transform alapjan meg lehet hivni a zipes kibontast is. Alapvetoen kb. ennyi xml-t kezelni (ezt persze kb. minden modern nyelv tudja, szoval ha a C#/PHP/akarmi jobban tetszik, akkor hajra azzal).

When you tear out a man's tongue, you are not proving him a liar, you're only telling the world that you fear what he might say. -George R.R. Martin

Szerkesztve: 2020. 11. 23., h – 19:09
#!/usr/bin/env python
import xml.etree.ElementTree as ET
import base64
import sys
import os

if ((len(sys.argv) == 1) or (len(sys.argv) > 2)):
    print("Provide one es3 file as input please")
    exit(1)

inputfilename=sys.argv[1]
tree = ET.parse(inputfilename)
root = tree.getroot()
ns={'es':'https://www.microsec.hu/ds/e-szigno30#','ds':'http://www.w3.org/2000/09/xmldsig#'}

for documents in root.findall('es:Documents', ns):
    for document in documents.findall('es:Document',ns):
        filename = document.find('es:DocumentProfile', ns).find('es:Title', ns).text
        b64=base64.decodebytes(document.find('ds:Object',ns).text.encode('utf-8'))
        if not os.path.exists(filename):
            with open(filename, 'wb') as f:
                print(filename)
                f.write(b64)
        else:
            print(filename+' already exists.')