security-scripts/ssh/zoni-cli/zoni-cli.py

487 lines
20 KiB
Python
Raw Normal View History

# /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()