#!/bin/sh
#
# Samba plugin
# Author: Shun-ichi TAHARA <jado@flowernet.gr.jp>
# Time-stamp: <04/10/18 12:58:35 jado@sheira>
#
# Copyright (c) 2001-2004 Shun-ichi TAHARA
#
# This program 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 2 of the License, or
# (at your option) any later version.
#

# Additional settings going into /etc/network.conf:
# *: Required when NTDOMAIN=auth.
#
#   WORKGROUP : NETBIOS workgroup/domain [NETBIOS groupname]
#   NTDOMAIN  : Join NETBIOS domain      [y|auth|n]
# * PDC       : NETBIOS PDC              [NETBIOS nickname]
#   WINS      : NETBIOS nameserver       [+ (from DHCP)|IPaddr]

SAMBADEV=$PLUGINSTATE/smb.devices
SAMBAVAR=$PLUGINSTATE/smb.vars

samba_update ()
{
    killall -KILL smbd nmbd > /dev/null 2>&1

    if [ -s $SAMBADEV ]; then
	cat $SAMBADEV | /usr/bin/awk '
	    BEGIN{
		wins = 0;
		domain = 0;
		workgroup = "";
		pdc = "";
		interface = "";
	    }
	    /^wins +[^ ]+/{
		if (!wins) {
		    printf("wins server = %s\n", $2);
		    wins = 1;
		}
	    }
	    /^join-domain +[^ ]+/{
		if (domain < 3) {
		    workgroup = $2;
		    if ($3 != "")
			pdc = $3;
		    else
			pdc = "*";
		    domain = 3;
		}
	    }
	    /^use-domain +[^ ]+/{
		if (domain < 2) {
		    workgroup = $2;
		    pdc = $3
		    domain = 2;
		}
	    }
	    /^workgroup +[^ ]+/{
		if (domain < 1) {
		    workgroup = $2;
		    domain = 1;
		}
	    }
	    /^interface +[^ ]+/{
		interface = (interface " " $2);
	    }
	    END{
		if (domain == 1) {
		    printf("security = user\n");
		    printf("workgroup = %s\n", workgroup);
		} else if (domain == 2) {
		    printf("security = server\n");
		    printf("workgroup = %s\n", workgroup);
		    printf("password server = %s\n", pdc);
		} else if (domain == 3) {
		    printf("security = domain\n");
		    printf("workgroup = %s\n", workgroup);
		    printf("password server = %s\n", pdc);
		}
		if (interface) {
		    printf("interfaces =%s\n", interface);
		}
	    }
	' > $SAMBAVAR

	if [ -x /usr/sbin/smbd ]; then
	    /usr/sbin/smbd -D
	    /usr/sbin/nmbd -D
	else
	    echo "Please install Samba to work with WORKGROUP."
	fi
    else
	echo -n > $SAMBAVAR
    fi
}

# Variables definition

samba_VARS="WORKGROUP NTDOMAIN PDC WINS:netbios_name_servers"

# Script on beginning

samba_begin ()
{
    # Make Samba domain configuration
    touch $SAMBADEV
    /usr/bin/sed -e "/# $1 begin/,/# $1 end/d" $SAMBADEV > $SAMBADEV.N

    if [ -n "$WORKGROUP" ]; then
	echo "# $1 begin domain" >> $SAMBADEV.N
	case "$NTDOMAIN" in
	y|Y|yes|YES)
	    echo "join-domain $WORKGROUP $PDC" >> $SAMBADEV.N
	    ;;
	a|A|auth|AUTH)
	    echo "use-domain $WORKGROUP $PDC" >> $SAMBADEV.N
	    ;;
	*)
	    echo "workgroup $WORKGROUP" >> $SAMBADEV.N
	esac
	echo "# $1 end domain" >> $SAMBADEV.N
    fi

    mv $SAMBADEV.N $SAMBADEV
}

# Script on starting

samba_start ()
{
    # Update Samba stuff
    /usr/bin/sed -e "/# $1 begin device/,/# $1 end device/d" \
	$SAMBADEV > $SAMBADEV.N

    if /usr/bin/grep -q "# $1 begin domain" $SAMBADEV.N; then
	echo "# $1 begin device" >> $SAMBADEV.N
	echo "interface $IPADDR/$NETMASK" >> $SAMBADEV.N
	if [ -n "$WINS" ]; then
	    echo "wins $WINS" >> $SAMBADEV.N
	fi
	echo "# $1 end device" >> $SAMBADEV.N
    fi

    mv $SAMBADEV.N $SAMBADEV
    samba_update
}

# Script on ending

samba_end ()
{
    # Revove Samba domain configuration
    /usr/bin/sed -e "/# $1 begin domain/,/# $1 end domain/d" \
	$SAMBADEV > $SAMBADEV.N

    mv $SAMBADEV.N $SAMBADEV
}

# Script on stopping

samba_stop ()
{
    # Reset Samba stuff
    /usr/bin/sed -e "/# $1 begin device/,/# $1 end device/d" \
	$SAMBADEV > $SAMBADEV.N

    mv $SAMBADEV.N $SAMBADEV
    samba_update
}
