#!/bin/bash | |
# Cisco Anyconnect CSD wrapper for OpenConnect | |
# Enter your vpn host here | |
if [[ -z ${CSD_HOSTNAME} ]] | |
then | |
echo "Define CSD_HOSTNAME with vpn-host in script text. Exiting." | |
exit 1 | |
fi | |
HOSTSCAN_DIR="$HOME/.cisco/hostscan" | |
LIB_DIR="$HOSTSCAN_DIR/lib" | |
BIN_DIR="$HOSTSCAN_DIR/bin" | |
BINS=("cscan" "cstub" "cnotify") | |
# parsing command line | |
shift | |
URL= | |
TICKET= | |
STUB= | |
GROUP= | |
CERTHASH= | |
LANGSELEN= | |
while [ "$1" ]; do | |
if [ "$1" == "-ticket" ]; then shift; TICKET=$1; fi | |
if [ "$1" == "-stub" ]; then shift; STUB=$1; fi | |
if [ "$1" == "-group" ]; then shift; GROUP=$1; fi | |
if [ "$1" == "-certhash" ]; then shift; CERTHASH=$1; fi | |
if [ "$1" == "-url" ]; then shift; URL=$1; fi | |
if [ "$1" == "-langselen" ];then shift; LANGSELEN=$1; fi | |
shift | |
done | |
case `uname` in | |
Darwin) | |
ARCH="darwin_i386" | |
;; | |
linux) | |
ARCH=$(uname -m) | |
if [[ "$ARCH" == "x86_64" ]] | |
then | |
ARCH="linux_x64" | |
else | |
ARCH="linux_i386" | |
fi | |
;; | |
esac | |
# creating dirs | |
for dir in $HOSTSCAN_DIR $LIB_DIR $BIN_DIR ; do | |
if [[ ! -f $dir ]] | |
then | |
mkdir -p $dir | |
fi | |
done | |
# getting manifest, and checking binaries | |
wget --no-check-certificate -c "https://${CSD_HOSTNAME}/CACHE/sdesktop/hostscan/$ARCH/manifest" -O "$HOSTSCAN_DIR/manifest" | |
case `uname` in | |
Darwin) | |
SED="sed -E"; | |
MD5="md5"; | |
;; | |
*) | |
SED="sed -r"; | |
MD5="md5sum -c"; | |
;; | |
esac; | |
# generating md5.sum with full paths from manifest | |
export HOSTSCAN_DIR=$HOSTSCAN_DIR | |
cat $HOSTSCAN_DIR/manifest | ${SED} 's/\(|\)//g' | awk '{ cmd = "find $HOSTSCAN_DIR -iname " $2; while (cmd | getline line) { print $4, line; } }' > $HOSTSCAN_DIR/md5.sum | |
# check number of files either | |
MD5_LINES=`wc -l $HOSTSCAN_DIR/md5.sum | awk '{ print $1; }'` | |
MANIFEST_LINES=`wc -l $HOSTSCAN_DIR/manifest | awk '{ print $1; }'` | |
echo "Got $MANIFEST_LINES files in manifest, locally found $MD5_LINES" | |
# check md5 | |
${MD5} $HOSTSCAN_DIR/md5.sum | |
if [[ "$?" -ne "0" || "$MD5_LINES" -ne "$MANIFEST_LINES" ]] | |
then | |
echo "Corrupted files, or whatever wrong with md5 sums, or missing some file" | |
# just download every file mentioned in manifest (not ideal, but hopefully should be enough) | |
FILES=( $(cat $HOSTSCAN_DIR/manifest | ${SED} 's/\(|\)//g' | awk '{ print $2; }') ) | |
WORK_DIR=`pwd` | |
TMP_DIR=`mktemp -d` && cd $TMP_DIR | |
for i in ${FILES[@]} ; do | |
FILE="$(basename "$i")" | |
if [ ! -e ${LIB_DIR}/${FILE} ] && [ ! -e ${BIN_DIR}/${FILE} ] | |
then | |
echo "Downloading: $FILE to $TMP_DIR" | |
wget --no-check-certificate -c "https://${CSD_HOSTNAME}/CACHE/sdesktop/hostscan/$ARCH/$FILE" -O $FILE | |
# some files are in gz (don't understand logic here) | |
if [[ ! -f $FILE || ! -s $FILE ]] | |
then | |
# remove 0 size files | |
if [[ ! -s $FILE ]]; then | |
rm $FILE | |
fi | |
echo "Failure on $FILE, trying gz" | |
FILE_GZ=$FILE.gz | |
wget --no-check-certificate -c "https://${CSD_HOSTNAME}/CACHE/sdesktop/hostscan/$ARCH/$FILE_GZ" -O $FILE_GZ | |
gunzip --verbose --decompress $FILE_GZ | |
fi | |
# don't know why, but my version of hostscan requires tables to be stored in libs | |
echo $FILE | grep --extended-regexp --quiet --invert-match ".so|tables.dat" | |
IS_LIB=$? | |
if [[ "$IS_LIB" -eq "1" ]] | |
then | |
cp -v $FILE $LIB_DIR | |
else | |
cp -v $FILE $BIN_DIR | |
fi | |
fi | |
done | |
for i in ${BINS[@]} ; do | |
echo "Setting excecution bit on: $BIN_DIR/$i" | |
chmod u+x $BIN_DIR/$i | |
done | |
cd $WORK_DIR | |
rm -rf $TMP_DIR | |
fi | |
# cstub doesn't care about logging options, sic! | |
#ARGS="-log debug -ticket $TICKET -stub $STUB -group $GROUP -host $URL -certhash $CERTHASH" | |
ARGS="-log error -ticket $TICKET -stub $STUB -group $GROUP -host $URL -certhash $CERTHASH" | |
echo "Launching: $BIN_DIR/cstub $ARGS" | |
$BIN_DIR/cstub $ARGS |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment