import time import subprocess # import StringIO import re # from wol import * # import os # import signal import smtplib from email.MIMEText import MIMEText from HTMLParser import HTMLParser def sendTextMail(strFrom, to, strSubject, text): # from = "SimpaCluster " mail = MIMEText(text) mail['From'] = strFrom mail['Subject'] = strSubject mail['To'] = to smtp = smtplib.SMTP('smtp.univ-rennes1.fr', 25) # smtp.connect() # smtp.login('guillaume.raffy@univ-rennes1.fr', 'password') smtp.sendmail(strFrom, [to], mail.as_string()) smtp.close() class Error(Exception): def __init__(self, strMessage): self.m_strMessage = strMessage def getHostName(): (returnCode, stdout, stderr) = executeProgram(['hostname', '-s']) if returnCode != 0: raise Error(stderr) strHostName = re.sub(r"\n", "", stdout) return strHostName def log(message): print time.asctime(time.localtime()) + ' : ' + message def executeProgram(astrArguments): # log('executeProgram : program [%s]' % (','.join(astrArguments))) popen = subprocess.Popen( astrArguments, bufsize=1, shell=False, stdout=subprocess.PIPE, stderr=subprocess.PIPE) # bufsize=1 seems to prevent deadlocks that happen 50% the time stdout, stderr = popen.communicate() # popen.wait() result = (popen.returncode, stdout, stderr) # log('executeProgram : command %s popen.pid = %d' % (astrArguments[0], popen.pid)) # os.kill(popen.pid, signal.SIGTERM) return result def executeCommand(command): """ executes the shell command such as 'set x=1; myprog $x' """ popen = subprocess.Popen( [command], bufsize=1, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, executable='/bin/bash') # bufsize=1 seems to prevent deadlocks that happen 50% the time # if we don't specify the optional executable argument, then the default non interactive shell will be used. On debian, the default non-interactive shell is dash, which doesn't understand the keyword 'source' that we use in many places stdout, stderr = popen.communicate() # popen.wait() result = (popen.returncode, stdout, stderr) return result def executeCommandOn(target_machine_fqdn, command, user=None): """ execute command on a local or remote machine (using ssh then) :param str user: if not None, the user that should be used to execute the command (instead of the current user) """ print("comparing %s and %s" % (getHostName(), target_machine_fqdn.split('.')[0])) if getHostName() == target_machine_fqdn.split('.')[0]: if user is not None: # su -c "ls -l /tmp" graffy return executeCommand("su -c '%s' %s" % (command, user)) else: return executeCommand(command) else: if user is not None: target = '%s@%s' % (user, target_machine_fqdn) else: target = target_machine_fqdn return executeProgram(['ssh', target, "%s" % command]) def getUpsStatus(): class MyHTMLParser(HTMLParser): def __init__(self): HTMLParser.__init__(self) self.TokenList = [] def handle_data( self, data): data = data.strip() if data and len(data) > 0: self.TokenList.append(data) # print data def GetTokenList(self): return self.TokenList import urllib2 try: url = 'http://Net Vision:public@129.20.27.119/PageMonComprehensive.html' f = urllib2.urlopen(url) res = f.read() f.close() except: print "bad read" return h = MyHTMLParser() h.feed(res) tokensList = h.GetTokenList() # @UnusedVariable if __name__ == '__main__': from SimpaDbUtil import wakeUp """ for i in range(30): machineName = 'simpatix%d' % (i+10) print 'lom ip of %s is %s' % (machineName, getLightOutManagementIpAddress(machineName)) """ wakeUp('simpatix21') # print putToSleep('simpatix13') # print isNonRespondingMachineSleeping('simpatix13')