2023-10-05 13:50:29 +00:00

257 lines
8.6 KiB
Bash
Executable File

#!/bin/sh
FILESYSTEM_PATH="/etc/cp"
LOG_FILE_PATH="/var/log"
CP_INFO_DIR="/tmp/cp-agent-info-temp"
CP_UNSPLITED_DIR="/tmp/cp-agent-info-unsplited-temp"
SPLIT_FILE_SIZE="99M"
FILE_PREFIX=
SHORT_VERSION=false
VERBOSE=false
cp_print()
{
printf "%b\n" "$1"
}
listFilesToSave()
{
if [ "$SHORT_VERSION" = "true" ];then
ls -d -p "$1/*" | grep -v .gz | grep -v '/$'
ls -d "$1/*" | grep -E '\S*.[1|2].gz'
return
fi
echo "$1/."
}
checkNginx() {
IS_NGINX_EXISTS=false
if service nginx status | grep -q 'Loaded: loaded' ; then
IS_NGINX_EXISTS=true
fi
}
collectLogs() { # initials - cl
cp_print "---- Collecting log files ----"
cl_LOGS_DIR="$CP_INFO_DIR/logs"
cl_nginx_rpm_dir=${LOG_FILE_PATH}/nano_agent/rpmanager/nginx_log
cl_files_to_save=$(listFilesToSave ${LOG_FILE_PATH}/nano_agent)
mkdir -p "$cl_LOGS_DIR"/nano_agent && cp -r "$cl_files_to_save" "$cl_LOGS_DIR"/nano_agent
cp_print "Saving dmesg logs..."
dmesg >> "$cl_LOGS_DIR/dmesg.log" 2>&1
if [ "$WITH_DUMP" = "true" ]; then
cp_print "Saving crash logs..."
mkdir -p "$cl_LOGS_DIR"/crash && cp -r /var/crash/. "$cl_LOGS_DIR"/crash
fi
if [ "$IS_NGINX_EXISTS" = "true" ]; then
cp_print "Saving nginx logs..."
cl_files_to_save=$(listFilesToSave /var/log/nginx)
mkdir -p "$cl_LOGS_DIR"/nginx && cp -r "$cl_files_to_save" "$cl_LOGS_DIR"/nginx
fi
mkdir -p "$cl_LOGS_DIR"/nginx && cp -r $cl_nginx_rpm_dir/. "$cl_LOGS_DIR"/nginx 2>/dev/null
}
printTopProgress() { # Initials - ptp
ptp_frame_counter=1
ptp_curr_stat="$(stat "$SYSTEM_STATE_FILE")"
ptp_prev_stat="$ptp_curr_stat"
printf "Saving frame number %b out of 20" "$ptp_frame_counter"
while [ $ptp_frame_counter -le 20 ]
do
ptp_curr_stat="$(stat "$SYSTEM_STATE_FILE")"
if [ ! "$ptp_curr_stat" = "$ptp_prev_stat" ]; then
printf "\r\033[0KSaving frame number %b out of 20" "$ptp_frame_counter"
ptp_frame_counter=$((ptp_frame_counter+1))
ptp_prev_stat="$ptp_curr_stat"
fi
done
printf "\n"
}
collectSystemState() {
cp_print "---- Collecting system state ----"
SYSTEM_STATE_FILE="$CP_INFO_DIR/system_state.txt"
printTopProgress &
writeCommandTofile "top -b -n 20" "Saving processes resources status..."
writeCommandTofile "df -h" "Saving filesystem status..."
writeCommandTofile "ps -ef" "Saving running processes status..."
writeCommandTofile "netstat -an" "Saving network connections status..."
writeCommandTofile "ifconfig -a" "Saving network interfaces status..."
writeCommandTofile "cat /proc/cpuinfo" "Saving CPU status..."
writeCommandTofile "cat /proc/meminfo" "Saving memory status..."
writeCommandTofile "cpnano -s" "Saving cpnano status..."
writeCommandTofile "cpnano -pm" "Saving metrics information..."
if [ $IS_NGINX_EXISTS = true ]; then
writeCommandTofile "nginx -V" "Saving nginx details..."
fi
# Get all active interfaces have both an inet entry and a broadcast (brd) address
interfaces=$(ip addr show | awk '/inet.*brd/{print $NF}' | tr '\n' ' ')
for i in ${interfaces}; do
writeCommandTofile "ethtool $i" "Saving network interfaces details for interface $i..."
writeCommandTofile "ethtool -S $i"
done
}
writeCommandTofile() { # Initials - wctf
wctf_msg_to_user=$2
if [ -n "$wctf_msg_to_user" ]; then
cp_print "$wctf_msg_to_user"
fi
cp_print "\n******************************* Command: $1 *******************************\n" >> "$SYSTEM_STATE_FILE"
$1 >> "$SYSTEM_STATE_FILE" 2>&1
}
helpMenu() {
cp_print "Usage: cpnano <--info> [options]"
cp_print "Options:"
cp_print "-h, --help : This help text."
cp_print "-o, --output : Output file path."
cp_print "-wd, --with_dump : Collect dump files."
cp_print "-sd, --split_dir : Target directory for compressed files with $SPLIT_FILE_SIZE maximum size each."
cp_print "-fms, --file_max_size : Maximum size for each splited file in kb"
cp_print "-an, --additional_name : Additional string for output file name"
cp_print "-sh, --short : Save only the most necessary files"
cp_print "-v, --verbose : Use verbose mode"
}
get_setting() # Initials - gs
{
gs_service_name="$1"
gs_setting_name="$2"
gs_service_settings="$(run_display_settings "$gs_service_name")"
gs_setting_value=$(extract_json_field_value "$gs_service_settings" "$gs_setting_name")
echo "$gs_setting_value"
}
[ -f /etc/environment ] && . "/etc/environment"
if [ -n "${CP_ENV_FILESYSTEM}" ] ; then
FILESYSTEM_PATH=$CP_ENV_FILESYSTEM
fi
if [ -n "${CP_ENV_LOG_FILE}" ] ; then
LOG_FILE_PATH=$CP_ENV_LOG_FILE
fi
IS_SMB=0
if [ -f /pfrm2.0/bin/cposd ]; then
IS_SMB=1
SPLIT_FILE_SIZE="99m"
mkdir -p /storage/tmp
CP_INFO_DIR="/storage/tmp/cp-agent-info-temp"
CP_UNSPLITED_DIR="/storage/tmp/cp-agent-info-unsplited-temp"
fi
SPLIT_DIR=""
WITH_DUMP=false
set -- ${cp_nano_info_args}
while true
do
if [ "$1" = "--with_dump" ] || [ "$1" = "-wd" ]; then
WITH_DUMP=true
elif [ "$1" = "--help" ] || [ "$1" = "-h" ]; then
helpMenu
exit 0
elif [ "$1" = "--split_dir" ] || [ "$1" = "-sd" ]; then
shift
SPLIT_DIR=$1
elif [ "$1" = "--file_max_size" ] || [ "$1" = "-fms" ]; then
shift
SPLIT_FILE_SIZE="$1k"
elif [ "$1" = "--additional_name" ] || [ "$1" = "-an" ]; then
shift
FILE_PREFIX="-$1"
elif [ "$1" = "--short" ] || [ "$1" = "-sh" ]; then
SHORT_VERSION=true
elif [ "$1" = "--verbose" ] || [ "$1" = "-v" ]; then
VERBOSE=true
elif [ -z "$1" ]; then
break
else
helpMenu
exit 1
fi
shift
done
cp_print "---- Starting to collect Check Point Nano Agent data ----"
mkdir -p "$CP_INFO_DIR"
mkdir -p "$CP_UNSPLITED_DIR"
checkNginx
collectLogs
collectSystemState
curl_cmd=curl
if cat /etc/*release | grep -q "Gaia"; then
curl_cmd=curl_cli
fi
cp_print "---- Compressing cp-agent-info ----"
CURRENT_TIME=$(date "+%Y.%m.%d-%H.%M.%S")
agent_id=
orch_status=$(${curl_cmd} -sS -m 1 --noproxy "*" --header "Content-Type: application/json" --request POST --data {} http://127.0.0.1:"$(extract_api_port 'orchestration')"/show-orchestration-status 2>&1)
if echo "$orch_status" | grep -q "update status" ; then
orch_status=$(cat ${FILESYSTEM_PATH}/conf/orchestrations_status.json)
fi
if [ -n "${orch_status}" ]; then
agent_id=$(printf "%b\n" "$orch_status" | grep "Agent ID" | cut -d '"' -f4)
fi
AGENT_INFO_FILE_NAME=cp-nano-info-$agent_id-$CURRENT_TIME$FILE_PREFIX.tar.gz
if [ "$IS_SMB" != "1" ]; then
CP_INFO_PATH=/tmp/$AGENT_INFO_FILE_NAME
else
CP_INFO_PATH=/storage/tmp/$AGENT_INFO_FILE_NAME
fi
TAR_FAILED=false
conf_to_save=${FILESYSTEM_PATH}/conf
inner_conf_file_to_save=""
if [ "$SHORT_VERSION" = "true" ];then
conf_to_save="$(ls -d ${FILESYSTEM_PATH}/conf/* | grep -E '\.json|\.policy')"
inner_conf_file_to_save="$(ls -d ${FILESYSTEM_PATH}/conf/*/* | grep -E '\.json|\.policy|\.conf')"
fi
cp_print "Compressing and saving the next files and directories:\n $CP_INFO_DIR\n ${FILESYSTEM_PATH}/conf\n ${FILESYSTEM_PATH}/watchdog"
verbose_tar=""
if [ "$VERBOSE" = "true" ];then
verbose_tar="v"
fi
if [ -n "${SPLIT_DIR}" ]; then
mkdir -p "$SPLIT_DIR"
unsplited_tar="${CP_UNSPLITED_DIR}/agent-info.tar.gz"
if [ `tar --help | grep absolute-names | wc -l` = "1" ]; then
TAR_EXTRA_PARAMS="--absolute-names"
else
TAR_EXTRA_PARAMS=""
fi
cmd="tar ${verbose_tar}czf ${unsplited_tar} ${TAR_EXTRA_PARAMS} ${CP_INFO_DIR} ${conf_to_save} ${inner_conf_file_to_save} ${FILESYSTEM_PATH}/watchdog"
if ! ${cmd}; then
TAR_FAILED=true
else
split -b "$SPLIT_FILE_SIZE" "$unsplited_tar" "$SPLIT_DIR/$AGENT_INFO_FILE_NAME."
cat "$SPLIT_DIR"/* > "$CP_INFO_PATH"
fi
else
cmd="tar -${verbose_tar}zcf ${CP_INFO_PATH} ${TAR_EXTRA_PARAMS} ${CP_INFO_DIR} ${conf_to_save} ${inner_conf_file_to_save} ${FILESYSTEM_PATH}/watchdog"
if ! ${cmd}; then
TAR_FAILED=true
fi
fi
rm -rf "$CP_INFO_DIR"
rm -rf "$CP_UNSPLITED_DIR"
if [ $TAR_FAILED = true ]; then
echo "Failed to create $CP_INFO_PATH"
exit 1
fi
cp_print "cp-agent-info was successfully created in $CP_INFO_PATH"
# tar generation completed successfully - returning to cp-nano-cli.sh