====== Install ====== apt-get install make dh-autoreconf python-suds python-requests python-pycurl git cd /usr/src git clone https://github.com/ClusterLabs/fence-agents.git cd fence-agents/ ./autogen.sh ./configure make make install * note: in case you are getting this error:fatal: unable to access 'https://github.com/ClusterLabs/fence-agents.git/': server certificate verification failed. CAfile: /etc/ssl/certs/ca-certificates.crt CRLfile: none use following command before issuing the git clone:export GIT_SSL_NO_VERIFY=1 ====== NETIO 230A agent ====== #!/usr/bin/python -tt import sys, re, pexpect import atexit sys.path.append("/usr/share/fence") from fencing import * import telnetlib from fencing import fspawn, fail, EC_LOGIN_DENIED, run_delay, logging, atexit_handler from time import sleep #BEGIN_VERSION_GENERATION RELEASE_VERSION="4.0.21.26-f32ef" BUILD_DATE="(built Thu Nov 26 11:16:18 CET 2015)" REDHAT_COPYRIGHT="Copyright (C) Red Hat, Inc. 2004-2010 All rights reserved." #END_VERSION_GENERATION def get_power_status(conn, options): conn.read_very_eager() logging.debug("port %s" % options["--plug"]) conn.write("port %s\r\n" % options["--plug"]) re_status = re.compile("250 [01imt]") ret = conn.expect([re_status,], int(options["--shell-timeout"])) logging.debug(ret[2]) status = { "0" : "off", "1" : "on", "i" : "reboot", "m" : "manual", "t" : "timer", }[ret[2].split()[1]] logging.info("Power status: %s" % status) return status def set_power_status(conn, options): action = { "on" : "1", "off" : "0", "reboot" : "i" }[options["--action"]] logging.debug("port %s %s" % (options["--plug"], action)) conn.write("port %s %s\r\n" % (options["--plug"], action)) sleep(0.500) ret = conn.read_until("250 OK", int(options["--shell-timeout"])) logging.debug(ret) def get_outlet_list(conn, options): result = {} try: # the NETIO-230B has 4 ports, counting start at 1 for plug in ["1", "2", "3", "4"]: conn.write("port setup %s\r\n" % plug) ret = conn.read_until("250 .+", int(options["--shell-timeout"])) # the name is enclosed in "", drop those with [1:-1] name = ret.split()[1][1:-1] result[plug] = (name, "unknown") except Exception, exn: print str(exn) return result def main(): device_opt = ["ipaddr", "login", "passwd", "port", "telnet"] atexit.register(atexit_handler) all_opt["ipport"]["default"] = "1234" opt = process_input(device_opt) opt["eol"] = "\n\r" options = check_input(device_opt, opt) docs = {} docs["shortdesc"] = "I/O Fencing agent for Koukaam NETIO-230B" docs["longdesc"] = "fence_netio is an I/O Fencing agent which can be \ used with the Koukaam NETIO-230B Power Distribution Unit. It logs into \ device via telnet and reboots a specified outlet. Lengthy telnet connections \ should be avoided while a GFS cluster is running because the connection will \ block any necessary fencing actions." docs["vendorurl"] = "http://www.koukaam.se/" show_docs(options, docs) ## ## Operate the fencing device ## We can not use fence_login(), username and passwd are sent on one line #### run_delay(options) try: conn = telnetlib.Telnet(options["--ip"], options["--ipport"]) conn.read_until("100 HELLO", int(options["--shell-timeout"])) conn.write("login %s %s\r\n" % (options["--username"], options["--password"])) conn.read_until("250 OK", int(options["--shell-timeout"])) except pexpect.EOF: fail(EC_LOGIN_DENIED) except pexpect.TIMEOUT: fail(EC_LOGIN_DENIED) result = fence_action(conn, options, set_power_status, get_power_status, get_outlet_list) # fence_logout(conn, "quit\n") conn.write("quit\r\n") sys.exit(result) if __name__ == "__main__": main()