随笔-开发-将安装脚本和安装文件打包成一个文件

发布时间 2023-12-23 12:03:51作者: LiYanbin

需要在服务器安装一些工具,除了安装脚本还需要安装文件,可以打包成一个文件方便管理

示例:

.
├── makefile
└── pushgateway
    ├── gtw_install.sh
    └── pushgateway-1.4.3.linux-amd64.tar.gz

makefile:

PRJ_ROOTDIR=$(shell pwd;)
UINST_FILE_NAME=pushgateway-install
PUSHGATEWAY_SRC=pushgateway-1.4.3.linux-amd64.tar.gz

$(info PRJ_ROOTDIR : ${PRJ_ROOTDIR})

all:
	# 新建output
	mkdir -p $(PRJ_ROOTDIR)/output
	# 拷贝文件
	cp -af -r $(PRJ_ROOTDIR)/pushgateway/* $(PRJ_ROOTDIR)/output/
	# 压缩成一个可执行文件
	cd $(PRJ_ROOTDIR)/output/ && cp gtw_install.sh $(UINST_FILE_NAME) && cat $(PUSHGATEWAY_SRC) >> $(UINST_FILE_NAME) && rm -rf gtw_install.sh $(PUSHGATEWAY_SRC)
	echo "usage: 拷贝可执行文件到MCU, 执行./$(UINST_FILE_NAME) "

安装脚本(key:先把安装文件提取出来):

#!/bin/bash

# 安装包安装参数
EXEC_FILE_PATH=$(dirname $(realpath $0))
EXEC_FILE_NAME=$(basename $0)
USER_CONF_FILE=$1

#提取文件参数
ENDLINE=$(sed -n '/'"^#ENDTAG"'/=' $EXEC_FILE_NAME)
ENDLINE=`expr ${ENDLINE} + 1`

#压缩文件名
ARCHIVE_FILE=pushgtw.tgz
#解压ARCHIVE_FILE后的文件夹名
ARCHIVE_DIR=pushgateway-1.4.3.linux-amd64

# 安装路径
INST_TMP_PATH="/home/app/pushgtw"

function aio_log () {
    local lvl="DEBUG"
    local c="31"
    local date=`date +%F\ %T.%N`

    case "$1" in
        "err"|"error"|0)
            lvl="ERR"
            c="31m"
            ;;
        "info"|1)
            lvl="INFO"
            c="32m"
            ;;
        "syslog")
            lvl="INFO"
            c="32m"
            ;;
        "debug"|3|*)
            lvl="DEBUG"
            c="33m"
            ;;
    esac

    # echo -e "\033[$c$date [$lvl] -- $2\033[0m"
    echo "$date [$lvl] -- $2"
}


function install_prepare() {
	#创建目录
	if [ ! -d ${INST_TMP_PATH} ]; then
		mkdir -p ${INST_TMP_PATH}
	fi

	#提取压缩文件
	tail -n +${ENDLINE} ${EXEC_FILE_PATH}/${EXEC_FILE_NAME} > ${INST_TMP_PATH}/${ARCHIVE_FILE}
	if [ ! -s "${INST_TMP_PATH}/${ARCHIVE_FILE}" ]; then
		aio_log error "dump ${ARCHIVE_FILE} filed! Terminating..."
		exit 1
	fi

	#解压压缩文件
	aio_log debug "extract install package to ${INST_TMP_PATH}/..."

	#先清除之前安装的旧文件
	# aio_log debug "clear previous install file($INST_TMP_PATH)..."
	# [ -d "${DOCKER_COMPOSE_REAL_DIR}.bak" ] && rm -rf ${DOCKER_COMPOSE_REAL_DIR}.bak

	aio_log debug "tar -zxvf ${ARCHIVE_FILE} -C ${INST_TMP_PATH}/..."
	tar -zxvf ${INST_TMP_PATH}/${ARCHIVE_FILE} -C ${INST_TMP_PATH}/
	if [ $? != 0 ]; then
		aio_log error "extract ${ARCHIVE_FILE} filed! Terminating..."
		exit 1
	fi
}

function install_pushgtw()
{
    [[ ! -e "${INST_TMP_PATH}/${ARCHIVE_DIR}/pushgateway" ]] && {
        aio_log error "pushgateway binary file no exist"
        exit 1
    }

    cp ${INST_TMP_PATH}/${ARCHIVE_DIR}/pushgateway /usr/local/bin/
    chmod +x /usr/local/bin/pushgateway

    cat <<- _EOF_ > /etc/systemd/system/pushgateway.service
	[Unit]
	Description=Pushgateway
	Wants=network-online.target
	After=network-online.target

	[Service]
	Type=simple
	ExecStart=/usr/local/bin/pushgateway
	Restart=always
	RestartSec=5
	StartLimitInterval=0

	[Install]
	WantedBy=multi-user.target
_EOF_

	systemctl daemon-reload
	systemctl start pushgateway
	systemctl status pushgateway
}

# 提取压缩文件并解压到INST_TMP_PATH
install_prepare

# 安装
install_pushgtw
exit 0

#ENDTAG