diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index c584211..7d71f67 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -17,7 +17,7 @@ jobs: rev=`git rev-parse HEAD` pwd set -x - ./install.sh -adl + DFS_NO_WALL=0 ./install.sh -adl test `git rev-parse HEAD` = "$rev" - name: antigen build @@ -31,13 +31,11 @@ jobs: run: | source tools/test.zsh antigen reset - rm -rf $ANTIGEN $HOME/.antigen + rm -rf $ANTIGEN $HOME/.antigen $HOME/.config/dotfiles ./install.sh -dl - name: antigen build with DFS_NO_WALL shell: /bin/zsh -ileo PIPE_FAIL {0} - env: - DFS_NO_WALL: 1 run: | echo $SHELL antigen list @@ -60,7 +58,7 @@ jobs: rev=`git rev-parse HEAD` pwd set -x - ./install.sh -adl + DFS_NO_WALL=0 ./install.sh -adl test `git rev-parse HEAD` = "$rev" - name: antigen build @@ -74,13 +72,11 @@ jobs: run: | source tools/test.zsh antigen reset - rm -rf $ANTIGEN $HOME/.antigen + rm -rf $ANTIGEN $HOME/.antigen $HOME/.config/dotfiles ./install.sh -dl - name: antigen build with DFS_NO_WALL shell: /bin/zsh -ileo PIPE_FAIL {0} - env: - DFS_NO_WALL: 1 run: | echo $SHELL antigen list @@ -109,10 +105,27 @@ jobs: ./install.sh -dal test `git rev-parse HEAD` = "$rev" - - name: antigen build with DFS_NO_WALL + - name: antigen build shell: /bin/zsh -ileo PIPE_FAIL {0} - env: - DFS_NO_WALL: 1 run: | echo $SHELL antigen list + + test-get-dotfiles-cn: + name: test of get.dotfiles.cn script + runs-on: ubuntu-latest + steps: + - name: checkout repo + uses: actions/checkout@v3 + with: + fetch-depth: 0 + + - name: run the script + run: | + repo=https://github.com/DictXiong/dotfiles bash tools/get.dotfiles.cn -asl + + - name: run tests + shell: /bin/zsh -ileo PIPE_FAIL {0} + run: | + dfs cd + source tools/test.zsh \ No newline at end of file diff --git a/.ssh/authorized_keys2 b/.ssh/authorized_keys2 index 3500ec7..8eac60e 100644 --- a/.ssh/authorized_keys2 +++ b/.ssh/authorized_keys2 @@ -1,5 +1,3 @@ -ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQD5VPD5c/pBtQM5mcKMzJ6vC2jDdVJU6ifkP1EvAeV/dKEyy5hOc+EXC8Ws7bAp3a7twvsQGSqNbeXuAO4PzX2KHhI49KiFyRugo8LsUF3TVVluOXtGWKgw+36TBO3rNFgWOnhw5B4IlNtxo2nk4grCkgEsE6w+Ignd+FrEFec457oal2SPN02TjUfRULaEPSpZTl7cA/5Re9/QmlcYjuyA9zbkO98KYA0M71W/eUcjfjNEaWXjn2pcloakoWwEEdi4v/yJ1Fk+gQYcbpoftxpWmWLvFhDGP+qvTZY5QHxDxiPbc3HDdx0qBvMOQW9XSt0J/L/btnxcZvA1lDtkC2bm8zvHxtLBZ9JBRutMbRhdSgkd3+5DwHDIO0EIUqckgCfX3t7avj5RsPAl0j4V40yB637YQim7saN3FWq43SpR3i6buNbQLPdgy2SDN6fAZcAPWvifE1KG7I2BtmiFFYjAy3iU1KD2Hgn6mIpOOCZOJV30/cf3Oq8ZSDfD7PmDu72yOea3h9JlvkKjjqknnF4NdQ5cy1FuIfyebnF6+ugbdA9UqY9PZdnuwy5RkwkmJwC4AVO3GaOfuQDU61UMSoTfYH1yB8x8HHUQcJzLtfExrYpVPAo89tyN1lcIIBUBoHhNMCwVBZipfV/H41cIxs5wkHsolQ02zZaAX6Cgbii9FQ== home - ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIPmMImRSAhksHUfCwNpcj61izGn0Xkv1KRIuxb0OSdJl pc0/old ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIO4K5S3zDYbxlw7B45zOdmKud95nXU1V6kSxEvbTOsy2 pc1/old @@ -30,3 +28,5 @@ ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBJ/+BWST ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBNvHya5i3GNniGww9Yx5ikos4Z5jevu8zz8hCQi05++SgejFPnbw9UjbHFjODK2M+ZHuhRF5mdf996r4/BxWyP8= pad0/sep ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBC5gu+U4picxVvCNYjLlmxGLpJl7svj3LklO7jSpwqdrNxlE+/xkx07PJx76AbA77dDM1Dxmm/VOvVQCKTRLTgk= ip14/sep + +ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIF52mPmbLEriZ+DfmrMHFtvg2kiO2JpRpitvs7PbJowh home0 diff --git a/.update.sh b/.update.sh index b82bb5e..322ee86 100644 --- a/.update.sh +++ b/.update.sh @@ -35,7 +35,7 @@ if [[ "$(git rev-parse HEAD)" == "$DFS_COMMIT" ]]; then fmt_info "nothing to do" else fmt_info "checking out to commit $DFS_COMMIT ..." - if [[ -z "$DFS_DEV" ]]; then + if [[ -z "$DFS_DEV" || "$DFS_DEV" == "0" ]]; then post_beacon "dfs.updated" git -c advice.detachedHead=false checkout $DFS_COMMIT cp ./.update.sh ./update.sh && chmod +x ./update.sh && exit $DFS_UPDATED_RET diff --git a/.zshrc2 b/.zshrc2 index 5493eff..b32430e 100644 --- a/.zshrc2 +++ b/.zshrc2 @@ -14,17 +14,11 @@ export EDITOR='vim' export PYTHONIOENCODING='UTF-8' export GPG_TTY=$(tty) export LESS_TERMCAP_md=$'\E[01;33m' +# env for dfs +if [[ -f ~/.config/dotfiles/env ]]; then set -a; source ~/.config/dotfiles/env; set +a; fi # antigen -if [[ -z "$DFS_NO_WALL" ]]; then - ANTIGEN_URL="https://gitee.com/dictxiong/antigen/raw/develop/bin/antigen.zsh" - ANTIGEN_OMZ_REPO_URL="https://gitee.com/dictxiong/ohmyzsh.git" - ANTIGEN_PLUGINS=( - "https://gitee.com/dictxiong/zsh-syntax-highlighting" - "https://gitee.com/dictxiong/zsh-completions" - "https://gitee.com/dictxiong/zsh-autosuggestions" - ) -else +if [[ "$DFS_NO_WALL" == "1" ]]; then ANTIGEN_URL="https://raw.githubusercontent.com/zsh-users/antigen/develop/bin/antigen.zsh" ANTIGEN_OMZ_REPO_URL="https://github.com/ohmyzsh/ohmyzsh.git" ANTIGEN_PLUGINS=( @@ -32,6 +26,14 @@ else "https://github.com/zsh-users/zsh-completions" "https://github.com/zsh-users/zsh-autosuggestions" ) +else + ANTIGEN_URL="https://gitee.com/dictxiong/antigen/raw/develop/bin/antigen.zsh" + ANTIGEN_OMZ_REPO_URL="https://gitee.com/dictxiong/ohmyzsh.git" + ANTIGEN_PLUGINS=( + "https://gitee.com/dictxiong/zsh-syntax-highlighting" + "https://gitee.com/dictxiong/zsh-completions" + "https://gitee.com/dictxiong/zsh-autosuggestions" + ) fi ANTIGEN="$HOME/antigen.zsh" # Install antigen.zsh if not exist @@ -100,7 +102,7 @@ alias "se"='sudo -sE' alias "pbd"='ping baidu.com' alias "p114"='ping 114.114.114.114' alias "p666"='ping6 2001:da8::666' -alias "gdebug"='git add -A; git commit -m "bug fix"' +alias "gdebug"='git add -A; git commit --allow-empty -m "bug fix ($(date))"' case $(bash "$DOTFILES/tools/common.sh" get_os_type) in macos ) alias l='ls -lAGh -D "%y-%m-%d %H:%M"' ;; * ) alias l='ls -lAGh --time-style="+%y-%m-%d %H:%M"' ;; @@ -108,9 +110,6 @@ esac if [[ -x $(command -v trash) ]]; then alias "rm"="echo use the full path i.e. '/bin/rm'\; consider using trash" fi -sibd() { ssh -p 12022 root@$1${1:+.}ibd.ink } -sob() { ssh -p 24022 root@$1${1:+.}ob.ac.cn } -snasp() { ssh -o ProxyJump="ssh@nasp.ob.ac.cn:36022" dictxiong@$1 } gbes() { git for-each-ref --sort=-committerdate refs/heads refs/remotes --format="%(authordate:format:%y-%m-%d.%a %H:%M %z)|%(color:red)%(objectname:short)|%(color:yellow)%(refname:short)%(color:reset)|%(color:reset)%(authorname): %(color:green)%(subject)" --color=always | column -ts"|" | less -FX } piv-agent() { @@ -168,7 +167,7 @@ dfs() $EDITOR ~/.config/dotfiles/env ;; force-update ) ( - cd "$DOTFILES" + cd "$DOTFILES" git fetch --all ref=$(git symbolic-ref --short HEAD 2> /dev/null) || ref=$(git rev-parse --short HEAD 2> /dev/null) || return 0 for i in $(git for-each-ref refs/heads --format='%(refname)') ; do git checkout ${i#refs/heads/} ; git pull --ff-only ; done diff --git a/install.sh b/install.sh index e117f80..6e7a499 100755 --- a/install.sh +++ b/install.sh @@ -1,5 +1,5 @@ #!/bin/bash - +set -e THIS_DIR=$( cd "$( dirname "${BASH_SOURCE[0]:-${(%):-%x}}" )" && pwd ) source "$THIS_DIR/tools/common.sh" @@ -10,6 +10,7 @@ fi DOTFILE_TILDE=${DOTFILES/"$HOME"/\~} CRON_JOB="0 * * * * ${DOTFILES}/update.sh" +declare -a DFS_CONFIGS declare -a HOME_FILES_PATH declare -a HOME_FILES_CONTENT HOME_FILES_PATH[0]=".zshrc" @@ -28,22 +29,32 @@ HOME_SYMLINKS_DST[0]=".ssh/authorized_keys2" install_dependencies() { + local ret=0 fmt_note "installing dependencies ..." + set +e case $(get_os_name) in "ubuntu"|"debian" ) - $SUDO "$DOTFILES/tools/ubuntu.sh" apt-install + $SUDOE "$DOTFILES/tools/ubuntu.sh" apt-install + ret=$? ;; "alpine" ) - $SUDO "$DOTFILES/tools/alpine.sh" apk-add + $SUDOE "$DOTFILES/tools/alpine.sh" apk-add + ret=$? ;; "macos" ) "$DOTFILES/tools/macos.sh" brew-install + ret=$? ;; "msys" ) "$DOTFILES/tools/msys2.sh" pacman-S + ret=$? ;; - * ) fmt_error "dfs auto-install is not implemented on OS: $(get_os_name)" + * ) fmt_error "dfs auto-install is not implemented on OS: $(get_os_name). skipping ..." esac + set -e + if [[ "$ret" != "0" ]]; then + fmt_error "failed to install dependencies." + fi } preinstall_check() @@ -61,8 +72,8 @@ preinstall_check() for i in "${optional_commands[@]}"; do if ! command -v $i 1>/dev/null; then fmt_warning "\"$i\" not found" - ask_for_Yn "continue anyway?" - if [[ "$?" == "0" ]]; then + yn=$(ask_for_Yn "continue anyway?") + if [[ "$yn" == "0" ]]; then fmt_info "all this utils are suggested: ${optional_commands[@]}" fmt_info "install them manually or check scripts in tools/" fmt_fatal "aborting ..." @@ -71,12 +82,39 @@ preinstall_check() done } +prepare_config() +{ + local remote=$(cd "$DOTFILES" && git remote get-url origin) + if [[ -z "$DFS_NO_WALL" && $remote == *github* ]]; then + DFS_CONFIGS+=("DFS_NO_WALL=1") + fi + if [[ ${#DFS_CONFIGS[@]} == 0 ]]; then + return + fi + fmt_note "preparing dotfiles configurations ..." + local key value + for i in "${DFS_CONFIGS[@]}"; do + if [[ "$i" == *"="* ]]; then + key=${i%%=*} + value=${i#*=} + else + key=$i + value=$(eval echo \$$key) + fi + HOME_FILES_PATH+=(".config/dotfiles/env") + HOME_FILES_CONTENT+=("$key=$value") + echo -n "$key=$value " + export $key=$value + done + echo +} + install_file_content() { fmt_note "installing file content ..." for ((i=0; i<${#HOME_FILES_PATH[@]}; i++)); do local filename="$HOME/${HOME_FILES_PATH[$i]}" - local content=${HOME_FILES_CONTENT[$i]} + local content="${HOME_FILES_CONTENT[$i]}" fmt_info "installing \"$content\" into \"$filename\" ..." mkdir -p $(dirname "$filename") if [ ! -f "$filename" ]; then @@ -119,8 +157,8 @@ install_symlink() echo ---------- stat $dst echo ---------- - ask_for_yN "would you like to replace ${dst}?" - if [ $? -eq 1 ]; then + yn=$(ask_for_yN "would you like to replace ${dst}?") + if [[ "$yn" == "1" ]]; then rm $dst else fmt_error "aborting this job ..." @@ -211,7 +249,7 @@ install_update() RET=$? if [[ $RET == 85 ]]; then fmt_note "dfs updated. re-running install.sh ..." - "${DOTFILES}/install.sh" "$ORIGIN_ARGS" && exit + "${DOTFILES}/install.sh" "$@" && exit elif [[ $RET != 0 ]]; then fmt_fatal "update.sh failed with exit code $RET" fi @@ -229,6 +267,7 @@ install() if [[ "$INSTALL_DEP" == "1" ]]; then install_dependencies; fi install_update preinstall_check + prepare_config install_crontab install_file_content install_symlink @@ -241,10 +280,9 @@ install() uninstall() { - ask_for_yN "do you really want to uninstall?" - if [[ $? != 1 ]]; then - fmt_error "aborting this job ..." - return + yn=$(ask_for_yN "do you really want to uninstall?") + if [[ "$yn" != "1" ]]; then + fmt_fatal "aborting this job ..." fi uninstall_update uninstall_crontab @@ -254,19 +292,23 @@ uninstall() fmt_note "done uninstalling!" } -ORIGIN_ARGS="$@" -parse_arg "$@" FUNC=install INSTALL_DEP=0 -for i in ${PARSE_ARG_RET[@]}; do +store_config=0 +for i in ${GOT_OPTS[@]}; do + if [[ "$store_config" == "1" ]]; then + store_config=0 + DFS_CONFIGS+=("$i") + continue + fi case $i in -i ) FUNC=install ;; -r ) FUNC=uninstall ;; - -d|--dev ) export DFS_DEV=1 ;; - -l|--lite ) export DFS_LITE=1 ;; + -d|--dev ) export DFS_DEV=1; set -x ;; -a|--auto ) INSTALL_DEP=1 ;; -s|--secure ) export DFS_DEV=0 ;; - * ) fmt_fatal "unknown option \"$i\". available: -i, -r, -q, -d, -l, -a, -s" ;; + -x ) store_config=1 ;; + * ) fmt_fatal "unknown option \"$i\"" ;; esac done $FUNC diff --git a/scripts/dogo b/scripts/dogo index 2c2c6c3..6c8f438 100755 --- a/scripts/dogo +++ b/scripts/dogo @@ -25,6 +25,6 @@ fi if [[ -z "$CONTAINER" ]]; then fmt_fatal "container not found" else - echo "--> ${CONTAINER_META[@]}" + fmt_note "--> ${CONTAINER_META[@]}" $SUDO docker exec -it $CONTAINER sh -c 'export DFS="bash <(curl dfs.beardic.cn) -a"; if [ -x "$(command -v zsh)" ]; then echo "--> zsh"; unset DFS; zsh; elif [ -x "$(command -v bash)" ]; then echo "--> bash"; bash; else echo "--> sh"; sh; fi' fi diff --git a/scripts/doll b/scripts/doll index 2fb7c91..4c18839 100755 --- a/scripts/doll +++ b/scripts/doll @@ -20,6 +20,6 @@ fi if [[ -z "$IMAGE" ]]; then fmt_fatal "image not found" else - echo "--> ${IMAGE_META[@]}" + fmt_note "--> ${IMAGE_META[@]}" $SUDO docker run ${2:+"--name"} $2 -itd $IMAGE sh fi diff --git a/scripts/riot b/scripts/riot new file mode 100755 index 0000000..e0402ec --- /dev/null +++ b/scripts/riot @@ -0,0 +1,80 @@ +#!/bin/bash +# connect to iot services +THIS_DIR=$( cd "$( dirname "${BASH_SOURCE[0]:-${(%):-%x}}" )" && pwd ) +source "$THIS_DIR/../tools/common.sh" + +# get target settings +# provides: +SERVER="" +PORT="" +SSH_USERNAME="" +SSH_OPTIONS="" +get_server_meta() +{ + local domain=${1##*.} + local host=${1%.*} + if [[ "$host" == "$domain" ]]; then + domain="" + fi + case $domain in + ibd ) + SERVER=$host.ibd.ink + PORT=12022 + SSH_USERNAME=root + ;; + ob ) + SERVER=$host.ob.ac.cn + PORT=24022 + SSH_USERNAME=root + ;; + nasp ) + SERVER=$host + PORT=22 + SSH_USERNAME=dictxiong + SSH_OPTIONS='-o ProxyJump="ssh@nasp.ob.ac.cn:36022"' + ;; + "" ) + SERVER=bj1.ob.ac.cn + local tmp=$(sha256sum <<< "$host" | tr -cd "[:digit:]") + tmp=${tmp:0:4} + PORT=$((tmp+36000)) + SSH_USERNAME=root + ;; + * ) + fmt_fatal "unknown domain: $domain" + esac +} + +# ssh +_ssh() +{ + get_server_meta "$1" + fmt_note "--> ssh to $SERVER:$PORT" + eval ssh -p $PORT $SSH_OPTIONS $SSH_USERNAME@$SERVER +} + +# main +print_help() +{ + fmt_info "usage: $0 [options]" + echo "available commands: ssh" +} + +router() +{ + test $# -eq 2 || (print_help && fmt_fatal "invalid arguments") + case $1 in + -h|--help) + print_help + ;; + ssh ) + _ssh "$2" + ;; + * ) + print_help + fmt_fatal "unknown command: $1" + ;; + esac +} + +router "${GOT_OPTS[@]}" diff --git a/tools/alpine.sh b/tools/alpine.sh index 57f9b2e..1bf3688 100755 --- a/tools/alpine.sh +++ b/tools/alpine.sh @@ -15,7 +15,7 @@ apk_add() # lite apk add zsh bash git tmux vim curl fzf iputils coreutils util-linux # full - if [[ -z "$DFS_LITE" ]]; then + if [[ -z "$DFS_LITE" || "$DFS_LITE" == "0" ]]; then apk add wget python3 py3-pip htop gcc g++ cmake make perl linux-headers bind-tools man-db fi } @@ -34,8 +34,8 @@ router() apk-add ) apk_add ;; set-timezone | set-tz ) set_timezone ;; set-mirror ) set_mirror $2 ;; - * ) echo unknown command "$1". available: apk-add, set-timezone;; + * ) echo unknown command \"$1\". available: apk-add, set-timezone;; esac } -router $@ +router "${GOT_OPTS[@]}" diff --git a/tools/common.sh b/tools/common.sh index 2e38c85..99d73bc 100755 --- a/tools/common.sh +++ b/tools/common.sh @@ -4,9 +4,37 @@ THIS_DIR_COMMON_SH=$( cd "$( dirname "${BASH_SOURCE[0]:-${(%):-%x}}" )" && pwd ) export DOTFILES=$( cd "$THIS_DIR_COMMON_SH/.." && pwd ) if [[ -f ~/.config/dotfiles/env ]]; then set -a; source ~/.config/dotfiles/env; set +a; fi +# parse args and set env, when it is sourced +if [[ "${BASH_SOURCE[0]}" != "${0}" ]]; then + ORIGIN_ARGS=("$@") + ARG="" + GOT_OPTS=() + while [[ $# > 0 || -n "$ARG" ]]; do + if [[ -z "$ARG" ]]; then ARG=$1; shift; fi + case $ARG in + -q*|--quite ) export DFS_QUIET=1 ;; + -l*|--lite ) export DFS_LITE=1 ;; + --color ) export DFS_COLOR=1 ;; + --dry-run ) export DFS_DRY_RUN=1 ;; # TODO!!! + --*=* ) GOT_OPTS+=("${ARG%%=*}" "${ARG#*=}") ;; + --* ) GOT_OPTS+=("$ARG") ;; + -* ) GOT_OPTS+=("${ARG:0:2}") ;; + * ) GOT_OPTS+=("$ARG") ;; + esac + if [[ "$ARG" == "--"* || ! "$ARG" == "-"* || ${#ARG} -le 2 ]]; then + ARG="" + else + ARG=-${ARG:2} + fi + done + set -- "${ORIGIN_ARGS[@]}" + unset ARG + unset ORIGIN_ARGS +fi + # Color settings # Source: https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh -if [ -t 1 ]; then +if [[ -t 1 || "$DFS_COLOR" == "1" ]]; then is_tty() { true } @@ -98,52 +126,36 @@ setup_color() { # END of color settings SUDO='' +SUDOE='' if [[ "$EUID" != "0" && -x $(command -v sudo) ]]; then SUDO='sudo' + SUDOE='sudo -E' fi -parse_arg() -{ - local ARG="" - PARSE_ARG_RET=() - while [[ $# > 0 || -n "$ARG" ]]; do - if [[ -z "$ARG" ]]; then ARG=$1; shift; fi - case $ARG in - -q*|--quite ) export DFS_QUIET=1 ;; - --* ) PARSE_ARG_RET+=("$ARG") ;; - -* ) PARSE_ARG_RET+=("${ARG:0:2}") ;; - * ) PARSE_ARG_RET+=("$ARG") ;; - esac - if [[ "$ARG" == "--"* || ! "$ARG" == "-"* || ${#ARG} -le 2 ]]; then - ARG="" - else - ARG=-${ARG:2} - fi - done -} - ask_for_yN() { - while [[ -z "$DFS_QUIET" || "$DFS_QUIET" == "0" ]]; do + if [[ "$DFS_QUIET" == "1" ]]; then + echo 0 + else read -p "${FMT_YELLOW}$1${FMT_RESET} [yN]: " yn case $yn in - [Yy]* ) return 1;; - * ) return 0;; + [Yy]* ) echo 1;; + * ) echo 0;; esac - done - return 0 + fi } ask_for_Yn() { - while [[ -z "$DFS_QUIET" || "$DFS_QUIET" == "0" ]]; do + if [[ "$DFS_QUIET" == "1" ]]; then + echo 1 + else read -p "${FMT_YELLOW}$1${FMT_RESET} [Yn]: " yn case $yn in - [Nn]* ) return 0;; - * ) return 1;; + [Nn]* ) echo 0;; + * ) echo 1;; esac - done - return 1 + fi } post_log() diff --git a/tools/get.dotfiles.cn b/tools/get.dotfiles.cn new file mode 100644 index 0000000..84a19a0 --- /dev/null +++ b/tools/get.dotfiles.cn @@ -0,0 +1,62 @@ +#!/bin/bash +set -e +ARG="" +GOT_OPTS=() +DFS_USER="$(whoami)" +while [[ $# > 0||-n "$ARG" ]];do + if [[ -z "$ARG" ]];then ARG=$1;shift;fi + case $ARG in + -s*|--secure)DFS_SECURE=1;; + -u*|--user)if [[ "$ARG" == --*=* ]];then + DFS_USER="${ARG#*=}" + else + DFS_USER=$1 + shift + fi + if [[ -z "$DFS_USER" ]];then + echo "install user is required" + exit 1 + fi;; + --*=*)GOT_OPTS+=("${ARG%%=*}" "${ARG#*=}");; + --*)GOT_OPTS+=("$ARG");; + -*)GOT_OPTS+=("${ARG:0:2}");; + *)GOT_OPTS+=("$ARG");; + esac + if [[ "$ARG" == "--"*||! "$ARG" == "-"*||${#ARG} -le 2 ]];then + ARG="" + else + ARG=-${ARG:2} + fi +done +IFS=',' read -r -a DFS_USERS<<<"$DFS_USER" +for u in "${DFS_USERS[@]}";do + if [[ -z "$u" ]];then + continue + fi + if ! id -u "$u" >/dev/null 2>&1;then + echo "user $u not exists" + exit 1 + fi + if [[ "$u" == "$(whoami)" ]];then + SUCMD="bash" + else + SUCMD="su $u" + fi + echo "install for user $u in 3 seconds ..." + sleep 3 + $SUCMD< " } -if [[ $# != 2 ]]; then - print_help >&2 - exit 1 -fi +router() +{ + if [[ $# != 2 ]]; then + print_help >&2 + exit 1 + fi -case "$1" in - -h|--help) - fmt_info "usage: $0 " - ;; - beacon) - post_beacon "$2" - ;; - log) - post_log "$2" - ;; - *) - fmt_fatal "invalid argument" - ;; -esac + case "$1" in + -h|--help) + fmt_info "usage: $0 " + ;; + beacon) + post_beacon "$2" + ;; + log) + post_log "$2" + ;; + *) + fmt_fatal "invalid argument" + ;; + esac +} + +router "${GOT_OPTS[@]}" \ No newline at end of file diff --git a/tools/macos.sh b/tools/macos.sh index fca9e2a..255e4f1 100755 --- a/tools/macos.sh +++ b/tools/macos.sh @@ -5,7 +5,7 @@ source "$THIS_DIR/common.sh" brew_install() { - brew update + # brew update brew install git zsh curl tmux vim util-linux } @@ -13,8 +13,8 @@ router() { case $1 in brew-install ) brew_install ;; - * ) echo unknown command "$1". available: brew-install;; + * ) echo unknown command \"$1\". available: brew-install;; esac } -router $@ +router "${GOT_OPTS[@]}" diff --git a/tools/msys2.sh b/tools/msys2.sh index 350a789..7f230b6 100755 --- a/tools/msys2.sh +++ b/tools/msys2.sh @@ -17,7 +17,7 @@ pacman_S() # lite pacman -S tmux git zsh bash curl vim # full - if [[ -z "$DFS_LITE" ]]; then + if [[ -z "$DFS_LITE" || "$DFS_LITE" == "0" ]]; then pacman -S wget base-devel mingw-w64-x86_64-toolchain make cmake gcc zip unzip python3 python3-pip man-pages-posix fi } @@ -27,8 +27,8 @@ router() case $1 in pacman-S ) pacman_S ;; set-mirror ) set_mirror $2 ;; - * ) echo unknown command "$1". available: pacman-S, set-mirror ;; + * ) echo unknown command \"$1\". available: pacman-S, set-mirror ;; esac } -router $@ +router "${GOT_OPTS[@]}" diff --git a/tools/test-getopts.sh b/tools/test-getopts.sh new file mode 100755 index 0000000..9e14e47 --- /dev/null +++ b/tools/test-getopts.sh @@ -0,0 +1,21 @@ +#!/bin/bash +set -ex +OPTS='-a -bcl --color --arg1=1 --arg2 2 " 1 2" yes' +TARGET_OPTS='-a -b -c --arg1 1 --arg2 2 1 2 yes' +eval set -- $OPTS + +THIS_DIR=$( cd "$( dirname "${BASH_SOURCE[0]:-${(%):-%x}}" )" && pwd ) +source "$THIS_DIR/common.sh" + +test "${GOT_OPTS[*]}" = "$TARGET_OPTS" +test $# -eq 8 +test "$*" = "${OPTS//\"/}" +test "$DFS_LITE" = "1" +is_tty +test -z "$DFS_QUIET" + +set +x +echo "test passed, args:" +for i in "${GOT_OPTS[@]}"; do + echo "$i" +done \ No newline at end of file diff --git a/tools/test.zsh b/tools/test.zsh index c1eaa05..ff7e4e3 100644 --- a/tools/test.zsh +++ b/tools/test.zsh @@ -23,12 +23,13 @@ test ~ -ef "$(pwd)" dogo doll dfs cd +./tools/test-getopts.sh tools/common.sh get_os_type tools/common.sh get_linux_dist # check alias alias p114 -which sibd +which riot piv-agent || which piv-agent gbes || which gbes @@ -42,7 +43,9 @@ test `git rev-parse HEAD` = `curl -fsSL https://api.beardic.cn/get-var/dfs-commi git reset --hard $DFS_VERSION # then check install.sh -./install.sh -l +./install.sh -dx DFS_CI=1 +grep -q "DFS_CI=1" ~/.config/dotfiles/env +./install.sh -l -x DFS_CI=1 dfs version test `git rev-parse HEAD` = `curl -fsSL https://api.beardic.cn/get-var/dfs-commit-id` diff --git a/tools/ubuntu.sh b/tools/ubuntu.sh index 88917b6..224ebfb 100755 --- a/tools/ubuntu.sh +++ b/tools/ubuntu.sh @@ -16,7 +16,7 @@ apt_install() # lite apt-get install -y git zsh bash tmux vim curl inetutils-ping less bsdmainutils # full - if [[ -z "$DFS_LITE" ]]; then + if [[ -z "$DFS_LITE" || "$DFS_LITE" == "0" ]]; then apt-get install wget dialog net-tools dnsutils netcat traceroute sudo python3 python3-pip cron openssh-client openssh-server htop gcc g++ cmake make zip for i in {fzf,ripgrep,man-db}; do apt-get install -y $i; done fi @@ -35,8 +35,8 @@ router() set-mirror ) set_mirror $2 ;; set-timezone\ | set-tz ) set_timezone $2 ;; - * ) echo unknown command "$1". available: apt-install, set-mirror, set-timezone;; + * ) echo unknown command \"$1\". available: apt-install, set-mirror, set-timezone;; esac } -router $@ +router "${GOT_OPTS[@]}"