aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLoïc Guégan <loic.guegan@mailbox.org>2024-07-05 16:15:28 +0200
committerLoïc Guégan <loic.guegan@mailbox.org>2024-07-05 16:15:28 +0200
commit35c6d6cbea7bc3d62d900aac18d50361089b50ab (patch)
treeaf9b97089a1718d14b4b41bd75b4cdf9dac4890e
parentafecf5a06d6510561eec5ead1b2ce4544b88c5ab (diff)
Significantly improve script
-rw-r--r--README.md15
-rwxr-xr-xsysdump.sh242
2 files changed, 165 insertions, 92 deletions
diff --git a/README.md b/README.md
index ab8d0c9..f95157d 100644
--- a/README.md
+++ b/README.md
@@ -9,11 +9,8 @@ Run a dump:
Run a dump on a remote machine using ssh:
> cat sysdump.sh | ssh user@host /bin/bash > dump.json
-Explore a dump (require `jq`):
-> ./sysdump.sh dump.json
-
-Explore specific entries of a dump:
-> ./sysdump.sh dump.json uname timezone
+To explore a dump (require `jq`), see help as follow:
+> ./sysdump.sh -h
# Useful entries
Important note: Depending on the system, some entries may not be available.
@@ -33,10 +30,6 @@ Important note: Depending on the system, some entries may not be available.
# Notes
- Some commands require root permissions.
-If `sysdump.sh` is not run as root, these commands will not be executed.
-- List available entries:
-> cat dump.json |grep -o ".*:"
-- List available command versions:
-> cat dump.json |grep -o "cmd_.*_version"
-- For more infos on what is actually dump see `sysdump.sh`
+If `sysdump.sh` is not run as root, these commands will not be executed and the entries
+will not be reported in the dump file.
diff --git a/sysdump.sh b/sysdump.sh
index fa4b966..a060b0b 100755
--- a/sysdump.sh
+++ b/sysdump.sh
@@ -29,12 +29,139 @@ dump() {
[ "$USE_COMMA" -eq 0 ] && echo "\"${entry}\": \"${value}\""
}
-# Read mode
-if [ $# -gt 0 ]
+sysdump() {
+ # Start dump
+ echo "{"
+ USE_COMMA=1
+ # safecat
+ dump "/etc/nftables.conf" safecat /etc/nftables.conf
+ dump "/etc/group" safecat /etc/group
+ dump "$HOME/.bashrc" safecat $HOME/.bashrc
+ dump "$HOME/.bash_profile" safecat $HOME/.bash_profile
+ dump "/etc/fstab" safecat /etc/fstab
+ dump "/etc/ssh/sshd_config" safecat /etc/ssh/sshd_config
+ dump "/proc/cpuinfo" safecat /proc/cpuinfo
+ dump "/etc/os-release" safecat /etc/os-release
+ dump "/proc/zoneinfo" safecat /proc/zoneinfo
+ dump "/proc/meminfo" safecat /proc/meminfo
+ dump "/proc/cmdline" safecat /proc/cmdline
+ dump "/proc/version" safecat /proc/version
+ dump "/etc/resolv.conf" safecat /etc/resolv.conf
+ dump "/etc/sysctl.conf" safecat /etc/sysctl.conf
+ dump "/etc/apt/sources.list" safecat /etc/apt/sources.list
+ dump "/etc/hosts" safecat /etc/hosts
+ dump "/etc/bash.bashrc" safecat /etc/bash.bashrc
+ dump "/etc/timezone" safecat /etc/timezone
+ dump "/boot/config-$(uname -r)" safecat /boot/config-$(uname -r)
+ # safecatroot
+ dump "/etc/shadow" safecatroot /etc/shadow
+ dump "/etc/sudoers" safecatroot /etc/sudoers
+ # safecmd
+ dump "date" date +%s
+ dump "hostname" safecmd hostname
+ dump "id" safecmd id
+ dump "env" safecmd env
+ dump "top" safecmd top -b -n 1
+ dump "locale" safecmd locale
+ dump "systemctl" safecmd systemctl --no-pager
+ dump "free" safecmd free -h
+ dump "df" safecmd df -h
+ dump "boot_folder" safecmd ls -R /boot/
+ dump "home_folder" safecmd ls -al ${HOME}
+ dump "root_folder" safecmd ls -al /
+ dump "uid" safecmd id -u
+ dump "gid" safecmd id -g
+ dump "gids" safecmd id -G
+ dump "ipaddr" safecmd ip addr
+ dump "uname" safecmd uname -a
+ dump "lsb_release" safecmd lsb_release
+ dump "uptime" safecmd uptime
+ dump "mount" safecmd mount
+ dump "lscpu" safecmd lscpu
+ dump "lsblk" safecmd lsblk
+ dump "lsusb" safecmd lsusb
+ dump "lsmod" safecmd lsmod
+ dump "lspci" safecmd lspci
+ dump "lsirq" safecmd lsirq
+ dump "lsfd" safecmd lsfd
+ dump "glxinfo" safecmd glxinfo -B
+ dump "compgen" safecmd compgen -c
+ dump "openssl" safecmd openssl
+ dump "users" safecmd users
+ dump "declare" safecmd declare
+ dump "ping" safecmd ping -c 2 -W 2 4.2.2.2
+ # dump versions
+ for cmd in bash gcc ld python3 cmake make tar zip gzip bzip2 xz cpio wget rsync curl node pip apt cat systemctl gpg R ruby awk grep sshfs docker java
+ do
+ dump "cmd_${cmd}_version" safecmd $cmd --version
+ done
+ dump "cmd_ssh_version" safecmd sshd -V
+ dump "cmd_tmux_version" safecmd tmux -V
+ dump "cmd_nginx_version" safecmd nginx -v
+ dump "cmd_go_version" safecmd go version
+ # safecmdroot
+ dump "dmidecode" safecmdroot dmidecode
+ dump "iptables" safecmdroot iptables -L
+ dump "fdisk" safecmdroot fdisk -l
+ USE_COMMA=0
+ dump "dmesg" safecmdroot dmesg
+ echo "}"
+}
+
+# Parse arguments
+POSITIONAL_ARGS=()
+ACTION="dump"
+while [[ $# -gt 0 ]]; do
+ case $1 in
+ -l|--list-entries)
+ ACTION="list"
+ shift
+ ;;
+ -s|--summarize)
+ ACTION="summarize"
+ shift # past value
+ ;;
+ -p|--parse)
+ ACTION="parse"
+ shift # past value
+ ;;
+ -h|--help)
+ echo "Usage: $0 [OPTION] [DUMP_FILE] [ENTRIES]"
+ echo " -l, --list-entries: Show available entries from a dump file"
+ echo " -p, --parse: Parse the content of a dump file"
+ echo " Example 1: $0 -p dump.json"
+ echo " Example 2: $0 -p dump.json uname uptime"
+ echo " -s, --summarize: Summarize a dump file"
+ echo " -h, --help: Show this help"
+ exit 0
+ ;;
+ -*|--*)
+ echo "Unknown option $1"
+ exit 1
+ ;;
+ *)
+ POSITIONAL_ARGS+=("$1") # save positional arg
+ shift # past argument
+ ;;
+ esac
+done
+set -- "${POSITIONAL_ARGS[@]}" # restore positional parameters
+
+# Check requirements
+ensure base64
+[ "$ACTION" == "dump" ] && [ $# -ne 0 ] && { echo "I do not understand the following: $@"; exit 1; }
+[ "$ACTION" != "dump" ] && [ $# -eq 0 ] && { echo "Missing dump file path"; exit 1; }
+[ "$ACTION" != "dump" ] && [ ! -f "$1" ] && { echo "File \"$1\" not found"; exit 1; }
+
+# Do dump
+[ "$ACTION" == "dump" ] && { sysdump; exit 0; }
+# List entries
+[ "$ACTION" == "list" ] && { ensure jq; cat "$1"|jq -r "keys[]"; exit 0; }
+# Parse dump file
+if [ "$ACTION" == "parse" ]
then
ensure jq
file=$1
- [ ! -f "$file" ] && { echo >&2 "Dump \"$file\" not found, abort..."; exit 1; }
if [ $# -gt 1 ]
then
shift
@@ -51,84 +178,37 @@ then
done <<< "$(cat "$file"|jq -r 'keys[]')"
exit 0
fi
+# Summarize dump file
+if [ "$ACTION" == "summarize" ]
+then
+ ensure jq
+ file=$1
+ OS_RELEASE=$(cat "$file"|jq -r '.["/etc/os-release"]'|base64 -d)
+ CPU_INFO=$(cat "$file"|jq -r '.["/proc/cpuinfo"]'|base64 -d)
+ PING_SUCCESS_COUNT=$(cat "$file"|jq -r '.["ping"]'|base64 -d|grep "packet loss"|cut -d, -f 2|awk '{print $1+0}')
-# Check commands exist
-ensure base64
+ # Extract infos
+ INFO_OS_NAME=$(echo "$OS_RELEASE"|grep "^NAME=" | cut -d'"' -f 2)
+ INFO_OS_VERSION=$(echo "$OS_RELEASE"|grep "^VERSION=" | cut -d'"' -f 2)
+ INFO_CPU_MODEL=$(echo "$CPU_INFO"|grep "model name" | cut -d':' -f 2|uniq|awk '{$1=$1};1')
+ INFO_CPU_CORE_N_PHY=$(echo "$CPU_INFO"|grep ^cpu\\scores /proc/cpuinfo | uniq | awk '{print $4}')
+ INFO_CPU_CORE_N_VIRT=$(echo "$CPU_INFO"|grep -c ^processor /proc/cpuinfo)
+ [ "$INFO_CPU_CORE_N_PHY" -eq "$INFO_CPU_CORE_N_VIRT" ] && INFO_CPU_HYPERTHREADING="off" || INFO_CPU_HYPERTHREADING="on"
+ [ $PING_SUCCESS_COUNT -gt 0 ] && INFO_OTHER_NETWORK="on" || INFO_OTHER_NETWORK="off"
-# Start dump
-echo "{"
-USE_COMMA=1
-# safecat
-dump "/etc/nftables.conf" safecat /etc/nftables.conf
-dump "/etc/group" safecat /etc/group
-dump "$HOME/.bashrc" safecat $HOME/.bashrc
-dump "$HOME/.bash_profile" safecat $HOME/.bash_profile
-dump "/etc/fstab" safecat /etc/fstab
-dump "/etc/ssh/sshd_config" safecat /etc/ssh/sshd_config
-dump "/proc/cpuinfo" safecat /proc/cpuinfo
-dump "/etc/os-release" safecat /etc/os-release
-dump "/proc/zoneinfo" safecat /proc/zoneinfo
-dump "/proc/meminfo" safecat /proc/meminfo
-dump "/proc/cmdline" safecat /proc/cmdline
-dump "/proc/version" safecat /proc/version
-dump "/etc/resolv.conf" safecat /etc/resolv.conf
-dump "/etc/sysctl.conf" safecat /etc/sysctl.conf
-dump "/etc/apt/sources.list" safecat /etc/apt/sources.list
-dump "/etc/hosts" safecat /etc/hosts
-dump "/etc/bash.bashrc" safecat /etc/bash.bashrc
-dump "/etc/timezone" safecat /etc/timezone
-dump "/boot/config-$(uname -r)" safecat /boot/config-$(uname -r)
-# safecatroot
-dump "/etc/shadow" safecatroot /etc/shadow
-dump "/etc/sudoers" safecatroot /etc/sudoers
-# safecmd
-dump "date" date +%s
-dump "hostname" safecmd hostname
-dump "id" safecmd id
-dump "env" safecmd env
-dump "top" safecmd top -b -n 1
-dump "locale" safecmd locale
-dump "systemctl" safecmd systemctl --no-pager
-dump "free" safecmd free -h
-dump "df" safecmd df -h
-dump "boot_folder" safecmd ls -R /boot/
-dump "home_folder" safecmd ls -al ${HOME}
-dump "root_folder" safecmd ls -al /
-dump "uid" safecmd id -u
-dump "gid" safecmd id -g
-dump "gids" safecmd id -G
-dump "ipaddr" safecmd ip addr
-dump "uname" safecmd uname -a
-dump "lsb_release" safecmd lsb_release
-dump "uptime" safecmd uptime
-dump "mount" safecmd mount
-dump "lscpu" safecmd lscpu
-dump "lsblk" safecmd lsblk
-dump "lsusb" safecmd lsusb
-dump "lsmod" safecmd lsmod
-dump "lspci" safecmd lspci
-dump "lsirq" safecmd lsirq
-dump "lsfd" safecmd lsfd
-dump "glxinfo" safecmd glxinfo -B
-dump "compgen" safecmd compgen -c
-dump "openssl" safecmd openssl
-dump "users" safecmd users
-dump "declare" safecmd declare
-dump "ping" safecmd ping -c 2 -W 2 4.2.2.2
-# dump versions
-for cmd in bash gcc ld python3 cmake make tar zip gzip bzip2 xz cpio wget rsync curl node pip apt cat systemctl gpg R ruby awk grep sshfs docker java
-do
- dump "cmd_${cmd}_version" safecmd $cmd --version
-done
-dump "cmd_ssh_version" safecmd sshd -V
-dump "cmd_tmux_version" safecmd tmux -V
-dump "cmd_nginx_version" safecmd nginx -v
-dump "cmd_go_version" safecmd go version
-# safecmdroot
-dump "dmidecode" safecmdroot dmidecode
-dump "iptables" safecmdroot iptables -L
-dump "fdisk" safecmdroot fdisk -l
-USE_COMMA=0
-dump "dmesg" safecmdroot dmesg
-echo "}"
+
+ # Print Information
+ echo "====> OS <===="
+ echo "OS Name: ${INFO_OS_NAME}"
+ echo "OS Version: ${INFO_OS_VERSION}"
+ echo
+ echo "====> CPU <===="
+ echo "Model: ${INFO_CPU_MODEL}"
+ echo "Physical Core Count: ${INFO_CPU_CORE_N_PHY}"
+ echo "Logical Core Count: ${INFO_CPU_CORE_N_VIRT}"
+ echo "Hyperthreading State: ${INFO_CPU_HYPERTHREADING}"
+ echo
+ echo "====> Other informations <===="
+ echo "Network State: ${INFO_OTHER_NETWORK}"
+fi