Forumi


Povratak   PC Ekspert Forum > Računala > Software > Web dizajn, programiranje i ostalo
Ime
Lozinka

Odgovori
 
Uređivanje
Staro 01.08.2022., 07:33   #1
Libertus
Premium
 
Libertus's Avatar
 
Datum registracije: Jul 2017
Lokacija: Ramura
Postovi: 1,945
Backup adresara (carddav) putem skripte?

Možda je netko već radio, ili barem ima ideju pa da ubrzam kopanje.
Imam privatni i poslovni adresar na webu u obliku carddav kalendara, dostupan kroz link i autorizaciju (korisničko ima i lozinka).

Webdav backend je sabredav.

Umjesto da ručno preko sučelja jednom mjesečno radim backup adresara, mislio sam složiti nešto da mi svaki dan u određeno vrijeme napravi backup na moj Synology NAS. NAS je na linuxu, tako da bi se trebalo moći na njemu pokrenuti i staviti u cronjob.

Ne očekujem gotovu skriptu, ali bilo bi zahvalan na pogurancu u pravom smjeru, bar da mi se objasni način na koji bih mogao složiti i s kojim pomoćnim programima.

Nisam programer, ali se snalazim.

Svakako objavim ovdje skriptu ako je uspijem složiti.
Libertus je offline   Reply With Quote
Staro 05.08.2022., 16:05   #2
Bubba
E Pluribus UNIX
Moj komp
 
Bubba's Avatar
 
Datum registracije: Oct 2002
Lokacija: M82
Postovi: 6,431
https://sabre.io/dav/vcf-export-plugin/

Ako je to to, okines u cronu neki curl/wget zahtijev i dobar si.
__________________
Programer
Rok od dva mjeseca u stvari znači četiri, ali nikako ispod šest.
PCI-Z - PCI-Z is a freeware lightweight system utility designed to provide information about (unknown) PCI (PCI-E, PCI-X...) devices and helps you find appropriate device drivers.
1time.link - Generate encrypted one-time links or share encrypted one-time downloadable files.
Bubba je offline   Reply With Quote
Oglasni prostor
Oglas
 
Oglas
Staro 05.08.2022., 17:56   #3
Libertus
Premium
 
Libertus's Avatar
 
Datum registracije: Jul 2017
Lokacija: Ramura
Postovi: 1,945
Baš se evo maltretiram cijelo poslije podne.
Brzo sam pronašao kako povući XML podatke za VCF:
Code:
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>" https://url.com
Spremio sam to u xml datoteku, ali mi je onda trebao parser. Ograničen sam na Synology, a pošto već imam node.js instaliran i nešto sam se igrao u njemu prije, tražio sam kako u njemu riješiti.
Uglavnom, uspio sam isčupati sve test VCARD iz tog xml-a i spremiti u datoteku. Sada to treba malo očistiti od gluposti koje sam napisao i sve staviti u neku bash skriptu koja će kada sve završi spremiti rezultat kao backup, a obrisati sve nepotrebne datoteke.

Kada završim stavim ovdje pa neka ima ako kome zatreba.
Libertus je offline   Reply With Quote
Staro 06.08.2022., 14:00   #4
Bubba
E Pluribus UNIX
Moj komp
 
Bubba's Avatar
 
Datum registracije: Oct 2002
Lokacija: M82
Postovi: 6,431
Ne kuzim kako (i zasto) dobivas XML, dokumentacija kaze:

Citiraj:
The vCard export plugin allows you to export an entire addressbook, to a single .vcf file.
__________________
Programer
Rok od dva mjeseca u stvari znači četiri, ali nikako ispod šest.
PCI-Z - PCI-Z is a freeware lightweight system utility designed to provide information about (unknown) PCI (PCI-E, PCI-X...) devices and helps you find appropriate device drivers.
1time.link - Generate encrypted one-time links or share encrypted one-time downloadable files.
Bubba je offline   Reply With Quote
Staro 06.08.2022., 14:38   #5
Libertus
Premium
 
Libertus's Avatar
 
Datum registracije: Jul 2017
Lokacija: Ramura
Postovi: 1,945
Citiraj:
Autor Bubba Pregled postova
Ne kuzim kako (i zasto) dobivas XML, dokumentacija kaze:
E to bih i ja volio, ali nemam kontrolu nad serverom (kough SaaS kough) tako da ako ima taj plugin, super, ako nema koristim već napravljeno.
Bitno da sam ja uspio dobiti taj single file vcf preko xml parsera. Sada ću pokušavati da li mogu dobiti isti direktno od servera.
Libertus je offline   Reply With Quote
Staro 08.08.2022., 09:06   #6
Libertus
Premium
 
Libertus's Avatar
 
Datum registracije: Jul 2017
Lokacija: Ramura
Postovi: 1,945
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
Staro 08.08.2022., 11:31   #7
Nikky
Moderator
 
Nikky's Avatar
 
Datum registracije: Sep 2006
Lokacija: St
Postovi: 21,135
Bravo kolega,
+ za trud,
+ za share rješenja.
Nikky je online   Reply With Quote
Oglasni prostor
Oglas
 
Oglas
Odgovori


Uređivanje

Pravila postanja
Vi ne možete otvarati nove teme
Vi ne možete pisati odgovore
Vi ne možete uploadati priloge
Vi ne možete uređivati svoje poruke

BB code je Uključeno
Smajlići su Uključeno
[IMG] kod je Uključeno
HTML je Isključeno

Idi na