mirror of https://github.com/lework/script
lework
5 years ago
1 changed files with 687 additions and 0 deletions
@ -0,0 +1,687 @@
@@ -0,0 +1,687 @@
|
||||
#!/bin/bash |
||||
############################################################################### |
||||
# # |
||||
# Docker Operation # |
||||
# # |
||||
############################################################################### |
||||
|
||||
#$1: container name |
||||
func_docker_destroy_container(){ |
||||
local exist=`docker ps -a |awk '{print $NF}'|grep $1` |
||||
if [[ $exist == "" ]];then |
||||
return 0 |
||||
fi |
||||
docker kill $1 >/dev/null 2>&1 |
||||
if [[ $(docker version --format '{{.Server.Version}}') = 17.06.0* ]]; then |
||||
# Workaround https://github.com/moby/moby/issues/33948. |
||||
# TODO: remove when 17.06.0 is not relevant anymore |
||||
DOCKER_API_VERSION=v1.29 docker wait "$1" >/dev/null 2>&1 || true |
||||
else |
||||
docker wait "$1" >/dev/null 2>&1 || true |
||||
fi |
||||
docker rm -f -v "$1" >/dev/null 2>&1 || true |
||||
} |
||||
|
||||
#$1: imagename:tag |
||||
#ret: 0 exist, 1 not exist |
||||
func_docker_image_exist(){ |
||||
local ret=`docker images $1 |wc |awk '{ print $1 }'` |
||||
if [[ $ret == "2" ]];then |
||||
return 0 |
||||
fi |
||||
return 1 |
||||
} |
||||
|
||||
#$1: imagename:tag |
||||
func_docker_destroy_image(){ |
||||
func_docker_image_exist $1 |
||||
if [[ $? == "0" ]];then |
||||
docker rmi $1 |
||||
fi |
||||
} |
||||
|
||||
############################################################################### |
||||
# # |
||||
# Openssl Operation # |
||||
# # |
||||
############################################################################### |
||||
|
||||
#$1: keyfile |
||||
#$2: cafile |
||||
#$3: valid_days |
||||
func_self_signed_ca_interactive(){ |
||||
local key=$1 |
||||
local ca=$2 |
||||
local days=$3 |
||||
if [ ! -d `dirname $key` ];then |
||||
mkdir -p `dirname $key` |
||||
fi |
||||
if [ ! -d `dirname $ca` ];then |
||||
mkdir -p `dirname $ca` |
||||
fi |
||||
openssl req -nodes -new -x509 -days ${days} -keyout ${key} -out ${ca} |
||||
} |
||||
|
||||
#$1: result config file |
||||
#$2: prompt, yes/no |
||||
#$3: bits |
||||
#$4: keyfile |
||||
#$5: email |
||||
#$6: commonName |
||||
#$7: subjectAltName |
||||
func_cert_sign_req_config(){ |
||||
local config_file=$1 |
||||
local dir=`dirname $config_file` |
||||
if [ ! -d $dir ];then |
||||
mkdir -p $dir |
||||
fi |
||||
|
||||
local prompt=$2 |
||||
local bits=$3 |
||||
local keyfile=$4 |
||||
local email=$5 |
||||
local commonName=$6 |
||||
local subjectAltName=$7 |
||||
|
||||
cat > $config_file <<EOF |
||||
[ req ] |
||||
prompt = ${prompt} |
||||
default_bits = ${bits} |
||||
default_keyfile = ${keyfile} |
||||
distinguished_name = req_distinguished_name |
||||
attributes = req_attributes |
||||
x509_extensions = v3_ca |
||||
|
||||
dirstring_type = nobmp |
||||
|
||||
[ req_distinguished_name ] |
||||
|
||||
countryName = Country Name (2 letter code) |
||||
countryName_default = CN |
||||
countryName_min = 2 |
||||
countryName_max = 2 |
||||
|
||||
localityName = Locality Name (eg, city) |
||||
localityName_default = BeiJing |
||||
|
||||
organizationalUnitName = Organizational Unit Name (eg, section) |
||||
organizationalUnitName_default = no |
||||
|
||||
commonName = Common Name (eg, YOUR name) |
||||
commonName_default = ${commonName} |
||||
commonName_max = 64 |
||||
|
||||
emailAddress = Email Address |
||||
emailAddress_default = ${email} |
||||
emailAddress_max = 40 |
||||
|
||||
[ req_attributes ] |
||||
challengePassword = A challenge password |
||||
challengePassword_min = 4 |
||||
challengePassword_max = 20 |
||||
|
||||
[ v3_ca ] |
||||
subjectKeyIdentifier=hash |
||||
authorityKeyIdentifier=keyid:always,issuer:always |
||||
basicConstraints = CA:true |
||||
subjectAltName=${subjectAltName} |
||||
EOF |
||||
} |
||||
|
||||
############################################################################### |
||||
# # |
||||
# Cmd Params Operation # |
||||
# # |
||||
############################################################################### |
||||
#Generate config file from k8s style params |
||||
#$1: Saved Config file |
||||
#$2: command |
||||
#$3..: command params |
||||
func_gen_config_k8s(){ |
||||
local file=$1 |
||||
local cmd=$2 |
||||
shift 2 |
||||
echo "declare -A CONFIGS" >$file |
||||
$cmd 2>&1 $* |sed '1d' |sed -E 's/.*(--[^:]*):(.*)/\#\2\n\1/' | sed -E 's/\[(.*)\]/\1/' | sed -E "s/--(.*)=(.*)/CONFIGS\[\1\]=\'--\1=\2\'/" >>$file |
||||
} |
||||
|
||||
############################################################################### |
||||
# # |
||||
# Time Operation # |
||||
# # |
||||
############################################################################### |
||||
func_since_1970(){ |
||||
echo `date +"%s"` |
||||
} |
||||
func_cur_date(){ |
||||
echo `date +"%Y%m%d"` |
||||
} |
||||
func_yesterday_date(){ |
||||
echo `date -d yesterday +"%Y%m%d"` |
||||
} |
||||
func_before_yesterday_date(){ |
||||
echo `date -d "-2 day" +"%Y%m%d"` |
||||
} |
||||
func_cur_time(){ |
||||
echo `date +"%Y-%m-%d %H:%M:%S"` |
||||
} |
||||
func_yesterday_time(){ |
||||
echo `date -d yesterday +"%Y-%m-%d %H:%M:%S"` |
||||
} |
||||
############################################################################### |
||||
# # |
||||
# Base Convert Operation # |
||||
# # |
||||
############################################################################### |
||||
#convert 16base into 10base |
||||
# |
||||
func_16to10(){ |
||||
echo "ibase=16;obase=A; $1"|bc |
||||
} |
||||
|
||||
############################################################################### |
||||
# # |
||||
# Info Operation # |
||||
# # |
||||
############################################################################### |
||||
#Get the net interfaces's name |
||||
func_nic_names(){ |
||||
local names=`ip addr |grep \<.*\>|awk '{print $2}'|sed -e "s/://"` |
||||
echo $names |
||||
} |
||||
|
||||
############################################################################### |
||||
# # |
||||
# Error Operation # |
||||
# # |
||||
############################################################################### |
||||
#$1: message |
||||
func_fatal(){ |
||||
echo -n -e "\033[31m" |
||||
echo "Fatal Error: $1" |
||||
echo -n -e "\033[0m" |
||||
exit |
||||
} |
||||
|
||||
############################################################################### |
||||
# # |
||||
# Color Operation # |
||||
# # |
||||
############################################################################### |
||||
|
||||
#Input is the command. |
||||
#The command's execute output will use red color |
||||
func_red_cmd(){ |
||||
echo -n -e "\033[31m" |
||||
$* |
||||
echo -n -e "\033[0m" |
||||
} |
||||
|
||||
#Input is the command. |
||||
#The command's execute output will use yellow color |
||||
func_yellow_cmd(){ |
||||
echo -n -e "\033[33m" |
||||
$* |
||||
echo -n -e "\033[0m" |
||||
} |
||||
|
||||
#Input is the command |
||||
#If command is error, display the error |
||||
func_error_cmd(){ |
||||
$* |
||||
local ret=$? |
||||
if [ ! $ret -eq 0 ];then |
||||
echo -n -e "\033[41;37m" |
||||
echo "Error: [$ret] $*" |
||||
echo -n -e "\033[0m" |
||||
fi |
||||
return 0 |
||||
} |
||||
|
||||
#Input is the command |
||||
#If command is error, display the error and eixt |
||||
func_fatal_cmd(){ |
||||
$* |
||||
local ret=$? |
||||
if [ ! $ret -eq 0 ];then |
||||
echo -n -e "\033[41;37m" |
||||
echo "Error: [$ret] $*" |
||||
echo -n -e "\033[0m" |
||||
exit 1 |
||||
fi |
||||
return 0 |
||||
} |
||||
|
||||
#Input is a string. |
||||
#The string will be displayed with green color |
||||
func_green_str(){ |
||||
echo -n -e "\033[32m" |
||||
echo -e "$*" |
||||
echo -n -e "\033[0m" |
||||
} |
||||
|
||||
func_yellow_str(){ |
||||
echo -n -e "\033[33m" |
||||
echo -e "$*" |
||||
echo -n -e "\033[0m" |
||||
} |
||||
|
||||
#Input is a string. |
||||
#The string will be displayed with red color |
||||
func_red_str(){ |
||||
echo -n -e "\033[31m" |
||||
echo -e "$*" |
||||
echo -n -e "\033[0m" |
||||
} |
||||
|
||||
############################################################################### |
||||
# # |
||||
# Systemd Service Operation # |
||||
# # |
||||
############################################################################### |
||||
|
||||
#Start a systemd style Service |
||||
func_start_sd_service(){ |
||||
systemctl start $1 |
||||
sleep 1 |
||||
local sta=`systemctl status ${1} |grep "Active: failed"` |
||||
if [ -n "$sta" ];then |
||||
func_red_str "Start[Fail] $1" |
||||
func_red_str " $sta" |
||||
ret=1 |
||||
else |
||||
local x=`systemctl status ${1} | grep "Active:"` |
||||
func_green_str "Start[OK] $1" |
||||
func_green_str " $x" |
||||
fi |
||||
return $ret |
||||
} |
||||
|
||||
#Start a systemd style Service |
||||
func_stop_sd_service(){ |
||||
systemctl stop $1 |
||||
ret=$? |
||||
local sta=`systemctl status ${1} |grep "Active:"` |
||||
func_yellow_str "Stopping $1" |
||||
func_yellow_str " $sta" |
||||
} |
||||
|
||||
############################################################################### |
||||
# # |
||||
# Directory Operation # |
||||
# # |
||||
############################################################################### |
||||
|
||||
#Create Dirs: $1 $2 $3 ... |
||||
func_create_dirs(){ |
||||
for i in $* |
||||
do |
||||
if [ ! -d $i ];then |
||||
mkdir -p $i |
||||
fi |
||||
done |
||||
} |
||||
|
||||
#Force Copy: |
||||
#$1: Destiation Directory |
||||
#$2,$3,$4,...: Source File or Directories |
||||
func_force_copy(){ |
||||
local dest=$1 |
||||
shift 1 |
||||
|
||||
if [ ! -d $dest ];then |
||||
func_red_str "Dest Dir doesn't exist: $dest" |
||||
return 1 |
||||
fi |
||||
|
||||
for i in $* |
||||
do |
||||
if [ ! -e $i ];then |
||||
func_red_str "Not Found: $i" |
||||
return 1 |
||||
fi |
||||
done |
||||
|
||||
for i in $* |
||||
do |
||||
cp -rf $i $dest/ |
||||
done |
||||
} |
||||
|
||||
############################################################################### |
||||
# # |
||||
# Git operation # |
||||
# # |
||||
############################################################################### |
||||
|
||||
#$1: respositry url |
||||
#$2:branch |
||||
#$3: tag |
||||
#$4: local directory |
||||
func_git_check_tag(){ |
||||
local url=$1 |
||||
local branch=$2 |
||||
local tag=$3 |
||||
local dir=$4 |
||||
|
||||
if [ ! -e $dir ];then |
||||
func_error_cmd git clone $url $dir |
||||
if [ ! $? -eq 0 ];then |
||||
func_red_str "Something is wrong in cloning" |
||||
return 1 |
||||
fi |
||||
fi |
||||
|
||||
if [ ! -d $dir ];then |
||||
func_red_str "The local respositry is not a directory" |
||||
return 1 |
||||
fi |
||||
|
||||
local cur=`pwd` |
||||
cd $dir |
||||
func_error_cmd git checkout master |
||||
func_error_cmd git pull |
||||
func_error_cmd git checkout $branch |
||||
func_error_cmd git checkout $tag |
||||
if [ ! $? -eq 0 ];then |
||||
return 1 |
||||
fi |
||||
cd $cur |
||||
} |
||||
|
||||
############################################################################### |
||||
# # |
||||
# Daemon Command # |
||||
# # |
||||
############################################################################### |
||||
|
||||
#$1: pidfile |
||||
#$2: log file |
||||
#$4: commands |
||||
func_daemon_cmd(){ |
||||
local pidfile=$1 |
||||
local stdout="$2.stdout" |
||||
local stderr="$2.stderr" |
||||
shift 2 |
||||
|
||||
$* 1>>$stdout 2>>$stderr & |
||||
local pid=$! |
||||
echo $pid >$pidfile |
||||
} |
||||
|
||||
#$1: pid |
||||
func_check_pid(){ |
||||
ps -p $1 1>/dev/null 2>&1 |
||||
if [ $? -eq 0 ];then |
||||
return 0 |
||||
fi |
||||
return 1 |
||||
} |
||||
|
||||
#$1: pid |
||||
#$2: pid desc |
||||
func_exit_no_pid(){ |
||||
func_check_pid $1 |
||||
if [ ! $? -eq 0 ];then |
||||
func_red_str "Pid($1:$2) doesn't exist" |
||||
exit 1 |
||||
fi |
||||
return 0 |
||||
} |
||||
|
||||
#$1: pid file |
||||
#$2: log file |
||||
#$3: executuable binary file name |
||||
#$4: command |
||||
func_start_cmd(){ |
||||
local pidf=$1 |
||||
local logf=$2 |
||||
local name=$3 |
||||
shift 3 |
||||
local cmd=$* |
||||
|
||||
if [ -e $pidf ];then |
||||
func_red_str "The PID file has already existed, please check: $pidf" |
||||
func_yellow_str "It may be running or hasn't delete the PID file when it was stopped last time" |
||||
exit 1 |
||||
fi |
||||
func_daemon_cmd $pidf $logf $cmd |
||||
sleep 1 |
||||
func_exit_no_pid `cat $pidf` "[Fail]${name} is not running!" |
||||
if [ $? -eq 0 ];then |
||||
return 0 |
||||
fi |
||||
} |
||||
|
||||
#$1: pid file |
||||
func_stop_cmd(){ |
||||
local pidf=$1 |
||||
|
||||
if [ ! -e $pidf ];then |
||||
func_red_str "The PID file doesn't exist': $pidf" |
||||
func_yellow_str "It may be not running" |
||||
exit 1 |
||||
fi |
||||
|
||||
local pid=`cat $pidf` |
||||
if [ "$pid" == "1" ];then |
||||
func_red_str "You are not allowed to stop PID 1 !" |
||||
exit 1 |
||||
else |
||||
kill -9 $pid |
||||
rm -rf $pidf |
||||
fi |
||||
return 0 |
||||
} |
||||
|
||||
#$1: Target executable file |
||||
#$2: Log path |
||||
#$3: An config Array's name, the Array must be global. Becareful, Just give Name, not value(no $) |
||||
#$4: Other parametes from the command line, [start|stop] |
||||
func_service_template_1(){ |
||||
local TARGET=$1 |
||||
local Logs=$2 |
||||
eval config_2334200776=\${$3[@]} |
||||
local cmdline=$4 |
||||
CMD="${TARGET} ${config_2334200776[@]}" |
||||
NAME=`basename ${TARGET}` |
||||
PID_FILE="${Logs}/${NAME}.pid" |
||||
LOG_FILE="${Logs}/${NAME}" |
||||
OPERATE="${Logs}/${NAME}.operate" |
||||
|
||||
start(){ |
||||
echo -e "`func_cur_time`: [start] $CMD" >>$OPERATE |
||||
func_start_cmd $PID_FILE $LOG_FILE $NAME $CMD |
||||
if [ $? == 0 ];then |
||||
func_green_str "$TARGET is running" |
||||
fi |
||||
} |
||||
|
||||
stop(){ |
||||
echo -e "`func_cur_time`: [stop]" >>$OPERATE |
||||
func_stop_cmd $PID_FILE |
||||
if [ $? == 0 ];then |
||||
func_red_str "$TARGET is terminated" |
||||
fi |
||||
} |
||||
|
||||
case $cmdline in |
||||
(start) |
||||
start;; |
||||
(stop) |
||||
stop;; |
||||
(restart) |
||||
stop;start;; |
||||
(*) |
||||
echo "usage: $0 [stop|start|restart]" |
||||
esac |
||||
} |
||||
|
||||
############################################################################### |
||||
# # |
||||
# Arrary Operation # |
||||
# # |
||||
############################################################################### |
||||
|
||||
#$1: sep string |
||||
#$2: prefix |
||||
#$3: Array's name, the Array must be global. Becareful, Just give Name, not value(no $) |
||||
#$4: postfix |
||||
func_join_array(){ |
||||
local sep=$1 |
||||
local prefix=$2 |
||||
local postfix=$4 |
||||
eval array_doimgaeg3234553=(\${$3[@]}) |
||||
local len=${#array_doimgaeg3234553[@]} |
||||
|
||||
if [ $len -eq 1 ];then |
||||
echo ${prefix}${array_doimgaeg3234553[@]}${postfix} |
||||
return 0 |
||||
fi |
||||
|
||||
local i=0 |
||||
local str=${prefix}${array_doimgaeg3234553[$i]}${postfix} |
||||
i=$(($i+1)) |
||||
|
||||
while [ $i -lt $len ] |
||||
do |
||||
str=${str}${sep}${prefix}${array_doimgaeg3234553[$i]}${postfix} |
||||
i=$(($i+1)) |
||||
done |
||||
echo $str |
||||
return 0 |
||||
} |
||||
|
||||
#if value is in array, return 0, else return 1 |
||||
#$1: value |
||||
#$2: Array's name, the Array must be global. Becareful, Just give Name, not value(no $) |
||||
func_in_array(){ |
||||
eval array_adfadfadfgli3323455=(\${$2[@]}) |
||||
for i in ${array_adfadfadfgli3323455[@]} |
||||
do |
||||
if [ $i == $1 ];then |
||||
return 0 |
||||
fi |
||||
done |
||||
return 1 |
||||
} |
||||
|
||||
############################################################################### |
||||
# # |
||||
# System info # |
||||
# # |
||||
############################################################################### |
||||
#Get ipv4 address |
||||
func_ipv4_addr(){ |
||||
local ips=`ip addr |grep inet|grep -v inet6| awk '{print $2}'|sed "s/\/.*//"` |
||||
echo $ips |
||||
} |
||||
|
||||
|
||||
############################################################################### |
||||
# # |
||||
# Update Operation # |
||||
# # |
||||
############################################################################### |
||||
|
||||
#return 0: the file is updated 1: nothing is changed 2:remote is wrong. |
||||
#must checksum by sha1sum |
||||
#$1: local version file |
||||
#$2: remote version url |
||||
#$3: local file path |
||||
#$4: remote file url |
||||
func_update_file(){ |
||||
if [ ! -e $1 ];then |
||||
func_red_str "Can't found Local Version" |
||||
exit 1 |
||||
fi |
||||
|
||||
local lver=`cat $1` |
||||
if [ "$lver" == "" ];then |
||||
func_red_str "Local Version is NULL!" |
||||
exit 1 |
||||
fi |
||||
|
||||
local rver=`curl $2 2>/dev/null |grep -v \<` |
||||
if [ "$rver" == "" ];then |
||||
func_red_str "Can't get Remote Version" |
||||
exit 1 |
||||
fi |
||||
|
||||
if [ "$lver" == "$rver" ];then |
||||
func_green_str "Local Version matches the Remote Version." |
||||
return 1 |
||||
fi |
||||
|
||||
local lfile=$3 |
||||
curl -o $lfile $4 2>/dev/null |
||||
|
||||
local lsha1=`sha1sum $lfile|awk '{print $1}'` |
||||
local rsha1=`echo $rver|awk '{print $1}'` |
||||
|
||||
if [ "$lsha1" == "$rsha1" ];then |
||||
func_green_str "The Remote Version file lays: $lfile" |
||||
return 0 |
||||
else |
||||
func_red_str "The Remote File dosen't match the Remote Version: $lfile" |
||||
return 2 |
||||
fi |
||||
} |
||||
|
||||
#$1: local file path |
||||
#$2: remote file url |
||||
func_replace_lfile(){ |
||||
curl -o $1 $2 2>/dev/null |
||||
} |
||||
|
||||
#get a file and check the sha1 code |
||||
#$1 local file |
||||
#$2 file url |
||||
#$3 sha1 code url |
||||
func_curl_file_sha1(){ |
||||
local rsha1=`curl $3 2>/dev/null|grep -v \<|awk '{print $1}'` |
||||
if [ "$rsha1" == "" ];then |
||||
func_red_str "Can't the file sha1 code!" |
||||
return 1 |
||||
fi |
||||
curl -o $1 $2 |
||||
local lsha1=`sha1sum $1|awk '{print $1}'` |
||||
|
||||
if [ "$lsha1" == "$rsha1" ];then |
||||
func_green_str "The File lays: $lfile" |
||||
return 0 |
||||
else |
||||
func_red_str "The File dosen't match the sha1 code: $1" |
||||
return 2 |
||||
fi |
||||
} |
||||
|
||||
############################################################################### |
||||
# # |
||||
# Interactive Operation # |
||||
# # |
||||
############################################################################### |
||||
#$1: password |
||||
#$2...: cmds |
||||
func_cmd_need_password(){ |
||||
local password=$1 |
||||
shift 1 |
||||
expect -c " |
||||
spawn $* |
||||
expect { |
||||
\"*password:\" {set timeout 300; send \"${password}\r\";} |
||||
\"*yes/no\" {send \"yes\r\"; exp_continue;} |
||||
} |
||||
expect eof" |
||||
} |
||||
|
||||
#$1: VARNAME |
||||
#$2: prompt |
||||
func_secret_input(){ |
||||
echo -n "$2" |
||||
stty -echo |
||||
read $1 |
||||
stty echo |
||||
echo "" |
||||
} |
||||
|
Loading…
Reference in new issue