#!/bin/sh
#
# Samba plugin
#
# Author: Shun-ichi TAHARA <jado@flowernet.gr.jp>
# Time-stamp: <04/03/09 14:18:28 jado@sheira>
#

# 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]

SMBDEV=$PLUGINSTATE/smb.devices
SMBVAR=$PLUGINSTATE/smb.vars

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

    if [ ! -s $SMBDEV ]; then
	echo -n > $SMBDEV
	echo -n > $SMBVAR
    else
	cat $SMBDEV | /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);
		}
	    }
	' > $SMBVAR
    fi

    if [ -s $SMBVAR ]; then
	if [ -x /opt/samba/sbin/smbd ]; then
	    /opt/samba/sbin/smbd -D
	    /opt/samba/sbin/nmbd -D
	else
	    echo "Please install Samba to work with WORKGROUP."
	fi
    fi
}

# Variables definition

samba_VARS="WORKGROUP NTDOMAIN PDC WINS:netbios_name_servers"

# Script on beginning

samba_begin ()
{
    # Make Samba domain configuration
    /usr/bin/sed -e "/# $1 begin/,/# $1 end/d" $SMBDEV > $SMBDEV.N
    if [ -n "$WORKGROUP" ]; then
	echo "# $1 begin domain" >> $SMBDEV.N
	case "$NTDOMAIN" in
	y|Y|yes|YES)
	    echo "join-domain $WORKGROUP $PDC" >> $SMBDEV.N
	    ;;
	a|A|auth|AUTH)
	    echo "use-domain $WORKGROUP $PDC" >> $SMBDEV.N
	    ;;
	*)
	    echo "workgroup $WORKGROUP" >> $SMBDEV.N
	esac
	echo "# $1 end domain" >> $SMBDEV.N
    fi
    mv $SMBDEV.N $SMBDEV
}

# Script on starting

samba_start ()
{
    if [ "$WINS" = "+" ]; then
	WINS=$DHCP_WINS
    fi

    # Update Samba stuff
    /usr/bin/sed -e "/# $1 begin device/,/# $1 end device/d" $SMBDEV > $SMBDEV.N
    if /usr/bin/grep -q "# $1 begin domain" $SMBDEV.N; then
	echo "# $1 begin device" >> $SMBDEV.N
	echo "interface $IPADDR/$NETMASK" >> $SMBDEV.N
	if [ -n "$WINS" ]; then
	    echo "wins $WINS" >> $SMBDEV.N
	fi
	echo "# $1 end device" >> $SMBDEV.N
    fi
    mv $SMBDEV.N $SMBDEV
    samba_update
}

# Script on ending

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

# Script on stopping

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