#!/bin/bash

set -u
set -o pipefail

results=()

add_result() {
    local value="$1"
    [[ -n "$value" ]] && results+=("$value")
}

get_os() {
    local os_name="" os_version=""

    if [[ -r /etc/os-release ]]; then
        . /etc/os-release
        os_name="${NAME:-}"
        os_version="${VERSION_ID:-}"
    fi

    if [[ -z "$os_name" && -r /etc/redhat-release ]]; then
        echo "$(cat /etc/redhat-release)"
        return
    fi

    echo "${os_name} ${os_version}" | sed 's/[[:space:]]\+/ /g; s/[[:space:]]*$//'
}

get_mysql_version() {
    local version=""

    if command -v mysql >/dev/null 2>&1; then
        version=$(mysql --version 2>/dev/null)
        if echo "$version" | grep -qi 'mariadb'; then
            version=$(echo "$version" | sed -n 's/.*Distrib \([0-9.]*\).*/MariaDB - \1/p')
        else
            version=$(echo "$version" | sed -n 's/.*Ver \([0-9.]*\).*/MySQL - \1/p')
        fi
    fi

    if [[ -z "$version" ]] && command -v mariadb >/dev/null 2>&1; then
        version=$(mariadb --version 2>/dev/null | sed -n 's/.*Distrib \([0-9.]*\).*/MariaDB - \1/p')
    fi

    if [[ -z "$version" ]]; then
        if systemctl is-active --quiet mysqld 2>/dev/null; then
            version="MySQL/MariaDB - active"
        elif systemctl is-active --quiet mariadb 2>/dev/null; then
            version="MySQL/MariaDB - active"
        fi
    fi

    echo "$version"
}

list_active_services() {
    systemctl list-units --type=service --state=active --no-legend --no-pager 2>/dev/null \
        | awk '{print $1}' | sed 's/\.service$//'
}

is_excluded() {
    local svc="$1"

    case "$svc" in
        # OS / default noise
        NetworkManager*|cpipv6|lsapi-cache|wp-toolkit-background-tasks|clwpos_monitoring|jetmongod|ipaliases|governor_sentry_daemon|kmod-static-nodes|xray-agent|low-memory-monitor|wp-toolkit-scheduled-tasks|httpd|apache*|*php-fpm|cl_*|import-state|netconsole|proxyexecd|lve*|ssa-agent|rhnsd|cloud-*|dbus-broker|sw-engine|p0f|cpanel*|cpdavd|dnsadmin|tailwatchd|pure-authd|pure-ftpd|queueprocd|quotaon|rngd|rpcbind|rpc-statd-notify|securetmp|spamd|sysstat|NetworkManager|sshd|crond|dbus|chronyd|rsyslog|systemd-*|polkit|irqbalance|firewalld|tuned|getty*|serial-getty@*|auditd|kdump|network|ldconfig|dracut-shutdown|plymouth-*|nis-domainname|nscd|gssproxy|atd|avahi-daemon|cups|nftables|smartd|user-runtime-dir@*|user@*)
            return 0
            ;;

        # cPanel defaults you don't care about
        dovecot|exim|named)
            return 0
            ;;

        # security/extra noise
        ossec-hids|kcare|aibolit-resident|imunify-realtime-av)
            return 0
            ;;

        # mysql handled separately
        mysqld|mariadb)
            return 0
            ;;
    esac

    return 1
}

main() {
    local os mysqlver svc tmpfile=""
    declare -A seen=()

    os="$(get_os)"
    add_result "$os"

    mysqlver="$(get_mysql_version)"
    add_result "$mysqlver"

    tmpfile=$(mktemp) || exit 1
    trap '[[ -n "${tmpfile:-}" && -f "${tmpfile:-}" ]] && rm -f "$tmpfile"' EXIT

    list_active_services > "$tmpfile"

    while IFS= read -r svc; do
        [[ -z "$svc" ]] && continue

        if is_excluded "$svc"; then
            continue
        fi

        # collapse imunify360 services into one
        if [[ "$svc" == imunify360* || "$svc" == imunify-* || "$svc" == aibolit-* ]]; then
            if [[ -z "${seen[imunify360]:-}" ]]; then
                seen["imunify360"]=1
                add_result "imunify360"
            fi
            continue
        fi

        [[ -n "${seen[$svc]:-}" ]] && continue
        seen["$svc"]=1

        add_result "$svc"
    done < "$tmpfile"

    printf '['
    local i
    for i in "${!results[@]}"; do
        printf '"%s"' "${results[$i]}"
        [[ "$i" -lt $((${#results[@]} - 1)) ]] && printf ', '
    done
    printf ']\n'
}

main
