- [Show page]
- [Old revisions]
- [[unknown link type]]
- []
Differences
This shows you the differences between two versions of the page.
| Next revision | Previous revision | ||
|
linux:netio-fencing [2015/11/26 11:19] vondra created |
linux:netio-fencing [2015/12/11 12:26] (current) vondra [Install] |
||
|---|---|---|---|
| Line 1: | Line 1: | ||
| ====== Install ====== | ====== Install ====== | ||
| <code bash> | <code bash> | ||
| - | apt-get install make dh-autoreconf python-suds python-requests | + | 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 | git clone https://github.com/ClusterLabs/fence-agents.git | ||
| cd fence-agents/ | cd fence-agents/ | ||
| Line 8: | Line 9: | ||
| make | make | ||
| make install | make install | ||
| + | </code> | ||
| + | |||
| + | * note: in case you are getting this error:<code bash>fatal: unable to access 'https://github.com/ClusterLabs/fence-agents.git/': server certificate verification failed. CAfile: /etc/ssl/certs/ca-certificates.crt CRLfile: none</code> use following command before issuing the git clone:<code>export GIT_SSL_NO_VERIFY=1</code> | ||
| + | ====== NETIO 230A agent ====== | ||
| + | <code python> | ||
| + | #!/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() | ||
| + | |||
| </code> | </code> | ||
linux/netio-fencing.1448533165.txt.gz · Last modified: 2015/11/26 11:19 by vondra


