commit to tarent-admins svn
[shellsnippets/shellsnippets.git] / posix / sysadmin / agents.sh
1 # $Id: agents.sh 5263 2017-06-27 23:37:42Z tglase $
2 #-
3 # Copyright © 2009, 2012, 2015, 2017
4 #       Thorsten Glaser <t.glaser@tarent.de>
5 #
6 # Provided that these terms and disclaimer and all copyright notices
7 # are retained or reproduced in an accompanying document, permission
8 # is granted to deal in this work without restriction, including un‐
9 # limited rights to use, publicly perform, distribute, sell, modify,
10 # merge, give away, or sublicence.
11 #
12 # This work is provided “AS IS” and WITHOUT WARRANTY of any kind, to
13 # the utmost extent permitted by applicable law, neither express nor
14 # implied; without malicious intent or gross negligence. In no event
15 # may a licensor, author or contributor be held liable for indirect,
16 # direct, other damage, loss, or other issues arising in any way out
17 # of dealing in the work, even if advised of the possibility of such
18 # damage or existence of a defect, except proven that it results out
19 # of said person’s immediate fault when using the work as intended.
20 #-
21 # /etc/profile.d/agents.sh (sourced by /etc/profile on Debian and derivates)
22 # • install gpg and ssh skeleton files
23 # • load gpg-agent and ssh-agent, unless already there
24 #
25 # You should comment out “use-ssh-agent” in /etc/X11/Xsession.options
26 # in order to use the shared per-user agent started from this script.
27
28 test -n "$USER_ID" || USER_ID=$(id -u)
29 mkdir -p "$HOME/.ssh" "$HOME/.gnupg"
30 chmod 0700 "$HOME/.ssh" "$HOME/.gnupg"
31
32 for PID_FILE in .gnupg/gpg.conf .gnupg/gpg-agent.conf .ssh/config; do
33         test -s /etc/skel/$PID_FILE || continue
34
35         # list of known MD5 hashes of templates deployed by us
36         # + note the spaces at beginning and end of md5list! +
37         case $PID_FILE in
38         .gnupg/gpg.conf)
39                 _md5list=" 2b7d7e47afb59ec164cf0ab512bb4ddc c8b796ed85a79e458a564645dcf38281 d5c4f4335d1eab08bfc9afe7ab494801 e6af3b74078a49db14f2f79fa82b7d3a 1f5d00be735cd1b1a57960c0128d2368 e51c210618d7dbc93c63e456d4dd4af1 7dfefaad0f417b7f50da1d80f8f0759b 07826f04f9e3b700e0f45da360d25877 "
40                 ;;
41         .gnupg/gpg-agent.conf)
42                 _md5list=" e7e9b7940f07c3cb447b30da27914f8d "
43                 ;;
44         *)
45                 _md5list=
46                 ;;
47         esac
48
49         if test -s "$HOME/$PID_FILE"; then
50                 _md5=$( (fgrep -v '$Id' "$HOME/$PID_FILE" | md5sum) 2>&1 || \
51                     echo fail)
52                 case $_md5list in
53                 *\ ${_md5%% *}\ *)
54                         # MD5 matches, remove file
55                         rm -f "$HOME/$PID_FILE"
56                         ;;
57                 *)
58                         # MD5 does not match, do not touch file
59                         continue
60                         ;;
61                 esac
62         fi
63
64         # file does not exist or was removed by us, install template
65         cp /etc/skel/$PID_FILE "$HOME/$PID_FILE"
66         chmod 0600 "$HOME/$PID_FILE"
67 done
68 unset _md5
69 unset _md5list
70
71 PID_FILE="/dev/shm/.ssh-$USER_ID"
72 test -n "$SSH_AGENT_PID" || test -z "$SSH_CONNECTION" || SSH_AGENT_PID=fwd
73 if test -n "$SSH_AUTH_SOCK"; then
74         test -S "$SSH_AUTH_SOCK" || SSH_AGENT_PID=
75 else
76         SSH_AGENT_PID=
77 fi
78 if test -z "$SSH_AGENT_PID" && \
79     test -d "$PID_FILE/." && test -O "$PID_FILE/." && \
80     test -s "$PID_FILE/info" && test -O "$PID_FILE/info"; then
81         chmod -R go-rwx "$PID_FILE"
82         . "$PID_FILE/info"
83 fi
84 if test -z "$SSH_AUTH_SOCK" || test -z "$SSH_AGENT_PID" || \
85     test \! -S "$SSH_AUTH_SOCK"; then
86         unset SSH_AUTH_SOCK SSH_AGENT_PID
87         eval $(ssh-agent -s)
88 fi
89 if test -d "$PID_FILE/." && test -O "$PID_FILE/."; then
90         : wonderful
91 else
92         rm -rf "$PID_FILE"
93         mkdir -p "$PID_FILE" && test -d "$PID_FILE/." && \
94             test -O "$PID_FILE/." && chmod -R go-rwx "$PID_FILE" || \
95             rm -rf "$PID_FILE"
96 fi
97 if test -d "$PID_FILE/." && test -O "$PID_FILE/."; then
98         rm -f "$PID_FILE/info"
99         :>"$PID_FILE/info"
100         chmod 0600 "$PID_FILE/info"
101 fi
102 if test -f "$PID_FILE/info" && test -O "$PID_FILE/info" &&
103     test -n "$SSH_AGENT_PID" && test -n "$SSH_AUTH_SOCK"; then
104         echo "SSH_AGENT_PID=$SSH_AGENT_PID" >>"$PID_FILE/info"
105         echo "SSH_AUTH_SOCK=$SSH_AUTH_SOCK" >>"$PID_FILE/info"
106         export SSH_AUTH_SOCK SSH_AGENT_PID
107 else
108         rm -f "$PID_FILE/info"
109         unset SSH_AUTH_SOCK SSH_AGENT_PID
110 fi
111
112 : "${GNUPGHOME:=$HOME/.gnupg}"
113 GPG_TTY=$(tty); export GPG_TTY
114 find_gpg_agent() {
115         local PID_FILE="$GNUPGHOME/gpg-agent-info-$(hostname)"
116
117         test -d "$GNUPGHOME" || return 0
118         export GNUPGHOME
119
120         test -n "$GPG_AGENT_INFO" && test -S "${GPG_AGENT_INFO%%:*}" && \
121             gpg-agent 2>/dev/null && return 0
122
123         unset GPG_AGENT_INFO
124         if test -s "$PID_FILE"; then
125                 . "$PID_FILE"
126                 export GPG_AGENT_INFO
127                 test -n "$GPG_AGENT_INFO" && \
128                     test -S "${GPG_AGENT_INFO%%:*}" && \
129                     gpg-agent 2>/dev/null && return 0
130                 rm -f "$PID_FILE"
131         fi
132
133         unset GPG_AGENT_INFO
134         eval $(gpg-agent --daemon --sh)
135         : "${GPG_AGENT_INFO:=$GNUPGHOME/S.gpg-agent:0:1}"
136         export GPG_AGENT_INFO
137         if test -n "$GPG_AGENT_INFO" && test -S "${GPG_AGENT_INFO%%:*}" && \
138             gpg-agent 2>/dev/null; then
139                 echo "GPG_AGENT_INFO=$GPG_AGENT_INFO" >"$PID_FILE"
140                 return 0
141         fi
142
143         unset GPG_AGENT_INFO
144         return 0
145 }
146 find_gpg_agent
147 unset -f find_gpg_agent
148
149 :