Script python pour relève de température CPU

Salut,

Suite à un souci technique je m’attache dorénavant à mettre en place une relève via agent Zabbix en mode actif de la température.

Parallèlement à cela je me suis remis à l’apprentissage du Python (trop longtemps délaissé).

Je bute à nouveau sur un manque de méthode pour dérouler correctement mon script :confused:

 #!/usr/bin/python2.7

#################################################################
#
# zabbix-temp-discover.py
#
#   A program that produces LLD information for Zabbix to
#   processor.
#
# Version: 1.0
#
#################################################################

import sys
import os
import subprocess
import string
import re

#################################################################
# sys.argv[1] - the cpu ID
#################################################################


def cputemp():
    cmd=cmd.split(':')[0].split()
    temp=re.sub(r'[^\d\.]', '',cmd)
    tempvalue = temp
    return tempvalue

def cpuid():
    cmd=cmd.split()
    cpu=re.sub(r':', '',cmd[3])
    cpuvalue = cpu
    return cpuvalue

for line in open(cmd, 'r'):
    if re.match(cid, line):
        return line
        result = line().cpuid().cputemp()
        temperature = result
        return temperature
    else:
        print ''
    print temperature

cmd=("sensors | grep Physical ")
cid=sys.argv[1]

J’ai déjà en place un script de découverte qui me remonte bien le nombre de socket physique plus tout un tas d’informations, j’ai donc la possibilité d’attribuer une variable pour le processeur physique dont je cherche à récupérer la température.

Actuellement je travaille pour plus de souplesse (rien à installer) avec la commande sensors.

la commande ne question sur un serveur de test (mono processeur) me renvoie ceci :

 # sensors
coretemp-isa-0000
Adapter: ISA adapter
Physical id 0:  +66.0°C  (high = +87.0°C, crit = +97.0°C)
Core 0:         +64.0°C  (high = +87.0°C, crit = +97.0°C)
Core 1:         +66.0°C  (high = +87.0°C, crit = +97.0°C)
Core 2:         +65.0°C  (high = +87.0°C, crit = +97.0°C)
Core 3:         +66.0°C  (high = +87.0°C, crit = +97.0°C)
Core 4:         +66.0°C  (high = +87.0°C, crit = +97.0°C)
Core 5:         +63.0°C  (high = +87.0°C, crit = +97.0°C)

Je cherche donc à identifier la ligne puis à parser cette dernière selon l’argument que je possède à savoir pour ce serveur de tests Physical id 0

Le script actuellement ne me renvoie rien comme information pourtant il me semble que mes deux fonctions fassent correctement le travail, je penche donc pour un souci sur le traitement en lui même du script :

 File "/usr/local/bin/zabbix-cpu-stats.py", line 39
    return line
SyntaxError: 'return' outside function

Je manque malheureusement de temps pour finaliser mon apprentissage du python et ainsi mieux cerner là où je bloque.

Si quelqu’un pouvez me montrer la voie à suivre avec une explication de la où j’ai merdé ce serait super !

Ligne 39 et suivantes, tu as :

        return line
        result = line().cpuid().cputemp()
        temperature = result
        return temperature

return ne s’utilise que dans une fonction, là, tu es seulement dans une boucle.
Tu attendais quoi du return que tu as mis là ?

Effectivement je cherche à récupérer le résultat du match afin de pouvoir ensuite le traité, j’avais pas faius gaffe à ce point et effectivement.

Je cherche a récupérer la ligne du retour de la commande bash et à lui appliquer la fonction de trie pour remonter la température du socket physique et ce selon l’ID du socket physique.

Je viens de revoir autrement en utilisant le module subprocess.Popen() mais sans plus de succès :confused:
A vrai dire je bute sur comment récupérer ma ligne selon l’ID envoyé en argument et retourner la valeur en utilisant la fonction pour parser la température.

#!/usr/bin/python

#################################################################
#
# zabbix-temp-discover.py
#
#   A program that produces LLD information for Zabbix to
#   processor.
#
# Version: 1.0
#
#################################################################

import sys
import os
import subprocess
import string
import re

#################################################################
#
# sys.argv[1] - the cpu ID
#
#################################################################


def cputemp():
    cmd=cmd.split(':')[0].split()
    temp=re.sub(r'[^\d\.]', '',cmd)
    tempvalue = temp
    return tempvalue

def cpuid():
    cmd=cmd.split()
    cpu=re.sub(r':', '',cmd[3])
    cpuvalue = cpu
    return cpuvalue

cmd=("sensors | grep Physical ")
cid=sys.argv[0]

line = subprocess.Popen(cmd)
for cid in line:
    line=command.readline()
    data=line().cputemp()
    temperature = data
else:
    print ''
print temperature

Et logiquement j’ai une erreur sur le subprocess

Ah, je suis bête, j’ai déjà fait un script qui fait plus ou moins ça. Voilà la fonction en python3 :

def sensors_value (sensor):
	'''
	Returns the float value given by the sensor
	To get the sensor's name, start the sensors executable
	Warning, this function matches the first sensor named like that, hope that the good one
	'''
	from os import popen
	from re import findall
	sensors = popen ('sensors')
	data = ''
	for i in sensors:
		data += i
	sensors_line = findall (sensor + '.*', data) [0]
	value = findall ('[0-9][0-9\.]+', sensors_line) [0]
	return (float (value))

C’est ici.

1 J'aime

Merci bien je me suis inspiré largement de ça pour pondre un truc fonctionnel.

Mais car il faut bien un mais il fonctionne sur à peine 1/3 des mobos du parc hétérogène :confused:
Je suis donc en plein remaniement, si jamais j’arrive à une truc plaisant et portable je verrai pour poster un lien vers la documentation.

Pour l’instant c’est la guerre avec les ‘discovery rules’ afin d’automatiser un minimum la remontée des informations en mode actif vers le serveur de monitoring en essayant d’être portable sur plusieurs distributions Linux dont Arch … :confused: (bonjour les emmerdes avec les vielles versions n’ayant pas de python3 à disposition ou les différences de remontée d’informations >< selon les versions de paquets et de carte mère).