139 lines
4.6 KiB
Python
139 lines
4.6 KiB
Python
import MySQLdb
|
|
import time
|
|
import subprocess
|
|
import StringIO
|
|
import re
|
|
from wol import *
|
|
import os
|
|
import signal
|
|
from Util import *
|
|
|
|
def isMachineResponding(machineName):
|
|
(returnCode, stdout, stderr) = executeProgram( [ 'ping', '-o', '-t', '1', machineName ] )
|
|
#log( 'isMachineResponding : result of command %s : %d' % (command, returnCode) )
|
|
|
|
if returnCode == 0:
|
|
return True
|
|
else:
|
|
bMachineNameIsNotKnown = (returnCode == 68)
|
|
bMachineIsNotResponding = (returnCode == 2)
|
|
if bMachineIsNotResponding == False:
|
|
bBUG_00000004_IS_STILL_ALIVE = True
|
|
if bBUG_00000004_IS_STILL_ALIVE == True and returnCode == 142:
|
|
log('isMachineResponding : bug00000004 Unexpected return code : returnCode=%d, stdout="%s", stderr="%s" , machineName = %s' % (returnCode, stdout, stderr, machineName) )
|
|
# don't stop the program until we understand bug00000004
|
|
elif bBUG_00000004_IS_STILL_ALIVE == True and returnCode == -14: # I had this error code on 07/09/2009 20:38 but I don't know yet what that means
|
|
log('isMachineResponding : bug00000004 Unexpected return code : returnCode=%d, stdout="%s", stderr="%s" , machineName = %s' % (returnCode, stdout, stderr, machineName) )
|
|
# don't stop the program until we understand bug00000004
|
|
else:
|
|
log('isMachineResponding : Unexpected return code : returnCode=%d, stdout="%s", stderr="%s" , machineName = %s' % (returnCode, stdout, stderr, machineName) )
|
|
assert(False)
|
|
return False
|
|
|
|
|
|
def machineNameToMacAddress( machineName ):
|
|
conn = MySQLdb.connect('simpatix10', 'simpadb_reader', '', 'simpadb')
|
|
assert(conn)
|
|
sqlQuery = """SELECT mac_address FROM ethernet_cards WHERE machine_name='"""+machineName+"""' AND type='normal'"""
|
|
#print sqlQuery
|
|
conn.query( sqlQuery )
|
|
r=conn.store_result()
|
|
row = r.fetch_row(0)
|
|
assert( len(row) == 1 )
|
|
#print 'row =', row
|
|
macAddress = row[0][0]
|
|
#print macAddress
|
|
conn.close()
|
|
return macAddress
|
|
|
|
def getLightOutManagementIpAddress( machineName ):
|
|
"""
|
|
the light out management ip of servers allows to talk to the server even when it's asleep
|
|
"""
|
|
conn = MySQLdb.connect('simpatix10', 'simpadb_reader', '', 'simpadb')
|
|
assert(conn)
|
|
sqlQuery = """SELECT ip_address_1,ip_address_2,ip_address_3,ip_address_4 FROM ethernet_cards WHERE machine_name='"""+machineName+"""' AND type='light_out_management'"""
|
|
#print sqlQuery
|
|
conn.query( sqlQuery )
|
|
r=conn.store_result()
|
|
row = r.fetch_row(0)
|
|
assert( len(row) == 1 )
|
|
#print 'row =', row
|
|
ipAddress = ('%s.%s.%s.%s') % (row[0][0], row[0][1], row[0][2], row[0][3])
|
|
#print macAddress
|
|
conn.close()
|
|
return ipAddress
|
|
|
|
|
|
def getClusterMachinesNames():
|
|
clusterMachinesNames = []
|
|
conn = MySQLdb.connect('simpatix10', 'simpadb_reader', '', 'simpadb')
|
|
assert(conn)
|
|
sqlQuery = """SELECT name FROM machines WHERE affectation='cluster'"""
|
|
#print sqlQuery
|
|
conn.query( sqlQuery )
|
|
r=conn.store_result()
|
|
rows = r.fetch_row(0)
|
|
for row in rows:
|
|
#print row
|
|
clusterMachinesNames.append( row[0] )
|
|
conn.close()
|
|
return clusterMachinesNames
|
|
|
|
def machineSupportsIpmi( machineName ):
|
|
if (machineName == 'simpatix') or (machineName == 'simpatix01' or (machineName == 'simpa-mac2')):
|
|
# the command ipmitool sensor on simpatix doesn't work :
|
|
# Unabled to establish a session with the BMC.
|
|
# Command failed due to Unknown (0xFFFEF921) (0xFFFEF921)
|
|
return False
|
|
return True
|
|
|
|
def putToSleep( machineName ):
|
|
# note : pmset must be executed as root
|
|
(returnCode, stdout, stderr) = executeCommand([ 'ssh', machineName, 'pmset sleepnow' ])
|
|
"""
|
|
print returnCode
|
|
print 'stdout :'
|
|
print stdout
|
|
print 'stderr :'
|
|
print stderr
|
|
"""
|
|
assert( returnCode == 0 )
|
|
# check if the command succeeded by looking at the output (that's the only way I found)
|
|
f = StringIO.StringIO(stdout)
|
|
line = f.readline()
|
|
f.close()
|
|
matchObj = re.match('^Sleeping now...', line)
|
|
if matchObj:
|
|
return True
|
|
else:
|
|
return False
|
|
|
|
def wakeUp(machineName):
|
|
macAddress = machineNameToMacAddress( machineName )
|
|
wake_on_lan(macAddress)
|
|
return True
|
|
|
|
|
|
def isNonRespondingMachineSleeping(machineName):
|
|
"""
|
|
note : crappy method to detect if the machine is sleeping (if other methods are available, I would be very interested)
|
|
"""
|
|
wakeUp(machineName)
|
|
time.sleep(120)
|
|
if isMachineResponding( machineName ):
|
|
putToSleep( machineName )
|
|
time.sleep(30) # allow a little time to make sure the machine is ready to receive other wake on lan messages
|
|
return True
|
|
else:
|
|
return False
|
|
|
|
if __name__ == '__main__':
|
|
"""
|
|
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') |