added zoni-cli
Found here: https://svn.apache.org/repos/asf/incubator/tashi/import/zoni-intel-r843/
This commit is contained in:
parent
ec0003bfa8
commit
68b51c7a0a
22 changed files with 3547 additions and 0 deletions
24
ssh/zoni-cli/Makefile
Normal file
24
ssh/zoni-cli/Makefile
Normal file
|
@ -0,0 +1,24 @@
|
|||
# Licensed to the Apache Software Foundation (ASF) under one
|
||||
# or more contributor license agreements. See the NOTICE file
|
||||
# distributed with this work for additional information
|
||||
# regarding copyright ownership. The ASF licenses this file
|
||||
# to you under the Apache License, Version 2.0 (the
|
||||
# "License"); you may not use this file except in compliance
|
||||
# with the License. You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing,
|
||||
# software distributed under the License is distributed on an
|
||||
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
# KIND, either express or implied. See the License for the
|
||||
# specific language governing permissions and limitations
|
||||
# under the License.
|
||||
#
|
||||
# $Id$
|
||||
#
|
||||
|
||||
clean:
|
||||
if [ `find . -name "*.pyc" | wc -l` -gt 0 ]; then echo Removing python byte-code...; rm `find . -name "*.pyc"`; fi
|
||||
@echo Done
|
||||
|
64
ssh/zoni-cli/ZONI_DEFAULT.conf
Normal file
64
ssh/zoni-cli/ZONI_DEFAULT.conf
Normal file
|
@ -0,0 +1,64 @@
|
|||
# Licensed to the Apache Software Foundation (ASF) under one
|
||||
# or more contributor license agreements. See the NOTICE file
|
||||
# distributed with this work for additional information
|
||||
# regarding copyright ownership. The ASF licenses this file
|
||||
# to you under the Apache License, Version 2.0 (the
|
||||
# "License"); you may not use this file except in compliance
|
||||
# with the License. You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing,
|
||||
# software distributed under the License is distributed on an
|
||||
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
# KIND, either express or implied. See the License for the
|
||||
# specific language governing permissions and limitations
|
||||
# under the License.
|
||||
#
|
||||
# $Id$
|
||||
#
|
||||
|
||||
# Logfile
|
||||
[logging]
|
||||
LOG_FILE = /tmp/prs_logfile.txt
|
||||
|
||||
# DB host
|
||||
[dbConnection]
|
||||
DB_HOST = xx_hostname_or_ip_
|
||||
DB_PORT = 3306
|
||||
DB_USER = xx_db_username_xx
|
||||
DB_INST = xx_db_inst_xx
|
||||
DB_PASSWORD = "xx_db_password_xx"
|
||||
|
||||
# TFTP
|
||||
[tftp]
|
||||
TFTP_ROOT_DIR = /var/lib/tftpboot
|
||||
TFTP_IMAGE_DIR = /var/lib/tftpboot/pxelinux.cfg
|
||||
TFTP_BOOT_OPTIONS_DIR = /var/lib/tftpboot/pxelinux.cfg/boot_options_prs
|
||||
TFTP_UPDATE_FILE = /var/lib/tftpboot/pxelinux.cfg/update.prs
|
||||
TFTP_BASE_FILE = /var/lib/tftpboot/pxelinux.cfg/base.prs
|
||||
TFTP_BASE_MENU_FILE = /var/lib/tftpboot/pxelinux.cfg/base-menu
|
||||
|
||||
[snmp]
|
||||
SNMP_COMMUNITY = xx_snmp_community_name_xx
|
||||
|
||||
# Vlan Config
|
||||
[vlan]
|
||||
VLAN_RESERVED = {10, {"name", internal}, 999,{"name", "tashi-vm"}, 1000, {"name", "management"}, 1001, {"name", "dmz"}}
|
||||
VLAN_MAX = 4095
|
||||
|
||||
|
||||
[hardware]
|
||||
HARDWARE_CONTROL = ["ipmi", "drac", "pdu"]
|
||||
HARDWARE_PDU = "raritan"
|
||||
HARDWARE_DRAC = "DELL DRAC"
|
||||
|
||||
[DhcpDns]
|
||||
# Key file must be in the same directory or this will get denied
|
||||
dnsKeyFile = xx_Kname.+157+36480.private_xx
|
||||
dnsServer = xx_dns_server_ip_xx xx_port_xx
|
||||
dnsDomain = xx_fqdn_xx
|
||||
dnsExpire = 60
|
||||
dhcpServer = xx_dhcpserver_host_or_ip_xx
|
||||
dhcpKeyName = xx_dhcpservername_xx
|
||||
dhcpSecretKey = xx_secretkey_xx
|
21
ssh/zoni-cli/__init__.py
Normal file
21
ssh/zoni-cli/__init__.py
Normal file
|
@ -0,0 +1,21 @@
|
|||
# Licensed to the Apache Software Foundation (ASF) under one
|
||||
# or more contributor license agreements. See the NOTICE file
|
||||
# distributed with this work for additional information
|
||||
# regarding copyright ownership. The ASF licenses this file
|
||||
# to you under the Apache License, Version 2.0 (the
|
||||
# "License"); you may not use this file except in compliance
|
||||
# with the License. You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing,
|
||||
# software distributed under the License is distributed on an
|
||||
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
# KIND, either express or implied. See the License for the
|
||||
# specific language governing permissions and limitations
|
||||
# under the License.
|
||||
|
||||
import os
|
||||
import sys
|
||||
|
||||
from util import *
|
38
ssh/zoni-cli/bootmanagementinterface.py
Normal file
38
ssh/zoni-cli/bootmanagementinterface.py
Normal file
|
@ -0,0 +1,38 @@
|
|||
# Licensed to the Apache Software Foundation (ASF) under one
|
||||
# or more contributor license agreements. See the NOTICE file
|
||||
# distributed with this work for additional information
|
||||
# regarding copyright ownership. The ASF licenses this file
|
||||
# to you under the Apache License, Version 2.0 (the
|
||||
# "License"); you may not use this file except in compliance
|
||||
# with the License. You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing,
|
||||
# software distributed under the License is distributed on an
|
||||
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
# KIND, either express or implied. See the License for the
|
||||
# specific language governing permissions and limitations
|
||||
# under the License.
|
||||
#
|
||||
# $Id$
|
||||
#
|
||||
|
||||
import sys
|
||||
import os
|
||||
import optparse
|
||||
|
||||
|
||||
class BootManagementInterface(object):
|
||||
""" Interface description for booting
|
||||
"""
|
||||
def __init__(self, config):
|
||||
self.config = config
|
||||
|
||||
#def updateDatabase(self, query):
|
||||
#raise NotImplementedError
|
||||
|
||||
|
||||
def createPxeConfig(self):
|
||||
''' Create the pxe config file'''
|
||||
raise NotImplementedError
|
207
ssh/zoni-cli/delldrac.py
Normal file
207
ssh/zoni-cli/delldrac.py
Normal file
|
@ -0,0 +1,207 @@
|
|||
# Licensed to the Apache Software Foundation (ASF) under one
|
||||
# or more contributor license agreements. See the NOTICE file
|
||||
# distributed with this work for additional information
|
||||
# regarding copyright ownership. The ASF licenses this file
|
||||
# to you under the Apache License, Version 2.0 (the
|
||||
# "License"); you may not use this file except in compliance
|
||||
# with the License. You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing,
|
||||
# software distributed under the License is distributed on an
|
||||
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
# KIND, either express or implied. See the License for the
|
||||
# specific language governing permissions and limitations
|
||||
# under the License.
|
||||
#
|
||||
# $Id$
|
||||
#
|
||||
|
||||
import sys
|
||||
import os
|
||||
import pexpect
|
||||
import time
|
||||
|
||||
from systemmanagementinterface import SystemManagementInterface
|
||||
|
||||
|
||||
#class systemmagement():
|
||||
#def __init__(self, proto):
|
||||
#self.proto = proto
|
||||
|
||||
def log(f):
|
||||
def myF(*args, **kw):
|
||||
print "calling %s%s" % (f.__name__, str(args))
|
||||
res = f(*args, **kw)
|
||||
print "returning from %s -> %s" % (f.__name__, str(res))
|
||||
return res
|
||||
myF.__name__ = f.__name__
|
||||
return myF
|
||||
|
||||
import time
|
||||
|
||||
def timeF(f):
|
||||
def myF(*args, **kw):
|
||||
start = time.time()
|
||||
res = f(*args, **kw)
|
||||
end = time.time()
|
||||
print "%s took %f" % (f.__name__, end-start)
|
||||
return res
|
||||
myF.__name__ = f.__name__
|
||||
return myF
|
||||
|
||||
|
||||
class dellDrac(SystemManagementInterface):
|
||||
def __init__(self, host):
|
||||
self.hostname = host['location']
|
||||
self.host = host['drac_name']
|
||||
self.user = host['drac_userid']
|
||||
self.password = host['drac_password']
|
||||
self.port = host['drac_port']
|
||||
self.powerStatus = None
|
||||
self.verbose = 0
|
||||
self.server = "Server-" + str(self.port)
|
||||
|
||||
def setVerbose(self, verbose):
|
||||
self.verbose = verbose
|
||||
|
||||
def __login(self):
|
||||
switchIp = "telnet " + self.host
|
||||
child = pexpect.spawn(switchIp)
|
||||
|
||||
if self.verbose:
|
||||
child.logfile = sys.stdout
|
||||
|
||||
opt = child.expect(['Login:', pexpect.EOF, pexpect.TIMEOUT])
|
||||
|
||||
|
||||
#XXX Doesn't seem to do what I want:(
|
||||
child.setecho(False)
|
||||
if opt == 0:
|
||||
child.sendline(self.user)
|
||||
time.sleep(.5)
|
||||
child.sendline(self.password)
|
||||
time.sleep(.5)
|
||||
i=child.expect(['DRAC/MC:', pexpect.EOF, pexpect.TIMEOUT])
|
||||
else:
|
||||
mesg = "Error"
|
||||
sys.stderr.write(mesg)
|
||||
exit(1)
|
||||
|
||||
return child
|
||||
|
||||
@timeF
|
||||
@log
|
||||
def getPowerStatus(self):
|
||||
child = self.__login()
|
||||
cmd = "getmodinfo -m " + self.server
|
||||
child.sendline(cmd)
|
||||
#i=child.expect(['DRAC/MC:', pexpect.EOF, pexpect.TIMEOUT])
|
||||
#exit()
|
||||
val = child.readline()
|
||||
val = child.readline()
|
||||
while self.server not in val:
|
||||
val = child.readline()
|
||||
|
||||
if "ON" in val:
|
||||
mesg = self.hostname + " Power is on\n\n"
|
||||
self.powerStatus = 1
|
||||
if "OFF" in val:
|
||||
mesg = self.hostname + " Power is off\n\n"
|
||||
self.powerStatus = 0
|
||||
|
||||
sys.stdout.write(mesg)
|
||||
|
||||
#while status not in val:
|
||||
#val = child.readline()
|
||||
#
|
||||
#print "val for", status, "is ", val
|
||||
#i=child.expect(['DRAC/MC:', pexpect.EOF, pexpect.TIMEOUT])
|
||||
#val = child.readlines()
|
||||
child.close()
|
||||
child.terminate()
|
||||
|
||||
|
||||
@timeF
|
||||
def isPowered(self):
|
||||
if self.powerStatus == None:
|
||||
self.getPowerStatus()
|
||||
if self.powerStatus:
|
||||
return 1;
|
||||
if not self.powerStatus:
|
||||
return 0;
|
||||
|
||||
|
||||
@timeF
|
||||
def powerOn(self):
|
||||
if self.powerStatus == 1:
|
||||
mesg = self.hostname + " Power On\n\n"
|
||||
exit(1)
|
||||
|
||||
child = self.__login()
|
||||
cmd = "racadm serveraction -m " + self.server + " powerup"
|
||||
child.sendline(cmd)
|
||||
val = child.readline()
|
||||
val = child.readline()
|
||||
if "OK" in val:
|
||||
mesg = self.hostname + " Power On\n\n"
|
||||
else:
|
||||
mesg = self.hostname + " Power On Fail\n\n"
|
||||
sys.stdout.write(mesg)
|
||||
#i=child.expect(['DRAC/MC:', pexpect.EOF, pexpect.TIMEOUT])
|
||||
child.terminate()
|
||||
|
||||
@timeF
|
||||
def powerOff(self):
|
||||
child = self.__login()
|
||||
cmd = "racadm serveraction -m " + self.server + " powerdown"
|
||||
child.sendline(cmd)
|
||||
val = child.readline()
|
||||
val = child.readline()
|
||||
if "OK" in val:
|
||||
mesg = self.hostname + " Power Off\n\n"
|
||||
else:
|
||||
mesg = self.hostname + " Power Off Fail\n\n"
|
||||
sys.stdout.write(mesg)
|
||||
#i=child.expect(['DRAC/MC:', pexpect.EOF, pexpect.TIMEOUT])
|
||||
child.terminate()
|
||||
|
||||
@timeF
|
||||
def powerCycle(self):
|
||||
child = self.__login()
|
||||
cmd = "racadm serveraction -m " + self.server + " powercycle"
|
||||
child.sendline(cmd)
|
||||
val = child.readline()
|
||||
val = child.readline()
|
||||
if "OK" in val:
|
||||
mesg = self.hostname + " Power Cycle\n\n"
|
||||
else:
|
||||
mesg = self.hostname + " Power Cycle Fail\n\n"
|
||||
sys.stdout.write(mesg)
|
||||
#i=child.expect(['DRAC/MC:', pexpect.EOF, pexpect.TIMEOUT])
|
||||
child.terminate()
|
||||
|
||||
@timeF
|
||||
def powerReset(self):
|
||||
child = self.__login()
|
||||
cmd = "racadm serveraction -m " + self.server + " hardreset"
|
||||
child.sendline(cmd)
|
||||
val = child.readline()
|
||||
val = child.readline()
|
||||
if "OK" in val:
|
||||
mesg = self.hostname + " Power Reset\n\n"
|
||||
else:
|
||||
mesg = self.hostname + " Power Reset Fail\n\n"
|
||||
sys.stdout.write(mesg)
|
||||
#i=child.expect(['DRAC/MC:', pexpect.EOF, pexpect.TIMEOUT])
|
||||
child.terminate()
|
||||
|
||||
def activateConsole(self):
|
||||
child = self.__login()
|
||||
cmd = "connect -F " + self.server
|
||||
child.sendline(cmd)
|
||||
i=child.expect(['DRAC/MC:', pexpect.EOF, pexpect.TIMEOUT])
|
||||
child.terminate()
|
||||
|
||||
#ipmitool -I lanplus -E -H r2r1c3b0-ipmi -U root chassis power status
|
265
ssh/zoni-cli/dhcpdns.py
Normal file
265
ssh/zoni-cli/dhcpdns.py
Normal file
|
@ -0,0 +1,265 @@
|
|||
# Licensed to the Apache Software Foundation (ASF) under one
|
||||
# or more contributor license agreements. See the NOTICE file
|
||||
# distributed with this work for additional information
|
||||
# regarding copyright ownership. The ASF licenses this file
|
||||
# to you under the Apache License, Version 2.0 (the
|
||||
# "License"); you may not use this file except in compliance
|
||||
# with the License. You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing,
|
||||
# software distributed under the License is distributed on an
|
||||
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
# KIND, either express or implied. See the License for the
|
||||
# specific language governing permissions and limitations
|
||||
# under the License.
|
||||
#
|
||||
# $Id$
|
||||
#
|
||||
|
||||
import logging
|
||||
import os
|
||||
import signal
|
||||
import socket
|
||||
import subprocess
|
||||
import time
|
||||
#from instancehook import InstanceHook
|
||||
#from tashi.services.ttypes import Instance, NetworkConfiguration
|
||||
#from tashi import boolean
|
||||
|
||||
|
||||
class DhcpDns():
|
||||
def __init__(self, config, verbose=None):
|
||||
self.verbose = verbose
|
||||
self.dnsKeyFile = config['dnsKeyFile']
|
||||
self.dnsServer = config['dnsServer']
|
||||
self.dnsDomain = config['dnsDomain']
|
||||
self.dnsExpire = int(config['dnsExpire'])
|
||||
self.dhcpServer = config['dhcpServer']
|
||||
self.dhcpKeyName = config['dhcpKeyName']
|
||||
self.dhcpSecretKey = config['dhcpSecretKey']
|
||||
#exit()
|
||||
#items.sort()
|
||||
#self.ipRange = {}
|
||||
#for item in items:
|
||||
#(name, value) = item
|
||||
#name = name.lower()
|
||||
#if (name.startswith('iprange')):
|
||||
#network = name[7:]
|
||||
#try:
|
||||
#network = int(network)
|
||||
#except:
|
||||
#continue
|
||||
#self.ipRange[network] = value
|
||||
self.reverseDns = True
|
||||
#self.log = logging.getLogger(__file__)
|
||||
#self.ipMin = {}
|
||||
#self.ipMax = {}
|
||||
#self.currentIP = {}
|
||||
#self.usedIPs = {}
|
||||
#for k in self.ipRange:
|
||||
#ipRange = self.ipRange[k]
|
||||
#(min, max) = ipRange.split("-")
|
||||
#min = min.strip()
|
||||
#max = max.strip()
|
||||
#ipNum = self.strToIp(min)
|
||||
#self.ipMin[k] = self.strToIp(min)
|
||||
#self.ipMax[k] = self.strToIp(max)
|
||||
#self.currentIP[k] = self.ipMin[k]
|
||||
#instances = self.client.getInstances()
|
||||
#for i in instances:
|
||||
#for nic in i.nics:
|
||||
#try:
|
||||
#ip = nic.ip
|
||||
#ipNum = self.strToIp(ip)
|
||||
#self.log.info('Added %s->%s during reinitialization' % (i.name, ip))
|
||||
#self.usedIPs[ipNum] = ip
|
||||
#except Exception, e:
|
||||
#pass
|
||||
#
|
||||
def strToIp(self, s):
|
||||
ipNum = -1
|
||||
try:
|
||||
ipNum = reduce(lambda x, y: x*256+y, map(int, s.split(".")))
|
||||
except:
|
||||
pass
|
||||
return ipNum
|
||||
|
||||
def ipToStr(self, ip):
|
||||
return "%d.%d.%d.%d" % (ip>>24, (ip>>16)%256, (ip>>8)%256, ip%256)
|
||||
|
||||
def allocateIP(self, nic):
|
||||
network = nic.network
|
||||
allocatedIP = None
|
||||
requestedIP = self.strToIp(nic.ip)
|
||||
if (requestedIP <= self.ipMax[network] and requestedIP >= self.ipMin[network] and (requestedIP not in self.usedIPs)):
|
||||
allocatedIP = requestedIP
|
||||
while (allocatedIP == None):
|
||||
if (self.currentIP[network] > self.ipMax[network]):
|
||||
self.currentIP[network] = self.ipMin[network]
|
||||
elif (self.currentIP[network] in self.usedIPs):
|
||||
self.currentIP[network] = self.currentIP[network] + 1
|
||||
else:
|
||||
allocatedIP = self.currentIP[network]
|
||||
ipString = self.ipToStr(allocatedIP)
|
||||
self.usedIPs[allocatedIP] = ipString
|
||||
return ipString
|
||||
|
||||
def addDhcp(self, name, ipaddr, hwaddr):
|
||||
try:
|
||||
self.removeDhcp(name)
|
||||
self.removeDhcp(name, ipaddr)
|
||||
except:
|
||||
pass
|
||||
cmd = "omshell"
|
||||
(stdin, stdout) = os.popen2(cmd)
|
||||
stdin.write("server %s\n" % (self.dhcpServer))
|
||||
if (self.dhcpSecretKey != ""):
|
||||
stdin.write("key %s %s\n" % (self.dhcpKeyName, self.dhcpSecretKey))
|
||||
stdin.write("connect\n")
|
||||
stdin.write("new \"host\"\n")
|
||||
stdin.write("set name = \"%s\"\n" % (name))
|
||||
stdin.write("set ip-address = %s\n" % (ipaddr))
|
||||
stdin.write("set hardware-address = %s\n" % (hwaddr))
|
||||
stdin.write("set hardware-type = 00:00:00:01\n") # Ethernet
|
||||
stdin.write("create\n")
|
||||
stdin.close()
|
||||
output = stdout.read()
|
||||
print output
|
||||
stdout.close()
|
||||
|
||||
def removeDhcp(self, name, ipaddr=None):
|
||||
cmd = "omshell"
|
||||
(stdin, stdout) = os.popen2(cmd)
|
||||
stdin.write("server %s\n" % (self.dhcpServer))
|
||||
if (self.dhcpSecretKey != ""):
|
||||
stdin.write("key %s %s\n" % (self.dhcpKeyName, self.dhcpSecretKey))
|
||||
stdin.write("connect\n")
|
||||
stdin.write("new \"host\"\n")
|
||||
if (ipaddr == None):
|
||||
stdin.write("set name = \"%s\"\n" % (name))
|
||||
else:
|
||||
stdin.write("set ip-address = %s\n"%(ipaddr))
|
||||
stdin.write("open\n")
|
||||
stdin.write("remove\n")
|
||||
stdin.close()
|
||||
output = stdout.read()
|
||||
print output
|
||||
stdout.close()
|
||||
|
||||
def addDns(self, name, ip):
|
||||
try:
|
||||
self.removeDns(name)
|
||||
except Exception, e:
|
||||
pass
|
||||
#print "Removal of DNS entry failed. Did you use sudo? "
|
||||
#return 1
|
||||
|
||||
if (self.dnsKeyFile != ""):
|
||||
cmd = "nsupdate -k %s" % (self.dnsKeyFile)
|
||||
else:
|
||||
cmd = "nsupdate"
|
||||
child = subprocess.Popen(args=cmd.split(), stdin=subprocess.PIPE, stdout=subprocess.PIPE)
|
||||
try:
|
||||
(stdin, stdout) = (child.stdin, child.stdout)
|
||||
stdin.write("server %s\n" % (self.dnsServer))
|
||||
stdin.write("update add %s.%s %d A %s\n" % (name, self.dnsDomain, self.dnsExpire, ip))
|
||||
stdin.write("\n")
|
||||
if (self.reverseDns):
|
||||
ipSegments = map(int, ip.split("."))
|
||||
ipSegments.reverse()
|
||||
reverseIpStr = ("%d.%d.%d.%d.in-addr.arpa" % (ipSegments[0], ipSegments[1], ipSegments[2], ipSegments[3]))
|
||||
stdin.write("update add %s %d IN PTR %s.%s.\n" % (reverseIpStr, self.dnsExpire, name, self.dnsDomain))
|
||||
stdin.write("\n")
|
||||
stdin.close()
|
||||
output = stdout.read()
|
||||
stdout.close()
|
||||
finally:
|
||||
os.kill(child.pid, signal.SIGTERM)
|
||||
(pid, status) = os.waitpid(child.pid, os.WNOHANG)
|
||||
while (pid == 0):
|
||||
time.sleep(0.5)
|
||||
os.kill(child.pid, signal.SIGTERM)
|
||||
(pid, status) = os.waitpid(child.pid, os.WNOHANG)
|
||||
|
||||
def removeDns(self, name):
|
||||
if (self.dnsKeyFile != ""):
|
||||
cmd = "nsupdate -k %s" % (self.dnsKeyFile)
|
||||
else:
|
||||
cmd = "nsupdate"
|
||||
child = subprocess.Popen(args=cmd.split(), stdin=subprocess.PIPE, stdout=subprocess.PIPE)
|
||||
try:
|
||||
(stdin, stdout) = (child.stdin, child.stdout)
|
||||
stdin.write("server %s\n" % (self.dnsServer))
|
||||
if (self.reverseDns):
|
||||
ip = socket.gethostbyname(name)
|
||||
ipSegments = map(int, ip.split("."))
|
||||
ipSegments.reverse()
|
||||
reverseIpStr = ("%d.%d.%d.%d.in-addr.arpa" % (ipSegments[0], ipSegments[1], ipSegments[2], ipSegments[3]))
|
||||
stdin.write("update delete %s IN PTR\n" % (reverseIpStr))
|
||||
stdin.write("\n")
|
||||
stdin.write("update delete %s.%s A\n" % (name, self.dnsDomain))
|
||||
stdin.write("\n")
|
||||
stdin.close()
|
||||
output = stdout.read()
|
||||
stdout.close()
|
||||
finally:
|
||||
os.kill(child.pid, signal.SIGTERM)
|
||||
(pid, status) = os.waitpid(child.pid, os.WNOHANG)
|
||||
while (pid == 0):
|
||||
time.sleep(0.5)
|
||||
os.kill(child.pid, signal.SIGTERM)
|
||||
(pid, status) = os.waitpid(child.pid, os.WNOHANG)
|
||||
|
||||
def doUpdate(self, instance):
|
||||
newInstance = Instance()
|
||||
newInstance.id = instance.id
|
||||
newInstance.nics = instance.nics
|
||||
self.client.vmUpdate(instance.id, newInstance, None)
|
||||
|
||||
def preCreate(self, instance):
|
||||
if (len(instance.nics) < 1):
|
||||
return
|
||||
for i in range(0, len(instance.nics)):
|
||||
nic = instance.nics[i]
|
||||
ip = self.allocateIP(nic)
|
||||
nic.ip = ip
|
||||
try:
|
||||
if (i == 0):
|
||||
self.log.info("Adding %s:{%s->%s} to DNS" % (instance.name, instance.name, ip))
|
||||
self.addDns(instance.name, ip)
|
||||
if (i == 0):
|
||||
dhcpName = instance.name
|
||||
else:
|
||||
dhcpName = instance.name + "-nic%d" % (i)
|
||||
self.log.info("Adding %s:{%s->%s} to DHCP" % (dhcpName, nic.mac, ip))
|
||||
self.addDhcp(dhcpName, ip, nic.mac)
|
||||
except Exception, e:
|
||||
self.log.exception("Failed to add host %s to DHCP/DNS" % (instance.name))
|
||||
self.doUpdate(instance)
|
||||
|
||||
def postDestroy(self, instance):
|
||||
if (len(instance.nics) < 1):
|
||||
return
|
||||
self.log.info("Removing %s from DHCP/DNS" % (instance.name))
|
||||
for i in range(0, len(instance.nics)):
|
||||
nic = instance.nics[i]
|
||||
ip = nic.ip
|
||||
try:
|
||||
ipNum = self.strToIp(ip)
|
||||
del self.usedIPs[ipNum]
|
||||
except Exception, e:
|
||||
self.log.exception("Failed to remove host %s, ip %s from pool of usedIPs" % (instance.name, ip))
|
||||
try:
|
||||
if (i == 0):
|
||||
dhcpName = instance.name
|
||||
else:
|
||||
dhcpName = instance.name + "-nic%d" % (i)
|
||||
self.removeDhcp(dhcpName)
|
||||
except Exception, e:
|
||||
self.log.exception("Failed to remove host %s from DHCP" % (instance.name))
|
||||
try:
|
||||
self.removeDns(instance.name)
|
||||
except Exception, e:
|
||||
self.log.exception("Failed to remove host %s from DNS" % (instance.name))
|
277
ssh/zoni-cli/hpswitch.py
Normal file
277
ssh/zoni-cli/hpswitch.py
Normal file
|
@ -0,0 +1,277 @@
|
|||
# Licensed to the Apache Software Foundation (ASF) under one
|
||||
# or more contributor license agreements. See the NOTICE file
|
||||
# distributed with this work for additional information
|
||||
# regarding copyright ownership. The ASF licenses this file
|
||||
# to you under the Apache License, Version 2.0 (the
|
||||
# "License"); you may not use this file except in compliance
|
||||
# with the License. You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing,
|
||||
# software distributed under the License is distributed on an
|
||||
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
# KIND, either express or implied. See the License for the
|
||||
# specific language governing permissions and limitations
|
||||
# under the License.
|
||||
#
|
||||
# $Id$
|
||||
#
|
||||
# What HP switches is this for? The configuration syntax does not
|
||||
# not appear like it would work for Procurves. - stroucki 20100224
|
||||
|
||||
import os
|
||||
import sys
|
||||
import pexpect
|
||||
import datetime
|
||||
import thread
|
||||
import time
|
||||
import threading
|
||||
|
||||
|
||||
from hwswitchinterface import HwSwitchInterface
|
||||
from resourcequerysql import ResourceQuerySql
|
||||
from util import logit
|
||||
|
||||
|
||||
''' Using pexpect to control switches because couldn't get snmp to work
|
||||
'''
|
||||
|
||||
class HwHPSwitch(HwSwitchInterface):
|
||||
def __init__(self, config, host=None):
|
||||
self.host = host
|
||||
self.verbose = False
|
||||
self.logFile = config['logFile']
|
||||
|
||||
|
||||
def setVerbose(self, verbose):
|
||||
self.verbose = verbose
|
||||
|
||||
def __login(self):
|
||||
|
||||
switchIp = "telnet " + self.host['hw_name']
|
||||
child = pexpect.spawn(switchIp)
|
||||
opt = child.expect(['Name:', 'password:', pexpect.EOF, pexpect.TIMEOUT])
|
||||
#XXX Doesn't seem to do what I want:(
|
||||
child.setecho(False)
|
||||
if opt == 0:
|
||||
child.sendline(self.host['hw_userid'])
|
||||
|
||||
# Be Verbose and print everything
|
||||
if self.verbose:
|
||||
child.logfile = sys.stdout
|
||||
|
||||
child.sendline(self.host['hw_password'])
|
||||
i=child.expect(['Main#', pexpect.EOF, pexpect.TIMEOUT])
|
||||
if i == 2:
|
||||
mesg = "ERROR: Login failed\n"
|
||||
logit(self.logFile, mesg)
|
||||
|
||||
sys.stderr.write()
|
||||
exit(1)
|
||||
return child
|
||||
|
||||
def __getPrsLabel(self):
|
||||
dadate = datetime.datetime.now().strftime("%Y%m%d-%H%M-%S")
|
||||
return "ZONI_" + dadate
|
||||
|
||||
def __saveConfig(self, child):
|
||||
#child.logfile = sys.stdout
|
||||
cmd = "save"
|
||||
child.sendline(cmd)
|
||||
opt = child.expect(["Confirm(.*)", "No save(.*)", pexpect.EOF, pexpect.TIMEOUT])
|
||||
if opt == 0:
|
||||
print "saving to flash"
|
||||
child.sendline("y\n")
|
||||
if opt == 1:
|
||||
print "no save needed"
|
||||
child.sendline('exit')
|
||||
child.terminate()
|
||||
|
||||
def enableHostPort(self):
|
||||
child = self.__login()
|
||||
cmd = "/cfg/port " + str(self.host['hw_port']) + " /ena/apply "
|
||||
child.sendline(cmd)
|
||||
# testing this thread... Looks like this works ...
|
||||
threading.Thread(target=self.__saveConfig(child)).start()
|
||||
|
||||
def disableHostPort(self):
|
||||
child = self.__login()
|
||||
cmd = "/cfg/port " + str(self.host['hw_port']) + " /dis/apply "
|
||||
child.sendline(cmd)
|
||||
threading.Thread(target=self.__saveConfig(child)).start()
|
||||
|
||||
def removeVlan(self, num):
|
||||
print "removing vlan"
|
||||
# Check for important vlans
|
||||
child = self.__login()
|
||||
|
||||
cmd = "/cfg / l2 / vlan " + num + " / del / apply"
|
||||
child.sendline(cmd)
|
||||
opt = child.expect(["Confirm(.*)", pexpect.EOF, pexpect.TIMEOUT])
|
||||
if opt == 0:
|
||||
child.sendline("y\n")
|
||||
threading.Thread(target=self.__saveConfig(child)).start()
|
||||
|
||||
|
||||
def addVlanToTrunk(self, vlan):
|
||||
print "NOT IMPLEMENTED"
|
||||
print "No trunks to test @ MIMOS"
|
||||
|
||||
def createVlansThread(self, vlan, switch,host):
|
||||
mesg = "Creating vlan " + str(vlan) + " on switch " + str(switch)
|
||||
print "host is ", host
|
||||
logit(self.logFile, mesg)
|
||||
print "create"
|
||||
self.createVlan(vlan)
|
||||
print "cend"
|
||||
self.addVlanToTrunk(vlan);
|
||||
thread.exit()
|
||||
|
||||
def createVlans(self, vlan, switchlist, query):
|
||||
for switch in switchlist:
|
||||
#print "working on switch ", switch
|
||||
#self.host = query.getSwitchInfo(switch)
|
||||
#thread.start_new_thread(self.createVlansThread, (vlan, switch, self.host))
|
||||
mesg = "Creating vlan " + str(vlan) + " on switch " + str(switch)
|
||||
logit(self.logFile, mesg)
|
||||
self.host = query.getSwitchInfo(switch)
|
||||
self.createVlan(vlan)
|
||||
self.addVlanToTrunk(vlan);
|
||||
|
||||
def removeVlans(self, vlan, switchlist, query):
|
||||
for switch in switchlist:
|
||||
mesg = "Deleting vlan " + str(vlan) + " on switch " + str(switch)
|
||||
logit(self.logFile, mesg)
|
||||
self.host = query.getSwitchInfo(switch)
|
||||
self.removeVlan(vlan)
|
||||
|
||||
def createVlan(self, val):
|
||||
|
||||
vlanname = False
|
||||
if ":" in val:
|
||||
num = int(val.split(":")[0])
|
||||
vlanname = val.split(":")[1]
|
||||
else:
|
||||
vlanname = self.__getPrsLabel()
|
||||
num = int(val)
|
||||
|
||||
#if type(num) != int:
|
||||
#mesg = "ERROR: Vlan must be a number (0-4095)\n"
|
||||
#sys.stderr.write(mesg)
|
||||
#exit(1)
|
||||
if num > 4095 or num < 0:
|
||||
mesg = "ERROR: Vlan out of range. Must be < 4095"
|
||||
logit(self.logFile, mesg)
|
||||
exit(1)
|
||||
|
||||
child = self.__login()
|
||||
cmd = "/cfg / l2 / vlan " + str(num) + " / ena/ apply"
|
||||
child.sendline(cmd)
|
||||
cmd = "name " + str(vlanname) + " / apply"
|
||||
child.sendline(cmd)
|
||||
threading.Thread(target=self.__saveConfig(child)).start()
|
||||
|
||||
|
||||
# Raw Switch commands. DEBUG ONLY!, Doesn't work!
|
||||
def sendSwitchCommand(self, cmds):
|
||||
if len(cmds) > 0:
|
||||
child = self.__login()
|
||||
child.logfile = sys.stdout
|
||||
for cmd in cmds.split(";"):
|
||||
child.sendline(cmd)
|
||||
try:
|
||||
i=child.expect(['console','sw', 'Name:', pexpect.EOF, pexpect.TIMEOUT], timeout=2)
|
||||
i=child.expect(['console','sw', 'Name:', pexpect.EOF, pexpect.TIMEOUT], timeout=2)
|
||||
|
||||
except EOF:
|
||||
print "EOF", i
|
||||
#child.sendline()
|
||||
except TIMEOUT:
|
||||
print "TIMEOUT", i
|
||||
#child.interact(escape_character='\x1d', input_filter=None, output_filter=None)
|
||||
|
||||
child.terminate()
|
||||
#print "before", child.before
|
||||
#print "after", child.after
|
||||
|
||||
def addNodeToVlan(self, vlan):
|
||||
child = self.__login()
|
||||
cmd = "/cfg/l2/vlan " + str(vlan) + " /add " + str(self.host['hw_port']) + " /apply "
|
||||
child.sendline(cmd)
|
||||
opt = child.expect(['(.*)#','(.*)needs to be enabled', pexpect.EOF, pexpect.TIMEOUT], timeout=2)
|
||||
if opt == 1:
|
||||
print "VLAN Created, Enabling..." + str(vlan)
|
||||
cmd = "/cfg/l2/vlan " + str(vlan) + " /ena/apply "
|
||||
child.sendline(cmd)
|
||||
|
||||
threading.Thread(target=self.__saveConfig(child)).start()
|
||||
|
||||
|
||||
def removeNodeFromVlan(self, vlan):
|
||||
child = self.__login()
|
||||
cmd = "/cfg/l2/vlan " + str(vlan) + " /rem " + str(self.host['hw_port']) + "/apply"
|
||||
child.sendline(cmd)
|
||||
threading.Thread(target=self.__saveConfig(child)).start()
|
||||
|
||||
def setNativeVlan(self, vlan):
|
||||
child = self.__login()
|
||||
#child.logfile = sys.stdout
|
||||
cmd = "/cfg/port " + str(self.host['hw_port']) + "/pvid " + str(vlan) + "/apply"
|
||||
child.sendline(cmd)
|
||||
threading.Thread(target=self.__saveConfig(child)).start()
|
||||
|
||||
# HP switches allow more free control. Example, if you set a port to a native vlan
|
||||
# that doesn't exist, HP switches will happily create for you.
|
||||
# However, if you delete a vlan that exists on many ports, it will still happily delete
|
||||
# the vlan, forcing all the other ports to default to some other native vlan. Need
|
||||
# to make sure we check before blasting vlans.
|
||||
|
||||
# Restore Native Vlan.
|
||||
def restoreNativeVlan(self):
|
||||
child = self.__login()
|
||||
cmd = "/cfg/port " + str(self.host['hw_port']) + "/pvid 1/apply"
|
||||
child.sendline(cmd)
|
||||
threading.Thread(target=self.__saveConfig(child)).start()
|
||||
|
||||
# Setup the switch for node allocation
|
||||
def allocateNode(self):
|
||||
pass
|
||||
|
||||
# Remove all vlans from the interface
|
||||
def removeAllVlans(self):
|
||||
child = self.__login()
|
||||
cmd = "/cfg/port " + str(self.host['hw_port']) + "/tag d/apply"
|
||||
#child.logfile = sys.stdout
|
||||
child.sendline(cmd)
|
||||
|
||||
def showInterfaceConfig(self):
|
||||
print "\n---------------" + self.host['hw_make'] + "---------------------"
|
||||
print "SWITCH - " + self.host['hw_name'] + "/" + str(self.host['hw_port'])
|
||||
print "NODE - " + self.host['location']
|
||||
print "------------------------------------\n"
|
||||
# using run and parsing output. Still have issues an "rt" after the command. Fix later
|
||||
#val = pexpect.run("telnet sw0-r4r1e1", withexitstatus=False, timeout=2, events=({'(?i)password:': "admin\r\n", "Main#": "info\r\n", "Info(.*)" : "port\r\n"})) #, "Info(.*)" : "exit\n"}))
|
||||
# Just print everything for now, fix when back in the US
|
||||
#print val
|
||||
|
||||
|
||||
child = self.__login()
|
||||
cmd = "/info/port " + str(self.host['hw_port'])
|
||||
child.sendline(cmd)
|
||||
child.logfile = sys.stdout
|
||||
opt = child.expect(['Info(.*)', pexpect.EOF, pexpect.TIMEOUT])
|
||||
|
||||
# this needs to be removed or rewritten
|
||||
def interactiveSwitchConfig(self):
|
||||
switchIp = "telnet " + self.host['hw_name']
|
||||
child = pexpect.spawn(switchIp)
|
||||
child.setecho(False)
|
||||
#child.expect('Name:')
|
||||
#child.sendline(self.host['hw_userid'])
|
||||
#i=child.expect(['test','password:','Password:', pexpect.EOF, pexpect.TIMEOUT])
|
||||
#child.logfile = sys.stdout
|
||||
child.sendline(self.host['hw_password'])
|
||||
child.interact(escape_character='\x1d', input_filter=None, output_filter=None)
|
||||
|
||||
|
359
ssh/zoni-cli/hwswitch.py
Normal file
359
ssh/zoni-cli/hwswitch.py
Normal file
|
@ -0,0 +1,359 @@
|
|||
# Licensed to the Apache Software Foundation (ASF) under one
|
||||
# or more contributor license agreements. See the NOTICE file
|
||||
# distributed with this work for additional information
|
||||
# regarding copyright ownership. The ASF licenses this file
|
||||
# to you under the Apache License, Version 2.0 (the
|
||||
# "License"); you may not use this file except in compliance
|
||||
# with the License. You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing,
|
||||
# software distributed under the License is distributed on an
|
||||
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
# KIND, either express or implied. See the License for the
|
||||
# specific language governing permissions and limitations
|
||||
# under the License.
|
||||
#
|
||||
# $Id$
|
||||
#
|
||||
|
||||
import os
|
||||
import sys
|
||||
import pexpect
|
||||
import datetime
|
||||
import thread
|
||||
|
||||
|
||||
from hwswitchinterface import HwSwitchInterface
|
||||
from resourcequerysql import ResourceQuerySql
|
||||
from util import logit
|
||||
|
||||
|
||||
''' Using pexpect to control switches because couldn't get snmp to work
|
||||
'''
|
||||
|
||||
class HwDellSwitch(HwSwitchInterface):
|
||||
def __init__(self, config, host=None):
|
||||
self.host = host
|
||||
self.verbose = False
|
||||
self.logFile = config['logFile']
|
||||
|
||||
|
||||
def setVerbose(self, verbose):
|
||||
self.verbose = verbose
|
||||
|
||||
def __login(self):
|
||||
|
||||
switchIp = "ssh " + self.host['hw_userid'] + "@" + self.host['hw_name']
|
||||
child = pexpect.spawn(switchIp)
|
||||
opt = child.expect(['Name:', 'password:', pexpect.EOF, pexpect.TIMEOUT])
|
||||
print "opt is ", opt
|
||||
#XXX Doesn't seem to do what I want:(
|
||||
child.setecho(False)
|
||||
if opt == 0:
|
||||
child.sendline(self.host['hw_userid'])
|
||||
#i=child.expect(['test','password:','Password:', pexpect.EOF, pexpect.TIMEOUT])
|
||||
|
||||
# Be Verbose and print everything
|
||||
if self.verbose:
|
||||
child.logfile = sys.stdout
|
||||
|
||||
child.sendline(self.host['hw_password'])
|
||||
i=child.expect(['console','sw', 'Name:', pexpect.EOF, pexpect.TIMEOUT])
|
||||
if i == 2:
|
||||
mesg = "ERROR: Login failed\n"
|
||||
logit(self.logFile, mesg)
|
||||
|
||||
sys.stderr.write()
|
||||
exit(1)
|
||||
# on the 6448 dell, need to send enable
|
||||
if opt == 1:
|
||||
child.sendline('enable')
|
||||
i=child.expect(['#', pexpect.EOF, pexpect.TIMEOUT])
|
||||
|
||||
return child
|
||||
|
||||
def __getPrsLabel(self):
|
||||
dadate = datetime.datetime.now().strftime("%Y%m%d-%H%M-%S")
|
||||
return "PRS_" + dadate
|
||||
|
||||
|
||||
def enableHostPort(self):
|
||||
child = self.__login()
|
||||
child.sendline('config')
|
||||
cmd = "interface ethernet g" + str(self.host['hw_port'])
|
||||
child.sendline(cmd)
|
||||
cmd = "no shutdown"
|
||||
child.sendline(cmd)
|
||||
child.sendline('exit')
|
||||
child.terminate()
|
||||
|
||||
def disableHostPort(self):
|
||||
child = self.__login()
|
||||
child.sendline('config')
|
||||
cmd = "interface ethernet g" + str(self.host['hw_port'])
|
||||
child.sendline(cmd)
|
||||
cmd = "shutdown"
|
||||
child.sendline(cmd)
|
||||
child.sendline('exit')
|
||||
child.terminate()
|
||||
|
||||
def removeVlan(self, num):
|
||||
# Check for important vlans
|
||||
|
||||
cmd = "no vlan " + num
|
||||
child = self.__login()
|
||||
child.sendline('config')
|
||||
child.sendline('vlan database')
|
||||
child.sendline(cmd)
|
||||
child.sendline('exit')
|
||||
child.terminate()
|
||||
|
||||
def addVlanToTrunk(self, vlan):
|
||||
mesg = "Adding Vlan to trunks on switch"
|
||||
logit(self.logFile, mesg)
|
||||
child = self.__login()
|
||||
child.sendline('config')
|
||||
cmd = "interface range port-channel all"
|
||||
child.sendline(cmd)
|
||||
child.expect(["config-if", pexpect.EOF])
|
||||
cmd = "switchport trunk allowed vlan add " + vlan
|
||||
child.sendline(cmd)
|
||||
child.sendline('exit')
|
||||
|
||||
def createVlansThread(self, vlan, switch,host):
|
||||
mesg = "Creating vlan " + str(vlan) + " on switch " + str(switch)
|
||||
print "host is ", host
|
||||
logit(self.logFile, mesg)
|
||||
print "create"
|
||||
self.createVlan(vlan)
|
||||
print "cend"
|
||||
self.addVlanToTrunk(vlan);
|
||||
thread.exit()
|
||||
|
||||
def createVlans(self, vlan, switchlist, query):
|
||||
for switch in switchlist:
|
||||
#print "working on switch ", switch
|
||||
#self.host = query.getSwitchInfo(switch)
|
||||
#thread.start_new_thread(self.createVlansThread, (vlan, switch, self.host))
|
||||
mesg = "Creating vlan " + str(vlan) + " on switch " + str(switch)
|
||||
logit(self.logFile, mesg)
|
||||
self.host = query.getSwitchInfo(switch)
|
||||
self.createVlan(vlan)
|
||||
self.addVlanToTrunk(vlan);
|
||||
|
||||
def removeVlans(self, vlan, switchlist, query):
|
||||
for switch in switchlist:
|
||||
mesg = "Deleting vlan " + str(vlan) + " on switch " + str(switch)
|
||||
logit(self.logFile, mesg)
|
||||
self.host = query.getSwitchInfo(switch)
|
||||
self.removeVlan(vlan)
|
||||
|
||||
def createVlan(self, val):
|
||||
|
||||
vlanname = False
|
||||
if ":" in val:
|
||||
num = int(val.split(":")[0])
|
||||
vlanname = val.split(":")[1]
|
||||
else:
|
||||
vlanname = self.__getPrsLabel()
|
||||
num = int(val)
|
||||
|
||||
#if type(num) != int:
|
||||
#mesg = "ERROR: Vlan must be a number (0-4095)\n"
|
||||
#sys.stderr.write(mesg)
|
||||
#exit(1)
|
||||
if num > 4095 or num < 0:
|
||||
mesg = "ERROR: Vlan out of range. Must be < 4095"
|
||||
logit(self.logFile, mesg)
|
||||
exit(1)
|
||||
|
||||
child = self.__login()
|
||||
child.sendline('config')
|
||||
child.expect(["config",pexpect.EOF, pexpect.TIMEOUT])
|
||||
child.sendline('vlan database')
|
||||
child.expect(["config-vlan",pexpect.EOF, pexpect.TIMEOUT])
|
||||
cmd = "vlan " + str(num)
|
||||
child.sendline(cmd)
|
||||
child.sendline('exit')
|
||||
child.expect(["config",pexpect.EOF, pexpect.TIMEOUT])
|
||||
|
||||
if vlanname:
|
||||
cmd = "interface vlan " + str(num)
|
||||
child.sendline(cmd)
|
||||
child.expect(["config-if",pexpect.EOF, pexpect.TIMEOUT])
|
||||
cmd = "name " + vlanname
|
||||
child.sendline(cmd)
|
||||
child.expect(["config-if",pexpect.EOF, pexpect.TIMEOUT])
|
||||
|
||||
child.sendline('exit')
|
||||
child.sendline('exit')
|
||||
|
||||
# Raw Switch commands. DEBUG ONLY!, Doesn't work!
|
||||
def sendSwitchCommand(self, cmds):
|
||||
if len(cmds) > 0:
|
||||
child = self.__login()
|
||||
child.logfile = sys.stdout
|
||||
for cmd in cmds.split(";"):
|
||||
child.sendline(cmd)
|
||||
try:
|
||||
i=child.expect(['console','sw', 'Name:', pexpect.EOF, pexpect.TIMEOUT], timeout=2)
|
||||
i=child.expect(['console','sw', 'Name:', pexpect.EOF, pexpect.TIMEOUT], timeout=2)
|
||||
|
||||
except EOF:
|
||||
print "EOF", i
|
||||
#child.sendline()
|
||||
except TIMEOUT:
|
||||
print "TIMEOUT", i
|
||||
#child.interact(escape_character='\x1d', input_filter=None, output_filter=None)
|
||||
|
||||
child.terminate()
|
||||
#print "before", child.before
|
||||
#print "after", child.after
|
||||
|
||||
def addNodeToVlan(self, vlan):
|
||||
print "Adding Node to vlan ", vlan
|
||||
child = self.__login()
|
||||
child.sendline('config')
|
||||
cmd = "interface ethernet g" + str(self.host['hw_port'])
|
||||
child.sendline(cmd)
|
||||
child.expect(["config-if", pexpect.EOF])
|
||||
cmd = "switchport trunk allowed vlan add " + vlan
|
||||
child.sendline(cmd)
|
||||
child.sendline('exit')
|
||||
|
||||
NOVLAN = "VLAN was not created by user."
|
||||
i=child.expect(['config-if',NOVLAN, pexpect.EOF, pexpect.TIMEOUT])
|
||||
# Vlan must exist in order to add a host to it.
|
||||
# If it doesn't exist, try to create it
|
||||
if i == 1:
|
||||
sys.stderr.write("WARNING: Vlan doesn't exist, trying to create\n")
|
||||
# Add a tag showing this was created by PRS
|
||||
newvlan = vlan + ":" + self.__getPrsLabel()
|
||||
self.createVlan(newvlan)
|
||||
self.addNodeToVlan(vlan)
|
||||
|
||||
child.sendline('exit')
|
||||
child.sendline('exit')
|
||||
child.terminate()
|
||||
sys.stdout.write("Success\n")
|
||||
|
||||
def removeNodeFromVlan(self, vlan):
|
||||
child = self.__login()
|
||||
child.sendline('config')
|
||||
cmd = "interface ethernet g" + str(self.host['hw_port'])
|
||||
child.sendline(cmd)
|
||||
cmd = "switchport trunk allowed vlan remove " + vlan
|
||||
child.sendline(cmd)
|
||||
child.sendline('exit')
|
||||
child.sendline('exit')
|
||||
child.terminate()
|
||||
|
||||
|
||||
#def __checkVlan(self, child, vlan):
|
||||
#NO_VLAN_EXISTS = "VLAN was not created by user."
|
||||
#i=child.expect(['config',NO_VLAN_EXISTS, pexpect.EOF, pexpect.TIMEOUT])
|
||||
#print "i is ", i
|
||||
#if i == 1:
|
||||
#sys.stderr.write("WARNING: Vlan doesn't exist, trying to create")
|
||||
#i=child.expect(['config',NO_VLAN_EXISTS, pexpect.EOF, pexpect.TIMEOUT])
|
||||
#return "NOVLAN"
|
||||
##newvlan = vlan + ":CREATED_BY_PRS"
|
||||
##self.createVlan(newvlan)
|
||||
##self.setNativeVlan(vlan)
|
||||
|
||||
|
||||
def setNativeVlan(self, vlan):
|
||||
child = self.__login()
|
||||
child.logfile = sys.stdout
|
||||
child.sendline('config')
|
||||
cmd = "interface ethernet g" + str(self.host['hw_port'])
|
||||
child.sendline(cmd)
|
||||
i=child.expect(['config-if', pexpect.EOF, pexpect.TIMEOUT])
|
||||
if i > 0:
|
||||
sys.stderr.write("ERROR: setNativeVlan ", cmd, " failed\n")
|
||||
|
||||
NOVLAN = "VLAN was not created by user."
|
||||
cmd = "switchport trunk native vlan " + vlan
|
||||
child.sendline(cmd)
|
||||
i=child.expect(['config-if', NOVLAN, pexpect.EOF, pexpect.TIMEOUT])
|
||||
# Vlan must exist in order to add a host to it.
|
||||
# If it doesn't exist, try to create it
|
||||
if i == 1:
|
||||
sys.stderr.write("WARNING: Vlan doesn't exist, trying to create")
|
||||
# Add a tag showing this was created by PRS
|
||||
newvlan = vlan + ":" + self.__getPrsLabel()
|
||||
self.createVlan(newvlan)
|
||||
self.setNativeVlan(vlan)
|
||||
|
||||
child.sendline('exit')
|
||||
child.sendline('exit')
|
||||
child.terminate()
|
||||
|
||||
# Restore Native Vlan. In Dell's case, this is vlan 1
|
||||
def restoreNativeVlan(self):
|
||||
child = self.__login()
|
||||
child.sendline('config')
|
||||
cmd = "interface ethernet g" + str(self.host['hw_port'])
|
||||
child.sendline(cmd)
|
||||
cmd = "switchport trunk native vlan 1"
|
||||
child.sendline(cmd)
|
||||
child.sendline('exit')
|
||||
child.sendline('exit')
|
||||
#child.terminate()
|
||||
child.terminate()
|
||||
|
||||
# Setup the switch for node allocation
|
||||
def allocateNode(self):
|
||||
pass
|
||||
|
||||
# Remove all vlans from the interface
|
||||
def removeAllVlans(self):
|
||||
child = self.__login()
|
||||
child.logfile = sys.stdout
|
||||
child.sendline('config')
|
||||
cmd = "interface ethernet g" + str(self.host['hw_port'])
|
||||
child.sendline(cmd)
|
||||
i=child.expect(['config-if', pexpect.EOF, pexpect.TIMEOUT])
|
||||
if i > 0:
|
||||
sys.stderr.write("ERROR: setNativeVlan ", cmd, " failed\n")
|
||||
|
||||
NOVLAN = "VLAN was not created by user."
|
||||
cmd = "switchport trunk allowed vlan remove all"
|
||||
child.sendline(cmd)
|
||||
i=child.expect(['config-if', NOVLAN, pexpect.EOF, pexpect.TIMEOUT])
|
||||
# Vlan must exist in order to add a host to it.
|
||||
# If it doesn't exist, try to create it
|
||||
if i == 1:
|
||||
pass
|
||||
|
||||
child.sendline('exit')
|
||||
child.sendline('exit')
|
||||
child.terminate()
|
||||
|
||||
def showInterfaceConfig(self):
|
||||
child = self.__login()
|
||||
print "\n------------------------------------"
|
||||
print "SWITCH - " + self.host['hw_name'] + "/" + str(self.host['hw_port'])
|
||||
print "NODE - " + self.host['location']
|
||||
print "------------------------------------\n"
|
||||
child.logfile = sys.stdout
|
||||
cmd = "show interface switchport ethernet g" + str(self.host['hw_port'])
|
||||
child.sendline(cmd)
|
||||
i = child.expect(['sw(.*)', pexpect.EOF, pexpect.TIMEOUT])
|
||||
i = child.expect(['sw(.*)', pexpect.EOF, pexpect.TIMEOUT])
|
||||
child.terminate()
|
||||
|
||||
def interactiveSwitchConfig(self):
|
||||
switchIp = "ssh " + self.host['hw_name']
|
||||
child = pexpect.spawn(switchIp)
|
||||
child.setecho(False)
|
||||
#child.expect('Name:')
|
||||
child.sendline(self.host['hw_userid'])
|
||||
#i=child.expect(['test','password:','Password:', pexpect.EOF, pexpect.TIMEOUT])
|
||||
#child.logfile = sys.stdout
|
||||
child.sendline(self.host['hw_password'])
|
||||
child.interact(escape_character='\x1d', input_filter=None, output_filter=None)
|
||||
|
||||
|
65
ssh/zoni-cli/hwswitchinterface.py
Normal file
65
ssh/zoni-cli/hwswitchinterface.py
Normal file
|
@ -0,0 +1,65 @@
|
|||
# Licensed to the Apache Software Foundation (ASF) under one
|
||||
# or more contributor license agreements. See the NOTICE file
|
||||
# distributed with this work for additional information
|
||||
# regarding copyright ownership. The ASF licenses this file
|
||||
# to you under the Apache License, Version 2.0 (the
|
||||
# "License"); you may not use this file except in compliance
|
||||
# with the License. You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing,
|
||||
# software distributed under the License is distributed on an
|
||||
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
# KIND, either express or implied. See the License for the
|
||||
# specific language governing permissions and limitations
|
||||
# under the License.
|
||||
#
|
||||
# $Id$
|
||||
#
|
||||
|
||||
import sys
|
||||
import os
|
||||
|
||||
class HwSwitchInterface(object):
|
||||
""" Interface description for hardware switches
|
||||
- Dell
|
||||
"""
|
||||
def __init__(self, configFile, hostInst = None):
|
||||
'''
|
||||
hostInst is all data that makes up a host
|
||||
hw_port - port number node is connected to
|
||||
hw_userid - userid node uses to configure switch
|
||||
hw_password - userid node uses to configure switch
|
||||
hw_name - switch name node is connected to
|
||||
'''
|
||||
#self.host = hostInst
|
||||
|
||||
|
||||
def enablePort(self):
|
||||
raise NotImplementedError
|
||||
|
||||
def disablePort(self):
|
||||
raise NotImplementedError
|
||||
|
||||
def removeVlan(self, vlan):
|
||||
raise NotImplementedError
|
||||
|
||||
def createVlan(self, vlan):
|
||||
raise NotImplementedError
|
||||
|
||||
def addNode2Vlan(self, vlan):
|
||||
raise NotImplementedError
|
||||
|
||||
def removeNodeFromVlan(self, vlan):
|
||||
raise NotImplementedError
|
||||
|
||||
def addNativeVlan(self, vlan):
|
||||
raise NotImplementedError
|
||||
|
||||
def restoreNativeVlan(self):
|
||||
raise NotImplementedError
|
||||
|
||||
def isolateNetwork(self):
|
||||
raise NotImplementedError
|
||||
|
58
ssh/zoni-cli/infostore.py
Normal file
58
ssh/zoni-cli/infostore.py
Normal file
|
@ -0,0 +1,58 @@
|
|||
# Licensed to the Apache Software Foundation (ASF) under one
|
||||
# or more contributor license agreements. See the NOTICE file
|
||||
# distributed with this work for additional information
|
||||
# regarding copyright ownership. The ASF licenses this file
|
||||
# to you under the Apache License, Version 2.0 (the
|
||||
# "License"); you may not use this file except in compliance
|
||||
# with the License. You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing,
|
||||
# software distributed under the License is distributed on an
|
||||
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
# KIND, either express or implied. See the License for the
|
||||
# specific language governing permissions and limitations
|
||||
# under the License.
|
||||
#
|
||||
# $Id$
|
||||
#
|
||||
|
||||
import sys
|
||||
import os
|
||||
import optparse
|
||||
|
||||
|
||||
class InfoStore (object):
|
||||
""" Interface description for query system resources
|
||||
"""
|
||||
def __init__(self, config):
|
||||
self.config = config
|
||||
|
||||
#def updateDatabase(self, query):
|
||||
#raise NotImplementedError
|
||||
|
||||
|
||||
def printAll(self):
|
||||
raise NotImplementedError
|
||||
|
||||
def showResources(self, cmdargs):
|
||||
raise NotImplementedError
|
||||
|
||||
def printResources(self):
|
||||
raise NotImplementedError
|
||||
|
||||
def showAllocation(self):
|
||||
raise NotImplementedError
|
||||
|
||||
def showPxeImages(self):
|
||||
raise NotImplementedError
|
||||
|
||||
def showPxeImagesToSystemMap(self):
|
||||
raise NotImplementedError
|
||||
|
||||
def getHwAccessMethod(self):
|
||||
''' Get hardware access method and return a list
|
||||
'''
|
||||
raise NotImplementedError
|
||||
|
105
ssh/zoni-cli/ipmi.py
Normal file
105
ssh/zoni-cli/ipmi.py
Normal file
|
@ -0,0 +1,105 @@
|
|||
# Licensed to the Apache Software Foundation (ASF) under one
|
||||
# or more contributor license agreements. See the NOTICE file
|
||||
# distributed with this work for additional information
|
||||
# regarding copyright ownership. The ASF licenses this file
|
||||
# to you under the Apache License, Version 2.0 (the
|
||||
# "License"); you may not use this file except in compliance
|
||||
# with the License. You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing,
|
||||
# software distributed under the License is distributed on an
|
||||
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
# KIND, either express or implied. See the License for the
|
||||
# specific language governing permissions and limitations
|
||||
# under the License.
|
||||
#
|
||||
# $Id$
|
||||
#
|
||||
|
||||
import sys
|
||||
import os
|
||||
|
||||
from systemmanagementinterface import SystemManagementInterface
|
||||
|
||||
|
||||
#class systemmagement():
|
||||
#def __init__(self, proto):
|
||||
#self.proto = proto
|
||||
|
||||
class Ipmi(SystemManagementInterface):
|
||||
def __init__(self, host, user, password):
|
||||
self.host = host + "-ipmi"
|
||||
self.password = password
|
||||
self.user = user
|
||||
self.powerStatus = None
|
||||
self.verbose = False
|
||||
self.ipmicmd = "ipmitool -I lanplus -U" + self.user + " -H" + self.host + \
|
||||
" -P " + self.password + " "
|
||||
|
||||
|
||||
def setVerbose(self, verbose):
|
||||
self.verbose = verbose
|
||||
|
||||
def getPowerStatus(self):
|
||||
if self.verbose:
|
||||
print self.ipmicmd
|
||||
cmd = self.ipmicmd + "chassis power status"
|
||||
a = os.popen(cmd)
|
||||
output = a.read()
|
||||
|
||||
print "%s\n%s" % (self.host, output)
|
||||
if "off" in output:
|
||||
self.powerStatus = 0
|
||||
if "on" in output:
|
||||
self.powerStatus = 1
|
||||
if "Unable" in output:
|
||||
print "unable to get the status"
|
||||
self.powerStatus = 0
|
||||
|
||||
return output
|
||||
#return a.read()
|
||||
#for line in a.readlines():
|
||||
#print line
|
||||
|
||||
def isPowered(self):
|
||||
if self.powerStatus == None:
|
||||
self.getPowerStatus()
|
||||
if self.powerStatus:
|
||||
return 1;
|
||||
if not self.powerStatus:
|
||||
return 0;
|
||||
|
||||
|
||||
def powerOn(self):
|
||||
cmd = self.ipmicmd + "chassis power on"
|
||||
a = os.popen(cmd)
|
||||
output = a.read()
|
||||
print "output is ", output
|
||||
|
||||
def powerOff(self):
|
||||
cmd = self.ipmicmd + "chassis power off"
|
||||
a = os.popen(cmd)
|
||||
output = a.read()
|
||||
print "output is ", output
|
||||
|
||||
def powerCycle(self):
|
||||
cmd = self.ipmicmd + "chassis power cycle"
|
||||
a = os.popen(cmd)
|
||||
output = a.read()
|
||||
print "output is ", output
|
||||
|
||||
def powerReset(self):
|
||||
cmd = self.ipmicmd + "chassis power reset"
|
||||
a = os.popen(cmd)
|
||||
output = a.read()
|
||||
print "output is ", output
|
||||
|
||||
def activateConsole(self):
|
||||
cmd = self.ipmicmd + "sol activate"
|
||||
a = os.popen(cmd)
|
||||
output = a.read()
|
||||
print "output is ", output
|
||||
|
||||
#ipmitool -I lanplus -E -H r2r1c3b0-ipmi -U root chassis power status
|
39
ssh/zoni-cli/phyassigninterface.py
Normal file
39
ssh/zoni-cli/phyassigninterface.py
Normal file
|
@ -0,0 +1,39 @@
|
|||
# Licensed to the Apache Software Foundation (ASF) under one
|
||||
# or more contributor license agreements. See the NOTICE file
|
||||
# distributed with this work for additional information
|
||||
# regarding copyright ownership. The ASF licenses this file
|
||||
# to you under the Apache License, Version 2.0 (the
|
||||
# "License"); you may not use this file except in compliance
|
||||
# with the License. You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing,
|
||||
# software distributed under the License is distributed on an
|
||||
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
# KIND, either express or implied. See the License for the
|
||||
# specific language governing permissions and limitations
|
||||
# under the License.
|
||||
#
|
||||
# $Id$
|
||||
#
|
||||
|
||||
import sys
|
||||
import os
|
||||
|
||||
|
||||
class PhyAssignInterface(object):
|
||||
""" Interface description for query system resources
|
||||
"""
|
||||
def __init__(self, config):
|
||||
self.config = config
|
||||
|
||||
|
||||
def assignImage(self):
|
||||
raise NotImplementedError
|
||||
|
||||
def reservePhy(self):
|
||||
raise NotImplementedError
|
||||
|
||||
def uploadImage(self):
|
||||
raise NotImplementedError
|
100
ssh/zoni-cli/pxe.py
Normal file
100
ssh/zoni-cli/pxe.py
Normal file
|
@ -0,0 +1,100 @@
|
|||
# Licensed to the Apache Software Foundation (ASF) under one
|
||||
# or more contributor license agreements. See the NOTICE file
|
||||
# distributed with this work for additional information
|
||||
# regarding copyright ownership. The ASF licenses this file
|
||||
# to you under the Apache License, Version 2.0 (the
|
||||
# "License"); you may not use this file except in compliance
|
||||
# with the License. You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing,
|
||||
# software distributed under the License is distributed on an
|
||||
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
# KIND, either express or implied. See the License for the
|
||||
# specific language governing permissions and limitations
|
||||
# under the License.
|
||||
#
|
||||
# $Id$
|
||||
#
|
||||
|
||||
import os
|
||||
import sys
|
||||
import string
|
||||
import datetime
|
||||
import subprocess
|
||||
import MySQLdb
|
||||
import traceback
|
||||
|
||||
from util import logit
|
||||
from bootmanagementinterface import BootManagementInterface
|
||||
|
||||
class Pxe(BootManagementInterface):
|
||||
def __init__(self, config, verbose=None):
|
||||
self.verbose = verbose
|
||||
self.host = config['dbHost']
|
||||
self.user = config['dbUser']
|
||||
self.passwd = config['dbPassword']
|
||||
self.db = config['dbInst']
|
||||
|
||||
self.tftpRootDir = config['tftpRootDir']
|
||||
self.tftpImageDir = config['tftpImageDir']
|
||||
self.tftpBootOptionsDir = config['tftpBootOptionsDir']
|
||||
self.tftpUpdateFile = config['tftpUpdateFile']
|
||||
self.tftpBaseFile = config['tftpBaseFile']
|
||||
self.tftpBaseMenuFile = config['tftpBaseMenuFile']
|
||||
|
||||
self.logFile = config['logFile']
|
||||
|
||||
if config['dbPort'] == "":
|
||||
config['dbPort'] = 3306
|
||||
|
||||
self.port = config['dbPort']
|
||||
|
||||
self.vlan_max = config['vlan_max']
|
||||
self.vlan_reserved = config['vlan_reserved']
|
||||
|
||||
# Connect to DB
|
||||
self.conn = MySQLdb.connect(host = self.host, port = self.port, user = self.user, passwd = self.passwd, db = self.db)
|
||||
#cursor.execute ("SELECT VERSION()")
|
||||
#print "server version:", row[0]
|
||||
#mysql -Dirp-cluster -hrodimus -u reader -e "select * from hostinfo;"
|
||||
|
||||
|
||||
|
||||
|
||||
''' This will create the update file tftpUpdateFile used to generate all the pxe boot files
|
||||
pass in a list of available images
|
||||
'''
|
||||
def createPxeUpdateFile (self, images):
|
||||
try:
|
||||
f = open(self.tftpUpdateFile, "w")
|
||||
except Exception:
|
||||
traceback.print_exc(sys.exc_info())
|
||||
|
||||
dadate = datetime.datetime.now().strftime("%Y%m%d.%H%M.%S")
|
||||
val = "# Generated by PRS : " + dadate
|
||||
f.write(val)
|
||||
for image in images:
|
||||
val = "\n# IMAGE " + image + "\n"
|
||||
f.write(val)
|
||||
base = "cat " + self.tftpBaseFile + " | sed 's/MAGIC1/" + image + "/' > " + self.tftpBootOptionsDir + "/" + image + "\n"
|
||||
basemenu= "cat " + self.tftpBaseMenuFile + " | sed 's/LABEL " + image + "/LABEL " + image + "\\n\\tMENU DEFAULT/' > " + self.tftpBootOptionsDir + "/" + image + "-menu\n"
|
||||
f.write(base)
|
||||
f.write(basemenu)
|
||||
f.close()
|
||||
|
||||
|
||||
def updatePxe(self):
|
||||
cmd = "chmod 755 " + self.tftpUpdateFile
|
||||
try:
|
||||
os.system(cmd)
|
||||
except Exception:
|
||||
traceback.print_exc(sys.exc_info())
|
||||
|
||||
cmd = self.tftpUpdateFile
|
||||
try:
|
||||
os.system(cmd)
|
||||
except Exception:
|
||||
traceback.print_exc(sys.exc_info())
|
||||
|
121
ssh/zoni-cli/raritanpdu.py
Normal file
121
ssh/zoni-cli/raritanpdu.py
Normal file
|
@ -0,0 +1,121 @@
|
|||
# Licensed to the Apache Software Foundation (ASF) under one
|
||||
# or more contributor license agreements. See the NOTICE file
|
||||
# distributed with this work for additional information
|
||||
# regarding copyright ownership. The ASF licenses this file
|
||||
# to you under the Apache License, Version 2.0 (the
|
||||
# "License"); you may not use this file except in compliance
|
||||
# with the License. You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing,
|
||||
# software distributed under the License is distributed on an
|
||||
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
# KIND, either express or implied. See the License for the
|
||||
# specific language governing permissions and limitations
|
||||
# under the License.
|
||||
#
|
||||
# $Id$
|
||||
#
|
||||
|
||||
import sys
|
||||
import os
|
||||
from pysnmp.entity.rfc3413.oneliner import cmdgen
|
||||
from pysnmp.proto import rfc1902
|
||||
|
||||
#import netsnmp
|
||||
|
||||
from systemmanagementinterface import SystemManagementInterface
|
||||
|
||||
|
||||
#class systemmagement():
|
||||
#def __init__(self, proto):
|
||||
#self.proto = proto
|
||||
|
||||
class raritanDominionPx(SystemManagementInterface):
|
||||
def __init__(self, host):
|
||||
self.host = host['location']
|
||||
self.pdu_name = host['pdu_name']
|
||||
self.port = host['pdu_port']
|
||||
self.user = host['pdu_userid']
|
||||
self.password = host['pdu_password']
|
||||
self.oid = "1,3,6,1,4,1,13742,4,1,2,2,1"
|
||||
self.oid_name = ",2"
|
||||
self.oid_set = ",3"
|
||||
self.oid_status = ",3"
|
||||
# this works
|
||||
#errorIndication, errorStatus, errorIndex, varBinds = cmdgen.CommandGenerator().getCmd(cmdgen.CommunityData('my-agent', 'public', 0), cmdgen.UdpTransportTarget(('pdu0-r1r1', 161)), (1,3,6,1,4,1,13742,4,1,2,2,1,3,2))
|
||||
|
||||
#print varBinds
|
||||
#oid = netsnmp.Varbind('sysDescr')
|
||||
#result = netsnmp.snmpwalk(oid, Version = 2,DestHost="localhost",Community="public")
|
||||
#print result
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
#var = netsnmp.Varbind('sysDescr.0')
|
||||
#res = netsnmp.snmpget(var, ...:Version=1,...:DestHost = 'pdu0-r1r1',...: Community = 'prs-domain')
|
||||
#print res
|
||||
|
||||
#print cmdgen
|
||||
#set snmp = /usr/bin/snmpset -v 2c -c intel pdu .1.3.6.1.4.1.13742.4.1.2.2.1.3.$outletnumber i $state
|
||||
#name snmp = /usr/bin/snmpset -v 2c -c intel pdu .1.3.6.1.4.1.13742.4.1.2.2.1.2.$outletnumber i $state
|
||||
#status snmp = /usr/bin/snmpset -v 2c -c intel pdu .1.3.6.1.4.1.13742.4.1.2.2.1.1.$outletnumber i $state
|
||||
#self.snmp_status_oid = ".1.3.6.1.4.1.13742.4.1.2.2.1.1."
|
||||
#self.powerStatus = None
|
||||
#print self.__dict__
|
||||
|
||||
def getPowerStatus(self):
|
||||
thisoid = eval(str(self.oid) + str(self.oid_status) + "," + str(self.port))
|
||||
errorIndication, errorStatus, errorIndex, varBinds = cmdgen.CommandGenerator().getCmd( \
|
||||
cmdgen.CommunityData('my-agent', self.user, 0), \
|
||||
cmdgen.UdpTransportTarget((self.pdu_name, 161)), thisoid)
|
||||
output = varBinds[0][1]
|
||||
|
||||
if output == 1:
|
||||
self.powerStatus = 1
|
||||
powerstat = "on"
|
||||
if output == 0:
|
||||
self.powerStatus = 0
|
||||
powerstat = "off"
|
||||
|
||||
print "PDU Power for %s is %s" % (self.host, powerstat)
|
||||
|
||||
if output:
|
||||
return 1
|
||||
return 0
|
||||
|
||||
|
||||
def isPowered(self):
|
||||
if self.powerStatus == None:
|
||||
self.getPowerStatus()
|
||||
if self.powerStatus:
|
||||
return 1;
|
||||
if not self.powerStatus:
|
||||
return 0;
|
||||
|
||||
|
||||
def powerOn(self):
|
||||
thisoid = eval(str(self.oid) + str(self.oid_status) + "," + str(self.port))
|
||||
errorIndication, errorStatus, errorIndex, varBinds = cmdgen.CommandGenerator().setCmd( \
|
||||
cmdgen.CommunityData('my-agent', self.user, 1), \
|
||||
cmdgen.UdpTransportTarget((self.pdu_name, 161)), \
|
||||
(thisoid, rfc1902.Integer('1')))
|
||||
self.getPowerStatus()
|
||||
|
||||
def powerOff(self):
|
||||
thisoid = eval(str(self.oid) + str(self.oid_status) + "," + str(self.port))
|
||||
errorIndication, errorStatus, errorIndex, varBinds = cmdgen.CommandGenerator().setCmd( \
|
||||
cmdgen.CommunityData('my-agent', self.user, 1), \
|
||||
cmdgen.UdpTransportTarget((self.pdu_name, 161)), \
|
||||
(thisoid, rfc1902.Integer('0')))
|
||||
self.getPowerStatus()
|
||||
|
||||
def powerCycle(self):
|
||||
self.powerOff()
|
||||
self.powerOn()
|
||||
|
||||
def powerReset(self):
|
||||
self.powerCycle()
|
961
ssh/zoni-cli/resourcequerysql.py
Normal file
961
ssh/zoni-cli/resourcequerysql.py
Normal file
|
@ -0,0 +1,961 @@
|
|||
# Licensed to the Apache Software Foundation (ASF) under one
|
||||
# or more contributor license agreements. See the NOTICE file
|
||||
# distributed with this work for additional information
|
||||
# regarding copyright ownership. The ASF licenses this file
|
||||
# to you under the Apache License, Version 2.0 (the
|
||||
# "License"); you may not use this file except in compliance
|
||||
# with the License. You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing,
|
||||
# software distributed under the License is distributed on an
|
||||
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
# KIND, either express or implied. See the License for the
|
||||
# specific language governing permissions and limitations
|
||||
# under the License.
|
||||
#
|
||||
# $Id$
|
||||
#
|
||||
|
||||
import os
|
||||
import sys
|
||||
import string
|
||||
import MySQLdb
|
||||
import subprocess
|
||||
import traceback
|
||||
|
||||
import usermanagement
|
||||
|
||||
from infostore import InfoStore
|
||||
from util import logit
|
||||
from dhcpdns import DhcpDns
|
||||
|
||||
def timeF(f):
|
||||
def myF(*args, **kw):
|
||||
start = time.time()
|
||||
res = f(*args, **kw)
|
||||
end = time.time()
|
||||
print "%s took %f" % (f.__name__, end-start)
|
||||
return res
|
||||
myF.__name__ = f.__name__
|
||||
return myF
|
||||
|
||||
def checkSuper(f):
|
||||
def myF(*args, **kw):
|
||||
if os.getuid() != 0:
|
||||
print "Please use sudo!"
|
||||
exit()
|
||||
res = f(*args, **kw)
|
||||
return res
|
||||
return myF
|
||||
|
||||
class ResourceQuerySql(InfoStore):
|
||||
def __init__(self, config, verbose=None):
|
||||
self.config = config
|
||||
self.verbose = verbose
|
||||
self.host = config['dbHost']
|
||||
self.user = config['dbUser']
|
||||
self.passwd = config['dbPassword']
|
||||
self.db = config['dbInst']
|
||||
|
||||
self.tftpRootDir = config['tftpRootDir']
|
||||
self.tftpImageDir = config['tftpImageDir']
|
||||
self.tftpBootOptionsDir = config['tftpBootOptionsDir']
|
||||
|
||||
self.logFile = config['logFile']
|
||||
|
||||
if config['dbPort'] == "":
|
||||
config['dbPort'] = 3306
|
||||
|
||||
self.port = config['dbPort']
|
||||
|
||||
self.vlan_max = config['vlan_max']
|
||||
self.vlan_reserved = config['vlan_reserved']
|
||||
|
||||
# Connect to DB
|
||||
try:
|
||||
self.conn = MySQLdb.connect(host = self.host, port = self.port, user = self.user, passwd = self.passwd, db = self.db)
|
||||
except MySQLdb.OperationalError, e:
|
||||
if e[0] == 2005:
|
||||
print "ZONI ERROR:" + str(e[1])
|
||||
exit(1)
|
||||
#traceback.print_exc(sys.exc_info())
|
||||
#cursor.execute ("SELECT VERSION()")
|
||||
#print "server version:", row[0]
|
||||
#mysql -Dirp-cluster -hrodimus -u reader -e "select * from hostinfo;"
|
||||
|
||||
#def gethost(self, host):
|
||||
#obj = {}
|
||||
#self.conn
|
||||
#createConn()
|
||||
#
|
||||
|
||||
def __create_queryopts(self, cmdargs, extra=None):
|
||||
cmdlen = len(cmdargs)
|
||||
queryopt = ""
|
||||
|
||||
if extra:
|
||||
queryopt += extra
|
||||
|
||||
if cmdlen == 0:
|
||||
pass
|
||||
else:
|
||||
num = cmdlen
|
||||
if extra:
|
||||
queryopt += " and "
|
||||
for k, v in cmdargs.iteritems():
|
||||
if k == "num_procs":
|
||||
queryopt += k + " = " + v + " "
|
||||
if k == "mem_total":
|
||||
queryopt += k + " >= " + v + " "
|
||||
if k == "clock_speed":
|
||||
queryopt += k + " >= " + v + " "
|
||||
if k == "num_cores":
|
||||
queryopt += k + " = " + v + " "
|
||||
if k == "cpu_flags":
|
||||
queryopt += k + " like \"%" + v + "%\" "
|
||||
if k == "node_id":
|
||||
queryopt += " location = " + "\'" + v + "\' "
|
||||
|
||||
if num > 1:
|
||||
queryopt += " and "
|
||||
|
||||
num -= 1
|
||||
|
||||
if queryopt:
|
||||
tmp = " where " + queryopt
|
||||
queryopt = tmp
|
||||
|
||||
return queryopt
|
||||
|
||||
def updateDatabase(self, table, query):
|
||||
pass
|
||||
|
||||
|
||||
def showResources(self, cmdargs):
|
||||
|
||||
queryopt = ""
|
||||
defaultFields = "mac_addr, location, num_procs, num_cores, clock_speed, mem_total "
|
||||
#defaultFields = "*"
|
||||
|
||||
queryopt = self.__create_queryopts(cmdargs)
|
||||
|
||||
#query = "show fields from sysinfo"
|
||||
#results = self.__selectDb(query)
|
||||
|
||||
query = "select " + defaultFields + "from sysinfo " + queryopt
|
||||
result = self.__selectDb(query)
|
||||
|
||||
line = ""
|
||||
for i in defaultFields.split(","):
|
||||
#line += string.strip(str(i)) + "\t"
|
||||
line += str(i.center(20))
|
||||
print line
|
||||
|
||||
for row in result.fetchall():
|
||||
line = ""
|
||||
for val in row:
|
||||
line += str(val).center(20)
|
||||
print line
|
||||
print str(result.rowcount) + " systems returned"
|
||||
|
||||
#mysql -h rodimus -u reader irp-cluster -e "select * from sysinfo where location like 'r1%' and num_procs = 1"
|
||||
|
||||
def getLocationFromSysId (self, nodeId):
|
||||
query = "select location from sysinfo where sys_id = \"" + str(nodeId) + "\""
|
||||
result = self.__selectDb(query)
|
||||
return result.fetchall()[0][0]
|
||||
|
||||
def getMacFromSysId(self, nodeId):
|
||||
query = "select mac_addr from sysinfo where sys_id = \"" + str(nodeId) + "\""
|
||||
result = self.__selectDb(query)
|
||||
return result.fetchall()[0][0]
|
||||
|
||||
def getIpFromSysId(self, nodeId):
|
||||
query = "select ip_addr from sysinfo where sys_id = \"" + str(nodeId) + "\""
|
||||
result = self.__selectDb(query)
|
||||
return result.fetchall()[0][0]
|
||||
|
||||
|
||||
def getAllSwitches(self):
|
||||
switchList = []
|
||||
query = "select hw_name from hardwareinfo where hw_type = \"switch\""
|
||||
result = self.__selectDb(query)
|
||||
for switch in result.fetchall():
|
||||
switchList.append(switch[0])
|
||||
|
||||
# Use static list until we get all switches installed
|
||||
switchList = ['sw1-r1r2', 'sw0-r1r1', 'sw0-r1r2', 'sw0-r1r3', 'sw0-r1r4', 'sw0-r2r3', 'sw0-r3r3', 'sw0-r3r2', 'sw0-r2r1c3', 'sw2-r1r2']
|
||||
#switchList = ['sw2-r1r2']
|
||||
#switchList = ['sw1-r1r2']
|
||||
|
||||
|
||||
print switchList
|
||||
|
||||
return switchList
|
||||
|
||||
def getAvailableVlan(self):
|
||||
# Get list of available vlans
|
||||
query = "select vlan_num from vlaninfo where domain = 'private'"
|
||||
result = self.__selectDb(query)
|
||||
for vlan in result.fetchall()[0]:
|
||||
avail = self.isVlanAvailable(vlan)
|
||||
if avail:
|
||||
myvlan = vlan
|
||||
break
|
||||
if not myvlan:
|
||||
mesg = "No Vlans for you! You Go Now\n"
|
||||
logit(self.logFile, mesg)
|
||||
return myvlan
|
||||
|
||||
def isVlanAvailable(self, vlan):
|
||||
query = "select a.vlan_id, v.vlan_num from allocationinfo a, vlaninfo v where a.vlan_id = v.vlan_id and v.vlan_num = " + str(vlan)
|
||||
result = self.__selectDb(query)
|
||||
if result.rowcount > 1:
|
||||
return 0
|
||||
else:
|
||||
return 1
|
||||
|
||||
def getVlanId(self, vlan):
|
||||
query = "select vlan_id from vlaninfo where vlan_num = \"" + str(vlan) + "\""
|
||||
result = self.__selectDb(query)
|
||||
#print result.rowcount
|
||||
if result.rowcount > 0:
|
||||
return result.fetchall()[0][0]
|
||||
else:
|
||||
mesg = "ERROR: VLAN does not exist: " + str(vlan)
|
||||
logit(self.logFile, mesg)
|
||||
exit()
|
||||
|
||||
def isIpAvailable(self, ip_addr, vlan_id):
|
||||
query = "select * from allocationinfo where ip_addr = \"" + str(ip_addr) + "\" and vlan_id = \"" + str(vlan_id) + "\""
|
||||
#print "query ", query
|
||||
result = self.__selectDb(query)
|
||||
#print "select row count is ", result.rowcount
|
||||
if result.rowcount > 0:
|
||||
return 0
|
||||
else:
|
||||
return 1
|
||||
|
||||
|
||||
def getDomainIp(self, vlan):
|
||||
ip_start = 30
|
||||
query = "select ip_network from vlaninfo where vlan_num = " + str(vlan)
|
||||
result = self.__selectDb(query)
|
||||
ip_network = result.fetchall()[0][0]
|
||||
v = ip_network.split(".")
|
||||
ip_base = v[0] + "." + v[1] + "." + v[2]
|
||||
|
||||
# Check for other allocations and assign IP address
|
||||
query = "select a.vlan_id, v.vlan_num from allocationinfo a, vlaninfo v where a.vlan_id = v.vlan_id and v.vlan_num = " + str(vlan)
|
||||
#print "ip is ", ip_network
|
||||
|
||||
query = "select a.ip_addr from allocationinfo a, vlaninfo v where a.vlan_id = v.vlan_id and v.vlan_num = " + str(vlan);
|
||||
result = self.__selectDb(query)
|
||||
#print "row count is ", result.rowcount
|
||||
if result.rowcount > 0:
|
||||
for ip in xrange(ip_start, 255):
|
||||
ip_check = ip_base + "." + str(ip)
|
||||
check = self.isIpAvailable(ip_check, self.getVlanId(vlan))
|
||||
if check:
|
||||
ip_addr = ip_check
|
||||
break
|
||||
else:
|
||||
ip_addr = ip_base + "." + str(ip_start)
|
||||
#print "ip_addr", ip_addr
|
||||
|
||||
return ip_addr
|
||||
|
||||
|
||||
def showArchive(self):
|
||||
query = "select * from allocationarchive"
|
||||
result = self.__selectDb(query)
|
||||
for i in result:
|
||||
print i
|
||||
|
||||
def showAllocation(self, userId=None):
|
||||
#from IPython.Shell import IPShellEmbed
|
||||
#shell = IPShellEmbed(argv="")
|
||||
#shell(local_ns=locals(), global_ns=globals())
|
||||
|
||||
# specify usermanagement - ldap or files
|
||||
usermgt = usermanagement.ldap()
|
||||
|
||||
query = "select r.user_id, s.location, s.num_cores, s.mem_total, \
|
||||
r.reservation_expiration, r.notes, r.reservation_id, v.vlan_num, a.ip_addr, a.hostname,\
|
||||
a.notes, i.image_name \
|
||||
from allocationinfo a, sysinfo s, reservationinfo r, vlaninfo v, imageinfo i, imagemap m where \
|
||||
s.mac_addr = m.mac_addr and \
|
||||
m.image_id = i.image_id and \
|
||||
s.sys_id = a.node_id and \
|
||||
v.vlan_id = a.vlan_id and \
|
||||
r.reservation_id = a.reservation_id "
|
||||
if userId:
|
||||
myid = userId
|
||||
if type(userId) == str:
|
||||
# convert username to id
|
||||
myid = usermgt.getUserId(userId)
|
||||
|
||||
query += " and user_id = " + myid + " "
|
||||
|
||||
query += "order by r.reservation_id asc, s.location"
|
||||
|
||||
result = self.__selectDb(query)
|
||||
|
||||
print "NODE ALLOCATION"
|
||||
print "---------------------------------------------------------------------------------"
|
||||
if self.verbose:
|
||||
#print "Res_id\tUser \tNode \tCores\tMemory \tExpiration\t\tVLAN\tHOSTNAME \tIPADDR \t\tReservationNotes|AllocationNotes"
|
||||
print "%-5s%-10s%-10s%-12s%-12s%-5s%-15s%-18s%-24s%s" % ("Res", "User", "Host", "Cores/Mem","Expiration", "Vlan", "Hostname", "IP Addr", "Boot Image Name", "Notes")
|
||||
else:
|
||||
print "%-10s%-10s%-12s%-12s%s" % ("User", "Node", "Cores/Mem","Expiration", "Notes")
|
||||
|
||||
for i in result.fetchall():
|
||||
uid = i[0]
|
||||
host = i[1]
|
||||
cores = i[2]
|
||||
memory = i[3]
|
||||
expire = str(i[4])[0:10]
|
||||
if expire == "None":
|
||||
expire = "0000-00-00"
|
||||
rnotes = i[5]
|
||||
resId= i[6]
|
||||
vlanId= i[7]
|
||||
ip_addr = i[8]
|
||||
hostname = i[9]
|
||||
anotes = i[10]
|
||||
image_name = i[11]
|
||||
userName = usermgt.getUserName(uid)
|
||||
combined_notes = str(rnotes) + "|" + str(anotes)
|
||||
if self.verbose:
|
||||
#print "%s\t%s \t%s \t%s\t%s \t%s\t%s\t%s \t%s \t%s" % (resId, userName, host, cores, memory,expire, vlanId, hostname, ip_addr, combined_notes)
|
||||
print "%-5s%-10s%-10s%-2s%-10s%-12s%-5s%-15s%-18s%-24s%s" % (resId, userName, host, cores, memory,expire, vlanId, hostname, ip_addr, image_name, combined_notes)
|
||||
else:
|
||||
print "%-10s%-10s%-2s%-10s%-12s%s" % (userName, host, cores, memory,expire, combined_notes)
|
||||
print "---------------------------------------------------------------------------------"
|
||||
print str(result.rowcount) + " systems returned"
|
||||
|
||||
def showReservation(self, userId=None):
|
||||
#from IPython.Shell import IPShellEmbed
|
||||
#shell = IPShellEmbed(argv="")
|
||||
#shell(local_ns=locals(), global_ns=globals())
|
||||
|
||||
# specify usermanagement - ldap or files
|
||||
usermgt = usermanagement.ldap()
|
||||
|
||||
query = "select reservation_id, user_id, \
|
||||
reservation_expiration, notes \
|
||||
from reservationinfo order by reservation_id"
|
||||
if self.verbose:
|
||||
query = "select r.reservation_id, r.user_id, r.reservation_expiration, r.notes, count(a.reservation_id) \
|
||||
from reservationinfo r, allocationinfo a \
|
||||
where r.reservation_id = a.reservation_id \
|
||||
group by r.reservation_id order by reservation_id"
|
||||
#if userId:
|
||||
#myid = userId
|
||||
#if type(userId) == str:
|
||||
## convert username to id
|
||||
#myid = usermgt.getUserId(userId)
|
||||
|
||||
#query += " and user_id = " + myid + " "
|
||||
|
||||
#query += "order by r.user_id, s.location"
|
||||
|
||||
result = self.__selectDb(query)
|
||||
|
||||
print "RESERVATIONS"
|
||||
print "---------------------------------------------------------------------------------"
|
||||
if self.verbose:
|
||||
print "%-7s%-10s%-12s%-7s%s" % ("ResId", "UserName", "Expire", "Total", "Notes")
|
||||
else:
|
||||
print "%-7s%-10s%-12s%s" % ("ResId", "UserName", "Expire", "Notes")
|
||||
|
||||
total = 0
|
||||
for i in result.fetchall():
|
||||
resId= i[0]
|
||||
uid = i[1]
|
||||
expire = str(i[2])[0:10]
|
||||
if expire == "None":
|
||||
expire = "0000-00-00"
|
||||
notes = i[3]
|
||||
userName = usermgt.getUserName(uid)
|
||||
if self.verbose:
|
||||
num_nodes = i[4]
|
||||
total += num_nodes
|
||||
#print "%s \t%s \t%s\t%s\t\t%s " % (resId, userName, expire, num_nodes, notes)
|
||||
print "%-7s%-10s%-12s%-7s%s" % (resId, userName, expire, num_nodes, notes)
|
||||
else:
|
||||
print "%-7s%-10s%-12s%s" % (resId, userName, expire, notes)
|
||||
if self.verbose:
|
||||
print "---------------------------------------------------------------------------------"
|
||||
print "Total number of nodes - %s" % (total)
|
||||
|
||||
|
||||
def getPxeImages(self):
|
||||
cursor = self.conn.cursor ()
|
||||
line = "select image_name from imageinfo"
|
||||
cursor.execute (line)
|
||||
row = cursor.fetchall()
|
||||
desc = cursor.description
|
||||
|
||||
imagelist = []
|
||||
for i in row:
|
||||
imagelist.append(i[0])
|
||||
|
||||
return imagelist
|
||||
|
||||
|
||||
def showPxeImages(self):
|
||||
cursor = self.conn.cursor ()
|
||||
line = "select image_name, dist, dist_ver from imageinfo"
|
||||
cursor.execute (line)
|
||||
row = cursor.fetchall()
|
||||
desc = cursor.description
|
||||
|
||||
for i in row:
|
||||
print i
|
||||
|
||||
cursor.close ()
|
||||
|
||||
def showPxeImagesToSystemMap(self, cmdargs):
|
||||
extra = "l.mac_addr = j.mac_addr and j.image_id = i.image_id"
|
||||
queryopt = self.__create_queryopts(cmdargs, extra=extra)
|
||||
print queryopt
|
||||
|
||||
query = "select l.location, j.mac_addr, i.image_name from sysinfo l , imageinfo i, imagemap j " + queryopt + " order by l.location"
|
||||
#print query
|
||||
result = self.__selectDb(query)
|
||||
|
||||
for i in result.fetchall():
|
||||
print i
|
||||
|
||||
def close(self):
|
||||
self.conn.close()
|
||||
|
||||
def getHwAccessMethod(self):
|
||||
pass
|
||||
|
||||
mylist = []
|
||||
|
||||
return mylist
|
||||
|
||||
def getHostInfo(self, node):
|
||||
host = {}
|
||||
query = "select * from sysinfo where location = \"" + node + "\""
|
||||
#print "query is ", query
|
||||
result = self.__selectDb(query)
|
||||
if result.rowcount > 1:
|
||||
print "Mulitple entries for system exist. Please correct"
|
||||
exit()
|
||||
if result.rowcount < 1:
|
||||
mesg = "node does not exist :" + str(node) + "\n"
|
||||
sys.stderr.write(mesg)
|
||||
exit()
|
||||
|
||||
for i in result.fetchall():
|
||||
host['mac_addr'] = host.get("mac_addr", "")
|
||||
host['node_id'] = int(i[0])
|
||||
host['mac_addr'] = i[1]
|
||||
host['num_procs'] = int(i[2])
|
||||
host['num_cores'] = int(i[3])
|
||||
host['mem_total'] = int(i[6])
|
||||
host['clock_speed'] = int(i[8])
|
||||
host['sys_vendor'] = i[9]
|
||||
host['sys_model'] = i[10]
|
||||
host['proc_vendor'] = i[11]
|
||||
host['proc_model'] = i[12]
|
||||
host['proc_cache'] = i[13]
|
||||
host['cpu_flags'] = i[15]
|
||||
host['bios_rev'] = i[17]
|
||||
host['location'] = i[16]
|
||||
host['dell_tag'] = host.get("dell_tag", "")
|
||||
host['dell_tag'] = i[14]
|
||||
'''
|
||||
for k, v in host.iteritems():
|
||||
print k, v, "\n"
|
||||
'''
|
||||
|
||||
# Get IPMI info
|
||||
query = "select * from ipmiinfo where node_id = " + str(host['node_id']) + ""
|
||||
result = self.__selectDb(query)
|
||||
if result.rowcount> 1:
|
||||
print "Mulitple entries for system exist. Please correct"
|
||||
exit()
|
||||
for i in result.fetchall():
|
||||
host['ipmi_user'] = i[2]
|
||||
host['ipmi_password'] = i[3]
|
||||
host['ipmi_addr'] = i[1]
|
||||
|
||||
# Get image info
|
||||
query = "select image_name from imagemap i, imageinfo j where i.image_id = j.image_id and mac_addr = \"" + host['mac_addr'] + "\""
|
||||
result = self.__selectDb(query)
|
||||
if result.rowcount == 0:
|
||||
host['pxe_image_name'] = "None"
|
||||
else:
|
||||
for i in result.fetchall():
|
||||
host['pxe_image_name'] = i[0]
|
||||
|
||||
# Get switch info
|
||||
query = "select h.hw_id, h.hw_name, h.hw_model, h.hw_ipaddr, h.hw_userid, h.hw_password, p.port_num from hardwareinfo h, portmap p where p.hw_id = h.hw_id and hw_type = 'switch' and node_id = " + str(host['node_id'])
|
||||
result = self.__selectDb(query)
|
||||
for i in result.fetchall():
|
||||
host['hw_id'] = int(i[0])
|
||||
host['hw_name'] = i[1]
|
||||
host['hw_model'] = i[2]
|
||||
host['hw_ipaddr'] = i[3]
|
||||
host['hw_userid'] = i[4]
|
||||
host['hw_password'] = i[5]
|
||||
host['hw_port'] = int(i[6])
|
||||
|
||||
# Get drac info
|
||||
query = "select h.hw_id, h.hw_name, h.hw_model, h.hw_ipaddr, h.hw_userid, h.hw_password, p.port_num from hardwareinfo h, portmap p where p.hw_id = h.hw_id and hw_type = 'drac' and node_id = " + str(host['node_id'])
|
||||
result = self.__selectDb(query)
|
||||
if result.rowcount > 0:
|
||||
for i in result.fetchall():
|
||||
host['drac_id'] = int(i[0])
|
||||
host['drac_name'] = i[1]
|
||||
host['drac_model'] = i[2]
|
||||
host['drac_ipaddr'] = i[3]
|
||||
host['drac_userid'] = i[4]
|
||||
host['drac_password'] = i[5]
|
||||
host['drac_port'] = int(i[6])
|
||||
|
||||
# Get PDU info
|
||||
query = "select h.hw_id, h.hw_name, h.hw_model, h.hw_ipaddr, h.hw_userid, h.hw_password, p.port_num from hardwareinfo h, portmap p where p.hw_id = h.hw_id and hw_type = 'pdu' and node_id = " + str(host['node_id'])
|
||||
result = self.__selectDb(query)
|
||||
for i in result.fetchall():
|
||||
host['pdu_id'] = int(i[0])
|
||||
host['pdu_name'] = i[1]
|
||||
host['pdu_model'] = i[2]
|
||||
host['pdu_ipaddr'] = i[3]
|
||||
host['pdu_userid'] = i[4]
|
||||
host['pdu_password'] = i[5]
|
||||
host['pdu_port'] = int(i[6])
|
||||
|
||||
|
||||
#print "host is ", host
|
||||
return host
|
||||
|
||||
def getSwitchInfo(self, switchName):
|
||||
host = {}
|
||||
# Get switch info
|
||||
#switchList = self.getAllSwitches()
|
||||
query = "select h.hw_id, h.hw_name, h.hw_model, h.hw_ipaddr, h.hw_userid, h.hw_password from hardwareinfo h where h.hw_name = \"" + str(switchName) + "\""
|
||||
#print "query is ", query
|
||||
result = self.__selectDb(query)
|
||||
#desc = cursor.description
|
||||
for i in result.fetchall():
|
||||
host['hw_id'] = int(i[0])
|
||||
host['hw_name'] = i[1]
|
||||
host['hw_model'] = i[2]
|
||||
host['hw_ipaddr'] = i[3]
|
||||
host['hw_userid'] = i[4]
|
||||
host['hw_password'] = i[5]
|
||||
return host
|
||||
|
||||
def __queryDb(self, query):
|
||||
cursor = self.conn.cursor()
|
||||
cursor.execute (query)
|
||||
row = cursor.fetchall()
|
||||
desc = cursor.description
|
||||
return row
|
||||
|
||||
def execQuery(self, query):
|
||||
cursor = self.conn.cursor()
|
||||
try:
|
||||
cursor.execute (query)
|
||||
#except Exception:
|
||||
#traceback.print_exc(sys.exc_info())
|
||||
except MySQLdb.OperationalError, e:
|
||||
msg = "ERROR: " + e[1]
|
||||
sys.stderr.write(msg)
|
||||
logit(self.logFile, msg)
|
||||
#traceback.print_exc(sys.exc_info())
|
||||
exit()
|
||||
return cursor
|
||||
|
||||
def __selectDb(self, query):
|
||||
cursor = self.conn.cursor()
|
||||
try:
|
||||
cursor.execute (query)
|
||||
#except Exception:
|
||||
#traceback.print_exc(sys.exc_info())
|
||||
except MySQLdb.OperationalError, e:
|
||||
msg = "ERROR: " + e[1]
|
||||
sys.stderr.write(msg)
|
||||
logit(self.logFile, msg)
|
||||
#traceback.print_exc(sys.exc_info())
|
||||
exit()
|
||||
return cursor
|
||||
|
||||
def __updateDb(self, query):
|
||||
cursor = self.conn.cursor()
|
||||
try:
|
||||
cursor.execute (query)
|
||||
except MySQLdb.OperationalError, e:
|
||||
msg = "ERROR: " + e[1]
|
||||
sys.stderr.write(msg)
|
||||
logit(self.logFile, msg)
|
||||
#traceback.print_exc(sys.exc_info())
|
||||
exit()
|
||||
|
||||
def __insertDb(self, query):
|
||||
cursor = self.conn.cursor()
|
||||
try:
|
||||
cursor.execute (query)
|
||||
#except Exception:
|
||||
#traceback.print_exc(sys.exc_info())
|
||||
except MySQLdb.OperationalError, e:
|
||||
msg = "ERROR: " + e[1]
|
||||
sys.stderr.write(msg)
|
||||
logit(self.logFile, msg)
|
||||
#traceback.print_exc(sys.exc_info())
|
||||
exit()
|
||||
|
||||
|
||||
def updateReservation (self, reservationId, userId=None, reservationDuration=None, vlanIsolate=None, allocationNotes=None):
|
||||
|
||||
|
||||
mesg = "Updating reservation"
|
||||
logit(self.logFile, mesg)
|
||||
|
||||
if reservationDuration:
|
||||
if len(resDuration) == 8:
|
||||
expireDate = resDuration
|
||||
elif len(resDuration) < 4:
|
||||
numdays = resDuration
|
||||
cmd = "date +%Y%m%d --date=\"" + numdays + " day\""
|
||||
p = os.popen(cmd)
|
||||
expireDate = string.strip(p.read())
|
||||
else:
|
||||
mesg = "ERROR: Invalid reservation duration\n"
|
||||
sys.stderr.write(mesg)
|
||||
logit(self.logFile, mesg)
|
||||
exit()
|
||||
|
||||
mesg = "Updating reservationDuration :" + resDuration
|
||||
logit(self.logFile, mesg)
|
||||
query = "update reservationinfo set reservation_exiration = \"" + expireDate_ + "\" where reservation_id = \"" + str(reservationId) + "\""
|
||||
self.__updateDb(query)
|
||||
|
||||
if allocationNotes:
|
||||
mesg = "Updating allocationNotes to " + allocationNotes
|
||||
logit(self.logFile, mesg)
|
||||
query = "update reservationinfo set notes = \"" + allocationNotes + "\" where reservation_id = \"" + str(reservationId) + "\""
|
||||
self.__updateDb(query)
|
||||
if vlanIsolate:
|
||||
mesg = "UPDATING Vlan: "
|
||||
logit(self.logFile, mesg)
|
||||
query = "update reservationinfo set vlan_num = " + vlanIsolate + " where reservation_id = \"" + str(reservationId) + "\""
|
||||
print "query is ", query
|
||||
self.__updateDb(query)
|
||||
if userId:
|
||||
mesg = "UPDATING USER:"
|
||||
logit(self.logFile, mesg)
|
||||
query = "update reservationinfo set user_id = " + userId + " where reservation_id = \"" + str(reservationId) + "\""
|
||||
self.__updateDb(query)
|
||||
|
||||
def addReservation (self, userId, reservationDuration=None, reservationNotes=None):
|
||||
|
||||
# set default for reservation duration to 15 days
|
||||
if not reservationDuration:
|
||||
resDuration = str(15)
|
||||
else:
|
||||
resDuration = str(reservationDuration)
|
||||
|
||||
|
||||
if len(resDuration) == 8:
|
||||
expireDate = resDuration
|
||||
elif len(resDuration) < 4:
|
||||
numdays = resDuration
|
||||
cmd = "date +%Y%m%d --date=\"" + numdays + " day\""
|
||||
p = os.popen(cmd)
|
||||
expireDate = string.strip(p.read())
|
||||
else:
|
||||
mesg = "ERROR: Invalid reservation duration\n"
|
||||
sys.stderr.write(mesg)
|
||||
logit(self.logFile, mesg)
|
||||
exit()
|
||||
|
||||
# create reservation
|
||||
# Create the reservation
|
||||
print userId, expireDate,reservationNotes
|
||||
query = "insert into reservationinfo (user_id, reservation_expiration, notes) values (\"" + str(userId) + "\", " + str(expireDate) + ", \"" + reservationNotes + "\")"
|
||||
mesg = "Creating new reservation\n" + query
|
||||
logit(self.logFile, mesg)
|
||||
self.__selectDb(query)
|
||||
# Get the res_id
|
||||
query = "select max(reservation_id) from reservationinfo"
|
||||
res_id = self.__selectDb(query).fetchone()[0]
|
||||
mesg = " Reservation created - ID :" + str(res_id)
|
||||
logit(self.logFile, mesg)
|
||||
return res_id
|
||||
|
||||
|
||||
def archiveAllocation(self, nodeId, ip_addr, hostName, vlan_id, user_id, reservation_type, res_notes, notes):
|
||||
combined_notes = str(res_notes) + "|" + str(notes)
|
||||
mesg = "Insert to allocation archive:"
|
||||
query = "insert into allocationarchive (node_id, ip_addr, hostname, vlan_id, user_id, reservation_type, notes) \
|
||||
values (\"" + \
|
||||
str(nodeId) + "\", \"" + str(ip_addr) + "\", \"" + \
|
||||
str(hostName) + "\", \"" + str(vlan_id) + "\", \"" + \
|
||||
str(user_id) + "\", \"" + str(reservation_type) + "\", \"" + \
|
||||
str(combined_notes) + "\")"
|
||||
|
||||
self.__insertDb(query)
|
||||
|
||||
@checkSuper
|
||||
def allocateNode(self, reservationId, nodeId, hostName, vlanIsolate=None, ip_addr=None, notes=None):
|
||||
#print "nodeId", nodeId, self.getMacFromSysId(nodeId)
|
||||
|
||||
# Check if node is already allocated
|
||||
query = "select * from allocationinfo where node_id = \"" + str(nodeId) + "\""
|
||||
result = self.__selectDb(query)
|
||||
if result.rowcount > 0:
|
||||
val = str(result.fetchone())
|
||||
mesg = "ERROR: Node already allocated " + val + "\n"
|
||||
logit(self.logFile, mesg)
|
||||
exit()
|
||||
|
||||
|
||||
# Check if reservation exists
|
||||
|
||||
query = "select reservation_id, user_id, reservation_date, \
|
||||
reservation_expiration, notes from reservationinfo \
|
||||
where reservation_id = \"" + str(reservationId) + "\""
|
||||
result = self.__selectDb(query)
|
||||
|
||||
if result.rowcount > 0:
|
||||
res_results = result.fetchall()[0]
|
||||
val = str(res_results)
|
||||
res_id= res_results[0]
|
||||
user_id = res_results[1]
|
||||
res_notes = res_results[4]
|
||||
if self.verbose:
|
||||
mesg = "Reservation: " + val
|
||||
logit(self.logFile, mesg)
|
||||
else:
|
||||
mesg = "ERROR: Reservation does not exist: " + reservationId + "\n"
|
||||
logit(self.logFile, mesg)
|
||||
exit()
|
||||
|
||||
|
||||
if not vlanIsolate:
|
||||
vlan = self.getAvailableVlan()
|
||||
else:
|
||||
vlan = vlanIsolate
|
||||
|
||||
# Allocate nodes to the reservation
|
||||
# Reserve the node and assign to user
|
||||
vlan_id = self.getVlanId(vlan)
|
||||
if vlan != 999:
|
||||
if not ip_addr:
|
||||
ip_addr = self.getDomainIp(vlan)
|
||||
else:
|
||||
# Check to see if IP is free
|
||||
query = "select * from allocationinfo where ip_addr = \"" + str(ip_addr) + "\""
|
||||
result = self.__selectDb(query)
|
||||
if result.rowcount > 0:
|
||||
mesg = "ERROR: IP Address specified (" + str(ip_addr) + ") already in use\n"
|
||||
mesg += str(result.fetchone())
|
||||
logit(self.logFile, mesg)
|
||||
exit()
|
||||
else:
|
||||
ip_addr = self.getIpFromSysId(nodeId)
|
||||
#print "ip is ", ip_addr
|
||||
|
||||
# If there is no hostname, set to default
|
||||
if not hostName:
|
||||
hostName = self.getLocationFromSysId(nodeId)
|
||||
|
||||
#print "hostname is ", hostName, "ip is ", ip_addr, "vlan is ", vlan_id
|
||||
|
||||
# Assign IP address to node
|
||||
dhcpdns = DhcpDns(self.config, verbose=1)
|
||||
dnscheck = dhcpdns.addDhcp(hostName, ip_addr, self.getMacFromSysId(nodeId))
|
||||
dhcpdns.addDns(hostName, ip_addr)
|
||||
|
||||
|
||||
mesg = "Insert to Node allocation:"
|
||||
query = "insert into allocationinfo (reservation_id, node_id, ip_addr, hostname, vlan_id, notes) \
|
||||
values (\"" + str(reservationId) + "\", \"" + str(nodeId) + "\", \"" + \
|
||||
str(ip_addr) + "\", \"" + str(hostName) + "\", \"" + str(vlan_id) + "\", \"" + \
|
||||
str(notes) + "\")"
|
||||
self.__insertDb(query)
|
||||
|
||||
#Archive
|
||||
reservation_type = "allocation"
|
||||
self.archiveAllocation(nodeId, ip_addr, hostName, vlan_id, user_id, reservation_type, res_notes, notes)
|
||||
|
||||
|
||||
def rgasstest(self, vlan_num):
|
||||
query = "select * from vlaninfo where vlan_num = " + vlan_num
|
||||
res = self.__selectDb(query).fetchall()
|
||||
print res
|
||||
|
||||
|
||||
|
||||
def removeReservation(self, res):
|
||||
query = "delete from reservationinfo where reservation_id = " + str(res)
|
||||
self.__updateDb(query)
|
||||
query = "delete from allocationinfo where reservation_id = " + str(res)
|
||||
self.__updateDb(query)
|
||||
|
||||
@checkSuper
|
||||
def releaseNode(self, nodeName):
|
||||
# Get the nodeId
|
||||
query = "select node_id, r.reservation_id, a.ip_addr, hostname, vlan_id, a.notes, r.notes,r.user_id from allocationinfo a, sysinfo s, reservationinfo r where a.node_id = s.sys_id and a.reservation_id = r.reservation_id and location = \"" + nodeName + "\""
|
||||
print query
|
||||
result = self.__selectDb(query)
|
||||
if result.rowcount == 0:
|
||||
mesg = "ERROR: Node not allocated\n"
|
||||
sys.stderr.write(mesg)
|
||||
exit(1)
|
||||
if result.rowcount > 1:
|
||||
mesg = "WARNING: Node allocated multiple times (" + str(result.rowcount) + ")"
|
||||
logit(self.logFile, mesg)
|
||||
|
||||
val = result.fetchone()
|
||||
nodeId = int(val[0])
|
||||
resId = int(val[1])
|
||||
ip_addr = val[2]
|
||||
hostName = val[3]
|
||||
vlan_id = int(val[4])
|
||||
allocation_notes = val[5]
|
||||
reservation_notes = val[6]
|
||||
user_id = val[7]
|
||||
|
||||
print "hostname is ", hostName
|
||||
# Assign IP address to node
|
||||
dhcpdns = DhcpDns(self.config, verbose=1)
|
||||
dnscheck = dhcpdns.removeDns(hostName)
|
||||
dhcpdns.removeDhcp(hostName)
|
||||
|
||||
'''
|
||||
query = "select reservation_id, notes from reservationinfo where node_id = " + str(nodeId)
|
||||
result = self.__selectDb(query)
|
||||
for i in result:
|
||||
print i
|
||||
print result.rowcount
|
||||
if result.rowcount == 0:
|
||||
mesg = "No Reservation for this node.\n Please check"
|
||||
logit(self.logFile, mesg)
|
||||
exit(1)
|
||||
if result.rowcount > 1:
|
||||
mesg = "WARNING: Muliple reservations exist (" + str(result.rowcount) + ")"
|
||||
logit(self.logFile, mesg)
|
||||
|
||||
resId = int(result.fetchone()[0])
|
||||
res_notes = int(result.fetchone()[1])
|
||||
|
||||
print resId, res_notes
|
||||
'''
|
||||
|
||||
# Eventually should add count =1 so deletes do get out of control
|
||||
query = "delete from allocationinfo where reservation_id = " + str(resId) + " and node_id = " + str(nodeId)
|
||||
result = self.__selectDb(query)
|
||||
|
||||
# Archive node release
|
||||
reservation_type = "release"
|
||||
self.archiveAllocation(nodeId, ip_addr, hostName, vlan_id, user_id, reservation_type, reservation_notes, allocation_notes)
|
||||
|
||||
def addImage(self, imageName):
|
||||
name = ""
|
||||
dist = ""
|
||||
dist_ver = ""
|
||||
|
||||
if len(imageName.split(":")) > 1:
|
||||
name = imageName.split(":")[0]
|
||||
if len(imageName.split(":")) > 2:
|
||||
dist = imageName.split(":")[1]
|
||||
if len(imageName.split(":")) >= 3:
|
||||
dist_ver = imageName.split(":")[2]
|
||||
|
||||
query = "select * from imageinfo where image_name = \"" + name + "\""
|
||||
result = self.__selectDb(query)
|
||||
if result.rowcount > 0:
|
||||
mesg = "ERROR: Image already exists\n"
|
||||
sys.stderr.write(mesg)
|
||||
exit()
|
||||
|
||||
if name == "":
|
||||
mesg = "ERROR: Image details not specified\n"
|
||||
logit(self.logFile, mesg)
|
||||
mesg = "Example amd64-rgass-testing:Ubuntu:8.04\n"
|
||||
mesg += "or amd64-rgass-testing::\n"
|
||||
sys.stderr.write(mesg)
|
||||
exit()
|
||||
|
||||
query = "insert into imageinfo (image_name, dist, dist_ver) values(\"" + name + "\", \"" + dist + "\", \"" + dist_ver + "\")"
|
||||
self.__insertDb(query)
|
||||
|
||||
|
||||
def delImage(self, imageName):
|
||||
query = "delete from imageinfo where image_name = \"" + imageName + "\""
|
||||
result = self.__selectDb(query)
|
||||
if result.rowcount == 0:
|
||||
mesg = "ERROR: No images match your entry\n"
|
||||
sys.stderr.write(mesg)
|
||||
exit()
|
||||
|
||||
def assignImagetoHost(self, host, image):
|
||||
# imagemap db should be sys_id instead of mac_addr
|
||||
# change later
|
||||
|
||||
cur_image = host['pxe_image_name']
|
||||
# Get the id of the new image
|
||||
query = "select image_id from imageinfo where image_name = " + "\"" + image + "\""
|
||||
row = self.__queryDb(query)
|
||||
if len(row) < 1:
|
||||
mesg = "ERROR: Image \"" + image + "\" does not exist"
|
||||
logit(self.logFile, mesg)
|
||||
exit()
|
||||
new_image_id = str(row[0][0])
|
||||
|
||||
# check for entry and delete in exists
|
||||
query = "select * from imagemap where mac_addr = \"" + host['mac_addr'] + "\""
|
||||
result = self.__selectDb(query)
|
||||
if result.rowcount > 0:
|
||||
query = "delete from imagemap where mac_addr = \"" + host['mac_addr'] + "\""
|
||||
result = self.__selectDb(query)
|
||||
|
||||
|
||||
# update the database entry with the new image for the host
|
||||
query = "insert into imagemap (mac_addr, image_id) values (\"" + host['mac_addr'] + "\", " + new_image_id + ")"
|
||||
self.__selectDb(query)
|
||||
|
||||
|
||||
# Update tftp link
|
||||
mac_addr = "01-" + string.lower(string.replace(host['mac_addr'], ":", "-"))
|
||||
maclink = self.tftpImageDir + "/" + mac_addr
|
||||
#print "mac link is ", maclink
|
||||
# Check if it exists first
|
||||
if os.path.exists(maclink):
|
||||
try:
|
||||
os.unlink(maclink)
|
||||
except Exception, e:
|
||||
traceback.print_exc(sys.exc_info())
|
||||
if OSError:
|
||||
print OSError
|
||||
mesg = "Cannot modify file. Please use sudo\n"
|
||||
sys.stderr.write(mesg)
|
||||
return 1
|
||||
print e
|
||||
return 1
|
||||
# Relink
|
||||
newlink = os.path.basename(self.tftpBootOptionsDir) + "/" + image
|
||||
try:
|
||||
os.symlink(newlink, maclink)
|
||||
mesg = "Image assignment Successful " + host['location'] + " " + host['mac_addr'] + " " + image
|
||||
logit(self.logFile, mesg)
|
||||
except Exception, e:
|
||||
if OSError:
|
||||
mesg = "Cannot modify file. Please use sudo\n"
|
||||
sys.stderr.write(mesg)
|
||||
return 1
|
||||
print e
|
||||
return 1
|
||||
|
||||
return 0
|
||||
|
31
ssh/zoni-cli/systemassignment.py
Normal file
31
ssh/zoni-cli/systemassignment.py
Normal file
|
@ -0,0 +1,31 @@
|
|||
# Licensed to the Apache Software Foundation (ASF) under one
|
||||
# or more contributor license agreements. See the NOTICE file
|
||||
# distributed with this work for additional information
|
||||
# regarding copyright ownership. The ASF licenses this file
|
||||
# to you under the Apache License, Version 2.0 (the
|
||||
# "License"); you may not use this file except in compliance
|
||||
# with the License. You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing,
|
||||
# software distributed under the License is distributed on an
|
||||
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
# KIND, either express or implied. See the License for the
|
||||
# specific language governing permissions and limitations
|
||||
# under the License.
|
||||
#
|
||||
# $Id$
|
||||
#
|
||||
|
||||
|
||||
class SystemAssignment():
|
||||
|
||||
|
||||
def addDns():
|
||||
pass
|
||||
|
||||
def assignPxeImage():
|
||||
pass
|
||||
|
||||
|
64
ssh/zoni-cli/systemmanagementinterface.py
Normal file
64
ssh/zoni-cli/systemmanagementinterface.py
Normal file
|
@ -0,0 +1,64 @@
|
|||
# Licensed to the Apache Software Foundation (ASF) under one
|
||||
# or more contributor license agreements. See the NOTICE file
|
||||
# distributed with this work for additional information
|
||||
# regarding copyright ownership. The ASF licenses this file
|
||||
# to you under the Apache License, Version 2.0 (the
|
||||
# "License"); you may not use this file except in compliance
|
||||
# with the License. You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing,
|
||||
# software distributed under the License is distributed on an
|
||||
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
# KIND, either express or implied. See the License for the
|
||||
# specific language governing permissions and limitations
|
||||
# under the License.
|
||||
#
|
||||
# $Id$
|
||||
#
|
||||
|
||||
import sys
|
||||
import os
|
||||
|
||||
|
||||
class SystemManagementInterface(object):
|
||||
""" Interface description for hardware management controllers
|
||||
- IPMI
|
||||
- IOL
|
||||
"""
|
||||
def __init__(self, config):
|
||||
self.config = config
|
||||
|
||||
|
||||
def getPowerStatus(self):
|
||||
raise NotImplementedError
|
||||
|
||||
def isPowered(self):
|
||||
''' Return boolean if system is powered on or not '''
|
||||
raise NotImplementedError
|
||||
|
||||
def powerOn(self):
|
||||
''' Powers on a system '''
|
||||
raise NotImplementedError
|
||||
|
||||
def powerOff(self):
|
||||
''' Powers off a system '''
|
||||
raise NotImplementedError
|
||||
|
||||
def powerCycle(self):
|
||||
''' Powers cycles a system '''
|
||||
raise NotImplementedError
|
||||
|
||||
def powerReset(self):
|
||||
''' Resets a system '''
|
||||
raise NotImplementedError
|
||||
|
||||
def activateConsole(self):
|
||||
''' Activate Console'''
|
||||
raise NotImplementedError
|
||||
|
||||
|
||||
|
||||
|
||||
|
121
ssh/zoni-cli/usermanagement.py
Normal file
121
ssh/zoni-cli/usermanagement.py
Normal file
|
@ -0,0 +1,121 @@
|
|||
# Licensed to the Apache Software Foundation (ASF) under one
|
||||
# or more contributor license agreements. See the NOTICE file
|
||||
# distributed with this work for additional information
|
||||
# regarding copyright ownership. The ASF licenses this file
|
||||
# to you under the Apache License, Version 2.0 (the
|
||||
# "License"); you may not use this file except in compliance
|
||||
# with the License. You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing,
|
||||
# software distributed under the License is distributed on an
|
||||
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
# KIND, either express or implied. See the License for the
|
||||
# specific language governing permissions and limitations
|
||||
# under the License.
|
||||
#
|
||||
# $Id$
|
||||
#
|
||||
|
||||
import sys
|
||||
import os
|
||||
|
||||
from usermanagementinterface import UserManagementInterface
|
||||
import time
|
||||
def timeF(f):
|
||||
def myF(*args, **kw):
|
||||
start = time.time()
|
||||
res = f(*args, **kw)
|
||||
end = time.time()
|
||||
print "%s took %f" % (f.__name__, end-start)
|
||||
return res
|
||||
myF.__name__ = f.__name__
|
||||
return myF
|
||||
|
||||
class ldap(UserManagementInterface):
|
||||
#@timeF
|
||||
def __init__(self):
|
||||
self.userCache = {}
|
||||
self.userCacheForward = {}
|
||||
self.userCacheReverse= {}
|
||||
cmd = "getent passwd "
|
||||
a = os.popen(cmd)
|
||||
for user in a.readlines():
|
||||
uid = int(user.split(":")[2])
|
||||
username = user.split(":")[0]
|
||||
name = user.split(":")[4]
|
||||
self.userCacheForward[username] = self.userCacheForward.get(username, {})
|
||||
self.userCacheForward[username]['name'] = self.userCacheForward[username].get("name", name)
|
||||
self.userCacheForward[username]['uid'] = self.userCacheForward[username].get("uid", uid)
|
||||
|
||||
self.userCacheReverse[uid] = self.userCacheReverse.get(uid, {})
|
||||
self.userCacheReverse[uid]['name'] = self.userCacheReverse.get('name', name)
|
||||
self.userCacheReverse[uid]['username'] = self.userCacheReverse.get('username', username)
|
||||
|
||||
def getUserId(self, userName):
|
||||
#cmd = "getent passwd | grep " + userName
|
||||
#a = os.popen(cmd)
|
||||
#idlist = []
|
||||
#for user in a.readlines():
|
||||
#if userName in user:
|
||||
#idlist.append(user.split(":")[2])
|
||||
|
||||
val = self.userCacheForward.get(userName)
|
||||
if val:
|
||||
return val['uid']
|
||||
return val['username']
|
||||
|
||||
#if len(set(idlist)) == 0:
|
||||
#mesg = "ERROR: User " + userName + " does not exist\n"
|
||||
#sys.stderr.write(mesg)
|
||||
#exit()
|
||||
#elif len(set(idlist)) == 1:
|
||||
#return idlist[0]
|
||||
#else:
|
||||
#print idlist
|
||||
#mesg = "ERROR: Multiple entries exist! Choose one and use the --uid option"
|
||||
#sys.stderr.write(mesg)
|
||||
#exit()
|
||||
|
||||
def getUserName(self, userId):
|
||||
|
||||
# Check the cache
|
||||
val = self.userCacheReverse.get(userId)
|
||||
if val:
|
||||
return val['username']
|
||||
return userId
|
||||
|
||||
''' the old way
|
||||
val = self.userCache.get(userId)
|
||||
if val:
|
||||
return self.userCache[userId]
|
||||
|
||||
cmd = "getent passwd | grep " + str(userId)
|
||||
a = os.popen(cmd)
|
||||
idlist = []
|
||||
for user in a.readlines():
|
||||
idlist.append(user.split(":")[0])
|
||||
|
||||
if len(idlist) > 0:
|
||||
# Cache the info to speed things up
|
||||
self.userCache[userId] = idlist[0]
|
||||
|
||||
return idlist[0]
|
||||
|
||||
return userId
|
||||
'''
|
||||
|
||||
def getGroupId(self):
|
||||
pass
|
||||
|
||||
class files(UserManagementInterface):
|
||||
def __init__(self):
|
||||
raise NotImplementedError
|
||||
|
||||
|
||||
def getUserId(self):
|
||||
raise NotImplementedError
|
||||
|
||||
def getGroupId(self):
|
||||
raise NotImplementedError
|
42
ssh/zoni-cli/usermanagementinterface.py
Normal file
42
ssh/zoni-cli/usermanagementinterface.py
Normal file
|
@ -0,0 +1,42 @@
|
|||
# Licensed to the Apache Software Foundation (ASF) under one
|
||||
# or more contributor license agreements. See the NOTICE file
|
||||
# distributed with this work for additional information
|
||||
# regarding copyright ownership. The ASF licenses this file
|
||||
# to you under the Apache License, Version 2.0 (the
|
||||
# "License"); you may not use this file except in compliance
|
||||
# with the License. You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing,
|
||||
# software distributed under the License is distributed on an
|
||||
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
# KIND, either express or implied. See the License for the
|
||||
# specific language governing permissions and limitations
|
||||
# under the License.
|
||||
#
|
||||
# $Id$
|
||||
#
|
||||
|
||||
import sys
|
||||
import os
|
||||
|
||||
|
||||
class UserManagementInterface(object):
|
||||
""" Interface description for user management
|
||||
- ldap
|
||||
- passwd
|
||||
"""
|
||||
def __init__(self, config):
|
||||
self.config = config
|
||||
|
||||
|
||||
def getUserId(self, userName):
|
||||
raise NotImplementedError
|
||||
|
||||
def getUserName(self, userId):
|
||||
raise NotImplementedError
|
||||
|
||||
def getGroupId(self, userId):
|
||||
raise NotImplementedError
|
||||
|
79
ssh/zoni-cli/util.py
Normal file
79
ssh/zoni-cli/util.py
Normal file
|
@ -0,0 +1,79 @@
|
|||
# Licensed to the Apache Software Foundation (ASF) under one
|
||||
# or more contributor license agreements. See the NOTICE file
|
||||
# distributed with this work for additional information
|
||||
# regarding copyright ownership. The ASF licenses this file
|
||||
# to you under the Apache License, Version 2.0 (the
|
||||
# "License"); you may not use this file except in compliance
|
||||
# with the License. You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing,
|
||||
# software distributed under the License is distributed on an
|
||||
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
# KIND, either express or implied. See the License for the
|
||||
# specific language governing permissions and limitations
|
||||
# under the License.
|
||||
#
|
||||
# $Id$
|
||||
#
|
||||
|
||||
import ConfigParser
|
||||
import time
|
||||
|
||||
def loadConfigFile(filename):
|
||||
parser = ConfigParser.ConfigParser()
|
||||
parser.read(filename)
|
||||
config = {}
|
||||
# Logging
|
||||
config['logFile'] = parser.get("logging", "LOG_FILE").split()[0]
|
||||
|
||||
# DB connection
|
||||
config['dbUser'] = parser.get("dbConnection", "DB_USER").split()[0]
|
||||
config['dbPassword'] = config.get("dbPassword", "")
|
||||
if not parser.get("dbConnection", "DB_PASSWORD") == "":
|
||||
config['dbPassword'] = parser.get("dbConnection", "DB_PASSWORD").strip("\",'")
|
||||
config['dbHost'] = parser.get("dbConnection", "DB_HOST").split()[0]
|
||||
config['dbPort'] = int(parser.get("dbConnection", "DB_PORT").split()[0])
|
||||
config['dbInst'] = parser.get("dbConnection", "DB_INST").split()[0]
|
||||
|
||||
# TFTP info
|
||||
config['tftpRootDir'] = parser.get("tftp", "TFTP_ROOT_DIR").split()[0]
|
||||
config['tftpImageDir'] = parser.get("tftp", "TFTP_IMAGE_DIR").split()[0]
|
||||
config['tftpBootOptionsDir'] = parser.get("tftp", "TFTP_BOOT_OPTIONS_DIR").split()[0]
|
||||
config['tftpUpdateFile'] = parser.get("tftp", "TFTP_UPDATE_FILE").split()[0]
|
||||
config['tftpBaseFile'] = parser.get("tftp", "TFTP_BASE_FILE").split()[0]
|
||||
config['tftpBaseMenuFile'] = parser.get("tftp", "TFTP_BASE_MENU_FILE").split()[0]
|
||||
|
||||
# SNMP
|
||||
config['snmpCommunity'] = parser.get("snmp", "SNMP_COMMUNITY").split()[0]
|
||||
|
||||
# VLAN
|
||||
config['vlan_reserved'] = parser.get("vlan", "VLAN_RESERVED")
|
||||
config['vlan_max'] = parser.get("vlan", "VLAN_MAX")
|
||||
|
||||
# HARDWARE CONTROL
|
||||
config['hardware_control'] = parser.get("hardware", "HARDWARE_CONTROL")
|
||||
|
||||
# DHCP/DNS
|
||||
config['dnsKeyFile'] = parser.get("DhcpDns", "dnsKeyfile")
|
||||
config['dnsServer'] = parser.get("DhcpDns", "dnsServer")
|
||||
config['dnsDomain'] = parser.get("DhcpDns", "dnsDomain")
|
||||
config['dnsExpire'] = parser.get("DhcpDns", "dnsExpire")
|
||||
config['dhcpServer'] = parser.get("DhcpDns", "dhcpServer")
|
||||
config['dhcpKeyName'] = parser.get("DhcpDns", "dhcpKeyName")
|
||||
config['dhcpSecretKey'] = parser.get("DhcpDns", "dhcpSecretKey")
|
||||
|
||||
#self.ap_model['radius'] = int(parser.get("wireless_range", "radius").split()[0])
|
||||
return config
|
||||
|
||||
def logit(logfile, mesg):
|
||||
fd = open(logfile, "a+");
|
||||
mesg = str(time.time()) + " " + mesg + "\n"
|
||||
fd.write(mesg);
|
||||
fd.close;
|
||||
#if verbose:
|
||||
print mesg
|
||||
fd.close
|
||||
|
||||
|
20
ssh/zoni-cli/version.py
Normal file
20
ssh/zoni-cli/version.py
Normal file
|
@ -0,0 +1,20 @@
|
|||
# Licensed to the Apache Software Foundation (ASF) under one
|
||||
# or more contributor license agreements. See the NOTICE file
|
||||
# distributed with this work for additional information
|
||||
# regarding copyright ownership. The ASF licenses this file
|
||||
# to you under the Apache License, Version 2.0 (the
|
||||
# "License"); you may not use this file except in compliance
|
||||
# with the License. You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing,
|
||||
# software distributed under the License is distributed on an
|
||||
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
# KIND, either express or implied. See the License for the
|
||||
# specific language governing permissions and limitations
|
||||
# under the License.
|
||||
|
||||
id = "$Id:$"
|
||||
version = "$LastChangedDate:$"
|
||||
revision = "$Rev:$"
|
486
ssh/zoni-cli/zoni-cli.py
Normal file
486
ssh/zoni-cli/zoni-cli.py
Normal file
|
@ -0,0 +1,486 @@
|
|||
# /usr/bin/env python
|
||||
#
|
||||
# Licensed to the Apache Software Foundation (ASF) under one
|
||||
# or more contributor license agreements. See the NOTICE file
|
||||
# distributed with this work for additional information
|
||||
# regarding copyright ownership. The ASF licenses this file
|
||||
# to you under the Apache License, Version 2.0 (the
|
||||
# "License"); you may not use this file except in compliance
|
||||
# with the License. You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing,
|
||||
# software distributed under the License is distributed on an
|
||||
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
# KIND, either express or implied. See the License for the
|
||||
# specific language governing permissions and limitations
|
||||
# under the License.
|
||||
#
|
||||
# $Id$
|
||||
#
|
||||
|
||||
import os
|
||||
import sys
|
||||
import optparse
|
||||
|
||||
|
||||
import resourcequerysql
|
||||
from systemmanagementinterface import SystemManagementInterface
|
||||
from ipmi import Ipmi
|
||||
from usermanagementinterface import UserManagementInterface
|
||||
|
||||
from bootmanagementinterface import BootManagementInterface
|
||||
import pxe
|
||||
from raritanpdu import raritanDominionPx
|
||||
from delldrac import dellDrac
|
||||
from util import *
|
||||
import version
|
||||
|
||||
from hwswitchinterface import HwSwitchInterface
|
||||
from hwswitch import HwDellSwitch
|
||||
|
||||
import usermanagement
|
||||
#from usermanagement import UserManagement
|
||||
|
||||
def parseTable():
|
||||
pass
|
||||
|
||||
def main():
|
||||
""" Main """
|
||||
ver = version.version.split(" ")[1]
|
||||
rev = version.revision
|
||||
|
||||
configFile = loadConfigFile("ZONI_DEFAULT.conf")
|
||||
#logit(configFile['logFile'], "Starting prs_client")
|
||||
#logit(configFile['logFile'], "Loading config file")
|
||||
|
||||
parser = optparse.OptionParser(usage="%prog [-n] [-u] [--uid] [-v]", version="%prog " + ver + " " + rev)
|
||||
parser.add_option("-n", "--nodeName", dest="nodeName", help="Specify node")
|
||||
parser.add_option("--switchPort", "--switchport", dest="switchPort", help="Specify switchport switchname:portnum")
|
||||
parser.add_option("-u", "--userName", dest="userName", help="Specify user name")
|
||||
parser.add_option("--uid", dest="uid", help="Specify user id")
|
||||
parser.add_option("-v", "--verbose", dest="verbosity", help="Be verbose", action="store_true", default=False)
|
||||
|
||||
|
||||
# Hardware controller
|
||||
group = optparse.OptionGroup(parser, "Hardware control", "Options to control power on nodes")
|
||||
group.add_option("--hw", dest="hardwareType", help="Make hardware call to ipmi|drac|pdu")
|
||||
group.add_option("--powerStatus", "--powerstatus", dest="POWERSTATUS", help="Get power status on node", action="store_true", default=False)
|
||||
group.add_option("--reboot", "--reboot", dest="REBOOTNODE", help="Reboot node (Soft)", action="store_true", default=False)
|
||||
group.add_option("--powerCycle", "--powercycle", dest="POWERCYCLE", help="Power Cycle (Hard)", action="store_true", default=False)
|
||||
group.add_option("--powerOff", "--poweroff", dest="POWEROFF", help="Power off node", action="store_true", default=False)
|
||||
group.add_option("--powerOn", "--poweron", dest="POWERON", help="Power on node", action="store_true", default=False)
|
||||
group.add_option("--powerReset", "--powerreset", dest="POWERRESET", help="Power reset node", action="store_true", default=False)
|
||||
group.add_option("--console", dest="CONSOLE", help="Console mode", action="store_true", default=False)
|
||||
parser.add_option_group(group)
|
||||
|
||||
# Query Interface
|
||||
group = optparse.OptionGroup(parser, "Query Interface", "Query current systems and allocations")
|
||||
group.add_option("-R", "--showReservation", "--showreservation", dest="showReservation", help="Show current node reservations", action="store_true", default=False)
|
||||
group.add_option("-A", "--showAllocation", "--showallocation", dest="showAllocation", help="Show current node allocation", action="store_true", default=False)
|
||||
group.add_option("-s", "--showResources", dest="showResources", help="Show available resources to choose from", action="store_true", default=False)
|
||||
group.add_option("-p", "--procs", dest="numProcs", help="Set number of processors" )
|
||||
group.add_option("-c", "--clock", dest="clockSpeed", help="Processor clock" )
|
||||
group.add_option("--memory", dest="numMemory", help="Amount of memory (Bytes)" )
|
||||
group.add_option("-f", "--cpuflags", dest="cpuFlags", help="CPU flags" )
|
||||
group.add_option("--cores", dest="numCores", help="Number of Cores" )
|
||||
group.add_option("-i", "--showPxeImages", "--showpxeimages", dest="showPxeImages", help="Show available PXE images to choose from", action="store_true", default=False)
|
||||
group.add_option("-m", "--showPxeImageMap", "--showpxeimagemap", dest="showPxeImageMap", help="Show PXE images host mapping", action="store_true", default=False)
|
||||
group.add_option("--showArchive", "--showarchive", dest="showArchive", help="Show allocation archive", action="store_true", default=False)
|
||||
parser.add_option_group(group)
|
||||
#parser.add_option("-p", "--printResources", dest="printResources", help="Print available resources to choose from", action="store_true", default=False)
|
||||
|
||||
# Admin INterface
|
||||
group = optparse.OptionGroup(parser, "Admin Interface", "Administration Interface:")
|
||||
group.add_option("--admin", dest="ADMIN", help="Enter Admin mode", action="store_true", default=False)
|
||||
group.add_option("--addPxeImage", "--addpxeimage", dest="imageName", help="Add PXE image to database", action="store_true", default=False)
|
||||
group.add_option("--enableHostPort", "--enablehostport", dest="enableHostPort", help="Enable a switch port", action="store_true", default=False)
|
||||
group.add_option("--disableHostPort", "--disablehostport", dest="disableHostPort", help="Disable a switch port", action="store_true", default=False)
|
||||
group.add_option("--removeVlan", "--removevlan", dest="removeVlanId", help="Remove vlan from all switches")
|
||||
group.add_option("--createVlan", "--createvlan", dest="createVlanId", help="Create a vlan on all switches")
|
||||
group.add_option("--addNodeToVlan", "--addnodetovlan", dest="add2Vlan", help="Add node to a vlan")
|
||||
group.add_option("--removeNodeFromVlan", "--removenodefromvlan", dest="removeFromVlan", help="Remove node from a vlan")
|
||||
group.add_option("--setNativeVlan", "--setnativevlan", dest="setNative", help="Configure native vlan")
|
||||
group.add_option("--restoreNativeVlan", "--restorenativevlan", dest="restoreNative", help="Restore native vlan", action="store_true", default=False)
|
||||
group.add_option("--removeAllVlans", "--removeallvlans", dest="removeAllVlans", help="Removes all vlans from a switchport", action="store_true", default=False)
|
||||
group.add_option("--sendSwitchCommand", "--sendswitchcommand", dest="sendSwitchCommand", help="Send Raw Switch Command, VERY DANGEROUS. config;interface switchport ethernet g14;etc")
|
||||
group.add_option("--interactiveSwitchConfig", "--interactiveswitchconfig", dest="interactiveSwitchConfig", help="Interactively configure a switch. switchhname")
|
||||
group.add_option("--showSwitchConfig", "--showswitchconfig", dest="showSwitchConfig", help="Show switch config for node", action="store_true", default=False)
|
||||
parser.add_option_group(group)
|
||||
|
||||
# Switch
|
||||
#group = optparse.OptionGroup(parser, "Switch Interface", "Switch Interface:")
|
||||
#group.add_option("--rawswitch", dest="RAWSWITCH", help="Enter RAW Switch Admin mode", action="store_true", default=False)
|
||||
#group.add_option("--enablePort", "--enableport", dest="enablePort", help="Enable a port on the switch")
|
||||
#group.add_option("--disablePort", "--disableport", dest="disablePort", help="Disable a port on the switch")
|
||||
#group.add_option("--addVlanToTrunks", "--addvlantotrunks", dest="addVlanToTrunks", help="")
|
||||
|
||||
|
||||
# Allocation Interface
|
||||
group = optparse.OptionGroup(parser, "Allocation Interface", "Change current systems allocations:")
|
||||
#group.add_option("-a", "--allocateResources", dest="allocateResources", help="Allocate resource", action="store_true", default=False)
|
||||
group.add_option("--addImage", "--addimage", dest="addImage", help="Add image to PRS - amd64-image:dist:dist_ver")
|
||||
group.add_option("--delImage", "--delimage", dest="delImage", help="Delete PXE image")
|
||||
group.add_option("--assignImage", "--assignimage", dest="assignImage", help="Assign image to resource")
|
||||
|
||||
group.add_option("--allocateNode", "--allocatenode", dest="allocateNode", help="Assign node to a user", action="store_true", default=False)
|
||||
group.add_option("--allocationNotes", "--allocationnotes", dest="allocationNotes", help="Description of allocation")
|
||||
group.add_option("--vlanIsolate", "--vlanisolate", dest="vlanIsolate", help="Specify vlan for network isolation")
|
||||
group.add_option("--hostName", "--hostname", dest="hostName", help="Specify hostname for node")
|
||||
group.add_option("--ipaddr", dest="ipAddr", help="Specify ip address for node")
|
||||
|
||||
group.add_option("--releaseNode", "--releasenode", dest="releaseNode", help="Release current node allocation", action="store_true", default=False)
|
||||
group.add_option("--reservationDuration", "--reservationduration", dest="reservationDuration", help="Specify duration of node reservation - YYYYMMDD format")
|
||||
group.add_option("--reservationId", "--reservationid", dest="reservationId", help="Reservation ID")
|
||||
group.add_option("--reservationNotes", "--reservationnotes", dest="reservationNotes", help="Description of reservation")
|
||||
group.add_option("--addReservation", "--addreservation", dest="addReservation", help="Add a Reservation", action="store_true", default=False)
|
||||
group.add_option("--updateReservation", "--updatereservation", dest="updateReservation", help="Update Reservation", action="store_true", default=False)
|
||||
group.add_option("--delReservation", "--delreservation", dest="delReservation", help="Delete Reservation")
|
||||
#group.add_option("-a", "--allocateResources", dest="allocateResources", help="Allocate resource", action="store_true", default=False)
|
||||
group.add_option("--rgasstest", dest="rgasstest", help="Debug testing function", action="store_true", default=False)
|
||||
parser.add_option_group(group)
|
||||
|
||||
(options, args) = parser.parse_args()
|
||||
|
||||
cmdargs = {}
|
||||
|
||||
# setup db connection
|
||||
query = resourcequerysql.ResourceQuerySql(configFile, options.verbosity)
|
||||
|
||||
# Get host info
|
||||
host=None
|
||||
if options.nodeName:
|
||||
host = query.getHostInfo(options.nodeName)
|
||||
#print host
|
||||
|
||||
|
||||
# Hardware control
|
||||
if options.hardwareType:
|
||||
|
||||
if (options.hardwareType) and options.hardwareType not in configFile['hardware_control']:
|
||||
mesg = "Non support hardware type specified\n"
|
||||
mesg += "Supported types:\n"
|
||||
mesg += str(configFile['hardware_control'])
|
||||
mesg += "\n\n"
|
||||
sys.stdout.write(mesg)
|
||||
exit()
|
||||
|
||||
if (options.hardwareType) and options.nodeName:
|
||||
#host = query.getHostInfo(options.nodeName)
|
||||
if options.hardwareType == "ipmi":
|
||||
hw = Ipmi(options.nodeName, host["ipmi_user"], host["ipmi_password"])
|
||||
|
||||
if options.hardwareType == "pdu":
|
||||
hw = raritanDominionPx(host)
|
||||
|
||||
if options.hardwareType == "drac":
|
||||
# Check if node has drac card
|
||||
if "drac_name" in host:
|
||||
hw = dellDrac(host)
|
||||
else:
|
||||
mesg = "Host (" + options.nodeName + ") does not have a DRAC card!!\n"
|
||||
sys.stdout.write(mesg)
|
||||
exit(1)
|
||||
|
||||
if options.verbosity:
|
||||
hw.setVerbose(True)
|
||||
|
||||
if options.REBOOTNODE:
|
||||
hw.powerReset()
|
||||
exit()
|
||||
if options.POWERCYCLE:
|
||||
hw.powerCycle()
|
||||
exit()
|
||||
if options.POWEROFF:
|
||||
hw.powerOff()
|
||||
exit()
|
||||
if options.POWERON:
|
||||
hw.powerOn()
|
||||
exit()
|
||||
if options.POWERRESET:
|
||||
hw.powerReset()
|
||||
exit()
|
||||
if options.POWERSTATUS:
|
||||
hw.getPowerStatus()
|
||||
exit()
|
||||
if options.CONSOLE:
|
||||
hw.activateConsole()
|
||||
exit()
|
||||
hw.getPowerStatus()
|
||||
|
||||
|
||||
if (options.hardwareType) and not options.nodeName:
|
||||
mesg = "\nMISSSING OPTION: Node name required -n or --nodeName\n"
|
||||
parser.print_help();
|
||||
sys.stderr.write(mesg)
|
||||
exit()
|
||||
|
||||
if (options.REBOOTNODE or options.POWERCYCLE or options.POWEROFF or \
|
||||
options.POWERON or options.POWERSTATUS or options.CONSOLE or \
|
||||
options.POWERRESET) and not options.hardwareType:
|
||||
parser.print_help()
|
||||
usage = "\nMISSING OPTION: When specifying hardware parameters, you need the --hw option\n"
|
||||
print usage
|
||||
exit()
|
||||
|
||||
# Query Interface
|
||||
if (options.numProcs):
|
||||
cmdargs["num_procs"] = options.numProcs
|
||||
if (options.numMemory):
|
||||
cmdargs["mem_total"] = options.numMemory
|
||||
if (options.clockSpeed):
|
||||
cmdargs["clock_speed"] = options.clockSpeed
|
||||
if (options.numCores):
|
||||
cmdargs["num_cores"] = options.numCores
|
||||
if (options.cpuFlags):
|
||||
cmdargs["cpu_flags"] = options.cpuFlags
|
||||
if (options.nodeName):
|
||||
cmdargs["node_id"] = options.nodeName
|
||||
|
||||
if (options.numCores or options.clockSpeed or options.numMemory or options.numProcs or options.cpuFlags) and not options.showResources:
|
||||
usage = "MISSING OPTION: When specifying hardware parameters, you need the -s or --showResources switch"
|
||||
print usage
|
||||
parser.print_help()
|
||||
exit()
|
||||
|
||||
# Show current allocations
|
||||
if (options.showAllocation):
|
||||
if options.uid:
|
||||
print "set"
|
||||
nameorid = int(options.uid)
|
||||
else:
|
||||
nameorid = options.userName
|
||||
|
||||
query.showAllocation(nameorid)
|
||||
exit()
|
||||
|
||||
# Show current reservation
|
||||
if (options.showReservation):
|
||||
if options.uid:
|
||||
print "set"
|
||||
nameorid = int(options.uid)
|
||||
else:
|
||||
nameorid = options.userName
|
||||
|
||||
query.showReservation(nameorid)
|
||||
exit()
|
||||
|
||||
# Show allocation Archive
|
||||
if (options.showArchive):
|
||||
query.showArchive()
|
||||
|
||||
# Print all Resources
|
||||
if (options.showResources):
|
||||
query.showResources(cmdargs)
|
||||
|
||||
# Show PXE images
|
||||
if (options.showPxeImages):
|
||||
query.showPxeImages()
|
||||
|
||||
# Show machine to PXE image mapping
|
||||
if (options.showPxeImageMap):
|
||||
query.showPxeImagesToSystemMap(cmdargs)
|
||||
exit()
|
||||
|
||||
if (len(sys.argv) == 1):
|
||||
parser.print_help()
|
||||
exit()
|
||||
|
||||
|
||||
# Get the host object
|
||||
#hostObj = getHostObject()
|
||||
#if (options.allocateResources) and options.nodeName:
|
||||
#query.getHostInfo(options.nodeName)
|
||||
|
||||
#exit()
|
||||
|
||||
# Delete reservation
|
||||
if (options.delReservation):
|
||||
query.removeReservation(options.delReservation)
|
||||
exit()
|
||||
|
||||
# Specify usermanagement, ldap or files
|
||||
usermgt = usermanagement.ldap()
|
||||
|
||||
|
||||
if (options.rgasstest):
|
||||
#pdu = raritanDominionPx(host)
|
||||
#print pdu
|
||||
#bootit = pxe.Pxe(configFile, options.verbosity)
|
||||
#bootit.createPxeUpdateFile(query.getPxeImages())
|
||||
#bootit.updatePxe()
|
||||
#print "host is ", host
|
||||
#drac = dellDrac("drac-r2r1c3", 1)
|
||||
#drac.getPowerStatus()
|
||||
#drac.powerOff()
|
||||
#drac.powerOn()
|
||||
#drac.powerCycle()
|
||||
#drac.powerReset()
|
||||
#drac.getPowerStatus()
|
||||
print "host is ", host
|
||||
pdu = raritanDominionPx(host)
|
||||
print "pdu", pdu
|
||||
pdu.getPowerStatus()
|
||||
exit()
|
||||
|
||||
# Create a reservation for a user
|
||||
if (options.addReservation):
|
||||
if not (options.userName or options.uid):
|
||||
mesg = "ERROR: AddReservation requires the following arguments...\n"
|
||||
if not (options.userName or options.uid):
|
||||
mesg += " Username: --userName=username or --uid 1000\n"
|
||||
|
||||
mesg += " Reservation Duration: --reservationDuration YYYYMMDD or numdays(optional, default 15 days)\n"
|
||||
#mesg += " ReservationId: --reservationId IDNUM(optional, you want this if you want to add nodes to an existing reservation)\n"
|
||||
mesg += " Notes: --reservationNotes(optional)\n"
|
||||
sys.stderr.write(mesg)
|
||||
exit()
|
||||
|
||||
userId = options.uid
|
||||
if not options.uid:
|
||||
userId = usermgt.getUserId(options.userName)
|
||||
|
||||
reservationId = query.addReservation(userId, options.reservationDuration, options.reservationNotes)
|
||||
|
||||
|
||||
# Allocate node to user
|
||||
if (options.allocateNode):
|
||||
vlanNum = 999
|
||||
if (options.vlanIsolate):
|
||||
vlanNum = options.vlanIsolate
|
||||
|
||||
if not (options.reservationId) or not options.nodeName:
|
||||
mesg = "ERROR: AllocateNode requires the following arguments...\n"
|
||||
if not (options.nodeName):
|
||||
mesg += " NodeName: --nodeName r1r1u25 \n"
|
||||
if not (options.reservationId):
|
||||
mesg += " ReservationId: --reservationId IDNUM(add nodes to an existing reservation)\n"
|
||||
|
||||
mesg += " Hostname: --hostName mynode01\n"
|
||||
mesg += " Domain: --vlanIsolate vlan_num(default 999)\n"
|
||||
mesg += " IP address: --ipaddr 172.17.10.100\n"
|
||||
mesg += " Notes: --allocationNotes(optional)\n"
|
||||
sys.stderr.write(mesg)
|
||||
exit()
|
||||
|
||||
query.allocateNode(options.reservationId, host['node_id'], options.hostName, vlanNum, options.ipAddr, options.allocationNotes)
|
||||
exit()
|
||||
|
||||
# Update allocation
|
||||
if (options.updateReservation):
|
||||
if not options.reservationId:
|
||||
mesg = "ERROR: UpdateReservation requires the following arguments...\n"
|
||||
if not (options.reservationId):
|
||||
mesg += " Reservation ID: --reservationId RES\n"
|
||||
mesg += " NodeName: --nodeName r1r1u25 (optional)\n"
|
||||
mesg += " Username: --userName=username or --uid 1000 (optional)\n"
|
||||
mesg += " Reservation Duration: --reservationDuration YYYYMMDD or numdays (optional, default 15 days)\n"
|
||||
mesg += " Vlan: --vlanIsolate vlan_num(optional)\n"
|
||||
mesg += " Notes: --reservationNotes(optional)\n"
|
||||
sys.stderr.write(mesg)
|
||||
exit()
|
||||
|
||||
userId = None
|
||||
if options.uid and options.userName:
|
||||
# Get the username from uid
|
||||
userId = options.uid
|
||||
if not options.uid:
|
||||
userId = usermgt.getUserId(options.userName)
|
||||
|
||||
print options.reservationId, userId, options.reservationDuration, options.vlanIsolate, options.reservationNotes
|
||||
query.updateReservation(options.reservationId, userId, options.reservationDuration, options.vlanIsolate, options.reservationNotes)
|
||||
|
||||
# Release node allocation
|
||||
if (options.releaseNode):
|
||||
if not options.nodeName:
|
||||
mesg = "ERROR: releaseNode requires the following arguments...\n"
|
||||
if not (options.nodeName):
|
||||
mesg += " NodeName: --nodeName r1r1u25 \n"
|
||||
|
||||
sys.stderr.write(mesg)
|
||||
exit()
|
||||
query.releaseNode(options.nodeName)
|
||||
|
||||
# Assign image to host
|
||||
if (options.assignImage):
|
||||
if not options.nodeName:
|
||||
usage = "Node not specified. Please specify a node with --nodeName or -n"
|
||||
print usage
|
||||
exit()
|
||||
if query.assignImagetoHost(host, options.assignImage):
|
||||
print "ERROR"
|
||||
exit()
|
||||
|
||||
# Update PXE
|
||||
bootit = pxe.Pxe(configFile, options.verbosity)
|
||||
bootit.createPxeUpdateFile(query.getPxeImages())
|
||||
bootit.updatePxe()
|
||||
|
||||
|
||||
# Add image to database
|
||||
if (options.addImage):
|
||||
query.addImage(options.addImage)
|
||||
# Delete PXE image
|
||||
if (options.delImage):
|
||||
query.delImage(options.delImage)
|
||||
|
||||
# Admin Interface
|
||||
# snmpwalk -v2c -c prs-domain sw0-r1r1 .1.3.6.1.2.1.17.7.1.4.3.1.5
|
||||
if (options.ADMIN):
|
||||
|
||||
if not options.nodeName and not options.createVlanId and not options.removeVlanId and not options.switchPort and not options.interactiveSwitchConfig:
|
||||
mesg = "\nERROR: nodeName or switch not specified. Please specify nodename with -n or --nodeName or --switchport\n"
|
||||
parser.print_help()
|
||||
sys.stderr.write(mesg)
|
||||
exit()
|
||||
|
||||
# We can specify port/switch combinations here
|
||||
if options.switchPort:
|
||||
host = query.getSwitchInfo(options.switchPort.split(":")[0])
|
||||
if len(options.switchPort.split(":")) > 1:
|
||||
host['hw_port'] = options.switchPort.split(":")[1]
|
||||
|
||||
host['location'] = options.switchPort
|
||||
|
||||
if options.interactiveSwitchConfig:
|
||||
host = query.getSwitchInfo(options.interactiveSwitchConfig)
|
||||
|
||||
HwSwitch = HwDellSwitch
|
||||
hwswitch = HwSwitch(configFile, host)
|
||||
if options.verbosity:
|
||||
hwswitch.setVerbose(True)
|
||||
|
||||
#print "create vlan", options.createVlanId
|
||||
if options.enableHostPort and options.nodeName:
|
||||
hwswitch.enableHostPort()
|
||||
if options.disableHostPort and (options.nodeName or options.switchPort):
|
||||
hwswitch.disableHostPort()
|
||||
if options.createVlanId:
|
||||
hwswitch.createVlans(options.createVlanId, query.getAllSwitches(), query)
|
||||
if options.removeVlanId:
|
||||
hwswitch.removeVlans(options.removeVlanId, query.getAllSwitches(), query)
|
||||
|
||||
if options.add2Vlan and (options.nodeName or options.switchPort):
|
||||
hwswitch.addNodeToVlan(options.add2Vlan)
|
||||
|
||||
if options.removeFromVlan and options.nodeName:
|
||||
hwswitch.removeNodeFromVlan(options.removeFromVlan)
|
||||
if options.setNative and (options.nodeName or options.switchPort):
|
||||
hwswitch.setNativeVlan(options.setNative)
|
||||
if options.restoreNative and options.nodeName:
|
||||
hwswitch.restoreNativeVlan()
|
||||
if options.removeAllVlans and (options.nodeName or options.switchPort):
|
||||
hwswitch.removeAllVlans()
|
||||
|
||||
if options.sendSwitchCommand and (options.nodeName or options.switchPort):
|
||||
hwswitch.sendSwitchCommand(options.sendSwitchCommand)
|
||||
if options.interactiveSwitchConfig:
|
||||
hwswitch.interactiveSwitchConfig()
|
||||
if options.showSwitchConfig and (options.nodeName or options.switchPort):
|
||||
hwswitch.showInterfaceConfig()
|
||||
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
Loading…
Add table
Add a link
Reference in a new issue