Daemon mode now works. Run 'make install' then insert dongle.

pull/22/head
weetmuts 2019-02-24 09:58:31 +01:00
rodzic b68cadfdc8
commit 1b7dee6c3d
5 zmienionych plików z 158 dodań i 25 usunięć

Wyświetl plik

@ -34,6 +34,11 @@ fi
ROOT="${2%/}" ROOT="${2%/}"
####################################################################
##
## Intall binaries
##
rm -f $ROOT/usr/bin/wmbusmeters $ROOT/usr/sbin/wmbusmetersd rm -f $ROOT/usr/bin/wmbusmeters $ROOT/usr/sbin/wmbusmetersd
mkdir -p $ROOT/usr/bin mkdir -p $ROOT/usr/bin
mkdir -p $ROOT/usr/sbin mkdir -p $ROOT/usr/sbin
@ -42,6 +47,11 @@ ln -s $ROOT/usr/bin/wmbusmeters $ROOT/usr/sbin/wmbusmetersd
echo binaries: installed $ROOT/usr/bin/wmbusmeters and $ROOT/usr/sbin/wmbusmetersd echo binaries: installed $ROOT/usr/bin/wmbusmeters and $ROOT/usr/sbin/wmbusmetersd
####################################################################
##
## Create wmbusmeters user
##
ID=$(id -u wmbusmeters 2>/dev/null) ID=$(id -u wmbusmeters 2>/dev/null)
if [ "$ADDUSER" = "true" ] if [ "$ADDUSER" = "true" ]
@ -56,15 +66,68 @@ then
fi fi
fi fi
####################################################################
##
## Prepare for /var/run/wmbusmeters.pid
##
#if [ ! -d $ROOT/var/run ]
#then
# # Create /var/run
# mkdir -p $ROOT/var/run
# echo pid store: created /var/run
#fi
####################################################################
##
## Prepare for /var/log/wmbusmeters and /var/log/wmbusmeters/meter_readings
##
if [ ! -d $ROOT/var/log/wmbusmeters/meter_readings ]
then
# Create /var/run
mkdir -p $ROOT/var/log/wmbusmeters/meter_readings
chown -R wmbusmeters:wmbusmeters $ROOT/var/log/wmbusmeters
echo log: created /var/log/wmbusmeters/meter_readings
fi
####################################################################
##
## Install /etc/logrotate.d/wmbusmeters
##
if [ ! -f $ROOT/etc/logrotate.d/wmbusmeters ]
then
mkdir -p $ROOT/etc/logrotate.d
# Create logrotate file
cat <<EOF > $ROOT/etc/logrotate.d/wmbusmeters
/var/log/wmbusmeters/*.log {
rotate 12
weekly
compress
missingok
postrotate
start-stop-daemon -K -p /var/run/wmbusmeters.pid -s HUP -x /usr/sbin/wmbusmeters -q
endscript
EOF
echo logrotate: created /etc/logrotate.d/wmbusmeters
fi
####################################################################
##
## Install /etc/wmbusmeters.conf
##
if [ ! -f $ROOT/etc/wmbusmeters.conf ] if [ ! -f $ROOT/etc/wmbusmeters.conf ]
then then
# Create default configuration # Create default configuration
mkdir -p $ROOT/etc/ mkdir -p $ROOT/etc/
cat <<EOF > $ROOT/etc/wmbusmeters.conf cat <<EOF > $ROOT/etc/wmbusmeters.conf
loglevel=normal loglevel=verbose
device=auto device=auto
logtelegrams=false logtelegrams=false
meterfiles=/tmp/wmbusmeters robot=json
meterfilesdir=/var/log/wmbusmeters/meter_readings
EOF EOF
chmod 644 $ROOT/etc/wmbusmeters.conf chmod 644 $ROOT/etc/wmbusmeters.conf
echo conf file: created $ROOT/etc/wmbusmeters.conf echo conf file: created $ROOT/etc/wmbusmeters.conf
@ -72,6 +135,11 @@ else
echo conf file: $ROOT/etc/wmbusmeters.conf unchanged echo conf file: $ROOT/etc/wmbusmeters.conf unchanged
fi fi
####################################################################
##
## Create /etc/wmbusmeters.d
##
if [ ! -d $ROOT/etc/wmbusmeters.d ] if [ ! -d $ROOT/etc/wmbusmeters.d ]
then then
# Create the configuration directory # Create the configuration directory
@ -82,6 +150,11 @@ else
echo conf dir: $ROOT/etc/wmbusmeters.d unchanged echo conf dir: $ROOT/etc/wmbusmeters.d unchanged
fi fi
####################################################################
##
## Create /etc/systemd/system/wmbusmeters.service
##
if [ ! -f $ROOT/etc/systemd/system/wmbusmeters.service ] if [ ! -f $ROOT/etc/systemd/system/wmbusmeters.service ]
then then
mkdir -p $ROOT/etc/systemd/system/ mkdir -p $ROOT/etc/systemd/system/
@ -92,11 +165,23 @@ Description=wmbusmeters service
After=network.target After=network.target
[Service] [Service]
Type=simple Type=forking
PrivateTmp=yes
#Restart=always #Restart=always
RestartSec=1 RestartSec=1
User=wmbusmeters User=wmbusmeters
ExecStart=/usr/bin/wmbusmeters --useconfig Group=wmbusmeters
# Run ExecStartPre with root-permissions
PermissionsStartOnly=true
ExecStartPre=-/bin/mkdir -p /var/log/wmbusmeters/meter_readings
ExecStartPre=/bin/chown -R wmbusmeters:wmbusmeters /var/log/wmbusmeters
ExecStartPre=-/bin/mkdir -p /var/run/wmbusmeters
ExecStartPre=/bin/chown -R wmbusmeters:wmbusmeters /var/run/wmbusmeters
ExecStart=/usr/sbin/wmbusmetersd /var/run/wmbusmeters/wmbusmeters.pid
PIDFile=/var/run/wmbusmeters/wmbusmeters.pid
[Install] [Install]
WantedBy=multi-user.target WantedBy=multi-user.target
@ -106,3 +191,22 @@ EOF
else else
echo systemd: $ROOT/etc/systemd/system/wmbusmeters.service unchanged echo systemd: $ROOT/etc/systemd/system/wmbusmeters.service unchanged
fi fi
####################################################################
##
## Create /etc/udev/rules.d/99-wmbus-usb-serial.rules
##
if [ ! -f $ROOT/etc/udev/rules.d/99-wmbus-usb-serial.rules ]
then
mkdir -p $ROOT/etc/udev/rules.d
# Create service file
cat <<EOF > $ROOT/etc/udev/rules.d/99-wmbus-usb-serial.rules
SUBSYSTEM=="tty", ATTRS{idVendor}=="10c4", ATTRS{idProduct}=="ea60", SYMLINK+="im871a",MODE="0660", GROUP="wmbusmeters",TAG+="systemd",ENV{SYSTEMD_WANTS}="wmbusmeters.service"
SUBSYSTEM=="tty", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", SYMLINK+="amb8465",MODE="0660", GROUP="wmbusmeters",TAG+="systemd",ENV{SYSTEMD_WANTS}="wmbusmeters.service"
EOF
echo udev: installed $ROOT/etc/udev/rules.d/99-wmbus-usb-serial.rules
else
echo systemd: $ROOT/etc/udev/rules.d/99-wmbus-usb-serial.rules unchanged
fi

Wyświetl plik

@ -31,9 +31,10 @@ unique_ptr<CommandLine> parseCommandLine(int argc, char **argv) {
const char *filename = strrchr(argv[0], '/')+1; const char *filename = strrchr(argv[0], '/')+1;
if (!strcmp(filename, "wmbusmetersd")) { if (!strcmp(filename, "wmbusmetersd")) {
c->daemon = true; c->daemon = true;
if (argc > 1) { if (argc != 2) {
error("Usage error: wmbusmetersd does not accept any arguments.\n"); error("Usage error: wmbusmetersd must have a single argument to the pid file.\n");
} }
c->pid_file = argv[1];
return unique_ptr<CommandLine>(c); return unique_ptr<CommandLine>(c);
} }
if (argc < 2) { if (argc < 2) {

Wyświetl plik

@ -40,6 +40,7 @@ struct MeterInfo {
struct CommandLine { struct CommandLine {
bool daemon {}; bool daemon {};
std::string pid_file;
bool useconfig {}; bool useconfig {};
bool reload {}; bool reload {};
bool need_help {}; bool need_help {};

Wyświetl plik

@ -39,8 +39,8 @@ using namespace std;
void oneshotCheck(CommandLine *cmdline, SerialCommunicationManager *manager, Meter *meter, vector<unique_ptr<Meter>> &meters); void oneshotCheck(CommandLine *cmdline, SerialCommunicationManager *manager, Meter *meter, vector<unique_ptr<Meter>> &meters);
void startUsingCommandline(CommandLine *cmdline); void startUsingCommandline(CommandLine *cmdline);
void startUsingConfigFiles(string root); void startUsingConfigFiles(string root, bool is_daemon);
void startDaemon(); // Will use config files. void startDaemon(string pid_file); // Will use config files.
int main(int argc, char **argv) int main(int argc, char **argv)
{ {
@ -75,7 +75,7 @@ int main(int argc, char **argv)
} }
else else
if (cmdline->daemon) { if (cmdline->daemon) {
startDaemon(); startDaemon(cmdline->pid_file);
exit(0); exit(0);
} }
else else
@ -86,7 +86,7 @@ int main(int argc, char **argv)
if (r != NULL) { if (r != NULL) {
root = r; root = r;
} }
startUsingConfigFiles(root); startUsingConfigFiles(root, false);
exit(0); exit(0);
} }
else { else {
@ -135,7 +135,11 @@ void startUsingCommandline(CommandLine *cmdline)
wmbus = openSimulator(type_and_device.second, manager.get()); wmbus = openSimulator(type_and_device.second, manager.get());
break; break;
case DEVICE_UNKNOWN: case DEVICE_UNKNOWN:
error("No wmbus device found!\n"); warning("No wmbus device found! Exiting!\n");
if (cmdline->daemon) {
// If starting as a daemon, wait a bit so that systemd have time to catch up.
sleep(1);
}
exit(1); exit(1);
break; break;
} }
@ -246,8 +250,36 @@ void oneshotCheck(CommandLine *cmdline, SerialCommunicationManager *manager, Met
manager->stop(); manager->stop();
} }
void startDaemon() void writePid(string pid_file, int pid)
{ {
FILE *pidf = fopen(pid_file.c_str(), "w");
if (!pidf) {
error("Could not open pid file \"%s\" for writing!\n", pid_file.c_str());
}
if (pid > 0) {
int n = fprintf(pidf, "%d\n", pid);
notice("writing pid %s\n", pid_file.c_str());
if (!n) {
error("Could not write pid (%d) to file \"%s\"!\n", pid, pid_file.c_str());
}
}
fclose(pidf);
return;
}
void startDaemon(string pid_file)
{
setlogmask(LOG_UPTO (LOG_INFO));
openlog("wmbusmetersd", LOG_CONS | LOG_PID | LOG_NDELAY, LOG_LOCAL1);
enableSyslog();
notice("wmbusmeters starting...\n");
// Pre check that the pid file can be writte to.
// Exit before fork, if it fails.
writePid(pid_file, 0);
pid_t pid = fork(); pid_t pid = fork();
if (pid < 0) if (pid < 0)
{ {
@ -255,20 +287,14 @@ void startDaemon()
} }
if (pid > 0) if (pid > 0)
{ {
// Parent returns to exit nicely. // Success! The parent stores the pid and exits.
writePid(pid_file, pid);
return; return;
} }
// Change the file mode mask // Change the file mode mask
umask(0); umask(0);
setlogmask(LOG_UPTO (LOG_NOTICE));
openlog("wmbusmetersd", LOG_CONS | LOG_PID | LOG_NDELAY, LOG_LOCAL1);
enableSyslog();
notice("wmbusmeters started by user %d\n", getuid ());
// Create a new SID for the daemon // Create a new SID for the daemon
pid_t sid = setsid(); pid_t sid = setsid();
if (sid < 0) { if (sid < 0) {
@ -284,12 +310,13 @@ void startDaemon()
close(STDOUT_FILENO); close(STDOUT_FILENO);
close(STDERR_FILENO); close(STDERR_FILENO);
startUsingConfigFiles(""); startUsingConfigFiles("", true);
} }
void startUsingConfigFiles(string root) void startUsingConfigFiles(string root, bool is_daemon)
{ {
unique_ptr<CommandLine> cmdline = loadConfiguration(root); unique_ptr<CommandLine> cmdline = loadConfiguration(root);
cmdline->daemon = is_daemon;
startUsingCommandline(cmdline.get()); startUsingCommandline(cmdline.get());
} }

Wyświetl plik

@ -196,7 +196,7 @@ void info(const char* fmt, ...) {
va_list args; va_list args;
va_start(args, fmt); va_start(args, fmt);
if (syslog_enabled_) { if (syslog_enabled_) {
vsyslog(LOG_INFO, fmt, args); vsyslog(LOG_NOTICE, fmt, args);
} else { } else {
vprintf(fmt, args); vprintf(fmt, args);
} }
@ -232,7 +232,7 @@ void verbose(const char* fmt, ...) {
va_list args; va_list args;
va_start(args, fmt); va_start(args, fmt);
if (syslog_enabled_) { if (syslog_enabled_) {
vsyslog(LOG_INFO, fmt, args); vsyslog(LOG_NOTICE, fmt, args);
} else { } else {
vprintf(fmt, args); vprintf(fmt, args);
} }
@ -245,7 +245,7 @@ void debug(const char* fmt, ...) {
va_list args; va_list args;
va_start(args, fmt); va_start(args, fmt);
if (syslog_enabled_) { if (syslog_enabled_) {
vsyslog(LOG_INFO, fmt, args); vsyslog(LOG_NOTICE, fmt, args);
} else { } else {
vprintf(fmt, args); vprintf(fmt, args);
} }