summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Cady <d@jerkface.net>2023-05-27 15:55:07 -0400
committerAndrew Cady <d@jerkface.net>2023-05-27 15:55:07 -0400
commitf2ac2fe76e6d8fcad24daa1f8c16e207e95465f1 (patch)
treecb512e4ccc8c66f24ed2619b40f6a9e355e2f92e
parentc9316cfc8e206a54973976eae71649007eef2720 (diff)
begin to implement user service
-rw-r--r--Makefile23
-rw-r--r--src/endofossil29
-rw-r--r--src/fossil-user.socket5
-rw-r--r--src/fossil-user@.service6
4 files changed, 62 insertions, 1 deletions
diff --git a/Makefile b/Makefile
index e8c4a45..12b9329 100644
--- a/Makefile
+++ b/Makefile
@@ -1,4 +1,6 @@
1ifneq (0,$(shell id -u))
1fossil_database = db 2fossil_database = db
3unitdir = "$${XDG_CONFIG_HOME:-$$HOME/.config}/systemd/user"
2unit_instance_name != systemd-escape "$$(realpath "$(fossil_database)")" 4unit_instance_name != systemd-escape "$$(realpath "$(fossil_database)")"
3our_name = fossil-sync 5our_name = fossil-sync
4unit_files_basenames = $(addprefix $(our_name)@.,service path timer) 6unit_files_basenames = $(addprefix $(our_name)@.,service path timer)
@@ -8,7 +10,9 @@ unit_instance = $(our_name)@$(unit_instance_name).service
8 10
9default: install start ui 11default: install start ui
10install: 12install:
11 systemctl --user link $(addprefix ./, $(unit_files)) 13 install -m644 -t $(unitdir) -- $(unit_files)
14 systemctl --user daemon-reload
15 sudo make $@
12start stop restart status show: | $(fossil_database) 16start stop restart status show: | $(fossil_database)
13 systemctl --user $@ $(unit_instances) 17 systemctl --user $@ $(unit_instances)
14follow: 18follow:
@@ -29,3 +33,20 @@ work:
29 mkdir -p $@ 33 mkdir -p $@
30work/.fslckout: | work $(fossil_database) 34work/.fslckout: | work $(fossil_database)
31 cd work && fossil open ../$(fossil_database) 35 cd work && fossil open ../$(fossil_database)
36else
37unitdir = /etc/systemd/system
38unit_files = $(addprefix src/fossil-user,@.service .socket)
39units = $(filter-out %@.service,$(notdir $(unit_files)))
40executables = src/endofossil
41bindir = /usr/local/bin
42
43default: install start follow
44install:
45 install -m644 -t $(unitdir) -- $(unit_files)
46 install -t $(bindir) -- $(executables)
47 systemctl daemon-reload
48start stop restart status show:
49 systemctl $@ $(units)
50follow:
51 journalctl $(addprefix -u , $(units)) -f
52endif
diff --git a/src/endofossil b/src/endofossil
new file mode 100644
index 0000000..401806f
--- /dev/null
+++ b/src/endofossil
@@ -0,0 +1,29 @@
1#!/bin/bash
2set -e
3
4
5IFS=/ read n pid uid <<< "$1"
6[ "$pid" ]
7
8authtype=
9while read -d ''
10do
11 case "${REPLY%%=*}" in
12 'SSH_USER_AUTH' ) read authtype keytype keyvalue < "${REPLY#*=}" ;;
13 esac
14done < /proc/$pid/environ
15[ "$authtype" = publickey ]
16
17keyhash=
18while read
19do
20 set -- $REPLY
21 if [ "$3 $5" = 'SSHFP 2' ]
22 then
23 keyhash=$6
24 break
25 fi
26done < <(ssh-keygen -f <(printf '%s\n' "$keytype $keyvalue") -r .)
27[ "$keyhash" ]
28
29printf '%s\n' "$keyhash"
diff --git a/src/fossil-user.socket b/src/fossil-user.socket
new file mode 100644
index 0000000..eab5a51
--- /dev/null
+++ b/src/fossil-user.socket
@@ -0,0 +1,5 @@
1[Socket]
2Accept = yes
3ListenStream = /run/fossil-user.S
4SocketUser = d
5SocketMode = 0600
diff --git a/src/fossil-user@.service b/src/fossil-user@.service
new file mode 100644
index 0000000..1b70358
--- /dev/null
+++ b/src/fossil-user@.service
@@ -0,0 +1,6 @@
1[Unit]
2Description = Fossil server process
3
4[Service]
5StandardInput=socket
6ExecStart = endofossil '%I'