/* * Copyright 2016 Fizzed, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.fizzed.stork.deploy; import java.io.IOException; import java.io.UncheckedIOException; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.StandardOpenOption; import java.util.List; import java.util.Set; import java.util.stream.Collectors; import org.slf4j.Logger; public class SystemdHelper { static private int indexOfAny(String value, String[] finds) { for (String find : finds) { int pos = value.indexOf(find); if (pos >= 0) { return pos; } } return -1; } static public void modifyForInstall(Logger log, Assembly assembly, Deployment install) { Set<Daemon> daemons = assembly.getDaemons(InitType.SYSTEMD); if (daemons == null) { return; } for (Daemon daemon : daemons) { // systemd service files (unfortunately) cannot be scripted with paths // for ExecStart, User, Group, etc. so we need to modify those when // we finally install the .service file Path systemdServiceFile = assembly.getUnpackedDir().resolve("share/systemd/" + daemon.getName() + ".service"); try { List<String> modifiedSystemdLines = Files.lines(systemdServiceFile) .map((line) -> { if (line.startsWith("ExecStart=") || line.startsWith("PIDFile=")) { int equalsPos = line.indexOf("="); int dirPos = indexOfAny(line, new String[] { "/bin", "/run" }); if (dirPos > 0) { return line.substring(0, equalsPos+1) + install.getCurrentDir() + line.substring(dirPos); } } else if (line.startsWith("User=")) { return "User=" + install.getUser().orElse(""); } else if (line.startsWith("Group=")) { return "Group=" + install.getGroup().orElse(""); } return line; }) .collect(Collectors.toList()); Files.write(systemdServiceFile, modifiedSystemdLines, StandardOpenOption.TRUNCATE_EXISTING); log.info("Modified for install: {}", systemdServiceFile); } catch (IOException e) { throw new UncheckedIOException(e); } } } }