/examples/scripts/idmap/idmap_nis.sh
Shell | 119 lines | 102 code | 11 blank | 6 comment | 9 complexity | 8a78d208e524ac60be05a3abd4feb7e6 MD5 | raw file
Possible License(s): LGPL-3.0, Apache-2.0, BSD-3-Clause, GPL-3.0, LGPL-2.1
- #!/bin/bash
- # idmap script to map SIDs to UIDs/GIDs using NIS
- # tridge@samba.org June 2009
- DOMAIN=$(ypdomainname)
- (
- date
- echo $*
- ) >> /var/log/samba/idmap.log
- cmd=$1
- shift
- PATH=/usr/bin:bin:$PATH
- shopt -s nocasematch || {
- echo "shell option nocasematch not supported"
- exit 1
- }
- # map from a domain and name to a uid/gid
- map_name() {
- domain="$1"
- name="$2"
- ntype="$3"
- case $ntype in
- 1)
- rtype="UID"
- map="passwd"
- ;;
- 2)
- rtype="GID"
- map="group"
- ;;
- *)
- echo "ERR: bad name type $ntype"
- exit 1
- ;;
- esac
- id=$(ypmatch "$name" "$map".byname 2>/dev/null | cut -d: -f3)
- [ -z "$id" ] && {
- echo "ERR: bad match for $name in map $map"
- exit 1
- }
- echo "$rtype":"$id"
- }
- # map from a unix id to a name
- map_id() {
- ntype="$1"
- id="$2"
- case $ntype in
- UID)
- map="passwd.byuid"
- ;;
- GID)
- map="group.bygid"
- ;;
- *)
- echo "ERR: bad name type $ntype"
- exit 1
- ;;
- esac
- name="$(ypmatch "$id" "$map" 2>/dev/null | cut -d: -f1)"
- [ -z "$name" ] && {
- echo "ERR: bad match for $name in map $map"
- exit 1
- }
- echo "$name"
- }
- case $cmd in
- SIDTOID)
- sid=$1
- rid=`echo $sid | cut -d- -f8`
- [ -z "$rid" ] && {
- echo "ERR: bad rid in SID $sid"
- exit 1
- }
-
- unset _NO_WINBINDD
- # oh, this is ugly. Shell is just not meant for parsing text
- fullname=`wbinfo -s $sid 2> /dev/null`
- domain=`echo $fullname | cut -d'\' -f1`
- [[ "$domain" = $DOMAIN ]] || {
- echo "ERR: bad domain $domain"
- exit 1
- }
- name=`echo $fullname | cut -d'\' -f2`
- nwords=`echo $name | wc -w`
- ntype=`echo $name | cut -d' ' -f$nwords`
- nminusone=`expr $nwords - 1`
- name=`echo $name | cut -d' ' -f-$nminusone`
- [ -z "$name" ] && {
- echo "ERR: bad name $fullname for SID $sid"
- exit 1
- }
- map_name "$domain" "$name" "$ntype"
- ;;
- IDTOSID)
- ntype=$1
- id=$2
- name="$(map_id "$ntype" "$id")"
- sid="$(wbinfo -n "$name" 2>/dev/null | cut -d' ' -f1)"
- [ -z "$sid" ] && {
- echo "ERR: name $name not found in ADS"
- exit 1
- }
- echo "SID:$sid"
- ;;
- *)
- echo "ERR: Unknown command $cmd"
- exit 1;
- ;;
- esac
- exit 0