Skip to content

Python3 - subprocess.Popen

Python3
  • Für ein UI zum Tool Restic, an dem ich jetzt schon eine ganze Zeit "code", brauche ich einen Prozess der asynchron läuft.

    Ok, ich versuche das mal als Laie zu erklären. Ich starte oft Prozesse mit

    process = subprocess.run(['restic','version'], check=True, stdout=subprocess.PIPE, universal_newlines=True)
    

    Das gibt mir die Version von Restic zurück. Dieser Prozess wird gestartet und beendet!

    Nun wollte ich aber eine Sicherung mounten. Und dieser Prozess in Restic, wird gestartet und läuft, so lange bis man ihn mit CTRL + C auf der Konsole beendet. Jo, damit war dann meine Denksportaufgabe für gestern definiert. Ich muss eingestehen, es hat was länger gedauert 😀

    Nach einiger Zeit hatte ich rausbekommen, das ich es so machen muss.

    p1 = subprocess.Popen(cmd,stdin=subprocess.PIPE)
    

    Wir starten den Prozess und übergeben ihm den Restic Befehl (cmd) und setzen als stdin die subprocess.PIPE. Damit wird der Prozess unabhängig gestartet, mein Python3 Script wartet nicht mehr auf das Ende. So nach dem Motto, gestartet und vergessen 🙂

    Da tauchte das nächste Problem auf. Restic erwartet eine Passwort Eingabe. Ja, ich möchte das übergeben und ja ich weiß das ist aus Sicherheitsaspekten evt. nicht der beste Ansatz. Egal, da kümmere ich mich später drum!

    Viele Anleitungen im Netz gefunden, aber irgendwie war ich zu blöde die umzusetzen. Nur ein Ansatz machte dann bei mir das, was ich erwartete und auch teilweise verstand.

    # Wir schreiben das erwartete Passwort als Eingabe
    p1.stdin.write('12345678'.encode())
    p1.stdin.flush()
    p1.stdin.close()
    msg_box(self, "Repository erfolgreich gemountet!")
    

    Erste Zeile

    Ohne das .encode() funktioniert das nicht. Dem Prozess Popen muss das als Bytes Stream übergeben werden!

    This means that the string is converted to a stream of bytes, which is how it is stored on any computer. As bytes!

    Wir schreiben also diesen Bytes Stream in das Objekt p1
    Quelle: https://www.askpython.com/python/string/python-encode-and-decode-functions

    pwd='12345678'
    

    Und so sieht das aus, als Bytes Stream

    b'12345678'
    

    Zeile 2

    Die kann ich mir leider nicht erklären.

    Zeile 3

    Damit wird die Verbindung zum Prozess p1 geschlossen. Ohne schließen funktioniert es nicht.

    Wenn jemand weiß, wie man das Vernünftig erklären kann, wäre ich sehr dankbar.

    Fazit

    Der Prozess ist erfolgreich gestartet, läuft unabhängig vom Python Script. Das Passwort wird auch erfolgreich übergeben Das was ich brauchte 🙂 Wieder ein Stück weiter und was gelernt!!

  • Python3 - PyQt5 QIcon

    Python3
    2
    0 Stimmen
    2 Beiträge
    121 Aufrufe
    FrankMF

    Die Suchpfade findet man hiermit

    print(QIcon.themeSearchPaths())

    Ausgabe

    ['/home/frank/.icons', '/usr/share/cinnamon/icons', '/var/lib/flatpak/exports/share/icons', '/usr/share/icons', ':/icons']
  • Python3 - HTML Text ausgeben

    Python3
    1
    0 Stimmen
    1 Beiträge
    134 Aufrufe
    Niemand hat geantwortet
  • checkmk - Rest-Server überwachen

    Verschoben checkmk
    1
    0 Stimmen
    1 Beiträge
    430 Aufrufe
    Niemand hat geantwortet
  • Python3 - JSON

    Python3
    3
    0 Stimmen
    3 Beiträge
    197 Aufrufe
    FrankMF

    ede1a88a-5183-4f85-a602-27650362d532-grafik.png

    Die Backups sollen Namen haben, also habe ich das erweitert. Jetzt sollen diese als Liste rechts angezeigt werden. Das mache ich wie folgt.

    for key in backups: print(backups[key]['name'], key) liste = backups[key]['name'] + " ID: " + key self.listWidget.addItem(liste)

    Mittels des Keys kann ich auf den Namen zugreifen und die Liste damit füllen. Aktuell habe ich noch den Key hinten angefügt, weil ich noch keine Idee habe, wie ich die Backups anders verarbeiten soll. Aber, Stück für Stück. Der Backup-Name wird nach Auswahl in der Statusbar angezeigt. So weit klappt das so wie ich mir das vorstelle. Für heute ist Feierabend 😇

  • Python3 - RegEx für ein LineEdit

    Python3
    2
    0 Stimmen
    2 Beiträge
    167 Aufrufe
    FrankMF

    Gut, Menschen die mich kennen, wissen das IPv6 nicht so mein Spezialgebiet ist. Es hilft aber nichts, auch damit muss man sich beschäftigen 🙂

    Es war etwas schwierig was Passendes zu finden, aber ich denke das hier ist ganz gut. Ob es alle Möglichkeiten bei IPv6 beinhaltet, weiß ich nicht zu 100%.

    Hier eine Seite, wo ich was Passendes gefunden habe.
    https://ihateregex.io/expr/ipv6/

    Code # regex für IPv6 reg_ex = QRegExp('^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))$') input_validator = QRegExpValidator(reg_ex, self.lineedit2_ipv6) self.lineedit2_ipv6.setValidator(input_validator)

    Ein paar Test von mir ergaben, das es so aussieht als wenn es funktioniert 🙂

  • Restic & Rclone & Nextcloud

    Linux
    3
    0 Stimmen
    3 Beiträge
    716 Aufrufe
    FrankMF

    Hier mal eine Ausgabe vom ersten Durchgang

    root@frank-MS-7C37:~# restic --password-file /root/passwd -r rclone:Nextcloud:HOME_UBUNTU backup --files-from /root/includes.txt repository 99xxxxa0 opened successfully, password is correct created new cache in /root/.cache/restic rclone: 2020/05/08 17:47:57 ERROR : locks: error listing: directory not found rclone: 2020/05/08 17:47:58 ERROR : index: error listing: directory not found rclone: 2020/05/08 17:47:58 ERROR : snapshots: error listing: directory not found Files: 3503 new, 0 changed, 0 unmodified Dirs: 2 new, 0 changed, 0 unmodified Added to the repo: 16.872 GiB processed 3503 files, 21.134 GiB in 1:02:56 snapshot fdxxxxec saved

    Der erste Durchgang hat also etwa eine Stunde benötigt. Durch die Deduplikation der Daten, ist der Vorgang beim zweiten Durchgang viel schneller weil nur neue oder geänderte Daten gesichert werden. Und außerdem sind alle Daten AES-256 verschlüsselt. Also perfekt zur Ablage in irgendeiner Cloud 😉

    root@frank-MS-7C37:~# restic --password-file /root/passwd -r rclone:Nextcloud:HOME_UBUNTU backup --files-from /root/includes.txt repository 99xxxxa0 opened successfully, password is correct Files: 57 new, 41 changed, 3449 unmodified Dirs: 0 new, 2 changed, 0 unmodified Added to the repo: 22.941 MiB processed 3547 files, 21.137 GiB in 0:13 snapshot c6xxxxe4 saved

    Wie ihr seht, hat der zweite Durchgang nur ein paar neue und geänderte Daten gesichert. Der Rest ist ja schon vorhanden. Und das kann man dann auch problemlos täglich, wöchentlich oder was auch immer mal eben schnell durchführen.

    Eines meiner absoluten Lieblingstool 🙂

  • Restic - Update

    Restic
    1
    0 Stimmen
    1 Beiträge
    405 Aufrufe
    Niemand hat geantwortet
  • Restic - Rootserver als Datenablage nutzen

    Restic
    2
    0 Stimmen
    2 Beiträge
    712 Aufrufe
    FrankMF

    Ok, das erste Backup dauert immer was länger 😉 In meinem Fall 5 Std. 16 Minuten.

    Files: 33408 new, 0 changed, 0 unmodified Dirs: 1 new, 0 changed, 0 unmodified Data Blobs: 20849 new Tree Blobs: 2 new Added to the repo: 6.278 GiB processed 33408 files, 8.604 GiB in 5:16:03 snapshot 5beg1cb3 saved

    Aber, das Schöne ist, das die Backups inkrementell angelegt werden. Das nächste geht schneller 🙂

    open repository repository 3gg202a2 opened successfully, password is correct lock repository load index files using parent snapshot 5beg1cb3 start scan on [/home/frank] start backup on [/home/frank] scan finished in 3.791s: 33788 files, 8.611 GiB Files: 496 new, 74 changed, 33218 unmodified Dirs: 0 new, 1 changed, 0 unmodified Data Blobs: 292 new Tree Blobs: 2 new Added to the repo: 43.661 MiB processed 33788 files, 8.611 GiB in 2:15 snapshot fag41bf7 saved

    Eine tägliche Sicherung sollte dann wohl reichen.