From 152674988a655b0a9b92392bd199957c0ae7db85 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Va=C5=A1ek?= <david.vasek@nic.cz> Date: Mon, 21 Dec 2020 22:25:13 +0100 Subject: [PATCH] scripts: add config data gathering script for supported platforms The intension is this script be portable to all supported OS's. However, it's mostly Linux specific so far. --- scripts/kinquire.sh | 242 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 242 insertions(+) create mode 100755 scripts/kinquire.sh diff --git a/scripts/kinquire.sh b/scripts/kinquire.sh new file mode 100755 index 0000000000..61211669a7 --- /dev/null +++ b/scripts/kinquire.sh @@ -0,0 +1,242 @@ +#!/bin/sh +# +# Copyright (C) 2020 CZ.NIC, z.s.p.o. <knot-dns@labs.nic.cz> +# +# Knot DNS utility script +# +# This script collects selected system and Knot DNS configuration +# data and prints them out to the standard output. If the output +# is sent through a secure channel to the Knot DNS development team, +# the data can serve as a basis for the Knot DNS performace troubleshooting. +# +# Usage: ./kinquire.sh <Knot DNS configuration file> +# ./kinquire.sh <Knot DNS configuration DB directory> +# ./kinquire.sh <control socket of a running knotd daemon> +# +# Note: the script is currently mostly GNU/Linux specific +# + +KU_SCRIPT_VERSION="Knot DNS utility script, version 0.3a" + +PATH=/bin:/usr/bin:/usr/local/bin:/sbin:/usr/sbin:/usr/local/sbin + +ku_which() { + local RET=$(command -v "$@") + if [ -f "$RET" -a -x "$RET" ]; then + echo "$RET" + return 0 + else + return 1 + fi +} + +KNOTD=${KNOTD:-$(ku_which knotd)} +KNOTC=${KNOTC:-$(ku_which knotc || echo \#knotc)} +# KNOTPID=${KNOTPID:-$(ps -A |awk '$NF~"knotd" {print $1; exit}')} +KNOTPID=${KNOTPID:-$(pgrep knotd |head -n 1)} +# General knotc options can be set in KNOTCONF environment variable. + +PATH=/bin:/usr/bin:/sbin:/usr/sbin + +CAT=$(ku_which cat || echo \#cat) +DATE=$(ku_which date || echo \#date) +ETHTOOL=$(ku_which ethtool || echo \#ethtool) +FILE=$(ku_which file || echo \#file) +FREE=$(ku_which free || echo \#free) +GREP=$(ku_which grep || echo \#grep) +HOSTNAME=$(ku_which hostname || echo \#hostname) +HOSTNAMECTL=$(ku_which hostnamectl || echo \#hostnamectl) +ID=$(ku_which id || echo \#id) +IFCONFIG=$(ku_which ifconfig || echo \#ifconfig) +IP=$(ku_which ip || echo \#ip) +LDD=$(ku_which ldd || echo \#ldd) +LS=$(ku_which ls || echo \#ls) +LSCPU=$(ku_which lscpu || echo \#lscpu) +LSPCI=$(ku_which lspci || echo \#lspci) +PRLIMIT=$(ku_which prlimit || echo \#prlimit) +PS=$(ku_which ps || echo \#ps) +SED=$(ku_which sed || echo \#sed) +STRINGS=$(ku_which strings || echo \#strings) +SYSCTL=$(ku_which sysctl || echo \#sysctl) +UNAME=$(ku_which uname || echo \#uname) + +CPUINFO=/proc/cpuinfo +MEMINFO=/proc/meminfo +IRQINFO=/proc/interrupts +SIRQINFO=/proc/softirqs +BONDINFO=/proc/net/bonding + +LSB_VERSION=/etc/lsb-release +DISTRO_VERSION=/etc/os-release +DEBIAN_VERSION=/etc/debian_version +GENTOO_VERSION=/etc/gentoo-release +ALPINE_VERSION=/etc/alpine-release +CENTOS_VERSION=/etc/centos-release +REDHAT_VERSION=/etc/redhat-release +RH_SYSTEM_VERSION=/etc/system-release + +ku_separator() { + echo ----------------------------------------------------------------------------------------- +} + +ku_hd_separator() { + echo ======================================================== +} + +ku_log_failure() { + ku_separator + printf "FAILURE: %s\n" "$*" + ku_separator + echo +} + +ku_execute() { + ku_separator + printf "COMMAND: %s\n" "$*" + ku_separator + eval "$@" 2>&1 +} + +ku_get_params() { + if [ -f "$1" ]; then + KNOTCONF="$KNOTCONF -c $1" + elif [ -d "$1" ]; then + KNOTCONF="$KNOTCONF -C $1" + elif [ -S "$1" ]; then + KNOTCONF="$KNOTCONF -s $1" + else + echo "$KU_SCRIPT_VERSION" >&2 + echo "Usage: $0 <Knot DNS configuration file>" >&2 + echo " $0 <Knot DNS configuration DB directory>" >&2 + echo " $0 <control socket of a running knotd daemon>" >&2 + exit 99 + fi +} + +ku_print_header() { + ku_hd_separator + echo " $KU_SCRIPT_VERSION" + echo + echo " hostname: $($HOSTNAME)" + echo " date: $($DATE)" + echo " run as root: $([ $($ID -u) -eq 0 ] && echo yes || echo no)" + ku_hd_separator + echo +} + +ku_net_devs_info() { + if [ -x "$IFCONFIG" ]; then + ku_execute $IFCONFIG -a + DEVICES=$($IFCONFIG -a |$SED -E '/^ /d;/^$/d;s/:? .*$//;/^lo(:.*)?$/d') + elif [ -x "$IP" ]; then + ku_execute $IP -s addr + DEVICES=$($IP link show |$SED -E '/^ /d;s/^[^:]*: //;s/(: |@).*$//;/^lo(:.*)?$/d') + else + ku_log_failure "No ifconfig/ip found." + return + fi + + ku_execute $CAT $IRQINFO + ku_execute $CAT $SIRQINFO + + if [ ! -x "$ETHTOOL" ]; then + ku_log_failure "No ethtool utility found." + return + fi + + local DEV_START="############################" + + for DEV in $DEVICES; do + ku_execute echo "$DEV_START " $DEV " $DEV_START" + ku_execute $ETHTOOL $DEV + ku_execute $ETHTOOL -i $DEV + ku_execute $ETHTOOL -l $DEV + ku_execute $ETHTOOL -a $DEV + ku_execute $ETHTOOL -g $DEV + ku_execute $ETHTOOL -k $DEV + ku_execute $ETHTOOL -c $DEV + ku_execute $ETHTOOL -n $DEV rx-flow-hash udp4 + ku_execute $ETHTOOL -n $DEV rx-flow-hash udp6 + ku_execute $ETHTOOL -S $DEV + [[ $DEV = bond* ]] && ku_execute $CAT $BONDINFO/$DEV + done +} + +ku_knotd_binary_info() { + if [ ! -f "$KNOTD" ]; then + ku_log_failure "No knotd binary found." + return + fi + + ku_execute $LS -ld --full-time "$KNOTD" + ku_execute $FILE "$KNOTD" + ku_execute "$STRINGS $KNOTD |$GREP -e ^GCC -e ^clang\ version" + + [ ! -x "$LDD" ] && return + + ku_execute $LDD -v "$KNOTD" + ku_execute $LS -ld --full-time $($LDD "$KNOTD" |$SED -E '/linux-vdso.so.1/d;s@^.*=> @@;s@^[ \t]*@@;s@ \(0x.*$@@') + ku_execute $LS -ldL --full-time $($LDD "$KNOTD" |$SED -E '/linux-vdso.so.1/d;s@^.*=> @@;s@^[ \t]*@@;s@ \(0x.*$@@') +} + +ku_print_data() { + + # General OS info + ku_execute $UNAME -a + [ -x "$HOSTNAMECTL" ] && ku_execute $HOSTNAMECTL + [ -r "$LSB_VERSION" ] && ku_execute $CAT $LSB_VERSION + [ -r "$DISTRO_VERSION" ] && ku_execute $CAT $DISTRO_VERSION + [ -r "$DEBIAN_VERSION" ] && ku_execute $CAT $DEBIAN_VERSION + [ -r "$GENTOO_VERSION" ] && ku_execute $CAT $GENTOO_VERSION + [ -r "$ALPINE_VERSION" ] && ku_execute $CAT $ALPINE_VERSION + [ -r "$CENTOS_VERSION" ] && ku_execute $CAT $CENTOS_VERSION + [ -r "$REDHAT_VERSION" ] && ku_execute $CAT $REDHAT_VERSION + [ -r "$RH_SYSTEM_VERSION" ] && ku_execute $CAT $RH_SYSTEM_VERSION + + # Some hardware details + if [ -x "$LSCPU" ]; then + ku_execute $LSCPU + else + ku_execute $CAT $CPUINFO + fi + ku_execute $FREE -h + ku_execute $CAT $MEMINFO + + # Some OS details + # Not yet. + # ku_execute $SYSCTL -a + + # Some knotd binary details + ku_knotd_binary_info + + # Some knotd configuration details + if [ ${KNOTPID}X != X -a -x "$KNOTC" ]; then + ku_execute $PS uww -p ${KNOTPID} + ku_execute $PS vww -p ${KNOTPID} + [ -x "${PRLIMIT}" ] && ku_execute $PRLIMIT -p $KNOTPID + ku_execute $KNOTC $KNOTCONF conf-read server + ku_execute $KNOTC $KNOTCONF conf-read template + ku_execute $KNOTC $KNOTCONF conf-read database + ku_execute $KNOTC $KNOTCONF stats server + + ku_execute $KNOTC $KNOTCONF status version + ku_execute $KNOTC $KNOTCONF status workers + ku_execute $KNOTC $KNOTCONF status configure + else + ku_log_failure "Running knotd process not found." + fi + + # Network adapters details + [ -x $LSPCI ] && ku_execute "$LSPCI |$GREP -i Ethernet" + ku_net_devs_info + + ku_separator +} + +############ +# "main()" + +ku_get_params "$@" +ku_print_header 2>&1 +ku_print_data 2>&1 + -- GitLab