Files
linguist/test/fixtures/Shell/mintleaf.module
2014-09-17 08:37:00 -05:00

1506 lines
31 KiB
Bash

#!/bin/bash
################################################################################
## base routines
##
function list_modules() {
# define help
local help=$(cat <<HEREDOC
DESCRIPTION: Show all modules.
PARAMETERS:
-e|--enabled show enabled modules only
-d|--disabled show disabled modules only
HEREDOC
)
# check parameters
if [ "$1" == "--help" ]; then
echo -e "${help}\n"
return
fi
# get additional parameters
local option=
while [ "$1" != "" ]; do
case $1 in
-e|--enabled) option="-e"
;;
-d|--disabled) option="-d"
;;
esac
shift
done
_list_modules $option
}
function print_module_info() {
# define help
local help=$(cat <<HEREDOC
DESCRIPTION: Show module description.
PARAMETERS:
\$1 module name
HEREDOC
)
# check parameters
if [ "$1" == "--help" ]; then
echo -e "${help}\n"
return
fi
# get parameters
local module=${1-mintleaf}
if [ $(list_modules | grep $module | wc -l) -eq 1 ]; then
if [ -f $MINTLEAF_HOME/modules/$module/$module.md ]; then
printf "\n"
cat $MINTLEAF_HOME/modules/$module/$module.md 2> /dev/null
printf "\n"
fi
else
echo "Module does not exist"
fi
}
function list_functions() {
# define help
local help=$(cat <<HEREDOC
DESCRIPTION: Show all available functions for given module.
PARAMETERS:
\$1 module name
HEREDOC
)
# check parameters
if [ "$1" == "--help" ]; then
echo -e "${help}\n"
return
fi
_list_functions $1
}
function create_module() {
# define help
local help=$(cat <<HEREDOC
DESCRIPTION: Create module along with its essential files.
PARAMETERS:
\$1 module name
HEREDOC
)
# check parameters
if [ "$1" == "--help" ] || [ $# -ne 1 ]; then
echo -e "${help}\n"
return
fi
# get parameters
local module=$1
mkdir $MINTLEAF_HOME/modules/$module
[ ! -f $MINTLEAF_HOME/modules/$module/$module.md ] && cat << EOF >> $MINTLEAF_HOME/modules/$module/$module.md
$module
=======
TODO
EOF
[ ! -f $MINTLEAF_HOME/modules/$module/$module.config ] && cat << EOF >> $MINTLEAF_HOME/modules/$module/$module.config
EOF
[ ! -f $MINTLEAF_HOME/modules/$module/$module.install ] && cat << EOF >> $MINTLEAF_HOME/modules/$module/$module.install
#!/bin/bash
function install_module() {
echo "TODO"
}
EOF
[ ! -f $MINTLEAF_HOME/modules/$module/$module.module ] && cat << EOF >> $MINTLEAF_HOME/modules/$module/$module.module
#!/bin/bash
EOF
[ ! -f $MINTLEAF_HOME/modules/$module/$module.test ] && cat << EOF >> $MINTLEAF_HOME/modules/$module/$module.test
#!/bin/bash
function test_prerequisites() {
echo "TODO"
}
function test_module() {
assert_prerequisites
echo "TODO"
}
EOF
[ ! -f $MINTLEAF_HOME/modules/$module/$module.groovy ] && cat << EOF >> $MINTLEAF_HOME/modules/$module/$module.groovy
EOF
}
################################################################################
## general routines
##
function func_exists() {
# define help
local help=$(cat <<HEREDOC
DESCRIPTION: Check if function exists.
PARAMETERS:
\$1 function name
HEREDOC
)
# check parameters
if [ "$1" == "--help" ] || [ $# -ne 1 ]; then
echo -e "${help}\n"
return
fi
# get parameters
local func=$1
declare -f -F $func > /dev/null
if [ "$?" == "0" ]; then
echo $result_pos
else
echo $result_neg
fi
}
function usleep() {
# define help
local help=$(cat <<HEREDOC
DESCRIPTION: Sleep in increments of milliseconds.
PARAMETERS:
\$1 milliseconds
HEREDOC
)
# check parameters
if [ "$1" == "--help" ] || [ $# -ne 1 ]; then
echo -e "${help}\n"
return
fi
# get parameters
local ms=$1
local sec=$(echo "scale=2; $ms / 1000" | bc)
perl -e "select(undef,undef,undef,$sec)"
}
function h2d() {
# define help
local help=$(cat <<HEREDOC
DESCRIPTION: Convert hexadecimal to decimal number.
PARAMETERS:
\$1 hexadecimal number
HEREDOC
)
# check parameters
if [ "$1" == "--help" ] || [ $# -ne 1 ]; then
echo -e "${help}\n"
return
fi
# get parameters
local hex=$1
hex=$(upper $hex)
local dec=$(echo "ibase=16; $hex" | bc)
echo $dec
}
function d2h() {
# define help
local help=$(cat <<HEREDOC
DESCRIPTION: Convert decimal to hexadecimal number.
PARAMETERS:
\$1 decimal number
HEREDOC
)
# check parameters
if [ "$1" == "--help" ] || [ $# -ne 1 ]; then
echo -e "${help}\n"
return
fi
# get parameters
local dec=$1
local hex=$(echo "ibase=10; obase=16; $dec" | bc)
hex=$(lower $hex)
echo $hex
}
function random() {
# define help
local help=$(cat <<HEREDOC
DESCRIPTION: Return random string (A-Za-z0-9) with the given length.
PARAMETERS:
\$1 length
HEREDOC
)
# check parameters
if [ "$1" == "--help" ] || [ $# -ne 1 ]; then
echo -e "${help}\n"
return
fi
# get parameters
local len=$1
local str=
str=</dev/urandom tr -dc A-Za-z0-9 | (head -c $ > /dev/null 2>&1 || head -c $len)
echo $str
}
function trim() {
# define help
local help=$(cat <<HEREDOC
DESCRIPTION: Remove whitespaces from the beginning and the end of a string.
PARAMETERS:
\$1 string
HEREDOC
)
# check parameters
if [ "$1" == "--help" ] || [ $# -ne 1 ]; then
echo -e "${help}\n"
return
fi
# get parameters
local str="$1"
str=$(sed -e 's/^[[:space:]]*//' <<<"$str")
str=$(sed -e 's/[[:space:]]*$//' <<<"$str")
echo "$str"
}
function lower() {
# define help
local help=$(cat <<HEREDOC
DESCRIPTION: Convert string to lower case.
PARAMETERS:
\$1 string
HEREDOC
)
# check parameters
if [ "$1" == "--help" ] || [ $# -ne 1 ]; then
echo -e "${help}\n"
return
fi
# get parameters
local str="$1"
str=$(echo $str | tr '[:upper:]' '[:lower:]')
echo "$str"
}
function upper() {
# define help
local help=$(cat <<HEREDOC
DESCRIPTION: Convert string to upper case.
PARAMETERS:
\$1 string
HEREDOC
)
# check parameters
if [ "$1" == "--help" ] || [ $# -ne 1 ]; then
echo -e "${help}\n"
return
fi
# get parameters
local str="$1"
str=$(echo $str | tr '[:lower:]' '[:upper:]')
echo "$str"
}
function str_sanitise() {
# define help
local help=$(cat <<HEREDOC
DESCRIPTION: Sanitise string to meet certain criteria.
PARAMETERS:
\$1 string
\$2 character to be used as a replacement
--allowed-characters <characters>
--max-length <length>
HEREDOC
)
# check parameters
if [ "$1" == "--help" ] || [ $# -lt 1 ]; then
echo -e "${help}\n"
return
fi
# get parameters
local str=$1
local char=$2
# get optional parameters
local allowed_characters=
local max_length=255
if [ "$3" != "" ] && [ "$3" != "--allowed-characters" ]; then
len=$3
fi
while [ "$1" != "" ]; do
case $1 in
--allowed-characters) shift; allowed_characters=$1
;;
--max-length) shift; max_length=$1
;;
esac
shift
done
# remove unwanted characters
local sanitised=$(echo $str | sed "s/[^A-Za-z0-9$allowed_characters]/$char/g")
# remove multiple instances of the replacement character
sanitised=$(echo $sanitised | sed -r "s/($char)+/$char/g")
# limit the length
sanitised=$(echo $sanitised | cut -c1-${max_length})
# make it lower case
echo $sanitised | tr '[:upper:]' '[:lower:]'
}
function str_substring() {
# define help
local help=$(cat <<HEREDOC
DESCRIPTION: Return substring by removing its prefix and suffix.
PARAMETERS:
\$1 string
\$2 prefix
\$3 suffix
HEREDOC
)
# check parameters
if [ "$1" == "--help" ] || [ $# -lt 3 ]; then
echo -e "${help}\n"
return
fi
# get parameters
local str=$1
local pre=$2
local suf=$3
local str="${str#${str%${pre}*}${pre}}"
echo "${str%${suf}*}"
}
function str_contains() {
# define help
local help=$(cat <<HEREDOC
DESCRIPTION: Check if string contains another string.
PARAMETERS:
\$1 string
\$2 search string
HEREDOC
)
# check parameters
if [ "$1" == "--help" ] || [ $# -ne 2 ]; then
echo -e "${help}\n"
return
fi
# get parameters
local str=$1
local search=$2
local count=$(echo "$str" | grep "$search" | wc -l)
if [ $count -gt 0 ]; then
echo $result_pos
else
echo $result_neg
fi
}
function str_begins() {
# define help
local help=$(cat <<HEREDOC
DESCRIPTION: Check if string begins with another string.
PARAMETERS:
\$1 string
\$2 search string
HEREDOC
)
# check parameters
if [ "$1" == "--help" ] || [ $# -ne 2 ]; then
echo -e "${help}\n"
return
fi
# get parameters
local str=$1
local search=$2
local count=$(echo "$str" | grep "^$search" | wc -l)
if [ $count -eq 1 ]; then
echo $result_pos
else
echo $result_neg
fi
}
function str_ends() {
# define help
local help=$(cat <<HEREDOC
DESCRIPTION: Check if string ends with another string.
PARAMETERS:
\$1 string
\$2 search string
HEREDOC
)
# check parameters
if [ "$1" == "--help" ] || [ $# -ne 2 ]; then
echo -e "${help}\n"
return
fi
# get parameters
local str=$1
local search=$2
local count=$(echo "$str" | grep "$search$" | wc -l)
if [ $count -eq 1 ]; then
echo $result_pos
else
echo $result_neg
fi
}
function str_split_part() {
# define help
local help=$(cat <<HEREDOC
DESCRIPTION: Split string and return part given by the third argument.
PARAMETERS:
\$1 string
\$2 separator
\$3 part (index starts from 1)
HEREDOC
)
# check parameters
if [ "$1" == "--help" ] || [ $# -ne 3 ]; then
echo -e "${help}\n"
return
fi
# get parameters
local str=$1
local separator=$2
local part=$3
echo $(echo $str | awk '{ split($str,a,v1); print a[v2]; }' v1=$separator v2=$part)
}
function str_compare_ver() {
# define help
local help=$(cat <<HEREDOC
DESCRIPTION: Compare two version strings.
PARAMETERS:
\$1 version
\$2 version
RETURN: -1, 0 or 1 as the first argument is less than, equal to or greater than the second.
HEREDOC
)
if [[ $1 == $2 ]]; then
echo 0
return
fi
local ver1a=$(echo $1 | grep -oEi '[0-9\.]*' | head -1)
local ver1b=$(str_substring $1 $ver1a "")
local ver2a=$(echo $2 | grep -oEi '[0-9\.]*' | head -1)
local ver2b=$(str_substring $2 $ver2a "")
local IFS=.
local i ver1=($ver1a) ver2=($ver2a)
# test the 1st part
for ((i=${#ver1[@]}; i<${#ver2[@]}; i++)); do
ver1[i]=0
done
for ((i=0; i<${#ver1[@]}; i++)); do
if [[ -z ${ver2[i]} ]]; then
ver2[i]=0
fi
if ((10#${ver1[i]} > 10#${ver2[i]})); then
echo 1
return
fi
if ((10#${ver1[i]} < 10#${ver2[i]})); then
echo -1
return
fi
done
# test the 2nd part
if [ "$ver1b" \< "$ver2b" ]; then
echo -1
return
elif [ "$ver1b" \> "$ver2b" ]; then
echo 1
return
fi
echo 0
}
################################################################################
## file routines
##
function file_escape_name() {
# define help
local help=$(cat <<HEREDOC
DESCRIPTION: Escape file name using the same way bash does it.
PARAMETERS:
\$1 string
HEREDOC
)
# check parameters
if [ "$1" == "--help" ] || [ $# -lt 1 ]; then
echo -e "${help}\n"
return
fi
# get parameters
local str=$1
echo $(printf '%q' "$str" | sed s/=/\\\\=/g)
}
function file_contains() {
# define help
local help=$(cat <<HEREDOC
DESCRIPTION: Check if file contains given string.
PARAMETERS:
\$1 string to search for (regular expression matching multiple lines)
\$2 file name
HEREDOC
)
# check parameters
if [ "$1" == "--help" ] || [ $# -ne 2 ]; then
echo -e "${help}\n"
return
fi
# get parameters
local str=$1
local file=$2
local count=$(cat $file | pcregrep -M "$str" | wc -l)
if [ $count -gt 0 ]; then
echo $result_pos
else
echo $result_neg
fi
}
function file_replace_str() {
# define help
local help=$(cat <<HEREDOC
DESCRIPTION: Replace string in given file.
PARAMETERS:
\$1 string to search for
\$2 new string
\$3 file name
-m|--multiline
HEREDOC
)
# check parameters
if [ "$1" == "--help" ] || [ $# -lt 3 ]; then
echo -e "${help}\n"
return
fi
# get parameters
local str1=$1
local str2=$2
local file=$3
# get optional parameters
local multiline="n"
while [ "$1" != "" ]; do
case $1 in
-m|--multiline) shift; multiline="y"
;;
esac
shift
done
local tmp_file=~/file_replace_str.$$
if [ $multiline == "y" ]; then
cat $file | perl -0777 -pe "s/$str1/$str2/igs" > $tmp_file
else
sed "s/$str1/$str2/g" $file > $tmp_file
fi
mv $tmp_file $file
}
function file_remove_str() {
# define help
local help=$(cat <<HEREDOC
DESCRIPTION: Remove string from given file.
PARAMETERS:
\$1 string to remove
\$2 file name
-m|--multiline
HEREDOC
)
# check parameters
if [ "$1" == "--help" ] || [ $# -lt 2 ]; then
echo -e "${help}\n"
return
fi
# get parameters
local str=$1
local file=$2
# get optional parameters
local multiline="n"
if [ "$3" == "-m" ] || [ "$3" == "--multiline" ]; then
multiline="y"
fi
local tmp_file=~/file_remove_str.$$
if [ $multiline == "y" ]; then
cat $file | perl -0777 -pe "s/$str//igs" > $tmp_file
else
str='1h;1!H;${;g;s/'
sed -n "$str$1//g;p;}" $file > $tmp_file
fi
mv $tmp_file $file
}
function file_download() {
# define help
local help=$(cat <<HEREDOC
DESCRIPTION: Download file from given URL address.
PARAMETERS:
--url <url> URL address of file to download (required).
--file <name> Name of output file.
--cache-dir <dir> Cache directory; file name in that directory
must match the file name given as the parameter.
--donwload-directory <directory> Destination directory where file
should be placed after download.
--size <size> Check file size after download.
--hash <hash> Check file hash after download.
--hash-algorithm <algorithm> Hash algorithm used to check file.
--do-not-cache Do not cache file locally.
--force Force to download from given URL address not
using cached file or an alternative location.
HEREDOC
)
# check parameters
if [ "$1" == "--help" ] || [ $# -lt 4 ]; then
echo -e "${help}\n"
return
fi
# variables
local url=
local file=
local cache_dir=$mintleaf_tmp_dir
local download_dir=./
local expected_size=0
local expected_hash=
local hash_algorithm="md5"
local do_not_cache=$result_neg
local force=$result_neg
local current_dir=$(pwd)
# get parameters
while [ "$1" != "" ]; do
case $1 in
--url) shift; url=$1
;;
--file) shift; file=$1
;;
--cache-dir) shift; cache_dir=$1
;;
--download-directory) shift; download_dir=$1
;;
--size) shift; expected_size=$1
;;
--hash) shift; expected_hash=$1
;;
--hash-algorithm) shift; hash_algorithm=$1
;;
--do-not-cache) do_not_cache=$result_pos
;;
--force) force=$result_pos
;;
esac
shift
done
# file may have already been downloaded
if [ $force == $result_neg ] && [ -s $cache_dir/$file ] && [ ! -s $download_dir/$file ]; then
cp -f $cache_dir/$file $download_dir
else
# download from local network
# TODO
# download from custom location
# TODO
# download from given url address
if ([ -n $url ] && ([ ! -s $cache_dir/$file ] || [ $force == $result_pos ])); then
# try to download
wget --tries=1 --connect-timeout=10 $url -O $file
# cache file
if [ -s $file ]; then
mv -f $file $cache_dir
fi
fi
# copy file to the download directory
if [ -s $cache_dir/$file ] && [ $cache_dir != $download_dir ]; then
cp -f $cache_dir/$file $download_dir
fi
# do not cache
if [ $do_not_cache == $result_pos ]; then
rm -f $cache_dir/$file
fi
fi
# check file size
if [ $expected_size -ne 0 ] && [ -s $download_dir/$file ]; then
local size=$(ls -l $download_dir/$file | awk '{ print $5 }')
if [ $expected_size -gt $size ]; then
rm -f $download_dir/$file
fi
fi
# return value
if [ -s $download_dir/$file ]; then
# check file hash
if [ -n "$expected_hash" ]; then
file_valid_hash $download_dir/$file $expected_hash $hash_algorithm
else
echo $result_pos
fi
else
echo $result_neg
fi
cd $current_dir
}
function file_valid_hash() {
# define help
local help=$(cat <<HEREDOC
DESCRIPTION: Validate hash sum of given file.
PARAMETERS:
\$1 file name
\$2 hash sum
\$3 algorithm (optional) md5,sha1,sha256,sha384,sha512 (default md5)
HEREDOC
)
# check parameters
if [ "$1" == "--help" ] || [ $# -lt 2 ]; then
echo -e "${help}\n"
return
fi
# get parameters
local file=$1
local hash=$2
local algorithm=$3
[ -z "$algorithm" ] && algorithm="md5"
local current_hash=$(${algorithm}sum $file | awk '{ print $1 }')
if [ "$(lower $hash)" == "$(lower $current_hash)" ]; then
echo $result_pos
else
echo $result_neg
fi
}
function dir_find_str() {
# define help
local help=$(cat <<HEREDOC
DESCRIPTION: Search directory for files that contain given string.
PARAMETERS:
\$1 string to search for
\$2 directory (optional)
HEREDOC
)
# check parameters
if [ "$1" == "--help" ] || [ $# -lt 1 ]; then
echo -e "${help}\n"
return
fi
# get parameters
local str=$1
local dir=$2
if [ "$dir" == "" ]; then
find . -iname "*" | xargs grep -iR "$str" | \
sort | uniq
else
find $dir -iname "*" | xargs grep -iR "$str" | \
sort | uniq
fi
}
function dir_replace_str() {
# define help
local help=$(cat <<HEREDOC
DESCRIPTION: Replace string in files in the given directory.
PARAMETERS:
\$1 string
\$2 new string
\$3 directory (optional)
HEREDOC
)
# check parameters
if [ "$1" == "--help" ] || [ $# -lt 2 ]; then
echo -e "${help}\n"
return
fi
# get parameters
local str1=$1
local str2=$2
local dir=$3
[ "$dir" == "" ] && dir=.
for file in $(find $dir -type f -name "*"); do
file_replace_str "$str1" "$str2" $file
done
}
function dir_remove_str() {
# define help
local help=$(cat <<HEREDOC
DESCRIPTION: Remove string in files in the given directory.
PARAMETERS:
\$1 string
\$2 directory (optional)
HEREDOC
)
# check parameters
if [ "$1" == "--help" ] || [ $# -lt 1 ]; then
echo -e "${help}\n"
return
fi
# get parameters
local str=$1
local dir=$2
[ "$dir" == "" ] && dir=.
for file in $(find $dir -type f -name "*"); do
file_remove_str $str $file
done
}
################################################################################
## chroot routines
##
function chroot_dependency_list() {
# define help
local help=$(cat <<HEREDOC
DESCRIPTION: List dependencies of an executable file.
PARAMETERS:
\$1 executable file
HEREDOC
)
# check parameters
if [ "$1" == "--help" ] || [ $# -ne 1 ]; then
echo -e "${help}\n"
return
fi
# get parameters
local bin=$1
(
local output=$(ldd $bin)
for line in $output; do
echo $line
done
) 2> /dev/null | grep "^/" | sort | uniq
}
function chroot_dependency_list_all() {
# define help
local help=$(cat <<HEREDOC
DESCRIPTION: List dependencies of an executable file recursively.
PARAMETERS:
\$1 executable file
--cur-depth <level> current depth of recursion (1 by default)
--max-depth <level> maximum depth of recursion (3 by default)
HEREDOC
)
# check parameters
if [ "$1" == "--help" ] || [ $# -lt 1 ]; then
echo -e "${help}\n"
return
fi
# get parameters
local bin=$1
# get optional parameters
local cur_depth=1
local max_depth=3
while [ "$1" != "" ]; do
case $1 in
--cur-depth) shift; cur_depth=$1
;;
--max-depth) shift; max_depth=$1
;;
esac
shift
done
(
local output=$(chroot_dependency_list $bin)
for file in $output; do
echo "$file"
if [ $cur_depth -lt $max_depth ]; then
chroot_dependency_list_all $file --cur-depth $(expr $cur_depth + 1) --max-depth $max_depth
fi
done
) 2> /dev/null | grep "^/" | sort | uniq
}
function chroot_dependency_copy() {
# define help
local help=$(cat <<HEREDOC
DESCRIPTION: Copy dependencies of an executable file recursively to chroot directory.
PARAMETERS:
\$1 executable file
\$2 chroot directory
HEREDOC
)
# check parameters
if [ "$1" == "--help" ] || [ $# -ne 2 ]; then
echo -e "${help}\n"
return
fi
# get parameters
local bin=$1
local dir=$2
local output=$(chroot_dependency_list_all $bin)
for file in $output; do
echo "$file"
mkdir -p $dir/$(dirname $file)
cp $file $dir/$(dirname $file)
done
}
function chroot_mount_dir() {
# define help
local help=$(cat <<HEREDOC
DESCRIPTION: Mount directory in chroot environment.
PARAMETERS:
\$1 directory to mount
\$2 directory within chroot directory environment
--read-only
HEREDOC
)
# check parameters
if [ "$1" == "--help" ] || [ $# -lt 2 ]; then
echo -e "${help}\n"
return
fi
# get parameters
local dir=$1
local chdir=$2
local read_only="n"
while [ "$1" != "" ]; do
case $1 in
--read-only) read_only="y"
;;
esac
shift
done
if [ -d $dir ]; then
if [ "$(mount -l | grep $chdir | wc -l)" -gt 0 ]; then
umount $chdir
fi
mkdir -p $chdir
mount --bind $dir $chdir
if [ $read_only == "y" ]; then
mount -o remount,ro $chdir 2> /dev/null
fi
fi
}
function chroot_create_env() {
# define help
local help=$(cat <<HEREDOC
DESCRIPTION: Create chroot environment.
PARAMETERS:
\$1 chroot directory
--user <user> user name to mount their home directory
--home-read-only whether user home directory should be mounted as read-only
HEREDOC
)
# check parameters
if [ "$1" == "--help" ] || [ $# -lt 1 ]; then
echo -e "${help}\n"
return
fi
# get parameters
local dir=$1
# get additional parameters
local user=
local home_read_only=
while [ "$1" != "" ]; do
case $1 in
--user) shift; user=$1
;;
--home-read-only) home_read_only="--read-only"
;;
esac
shift
done
[ ! -d $dir ] && mkdir $dir
mkdir -p $dir/{bin,dev/pts,etc,home,lib,lib64,proc,root,sbin,tmp,usr/bin,usr/include,usr/lib,usr/lib64,usr/sbin}
chmod 1777 $dir/tmp
# /bin
chroot_mount_dir /bin $dir/bin --read-only
# /dev/pts
chroot_mount_dir /dev/pts $dir/dev/pts
# /etc
chroot_mount_dir /etc $dir/etc --read-only
# /lib
chroot_mount_dir /lib $dir/lib --read-only
# /lib64
chroot_mount_dir /lib64 $dir/lib64 --read-only
# /proc
chroot_mount_dir /proc $dir/proc
# /sbin
chroot_mount_dir /sbin $dir/sbin --read-only
# /usr/bin
chroot_mount_dir /usr/bin $dir/usr/bin --read-only
# /usr/include
chroot_mount_dir /usr/include $dir/usr/include --read-only
# /usr/lib
chroot_mount_dir /usr/lib $dir/usr/lib --read-only
# /usr/lib64
chroot_mount_dir /usr/lib64 $dir/usr/lib64 --read-only
# /usr/sbin
chroot_mount_dir /usr/sbin $dir/usr/sbin --read-only
rm -f $dir/dev/null
mknod -m 666 $dir/dev/null c 1 3
rm -f $dir/dev/zero
mknod -m 666 $dir/dev/zero c 1 5
rm -f $dir/dev/random
mknod -m 444 $dir/dev/random c 1 8
rm -f $dir/dev/urandom
mknod -m 444 $dir/dev/urandom c 1 9
# user home directory
if [ -n "$user" ]; then
local home_dir=/home/$user
if [ "$user" == "root" ]; then
home_dir=/root
fi
if [ -d $home_dir ]; then
chroot_mount_dir $home_dir ${dir}${home_dir} $home_read_only
fi
fi
}
function chroot_remove_env() {
# define help
local help=$(cat <<HEREDOC
DESCRIPTION: Remove chroot environment.
PARAMETERS:
\$1 chroot directory
HEREDOC
)
# check parameters
if [ "$1" == "--help" ] || [ $# -ne 1 ]; then
echo -e "${help}\n"
return
fi
# get parameters
local dir=$1
rm -f $dir/dev/null
rm -f $dir/dev/zero
rm -f $dir/dev/random
rm -f $dir/dev/urandom
for path in $(mount -l | grep $dir | awk '{ print $3 }'); do
umount $path
done
rm -rf $dir/tmp/*
}
function is_chroot() {
# define help
local help=$(cat <<HEREDOC
DESCRIPTION: Indicates if current environment is a chroot environment.
HEREDOC
)
# check parameters
if [ "$1" == "--help" ]; then
echo -e "${help}\n"
return
fi
if [ $(stat -c %i /) != 2 ]; then
echo $result_pos
else
echo $result_neg
fi
}
################################################################################
## user routines
##
function user_exists() {
# define help
local help=$(cat <<HEREDOC
DESCRIPTION: Check if user exists.
PARAMETERS:
\$1 user
HEREDOC
)
# check parameters
if [ "$1" == "--help" ] || [ $# -ne 1 ]; then
echo -e "${help}\n"
return
fi
# get parameters
local user=$1
if [ $(grep "^$1:" /etc/passwd | wc -l) == "1" ]; then
echo $result_pos
else
echo $result_neg
fi
}
function group_exists() {
# define help
local help=$(cat <<HEREDOC
DESCRIPTION: Check if group exists.
PARAMETERS:
\$1 group
HEREDOC
)
# check parameters
if [ "$1" == "--help" ] || [ $# -ne 1 ]; then
echo -e "${help}\n"
return
fi
# get parameters
local group=$1
if [ $(grep "^$group:" /etc/group | wc -l) == "1" ]; then
echo $result_pos
else
echo $result_neg
fi
}
function user_create() {
# define help
local help=$(cat <<HEREDOC
DESCRIPTION: Create a new system user.
PARAMETERS:
\$1 user
\$2 group
--uid <user id>
--gid <group id>
--groups <list of groups>
--home <home directory>
--shell <shell>
HEREDOC
)
# check parameters
if [ "$1" == "--help" ] || [ $# -lt 2 ]; then
echo -e "${help}\n"
return
fi
# get parameters
local user=$1
local group=$2
# get optional parameters
local uid="-K UID_MIN=${uid_min} -K UID_MAX=${uid_max}"
local gid="-K GID_MIN=${gid_min} -K GID_MAX=${gid_max}"
local groups=
local home="-d /dev/null"
local shell="-s /usr/sbin/nologin"
while [ "$1" != "" ]; do
case $1 in
--uid) shift; uid="-u ${1}"
;;
--gid) shift; gid="-g ${1}"
;;
--groups) shift; groups="-G ${1}"
;;
--home) shift; home="-d ${1}"
;;
--shell) shift; shell="-s ${1}"
;;
esac
shift
done
groupadd $group $gid
useradd $user $uid -g $group $groups $home $shell
}
function user_delete() {
# define help
local help=$(cat <<HEREDOC
DESCRIPTION: Delete an existing system user.
PARAMETERS:
\$1 user
HEREDOC
)
# check parameters
if [ "$1" == "--help" ] || [ $# -ne 1 ]; then
echo -e "${help}\n"
return
fi
# get parameters
local user=$1
userdel -f $user > /dev/null 2>&1
}
################################################################################
## security routines
##
function security_gen_cert() {
# define help
local help=$(cat <<HEREDOC
DESCRIPTION: Generates X.509 certificate.
PARAMETERS:
\$1 certificate name
--size <size> size of certificate (default is 2048)
--days <days> for how many days certificate remains valid (default is 3650)
--dir <dirctory> output dirctory
HEREDOC
)
# check parameters
if [ "$1" == "--help" ] || [ $# -lt 1 ]; then
echo -e "${help}\n"
return
fi
# get parameters
local name=$1
local size=2048
local days=3650
local dir=.
while [ "$1" != "" ]; do
case $1 in
--size) shift; size=$1
;;
--days) shift; days=$1
;;
--dir) shift; dir=$1
;;
esac
shift
done
$cmd_openssl req \
-new -x509 -nodes -sha1 -newkey rsa:$size -days $days -subj "/O=unknown/OU=unknown/CN=$name" \
-keyout $dir/$name.key \
-out $dir/$name.crt
cat $dir/$name.crt $dir/$name.key > $dir/$name.pem
chmod 400 $dir/$name.{crt,key,pem}
}