Browse Source

idem_apt_install

master
pvincent 3 years ago
parent
commit
000e77d6ca
  1. 48
      install.sh
  2. 36
      lib/functions.sh

48
install.sh

@ -1,40 +1,33 @@
#!/bin/bash #!/bin/bash
BASEDIR=$PWD BASEDIR=$PWD
TAG=$(cat /opt/debian-bash/.semver_git_tag)
REQUIRED_PKGS=(jq rsync file git)
function usage {
function usage() {
echo 'usage: --host | --containers | --full | --one-container <CT_NAME>' echo 'usage: --host | --containers | --full | --one-container <CT_NAME>'
exit -1 exit -1
} }
function install_host {
function install_host() {
echo "install on: $HOSTNAME" echo "install on: $HOSTNAME"
echo ---------------------- echo ----------------------
[ `id -u` -ne 0 ] && echo 'root privilege required' && exit 1
# required packages jq
/usr/bin/dpkg-query --status jq >/dev/null 2>&1
[ $? -ne 0 ] && /usr/bin/apt install -y jq
# required packages rsync
/usr/bin/dpkg-query --status rsync >/dev/null 2>&1
[ $? -ne 0 ] && /usr/bin/apt install -y rsync
[ $(id -u) -ne 0 ] && echo 'root privilege required' && exit 1
# shellcheck disable=SC1091
source "$BASEDIR/lib/functions.sh"
idem_apt_install "${REQUIRED_PKGS[@]}"
if [[ ! $BASEDIR == '/opt/debian-bash' ]]; then if [[ ! $BASEDIR == '/opt/debian-bash' ]]; then
# download and filfull /opt/debian-bash, then run it from folder # download and filfull /opt/debian-bash, then run it from folder
if [[ -L /opt/debian-bash ]];then
cd /opt/debian-bash
./install.sh $PARAM1
if [[ -L /opt/debian-bash ]]; then
cd /opt/debian-bash && ./install.sh "$PARAM1"
exit 0 exit 0
else else
rm -rf /opt/debian-bash rm -rf /opt/debian-bash
TEMP=`mktemp -d`
TEMP=$(mktemp -d)
cd $TEMP cd $TEMP
echo $TEMP echo $TEMP
wget https://git.artcode.re/pvincent/debian-bash/archive/master.tar.gz wget https://git.artcode.re/pvincent/debian-bash/archive/master.tar.gz
@ -56,8 +49,7 @@ function install_host {
ORIGINAL="ORIGINAL" ORIGINAL="ORIGINAL"
declare -a arr=(/etc/bash.bashrc /etc/inputrc /etc/vim/vimrc) declare -a arr=(/etc/bash.bashrc /etc/inputrc /etc/vim/vimrc)
for i in "${arr[@]}"
do
for i in "${arr[@]}"; do
if [ ! -f "$i.$ORIGINAL" ]; then if [ ! -f "$i.$ORIGINAL" ]; then
echo "$i needs installation $(basename $i)" echo "$i needs installation $(basename $i)"
@ -71,13 +63,13 @@ function install_host {
fi fi
} }
function install_containers {
function install_containers() {
echo "install containers" echo "install containers"
echo -------------------- echo --------------------
# install inside active LXC containers # install inside active LXC containers
if [[ -f '/snap/bin/lxc' ]]; then if [[ -f '/snap/bin/lxc' ]]; then
for container in `/snap/bin/lxc list --format=json | /bin/jq -r '.[] | select(.state.status == "Running") | .name'`; do
for container in $(/snap/bin/lxc list --format=json | /bin/jq -r '.[] | select(.state.status == "Running") | .name'); do
install_one_container $container install_one_container $container
echo echo
done done
@ -85,7 +77,7 @@ function install_containers {
} }
function install_one_container {
function install_one_container() {
CT=$1 CT=$1
echo "install container <$CT>" echo "install container <$CT>"
echo ------------------------- echo -------------------------
@ -100,13 +92,13 @@ function install_one_container {
PARAM1=$1 PARAM1=$1
case $PARAM1 in case $PARAM1 in
"--host")
"--host")
install_host install_host
;; ;;
"--containers")
"--containers")
install_containers install_containers
;; ;;
"--one-container")
"--one-container")
CT=$2 CT=$2
if [ ! -z $CT ]; then if [ ! -z $CT ]; then
install_one_container $CT install_one_container $CT
@ -114,13 +106,11 @@ case $PARAM1 in
usage usage
fi fi
;; ;;
"--full")
"--full")
install_host install_host
install_containers install_containers
;; ;;
*)
*)
usage usage
;; ;;
esac esac

36
lib/functions.sh

@ -1,45 +1,53 @@
# idempotent apt install [package1 package2 ...]
function idem_apt_install() {
for i in $@; do
if ! (/usr/bin/dpkg-query --status "$i" >/dev/null 2>&1); then
/usr/bin/apt install -y "$i"
fi
done
}
## ##
# return 0 (true) if array (passed by name) contains element # return 0 (true) if array (passed by name) contains element
# usage: # usage:
# ARRAY = ( a b c ) # ARRAY = ( a b c )
# containsElement ARRAY 'a' => 0 # containsElement ARRAY 'a' => 0
containsElement () {
containsElement() {
local -a 'arraykeys=("${!'"$1"'[@]}")' local -a 'arraykeys=("${!'"$1"'[@]}")'
if $(isArray $1); then if $(isArray $1); then
for index in ${arraykeys[*]}; do for index in ${arraykeys[*]}; do
current=$1"[$index]" current=$1"[$index]"
[[ "${!current}" == "$2" ]] && return 0; # found
[[ "${!current}" == "$2" ]] && return 0 # found
done done
return 1; # not found
return 1 # not found
else else
>&2 echo "ERROR: $1 not an array!"
return 2; # not an array
echo >&2 "ERROR: $1 not an array!"
return 2 # not an array
fi fi
} }
isArray(){
[[ "$(declare -p $1 2> /dev/null)" =~ "declare -a" ]] && return 0; # is an array
return 1; # not an array
isArray() {
[[ "$(declare -p $1 2>/dev/null)" =~ "declare -a" ]] && return 0 # is an array
return 1 # not an array
} }
## ##
# #
askConfirmation () {
askConfirmation() {
case "$1" in case "$1" in
y|Y|yes|YES )
y | Y | yes | YES)
QUESTION="(Y/n)?" QUESTION="(Y/n)?"
DEFAULT=0 DEFAULT=0
;; ;;
* )
*)
QUESTION="(y/N)?" QUESTION="(y/N)?"
DEFAULT=1 DEFAULT=1
;; ;;
esac esac
read -p "$QUESTION : " choice read -p "$QUESTION : " choice
case "$choice" in case "$choice" in
y|Y|yes|YES ) return 0;; #true
n|no|N|NO ) return 1;; #false
* ) return $DEFAULT;;
y | Y | yes | YES) return 0 ;; #true
n | no | N | NO) return 1 ;; #false
*) return $DEFAULT ;;
esac esac
} }
Loading…
Cancel
Save