#include "kappa/service/service.hpp" #include #include namespace kappa::service { std::string generate_systemd_service(const ServiceSpec& spec) { std::ostringstream out; // --- [Unit] --- out << "[Unit]\n"; out << std::format("Description={}\n", spec.description.empty() ? spec.name : spec.description); if (!spec.after.empty()) { out << std::format("After={}\n", spec.after); } // --- [Service] --- out << "\n[Service]\n"; out << std::format("ExecStart={}\n", spec.exec); if (spec.type == "simple") { out << "Type=simple\n"; } else if (spec.type == "forking") { out << "Type=forking\n"; } else if (spec.type == "oneshot") { out << "Type=oneshot\n"; } else if (spec.type == "notify") { out << "Type=notify\n"; } else { out << "Type=simple\n"; } if (!spec.user.empty()) { out << std::format("User={}\n", spec.user); } if (spec.restart_policy == "always") { out << "Restart=always\n"; } else if (spec.restart_policy == "on-failure") { out << "Restart=on-failure\n"; } else if (spec.restart_policy == "never") { out << "Restart=no\n"; } if (!spec.working_dir.empty()) { out << std::format("WorkingDirectory={}\n", spec.working_dir); } for (const auto& [key, value] : spec.env) { out << std::format("Environment=\"{0}={1}\"\n", key, value); } // --- [Install] --- out << "\n[Install]\n"; out << "WantedBy=multi-user.target\n"; return out.str(); } } // namespace kappa::service