#; kate: space-indent on; indent-width 2; syntax bash;

source "$TV_SCRIPT_DIR/tvw_aux"

TV_VERSION='3.7.4-6005'

TV_BIN_DIR="$(dirname "$TV_SCRIPT_DIR")"
TV_BASE_DIR="$(dirname "$TV_BIN_DIR")"

function Main()
{
  local action="$(ActionTrim "$1")"
  local opt="$2"

  set -o pipefail

  echo
  case "$action" in
    'ziplog'              )        CreateZipLog             ;;
    *                     )        echo "Invalid argument"  ;;
  esac

  echo
}

function ActionTrim()
{
  local param="$1"
  local trim=0
  [[ "$param" = -*  ]] && trim=1
  [[ "$param" = --* ]] && trim=2
  echo "${param:$trim}"
}

function CreateZipLog()
{
  local ziplog_dir="$(CreateZipLogTmpDir)"
  local cfg_dir='config'
  local log_dir='logfiles'
  local sysinfo_dir='sysinfo'
  local archive="/tmp/tvlog_${TV_VERSION}_$(hostname)_$(date +%F)"
  local cmd

  echo 'Creating a zip archive from TeamViewer log files, config files, and some system information'

  cp -Lrp "$TV_BASE_DIR/$cfg_dir" $ziplog_dir
  cp -Lrp "$TV_BASE_DIR/$log_dir" $ziplog_dir

  CollectUserConfig

  StripPersonalInformation "$ziplog_dir/$cfg_dir"

  CollectSystemInformation "$ziplog_dir/$sysinfo_dir"

  SelectZipper

  ( # subshell: preserve pwd
    cd "${ziplog_dir}"

    rm -f $archive
    $cmd $archive "$cfg_dir" "$log_dir" "$sysinfo_dir" || die "Done. An error ($?) occurred when creating archive $archive"

    rm -fR $ziplog_dir		# delete temporary data
    chmod 666 $archive		# allow every user to read and delete

    Gecho "\n** Success**\n"
    echo -e "Archive written to $archive\n\n"
  ) || return
}

function StripPersonalInformation()
{
  local config
  local config_dir="$1"
  local strip_global=(
    '[bin  ] Certificate'
    '[bin  ] CertificateKey'
    '[bin  ] MultiPwdMgmtPwdData'
    '[bin  ] PermanentPassword'
    '[bin  ] PK'
    '[bin  ] SK'
    '[bin  ] SRPPasswordMachineIdentifier'
    '[strng] OwningManagerAccountName'
    '[strng] OwningManagerCompanyName'
    )
  local strip_client=(
    '[bin  ] BuddyLoginTokenAES'
    '[bin  ] BuddyLoginTokenSecretAES'
    )

  ( # subshell: preserve pwd
    cd "$config_dir"

    # global.conf
    config='global.conf'
    for s in "${strip_global[@]}"; do
      StripItem "$config" "$s"
    done

    # client.conf
    for config in client_*.conf ; do
      [ -e "$config" ] || continue
      for s in "${strip_client[@]}"; do
        StripItem "$config" "$s"
      done
    done
  )
}

function StripItem()
{
  local file="$1"
  local pattern="$2 ="
  local sedpattern="$(escapeBrackets "$pattern")"

  grep -q "$sedpattern" "$file" || return

  sed -i -e "/$sedpattern/d" "$file"
  echo "# $pattern (stripped)" >> "$file"
}

function escapeBrackets()
{
  local pattern="${1/[/\\[}"
  pattern="${pattern/]/\\]}"
  echo "$pattern"
}

function InfoArch()
{
  local ai64=' '; hasX86_64Support && ai64='X'
  local ai32=' '; hasX86_32Support && ai32='X'
  local aarmhf=' '; hasArmhfSupport  && aarmhf='X'
  local aarmel=' '; hasArmelSupport  && aarmel='X'
  local aarm64=' '; hasArm64Support  && aarm64='X'

  HeadEcho "DistArch:" "$(uname -m)	( Loader:  [$ai64] x86_64  [$ai32] x86_32  [$aarmhf] armhf [$aarmel] armel [$aarm64] arm64 )"
}

function CollectSystemInformation()
{
  local sysinfo_dir="$1"
  local logs=(/var/log/X*.log* /proc/cpuinfo /proc/sys/kernel/shmmax /proc/meminfo)

  mkdir "$sysinfo_dir" || die "failed to create $sysinfo_dir"

  ( # subshell: preserve pwd
    cd "$sysinfo_dir"

    PATH=$PATH:/sbin:/usr/sbin

    # supported architecture information (32/64bit)
    InfoArch > 'architectures'

    # network interfaces
    cmdExists ifconfig && ifconfig -a > 'ifconfig'

    # uname -a
    cmdExists uname && uname -a > 'uname'

    # dbus names
    cmdExists dbus-send && dbus-send --system --print-reply --dest=org.freedesktop.DBus / org.freedesktop.DBus.ListNames > 'dbus-send' 2>&1

    # PCI
    cmdExists lspci && lspci > 'lspci'

    # USB
    cmdExists lsusb && lsusb > 'lsusb'

    # Kernel modules
    cmdExists lsmod && lsmod > 'lsmod'

    # copy X logs, some proc info
    for file in "${logs[@]}" ; do
      [ -f "$file" ] && cp -p "$file" .
    done
  )
}

function CreateZipLogTmpDir()
{
  mktemp -d /tmp/tv_ziplog_XXXXXX || die "Error creating temporary dir in /tmp"
}

function CollectUserConfig()
{
  local logs="$TV_BASE_DIR/logfiles"

  for file in "$logs"/* ; do
    [ -h "$file" ] || continue

    local name="$(basename "$file")"
    local logdest="$(readlink "$file")"
    local cfgfile="${logdest/%"$TV_USER_LOCAL_SUBPATH/$log_dir/"/"$TV_USER_CONFIG_SUBPATH/client.conf"}"
    local dstname="client_$name.conf"	        # see StripPersonalInformation

    [ "$logdest" != "$cfgfile" ] || continue    # substitution failed
    [ -e "$cfgfile"            ] || continue    # no user config file found

    cp "$cfgfile" "$ziplog_dir/$cfg_dir/$dstname"
  done
}

function SelectZipper()
{
#; TODO expectVariables cmd archive

  if cmdExists zip; then
    archive+='.zip'
    cmd='zip -r9'
  elif cmdExists tar && cmdExists gzip; then
    archive+='.tar.gz'
    cmd='tar -zchf'
  fi

  if [ -z "$cmd" ]; then
    Yecho 'Please install either\n* zip   or\n* tar and gzip to allow creation of a compressed archive'
    die 'Could not create a compressed archive of log files - no suitable compressor found'
  fi
}


