summaryrefslogtreecommitdiff
path: root/filesystems/nbd-client-kmod/files/gnbd.in
blob: bf54610c7437f0957f371468365df6b9c0aab5e5 (plain) (blame)
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
#!/bin/sh

# PROVIDE: gnbd
# REQUIRE: NETWORKING
#
# Configuration settings for gnbd in /etc/rc.conf:
#
# gnbd_enable (bool):                    Enable gnbd. (default=NO)
# gnbd_devices (list):                   List of devices.
# gnbd_<device>_host (str):              Required. Host to connect to.
# gnbd_<device>_conns (int):             Use this many parallel connections.
# gnbd_<device>_port (int):              Port to connect to.
# gnbd_<device>_exportname (str):        Connect to the named export.
# gnbd_<device>_cacert (str):            Verify TLS connections against the PEM-formatted
#                                        CA certificate at the given path.
# gnbd_<device>_cert (str):              Make a TLS connection using the PEM-formatted
#                                        client certificate at the given path.
# gnbd_<device>_key (str):               Make a TLS connection using the PEM-formatted
#                                        client key at the given path.
# gnbd_<device>_waitsec (int):           Retry until connections are re-established, waiting
#                                        this many seconds between successive retries.
#
# Commands for gnbd:
#
# start:          Connect to <device>.
# stop:           Disconnect from <device>.
# restart:        Reconnect to <device>.
#                 Tip: Use the devd.conf(5) file included with this port.
# status:         Get status of each <device>.
#
# Examples:
#
#   service gnbd start - Connect to all devices.
#   service gnbd stop - Disconnect from all devices.
#   service gnbd start <device> - Connect to a specific device.

. /etc/rc.subr

name="gnbd"
desc="NBD client for FreeBSD GEOM framework"
rcvar="${name}_enable"
start_precmd="gnbd_prestart"
start_cmd="gnbd_start"
stop_cmd="gnbd_stop"
restart_cmd="gnbd_restart"
status_cmd="gnbd_status"
gnbd_bin="%%PREFIX%%/sbin/${name}"

load_rc_config $name

: ${gnbd_enable:="NO"}

gnbd_prestart()
{
	${gnbd_bin} load
}

gnbd_start()
{
    local device="$1"

    local host conns port exportname cacert cert key
    local var

    for var in host conns port exportname cacert cert key; do
        eval ${var}="\${gnbd_${device}_${var}}"

        local value

        eval value="\$${var}"

        if [ -n "${value}" ]; then
            debug "${var}=${value}"
        fi
    done

    if [ -z "${host}" ]; then
        echo "gnbd_${device}_host: host is not configured, ignoring this device..."
        return 1
    fi

    local gnbd_args=

    if [ -n "${conns}" ]; then
        gnbd_args="-c ${conns}"
    fi

    if [ -n "${port}" ]; then
        gnbd_args="${gnbd_args} -p ${port}"
    fi

    if [ -n "${exportname}" ]; then
        gnbd_args="${gnbd_args} -n \"${exportname}\""
    fi

    if [ -n "${cacert}" ]; then
        gnbd_args="${gnbd_args} -A \"${cacert}\""
    fi

    if [ -n "${cert}" ]; then
        gnbd_args="${gnbd_args} -C \"${cert}\""
    fi

    if [ -n "${key}" ]; then
        gnbd_args="${gnbd_args} -K \"${key}\""
    fi

    if [ -n "${gnbd_args}" ]; then
        debug "gnbd args: ${gnbd_args}"
    fi

    if [ ! -c "/dev/${device}" ]; then
        eval ${gnbd_bin} connect ${gnbd_args} ${host}
    fi
}

gnbd_stop()
{
    local device="$1"

    if [ -c "/dev/${device}" ]; then
        ${gnbd_bin} disconnect ${device}
    fi
}

gnbd_restart()
{
    local device="$1"

    local waitsec

    eval waitsec="\${gnbd_${device}_waitsec}"

    local gnbd_args=

    if [ -n "${waitsec}" ]; then
        gnbd_args="-r ${waitsec}"

        debug "waitsec=${waitsec}"
    fi

    if [ -n "${gnbd_args}" ]; then
        debug "gnbd args: ${gnbd_args}"
    fi

    eval ${gnbd_bin} reconnect ${gnbd_args} ${device}
}

gnbd_status()
{
    local device="$1"

    if [ -c "/dev/${device}" ]; then
        ${gnbd_bin} status -s "${device}"
    fi
}

cmd="$1"

if [ $# -gt 0 ]; then
    shift
fi

if [ -n "$1" ]; then
    gnbd_devices="$1"
fi

if [ -z "${gnbd_devices}" ]; then
    warn "No devices are configured, configure one to make this rc script useful!"
fi

for device in ${gnbd_devices}; do
    run_rc_command "${cmd}" "${device}"
done