#!/bin/bash #### Logging library #### crowsnest - A webcam Service for multiple Cams and Stream Services. #### #### Written by Stephan Wendel aka KwadFan #### Copyright 2021 #### https://github.com/mainsail-crew/crowsnest #### #### This File is distributed under GPLv3 #### # shellcheck enable=require-variable-braces # Exit upon Errors set -Ee ## Logging function set_log_path { #Workaround sed ~ to BASH VAR $HOME CROWSNEST_LOG_PATH=$(get_param "crowsnest" log_path | sed "s#^~#${HOME}#gi") declare -g CROWSNEST_LOG_PATH #Workaround: Make Dir if not exist if [ ! -d "$(dirname "${CROWSNEST_LOG_PATH}")" ]; then mkdir -p "$(dirname "${CROWSNEST_LOG_PATH}")" fi } function init_logging { set_log_path set_log_level delete_log log_msg "crowsnest - A webcam Service for multiple Cams and Stream Services." log_msg "Version: $(self_version)" log_msg "Prepare Startup ..." print_host } function set_log_level { local loglevel loglevel="$(get_param crowsnest log_level 2> /dev/null)" # Set default log_level to quiet if [ -z "${loglevel}" ] || [[ "${loglevel}" != @(quiet|verbose|debug) ]]; then CROWSNEST_LOG_LEVEL="quiet" else CROWSNEST_LOG_LEVEL="${loglevel}" fi declare -r CROWSNEST_LOG_LEVEL } function delete_log { local del_log del_log="$(get_param "crowsnest" delete_log 2> /dev/null)" if [ "${del_log}" = "true" ]; then rm -rf "${CROWSNEST_LOG_PATH}" fi } function log_msg { local msg prefix msg="${1}" prefix="$(date +'[%D %T]') crowsnest:" echo -e "${prefix} ${msg}" | tr -s ' ' | tee -a "${CROWSNEST_LOG_PATH}" 2>&1 echo -e "${msg}" | logger -t crowsnest } #call '| log_output ""' function log_output { local prefix prefix="DEBUG: ${1}" while read -r line; do if [[ "${CROWSNEST_LOG_LEVEL}" = "debug" ]]; then log_msg "${prefix}: ${line}" fi if [[ -n "${line}" ]]; then # needed to prettify ustreamers output echo "${line//^--/ustreamer}" | logger -t crowsnest fi done } function print_cfg { local prefix prefix="\t\t" log_msg "INFO: Print Configfile: '${CROWSNEST_CFG}'" (sed '/^#.*/d;/./,$!d' | cut -d'#' -f1) < "${CROWSNEST_CFG}" | \ while read -r line; do log_msg "${prefix}${line}" done } function print_cams { local csi raspicam total v4l v4l="$(find /dev/v4l/by-id/ -iname "*index0" 2> /dev/null | wc -l)" csi="$(find /dev/v4l/by-path/ -iname "*csi*index0" 2> /dev/null | wc -l)" total="$((v4l+$(detect_raspicam)+csi))" if [[ "${total}" -eq 0 ]]; then log_msg "ERROR: No usable Devices Found. Stopping $(basename "${0}")." exit 1 else log_msg "INFO: Found ${total} total available Device(s)" fi if [[ "$(detect_raspicam)" -ne 0 ]]; then raspicam="$(v4l2-ctl --list-devices | grep -A1 -e 'mmal' | \ awk 'NR==2 {print $1}')" log_msg "Detected 'Raspicam' Device -> ${raspicam}" if [[ ! "${CROWSNEST_LOG_LEVEL}" = "quiet" ]]; then list_cam_formats "${raspicam}" list_cam_v4l2ctrls "${raspicam}" fi fi if [[ -d "/dev/v4l/by-id/" ]]; then detect_avail_cams fi if [[ -d "/dev/v4l/by-path" ]]; then detect_avail_csi fi } function print_host { local disksize generic_model memtotal sbc_model generic_model="$(grep "model name" /proc/cpuinfo | cut -d':' -f2 | awk NR==1)" sbc_model="$(grep "Model" /proc/cpuinfo | cut -d':' -f2)" memtotal="$(grep "MemTotal:" /proc/meminfo | awk '{print $2" "$3}')" disksize="$(LC_ALL=C df -h / | awk 'NR==2 {print $4" / "$2}')" ## print only if not "${CROWSNEST_LOG_LEVEL}": quiet if [[ "${CROWSNEST_LOG_LEVEL}" != "quiet" ]]; then log_msg "INFO: Host information:" ## OS Infos ## OS Version if [[ -f /etc/os-release ]]; then log_msg "Host Info: Distribution: $(grep "PRETTY" /etc/os-release | \ cut -d '=' -f2 | sed 's/^"//;s/"$//')" fi ## Release Version of MainsailOS (if file present) if [[ -f /etc/mainsailos-release ]]; then log_msg "Host Info: Release: $(cat /etc/mainsailos-release)" fi ## Kernel version log_msg "Host Info: Kernel: $(uname -s) $(uname -rm)" ## Host Machine Infos ## Host model if [[ -n "${sbc_model}" ]]; then log_msg "Host Info: Model: ${sbc_model}" fi if [[ -n "${generic_model}" ]] && [[ -z "${sbc_model}" ]]; then log_msg "Host Info: Model: ${generic_model}" fi ## CPU count log_msg "Host Info: Available CPU Cores: $(nproc)" ## Avail mem log_msg "Host Info: Available Memory: ${memtotal}" ## Avail disk size log_msg "Host Info: Diskspace (avail. / total): ${disksize}" fi } function debug_msg { local prefix prefix="Develop -- DEBUG:" while read -r msg; do log_msg "${prefix} ${msg}" echo -e "${msg}" | logger -t crowsnest done <<< "${1}" }