#!/bin/bash
# 
# This script is used for Administration of m-privacy Ceph Servers
#
# (c) 2004-2017 m-privacy GmbH, Berlin. All rights reserved.
#
# Last change: 27/Jan/2017 - ao
#
# Make sure we're really running bash.
#
[ -z "$BASH" ] && { echo "This menu requires bash - sorry!" 1>&2; exit 1; }
#
# We also need the proc fs mounted.
[ ! -f /proc/stat ] && { echo "This menu requires proc fs mounted" 1>&2; exit 1; }
#
# Cache function definitions, turn off posix compliance
#
set -h +o posix

# The dir for tmp files
if test -z "$TMPDIR" ; then TMPDIR=/tmp ; fi

# This must be a unique temporary dirname
if ! CONFIGTMPDIR=`mktemp -d $TMPDIR/config-XXXXXX`
then
  if ! CONFIGTMPDIR=`mktemp -d /var/tmp/config-XXXXXX`
  then
    CONFIGTMPDIR=$TMPDIR/config-$$
    if test -e $CONFIGTMPDIR
    then rm -rf $CONFIGTMPDIR
    fi
    mkdir -p -m 700 $CONFIGTMPDIR
  fi
fi
TMPFILE=$CONFIGTMPDIR/temp
TMPFILE2=$CONFIGTMPDIR/temp2
TMPFILE3=$CONFIGTMPDIR/temp3

# set this to bin dirs
#
PATH=/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

# what is the shell for the forwarded users? Only those are chosen!
#
USHELL='/bin/bash'

CUDIR=/etc/cu

MAXTITLELEN=50
MAXDEVLEN=20
MAXCERTAGE=90
MAXCOMMENTLEN=1024

cd /

BACKTITLE="m-privacy Ceph"
TITLE="`whoami`@`hostname`: m-privacy Server-Konfiguration"
ERRTITLE="m-privacy Server-Konfiguration - FEHLER"

DIALOG="dialog --cancel-label Zurück --ok-label Auswahl --exit-label Ende --help-label Hilfe --yes-label Ja --no-label Nein"

export RANDFILE=/dev/random

OPENVPNCONFDIR=/etc/openvpn
APPLYCONF=$CUDIR/needapply

NOADDRESS=255.255.255.255

# Directory where vpn information is stored.
VPNDIR=${CUDIR}/openvpn/
VPNTMPDIR=${CONFIGTMPDIR}/openvpn/
VPNCOPIED=no
VPNMAXNR=1

VPNCEPHDIR=${CUDIR}/openvpnceph/

NODEIPDIR=${CUDIR}/nodeip/
NODEIPTMPDIR=${CONFIGTMPDIR}/nodeip/
NODEIPCOPIED=no
NODEIPMAXNR=127

# test for LINES and COLUMNS (should be exported e.g. in /etc/profile)
set_geometry ()
{
        BL=${1:-24}
        BC=${2:-80}
        [ $BL = 0 ] && BL=24
        [ $BC = 0 ] && BC=80
        export LINES=$BL
        export COLUMNS=$BC
        BL=$((BL-4))
        BC=$((BC-5))
        MAXLINES=$((LINES-10))
}

set_geometry `stty size 2>/dev/null`


gl () {
  if test $1 -gt $MAXLINES
  then echo $MAXLINES
  else echo $1
  fi
}

onoff () {
   if test "$1" = "$2"
     then echo on
   else echo off
   fi
}

onofflist () {
#    if echo "$1" | grep -q "$2"
#    then
#      echo on
#    else
#      echo off
#    fi
     case "$1" in
       *"$2"*)
         echo on
         ;;
       *)
         echo off
     esac
}

onofflistspace () {
#    if echo " $1 " | grep -q " $2 "
#    then
#      echo on
#    else
#      echo off
#    fi
     case " $1 " in
       *" $2 "*)
         echo on
         ;;
       *)
         echo off
     esac
}

onofflisthour () {
#    if echo " $1 " | grep -q " $2 "
#    then
#      echo on
#    else
#      echo off
#    fi
     case " $1 " in
       *" $2 "*)
         echo on
         ;;
       *)
         echo off
     esac
}

function max_print {
  PTMP="$*"
  echo "${PTMP:0:40}"
  unset PTMP
}

function max_print_30 {
  PTMP="$*"
  echo ${PTMP:0:30}
  unset PTMP
}

function shutdown_time () {
	SHUTPID=$(pgrep -n shutdown)
	if test -n "$SHUTPID"
	then
		tr "\0" " " < /proc/"$SHUTPID"/cmdline | cut -d " " -f 3
	fi
	unset SHUTPID
}

# Call /etc/init.d/xyz
# call_rc scriptname action [wait|nowait] [extra-args...]
# if wait is given, call in foreground and show output
# if not, call in background and show generic message
function call_rc {
  if test -z "$2"
  then
    echo "!!! call_rc called with less than two parameters!"
    exit 1
  fi
  script="$1"
  shift
  action="$1"
  shift
  dowait="$1"
  if test -n "$1"
  then
    shift
  fi
  if test "$dowait" = "wait" -o "$dowait" = "voll"
  then
    if test -n "$1"
    then
      echo "-> $script $action $* (warten)"
    else
      echo "-> $script $action (warten)"
    fi
    /etc/init.d/"$script" "$action" "$@"
  else
    echo "-> $script $action $*"
    /etc/init.d/"$script" "$action" "$@" &>/dev/null &
  fi
}

function bitstonetmask {
  TMPBITS="$1"
  case $TMPBITS in
    0|1|2|3|4|5|6|7)
      TMPPRE=
      TMPPOST=.0.0.0
      ;;
    8|9|10|11|12|13|14|15)
      TMPPRE=255.
      TMPPOST=.0.0
      TMPBITS=$(($TMPBITS-8))
      ;;
    16|17|18|19|20|21|22|23)
      TMPPRE=255.255.
      TMPPOST=.0
      TMPBITS=$(($TMPBITS-16))
      ;;
    *)
      TMPPRE=255.255.255.
      TMPPOST=
      TMPBITS=$(($TMPBITS-24))
  esac
  case "$TMPBITS" in
    0)
      TMPMID=0
      ;;
    1)
      TMPMID=128
      ;;
    2)
      TMPMID=192
      ;;
    3)
      TMPMID=224
      ;;
    4)
      TMPMID=240
      ;;
    5)
      TMPMID=248
      ;;
    6)
      TMPMID=252
      ;;
    *)
      TMPMID=254
  esac
  echo "$TMPPRE$TMPMID$TMPPOST"
}

# Check input: single or multiple, allowed chars/IP/network
# $1: single|multi
# $2: number|text|email|emailip|emaildomain|email+|ip|partip|ipname|ipnet|ipnetname
# $3: input line
function check_input {
  CICOUNT="$1"
  TYPE="$2"
  STRING="$3"
  if test -z "$STRING"
  then
    return 0
  fi
  if test "$CICOUNT" = "single"
  then
    if echo "$STRING" | grep -q " "
    then
      $DIALOG --title "$ERRTITLE" \
              --backtitle "$BACKTITLE" \
              --msgbox "Bitte geben Sie nur ein Feld ein!" 5 $BC
      return 1
    fi
  elif test "$CICOUNT" = "multi"
  then
    for i in $STRING
    do
      check_input single "$TYPE" "$i" || return 1
    done
  else
    $DIALOG --title "$ERRTITLE" \
            --backtitle "$BACKTITLE" \
            --msgbox "Interner Fehler: Count $CICOUNT ist unbekannt!" 5 $BC
    return 1
  fi
  case $TYPE in
    number)
        if echo "$STRING"|egrep -q '^[[:digit:]]*$'
        then
          return 0
        else
          $DIALOG --title "$ERRTITLE" \
                  --backtitle "$BACKTITLE" \
                  --msgbox "Bitte geben Sie nur Zahlen ein!
Falsche Eingabe: $STRING" 6 $BC
          return 1
        fi
      ;;
    nnumber)
        if echo "$STRING"|egrep -q '^-{0,1}[[:digit:]]*$'
        then
          return 0
        else
          $DIALOG --title "$ERRTITLE" \
                  --backtitle "$BACKTITLE" \
                  --msgbox "Bitte geben Sie nur Zahlen ein!
Falsche Eingabe: $STRING" 6 $BC
          return 1
        fi
      ;;
    hostnumber)
        if echo "$STRING"|egrep -q '^[1-9][[:digit:]]{0,2}$'
        then
          if test "$STRING" -gt 255
          then
            $DIALOG --title "$ERRTITLE" \
                    --backtitle "$BACKTITLE" \
                    --msgbox "Host-Nummer $STRING is ungültig!" 5 $BC
            return 1
          fi
          return 0
        else
          $DIALOG --title "$ERRTITLE" \
                  --backtitle "$BACKTITLE" \
                  --msgbox "Bitte geben Sie eine Host-Nummer von 0 bis 255 ein!
Falsche Eingabe: $STRING" 6 $BC
          return 1
        fi
      ;;
    portnumber)
        if echo "$STRING"|egrep -q '^[[:digit:]]{1,5}$'
        then
          if test "$STRING" -gt 65535 -o "$STRING" -lt 1
          then
            $DIALOG --title "$ERRTITLE" \
                    --backtitle "$BACKTITLE" \
                    --msgbox "Port-Nummer $STRING is ungültig!" 5 $BC
            return 1
          fi
          return 0
        else
          $DIALOG --title "$ERRTITLE" \
                  --backtitle "$BACKTITLE" \
                  --msgbox "Bitte geben Sie nur Portnummern von 1 bis 65535 ein!
Falsche Eingabe: $STRING" 6 $BC
          return 1
        fi
      ;;
    portrange)
        if echo "$STRING"|egrep -q '^[[:digit:]]{1,5}$'
        then
          if test "$STRING" -gt 65535 -o "$STRING" -lt 1
          then
            $DIALOG --title "$ERRTITLE" \
                    --backtitle "$BACKTITLE" \
                    --msgbox "Port-Nummer $STRING is ungültig!" 5 $BC
            return 1
          fi
          return 0
        else
          if echo "$STRING"|egrep -q '^[[:digit:]]{1,5}:[[:digit:]]{1,5}$'
          then
            from=$(echo $STRING|cut -d ':' -f 1)
            if test "$from" -gt 65535 -o "$from" -lt 1
            then
              $DIALOG --title "$ERRTITLE" \
                      --backtitle "$BACKTITLE" \
                      --msgbox "Port-Nummer $from is ungültig!" 5 $BC
              return 1
            fi
            to=$(echo $port|cut -d ':' -f 2)
            if test "$to" -gt 65535 -o "$to" -lt 1
            then
              $DIALOG --title "$ERRTITLE" \
                      --backtitle "$BACKTITLE" \
                      --msgbox "Port-Nummer $to is ungültig!" 5 $BC
              return 1
            fi
            return 0
          else
            $DIALOG --title "$ERRTITLE" \
                  --backtitle "$BACKTITLE" \
                  --msgbox "Bitte geben Sie nur Portnummern von 1 bis 65535 oder einen Bereich a:b mit a und b von 1 bis 65535 ein!
Falsche Eingabe: $STRING" 6 $BC
            return 1
	  fi
        fi
      ;;
    bitsnumber)
        if echo "$STRING"|egrep -q '^[[:digit:]]{1,2}$'
        then
          if test "$STRING" -gt 32
          then
            $DIALOG --title "$ERRTITLE" \
                    --backtitle "$BACKTITLE" \
                    --msgbox "Bitsanzahl $STRING is ungültig!" 5 $BC
            return 1
          fi
          return 0
        else
          $DIALOG --title "$ERRTITLE" \
                  --backtitle "$BACKTITLE" \
                  --msgbox "Bitte geben Sie nur Nummern von 0 bis 32 ein!
Falsche Eingabe: $STRING" 6 $BC
          return 1
        fi
      ;;
    shutdown)
        if test "$STRING" = "sofort"
	then
	  return 0
	elif echo "$STRING"|egrep -q '^[[:digit:]]{1,2}:[[:digit:]]{1,2}$'
        then
          return 0
        else
          $DIALOG --title "$ERRTITLE" \
                  --backtitle "$BACKTITLE" \
                  --msgbox "Bitte geben Sie nur eine Uhrzeit mm:hh, z.B. 12:00, oder sofort ein!
Falsche Eingabe: $STRING" 6 $BC
          return 1
        fi
      ;;
    path)
        if echo "$STRING"|egrep -q '^[[:alpha:][:digit:]_./+-]*$'
        then
          return 0
        else
          $DIALOG --title "$ERRTITLE" \
                  --backtitle "$BACKTITLE" \
                  --msgbox "Bitte geben Sie nur Buchstaben, Zahlen, _./+- ein!
Falsche Eingabe: $STRING" 6 $BC
          return 1
        fi
      ;;
    netbits)
        if echo "$STRING"|egrep -q '^[[:digit:]]{0,2}$'
        then
          if test "$STRING" -ge 0 -a "$STRING" -le 32
          then
            return 0
          fi
        fi
        $DIALOG --title "$ERRTITLE" \
                --backtitle "$BACKTITLE" \
                --msgbox "Bitte geben Sie nur Zahlen von 0 bis 32 ein!
Falsche Eingabe: $STRING" 6 $BC
        return 1
      ;;
    float)
        if echo "$STRING"|egrep -q '^-{0,1}[[:digit:]]*\.{0,1}[[:digit:]]*$'
        then
          return 0
        else
          $DIALOG --title "$ERRTITLE" \
                  --backtitle "$BACKTITLE" \
                  --msgbox "Bitte geben Sie nur Zahlen mit oder ohne Nachkommastellen ein, Trennzeichen ist .!
Falsche Eingabe: $STRING" 7 $BC
          return 1
        fi
      ;;
    ratelimit)
        if echo "$STRING"|egrep -q '^[[:digit:]]*/[smhd]$'
        then
          return 0
        else
          $DIALOG --title "$ERRTITLE" \
                  --backtitle "$BACKTITLE" \
                  --msgbox "Bitte geben Sie nur Raten der Form Zahl/Zeiteinheit (s,m,h oder d) ein, z.B. 5/s oder 20/h!
Falsche Eingabe: $STRING" 6 $BC
          return 1
        fi
      ;;
    sslc)
        if echo "$STRING"|egrep -q '^[[:upper:]]{2}$'
        then
          return 0
        else
          $DIALOG --title "$ERRTITLE" \
                  --backtitle "$BACKTITLE" \
                  --msgbox "Bitte geben Sie zwei Groß-Buchstaben ein!
Falsche Eingabe: $STRING" 6 $BC
          return 1
        fi
      ;;
    text)
        if echo "$STRING"|egrep -q '^[[:alnum:]:+-]*$'
        then
          return 0
        else
          $DIALOG --title "$ERRTITLE" \
                  --backtitle "$BACKTITLE" \
                  --msgbox "Bitte geben Sie nur Buchstaben, Zahlen und :+- ein!
Falsche Eingabe: $STRING" 6 $BC
          return 1
        fi
      ;;
    text_)
        if echo "$STRING"|egrep -q '^[[:alnum:]:_+-]*$'
        then
          return 0
        else
          $DIALOG --title "$ERRTITLE" \
                  --backtitle "$BACKTITLE" \
                  --msgbox "Bitte geben Sie nur Buchstaben, Zahlen und _:+- ein!
Falsche Eingabe: $STRING" 6 $BC
          return 1
        fi
      ;;
    text_punkt)
        if echo "$STRING"|egrep -q '^[[:alnum:]:_.+-]*$'
        then
          return 0
        else
          $DIALOG --title "$ERRTITLE" \
                  --backtitle "$BACKTITLE" \
                  --msgbox "Bitte geben Sie nur Buchstaben, Zahlen und _:.+- ein!
Falsche Eingabe: $STRING" 6 $BC
          return 1
        fi
      ;;
    textkomma)
        if echo "$STRING"|egrep -q '^[[:alnum:],]*$'
        then
          return 0
        else
          $DIALOG --title "$ERRTITLE" \
                  --backtitle "$BACKTITLE" \
                  --msgbox "Bitte geben Sie nur Buchstaben, Zahlen und , ein!
Falsche Eingabe: $STRING" 6 $BC
          return 1
        fi
      ;;
    text=)
        if echo "$STRING"|egrep -q '^[[:alnum:]=:.+-]*$'
        then
          return 0
        else
          $DIALOG --title "$ERRTITLE" \
                  --backtitle "$BACKTITLE" \
                  --msgbox "Bitte geben Sie nur Buchstaben, Zahlen und =:.+- ein!
Falsche Eingabe: $STRING" 6 $BC
          return 1
        fi
      ;;
    textua)
        if echo "$STRING"|egrep -q '^[[:alnum:]/;()=:.+-]*$'
        then
          return 0
        else
          $DIALOG --title "$ERRTITLE" \
                  --backtitle "$BACKTITLE" \
                  --msgbox "Bitte geben Sie nur Buchstaben, Zahlen und ;()=:.+- ein!
Falsche Eingabe: $STRING" 6 $BC
          return 1
        fi
      ;;
    text.)
        if echo "$STRING"|egrep -q '^[[:alnum:].-]*$'
        then
          return 0
        else
          $DIALOG --title "$ERRTITLE" \
                  --backtitle "$BACKTITLE" \
                  --msgbox "Bitte geben Sie nur Buchstaben, Zahlen, . und - ein!
Falsche Eingabe: $STRING" 6 $BC
          return 1
        fi
      ;;
    mime)
        if echo "$STRING"|egrep -q '^[[:alnum:].-]+/[[:alnum:].-]+$'
        then
          return 0
        else
          $DIALOG --title "$ERRTITLE" \
                  --backtitle "$BACKTITLE" \
                  --msgbox "Bitte geben Sie nur MIME-Typen a/b mit Buchstaben, Zahlen, .- ein!
Falsche Eingabe: $STRING" 6 $BC
          return 1
        fi
      ;;
    username)
        if echo "$STRING"|egrep -q '^[a-z][0-9a-z_.-]*$'
        then
          return 0
        else
          $DIALOG --title "$ERRTITLE" \
                  --backtitle "$BACKTITLE" \
                  --msgbox "Bitte geben Sie nur Kleinbuchstaben, Zahlen, . und - ein!
Falsche Eingabe: $STRING" 6 $BC
          return 1
        fi
      ;;
    textgerman)
        if echo "$STRING"|egrep -q '^[[:alnum:]aöüAÖÜß:+-]*$'
        then
          return 0
        else
          $DIALOG --title "$ERRTITLE" \
                  --backtitle "$BACKTITLE" \
                  --msgbox "Bitte geben Sie nur Buchstaben, Zahlen, + und - ein!
Falsche Eingabe: $STRING" 6 $BC
          return 1
        fi
      ;;
    textspammark)
        if echo "$STRING"|egrep -q '^[]()[[:alnum:]!?:*+-]*$'
        then
          return 0
        else
          $DIALOG --title "$ERRTITLE" \
                  --backtitle "$BACKTITLE" \
                  --msgbox "Bitte geben Sie nur Buchstaben, Zahlen und \"[]()!?:*+-\" ein!
Falsche Eingabe: $STRING" 6 $BC
          return 1
        fi
      ;;
    realif)
        if echo "$STRING"|egrep -q '^[[:alnum:]+-]*$'
        then
          return 0
        else
          $DIALOG --title "$ERRTITLE" \
                  --backtitle "$BACKTITLE" \
                  --msgbox "Bitte geben Sie nur Buchstaben, Zahlen, + und - ein!
Falsche Eingabe: $STRING" 6 $BC
          return 1
        fi
      ;;
    dsluser)
        if echo "$STRING"|egrep -q '^[[:alnum:]#:+/@._-]*$'
        then
          return 0
        else
          $DIALOG --title "$ERRTITLE" \
                  --backtitle "$BACKTITLE" \
                  --msgbox "Bitte geben Sie nur Buchstaben, Zahlen und \"#:+-/@_\" ein!
Falsche Eingabe: $STRING" 6 $BC
          return 1
        fi
      ;;
    domain)
        if echo "$STRING"|egrep -q '^[0-9a-z][0-9a-z:_.-]*$'
        then
          return 0
        else
          $DIALOG --title "$ERRTITLE" \
                  --backtitle "$BACKTITLE" \
                  --msgbox "Bitte geben Sie nur Kleinbuchstaben, Zahlen, . und - ein!
Falsche Eingabe: $STRING" 6 $BC
          return 1
        fi
      ;;
    domain+)
        if echo "$STRING"|egrep -q '^[*0-9a-z][0-9a-z_.-]*[*]{0,1}$'
        then
          return 0
        else
          $DIALOG --title "$ERRTITLE" \
                  --backtitle "$BACKTITLE" \
                  --msgbox "Bitte geben Sie nur Kleinbuchstaben, Zahlen und \"*.-\" ein!
Falsche Eingabe: $STRING" 6 $BC
          return 1
        fi
      ;;
    dotdomain)
        if echo "$STRING"|egrep -q '^[0-9a-z.][0-9a-z:_.-]*$'
        then
          return 0
        else
          $DIALOG --title "$ERRTITLE" \
                  --backtitle "$BACKTITLE" \
                  --msgbox "Bitte geben Sie nur Kleinbuchstaben, Zahlen, . und - ein!
Falsche Eingabe: $STRING" 6 $BC
          return 1
        fi
      ;;
    realm)
        if echo "$STRING"|egrep -q '^[0-9A-Z][0-9A-Z_.-]*$'
        then
          return 0
        else
          $DIALOG --title "$ERRTITLE" \
                  --backtitle "$BACKTITLE" \
                  --msgbox "Bitte geben Sie nur Großbuchstaben, Zahlen und . _ - ein!
Falsche Eingabe: $STRING" 6 $BC
          return 1
        fi
      ;;
    dir)
        if echo "$STRING"|egrep -q '^[[:alnum:]][[:alnum:]/:.-]*$'
        then
          return 0
        else
          $DIALOG --title "$ERRTITLE" \
                  --backtitle "$BACKTITLE" \
                  --msgbox "Bitte geben Sie nur Buchstaben, Zahlen und "/:-" ein, am Anfang kein Sonderzeichen!
Falsche Eingabe: $STRING" 6 $BC
          return 1
        fi
      ;;
    dir+)
        if echo "$STRING"|egrep -q '^[[:alnum:]][*[:alnum:]/:.-]*$'
        then
          return 0
        else
          $DIALOG --title "$ERRTITLE" \
                  --backtitle "$BACKTITLE" \
                  --msgbox "Bitte geben Sie nur Buchstaben, Zahlen und "*/:-" ein, am Anfang kein Sonderzeichen!
Falsche Eingabe: $STRING" 6 $BC
          return 1
        fi
      ;;
    httpurl)
        if echo "$STRING"|egrep -q '^http[s]{0,1}://[[:alnum:]][[:alnum:].-]*/[[:alnum:]][[:alnum:]@=#&?_/:.+-]*$'
        then
          return 0
        else
          $DIALOG --title "$ERRTITLE" \
                  --backtitle "$BACKTITLE" \
                  --msgbox "Bitte geben Sie eine URL mit http:// oder https:// ein.
Nur Buchstaben, Zahlen und .- sind im Servernamen und Buchstaben, Zahlen und @=#&?_/:.+- im Rest erlaubt!

Falsche Eingabe: $STRING" 11 $BC
          return 1
        fi
      ;;
    password)
        if echo "$STRING"|egrep -q '^[[:alnum:]?#!$%&*@:_.=+-]*$'
        then
          return 0
        else
          $DIALOG --title "$ERRTITLE" \
                  --backtitle "$BACKTITLE" \
                  --msgbox "Bitte geben Sie nur Buchstaben, Zahlen und #!$%&*@:_.=+- ein!" 5 $BC
          return 1
        fi
      ;;
    email)
        if echo "$STRING"|egrep -q '^[[:alnum:]][[:alnum:]/_+.:-]*@[[:alnum:]][[:alnum:]_-]*\.[[:alnum:]._-]*[^.]$'
        then
          return 0
        else
          $DIALOG --title "$ERRTITLE" \
                  --backtitle "$BACKTITLE" \
                  --msgbox "Bitte geben Sie Mail-Adressen in der Form name@domain.tld ein!
Falsche Eingabe: $STRING" 6 $BC
          return 1
        fi
      ;;
    remail)
        if echo "$STRING"|egrep -q '^[[:alnum:]][[:alnum:]/_+.:-]*@[[:alnum:]][[:alnum:]_-]*\.[[:alnum:]_.-]*[^.]$'
        then
          return 0
        elif echo "$STRING"|egrep -q '^[[:alnum:]][[:alnum:]/_+.:-]*@localhost$'
        then
          return 0
        else
          $DIALOG --title "$ERRTITLE" \
                  --backtitle "$BACKTITLE" \
                  --msgbox "Bitte geben Sie Mail-Adressen in der Form name@domain.tld oder name@localhost ein!
Falsche Eingabe: $STRING" 6 $BC
          return 1
        fi
      ;;
    emaillocal)
        if echo "$STRING"|egrep -q '^[[:alnum:]][[:alnum:]/_+.:-]*@[[:alnum:]][[:alnum:]_-]*\.[[:alnum:]_.-]*[^.]$'
        then
          return 0
        elif echo "$STRING"|egrep -q '^[[:alnum:]][[:alnum:]/_+.:-]*$'
        then
          return 0
        else
          $DIALOG --title "$ERRTITLE" \
                  --backtitle "$BACKTITLE" \
                  --msgbox "Bitte geben Sie eine Mail-Adresse in der Form name@domain.tld oder einen lokalen Benutzernamen ein!
Falsche Eingabe: $STRING" 7 $BC
          return 1
        fi
      ;;
    emailip)
        if echo "$STRING"|egrep -q '^[[:alnum:]][[:alnum:]/+_.:-]*@[[:alnum:]][[:alnum:]-]*\.[[:alnum:]_.-]*[^.]$'
        then
          return 0
        elif echo "$STRING"|egrep -q '^[[:alnum:]][[:alnum:]/+_.:-]*@[1-9][[:digit:]]{0,2}\.([1-9][[:digit:]]{0,2}|0)\.([1-9][[:digit:]]{0,2}|0)\.([1-9][[:digit:]]{0,2}|0)$'
        then
          return 0
        else
          $DIALOG --title "$ERRTITLE" \
                  --backtitle "$BACKTITLE" \
                  --msgbox "Bitte geben Sie Mail-Adressen in der Form name@domain.tld ein!
Falsche Eingabe: $STRING" 6 $BC
          return 1
        fi
      ;;
    emaildomain)
        if echo "$STRING"|egrep -q '^[[:alnum:]][[:alnum:]/+_.:-]*@[[:alnum:]][[:alnum:]-]*\.[[:alnum:]_.-]*[^.]$'
        then
          return 0
        elif echo "$STRING"|egrep -q '^[[:alnum:]][[:alnum:]+:_.-]*$'
        then
          return 0
        else
          $DIALOG --title "$ERRTITLE" \
                  --backtitle "$BACKTITLE" \
                  --msgbox "Bitte geben Sie eine Mail-Adresse in der Form name@domain.tld oder eine Domäne der Form domain.tld ein!
Falsche Eingabe: $STRING" 7 $BC
          return 1
        fi
      ;;
    email+)
        if test "$STRING" = "*"
        then
          return 0
        elif echo "$STRING"|egrep -q '^[[:alnum:]][[:alnum:]/+_.:-]*@[[:alnum:]][[:alnum:]-]*\.[[:alnum:]_.-]*[^.]$'
        then
          return 0
        else
          $DIALOG --title "$ERRTITLE" \
                  --backtitle "$BACKTITLE" \
                  --msgbox "Bitte geben Sie Mail-Adressen in der Form name@domain.tld ein!
Falsche Eingabe: $STRING" 6 $BC
          return 1
        fi
      ;;
    emailat)
        if echo "$STRING"|egrep -q '^[[:alnum:]][[:alnum:]/+_.:-]*@[[:alnum:]][[:alnum:]-]*\.[[:alnum:]_.-]*[^.]$'
        then
          return 0
        elif echo "$STRING"|egrep -q '^[[:alnum:]][[:alnum:]/+_.:-]*@$'
        then
          return 0
        elif echo "$STRING"|egrep -q '^[[:alnum:].][[:alnum:]_.-]*$'
        then
          return 0
        else
          $DIALOG --title "$ERRTITLE" \
                  --backtitle "$BACKTITLE" \
                  --msgbox "Bitte geben Sie Mail-Adressen in der Form name@domain.tld, name@ für beliebige Domänen oder eine Domäne ein!
Falsche Eingabe: $STRING" 6 $BC
          return 1
        fi
      ;;
    blackwhite)
        if echo "$STRING"|egrep -q '^[[:alnum:]/_+.:-]*@[[:alnum:]_-]*\.[[:alnum:]_.-]*[^.]$'
        then
          return 0
        else
          $DIALOG --title "$ERRTITLE" \
                  --backtitle "$BACKTITLE" \
                  --msgbox "Bitte geben Sie eine Mail-Adresse in der Form name@domain.tld, @domain.tld oder @.domain.tld ein!
Falsche Eingabe: $STRING" 7 $BC
          return 1
        fi
      ;;
    ip)
        if echo "$STRING"|egrep -q '^[1-9][[:digit:]]{0,2}\.([1-9][[:digit:]]{0,2}|0)\.([1-9][[:digit:]]{0,2}|0)\.([1-9][[:digit:]]{0,2}|0)$'
        then
          return 0
        else
          $DIALOG --title "$ERRTITLE" \
                  --backtitle "$BACKTITLE" \
                  --msgbox "Bitte geben Sie nur IP-Adressen der Form a.b.c.d ein!
Falsche Eingabe: $STRING" 6 $BC
          return 1
        fi
      ;;
    partip)
        if echo "$STRING"|egrep -q '^[1-9][[:digit:]]{0,2}$'
        then
          return 0
        elif echo "$STRING"|egrep -q '^[1-9][[:digit:]]{0,2}\.([1-9][[:digit:]]{0,2}|0)$'
        then
          return 0
        elif echo "$STRING"|egrep -q '^[1-9][[:digit:]]{0,2}\.([1-9][[:digit:]]{0,2}|0)\.([1-9][[:digit:]]{0,2}|0)$'
        then
          return 0
        elif echo "$STRING"|egrep -q '^[1-9][[:digit:]]{0,2}\.([1-9][[:digit:]]{0,2}|0)\.([1-9][[:digit:]]{0,2}|0)\.([1-9][[:digit:]]{0,2}|0)$'
        then
          return 0
        else
          $DIALOG --title "$ERRTITLE" \
                  --backtitle "$BACKTITLE" \
                  --msgbox "Bitte geben Sie nur IP-Teiladressen der Form a[.b[.c[.d]]] ein, z.B. 0.168.192!
Falsche Eingabe: $STRING" 7 $BC
          return 1
        fi
      ;;
    ipname)
        if echo "$STRING"|egrep -q '^[1-9][[:digit:]]{0,2}\.([1-9][[:digit:]]{0,2}|0)\.([1-9][[:digit:]]{0,2}|0)\.([1-9][[:digit:]]{0,2}|0)$'
        then
          return 0
        else
          if echo "$STRING"|egrep -q '^[a-z]+[0-9a-z.-]*$'
          then
            return 0
          else
            $DIALOG --title "$ERRTITLE" \
                    --backtitle "$BACKTITLE" \
                    --msgbox "Bitte geben Sie nur IP-Adressen der Form a.b.c.d oder DNS-Namen in Kleinbuchstaben ein!
Falsche Eingabe: $STRING" 6 $BC
            return 1
          fi
        fi
      ;;
    partipname)
        if echo "$STRING"|egrep -q '^[1-9][[:digit:]]{0,2}$'
        then
          return 0
        elif echo "$STRING"|egrep -q '^[1-9][[:digit:]]{0,2}\.([1-9][[:digit:]]{0,2}|0)$'
        then
          return 0
        elif echo "$STRING"|egrep -q '^[1-9][[:digit:]]{0,2}\.([1-9][[:digit:]]{0,2}|0)\.([1-9][[:digit:]]{0,2}|0)$'
        then
          return 0
        elif echo "$STRING"|egrep -q '^[1-9][[:digit:]]{0,2}\.([1-9][[:digit:]]{0,2}|0)\.([1-9][[:digit:]]{0,2}|0)\.([1-9][[:digit:]]{0,2}|0)$'
        then
          return 0
        elif echo "$STRING"|egrep -q '^[a-z]+[0-9a-z.-]*$'
        then
          return 0
        else
          $DIALOG --title "$ERRTITLE" \
                  --backtitle "$BACKTITLE" \
                  --msgbox "Bitte geben Sie nur IP-Teiladressen der Form a[.b[.c[.d]]], z.B. 192.168 oder DNS-Namen in Kleinbuchstaben ein!
Falsche Eingabe: $STRING" 7 $BC
          return 1
        fi
      ;;
    ipnet)
        if echo "$STRING"|egrep -q '^([1-9][[:digit:]]{0,2}|0)\.([1-9][[:digit:]]{0,2}|0)\.([1-9][[:digit:]]{0,2}|0)\.([1-9][[:digit:]]{0,2}|0)/[[:digit:]]{1,2}$'
        then
          return 0
        elif echo "$STRING"|egrep -q '^([1-9][[:digit:]]{0,2}|0)\.([1-9][[:digit:]]{0,2}|0)\.([1-9][[:digit:]]{0,2}|0)\.([1-9][[:digit:]]{0,2}|0)$'
        then
          return 0
        else
          $DIALOG --title "$ERRTITLE" \
                  --backtitle "$BACKTITLE" \
                  --msgbox "Bitte geben Sie nur IP-Adressen und IP-Netze der Formen a.b.c.d und a.b.c.d/n ein!
Falsche Eingabe: $STRING" 7 $BC
          return 1
        fi
      ;;
    ipnetname)
        if echo "$STRING"|egrep -q '^([1-9][[:digit:]]{0,2}|0)\.([1-9][[:digit:]]{0,2}|0)\.([1-9][[:digit:]]{0,2}|0)\.([1-9][[:digit:]]{0,2}|0)/[[:digit:]]{1,2}$'
        then
          return 0
        elif echo "$STRING"|egrep -q '^[1-9][[:digit:]]{0,2}\.([1-9][[:digit:]]{0,2}|0)\.([1-9][[:digit:]]{0,2}|0)\.([1-9][[:digit:]]{0,2}|0)$'
        then
          return 0
        elif echo "$STRING"|egrep -q '^[a-z]+[0-9a-z.-]*$'
        then
          return 0
        else
          $DIALOG --title "$ERRTITLE" \
                  --backtitle "$BACKTITLE" \
                  --msgbox "Bitte geben Sie nur IP-Adressen und IP-Netze der Formen a.b.c.d und a.b.c.d/n oder DNS-Namen in Kleinbuchstaben ein!
Falsche Eingabe: $STRING" 8 $BC
          return 1
        fi
      ;;
    ipnetname.)
        if test "$STRING" = "."
        then
          return 0
        elif echo "$STRING"|egrep -q '^([1-9][[:digit:]]{0,2}|0)\.([1-9][[:digit:]]{0,2}|0)\.([1-9][[:digit:]]{0,2}|0)\.([1-9][[:digit:]]{0,2}|0)/[[:digit:]]{1,2}$'
        then
          return 0
        elif echo "$STRING"|egrep -q '^[1-9][[:digit:]]{0,2}\.([1-9][[:digit:]]{0,2}|0)\.([1-9][[:digit:]]{0,2}|0)\.([1-9][[:digit:]]{0,2}|0)$'
        then
          return 0
        elif echo "$STRING"|egrep -q '^[a-z]+[0-9a-z.-]*$'
        then
          return 0
        else
          $DIALOG --title "$ERRTITLE" \
                  --backtitle "$BACKTITLE" \
                  --msgbox "Bitte geben Sie nur IP-Adressen und IP-Netze der Formen a.b.c.d und a.b.c.d/n oder DNS-Namen in Kleinbuchstaben ein!
Falsche Eingabe: $STRING" 8 $BC
          return 1
        fi
      ;;
    mac)
        if echo "$STRING"|egrep -q '^[[:digit:]a-f]{1,2}:[[:digit:]a-f]{1,2}:[[:digit:]a-f]{1,2}:[[:digit:]a-f]{1,2}:[[:digit:]a-f]{1,2}:[[:digit:]a-f]{1,2}$'
        then
          return 0
        else
          $DIALOG --title "$ERRTITLE" \
                  --backtitle "$BACKTITLE" \
                  --msgbox "Bitte geben Sie nur MAC-Adressen der Form a:b:c:d:e:f mit jeweils zweistelligen Hexzahlen ein!
Falsche Eingabe: $STRING" 6 $BC
          return 1
        fi
      ;;
    sshforward)
        if echo "$STRING"|egrep -q '^[1-9][[:digit:]]{0,2}\.([1-9][[:digit:]]{0,2}|0)\.([1-9][[:digit:]]{0,2}|0)\.([1-9][[:digit:]]{0,2}|0):[[:digit:]]*$'
        then
          return 0
        else
          if echo "$STRING"|egrep -q '^[[:alpha:]]+[[:alnum:].-]*:[[:digit:]]*$'
          then
            return 0
          else
            $DIALOG --title "$ERRTITLE" \
                    --backtitle "$BACKTITLE" \
                    --msgbox "Bitte geben Sie nur Adressen mit Ports in der Form a.b.c.d:n oder name:port ein!
Falsche Eingabe: $STRING" 6 $BC
            return 1
          fi
        fi
      ;;
    scsidevlabel)
        if echo "$STRING"|egrep -q '^/dev/sd[a-z][[:digit:]]{0,2}$'
        then
          return 0
        elif echo "$STRING"|egrep -q '^[[:alnum:]._-]*$'
        then
          return 0
        else
            $DIALOG --title "$ERRTITLE" \
                    --backtitle "$BACKTITLE" \
                    --msgbox "Bitte geben Sie nur Gerätenamen ein, die mit /dev/sd beginnen, danach ein Buchstabe und optional eine Zahl, oder ein Label mit Buchstaben, Ziffern, ._-!
Falsche Eingabe: $STRING" 7 $BC
            return 1
        fi
      ;;
    scsidev)
        if echo "$STRING"|egrep -q '^/dev/sd[a-z][[:digit:]]{0,2}$'
        then
          return 0
        else
            $DIALOG --title "$ERRTITLE" \
                    --backtitle "$BACKTITLE" \
                    --msgbox "Bitte geben Sie nur Gerätenamen ein, die mit /dev/sd beginnen, danach ein Buchstabe und optional eine Zahl!
Falsche Eingabe: $STRING" 6 $BC
            return 1
        fi
      ;;
    date)
        if echo "$STRING"|egrep -q '^[[:digit:]]{4}-[[:digit:]]{2}-[[:digit:]]{2}$'
        then
          if ! date -d "$STRING" &>/dev/null
          then
            $DIALOG --title "$ERRTITLE" \
                    --backtitle "$BACKTITLE" \
                    --msgbox "Das Datum ist ungültig. Bitte geben Sie ein gültiges Datum in der Form JJJJ-MM-TT ein!
Falsche Eingabe: $STRING" 6 $BC
            return 1
          fi
          return 0
        else
            $DIALOG --title "$ERRTITLE" \
                    --backtitle "$BACKTITLE" \
                    --msgbox "Bitte geben Sie ein Datum in der Form JJJJ-MM-TT ein!
Falsche Eingabe: $STRING" 6 $BC
            return 1
        fi
      ;;
    time)
        if echo "$STRING"|egrep -q '^[[:digit:]]{2}:[[:digit:]]{2}$'
        then
          if ! date -d "$STRING" &>/dev/null
          then
            $DIALOG --title "$ERRTITLE" \
                    --backtitle "$BACKTITLE" \
                    --msgbox "Die Uhrzeit ist ungültig. Bitte geben Sie eine gültige Uhrzeit in der Form HH:MM ein!
Falsche Eingabe: $STRING" 6 $BC
            return 1
          fi
          return 0
        else
            $DIALOG --title "$ERRTITLE" \
                    --backtitle "$BACKTITLE" \
                    --msgbox "Bitte geben Sie eine Uhrzeit in der Form HH:MM ein!
Falsche Eingabe: $STRING" 6 $BC
            return 1
        fi
      ;;
    *)
        $DIALOG --title "$ERRTITLE" \
                --backtitle "$BACKTITLE" \
                --msgbox "Interner Fehler: Typ $TYPE ist unbekannt!" 5 $BC
        return 1
  esac
  return 0
}


function remove_tmp_openvpn {
	if [ -d ${VPNTMPDIR} ]
	then
		rm -f ${VPNTMPDIR}/*
	fi
}

function openvpn_read {
	test -z "$1" && return
	test ! -f "$1" && return
	if test -n "$VPNNUMCLIENTS"
	then
		for READTMP in $(seq 1 ${VPNNUMCLIENTS})
		do
		  VPNCLIENTNAME[$READTMP]=
		done
		unset READTMP
	fi
	VPNAKTIV=Ja
	VPNMODE=p2p
        VPNPROTO=
	VPNREMOTEDYN=Ja
	VPNAUTHUSERPASS=Nein
	VPNREMOTEINTFIRST=
	VPNREMOTEINTLAST=
	VPNFWACCESS=Nein
	VPNINTACCESS=Nein
	VPNCIPHER="BF-CBC"
	VPNDIGEST="SHA1"
	VPNTLSAUTH=Ja
	VPNNUMCLIENTS=1
	VPNREDIRECT=Nein
	VPNUSER=
	VPNPASS=
	VPNCLIENTNET=
	VPNPROXYTYPE=
	VPNSERVERCN=
	VPNPUSHROUTE=
	VPNPUSHDNS=Nein
	VPNCOMMENT=
	VPNPORTSHARE=
	. ${1}
	if test -z "$VPNREMOTEDYN"
	then
	  if test -n "$VPNREMOTEEXTIP"
	  then
	    VPNREMOTEDYN=Nein
	  else
	    VPNREMOTEDYN=Ja
	  fi
#          NEEDSAVE=yes
	fi
}

function write_openvpn {
	echo 'VPNAKTIV="'${VPNAKTIV}'"' >$1
	echo 'VPNDATE="'${VPNDATE}'"' >>$1
	echo 'VPNNUMBER="'${VPNNUMBER}'"' >>$1
	echo 'VPNTITLE="'${VPNTITLE}'"' >>$1
	echo 'VPNCOMMENT="'${VPNCOMMENT}'"' >>$1
	echo 'VPNPROTO="'${VPNPROTO}'"' >>$1
	echo 'VPNMODE="'${VPNMODE}'"' >>$1
	echo 'VPNPROXYTYPE="'${VPNPROXYTYPE}'"' >>$1
	echo 'VPNPROXY="'${VPNPROXY}'"' >>$1
	echo 'VPNPROXYPORT="'${VPNPROXYPORT}'"' >>$1
	echo 'VPNLOCALEXTIP="'${VPNLOCALEXTIP}'"' >>$1
	echo 'VPNLOCALEXTPORT="'${VPNLOCALEXTPORT}'"' >>$1
	echo 'VPNPORTSHARE="'${VPNPORTSHARE}'"' >>$1
	echo 'VPNREMOTEEXTIP="'${VPNREMOTEEXTIP}'"' >>$1
	echo 'VPNREMOTEEXTPORT="'${VPNREMOTEEXTPORT}'"' >>$1
	echo 'VPNLOCALINTIP="'${VPNLOCALINTIP}'"' >>$1
	echo 'VPNREMOTEINTIP="'${VPNREMOTEINTIP}'"' >>$1
	echo 'VPNREMOTEINTNET="'${VPNREMOTEINTNET}'"' >>$1
	echo 'VPNRATELIMIT="'${VPNRATELIMIT}'"' >>$1
	echo 'VPNEXTRA="'${VPNEXTRA}'"' >>$1
	echo 'VPNINTACCESS="'${VPNINTACCESS}'"' >>$1
	echo 'VPNFWACCESS="'${VPNFWACCESS}'"' >>$1
	echo 'VPNREMOTEDYN="'${VPNREMOTEDYN}'"' >>$1
	echo 'VPNCIPHER="'${VPNCIPHER}'"' >>$1
	echo 'VPNDIGEST="'${VPNDIGEST}'"' >>$1
	echo 'VPNTLSAUTH="'${VPNTLSAUTH}'"' >>$1
	echo 'VPNNUMCLIENTS="'${VPNNUMCLIENTS}'"' >>$1
	echo 'VPNCLIENTNET="'${VPNCLIENTNET}'"' >>$1
	echo 'VPNREMOTEINTFIRST="'${VPNREMOTEINTFIRST}'"' >>$1
	echo 'VPNREMOTEINTLAST="'${VPNREMOTEINTLAST}'"' >>$1
	echo 'VPNAUTHUSERPASS="'${VPNAUTHUSERPASS}'"' >>$1
	echo 'VPNREDIRECT="'${VPNREDIRECT}'"' >>$1
	echo 'VPNUSER="'${VPNUSER}'"' >>$1
	echo 'VPNPASS="'${VPNPASS}'"' >>$1
	echo 'VPNPUSHROUTE="'${VPNPUSHROUTE}'"' >>$1
	echo 'VPNPUSHDNS="'${VPNPUSHDNS}'"' >>$1
	echo 'VPNSERVERCN="'${VPNSERVERCN}'"' >>$1
	for WRITETMP in $(seq 1 ${VPNNUMCLIENTS})
	do
	  echo "VPNCLIENTNAME[$WRITETMP]=\"${VPNCLIENTNAME[$WRITETMP]}\""
	done >>$1
	unset WRITETMP

	NEEDSAVE=yes
	NEEDAPPLY=yes
}

function write_openvpn_partner {
	echo 'VPNNUMBER="'${VPNPNUMBER}'"' >$1
	echo 'VPNTITLE="'${VPNTITLE}'"' >>$1
	case "$VPNPROTO" in
	  tcp-client)
	    echo 'VPNPROTO="tcp-server"' >>$1
	    ;;
	  tcp-server)
	    echo 'VPNPROTO=tcp-client' >>$1
	    ;;
	  *)
	    echo 'VPNPROTO=udp' >>$1
	esac
	echo 'VPNPROXY=""' >>$1
	echo 'VPNPROXYPORT=""' >>$1
	echo 'VPNLOCALEXTIP="'${VPNREMOTEEXTIP}'"' >>$1
	echo 'VPNLOCALEXTPORT="'${VPNREMOTEEXTPORT}'"' >>$1
	echo 'VPNREMOTEEXTIP="'${VPNLOCALEXTIP}'"' >>$1
	echo 'VPNREMOTEEXTPORT="'${VPNLOCALEXTPORT}'"' >>$1
	echo 'VPNLOCALINTIP="'${VPNREMOTEINTIP}'"' >>$1
	echo 'VPNREMOTEINTIP="'${VPNLOCALINTIP}'"' >>$1
	echo 'VPNREMOTEINTNET="'${CUIPNET}/${CUIPNETVALIDBITS}'"' >>$1
	echo 'VPNRATELIMIT="0"' >>$1
	echo 'VPNEXTRA="'${VPNEXTRA}'"' >>$1
	echo 'VPNINTACCESS="Nein"' >>$1
	echo 'VPNFWACCESS="Nein"' >>$1
	if test -n "$VPNLOCALEXTIP"
	then
	  echo 'VPNREMOTEDYN="Nein"' >>$1
	else
	  echo 'VPNREMOTEDYN="Ja"' >>$1
	fi
}

function write_openvpn_client {
	test -z "$2" && return
	{
	echo -e "# m-privacy mp-ceph OpenVPN Konfiguration\r"
	echo -e "# Erzeugt: $(date)\r"
	echo -e "#\r"
	echo -e "# VPN Definition: $VPNNUMBER $VPNTITLE\r"
	echo -e "# Klient:         $1 ${VPNCLIENTNAME[$1]}\r"
	echo -e "#\r"
	case "$VPNPROTO" in
	  tcp-client)
	    return
	    ;;
	  tcp-server)
	    echo -e "proto tcp-client\r"
	    ;;
	  *)
	    echo -e "proto udp\r"
	esac
	echo -e "verb 3\r"
	echo -e "dev tun\r"
	if test -n "${VPNSERVERCN}"
	then
	  echo -e "remote ${VPNSERVERCN} ${VPNLOCALEXTPORT}\r"
	  echo -e "verify-x509-name ${VPNSERVERCN} name\r"
	else
	  if test -n "${VPNLOCALEXTIP}"
	  then
	    echo -e "remote ${VPNLOCALEXTIP} ${VPNLOCALEXTPORT}\r"
	  else
	    echo -e "remote $(hostname -f) ${VPNLOCALEXTPORT}\r"
	  fi
	  echo -e "verify-x509-name $(hostname -f) name\r"
	fi
	if echo $VPNEXTRA | grep -q "comp-lzo"
	then
	  echo -e "comp-lzo\r"
	fi
	echo -e "ca cacert.pem\r"
	echo -e "cert $1.crt\r"
	echo -e "key $1.key\r"
	if ! test "${VPNTLSAUTH}" = "Nein"
	then
	  echo -e "tls-auth tls-auth\r"
	fi
        if test -n "$VPNCIPHER"
        then
          if test "$VPNCIPHER" = "BF-256-CBC"
            then
              echo -e "cipher BF-CBC\r"
              echo -e "keysize 256\r"
          else
              echo -e "cipher ${VPNCIPHER}\r"
          fi
        fi
	echo -e "rport ${VPNLOCALEXTPORT}\r"
	if test -n "${VPNREMOTEEXTPORT}"
	then
	  echo -e "lport ${VPNREMOTEEXTPORT}\r"
	fi
	if test "${VPNAUTHUSERPASS}" = "Ja"
	then
	  echo -e "auth-user-pass\r"
	fi
	echo -e "pull\r"
	echo -e "auth ${VPNDIGEST}\r"
	echo -e "tls-client\r"
	echo -e "route-method exe\r"
	echo -e "route-delay 2\r"
	echo -e "hand-window 120\r"
	} >$2
}

function write_openvpn_client_inline {
	test -z "$3" && return
	{
	echo -e "# m-privacy mp-ceph OpenVPN Konfiguration\r"
	echo -e "# Erzeugt: $(date)\r"
	echo -e "#\r"
	echo -e "# VPN Definition: $VPNNUMBER $VPNTITLE\r"
	echo -e "# Klient:         $1 ${VPNCLIENTNAME[$1]}\r"
	echo -e "#\r"
	case "$VPNPROTO" in
	  tcp-client)
	    return
	    ;;
	  tcp-server)
	    echo -e "proto tcp-client\r"
	    ;;
	  *)
	    echo -e "proto udp\r"
	esac
	echo -e "verb 3\r"
	echo -e "dev tun\r"
	if test -n "${VPNSERVERCN}"
	then
	  echo -e "remote ${VPNSERVERCN} ${VPNLOCALEXTPORT}\r"
	  echo -e "verify-x509-name ${VPNSERVERCN} name\r"
	else
	  if test -n "${VPNLOCALEXTIP}"
	  then
	    echo -e "remote ${VPNLOCALEXTIP} ${VPNLOCALEXTPORT}\r"
	  else
	    echo -e "remote $(hostname -f) ${VPNLOCALEXTPORT}\r"
	  fi
	  echo -e "verify-x509-name $(hostname -f) name\r"
	fi
	if echo $VPNEXTRA | grep -q "comp-lzo"
	then
	  echo -e "comp-lzo\r"
	fi
	echo -e "<ca>\r"
	cat "$3/cacert.pem"
	echo -e "</ca>\r"
	echo -e "<cert>\r"
	cat "$3/$1.crt"
	echo -e "</cert>\r"
	echo -e "<key>\r"
	cat "$3/$1.key"
	echo -e "</key>\r"
	if ! test "${VPNTLSAUTH}" = "Nein"
	then
#	  echo -e "key-direction 1\r"
	  echo -e "<tls-auth>\r"
	  cat "$3/tls-auth"
	  echo -e "</tls-auth>\r"
	fi
        if test -n "$VPNCIPHER"
        then
          if test "$VPNCIPHER" = "BF-256-CBC"
            then
              echo -e "cipher BF-CBC\r"
              echo -e "keysize 256\r"
          else
              echo -e "cipher ${VPNCIPHER}\r"
          fi
        fi
	echo -e "rport ${VPNLOCALEXTPORT}\r"
	if test -n "${VPNREMOTEEXTPORT}"
	then
	  echo -e "lport ${VPNREMOTEEXTPORT}\r"
	fi
	if test "${VPNAUTHUSERPASS}" = "Ja"
	then
	  echo -e "auth-user-pass\r"
	fi
	echo -e "pull\r"
	echo -e "auth ${VPNDIGEST}\r"
	echo -e "tls-client\r"
	echo -e "route-method exe\r"
	echo -e "route-delay 2\r"
	echo -e "hand-window 120\r"
	} >$2
}

function createvpnca {
  echo "Create VPN CA"
  TMPVPNNUMBER=$1
  shift

  TMPCADIR=/etc/cu/openvpnca/$TMPVPNNUMBER
  TMPVPNDIR=/etc/openvpn/keys/$TMPVPNNUMBER

  mkdir -p -m 700 $TMPCADIR

  mkdir -p ${TMPCADIR}/certs
  mkdir -p ${TMPCADIR}/crl
  mkdir -p ${TMPCADIR}/newcerts
  mkdir -p ${TMPCADIR}/private
  echo "01" > ${TMPCADIR}/serial
  test -f ${TMPCADIR}/index.txt || touch ${TMPCADIR}/index.txt

  #  -keyout $OUTDIR/$KEYFILE \
  cd $TMPCADIR
  if test -f $TMPCADIR/cakey.pem -o -f $TMPCADIR/cacert.pem
  then
    DATE=$(date -r $TMPCADIR/cakey.pem +%Y%m%d%H%M)
    test -z "$DATE" && DATE=$(date -r $TMPCADIR/cacert.pem +%Y%m%d%H%M)
    mkdir -p -m 0700 $TMPCADIR/old/$DATE
    cp -a $TMPCADIR/cakey.pem $TMPCADIR/cacert.pem $TMPCADIR/old/$DATE/
  fi

  openssl req $@ -new -nodes -sha256 -passin pass:"" -x509 -keyout $TMPCADIR/cakey.pem \
    -out $TMPCADIR/cacert.pem

  test -f $TMPCADIR/cacert.pem &&
  mkdir -p -m 700 $TMPVPNDIR
  cp $TMPCADIR/cacert.pem $TMPVPNDIR/ &&
    echo -n >$TMPCADIR/index.txt &&
    date "+%s" >${TMPCADIR}/serial

  echo '
HOME			= /etc/cu/openvpnca/'"$TMPVPNNUMBER"'
oid_section		= new_oids

[ new_oids ]

[ ca ]
default_ca	= CA_default		# The default ca section

[ CA_default ]
dir		= /etc/cu/openvpnca/'"$TMPVPNNUMBER"'		# Where everything is kept
certs		= $dir/certs		# Where the issued certs are kept
crl_dir		= $dir/crl		# Where the issued crl are kept
database	= $dir/index.txt	# database index file.
new_certs_dir	= $dir/newcerts		# default place for new certs.
certificate	= $dir/cacert.pem 	# The CA certificate
serial		= $dir/serial 		# The current serial number
crl		= $dir/crl.pem 		# The current CRL
private_key	= $dir/cakey.pem# The private key
x509_extensions	= usr_cert		# The extentions to add to the cert
name_opt 	= ca_default		# Subject Name options
cert_opt 	= ca_default		# Certificate field options
default_days	= 36500			# how long to certify for
default_crl_days= 30			# how long before next CRL
default_md	= md5			# which md to use.
preserve	= no			# keep passed DN ordering
policy		= policy_match

[ policy_match ]
countryName		= match
stateOrProvinceName	= match
organizationName	= match
organizationalUnitName	= optional
commonName		= supplied
emailAddress		= optional

[ policy_anything ]
countryName		= optional
stateOrProvinceName	= optional
localityName		= optional
organizationName	= optional
organizationalUnitName	= optional
commonName		= supplied
emailAddress		= optional

[ req ]
default_bits		= 4096
default_keyfile 	= privkey.pem
distinguished_name	= req_distinguished_name
attributes		= req_attributes
x509_extensions	= v3_ca	# The extentions to add to the self signed cert
string_mask = nombstr

[ req_distinguished_name ]
countryName			= Country Name (2 letter code)
countryName_default		= DE
countryName_min			= 2
countryName_max			= 2
stateOrProvinceName		= State or Province Name (full name)
stateOrProvinceName_default	= Some-State
localityName			= Locality Name (eg, city)
0.organizationName		= Organization Name (eg, company)
0.organizationName_default	= Internet Widgits Pty Ltd
organizationalUnitName		= Organizational Unit Name (eg, section)
commonName			= Common Name (eg, YOUR name)
commonName_max			= 64
emailAddress			= Email Address
emailAddress_max		= 64

[ req_attributes ]
challengePassword		= A challenge password
challengePassword_min		= 4
challengePassword_max		= 20
unstructuredName		= An optional company name

[ usr_cert ]
basicConstraints=CA:FALSE
nsComment			= "OpenSSL Generated Certificate"
subjectKeyIdentifier=hash
authorityKeyIdentifier=keyid,issuer:always

[ v3_req ]
basicConstraints = CA:FALSE
keyUsage = nonRepudiation, digitalSignature, keyEncipherment

[ v3_ca ]
subjectKeyIdentifier=hash
authorityKeyIdentifier=keyid:always,issuer:always
basicConstraints = CA:true

[ crl_ext ]
authorityKeyIdentifier=keyid:always,issuer:always
' > $TMPCADIR/ca.cnf

  openssl ca -md sha256 -config /etc/cu/openvpnca/$TMPVPNNUMBER/ca.cnf \
    -gencrl -out $TMPVPNDIR/crl.pem

}

function createvpncertserver {
  echo "Create VPN $1 server cert"
  TMPVPNNUMBER=$1
  shift

  TMPCADIR=/etc/cu/openvpnca/$TMPVPNNUMBER
  mkdir -p $TMPCADIR

  if ! test -f $TMPCADIR/cakey.pem
  then
    echo "CA fehlt - Abbruch!"
    return
  fi

  TMPOUTDIR=/etc/openvpn/keys/$TMPVPNNUMBER
  mkdir -p -m 700 $TMPOUTDIR

  cd $TMPCADIR
  echo Erzeuge Request $TMPVPNNUMBER/server
  openssl req $@ -nodes -new -x509 -keyout $TMPOUTDIR/server.key \
    -out $TMPOUTDIR/server.req

  echo Konvertiere
  openssl x509 -x509toreq -in $TMPOUTDIR/server.req \
    -signkey $TMPOUTDIR/server.key -out $TMPOUTDIR/server.tmp

  echo Signiere
  openssl ca -config /etc/cu/openvpnca/$TMPVPNNUMBER/ca.cnf -policy policy_anything \
    -out $TMPOUTDIR/server.crt -batch -infiles $TMPOUTDIR/server.tmp \
   && rm -f $TMPOUTDIR/server.tmp

  cat $TMPOUTDIR/server.req >>$TMPOUTDIR/server.crt
}

function createvpncert {
  echo "Create VPN $1 client $2 cert"

  TMPVPNNUMBER=$1
  TMPCLIENTNUMBER=$2
  shift
  shift

  TMPCADIR=/etc/cu/openvpnca/$TMPVPNNUMBER

  if ! test -f $TMPCADIR/cakey.pem
  then
    echo "CA fehlt - Abbruch!"
    return
  fi

  TMPOUTDIR=/etc/cu/openvpnca/$TMPVPNNUMBER/$TMPCLIENTNUMBER
  mkdir -p -m 700 $TMPOUTDIR

  cd $TMPCADIR
  #openssl req $@ -new -nodes -passin pass:"" -keyout $TMPOUTDIR/newreq.pem \
  #  -out $TMPOUTDIR/newreq.pem
  echo "Erzeuge Request VPN $TMPVPNNUMBER / Klient $TMPCLIENTNUMBER"
  openssl req $@ -nodes -sha256 -new -x509 -keyout $TMPOUTDIR/$TMPCLIENTNUMBER.key \
    -out $TMPOUTDIR/$TMPCLIENTNUMBER.req

  #  -keyout $TMPOUTDIR/$KEYFILE \
  #openssl ca -config /etc/cu/ca/ca.cnf -policy policy_anything -out $TMPOUTDIR/$OUTFILE \
  #  -keyfile $TMPCADIR/cakey.pem -cert $TMPCADIR/cacert.pem \
  #  -batch -infiles $TMPOUTDIR/newreq.pem
  echo Konvertiere
  openssl x509 -x509toreq -sha256 -in $TMPOUTDIR/$TMPCLIENTNUMBER.req \
    -signkey $TMPOUTDIR/$TMPCLIENTNUMBER.key -out $TMPOUTDIR/$TMPCLIENTNUMBER.tmp

  echo Signiere
  openssl ca -md sha256 -config /etc/cu/openvpnca/$TMPVPNNUMBER/ca.cnf -policy policy_anything \
    -out $TMPOUTDIR/$TMPCLIENTNUMBER.crt -batch -infiles $TMPOUTDIR/$TMPCLIENTNUMBER.tmp \
   && rm -f $TMPOUTDIR/$TMPCLIENTNUMBER.tmp || sleep 5

  cat $TMPOUTDIR/$TMPCLIENTNUMBER.req >>$TMPOUTDIR/$TMPCLIENTNUMBER.crt
}

function openvpn_show {
	if test "$VPNCOPIED" = "yes"
	then
	  VPNTMP=$VPNTMPDIR
	else
	  VPNTMP=$VPNDIR
	fi
          echo "OpenVPN-Verbindungen"
          echo "--------------------"
          for i in `ls ${VPNTMP}|sort -n`
          do
            test ! -f ${VPNTMP}/$i && continue
            openvpn_read ${VPNTMP}/$i
            echo "${VPNNUMBER}$(test "$VPNAKTIV" = "Nein" && echo "(inaktiv)") ${VPNTITLE}: ${VPNMODE} ${VPNLOCALINTIP} -> ${VPNLOCALEXTIP}:${VPNPROTO}:${VPNLOCALEXTPORT}"
            if test -n "${VPNREMOTEEXTIP}" -a -n "${VPNREMOTEEXTPORT}"
            then
              echo "    --> ${VPNREMOTEEXTIP}:${VPNREMOTEEXTPORT} -> ${VPNREMOTEINTIP} -> ${VPNREMOTEINTNET}"
            elif test -n "${VPNREMOTEEXTPORT}"
            then
              echo "    --> any:${VPNREMOTEEXTPORT} -> ${VPNREMOTEINTIP} -> ${VPNREMOTEINTNET}"
            elif test -n "${VPNREMOTEEXTIP}"
            then
              echo "    --> ${VPNREMOTEEXTIP}:any -> ${VPNREMOTEINTIP} -> ${VPNREMOTEINTNET}"
            else
              echo "    --> any:any -> ${VPNREMOTEINTIP} -> ${VPNREMOTEINTNET}"
            fi
	    if test "$VPNMODE" = "server" -a -n "$VPNREMOTEINTFIRST" -a -n "$VPNREMOTEINTLAST"
	    then
	      echo "    Multi: intern $VPNCLIENTNET, $VPNREMOTEINTFIRST bis $VPNREMOTEINTLAST"
	    fi
	    if test "$VPNMODE" = "server" -a -n "$VPNPUSHROUTE"
	    then
	      echo "    Push-Route: $VPNPUSHROUTE"
	    fi
            echo "    (rate ${VPNRATELIMIT} ${VPNEXTRA}"
            test -n "$VPNCOMMENT" && echo "    Kommentar: $VPNCOMMENT"
          done 2>/dev/null
}

function openvpn_show_certs {
  if test "$VPNCOPIED" = "yes"
  then
    VPNTMP=$VPNTMPDIR
  else
    VPNTMP=$VPNDIR
  fi
  echo "OpenVPN-SSL-Zertifikate auf $CUHOSTNAME.$CUDOMAIN"
  echo "-----------------------"
  echo "(nur aktive VPNs mit Modus server oder client)"
  for i in `ls ${VPNTMP}|sort -n`
  do
    test ! -f ${VPNTMP}/$i && continue
    openvpn_read ${VPNTMP}/$i
    test "$VPNAKTIV" = "Nein" && continue
    case "$VPNMODE" in
      client)
          echo ""
          echo "$VPNNUMBER: $VPNTITLE (Modus client)"
          echo "--"
          if test -f $OPENVPNCONFDIR/keys/$VPNNUMBER/client.crt
          then
            openssl x509 -noout -in $OPENVPNCONFDIR/keys/$VPNNUMBER/client.crt -subject -dates -fingerprint -email -serial -sha256
          else
            echo "Zertifikat nicht gefunden!"
          fi
          echo ""
        ;;
      server)
          echo ""
          echo "$VPNNUMBER: $VPNTITLE (Modus server)"
          echo "--"
          echo "Certification Authority (CA):"
          if test -f "${OPENVPNCONFDIR}/keys/$VPNNUMBER/cacert.pem"
          then
            openssl x509 -noout -in ${OPENVPNCONFDIR}/keys/$VPNNUMBER/cacert.pem -subject -dates -fingerprint -email -serial -sha256
          else
            echo "CA wird beim ersten Anwenden oder mit \"SSL-CA erzeugen\" erzeugt"
          fi
          echo ""
          echo "Server $VPNNUMBER:"
          if test -f "${OPENVPNCONFDIR}/keys/$VPNNUMBER/server.crt"
          then
            openssl x509 -noout -in ${OPENVPNCONFDIR}/keys/$VPNNUMBER/server.crt -subject -dates -fingerprint -email -serial -sha256
          else
            echo "Server-Zertifikat wird beim ersten Anwenden erzeugt"
          fi
          for VPNCLIENTNUMBER in $(seq 1 $VPNNUMCLIENTS)
          do
            if test -f ${CUDIR}/openvpnca/$VPNNUMBER/$VPNCLIENTNUMBER/$VPNCLIENTNUMBER.key
            then
              echo ""
              echo "Klient $VPNNUMBER-$VPNCLIENTNUMBER (${VPNCLIENTNAME[$VPNCLIENTNUMBER]}):"
              openssl x509 -noout -in ${CUDIR}/openvpnca/$VPNNUMBER/$VPNCLIENTNUMBER/$VPNCLIENTNUMBER.crt -subject -dates -fingerprint -email -serial -sha256
            fi
          done
          echo ""
        ;;
      *)
          continue
        ;;
    esac
  done
}

function openvpn_show_one_cert {
  if test "$VPNCOPIED" = "yes"
  then
    VPNTMP=$VPNTMPDIR
  else
    VPNTMP=$VPNDIR
  fi
  test -z "$1" && return
  echo "OpenVPN $1 auf $CUHOSTNAME.$CUDOMAIN: SSL-Zertifikate"
  echo "-----------------------"
  test ! -f ${VPNTMP}/$1 && continue
  openvpn_read ${VPNTMP}/$1
  case "$VPNMODE" in
      client)
          echo ""
          echo "$VPNNUMBER: $VPNTITLE (Modus client)"
          echo "--"
          if test -f $OPENVPNCONFDIR/keys/$VPNNUMBER/client.crt
          then
            openssl x509 -noout -in $OPENVPNCONFDIR/keys/$VPNNUMBER/client.crt -subject -dates -fingerprint -email -serial -sha256
          else
            echo "Zertifikat nicht gefunden!"
          fi
          echo ""
        ;;
      server)
          echo ""
          echo "$VPNNUMBER: $VPNTITLE (Modus server)"
          echo "--"
          echo "Certification Authority (CA):"
          if test -f "${OPENVPNCONFDIR}/keys/$VPNNUMBER/cacert.pem"
          then
            openssl x509 -noout -in ${OPENVPNCONFDIR}/keys/$VPNNUMBER/cacert.pem -subject -dates -fingerprint -email -serial -sha256
          else
            echo "CA wird beim ersten Anwenden oder mit \"SSL-CA erzeugen\" erzeugt"
          fi
          echo ""
          echo "Server $VPNNUMBER:"
          if test -f "${OPENVPNCONFDIR}/keys/$VPNNUMBER/server.crt"
          then
            openssl x509 -noout -in ${OPENVPNCONFDIR}/keys/$VPNNUMBER/server.crt -subject -dates -fingerprint -email -serial -sha256
          else
            echo "Server-Zertifikat wird beim ersten Anwenden erzeugt"
          fi
          for VPNCLIENTNUMBER in $(seq 1 $VPNNUMCLIENTS)
          do
            if test -f ${CUDIR}/openvpnca/$VPNNUMBER/$VPNCLIENTNUMBER/$VPNCLIENTNUMBER.key
            then
              echo ""
              echo "Klient $VPNNUMBER-$VPNCLIENTNUMBER (${VPNCLIENTNAME[$VPNCLIENTNUMBER]}):"
              openssl x509 -noout -in ${CUDIR}/openvpnca/$VPNNUMBER/$VPNCLIENTNUMBER/$VPNCLIENTNUMBER.crt -subject -dates -fingerprint -email -serial -sha256
            fi
          done
          echo ""
        ;;
      *)
          echo "Im VPN-Modus p2p gibt es keine SSL-Zertifikate!"
        ;;
  esac
}

function openvpn_show_old_certs {
  declare -i VALIDDAYS
  declare -i TODAYDAYS
  declare -i DAYDIFF
  TODAYDAYS=$(date -d yesterday +'%s')/86400
  if test "$VPNCOPIED" = "yes"
  then
    VPNTMP=$VPNTMPDIR
  else
    VPNTMP=$VPNDIR
  fi
  echo "Ablaufende OpenVPN-SSL-Zertifikate auf $CUHOSTNAME.$CUDOMAIN"
  echo "----------------------------------"
  echo "($MAXCERTAGE Tage, nur aktive VPNs mit Modus server oder client)"
  for i in `ls ${VPNTMP}|sort -n`
  do
    test ! -f ${VPNTMP}/$i && continue
    openvpn_read ${VPNTMP}/$i
    test "$VPNAKTIV" = "Nein" && continue
    case "$VPNMODE" in
      client)
          if test -f $OPENVPNCONFDIR/keys/$VPNNUMBER/client.crt
          then
            VALIDDATE="$(openssl x509 -noout -in $OPENVPNCONFDIR/keys/$VPNNUMBER/client.crt -dates|grep notAfter|cut -d = -f 2-)"
            VALIDDAYS=$(date -d "$VALIDDATE" +%s)/86400
            DAYDIFF=$VALIDDAYS-$TODAYDAYS
            if test $DAYDIFF -lt $MAXCERTAGE
            then
              echo ""
              echo "$VPNNUMBER: $VPNTITLE (Modus client)"
              echo "--"
              echo "Ablauf $VALIDDATE ($DAYDIFF Tage)"
              echo ""
            fi
          fi
        ;;
      server)
          ABLAUF="Keine"
          echo ""
          echo "$VPNNUMBER: $VPNTITLE (Modus server)"
          echo "--"
          if test -f "${OPENVPNCONFDIR}/keys/$VPNNUMBER/cacert.pem"
          then
            VALIDDATE="$(openssl x509 -noout -in ${OPENVPNCONFDIR}/keys/$VPNNUMBER/cacert.pem -dates|grep notAfter|cut -d = -f 2-)"
            VALIDDAYS=$(date -d "$VALIDDATE" +%s)/86400
            DAYDIFF=$VALIDDAYS-$TODAYDAYS
            if test $DAYDIFF -lt $MAXCERTAGE
            then
              echo "CA $VPNNUMBER:       Ablauf $VALIDDATE ($DAYDIFF Tage)"
              ABLAUF=
            fi
          fi
          if test -f "${OPENVPNCONFDIR}/keys/$VPNNUMBER/server.crt"
          then
            VALIDDATE="$(openssl x509 -noout -in ${OPENVPNCONFDIR}/keys/$VPNNUMBER/server.crt -dates|grep notAfter|cut -d = -f 2-)"
            VALIDDAYS=$(date -d "$VALIDDATE" +%s)/86400
            DAYDIFF=$VALIDDAYS-$TODAYDAYS
            if test $DAYDIFF -lt $MAXCERTAGE
            then
              echo "Server $VPNNUMBER:   Ablauf $VALIDDATE ($DAYDIFF Tage)"
              ABLAUF=
            fi
          fi
          for VPNCLIENTNUMBER in $(seq 1 $VPNNUMCLIENTS)
          do
            if test -f ${CUDIR}/openvpnca/$VPNNUMBER/$VPNCLIENTNUMBER/$VPNCLIENTNUMBER.key
            then
              if test -f "${CUDIR}/openvpnca/$VPNNUMBER/$VPNCLIENTNUMBER/$VPNCLIENTNUMBER.crt"
              then
                VALIDDATE="$(openssl x509 -noout -in ${CUDIR}/openvpnca/$VPNNUMBER/$VPNCLIENTNUMBER/$VPNCLIENTNUMBER.crt -dates|grep notAfter|cut -d = -f 2-)"
                VALIDDAYS=$(date -d "$VALIDDATE" +%s)/86400
                DAYDIFF=$VALIDDAYS-$TODAYDAYS
                if test $DAYDIFF -lt $MAXCERTAGE
                then
                  echo "Klient $VPNNUMBER-$VPNCLIENTNUMBER (${VPNCLIENTNAME[$VPNCLIENTNUMBER]}): Ablauf $VALIDDATE ($DAYDIFF Tage)"
                  ABLAUF=
                fi
              fi
            fi
          done
          echo "$ABLAUF"
        ;;
      *)
          continue
        ;;
    esac
  done
}

function list_openvpn {
  for i in `ls ${VPNTMPDIR}|sort -n`
  do
    VPNAKTIV=Ja
    openvpn_read ${VPNTMPDIR}/$i
    if test "$VPNAKTIV" = "Ja"
    then
      echo "${VPNNUMBER}" "${VPNTITLE}"
    else
      echo "${VPNNUMBER}" "\Z1${VPNTITLE}"
    fi
  done
}

function openvpn_client_name_list {
  for TMPCL in $(seq 1 $2)
  do
    if test -n "${VPNCLIENTNAME[$TMPCL]}"
    then
      echo "$TMPCL $(max_print ${VPNCLIENTNAME[$TMPCL]// /_})"
    else
      echo "$TMPCL (unbekannt)"
    fi
  done
  unset TMPCL
}

function openvpn_menu {
  # Check whether the directories exist and create them if necessary.
  if [ \! -d ${VPNDIR} ]
  then
	mkdir -m 700 -p ${VPNDIR}
  fi
  if [ \! -d ${VPNTMPDIR} ]
  then
	mkdir -m 700 -p ${VPNTMPDIR}
  fi

  # First remove the old tmp files, then copy the current active files to the
  # tmp directory, where they can be changed.
  if [ "${VPNCOPIED}" = "no" ]
  then
	rm -f ${VPNTMPDIR}/*

	# Copy the files, this will result in an error message, when there are
	# no files present. Therefore redirect the output.
	cp ${VPNDIR}/[0-9]* ${VPNTMPDIR} 2>/dev/null

	VPNCOPIED=yes
  fi

  while $DIALOG --title "$USER@$HOSTNAME: OpenVPN-Verbindungen" \
             --backtitle "$BACKTITLE" --default-item "$VPNCHOICE" --colors \
             --menu "OpenVPN-Verbindungen der TightGate-Pro-Systeme" $BL $BC $MAXLINES \
             "Ende" "Dieses Menü verlassen" \
             "Übersicht" "Alle Verbindungen auflisten" \
             "Zertifikate" "Alle SSL-Zertifikate auflisten" \
             "Ablaufende Zertifikate" "Lebensdauer unter $MAXCERTAGE Tagen" \
             "Neu" "Verbindung hinzufügen" \
             "Kopieren" "Verbindung kopieren" \
	     "Löschen" "Verbindung löschen" \
	     "Replizieren" "Verbindung auf Nodes kopieren" \
             "--------------" " " \
             $(list_openvpn) \
             2>$TMPFILE
  do
    VPNCHOICE=`cat $TMPFILE`
    case "$VPNCHOICE" in
      'Ende')
        break
      ;;

      'Übersicht')
        openvpn_show >$TMPFILE
        $DIALOG --title "$TITLE" \
                --backtitle "$BACKTITLE" \
                --textbox $TMPFILE $BL $BC
      ;;

      'Zertifikate')
        openvpn_show_certs >$TMPFILE
        $DIALOG --title "$TITLE" \
                --backtitle "$BACKTITLE" \
                --textbox $TMPFILE $BL $BC
      ;;

      'Ablaufende Zertifikate')
        openvpn_show_old_certs >$TMPFILE
        $DIALOG --title "$TITLE" \
                --backtitle "$BACKTITLE" \
                --textbox $TMPFILE $BL $BC
      ;;

      'Löschen')
	if $DIALOG --title "$USER@$HOSTNAME: OpenVPN-Verbindungen" \
             --backtitle "$BACKTITLE" \
             --menu "Welche Verbindung möchten Sie löschen?" $BL $BC $MAXLINES \
             $(for i in `ls $VPNTMPDIR|sort -n`;do openvpn_read ${VPNTMPDIR}/$i; \
		echo "${VPNNUMBER}" "${VPNTITLE}";done) \
             2>$TMPFILE
	then
	  TMP=$(cat $TMPFILE)
	  if [ -f ${VPNTMPDIR}/${TMP} ]
	  then
	    . ${VPNTMPDIR}/${TMP}
            if $DIALOG --title "OpenVPN-Verbindungen" \
                       --backtitle "$BACKTITLE" \
                       --defaultno \
                       --yesno "OpenVPN-Verbindung ${VPNNUMBER}: ${VPNTITLE} wirklich löschen?" 6 $BC \
             2>$TMPFILE
            then
              rm ${VPNTMPDIR}/${TMP}
              NEEDSAVE=yes
	      NEEDAPPLY=yes
            fi
	  fi
	fi
      ;;

      'Kopieren')
	if $DIALOG --title "$USER@$HOSTNAME: OpenVPN-Verbindungen" \
             --backtitle "$BACKTITLE" \
             --menu "Welche Verbindung möchten Sie kopieren?" $BL $BC $MAXLINES \
             $(for i in `ls $VPNTMPDIR|sort -n`;do openvpn_read ${VPNTMPDIR}/$i; \
		echo "${VPNNUMBER}" "${VPNTITLE}";done) \
             2>$TMPFILE
	then
	  TMP=$(cat $TMPFILE)
	  if [ -f ${VPNTMPDIR}/${TMP} ]
	  then
	    openvpn_read ${VPNTMPDIR}/${TMP}
	    for TMPNUMBER in `seq $TMP ${VPNMAXNR}`
	    do
		if [ \! -f ${VPNTMPDIR}/${TMPNUMBER} ]
		then
			break
		fi
	    done
            if $DIALOG --title "OpenVPN-Verbindung $VPNNUMBER kopieren" \
                      --backtitle "$BACKTITLE" --max-input 2 \
                      --inputbox "Nummer der Kopie von Verbindung ${VPNNUMBER}: ${VPNTITLE} (1-$VPNMAXNR)" 8 $BC "$TMPNUMBER" \
                      2>$TMPFILE
            then
              NEWVPNNUMBER=`cat $TMPFILE`
              check_input single number "$NEWVPNNUMBER" || continue
              if ! test "$NEWVPNNUMBER" -gt 0
              then
                $DIALOG --title "Fehler: Kopie der OpenVPN-Verbindung ${VPNNUMBER}" \
                        --backtitle "$BACKTITLE" \
                        --msgbox "Ungültige Nummer ${NEWVPNNUMBER}!" 8 $BC
                continue
              fi
	      if [ "${NEWVPNNUMBER}" -gt "$VPNMAXNR" ]
	      then
	        $DIALOG --title "$ERRTITLE" \
        	       --backtitle "$BACKTITLE" \
	               --msgbox "Bitte wählen Sie eine Nummer von 1 bis $VPNMAXNR!" 5 $BC
		continue
	      fi
            else
              continue
            fi

            NEWVPNFILE=${VPNTMPDIR}/${NEWVPNNUMBER}
            if test -f $NEWVPNFILE
            then
              $DIALOG --title "Fehler: Kopie der OpenVPN-Verbindung ${VPNNUMBER}" \
                      --backtitle "$BACKTITLE" \
                      --msgbox "Verbindung Nummer ${NEWVPNNUMBER} existiert bereits!" 8 $BC
              continue
            fi
            if test "$VPNMODE" = "server" -a -d ${CUDIR}/openvpnca/$VPNNUMBER
            then
              if $DIALOG --title "OpenVPN-Verbindung $VPNNUMBER kopieren auf $NEWVPNNUMBER" \
                         --backtitle "$BACKTITLE" \
                         --defaultno \
                         --yesno "Sollen auch die CA und die Keys kopiert werden?" 5 $BC \
                2>$TMPFILE
              then
                rm -rf ${CUDIR}/openvpnca/$NEWVPNNUMBER
                cp -a ${CUDIR}/openvpnca/$VPNNUMBER ${CUDIR}/openvpnca/$NEWVPNNUMBER
                rm -rf $OPENVPNCONFDIR/keys/$NEWVPNNUMBER
                cp -a $OPENVPNCONFDIR/keys/$VPNNUMBER $OPENVPNCONFDIR/keys/$NEWVPNNUMBER
              fi
            fi
            VPNNUMBER=${NEWVPNNUMBER}
            VPNFILE=${NEWVPNFILE}
            >${VPNFILE}
            write_openvpn ${VPNFILE}
            NEEDSAVE=yes
            NEEDAPPLY=yes
            VPNCHOICE=$VPNNUMBER
	  fi
	fi
      ;;

      'Replizieren')
	if $DIALOG --title "$USER@$HOSTNAME: OpenVPN-Verbindungen" \
             --backtitle "$BACKTITLE" \
             --menu "Welche Verbindung möchten Sie replizieren?" $BL $BC $MAXLINES \
             $(for i in `ls $VPNTMPDIR|sort -n`;do openvpn_read ${VPNTMPDIR}/$i; \
		echo "${VPNNUMBER}" "${VPNTITLE}";done) \
             2>$TMPFILE
	then
	  TMP=$(cat $TMPFILE)
	  if [ -f ${VPNTMPDIR}/${TMP} ]
	  then
	    openvpn_read ${VPNTMPDIR}/${TMP}
            if $DIALOG --title "OpenVPN-Verbindung $VPNNUMBER replizieren?" \
                      --backtitle "$BACKTITLE" --max-input 15 \
                      --inputbox "Auf welche IP-Adresse möchten Sie Verbindung ${VPNNUMBER}: ${VPNTITLE} replizieren?" 8 $BC "" \
                      2>$TMPFILE
            then
              TARGET=`cat $TMPFILE`
              check_input single ip "$TARGET" || continue
              test -n "$TARGET" || continue
            else
              continue
            fi
            ssh root@$TARGET mkdir -p -m 700 $VPNDIR $OPENVPNCONFDIR/keys/$VPNNUMBER $OPENVPNCONFDIR/clients/$VPNNUMBER
            scp ${VPNTMPDIR}/${VPNNUMBER} root@$TARGET:$VPNDIR/
            scp $OPENVPNCONFDIR/keys/$VPNNUMBER/* root@$TARGET:$OPENVPNCONFDIR/keys/$VPNNUMBER/
            scp $OPENVPNCONFDIR/clients/$VPNNUMBER/* root@$TARGET:$OPENVPNCONFDIR/clients/$VPNNUMBER/
            ssh root@$TARGET ceph-config anwenden
            sleep 2
	  fi
	fi
      ;;

      'Neu')
	for TMPNUMBER in `seq 1 ${VPNMAXNR}`
	do
		if [ \! -f ${VPNTMPDIR}/${TMPNUMBER} ]
		then
			break
		fi
	done
        if $DIALOG --title "Neue OpenVPN-Verbindung" \
                  --backtitle "$BACKTITLE" --max-input 2 \
                  --inputbox "Nummer der neuen Verbindung (1-$VPNMAXNR)" 8 $BC "$TMPNUMBER" \
                  2>$TMPFILE
        then
          VPNNUMBER=`cat $TMPFILE`
          check_input single number "$VPNNUMBER" || continue
          if ! test "$VPNNUMBER" -gt 0
          then
            $DIALOG --title "Fehler: Neue OpenVPN-Verbindung ${VPNNUMBER}" \
                    --backtitle "$BACKTITLE" \
                    --msgbox "Ungültige Nummer ${VPNNUMBER}!" 8 $BC
            continue
          fi
          if test "$VPNNUMBER" -gt $VPNMAXNR
          then
            $DIALOG --title "Fehler: Neue OpenVPN-Verbindung ${VPNNUMBER}" \
                    --backtitle "$BACKTITLE" \
                    --msgbox "Ungültige Nummer ${VPNNUMBER}!" 8 $BC
            continue
          fi
        else
           echo "Abbruch"
	   continue
        fi

	VPNFILE=${VPNTMPDIR}/${VPNNUMBER}
	if test -f $VPNFILE
	then
          $DIALOG --title "Fehler: Neue OpenVPN-Verbindung ${VPNNUMBER}" \
                  --backtitle "$BACKTITLE" \
                  --msgbox "Verbindung Nummer ${VPNNUMBER} existiert bereits!" 8 $BC
	   continue
        fi

	VPNAKTIV=Ja
	VPNMODE=p2p
	VPNREMOTEDYN=
	VPNAUTHUSERPASS=Nein
	VPNREMOTEINTFIRST=
	VPNREMOTEINTLAST=
	VPNFWACCESS=Nein
	VPNINTACCESS=Nein
	VPNCIPHER="BF-CBC"
	VPNDIGEST="SHA256"
	VPNTLSAUTH=Ja
	VPNNUMCLIENTS=1
	VPNREDIRECT=Nein
	VPNPUSHDNS=Nein
	VPNPUSHROUTE=
	VPNUSER=
	VPNPASS=
	VPNCLIENTNET=
        VPNTITLE="TightGate-Pro"
        VPNCOMMENT="TightGate-Pro-Anbindung"

        VPNMODE=server
        VPNPROTO=tcp-server

        VPNPROXYTYPE="ohne"
        VPNPROXY=
        VPNPROXYPORT=
        VPNLOCALEXTIP=

        TMP=$((1200+$VPNNUMBER))
        VPNLOCALEXTPORT=unset
        while $DIALOG --title "Neue OpenVPN-Verbindung ${VPNNUMBER}: ${VPNTITLE}" \
                  --backtitle "$BACKTITLE" --max-input 5 \
                  --inputbox "Lokaler externer VPN-Port (Vorschlag ist 1200 + Nummer = $TMP)" 8 $BC "$TMP" \
                  2>$TMPFILE
        do
          TMP=`cat $TMPFILE`
          check_input single portnumber "$TMP" || continue
          if test -z "$TMP"
          then
            $DIALOG --title "Fehler: Neue OpenVPN-Verbindung ${VPNNUMBER}" \
                  --backtitle "$BACKTITLE" \
                  --msgbox "Bitte geben Sie den lokalen externen Port ein!" 5 $BC
            continue
          fi
          VPNLOCALEXTPORT=$TMP
          break
        done
        test "$VPNLOCALEXTPORT" = "unset" && continue

        VPNREMOTEEXTIP=
        VPNREMOTEDYN=Ja
        VPNREMOTEEXTPORT=

        TMP="192.168.${VPNNUMBER}.1"
        VPNLOCALINTIP=unset
        while $DIALOG --title "Neue OpenVPN-Verbindung ${VPNNUMBER}: ${VPNTITLE}" \
                  --backtitle "$BACKTITLE" \
                  --inputbox "Lokale interne Tunnel-IP-Adresse (a.b.c.d)" 8 $BC "$TMP" \
                  2>$TMPFILE
        do
          TMP=`cat $TMPFILE`
          check_input single ip "$TMP" || continue
          if test -z "$TMP"
          then
            $DIALOG --title "Fehler: Neue OpenVPN-Verbindung ${VPNNUMBER}" \
                  --backtitle "$BACKTITLE" \
                  --msgbox "Bitte geben Sie die lokale interne IP-Adresse ein!" 5 $BC
            continue
          fi
          VPNLOCALINTIP=$TMP
          break
        done
        test "$VPNLOCALINTIP" = "unset" && continue

        TMP="192.168.${VPNNUMBER}.2"
        VPNREMOTEINTIP=unset
        while $DIALOG --title "Neue OpenVPN-Verbindung ${VPNNUMBER}: ${VPNTITLE}" \
                  --backtitle "$BACKTITLE" \
                  --inputbox "Ferne interne Tunnel-IP-Adresse (a.b.c.d, lokale Tunnel-IP ist $VPNLOCALINTIP)" 8 $BC "$TMP" \
                  2>$TMPFILE
        do
          TMP=`cat $TMPFILE`
          check_input single ip "$TMP" || continue
          if test -z "$TMP"
          then
            $DIALOG --title "Fehler: Neue OpenVPN-Verbindung ${VPNNUMBER}" \
                  --backtitle "$BACKTITLE" \
                  --msgbox "Bitte geben Sie die ferne interne IP-Adresse ein!" 5 $BC
            continue
          fi
          VPNREMOTEINTIP=$TMP
          break
        done
        test "$VPNREMOTEINTIP" = "unset" && continue

        VPNREMOTEINTNET=

        TMP=
        VPNRATELIMIT=unset
        while $DIALOG --title "Neue OpenVPN-Verbindung ${VPNNUMBER}: ${VPNTITLE}" \
                  --backtitle "$BACKTITLE" --max-input 10 \
                  --inputbox "Maximale Sende-Rate in Bytes/s (0 für unbegrenzt)" 8 $BC "$TMP" \
                  2>$TMPFILE
        do
          TMP=`cat $TMPFILE`
          check_input single number "$TMP" || continue
          test -z "$TMP" && TMP=0
          VPNRATELIMIT="$TMP"
          break
        done
        test "$VPNRATELIMIT" = "unset" && continue
        VPNEXTRA="undef"
        while test "$VPNEXTRA" = "undef"
        do
          if $DIALOG --title "Neue OpenVPN-Verbindung ${VPNNUMBER}: ${VPNTITLE}" \
                   --backtitle "$BACKTITLE" \
                   --checklist "Bitte wählen Sie weitere Optionen"\
                   $BL $BC 4 \
                   comp-lzo "Pakete möglichst komprimieren" "$(onofflist "$VPNEXTRA" comp-lzo)" \
                   comp-noadapt "Immer komprimieren" "$(onofflist "$VPNEXTRA" comp-noadapt)" \
                   keepalive "Laufend prüfen (Partner mit keepalive o. ping)" "$(onofflist "$VPNEXTRA" keepalive)" \
                   passtos "Type of Service (TOS) übernehmen" "$(onofflist "$VPNEXTRA" passtos)" \
            2>$TMPFILE
          then
            VPNEXTRA=`cat $TMPFILE|tr -d '"'`
          else
            break
          fi
        done

        VPNDATE="$(date -I)"
	>${VPNFILE}
	write_openvpn ${VPNFILE}
        NEEDSAVE=yes
        NEEDAPPLY=yes
        VPNCHOICE=$VPNNUMBER
      ;;

      *)
	VPNFILE=${VPNTMPDIR}/${VPNCHOICE}

	if [ -f ${VPNFILE} ]
	then
	  openvpn_read ${VPNFILE}

	  while true
	  do
	    {
	      echo 'function openvpn_menu_func {'
	      echo '$DIALOG --title "$USER@$HOSTNAME: OpenVPN-Verbindung: ${VPNNUMBER}" \'
	      echo '        --backtitle "$BACKTITLE" \'
	      echo '        --default-item "$VPNSUBCHOICE" \'
	      echo '	--menu "Was möchten Sie durchführen?" $BL $BC $(gl 34) \'
	      echo '        "Ende" "Dieses Menü verlassen" \'
	      if test "$VPNMODE" = "server" -o "$VPNMODE" = "client"
	      then
                echo '        "Zertifikate" "SSL-Zertifikate anzeigen" \'
              fi
	      echo '	"Löschen" "OpenVPN-Verbindung löschen" \'
	      echo '        "--------------" " " \'
	      echo '	"Nummer:" "${VPNNUMBER}" \'
	      echo '	"Titel:" "${VPNTITLE}" \'
	      echo '    "Kommentar:" "$(max_print ${VPNCOMMENT})" \'
	      echo '	"VPN aktiviert:" "${VPNAKTIV}" \'
	      echo '	"Lokaler externer VPN-Port:" "${VPNLOCALEXTPORT}" \'
	      echo '	"Lokale Tunnel-IP-Adresse:" "${VPNLOCALINTIP}" \'
	      echo '	"Ferne Tunnel-IP-Adresse:" "${VPNREMOTEINTIP}" \'
	      echo '	"Verschlüsselung:" "${VPNCIPHER}" \'
	      echo '	"Hash-Verfahren:" "${VPNDIGEST}" \'
	      echo '	"TLS-Auth benutzen:" "${VPNTLSAUTH}" \'
	      echo '	"Sende-Rate:" "${VPNRATELIMIT}" \'
	      echo '	"Weitere Optionen:" "$(max_print ${VPNEXTRA})" \'
	      echo '	"Server-CN:" "$VPNSERVERCN" \'
	      echo '	"SSL-CA erzeugen:" "$(test -f $OPENVPNCONFDIR/keys/$VPNNUMBER/cacert.pem && echo vorhanden || echo nicht vorhanden)" \'
	      echo '	"Server-Zertifikat erzeugen" "$(test -f ${OPENVPNCONFDIR}/keys/$VPNNUMBER/server.key && echo vorhanden || echo nicht vorhanden)" \'
	      echo '	"Anzahl Klienten:" "$VPNNUMCLIENTS" \'
	      echo '	"Klienten-Netzwerk:" "$VPNCLIENTNET" \'
	      echo '	"Erste Klienten-IP:" "$VPNREMOTEINTFIRST" \'
	      echo '	"Letzte Klienten-IP:" "$VPNREMOTEINTLAST" \'
	      echo '	"Push Route:" "$(max_print $VPNPUSHROUTE)" \'
	      echo '	"Klienten-Zertifikate erzeugen" "" \'
	      echo '	"Klienten-Namen" "Namen vergeben" \'
	      echo '	"Klienten-Zert. in Transfer" "In ~/transfer exportieren" \'
	      echo '	"Klienten-Zertifikat sperren" "" \'
	      echo '	"Klienten-Zertifikate aufräumen" "" \'
	      echo ""
	      echo "}"
	    } >$TMPFILE
	    . $TMPFILE

	    if ! openvpn_menu_func 2>${TMPFILE}
	    then
	      break
	    fi
	    VPNSUBCHOICE=$(cat ${TMPFILE})
	    case $VPNSUBCHOICE in
	      'Ende')
		break
	      ;;

	      'Löschen')
                if $DIALOG --title "OpenVPN-Verbindung $VPNNUMBER: ${VPNTITLE}" \
                           --backtitle "$BACKTITLE" \
                           --defaultno \
                           --yesno "OpenVPN-Verbindung ${VPNNUMBER}:${VPNTITLE} wirklich löschen?" 5 $BC \
                 2>$TMPFILE
                then
                  rm ${VPNFILE}
                  NEEDSAVE=yes
                  NEEDAPPLY=yes
                fi
		break
	      ;;

              'Zertifikate')
                  openvpn_show_one_cert $VPNNUMBER >$TMPFILE
                  $DIALOG --title "$TITLE" \
                          --backtitle "$BACKTITLE" \
                          --textbox $TMPFILE $BL $BC
              ;;

	      'Nummer:')
	        TMP=$VPNNUMBER
	        while $DIALOG --title "OpenVPN-Verbindung $VPNNUMBER: ${VPNTITLE}" \
			--backtitle "$BACKTITLE" --max-input 2 \
			--inputbox "Neue Nummer (1-$VPNMAXNR)" 8 $BC "${TMP}" \
			2>$TMPFILE
		do
                  TMP=`cat $TMPFILE`
                  check_input single number "$TMP" || continue
                  if ! test "$TMP" -gt 0
                  then
                    $DIALOG --title "Fehler: OpenVPN-Verbindung ${VPNTITLE}" \
                            --backtitle "$BACKTITLE" \
                            --msgbox "Ungültige Nummer ${TMP}!" 8 $BC
                    continue
                  fi
                  if test "$TMP" -gt $VPNMAXNR
                  then
                    $DIALOG --title "Fehler: OpenVPN-Verbindung ${VPNNUMBER}" \
                            --backtitle "$BACKTITLE" \
                            --msgbox "Ungültige Nummer ${TMP}!" 8 $BC
                    continue 
                  fi
                  if test -f ${VPNTMPDIR}/${TMP}
                  then
                    $DIALOG --title "Fehler: OpenVPN-Verbindung ${VPNNUMBER}" \
                            --backtitle "$BACKTITLE" \
                            --msgbox "Verbindung Nummer ${TMP} existiert bereits!" 8 $BC
	            continue
                  fi
                  rm -f $VPNFILE
		  if test -f $OPENVPNCONFDIR/keys/$VPNNUMBER.key
		  then
		    mv $OPENVPNCONFDIR/keys/$VPNNUMBER.key $OPENVPNCONFDIR/keys/$TMP.key
		  fi
                  VPNNUMBER=$TMP
                  VPNFILE=${VPNTMPDIR}/${VPNNUMBER}
		  write_openvpn ${VPNFILE}
                  NEEDSAVE=yes
                  NEEDAPPLY=yes
                  break
		done
	      ;;

	      'Titel:')
	        TMP=$VPNTITLE
	        while $DIALOG --title "OpenVPN-Verbindung $VPNNUMBER: ${VPNTITLE}" \
			--backtitle "$BACKTITLE" \
                        --max-input $MAXTITLELEN \
			--inputbox "Titel" 8 $BC "${TMP}" \
			2>$TMPFILE
		do
		  TMP=`cat $TMPFILE|tr ' ' '_'`
                  check_input single text_ "$TMP" || continue
		  VPNTITLE="$TMP"
		  write_openvpn ${VPNFILE}
                  NEEDSAVE=yes
                  NEEDAPPLY=yes
                  break
		done
	      ;;

	      'Kommentar:')
	        TMP="$VPNCOMMENT"
	        while $DIALOG --title "OpenVPN-Verbindung $VPNNUMBER: ${VPNTITLE}" \
			--backtitle "$BACKTITLE" \
                        --max-input $MAXCOMMENTLEN \
			--inputbox "Kommentar" 8 $BC "${TMP}" \
			2>$TMPFILE
		do
	          TMP="`cat $TMPFILE`"
	          VPNCOMMENT="$TMP"
		  write_openvpn ${VPNFILE}
                  NEEDSAVE=yes
                  NEEDAPPLY=yes
                  break
		done
	      ;;

	      'VPN aktiviert:')
                if $DIALOG --title "OpenVPN-Verbindung ${VPNNUMBER}: ${VPNTITLE}" \
                    --backtitle "$BACKTITLE" \
                    --radiolist "Soll diese OpenVPN-Definition aktiviert werden?"\
                     $BL $BC 2 \
                      Ja "Aktivieren" "$(onoff $VPNAKTIV Ja)" \
                      Nein "Nicht aktivieren" "$(onoff $VPNAKTIV Nein)" \
                  2>$TMPFILE
                then
                  VPNAKTIV=`cat $TMPFILE`
		  write_openvpn ${VPNFILE}
                  NEEDSAVE=yes
                  NEEDAPPLY=yes
                fi
	      ;;

	      'Lokaler externer VPN-Port:')
	        TMP=$VPNLOCALEXTPORT
	        while $DIALOG --title "OpenVPN-Verbindung $VPNNUMBER" \
			--backtitle "$BACKTITLE" --max-input 5 \
			--inputbox "Lokaler externer Port (Standard ist 1194)" 8 $BC "${TMP}" \
			2>$TMPFILE
		do
		  TMP=`cat $TMPFILE`
                  check_input single portnumber "$TMP" || continue
                  if test "$VPNPROTO" != "tcp-client" -a -z "$TMP"
                  then
                    $DIALOG --title "Fehler: OpenVPN-Verbindung ${VPNNUMBER}" \
                            --backtitle "$BACKTITLE" \
                            --msgbox "Bitte geben Sie den lokalen externen Port ein!" 5 $BC
                    continue
                  fi
                  VPNLOCALEXTPORT="$TMP"
		  write_openvpn ${VPNFILE}
                  NEEDSAVE=yes
                  NEEDAPPLY=yes
                  break
		done
	      ;;

	      'Lokale Tunnel-IP-Adresse:')
	        TMP=$VPNLOCALINTIP
	        while $DIALOG --title "OpenVPN-Verbindung $VPNNUMBER" \
			--backtitle "$BACKTITLE" \
			--inputbox "Lokale interne Tunnel-IP-Adresse (a.b.c.d, ferne Tunnel-IP ist $VPNREMOTEINTIP)" 9 $BC "${TMP}" \
			2>$TMPFILE
		do
		  TMP=`cat $TMPFILE`
                  check_input single ip "$TMP" || continue
                  if test -z "$TMP"
                  then
                    $DIALOG --title "Fehler: OpenVPN-Verbindung ${VPNNUMBER}" \
                            --backtitle "$BACKTITLE" \
                            --msgbox "Bitte geben Sie die lokale interne IP-Adresse ein!" 5 $BC
                    continue
                  fi
                  VPNLOCALINTIP="$TMP"
		  write_openvpn ${VPNFILE}
                  NEEDSAVE=yes
                  NEEDAPPLY=yes
                  break
		done
	      ;;

	      'Ferne Tunnel-IP-Adresse:')
	        TMP=$VPNREMOTEINTIP
	        if test -z "$TMP" -a -n "$VPNLOCALINTIP"
	        then
	          TMP="$(echo $VPNLOCALINTIP|cut -d . -f 1-3).2"
	        fi
	        while $DIALOG --title "OpenVPN-Verbindung $VPNNUMBER" \
			--backtitle "$BACKTITLE" \
			--inputbox "Ferne interne Tunnel-IP-Adresse (a.b.c.d, lokale Tunnel-IP ist $VPNLOCALINTIP)" 9 $BC "${TMP}" \
			2>$TMPFILE
		do
		  TMP=`cat $TMPFILE`
                  check_input single ip "$TMP" || continue
                  if test -z "$TMP"
                  then
                    $DIALOG --title "Fehler: OpenVPN-Verbindung ${VPNNUMBER}" \
                            --backtitle "$BACKTITLE" \
                            --msgbox "Bitte geben Sie die ferne interne IP-Adresse ein!" 5 $BC
                    continue
                  fi
                  VPNREMOTEINTIP="$TMP"
		  write_openvpn ${VPNFILE}
                  NEEDSAVE=yes
                  NEEDAPPLY=yes
                  break
		done
	      ;;

	      'Verschlüsselung:')
                if $DIALOG --title "OpenVPN-Verbindung ${VPNNUMBER}: ${VPNTITLE}" \
                  --backtitle "$BACKTITLE" \
                  --radiolist "Bitte wählen Sie das Verschlüsselungsverfahren" \
                    $BL $BC $(gl 10) \
                    AES-256-CBC "AES-CBC 256 Bit - standard" "$(onoff $VPNCIPHER AES-256-CBC)" \
                    AES-192-CBC "AES-CBC 192 Bit" "$(onoff $VPNCIPHER AES-192-CBC)" \
                    AES-128-CBC "AES-CBC 128 Bit" "$(onoff $VPNCIPHER AES-128-CBC)" \
                    CAMELLIA-256-CBC "CAMELLIA-CBC 256 Bit" "$(onoff $VPNCIPHER CAMELLIA-256-CBC)" \
                    BF-256-CBC "Blowfish-CBC 256 Bit" "$(onoff $VPNCIPHER BF-256-CBC)" \
                    BF-CBC "Blowfish-CBC 128 Bit" "$(onoff $VPNCIPHER BF-CBC)" \
                    DESX-CBC "DESX-CBC 192 Bit" "$(onoff $VPNCIPHER DESX-CBC)" \
                    DES-EDE3-CBC "DES-CBC 192 Bit" "$(onoff $VPNCIPHER DES-EDE3-CBC)" \
                    DES-EDE-CBC "DES-CBC 128 Bit" "$(onoff $VPNCIPHER DES-EDE-CBC)" \
                    CAST5-CBC "Cast5-CBC 128 Bit" "$(onoff $VPNCIPHER CAST5-CBC)" \
                  2>$TMPFILE
		then
		  VPNCIPHER=`cat $TMPFILE`
		  write_openvpn ${VPNFILE}
                  NEEDSAVE=yes
                  NEEDAPPLY=yes
		fi
	      ;;

	      'Hash-Verfahren:')
                if $DIALOG --title "OpenVPN-Verbindung ${VPNNUMBER}: ${VPNTITLE}" \
                  --backtitle "$BACKTITLE" \
                  --radiolist "Bitte wählen Sie das verwendete Hash-Verfahren" \
                    $BL $BC $(gl 19) \
                    SHA1 "160 Bit - standard" "$(onoff $VPNDIGEST SHA1)" \
                    MD5 "128 Bit" "$(onoff $VPNDIGEST MD5)" \
                    RSA-MD5 "128 Bit" "$(onoff $VPNDIGEST RSA-MD5)" \
                    SHA "160 Bit" "$(onoff $VPNDIGEST SHA)" \
                    SHA256 "256 Bit" "$(onoff $VPNDIGEST SHA256)" \
                    SHA384 "384 Bit" "$(onoff $VPNDIGEST SHA385)" \
                    SHA512 "512 Bit" "$(onoff $VPNDIGEST SHA512)" \
                    RSA-SHA "160 Bit" "$(onoff $VPNDIGEST RSA-SHA)" \
                    RSA-SHA1 "160 Bit" "$(onoff $VPNDIGEST RSA-SHA1)" \
                    RSA-SHA256 "256 Bit" "$(onoff $VPNDIGEST RSA-SHA256)" \
                    RSA-SHA384 "384 Bit" "$(onoff $VPNDIGEST RSA-SHA384)" \
                    RSA-SHA512 "512 Bit" "$(onoff $VPNDIGEST RSA-SHA512)" \
                    DSA-SHA "160 Bit" "$(onoff $VPNDIGEST DSA-SHA)" \
                    DSA-SHA1-old "160 Bit" "$(onoff $VPNDIGEST DSA-SHA1-old)" \
                    DSA-SHA1 "160 Bit" "$(onoff $VPNDIGEST DSA-SHA1)" \
                    RSA-SHA1-2 "160 Bit" "$(onoff $VPNDIGEST RSA-SHA1-2)" \
                    DSA "160 Bit" "$(onoff $VPNDIGEST DSA)" \
                    RIPEMD160 "160 Bit" "$(onoff $VPNDIGEST RIPEMD160)" \
                    RSA-RIPEMD160 "160 Bit" "$(onoff $VPNDIGEST RSA-RIPEMD160)" \
                  2>$TMPFILE
		then
		  VPNDIGEST=`cat $TMPFILE`
		  write_openvpn ${VPNFILE}
                  NEEDSAVE=yes
                  NEEDAPPLY=yes
		fi
	      ;;

	      'TLS-Auth benutzen:')
                if $DIALOG --title "OpenVPN-Verbindung ${VPNNUMBER}: ${VPNTITLE}" \
                  --backtitle "$BACKTITLE" \
                  --radiolist "Sollen auf unterer Protokoll-Ebene alle Pakete mit TLS-Auth authentisiert werden (empfohlen, nur bei Verbindungsproblemen ggf. deaktivieren, muss an beiden Enden gleich gesetzt sein)?"\
                    $BL $BC 2 \
                    Ja "TLS-Auth benutzen" "$(onoff $VPNTLSAUTH Ja)" \
                    Nein "Kein TLS-Auth" "$(onoff $VPNTLSAUTH Nein)" \
                  2>$TMPFILE
                then
                  VPNTLSAUTH=`cat $TMPFILE`
		  write_openvpn ${VPNFILE}
                  NEEDSAVE=yes
                  NEEDAPPLY=yes
                fi
	      ;;

	      'Sende-Rate:')
	        TMP=$VPNRATELIMIT
	        while $DIALOG --title "OpenVPN-Verbindung $VPNNUMBER" \
			--backtitle "$BACKTITLE" --max-input 10 \
			--inputbox "Maximale Sende-Rate in Bytes/s (0 für unbegrenzt)" 8 $BC "${TMP}" \
			2>$TMPFILE
		do
		  TMP=`cat $TMPFILE`
                  check_input single number "$TMP" || continue
                  test -z "$TMP" && TMP=0
                  VPNRATELIMIT="$TMP"
		  write_openvpn ${VPNFILE}
                  NEEDSAVE=yes
                  NEEDAPPLY=yes
                  break
		done
	      ;;

	      'Weitere Optionen:')
                if $DIALOG --title "OpenVPN-Verbindung ${VPNNUMBER}: ${VPNTITLE}" \
                   --backtitle "$BACKTITLE" \
                   --checklist "Bitte wählen Sie weitere Optionen"\
                   $BL $BC 4 \
                   comp-lzo "Pakete möglichst komprimieren" "$(onofflist "$VPNEXTRA" comp-lzo)" \
                   comp-noadapt "Immer komprimieren" "$(onofflist "$VPNEXTRA" comp-noadapt)" \
                   keepalive "Laufend prüfen (Partner mit keepalive o. ping)" "$(onofflist "$VPNEXTRA" keepalive)" \
                   passtos "Type of Service (TOS) übernehmen" "$(onofflist "$VPNEXTRA" passtos)" \
                  2>$TMPFILE
                then
                  VPNEXTRA=`cat $TMPFILE|tr -d '"'`
		  write_openvpn ${VPNFILE}
                  NEEDSAVE=yes
                  NEEDAPPLY=yes
                fi
	      ;;

	      'SSL-CA erzeugen:')
              if test -f ${OPENVPNCONFDIR}/keys/$VPNNUMBER/cacert.pem
              then
                declare -i VALIDDAYS
                declare -i TODAYDAYS
                declare -i DAYDIFF
                TODAYDAYS=$(date -d yesterday +'%s')/86400
                VALIDDATE="$(openssl x509 -noout -in ${OPENVPNCONFDIR}/keys/$VPNNUMBER/cacert.pem -dates|grep notAfter|cut -d = -f 2-)"
                VALIDDAYS=$(date -d "$VALIDDATE" +%s)/86400
                DAYDIFF=$VALIDDAYS-$TODAYDAYS
                if test $DAYDIFF -gt 0
                then
                  if ! $DIALOG --title "OpenVPN-Verbindung $VPNNUMBER" \
                        --backtitle "$BACKTITLE" \
                        --defaultno \
                        --yesno "Es existiert bereits eine noch $DAYDIFF Tage gültige SSL-CA für diese OpenVPN-Verbindung. Überschreiben?" 7 $BC
                  then
                    continue
                  fi
                  if ! $DIALOG --title "OpenVPN-Verbindung $VPNNUMBER" \
                        --backtitle "$BACKTITLE" \
                        --defaultno \
                        --yesno "Wenn Sie die bestehende SSL-CA für diese OpenVPN-Verbindung ersetzen, werden alle vorhandenen Klienten-Zertifikate ungültig und müssen neu erzeugt und verteilt werden! Wirklich fortsetzen?" 8 $BC
                  then
                    continue
                  fi
                fi
              fi
              echo "Erzeuge OpenVPN $VPNNUMBER SSL-CA"
              echo "[ req ]
default_bits            = 4096
default_keyfile         = privkey.pem
distinguished_name      = req_dn
prompt = no

[ req_dn ]
C=DE
ST=Berlin
L=Germany
O=mp-ceph $(hostname -f)
OU=SSL OpenVPN $VPNNUMBER CA
CN=$(hostname -f)
emailAddress=webmaster@$CUDOMAIN" >$TMPFILE
	      createvpnca $VPNNUMBER -days 36500 -config $TMPFILE
	      sleep 2
	      ;;
	      'Server-Zertifikat erzeugen')
              if test ! -f "${OPENVPNCONFDIR}/keys/$VPNNUMBER/cacert.pem"
              then
                $DIALOG --title "OpenVPN-Verbindung $VPNNUMBER" \
                        --backtitle "$BACKTITLE" \
                        --defaultno \
                        --msgbox "Es ist keine SSL-CA vorhanden, bitte diese zuerst erzeugen!" 5 $BC
                continue
              fi
              NOW="$(date +%s 2>/dev/null)"
              declare -i VALIDDAYS
              declare -i TODAYDAYS
              declare -i DAYDIFF
              TODAYDAYS=$(date -d yesterday +'%s')/86400
              if test -f "${OPENVPNCONFDIR}/keys/$VPNNUMBER/server.key" -a "${OPENVPNCONFDIR}/keys/$VPNNUMBER/server.key" -nt "${OPENVPNCONFDIR}/keys/$VPNNUMBER/cacert.pem"
              then
                VALIDDATE="$(openssl x509 -noout -in ${OPENVPNCONFDIR}/keys/$VPNNUMBER/server.crt -dates|grep notAfter|cut -d = -f 2-)"
                VALIDDAYS=$(date -d "$VALIDDATE" +%s)/86400
                DAYDIFF=$VALIDDAYS-$TODAYDAYS
                if test $DAYDIFF -gt 0
                then
                  if ! $DIALOG --title "OpenVPN-Verbindung $VPNNUMBER" \
                      --backtitle "$BACKTITLE" \
                      --defaultno \
                      --yesno "Es existiert bereits ein noch $DAYDIFF Tage gültiges SSL-Zertifikat für den Server. Soll das alte Zertifikat überschrieben werden?" 7 $BC
                  then
                    continue
                  fi
                fi
              fi
		echo "Erzeuge SSL-Zertifikat für OpenVPN $VPNNUMBER Server"
                echo "[ req ]
default_bits            = 4096
default_keyfile         = privkey.pem
distinguished_name      = req_dn
prompt = no

[ req_dn ]
C=DE
ST=Berlin
L=Germany
O=mp-ceph $(hostname -f)
OU=SSL OpenVPN $VPNNUMBER Server
$(test -n "$VPNSERVERCN" && echo "CN=$VPNSERVERCN" || echo "CN=$(hostname -f)")
emailAddress=webmaster@$CUDOMAIN" >$TMPFILE
	        createvpncertserver $VPNNUMBER -days 36500 -config $TMPFILE >/dev/null
	        chmod 600 ${OPENVPNCONFDIR}/keys/$VPNNUMBER/server.*
	      sleep 2
	      ;;
	      'Server-CN:')
	        TMP=$VPNSERVERCN
	        while $DIALOG --title "OpenVPN-Verbindung $VPNNUMBER" \
			--backtitle "$BACKTITLE" \
			--inputbox "Common Name (CN) des Server-Zertifikats (muss der vom Klienten verwendeten Adresse entsprechen, leer = automatisch, z.Zt. $CUHOSTNAME.$CUDOMAIN)" 9 $BC "${TMP}" \
			2>$TMPFILE
		do
		  TMP=`cat $TMPFILE`
                  check_input single ipname "$TMP" || continue
                  VPNSERVERCN="$TMP"
		  write_openvpn ${VPNFILE}
                  NEEDSAVE=yes
                  NEEDAPPLY=yes
                  break
		done
	      ;;

	      'Push Route:')
	        TMP=$VPNPUSHROUTE
	        while $DIALOG --title "OpenVPN-Verbindung $VPNNUMBER" \
			--backtitle "$BACKTITLE" \
			--inputbox "Dem Klienten mitzuteilende Routen hinter diesem Server (a.b.c.d/n, mehrere mit Leerzeichen trennen)" 8 $BC "${TMP}" \
			2>$TMPFILE
		do
		  TMP=`cat $TMPFILE`
                  check_input multi ipnet "$TMP" || continue
                  VPNPUSHROUTE="$TMP"
		  write_openvpn ${VPNFILE}
                  NEEDSAVE=yes
                  NEEDAPPLY=yes
                  break
		done
	      ;;

	      'Klienten-Zertifikate erzeugen')
              if test ! -f "${OPENVPNCONFDIR}/keys/$VPNNUMBER/cacert.pem"
              then
                $DIALOG --title "OpenVPN-Verbindung $VPNNUMBER" \
                        --backtitle "$BACKTITLE" \
                        --defaultno \
                        --msgbox "Es ist keine SSL-CA vorhanden, bitte diese zuerst erzeugen!" 5 $BC
                continue
              fi
              NOW="$(date +%s 2>/dev/null)"
              declare -i VALIDDAYS
              declare -i TODAYDAYS
              declare -i DAYDIFF
              ASKOVER=
              TODAYDAYS=$(date -d yesterday +'%s')/86400
              for VPNCLIENTNUMBER in $(seq 1 $VPNNUMCLIENTS)
              do
                if test -f "${CUDIR}/openvpnca/$VPNNUMBER/$VPNCLIENTNUMBER/$VPNCLIENTNUMBER.key" -a "${CUDIR}/openvpnca/$VPNNUMBER/$VPNCLIENTNUMBER/$VPNCLIENTNUMBER.key" -nt "${OPENVPNCONFDIR}/keys/$VPNNUMBER/cacert.pem"
                then
                  VALIDDATE="$(openssl x509 -noout -in ${CUDIR}/openvpnca/$VPNNUMBER/$VPNCLIENTNUMBER/$VPNCLIENTNUMBER.crt -dates|grep notAfter|cut -d = -f 2-)"
                  VALIDDAYS=$(date -d "$VALIDDATE" +%s)/86400
                  DAYDIFF=$VALIDDAYS-$TODAYDAYS
                  if test $DAYDIFF -gt 0
                  then
                    if test "$ASKOVER" = "false"
                    then
                      continue
                    fi
                    if ! $DIALOG --title "OpenVPN-Verbindung $VPNNUMBER" \
                        --backtitle "$BACKTITLE" \
                        --defaultno \
                        --yesno "Es existiert bereits ein noch $DAYDIFF Tage gültiges SSL-Zertifikat für den Klienten $VPNCLIENTNUMBER. Soll das alte Zertifikat überschrieben werden?" 7 $BC
                    then
                      if test -z "$ASKOVER"
                      then
                        if $DIALOG --title "OpenVPN-Verbindung $VPNNUMBER" \
                          --backtitle "$BACKTITLE" \
                          --yesno "Soll weiterhin das Überschreiben gültiger Zertifikate angeboten werden?" 7 $BC
                        then
                          ASKOVER=true
                        else
                          ASKOVER=false
                        fi
                      fi
                      continue
                    fi
                    if $DIALOG --title "OpenVPN-Verbindung $VPNNUMBER" \
                        --backtitle "$BACKTITLE" \
                        --defaultno \
                        --yesno "Soll das noch $DAYDIFF Tage gültige alte SSL-Zertifikat für den Klienten $VPNCLIENTNUMBER vorsichtshalber gesperrt werden?" 7 $BC
                    then
                      /usr/local/bin/revokevpncert $VPNNUMBER $VPNCLIENTNUMBER
                    fi
                  fi
                fi
                echo "[ req ]
default_bits            = 4096
default_keyfile         = privkey.pem
distinguished_name      = req_dn
prompt = no

[ req_dn ]
C=DE
ST=Berlin
L=Germany
O=mp-ceph $(hostname -f)
OU=SSL OpenVPN $VPNNUMBER Client $VPNCLIENTNUMBER
CN=vpn-${VPNNUMBER}-${VPNCLIENTNUMBER}.${CUDOMAIN}-$NOW
emailAddress=webmaster@$CUDOMAIN" >$TMPFILE
	        createvpncert $VPNNUMBER $VPNCLIENTNUMBER -days 36500 -config $TMPFILE
	      done
	      sleep 2
	      ;;

	      'Klienten-Namen')
                while $DIALOG --title "OpenVPN-Verbindung $VPNNUMBER: $VPNTITLE" \
                  --backtitle "$BACKTITLE" \
                  --default-item "$CLCHOICE" \
                  --menu "Klienten-Namen:" $BL $BC $MAXLINES \
                  $(openvpn_client_name_list $VPNNUMBER $VPNNUMCLIENTS) \
                  2>$TMPFILE
                do
                  CLCHOICE=`cat $TMPFILE`
	          TMP="${VPNCLIENTNAME[$CLCHOICE]}"
	          while $DIALOG --title "OpenVPN-Verbindung $VPNNUMBER: $VPNTITLE" \
			--backtitle "$BACKTITLE" --max-input 100 \
			--inputbox "Bitte geben Sie den Namen des Klienten $CLCHOICE ein" 8 $BC "${TMP}" \
			2>$TMPFILE
		  do
		    TMP=`cat $TMPFILE`
                    check_input multi text_punkt "$TMP" || continue
                    VPNCLIENTNAME[${CLCHOICE}]="$TMP"
		    write_openvpn ${VPNFILE}
                    NEEDSAVE=yes
                    NEEDAPPLY=yes
                    break
		  done
		done
	      ;;

	      'Klienten-Zert. in Transfer')
              KEYDIR=${CUDIR}/openvpnca/$VPNNUMBER
              if test ! -d "$KEYDIR"
              then
                $DIALOG --title "$ERRTITLE" \
                        --backtitle "$BACKTITLE" \
                        --defaultno \
                        --msgbox "Es sind keine Zertifikate zum Exportieren vorhanden!" 5 $BC
                continue
              fi
              if test -z "$VPNLOCALEXTIP" -a -z "$VPNSERVERCN"
              then
                $DIALOG --title "$ERRTITLE" \
                        --backtitle "$BACKTITLE" \
                        --defaultno \
                        --msgbox "Sie brauchen entweder eine lokale externe VPN-Adresse oder eine Server-CN!" 6 $BC
                continue
              fi
              rm -rf $HOME/transfer/$VPNNUMBER
              mkdir -p $HOME/transfer/$VPNNUMBER
	      if test ! -f ${OPENVPNCONFDIR}/keys/$VPNNUMBER/tls-auth
              then
                openvpn --genkey --secret ${OPENVPNCONFDIR}/keys/$VPNNUMBER/tls-auth
              fi
              cp -a $KEYDIR/[123456789]* \
                $OPENVPNCONFDIR/keys/$VPNNUMBER/cacert.pem \
                $OPENVPNCONFDIR/keys/$VPNNUMBER/tls-auth \
		$HOME/transfer/$VPNNUMBER/
	      for i in $(cd $HOME/transfer/$VPNNUMBER && ls -d [123456789]*)
	      do
	        TMP=$HOME/transfer/$VPNNUMBER/$i
	        mkdir -p -m 700 $TMP
	        write_openvpn_client $i $TMP/$i.ovpn
	        cp -a $TMP/../cacert.pem $TMP/cacert.pem
	        cp -a $TMP/../tls-auth $TMP/tls-auth
	        rm $TMP/$i.req
	        write_openvpn_client_inline $i $TMP.ovpn $TMP/
	      done
              $DIALOG --title "OpenVPN-Verbindung $VPNNUMBER" \
                      --backtitle "$BACKTITLE" \
                      --msgbox "Die Zertifikate wurden kopiert." 5 $BC
	      ;;

	      'Klienten-Zertifikat sperren')
                while $DIALOG --title "OpenVPN-Verbindung $VPNNUMBER: $VPNTITLE" \
                  --backtitle "$BACKTITLE" \
                  --default-item "$CLCHOICE" \
                  --menu "Welches Klienten-SSL-Zertifikat soll gesperrt werden?" $BL $BC $MAXLINES \
                  $(openvpn_client_name_list $VPNNUMBER $VPNNUMCLIENTS) \
                  2>$TMPFILE
                do
                  CLCHOICE=`cat $TMPFILE`
                  if $DIALOG --title "OpenVPN-Verbindung $VPNNUMBER" \
                    --backtitle "$BACKTITLE" \
                    --defaultno \
                    --yesno "Klienten-SSL-Zertifikat $CLCHOICE (${VPNCLIENTNAME[$CLCHOICE]}) wirklich sperren?" 7 $BC
                  then
                    /usr/local/bin/revokevpncert $VPNNUMBER $TMP
                    $DIALOG --title "OpenVPN-Verbindung $VPNNUMBER" \
                      --backtitle "$BACKTITLE" \
                      --msgbox "Das Zertifikat $CLCHOICE (${VPNCLIENTNAME[$CLCHOICE]}) wurde gesperrt." 6 $BC
                  fi
		done
	      ;;

	      'Klienten-Zertifikate aufräumen')
                  declare -i VALIDDAYS
                  declare -i TODAYDAYS
                  declare -i DAYDIFF
                  TODAYDAYS=$(date -d yesterday +'%s')/86400
                  DELETED=
                  WARNNUMBER=false
                  for VPNCLIENTNUMBER in $(ls ${CUDIR}/openvpnca/$VPNNUMBER/ 2>/dev/null | egrep "^[[:digit:]]*$")
                  do
                    if ! test -f "${CUDIR}/openvpnca/$VPNNUMBER/$VPNCLIENTNUMBER/$VPNCLIENTNUMBER.key"
                    then
                      continue
                    fi
                    if test "${CUDIR}/openvpnca/$VPNNUMBER/$VPNCLIENTNUMBER/$VPNCLIENTNUMBER.key" -ot "${OPENVPNCONFDIR}/keys/$VPNNUMBER/cacert.pem"
                    then
                      DELETED="$DELETED $VPNCLIENTNUMBER(${VPNCLIENTNAME[$VPNCLIENTNUMBER]})"
                      rm -f ${CUDIR}/openvpnca/$VPNNUMBER/$VPNCLIENTNUMBER/$VPNCLIENTNUMBER.*
                      continue
                    fi
                    VALIDDATE="$(openssl x509 -noout -in ${CUDIR}/openvpnca/$VPNNUMBER/$VPNCLIENTNUMBER/$VPNCLIENTNUMBER.crt -dates|grep notAfter|cut -d = -f 2-)"
                    VALIDDAYS=$(date -d "$VALIDDATE" +%s)/86400
                    DAYDIFF=$VALIDDAYS-$TODAYDAYS
                    if test $DAYDIFF -lt 0
                    then
                      rm -f ${CUDIR}/openvpnca/$VPNNUMBER/$VPNCLIENTNUMBER/$VPNCLIENTNUMBER.*
                    else
                      if test "$VPNCLIENTNUMBER" -gt "$VPNNUMCLIENTS"
                      then
                        WARNNUMBER=true
                      fi
                    fi
	          done
	          if test -n "$DELETED"
	          then
                    $DIALOG --title "OpenVPN-Verbindung $VPNNUMBER" \
                      --backtitle "$BACKTITLE" \
                      --msgbox "Die Zertifikate folgender Klienten wurden gelöscht:$DELETED" 7 $BC
                  else
                    $DIALOG --title "OpenVPN-Verbindung $VPNNUMBER" \
                      --backtitle "$BACKTITLE" \
                      --msgbox "Alle Zertifikate sind noch gültig." 5 $BC
	          fi
	          if test "$WARNNUMBER" = "true"
	          then
                    $DIALOG --title "OpenVPN-Verbindung $VPNNUMBER" \
                      --backtitle "$BACKTITLE" \
                      --msgbox "Es wurden gültige Zertifikate mit höherer Nummer als die Anzahl der Klienten gefunden, bitte Anzahl prüfen." 6 $BC
                  fi
	      ;;

	      'Anzahl Klienten:')
	        TMP=$VPNNUMCLIENTS
	        while $DIALOG --title "OpenVPN-Verbindung $VPNNUMBER" \
			--backtitle "$BACKTITLE" \
                        --max-input 6 \
			--inputbox "Anzahl Klienten:" 8 $BC "${TMP}" \
			2>$TMPFILE
		do
		  TMP=`cat $TMPFILE`
                  check_input single number "$TMP" || continue
                  if test "$TMP" -gt 1
                  then
                    if test -z "$VPNCLIENTNET" -o -z "$VPNREMOTEINTFIRST" -o -z "$VPNREMOTEINTLAST"
                    then
                      $DIALOG --title "OpenVPN-Verbindung $VPNNUMBER" \
                          --backtitle "$BACKTITLE" \
                          --msgbox "Bitte tragen Sie für mehrere gleichzeitige Verbindungen (Multi-Klienten) auch das Klienten-Netzwerk, die Erste und die Letzte Klienten-IP (nächste drei Menüpunkte) ein!" 8 $BC
                    fi
                  fi
		  VPNNUMCLIENTS="$TMP"
		  if test "$VPNNUMCLIENTS" -le 0
		  then
		    VPNNUMCLIENTS=1
		  fi
		  MAYREVOKE=
                  declare -i VALIDDAYS
                  declare -i TODAYDAYS
                  declare -i DAYDIFF
                  TODAYDAYS=$(date -d yesterday +'%s')/86400
                  for VPNCLIENTNUMBER in $(ls ${CUDIR}/openvpnca/$VPNNUMBER/ 2>/dev/null | egrep "^[[:digit:]]*$")
                  do
                    if test $VPNCLIENTNUMBER -le $VPNNUMCLIENTS
                    then
                      continue
                    fi
                    if test -f "${CUDIR}/openvpnca/$VPNNUMBER/$VPNCLIENTNUMBER/$VPNCLIENTNUMBER.key" -a "${CUDIR}/openvpnca/$VPNNUMBER/$VPNCLIENTNUMBER/$VPNCLIENTNUMBER.key" -nt "${OPENVPNCONFDIR}/keys/$VPNNUMBER/cacert.pem"
                    then
                      VALIDDATE="$(openssl x509 -noout -in ${CUDIR}/openvpnca/$VPNNUMBER/$VPNCLIENTNUMBER/$VPNCLIENTNUMBER.crt -dates|grep notAfter|cut -d = -f 2-)"
                      VALIDDAYS=$(date -d "$VALIDDATE" +%s)/86400
                      DAYDIFF=$VALIDDAYS-$TODAYDAYS
                      if test $DAYDIFF -gt 0 -a "$MAYREVOKE" != "false"
                      then
                        if test -z "$MAYREVOKE"
                        then
                          if $DIALOG --title "OpenVPN-Verbindung $VPNNUMBER" \
                            --backtitle "$BACKTITLE" \
                            --defaultno \
                            --yesno "Es existieren noch gültige Klienten-SSL-Zertifikate mit höheren Nummern für dieses VPN. Sollen diese jetzt gesperrt und gelöscht werden?" 7 $BC
                          then
                            MAYREVOKE=true
                          else
                            MAYREVOKE=false
                            continue
                          fi
                        fi
                        /usr/local/bin/revokevpncert $VPNNUMBER $VPNCLIENTNUMBER
                        rm -rf "${CUDIR}/openvpnca/$VPNNUMBER/$VPNCLIENTNUMBER/"
                      fi
                    else
                      rm -rf "${CUDIR}/openvpnca/$VPNNUMBER/$VPNCLIENTNUMBER/"
                    fi
	          done
                  if test "$MAYREVOKE" = "true"
                  then
                    sleep 2
                  fi
		  write_openvpn ${VPNFILE}
                  NEEDSAVE=yes
                  NEEDAPPLY=yes
                  break
		done
	      ;;

	      'Klienten-Netzwerk:')
	        TMP=$VPNCLIENTNET
	        if test -z "$TMP" -a -n "$VPNLOCALINTIP"
	        then
	          TMP="$(echo $VPNLOCALINTIP|cut -d . -f 1-3).0/24"
	        fi
	        while $DIALOG --title "OpenVPN-Verbindung $VPNNUMBER" \
			--backtitle "$BACKTITLE" \
                        --max-input $MAXTITLELEN \
			--inputbox "IP-Netzwerk der Klienten für Multi-Klienten-Modus (a.b.c.d/n, z.B. 192.168.$VPNNUMBER.0/24, lokale Tunnel-IP ist $VPNLOCALINTIP):" 9 $BC "${TMP}" \
			2>$TMPFILE
		do
		  TMP=`cat $TMPFILE`
                  check_input single ipnet "$TMP" || continue
		  VPNCLIENTNET="$TMP"
		  write_openvpn ${VPNFILE}
                  NEEDSAVE=yes
                  NEEDAPPLY=yes
                  break
		done
	      ;;
	      'Erste Klienten-IP:')
	        TMP=$VPNREMOTEINTFIRST
	        if test -z "$TMP" -a -n "$VPNCLIENTNET"
	        then
	          TMP="$(echo $VPNCLIENTNET|cut -d . -f 1-3).4"
	        fi
	        while $DIALOG --title "OpenVPN-Verbindung $VPNNUMBER" \
			--backtitle "$BACKTITLE" \
                        --max-input $MAXTITLELEN \
			--inputbox "Erste Klienten-IP für Multi-Klienten-Modus (a.b.c.d, Host-Nummer durch 4 teilbar, z.B. 192.168.$VPNNUMBER.4, Klienten-Netz ist $VPNCLIENTNET, lokale Tunnel-IP ist $VPNLOCALINTIP):" 10 $BC "${TMP}" \
			2>$TMPFILE
		do
		  TMP=`cat $TMPFILE`
                  check_input single ip "$TMP" || continue
		  VPNREMOTEINTFIRST="$TMP"
		  write_openvpn ${VPNFILE}
                  NEEDSAVE=yes
                  NEEDAPPLY=yes
                  break
		done
	      ;;
	      'Letzte Klienten-IP:')
	        TMP=$VPNREMOTEINTLAST
	        if test -z "$TMP" -a -n "$VPNREMOTEINTFIRST"
	        then
	          TMP="$(echo $VPNREMOTEINTFIRST|cut -d . -f 1-3).252"
	        fi
	        while $DIALOG --title "OpenVPN-Verbindung $VPNNUMBER" \
			--backtitle "$BACKTITLE" \
                        --max-input $MAXTITLELEN \
			--inputbox "Letzte Klienten-IP für Multi-Klienten-Modus (a.b.c.d, Host-Nummer durch 4 teilbar, z.B. 192.168.$VPNNUMBER.252, Klienten-Netz ist $VPNCLIENTNET, Erste Klienten-IP ist $VPNREMOTEINTFIRST):" 10 $BC "${TMP}" \
			2>$TMPFILE
		do
		  TMP=`cat $TMPFILE`
                  check_input single ip "$TMP" || continue
		  VPNREMOTEINTLAST="$TMP"
		  write_openvpn ${VPNFILE}
                  NEEDSAVE=yes
                  NEEDAPPLY=yes
                  break
		done
	      ;;

	    esac
	  done
	fi
      ;;
    esac
  done
}

function openvpn_ceph_create {
  if [ "${NODEIPCOPIED}" = "no" ]
  then
    TMPNODEDIR=$NODEIPDIR
  else
    TMPNODEDIR=$NODEIPTMPDIR
  fi
  ALLNODES="$(ls $TMPNODEDIR 2>/dev/null)"
  if ! test -f ${VPNCEPHDIR}/ceph.key
  then
    mkdir -m 700 -p ${VPNCEPHDIR}
    echo "Erzeuge VPN-Key, Geduld bitte"
    openvpn --genkey --secret ${VPNCEPHDIR}/ceph.key || sleep 2
  fi
  echo "Erzeuge VPN-Konfigurationen"
  DATE="$(date)"
  rm -rf ${VPNCEPHDIR}/[1-9]*
  NETBASE="$(echo $VPNCEPHNET|cut -d . -f 1-3)"
  declare -i HOST1=1
  declare -i HOST2=2
  declare -i PORTNUM=1200
  for node in $ALLNODES
  do
    . $TMPNODEDIR/$node
    extip=$NODEIPEXT
    cephip=$NODEIPCEPHIP
#    echo -n "$extip ->"
    mkdir -p -m 700 "${VPNCEPHDIR}/$extip"
    for node2 in $ALLNODES
    do
      test "$node2" = "$node" && continue
      . $TMPNODEDIR/$node2
      extip2=$NODEIPEXT
      cephip2=$NODEIPCEPHIP
      mkdir -p -m 700 "${VPNCEPHDIR}/$extip2"
      if ! test -f "${VPNCEPHDIR}/${extip}/ceph-${extip2}.conf"
      then
#        echo -n " $extip2"
        {
	  echo "# m-privacy OpenVPN-Konfiguration Ceph-Node"
	  echo "# Erzeugt: $DATE"
	  echo "#"
	  echo "# Lokale IP: ${extip}"
	  echo "# Ferne IP:  ${extip2}:${cephip2}"
	  echo "#"
          echo "proto udp"
	  echo "verb 3"
	  echo "dev tun"
	  echo "local ${extip}"
          echo "remote ${extip2}"
	  echo "lport $PORTNUM"
	  echo "rport $PORTNUM"
	  echo "ifconfig $NETBASE.$HOST1 $NETBASE.$HOST2"
	  echo "route ${cephip2}"
	  echo "daemon"
	  echo "mlock"
	  echo "keepalive 10 60"
	  echo "ping-timer-rem"
	  echo "mtu-test"
	  echo "comp-lzo"
	  echo "<secret>"
	  cat "${VPNCEPHDIR}/ceph.key"
	  echo "</secret>"
        } > "${VPNCEPHDIR}/${extip}/ceph-${extip2}.conf"
      fi
      if ! test -f "${VPNCEPHDIR}/${extip2}/ceph-${extip}.conf"
      then
        {
	  echo "# m-privacy OpenVPN-Konfiguration Ceph-Node"
	  echo "# Erzeugt: $DATE"
	  echo "#"
	  echo "# Lokale IP: ${extip2}"
	  echo "# Ferne IP:  ${extip}:${cephip}"
	  echo "#"
          echo "proto udp"
	  echo "verb 3"
	  echo "dev tun"
	  echo "local ${extip2}"
          echo "remote ${extip}"
	  echo "lport $PORTNUM"
	  echo "rport $PORTNUM"
	  echo "ifconfig $NETBASE.$HOST2 $NETBASE.$HOST1"
	  echo "route ${cephip}"
	  echo "daemon"
	  echo "mlock"
	  echo "keepalive 10 60"
	  echo "ping-timer-rem"
	  echo "mtu-test"
	  echo "comp-lzo"
	  echo "<secret>"
	  cat "${VPNCEPHDIR}/ceph.key"
	  echo "</secret>"
        } > "${VPNCEPHDIR}/${extip2}/ceph-${extip}.conf"
      fi
      PORTNUM=$PORTNUM+1
      HOST1=$HOST1+2
      HOST2=$HOST2+2
    done
#    echo ""
  done
#  echo "Weiter mit Return"
#  read dummy
}

function openvpn_ceph_distribute {
  if [ "${NODEIPCOPIED}" = "no" ]
  then
    TMPNODEDIR=$NODEIPDIR
  else
    TMPNODEDIR=$NODEIPTMPDIR
  fi
  ALLNODES="$(ls $TMPNODEDIR 2>/dev/null)"
  if ! test -f ${VPNCEPHDIR}/ceph.key
  then
    $DIALOG --title "$TITLE" \
      --backtitle "$BACKTITLE" \
      --msgbox "Es wurde keine Konfiguration erzeugt." 5 $BC \
      2>$TMPFILE
    return
  fi
  echo "Verteile VPN-Konfigurationen"
  for node in $ALLNODES
  do
    . $TMPNODEDIR/$node
    ssh "root@${NODEIPEXT}" "rm -f /etc/openvpn/ceph-*.conf"
    scp "${VPNCEPHDIR}/${NODEIPEXT}/ceph-"*.conf "root@${NODEIPEXT}:/etc/openvpn/"
    ssh "root@${NODEIPEXT}" "systemctl enable openvpn ; if pidof openvpn >/dev/null ; then systemctl reload openvpn ; else systemctl start openvpn ; fi"
  done
  echo "Weiter mit Return"
  read dummy
}


function remove_tmp_knoten_ip {
	if [ -d ${NODEIPTMPDIR} ]
	then
		rm -f ${NODEIPTMPDIR}/*
	fi
}

function knoten_ip_read {
	test -z "$1" && return
	test ! -f "$1" && return
	. "${1}"
}


function write_knoten_ip {
	echo 'NODEIPNUMBER="'${NODEIPNUMBER}'"' >$1
	echo 'NODEIPDATE="'${NODEIPDATE}'"' >>$1
	echo 'NODEIPEXT="'${NODEIPEXT}'"' >>$1
	echo 'NODEIPCEPHIP="'${NODEIPCEPHIP}'"' >>$1

	NEEDSAVE=yes
}

function list_knoten_ip {
  for i in `ls ${NODEIPTMPDIR}|sort -n`
  do
    knoten_ip_read ${NODEIPTMPDIR}/$i
    echo "${NODEIPNUMBER}" "${NODEIPEXT}:${NODEIPCEPHIP}"
  done
}


function openvpn_ceph_menu {
  # Check whether the directories exist and create them if necessary.
  if [ \! -d ${VPNCEPHDIR} ]
  then
	mkdir -m 700 -p ${VPNCEPHDIR}
  fi
  if [ \! -d ${NODEIPTMPDIR} ]
  then
	mkdir -m 700 -p ${NODEIPTMPDIR}
  fi

  # First remove the old tmp files, then copy the current active files to the
  # tmp directory, where they can be changed.
  if [ "${NODEIPCOPIED}" = "no" ]
  then
	rm -f ${NODEIPTMPDIR}/*

	# Copy the files, this will result in an error message, when there are
	# no files present. Therefore redirect the output.
	cp ${NODEIPDIR}/[0-9]* ${NODEIPTMPDIR} 2>/dev/null

	NODEIPCOPIED=yes
  fi

  while $DIALOG --title "$USER@$HOSTNAME: OpenVPN-Ceph" \
             --backtitle "$BACKTITLE" --default-item "$VPNCEPHCHOICE" --colors \
             --menu "OpenVPN-Verbindungen der Ceph-Knoten" $BL $BC $MAXLINES \
             "Ende" "Dieses Menü verlassen" \
             "Erzeugen" "OpenVPN-Konfigurationen sofort erzeugen" \
             "Verteilen" "OpenVPN-Konfigurationen an alle Nodes" \
             "--------------" " " \
             "VPN-Netz:" "${VPNCEPHNET}" \
             "--------------" " " \
             "Neu" "Knoten hinzufügen" \
             "Kopieren" "Knoten kopieren" \
	     "Löschen" "Knoten löschen" \
             "--------------" " " \
             $(list_knoten_ip) \
             2>$TMPFILE
  do
    VPNCEPHCHOICE=`cat $TMPFILE`
    case "$VPNCEPHCHOICE" in
      'Ende')
        break
      ;;

      'Erzeugen')
      	if test -z "$VPNCEPHNODES"
      	then
          $DIALOG --title "$TITLE" \
            --backtitle "$BACKTITLE" \
            --msgbox "Es wurde keine Knoten-IP eingegeben." 5 $BC \
            2>$TMPFILE
          continue
        fi
#        if ! $DIALOG --title "$TITLE" \
#          --backtitle "$BACKTITLE" \
#          --yesno "OpenVPN-Konfigurationen für alle Ceph-Knoten neu erzeugen - sind Sie sicher?" 6 $BC \
#          2>$TMPFILE
#        then
#          continue
#        fi
        openvpn_ceph_create
        echo "Weiter mit Return"
        read dummy
      ;;

      'Verteilen')
        if ! $DIALOG --title "$TITLE" \
          --backtitle "$BACKTITLE" --defaultno \
          --yesno "OpenVPN-Konfigurationen jetzt an alle Ceph-Knoten verteilen - sind Sie sicher?" 6 $BC \
          2>$TMPFILE
        then
          continue
        fi
        openvpn_ceph_distribute
      ;;

      'VPN-Netz:')
        TMP="$VPNCEPHNET"
        while $DIALOG --title "OpenVPN-Ceph" \
                  --backtitle "$BACKTITLE" \
                  --inputbox "IP-Netzwerk der Ceph-VPNs, z.B. 192.168.113.0 (VPNs nutzen 2-Bit-Subnetze)" 8 $BC "$TMP" \
                  2>$TMPFILE
        do
          TMP="$(cat $TMPFILE)"
          check_input single ip "$TMP" || continue
          test -n "$TMP" || continue
          VPNCEPHNET="$TMP"
          NEEDSAVE=yes
          NEEDAPPLY=yes
          break
        done
      ;;

      'Löschen')
	if $DIALOG --title "$USER@$HOSTNAME: Knoten-IP-Adressen" \
             --backtitle "$BACKTITLE" --colors \
             --menu "Welchen Knoten möchten Sie löschen?" $BL $BC $MAXLINES \
             $(list_knoten_ip) \
             2>$TMPFILE
	then
	  TMP=$(cat $TMPFILE)
	  if [ -f ${NODEIPTMPDIR}/${TMP} ]
	  then
	    knoten_ip_read ${NODEIPTMPDIR}/${TMP}
            if $DIALOG --title "Knoten-IP-Adressen" \
                       --backtitle "$BACKTITLE" \
                       --defaultno \
                       --yesno "Knoten-IP-Adresse ${NODEIPNUMBER}:${NODEIPEXT}:${NODEIPCEPHIP} wirklich löschen?" 6 $BC \
             2>$TMPFILE
            then
              rm ${NODEIPTMPDIR}/${TMP}
              NEEDSAVE=yes
              NEEDAPPLY=yes
            fi
	  fi
	fi
      ;;

      'Kopieren')
	if $DIALOG --title "$USER@$HOSTNAME: Knoten-IP-Adressenn" \
             --backtitle "$BACKTITLE" \
             --menu "Welchen Knoten möchten Sie kopieren?" $BL $BC $MAXLINES \
             $(for i in `ls $NODEIPTMPDIR|sort -n`;do knoten_ip_read ${NODEIPTMPDIR}/$i; \
		echo "${NODEIPNUMBER}" "${NODEIPEXT}:${NODEIPCEPHIP}";done) \
             2>$TMPFILE
	then
	  TMP=$(cat $TMPFILE)
	  if [ -f ${NODEIPTMPDIR}/${TMP} ]
	  then
	    knoten_ip_read ${NODEIPTMPDIR}/${TMP}
	    for TMPNUMBER in `seq $TMP ${NODEIPMAXNR}`
	    do
		if [ \! -f ${NODEIPTMPDIR}/${TMPNUMBER} ]
		then
			break
		fi
	    done
            if $DIALOG --title "Knoten $NODEIPNUMBER kopieren" \
                      --backtitle "$BACKTITLE" --max-input 4 \
                      --inputbox "Nummer der Kopie von Knoten ${NODEIPNUMBER}:${NODEIPEXT}:${NODEIPCEPHIP}" 8 $BC "$TMPNUMBER" \
                      2>$TMPFILE
            then
              NEWNODEIPNUMBER=`cat $TMPFILE`
              check_input single number "$NEWNODEIPNUMBER" || continue
              if ! test "$NEWNODEIPNUMBER" -gt 0
              then
                $DIALOG --title "Fehler: Kopie der Routing-Regel ${NODEIPNUMBER}" \
                        --backtitle "$BACKTITLE" \
                        --msgbox "Ungültige Nummer ${NEWNODEIPNUMBER}!" 8 $BC
                continue
              fi
	      if [ "${NEWNODEIPNUMBER}" -gt "$NODEIPMAXNR" ]
	      then
	        $DIALOG --title "$ERRTITLE" \
        	       --backtitle "$BACKTITLE" \
	               --msgbox "Bitte wählen Sie eine Nummer von 1 bis $NODEIPMAXNR!" 5 $BC
		continue
	      fi
            else
              continue
            fi

            NEWNODEIPFILE=${NODEIPTMPDIR}/${NEWNODEIPNUMBER}
            if test -f $NEWNODEIPFILE
            then
              $DIALOG --title "Fehler: Kopie des Knotens ${NODEIPNUMBER}" \
                      --backtitle "$BACKTITLE" \
                      --msgbox "Knoten Nummer ${NEWNODEIPNUMBER} existiert bereits!" 8 $BC
              continue
            fi
            NODEIPNUMBER=${NEWNODEIPNUMBER}
            NODEIPFILE=${NEWNODEIPFILE}
            >${NODEIPFILE}
            write_knoten_ip ${NODEIPFILE}
            NEEDSAVE=yes
            NEEDAPPLY=yes
            VPNCEPHCHOICE=$NODEIPNUMBER
	  fi
	fi
      ;;

      'Neu')
	for TMPNUMBER in `seq 1 ${NODEIPMAXNR}`
	do
		if [ \! -f ${NODEIPTMPDIR}/${TMPNUMBER} ]
		then
			break
		fi
	done
        if $DIALOG --title "Neuer Knoten" \
                  --backtitle "$BACKTITLE" \
                  --inputbox "Nummer des neuen Knotens (1-$NODEIPMAXNR)" 8 $BC "$TMPNUMBER" \
                  2>$TMPFILE
        then
          NODEIPNUMBER=`cat $TMPFILE`
          if ! test "$NODEIPNUMBER" -gt 0
          then
            $DIALOG --title "Fehler: Neuer Knoten ${NODEIPNUMBER}" \
                    --backtitle "$BACKTITLE" \
                    --msgbox "Ungültige Nummer ${NODEIPNUMBER}!" 8 $BC
            continue
          fi
        else
	   continue
        fi
	if [ "${NODEIPNUMBER}" -gt "$NODEIPMAXNR" ]
	then
	        $DIALOG --title "$ERRTITLE" \
        	       --backtitle "$BACKTITLE" \
	               --msgbox "Bitte wählen Sie eine Nummer von 1 bis $NODEIPMAXNR!" 5 $BC
		continue
	fi

	NODEIPFILE=${NODEIPTMPDIR}/${NODEIPNUMBER}
	if test -f $NODEIPFILE
	then
          $DIALOG --title "Fehler: Neuer Knoten ${NODEIPNUMBER}" \
                  --backtitle "$BACKTITLE" \
                  --msgbox "Knoten Nummer ${NODEIPNUMBER} existiert bereits!" 8 $BC
	   continue
        fi

        TMP="192.168.111.$((${NODEIPNUMBER}+100))"
        NODEIPEXT=unset
        while $DIALOG --title "Neuer Knoten ${NODEIPNUMBER}: ${NODEIPTITLE}" \
                  --backtitle "$BACKTITLE" \
                  --inputbox "IP-Adresse für die VPN-Verbindung (a.b.c.d, z.B. 192.168.111.$((${NODEIPNUMBER}+100)))" 8 $BC "$TMP" \
                  2>$TMPFILE
        do
          TMP=`cat $TMPFILE`
          check_input single ip "$TMP" || continue
          NODEIPEXT=$TMP
          break
        done
        test "$NODEIPEXT" = "unset" && continue

        TMP="192.168.112.$((${NODEIPNUMBER}+100))"
        NODEIPCEPHIP=unset
        while $DIALOG --title "Neuer Knoten ${NODEIPNUMBER}: ${NODEIPTITLE}" \
                  --backtitle "$BACKTITLE" \
                  --inputbox "IP-Adresse für die Ceph-Verbindung hinter dem VPN (a.b.c.d, z.B. 192.168.112.$((${NODEIPNUMBER}+100)))" 8 $BC "$TMP" \
                  2>$TMPFILE
        do
          TMP=`cat $TMPFILE`
          check_input single ip "$TMP" || continue
          NODEIPCEPHIP=$TMP
          break
        done
        test "$NODEIPCEPHIP" = "unset" && continue

        NODEIPDATE="$(date -I)"
	>${NODEIPFILE}
	write_knoten_ip ${NODEIPFILE}
        NEEDSAVE=yes
        NEEDAPPLY=yes
#        VPNCEPHCHOICE=$NODEIPNUMBER
      ;;

      *)
	NODEIPFILE=${NODEIPTMPDIR}/${VPNCEPHCHOICE}

	if [ -f ${NODEIPFILE} ]
	then
	  . ${NODEIPFILE}

	  while $DIALOG --title "$USER@$HOSTNAME: Knoten-IP-Adressen: ${NODEIPNUMBER}" \
		--backtitle "$BACKTITLE" \
                --default-item "$NODEIPSUBCHOICE" \
		--menu "Was möchten Sie durchführen?" $BL $BC 12 \
                "Ende" "Dieses Menü verlassen" \
		"Löschen" "Knoten löschen" \
                "--------------" " " \
		"Nummer:" "${NODEIPNUMBER}" \
		"IP-Adresse VPN:" "${NODEIPEXT}" \
		"IP-Adresse Ceph:" "${NODEIPCEPHIP}" \
		2>${TMPFILE}
	  do
	    NODEIPSUBCHOICE=$(cat ${TMPFILE})

	    case $NODEIPSUBCHOICE in
	      'Ende')
		break
	      ;;

	      'Löschen')
                if $DIALOG --title "Knoten-IP-Adressen $NODEIPNUMBER" \
                           --backtitle "$BACKTITLE" \
                           --defaultno \
                           --yesno "Knoten ${NODEIPNUMBER}:${NODEIPEXT}:${NODEIPCEPHIP} wirklich löschen?" 5 $BC \
                 2>$TMPFILE
                then
                  rm ${NODEIPFILE}
                  NEEDSAVE=yes
                  NEEDAPPLY=yes
                fi
		break
	      ;;

	      'Nummer:')
	        if $DIALOG --title "Knoten-IP-Adressen $NODEIPNUMBER" \
			--backtitle "$BACKTITLE" --max-input 4 \
			--inputbox "Neue Nummer (1-$NODEIPMAXNR)" 8 $BC "${NODEIPNUMBER}" \
			2>$TMPFILE
		then
                  TMP=`cat $TMPFILE`
                  check_input single number "$TMP" || continue
                  if ! test "$TMP" -gt 0
                  then
                    $DIALOG --title "Fehler: Knoten ${NODEIPEXT}:${NODEIPCEPHIP}" \
                            --backtitle "$BACKTITLE" \
                            --msgbox "Ungültige Nummer ${TMP}!" 8 $BC
                    continue
                  fi
		  if [ "${TMP}" -gt "$NODEIPMAXNR" ]
		  then
		    $DIALOG --title "$ERRTITLE" \
        	       --backtitle "$BACKTITLE" \
	               --msgbox "Bitte wählen Sie eine Nummer von 1 bis $NODEIPMAXNR!" 5 $BC
		    continue
	          fi
                  NODEIPNUMBER=$TMP
                  rm -f $NODEIPFILE
                  NODEIPFILE=${NODEIPTMPDIR}/${NODEIPNUMBER}
                  write_knoten_ip ${NODEIPFILE}
                  NEEDSAVE=yes
                  NEEDAPPLY=yes
		fi
	      ;;

	      'IP-Adresse VPN:')
                TMP=$NODEIPEXT
                while $DIALOG --title "Knoten-IP-Adressen ${NODEIPNUMBER}: ${NODEIPTITLE}" \
                           --backtitle "$BACKTITLE" \
                           --inputbox "IP-Adresse für die VPN-Verbindung (a.b.c.d, z.B. 192.168.111.${NODEIPNUMBER})" 8 $BC "$TMP" \
                  2>$TMPFILE
                do
                  TMP=`cat $TMPFILE`
		  check_input single ip "$TMP" || continue
		  NODEIPEXT="$TMP"
		  write_knoten_ip ${NODEIPFILE}
                  NEEDSAVE=yes
                  NEEDAPPLY=yes
                  break
		done
	      ;;

	      'IP-Adresse Ceph:')
                TMP=$NODEIPCEPHIP
                while $DIALOG --title "Knoten-IP-Adressen ${NODEIPNUMBER}: ${NODEIPTITLE}" \
                           --backtitle "$BACKTITLE" \
                           --inputbox "IP-Adresse für die Ceph-Verbindung hinter dem VPN (a.b.c.d, z.B. 192.168.112.${NODEIPNUMBER})" 8 $BC "$TMP" \
                  2>$TMPFILE
                do
                  TMP=`cat $TMPFILE`
		  check_input single ip "$TMP" || continue
		  NODEIPCEPHIP="$TMP"
		  write_knoten_ip ${NODEIPFILE}
                  NEEDSAVE=yes
                  NEEDAPPLY=yes
                  break
		done
	      ;;

	    esac
	  done
	fi
      ;;

    esac
  done
}

function anwenden {
      NOWSECS=$(date +%s)
      rm -f /var/run/utmp
      if test "$VPNCOPIED" = "yes"
      then
	ALLVPN="`ls ${VPNTMPDIR}/[0-9]* 2>/dev/null`"
      else
	ALLVPN="`ls ${VPNDIR}/[0-9]* 2>/dev/null`"
      fi
      # Recreate OpenVPN
      test "$1" = "voll" && systemctl stop openvpn
      rm -f $OPENVPNCONFDIR/[123456789]*.conf
        for i in $(ls -d ${CUDIR}/openvpnca/[123456789]* 2>/dev/null)
        do
          TMP="$(basename $i)"
          if test "$VPNCOPIED" = "yes"
          then
            TMP2=${VPNTMPDIR}/$TMP
          else
            TMP2=${VPNDIR}/$TMP
          fi
          if ! test -f $TMP2
          then
            echo "Entferne CA und Keys des gelöschten VPN $TMP"
            rm -rf $i $OPENVPNCONFDIR/keys/$TMP
            rm -f $OPENVPNCONFDIR/$TMP.key
          fi
        done
        if test -n "$ALLVPN"
        then
          for i in $ALLVPN
          do
	    openvpn_read $i
	    if test "$VPNAKTIV" = "Nein"
	    then
              test "$1" = "voll" || call_rc openvpn stop nowait $VPNNUMBER
	      continue
	    fi
	    {
	      echo "proto $VPNPROTO"
	      if test "$VPNMODE" != "server"
	      then
	        test -n "$VPNREMOTEEXTIP" && echo "remote $VPNREMOTEEXTIP"
	      fi
	      test -n "$VPNREMOTEEXTPORT" && echo "rport $VPNREMOTEEXTPORT"
	      test -n "$VPNLOCALEXTIP" && echo "local $VPNLOCALEXTIP"
	      test -n "$VPNLOCALEXTPORT" && echo "lport $VPNLOCALEXTPORT"
	      if test "$VPNPROTO" = "tcp-client" -a "$VPNPROXYTYPE" != "ohne" -a -n "$VPNPROXY" -a -n "$VPNPROXYPORT"
	      then
	        if test "$VPNPROXYTYPE" = "socks"
	        then
	          echo "socks-proxy $VPNPROXY $VPNPROXYPORT"
	        else
	          echo "http-proxy $VPNPROXY $VPNPROXYPORT"
	        fi
	      fi
	      echo "dev tun"
	      echo "ifconfig $VPNLOCALINTIP $VPNREMOTEINTIP"
	      if test "$VPNMODE" = "server"
	      then
	        echo "mode server"
	        echo "tls-server"
#	        echo "tls-cipher ALL:!SSLv3"
	        echo "hand-window 120"
	        if test -n "$VPNREMOTEINTFIRST" -a -n "$VPNREMOTEINTLAST"
	        then
	          echo "ifconfig-pool $VPNREMOTEINTFIRST $VPNREMOTEINTLAST"
	          echo "ifconfig-pool-persist /var/run/openvpn/$VPNNUMBER.pool"
	          echo "push \"route $VPNLOCALINTIP\""
	          echo "max-clients $VPNNUMCLIENTS"
	        fi
	        if test "$VPNPROTO" = "udp"
	        then
	          echo "connect-freq 10 10"
	        fi
	        if test "$VPNAUTHUSERPASS" = "Ja"
	        then
	          echo "auth-user-pass-verify /usr/local/bin/vpnauthuserpass via-env"
	          echo "username-as-common-name"
	          echo "script-security 3"
	        else
	          echo "script-security 2"
	        fi
	        echo "ca ${OPENVPNCONFDIR}/keys/$VPNNUMBER/cacert.pem"
	        echo "dh ${OPENVPNCONFDIR}/keys/$VPNNUMBER/dh.pem"
	        echo "cert ${OPENVPNCONFDIR}/keys/$VPNNUMBER/server.crt"
	        echo "key ${OPENVPNCONFDIR}/keys/$VPNNUMBER/server.key"
	        if test "$VPNTLSAUTH" = "Ja"
	        then
	          echo "tls-auth ${OPENVPNCONFDIR}/keys/$VPNNUMBER/tls-auth"
	        fi
	        echo "crl-verify ${OPENVPNCONFDIR}/keys/$VPNNUMBER/crl.pem"
	        echo "client-connect /usr/local/bin/vpnclientconnect"
	        echo "client-disconnect /usr/local/bin/vpnclientdisconnect"
	        echo "tmp-dir /var/run/openvpn"
	        if test -z "$VPNREMOTEINTFIRST" -o -z "$VPNREMOTEINTLAST"
	        then
	          echo "client-config-dir /etc/openvpn/clients/$VPNNUMBER"
	          echo "push \"ifconfig $VPNREMOTEINTIP $VPNLOCALINTIP\""
	        fi
	        if test -n "$VPNPUSHROUTE"
	        then
	          for i in $VPNPUSHROUTE
	          do
	            echo ${i//\// }
	          done | while read net bits
	            do
	              echo "push \"route $net $(bitstonetmask $bits)\""
	            done
	        fi
	      elif test "$VPNMODE" = "client"
	      then
	        echo "client"
	        if test "$VPNREDIRECT" = "Ja"
	        then
	          echo "redirect-gateway def1"
	        fi
	        echo "ca ${OPENVPNCONFDIR}/keys/$VPNNUMBER/cacert.pem"
	        echo "cert ${OPENVPNCONFDIR}/keys/$VPNNUMBER/client.crt"
	        echo "key ${OPENVPNCONFDIR}/keys/$VPNNUMBER/client.key"
	        if test "$VPNTLSAUTH" = "Ja"
	        then
	          echo "tls-auth ${OPENVPNCONFDIR}/keys/$VPNNUMBER/tls-auth"
	        fi
	        if test -n "$VPNUSER" -a -n "$VPNPASS"
	        then
	          echo "auth-user-pass ${OPENVPNCONFDIR}/keys/$VPNNUMBER/up"
	        fi
	        echo "script-security 2"
	      else
	        echo "secret ${OPENVPNCONFDIR}/keys/$VPNNUMBER.key"
	        echo "script-security 2"
	      fi
	      echo "verb 3"
	      if test -n "$VPNCIPHER"
	      then
	        if test "$VPNCIPHER" = "BF-256-CBC"
	        then
	          echo "cipher BF-CBC"
	          echo "keysize 256"
	        else
	          echo "cipher $VPNCIPHER"
	        fi
	      fi
	      test -n "$VPNDIGEST" && echo "auth $VPNDIGEST"
	      test "$VPNREMOTEDYN" = "Ja" && echo "float"
	      echo "daemon"
	      echo "mlock"
	      for i in $VPNEXTRA
	      do
	        case $i in
	          keepalive)
	            echo "keepalive 10 60"
	            if test "$VPNPROTO" = "tcp-server" -o "$VPNPROTO" = "udp"
	            then
	              echo "ping-timer-rem"
	            fi
	            ;;
	          mtu-test)
	            if test "$VPNPROTO" = "udp"
	            then
	              echo "mtu-test"
	            fi
	            ;;
	          *)
	            echo "$i"
	            ;;
	        esac
	      done
	      echo "writepid /var/run/openvpn/$VPNNUMBER.pid"
	      echo "route-noexec"
              echo "route-up \"/usr/local/bin/openvpnroute $VPNNUMBER\""
              echo "route-pre-down \"/usr/local/bin/openvpnroutedown $VPNNUMBER\""
	      test "$VPNRATELIMIT" -gt 0 && echo shaper "$VPNRATELIMIT"
	      echo "status \"/var/run/openvpn/$VPNNUMBER.status\" 20"
	    } > $OPENVPNCONFDIR/$VPNNUMBER.conf
            if test "$VPNMODE" = "server"
            then
              if ! test -f ${OPENVPNCONFDIR}/keys/$VPNNUMBER/cacert.pem
              then
                echo "Erzeuge OpenVPN $VPNNUMBER SSL-CA"
                echo "[ req ]
default_bits            = 4096
default_keyfile         = privkey.pem
distinguished_name      = req_dn
prompt = no

[ req_dn ]
C=DE
ST=Berlin
L=Berlin
O=mp-ceph $(hostname -f)
OU=SSL OpenVPN $VPNNUMBER CA
$(test -n "$VPNSERVERCN" && echo "CN=$VPNSERVERCN" || echo "CN=$(hostname -f)")
emailAddress=webmaster@$CUDOMAIN" >$TMPFILE
	        createvpnca $VPNNUMBER -days 36500 -config $TMPFILE
              fi
              if ! test -f ${OPENVPNCONFDIR}/keys/$VPNNUMBER/dh.pem
              then
                echo "Creating DH key for VPN $VPNNUMBER"
                openssl dhparam -out ${OPENVPNCONFDIR}/keys/$VPNNUMBER/dh.pem 2048
              elif test  "$(stat -c %s ${OPENVPNCONFDIR}/keys/$VPNNUMBER/dh.pem 2>/dev/null)" -lt 300
              then
                echo "Recreating short DH key for VPN $VPNNUMBER with 2048 Bits"
                mv ${OPENVPNCONFDIR}/keys/$VPNNUMBER/dh.pem ${OPENVPNCONFDIR}/keys/$VPNNUMBER/dh.pem.old
                openssl dhparam -out ${OPENVPNCONFDIR}/keys/$VPNNUMBER/dh.pem 2048
              fi
              if test ! -f ${OPENVPNCONFDIR}/keys/$VPNNUMBER/tls-auth
              then
                openvpn --genkey --secret ${OPENVPNCONFDIR}/keys/$VPNNUMBER/tls-auth
              fi
              if test ! -f ${OPENVPNCONFDIR}/keys/$VPNNUMBER/server.key \
                -o ! -f ${OPENVPNCONFDIR}/keys/$VPNNUMBER/server.crt \
                -o ${OPENVPNCONFDIR}/keys/$VPNNUMBER/server.key -ot ${OPENVPNCONFDIR}/keys/$VPNNUMBER/cacert.pem
              then
		echo "Erzeuge SSL-Zertifikat für OpenVPN $VPNNUMBER Server"
                echo "[ req ]
default_bits            = 4096
default_keyfile         = privkey.pem
distinguished_name      = req_dn
prompt = no

[ req_dn ]
C=DE
ST=Berlin
L=Berlin
O=mp-ceph $(hostname -f)
OU=SSL OpenVPN $VPNNUMBER Server
$(test -n "$VPNSERVERCN" && echo "CN=$VPNSERVERCN" || echo "CN=$(hostname -f)")
emailAddress=webmaster@$CUDOMAIN" >$TMPFILE
	        createvpncertserver $VPNNUMBER -days 36500 -config $TMPFILE >/dev/null
	        chmod 600 ${OPENVPNCONFDIR}/keys/$VPNNUMBER/server.*
              fi
              if ! test -f ${OPENVPNCONFDIR}/keys/$VPNNUMBER/crl.pem
              then
                openssl ca -config ${CUDIR}/openvpnca/$VPNNUMBER/ca.cnf \
                  -gencrl -out ${OPENVPNCONFDIR}/keys/$VPNNUMBER/crl.pem
              fi
              for VPNCLIENTNUMBER in $(seq 1 $VPNNUMCLIENTS)
              do
                test -f ${CUDIR}/openvpnca/$VPNNUMBER/$VPNCLIENTNUMBER/$VPNCLIENTNUMBER.key \
                  -a ${CUDIR}/openvpnca/$VPNNUMBER/$VPNCLIENTNUMBER/$VPNCLIENTNUMBER.key -nt ${OPENVPNCONFDIR}/keys/$VPNNUMBER/cacert.pem \
                  && continue
		echo "Erzeuge SSL-Zertifikat für OpenVPN $VPNNUMBER Klient $VPNCLIENTNUMBER"
                echo "[ req ]
default_bits            = 4096
default_keyfile         = privkey.pem
distinguished_name      = req_dn
prompt = no

[ req_dn ]
C=DE
ST=Berlin
L=Berlin
O=mp-ceph $(hostname -f)
OU=SSL OpenVPN $VPNNUMBER Client $VPNCLIENTNUMBER
CN=vpn-${VPNNUMBER}-${VPNCLIENTNUMBER}.${CUDOMAIN}
emailAddress=webmaster@$CUDOMAIN" >$TMPFILE
	        createvpncert $VPNNUMBER $VPNCLIENTNUMBER -days 36500 -config $TMPFILE >/dev/null
              done
              mkdir -p -m 700 /etc/openvpn/clients/$VPNNUMBER
	      if test -z "$VPNREMOTEINTFIRST" -o -z "$VPNREMOTEINTLAST"
	      then
                {
                  if test -n "$VPNREMOTEINTNET"
                  then
                    for i in $VPNREMOTEINTNET
                    do
                      case $i in
                        */*)
                          tmpnet=$(echo $i|cut -d / -f 1)
                          tmpmask=$(bitstonetmask $(echo $i|cut -d / -f 2) 2>/dev/null)
                          echo "iroute $tmpnet $tmpmask"
                          ;;
                        *)
                          echo "iroute $i"
                          ;;
                      esac
                    done
                  fi
                } >/etc/openvpn/clients/$VPNNUMBER/DEFAULT
              else
                rm -f /etc/openvpn/clients/$VPNNUMBER/DEFAULT
              fi
            elif test "$VPNMODE" = "client"
            then
	      if test -n "$VPNUSER" -a -n "$VPNPASS"
	      then
	        {
	          echo "$VPNUSER"
	          echo "$VPNPASS"
		} > ${OPENVPNCONFDIR}/keys/$VPNNUMBER/up
	        chmod 600 ${OPENVPNCONFDIR}/keys/$VPNNUMBER/up
	      else
	        rm -f ${OPENVPNCONFDIR}/keys/$VPNNUMBER/up
	      fi
            fi
            if test "$1" = "voll"
            then
              systemctl enable openvpn
              systemctl start openvpn
            else
              if ps ax | grep -v grep |grep -q "/usr/sbin/openvpn --daemon ovpn-$VPNNUMBER"
              then
                systemctl reload openvpn
              else
                systemctl enable openvpn
                systemctl start openvpn
              fi
            fi
          done
        fi
      if test "$VPNCOPIED" = "yes"
      then
        ALLVPN="`ls ${VPNTMPDIR}/[0-9]* 2>/dev/null`"
      else
        ALLVPN="`ls ${VPNDIR}/[0-9]* 2>/dev/null`"
      fi
      >$TMPFILE3
      test -n "$ALLVPN" && for i in $ALLVPN
      do
        if [ -f $i ]
        then
          openvpn_read $i
          test "$VPNAKTIV" = "Nein" && continue
          if ! ps axw|grep -v grep|grep -q "/usr/sbin/openvpn --daemon ovpn-$VPNNUMBER"
          then
            echo "Start von OpenVPN $VPNNUMBER: \"$VPNTITLE\" ist fehlgeschlagen!" >>$TMPFILE2
            echo ja >$TMPFILE3
          fi
        fi
      done
      if test "$(cat $TMPFILE3)" = "ja" -a "$2" != "ohnessl" -a "$2" != "nocomplain"
      then
        $DIALOG --title "$ERRTITLE" \
                --backtitle "$BACKTITLE" --timeout 120 \
                --textbox $TMPFILE2 $BL $BC
      fi
      openvpn_ceph_create
      echo -e '\033[32;01m'"Fertig.\033[00m"

      NEEDAPPLY=no
      echo "NEEDAPPLY=no" >$APPLYCONF
      test -f $JOBSDIR/anwenden && rm -f $JOBSDIR/anwenden
      sleep 2
#      test "$1" = "voll" && pkill -u config tee &>/dev/null
}

function read_netconf {
  remove_tmp_openvpn
  VPNCOPIED=no
  NEEDSAVE=no
  . /etc/cu/netconf &>/dev/null
  test -z "$VPNCEPHNET" && VPNCEPHNET="192.168.113.0"
}

function speichern {
      if test "$1" != "noask"
      then
        if ! $DIALOG --title "$TITLE" \
          --backtitle "$BACKTITLE" \
          --yesno "Speichern aller Einstellungen - sind Sie sicher?" 5 $BC \
          2>$TMPFILE
        then
          continue
        fi
      fi
      if [ "${VPNCOPIED}" = "yes" ]
      then
	# Then remove the old configuration files
	if [ -d ${VPNDIR} ]
	then
		rm -f ${VPNDIR}/[0-9]*
	fi

        # And move the changed files to the directory instead
        mv -f ${VPNTMPDIR}/[0-9]* ${VPNDIR}

        # Finally set the copied flag back to "no"
        VPNCOPIED=no
      fi
      if [ "${NODEIPCOPIED}" = "yes" ]
      then
	# Then remove the old configuration files
	if [ -d ${NODEIPDIR} ]
	then
		rm -f ${NODEIPDIR}/[0-9]*
	fi

        # And move the changed files to the directory instead
        mv -f ${NODEIPTMPDIR}/[0-9]* ${NODEIPDIR}

        # Finally set the copied flag back to "no"
        NODEIPCOPIED=no
      fi
      {
        echo "VPNCEPHNODES=\"$VPNCEPHNODES\""
        echo "VPNCEPHNET=\"$VPNCEPHNET\""
      } > /etc/cu/netconf
      if test "$NEEDSAVE" = "yes"
      then
        NEEDSAVE=no
      fi
      if test "$NEEDAPPLY" = "yes"
      then
        echo "NEEDAPPLY=yes" >$APPLYCONF
      fi
      if test "$1" != "noask"
      then
        $DIALOG --title "$TITLE" \
          --backtitle "$BACKTITLE" \
          --msgbox "Die Einstellungen wurden gespeichert." 5 $BC \
          2>$TMPFILE
      fi
}

function settings_menu {
read_netconf

NETCHOICE=
while true
do
{
  test -f $APPLYCONF && . $APPLYCONF
  echo 'function settings_menu_dialog {'
  echo 'TMP="$(shutdown_time)"'
  echo '$DIALOG --title "$TITLE" \'
  echo '         --backtitle "$BACKTITLE" \'
  echo '         --default-item "$NETCHOICE" --colors \'
  if test $CONFIGTMPDIR -ot /sbin/gateway-config
  then
    echo '  --menu "OpenVPN-Einstellungen - \Z1Paket-Update, bitte neu anmelden!$(test -n "$TMP" && echo " - \Z1Reboot um $TMP")" $BL $BC `gl 8` \'
  elif test -f ${CUDIR}/jobs/anwenden
  then
    echo '  --menu "Einstellungen - \Z1Paket-Updates, bitte $(test "$NEEDSAVE" = "yes" && echo -n "Speichern und ")Anwenden!$(test -n "$TMP" && echo " - \Z1Reboot um $TMP")" $BL $BC `gl 8` \'
    NEEDAPPLY=yes
  else
    echo '  --menu "Einstellungen$(test "$NEEDSAVE" = "yes" && echo -n " - \Z1nicht gespeichert")$(test "$NEEDAPPLY" = "yes" && echo -n " - \Z1nicht angewendet")$(test -f ${CUDIR}/jobs/reboot 2>/dev/null && echo " - \Z1Reboot nötig!")$(test -n "$TMP" && echo " - \Z1Reboot um $TMP")" $BL $BC `gl 8` \'
  fi
  echo '                "Ende" "Dieses Menü verlassen" \'
  echo '                "Speichern:" "Abspeichern in Konfigurationsdatei" \'
  echo '                "Voll Anwenden:" "System sofort komplett umstellen" \'
  echo '                "Sanft Anwenden:" "System unterbrechungsarm umstellen" \'
  echo '                "----------------------" "" \'
  echo '                "TightGate-Pro OpenVPN:" "VPN-Verbindungen der Klienten" \'
  echo '                "Ceph OpenVPN:" "VPN-Verbindungen der Ceph-Nodes" \'
  echo '                "SSH und PW Replizieren" "Auf Nodes kopieren" \'
  echo ""
  echo '}'
} >$TMPFILE

. $TMPFILE

  if ! settings_menu_dialog 2>$TMPFILE
  then
    if test "$NEEDSAVE" = "yes"
    then
      if ! $DIALOG --title "$TITLE" \
                --backtitle "$BACKTITLE" \
                --defaultno \
                --yesno "Daten wurden nicht gesichert - trotzdem beenden und damit auf alte Werte zurücksetzen (Anzeigen der Änderungen mit \"Anzeigen\")?" 6 $BC \
                  2>$TMPFILE
      then
        continue
      fi
    fi
    if test "$NEEDAPPLY" = "yes"
    then
      $DIALOG --title "$TITLE" \
             --backtitle "$BACKTITLE" \
             --infobox "Die Einstellungen wurden gesichert, aber nicht im System umgesetzt. Sie können das jederzeit nachholen." $BL $BC \
                  2>$TMPFILE
      echo "NEEDAPPLY=yes" >$APPLYCONF
    fi
    echo "Abbruch"
    cat $TMPFILE
    return
  fi

  NETCHOICE=`cat $TMPFILE`
  case "$NETCHOICE" in
    'Speichern:')
      speichern
      NEEDSAVE=no
      ;;

    'Voll Anwenden:')
      if ! $DIALOG --title "$TITLE" \
                --backtitle "$BACKTITLE" \
                --defaultno \
                --yesno "Sofortiges, komplettes Anwenden aller Einstellungen - bestehende Verbindungen können verloren gehen. Möchten Sie fortsetzen?" 7 $BC \
                  2>$TMPFILE
      then
        continue
      fi
      if test "$NEEDSAVE" = "yes"
      then
        if $DIALOG --title "$TITLE" \
                --backtitle "$BACKTITLE" \
                --yesno "Die Daten sind noch nicht gespeichert. Jetzt speichern und fortsetzen?" 6 $BC \
                  2>$TMPFILE
        then
          speichern
          NEEDSAVE=no
        else
          continue
        fi
      fi
      mkdir -p -m 0700 /var/log/admin/anwenden/
      DATE=$(date +%Y%m%d%H%M%S)
      LASTCONF=$(ls -tr /var/log/admin/anwenden/*.config 2>/dev/null|tail -n 1)
      {
        echo "$(date)|$ACCUSER|$SSH_CLIENT| Anwenden Voll"
        echo ""
        openvpn_show
      } > /var/log/admin/anwenden/$DATE.voll.config
      if test -n "$LASTCONF"
      then
        diff -u "$LASTCONF" /var/log/admin/anwenden/$DATE.voll.config \
          >/var/log/admin/anwenden/$DATE.voll.diff
      fi
      anwenden voll 2>&1 | tee /var/log/admin/anwenden/$DATE.voll.log
      rm -f /var/log/admin/anwenden/last.voll.log
      ln -s $DATE.voll.log /var/log/admin/anwenden/last.voll.log
      ;;

    'Sanft Anwenden:')
      if ! $DIALOG --title "$TITLE" \
                --backtitle "$BACKTITLE" \
                --defaultno \
                --yesno "Sanftes Anwenden einiger Einstellungen - bestehende Verbindungen bleiben soweit möglich erhalten, beim nächsten Systemstart oder vollem Anwenden werden alle Änderungen wirksam. Möchten Sie fortsetzen?" 8 $BC \
                  2>$TMPFILE
      then
        continue
      fi
      if test "$NEEDSAVE" = "yes"
      then
        if $DIALOG --title "$TITLE" \
                --backtitle "$BACKTITLE" \
                --yesno "Die Daten sind noch nicht gespeichert. Jetzt speichern und fortsetzen?" 6 $BC \
                  2>$TMPFILE
        then
          speichern
          NEEDSAVE=no
        else
          continue
        fi
      fi
      mkdir -p -m 0700 /var/log/admin/anwenden/
      DATE=$(date +%Y%m%d%H%M%S)
      LASTCONF=$(ls -tr /var/log/admin/anwenden/*.config 2>/dev/null|tail -n 1)
      {
        echo "$(date)|$ACCUSER|$SSH_CLIENT| Anwenden Sanft"
        echo ""
        openvpn_show
      } > /var/log/admin/anwenden/$DATE.sanft.config
      if test -n "$LASTCONF"
      then
        diff -u "$LASTCONF" /var/log/admin/anwenden/$DATE.sanft.config \
          >/var/log/admin/anwenden/$DATE.sanft.diff
      fi
      anwenden sanft 2>&1 | tee /var/log/admin/anwenden/$DATE.sanft.log
      rm -f /var/log/admin/anwenden/last.sanft.log
      ln -s $DATE.sanft.log /var/log/admin/anwenden/last.sanft.log
      ;;

    'TightGate-Pro OpenVPN:')
      openvpn_menu
      ;;

    'Ceph OpenVPN:')
      openvpn_ceph_menu
      ;;

    'SSH und PW Replizieren')
      if $DIALOG --title "$TITLE" \
                 --backtitle "$BACKTITLE" --max-input 15 \
                 --inputbox "Auf welche IP-Adresse möchten Sie die Passworte und SSH-Schlüssel replizieren?" 8 $BC "" \
        2>$TMPFILE
      then
        TARGET=`cat $TMPFILE`
        check_input single ip "$TARGET" || continue
        test -n "$TARGET" || continue
      else
        continue
      fi
      if ! test -f /root/.ssh/id_ed25519
      then
        ssh-keygen -t ed25519 -N "" -C "root@ceph" -f /root/.ssh/id_ed25519
      fi
      if ! grep -q "root@ceph" /root/.ssh/authorized_keys
      then
        cat /root/.ssh/id_*.pub >> /root/.ssh/authorized_keys
      fi
      scp -o CheckHostIP=no -o StrictHostKeyChecking=no /root/.ssh/authorized_keys /root/.ssh/known_hosts /root/.ssh/id_* root@$TARGET:/root/.ssh/
      ssh-keygen -f "/root/.ssh/known_hosts" -R $TARGET
      scp -o CheckHostIP=no -o StrictHostKeyChecking=no /etc/ssh/ssh_host_*_key /etc/ssh/ssh_host_*_key.pub root@$TARGET:$VPNDIR/etc/ssh/
      ssh-keygen -f "/root/.ssh/known_hosts" -R $TARGET
      scp -o CheckHostIP=no -o StrictHostKeyChecking=no /etc/shadow root@$TARGET:/etc/
      scp -o CheckHostIP=no -o StrictHostKeyChecking=no /root/.ssh/known_hosts root@$TARGET:/root/.ssh/
      sleep 2
      ;;

    Ende)
      if test "$NEEDSAVE" = "yes"
      then
        if $DIALOG --title "$TITLE" \
                  --backtitle "$BACKTITLE" \
                  --defaultno \
                  --yesno "Daten wurden nicht gesichert - trotzdem beenden und damit auf alte Werte zurücksetzen (Anzeigen der Änderungen mit \"Anzeigen\")?" 7 $BC \
                    2>$TMPFILE
        then
          return
        fi
      else
        if test "$NEEDAPPLY" = "yes"
        then
          $DIALOG --title "$TITLE" \
             --backtitle "$BACKTITLE" \
             --infobox "Die Einstellungen wurden gesichert, aber nicht im System umgesetzt. Sie können das jederzeit nachholen." $BL $BC \
                  2>$TMPFILE
          echo "NEEDAPPLY=yes" >$APPLYCONF
        fi
        return
      fi
      ;;

    *)
        $DIALOG --title "$ERRTITLE" \
               --backtitle "$BACKTITLE" \
               --msgbox "Einstellungs-Menü: Auswahl-Fehler!" 5 $BC

  esac
#sleep 2
done
}

function gen_local_ips {
  DEF="$1"
  test -z "$DEF" && DEF="127.0.0.1/8"
  ip addr|grep inet|cut -d " " -f 6,11|while read ip dev
  do
    test -z "$dev" && dev="lo"
    if test "$ip" = "$DEF"
    then
      echo "$ip $dev on"
    else
      echo "$ip $dev off"
    fi
  done
}

if test "$1" = "anwenden"
then
  DATE=$(date +%Y%m%d%H%M%S)
  read_netconf
  anwenden sanft 2>&1 | tee /var/log/admin/anwenden/$DATE.sanft.log
  rm -rf $CONFIGTMPDIR
  exit 0
fi

settings_menu

rm -rf $CONFIGTMPDIR
