Differences

This shows you the differences between two versions of the page.

Link to this comparison view

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