mirror of
https://github.com/openappsec/openappsec.git
synced 2025-06-28 16:41:02 +03:00
257 lines
8.6 KiB
Bash
Executable File
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
|