46
49
free_mem = sum([int(i) for i in free_mem.split()])
47
50
return 100 - 100 * float(free_mem) / float(total_mem)
52
def _fetch_sensor(self, sensor_name):
53
sensor_data = sensor_name.split('//')
55
if (len(sensor_data) != 2):
58
sensor_item = sensor_data[1].replace('-', '.')
60
if sensor_data[0] == 'hddtemp':
61
sensor_cmd = 'netcat localhost 7634'
62
netcat_value = subprocess.Popen(sensor_cmd, stdout=subprocess.PIPE, shell=True).communicate()[0].strip()
65
for hd_data in self.parse_hddtemp_entries(netcat_value):
66
if hd_data[0] == sensor_item:
67
sensor_value = hd_data[2] + '°' + hd_data[3]
69
if sensor_data[0] == 'nvidia':
70
if sensor_item == 'gputemp':
71
sensor_cmd = 'nvidia-settings -q [gpu:0]/GPUCoreTemp | grep "Attribute" | sed -e "s/.*: //g" -e "s/\.//g"'
73
elif sensor_item == 'fanspeed':
74
sensor_cmd = 'nvidia-settings -q [fan:0]/GPUCurrentFanSpeed | grep "Attribute" | sed -e "s/.*: //g" -e "s/\.//g"'
79
sensor_cmd = 'sensors -A ' + sensor_data[0] + " | grep -i '" + sensor_item + "' | cut -f 2 -d ':' | awk '{print $1}'"
81
sensor_value = subprocess.Popen(sensor_cmd, stdout=subprocess.PIPE, shell=True).communicate()[0].strip()
84
return sensor_value + postfix
86
if sensor_cmd == None:
87
logging.info('Sensor not supported: ' + sensor_name)
89
logging.info('Sensor command failed:\n' + sensor_cmd)
92
def _get_sensors_to_fetch(self):
93
fmt = string.Formatter()
95
for token in fmt.parse(self.parent.custom_text):
96
tokens.append(str(token[1]))
50
mem_pct = self._fetch_mem()
51
cpu_pct = self._fetch_cpu()
52
return {'cpu': '%2.0f%%' % cpu_pct,
53
'mem': '%2.0f%%' % mem_pct,
102
for sensor in self._get_sensors_to_fetch():
104
res['cpu'] = '%2.0f%%' % self._fetch_cpu()
105
elif sensor == 'mem':
106
res['mem'] = '%2.0f%%' % self._fetch_mem()
108
res[sensor] = '%s' % self._fetch_sensor(sensor)
56
112
def _fetch_user(self, command):
74
139
self.parent.update(data)
75
140
time.sleep(self.parent.interval)
142
class SensorsListModel:
143
def __init__(self, parent):
144
self.ind_parent = parent
145
self.tree_store = gtk.TreeStore(gobject.TYPE_STRING, gobject.TYPE_STRING, gobject.TYPE_BOOLEAN)
148
for sensor_data in subprocess.Popen('sensors', stdout=subprocess.PIPE, shell=True).communicate()[0].split('\n\n'):
151
for line in sensor_data.split('\n'):
156
if sensor_name == None:
157
logging.info("New sensor found: " + line)
159
parent = self.tree_store.append(None, (sensor_name, None, False))
162
logging.info("Sensor entry: " + line)
163
self.tree_store.append(parent, (line, self.generate_sensor_item_name(sensor_name, line), False))
166
hddtemp = subprocess.Popen('netcat localhost 7634', stdout=subprocess.PIPE, shell=True).communicate()[0].strip()
168
sensor_name = 'hddtemp'
169
logging.info("New sensor found: " + sensor_name)
170
parent = self.tree_store.append(None, (sensor_name, None, False))
171
for hd_data in self.ind_parent.ind_parent.fetch.parse_hddtemp_entries(hddtemp):
172
logging.info("Sensor entry: " + hd_data[0])
173
self.tree_store.append(parent, (hd_data[0] + ' - ' + hd_data[1] + ' - ' + hd_data[2] + '°' + hd_data[3], self.generate_sensor_item_name(sensor_name, hd_data[0]), False))
176
nvidia_model = subprocess.Popen("lspci | grep nVidia | sed -e 's/.*\[//g' -e 's/\].*//g'", stdout=subprocess.PIPE, shell=True).communicate()[0].strip()
177
if len(nvidia_model):
178
sensor_name = 'nvidia'
179
logging.info("New sensor found: " + sensor_name)
180
parent = self.tree_store.append(None, (sensor_name, None, False))
181
self.tree_store.append(parent, (nvidia_model + ' - Temperature', self.generate_sensor_item_name(sensor_name, 'gputemp'), False))
182
self.tree_store.append(parent, (nvidia_model + ' - Fan speed', self.generate_sensor_item_name(sensor_name, 'fanspeed'), False))
185
self.view = gtk.Frame('')
187
self.vb = gtk.VBox(False, 3)
189
self.tree_view = gtk.TreeView(self.tree_store)
191
# setup the text cell renderer
192
self.renderer = gtk.CellRendererText()
193
self.renderer.set_property('editable', False)
196
self.renderer1 = gtk.CellRendererText()
197
self.renderer1.set_property('editable', False)
199
# quick add checkbox render
200
self.renderer2 = gtk.CellRendererToggle()
201
self.renderer2.set_property('activatable', True)
202
self.renderer2.connect('toggled', self.quick_add_cb_toggled, self.tree_store)
205
self.column0 = gtk.TreeViewColumn('Sensor', self.renderer, text=0)
206
self.column1 = gtk.TreeViewColumn('Identifier', self.renderer1, text=1)
207
self.column2 = gtk.TreeViewColumn('', self.renderer2, active=2)
208
self.tree_view.append_column(self.column0)
209
self.tree_view.append_column(self.column1)
210
self.tree_view.append_column(self.column2)
212
self.tree_view.expand_all()
213
self.vb.add(self.tree_view)
215
self.add_bt = gtk.Button('Add selected sensors')
216
self.add_bt.connect('clicked', self.update_custom_text)
217
self.vb.add(self.add_bt)
219
self.view.add(self.vb)
224
def quick_add_cb_toggled(self, cell, path, tree_store):
225
tree_store[path][2] = not tree_store[path][2]
226
iter = tree_store.iter_children(tree_store.get_iter(path))
228
tree_store.set_value(iter, 2, tree_store[path][2])
229
iter = tree_store.iter_next(iter)
231
def generate_sensor_item_name(self, sensor_name, sensor_item_label):
232
return sensor_name + '//' + sensor_item_label.split(':')[0].lower().replace('.', '-')
234
def update_custom_text(self, event=None):
235
iter = self.tree_store.get_iter_root()
238
iter_children = self.tree_store.iter_children(iter)
240
if self.tree_store.get_value(iter_children, 2):
241
current_text = self.ind_parent.custom_entry.get_text()
242
to_add_value = '{' + self.tree_store.get_value(iter_children, 1) + '}'
243
if string.find(current_text, to_add_value) == -1:
244
self.ind_parent.custom_entry.set_text(current_text + ' ' + to_add_value)
245
iter_children = self.tree_store.iter_next(iter_children)
247
iter = self.tree_store.iter_next(iter)
77
249
class Preferences(gtk.Window):
78
250
def __init__(self, parent):
79
251
gtk.Window.__init__(self)
199
375
self.ind.set_menu(self.menu)
201
377
logging.info("Menu shown")
202
381
self.alive = Event()
204
383
self.fetch = StatusFetcher(self)
205
384
self.fetch.start()
206
385
logging.info("Fetcher started")
210
387
def update(self, data):
212
label = self.custom_text.format(mem=data['mem'], cpu=data['cpu'])
213
guide = self.custom_text.format(mem="0000%", cpu="0000%")
389
label = self.custom_text.format(**data)
390
cdata = deepcopy(data)
391
cdata['mem'] = cdata['cpu'] = '000%'
392
guide = self.custom_text.format(**cdata)
393
except KeyError as e:
394
logging.info(str(e) + ' not found in dataset')
215
label = 'Error: ' + self.custom_text
397
label = 'Unknown error'
217
398
self.last_data = data
399
self.last_guide = guide
218
400
self.update_text(label, guide)
220
402
def update_text(self, text, guide):
221
403
self.last_text = text
222
404
self.last_guide = guide
224
405
self.ind.set_label(text, guide)
226
407
def force_update(self):