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/minecraft.py
import plugins
import socket
import struct
import json

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

    def run(self, config):
        '''
        Fetch the amount of active and max players
        add to /etc/agent360.ini
        [minecraft]
        enabled=yes
        hosts=127.0.0.1:8000,127.0.0.2:8000...
        '''

        my_hosts = config.get('minecraft', 'hosts').split(',')
        result = {}
        for connection_string in my_hosts:
            try:
                # Connect
                s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
                hostname = connection_string.split(':')[0]
                port = int(connection_string.split(':')[1])
                s.connect((hostname, port))

                # Send handshake + status request
                s.send(self.pack_data("\x00\x00" + self.pack_data(hostname.encode('utf8')) + self.pack_port(port) + "\x01"))
                s.send(self.pack_data("\x00"))

                # Read response
                self.unpack_varint(s)     # Packet length
                self.unpack_varint(s)     # Packet ID
                l = self.unpack_varint(s) # String length

                d = ""
                while len(d) < l:
                    d += s.recv(1024)

                # Close our socket
                s.close()
            except:
                pass

            results = {}

            try:
                players = json.loads(d.decode('utf8'))['players']
                results['online'] = int(players['online'])
                results['max'] = int(players['max'])
            except:
                results['online'] = 0
                results['max'] = 0
            result[str(connection_string.replace('.', '-'))] = results

        return result


    def unpack_varint(self, s):
        d = 0
        for i in range(5):
            b = ord(s.recv(1))
            d |= (b & 0x7F) << 7*i
            if not b & 0x80:
                break
        return d

    def pack_varint(self, d):
        o = ""
        while True:
            b = d & 0x7F
            d >>= 7
            o += struct.pack("B", b | (0x80 if d > 0 else 0))
            if d == 0:
                break
        return o

    def pack_data(self, d):
        return self.pack_varint(len(d)) + d

    def pack_port(self, i):
        return struct.pack('>H', i)

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