Automatisches aktualisieren vorhandener Configs + Generator

Hallo zusammen,

hier noch ein kleines Script für den ein oder anderen.

Ab und an werden die Config-Files von PP ja aktualisiert, daraufhin lädt man sich diese erneut herunter, schreibt mindestens die Zeile neu, welche auf die Datei mit den Credentials verweist und kopiert sich anschließend die neuen Dateien an die korrekte Stelle.

Mit diesem Script erspart ihr euch die o.g. Arbeit:
Bash:
#!/bin/bash
#
### Variablen deklarieren ###
#
# Pfad zu den produktiven Configs (Angabe OHNE '/' am Ende)
conf_path=/etc/openvpn
#
# Downloadpfad zu den gewünschten Config-Files
dl_link_conf=https://www.perfect-privacy.com/downloads/openvpn/get?system=linux
#
### ENDE Variablen deklarieren ###

### HAUPTPROGRAMM ###

# Arbeitsverzeichnis anlegen
mkdir "$conf_path"'/'"temp_dir"

# Download der Konfigurationen in das neu angelegte Verzeichnis
wget -P "$conf_path"'/'"temp_dir" --content-disposition $dl_link_conf

# Dateinamen der heruntergeladenen Datei ermitteln und als Variable sichern
arc_name=$(ls -t "$conf_path"'/'"temp_dir")

# Entpacken der heruntergeladenen Datei
unzip -j "$conf_path"'/'"temp_dir"'/'"$arc_name" -d "$conf_path"'/'"temp_dir"

# Nach saemtlichen Configs suchen, welche momentan verwendet werden und diese in ein Array speichern
mapfile -t used_servers < <(ls -1 "$conf_path"'/'*.conf | sed 's/,//g' | rev | cut -d '/' -f 1 | rev)

# Auslesen eines Conf-Files, um den Pfad zur Passwort-Datei zu ermitteln
cur_pwd_path=$(grep -m 1 auth-user-pass "$conf_path"'/'"${used_servers[0]}")

# Hinzufügen des Auth-Datei-Pfads zu den neuen Dateien
find "$conf_path"'/'"temp_dir"'/'*.conf -type f -exec sed -i "/auth-user-pass/c $cur_pwd_path" {} \;


##### BEI BEDARF -> Hinzufuegen weiterer Parameter (z.B. MTU-Size) #####

##############################################################################################
# Hinzufügen der MTU-Anpassung zu den neuen Dateien (mssfix)                                 #
# find "$conf_path"'/'"temp_dir"'/'*.conf -type f -exec sed -i "/mssfix/c mssfix 1412" {} \; #
##############################################################################################

# loeschen der bisher produktiven Dateien
rm -r "$conf_path"'/'*.conf

# Anzahl der verwendeten Configs zaehlen
used_servers_count="${#used_servers[@]}"

# Die verwendeten Configs in das produktive Verzeichnis kopieren
for (( i=0; i<used_servers_count; i++ ))
do
    cp "$conf_path"'/'"temp_dir"'/'"${used_servers[i]}" "$conf_path"
done

# Aufraeumen (Arbeitsverzeichnis loeschen)
rm -r "$conf_path"'/'"temp_dir"
Anpassungen:
  • die Variablendeklaration befindet sich im Kopf des Scripts
  • das Verzeichnis zu den produktiven Configs hinter 'conf_path=' angeben
  • den Pfad zur gewünschten zip-Datei hinter 'dl_link_conf=' angeben

Typisches vorgehen wieder:
  • den Code als Datei (z.B. upd_conf.sh) auf dem System speichern (z.B. im home-Dir des Nutzers)
  • Datei ausführbar machen: sudo chmod +x "DATEINAME" (ohne die ")
  • Datei mit erw. Rechten ausführen: sudo ./"DATEINAME" (ohne die ")

Bei Fragen einfach wieder fragen. :)

Zur Sicherheit könnt ihr euch vor dem ersten Test ja die produktiven Configs wegsichern.

Nach Scriptausführung wird selbstverständlich wieder automatisch aufgeräumt.
 
Last edited:
Ist theoretisch möglich, in den Variablen kannst du den Downloadlink zur zip-Datei mit den gewünschten Configs eintragen. Da muss man mal schauen, wie sich der Downloadlink zusammensetzt.

Der hier angegebene link ist lediglich der, welcher auch im tutorial von PP angegeben ist (UDP, Standardports, City's collected).
 
Erweitertes Script

Hallo zusammen,

hier noch eine Erweiterung zu dem o.g. Script.
Folgendes ist neu:
- es wird erkannt, ob sich Configs im Verzeichnis befinden, welches in Zeile 6 des Scripts angegeben wird
- die erste gefundene Config wird anhand des Dateinamens ausgewertet und einer Gruppierung zugeordnet (ohne Zahl hinter dem Städtenamen = City-based / mit Zalhl hinter dem Städtenamen = Server-based)
- die ermittelte Gruppierung wird für die neu herunterzuladenen Dateien festgelegt
- sollte keine Config gefunden werden, kann das Script entweder abgebrochen werden oder die gewünschten COnfigs heruntergeladen
- folgende Parameter können angegeben werden: Protokoll, Verschlüsselung, Gruppierung (bestimmte Protokolle setzen gewisse Gruppierungen voraus, dies wird berücksichtigt -> keine Frage nach Gruppierung)
- Zusammensetzung des Downloadlinks zu den gewünschten Config-Files
- Sicherung der bei Ausführung verwendeten Configs in folgende Verzeichnisstruktur 'conf_path/bkp/(date: YYYYMMDD_HoHoMiMiSeSe'

- saubere Textausgabe
- sauberes Bash-Scripting -> keine Warnungen oder Fehler über (https://www.shellcheck.net/)

Meldet euch, wenn ihr Wünsche habt - ich kann das Script entsprechend erweitern. Dies ist erstmal nur eine grobe Ausrichtung um auch zu ermitteln, ob ihr diese Art der Lösung verwenden möchtet.

Bash:
#!/bin/bash
#
### Variablen deklarieren ###
#
# Pfad zu den produktiven Configs (Angabe OHNE '/' am Ende)
conf_path="/etc/openvpn"
#
# Basispfad zu den Linux-Configs
base_link_conf="https://www.perfect-privacy.com/downloads/openvpn/get?system=linux"
#
### ENDE Variablen deklarieren ###

### Variablen initialisieren ###
protocol=0
cipher=0
scope=0
### ENDE Variablen initialisieren ###

### Funktionen ###
function create_work_dir {
    mkdir "$conf_path"'/'"temp_dir"
}

function download_files {
    clear
    wget --show-progress -P "$conf_path"'/'"temp_dir" --content-disposition "$end_link_conf"
    arc_name=$(ls -t "$conf_path"'/'"temp_dir")
}

function unzip_files_replace {
    unzip -qq -j "$conf_path"'/'"temp_dir"'/'"$arc_name" -d "$conf_path"'/'"temp_dir"
}

function unzip_files_new {
    unzip -qq -j "$conf_path"'/'"temp_dir"'/'"$arc_name" -d "$conf_path"
}

function cleanup {
    rm -r "$conf_path"'/'"temp_dir" 2> /dev/null
}

function bkp_files {
    mkdir "$conf_path"'/'"bkp" 2> /dev/null
    mkdir "$conf_path"'/'"bkp"'/'"$(date +%Y%m%d_%H%M%S)" 2> /dev/null
    cp "$conf_path"'/'*.conf "$_"
}

function user_choice_files {
    clear
    echo -e "Protokoll angeben:\n"
    echo -e "\t1: UDP"
    echo -e "\t2: TCP"
    echo -e "\t3: STEALTH VPN SSH"
    echo -e "\t4: STEALTH VPN Obfsproxy"
    echo -e "\t5: STEALTH VPN SOCKS"
    echo -e "\t6: STEALTH VPN HTTP"
    echo -e "\t7: STEALTH VPN stunnel"

    read -rep  $'\nAuswahl: ' protocol_num

    case "$protocol_num" in
        1)
            protocol=udp
            ;;

        2)
            protocol=tcp
            ;;

        3)
            protocol=stealth_ssh
            scope=server
            ;;

        4)
            protocol=stealth_obfs
            scope=server
            ;;

        5)
            protocol=stealth_socks
            ;;

        6)
            protocol=stealth_http
            ;;

        7)
            protocol=stealth_stunnel
            scope=server
            ;;

        *)
            echo -e "Fehlerhafte Eingabe!\nErneut das Script starten und Eingabe korrigieren!\n"
            exit
            ;;
    esac

    clear
    echo -e "Verschluesselung angeben:\n"
    echo -e "\t1: AES-256-GCM"
    echo -e "\t2: AES-128-GCM"
    echo -e "\t3: AES-256-CBC"
    echo -e "\t4: AES-128-CBC"
    echo -e "\t5: CAMELLIA-256-CBC"
    echo -e "\t6: CAMELLIA-128-CBC"

    read -rep  $'\nAuswahl: ' cipher_num

    case "$cipher_num" in
        1)
            cipher=AES-256-GCM
            ;;

        2)
            cipher=AES-128-GCM
            ;;

        3)
            cipher=AES-256-CBC
            ;;

        4)
            cipher=AES-128-CBC
            ;;

        5)
            cipher=CAMELLIA-256-CBC
            ;;

        6)
            cipher=CAMELLIA-128-CBC
            ;;

        *)
            echo -e "Fehlerhafte Eingabe!\nErneut das Script starten und Eingabe korrigieren!\n"
            exit
            ;;
    esac

    if [[ "$scope" != "server" && "$scope" != "city" ]];
    then
        clear
        echo -e "Gruppierung angeben:\n"
        echo -e "\t1: Stadt"
        echo -e "\t2: Server"

        read -rep  $'\nAuswahl: ' scope_num

        case "$scope_num" in
            1)
                scope=city
                ;;

            2)
                scope=server
                ;;

            *)
                echo -e "Fehlerhafte Eingabe!\nErneut das Script starten und Eingabe korrigieren!\n"
                exit
                ;;
        esac
    fi

    end_link_conf="$base_link_conf"'&protocol='"$protocol"'&cipher='"$cipher"'&scope='"$scope"
}
### ENDE Funktionen ###

### HAUPTPROGRAMM ###
clear

echo -e "PerfectPrivacy Configuration updater (written by PrivateMember)"
echo -e "---------------------------------------------------------------"

echo -e "\nFolgendes Verzeichnis wird verwendet: $conf_path\n"

# Nach saemtlichen Configs suchen, welche momentan verwendet werden und diese in ein Array speichern
mapfile -t used_servers < <(ls -1 "$conf_path"'/'*.conf 2> /dev/null | sed 's/,//g' | rev | cut -d '/' -f 1 | rev)

# Pruefen, ob und welche Configs sich im angegebenen Verzeichnis befinden
if [ "${#used_servers[*]}" -eq "0" ];
then
    echo -e "Keine Configs gefunden!!!\nFalsches Verzeichnis?\n\nBitte conf_path entsprechend anpassen!\n\n"
    echo -e "Was soll gemacht werden?"
    echo -e "\t1: Script beenden"
    echo -e "\t2: Gewuenschte Configs in das angegebene Verzeichnis herunterladen und entpacken"

    read -rep  $'\nAuswahl: ' choice_num

    case "$choice_num" in
        1)
            exit
            ;;

        2)
            create_work_dir
            user_choice_files
            download_files
            unzip_files_new
            cleanup
            clear
            echo -e "Erfolgreich!"
            echo -e "------------"
            echo -e "Die heruntergeladenen Konfigurationen befinden sich im Verzeichnis:\n\n"
            echo -e "\t$conf_path\n\n"
            exit
            ;;

        *)
            echo -e "Fehlerhafte Eingabe!\nErneut das Script starten und Eingabe korrigieren!\n"
            exit
            ;;
    esac

elif [[ "${used_servers[0]}" == *[0-9].conf ]];
then
    scope=server
    echo -e "Es scheinen Server-basierte Configs vorhanden zu sein (nicht gruppiert!)"
    echo -e "Somit werden auch Server-basierte Configs wieder heruntergeladen.\n\n"
    echo -e "Fortfahren? (produktive Configs werden gelöscht und ersetzt)"
    read -rep  $'\n(j)a / (n)ein: ' choice
    if [ "$choice" == "n" ];
    then
        echo -e "Abbruch!"
        exit
    elif [[ "$choice" != "n" && "$choice" != "j" ]];
    then
        echo -e "Eingabe falsch (war nicht 'j' oder 'n')"
        echo -e "Abbruch!"
        exit
    fi
else
    scope=city
    echo -e "Es scheinen Staedte-basierte Configs vorhanden zu sein (gruppiert!)"
    echo -e "Somit werden auch Staedte-basierte Configs wieder heruntergeladen.\n\n"
    echo -e "Fortfahren? (produktive Configs werden gelöscht und ersetzt)"
    read -rep  $'\n(j)a / (n)ein: ' choice
    if [ "$choice" == "n" ];
    then
        echo -e "Abbruch!"
        exit
    elif [[ "$choice" != "n" && "$choice" != "j" ]];
    then
        echo -e "Eingabe falsch (war nicht 'j' oder 'n')"
        echo -e "Abbruch!"
        exit
    fi
fi

# Arbeitsverzeichnis anlegen
create_work_dir

## Usereingabe fuer die gewuenschten Configs
user_choice_files

# Download der Konfigurationen in das neu angelegte Verzeichnis
download_files

# Entpacken der heruntergeladenen Datei
unzip_files_replace

# Auslesen eines Conf-Files, um den Pfad zur Passwort-Datei zu ermitteln
cur_pwd_path=$(grep -m 1 auth-user-pass "$conf_path"'/'"${used_servers[0]}")

# Hinzufügen des Auth-Datei-Pfads zu den neuen Dateien
find "$conf_path"'/'"temp_dir"'/'*.conf -type f -exec sed -i "/auth-user-pass/c $cur_pwd_path" {} \;

##### BEI BEDARF -> Hinzufuegen weiterer Parameter (z.B. MTU-Size) #####

##############################################################################################
# Hinzufügen der MTU-Anpassung zu den neuen Dateien (mssfix)                                 #
# find "$conf_path"'/'"temp_dir"'/'*.conf -type f -exec sed -i "/mssfix/c mssfix 1412" {} \; #
##############################################################################################

# sichern der bisher produktiven Dateien
bkp_files

# loeschen der bisher produktiven Dateien
rm -r "$conf_path"'/'*.conf

# Anzahl der verwendeten Configs zaehlen
used_servers_count="${#used_servers[@]}"

# Die verwendeten Configs in das produktive Verzeichnis kopieren
for (( i=0; i<used_servers_count; i++ ))
do
    cp "$conf_path"'/'"temp_dir"'/'"${used_servers[i]}" "$conf_path"
done

# Aufraeumen (Arbeitsverzeichnis loeschen)
cleanup
clear
echo -e "Erfolgreich!"
echo -e "------------"
echo -e "Die neuen Konfigurationen befinden sich im Verzeichnis:\n\n"
echo -e "\t$conf_path\n\n"
exit
Typisches vorgehen wieder:

  • den Code als Datei (z.B. upd_conf.sh) auf dem System speichern (z.B. im home-Dir des Nutzers)
  • Datei ausführbar machen: sudo chmod +x "DATEINAME" (ohne die ")
  • Datei mit erw. Rechten ausführen: sudo ./"DATEINAME" (ohne die ")
  • Zeile 6 'conf_path' zu den vorhandenen Configs oder einem gewünschten neuen Verzeichnis anpassen
 
Last edited:
Top