揮発性のメモ2

最近知った知識を さも昔から知ってた風にメモ書きしていく

systemdのsocketで、接続元のIPアドレスを取得する2

systemdのsocketで、プロセスが起動されるとき サービスにはインスタンスIDというのが振られる

たとえば hoge@.service の場合、@の後ろにIDが振られて 実際に起動するサービスは
hoge@987-192.168.101.88:30000-192.168.101.89:57772.service
となる。

このインスタンスIDは、ユニット指定子 %I で取得できる

[Unit]
Description=Hogehoge Service Instance %i

[Service]
ExecStart = /opt/hoge/bin/hogehoge -i "%I"
StandardInput = socket
StandardOutput = socket
StandardError = journal


プログラムの中では次のように見える *1

987/192.168.101.88:30000/192.168.101.89:57772
プロセスID / 接続先IP:接続先ポート / 接続元IP:接続元ポート

これを、sscanfとかで適当に切り分ければ接続元IPアドレスが取得できる。 やったぜ

    int pid;
    char remoteip[64];
    sscanf(buf, "%d/%*[^:]:%*d/%63[^:]:%*d", &pid, remoteip);
    printf("PID=%d, REMOTE='%s'\n", pid, remoteip);

docs.redhat.com

*1:ジャーナルで読めるIDとは記号がびみょーに違う