- [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