#!/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 '{for(i=8;i>=0;--i){c=substr($1,10-i,1);k+=((c~/[rwxst]/)*2^i);if(!(i%3))k+=(tolower(c)~/[st]/)*2^(9+i/3)}printf("%04o",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: %Mp%03Lp %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: %04a %A' "$destination" 2>/dev/null || fallback ;; esac