be selective about which files are modified when copied into a weewx-data area. eliminate antiquated init scripts. parameterize systemd units for precise pattern match. use consistent names for system integration scripts.

This commit is contained in:
Matthew Wall
2023-12-23 12:53:25 -05:00
parent 5353b52d45
commit 33f18e804d
14 changed files with 258 additions and 849 deletions

View File

@@ -569,59 +569,73 @@ def copy_user(config_dict, user_root=None, dry_run=False):
def copy_util(config_path, config_dict, dry_run=False, force=False):
import weewxd
weewxd_path = weewxd.__file__
cfg_dir = os.path.dirname(config_path)
username = getpass.getuser()
groupname = grp.getgrgid(os.getgid()).gr_name
weewx_root = config_dict['WEEWX_ROOT']
# This is the set of substitutions to be performed. The key is a regular expression. If a
# match is found, the value will be substituted for the matched expression.
re_dict = {
# For systemd
r"^#User=.*": rf"User={username}",
# For systemd
r"^#Group=.*": rf"Group={groupname}",
# For systemd
r"^ExecStart=.*": rf"ExecStart={sys.executable} {weewxd_path} {config_path}",
# For init.d, redhat, bsd, suse
r"^WEEWX_BIN=.*": rf"WEEWX_BIN={sys.executable} {weewxd_path}",
# For init.d, redhat, bsd, suse
r"^WEEWX_CFG=.*": rf"WEEWX_CFG={config_path}",
# For init.d
r"^WEEWX_USER=.*": rf"WEEWX_USER={groupname}",
# For multi
r"^WEEWX_BINDIR=.*": rf"WEEWX_BINDIR={os.path.dirname(weewxd_path)}",
# For multi
r"^WEEWX_CFGDIR=.*": rf"WEEWX_CFGDIR={os.path.dirname(config_path)}",
# for macOS:
r"<string>/usr/bin/python3</string>": rf"<string>{sys.executable}<//string>",
# For macOS:
r"<string>/Users/Shared/weewx/src/weewxd.py</string>": rf"<string>{weewxd_path}</string>",
# For macOS:
r"<string>/Users/Shared/weewx/weewx.conf</string>": rf"<string>{config_path}</string>",
# For Apache
r"/home/weewx/public_html": rf"{os.path.join(weewx_root, 'public_html')}",
# For scripts
r"^UTIL_ROOT=.*": rf"UTIL_ROOT={os.path.join(weewx_root, 'util')}",
html_dir = os.path.join(weewx_root, 'public_html') # FIXME: get from conf
util_dir = os.path.join(weewx_root, 'util')
bin_dir = os.path.dirname(weewxd_path)
# This is the set of substitutions to be performed, with a different set
# for each type of files. The key is a regular expression. If a match is
# found, the value will be substituted for the matched expression. Beware
# that the labels for user, group, config directory, and other parameters
# are consistent throughout the utility files. Be sure to test the
# patterns by using them to grep all of the files in the util directory to
# see what actually matches.
re_patterns = {
'scripts': { # daemon install scripts
r"^UTIL_ROOT=.*": rf"UTIL_ROOT={util_dir}",
},
'systemd': { # systemd unit files
r"User=WEEWX_USER": rf"User={username}",
r"Group=WEEWX_GROUP": rf"Group={groupname}",
r"ExecStart=WEEWX_PYTHON WEEWXD": rf"ExecStart={sys.executable} {weewxd_path}",
r" WEEWX_CFGDIR/": rf" {cfg_dir}/",
},
'launchd': { # macos launchd files
r"<string>/usr/bin/python3</string>": rf"<string>{sys.executable}<//string>",
r"<string>/Users/Shared/weewx/src/weewxd.py</string>": rf"<string>{weewxd_path}</string>",
r"<string>/Users/Shared/weewx/weewx.conf</string>": rf"<string>{config_path}</string>",
},
'default': { # defaults file used by SysV init scripts
r"^WEEWX_PYTHON=.*": rf"WEEWX_PYTHON={sys.executable}",
r"^WEEWX_BINDIR=.*": rf"WEEWX_BINDIR={bin_dir}",
r"^WEEWX_CFGDIR=.*": rf"WEEWX_CFGDIR={cfg_dir}",
r"^WEEWX_USER=.*": rf"WEEWX_USER={username}",
r"^WEEWX_GROUP=.*": rf"WEEWX_GROUP={groupname}",
},
}
# Convert to a list of two-way tuples.
re_list = [(re.compile(key), re_dict[key]) for key in re_dict]
# Convert the patterns to a list of two-way tuples
for k in re_patterns:
re_patterns[k] = [(re.compile(key), re_patterns[k][key]) for key in re_patterns[k]],
def _patch_file(srcpath, dstpath):
"""Copy an individual file from srcpath to dstpath, while making substitutions
using the list of regular expressions re_list"""
with open(srcpath, 'r') as rd, open(dstpath, 'w') as wd:
for line in rd:
# Lines starting with "#&" are comment lines. Ignore them.
if line.startswith("#&"):
continue
# Go through all the regular expressions, substituting the value for the key
for key, value in re_list:
line = key.sub(value, line)
wd.write(line)
srcdir = os.path.dirname(srcpath)
if srcdir in re_patterns:
# Copy an individual file from srcpath to dstpath, while making
# substitutions using the list of regular expressions re_list
re_list = re_patterns[srcdir]
with open(srcpath, 'r') as rd, open(dstpath, 'w') as wd:
for line in rd:
# Lines starting with "#&" are comment lines. Ignore them.
if line.startswith("#&"):
continue
# Go through all the regular expressions, substituting the
# value for the key
for key, value in re_list:
line = key.sub(value, line)
wd.write(line)
else:
# Just copy the file
shutil.copyfile(srcpath, dstpath)
# Create a callable using the shutil.ignore_patterns factory function.
_ignore_function = shutil.ignore_patterns('*.pyc', '__pycache__', 'apache', 'default', 'i18n',
'init.d', 'logwatch', 'newsyslog.d',
'solaris', 'tmpfiles.d')
# The files/directories that match items in this list will *not* be copied.
_ignore_function = shutil.ignore_patterns('*.pyc', '__pycache__')
util_dir = os.path.join(weewx_root, 'util')
if os.path.isdir(util_dir):
@@ -636,18 +650,18 @@ def copy_util(config_path, config_dict, dry_run=False, force=False):
with weeutil.weeutil.get_resource_path('weewx_data', 'util') as util_resources:
print(f"Copying utility files into {util_dir}")
if not dry_run:
# Copy the tree rooted in 'util_resources' to 'dstdir', while ignoring files given
# by _ignore_function. While copying, use the function _patch_file() to massage
# the files.
# Copy the tree rooted in 'util_resources' to 'dstdir', while
# ignoring files given by _ignore_function. While copying, use the
# function _patch_file() to massage the files.
shutil.copytree(util_resources, util_dir,
ignore=_ignore_function,
copy_function=_patch_file)
ignore=_ignore_function, copy_function=_patch_file)
scripts_dir = os.path.join(weewx_root, 'scripts')
# The 'scripts' subdirectory is a little different. We don't delete it first, because it's a
# comman name and a user might have put things there. Instead, just copy our files into it.
# First, make sure the subdirectory exists:
# The 'scripts' subdirectory is a little different. We do not delete it
# first, because it's a comman name and a user might have put things there.
# Instead, just copy our files into it. First, make sure the subdirectory
# exists:
os.makedirs(scripts_dir, exist_ok=True)
# Then do the copying.
with weeutil.weeutil.get_resource_path('weewx_data', 'scripts') as scripts_resources:
@@ -658,8 +672,9 @@ def copy_util(config_path, config_dict, dry_run=False, force=False):
abs_dst = os.path.join(scripts_dir, file)
_patch_file(abs_src, abs_dst)
status = os.stat(abs_dst)
# Because these files have been tailored to a particular user, they hould only
# be executable by that user. So, use S_IXUSR (instead of S_IXOTH):
# Because these files have been tailored to a particular user,
# they hould only be executable by that user. So, use S_IXUSR
# (instead of S_IXOTH):
os.chmod(abs_dst, status.st_mode | stat.S_IXUSR)
return util_dir

View File

@@ -1,7 +1,6 @@
#!/bin/sh
#
# Copy configurations that integrate WeeWX into a macOS system.
#
# Install files that integrate WeeWX into a macOS system.
# This script must be run as a privileged user.
#
set -e
@@ -13,9 +12,31 @@ if [ "$(id -u)" != "0" ]; then
exit 1
fi
if [ ! -d /Library/LaunchDaemons ]; then
echo "Apparently this system does not use launchd"
exit 1
fi
ts=`date +"%Y%m%d%H%M%S"`
copy_file() {
src=$1
dst=$2
if [ -f "$dst" ]; then
mv ${dst} ${dst}.${ts}
fi
cp $src $dst
}
remove_file() {
dst=$1
if [ -f "$dst" ]; then
rm $dst
fi
}
do_install() {
echo "This script sets up the files necessary to run WeeWX at system startup."
echo "On some systems, it can be slow to run. Please be patient."
echo "Set up the files necessary to run WeeWX at system startup."
if [ ! -d $UTIL_ROOT ]; then
echo "Cannot find utility files at location '$UTIL_ROOT'"
@@ -24,7 +45,7 @@ do_install() {
echo "Copying files from $UTIL_ROOT..."
echo " plist"
cp $UTIL_ROOT/launchd/com.weewx.weewxd.plist /Library/LaunchDaemons
copy_file $UTIL_ROOT/launchd/com.weewx.weewxd.plist /Library/LaunchDaemons
echo "You can now start weewx with the following command:"
echo " '\033[1msudo launchctl load /Library/LaunchDaemons/com.weewx.weewxd.plist\033[0m'"
@@ -35,9 +56,7 @@ do_uninstall() {
launchctl unload /Library/LaunchDaemons/com.weewx.weewxd.plist
echo "Removing files..."
echo " plist"
if [ -f /Library/LaunchDaemons/com.weewx.weewxd.plist ]; then
rm /Library/LaunchDaemons/com.weewx.weewxd.plist
fi
remove_file /Library/LaunchDaemons/com.weewx.weewxd.plist
}

View File

@@ -1,9 +1,6 @@
#!/bin/sh
#
# Copy configuration files that integrate WeeWX into a Linux system that uses
# systemd. These include udev rules for known devices, and the service unit
# files to facilitate starting/stopping WeeWX.
#
# Install files that integrate WeeWX into a Linux system that uses systemd.
# This script must be run using sudo, or as root.
#
set -e
@@ -15,9 +12,32 @@ if [ "$(id -u)" != "0" ]; then
exit 1
fi
if [ ! -d /etc/systemd/system ]; then
echo "Apparently this system does not use systemd"
exit 1
fi
ts=`date +"%Y%m%d%H%M%S"`
copy_file() {
src=$1
dst=$2
if [ -f "$dst" ]; then
mv ${dst} ${dst}.${ts}
fi
cp $src $dst
}
remove_file() {
dst=$1
if [ -f "$dst" ]; then
rm $dst
fi
}
do_install() {
echo "This script sets up the files necessary to run WeeWX at system startup."
echo "On some systems, it can be slow to run. Please be patient."
echo "Set up the files necessary to run WeeWX at system startup."
echo "On some systems, this may take awhile. Please be patient."
if [ ! -d $UTIL_ROOT ]; then
echo "Cannot find utility files at location '$UTIL_ROOT'"
@@ -27,23 +47,20 @@ do_install() {
echo "Copying files from $UTIL_ROOT..."
if [ -d /etc/udev/rules.d ]; then
echo " udev rules"
cp $UTIL_ROOT/udev/rules.d/weewx.rules /etc/udev/rules.d/60-weewx.rules
fi
if [ -d /etc/systemd/system ]; then
echo " systemd unit"
cp $UTIL_ROOT/systemd/weewx.service /etc/systemd/system
cp $UTIL_ROOT/systemd/weewx@.service /etc/systemd/system
copy_file $UTIL_ROOT/udev/rules.d/weewx.rules /etc/udev/rules.d/60-weewx.rules
echo " If you are using a device that is connected to the computer by USB or"
echo " serial port, unplug the device then plug it back in again to ensure that"
echo " permissions are applied correctly."
fi
echo " systemd unit"
copy_file $UTIL_ROOT/systemd/weewx.service /etc/systemd/system/weewx.service
copy_file $UTIL_ROOT/systemd/weewx@.service /etc/systemd/system/weewx@.service
echo "Reloading systemd..."
systemctl daemon-reload
echo "Enabling weewx..."
systemctl enable weewx
echo "If you are using a device that is connected to the computer by USB or"
echo "serial port, unplug the device then plug it back in again to ensure that"
echo "permissions are applied correctly."
echo ""
echo "You can start weewx with the following command:"
echo " '\033[1msudo systemctl start weewx\033[0m'"
}
@@ -54,18 +71,12 @@ do_uninstall() {
echo "Disabling weewx..."
systemctl disable weewx
echo "Removing files..."
if [ -f /etc/systemd/system/weewx.service ]; then
echo " systemd unit"
rm /etc/systemd/system/weewx.service
fi
if [ -f /etc/systemd/system/weewx@.service ]; then
echo " systemd unit template"
rm /etc/systemd/system/weewx@.service
fi
if [ -f /etc/udev/rules.d/60-weewx.rules ]; then
echo " udev rules"
rm /etc/udev/rules.d/60-weewx.rules
fi
echo " systemd unit"
remove_file /etc/systemd/system/weewx.service
echo " systemd unit template"
remove_file /etc/systemd/system/weewx@.service
echo " udev rules"
remove_file /etc/udev/rules.d/60-weewx.rules
}
ACTION=$1

66
src/weewx_data/scripts/setup-daemon.sysv Normal file → Executable file
View File

@@ -1,9 +1,6 @@
#!/bin/sh
#
# Copy configuration files that integrate WeeWX into a Linux system that uses
# sysV init. These udev rules for known devices, and the init script to
# facilitate starting/stopping WeeWX.
#
# Install files that integrate WeeWX into a Linux system that uses sysV init.
# This script must be run using sudo, or as root.
#
set -e
@@ -15,9 +12,31 @@ if [ "$(id -u)" != "0" ]; then
exit 1
fi
if [ ! -d /etc/init.d ]; then
echo "Apparently this system does not use SysV init"
exit 1
fi
ts=`date +"%Y%m%d%H%M%S"`
copy_file() {
src=$1
dst=$2
if [ -f "$dst" ]; then
mv ${dst} ${dst}.${ts}
fi
cp $src $dst
}
remove_file() {
dst=$1
if [ -f "$dst" ]; then
rm $dst
fi
}
do_install() {
echo "This script sets up the files necessary to run WeeWX at system startup."
echo "On some systems, it can be slow to run. Please be patient."
echo "Set up the files necessary to run WeeWX at system startup."
if [ ! -d $UTIL_ROOT ]; then
echo "Cannot find utility files at location '$UTIL_ROOT'"
@@ -27,21 +46,22 @@ do_install() {
echo "Copying files from $UTIL_ROOT..."
if [ -d /etc/udev/rules.d ]; then
echo " udev rules"
cp $UTIL_ROOT/udev/rules.d/weewx.rules /etc/udev/rules.d/60-weewx.rules
fi
if [ -d /etc/init.d ]; then
echo " init script"
cp $UTIL_ROOT/init.d/weewx-multi /etc/init.d/weewx
chmod 755 /etc/init.d/weewx
copy_file $UTIL_ROOT/udev/rules.d/weewx.rules /etc/udev/rules.d/60-weewx.rules
echo " If you are using a device that is connected to the computer by USB or"
echo " serial port, unplug the device then plug it back in again to ensure that"
echo " permissions are applied correctly."
fi
echo " defaults"
copy_file $UTIL_ROOT/default/weewx /etc/default/weewx
echo " init script"
copy_file $UTIL_ROOT/init.d/weewx-multi /etc/init.d/weewx
chmod 755 /etc/init.d/weewx
echo "Enabling weewx..."
update-rc.d weewx defaults
echo "If you are using a device that is connected to the computer by USB or"
echo "serial port, unplug the device then plug it back in again to ensure that"
echo "permissions are applied correctly."
echo ""
echo "You can start weewx with the following command:"
echo " '\033[1msudo /etc/init.d/weewx start\033[0m'"
}
@@ -52,14 +72,12 @@ do_uninstall() {
echo "Disabling weewx..."
update-rc.d weewx remove
echo "Removing files..."
if [ -f /etc/init.d/weewx ]; then
echo " init script"
rm /etc/init.d/weewx
fi
if [ -f /etc/udev/rules.d/60-weewx.rules ]; then
echo " udev rules"
rm /etc/udev/rules.d/60-weewx.rules
fi
echo " init script"
remove_file /etc/init.d/weewx
echo " defaults"
remove_file /etc/default/weewx
echo " udev rules"
remove_file /etc/udev/rules.d/60-weewx.rules
}
ACTION=$1

View File

@@ -1,4 +1,10 @@
# WeeWX parameters that are used in startup and init scripts
WEEWX_PYTHON=python3
WEEWX_PYTHON_ARGS=
WEEWX_BINDIR=/usr/share/weewx
WEEWX_CFG=/etc/weewx/weewx.conf
WEEWX_CFGDIR=/etc/weewx
WEEWX_RUNDIR=/var/run/weewx
WEEWX_USER=weewx
WEEWX_GROUP=weewx
WEEWX_INSTANCES="weewx"
WEEWX_CFG=weewx.conf

View File

@@ -1,19 +1,26 @@
#!/bin/sh
# Start script for FreeBSD, contributed by user Fabian Abplanalp
# Put this script in /usr/local/etc/rc.d then adjust WEEWX_BIN and
# WEEWX_CFG values in /etc/defaults/weewx
#
# Generic SysV startup script. Put this file in the system's init script
# directory, then create appropriate symlinks for your system runlevels.
# To modify the behavior of this script, adjust the values in the file
# /etc/defaults/weewx or /etc/default/weewx, as appropriate.
WEEWX_BIN="/opt/weewx/bin/weewxd"
WEEWX_CFG="/opt/weewx/weewx.conf"
WEEWX_PID="/var/run/weewx.pid"
WEEWX_PYTHON=python3
WEEWX_BINDIR=/usr/share/weewx
WEEWX_CFGDIR=/etc/weewx
WEEWX_RUNDIR=/var/run
WEEWX_CFG=weewx.conf
# Read configuration variable file if it is present
[ -r /etc/defaults/weewx ] && . /etc/defaults/weewx
WEEWXD=$WEEWX_BINDIR/weewxd.py
WEEWX_PID=$WEEWX_RUNDIR/weewx.pid"
case "$1" in
"start")
echo "Starting weewx..."
${WEEWX_BIN} ${WEEWX_CFG} --daemon &
${WEEWX_PYTHON} ${WEEWXD} ${WEEWX_CFGDIR}/${WEEWX_CFG} &
echo $! > ${WEEWX_PID}
echo "done"
;;

View File

@@ -1,28 +1,21 @@
#! /bin/sh
# Copyright 2016-2022 Matthew Wall, all rights reserved
# Copyright 2016-2023 Matthew Wall, all rights reserved
# init script to run multiple instances of weewx
#
# each weewx instance is identified by name. that name is used to identify the
# configuration and pid files.
# configuration and pid files. if no list of instances is specified, then run
# a single instance of weewxd using the configuration file weewx.conf.
#
# this init script expects the following configuration:
# /etc/weewx/a.conf
# /etc/weewx/b.conf
# /var/run/weewx/weewxd-a.pid
# /var/run/weewx/weewxd-b.pid
#
# with the appropriate rsyslog and logrotate configurations:
# /var/log/weewx/weewxd-a.log
# /var/log/weewx/weewxd-b.log
#
# to configure the script, override variables in /etc/default/weewx-multi
# to configure the script, override variables in /etc/default/weewx
# for example:
#
# WEEWX_INSTANCES="vantage acurite"
# WEEWX_BINDIR=/opt/weewx/bin
# WEEWX_PYTHON=python3
# WEEWX_BINDIR=/opt/weewx
# WEEWX_CFGDIR=/etc/weewx
# WEEWX_RUNDIR=/var/run/weewx
# WEEWX_USER=weewx
# WEEWX_GROUP=weewx
### BEGIN INIT INFO
# Provides: weewx-multi
@@ -34,29 +27,33 @@
# Description: Manages multiple instances of weewx
### END INIT INFO
# Try to keep systemd from screwing everything up
export SYSTEMCTL_SKIP_REDIRECT=1
PATH=/sbin:/usr/sbin:/bin:/usr/bin
DESC=weewx
WEEWX_INSTANCES="weewx"
WEEWX_BINDIR=/opt/weewx/bin
WEEWX_PYTHON=python3
WEEWX_BINDIR=/opt/weewx
WEEWX_CFGDIR=/etc/weewx
WEEWX_RUNDIR=/var/run/weewx
WEEWX_USER=root
# Try to keep systemd from screwing everything up
export SYSTEMCTL_SKIP_REDIRECT=1
WEEWX_GROUP=root
# Read configuration variable file if it is present
[ -r /etc/default/weewx ] && . /etc/default/weewx
DESC=weewx
DAEMON=$WEEWX_BINDIR/weewxd
WEEWXD=$WEEWX_BINDIR/weewxd.py
# Exit if the package is not installed
if [ ! -x "$DAEMON" ]; then
echo "The $DESC daemon is not installed at $DAEMON"
if [ ! -x "$WEEWXD" ]; then
echo "The $DESC daemon is not installed at $WEEWXD"
exit 0
fi
DAEMON=$WEEWX_PYTHON $WEEWXD
# Load the VERBOSE setting and other rcS variables
. /lib/init/vars.sh
@@ -68,6 +65,7 @@ fi
if [ ! -d $WEEWX_RUNDIR ]; then
mkdir -p $WEEWX_RUNDIR
chown $WEEWX_USER $WEEWX_RUNDIR
chgrp $WEEWX_GROUP $WEEWX_RUNDIR
fi
# start the daemon

View File

@@ -1,181 +0,0 @@
#! /bin/sh
# Author: Tom Keffer <keffer@gmail.com>
# Startup script for Debian derivatives
#
# the skeleton script in debian 6 does not work properly in package scripts.
# the return/exit codes cause {pre|post}{inst|rm} to fail regardless of the
# script completion status. this script exits explicitly.
#
# the skeleton script also does not work properly with python applications,
# as the lsb tools cannot distinguish between the python interpreter and
# the python code that was invoked. this script uses ps and grep to look
# for the application signature instead of using the lsb tools to determine
# whether the app is running.
#
### BEGIN INIT INFO
# Provides: weewx
# Required-Start: $local_fs $remote_fs $syslog $time
# Required-Stop: $local_fs $remote_fs $syslog
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: weewx weather system
# Description: Manages the weewx weather system
### END INIT INFO
# Do NOT "set -e"
# PATH should only include /usr/* if it runs after the mountnfs.sh script
PATH=/sbin:/usr/sbin:/bin:/usr/bin
DESC="weewx weather system"
NAME=weewx
# these can be overridden in the default file
WEEWX_BIN=/home/weewx/bin/weewxd
WEEWX_CFG=/home/weewx/weewx.conf
WEEWX_PID=/var/run/$NAME.pid
WEEWX_USER=root
# Read configuration variable file if it is present
[ -r /etc/default/$NAME ] && . /etc/default/$NAME
# Exit if the package is not installed
[ -x "$WEEWX_BIN" ] || exit 0
DAEMON=$WEEWX_BIN
DAEMON_ARGS="--daemon --pidfile=$WEEWX_PID $WEEWX_CFG"
# Load the VERBOSE setting and other rcS variables
. /lib/init/vars.sh
# Define LSB log_* functions.
# Depend on lsb-base (>= 3.0-6) to ensure that this file is present.
. /lib/lsb/init-functions
# start the daemon/service
# 0 if daemon has been started
# 1 if daemon was already running
# 2 if daemon could not be started
# check using ps not the pid file. pid file could be leftover.
do_start() {
NPROC=$(count_procs)
if [ $NPROC != 0 ]; then
return 1
fi
start-stop-daemon --start --chuid $WEEWX_USER --pidfile $WEEWX_PID --exec $DAEMON -- $DAEMON_ARGS || return 2
return 0
}
# stop the daemon/service
# 0 if daemon has been stopped
# 1 if daemon was already stopped
# 2 if daemon could not be stopped
# other if a failure occurred
do_stop() {
# bail out if the app is not running
NPROC=$(count_procs)
if [ $NPROC = 0 ]; then
return 1
fi
# bail out if there is no pid file
if [ ! -f $WEEWX_PID ]; then
return 1
fi
start-stop-daemon --stop --user $WEEWX_USER --pidfile $WEEWX_PID
# we cannot trust the return value from start-stop-daemon
RETVAL=2
c=0
while [ $c -lt 24 -a "$RETVAL" = "2" ]; do
c=`expr $c + 1`
# process may not really have completed, so check it
NPROC=$(count_procs)
if [ $NPROC = 0 ]; then
RETVAL=0
else
echo -n "."
sleep 5
fi
done
if [ "$RETVAL" = "0" -o "$RETVAL" = "1" ]; then
# delete the pid file just in case
rm -f $WEEWX_PID
fi
return "$RETVAL"
}
# send a SIGHUP to the daemon/service
do_reload() {
start-stop-daemon --stop --signal 1 --quiet --user $WEEWX_USER --pidfile $WEEWX_PID
return 0
}
count_procs() {
NPROC=`ps ax | grep weewxd | grep $NAME.pid | wc -l`
echo $NPROC
}
RETVAL=0
case "$1" in
start)
log_daemon_msg "Starting $DESC" "$NAME"
do_start
case "$?" in
0) log_end_msg 0; RETVAL=0 ;;
1) log_action_cont_msg " already running" && log_end_msg 0; RETVAL=0 ;;
2) log_end_msg 1; RETVAL=1 ;;
esac
;;
stop)
log_daemon_msg "Stopping $DESC" "$NAME"
do_stop
case "$?" in
0) log_end_msg 0; RETVAL=0 ;;
1) log_action_cont_msg " not running" && log_end_msg 0; RETVAL=0 ;;
2) log_end_msg 1; RETVAL=1 ;;
esac
;;
status)
NPROC=$(count_procs)
if [ $NPROC -gt 1 ]; then
MSG="running multiple times"
elif [ $NPROC = 1 ]; then
MSG="running"
else
MSG="not running"
fi
log_daemon_msg "Status of $DESC" "$MSG"
log_end_msg 0
RETVAL=0
;;
reload|force-reload)
log_daemon_msg "Reloading $DESC" "$NAME"
do_reload
RETVAL=$?
log_end_msg $RETVAL
;;
restart)
log_daemon_msg "Restarting $DESC" "$NAME"
do_stop
case "$?" in
0|1)
do_start
case "$?" in
0) log_end_msg 0; RETVAL=0 ;;
1) log_end_msg 1; RETVAL=1 ;; # Old process still running
*) log_end_msg 1; RETVAL=1 ;; # Failed to start
esac
;;
*)
# Failed to stop
log_end_msg 1
RETVAL=1
;;
esac
;;
*)
echo "Usage: $0 {start|stop|status|restart|reload}"
exit 3
;;
esac
exit $RETVAL

42
src/weewx_data/util/init.d/weewx.freebsd Normal file → Executable file
View File

@@ -1,13 +1,24 @@
#!/bin/sh
#
# PROVIDE: weewx
# REQUIRE: DAEMON
# KEYWORD: shutdown
#
# Add the following line to /etc/rc.conf.local or /etc/rc.conf
# to enable weewx:
# install this file as /usr/local/etc/rc.d/weewx
#
# weewx_enable (bool): Set to NO by default
# Set it to YES to enable weewx
# to enable it, put this in /etc/rc.conf.local
# weewx_enable=YES
#
# to disable it, use weewx_enable=NO
WEEWX_PYTHON=/usr/local/bin/python3
WEEWX_BINDIR=/usr/local/weewx/src
WEEWX_CFGDIR=/usr/local/etc/weewx
WEEWX_RUNDIR=/var/run
WEEWX_CFG=weewx.conf
# Read configuration variable file if it is present
[ -r /etc/defaults/weewx ] && . /etc/defaults/weewx
. /etc/rc.subr
@@ -17,15 +28,26 @@ rcvar=weewx_enable
load_rc_config $name
start_cmd=weewx_start
weewx_daemon=/usr/local/etc/weewx/bin/weewxd
stop_cmd=weewx_stop
weewx_daemon="${WEEWX_PYTHON} ${WEEWX_BINDIR}/weewxd.py"
command=${weewx_daemon}
procname=${weewx_procname:-/usr/local/bin/python3}
weewx_pid=/var/run/weewx.pid
weewx_config=/usr/local/etc/weewx/weewx.conf
procname=${weewx_procname:-${WEEWX_PYTHON}}
weewx_pid=${WEEWX_RUNDIR}/weewx.pid
weewx_config=${WEEWX_CFGDIR}/${WEEWX_CFG}
weewx_start() {
echo "Starting ${name}."
${weewx_daemon} --daemon --pidfile=${weewx_pid} ${weewx_config} &
echo "Starting ${name}."
${weewx_daemon} --daemon --pidfile=${weewx_pid} ${weewx_config}
}
weewx_stop() {
if [ -f ${weewx_pid} ]; then
echo "Stopping ${name}."
kill `cat ${weewx_pid}`
else
echo "${name} is not running"
fi
}
run_rc_command "$1"

View File

@@ -1,275 +0,0 @@
#!/bin/bash
# Author: Tom Keffer <keffer@gmail.com>
# LSB system startup script for weewx
# derived from LSB template script by Kurt Garloff, SUSE / Novell
#
# see http://www.linuxbase.org/spec/
# http://www.tldp.org/HOWTO/HighQuality-Apps-HOWTO/
#
# Note: This script uses functions rc_XXX defined in /etc/rc.status on
# UnitedLinux/SUSE/Novell based Linux distributions. However, it will work
# on other distributions as well, by using the LSB (Linux Standard Base)
# or RH functions or by open coding the needed functions.
# chkconfig: 345 99 00
# description: weewx weather daemon
### BEGIN INIT INFO
# Provides: weewx
# Required-Start: $local_fs $syslog $time
# Required-Stop: $local_fs $syslog $time
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: weewx weather system
# Description: Manages the weewx weather system
### END INIT INFO
# Note on runlevels:
# 0 - halt/poweroff 6 - reboot
# 1 - single user 2 - multiuser without network exported
# 3 - multiuser w/ network (text mode) 5 - multiuser w/ network and X11 (xdm)
# Check for missing binaries (stale symlinks should not happen)
# Note: Special treatment of stop for LSB conformance
WEEWX_BIN=/home/weewx/bin/weewxd
WEEWX_CFG=/home/weewx/weewx.conf
WEEWX_ARGS="--daemon $WEEWX_CFG"
test -x $WEEWX_BIN || { echo "$WEEWX_BIN not installed";
if [ "$1" = "stop" ]; then exit 0;
else exit 5; fi; }
# Source LSB init functions
# providing start_daemon, killproc, pidofproc,
# log_success_msg, log_failure_msg and log_warning_msg.
# This is currently not used by UnitedLinux based distributions and
# not needed for init scripts for UnitedLinux only. If it is used,
# the functions from rc.status should not be sourced or used.
#. /lib/lsb/init-functions
# Shell functions sourced from /etc/rc.status:
# rc_check check and set local and overall rc status
# rc_status check and set local and overall rc status
# rc_status -v be verbose in local rc status and clear it afterwards
# rc_status -v -r ditto and clear both the local and overall rc status
# rc_status -s display "skipped" and exit with status 3
# rc_status -u display "unused" and exit with status 3
# rc_failed set local and overall rc status to failed
# rc_failed <num> set local and overall rc status to <num>
# rc_reset clear both the local and overall rc status
# rc_exit exit appropriate to overall rc status
# rc_active checks whether a service is activated by symlinks
# Use the SUSE rc_ init script functions;
# emulate them on LSB, RH and other systems
# Default: Assume sysvinit binaries exist
start_daemon() { /sbin/start_daemon ${1+"$@"}; }
killproc() { /sbin/killproc ${1+"$@"}; }
pidofproc() { /sbin/pidofproc ${1+"$@"}; }
checkproc() { /sbin/checkproc ${1+"$@"}; }
if test -e /etc/rc.status; then
# SUSE rc script library
. /etc/rc.status
else
export LC_ALL=POSIX
_cmd=$1
declare -a _SMSG
if test "${_cmd}" = "status"; then
_SMSG=(running dead dead unused unknown reserved)
_RC_UNUSED=3
else
_SMSG=(done failed failed missed failed skipped unused failed failed reserved)
_RC_UNUSED=6
fi
if test -e /lib/lsb/init-functions; then
# LSB
. /lib/lsb/init-functions
echo_rc()
{
if test ${_RC_RV} = 0; then
log_success_msg " [${_SMSG[${_RC_RV}]}] "
else
log_failure_msg " [${_SMSG[${_RC_RV}]}] "
fi
}
# TODO: Add checking for lockfiles
checkproc() { return pidofproc ${1+"$@"} >/dev/null 2>&1; }
elif test -e /etc/init.d/functions; then
# RHAT
. /etc/init.d/functions
echo_rc()
{
#echo -n " [${_SMSG[${_RC_RV}]}] "
if test ${_RC_RV} = 0; then
success " [${_SMSG[${_RC_RV}]}] "
else
failure " [${_SMSG[${_RC_RV}]}] "
fi
}
checkproc() { return status ${1+"$@"}; }
start_daemon() { return daemon ${1+"$@"}; }
else
# emulate it
echo_rc() { echo " [${_SMSG[${_RC_RV}]}] "; }
fi
rc_reset() { _RC_RV=0; }
rc_failed()
{
if test -z "$1"; then
_RC_RV=1;
elif test "$1" != "0"; then
_RC_RV=$1;
fi
return ${_RC_RV}
}
rc_check()
{
return rc_failed $?
}
rc_status()
{
rc_failed $?
if test "$1" = "-r"; then _RC_RV=0; shift; fi
if test "$1" = "-s"; then rc_failed 5; echo_rc; rc_failed 3; shift; fi
if test "$1" = "-u"; then rc_failed ${_RC_UNUSED}; echo_rc; rc_failed 3; shift; fi
if test "$1" = "-v"; then echo_rc; shift; fi
if test "$1" = "-r"; then _RC_RV=0; shift; fi
return ${_RC_RV}
}
rc_exit() { exit ${_RC_RV}; }
rc_active()
{
if test -z "$RUNLEVEL"; then read RUNLEVEL REST < <(/sbin/runlevel); fi
if test -e /etc/init.d/S[0-9][0-9]${1}; then return 0; fi
return 1
}
fi
# Reset status of this service
rc_reset
# Return values acc. to LSB for all commands but status:
# 0 - success
# 1 - generic or unspecified error
# 2 - invalid or excess argument(s)
# 3 - unimplemented feature (e.g. "reload")
# 4 - user had insufficient privileges
# 5 - program is not installed
# 6 - program is not configured
# 7 - program is not running
# 8--199 - reserved (8--99 LSB, 100--149 distrib, 150--199 appl)
#
# Note that starting an already running service, stopping
# or restarting a not-running service as well as the restart
# with force-reload (in case signaling is not supported) are
# considered a success.
case "$1" in
start)
echo -n "Starting weewx "
## Start daemon with startproc(8). If this fails
## the return value is set appropriately by startproc.
start_daemon $WEEWX_BIN $WEEWX_ARGS
# Remember status and be verbose
rc_status -v
;;
stop)
echo -n "Shutting down weewx "
## Stop daemon with killproc(8) and if this fails
## killproc sets the return value according to LSB.
killproc -TERM $WEEWX_BIN
# Remember status and be verbose
rc_status -v
;;
try-restart|condrestart)
## Do a restart only if the service was active before.
## Note: try-restart is now part of LSB (as of 1.9).
## RH has a similar command named condrestart.
if test "$1" = "condrestart"; then
echo "${attn} Use try-restart ${done}(LSB)${attn} rather than condrestart ${warn}(RH)${norm}"
fi
$0 status
if test $? = 0; then
$0 restart
else
rc_reset # Not running is not a failure.
fi
# Remember status and be quiet
rc_status
;;
restart)
## Stop the service and regardless of whether it was
## running or not, start it again.
$0 stop
$0 start
# Remember status and be quiet
rc_status
;;
force-reload)
## Signal the daemon to reload its config. Most daemons
## do this on signal 1 (SIGHUP).
## If it does not support it, restart the service if it
## is running.
echo -n "Reload service weewx "
## if it supports it:
killproc -HUP $WEEWX_BIN
touch /var/run/weewx.pid
rc_status -v
## Otherwise:
#$0 try-restart
#rc_status
;;
reload)
## Like force-reload, but if daemon does not support
## signaling, do nothing (!)
# If it supports signaling:
echo -n "Reload service weewx "
killproc -HUP $WEEWX_BIN
touch /var/run/weewx.pid
rc_status -v
## Otherwise if it does not support reload:
#rc_failed 3
#rc_status -v
;;
status)
echo -n "Checking for service weewx "
## Check status with checkproc(8), if process is running
## checkproc will return with exit status 0.
# Return value is slightly different for the status command:
# 0 - service up and running
# 1 - service dead, but /var/run/ pid file exists
# 2 - service dead, but /var/lock/ lock file exists
# 3 - service not running (unused)
# 4 - service status unknown :-(
# 5--199 reserved (5--99 LSB, 100--149 distro, 150--199 appl.)
# NOTE: checkproc returns LSB compliant status values.
checkproc $WEEWX_BIN
# NOTE: rc_status knows that we called this init script with
# "status" option and adapts its messages accordingly.
rc_status -v
;;
probe)
## Optional: Probe for the necessity of a reload, print out the
## argument to this init script which is required for a reload.
## Note: probe is not (yet) part of LSB (as of 1.9)
#test /etc/FOO/FOO.conf -nt /var/run/FOO.pid && echo reload
echo "Probe not supported"
;;
*)
echo "Usage: $0 {start|stop|status|try-restart|restart|force-reload|reload|probe}"
exit 1
;;
esac
rc_exit

View File

@@ -1,74 +0,0 @@
#!/bin/sh
# Author: Mark Jenks <mjenks@netnet.net>
# Startup script for Redhat derivatives
#
# chkconfig: 2345 99 01
# description: start and stop the weewx weather system
#
# Do NOT "set -e"
# PATH should only include /usr/* if it runs after the mountnfs.sh script
PATH=/sbin:/usr/sbin:/bin:/usr/bin
NAME=weewx
WEEWX_BIN=/home/weewx/bin/weewxd
WEEWX_CFG=/home/weewx/weewx.conf
WEEWX_PID=/var/run/$NAME.pid
WEEWX_LOCK=/var/lock/subsys/$NAME
# Read configuration variable file if it is present
[ -r /etc/default/$NAME ] && . /etc/default/$NAME
# Exit if the package is not installed
[ -x "$WEEWX_BIN" ] || exit 0
DAEMON_ARGS="--daemon --pidfile=$WEEWX_PID $WEEWX_CFG"
# Source function library.
. /etc/init.d/functions
# See how we were called.
case "$1" in
start)
# Start daemon.
echo -n $"Starting $NAME: "
daemon --pidfile $WEEWX_PID $WEEWX_BIN $DAEMON_ARGS
RETVAL=$?
echo
[ $RETVAL -eq 0 ] && touch $WEEWX_LOCK
;;
stop)
# Stop daemon.
echo -n $"Shutting down $NAME: "
killproc $NAME
RETVAL=$?
echo
[ $RETVAL -eq 0 ] && rm -f $WEEWX_LOCK
;;
status)
echo -n $"Checking for $NAME: "
status $NAME
RETVAL=$?
;;
restart)
echo -n $"Restarting $NAME: "
$0 stop
$0 start
;;
reload)
echo -n $"Reloading $NAME: "
killproc $NAME -HUP
RETVAL=$?
echo
;;
condrestart)
[ -f $WEEWX_LOCK ] && restart || :
;;
*)
echo $"Usage: $0 {start|stop|status|restart|reload}"
RETVAL=1
;;
esac
exit $RETVAL

View File

@@ -1,151 +0,0 @@
#!/bin/bash
# Author: Tom Keffer <keffer@gmail.com>
# Startup script for SuSE derivatives
### BEGIN INIT INFO
# Provides: weewx
# Required-Start: $local_fs $syslog $time
# Required-Stop: $local_fs $syslog $time
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: weewx weather system
# Description: Manages the weewx weather system
### END INIT INFO
# chkconfig: 345 99 00
# description: weewx weather daemon
# runlevels:
# 0 - halt/poweroff 6 - reboot
# 1 - single user 2 - multiuser without network exported
# 3 - multiuser w/ network (text mode) 5 - multiuser w/ network and X11 (xdm)
# LSB compatible service control script; see http://www.linuxbase.org/spec/
# Please send feedback to http://www.suse.de/feedback/
# See also http://www.tldp.org/HOWTO/HighQuality-Apps-HOWTO/
#
# This scriopt uses functions rc_XXX defined in /etc/rc.status on
# UnitedLinux/SUSE/Novell based Linux distributions.
WEEWX_BIN=/home/weewx/bin/weewxd
WEEWX_CFG=/home/weewx/weewx.conf
WEEWX_ARGS="--daemon $WEEWX_CFG"
WEEWX_PID_FILE=/var/run/weewx.pid
# Read configuration variable file if it is present
[ -r /etc/default/weewx ] && . /etc/default/weewx
test -x $WEEWX_BIN || { echo "$WEEWX_BIN not installed";
if [ "$1" = "stop" ]; then exit 0;
else exit 5; fi; }
# Shell functions sourced from /etc/rc.status:
# rc_check check and set local and overall rc status
# rc_status check and set local and overall rc status
# rc_status -v be verbose in local rc status and clear it afterwards
# rc_status -v -r ditto and clear both the local and overall rc status
# rc_status -s display "skipped" and exit with status 3
# rc_status -u display "unused" and exit with status 3
# rc_failed set local and overall rc status to failed
# rc_failed <num> set local and overall rc status to <num>
# rc_reset clear both the local and overall rc status
# rc_exit exit appropriate to overall rc status
# rc_active checks whether a service is activated by symlinks
# Assume sysvinit binaries exist
start_daemon() { /sbin/start_daemon ${1+"$@"}; }
killproc() { /sbin/killproc ${1+"$@"}; }
pidofproc() { /sbin/pidofproc ${1+"$@"}; }
checkproc() { /sbin/checkproc ${1+"$@"}; }
# SUSE rc script library
. /etc/rc.status
# Reset status of this service
rc_reset
# Return values according to LSB for all commands but status:
# 0 - success
# 1 - generic or unspecified error
# 2 - invalid or excess argument(s)
# 3 - unimplemented feature (e.g. "reload")
# 4 - user had insufficient privileges
# 5 - program is not installed
# 6 - program is not configured
# 7 - program is not running
# 8--199 - reserved (8--99 LSB, 100--149 distrib, 150--199 appl)
#
# Note that starting an already running service, stopping
# or restarting a not-running service as well as the restart
# with force-reload (in case signaling is not supported) are
# considered a success.
case "$1" in
start)
echo -n "Starting weewx "
## Start daemon with startproc(8). If this fails
## the return value is set appropriately by startproc.
start_daemon $WEEWX_BIN $WEEWX_ARGS
rc_status -v
;;
stop)
echo -n "Shutting down weewx "
## Stop daemon with killproc(8) and if this fails
## killproc sets the return value according to LSB.
killproc -TERM -p $WEEWX_PID_FILE python
rc_status -v
;;
try-restart|condrestart)
## Do a restart only if the service was active before.
## RH has a similar command named condrestart.
if test "$1" = "condrestart"; then
echo "Use try-restart rather than condrestart"
fi
$0 status
if test $? = 0; then
$0 restart
else
rc_reset # Not running is not a failure.
fi
rc_status
;;
restart)
## Stop the service and regardless of whether it was
## running or not, start it again.
$0 stop
$0 start
rc_status
;;
force-reload)
echo -n "Reload service weewx "
killproc -HUP -p $WEEWX_PID_FILE python
rc_status -v
;;
reload)
echo -n "Reload service weewx "
killproc -HUP -p $WEEWX_PID_FILE python
rc_status -v
;;
status)
echo -n "Checking for service weewx "
## Check status with checkproc(8), if process is running
## checkproc will return with exit status 0.
# Return value is slightly different for the status command:
# 0 - service up and running
# 1 - service dead, but /var/run/ pid file exists
# 2 - service dead, but /var/lock/ lock file exists
# 3 - service not running (unused)
# 4 - service status unknown :-(
# 5--199 reserved (5--99 LSB, 100--149 distro, 150--199 appl.)
checkproc $WEEWX_BIN
rc_status -v
;;
probe)
echo "Probe not supported"
;;
*)
echo "Usage: $0 {start|stop|status|try-restart|restart|force-reload|reload|probe}"
exit 1
;;
esac
rc_exit

View File

@@ -1,7 +1,4 @@
# systemd service configuration file for WeeWX
#
# For information about running WeeWX under systemd, see:
# https://github.com/weewx/weewx/wiki/systemd
[Unit]
Description=WeeWX weather system
@@ -10,11 +7,11 @@ Requires=time-sync.target
After=time-sync.target
[Service]
ExecStart=weewxd weewx.conf
ExecStart=WEEWX_PYTHON WEEWXD WEEWX_CFGDIR/weewx.conf
StandardOutput=null
StandardError=journal+console
#User=weewx
#Group=weewx
User=WEEWX_USER
Group=WEEWX_GROUP
[Install]
WantedBy=multi-user.target

View File

@@ -7,9 +7,6 @@
# config ~/weewx-data/XXX.conf configuration directory
# database_name ~/weewx-data/archive/XXX.sdb specified in XXX.conf
# HTML_ROOT ~/weewx-data/public_html/XXX specified in XXX.conf
#
# For information about running WeeWX under systemd, see:
# https://github.com/weewx/weewx/wiki/systemd
[Unit]
Description=WeeWX %i
@@ -19,11 +16,11 @@ After=time-sync.target
PartOf=weewx.service
[Service]
ExecStart=weewxd --log-label weewxd-%i $HOME/weewx-data/%i.conf
ExecStart=WEEWX_PYTHON WEEWXD --log-label weewxd-%i WEEWX_CFGDIR/%i.conf
StandardOutput=null
StandardError=journal+console
#User=weewx
#Group=weewx
User=WEEWX_USER
Group=WEEWX_GROUP
[Install]
WantedBy=multi-user.target