initial commit

This commit is contained in:
a-Sansara 2019-03-02 02:23:24 +01:00
commit 18b03c00f2
4 changed files with 306 additions and 0 deletions

91
README.md Normal file
View File

@ -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
```

10
bes.ini Normal file
View File

@ -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"

39
src/main.sh.tpl Normal file
View File

@ -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 $*

166
src/service.sh Normal file
View File

@ -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