From ba4bc5dc8d5f5b158a5b199141c951f3e6696015 Mon Sep 17 00:00:00 2001 From: gitea Date: Wed, 9 Apr 2025 18:56:57 +0000 Subject: [PATCH] fixed import_machine_prdoucts, prepared for gitea actions --- .../odoo-restore-open_workshop_install.yaml | 111 ++++++++++++++++++ post_init_hook.py | 4 +- scripts/import_machine_products.py | 79 +++++++++++++ scripts/odoo-restore.sh | 34 ++++++ 4 files changed, 226 insertions(+), 2 deletions(-) create mode 100644 .gitea/workflows/odoo-restore-open_workshop_install.yaml create mode 100644 scripts/odoo-restore.sh diff --git a/.gitea/workflows/odoo-restore-open_workshop_install.yaml b/.gitea/workflows/odoo-restore-open_workshop_install.yaml new file mode 100644 index 0000000..2ce12e8 --- /dev/null +++ b/.gitea/workflows/odoo-restore-open_workshop_install.yaml @@ -0,0 +1,111 @@ +name: odoo-backup-restore +on: + schedule: + - cron: "21 5 * * *" # Dieser Job wird täglich um 05:21 Uhr UTC ausgeführt. + push: + branches: + - main +# workflow_dispatch: + +env: + URL_BACKUP: https://odoo.lan.hobbyhimmel.de + URL_RESTORE: http://hobbybackend2.fritz.box:9013 + +jobs: + run-odoo-backup-in-docker: + runs-on: ["hobbybackend2","ubuntu-latest"] # Gibt an, dass der Job entweder auf 'hobbybackend1' und 'ubuntu-latest' läuft. + + steps: + - name: Checkout the repository + # Dieser Schritt holt den Code des Repositories in die Action-Umgebung. + # Dies ist notwendig, um auf Dateien im Repository wie Skripte oder Konfigurationen zugreifen zu können. + uses: actions/checkout@v3 + + - name: Set up Docker container + # Dieser Schritt startet einen Docker-Container basierend auf dem "ubuntu:latest" Image. + # Er läuft im Hintergrund (`-d`), und wir verwenden `tail -f /dev/null`, um den Container laufend zu halten. + # Danach werden benötigte Pakete wie `gnupg`, `openssh-client`, `curl` und `sshpass` installiert. + run: | + docker run -d --name ${{ github.workflow }} ubuntu:latest tail -f /dev/null + docker exec ${{ github.workflow }} apt-get update + docker exec ${{ github.workflow }} apt-get install -y gnupg openssh-client curl sshpass + + - name: Copy SSH keys to the container + # In diesem Schritt werden SSH-Schlüssel aus den GitHub Secrets in temporäre Dateien geschrieben. + # Diese Dateien werden dann in den Docker-Container kopiert, um SSH-Zugriff innerhalb des Containers zu ermöglichen. + # Schließlich werden die Berechtigungen des privaten Schlüssels (id_rsa) auf 600 gesetzt. + run: | + docker exec ${{ github.workflow }} mkdir -p /root/.ssh + echo "${{ secrets.OPENSSH_PRIVATE_KEY }}" > ssh_private_key + echo "${{ secrets.OPENSSH_PUBLIC_KEY }}" > ssh_public_key + docker cp ssh_private_key ${{ github.workflow }}:/root/.ssh/id_rsa + docker cp ssh_public_key ${{ github.workflow }}:/root/.ssh/id_rsa.pub + docker exec ${{ github.workflow }} chmod 600 /root/.ssh/id_rsa + + - name: Copy PGP keys to the container + # Hier werden die GPG-Schlüssel (PGP-Schlüssel) in den Container kopiert, um Backups verschlüsseln zu können. + # Die GPG-Schlüssel werden ebenfalls aus den GitHub Secrets entnommen und temporär in Dateien gespeichert, + # die anschließend importiert werden. + run: | + echo "${{ secrets.PGP_PRIVATE_KEY }}" > pgp_private_key.asc + echo "${{ secrets.PGP_PUBLIC_KEY }}" > pgp_public_key.asc + docker cp pgp_private_key.asc ${{ github.workflow }}:/root/pgp_private_key.asc + docker cp pgp_public_key.asc ${{ github.workflow }}:/root/pgp_public_key.asc + docker exec ${{ github.workflow }} gpg --batch --import /root/pgp_private_key.asc + docker exec ${{ github.workflow }} gpg --import /root/pgp_public_key.asc + rm pgp_private_key.asc pgp_public_key.asc + + - name: Add Host to Known Hosts + # In diesem Schritt wird der SSH-Host-Schlüssel des Remote-Servers (ALL_INKL_HOST) zum "known_hosts"-File + # des Containers hinzugefügt, um SSH-Verbindungen zum Remote-Server zu ermöglichen, ohne dass Warnungen angezeigt werden. + # Der Host-Schlüssel wird mit `ssh-keyscan` gesammelt und in `known_hosts` eingetragen. + run: | + echo "This is the host: ${{ secrets.ALL_INKL_HOST }}" + docker exec ${{ github.workflow }} bash -c "mkdir -p /root/.ssh && touch /root/.ssh/known_hosts && chmod 600 /root/.ssh/known_hosts" + docker exec ${{ github.workflow }} bash -c "ssh-keyscan -H '${{ secrets.ALL_INKL_HOST }}' >> /root/.ssh/known_hosts" + docker exec ${{ github.workflow }} bash -c "cat /root/.ssh/known_hosts" # Optional: Ausgabe zur Überprüfung + + - name: Run the restore script in Docker container + # In diesem Schritt wird das Skript `odoo-restore.sh` in den Container kopiert und dort ausgeführt. + # Die für das Skript notwendigen Umgebungsvariablen (wie z.B. ... ) werden mitgegeben. + # Das Skript entpackt das Backup-Archiv. + # Das Skript löscht die bisherige Datenbank und fügt die neue Datenbank wieder ein. + # Anschließend wird das Odoo filestore wiederhergestellt. + run: | + docker cp ./scripts/odoo-restore.sh ${{ github.workflow }}:/root/odoo-restore.sh + docker exec -e ADMIN_PASSWORD=${{ secrets.ODOO_ADMIN_PASSWORD }} \ + -e sftp_host=${{ secrets.SFTP_HOST }} \ + -e sftp_user=${{ secrets.SFTP_USER }} \ + -e sftp_password=${{ secrets.SFTP_PASSWD }} \ + ${{ github.workflow }} /bin/bash -c "bash /root/odoo-restore.sh '${{ env.URL_RESTORE }}'" + #-name: Uninstall vvow_pos + # In diesem Schritt wird das Modul `vvow_pos` deinstalliert, um sicherzustellen, dass es keine Konflikte mit der neuen Datenbank gibt. + + - name: Clone or update custom_addons open_workshop repository + working-directory: . + run: | + docker exec ${{ github.repository_owner }}_${{ env.CONTAINER_NAME }}_${{ env.CONTAINER_NAME_EXTENSION }} /bin/bash -c " + git config --global pull.ff only && \ + if [ ! -d /home/odoo/custom_addons/open_workshop ]; then + git clone https://gitea:${{ secrets.BUILD_ACTION }}@gitea.lan.hobbyhimmel.de/hobbyhimmel/open_workshop.git /home/odoo/custom_addons/open_workshop; + cd /home/odoo/custom_addons/open_workshop && git fetch && git checkout ${{ env.ODOO_VERSION }}_dev && git pull; + else + cd /home/odoo/custom_addons/open_workshop && git fetch && git checkout ${{ env.ODOO_VERSION }}_dev && git pull; + fi" + + -name: Fix Database hobbyhimmel with fix_missing_pos_partner.py + # In diesem Schritt wird das Skript `fix_missing_pos_partner.py` ausgeführt, um sicherzustellen, dass alle Partner in der Datenbank korrekt sind. + + -name: Install open_workshop + # Install open_workshop and run necessary migrations + + -name: Restart Docker Container + + -name: Uninstall vvow_einweisungen + + - name: Stop and remove Docker container + # Nachdem das Backup abgeschlossen ist, wird der Docker-Container gestoppt und entfernt, + # um keine Ressourcen auf dem Host unnötig zu verbrauchen. + run: | + docker stop ${{ github.workflow }} + docker rm ${{ github.workflow }} diff --git a/post_init_hook.py b/post_init_hook.py index e3be909..708a000 100644 --- a/post_init_hook.py +++ b/post_init_hook.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- from odoo import SUPERUSER_ID from odoo.api import Environment -from . import import_machine_products +#from . import import_machine_products import logging _logger = logging.getLogger(__name__) @@ -31,7 +31,7 @@ def run_migration(cr, registry): - import_machine_products.run_import(cr, registry) + #import_machine_products.run_import(cr, registry) ''' Funktioniert nicht: diff --git a/scripts/import_machine_products.py b/scripts/import_machine_products.py index e69de29..9bd402f 100644 --- a/scripts/import_machine_products.py +++ b/scripts/import_machine_products.py @@ -0,0 +1,79 @@ +# import_machine_products.py +# odoo-bin shell -d deine_datenbank < import_machine_products.py +import logging +from odoo import api, SUPERUSER_ID + +_logger = logging.getLogger(__name__) + +# Mapping von product_id > machine_id +TRAINING_MAPPING = { + '16':'1', + '11':'2', + '10':'4', + '117':'5', + '14':'6', + '12':'7', + '15':'8', + '118':'10', + '118':'11', + '118':'12', + '18':'15', + '18':'16', + '13':'18', + '17':'19', +} + +# Mapping von product_id > machine_id +USAGE_MAPPING = { + '50':'1', + '49':'2', + '49':'3', + '49':'4', + '53':'5', + '52':'7', + '55':'8', + '59':'15', + '60':'15', + '59':'16', + '60':'16', + '57':'18', + '58':'19', +} + +def run_import(cr, registry): + env = api.Environment(cr, SUPERUSER_ID, {}) + + machine_model = env['ows.machine'] + product_model = env['product.product'] + training_model = env['ows.machine.training'] + usage_model = env['ows.machine.product'] + + created_training = 0 + created_usage = 0 + + for product_id, machine_id in TRAINING_MAPPING.items(): + machine = machine_model.search([('id', '=', machine_id)], limit=1) + product = product_model.search([('id', '=', product_id)], limit=1) + if machine and product: + training_model.create({ + 'machine_id': machine.id, + 'training_id': product.id, + }) + created_training += 1 + + for product_id, machine_id in USAGE_MAPPING.items(): + machine = machine_model.search([('id', '=', machine_id)], limit=1) + product = product_model.search([('id', '=', product_id)], limit=1) + if machine and product: + usage_model.create({ + 'machine_id': machine.id, + 'product_id': product.id, + }) + created_usage += 1 + + _logger.info(f"[OWS Import] ✅ Trainings-Zuordnungen erstellt: {created_training}, Nutzungs-Zuordnungen erstellt: {created_usage}") + env.cr.commit() + +# Automatischer Start in odoo-bin shell +if 'env' in globals(): + run_import(env.cr, env.registry) \ No newline at end of file diff --git a/scripts/odoo-restore.sh b/scripts/odoo-restore.sh new file mode 100644 index 0000000..b9582c7 --- /dev/null +++ b/scripts/odoo-restore.sh @@ -0,0 +1,34 @@ +#!/bin/bash +BACKUP_DIR=~ # Verzeichnis, in dem das Backup temporär gespeichert wird. +#MONITOR_URL='https://cronitor.link/p/c6debfe4e00f46fe9eb430ab9d2b2588/7PPIpd' # Cronitor-URL zur Überwachung des Skriptstatus. +ODOO_DATABASE=hobbyhimmel # Der Name der Odoo-Datenbank, die wiederhergestellt werden soll. +DEFAULT_URL="http://hobbybackend2.fritz.box:9013" # Standard-URL für die Odoo-Datenbank-Backup-API. +URL="${1:-$DEFAULT_URL}" # Falls ein Argument übergeben wird, wird es als URL genutzt, sonst bleibt die Standard-URL. +BACKUP_NAME=${ODOO_DATABASE}.$(date +%F).zip # Der Name der Backup-Datei, wobei das aktuelle Datum an den Namen angehängt wird. + +# Function to report failure to Cronitor with step +# Diese Funktion meldet einen Fehler an Cronitor und beendet das Skript. +# Parameter: $1 - Der Schrittname, der beim Fehlschlag gemeldet wird. +report_failure() { + local step=$1 # Schrittname wird als erster Parameter übergeben. + #curl "$MONITOR_URL?state=fail&message=$step" # Meldet den Fehlerstatus an Cronitor. + exit 1 # Beendet das Skript mit Exit-Code 1 (Fehler). +} + + +curl -X POST -s \ + -F "master_pwd=${ADMIN_PASSWORD}" \ + -F "name=${ODOO_DATABASE}" \ + ${URL}/web/database/drop || report_failure "Database deletion" + +curl \ + -F "master_pwd=${ADMIN_PASSWORD}" \ + -F "name=${ODOO_DATABASE}" \ + -F "backup_file=@${BACKUP_DIR}/${BACKUP_NAME}" \ + -F "backup_format=zip" \ + -F "copy=true" \ + ${URL}/web/database/restore || report_failure "Database restoration" + +# If everything was successful, report completion +# Meldet den erfolgreichen Abschluss des Skripts an Cronitor. +#curl "$MONITOR_URL?state=complete"