Skip to content

Commit

Permalink
Linux: make davmail notify readyness to systemd
Browse files Browse the repository at this point in the history
  • Loading branch information
niol committed Dec 13, 2021
1 parent ff76ebb commit 3eca5f4
Show file tree
Hide file tree
Showing 3 changed files with 111 additions and 2 deletions.
2 changes: 1 addition & 1 deletion src/init/davmail.service
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ Documentation=http://davmail.sourceforge.net/sslsetup.html
After=network.target

[Service]
Type=simple
Type=notify
User=davmail
PermissionsStartOnly=true
AmbientCapabilities=CAP_NET_BIND_SERVICE
Expand Down
5 changes: 4 additions & 1 deletion src/java/davmail/DavGateway.java
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@
import davmail.pop.PopServer;
import davmail.smtp.SmtpServer;
import davmail.ui.tray.DavGatewayTray;
import davmail.util.SystemdNotify;
import org.apache.log4j.Logger;

import java.awt.*;
Expand Down Expand Up @@ -158,7 +159,9 @@ public static void start() {
if (showStartupBanner) {
DavGatewayTray.info(new BundleMessage("LOG_DAVMAIL_GATEWAY_LISTENING", currentVersion, messages));
}
if (!errorMessages.isEmpty()) {
if (errorMessages.isEmpty()) {
SystemdNotify.ready();
} else {
DavGatewayTray.error(new BundleMessage("LOG_MESSAGE", errorMessages));
}

Expand Down
106 changes: 106 additions & 0 deletions src/java/davmail/util/SystemdNotify.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,106 @@
// Based on this answer https://stackoverflow.com/a/36945256/784804

/*
* Copyright (c) 2018 Ian Kirk
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
package davmail.util;

import com.sun.jna.Library;
import com.sun.jna.Native;

public final class SystemdNotify {

interface SystemD extends Library {

final SystemD INSTANCE = Native.load(SYSTEMD_SO, SystemD.class);

int sd_notify(int unset_environment, String state);
}

private static final String SYSTEMD_SO = "systemd";
private static final String READY = "READY=1";
private static final String RELOADING = "RELOADING=1";
private static final String STOPPING = "STOPPING=1";
private static final String STATUS = "STATUS=%s";
private static final String WATCHDOG = "WATCHDOG=1";
private static final String MAINPID = "MAINPID=%d";
private static final String ERRNO = "ERRNO=%d";
private static final String BUSERROR = "BUSERROR=%s";
private static String osType;

public static void busError(final String error) {
notify(String.format(BUSERROR, error));
}

public static void errno(final int errno) {
notify(String.format(ERRNO, errno));
}

public static void mainPid(final long pid) {
notify(String.format(MAINPID, pid));
}

public static void notify(final String message) {

if (!osType().startsWith("linux"))
return;

try {
final int returnCode = SystemD.INSTANCE.sd_notify(0, message);
if (returnCode < 0)
throw new RuntimeException(
String.format("sd_notify returned %d", returnCode));
} catch (final Exception e) {
throw new RuntimeException(e);
}
}

public static void ready() {
notify(READY);
}

public static void reloading() {
notify(RELOADING);
}

public static void status(final String text) {
notify(String.format(STATUS, text));
}

public static void stopping() {
notify(STOPPING);
}

public static void watchdog() {
notify(WATCHDOG);
}

synchronized static private String osType() {
if (osType == null) {
osType = System.getProperty("os.name").toLowerCase();
}
return osType;
}

private SystemdNotify() {
throw new RuntimeException("This class should not be instantiated");
}
}

0 comments on commit 3eca5f4

Please sign in to comment.