Skip to content

Nextcloud API Zugriff

Nextcloud
  • 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

    02bf23bf-a169-4011-acfb-a40c72bbfae3-grafik.png

  • Wenn der Ordner ein Leerzeichen beinhaltete, war Ende - Script crasht mit Fehler. Die Lösung

    # replace whitespaces with %20 and remove linefeed (\n)
    path = Path((line.replace(' ', '%20')).rstrip('\n'))
    

    Ich ergänze das oben auch direkt.

  • 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()
    

  • Nextcloud - Upgrade Hub 9 (30.0.0)

    Nextcloud
    3
    0 Stimmen
    3 Beiträge
    736 Aufrufe
    FrankMF

    Ich habe dann mal weitergesucht, dank ein paar Tipps aus dem Fediverse, sehe ich jetzt was heller 😉

    towo (@towo@chaos.social)

    @FrankM@nrw.social IIRC ist das auch so eine External App, die man dazu packen muss. Da darf man dann noch der Nextcloud Zugriff auf eine Docker-API, damit die die Applikationen hochzieht, geben; alternativ geht wohl auch ein statisches Deployment.

    favicon

    chaos.social (chaos.social)

    Nachdem ich dann ein paar Apps gefunden und installiert hatte

    AppAPI Flow

    tauchte dann im Benutzermenü, rechts oben, folgendes auf.

    Bildschirmfoto_20240922_101125.png

    Das Interessante ist der Menüpunkt Externe Apps.

    Nun sollte ich diese Funktion verstanden haben. Das Nextcloud Team integriert also diese Windmill App via Docker Container und greift dann darauf zu. In der Videopräsentation war doch von in Nextcloud integriert die Werbeansprache!? Ein Docker Container ist für mich keine Integration.

    Ich habe einige rudimentäre Kenntnisse von Docker, ausschließlich lokal. Aber, ich komme nicht auf die Idee das auf einem produktiven Server zu installieren. Somit kann ich das Testen hier beenden und die Apps alle wieder deinstallieren.

    Jetzt habe ich noch im Kopf, ob man das mal mit einem Nextcloud-AIO testen soll? Natürlich auf einem Testsystem.

    Link Preview Image GitHub - nextcloud/all-in-one: 📦 The official Nextcloud installation method. Provides easy deployment and maintenance with most features included in this one Nextcloud instance.

    📦 The official Nextcloud installation method. Provides easy deployment and maintenance with most features included in this one Nextcloud instance. - nextcloud/all-in-one

    favicon

    GitHub (github.com)

  • Nextcloud Hub8 Keine Previews

    Nextcloud
    2
    0 Stimmen
    2 Beiträge
    301 Aufrufe
    FrankMF

    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/Linux
  • Nextcloud Hub8 (29.0.0) released

    Nextcloud
    2
    0 Stimmen
    2 Beiträge
    207 Aufrufe
    FrankMF

    Ich möchte hier aber auch nicht unterschlagen, dass viele der Neuerungen bei meiner Installation nicht funktionieren. Hauptsächlich Funktionen im Zusammenhang mit der neuen Teams Funktion.

    Da ich schon sehr lange Nextcloud nutze, kenne ich das von den 0.0er Versionen. Da braucht es erst mal ein paar Updates, bis das fehlerfrei funktioniert.

  • Nextcloud 28.0.0 - OpenAI Integration

    Nextcloud
    2
    0 Stimmen
    2 Beiträge
    674 Aufrufe
    FrankMF

    Noch eine Ergänzung. Wenn ihr jetzt viele User habt und das nur auf eine Gruppe beschränken wollt, könnt ihr das so machen.

    Unter Apps, Nextcloud Assistant suchen und die gewünschten Gruppen eintragen. Fertig 😉

    197deae4-d72a-4729-bba7-bfa9b4bef334-grafik.png

  • Nextcloud - Hub 5 (27.0.0) - Neuigkeiten

    Nextcloud
    1
    0 Stimmen
    1 Beiträge
    278 Aufrufe
    Niemand hat geantwortet
  • Nextcloud - Größe Datenverzeichnis

    Nextcloud
    1
    0 Stimmen
    1 Beiträge
    212 Aufrufe
    Niemand hat geantwortet
  • Nextcloud Talk

    Nextcloud
    5
    0 Stimmen
    5 Beiträge
    811 Aufrufe
    FrankMF

    All I needed to do was setting the permissions to 744 for the archive directory and the symlinks resolved correctly after a reboot of coturn

    My turnserver installation on Debian runs as the user turnserver and not as root, nor is the user turnserver in any group owning the letsencrypt directory.
    If your turnserver does run as root, it should be fine just adding execute permissions.

    I hope this helps some of you.
    Quelle: https://help.nextcloud.com/t/lets-encrypt-symlink-breaks-coturn-configuration/70166

    Was zum Testen die Tage....

  • Nextcloud 16.0.5 -> 17.0.0

    Nextcloud
    1
    0 Stimmen
    1 Beiträge
    227 Aufrufe
    Niemand hat geantwortet