Da objavim konačan rezultat ukoliko nekome bude trebalo ili barem za ideju drugima.
Kao što sam napisao, htio sam to riješiti na Synology NAS-u, pošto on radi 24/7, a i skladište mi je podataka. Nisam dizao nikakve virtualke, a koristio sam
bash i
nodejs + xml-js.
Nodejs sam koristio iz razloga što već imam nekog iskustva s nodejs pa mi je bilo lakše, ali ima i PHP / Perl xml parsera. Nemam neki poseban razlog za Node modul xml-js, probao sam prvo neki drugi, ali nije radio ispravno, dok ovaj radi.
Bash skripta koja se pokreće preko cronjob-a, s komentarima
Code:
#!/bin/bash
#povlači xml sa Sabredav servera i sprema u datoteku
curl -X PROPFIND -u username:password -H "Content-Type: text/xml" -H "Depth: 1" --data "<propfind xmlns='DAV:'><prop><address-data xmlns='urn:ietf:params:xml:ns:carddav'/></prop></propfind>" URL_DO_ADRESARA -o result.xml
sleep 10s
node parse_xml.js
sleep 15s
#dohvaća današnji datum u obliku YYYY-MM-DD
Full=`date -I`
#uklanja nepotrebnu xml datoteku
rm result.xml
#briše prazne retke, sprema u temp datoteku i onda premješta preko originalne datoteke
grep . result.vcf > result.temp
mv result.temp result.vcf
#synology stvar, nije mi vidljiva datoteka na ne-admin korisniku ukoliko ovo ne napravim, vjerojatno može i manje dopuštenja, ali ne da mi se isprobavati
chmod 777 result.vcf
#premješta konačnu datoteku na backup poziciji i mijenja joj naziv u YYYY-MM-DD-NAZIV.vcf
mv result.vcf "/putanja/do/backup/direktorija/$Full-NAZIV.vcf"
parse_xml.js datoteka
Code:
var fs = require('fs');
var convert = require('xml-js');
let xml = '';
// funkcija za pisanje u datoteku, zamijenjuje console.log
var util = require('util');
const datoteka = "/putanja/do/mjesta/gdje/zelite/zapisati/result.vcf"
var logFile = fs.createWriteStream(datoteka, { flags: 'a' }); // Or 'w' to truncate the file every time the process starts.
var logStdout = process.stdout;
console.log = function () {
logFile.write(util.format.apply(null, arguments) + '\n');
logStdout.write(util.format.apply(null, arguments) + '\n');
}
// kraj funkcije pisanja u datoteku
fs.readFile('result.xml', 'utf8', function(err, data) {
if (err) throw err;
//console.log(data); //this works fine here
xml = data; //setting it here so that I can use it afterwards
var result1 = convert.xml2js(xml, {compact: false});
var count_rdy = result1['elements'][0]['elements']
var count = count_rdy.length
var i = 1
while (i < count) {
console.log(result1['elements'][0]['elements'][i]['elements'][1]['elements'][0]['elements'][0]['elements'][0]['text']);
i++;
}
});
Kod parse_xml.js treba samo prilagoditi zadnji dio gdje je "while loop" zavisno od izgleda vašeg xml-a. Potrebno je doći do VCARD podatka. Isto tako loop počinje s 1, ne s 0, zato što je kod mene na 0 poziciji mislim naziv adresara.
Vjerojatno bi se cijeli parse xml dio mogao napraviti i preko bash-a. Potrebno bi bilo isčupati sve između "<card:address-data>" i "</card:address-data>" tagova (multi-line), i to koliko god puta se pojavljuje, te spremiti u datoteku jedno iza drugoga.
To je to, možda nekome pomogne.
Ako netko ima prijedlog kako poboljšati, otvoren sam za komentare.
