commit 18b03c00f232b85f0d45629ec22945558cd910c2 Author: a-Sansara Date: Sat Mar 2 02:23:24 2019 +0100 initial commit diff --git a/README.md b/README.md new file mode 100644 index 0000000..d814a46 --- /dev/null +++ b/README.md @@ -0,0 +1,91 @@ +bes-service +======== + +bes-service is a small bash bes library to easily create systemd service. + +### Usage + +add bes-service as dependency in bes.ini file of your project. + +``` +[require] +bes.service = 1.0 +``` + +create your service following 'src/main.sh.tpl' template. +edit for example 'src/main.sh' in your bes project ('myservice' in this example) : + +``` +#!/bin/bash +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# +# @author you - url repo +# @license licence +# @date 2017-07-07 02:21:51 CET +# +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + BES_SERVICE_NAME="myservice" +BES_SERVICE_LOGGER="myservice.type1" + BES_SERVICE_DELAY=10 + BES_SERVICE_BOOT=1 + +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# optional - service is started, do before running +function service.on.init() +{ + service.log " >< service.on.init" +} + +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# optional - service is stopped, do before exiting +function service.clean() +{ + service.log " >< service.clean" +} + +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# your main service function +# oneshot if $BES_SERVICE_DELAY equal 0 +# or repeat each $BES_SERVICE_DELAY seconds otherwise +function service.on.run() +{ + # do stuff + service.log " >< do important things, every $BES_SERVICE_DELAY seconds" +} + +service.launch $* +``` + +install bes dependencies : + +``` +bes-build update +``` + +build your project : + +``` +bes-build +``` + +then you call install your service with : + +``` +./dist/myservice install +``` + +and start/stop your service like others in systemd + +``` +service myservice start # stop | restart +# or +systemctl start myservice +``` + +inspect service log : + +``` +tail -f /var/log/myservice.log +``` + + diff --git a/bes.ini b/bes.ini new file mode 100644 index 0000000..56014e2 --- /dev/null +++ b/bes.ini @@ -0,0 +1,10 @@ +[project] +vendor = bes +name = service +version = 1.0 +license = "GNU GPL v3" +author = a-Sansara +type = library +homepage = "https://git.pluie.org/meta-tech/bes-service" +description = "bash bes systemd service utility library" +keywords = "bash, bes, service, systemd" diff --git a/src/main.sh.tpl b/src/main.sh.tpl new file mode 100644 index 0000000..f2280cd --- /dev/null +++ b/src/main.sh.tpl @@ -0,0 +1,39 @@ +#!/bin/bash +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# +# @author you - url repo +# @license licence +# @date 2017-07-07 02:21:51 CET +# +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + BES_SERVICE_NAME="myservice" +BES_SERVICE_LOGGER="myservice.type1" + BES_SERVICE_DELAY=10 + BES_SERVICE_BOOT=1 + +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# optional - service is started, do before running +function service.on.init() +{ + service.log " >< service.on.init" +} + +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# optional - service is stopped, do before exiting +function service.clean() +{ + service.log " >< service.clean" +} + +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# your main service function +# oneshot if $BES_SERVICE_DELAY equal 0 +# or repeat each $BES_SERVICE_DELAY seconds otherwise +function service.on.run() +{ + # do stuff + service.log " >< do important things, every $BES_SERVICE_DELAY seconds" +} + +service.launch $* + diff --git a/src/service.sh b/src/service.sh new file mode 100644 index 0000000..9cdf64e --- /dev/null +++ b/src/service.sh @@ -0,0 +1,166 @@ +#!/bin/bash +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# +# @author a-Sansara - https://git.pluie.org/meta-tech/bes-service +# @app bes-config +# @license GNU GPL v3 +# @date 2019-02-26 13:24:55 CET +# +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +function bes.service.boot () +{ + BES_SERVICE_NAME="yourservice" + BES_SERVICE_LOGGER="channel1" + BES_SERVICE_DELAY=0 + BES_SERVICE_BOOT=0 +} +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +function service.time() +{ + date +'%Y-%m-%d %H:%M:%S' +} +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +function service.log() +{ + local dt=$(service.time) + local msg="${1:-}" + local display="${2:-0}" + if [ "$display" = "1" ]; then + echo "[$dt] $msg"; + fi + echo "[$dt] $BES_SERVICE_LOGGER $msg" >> "$BES_SERVICE_LOG" +} +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +function service.init() +{ + service.log " > init()" + if [ ! -d "$BES_SERVICE_RUN_DIR" ]; then + mkdir -p "$BES_SERVICE_RUN_DIR" + fi + if bes.exists "service.on.init"; then + service.on.init + fi + service.log " < init()" +} +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +function service.isalive() +{ + if [ -z "$1" ]; then + return 1 + elif [ "$1" -gt 0 ]; then + ps -p $1 &> /dev/null + fi +} +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +function service.pid() +{ + if [ -z "$1" ]; then + cat "$BES_SERVICE_RUN_DIR/$BES_SERVICE_NAME.pid" + elif [ "$1" -gt 0 ]; then + echo $1 > "$BES_SERVICE_RUN_DIR/$BES_SERVICE_NAME.pid" + fi +} +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +function service.start() +{ + local pid=$(service.pid) + if service.isalive $pid; then + service.log "already started"; + else + service.init + service.log " > starting... ($$)" + service.pid $$ + service.run + fi +} +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +function service.stop() +{ + local pid=$(service.pid) + if service.isalive $pid; then + service.log "stopping... ($pid)"; + kill -9 $pid + if bes.exists "service.clean"; then + service.clean + fi + else + service.log "already stopped"; + fi +} +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +function service.run() +{ + if bes.exists "service.on.run"; then + if [ "$BES_SERVICE_DELAY" -eq 0 ]; then + service.on.run + elif [ "$BES_SERVICE_DELAY" -gt 0 ]; then + while true; do + sleep $BES_SERVICE_DELAY + service.on.run + done + fi + fi +} +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +function service.install() +{ + local dir=$(dirname "${BASH_SOURCE[0]}") + if [ -f "$dir/$BES_SERVICE_NAME" ]; then + sudo cp "$dir/$BES_SERVICE_NAME" /usr/sbin/ + if [ ! -f "$dir/$BES_SERVICE_NAME.service" ]; then + echo "[Unit] +Description=$1 +ConditionPathExists=/usr/sbin/$BES_SERVICE_NAME +After=network.target + +[Service] +ExecStart=/usr/sbin/$BES_SERVICE_NAME start +ExecStop=/usr/sbin/$BES_SERVICE_NAME stop +# Restart=always + +[Install] +WantedBy=multi-user.target + " | sudo tee -a "$dir/$BES_SERVICE_NAME.service" + fi + sudo cp "$dir/$BES_SERVICE_NAME.service" "/etc/systemd/system/$BES_SERVICE_NAME.service" + sudo systemctl --system daemon-reload + if [ "$BES_SERVICE_BOOT" = 1 ]; then + echo " enable service at boot time" + sudo systemctl enable "$BES_SERVICE_NAME" + fi + echo "service $BES_SERVICE_NAME is installed" + else + echo " ! service file : '$dir/$BES_SERVICE_NAME' not found" + echo " install aborted" + exit 1 + fi +} +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +function service.launch() +{ + export BES_SERVICE_LOG="/var/log/$BES_SERVICE_NAME.log" + export BES_SERVICE_RUN_DIR="/run/$BES_SERVICE_NAME" + case "$1" in + install) + service.install "$2" + ;; + start) + service.start + ;; + stop) + service.stop + ;; + restart) + service.stop + service.start + ;; + *) + echo "Usage: $0 {start|stop|restart}" + esac +} +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +declare -f bes.reg > /dev/null +if [ $? -eq 0 ]; then + bes.reg bes.service +fi +