HEX
Server: LiteSpeed
System: Linux atali.colombiahosting.com.co 5.14.0-570.12.1.el9_6.x86_64 #1 SMP PREEMPT_DYNAMIC Tue May 13 06:11:55 EDT 2025 x86_64
User: coopserp (1713)
PHP: 8.2.29
Disabled: dl,exec,passthru,proc_open,proc_close,shell_exec,memory_limit,system,popen,curl_multi_exec,show_source,symlink,link,leak,listen,diskfreespace,tmpfile,ignore_user_abord,highlight_file,source,show_source,fpaththru,virtual,posix_ctermid,posix_getcwd,posix_getegid,posix_geteuid,posix_getgid,posix_getgrgid,posix_getgrnam,posix_getgroups,posix_getlogin,posix_getpgid,posix_getpgrp,posix_getpid,posix,posix_getppid,posix_getpwnam,posix_getpwuid,posix_getrlimit,posix_getsid,posix_getuid,posix_isatty,posix_kill,posix_mkfifo,posix_setegid,posix_seteuid,posix_setgid,posix_setpgid,posix_setsid,posix_setid,posix_times,posix_ttyname,posix_uname,proc_get_status,proc_nice,proc_terminate
Upload Files
File: //usr/local/lib/python3.9/site-packages/agent360/plugins/ping.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import re
from subprocess import Popen, PIPE, CalledProcessError
import sys
import plugins


def _get_match_groups(ping_output, regex):
    match = regex.search(ping_output)
    if not match:
        return False
    else:
        return match.groups()


def system_command(Command, newlines=True):
    Output = ""
    Error = ""
    try:
        proc = Popen(Command.split(), stdout=PIPE)
        Output = proc.communicate()[0]
    except Exception:
        pass

    if Output:
        if newlines is True:
            Stdout = Output.split("\\n")
        else:
            Stdout = Output
    else:
        Stdout = []
    if Error:
        Stderr = Error.split("\n")
    else:
        Stderr = []

    return (Stdout, Stderr)


def collect_ping(hostname):
    if sys.platform.startswith('linux') or sys.platform.startswith('freebsd'):
    #if sys.platform == "linux" or sys.platform == "linux2":
        response = str(system_command("ping -W 5 -c 1 " + hostname, False)[0])
        try:
            matcher = re.compile(r'(\d+.\d+)/(\d+.\d+)/(\d+.\d+)/(\d+.\d+)')
            minping, avgping, maxping, jitter = _get_match_groups(response, matcher)
            response = avgping
        except Exception:
            #response = 9999
            response = -1
    elif sys.platform == "darwin":
        response = str(system_command("ping -c 1 " + hostname, False)[0])
        # matcher = re.compile(r'min/avg/max/stddev = (\d+)/(\d+)/(\d+)/(\d+) ms')
        # min, avg, max, stddev = _get_match_groups(response, matcher)
        matcher = re.compile(r'(\d+.\d+)/(\d+.\d+)/(\d+.\d+)/(\d+.\d+)')
        matched = _get_match_groups(response, matcher)
        if matched is False:
            #response = 0
            response = -1
        else:
            minping, avgping, maxping, jitter = matched
            response = avgping
    elif sys.platform == "win32":
        #response = 0
        response = -1
        try:
            ping = Popen(["ping", "-n", "1 ", hostname], stdout=PIPE, stderr=PIPE)
            out, error = ping.communicate()
            if out:
                try:
                    response = int(re.findall(r"Average = (\d+)", out)[0])
                except Exception:
                    pass
            else:
                #response = 0
                response = -1
        except CalledProcessError:
            pass
        if response == -1:
            try:
                rxresponse = re.findall(br" + .+ = [0-9]{1,9}ms, .+ = [0-9]{1,9}ms, .+ = (\d+){1,9}ms", out)
                response = rxresponse[0].decode()
            except Exception:
                pass
    else:
        #response = float(system_command("ping -W -c 1 " + hostname))
        response = -1
    return {'avgping': response, 'host': hostname}


class Plugin(plugins.BasePlugin):
    __name__ = 'ping'

    def run(self, config):
        data = {}
        my_hosts = config.get('ping', 'hosts').split(',')
        data['ping'] = []
        for host in my_hosts:
            data['ping'].append(collect_ping(host))
        return data['ping']


if __name__ == '__main__':
    Plugin().execute()