View Single Post
Staro 08.08.2022., 09:06   #6
Libertus
Premium
Moj komp
 
Libertus's Avatar
 
Datum registracije: Jul 2017
Lokacija: Ramura
Postovi: 2,743
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.

Zadnje izmijenjeno od: Libertus. 08.08.2022. u 09:22.
Libertus je offline   Reply With Quote