mirror of
https://gitlab.nic.cz/knot/knot-dns.git
synced 2026-02-03 18:49:28 -05:00
244 lines
6.6 KiB
Bash
Executable file
244 lines
6.6 KiB
Bash
Executable file
#!/bin/sh
|
|
# Copyright (C) CZ.NIC, z.s.p.o. and contributors
|
|
# SPDX-License-Identifier: GPL-2.0-or-later
|
|
# For more information, see <https://www.knot-dns.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 performance 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
|
|
|