diff options
Diffstat (limited to 'net/samba422/files/samba_server.in')
| -rw-r--r-- | net/samba422/files/samba_server.in | 253 | 
1 files changed, 253 insertions, 0 deletions
| diff --git a/net/samba422/files/samba_server.in b/net/samba422/files/samba_server.in new file mode 100644 index 000000000000..99c9b64cc78d --- /dev/null +++ b/net/samba422/files/samba_server.in @@ -0,0 +1,253 @@ +#!/bin/sh + +# PROVIDE: samba_server +# REQUIRE: NETWORKING SERVERS DAEMON ldconfig resolv ntpd %%SAMBA4_SERVICES%% +# BEFORE: LOGIN +# KEYWORD: shutdown + +# Add the following lines to /etc/rc.conf.local or /etc/rc.conf +# to enable this service: +# +#samba_server_enable=YES +# +# You can disable/enable any of the Samba daemons by specifying: +#samba_enable=NO +#nmbd_enable=NO +#smbd_enable=NO +# You need to enable winbindd separately, by adding: +#winbindd_enable=YES +# Configuration file can be set with: +#samba_server_config=%%SAMBA4_CONFDIR%%/%%SAMBA4_CONFIG%% +# +# shellcheck disable=SC2034,SC2086,SC3043 + +# shellcheck source=/dev/null +. /etc/rc.subr + +name=samba_server +rcvar=samba_server_enable +desc="Samba4 server startup script" + +# Load configuration +load_rc_config "${name}" + +# Custom commands +extra_commands="reload status configtest" + +start_precmd=samba_server_prestart +restart_precmd=samba_server_checkconfig +reload_precmd=samba_server_checkconfig +start_cmd=samba_server_cmd +stop_cmd=samba_server_cmd +status_cmd=samba_server_cmd +configtest_cmd=samba_server_checkconfig +reload_cmd=samba_server_reload_cmd +rcvar_cmd=samba_server_rcvar_cmd +stop_postcmd=samba_server_poststop +# Defaults +samba_server_config_default=%%SAMBA4_CONFDIR%%/%%SAMBA4_CONFIG%% +smbcontrol_command=%%PREFIX%%/bin/smbcontrol + +samba_server_checkconfig() +{ +    printf "Performing sanity check on Samba configuration: " +    if ${testparm_command} >/dev/null 2>&1; then +        echo "OK" +    else +        echo "FAILED" +        return 1 +    fi +} + +samba_server_prestart() +{ +    samba_server_checkconfig +    # Make sure we have our RUNDIR, even if it's on a tmpfs +    if [ -d "${samba_server_piddir}" ] || [ ! -e "${samba_server_piddir}" ]; then +        install -d -m 0755 "${samba_server_piddir}" +    fi +    # https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=200186 +    if [ -d "${samba_server_privatedir}" ] || [ ! -e "${samba_server_privatedir}" ]; then +        install -d -m 0700 "${samba_server_privatedir}" +    fi +    #  +    if ! df -t fdescfs -T "${samba_server_piddir}/fd" >/dev/null 2>&1; then +        install -d -m 0555 "${samba_server_piddir}/fd" +        if can_mount fdescfs; then +            mount -t fdescfs -o nodup none "${samba_server_piddir}/fd" +        else +            warn "${name}: cannot fdescfs mount to ${samba_server_piddir}/fd" +        fi +    fi +} + +samba_server_poststop() +{ +    if df -t fdescfs -T "${samba_server_piddir}/fd" >/dev/null 2>&1; then +        if can_mount fdescfs; then +            umount "${samba_server_piddir}/fd" +        fi +    fi +} + +samba_server_rcvar_cmd() +{ +    local name rcvar desc +    rcvar=${name}_enable +    # Prevent recursive calling +    unset "${rc_arg}_cmd" "${rc_arg}_precmd" "${rc_arg}_postcmd" +    # Check master variable +    run_rc_command "${_rc_prefix}${rc_arg}" ${rc_extra_args} +    # Check dependent variables +    #unset desc +    for name in ${samba_daemons}; do +        # reset loop vars +        rcvars=''; v='' +        rcvar=${name}_enable +        eval "desc=\${${name}_desc}" +        run_rc_command "${_rc_prefix}${rc_arg}" ${rc_extra_args} +    done +} + +samba_server_reload_cmd() +{ +    local name rcvar command pidfile force_run +    # Prevent recursive calling +    unset "${rc_arg}_cmd" "${rc_arg}_precmd" "${rc_arg}_postcmd" +    # Ignore rcvar and run command +    if [ -n "${_rc_prefix}" ] && [ "${_rc_prefix}" = "one" ] || [ -n "${rc_force}" ] || [ -n "${rc_fast}" ]; then +        force_run=yes +    fi +    # Apply to all daemons +    for name in ${samba_daemons}; do +        rcvar=${name}_enable +        command="%%PREFIX%%/sbin/${name}" +        pidfile="${samba_server_piddir}/${name}.pid" +        # Daemon should be enabled and running +        if ( [ -n "${rcvar}" ] && checkyesno "${rcvar}" ) || [ -n "$force_run" ]; then +            if [ -n "$(check_pidfile "${pidfile}" "${command}")" ]; then +                debug "reloading ${name} configuration" +                echo "Reloading ${name}." +                ${smbcontrol_command} "${name}" 'reload-config' ${command_args} >/dev/null 2>&1 +            fi +        fi +    done +} + +samba_server_cmd() +{ +    local name rcvar rcvars v command pidfile samba_daemons samba_postcmd result force_run +    # Stop processes in the reverse order +    if [ "${rc_arg}" = "stop" ] ; then +        samba_daemons=$(reverse_list ${samba_daemons}) +    fi +    # Within the cmd itself we operate with the global _precmd, _cmd and _postcmd +    samba_postcmd=$_postcmd +    # Prevent recursive calling +    unset "${rc_arg}_cmd" "${rc_arg}_precmd" "${rc_arg}_postcmd" +    # Ignore rcvar and run command +    if [ -n "${_rc_prefix}" ] && [ "${_rc_prefix}" = "one" ] || [ -n "${rc_force}" ] || [ -n "${rc_fast}" ]; then +        force_run=yes +    fi +    # Assume success +    result=0 +    # Apply to all daemons +    for name in ${samba_daemons}; do +        # XXX +        #rcvars=''; v='' +        rcvar=${name}_enable +        command="%%PREFIX%%/sbin/${name}" +        pidfile="${samba_server_piddir}/${name}.pid" +        # Daemon should be enabled and running +        if ( [ -n "${rcvar}" ] && checkyesno "${rcvar}" ) || [ -n "$force_run" ]; then +            run_rc_command "${_rc_prefix}${rc_arg}" ${rc_extra_args} +            # If any of the commands failed, take it as a global result +            result=$((result || $?)) +        fi +    done +    if [ -n "${samba_postcmd}" ]; then +        eval "_postcmd=${samba_postcmd}" +    fi +    return $result +} + +samba_server_config_init() +{ +    local name +    # Defaults +    samba_server_enable=${samba_server_enable:=NO} +    samba_server_config=${samba_server_config=${samba_server_config_default}} +    samba_server_configfile_arg=${samba_server_config:+--configfile="${samba_server_config}"}                   #" +    #testparm_command="%%PREFIX%%/bin/samba-tool testparm --suppress-prompt --verbose ${samba_server_configfile_arg}" +    testparm_command="%%PREFIX%%/bin/testparm --suppress-prompt --verbose ${samba_server_config}" +    # Determine what daemons are necessary to run Samba in the current role +    samba_server_role=$(${testparm_command} --parameter-name='server role' 2>/dev/null) +    case "${samba_server_role}" in +        active\ directory\ domain\ controller) +            samba_daemons="samba" +            ;; +        auto|*) +            samba_daemons="nmbd smbd winbindd" +            ;; +    esac +    # Load daemons configuration +    for name in ${samba_daemons}; do +        load_rc_config "${name}" +        # If samba_server_enable is 'YES' +        if [ -n "${rcvar}" ] && checkyesno "${rcvar}"; then +            if [ "${name}" != "winbindd" ]; then +                # Set variable to 'YES' only if it is unset +                eval "${name}_enable=\${${name}_enable-YES}" +            else +                # Winbindd +                samba_server_idmap=$(${testparm_command} --parameter-name='idmap uid' 2>/dev/null) +                if [ -n "${samba_server_idmap}" ]; then +                    winbindd_enable="YES" +                fi +            fi +        fi +        # If variable is empty, set it to 'NO' +        eval "${name}_enable=\${${name}_enable:-NO}" +    done +    # Fetch parameters from configuration file +    samba_server_lockdir="$(${testparm_command} --parameter-name='lock directory' 2>/dev/null)" +    samba_server_lockdir=${samba_server_lockdir:=%%SAMBA4_LOCKDIR%%} +    samba_server_piddir="$(${testparm_command} --parameter-name='pid directory' 2>/dev/null)" +    samba_server_piddir=${samba_server_piddir:=%%SAMBA4_RUNDIR%%} +    samba_server_privatedir="$(${testparm_command} --parameter-name='private dir' 2>/dev/null)" +    samba_server_privatedir=${samba_server_privatedir:=%%SAMBA4_PRIVATEDIR%%} +} + +can_mount() +{ +    local kld +    kld=$1 +    if ! load_kld $kld; then +        return 1 +    fi +    if [ $(${SYSCTL_N} security.jail.jailed) -eq 0 ]; then +        return 0 +    fi +    if [ $(${SYSCTL_N} security.jail.mount_allowed) -eq 1 ] && +       [ $(${SYSCTL_N} security.jail.mount_${kld}_allowed) -eq 1 ]; then +        return 0 +    fi +    return 1 +} + +# Load configuration variables +samba_server_config_init +nmbd_desc="NetBIOS name server" +smbd_desc="SMB/CIFS services server" +winbindd_desc="Name Service Switch server" +# Common flags +command_args=${samba_server_configfile_arg} +samba_flags=${samba_flags="--daemon"} +nmbd_flags=${nmbd_flags="--daemon"} +smbd_flags=${smbd_flags="--daemon"} +winbindd_flags=${winbindd_flags="--daemon"} +# Requirements +required_files="${samba_server_config}" +required_dirs="${samba_server_lockdir}" + +run_rc_command "$1" | 
