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