You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							377 lines
						
					
					
						
							9.9 KiB
						
					
					
				
			
		
		
	
	
							377 lines
						
					
					
						
							9.9 KiB
						
					
					
				| #!/bin/bash
 | |
| # info: list system services
 | |
| # options: [FORMAT]
 | |
| #
 | |
| # example: v-list-sys-services json
 | |
| #
 | |
| # This function for obtaining the list of configured system services.
 | |
| 
 | |
| #----------------------------------------------------------#
 | |
| #                Variables & Functions                     #
 | |
| #----------------------------------------------------------#
 | |
| 
 | |
| # Argument definition
 | |
| format=${1-shell}
 | |
| 
 | |
| # Includes
 | |
| # shellcheck source=/etc/hestiacp/hestia.conf
 | |
| source /etc/hestiacp/hestia.conf
 | |
| # shellcheck source=/usr/local/hestia/func/main.sh
 | |
| source $HESTIA/func/main.sh
 | |
| # load config file
 | |
| source_conf "$HESTIA/conf/hestia.conf"
 | |
| 
 | |
| # JSON list function
 | |
| json_list() {
 | |
| 	IFS=$'\n'
 | |
| 	i=1
 | |
| 	objects=$(echo -e "$data" | grep NAME | wc -l)
 | |
| 	echo "{"
 | |
| 	while read str; do
 | |
| 		parse_object_kv_list "$str"
 | |
| 		echo -n '    "'$NAME'": {
 | |
|         "SYSTEM": "'$SYSTEM'",
 | |
|         "STATE": "'$STATE'",
 | |
|         "CPU": "'$CPU'",
 | |
|         "MEM": "'$MEM'",
 | |
|         "RTIME": "'$RTIME'"
 | |
|     }'
 | |
| 		if [ "$i" -lt "$objects" ]; then
 | |
| 			echo ','
 | |
| 		else
 | |
| 			echo
 | |
| 		fi
 | |
| 		((i++))
 | |
| 	done < <(echo -e "$data" | grep NAME)
 | |
| 	echo '}'
 | |
| }
 | |
| 
 | |
| # SHELL list function
 | |
| shell_list() {
 | |
| 	IFS=$'\n'
 | |
| 	echo "NAME   STATE   CPU   MEM   UPTIME"
 | |
| 	echo "----   -----   ---   ---   ------"
 | |
| 	while read str; do
 | |
| 		parse_object_kv_list "$str"
 | |
| 		echo "$NAME $STATE $CPU $MEM $RTIME"
 | |
| 	done < <(echo -e "$data" | grep NAME)
 | |
| }
 | |
| 
 | |
| # PLAIN list function
 | |
| plain_list() {
 | |
| 	IFS=$'\n'
 | |
| 	while read str; do
 | |
| 		parse_object_kv_list "$str"
 | |
| 		echo -e "$NAME\t$SYSTEM\t$STATE\t$CPU\t$MEM\t$RTIME"
 | |
| 	done < <(echo -e "$data" | grep NAME)
 | |
| }
 | |
| 
 | |
| # CSV list function
 | |
| csv_list() {
 | |
| 	IFS=$'\n'
 | |
| 	echo "NAME,SYSTEM,STATE,CPU,MEM,RTIME"
 | |
| 	while read str; do
 | |
| 		parse_object_kv_list "$str"
 | |
| 		echo "$NAME,\"$SYSTEM\",$STATE,$CPU,$MEM,$RTIME"
 | |
| 	done < <(echo -e "$data" | grep NAME)
 | |
| }
 | |
| 
 | |
| # Get service state function
 | |
| get_srv_state() {
 | |
| 	srv=$1
 | |
| 	name=${2-$1}
 | |
| 	state='running'
 | |
| 	mem=0
 | |
| 	cpu=0
 | |
| 	rtime="0"
 | |
| 
 | |
| 	# Searching related pids
 | |
| 	if [ "$name" = "php-fpm" ]; then
 | |
| 		pids=''
 | |
| 		for php_pid in $(pidof php-fpm); do
 | |
| 			process_info=$(ps -p "$php_pid" -o args | tail -n1 | grep "$srv")
 | |
| 			if [ -n "$process_info" ]; then
 | |
| 				pids="${pids}|${php_pid}"
 | |
| 			fi
 | |
| 		done
 | |
| 	else
 | |
| 		if [ -z $3 ]; then
 | |
| 			pids=$(pidof $name | tr ' ' '|')
 | |
| 		else
 | |
| 			pids=$(pidof -x $name | tr ' ' '|')
 | |
| 		fi
 | |
| 		if [ -z "$pids" ] && [ "$name" != 'nginx' ]; then
 | |
| 			pids=$(pgrep $name | tr '\n' '|')
 | |
| 		fi
 | |
| 	fi
 | |
| 
 | |
| 	# Prevent from an SSH false positive when there is a TTY or SFTP connection but service is down
 | |
| 	if [ "$name" == 'ssh' ] && [ "$(systemctl show sshd.service | grep 'SubState=' | cut -f2 -d=)" != "running" ]; then
 | |
| 		pids=''
 | |
| 	fi
 | |
| 
 | |
| 	# Checking pid
 | |
| 	if [ -n "$pids" ]; then
 | |
| 		pid=$(echo "$pids" | cut -f 1 -d '|')
 | |
| 		pids=${pids%|}
 | |
| 		pids=$(egrep "$pids" $tmp_file)
 | |
| 
 | |
| 		# Calculating CPU usage
 | |
| 		cpu=$(echo "$pids" | awk '{ sum += $2} END {print sum}')
 | |
| 
 | |
| 		# Calculating memory usage
 | |
| 		mem=$(echo "$pids" | awk '{sum += $3} END {print sum/1024 }')
 | |
| 		mem=$(echo "${mem%%.*}")
 | |
| 
 | |
| 		# Searching pid file
 | |
| 		pid_file=''
 | |
| 		if [ -e "/run/$srv.pid" ]; then
 | |
| 			pid_file="/run/$srv.pid"
 | |
| 		fi
 | |
| 		if [ -z "$pid_file" ] && [ -e "/run/$srv/$srv.pid" ]; then
 | |
| 			pid_file="/run/$srv/$srv.pid"
 | |
| 		fi
 | |
| 		if [ -z "$pid_file" ] && [ -e "/run/$name/$name.pid" ]; then
 | |
| 			pid_file="/run/$name/$name.pid"
 | |
| 		fi
 | |
| 		if [ -z "$pid_file" ] && [ -e "/proc/$pid" ]; then
 | |
| 			pid_file="/proc/$pid"
 | |
| 		fi
 | |
| 
 | |
| 		# Calculating uptime
 | |
| 		if [ -n "$pid_file" ]; then
 | |
| 			mtime=$(stat -c "%Y" $pid_file)
 | |
| 			rtime=$((ctime - mtime))
 | |
| 			rtime=$((rtime / 60))
 | |
| 		else
 | |
| 			rtime=0
 | |
| 		fi
 | |
| 	else
 | |
| 		state='stopped'
 | |
| 		mem=0
 | |
| 		cpu=0
 | |
| 		rtime="0"
 | |
| 	fi
 | |
| }
 | |
| 
 | |
| #----------------------------------------------------------#
 | |
| #                       Action                             #
 | |
| #----------------------------------------------------------#
 | |
| 
 | |
| # Saving current proccess list
 | |
| tmp_file=$(mktemp)
 | |
| ps -eo pid,pcpu,size > $tmp_file
 | |
| 
 | |
| # Checking current time
 | |
| ctime=$(date +%s)
 | |
| 
 | |
| # Checking WEB system
 | |
| if [ -n "$WEB_SYSTEM" ] && [ "$WEB_SYSTEM" != 'remote' ]; then
 | |
| 	get_srv_state $WEB_SYSTEM
 | |
| 	data="NAME='$WEB_SYSTEM' SYSTEM='web server' STATE='$state' CPU='$cpu'"
 | |
| 	data="$data MEM='$mem' RTIME='$rtime'"
 | |
| fi
 | |
| 
 | |
| # Checking PHP intepreter
 | |
| if [ -n "$WEB_BACKEND" ] && [ "$WEB_BACKEND" != 'remote' ]; then
 | |
| 	if [ "$LOCAL_PHP" == "yes" ]; then
 | |
| 		php_versions=$(ls /opt/brepo/php*/sbin/php-fpm | cut -d'/' -f4 | sed 's|php||')
 | |
| 		for version in $php_versions; do
 | |
| 			proc_name="php-fpm"
 | |
| 			service_name="fpm${version}"
 | |
| 			get_srv_state "$proc_name"
 | |
| 			data="$data\nNAME='brepo-php-$service_name' SYSTEM='php interpreter' STATE='$state'"
 | |
| 			data="$data CPU='$cpu' MEM='$mem' RTIME='$rtime'"
 | |
| 		done
 | |
| 	else
 | |
| 		php_versions=$(ls /opt/remi/php*/root/sbin/php-fpm | cut -d'/' -f4 | sed 's|php||')
 | |
| 		for version in $php_versions; do
 | |
| 			proc_name="php-fpm"
 | |
| 			service_name="php${version}"
 | |
| 			get_srv_state "$proc_name"
 | |
| 			data="$data\nNAME='$service_name-php-fpm' SYSTEM='php interpreter' STATE='$state'"
 | |
| 			data="$data CPU='$cpu' MEM='$mem' RTIME='$rtime'"
 | |
| 		done
 | |
| 	fi
 | |
| fi
 | |
| 
 | |
| # Checking WEB Proxy
 | |
| if [ -n "$PROXY_SYSTEM" ] && [ "$PROXY_SYSTEM" != 'remote' ]; then
 | |
| 	get_srv_state "$PROXY_SYSTEM"
 | |
| 	data="$data\nNAME='$PROXY_SYSTEM' SYSTEM='reverse proxy' STATE='$state'"
 | |
| 	data="$data CPU='$cpu' MEM='$mem' RTIME='$rtime'"
 | |
| fi
 | |
| 
 | |
| # DNS
 | |
| service="$DNS_SYSTEM"
 | |
| if [ -n "$service" ] && [ "$service" != 'remote' ]; then
 | |
| 	proc_name='named'
 | |
| 	get_srv_state $service $proc_name
 | |
| 	data="$data\nNAME='$service' SYSTEM='dns server' STATE='$state'"
 | |
| 	data="$data CPU='$cpu' MEM='$mem' RTIME='$rtime'"
 | |
| fi
 | |
| 
 | |
| # Checking MAIL system
 | |
| if [ -n "$MAIL_SYSTEM" ] && [ "$MAIL_SYSTEM" != 'remote' ]; then
 | |
| 	get_srv_state "$MAIL_SYSTEM"
 | |
| 	data="$data\nNAME='$MAIL_SYSTEM' SYSTEM='mail server' STATE='$state'"
 | |
| 	data="$data CPU='$cpu' MEM='$mem' RTIME='$rtime'"
 | |
| fi
 | |
| 
 | |
| # Checking MAIL IMAP
 | |
| if [ -n "$IMAP_SYSTEM" ] && [ "$IMAP_SYSTEM" != 'remote' ]; then
 | |
| 	get_srv_state "$IMAP_SYSTEM"
 | |
| 	data="$data\nNAME='$IMAP_SYSTEM' SYSTEM='imap/pop3 server' STATE='$state'"
 | |
| 	data="$data CPU='$cpu' MEM='$mem' RTIME='$rtime'"
 | |
| fi
 | |
| 
 | |
| # Checking MAIL ANTIVIRUS
 | |
| if [ -n "$ANTIVIRUS_SYSTEM" ] && [ "$ANTIVIRUS_SYSTEM" != 'remote' ]; then
 | |
| 	if [ -d "/etc/sysconfig" ]; then
 | |
| 		if [ "$ANTIVIRUS_SYSTEM" == 'clamav' ]; then
 | |
| 			ANTIVIRUS_SYSTEM='clamd'
 | |
| 		fi
 | |
| 		if [ -f /etc/redhat-release ]; then
 | |
| 			if [ "$ANTIVIRUS_SYSTEM" == 'clamav-daemon' ]; then
 | |
| 				ANTIVIRUS_SYSTEM='clamd'
 | |
| 			fi
 | |
| 		fi
 | |
| 		get_srv_state "$ANTIVIRUS_SYSTEM"
 | |
| 	else
 | |
| 		if [ "$ANTIVIRUS_SYSTEM" == 'clamav-daemon' ]; then
 | |
| 			proc_name='clamd'
 | |
| 		fi
 | |
| 		get_srv_state "$ANTIVIRUS_SYSTEM" "$proc_name"
 | |
| 	fi
 | |
| 	data="$data\nNAME='$ANTIVIRUS_SYSTEM' SYSTEM='email anti-virus'"
 | |
| 	data="$data STATE='$state' CPU='$cpu' MEM='$mem' RTIME='$rtime'"
 | |
| 	proc_name=''
 | |
| fi
 | |
| 
 | |
| # Checking MAIL ANTISPAM
 | |
| if [ -n "$ANTISPAM_SYSTEM" ] && [ "$ANTISPAM_SYSTEM" != 'remote' ]; then
 | |
| 	get_srv_state "$ANTISPAM_SYSTEM" "spamd"
 | |
| 	data="$data\nNAME='$ANTISPAM_SYSTEM' SYSTEM='email spam filter'"
 | |
| 	data="$data STATE='$state' CPU='$cpu' MEM='$mem' RTIME='$rtime'"
 | |
| fi
 | |
| 
 | |
| # Checking DB system
 | |
| if [ -n "$DB_SYSTEM" ] && [ "$DB_SYSTEM" != 'remote' ]; then
 | |
| 	for db in ${DB_SYSTEM//,/ }; do
 | |
| 		service="$db"
 | |
| 		proc_name=''
 | |
| 		mysql="/usr/bin/mysql"
 | |
| 		if [ -f '/usr/bin/mariadb' ]; then
 | |
| 			mysql="/usr/bin/mariadb"
 | |
| 		fi
 | |
| 		if [ "$service" = 'mysql' ]; then
 | |
| 			mysql_version=$($mysql -V)
 | |
| 			mariadb_string="MariaDB"
 | |
| 			if [[ ! $mysql_version =~ $mariadb_string ]]; then
 | |
| 				# MySQL
 | |
| 				service='mysql'
 | |
| 				proc_name='mysqld'
 | |
| 			else
 | |
| 				service='mariadb'
 | |
| 				proc_name='mariadbd'
 | |
| 				# MariaDB 10.4 and lower
 | |
| 				if [ -f $mysql ]; then
 | |
| 					mariadb_v=$($mysql -V | awk 'NR==1{print $5}')
 | |
| 					if [[ $mariadb_v =~ $mariadb_string ]]; then
 | |
| 						mariadb_v=$(echo $mariadb_v | cut -f2 -d'.')
 | |
| 						if [ $mariadb_v -le "4" ]; then
 | |
| 							service='mariadb'
 | |
| 							proc_name='mysqld'
 | |
| 						fi
 | |
| 					fi
 | |
| 				fi
 | |
| 			fi
 | |
| 		fi
 | |
| 		if [ "$service" == 'pgsql' ]; then
 | |
| 			service='postgresql'
 | |
| 			proc_name='postmaster'
 | |
| 			if [ ! -d "/etc/sysconfig" ]; then
 | |
| 				proc_name='postgres'
 | |
| 			fi
 | |
| 			if [ ! -e '/etc/init.d/postgresql' ]; then
 | |
| 				proc_name='postgres'
 | |
| 			fi
 | |
| 		fi
 | |
| 		get_srv_state "$service" "$proc_name"
 | |
| 		data="$data\nNAME='$service' SYSTEM='database server' STATE='$state'"
 | |
| 		data="$data CPU='$cpu' MEM='$mem' RTIME='$rtime'"
 | |
| 		proc_name=''
 | |
| 	done
 | |
| fi
 | |
| 
 | |
| # Checking FTP system
 | |
| if [ -n "$FTP_SYSTEM" ] && [ "$FTP_SYSTEM" != 'remote' ]; then
 | |
| 	get_srv_state "$FTP_SYSTEM"
 | |
| 	data="$data\nNAME='$FTP_SYSTEM' SYSTEM='ftp server' STATE='$state'"
 | |
| 	data="$data CPU='$cpu' MEM='$mem' RTIME='$rtime'"
 | |
| fi
 | |
| 
 | |
| # Checking CRON system
 | |
| if [ -n "$CRON_SYSTEM" ] && [ "$CRON_SYSTEM" != 'remote' ]; then
 | |
| 	get_srv_state "$CRON_SYSTEM"
 | |
| 	data="$data\nNAME='$CRON_SYSTEM' SYSTEM='job scheduler' STATE='$state'"
 | |
| 	data="$data CPU='$cpu' MEM='$mem' RTIME='$rtime'"
 | |
| fi
 | |
| 
 | |
| # Checking SSH daemon
 | |
| if [ -e "/etc/ssh/sshd_config" ]; then
 | |
| 	get_srv_state ssh
 | |
| 	data="$data\nNAME='ssh' SYSTEM='ssh server' STATE='$state'"
 | |
| 	data="$data CPU='$cpu' MEM='$mem' RTIME='$rtime'"
 | |
| fi
 | |
| 
 | |
| # Checking FIREWALL system
 | |
| if [ -n "$FIREWALL_SYSTEM" ] && [ "$FIREWALL_SYSTEM" != 'remote' ]; then
 | |
| 	state="stopped"
 | |
| 	if [ -f /etc/redhat-release ]; then
 | |
| 		RES=$(systemctl is-active nftables | grep -E "^active")
 | |
| 		if [ -n "$RES" ]; then
 | |
| 			state="running"
 | |
| 		fi
 | |
| 	else
 | |
| 		if $(iptables -S INPUT | grep -qx '\-P INPUT DROP'); then
 | |
| 			state="running"
 | |
| 		fi
 | |
| 	fi
 | |
| 	data="$data\nNAME='$FIREWALL_SYSTEM' SYSTEM='firewall'"
 | |
| 	data="$data STATE='$state' CPU='0' MEM='0' RTIME='0'"
 | |
| fi
 | |
| 
 | |
| # Checking FIREWALL Fail2ban extention
 | |
| if [ -n "$FIREWALL_EXTENSION" ]; then
 | |
| 	if [ -e '/usr/bin/lsb_release' ]; then
 | |
| 		if [ "$(lsb_release -s -r)" = "20.04" ]; then
 | |
| 			get_srv_state "$FIREWALL_EXTENSION" f2b/server script
 | |
| 		else
 | |
| 			get_srv_state "$FIREWALL_EXTENSION" fail2ban-server script
 | |
| 		fi
 | |
| 	else
 | |
| 		get_srv_state "$FIREWALL_EXTENSION" fail2ban-server script
 | |
| 	fi
 | |
| 	data="$data\nNAME='$FIREWALL_EXTENSION' SYSTEM='brute-force protection'"
 | |
| 	data="$data STATE='$state' CPU='$cpu' MEM='$mem' RTIME='$rtime'"
 | |
| fi
 | |
| 
 | |
| # Listing data
 | |
| case $format in
 | |
| 	json) json_list ;;
 | |
| 	plain) plain_list ;;
 | |
| 	csv) csv_list ;;
 | |
| 	shell) shell_list | column -t ;;
 | |
| esac
 | |
| 
 | |
| if [ -f "$tmp_file" ]; then
 | |
| 	rm -f "$tmp_file"
 | |
| fi
 | |
| 
 | |
| #----------------------------------------------------------#
 | |
| #                       Hestia                             #
 | |
| #----------------------------------------------------------#
 | |
| 
 | |
| exit
 |