/
monitor.py
executable file
·90 lines (74 loc) · 3.42 KB
/
monitor.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
#!/usr/bin/env python
import argparse
import util
import psutil
import datetime
import platform
import logging
from cloud_tools import Publisher
NET_INTERFACES = ['en0', 'en1', 'en2', 'en3', 'wlan0', 'wlan1', 'eth0', 'eth1']
LOG_FILE = '/var/log/iot.log'
def get_rpi_cpu_temperature():
"""Returns raspberry pi cpu temperature in Centigrade"""
temp = util.os_execute('/opt/vc/bin/vcgencmd measure_temp')
return float(temp.split('=')[1].strip('\'C'))
def get_ip(i):
if i in psutil.net_if_addrs():
try:
for k in psutil.net_if_addrs()[i]:
family, address, netmask, broadcast, ptp = k
if family == 2:
return address
return None
except Exception as ex:
logging.info("get_ip {} {}".format(i, ex.message))
return None
else:
return None
def get_properties(group):
mem = psutil.virtual_memory()
disk = psutil.disk_usage('/')
properties = {}
if group is None or group == 'fresh':
if platform.machine().startswith('arm') and platform.system() == 'Linux': # raspberry pi
properties["cpuTemp"] = get_rpi_cpu_temperature()
properties["ramAvailable"] = int(mem.available / (1024 * 1024))
properties["usedDiskSpaceRoot"] = int(disk.used / (1024 * 1024))
properties["bootTime"] = datetime.datetime.fromtimestamp(psutil.boot_time()).strftime(Publisher.DATE_FORMAT)
properties["cpuLoad"] = psutil.cpu_percent(interval=3)
if group is None or group == 'seldom':
if platform.system() == 'Darwin': # mac
properties["release"] = platform.mac_ver()[0]
elif platform.machine().startswith('arm') and platform.system() == 'Linux': # raspberry pi
properties["distribution"] = "{} {}".format(platform.dist()[0], platform.dist()[1])
for i in NET_INTERFACES:
properties["{}IpAddress".format(i)] = get_ip(i)
properties["totalDiskSpaceRoot"] = int(disk.total / (1024 * 1024))
properties["hostname"] = platform.node()
properties["machine"] = platform.machine()
properties["system"] = platform.system()
properties["cpuProcessorCount"] = psutil.cpu_count()
properties["ramTotal"] = int(mem.total / (1024 * 1024))
return properties
if __name__ == "__main__":
# parse arguments
parser = argparse.ArgumentParser()
parser.add_argument("-e", "--endpoint", help="AWS IoT endpoint", required=True)
parser.add_argument("-r", "--rootCA", help="Root CA file path", required=True)
parser.add_argument("-c", "--cert", help="Certificate file path", required=True)
parser.add_argument("-k", "--key", help="Private key file path", required=True)
parser.add_argument("-i", "--clientID", help="Client ID", default=None)
parser.add_argument("-s", "--source", help="Source", default=platform.node().split('.')[0])
parser.add_argument("-p", "--party", help="Monitor party", default=None)
parser.add_argument("-l", "--log_level", help="Log Level", default=logging.WARNING)
args = parser.parse_args()
logging.basicConfig(filename=LOG_FILE, level=args.log_level)
Publisher(
args.endpoint,
args.rootCA,
args.key,
args.cert,
clientID=args.clientID,
log_level=args.log_level
).report(Publisher.THING_SHADOW.format(args.source),
{Publisher.STATE: {Publisher.REPORTED: get_properties(args.party)}})