157 lines
5.2 KiB
Bash
Executable File
157 lines
5.2 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
#===============================================================================
|
|
# FILE: samba.sh
|
|
#
|
|
# USAGE: ./samba.sh
|
|
#
|
|
# DESCRIPTION: Entrypoint for samba docker container
|
|
#
|
|
# OPTIONS: ---
|
|
# REQUIREMENTS: ---
|
|
# BUGS: ---
|
|
# NOTES: ---
|
|
# AUTHOR: David Personette (dperson@gmail.com),
|
|
# ORGANIZATION:
|
|
# CREATED: 09/28/2014 12:11
|
|
# REVISION: 1.0
|
|
#===============================================================================
|
|
|
|
set -o nounset # Treat unset variables as an error
|
|
|
|
### import: import a smbpasswd file
|
|
# Arguments:
|
|
# file) file to import
|
|
# Return: user(s) added to container
|
|
import() { local name id file="${1}"
|
|
while read name id; do
|
|
useradd "$name" -M -u "$id"
|
|
done < <(cut -d: -f1,2 --output-delimiter=' ' $file)
|
|
pdbedit -i smbpasswd:$file
|
|
}
|
|
|
|
### share: Add share
|
|
# Arguments:
|
|
# share) share name
|
|
# path) path to share
|
|
# browsable) 'yes' or 'no'
|
|
# readonly) 'yes' or 'no'
|
|
# guest) 'yes' or 'no'
|
|
# users) list of allowed users
|
|
# admins) list of admin users
|
|
# Return: result
|
|
share() { local share="$1" path="$2" browsable=${3:-yes} ro=${4:-yes} \
|
|
guest=${5:-yes} users=${6:-""} admins=${7:-""} \
|
|
file=/etc/samba/smb.conf
|
|
sed -i "/\\[$share\\]/,/^\$/d" $file
|
|
echo "[$share]" >>$file
|
|
echo " path = $path" >>$file
|
|
echo " browsable = $browsable" >>$file
|
|
echo " read only = $ro" >>$file
|
|
echo " guest ok = $guest" >>$file
|
|
[[ ${users:-""} && ! ${users:-""} =~ all ]] &&
|
|
echo " valid users = $(tr ',' ' ' <<< $users)" >>$file
|
|
[[ ${admins:-""} && ! ${admins:-""} =~ none ]] &&
|
|
echo " admin users = $(tr ',' ' ' <<< $admins)" >>$file
|
|
echo -e "" >>$file
|
|
}
|
|
|
|
### timezone: Set the timezone for the container
|
|
# Arguments:
|
|
# timezone) for example EST5EDT
|
|
# Return: the correct zoneinfo file will be symlinked into place
|
|
timezone() { local timezone="${1:-EST5EDT}"
|
|
[[ -e /usr/share/zoneinfo/$timezone ]] || {
|
|
echo "ERROR: invalid timezone specified: $timezone" >&2
|
|
return
|
|
}
|
|
|
|
if [[ $(cat /etc/timezone) != $timezone ]]; then
|
|
echo "$timezone" >/etc/timezone
|
|
ln -sf /usr/share/zoneinfo/$timezone /etc/localtime
|
|
dpkg-reconfigure -f noninteractive tzdata >/dev/null 2>&1
|
|
fi
|
|
}
|
|
|
|
### user: add a user
|
|
# Arguments:
|
|
# name) for user
|
|
# password) for user
|
|
# Return: user added to container
|
|
user() { local name="${1}" passwd="${2}"
|
|
useradd "$name" -M
|
|
echo "$passwd" | tee - | smbpasswd -s -a "$name"
|
|
}
|
|
|
|
### workgroup: set the workgroup
|
|
# Arguments:
|
|
# workgroup) the name to set
|
|
# Return: configure the correct workgroup
|
|
user() { local workgroup="${1}" file=/etc/samba/smb.conf
|
|
sed -i 's/^\( *workgroup = \).*/\1'"$workgroup"'/' $file
|
|
}
|
|
|
|
### usage: Help
|
|
# Arguments:
|
|
# none)
|
|
# Return: Help text
|
|
usage() { local RC=${1:-0}
|
|
echo "Usage: ${0##*/} [-opt] [command]
|
|
Options (fields in '[]' are optional, '<>' are required):
|
|
-h This help
|
|
-i \"<path>\" Import smbpassword
|
|
required arg: \"<path>\" - full file path in container
|
|
-n Start the 'nmbd' daemon to advertise the shares
|
|
-s \"<name;/path>[;browsable;readonly;guest;users]\" Configure a share
|
|
required arg: \"<name>;<comment>;</path>\"
|
|
<name> is how it's called for clients
|
|
<path> path to share
|
|
NOTE: for the default value, just leave blank
|
|
[browsable] default:'yes' or 'no'
|
|
[readonly] default:'yes' or 'no'
|
|
[guest] allowed default:'yes' or 'no'
|
|
[users] allowed default:'all' or list of allowed users
|
|
[admins] allowed default:'none' or list of admin users
|
|
-t \"\" Configure timezone
|
|
possible arg: \"[timezone]\" - zoneinfo timezone for container
|
|
-u \"<username;password>\" Add a user
|
|
required arg: \"<username>;<passwd>\"
|
|
<username> for user
|
|
<password> for user
|
|
-w \"<workgroup>\" Configure the workgroup (domain) samba should use
|
|
required arg: \"<workgroup>\"
|
|
<workgroup> for samba
|
|
|
|
The 'command' (if provided and valid) will be run instead of samba
|
|
" >&2
|
|
exit $RC
|
|
}
|
|
|
|
while getopts ":hi:ns:t:u:w:" opt; do
|
|
case "$opt" in
|
|
h) usage ;;
|
|
i) import "$OPTARG" ;;
|
|
n) NMBD="true" ;;
|
|
s) eval share $(sed 's/^\|$/"/g; s/;/" "/g' <<< $OPTARG) ;;
|
|
t) timezone "$OPTARG" ;;
|
|
u) eval user $(sed 's/;/ /g' <<< $OPTARG) ;;
|
|
w) workgroup "$OPTARG" ;;
|
|
"?") echo "Unknown option: -$OPTARG"; usage 1 ;;
|
|
":") echo "No argument value for option: -$OPTARG"; usage 2 ;;
|
|
esac
|
|
done
|
|
shift $(( OPTIND - 1 ))
|
|
|
|
[[ "${TZ:-""}" ]] && timezone "$TZ"
|
|
[[ "${WORKGROUP:-""}" ]] && workgroup "$WORKGROUP"
|
|
|
|
if [[ $# -ge 1 && -x $(which $1 2>&-) ]]; then
|
|
exec "$@"
|
|
elif [[ $# -ge 1 ]]; then
|
|
echo "ERROR: command not found: $1"
|
|
exit 13
|
|
elif ps -ef | egrep -v grep | grep -q smbd; then
|
|
echo "Service already running, please restart container to apply changes"
|
|
else
|
|
[[ ${NMBD:-""} ]] && ionice -c 3 nmbd -D
|
|
exec ionice -c 3 smbd -FS
|
|
fi |