#!/bin/sh
##
## Samba: Convert share definitions in the smb.conf into a TSV
## Copyright (c) 2006-2007 SATOH Fumiyasu @ OSS Technology Co., Japan
##
## Usage: smbconf2tsv </etc/samba/smb.conf >samba-share.tsv
##

{ cat; echo '[dummy]'; } \
|env LC_ALL=C sed \
    -e 's/\t\t*/ /g;s/^ *//;s/ *$//;s/^[;#].*$//;s/ *= */=/' \
    -e 's/=[tT][rR][uU][eE]$/=yes/' \
    -e 's/=[fF][aA][lL][sS][eE]$/=no/' \
    -e 's/^read only=yes/write ok=no/;s/^read only=no/write ok=yes/' \
    -e 's/^public=/guest ok=/' \
|awk -F= '
    BEGIN {
	print "share\tpath\ttype\tcomment\tbrowse ok\tvalid users\tinvalid users\tguest ok\twrite ok\twrite list\tread list"
	type="file-share"
	global_path="/tmp"
	global_guest_ok="no"
	global_browse_ok="no"
	global_write_ok="no"
    }
    /\[(.*)\]/ {
	if (share != "" && share != "global") {
	    print share"\t"path"\t"type"\t"comment"\t"browse_ok"\t"valid_users"\t"invalid_users"\t"guest_ok"\t"write_ok"\t"write_list"\t"read_list
	}
	share=substr($1,2,length($1)-2)
	type="file-share"
	path=global_path
	comment=""
	browse_ok=global_browse_ok
	valid_users=""
	invalid_users=""
	guest_ok=global_guest_ok
	write_ok=global_write_ok
	write_list=""
	read_list=""
    }
    $1 == "path" {
	if (share == "global") {
	    global_path=$2
	}
	else {
	    path=$2
	}
    }
    $1 == "comment" { comment=$2 }
    $1 ~ /^brows(able|eable|e ok)$/ {
	if (share == "global") {
	    global_browse_ok=$2
	}
	else {
	    browse_ok=$2
	}
    }
    $1 ~ /^print(able| ok)$/ && $2 ~ /^(ok|yes)$/ { type="printer-share" }
    $1 == "valid users" { valid_users=$2 }
    $1 == "invalid users" { invalid_users=$2 }
    $1 == "guest ok" { guest_ok=$2 }
    $1 ~ /^writ(able|eable|e ok)$/ {
	if (share == "global") {
	    global_write_ok=$2
	}
	else {
	    write_ok=$2
	}
    }
    $1 == "write list" { write_list=$2 }
    $1 == "read list" { read_list=$2 }
'

