Noch als Ergänzung, der Server läuft mit Debian 12
# uname -a Linux webserver1-4gb-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.90-1 (2024-05-03) x86_64 GNU/LinuxNextcloud API Zugriff
-
Heute auf der Arbeit kam die Frage auf, ob man große Mengen an Datenordnern erzeugen kann, so als Template. So was von Hand anzulegen ist ja irgendwie blöd
Da fiel mir ein, das müsste man mal testen ob so was geht. War mir eigentlich vorher klar, aber noch nie gemacht, also Anleitung suchen und testen.
Die Anleitung findet man hier
Der Testing Request aus der Anleitung
curl -u username:password 'https://cloud.example.com/remote.php/dav/files/username/folder' -X PROPFIND --data '<?xml version="1.0" encoding="UTF-8"?>
So umgebaut, das ich das benutzen kann, also Username und PW eingefügt, Pfad angepasst und ausgeführt.
Ok, kommt eine Fehlermeldung, die mir gar nichts sagt
<?xml version="1.0" encoding="utf-8"?> <d:error xmlns:d="DAV:" xmlns:s="http://sabredav.org/ns"> <s:exception>Sabre\Xml\LibXMLException</s:exception> <s:message>Extra content at the end of the document on line 1, column 39</s:message> </d:error>
Aufgeben? Nein, dafür spiele ich zu gerne rum. Ein paar Sachen ausprobiert und festgestellt, das ich mit
curl -u username:password 'https://cloud.example.com/remote.php/dav/files/username/folder' -X PROPFIND
folgende Antwort bekam.
<?xml version="1.0"?> <d:multistatus xmlns:d="DAV:" xmlns:s="http://sabredav.org/ns" xmlns:oc="http://owncloud.org/ns" xmlns:nc="http://nextcloud.org/ns"><d:response>......[gekürzt].....
Ok, da kamen Daten an, es wurden die Daten als XML-Datei ausgegeben. Ich habe mir das mal in eine Datei umgeleitet und dann im Browser angesehen. Da bekommt man ja XML vernünftig angezeigt. Die Daten waren korrekt. So, damit war klar das funktioniert so
Die Idee war ja Verzeichnisse und Unterordner usw. anzulegen. Also, auf und testen....
curl -u username:password 'https://cloud.example.com/remote.php/dav/files/username/TESTFOLDER' -X MKCOL
Danach wird der Ordner angelegt, mit
curl -u username:password 'https://cloud.example.com/remote.php/dav/files/username/TESTFOLDER/SUBFOLDER1' -X MKCOL
ein Unterordner. Somit war klar, das es ganz einfach ist mit einem Script große Mengen an Ordnern vollautomatisch zu erzeugen.
wird evtl. noch erweitert..
-
Ok, ich grabe mal wieder ein uraltes Thema aus. Ich wollte das jetzt mal umsetzen um zu schauen, wie man so was löst.
""" Tool to create folders using the Nextcloud API """ ############################################### # Imports ############################################### import subprocess from pathlib import Path ############################################### # Constant ############################################### # Get home directory from user USERHOME = str(Path.home()) NCPATH = 'https://nextcloud.DOMAIN/remote.php/dav/files/Frank/Python_Script/' USERNAME = 'USER' PASSWORD = 'PASSWORD TOKEN' ############################################### # Function to crate folder with nextcloud api ############################################### def read_textobject(): # read folders to create from textfile with open(f'{USERHOME}/Textdatei.txt', 'r') as obj: # create object for line in obj: # path = Path(line.rstrip()) # with whitespaces crash # replace whitespaces with %20 and remove linefeed (\n) path = Path((line.replace(' ', '%20')).rstrip('\n')) print(line.rstrip()) ############################################### # Check if directory exists ############################################### try: args = ['curl', '-u', f'{USERNAME}:{PASSWORD}', f'{NCPATH}{path}', '-X', 'PROPFIND'] result = subprocess.run(args, check=True, capture_output=True, text=True) except subprocess.CalledProcessError as error: print("Error check for directory") print(result.stderr) else: # Evaluation if result.stdout.find("error") != -1: print('Directory not available, will be created') print(result.stdout) ############################################### # Create directory ############################################### try: args = ['curl', '-u', f'{USERNAME}:{PASSWORD}', f'{NCPATH}{path}', '-X', 'MKCOL'] result = subprocess.run(args, check=True, capture_output=True, text=True) except subprocess.CalledProcessError as error: print("Error create directory") print(result.stderr) else: if result.stdout: print('Directory not successful created') print(result.stdout) else: print('Directory created successful') else: print('Directory available') print(result.stdout) obj.close() if __name__ == '__main__': read_textobject()
Die Textdatei die ich lade, hat folgenden Inhalt
TEST1 TEST2 TEST3 TEST4 TEST5
Und das Ergebnis
-
-
Ok, es gab noch ein Problem und zwar '/'. Habe das Script jetzt nochmal umgebaut, jetzt bin ich soweit zufrieden. Die Textdatei ist auf meine Bedürfnisse angepasst worden
1.2.01 1.2.01.1 Text1.1 1.2.01.2 Text1.2 1.2.02 1.2.02.1 Text2.1/Testing 1.2.02.2 Text2.2
1.2.01 und 1.2.02 erzeugt dann einen Ordner, der Rest sind dann Unterordner.
""" Tool to create folders using the Nextcloud API """ ############################################### # Imports ############################################### import subprocess from pathlib import Path ############################################### # Constant ############################################### # Get home directory from user USERHOME = str(Path.home()) NCPATH = 'https://DOMAIN/remote.php/dav/files/Frank/Python_Script/' USERNAME = 'USER' PASSWORD = 'PASSWORD' ############################################### # Function to crate folder with nextcloud api ############################################### def read_textobject(): # read folders to create from textfile with open(f'{USERHOME}/Textdatei.txt', 'r') as obj: # create object for line in obj: line_split = line.split(' ') elements = line_split[0].split('.') try: if elements[3]: main_folder = 0 # replace whitespaces with %20, and / with _ and remove linefeed (\n) path = Path((line.replace(' ', '%20').replace('/', '_')).rstrip('\n')) except IndexError: print("Element is main folder") main_folder = 1 # replace whitespaces with %20, and / with _ and remove linefeed (\n) main = Path((line.replace(' ', '%20').replace('/', '_')).rstrip('\n')) else: print("Element is not a main folder") ############################################### # Create directory ############################################### if main_folder == 1: # Main folder try: args = ['curl', '-u', f'{USERNAME}:{PASSWORD}', f'{NCPATH}{main}', '-X', 'MKCOL'] result = subprocess.run(args, check=True, capture_output=True, text=True) except subprocess.CalledProcessError as error: print(result.stderr) else: if result.stdout: print(result.stdout) else: print('Directory created successful') else: # Not a main folder try: args = ['curl', '-u', f'{USERNAME}:{PASSWORD}', f'{NCPATH}{main}/{path}', '-X', 'MKCOL'] result = subprocess.run(args, check=True, capture_output=True, text=True) except subprocess.CalledProcessError as error: print(result.stderr) else: if result.stdout: print(result.stdout) else: print('Directory created successful') else: print(result.stdout) obj.close() if __name__ == '__main__': read_textobject()