Systemd integration
This commit is contained in:
parent
0a8d9e5287
commit
695723f146
10
common.cpp
10
common.cpp
|
@ -11,6 +11,12 @@ void daemon_notify_ready() {
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void daemon_notify(const std::string& args) {
|
||||||
|
#ifdef H804_SYSTEMD_ENABLE
|
||||||
|
sd_notify(0, args.c_str());
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
// clang-format off
|
// clang-format off
|
||||||
const char* _log_text[(size_t)LogLevel::_SIZE] = {
|
const char* _log_text[(size_t)LogLevel::_SIZE] = {
|
||||||
#ifdef H804_SYSTEMD_ENABLE
|
#ifdef H804_SYSTEMD_ENABLE
|
||||||
|
@ -63,10 +69,10 @@ void _Logger::operator<<(const std::string& str) const { _log(level, str); }
|
||||||
|
|
||||||
void _Logger::operator<<(const char* str) const { _log(level, str); }
|
void _Logger::operator<<(const char* str) const { _log(level, str); }
|
||||||
|
|
||||||
errno_exception::errno_exception() noexcept : _what(strerror(errno)) {}
|
errno_exception::errno_exception() noexcept : _what(strerror(errno)), saved_errno(errno) {}
|
||||||
|
|
||||||
errno_exception::errno_exception(const char* msg) noexcept
|
errno_exception::errno_exception(const char* msg) noexcept
|
||||||
: _what(std::string(msg) + ": " + strerror(errno)) {}
|
: _what(std::string(msg) + ": " + strerror(errno)), saved_errno(errno) {}
|
||||||
|
|
||||||
const char* errno_exception::what() const noexcept { return this->_what.c_str(); }
|
const char* errno_exception::what() const noexcept { return this->_what.c_str(); }
|
||||||
|
|
||||||
|
|
2
common.h
2
common.h
|
@ -11,6 +11,7 @@ namespace h804 {
|
||||||
enum class LogLevel : size_t { DEBUG, INFO, NOTICE, WARN, ERROR, _SIZE };
|
enum class LogLevel : size_t { DEBUG, INFO, NOTICE, WARN, ERROR, _SIZE };
|
||||||
|
|
||||||
void daemon_notify_ready();
|
void daemon_notify_ready();
|
||||||
|
void daemon_notify(const std::string& args);
|
||||||
void _log(const LogLevel, const std::string&);
|
void _log(const LogLevel, const std::string&);
|
||||||
void _log(const LogLevel, const char*);
|
void _log(const LogLevel, const char*);
|
||||||
|
|
||||||
|
@ -33,6 +34,7 @@ class errno_exception : public std::exception {
|
||||||
const std::string _what;
|
const std::string _what;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
const int saved_errno;
|
||||||
errno_exception() noexcept;
|
errno_exception() noexcept;
|
||||||
errno_exception(const char* msg) noexcept;
|
errno_exception(const char* msg) noexcept;
|
||||||
const char* what() const noexcept;
|
const char* what() const noexcept;
|
||||||
|
|
|
@ -0,0 +1,11 @@
|
||||||
|
[Unit]
|
||||||
|
Description=H804Tun - Virtual Layer 2 Overlay Network
|
||||||
|
Requires=network-online.target
|
||||||
|
After=network-online.target
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
Type=notify
|
||||||
|
ExecStart=/opt/h804tun/h804tun /opt/h804tun/h804tun.conf
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
|
@ -0,0 +1,54 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
function do_uninstall {
|
||||||
|
set -x
|
||||||
|
systemctl stop h804tun
|
||||||
|
rm -rf /opt/h804tun
|
||||||
|
systemctl disable h804tun
|
||||||
|
rm /etc/systemd/system/h804tun.conf
|
||||||
|
systemctl daemon-reload
|
||||||
|
}
|
||||||
|
|
||||||
|
function do_build {
|
||||||
|
echo "Building..."
|
||||||
|
rm -rf build/
|
||||||
|
mkdir -p build/
|
||||||
|
pushd build/
|
||||||
|
cmake -DWITH_SYSTEMD=ON ..
|
||||||
|
cmake --build .
|
||||||
|
if [ -f /opt/h804tun/h804tun.conf ]; then
|
||||||
|
head -n 2 /opt/h804tun/h804tun.conf > h804tun.conf
|
||||||
|
else
|
||||||
|
echo "INTERFACE_NAME" > h804tun.conf
|
||||||
|
echo "STATIC_IP" >> h804tun.conf
|
||||||
|
fi
|
||||||
|
echo "" >> h804tun.conf
|
||||||
|
echo "# Interfaces: " >> h804tun.conf
|
||||||
|
ip link | sed 's/^/# /' >> h804tun.conf
|
||||||
|
if [ -z "$EDITOR" ]; then
|
||||||
|
EDITOR=ed
|
||||||
|
fi
|
||||||
|
$EDITOR h804tun.conf
|
||||||
|
popd
|
||||||
|
}
|
||||||
|
|
||||||
|
function do_install {
|
||||||
|
set -x
|
||||||
|
systemctl stop h804tun
|
||||||
|
mkdir -p /opt/h804tun
|
||||||
|
cp build/h804tun /opt/h804tun/h804tun
|
||||||
|
cp build/h804tun.conf /opt/h804tun/h804tun.conf
|
||||||
|
cp h804tun.service /etc/systemd/system
|
||||||
|
systemctl daemon-reload
|
||||||
|
}
|
||||||
|
|
||||||
|
if [ $# == 0 ] || [ $1 == "install" ]; then
|
||||||
|
do_build
|
||||||
|
sudo $0 do_install
|
||||||
|
elif [ $1 == "uninstall" ]; then
|
||||||
|
sudo $0 do_uninstall
|
||||||
|
elif [ $1 == "do_install" ]; then
|
||||||
|
do_install
|
||||||
|
elif [ $1 == "do_uninstall" ]; then
|
||||||
|
do_uninstall
|
||||||
|
fi
|
29
main.cpp
29
main.cpp
|
@ -135,11 +135,13 @@ bool handle_ll(const std::array<uint8_t, h804::tun::TUN_MTU>& buf, size_t size,
|
||||||
}
|
}
|
||||||
|
|
||||||
int main(int argc, char* argv[]) {
|
int main(int argc, char* argv[]) {
|
||||||
(void)argc;
|
if (argc < 2) {
|
||||||
(void)argv;
|
error << "Need conf";
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
std::ifstream infile("h804tun.conf");
|
std::ifstream infile(argv[1]);
|
||||||
std::string interface;
|
std::string interface;
|
||||||
std::string ip;
|
std::string ip;
|
||||||
if (!std::getline(infile, interface)) {
|
if (!std::getline(infile, interface)) {
|
||||||
|
@ -153,13 +155,6 @@ int main(int argc, char* argv[]) {
|
||||||
h804::tun::TunnelDevice device{ip, "255.255.255.0"};
|
h804::tun::TunnelDevice device{ip, "255.255.255.0"};
|
||||||
h804::tun::EthSocket llsock{interface.c_str()};
|
h804::tun::EthSocket llsock{interface.c_str()};
|
||||||
info << "Started";
|
info << "Started";
|
||||||
std::string cmd1("ip link show ");
|
|
||||||
cmd1 += device.get_name();
|
|
||||||
system(cmd1.c_str());
|
|
||||||
cmd1 = "ip addr show ";
|
|
||||||
cmd1 += device.get_name();
|
|
||||||
system(cmd1.c_str());
|
|
||||||
system("ip route");
|
|
||||||
|
|
||||||
struct sigaction handler;
|
struct sigaction handler;
|
||||||
handler.sa_handler = [](int) {
|
handler.sa_handler = [](int) {
|
||||||
|
@ -222,6 +217,8 @@ int main(int argc, char* argv[]) {
|
||||||
std::thread eth_thread_obj(eth_thread);
|
std::thread eth_thread_obj(eth_thread);
|
||||||
std::thread share_thread_obj(share_thread);
|
std::thread share_thread_obj(share_thread);
|
||||||
|
|
||||||
|
h804::daemon_notify("READY=1\nSTATUS=Tunnel running");
|
||||||
|
|
||||||
tun_thread_obj.join();
|
tun_thread_obj.join();
|
||||||
eth_thread_obj.join();
|
eth_thread_obj.join();
|
||||||
share_thread_obj.join();
|
share_thread_obj.join();
|
||||||
|
@ -232,9 +229,19 @@ int main(int argc, char* argv[]) {
|
||||||
// }
|
// }
|
||||||
|
|
||||||
info << "Exiting";
|
info << "Exiting";
|
||||||
} catch (std::exception& e) {
|
} catch (const h804::errno_exception& e) {
|
||||||
error << "Caught exception:";
|
error << "Caught exception:";
|
||||||
error << e.what();
|
error << e.what();
|
||||||
|
h804::daemon_notify_ready();
|
||||||
|
h804::daemon_notify(std::string("STOPPING=1\nSTATUS=") + e.what() +
|
||||||
|
"\nERRNO=" + std::to_string(e.saved_errno));
|
||||||
|
return 1;
|
||||||
|
} catch (const std::exception& e) {
|
||||||
|
error << "Caught exception:";
|
||||||
|
error << e.what();
|
||||||
|
h804::daemon_notify_ready();
|
||||||
|
h804::daemon_notify(std::string("STOPPING=1\nERRNO=131\nSTATUS=") + e.what());
|
||||||
|
return 1;
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue