Add input validation to most of the config questions.

> Some people, when confronted with a problem, think "I know, I'll use regular expressions."
> Now they have two problems.

Dongle "device index" actually accepts serial numbers too, document that.
This commit is contained in:
Oliver Jowett 2014-12-10 20:26:51 +00:00
parent 9fa09e0e92
commit 55ecde9d53
4 changed files with 184 additions and 35 deletions

2
debian/changelog vendored
View file

@ -7,6 +7,8 @@ dump1090-mutability (1.08.2302.14+1mu-3) UNRELEASED; urgency=medium
* Use the package version as the version number compiled into the binary. * Use the package version as the version number compiled into the binary.
* Add data/receiver.json (generated once) and support for it in script.js. * Add data/receiver.json (generated once) and support for it in script.js.
* Internal webserver rearrangement to support multiple json files. * Internal webserver rearrangement to support multiple json files.
* Dongle "device index" actually accepts serial numbers too, document that.
* Add input validation to most of the config questions.
-- Oliver Jowett <oliver@mutability.co.uk> Wed, 10 Dec 2014 02:01:27 +0000 -- Oliver Jowett <oliver@mutability.co.uk> Wed, 10 Dec 2014 02:01:27 +0000

View file

@ -19,7 +19,7 @@ LOGFILE=
# Receiver options # Receiver options
# #
# RTLSDR device index to use # RTLSDR device index or serial number to use
# If set to "none", dump1090 will be started in --net-only mode # If set to "none", dump1090 will be started in --net-only mode
DEVICE= DEVICE=

View file

@ -52,47 +52,148 @@ fi
# Ask questions. # Ask questions.
db_input_verify() {
# $1 = priority
# $2 = db key
# $3 = verification function, should return 0 if OK
PRI=$1; KEY=$2; VERIFY=$3
set +e
db_input $PRI $KEY; RESULT=$?
db_go
set -e
while :
do
db_get $KEY
if $VERIFY $RET; then return 0; fi
if [ $RESULT -ne 0 ]; then
# db_input failed, and the existing value does not validate
if [ $RESULT = 30 ] && [ $PRI != high ]
then
# question wasn't displayed, but existing value is invalid
# bump priority and try again
PRI=high
else
# give up, use the default value
db_reset $KEY
return 0
fi
fi
# db_input was OK, but the value did not verify.
# display an error and try again.
set +e
db_input high dump1090-mutability/invalid-$VERIFY
db_fset $KEY seen false
db_input high $KEY; RESULT=$?
db_go
set -e
done
}
is_unsigned_int() {
if echo "$1" | grep -Eq '^(0|+?[1-9][0-9]*)$'; then return 0; else return 1; fi
}
is_unsigned_int_or_empty() {
if [ -z "$1" ]; then return 0
elif is_unsigned_int "$1"; then return 0
else return 1; fi
}
is_signed_int() {
if echo "$1" | grep -Eq '^(0|[+-]?[1-9][0-9]*)$'; then return 0; else return 1; fi
}
is_signed_int_or_empty() {
if [ -z "$1" ]; then return 0
elif is_signed_int "$1"; then return 0
else return 1; fi
}
is_ipaddrish() {
if echo "$1" | grep -Eq '^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$'; then return 0; else return 1; fi
}
is_ipaddrish_or_empty() {
if [ -z "$1" ]; then return 0
elif is_ipaddrish "$1"; then return 0
else return 1; fi
}
is_number() {
if echo "$1" | grep -Eq '^(0|[+-]?[1-9][0-9]*)(\.[0-9]+)?$'; then return 0; else return 1; fi
}
is_number_or_empty() {
if [ -z "$1" ]; then return 0
elif is_number "$1"; then return 0;
else return 1; fi
}
is_valid_gain() {
if is_number "$1"; then return 0;
elif [ "$1" = "max" ]; then return 0;
elif [ "$1" = "agc" ]; then return 0;
else return 1; fi
}
is_not_empty() {
if [ -z "$1" ]; then return 1; else return 0; fi
}
is_port_number() {
if is_unsigned_int "$1"; then
if [ "$1" -eq 0 ]; then return 0; fi
if [ "$1" -lt 1024 ]; then return 1; fi
if [ "$1" -gt 65535 ]; then return 1; fi
return 0
else
return 1
fi
}
db_input high $NAME/auto-start || true db_input high $NAME/auto-start || true
db_go || true; db_get $NAME/auto-start; if [ "$RET" = "true" ]; then db_go || true; db_get $NAME/auto-start; if [ "$RET" = "true" ]; then
# all of these are only relevant if the init script is enabled # all of these are only relevant if the init script is enabled
db_input low $NAME/run-as-user || true db_input_verify low $NAME/run-as-user is_not_empty || true
db_input low $NAME/log-file || true db_input_verify low $NAME/log-file is_not_empty || true
db_input medium $NAME/rtlsdr-device || true db_input medium $NAME/rtlsdr-device || true
db_go || true; db_get $NAME/rtlsdr-device; if [ "x$RET" != "xnone" ]; then db_go || true; db_get $NAME/rtlsdr-device; if [ "x$RET" != "xnone" ]; then
# only if a real device was chosen: # only if a real device was chosen:
db_input medium $NAME/rtlsdr-gain || true db_input_verify medium $NAME/rtlsdr-gain is_valid_gain || true
db_input medium $NAME/rtlsdr-ppm || true db_input_verify medium $NAME/rtlsdr-ppm is_signed_int || true
db_input low $NAME/rtlsdr-oversample || true db_input low $NAME/rtlsdr-oversample || true
fi fi
db_input low $NAME/decode-fix-crc || true db_input low $NAME/decode-fix-crc || true
db_input low $NAME/decode-aggressive || true db_input low $NAME/decode-aggressive || true
db_input medium $NAME/decode-lat || true db_input_verify medium $NAME/decode-lat is_number_or_empty || true
db_go || true; db_get $NAME/decode-lat; if [ -n "$RET" ]; then db_go || true; db_get $NAME/decode-lat; if [ -n "$RET" ]; then
# only if latitude was given: # only if latitude was given:
db_input medium $NAME/decode-lon || true db_input_verify medium $NAME/decode-lon is_number_or_empty || true
fi fi
db_input medium $NAME/net-http-port || true db_input_verify medium $NAME/net-http-port is_port_number || true
db_input low $NAME/net-ri-port || true db_input_verify low $NAME/net-ri-port is_port_number || true
db_input low $NAME/net-ro-port || true db_input_verify low $NAME/net-ro-port is_port_number || true
db_input low $NAME/net-bi-port || true db_input_verify low $NAME/net-bi-port is_port_number || true
db_input low $NAME/net-bo-port || true db_input_verify low $NAME/net-bo-port is_port_number || true
db_input low $NAME/net-sbs-port || true db_input_verify low $NAME/net-sbs-port is_port_number || true
db_input low $NAME/net-fatsv-port || true db_input_verify low $NAME/net-fatsv-port is_port_number || true
db_input low $NAME/net-heartbeat || true db_input_verify low $NAME/net-heartbeat is_unsigned_int || true
db_input low $NAME/net-out-size || true db_input_verify low $NAME/net-out-size is_unsigned_int || true
db_input low $NAME/net-out-interval || true db_input_verify low $NAME/net-out-interval is_unsigned_int || true
db_input low $NAME/net-buffer || true db_input_verify low $NAME/net-buffer is_unsigned_int || true
db_input medium $NAME/net-bind-address || true db_input_verify medium $NAME/net-bind-address is_ipaddrish_or_empty || true
db_input low $NAME/stats-interval || true db_input_verify low $NAME/stats-interval is_unsigned_int || true
db_input low $NAME/json-interval || true db_input_verify low $NAME/json-interval is_unsigned_int || true
db_go || true; db_get $NAME/json-interval; if [ -n "$RET" ] && [ "$RET" -gt 0 ]; then db_go || true; db_get $NAME/json-interval; if [ -n "$RET" ] && [ "$RET" -gt 0 ]; then
# only if json-interval was given and non-zero # only if json-interval was given and non-zero

View file

@ -2,6 +2,10 @@ Template: dump1090-mutability/auto-start
Description: Start dump1090 automatically? Description: Start dump1090 automatically?
dump1090 can be started automatically via an init-script. dump1090 can be started automatically via an init-script.
Otherwise, the init-script does nothing; you must run dump1090 by hand. Otherwise, the init-script does nothing; you must run dump1090 by hand.
.
You can modify the options used when automatically starting
dump1090 by running "dpkg-reconfigure dump1090-mutability" as root,
or by editing /etc/default/dump1090-mutability.
Type: boolean Type: boolean
Default: true Default: true
@ -21,12 +25,15 @@ Default: /var/log/dump1090-mutability.log
Template: dump1090-mutability/rtlsdr-device Template: dump1090-mutability/rtlsdr-device
Description: RTL-SDR dongle to use: Description: RTL-SDR dongle to use:
If you have only one dongle connected, select 0. If you have more than one If you have only one dongle connected, you can leave this blank.
dongle connected, select the index of the dongle to use (0 is the first .
dongle). If you want to run dump1090 in "net only" mode, select "none". Otherwise, you can provide the serial number (more reliable) or device
Type: select index (first device = 0, but the ordering is unpredictable) to choose
Choices: none, 0, 1, 2, 3, 4, 5 a particular dongle to use.
Default: 0 .
To run dump1090 in "net only" mode, specify the literal word "none".
Type: string
Default:
Template: dump1090-mutability/rtlsdr-gain Template: dump1090-mutability/rtlsdr-gain
Description: RTL-SDR gain, in dB: Description: RTL-SDR gain, in dB:
@ -208,19 +215,22 @@ Default: 3600
Template: dump1090-mutability/json-dir Template: dump1090-mutability/json-dir
Description: Directory to write JSON aircraft state to: Description: Directory to write JSON aircraft state to:
dump1090 periodicallys write a list of aircraft, in JSON format, for use As this can be written frequently, you should select a location
by the virtual radar view when using an external webserver. This setting that is not on a sdcard. The default path under /run is on tmpfs
controls the directory to write to. and will not write to the sdcard.
.
As this is written frequently (by default, once a second), you should
probably select a location that is not on a sdcard. The default path
under /run is on tmpfs and will not write to the sdcard.
Type: string Type: string
Default: /run/dump1090-mutability Default: /run/dump1090-mutability
Template: dump1090-mutability/json-interval Template: dump1090-mutability/json-interval
Description: Interval between writing JSON aircraft state, in seconds: Description: Interval between writing JSON aircraft state, in seconds:
Here you can control how often the JSON state is updated. dump1090 periodically write a list of aircraft, in JSON format, for use
by the virtual radar view when using an external webserver. This setting
controls the directory to write to.
.
Here you can control how often the JSON state is updated, which determines
how frequently the virtual radar view updates.
.
A value of 0 will disable writing JSON state entirely.
Type: string Type: string
Default: 1 Default: 1
@ -229,3 +239,39 @@ Description: Extra arguments to pass to dump1090:
Here you can add any extra arguments you want to pass to dump1090. Here you can add any extra arguments you want to pass to dump1090.
Type: string Type: string
Default: Default:
Template: dump1090-mutability/invalid-is_unsigned_int
Description: Value must be an unsigned integer.
Type: error
Template: dump1090-mutability/invalid-is_unsigned_int_or_empty
Description: Value must be an unsigned integer, or blank.
Type: error
Template: dump1090-mutability/invalid-is_signed_int
Description: Value must be an integer.
Type: error
Template: dump1090-mutability/invalid-is_signed_int_or_empty
Description: Value must be an integer, or blank.
Type: error
Template: dump1090-mutability/invalid-is_not_empty
Description: Value cannot be empty.
Type: error
Template: dump1090-mutability/invalid-is_port_number
Description: Value must be a valid port number (1024-65535), or zero to disable.
Type: error
Template: dump1090-mutability/invalid-is_ipaddrish_or_empty
Description: Value must be an IP address or empty.
Type: error
Template: dump1090-mutability/invalid-is_number_or_empty
Description: Value must be a decimal number or empty.
Type: error
Template: dump1090-mutability/invalid-is_valid_gain
Description: Value must be a numeric gain value, or "max", or "agc".
Type: error