Last active
August 29, 2015 14:02
-
-
Save ndelitski/1bcc1877fc6840ec515a to your computer and use it in GitHub Desktop.
Fixed install msbodeodbc script
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/bin/bash | |
# Microsoft SQL Server ODBC Driver V1.0 for Linux Installer | |
# Copyright Microsoft Corp. | |
# Set to 1 for debugging information/convenience. | |
debug=0 | |
# Strings listed here | |
driver_name="Microsoft ODBC Driver 11 for SQL Server"; | |
driver_version="11.0.2270.0" | |
driver_dm_name="SQL Server Native Client 11.0" | |
driver_short_name="msodbcsql" | |
# Requirements listed here | |
req_os="Linux"; | |
req_proc="x86_64"; | |
req_dm_ver="2.3.2"; | |
dm_name="unixODBC $req_dm_ver"; | |
os_dist_id=`lsb_release -is` | |
req_libs="" | |
if [ $os_dist_id == "Ubuntu" ] || [ $os_dist_id == "Debian" ]; then | |
req_libs=( '~i"^libc6$"' '~i"libkrb5\-[0-9]$"' '~i"^e2fsprogs$"' '~i"^openssl$"' ) | |
else | |
req_libs=( glibc e2fsprogs krb5-libs openssl ) | |
fi | |
#language of the install | |
lang_id="en_US"; | |
# files to be copied by directory | |
driver_file="libmsodbcsql-11.0.so.2270.0" | |
lib_files=( "lib64/$driver_file" ) | |
lib_perms=( 0755 ) | |
bin_files=( "bin/bcp-11.0.2270.0" | |
"bin/sqlcmd-11.0.2270.0" ) | |
bin_sym=( bcp sqlcmd ) | |
bin_perms=( 0755 0755 ) | |
sup_files=( install.sh build_dm.sh README LICENSE WARNING ) | |
sup_perms=( 0755 0755 0644 0644 0644 ) | |
rll_files=( "bin/bcp.rll" | |
"bin/SQLCMD.rll" | |
"bin/BatchParserGrammar.dfa" | |
"bin/BatchParserGrammar.llr" | |
"lib64/msodbcsqlr11.rll" ) | |
rll_perms=( 0644 0644 0644 0644 0644 ) | |
doc_files=( "docs/en_US.tar.gz" ) | |
doc_perms='$(printf "0644 %.0s" {1..'${#doc_files[@]}'})' | |
doc_perms=( $(eval "echo $doc_perms") ) | |
inc_files=( "include/msodbcsql.h" ) | |
inc_perms='$(printf "0644 %.0s" {1..'${#inc_files[@]}'})' | |
inc_perms=( $(eval "echo $inc_perms") ) | |
dirs=( bin_dir lib_dir sup_dir rll_dir doc_dir inc_dir ) | |
sym_dirs=( bin_sym_dir lib_sym_dir sup_sym_dir rll_sym_dir doc_sym_dir inc_sym_dir ) | |
file_sets=( bin_files lib_files sup_files rll_files doc_files inc_files ) | |
link_sets=( bin_sym "null" "null" "null" "null" "null" ) | |
file_perm_sets=( bin_perms lib_perms sup_perms rll_perms doc_perms inc_perms ) | |
link_perm_sets=( bin_perms lib_perms sup_perms rll_perms doc_perms inc_perms ) | |
# "assertions" that the file and sym link arrays are sane | |
if [ ${#lib_files[@]} -ne ${#lib_perms[@]} ]; then | |
echo "Lib files and permission sets don't match" | |
exit 1; | |
fi | |
if [ ${#bin_files[@]} -ne ${#bin_sym[@]} ]; then | |
echo "Bin files and sym links don't match" | |
exit 1; | |
fi | |
if [ ${#bin_files[@]} -ne ${#bin_perms[@]} ]; then | |
echo "Bin files and permission sets don't match" | |
exit 1; | |
fi | |
if [ ${#sup_files[@]} -ne ${#sup_perms[@]} ]; then | |
echo "Supplemental files and permission sets don't match" | |
exit 1; | |
fi | |
if [ ${#rll_files[@]} -ne ${#rll_perms[@]} ]; then | |
echo "RLL files and permission sets don't match" | |
exit 1; | |
fi | |
if [ ${#dirs[@]} -ne ${#file_sets[@]} ]; then | |
echo "Directories and file sets don't match" | |
exit 1; | |
fi | |
if [ ${#file_sets[@]} -ne ${#link_sets[@]} ]; then | |
echo "File and link sets don't match" | |
exit 1; | |
fi | |
if [ ${#file_sets[@]} -ne ${#file_perm_sets[@]} ]; then | |
echo "File and permission sets don't match" | |
exit 1; | |
fi | |
if [ ${#link_sets[@]} -ne ${#link_perm_sets[@]} ]; then | |
echo "Link and permission sets don't match" | |
exit 1; | |
fi | |
if [ ${#doc_files[@]} -ne ${#doc_perms[@]} ]; then | |
echo "Doc files and permission sets don't match" | |
exit 1; | |
fi | |
if [ ${#inc_files[@]} -ne ${#inc_perms[@]} ]; then | |
echo "Include files and permission sets don't match" | |
exit 1; | |
fi | |
# directories to hold the file categories | |
bin_dir=""; | |
lib_dir=""; | |
sup_dir="/opt/microsoft/$driver_short_name/$driver_version"; | |
rll_dir=""; | |
doc_dir=""; | |
inc_dir=""; | |
# Force installation flag (--force parameter) default is not to force | |
force=0 | |
# Accept the license flag (--accept-license) default is that they must accept the license via a prompt | |
license_accepted=0 | |
# Log file in the temp directory | |
tmp=${TMPDIR-/tmp} | |
tmp="$tmp/$driver_short_name.$RANDOM.$RANDOM.$RANDOM" | |
(umask 077 && mkdir $tmp) || { | |
echo "Could not create temporary directory for the log file." 2>&1 | |
exit 1 | |
} | |
log_file=$tmp/install.log | |
# for debugging purposes | |
[ $debug -eq 1 ] && log_file="install.log" | |
[ $debug -eq 1 ] && rm -f install.log | |
echo | |
echo "$driver_name Installation Script" | |
echo "Copyright Microsoft Corp." | |
echo | |
echo "Starting install for $driver_name" | |
echo | |
function print_usage() | |
{ | |
echo "Usage: install.sh [global options] command [command options]" | |
echo | |
echo "Global options:" | |
echo " --help - prints this message" | |
echo "Valid commands are verify and install" | |
echo " install) install the driver (also verifies before installing and registers" | |
echo " with the driver manager)" | |
echo " verify) check to make sure the unixODBC DriverManager configuration is" | |
echo " correct before installing" | |
echo "install command take the following options:" | |
echo " --bin-dir=<directory> - location to create symbolic links for bcp and sqlcmd utilities," | |
echo " defaults to the /usr/bin directory" | |
echo " --lib-dir=<directory> - location to deposit the Microsoft SQL Server ODBC Driver for Linux," | |
echo " defaults to the /opt/microsoft/msodbcsql/lib directory" | |
echo " --force - continues installation even if an error occurs" | |
echo " --accept-license - forgoes showing the EULA and implies agreement with its contents" | |
echo | |
# don't return if we're printing the usage | |
exit 0; | |
} | |
function log() | |
{ | |
local msg=$*; | |
local date=$(date); | |
echo "["$date"]" $msg >> $log_file | |
} | |
# format a message and status for an 80 character terminal | |
function format_status | |
{ | |
local msg=$1 | |
local status=$2 | |
# 2 spaces in between the status and the message | |
local total_len=$(( ${#msg} + ${#status} + 2 )) | |
if [ $total_len -gt 80 ]; then | |
echo "Cannot show a message longer than 80 characters" | |
exit 1 | |
fi | |
local dots="................................................................................" | |
local dot_count=$(( 80 - $total_len )) | |
local full_msg="$msg $(expr substr "$dots" 1 $dot_count) $status" | |
echo $full_msg | |
return 0 | |
} | |
function report_config() | |
{ | |
format_status "Checking for 64 bit Linux compatible OS" "$1" | |
format_status "Checking required libs are installed" "$2" | |
format_status "unixODBC utilities (odbc_config and odbcinst) installed" "$3" | |
format_status "unixODBC Driver Manager version $req_dm_ver installed" "$4" | |
format_status "unixODBC Driver Manager configuration correct" "$5" | |
format_status "$driver_name already installed" "$6" | |
} | |
# verify that the installation is on a 64 bit OS | |
function check_for_Linux_x86_64 () | |
{ | |
log "Verifying on a 64 bit Linux compatible OS" | |
local proc=$(uname -p); | |
if [ $proc != $req_proc ]; then | |
log "This installation of the $driver_name may only be installed" | |
log "on a 64 bit Linux compatible operating system." | |
return 1; | |
fi | |
local os=$(uname -s); | |
if [ $os != $req_os ]; then | |
log "This installation of the $driver_name may only be installed" | |
log "on a 64 bit Linux compatible operating system." | |
return 1; | |
fi | |
return 0; | |
} | |
# verify that the required libs are on the system | |
function check_required_libs | |
{ | |
log "Checking that required libraries are installed" | |
for lib in ${req_libs[@]} | |
do | |
hash rpm &> /dev/null | |
has_rpm=$? | |
hash aptitude &> /dev/null | |
has_aptitude=$? | |
local present="" | |
if [ $has_rpm -eq 0 ]; then | |
present=$(rpm -q -a $lib) >> $log_file 2>&1 | |
elif [ $has_aptitude -eq 0 ]; then | |
present=$(aptitude search $lib ) >> $log_file 2>&1 | |
fi | |
if [ "$present" == "" ]; then | |
log "The $lib library was not found installed in the RPM database." | |
log "See README for which libraries are required for the $driver_name." | |
return 1; | |
fi | |
done | |
return 0; | |
} | |
# verify that the driver manager utilities are runnable so we may | |
# check the configuration and install the driver. | |
function find_odbc_config () | |
{ | |
log "Verifying if unixODBC is present" | |
# see if odbc_config is installed | |
hash odbc_config &> /dev/null | |
if [ $? -eq 1 ]; then | |
log "odbc_config from unixODBC was not found. It is required to properly install the $driver_name"; | |
return 1; | |
fi | |
hash odbcinst &> /dev/null | |
if [ $? -eq 1 ]; then | |
log "odbcinst from unixODBC was not found. It is required to properly install the $driver_name"; | |
return 1; | |
fi | |
return 0; | |
} | |
function is_already_installed() | |
{ | |
log "Checking if $driver_name is already installed in $dm_name" | |
odbcinst -q -d -n "$driver_dm_name" -v >> $log_file | |
if [ $? -eq 0 ]; then | |
log "The $driver_name is already installed." | |
log "Use --force to reinstall the driver again."; | |
return 1; | |
fi | |
return 0; | |
} | |
function verify_dm_version () | |
{ | |
log "Verifying that unixODBC is version $req_dm_ver" | |
# verify version | |
local version=$(odbc_config --version); | |
if [ $? -ne 0 ]; then | |
log "Cannot determine version of installed unixODBC."; | |
return 1; | |
fi | |
local maj_ver_num=`echo $version | cut -d'.' -f1` | |
local min_ver_num=`echo $version | cut -d'.' -f2` | |
local pat_ver_num=`echo $version | cut -d'.' -f3` | |
if [ "$maj_ver_num" -eq "2" ] && [ "$min_ver_num" -ge "3" ] && [ "$pat_ver_num" -ge "0" ]; then | |
log "unixODBC version is >= 2.3.0"; | |
else | |
log "unixODBC version must be" $req_dm_ver ". See README for more information."; | |
return 1; | |
fi | |
return 0; | |
} | |
function verify_dm_config() | |
{ | |
local config=$(odbc_config --cflags) | |
local sizeof_long_int=${config/SIZEOF_LONG_INT\=8/} | |
local legacy_64bit_mode=${config/BUILD_LEGACY_64_BIT_MODE/} | |
# configuration must have this flag set, so it should be deleted from sizeof_long_int | |
if [ "$config" == "$sizeof_long_int" ]; then | |
log "unixODBC must have the configuration SIZEOF_LONG_INT=8." | |
log "This will probably require a rebuild of the unixODBC Driver Manager." | |
log "See README for more information." | |
return 1; | |
fi | |
# configuration shouldn't have this flag set, so it should not be deleted (be the same) | |
if [ "$config" != "$legacy_64bit_mode" ]; then | |
log "unixODBC must not have BUILD_LEGACY_64_BIT_MODE configuration flag set." | |
log "This will probably require a rebuild of the unixODBC Driver Manager." | |
log "See README for more information." | |
return 1; | |
fi | |
return 0; | |
} | |
# verify all configuration prerequisites and print the status of each. | |
# 0 means all checks pass, 1 means one or more items has failed | |
function verify_config | |
{ | |
local proc_os_okay="NOT CHECKED" | |
local libs_installed="NOT CHECKED" | |
local odbc_config="NOT CHECKED" | |
local already_installed="NOT CHECKED" | |
local version_dm_okay="NOT CHECKED" | |
local dm_config_okay="NOT CHECKED" | |
verify_steps=( check_for_Linux_x86_64 check_required_libs find_odbc_config verify_dm_version verify_dm_config is_already_installed ) | |
verify_status_vars=( proc_os_okay libs_installed odbc_config version_dm_okay dm_config_okay already_installed ) | |
verify_success=( 'OK' 'OK' 'OK' 'OK' 'OK*' 'NOT FOUND' ) | |
verify_fail=( 'FAILED' 'NOT FOUND' 'FAILED' 'FAILED' 'FAILED' 'INSTALLED' ) | |
if [ ${#verify_steps[@]} -ne ${#verify_status_vars[@]} ]; then | |
echo "Error in verify script 1" | |
exit 1; | |
fi | |
if [ ${#verify_steps[@]} -ne ${#verify_success[@]} ]; then | |
echo "Error in verify script 2" | |
exit 1; | |
fi | |
if [ ${#verify_steps[@]} -ne ${#verify_fail[@]} ]; then | |
echo "Error in verify script 3" | |
exit 1; | |
fi | |
local i=0 | |
for (( i = 0 ; i < ${#verify_steps[@]} ; i++ )) | |
do | |
local fn=${verify_steps[$i]} | |
local status_var=${verify_status_vars[$i]} | |
eval $status_var="\"${verify_success[$i]}\"" | |
$fn | |
if [ $? -ne 0 ]; then | |
if [ $force -ne 1 ]; then | |
status=1; | |
fi | |
eval $status_var="\"${verify_fail[$i]}\"" | |
break | |
fi | |
done | |
report_config "$proc_os_okay" "$libs_installed" "$odbc_config" "$version_dm_okay" "$dm_config_okay" "$already_installed" | |
return $status | |
} | |
# installation | |
function copy_files | |
{ | |
log "Copying files" | |
local i=0 | |
for (( i = 0 ; i < ${#dirs[@]} ; i++ )) | |
do | |
local dir="${dirs[$i]}" | |
local files="${file_sets[$i]}" | |
local perms="${file_perm_sets[$i]}" | |
# evaluate the contents of the variables and assign them back | |
eval dir=\$$dir | |
eval files=\(\$\{$files\[\@\]\}\) | |
eval perms=\(\$\{$perms\[\@\]\}\) | |
mkdir -p $dir | |
local j=0 | |
for (( j = 0; j < ${#files[@]}; j++ )) | |
do | |
local f=${files[$j]} | |
local p=${perms[$j]} | |
log "Copying $f to $dir" | |
cp $f $dir >> $log_file 2>&1 | |
if [ $? -ne 0 ]; then | |
log "Failed to copy $f to $dir." | |
if [ $force -ne 1 ]; then | |
return 1; | |
fi | |
fi | |
f=${f##*/} | |
log "Setting permissions on $f" | |
chmod $p $dir/$f >> $log_file 2>&1 | |
if [ $? -ne 0 ]; then | |
log "Failed to set the permission of $f to $p." | |
if [ $force -ne 1 ]; then | |
return 1; | |
fi | |
fi | |
done | |
done | |
return 0; | |
} | |
# it tries to remove all the files regardless of the outcome of a removal, | |
# as such it always returns 0 for "success" | |
function remove_files | |
{ | |
log "Removing files" | |
local i=0 | |
for (( i = 0 ; i < ${#dirs[@]} ; i++ )) | |
do | |
local dir="${dirs[$i]}" | |
local files="${file_sets[$i]}" | |
local links="${link_sets[$i]}" | |
# evaluate the contents of the variables and assign them back | |
eval dir=\$$dir | |
eval files=\( \$\{$files\[\@\]\} \) | |
eval links=\( \$\{$links\[\@\]\} \) | |
for l in ${links[@]} | |
do | |
[ "$l" == "null" ] && continue | |
log "Removing $dir/$l" | |
rm -f $dir/$l >> $log_file 2>&1 | |
if [ $? -ne 0 ]; then | |
log "Non fatal error: Failed to remove $l to $dir." | |
fi | |
done | |
for f in ${files[@]} | |
do | |
log "Removing $dir/$f" | |
rm -f $dir/$f >> $log_file 2>&1 | |
if [ $? -ne 0 ]; then | |
log "Non fatal error: Failed to remove $f to $dir." | |
fi | |
done | |
done | |
return 0; | |
} | |
function register_driver | |
{ | |
log "Registering the $driver_name driver" | |
# write INI file for driver installation in the temp directory | |
local template_ini="$tmp/$driver_short_name.ini" | |
# for debugging purposes | |
[ $debug -eq 1 ] && template_ini="$driver_short_name.ini" | |
echo "[$driver_dm_name]" > $template_ini | |
echo "Description = $driver_name" >> $template_ini | |
echo "Driver = $lib_dir/$driver_file" >> $template_ini | |
echo "Threading = 1" >> $template_ini | |
echo "" >> $template_ini | |
if [ $? -ne 0 ]; then | |
log "Failed to create ini file $template_ini used to install the driver" | |
return 1; | |
fi | |
# install the driver using odbcinst | |
odbcinst -i -d -f "$template_ini" 2>&1 >> $log_file | |
if [ $? -ne 0 ]; then | |
log "Failed installing driver $driver_name with $dm_name" | |
return 1; | |
fi | |
# copy the template ini file to the supplemental directory | |
cp $template_ini $sup_dir 2>> $log_file | |
if [ $? -ne 0 ]; then | |
log "Warning: $template_ini could not be copied to $sup_dir" | |
fi | |
return 0; | |
} | |
function extract_docs | |
{ | |
local doc_file="$doc_dir/$lang_id.tar.gz" | |
log "Extracting documentation from $doc_file" | |
local cwd=$(pwd) | |
cd $doc_dir | |
if [ $? -ne 0 ]; then | |
log "Couldn't enter the directory $doc_dir to extract documentation." | |
return 1 | |
fi | |
tar xvzf $doc_file 2>&1 >> $log_file | |
if [ $? -ne 0 ]; then | |
log "Couldn't extract documentation from $doc_file" | |
return 1 | |
fi | |
rm $doc_file 2>&1 >> $log_file | |
if [ $? -ne 0 ]; then | |
log "Couldn't erase documentation archive after extraction" | |
return 1 | |
fi | |
return 0; | |
} | |
function create_symlinks | |
{ | |
log "Creating symbolic links" | |
local i=0 | |
local j=0 | |
for (( i = 0 ; i < ${#dirs[@]} ; i++ )) | |
do | |
local dir="${dirs[$i]}" | |
local sym_dir="${sym_dirs[i]}" | |
local files="${file_sets[$i]}" | |
local links="${link_sets[$i]}" | |
[ "$links" == "null" ] && continue | |
# evaluate the contents of the variables and assign them back | |
eval dir=\$$dir | |
eval sym_dir=\$$sym_dir | |
eval files=\( \$\{$files\[\@\]\} \) | |
eval links=\( \$\{$links\[\@\]\} \) | |
# assertion that the links and files are the same length | |
if [ ${#files[@]} -ne ${#links[@]} ]; then | |
log "Fatal: file and link lists do not match." | |
exit 1; | |
fi | |
# if there is no symbolic link dir, then there are no symlinks | |
[ "$sym_dir" == "" ] && continue | |
local j=0 | |
for (( j = 0 ; j < ${#files[@]} ; j++ )) | |
do | |
local f="${files[$j]##*/}" | |
local l="${links[$j]}" | |
#if the "link" is null, then skip it | |
[ "$l" == "null" ] && continue | |
if [ $force -ne 0 ]; then | |
log "Removing previous link due to force flag" | |
rm $sym_dir/$l >> $log_file 2>&1 | |
fi | |
log "Linking $l to $f" | |
ln -s $dir/$f $sym_dir/$l >> $log_file 2>&1 | |
if [ $? -ne 0 ]; then | |
log "Failed to link $l to $f." | |
if [ $force -ne 1 ]; then | |
return 1; | |
fi | |
fi | |
done | |
done | |
#If Ubuntu 12.04 LTS we know exactly which symlinks we need | |
hash aptitude &> /dev/null | |
local has_aptitude=$? | |
local os_id=`lsb_release -si`; | |
local os_release=`lsb_release -sr`; | |
if [ $has_aptitude -eq 0 ] && [ "$os_id" == "Ubuntu" ]; then | |
if [ $force -eq 1 ]; then | |
if [ -h /usr/lib/x86_64-linux-gnu/libcrypto.so.10 ]; then | |
rm /usr/lib/x86_64-linux-gnu/libcrypto.so.10; | |
fi | |
if [ -h /usr/lib/x86_64-linux-gnu/libssl.so.10 ]; then | |
rm /usr/lib/x86_64-linux-gnu/libssl.so.10; | |
fi | |
if [ -h /usr/lib/x86_64-linux-gnu/libodbcinst.so.1 ]; then | |
rm /usr/lib/x86_64-linux-gnu/libodbcinst.so.1; | |
fi | |
if [ -h /usr/lib/x86_64-linux-gnu/libodbc.so.1 ]; then | |
rm /usr/lib/x86_64-linux-gnu/libodbc.so.1; | |
fi | |
fi | |
ln -s /lib/x86_64-linux-gnu/libcrypto.so.1.0.0 /usr/lib/x86_64-linux-gnu/libcrypto.so.10 >> $log_file 2>&1; | |
ln -s /lib/x86_64-linux-gnu/libssl.so.1.0.0 /usr/lib/x86_64-linux-gnu/libssl.so.10 >> $log_file 2>&1; | |
if [ -f /usr/lib/x86_64-linux-gnu/libodbcinst.so.2.0.0 ]; then | |
ln -s /usr/lib/x86_64-linux-gnu/libodbcinst.so.2.0.0 /usr/lib/x86_64-linux-gnu/libodbcinst.so.1 >> $log_file 2>&1; | |
else | |
log "proper libodbcinst.so not found. You will need to create the symlink manually" | |
fi | |
if [ -f /usr/lib/x86_64-linux-gnu/libodbc.so.2.0.0 ]; then | |
ln -s /usr/lib/x86_64-linux-gnu/libodbc.so.2.0.0 /usr/lib/x86_64-linux-gnu/libodbc.so.1 >> $log_file 2>&1; | |
else | |
log "proper libodbc.so not found. You will need to create the symlink manually" | |
fi | |
elif [ $has_aptitude -eq 0 ] && [ "$os_id" != "Ubuntu" ]; then | |
log "You need to create some symlinks manually. Use the following command to find out more:" | |
log "ldd /opt/microsoft/msodbcsql/lib64/libmsodbcsql-11.0.so.2270.0" | |
fi | |
return 0; | |
} | |
function report_install() | |
{ | |
format_status "$driver_name files copied" "$1" | |
format_status "Symbolic links for bcp and sqlcmd created" "$2" | |
format_status "$driver_name registered" "$3" | |
} | |
function process_params | |
{ | |
# process parameters | |
while [ "$1" ] | |
do | |
case "$1" in | |
--force) | |
force=1 | |
;; | |
--bin-dir=*) | |
bin_sym_dir=${1##--bin-dir=} | |
bin_sym_dir=${bin_sym_dir/#"~"/$HOME} | |
log "Symbolic links to binaries created in $bin_sym_dir" | |
;; | |
--lib-dir=*) | |
lib_dir=${1##--lib-dir=} | |
lib_dir=${lib_dir/#"~"/$HOME} | |
log "Driver directory set to $lib_dir" | |
;; | |
--accept-license) | |
license_accepted=1 | |
log "License agreement accepted" | |
;; | |
*) | |
echo "Unknown parameter $1" | |
print_usage | |
exit 1 | |
;; | |
esac | |
shift | |
done | |
return 0 | |
} | |
function accept_license | |
{ | |
log "Accept the license agreement" | |
if [ ! -f "./LICENSE" ]; then | |
log "LICENSE file not found." | |
echo "Cannot display license agreement. Please refer to the original archive for the" | |
echo "LICENSE file and re-run the install with the --accept-license parameter." | |
exit 1 | |
fi | |
hash more &> /dev/null | |
if [ $? -ne 0 ]; then | |
log "more program not found. Cannot display license agreement without more." | |
echo "Cannot display license agreement. Please read the license agreement in LICENSE and" | |
echo "re-run the install with the --accept-license parameter." | |
exit 1 | |
fi | |
more ./LICENSE | |
echo | |
read -p "Enter YES to accept the license or anything else to terminate the installation: " accept | |
echo | |
if [ "$accept" == "YES" ]; then | |
log "License agreement accepted" | |
license_accepted=1 | |
return 0 | |
fi | |
log "License agreement not accepted" | |
return 1 | |
} | |
function install() | |
{ | |
# return value | |
local status=0 | |
process_params $* | |
if [ $license_accepted -ne 1 ]; then | |
accept_license | |
fi | |
# technically accept_license should not return if the license isn't accepted, | |
# but this is a catch for it | |
if [ $? -ne 0 ] || [ $license_accepted -ne 1 ]; then | |
return 1 | |
fi | |
verify_config | |
local verified=$? | |
local files_copied="NOT ATTEMPTED" | |
local docs_extracted="NOT ATTEMPTED" | |
local driver_registered="NOT ATTEMPTED" | |
local symlinks_created="NOT ATTEMPTED" | |
# if verification passed or force was specified, then call the functions to install | |
# and register the driver | |
if [ $verified -eq 0 ] || [ $force -eq 1 ]; then | |
if [ "$lib_dir" == "" ]; then | |
lib_dir="/opt/microsoft/$driver_short_name/lib64" | |
fi | |
bin_dir="/opt/microsoft/$driver_short_name/bin" | |
if [ "$bin_sym_dir" == "" ]; then | |
bin_sym_dir="/usr/bin"; | |
fi | |
sup_dir="/opt/microsoft/$driver_short_name/$driver_version" | |
mkdir -p $sup_dir | |
if [ -d $sup_dir ]; then | |
log "$sup_dir exists" | |
else | |
log "Could not create $sup_dir" | |
return 1 | |
fi | |
rll_dir="$sup_dir/$lang_id" | |
mkdir -p $rll_dir | |
if [ -d $rll_dir ]; then | |
log "$rll_dir exists" | |
else | |
log "Could not create $rll_dir" | |
return 1 | |
fi | |
doc_dir="$sup_dir/docs/$lang_id" | |
mkdir -p $doc_dir | |
if [ -d $doc_dir ]; then | |
log "$doc_dir exists" | |
else | |
log "Could not create $doc_dir" | |
return 1 | |
fi | |
inc_dir="$sup_dir/include" | |
mkdir -p $inc_dir | |
if [ -d $inc_dir ]; then | |
log "$inc_dir exists" | |
else | |
log "Could not create $inc_dir" | |
return 1 | |
fi | |
local install_steps=( copy_files extract_docs create_symlinks register_driver ) | |
local install_status_vars=( files_copied docs_extracted symlinks_created driver_registered ) | |
local install_success=( 'OK' 'OK' 'OK' 'INSTALLED' ) | |
local install_fail=( 'FAILED' 'FAILED' 'FAILED' 'FAILED' ) | |
# "assertions" that the variables are sane | |
if [ ${#install_steps[@]} -ne ${#install_status_vars[@]} ]; then | |
echo "Error in install script 1" | |
exit 1; | |
fi | |
if [ ${#install_steps[@]} -ne ${#install_success[@]} ]; then | |
echo "Error in install script 2" | |
exit 1; | |
fi | |
if [ ${#install_steps[@]} -ne ${#install_fail[@]} ]; then | |
echo "Error in install script 3" | |
exit 1; | |
fi | |
local i=0 | |
for (( i = 0 ; i < ${#install_steps[@]} ; i++ )) | |
do | |
local fn=${install_steps[$i]} | |
local status_var=${install_status_vars[$i]} | |
eval $status_var="\"${install_success[$i]}\"" | |
$fn | |
if [ $? -ne 0 ]; then | |
status=1 | |
eval $status_var="\"${install_fail[$i]}\"" | |
if [ $force -ne 1 ]; then | |
uninstall | |
break | |
fi | |
fi | |
done | |
fi | |
report_install "$files_copied" "$symlinks_created" "$driver_registered" | |
return $status | |
} | |
function uninstall | |
{ | |
process_params $* | |
return 0; | |
} | |
command=$1 | |
shift | |
case "$command" in | |
install) | |
install $* | |
;; | |
verify) | |
verify_config $* | |
;; | |
--help) | |
print_usage | |
;; | |
*) | |
echo "Unknown command given." | |
print_usage | |
;; | |
esac | |
# if any problems, print out a final diagnostic about where to find failure reasons | |
# and exit with status of 1 | |
if [ $? -ne 0 ]; then | |
echo | |
echo "See $log_file for more information about installation failures." | |
exit 1 | |
fi | |
echo | |
echo "Install log created at $log_file." | |
echo | |
echo "One or more steps may have an *. See README for more information regarding" | |
echo "these steps." | |
# return success | |
exit 0 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment