-
Notifications
You must be signed in to change notification settings - Fork 37
/
Copy pathredis-cmd-listener.py
121 lines (95 loc) · 3.16 KB
/
redis-cmd-listener.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
#!/usr/bin/env python
import redis
import time
import json
import os
import socket
import struct
from fcntl import ioctl
import subprocess
import logging
SIOCGIFFLAGS = 0x8913 # get the active flag word of the device
SIOCSIFFLAGS = 0x8914 # set the active flag word of the device
IFF_UP = 0x0001
logging.basicConfig(format='%(message)s')
logger = logging.getLogger('ptf_nn_agent')
def iface_exists(iface_name):
return iface_name in os.listdir('/sys/class/net')
def iface_is_up(iface_name):
try:
s = socket.socket()
ifr = struct.pack('16sh', str.encode(iface_name), 0)
result = ioctl(s, SIOCGIFFLAGS, ifr)
s.close()
except:
return False
flags = struct.unpack('16sh', result)[1]
return flags & IFF_UP > 0
def set_iface_status(args):
iface_name = args["iface"]
s = socket.socket()
ifr = struct.pack('16sh', str.encode(iface_name), 0)
result = ioctl(s, SIOCGIFFLAGS, ifr)
flags = struct.unpack('16sh', result)[1]
if args["admin"] == "up":
flags |= IFF_UP
else:
flags &= ~IFF_UP
ifr = struct.pack('16sh', str.encode(iface_name), flags)
ioctl(s, SIOCSIFFLAGS, ifr)
s.close()
return True
def start_nn_agent(ifaces):
iface_args = ""
nn_agent_cmd = ["ptf_nn_agent.py", "--device-socket", "0@tcp://0.0.0.0:10001"]
logger.info(ifaces)
for inum, iname in ifaces.items():
#if not iface_is_up(iname):
# return None
nn_agent_cmd.append("-i")
nn_agent_cmd.append("{}@{}".format(inum, iname))
logger.info(str(nn_agent_cmd))
p = subprocess.Popen(nn_agent_cmd)
return p
def process_is_running(p):
return p is not None and p.returncode is None
def stop_process(p):
if p:
p.terminate()
p.wait()
return p.returncode is not None
def main():
logger.setLevel(logging.INFO)
nn_agent_p = None
time.sleep(5)
r = redis.Redis(host='localhost', port=6379, db=1)
while True:
cmd = r.lrange("SAI_CHALLENGER_CMD_QUEUE", 0, -1)
if len(cmd) == 0:
time.sleep(0.2)
continue
logger.info(cmd)
r.delete("SAI_CHALLENGER_CMD_QUEUE")
for i in range(len(cmd)):
cmd[i] = cmd[i].decode("utf-8")
if cmd[0] == "iface_exists" and len(cmd) == 2:
status = "ok" if iface_exists(cmd[1]) else "err"
elif cmd[0] == "iface_is_up" and len(cmd) == 2:
status = "ok" if iface_is_up(cmd[1]) else "err"
elif cmd[0] == "set_iface_status" and len(cmd) == 2:
status = "ok" if set_iface_status(json.loads(cmd[1])) else "err"
elif cmd[0] == "start_nn_agent" and len(cmd) == 2:
nn_agent_p = start_nn_agent(json.loads(cmd[1]))
status = "ok" if process_is_running(nn_agent_p) else "err"
elif cmd[0] == "stop_nn_agent":
if stop_process(nn_agent_p) == True:
nn_agent_p = None
status = "ok"
else:
status = "err"
else:
status = "err"
logger.info(status)
r.lpush("SAI_CHALLENGER_CMD_STATUS_QUEUE", status)
if __name__ == "__main__":
main()