all: create $confdir if it does not exist

zmapi, cam: refactor, use main() so that bash finds trap_error/trap_clean
This commit is contained in:
Frank de Lange 2022-10-02 10:49:16 +00:00
parent 858b168b05
commit 5bb1b8cef2
3 changed files with 267 additions and 258 deletions

351
cam
View file

@ -2,126 +2,195 @@
shopt -s extglob shopt -s extglob
version="1.0.2" version="1.0.3"
release="20221001" release="20221001"
declare -A camera main () {
declare -A camera
username="admin" username="admin"
password="" password=""
viewer="display" viewer="display"
player="mpv" player="mpv"
confdir="${XDG_CONFIG_HOME:-$HOME/.config}/zmapi" confdir="${XDG_CONFIG_HOME:-$HOME/.config}/zmapi"
config="cam.conf" config="cam.conf"
if [ -f "$confdir/$config" ]; then if [ -f "$confdir/$config" ]; then
source "$confdir/$config" source "$confdir/$config"
else else
echo "configuration file ($confdir/$config) missing" echo "configuration file ($confdir/$config) missing"
echo "new file created, edit it and restart program" echo "new file created, edit it and restart program"
cat <<-EOT > "$confdir/$config" mkdir "$confdir"
cat <<-EOT > "$confdir/$config"
camera=() camera=()
username= username=
password= password=
viewer= viewer=
player= player=
EOT EOT
exit 1 exit 1
fi fi
auth=$(echo -n "$username:$password"|base64) auth=$(echo -n "$username:$password"|base64)
headers="-H 'Authorization: Basic $auth'" headers="-H 'Authorization: Basic $auth'"
# headers="-H 'Authorization: Basic $auth' -H 'Cookie: juanipcam_lang=en; login=${username}%2C${password}; sync_time=true; usr=$username; pwd=$password'" # headers="-H 'Authorization: Basic $auth' -H 'Cookie: juanipcam_lang=en; login=${username}%2C${password}; sync_time=true; usr=$username; pwd=$password'"
camlst=$(echo -n "${!camera[@]}"|tr ' ' '|') camlst=$(echo -n "${!camera[@]}"|tr ' ' '|')
declare -A SDK=( declare -A SDK=(
[audio_encode]=/NetSDK/Audio/encode/channel/101 [audio_encode]=/NetSDK/Audio/encode/channel/101
[audio_input]=/NetSDK/Audio/input/channel/1 [audio_input]=/NetSDK/Audio/input/channel/1
[image]=/NetSDK/Image [image]=/NetSDK/Image
[image_ircut]=/NetSDK/Image/irCutFilter [image_ircut]=/NetSDK/Image/irCutFilter
[image_denoise3d]=/NetSDK/Image/denoise3d [image_denoise3d]=/NetSDK/Image/denoise3d
[image_sharpness]=/NetSDK/Image/manualSharpness [image_sharpness]=/NetSDK/Image/manualSharpness
[image_videomode]=/NetSDK/Image/videoMode/properties/ [image_videomode]=/NetSDK/Image/videoMode/properties/
[image_wdr]=/NetSDK/Image/wdr [image_wdr]=/NetSDK/Image/wdr
[network_dns]=/NetSDK/Network/DNS [network_dns]=/NetSDK/Network/DNS
[network_esee]=/NetSDK/Network/ESee [network_esee]=/NetSDK/Network/ESee
[network_lan1]=/NetSDK/Network/interface/1/lan [network_lan1]=/NetSDK/Network/interface/1/lan
[network_lan4]=/NetSDK/Network/interface/1/lan [network_lan4]=/NetSDK/Network/interface/1/lan
[network_wifi]=/NetSDK/Network/interface/4/wireless [network_wifi]=/NetSDK/Network/interface/4/wireless
[network_port]=/NetSDK/Network/port [network_port]=/NetSDK/Network/port
[wifi_allstainfo]=/NetSDK/Network/wireless/allStaInfo [wifi_allstainfo]=/NetSDK/Network/wireless/allStaInfo
[wifi_stationsignal]=/NetSDK/Network/wireless/stationSignal [wifi_stationsignal]=/NetSDK/Network/wireless/stationSignal
[wifi_status]=/NetSDK/Network/Wireless/status [wifi_status]=/NetSDK/Network/Wireless/status
[ptz]=/NetSDK/PTZ/channel/1/control [ptz]=/NetSDK/PTZ/channel/1/control
[devinfo]=/NetSDK/System/deviceInfo [devinfo]=/NetSDK/System/deviceInfo
[reboot]=/NetSDK/System/operation/reboot [reboot]=/NetSDK/System/operation/reboot
[time]=/NetSDK/System/time/localtime [time]=/NetSDK/System/time/localtime
[time_ntp]=/NetSDK/System/time/ntp [time_ntp]=/NetSDK/System/time/ntp
[time_rtc]=/NetSDK/System/time/rtc [time_rtc]=/NetSDK/System/time/rtc
[time_zone]=/NetSDK/System/time/timeZone [time_zone]=/NetSDK/System/time/timeZone
[time_calender]=/NetSDK/System/time/calendarStyle [time_calender]=/NetSDK/System/time/calendarStyle
[vencode_main]=/NetSDK/Video/encode/channel/101 [vencode_main]=/NetSDK/Video/encode/channel/101
[vencode_sub]=/NetSDK/Video/encode/channel/102 [vencode_sub]=/NetSDK/Video/encode/channel/102
[video_channeloverlay]=/NetSDK/Video/encode/channel/101/channelNameOverlay [video_channeloverlay]=/NetSDK/Video/encode/channel/101/channelNameOverlay
[video_extraoverlay]=/NetSDK/Video/encode/channel/101 [video_extraoverlay]=/NetSDK/Video/encode/channel/101
[video_timeoverlay]=/NetSDK/Video/encode/channel/101/datetimeOverlay [video_timeoverlay]=/NetSDK/Video/encode/channel/101/datetimeOverlay
[video_input]=/NetSDK/Video/input/channel/1 [video_input]=/NetSDK/Video/input/channel/1
[video_brightness]=/NetSDK/Video/input/channel/1/brightnessLevel [video_brightness]=/NetSDK/Video/input/channel/1/brightnessLevel
[video_contrast]=/NetSDK/Video/input/channel/1/contrastLevel [video_contrast]=/NetSDK/Video/input/channel/1/contrastLevel
[video_flip]=/NetSDK/Video/input/channel/1/flipEnabled [video_flip]=/NetSDK/Video/input/channel/1/flipEnabled
[video_mirror]=/NetSDK/Video/input/channel/1/mirrorEnabled [video_mirror]=/NetSDK/Video/input/channel/1/mirrorEnabled
[video_hue]=/NetSDK/Video/input/channel/1/hueLevel [video_hue]=/NetSDK/Video/input/channel/1/hueLevel
[video_mask]=/NetSDK/Video/input/channel/1/PrivacyMasks [video_mask]=/NetSDK/Video/input/channel/1/PrivacyMasks
[video_saturation]=/NetSDK/Video/input/channel/1/saturationLevel [video_saturation]=/NetSDK/Video/input/channel/1/saturationLevel
[video_sharpness]=/NetSDK/Video/input/channel/1/sharpnessLevel [video_sharpness]=/NetSDK/Video/input/channel/1/sharpnessLevel
[motiondetection]=/NetSDK/Video/motionDetection/channel/1 [motiondetection]=/NetSDK/Video/motionDetection/channel/1
[load]="/_SDK/info/monitor.php?nonce=123" [load]="/_SDK/info/monitor.php?nonce=123"
[ps]="/_SDK/info/monitor.php?nonce=123" [ps]="/_SDK/info/monitor.php?nonce=123"
[debuginfo]="/_SDK/info/device.php?nonce=123" [debuginfo]="/_SDK/info/device.php?nonce=123"
[eventinfo]="/_SDK/info/event.php?nonce=123" [eventinfo]="/_SDK/info/event.php?nonce=123"
[health]=/Anyka/health [health]=/Anyka/health
[config]=/Anyka/config [config]=/Anyka/config
[log]=/Anyka/log [log]=/Anyka/log
[oem]=/custom/OEM [oem]=/custom/OEM
[view_main]="/ch0_0.264" [view_main]="/ch0_0.264"
[view_sub]="/ch0_1.264" [view_sub]="/ch0_1.264"
[snapshot]=/snapshot [snapshot]=/snapshot
[user_list]="/user/user_list.xml?username=$username&password=$password" [user_list]="/user/user_list.xml?username=$username&password=$password"
) )
declare -A audio_encode=(e enabled:b i audioInputChannelID:i c codecType:s) declare -A audio_encode=(e enabled:b i audioInputChannelID:i c codecType:s)
declare -A audio_input=(w workMode:s m microphoneType:s:auto,activePickup,passiveMic r sampleRate:i w sampleBitWidth:i i inputVolume:i o outputVolume:i) declare -A audio_input=(w workMode:s m microphoneType:s:auto,activePickup,passiveMic r sampleRate:i w sampleBitWidth:i i inputVolume:i o outputVolume:i)
declare -A image_ircut=(c irCutControlMode:s:hardware,software m irCutMode:s:auto,daylight,night) declare -A image_ircut=(c irCutControlMode:s:hardware,software m irCutMode:s:auto,daylight,night)
declare -A image_denoise3d=(e enabled:b s denoise3dStrength:i) declare -A image_denoise3d=(e enabled:b s denoise3dStrength:i)
declare -A image_sharpness=(e enabled:b -s sharpnessLevel:i) declare -A image_sharpness=(e enabled:b -s sharpnessLevel:i)
declare -A image_wdr=(e enabled:b -s WDRStrength:i) declare -A image_wdr=(e enabled:b -s WDRStrength:i)
declare -A image=(s imageStyle:i:1,2,3 l lowlightMode:s:close,day-night,only-night,auto c sceneMode:s:auto,indoor,outdoor e exposureMode:s:auto,bright,dark a awbMode:s:auto,indoor,outdoor b BLcompensationMode:s) declare -A image=(s imageStyle:i:1,2,3 l lowlightMode:s:close,day-night,only-night,auto c sceneMode:s:auto,indoor,outdoor e exposureMode:s:auto,bright,dark a awbMode:s:auto,indoor,outdoor b BLcompensationMode:s)
declare -A image_videomode=(s imageStyle:i:1,2,3 l lowlightMode:s:close,day-night,only-night,auto c sceneMode:s:auto,indoor,outdoor e exposureMode:s:auto,bright,dark a awbMode:s:auto,indoor,outdoor b BLcompensationMode:s) declare -A image_videomode=(s imageStyle:i:1,2,3 l lowlightMode:s:close,day-night,only-night,auto c sceneMode:s:auto,indoor,outdoor e exposureMode:s:auto,bright,dark a awbMode:s:auto,indoor,outdoor b BLcompensationMode:s)
declare -A network_dns=(p preferredDns:s a staticAlternateDns:s) declare -A network_dns=(p preferredDns:s a staticAlternateDns:s)
declare -A network_esee=(e enabled:b) declare -A network_esee=(e enabled:b)
declare -A network_lan1=(v ipVersion:s i staticIP:s n staticNetmask:s g staticGateway:s t addressingType:s o OnvifAutoAdapt:b d dhcp:b) declare -A network_lan1=(v ipVersion:s i staticIP:s n staticNetmask:s g staticGateway:s t addressingType:s o OnvifAutoAdapt:b d dhcp:b)
declare -A network_lan4=(v ipVersion:s i staticIP:s n staticNetmask:s g staticGateway:s t addressingType:s o OnvifAutoAdapt:b d dhcp:b) declare -A network_lan4=(v ipVersion:s i staticIP:s n staticNetmask:s g staticGateway:s t addressingType:s o OnvifAutoAdapt:b d dhcp:b)
declare -A network_wifi=(m wirelessMode:s s stationMode.wirelessStaMode:s b stationMode.wirelessApBssId:s a stationMode.wirelessApEssId:s p stationMode.wirelessApPsk:s) declare -A network_wifi=(m wirelessMode:s s stationMode.wirelessStaMode:s b stationMode.wirelessApBssId:s a stationMode.wirelessApEssId:s p stationMode.wirelessApPsk:s)
declare -A network_port=(n portname:s p value:i) declare -A network_port=(n portname:s p value:i)
declare -A reboot=() declare -A reboot=()
declare -A time_ntp=(e enabled:b s ntpServerDomain:s) declare -A time_ntp=(e enabled:b s ntpServerDomain:s)
declare -A time_zone=() declare -A time_zone=()
declare -A time=() declare -A time=()
declare -A vencode_main=(e enabled:b r resolution:s c codecType:s b constantBitrate:i f frameRate:i t bitRateControlType:s p h264Profile:s k keyFrameInterval:i n channelName:s F freeResolution:b ) declare -A vencode_main=(e enabled:b r resolution:s c codecType:s b constantBitrate:i f frameRate:i t bitRateControlType:s p h264Profile:s k keyFrameInterval:i n channelName:s F freeResolution:b )
declare -A vencode_sub=(e enabled:b r resolution:s c codecType:s b constantBitrate:i f frameRate:i t bitRateControlType:s p h264Profile:s k keyFrameInterval:i n channelName:s F freeResolution:b ) declare -A vencode_sub=(e enabled:b r resolution:s c codecType:s b constantBitrate:i f frameRate:i t bitRateControlType:s p h264Profile:s k keyFrameInterval:i n channelName:s F freeResolution:b )
declare -A video_timeoverlay=(e enabled:b x regionX:i y regionY:i d dateFormat:s t timeFormat:i w displayWeek:b c displayChinese:b) declare -A video_timeoverlay=(e enabled:b x regionX:i y regionY:i d dateFormat:s t timeFormat:i w displayWeek:b c displayChinese:b)
declare -A video_channeloverlay=(e enabled:b x regionX:i y regionY:i) declare -A video_channeloverlay=(e enabled:b x regionX:i y regionY:i)
declare -A video_extraoverlay=(e expandChannelNameOverlay[0].enabled:b t expandChannelNameOverlay[0].expandChannelName:s) declare -A video_extraoverlay=(e expandChannelNameOverlay[0].enabled:b t expandChannelNameOverlay[0].expandChannelName:s)
declare -A video_input=(e enabled:b l powerLineFrequencyMode:i:50,60,100,120 b brightnessLevel:i:0-100 c contrastLevel:i:0-100 s sharpnessLevel:i:0-100 a saturationLevel:i:0-100 h hueLevel:i:0-100 f flipEnabled:b m mirrorEnabled:b p privacyMask) declare -A video_input=(e enabled:b l powerLineFrequencyMode:i:50,60,100,120 b brightnessLevel:i:0-100 c contrastLevel:i:0-100 s sharpnessLevel:i:0-100 a saturationLevel:i:0-100 h hueLevel:i:0-100 f flipEnabled:b m mirrorEnabled:b p privacyMask)
declare -A video_flip=() declare -A video_flip=()
declare -A video_mirror=() declare -A video_mirror=()
declare -A video_brightness=() declare -A video_brightness=()
declare -A video_contrast=() declare -A video_contrast=()
declare -A video_saturation=() declare -A video_saturation=()
declare -A video_hue=() declare -A video_hue=()
declare -A video_sharpness=() declare -A video_sharpness=()
if is_ip "$1"; then
cam=$(cam_for_ip "$1")
parameters=( "$@" )
parameters[0]=$cam
set -- "${parameters[@]}"
fi
case $1 in
@($camlst))
cam_s=$1
cam_f=$1
shift
;;
all)
cam_s=1
cam_f=8
shift
;;
help)
help
exit
;;
*)
exit_with_error "camera number, IP address or 'all' missing"
;;
esac
if [[ -z $1 ]]; then
help
else
command="$1"
shift
fi
if ! test ${SDK[$command]+_}; then
printf "unknown command $command\n\n"
help
fi
for cam in $(seq "$cam_s" "$cam_f");do
case "$command" in
load)
get_json "$cam" "$command" ".CPU.Usage"
;;
health|config|log)
get_text "$cam"
;;
reboot)
put_json "$cam" "$command" '{true}'
;;
snapshot)
view "$cam" "$command"
;;
view_main|view_sub)
watch "$cam" "$command"
;;
help)
help
;;
*)
config "$cam" "$command" "$@"
;;
esac
done
}
is_json () { is_json () {
jq -e . >/dev/null 2>&1 <<<"$@" jq -e . >/dev/null 2>&1 <<<"$@"
@ -468,76 +537,10 @@ exit_with_error () {
exit 1 exit 1
} }
main "$@"
# --------------------------------------------------- # ---------------------------------------------------
if is_ip "$1"; then
cam=$(cam_for_ip "$1")
parameters=( "$@" )
parameters[0]=$cam
set -- "${parameters[@]}"
fi
case $1 in
@($camlst))
cam_s=$1
cam_f=$1
shift
;;
all)
cam_s=1
cam_f=8
shift
;;
help)
help
exit
;;
*)
exit_with_error "camera number, IP address or 'all' missing"
;;
esac
if [[ -z $1 ]]; then
help
else
command="$1"
shift
fi
if ! test ${SDK[$command]+_}; then
printf "unknown command $command\n\n"
help
fi
for cam in $(seq "$cam_s" "$cam_f");do
case "$command" in
load)
get_json "$cam" "$command" ".CPU.Usage"
;;
health|config|log)
get_text "$cam"
;;
reboot)
put_json "$cam" "$command" '{true}'
;;
snapshot)
view "$cam" "$command"
;;
view_main|view_sub)
watch "$cam" "$command"
;;
help)
help
;;
*)
config "$cam" "$command" "$@"
;;
esac
done
exit
# based on strings pulled from firmware dump, these represent api endpoints # based on strings pulled from firmware dump, these represent api endpoints
# used with GET or PUT requests as defined in NK_N1Device_InitV2() # used with GET or PUT requests as defined in NK_N1Device_InitV2()
# #

View file

@ -16,11 +16,12 @@ if [ -f "$confdir/$config" ]; then
else else
echo "configuration file ($confdir/$config) missing" echo "configuration file ($confdir/$config) missing"
echo "new file created, edit it and restart program" echo "new file created, edit it and restart program"
mkdir -p "$confdir"
cat <<-EOT > "$confdir/$config" cat <<-EOT > "$confdir/$config"
monitors=() monitors=()
threshold=3 threshold=3
mon_stat_store="$confdir/mon_stat_store" mon_stat_store="$confdir/mon_stat_store"
EOT EOT
exit 1 exit 1
fi fi

171
zmapi
View file

@ -4,67 +4,99 @@ trap "trap_error" TERM
trap "trap_clean" EXIT trap "trap_clean" EXIT
export TOP_PID=$$ export TOP_PID=$$
version="1.1.2" version="1.1.3"
release="20221001" release="20221001"
username="" main () {
password="" username=""
server="" password=""
server=""
confdir="${XDG_CONFIG_HOME:-$HOME/.config}/zmapi" confdir="${XDG_CONFIG_HOME:-$HOME/.config}/zmapi"
config="zmapi.conf" config="zmapi.conf"
access_token="access.json" access_token="access.json"
refresh_token="refresh.json" refresh_token="refresh.json"
opt_netrc="--netrc-optional" opt_netrc="--netrc-optional"
netrc="" netrc=""
if [ -f "$confdir/$config" ]; then if [ -f "$confdir/$config" ]; then
source "$confdir/$config" source "$confdir/$config"
if [ -n "$proxy_username" -a -n "$proxy_password" ]; then if [ -n "$proxy_username" -a -n "$proxy_password" ]; then
machine="${server##http*://}" machine="${server##http*://}"
machine="${machine%%/*}" machine="${machine%%/*}"
netrc=$(mktemp --tmpdir zmapi_XXXXXXXXXX) netrc=$(mktemp --tmpdir zmapi_XXXXXXXXXX)
echo "machine $machine login $proxy_username password $proxy_password" > "$netrc" echo "machine $machine login $proxy_username password $proxy_password" > "$netrc"
opt_netrc="--netrc-file $netrc" opt_netrc="--netrc-file $netrc"
fi
else
echo "configuration file ($confdir/$config) missing"
echo "new file created, edit it and restart program"
mkdir -p "$confdir"
cat <<-EOT > "$confdir/$config"
# ZoneMinder username, password and server:
username=
password=
server=
# Reverse proxy credentials:
# proxy_username=
# proxy_password=
EOT
exit 1
fi fi
else
echo "configuration file ($confdir/$config) missing"
echo "new file created, edit it and restart program"
echo <<-EOT > "$confdir/$config"
# ZoneMinder username, password and server:
username=
password=
server=
# Reverse proxy credentials:
# proxy_username=
# proxy_password=
EOT
exit 1
fi
declare -A API=( declare -A API=(
[monitors]='monitors.json|G' [monitors]='monitors.json|G'
[sourcetypes]='monitors/sourceTypes.json|G' [sourcetypes]='monitors/sourceTypes.json|G'
[monitor]='monitors/${1}.json|G' [monitor]='monitors/${1}.json|G'
[daemonstatus]='monitors/daemonStatus/id:${1}/daemon:${2:-zmc}.json|G' [daemonstatus]='monitors/daemonStatus/id:${1}/daemon:${2:-zmc}.json|G'
[daemoncontrol]='monitors/daemonStatus/id:${1}/command:${2}/daemon:${3}.json|G' [daemoncontrol]='monitors/daemonStatus/id:${1}/command:${2}/daemon:${3}.json|G'
[status]='monitors/${1}.json|G|.monitor.Monitor_Status' [status]='monitors/${1}.json|G|.monitor.Monitor_Status'
[alarm]='monitors/alarm/id:${1}/command:${2:-status}.json|G' [alarm]='monitors/alarm/id:${1}/command:${2:-status}.json|G'
[login]='host/login.json|P' [login]='host/login.json|P'
[events]='events/index/${1}.json|G' [events]='events/index/${1}.json|G'
[console_events]='events/consoleEvents/${1}.json|G' [console_events]='events/consoleEvents/${1}.json|G'
[states]='states.json|G' [states]='states.json|G'
[restart]='states/change/restart.json|P' [restart]='states/change/restart.json|P'
[stop]='states/change/stop.json|P' [stop]='states/change/stop.json|P'
[start]='states/change/start.json|P' [start]='states/change/start.json|P'
[zones]='zones.json|G' [zones]='zones.json|G'
[load]='host/getLoad.json|G' [load]='host/getLoad.json|G'
[daemoncheck]='host/daemonCheck.json|G' [daemoncheck]='host/daemonCheck.json|G'
[getdiskpercent]='host/getDiskPercent.json|G' [getdiskpercent]='host/getDiskPercent.json|G'
[storage]='storage.json|G' [storage]='storage.json|G'
[servers]='servers.json|G' [servers]='servers.json|G'
[configs]='configs.json|G' [configs]='configs.json|G'
) )
token=$(get_token)
cmd="$1"
shift
if [ -z "$cmd" -o "$cmd" == "help" ]; then
help
exit
fi
if ! test ${API[$cmd]+_}; then
printf "zmapi: unknown command '$cmd'\n"
exit 1
fi
method=$(echo "${API[$cmd]}"|cut -d '|' -f 2)
case "$method" in
G)
get "$cmd" "$token" "$@"
;;
P)
post "$cmd" "$token" "$@"
;;
*)
printf "unknown method $method for command $1"
;;
esac
}
get () { get () {
cmd="$1" cmd="$1"
@ -234,31 +266,4 @@ EOF
exit exit
} }
token=$(get_token) main "$@"
cmd="$1"
shift
if [ -z "$cmd" -o "$cmd" == "help" ]; then
help
exit
fi
if ! test ${API[$cmd]+_}; then
printf "zmapi: unknown command '$cmd'\n"
exit 1
fi
method=$(echo "${API[$cmd]}"|cut -d '|' -f 2)
case "$method" in
G)
get "$cmd" "$token" "$@"
;;
P)
post "$cmd" "$token" "$@"
;;
*)
printf "unknown method $method for command $1"
;;
esac