#!/bin/bash # Script zur Transformation und zum Export von Projekten mit OpenRefine # Variante "Komfort", Stand: 08.01.2017 # # Voraussetzungen: # 1. Docker # 2. OpenRefine-Projekte im Arbeitsverzeichnis # # Nutzung Variante A) # IDs der zu verarbeitenden Projekte an den Startbefehl anhängen. # Beispiel: ./transform+export.sh 01234567890123 1234567890123 # # Nutzung Variante B) # Codewort manuell in OpenRefine in den Namen der zu verarbeitenden Projekten aufnehmen # und Script ohne weitere Parameter starten. # Beispiel: ./transform+export.sh codewort="TRANSFORM" # Transformationsregeln aus den folgenden Dateien werden (in dieser Reihenfolge) durchgeführt jsonfiles=(07_3.json 07_5_minimal.json) # Weitere Programmvariablen workdir="/home/stud/refine" port=8888 ram=3G # Variablen ausgeben echo "Transformationsdateien: " ${jsonfiles[@]} echo "Arbeitsverzeichnis: " ${workdir} echo "OpenRefine auf Port: " ${port} echo "OpenRefine max. RAM: " ${ram} echo "Codewort: " ${codewort} echo "" # Startzeitpunkt ausgeben echo "Startzeitpunkt: $(date)" echo "" # Transformationsdateien ins Arbeitsverzeichnis laden echo "Transformationsdateien herunterladen..." cd ${workdir} for jsonfile in "${jsonfiles[@]}" ; do curl -O https://felixlohmeier.gitbooks.io/seminar-wir-bauen-uns-einen-bibliothekskatalog/content/openrefine/${jsonfile} done cd - > /dev/null echo "" # Server starten echo "Server starten..." sudo docker run -d --name=refine-server -p ${port}:3333 -v ${workdir}:/data felixlohmeier/openrefine:2.6rc1 -i 0.0.0.0 -m ${ram} -d /data echo "" # Warten bis Server vollständig gestartet ist until curl --silent -N http://localhost:${port} | cat | grep -q -o "OpenRefine" ; do sleep 1; done # Abfrage der Projekt-IDs, wenn mit dem Startbefehl keine benannt wurden if [ -z "$1" ] then echo "Es wurden beim Aufruf des Scripts keine Projekt-IDs benannt." echo "" echo "Projekt-IDs auslesen..." projects=($(sudo docker run --rm --link refine-server -v ${workdir}:/data felixlohmeier/openrefine:client-py | grep "${codewort}" | cut -c 2-14)) if [ -z "$projects" ] then echo "*** Es konnten keine Projekte gefunden werden! ***" echo "" echo "Sie haben zwei Möglichkeiten Projekte zur Verarbeitung zu benennen:" echo "1. an den Startbefehl des Scripts die IDs der zu verarbeitenden Projekte anhängen" echo "Beispiel: ./transform+export.sh 01234567890123 1234567890123" echo "" echo "2. Das Codewort ${codewort} manuell in OpenRefine in den Namen der zu verarbeitenden Projekten aufnehmen und das Script erneut starten." echo "" echo "Server beenden und Container löschen..." sudo docker stop refine-server sudo docker rm refine-server exit else echo "Folgende Projekte im Arbeitsverzeichnis tragen das Codewort ${codewort} im Namen:" echo ${projects[@]} echo "" fi else echo "Folgende Projekt-IDs wurden beim Aufruf des Scripts benannt:" projects=($*) echo ${projects[@]} echo "" fi # Server beenden und Container löschen echo "Server beenden und Container löschen..." sudo docker stop refine-server sudo docker rm refine-server echo "" # Schleife für Transformation und Export der Projekte for projectid in "${projects[@]}" ; do echo "Start Projekt $projectid @ $(date)" # Server starten echo "Server starten..." sudo docker run -d --name=refine-server -p ${port}:3333 -v ${workdir}:/data felixlohmeier/openrefine:2.6rc1 -i 0.0.0.0 -m ${ram} -d /data # Warten bis Server vollständig gestartet ist until curl --silent -N http://localhost:${port} | cat | grep -q -o "OpenRefine" ; do sleep 1; done echo "" # Transformationen durchführen for jsonfile in "${jsonfiles[@]}" ; do echo "Transformiere mit ${jsonfile}..." # Meldungen aus Docker-Container refine-server ausgeben (Hintergrundprozess) sudo docker attach refine-server & # Transformation mit Python-Client anstoßen sudo docker run --rm --link refine-server -v ${workdir}:/data felixlohmeier/openrefine:client-py -f ${jsonfile} ${projectid} # Statistik des Java-Prozesses echo "Statistik zum Ressourcenverbrauch..." ps -o start,etime,%mem,%cpu,rss -C java # Neustart des Docker-Containers refine-server nach jeder Transformation, um Arbeitsspeicher zu schonen echo "Projekt speichern und Server neu starten ..." sudo docker stop -t=5000 refine-server sudo docker rm refine-server sudo docker run -d --name=refine-server -p ${port}:3333 -v ${workdir}:/data felixlohmeier/openrefine:2.6rc1 -i 0.0.0.0 -m ${ram} -d /data until curl --silent -N http://localhost:${port} | cat | grep -q -o "OpenRefine" ; do sleep 1; done echo "" done # Daten exportieren echo "Exportiere in ${projectid}.tsv" sudo docker run --rm --link refine-server -v ${workdir}:/data felixlohmeier/openrefine:client-py -E --output=${projectid}.tsv ${projectid} # Server beenden und Container löschen echo "Server beenden und Container löschen..." sudo docker stop -t=5000 refine-server sudo docker rm refine-server echo "Ende Projekt $projectid @ $(date)" echo "" done # Endzeitpunkt ausgeben echo "Endzeitpunkt: $(date)" echo "" # Liste der exportierten Dateien echo "Folgende Dateien wurden erfolgreich exportiert:" echo "(Anzahl der Zeilen und Dateigröße in Bytes)" wc -l -c ${workdir}/*.tsv