diff --git a/roles/nfs-server/files/mknfshomedir.sh b/roles/nfs-server/files/mknfshomedir.sh index 4bf7ff3..b243028 100755 --- a/roles/nfs-server/files/mknfshomedir.sh +++ b/roles/nfs-server/files/mknfshomedir.sh @@ -2,6 +2,9 @@ set -e +LOCKFILE="/run/$(basename "$0").pid" +STATEFILE="/run/$(basename "$0").state" + _basedn="$(awk '{ if ($1 == "BASE") print $2 }' /etc/openldap/ldap.conf)" if [ -z "$_basedn" ]; then logger -i -t "$(basename "$0")" -p user.error -s \ @@ -18,6 +21,40 @@ else exit 1 fi +if [ -f "$LOCKFILE" ]; then + if kill -0 "$(cat "${LOCKFILE}")" ; then + _started=" ($(stat --format='%y' ${LOCKFILE}))" + logger -i -t "$(basename "$0")" -p user.notice -s \ + "ERROR: Lockfile exists${_started}" + exit 1 + else + logger -i -t "$(basename "$0")" -p user.notice -s \ + "WARN: Removing stale lock file" + fi +fi +trap 'rm -f ${LOCKFILE}' INT TERM EXIT +echo "$$" > "$LOCKFILE" + +_state="$( + ldapsearch -Q -LLL -s base contextCSN | awk ' + BEGIN { csn=0 } + { + if ($1 == "contextCSN:") { + val=substr($2, 0, 21); + if (val > csn) { + csn = val + } + } + } + END { print csn } + ' +)" +if [ -f "$STATEFILE" ]; then + if [ "$_state" == "$(cat "$STATEFILE")" ]; then + exit 0 + fi +fi + ldapsearch -Q -LLL -b "ou=People,${_basedn}" "$_filter" automountInformation | \ awk -v_hostname="$(hostname -f)" '{ if ($1 == "automountInformation:") { @@ -54,3 +91,5 @@ ldapsearch -Q -LLL -b "ou=People,${_basedn}" "$_filter" automountInformation | \ install -d -o "$_user" -g "$_user" -m 0700 "$_target" su "$_user" -s /bin/bash -c "umask 077 ; cp -r /etc/skel/. '${_target}'" done + +echo "$_state" > "$STATEFILE" diff --git a/roles/nfs-server/files/mknfsroledir.sh b/roles/nfs-server/files/mknfsroledir.sh index 9c7df21..fd9e93d 100755 --- a/roles/nfs-server/files/mknfsroledir.sh +++ b/roles/nfs-server/files/mknfsroledir.sh @@ -2,6 +2,9 @@ set -e +LOCKFILE="/run/$(basename "$0").pid" +STATEFILE="/run/$(basename "$0").state" + _basedn="$(awk '{ if ($1 == "BASE") print $2 }' /etc/openldap/ldap.conf)" if [ -z "$_basedn" ]; then logger -i -t "$(basename "$0")" -p user.error -s \ @@ -18,6 +21,40 @@ else exit 1 fi +if [ -f "$LOCKFILE" ]; then + if kill -0 "$(cat "${LOCKFILE}")" ; then + _started=" ($(stat --format='%y' ${LOCKFILE}))" + logger -i -t "$(basename "$0")" -p user.notice -s \ + "ERROR: Lockfile exists${_started}" + exit 1 + else + logger -i -t "$(basename "$0")" -p user.notice -s \ + "WARN: Removing stale lock file" + fi +fi +trap 'rm -f ${LOCKFILE}' INT TERM EXIT +echo "$$" > "$LOCKFILE" + +_state="$( + ldapsearch -Q -LLL -s base contextCSN | awk ' + BEGIN { csn=0 } + { + if ($1 == "contextCSN:") { + val=substr($2, 0, 21); + if (val > csn) { + csn = val + } + } + } + END { print csn } + ' +)" +if [ -f "$STATEFILE" ]; then + if [ "$_state" == "$(cat "$STATEFILE")" ]; then + exit 0 + fi +fi + ldapsearch -Q -LLL -b "ou=Groups,${_basedn}" "$_filter" automountInformation | \ awk -v_hostname="$(hostname -f)" '{ if ($1 == "automountInformation:") { @@ -52,3 +89,5 @@ ldapsearch -Q -LLL -b "ou=Groups,${_basedn}" "$_filter" automountInformation | \ install -d -o root -g "$_role" -m 2770 "${_target}/library" install -d -o root -g "$_role" -m 2775 "${_target}/public" done + +echo "$_state" > "$STATEFILE" diff --git a/roles/nfs-server/tasks/main.yml b/roles/nfs-server/tasks/main.yml index d2cf66d..473b01c 100644 --- a/roles/nfs-server/tasks/main.yml +++ b/roles/nfs-server/tasks/main.yml @@ -32,7 +32,6 @@ cron: name: "{{ item }}" user: root - minute: "*/15" job: "/usr/local/sbin/{{ item }}" with_items: - mknfshomedir