summaryrefslogtreecommitdiffstats
path: root/net/samba4/files/samba.init
blob: 39686e6cd4ed57f7c7f1a47634072ff3641b72d8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
#!/bin/sh /etc/rc.common

START=98
USE_PROCD=1

smb_header() {
	config_get samba_iface $1 interface "loopback lan"

	# resolve interfaces
	local interfaces
	interfaces=$(
		. /lib/functions/network.sh

		local net
		for net in $samba_iface; do
			local device
			network_is_up $net || continue
			network_get_device device "$net"
			printf "%s " "${device:-$net}"
		done
	)

	local workgroup description charset
	# we dont use netbios anymore as default and wsd/avahi is dns based
	local hostname
	hostname="$(cat /proc/sys/kernel/hostname)"

	config_get workgroup		$1 workgroup	"WORKGROUP"
	config_get description		$1 description	"Samba on OpenWrt"
	config_get charset		$1 charset	"UTF-8"

	config_get_bool MACOS		$1 macos		0
	config_get_bool DISABLE_NETBIOS	$1 disable_netbios	0
	config_get_bool DISABLE_AD_DC	$1 disable_ad_dc	0
	config_get_bool DISABLE_WINBIND	$1 disable_winbind	0

	mkdir -p /var/etc
	sed -e "s#|NAME|#$hostname#g" \
	    -e "s#|WORKGROUP|#$workgroup#g" \
	    -e "s#|DESCRIPTION|#$description#g" \
	    -e "s#|INTERFACES|#$interfaces#g" \
	    -e "s#|CHARSET|#$charset#g" \
	    /etc/samba/smb.conf.template > /var/etc/smb.conf

	{
		printf "\n######### Dynamic written config options #########\n"
		if [ "$DISABLE_NETBIOS" -eq 1 ] || [ ! -x /usr/sbin/nmbd ]; then
			printf "\tdisable netbios = yes\n"
		fi

		local homes
		config_get_bool homes $1 homes 0
		[ $homes -gt 0 ] && {
			cat <<EOT

[homes]
	comment     = Home Directories
	browsable   = no
	writable = yes
	read only   = no
	create mask = 0750
EOT
		}
	} >> /var/etc/smb.conf

	[ -e /etc/samba/smb.conf ] || ln -nsf /var/etc/smb.conf /etc/samba/smb.conf

	if ! [ -L /etc/samba/smb.conf ]; then
		logger -t 'samba4-server' "Local custom /etc/samba/smb.conf file detected, all luci/config settings are ignored!"
	fi

}

smb_add_share() {
	local name
	local path
	local users
	local create_mask
	local dir_mask
	local browseable
	local read_only
	local writeable
	local guest_ok
	local guest_only
	local inherit_owner
	local vfs_objects
	local timemachine
	local timemachine_maxsize
	local force_root
	local write_list
	local read_list

	config_get name $1 name
	config_get path $1 path
	config_get users $1 users
	config_get create_mask $1 create_mask
	config_get dir_mask $1 dir_mask
	config_get browseable $1 browseable
	config_get read_only $1 read_only
	config_get writeable $1 writeable
	config_get guest_ok $1 guest_ok
	config_get guest_only $1 guest_only
	config_get inherit_owner $1 inherit_owner
	config_get vfs_objects $1 vfs_objects
	config_get_bool timemachine	$1 timemachine	0
	config_get timemachine_maxsize $1 timemachine_maxsize
	config_get_bool force_root	$1 force_root	0
	config_get write_list $1 write_list
	config_get read_list $1 read_list

	[ -z "$name" ] || [ -z "$path" ] && return

	{
		printf "\n[$name]\n\tpath = %s\n" "$path"

		if [ "$force_root" -eq 1 ]; then
			printf "\tforce user = root\n"
			printf "\tforce group = root\n"
		else
			[ -n "$users" ] && printf "\tvalid users = %s\n" "$users"
		fi

		[ -n "$create_mask" ] && printf "\tcreate mask = %s\n" "$create_mask"
		[ -n "$dir_mask" ] && printf "\tdirectory mask = %s\n" "$dir_mask"

		[ -n "$browseable" ] && printf "\tbrowseable = %s\n" "$browseable"
		[ -n "$read_only" ] && printf "\tread only = %s\n" "$read_only"
		[ -n "$writeable" ] && printf "\twriteable = %s\n" "$writeable"
		[ -n "$guest_ok" ] && printf "\tguest ok = %s\n" "$guest_ok"
		[ -n "$guest_only" ] && printf "\tguest only = %s\n" "$guest_only"
		[ -n "$inherit_owner" ] && printf "\tinherit owner = %s\n" "$inherit_owner"

		[ -n "$write_list" ] && printf "\twrite list = %s\n" "$write_list"
		[ -n "$read_list" ] && printf "\tread list = %s\n" "$read_list"

		if [ "$MACOS" -eq 1 ]; then
			vfs_objects="catia fruit streams_xattr $vfs_objects"
			printf "\tfruit:encoding = native\n"
			printf "\tfruit:metadata = stream\n"
			printf "\tfruit:veto_appledouble = no\n"
			# avoid mixed shares order for aapl
			if [ "$timemachine" -eq 1 ]; then
				printf "\tfruit:time machine = yes\n"
				[ -n "$timemachine_maxsize" ] && printf "\tfruit:time machine max size = %sG\n" "${timemachine_maxsize}"
			fi
		fi

		[ -n "$vfs_objects" ] && printf "\tvfs objects = %s\n" "$vfs_objects"
	} >> /var/etc/smb.conf
}

init_config() {
	# Create samba dirs
	[ -d /var/lib/samba ] || mkdir -p /var/lib/samba
	[ -d /var/cache/samba ] || mkdir -p /var/cache/samba
	[ -d /var/run/samba ] || mkdir -p /var/run/samba
	[ -d /var/log/samba ] || mkdir -p /var/log/samba
	[ -d /var/lock ] || mkdir -p /var/lock
	chmod 0755 /var/lock

	config_load samba4
	config_foreach smb_header samba
	config_foreach smb_add_share sambashare
}

service_triggers() {
	PROCD_RELOAD_DELAY=2000

	procd_add_reload_trigger "dhcp" "system" "samba4"

	local i
	for i in $samba_iface; do
		procd_add_reload_interface_trigger $i
	done
}

start_service() {
	init_config

	# start main AD-DC daemon, will spawn (smbd,nmbd,winbindd) as needed/configured.
	if [ "$DISABLE_AD_DC" -ne 1 ] && [ -x /usr/sbin/samba ]; then
		procd_open_instance
		procd_set_param command /usr/sbin/samba -F
		procd_set_param respawn
		procd_set_param file /var/etc/smb.conf
		procd_close_instance
	else
		# start fileserver daemon
		procd_open_instance
		procd_set_param command /usr/sbin/smbd -F
		procd_set_param respawn
		procd_set_param file /var/etc/smb.conf
		procd_close_instance

		# start netbios daemon
		if [ "$DISABLE_NETBIOS" -ne 1 ] && [ -x /usr/sbin/nmbd ]; then
			procd_open_instance
			procd_set_param command /usr/sbin/nmbd -F
			procd_set_param respawn
			procd_set_param file /var/etc/smb.conf
			procd_close_instance
		fi
		# start winbind daemon
		if [ "$DISABLE_WINBIND" -ne 1 ] && [ -x /usr/sbin/winbindd ]; then
			procd_open_instance
			procd_set_param command /usr/sbin/winbindd -F
			procd_set_param respawn
			procd_set_param file /var/etc/smb.conf
			procd_close_instance
		fi
	fi
	# lower priority using renice (if found)
	if [ -x /usr/bin/renice ]; then
		[ -x /usr/sbin/samba ] && renice -n 2 $(pidof samba)
		[ -x /usr/sbin/smbd ] && renice -n 2 $(pidof smbd)
		[ -x /usr/sbin/nmbd ] && renice -n 2 $(pidof nmbd)
		[ -x /usr/sbin/winbindd ] && renice -n 2 $(pidof winbindd)
	fi
}