-
Notifications
You must be signed in to change notification settings - Fork 3.6k
/
Copy pathksmbd.init
215 lines (176 loc) · 6.29 KB
/
ksmbd.init
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
#!/bin/sh /etc/rc.common
START=98
STOP=05
USE_PROCD=1
SMBD_IFACE=""
config_get_sane()
{
config_get "$@"
set -- "$(echo "$1" | tr -d '<>[]{};%?=#\n')"
}
config_get_ram()
{
ramsize=$(grep MemTotal /proc/meminfo | awk '{print $2}')
if [ "$ramsize" -lt 65537 ];then
printf "\tsmb2 max read = 64K\n"
printf "\tsmb2 max write = 64K\n"
printf "\tsmb2 max trans = 64K\n"
printf "\tcache read buffers = no\n"
printf "\tcache trans buffers = no\n"
elif [ "$ramsize" -lt 134073 ];then
printf "\tsmb2 max read = 128K\n"
printf "\tsmb2 max write = 128K\n"
printf "\tsmb2 max trans = 128K\n"
printf "\tcache read buffers = no\n"
printf "\tcache trans buffers = no\n"
elif [ "$ramsize" -lt 262146 ];then
printf "\tsmb2 max read = 1M\n"
printf "\tsmb2 max write = 1M\n"
printf "\tsmb2 max trans = 1M\n"
fi
}
smb_header()
{
config_get_sane SMBD_IFACE "$1" interface "lan"
# resolve interfaces
interfaces=$(
. /lib/functions/network.sh
for net in $SMBD_IFACE; do
network_is_up "$net" || continue
network_get_device device "$net"
printf "%s " "${device:-$net}"
done
)
# we dont use netbios anymore as default and wsd/avahi is dns based
hostname="$(sed 's/\..*//' /proc/sys/kernel/hostname | tr -d '{};%?=#\n')"
config_get_sane workgroup "$1" workgroup "WORKGROUP"
config_get_sane description "$1" description "Ksmbd on OpenWrt"
config_get_bool ALLOW_LEGACY_PROTOCOLS "$1" allow_legacy_protocols 0
sed -e "s#|NAME|#$hostname#g" \
-e "s#|WORKGROUP|#$workgroup#g" \
-e "s#|DESCRIPTION|#$description#g" \
-e "s#|INTERFACES|#$interfaces#g" \
/etc/ksmbd/ksmbd.conf.template > /var/etc/ksmbd/ksmbd.conf
{
config_get_ram
printf "\n######### Dynamic written config options #########\n"
if [ "$ALLOW_LEGACY_PROTOCOLS" -eq 1 ]; then
logger -p daemon.info -t 'ksmbd' "Legacy Protocols allowed, don't use this option for secure environments!"
printf "\tserver min protocol = NT1\n"
printf "\tserver signing = disabled\n"
fi
} >> /var/etc/ksmbd/ksmbd.conf
[ -e /etc/ksmbd/ksmbd.conf ] || ln -nsf /var/etc/ksmbd/ksmbd.conf /etc/ksmbd/ksmbd.conf
if [ ! -L /etc/ksmbd/ksmbd.conf ]; then
logger -p daemon.warn -t 'ksmbd' "Local custom /etc/ksmbd/ksmbd.conf file detected, all UCI/Luci config settings are ignored!"
fi
}
smb_add_share()
{
config_get_sane name "$1" name
config_get_sane path "$1" path
config_get_sane comment "$1" comment
config_get_sane users "$1" users
config_get_sane create_mask "$1" create_mask
config_get_sane dir_mask "$1" dir_mask
config_get_sane browseable "$1" browseable
config_get_sane read_only "$1" read_only
config_get_sane writeable "$1" writeable
config_get_sane guest_ok "$1" guest_ok
config_get_bool force_root "$1" force_root 0
config_get_sane write_list "$1" write_list
config_get_sane read_list "$1" read_list
config_get_sane hide_dot_files "$1" hide_dot_files
config_get_sane veto_files "$1" veto_files
config_get_sane inherit_owner "$1" inherit_owner
config_get_sane force_create_mode "$1" force_create_mode
config_get_sane force_directory_mode "$1" force_directory_mode
[ -z "$name" ] || [ -z "$path" ] && return
{
printf "\n[%s]\n\tpath = %s\n" "$name" "$path"
[ -n "$comment" ] && printf "\tcomment = %s\n" "$comment"
if [ "$force_root" -eq 1 ]; then
printf "\tforce user = %s\n" "root"
printf "\tforce group = %s\n" "root"
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 "$force_create_mode" ] && printf "\tforce create mode = %s\n" "$force_create_mode"
[ -n "$force_directory_mode" ] && printf "\tforce directory mode = %s\n" "$force_directory_mode"
[ -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 "$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"
[ -n "$hide_dot_files" ] && printf "\thide dot files = %s\n" "$hide_dot_files"
[ -n "$veto_files" ] && printf "\tveto files = %s\n" "$veto_files"
} >> /var/etc/ksmbd/ksmbd.conf
}
init_config()
{
mkdir -p /var/etc/ksmbd
config_load ksmbd
CONFIG_APPEND=1 UCI_CONFIG_DIR=/var/run/config config_load ksmbd
config_foreach smb_header globals
config_foreach smb_add_share share
}
service_triggers()
{
# PROCD_RELOAD_DELAY=1000
procd_add_reload_trigger "dhcp" "system" "ksmbd"
for i in $SMBD_IFACE; do
procd_add_reload_interface_trigger "$i"
done
}
kill_server()
{
if [ -e /sys/module/ksmbd ]; then
if [ -e /sys/class/ksmbd-control/kill_server ]; then
logger -p daemon.info -t 'ksmbd' "triggering kill_server"
echo hard > /sys/class/ksmbd-control/kill_server
fi
fi
}
start_service()
{
init_config
if [ ! -e /etc/ksmbd/ksmbd.conf ]; then
logger -p daemon.error -t 'ksmbd' "missing config /etc/ksmbd/ksmbd.conf!"
exit 1
fi
# NOTE: We don't do a soft-reload via signal, since [global] ksmbd.conf setting changes will be ignored, so always reset hard.
[ -e /sys/module/ksmbd ] && stop_service
[ ! -e /sys/module/ksmbd ] && modprobe ksmbd 2> /dev/null
if [ ! -e /sys/module/ksmbd ]; then
logger -p daemon.error -t 'ksmbd' "modprobe of ksmbd module failed, can\'t start ksmbd!"
exit 1
fi
logger -p daemon.notice -t 'ksmbd' "Starting Ksmbd userspace service."
procd_open_instance
procd_add_mdns "smb" "tcp" "445" "daemon=ksmbd"
procd_set_param command /usr/sbin/ksmbd.mountd --n
procd_set_param file /etc/ksmbd/ksmbd.conf
procd_set_param limits nofile=16384
procd_close_instance
}
stop_service()
{
logger -p daemon.notice -t 'ksmbd' "Stopping Ksmbd userspace service."
killall ksmbd.mountd > /dev/null 2>&1
[ -e /sys/module/ksmbd ] && rmmod ksmbd > /dev/null 2>&1
# kill server if we cant rmmod
[ -e /sys/module/ksmbd ] && kill_server
# next try
[ -e /sys/module/ksmbd ] && rmmod ksmbd > /dev/null 2>&1
if [ -e /sys/module/ksmbd ]; then
logger -p daemon.error -t 'ksmbd' "module still loaded after kill_server?"
fi
[ -f /tmp/ksmbd.lock ] && rm /tmp/ksmbd.lock
}
# reload_service() {
# restart "$@"
# }