blob: c676159e0fa417fbc57d4d813e75b2c1861a3f21 (
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
|
#!/bin/sh /etc/rc.common
START=98
USE_PROCD=1
CIFSD_IFACE=""
smb_header()
{
config_get CIFSD_IFACE $1 interface "lan"
# resolve interfaces
local interfaces
interfaces=$(
. /lib/functions/network.sh
local net
for net in $CIFSD_IFACE; do
local device
network_is_up $net || continue
network_get_device device "$net"
echo -n "${device:-$net} "
done
)
local workgroup description
local hostname
hostname="$(cat /proc/sys/kernel/hostname)"
config_get workgroup $1 workgroup "WORKGROUP"
config_get description $1 description "Cifsd on OpenWrt"
sed -e "s#|NAME|#$hostname#g" \
-e "s#|WORKGROUP|#$workgroup#g" \
-e "s#|DESCRIPTION|#$description#g" \
-e "s#|INTERFACES|#$interfaces#g" \
/etc/cifs/smb.conf.template > /var/etc/cifs/smb.conf
[ -e /etc/cifs/smb.conf ] || ln -nsf /var/etc/cifs/smb.conf /etc/cifs/smb.conf
if [ ! -L /etc/cifs/smb.conf ]; then
logger -t 'cifsd' "Local custom /etc/cifs/smb.conf file detected, all UCI/Luci config settings are ignored!"
fi
}
smb_add_share()
{
local name
local path
local comment
local users
local create_mask
local dir_mask
local browseable
local read_only
local writeable
local guest_ok
local force_root
local write_list
local read_list
local hide_dot_files
local veto_files
local inherit_owner
local force_create_mode
local force_directory_mode
config_get name $1 name
config_get path $1 path
config_get comment $1 comment
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_bool force_root $1 force_root 0
config_get write_list $1 write_list
config_get read_list $1 read_list
config_get_bool hide_dot_files $1 hide_dot_files 0
config_get veto_files $1 veto_files
config_get inherit_owner $1 inherit_owner
config_get force_create_mode $1 force_create_mode
config_get 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"
[ "$hide_dot_files" -eq 1 ] && printf "\thide dot files = %s\n" "yes"
[ -n "$veto_files" ] && printf "\tveto files = %s\n" "$veto_files"
} >> /var/etc/cifs/smb.conf
}
init_config()
{
mkdir -p /var/etc/cifs
config_load cifsd
# allow copy&paste from samba UCI configs (we dont have a cifsd wiki yet)
config_foreach smb_header globals
config_foreach smb_header samba
config_foreach smb_add_share share
config_foreach smb_add_share sambashare
}
service_triggers()
{
PROCD_RELOAD_DELAY=2000
procd_add_reload_trigger "dhcp" "system" "cifsd"
local i
for i in $CIFSD_IFACE; do
procd_add_reload_interface_trigger $i
done
}
start_service()
{
init_config
if [ ! -e /etc/cifs/smb.conf ]; then
logger -t 'cifsd' "missing config /etc/cifs/smb.conf, needs to-be created manually!"
exit 1
fi
modprobe cifsd 2> /dev/null
if [ ! -e /sys/module/cifsd ]; then
logger -t 'cifsd' "modprobe of cifsd module failed, can\'t start cifsd!"
exit 1
fi
logger -t 'cifsd' "Starting CIFS/SMB userspace service."
procd_open_instance
procd_set_param command /usr/sbin/cifsd --n
procd_close_instance
}
stop_service()
{
logger -t 'cifsd' "Stopping CIFSD userspace service."
killall cifsd > /dev/null 2>&1
sleep 1
[ -e /sys/class/cifsd-control/kill_server ] && echo hard > /sys/class/cifsd-control/kill_server
sleep 2
[ -e /sys/module/cifsd ] && rmmod cifsd > /dev/null 2>&1
# With open smb connections rmmod takes longer
if [ -e /sys/module/cifsd ]; then
sleep 5
rmmod cifsd > /dev/null 2>&1
fi
[ -f /tmp/cifsd.lock ] && rm /tmp/cifsd.lock
}
reload_service() {
stop_service "$@"
sleep 1
start_service "$@"
}
|