m-chrzan.xyz
aboutsummaryrefslogtreecommitdiff
path: root/src/main/resources/pl/edu/mimuw/cloudatlas/fetcher/data_fetcher.py
blob: d69c498d18c80603ed27c37747f715225bd7002a (plain)
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
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
import json
import subprocess
import sys
import time

import schedule
import psutil
import platform
import socket
import configparser
# import sqlite3

# Pipe
pipe = None

# Attribute params
collectionInterval = 1
averagingPeriod = 1
averagingMethod = ""

"""
    Attributes

    the average CPU load (over all cores) as cpu_load
    the free disk space (in bytes) as free_disk
    the total disk space (in bytes) as total_disk
    the free RAM (in bytes) as free_ram
    the total RAM (in bytes) as total_ram
    the free swap (in bytes) as free_swap
    the total swap (in bytes) as total_swap
    the number of active processes as num_processes
    the number of CPU cores as num_cores
    the kernel version as kernel_ver
    the number of users logged in as logged_users
    a set of up to three DNS names of the machine dns_names

"""


def setup_database():
    conn = sqlite3.connect('attributes.db')
    c = conn.cursor()
    c.execute('''CREATE TABLE attrib
             (timestamp integer,
              avg_cpu_load integer,
              free_disk integer,
              total_disk integer,
              free_ram integer,
              total_ram integer,
              free_swap integer,
              total_swap integer,
              num_processes integer,
              num_cores integer,
              kernel_ver text,
              logged_users integer,
              dns_names text) 
              ''')
    # TODO format dns_names
    conn.commit()
    conn.close()


def get_data():
    avg_cpu_load = psutil.cpu_percent(interval=1) # TODO better?
    free_disk = psutil.disk_usage("/").free
    total_disk = psutil.disk_usage("/").total
    free_ram = psutil.virtual_memory().available
    total_ram = psutil.virtual_memory().total
    free_swap = psutil.swap_memory().free
    total_swap = psutil.swap_memory().total
    num_processes = len(psutil.pids())
    num_cores = psutil.cpu_count(False)
    kernel_ver = platform.release() # TODO ew. version()
    logged_users = len(psutil.users())

    hostname = socket.gethostbyaddr("127.0.0.1") # TODO czy dziala
    dns_names = ([hostname[0]] + hostname[1])[:3]
    # https://stackoverflow.com/questions/2575760/python-lookup-hostname-from-ip-with-1-second-timeout

    sys.stdout.write("[{},{},{},{},{},{},{},{},{},{},{},{}]\n".format(
    #print("[{},{},{},{},{},{},{},{},{},{},{},{}]\r\n".format(
    avg_cpu_load,
    free_disk,
    total_disk,
    free_ram,
    total_ram,
    free_swap,
    total_swap,
    num_processes,
    num_cores,
    kernel_ver,
    logged_users,
    json.dumps(dns_names))) #.encode())  # TODO ten string
    sys.stdout.flush()
    # TODO error control and pipe restart

"""
    conn = sqlite3.connect('attributes.db')
    c = conn.cursor()
    c.execute("INSERT INTO attrib VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )",
              avg_cpu_load,
              free_disk,
              total_disk,
              free_ram,
              total_ram,
              free_swap,
              total_swap,
              num_processes,
              num_cores,
              kernel_ver,
              logged_users,
              dns_names.__str__()) # TODO ten string
    conn.commit()
    conn.close()
"""

# TODO funkcja do usuwania zbendych
def remove_historical_data():
    pass


if __name__ == '__main__':
    # config = configparser.ConfigParser()
    # config.read("config.ini")
    collectionInterval = int(5) # int(config["AttributeParams"]["collectionInterval"])
    averagingPeriod = int(5) # int(config["AttributeParams"]["averagingPeriod"])
    averagingMethod = "arithmetic" # config["AttributeParams"]["averagingMethod"]

    # setup_database()

    # TODO some condition for this?
    while True:
        get_data()
        time.sleep(collectionInterval)

    # schedule.every(collectionInterval).seconds.do(get_data)