#!/bin/sh # # 2013 Steven Armstrong (steven-cdist armstrong.cc) # 2020 Dennis Camera (dennis.camera at ssrq-sds-fds.ch) # # This file is part of cdist. # # cdist is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # cdist is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with cdist. If not, see . # destination="/$__object_id" fallback() { # Patch the output together, manually ls_line=$(ls -ldn "$destination") uid=$(echo "$ls_line" | awk '{ print $3 }') gid=$(echo "$ls_line" | awk '{ print $4 }') owner=$(awk -F: -v uid="$uid" '$3 == uid { print $1; f=1 } END { if (!f) print "UNKNOWN" }' /etc/passwd) group=$(awk -F: -v uid="$uid" '$3 == uid { print $1; f=1 } END { if (!f) print "UNKNOWN" }' /etc/group) mode_text=$(echo "$ls_line" | awk '{ print $1 }') mode=$(echo "$mode_text" | awk '{ k=0; for (i=0; i<=8; i++) k += ((substr($1, i+2, 1) ~ /[rwx]/) * 2^(8-i)); printf("%0o", k) }') printf 'type: %s\nowner: %d %s\ngroup: %d %s\nmode: %s %s\n' \ "$("$__type_explorer/type")" \ "$uid" "$owner" \ "$gid" "$group" \ "$mode" "$mode_text" } # nothing to work with, nothing we could do [ -e "$destination" ] || exit 0 if ! command -v stat >/dev/null then fallback exit fi case $("$__explorer/os") in "freebsd"|"netbsd"|"openbsd"|"macosx") stat -f "type: %HT owner: %Du %Su group: %Dg %Sg mode: %Lp %Sp " "$destination" | awk '/^type/ { print tolower($0); next } { print }' ;; solaris) ls1="$( ls -ld "$destination" )" ls2="$( ls -ldn "$destination" )" if [ -f "$__object/parameter/mode" ] then mode_should="$( cat "$__object/parameter/mode" )" fi # yes, it is ugly hack, but if you know better way... if [ -z "$( find "$destination" -perm "$mode_should" )" ] then octets=888 else octets="$( echo "$mode_should" | sed 's/^0//' )" fi case "$( echo "$ls1" | cut -c1-1 )" in -) echo 'type: regular file' ;; d) echo 'type: directory' ;; esac echo "owner: $( echo "$ls2" \ | awk '{print $3}' ) $( echo "$ls1" \ | awk '{print $3}' )" echo "group: $( echo "$ls2" \ | awk '{print $4}' ) $( echo "$ls1" \ | awk '{print $4}' )" echo "mode: $octets $( echo "$ls1" | awk '{print $1}' )" ;; *) # NOTE: Do not use --printf here as it is not supported by BusyBox stat. # NOTE: BusyBox's stat might not support the "-c" option, in which case # we fall through to the shell fallback. stat -c "type: %F owner: %u %U group: %g %G mode: %a %A" "$destination" 2>/dev/null || fallback ;; esac