das würde ich nun nicht so sagen. Dass mir nur das eingefallen ist, bedeutet ja noch lange nicht, daß in den Tiefen des Netzes nicht schon irgendwas vorhanden ist. Aber das muss ich dir ja eigentlich nicht sagen…
Hallo megavolt,
danke, sehr schön. Vor einem umfangreicheren Test habe ich aber noch zwei Fragen:
ueberpruefe_abhaengingkeiten() ist ja bis auf die Überprüfung von zenity noch relativ wirkungslos. Also wirkungslos in dem Sinne, daß es zwar abprüft, ob tr, sed und pamac vorhanden sind, aber bei nichtvorhandensein wirft es keinen Fehler.
Das ist wohl noch dem beta-Stadium geschuldet?
das zweimalige Aufrufen von ueberpruefe_abhaengingkeiten(), einmal in sicherung() und nochmals in installieren() halte ich für “zuviel”.
Wenn schon, dann würde ich es nur einmal in Menu aufrufen, vor der while [ 1 ] Endlosschleife, denn wenn da was fehlt kann man eigentlich gleich abbrechen.
Für solche Endlosschleifen bevorzuge ich while true
aber das ist dann wirklich persönliche Geschmacksfrage.
Um ehrlich zu sein, hab ich ueberpruefe_abhaengingkeiten() am Ende nur so dahin geschmiert. Muss da eine Bedingung mit einbauen, hast du schon Recht, sonst erfüllt die Funktion ihren Zweck nicht
Naja… das Überprüfen dauert ja nichtmal 1sec, wenn es wirklich läuft. Hier hab ich 2x 1.5sek Wartezeit mit eingebaut, damit man den Text auch lesen kann xD Normalerweise würde man ja auf dem einen System sichern und auf einem anderen System wiederherstellen. Also bei 2 Systemen machen 2 Überprüfungen schon Sinn…
Tja, die Funktion ueberpruefe_abhaengingkeiten() ist ausbaufähig… und wie gesagt, das hab ich innerhalb eines Abends geschrieben. Man sollte da keine Wunder erwarten Ohne GUI wäre das schon längst fertig xD
So hab das Skript um eine Dateiauswahl erweitert, Abhängigkeiten werden jetzt bei jedem Aufruf des Hauptmenüs geprüft, wenn Eine fehlt, ein Fehler angezeigt und nicht nur bei Auswahl von Sicherung oder Installieren (wie von @gosia vorgeschlagen )
Falls jemand konkrete Vorschläge hat, was verbessert werden sollte, gerne mal hier posten
#!/bin/bash -x
#exec 2>/dev/null # nervige Fehlermeldungen entfernen...
# /////////////////////////////////////////////////////////////// #
# In Planung
# /////////////////////////////////////////////////////////////// #
# > Paketliste vergleichen, damit nur nicht vorhandene Pakete installierten werden.
# > Methode suchen, wie die Pamac Routine ausgelesen und gefiltert werden kann.
# > Funktion um Konfigurationsdateien zu speichern und Pfade aus einer Datei zu lesen.
# > Bei Abbrechen nicht zum Hauptmenü gehen, sondern Beenden.
# /////////////////////////////////////////////////////////////// #
# Zenity Funktionen
# /////////////////////////////////////////////////////////////// #
warnung() {
zenity --warning \
--width="$warnung_breite" \
--height="$warnung_hoehe" \
--text="$warnung_text" \
--title="$warnung_titel" \
"$@"
}
info() {
zenity --info \
--width="$info_breite" \
--height="$info_hoehe" \
--text="$info_text" \
--ok-label="$info_ok" \
"$@"
}
frage() {
zenity --question \
--width="$frage_breite" \
--height="$frage_hoehe" \
--title="$frage_titel" \
--text="$frage_text" \
--ok-label="$frage_ok" \
--cancel-label="$frage_abbrechen" \
"$@"
}
checkliste() {
zenity --list --checklist \
--width="$checkliste_breite" \
--height="$checkliste_hoehe" \
--column="$checkliste_spalte1" \
--column="$checkliste_spalte2" \
--title="$checkliste_titel" \
--ok-label="$checkliste_ok" \
$checkliste_text \
"$@"
}
radio() {
zenity --list --radiolist \
--width="$radio_breite" \
--height="$radio_hoehe" \
--title="$radio_titel" \
--text="$radio_text" \
--column="$radio_spalte1" \
--column="$radio_spalte2" \
$(echo $radio_optionen) \
"$@"
}
datei() {
if [[ "$datei_speichern" == "ja" ]]
then
local speichern="--save"
elif [[ "$datei_speichern" == "nein" ]]
then
local speichern=" "
fi
if [[ "$datei_mehrmals" == "ja" ]]
then
local mehrmals="--multiple"
elif [[ "$datei_mehrmals" == "nein" ]]
then
local mehrmals=" "
fi
if [[ "$datei_ueberschreiben" == "ja" ]]
then
local ueberschreiben="--confirm-overwrite"
elif [[ "$datei_ueberschreiben" == "nein" ]]
then
local ueberschreiben=" "
fi
if [[ "$datei_verzeichnis" == "ja" ]]
then
local verzeichnis="--directory"
elif [[ "$datei_verzeichnis" == "nein" ]]
then
local verzeichnis=" "
fi
zenity --file-selection \
$speichern \
$ueberschreiben \
$verzeichnis \
--title="$datei_titel" \
--filename="$datei_dateiname" \
"$@"
}
fortschritt(){
if [[ "$fortschritt_automatisch_schliessen" == "ja" ]]
then
local automatisch_schliessen="--auto-close"
elif [[ "$fortschritt_automatisch_schliessen" == "nein" ]]
then
local automatisch_schliessen=""
fi
if [[ "$fortschritt_automatisch_toeten" == "ja" ]]
then
local automatisch_toeten="--auto-kill"
elif [[ "$fortschritt_automatisch_toeten" == "nein" ]]
then
local automatisch_toeten=""
fi
zenity --progress \
$automatisch_schliessen \
$automatisch_toeten \
--width="$fortschritt_breite" \
--height="$fortschritt_hoehe" \
--text="$fortschritt_text" \
--title="$fortschritt_titel" \
--ok-label="$fortschritt_ok" \
"$@"
}
# /////////////////////////////////////////////////////////////// #
# SICHERUNG
# /////////////////////////////////////////////////////////////// #
sicherung() {
local checkliste_spalte1="Auswahl"
local checkliste_spalte2="Pakete"
local checkliste_titel="Paketliste"
local checkliste_ok="Sichern"
local checkliste_hoehe="400"
local checkliste_breite="400"
local checkliste_text=$(echo "$(pamac list --installed --quiet)" | sed -e "s/^/TRUE /g" | tr "\n" " ")
local datum=$(date +%Y-%m-%d-%H:%M:%S)
local codename=$(lsb_release -c | sed -r "s/.+:\s+//g")
local version=$(lsb_release -r | sed -r "s/.+:\s+//g")
local datei_dateiname="$datum-$version-$codename-paketliste.txt"
local datei_titel="Wo willst du deine Paketliste speichern?"
local datei_ueberschreiben="ja"
local datei_verzeichnis="nein"
local datei_mehrmals="nein"
local datei_speichern="ja"
local pakete=$(checkliste)
local dateipfad=$(datei)
echo "$pakete" > $dateipfad
}
# /////////////////////////////////////////////////////////////// #
# INSTALLIEREN
# /////////////////////////////////////////////////////////////// #
installieren() {
local datei_titel="Wähle deine Paketliste..."
local datei_ueberschreiben="nein"
local datei_verzeichnis="nein"
local datei_mehrmals="nein"
local datei_speichern="nein"
local dateipfad=$(datei)
local pakete=$(echo "$dateipfad")
local checkliste_spalte1="Auswahl"
local checkliste_spalte2="Pakete"
local checkliste_titel="Paketliste"
local checkliste_ok="Installieren"
local checkliste_hoehe="400"
local checkliste_breite="400"
local checkliste_text=$(cat $pakete | tr "|" "\n"| sed -e "s/^/TRUE /g" | tr "\n" " ")
local fortschritt_automatisch_schliessen="ja"
local fortschritt_automatisch_toeten="ja"
local fortschritt_hoehe="100"
local fortschritt_breite="400"
local fortschritt_titel="Bitte warten..."
local fortschritt_text="Pakete werden installiert"
local fortschritt_ok="Hauptmenü"
(
for x in $(checkliste | tr "|" " " | sed -r "s/([a-z0-9-]+)/\"\\1\"/g")
do
echo "# Installiere $x"; sleep 0.3
echo "# pamac install --noconfirm $x"; sleep 0.2
done
) | fortschritt --pulsate
}
#case $1 in
# -i) installieren;;
# -s) sicherung;;
# *) echo "NIX"; exit1 ;;
#esac
# /////////////////////////////////////////////////////////////// #
# ÜBERPRÜFE ABHÄNGIKEITEN FÜR DIESES SKTIPT
# /////////////////////////////////////////////////////////////// #
ueberpruefe_abhaengingkeiten(){
if [ -z $(which zenity) ]; then echo "Installiere zuerst zenity." && break ; fi
local fortschritt_automatisch_schliessen="ja"
local fortschritt_automatisch_toeten="ja"
local fortschritt_hoehe="100"
local fortschritt_breite="400"
local fortschritt_titel="Bitte warten..."
local fortschritt_text="Abhängigkeiten werden überprüft"
local fortschritt_ok="Weiter"
(
local programme=("tr" "sed" "pamac")
for x in ${programme[@]}
do
echo "# Überprüfe $x"; sleep 0.3
echo "# $x : $(which $x)"; sleep 0.2
local info_breite="300"
local info_hoehe="80"
local info_text="Installiere zuerst <b>$x</b>"
local info_ok="Beenden"
if [ -z $(which $x) ]; then info && exit && break; fi
done
) | fortschritt --pulsate
}
# /////////////////////////////////////////////////////////////// #
# Menu
# /////////////////////////////////////////////////////////////// #
while [ 1 ]
do
ueberpruefe_abhaengingkeiten
radio_titel="Hauptmenü"
radio_text="Wähle..."
radio_spalte1="Auswahl"
radio_spalte2="Aktion"
radio_optionen="FALSE Sicherung FALSE Installieren FALSE Beenden"
radio_hoehe="180"
radio_breite="100"
menu=$(radio)
if [ $? -eq 1 ]; then break; fi
info_breite="300"
info_hoehe="80"
info_text="Entschuldigung, was wolltest du nochmal?"
info_ok="Hauptmenü"
case $menu in
"Sicherung") sicherung ;;
"Installieren") installieren ;;
"Beenden") break ;;
*) info ;;
esac
done
Hi, vielleicht ist es nicht ganz das was du suchst, ich hinterlasse das aber hier mal als Idee:
Da ich mehrere Rechner habe, betreue und auf allen möglichst immer die gleichen base packages und settings haben möchte, habe ich mir Pakete und Skripte erstellt, welche das für mich übernehmen.
Mache ich eine Änderung an meinem System, z.B. eine Paketinstallation, trage ich dieses Paket als Abhängigkeit in mein setup package ein. Dann nur noch das neue package in meine Paketquelle hochladen, welche sich mit dem install Skript automatisch auf allen Rechnern hinzugefügt hat und alle bekommen bei dem nächsten Update automatisch die neuen Änderungen / Pakete.
Eine Neuinstallation ist damit auch recht einfach. Nach der frischen Manjaro Installation führe ich mein install script aus, welches meine Paketquelle und mein Setup Paket installiert. Damit richtet sich das meiste auf System Ebene automatisch ein und es ist wie zuvor.
(installierte Pakete, Hotkeys, Änderungen in Konfigurationsdateien, … alles ist möglich )
Hier findest du meinen code, vielleicht hilft es dir dabei, etwas für deine Zwecke zu bauen:
Danke @anon36603275 … stimmt hast du mir ja mal erzählt, dass du es so verwaltest. Eigentlich sehr schlau gemacht. Eine Neuinstallation und mit Meta-Paketen und einer eigenen Repo zu machen, die dann auch noch weiter aktualisiert werden kann. Da es nur Text-Dateien sind reicht eine Github Account aus.
Hab es mir jetzt mal gründlich angesehen und mir Gedanken gemacht. Man kann es so machen, wenn man nur auf Arch-basierten Systemen arbeitet, aber ich würde es doch gerne ein wenig einfacher machen. Wenn ich mich nur auf die Paketnamen konzentriere und eine Distro-Erkennung einbaue, würde es auch mit anderen Paket-Managern wie apt oder dnf laufen.
Auch würde ich das lieber lokal sichern. Es soll nur eine “Datenbank-Datei” sein.
Grossartig. Ich habe das Script auf meinem Testrechner laufen lassen. Das läuft fehlerfrei durch und gefällt. Nun die Herkulesfrage. Ich möchte dieses Script auf Eigene Gefahr produktiv nutzen. Kannst Du mir die Zeilen hinzufügen/ändern, damit dieses Script auf dem neuen Rechner dann auch wirklich Daten auf die Platte schreibt. ?
Dafür wäre ich Dir sehr dankbar.
Haha, ich hab das “wird nur simuliert” irgenwie ganz überlesen!
Hab gestern mein System neu aufgesetzt und mir vorher ja so gedacht ich hab ja das coole Skript von @megavolt. Nach der Neuinstallaion hab ich dem Skript gespannt beim installieren zugesehen und mit der Zeit erst gemerkt das es nix installiert.
Naja zumindest hatte ich ne schöne Liste mit den Paketen die installiert waren (1944 Stück) und musste die nur noch mit den Paketen vergleichen die nach der Neuinstallation schon installiert waren (1242 Stück). Mit nem Editor macht das keinen Spaß. Und mit dem bash-scripting bin ich auch noch nicht so firm.
Daher hab ich hier mal für den Fall ein php-Skript zusammen geschustert:
Vielleicht hilft es jemanden weiter. Es muss dann nur noch eine Sicherungsdatei mit @megavolts Skript von der neuen Installation gemacht werden und der Dateiname im Skript angepasst werden($file(Old/New)Install). Es arbeitet im home-Verzeichnis des ausführenden Benutzers und Speichert auch dort die Ausgabe.
Achso, die Ausgabedatei zeigt nur die Pakete die noch zur vorherigen Installation fehlen. Im selben Format wie @megavolts Sicherungsdatei.
P.S. Wer eine Liste mit Zeilenumbrüchen braucht anstatt | als Trenner muss folgendes ändern:
Schön, dass es dir gefällt. Aber im Moment bin ich leider schwer beschäftigt (und auch nicht Zuhause). Ich habe hier und da an dem Script weitergearbeitet, wenn ich Zeit hatte, aber fertig ist es nicht.
War dabei eine libzenity zu schreiben, die das schreiben von zenity GUIs vereinfachen soll.
Ja hast Recht, ich war auf der Suche nach eine einfachen Methode zwei Listen zu vergleichen. Wenn das fertig ist, dann lässt sich der Rest der Installation auch einfach implementieren. Werde dann erneut ein Update machen.
@kisun Haha ich habe eher an diff gedacht wegen dem Vergleichen aber ein for loop sollte auch klappen Man, hab da nicht dran gedacht… Danke für dein inspirierenden PHP-Skript
Jedenfalls @kisun und @ondara, wenn ich wieder daheim bin (was wahrscheinlich nächste Woche sein wird), dann werde ich das Skript vervollständigen, damit es zumindest die Basis-Funktion erfüllt: Paketliste speichern und Paketliste installieren
Und danke für euer Interesse. Das motiviert mich jetzt doch, das mal fertig zu schreiben
Aber ich hätte da noch eine Idee. Man könnte noch ein ‘chroot’ einbauen. Damit man nach der Neuinstallation und vor dem Neustart das Skript noch durchlaufen lässt und fehlendes installiert.
Somit wäre dann nach dem Neustart schon alles erledigt.
Möglich, aber das sollte aber in erste Linie ein grafisches Werkzeug sein. Wenn du was für die Kommandozeile brauchst, dann schau dir ALIS. Ist zwar für Archlinux geschrieben, aber sollte mit wenigen Veränderungen auch unter Manjaro funktionieren:
Ich hab den Thread hier nicht vergessen, aber wenn einen die Lust daran vergangen ist, dann fehlt einfach die Motivation weiter zu machen. Es ist auch nur ein Hobby-Projekt in meiner Freizeit.
Es gibt keine weiteren Aktualisierungen zu dem Skript, aber ich hab mich entschieden ein Repo zu erstellen.
Planung fürs erste:
Script in Englisch übersetzen
Gettext für Spracheausgabe implementieren.
Werde hier auch in Zukunft denke ich mal weiter Bestrebungen veröffentlichen, wenn Zeit und Lust da ist. Falls jemand mitarbeiten will, der kann sich ja melden.
Hab vergessen mich hier zurück zu melden. Also an alle die interessiert sind, habe ich das vollständige und voll funktionsfähige Skript hier hochgeladen, dass schon einige Monate im Einsatz war.
Ebenfalls habe ich eine Möglichkeit eingebaut Übersetzungen anzufertigen. Ich wollte es als eine Datei belassen, also müsst ihr die Datei einfach kopieren und eine andere Sprache als Deutsch eintragen. Im Grunde sind es alle Variablen, die mit “Gui” beginnen.
Lässt sich ebenfalls so von der Kommandozeile ausführen:
Aber ich hätte da noch eine Idee. Man könnte noch ein ‘chroot’ einbauen. Damit man nach der Neuinstallation und vor dem Neustart das Skript noch durchlaufen lässt und fehlendes installiert.
das wäre eine neue Funktion, woran ich nicht arbeiten werde, aber wenn du diese Funktion haben willst, dann steht es dir frei den Skript zu erweitern. Kannst mir ja ein Patch zukommen lassen