Merge branch 'devel-2.3'
[ganeti-local] / daemons / ensure-dirs.in
1 #!/bin/bash
2
3 set -e
4
5 LIBDIR="@LOCALSTATEDIR@/lib"
6 DATADIR="${LIBDIR}/ganeti"
7 RUNDIR="@LOCALSTATEDIR@/run"
8 GNTRUNDIR="${RUNDIR}/ganeti"
9 LOGDIR="@LOCALSTATEDIR@/log"
10 GNTLOGDIR="${LOGDIR}/ganeti"
11 LOCKDIR="@LOCALSTATEDIR@/lock"
12
13 _fileset_owner() {
14   case "$1" in
15     masterd)
16       echo "@GNTMASTERUSER@:@GNTMASTERDGROUP@"
17       ;;
18     confd)
19       echo "@GNTCONFDUSER@:@GNTCONFDGROUP@"
20       ;;
21     rapi)
22       echo "@GNTRAPIUSER@:@GNTRAPIGROUP@"
23       ;;
24     noded)
25       echo "root:@GNTMASTERDGROUP@"
26       ;;
27     daemons)
28       echo "@GNTMASTERUSER@:@GNTDAEMONSGROUP@"
29       ;;
30     masterd-confd)
31       echo "@GNTMASTERUSER@:@GNTCONFDGROUP@"
32       ;;
33     *)
34       echo "root:root"
35       ;;
36   esac
37 }
38
39 _ensure_file() {
40   local file="$1"
41   local perm="$2"
42   local owner="$3"
43
44   [[ -e "${file}" ]] || return 1
45   chmod ${perm} "${file}"
46
47   if ! [[ -z "${owner}" ]]; then
48     chown ${owner} "${file}"
49   fi
50
51   return 0
52 }
53
54 _ensure_dir() {
55   local dir="$1"
56   local perm="$2"
57   local owner="$3"
58
59   [[ -d "${dir}" ]] || mkdir "${dir}"
60
61   _ensure_file "${dir}" "${perm}" "${owner}"
62 }
63
64 _gather_files() {
65   local path="$1"
66   local perm="$2"
67   local user="$3"
68   local group="$4"
69
70   shift 4
71
72   find "${path}" -type f "(" "!" -perm ${perm} -or "(" "!" -user ${user} -or \
73        "!" -group ${group} ")" ")" "$@"
74 }
75
76 _ensure_datadir() {
77   local full_run="$1"
78
79   _ensure_dir ${DATADIR} 0755 "$(_fileset_owner masterd)"
80   _ensure_dir ${DATADIR}/queue 0700 "$(_fileset_owner masterd)"
81   _ensure_dir ${DATADIR}/queue/archive 0700 "$(_fileset_owner masterd)"
82   _ensure_dir ${DATADIR}/uidpool 0750 "$(_fileset_owner noded)"
83   _ensure_dir ${DATADIR}/rapi 0750 "$(_fileset_owner rapi)"
84
85   # We ignore these files if they don't exists (incomplete setup)
86   _ensure_file ${DATADIR}/cluster-domain-secret 0640 \
87                "$(_fileset_owner masterd)" || :
88   _ensure_file ${DATADIR}/config.data 0640 "$(_fileset_owner masterd-confd)" || :
89   _ensure_file ${DATADIR}/hmac.key 0440 "$(_fileset_owner confd)" || :
90   _ensure_file ${DATADIR}/known_hosts 0644 "$(_fileset_owner masterd)" || :
91   _ensure_file ${DATADIR}/rapi.pem 0440 "$(_fileset_owner rapi)" || :
92   _ensure_file ${DATADIR}/rapi/users 0640 "$(_fileset_owner rapi)" || :
93   _ensure_file ${DATADIR}/server.pem 0440 "$(_fileset_owner masterd)" || :
94   _ensure_file ${DATADIR}/queue/serial 0600 "$(_fileset_owner masterd)" || :
95
96   # To not change the utils.LockFile object
97   touch ${DATADIR}/queue/lock
98   _ensure_file ${DATADIR}/queue/lock 0600 "$(_fileset_owner masterd)"
99
100   if ! [[ -z "${full_run}" ]]; then
101     local queue_owner="$(_fileset_owner masterd)"
102     local ssconf_owner="$(_fileset_owner noded)"
103
104     _gather_files ${DATADIR}/queue 0600 @GNTMASTERUSER@ @GNTMASTERDGROUP@ | \
105     while read path; do
106       _ensure_file "$path" 0600 "$queue_owner"
107     done
108
109     _gather_files ${DATADIR} 0600 root @GNTMASTERDGROUP@ -name 'ssconf_*' | \
110     while read path; do
111       _ensure_file "$path" 0444 "$ssconf_owner"
112     done
113   fi
114 }
115
116 _ensure_rundir() {
117   _ensure_dir ${GNTRUNDIR} 0775 "$(_fileset_owner daemons)"
118   _ensure_dir ${GNTRUNDIR}/socket 0750 "$(_fileset_owner daemons)"
119   _ensure_dir ${GNTRUNDIR}/bdev-cache 0755 "$(_fileset_owner noded)"
120   _ensure_dir ${GNTRUNDIR}/instance-disks 0755 "$(_fileset_owner noded)"
121   _ensure_dir ${GNTRUNDIR}/crypto 0700 "$(_fileset_owner noded)"
122   _ensure_dir ${GNTRUNDIR}/import-export 0755 "$(_fileset_owner noded)"
123
124   # We ignore this file if it don't exists (not yet start up)
125   _ensure_file ${GNTRUNDIR}/socket/ganeti-master 0770 \
126                "$(_fileset_owner daemons)" || :
127 }
128
129 _ensure_logdir() {
130   _ensure_dir ${GNTLOGDIR} 0770 "$(_fileset_owner daemons)"
131   _ensure_dir ${GNTLOGDIR}/os 0750 "$(_fileset_owner daemons)"
132
133   # We ignore these files if they don't exists (incomplete setup)
134   _ensure_file ${GNTLOGDIR}/master-daemon.log 0600 "$(_fileset_owner masterd)" || :
135   _ensure_file ${GNTLOGDIR}/conf-daemon.log 0600 "$(_fileset_owner confd)" || :
136   _ensure_file ${GNTLOGDIR}/node-daemon.log 0600 "$(_fileset_owner noded)" || :
137   _ensure_file ${GNTLOGDIR}/rapi-daemon.log 0600 "$(_fileset_owner rapi)" || :
138 }
139
140 _ensure_lockdir() {
141   _ensure_dir ${LOCKDIR} 1777 ""
142 }
143
144 _operate_while_hold() {
145   local fn=$1
146   local path=$2
147   shift 2
148
149   (cd ${path};
150    ${fn} "$@")
151 }
152
153 main() {
154   local full_run
155
156   while getopts "f" OPTION; do
157     case ${OPTION} in
158       f) full_run=1 ;;
159     esac
160   done
161
162   _operate_while_hold "_ensure_datadir" ${DATADIR} ${full_run}
163   _operate_while_hold "_ensure_rundir" ${RUNDIR}
164   _operate_while_hold "_ensure_logdir" ${LOGDIR}
165   _operate_while_hold "_ensure_lockdir" @LOCALSTATEDIR@
166 }
167
168 main "$@"