#!/bin/bash
# cisco-profil-reset - legt das Profilverzeichnis des Cisco Secure Client
# beiseite, damit der Client beim naechsten Verbinden ein frisches Profil
# anlegt.
#
# Dieser Teil laeuft mit den Rechten des angemeldeten Benutzers und
# uebernimmt saemtliche Dialoge. Nur die eigentliche Umbenennung wird per
# pkexec an /usr/lib/cisco-profil-reset/helper abgegeben. Dadurch
# erscheint genau eine Passwortabfrage, und zenity laeuft immer in einer
# Umgebung, in der es den Bildschirm auch erreicht.

set -euo pipefail

BIBLIOTHEK="/usr/lib/cisco-profil-reset/lib.sh"
HELFER="/usr/lib/cisco-profil-reset/helper"
TITEL="Cisco VPN-Profil zurücksetzen"

# zenity 3 (Ubuntu 22.04) und zenity 4 (24.04) unterscheiden sich in vielen
# Optionen. Hier wird nur der Teil verwendet, den beide beherrschen:
# --question, --info und --error mit --title, --text und den Labels.
melde_fehler() {
    zenity --error --title="$TITEL" --text="$1" 2>/dev/null || true
    exit 1
}

melde_info() {
    zenity --info --title="$TITEL" --text="$1" 2>/dev/null || true
}

frage() {   # frage <text> <ok-label>
    zenity --question --title="$TITEL" \
           --ok-label="$2" --cancel-label="Abbrechen" \
           --text="$1" 2>/dev/null
}

# Ohne zenity gibt es keinen Weg, dem Benutzer etwas zu zeigen. Das Programm
# wird per Menueeintrag ohne Terminal gestartet, die Meldung sieht also nur,
# wer es von Hand aufruft - mehr ist an dieser Stelle nicht moeglich.
if ! command -v zenity >/dev/null 2>&1; then
    echo "cisco-profil-reset: zenity ist nicht installiert." >&2
    exit 1
fi

if [ ! -r "$BIBLIOTHEK" ]; then
    melde_fehler "Die Installation ist unvollständig: $BIBLIOTHEK fehlt.

Bitte das Paket cisco-profil-reset neu installieren."
fi
# shellcheck source=../lib/cisco-profil-reset/lib.sh
. "$BIBLIOTHEK"

# Kann nur passieren, wenn das Paket mit "dpkg -i" ohne Aufloesung der
# Abhaengigkeiten installiert wurde.
if ! command -v pkexec >/dev/null 2>&1; then
    melde_fehler "Das Hilfsprogramm pkexec wurde nicht gefunden.

Es wird benötigt, um das Profil mit Administratorrechten beiseitezulegen.
Bitte das Paket „pkexec“ beziehungsweise „policykit-1“ installieren."
fi

if [ ! -x "$HELFER" ]; then
    melde_fehler "Die Installation ist unvollständig: $HELFER fehlt oder ist nicht ausführbar.

Bitte das Paket cisco-profil-reset neu installieren."
fi

if ! zielverzeichnis=$(profilverzeichnis_finden); then
    melde_fehler "Es wurde kein Profilverzeichnis des Cisco Secure Client gefunden.

Gesucht wurde an diesen Stellen:

$(printf '%s\n' "${STANDARD_PFADE[@]}")

Ist der Client auf diesem Rechner installiert? Falls das Verzeichnis woanders liegt, lässt es sich in $CONFIG_DATEI eintragen."
fi

# Anzahl der Einträge nur zur Information im Dialog. Schlägt die Abfrage
# fehl (etwa weil das Verzeichnis nicht lesbar ist), wird der Satz
# weggelassen statt eine falsche Zahl anzuzeigen.
set +e
anzahl=$(find "$zielverzeichnis" -mindepth 1 -maxdepth 1 2>/dev/null | wc -l)
set -e
if [ -n "${anzahl:-}" ] && [ "$anzahl" -gt 0 ] 2>/dev/null; then
    inhalt="Es enthält derzeit $anzahl Einträge."
else
    inhalt=""
fi

if ! frage "Soll das VPN-Profil des Cisco Secure Client zurückgesetzt werden?

$zielverzeichnis

$inhalt

Das Verzeichnis wird nicht gelöscht, sondern mit Datum und Uhrzeit im Namen umbenannt. An seiner Stelle entsteht ein neues, in das der Client beim nächsten Verbinden ein frisches Profil legt. Die Schema-Dateien des Clients bleiben erhalten.

Rückgängig machen lässt sich das, indem die Sicherung wieder zurückbenannt wird.

Für diesen Schritt wird Ihr Passwort abgefragt." "Profil zurücksetzen"; then
    # Abbrechen oder Fenster geschlossen - kein Grund fuer eine Meldung.
    exit 0
fi

# Laeuft der Dienst, wird das Profil im laufenden Betrieb weggezogen. Der
# Benutzer entscheidet, ob der Dienst dafuer kurz angehalten wird.
argumente=()
if dienst_laeuft; then
    if ! frage "Der Cisco-Dienst ($DIENST) läuft gerade.

Damit das Profil sauber beiseitegelegt werden kann, sollte der Dienst kurz beendet und anschließend wieder gestartet werden.

Achtung: Eine bestehende VPN-Verbindung wird dabei getrennt.

Abbrechen beendet das Programm, ohne etwas zu verändern." "Dienst beenden und fortfahren"; then
        exit 0
    fi
    argumente=(--dienst)
fi

set +e
sicherung=$(pkexec "$HELFER" "${argumente[@]}" 2>/dev/null)
ergebnis=$?
set -e

# Sobald der Helfer einen Pfad gemeldet hat, ist die Sicherung angelegt -
# auch wenn danach noch etwas schiefgegangen ist.
if [ -n "$sicherung" ]; then
    wo="

Die Sicherung liegt unter:

$sicherung"
else
    wo=""
fi

case "$ergebnis" in
    0)
        melde_info "Das VPN-Profil wurde zurückgesetzt.$wo

Beim nächsten Verbinden legt der Cisco Secure Client ein frisches Profil an."
        ;;
    "$EXIT_NICHT_GEFUNDEN")
        melde_fehler "Das Profilverzeichnis wurde nicht gefunden.

Es wurde nichts verändert."
        ;;
    "$EXIT_ZIEL_EXISTIERT")
        melde_fehler "Es gibt bereits eine Sicherung mit demselben Namen.

Es wurde nichts verändert. Bitte in einer Minute erneut versuchen oder die vorhandene Sicherung zuerst umbenennen."
        ;;
    "$EXIT_MV_FEHLER")
        melde_fehler "Das Profilverzeichnis konnte nicht umbenannt werden.

Möglicherweise ist das Dateisystem schreibgeschützt oder voll. Es wurde nichts verändert."
        ;;
    "$EXIT_KEIN_ROOT")
        melde_fehler "Das Hilfsprogramm wurde ohne Administratorrechte gestartet.

Es wurde nichts verändert."
        ;;
    "$EXIT_DIENST_STOPP")
        melde_fehler "Der Dienst $DIENST konnte nicht beendet werden.

Es wurde nichts verändert."
        ;;
    "$EXIT_ERSATZ_FEHLER")
        melde_fehler "Das Profil wurde beiseitegelegt, aber das leere Ersatzverzeichnis konnte nicht angelegt werden.$wo

Bitte das Verzeichnis $zielverzeichnis von Hand anlegen, sonst findet der Client keine Ablage für ein neues Profil."
        ;;
    "$EXIT_SCHEMA_FEHLER")
        melde_fehler "Das Profil wurde zurückgesetzt, aber die Schema-Dateien des Cisco-Clients konnten nicht zurückgelegt werden.$wo

Bitte die Dateien mit der Endung .xsd aus der Sicherung nach $zielverzeichnis kopieren."
        ;;
    "$EXIT_DIENST_START")
        melde_fehler "Das Profil wurde erfolgreich zurückgesetzt, aber der Dienst $DIENST konnte nicht wieder gestartet werden.$wo

Bitte den Rechner neu starten oder den Dienst von Hand starten:
sudo systemctl start $DIENST"
        ;;
    "$EXIT_CONFIG")
        melde_fehler "Die Konfiguration in $CONFIG_DATEI ist nicht gültig.

Bitte hinter PROFILVERZEICHNIS= einen vollständigen Pfad eintragen, der mit / beginnt."
        ;;
    126)
        # Passwortabfrage weggeklickt - der Benutzer hat sich entschieden.
        exit 0
        ;;
    127)
        melde_fehler "Die Anmeldung ist fehlgeschlagen, oder das Hilfsprogramm konnte nicht gestartet werden.

Es wurde nichts verändert."
        ;;
    *)
        melde_fehler "Unerwarteter Fehler (Rückgabewert $ergebnis).$wo"
        ;;
esac

exit 0
