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!!

  • Forgejo Installation mit Restic nach Hetzner S3 sichern

    Restic restic linux forgejo
    2
    2
    0 Stimmen
    2 Beiträge
    223 Aufrufe
    FrankMF
    Ich habe ja im obigen Beispiel, den gesamten Ordner von der Postgres Installation gesichert. backup_pfad_postgres="/home/pguser/db-data" Ich habe dann mal ein wenig in der Dokumentation gelesen und das hier gefunden. https://www.postgresql.org/docs/current/app-pgdump.html Einfach den Ordner zu sichern, ist ja bei jeder Datenbank ein gewisses Risiko. Die Konsistenz der Daten ist nicht gesichert. Darum gibt es bei den Datenbanken auch immer Tools, mit denen man die Daten sichern kann. In der Doku steht folgendes. pg_dump — extract a PostgreSQL database into a script file or other archive file Aber wichtiger ist das hier. pg_dump is a utility for backing up a PostgreSQL database. It makes consistent backups even if the database is being used concurrently. pg_dump does not block other users accessing the database (readers or writers). Das macht also konsistente Backups. Wichtig noch zu wissen ist folgendes. pg_dump only dumps a single database. To back up an entire cluster, or to back up global objects that are common to all databases in a cluster (such as roles and tablespaces), use pg_dumpall. Ok, das scheint gut geeignet zu sein, um die Datenbank zu sichern. Aber, wie? Auf meinen Eingangsbeitrag kam es zu folgendem Dialog auf Mastodon. https://nrw.social/deck/@nebucatnetzer@social.linux.pizza/114132208440509237 Das war der Anstoß sich mit dem Thema zu beschäftigen. Und ich hatte dann folgende Lösung. podman exec -it postgres pg_dump -U postgres -f /var/lib/postgresql/data/dump.txt Ok, was mache ich hier? Wir führen einen Befehl vom Host aus gesehen, im Container aus. podman exec -it postgres Der Teil führt den folgenden Befehl im Container aus. pg_dump -U postgres -f /var/lib/postgresql/data/dump.txt pg_dump - Das Tool fürs Backup -U postgres - Der Befehl wird als User postgres ausgeführt -f /var/lib/postgresql/data/dump.txt - Das Dump File wird im Data Ordner abgelegt, den haben wir ja persistent auf dem Host. Somit kann ich das jetzt einfach in mein Backup Script einbauen und brauchen nicht mehr den ganzen Ordner zu kopieren, sondern nur noch das Dump File. Ich werde diese Änderungen in das obige Script einbauen.
  • Rest-Server v0.13.0 released

    Restic rest-server restic linux
    2
    0 Stimmen
    2 Beiträge
    361 Aufrufe
    FrankMF
    Download Rest-Server und installieren Im Github Repository den aktuellen Release suchen. Hier am Beispiel der aktuellen Version 0.13.0 (27.07.2024) Datei herunterladen wget https://github.com/restic/rest-server/releases/download/v0.13.0/rest-server_0.13.0_linux_amd64.tar.gz Die Datei entpacken tar -xf rest-server_0.13.0_linux_amd64.tar.gz Ins Verzeichnis wechseln cd rest-server_0.13.0_linux_amd64 Wenn der Rest-Server läuft, dann muss man diesen erst mal stoppen. systemctl stop rest-server Danach kopiert man das File nach bin. Wer mag sichert vorher das alte File. cp rest-server /usr/local/bin Danach kann man den Rest-Server wieder starten. systemctl start rest-server Versionskontrolle root@rest-server:~# rest-server -v rest-server version rest-server 0.13.0 compiled with go1.22.5 on linux/amd64 Die Hilfe vom Rest-Server root@rest-server:~# rest-server -h Run a REST server for use with restic Usage: rest-server [flags] Flags: --append-only enable append only mode --cpu-profile string write CPU profile to file --debug output debug messages -h, --help help for rest-server --htpasswd-file string location of .htpasswd file (default: "<data directory>/.htpasswd)" --listen string listen address (default ":8000") --log filename write HTTP requests in the combined log format to the specified filename (use "-" for logging to stdout) --max-size int the maximum size of the repository in bytes --no-auth disable .htpasswd authentication --no-verify-upload do not verify the integrity of uploaded data. DO NOT enable unless the rest-server runs on a very low-power device --path string data directory (default "/tmp/restic") --private-repos users can only access their private repo --prometheus enable Prometheus metrics --prometheus-no-auth disable auth for Prometheus /metrics endpoint --tls turn on TLS support --tls-cert string TLS certificate path --tls-key string TLS key path -v, --version version for rest-server Systemd Wer noch ein passendes systemd File benötigt. [Unit] Description=Rest Server After=syslog.target After=network.target [Service] Type=simple User=rest-server Group=rest-server ExecStart=/usr/local/bin/rest-server --private-repos --tls --tls-cert /mnt/rest-server/<DOMAIN>/fullchain.pem --tls-key /mnt/rest-server/<DOMAIN>/key.pem --path /mnt/rest-server Restart=always RestartSec=5 # Optional security enhancements NoNewPrivileges=yes PrivateTmp=yes ProtectSystem=strict ProtectHome=yes ReadWritePaths=/mnt/rest-server [Install] WantedBy=multi-user.target
  • Restic UI - kurzes Video

    Linux restic restic-ui
    1
    0 Stimmen
    1 Beiträge
    198 Aufrufe
    Niemand hat geantwortet
  • checkmk - Rest-Server überwachen

    Verschoben checkmk checkmk linux restic
    1
    3
    0 Stimmen
    1 Beiträge
    523 Aufrufe
    Niemand hat geantwortet
  • Python3 - Eingabeformular

    Python3 python3
    3
    1
    0 Stimmen
    3 Beiträge
    256 Aufrufe
    FrankMF
    Meine endgültige Lösung, zu mindestens im Moment , ist ein zweites Window. Das gefällt mir am Besten, komme ich zu mindestens im Moment einfach besser mit klar. Aber, eines der größten Probleme war für mich, wie aktualisiere ich die Liste im Hauptfenster!? Da habe ich doch etliche Stunden dran rum gefummelt.... Hier nur mal das Layout ##################### # Layout ##################### self.formGroupBox = QGroupBox("Form layout") layout = QFormLayout() layout.addRow(self.label_1) layout.addRow(QLabel("Backup Name:"), self.input1) layout.addRow(QLabel("Repository:"), self.button3) layout.addRow(QLabel("Source:"), self.button4) layout.addRow(QLabel("Password:"), self.input4) layout.addRow(self.label_6) layout.addRow(self.button2) self.formGroupBox.setLayout(layout) self.setLayout(layout) Das mit dem SecondWindow ist aber was aufwändiger. Da mach ich dann mal einen eigenen Beitrag zu. Aktuell sieht das so aus. [image: 1604819923887-6c68c956-9127-438f-bc54-4dcef8e18f00-image.png]
  • Kopia

    Allgemeine Diskussionen kopia linux restic
    1
    0 Stimmen
    1 Beiträge
    306 Aufrufe
    Niemand hat geantwortet
  • Rest-Server

    Verschoben Restic rest-server linux restic
    8
    0 Stimmen
    8 Beiträge
    687 Aufrufe
    FrankMF
    Dann mal eben ausprobiert. Auf meinem Server war die Version 0.9.7 selber, mit go, gebaut. Dann mache ich das auch mit der v0.10.0 so. Aber bevor ich anfange, wird die v0.9.7 gesichert. mv /usr/local/bin/rest-server /usr/local/bin/rest-server_0_9_7 So erspare ich mir im Problemfall das selber bauen. Ok, dann die neue Version bauen. git clone https://github.com/restic/rest-server.git cd rest-server go run build.go Danach befindet sich im Verzeichnis die Binärdatei rest-server Die kopieren wir jetzt cp rest-server /usr/local/bin Danach kurzer Test # rest-server --version rest-server 0.10.0 (v0.10.0-6-g037fe06) compiled with go1.11.6 on linux/amd64 Gut Version passt Dann ein Backup gestartet. Das sichert einen Teil meines Home-Verzeichnis Files: 153 new, 100 changed, 177857 unmodified Dirs: 0 new, 1 changed, 0 unmodified Added to the repo: 81.881 MiB processed 178110 files, 80.571 GiB in 0:28 snapshot 607e0027 saved Applying Policy: keep the last 3 snapshots, 3 monthly snapshots keep 5 snapshots: ID Time Host Tags Reasons Paths --------------------------------------------------------------------------------------- fa97890e 2020-07-25 21:02:05 frank-XXX monthly snapshot /home/frank 5b073bbb 2020-08-30 10:17:27 frank-XXX monthly snapshot /home/frank f7cf37ef 2020-09-06 15:13:03 frank-XXX last snapshot /home/frank 0157462c 2020-09-13 13:32:12 frank-XXX last snapshot /home/frank 607e0027 2020-09-14 08:09:34 frank-XXX last snapshot /home/frank monthly snapshot --------------------------------------------------------------------------------------- 5 snapshots remove 1 snapshots: ID Time Host Tags Paths --------------------------------------------------------------------- 3010b7cc 2020-09-06 11:39:27 frank-XXX /home/frank --------------------------------------------------------------------- 1 snapshots 1 snapshots have been removed, running prune counting files in repo building new index for repo [1:34] 100.00% 17351 / 17351 packs So weit funktioniert das genau wie vorher. Im Changelog stand ja was von Subfoldern. Das betrifft mich nicht, weil ich für jeden User genau ein Verzeichnis habe. So mit alles Gut Dann warte ich mal morgen ab, ob die täglichen Backups der Server rund laufen.
  • Restic & Rclone & Nextcloud

    Linux nextcloud rclone linux restic
    3
    0 Stimmen
    3 Beiträge
    816 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