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
}
|