ERMを見つめ合って素直におしゃべりする方法

とある山にあるStarBEDというTestBEDで提供されているSpringOSというTestBED用ツールについて.

SpringOSは,1000台を超えるPCを管理するためのソフトウェア群ですが,この中にERMというPCの状態を管理するソフトウェアがあります.

ERMでできることは,「今から俺が使うぜぃ!」と言ってノードのロックをしたり,「使い終わったから開放するね」と言ってノードをリリースしたり出来ます.ロック中は他の人はそのノードを利用することが出来ません.ロックできるのはノード,VLAN番号,スイッチのポートなどが該当します.
具体的なお喋り方法ですが,ERMはtelnetでアクセスしてコマンドを投げることが出来ます.

ERMには,クライアントが存在しますが今回はクライアントを使わずにオレオレプログラムでERMとお話する方法について書いていきます.

接続自体はtelnetライブラリを用いれば一瞬です.
接続先のIPアドレスは,適当なものを,ポート番号は基本的に1234で待っているはずです.必要があれば変更.
接続後は,まず認証を通します.

USER "username"
PASSWD "password"
PROJECT "project name"

telnetでコマンドを投げそれぞれに対して200 OKと帰ってくれば認証は成功です.
username,password,projectnameはStarBEDを利用する際に登録するものです.

次にノードの情報を取得してみます.

INFO node "node number"

とコマンドを投げるとERMが持っているノード情報を返してくれます.

次にノード,VLAN,スイッチポートのロック.

HOLD node "node number"
HOLD swport "switch's port number"
HOLD vlan "vlan id"

スイッチのポート番号はノード情報の取得で得られる形式で指定します.(どんなのだったか忘れた…)
それぞれ200 OKと帰ってくれば成功で,失敗時は400って帰ってきた気がします.

そしてロックの解除

RELEASE node "node number"
RELEASE swport "switch's port number"
RELEASE vlan "vlan id"

ロック時と同じです.

最後にコネクションをクローズして終わりです.

最後にPythonで書いたプログラムを載せておきます.
ちなみにエラーが帰ってきた時のハンドリングはしてません,

#!/usr/bin/env python
#! -*- coding: utf-8 -*-

import telnetlib

class ERM(object):
	def __init__(self, erm_node):
		self.host = erm_node
		self.port = "1234"

	# Connect to ERM and Authentication
	def connect(self, user, passwd, project):
		self.erm = telnetlib.Telnet()
		self.erm.open(self.host, self.port)
		username = "USER %s \n" % user
		self.erm.write(username)
		self.erm.read_until("200 OK\r\n")
		password = "PASSWD %s \n" % passwd
		self.erm.write(password)
		self.erm.read_until("200 OK\r\n")
		proj = "PROJECT %s \n" % project
		self.erm.write(proj)
		self.erm.read_until("200 OK\r\n", 1)

	# Get Node Information
	def GetInfo(self, node):
		info = "INFO node %s \n" % node
		self.erm.write(info)
		nodeinfo = self.erm.read_until(".\r\n")
		return nodeinfo

	# Rock resource(Node, VLAN ID, Switch's Port)
	def DoHold(self, vlan, swport, node):
		self._DoHoldnode(node)
		self._DoHoldswport(swport)
		self._DoHoldvlan(vlan)

	# Rock Node
	def _DoHoldnode(self, node):
		holdnode = "HOLD node %s \n" % node
		self.erm.write(holdnode)
		result = self.erm.read_until("nodes\r\n",1)

	# Rock Switch's Port
	def _DoHoldswport(self, swport):
		holdsw = "HOLD swport %s \n" % swport
		self.erm.write(holdsw)
		result = self.erm.read_until("swport", 1)

	# Rock VLAN ID
	def _DoHoldvlan(self, vlan):
		holdvlan = "HOLD vlan %s \n" % vlan
		self.erm.write(holdvlan)
		result = self.erm.read_until("VLAN(s)", 1)t

	# Release resource(Node, VLAN ID, Switch's Port)
	def DoRelease(self, swport, vlan, node):
		self._DoReleaseswport(swport)
		self._DoReleasevlan(vlan)
		self._DoReleasenode(node)

	# Release Node
	def _DoReleasenode(self, node):
		releasenode = "RELEASE node %s \n" % node
		self.erm.write(releasenode)
		result = self.erm.read_until("200 OK 1 nodes", 1)

	# Release Switch's Port
	def _DoReleaseswport(self, swport):
		releasesw = "RELEASE swport %s \n" % swport
		self.erm.write(releasesw)
		result = self.erm.read_until("swport")

	# Release VLAN ID
	def _DoReleasevlan(self,  vlan):
		releasevlan = "RELEASE vlan %s \n" % vlan
		self.erm.write(releasevlan)
		result = self.erm.read_until("VLANs\r\n")

	# Clone Connection
	def close(self):
		self.erm.write("QUIT\n")
		self.erm.close()

def main():
	erm = ERM("ERMのIPアドレス")
	erm.connect(username, password, project)
	info = erm.GetInfo(node)

	erm._DoHoldnode(node)
	erm._DoHoldvlan(vlan)
	erm._DoHoldswport(swport)

	erm.DoRelease(swport, vlan, node)

	erm.close()

if __name__ == "__main__":
	main()