diff --git a/README.md b/README.md index d9fcb94b..0f3ebbde 100644 --- a/README.md +++ b/README.md @@ -1,18 +1,25 @@ # Fence agents -Fence agents were developed as device "drivers" which are able to prevent computers from destroying data on shared storage. Their aim is to isolate a corrupted computer, using one of three methods: +Fence agents were developed as device "drivers" which are able to prevent computers from destroying data on shared +storage. Their aim is to isolate a corrupted computer, using one of three methods: - * Power - A computer that is switched off cannot corrupt data, but it is important to not do a "soft-reboot" as we won't know if this is possible. This also works for virtual machines when the fence device is a hypervisor. - * Network - Switches can prevent routing to a given computer, so even if a computer is powered on it won't be able to harm the data. + * Power - A computer that is switched off cannot corrupt data, but it is important to not do a "soft-reboot" as we + won't know if this is possible. This also works for virtual machines when the fence device is a hypervisor. + * Network - Switches can prevent routing to a given computer, so even if a computer is powered on it won't be able to + harm the data. * Configuration - Fibre-channel switches or SCSI devices allow us to limit who can write to managed disks. -Fence agents do not use configuration files, as configuration management is outside of their scope. All of the configuration has to be specified either as command-line arguments or lines of standard input (see the complete list for more info). +Fence agents do not use configuration files, as configuration management is outside of their scope. All of the +configuration has to be specified either as command-line arguments or lines of standard input (see the complete list +for more info). -Because many fence agents are quite similar to each other, a fencing library (in Python) was developed. Please use it for further development. Creating or modifying a new fence agent should be quite simple using this library. +Because many fence agents are quite similar to each other, a fencing library (in Python) was developed. Please use it +for further development. Creating or modifying a new fence agent should be quite simple using this library. ## Where can I find more information? * [ClusterLabs website](http://www.clusterlabs.org/) * [User and developer documentation](https://github.com/ClusterLabs/fence-agents/tree/master/doc/FenceAgentAPI.md) -* Mailing lists for [users](http://oss.clusterlabs.org/mailman/listinfo/users) and [developers](http://oss.clusterlabs.org/mailman/listinfo/developers) +* Mailing lists for [users](http://oss.clusterlabs.org/mailman/listinfo/users) and + [developers](http://oss.clusterlabs.org/mailman/listinfo/developers) * #clusterlabs IRC channel on [freenode](http://freenode.net/) diff --git a/agents/eaton_ssh/fence_eaton_ssh.py b/agents/eaton_ssh/fence_eaton_ssh.py new file mode 100644 index 00000000..8e536a2e --- /dev/null +++ b/agents/eaton_ssh/fence_eaton_ssh.py @@ -0,0 +1,318 @@ +#!@PYTHON@ -tt + +""" +Plug numbering starts with 1! There were no tests performed so far with daisy chained PDUs. + +Example usage: + fence_eaton_ssh -v -a -l -p --login-timeout=60 --action status --plug 1 +""" + +##### +## +## The Following Agent Has Been Tested On: +## +## Model Firmware +## +---------------------------------------------+ +## EMAB04 04.02.0001 +##### + +import enum +import sys +import atexit + +sys.path.append("@FENCEAGENTSLIBDIR@") +from fencing import * +from fencing import fail, EC_STATUS, EC_LOGIN_DENIED + + +class FenceEatonPowerActions(enum.Enum): + """ + Status of the plug on the PDU. + """ + ERROR = -1 + OFF = 0 + ON = 1 + PENDING_OFF = 2 + PENDING_ON = 3 + + +def get_plug_names(conn, plug_ids, command_prompt, shell_timout): + """ + Get the names of plugs via their ID. + + :param conn: The "fspawn" object. + :param plug_ids: The list of plug IDs. Plugs start with the ID 1. + :param command_prompt: The characters that make up the base prompt. This is important to detect a finished command. + :param shell_timeout: The maximum time the shell should wait for a response. + :returns: The name of the requested plugs. + """ + # fspawn is subclassed from pexpect which is not correctly type annotated in all cases. + result = {} + full_node_mapping = {} + conn.send_eol("get PDU.OutletSystem.Outlet[x].iName") + conn.log_expect(command_prompt, shell_timout) + result_plug_names = conn.before.split("\n") # type: ignore + if len(result_plug_names) != 3: + fail(EC_STATUS) + plug_names = result_plug_names.split("|") + for counter in range(1, len(plug_names)): + full_node_mapping[counter] = plug_names[counter] + for plug_id in plug_ids: + result[plug_id] = full_node_mapping[plug_id] + return result + + +def get_plug_ids(conn, nodenames, command_prompt, shell_timout): + """ + Get the IDs that map to the given nodenames. Non existing names are skipped. + + :param conn: The "fspawn" object. + :param nodenames: The list of human readable names that should be converted to IDs. + :param command_prompt: The characters that make up the base prompt. This is important to detect a finished command. + :param shell_timeout: The maximum time the shell should wait for a response. + :returns: A dictionary - possibly empty - where the keys are the node names and the values are the node IDs. + """ + result = {} + full_node_mapping = {} + conn.send_eol("get PDU.OutletSystem.Outlet[x].iName") + conn.log_expect(command_prompt, shell_timout) + result_plug_names = conn.before.split("\n") # type: ignore + if len(result_plug_names) != 3: + fail(EC_STATUS) + plug_names = result_plug_names.split("|") + for counter in range(1, len(plug_names)): + full_node_mapping[plug_names[counter]] = counter + for node in nodenames: + if node in full_node_mapping: + result[node] = full_node_mapping[node] + return result + + +def get_plug_count(conn, command_prompt, shell_timout): + """ + Get the number of plugs that the PDU has. + + In case the PDU is daisy chained this also contains the plugs of the other PDUs. + + :param conn: The "fspawn" object. + :param command_prompt: The characters that make up the base prompt. This is important to detect a finished command. + :param shell_timeout: The maximum time the shell should wait for a response. + :returns: The number of plugs that the PDU has. + """ + # fspawn is subclassed from pexpect which is not correctly type annotated in all cases. + conn.send_eol("get PDU.OutletSystem.Outlet.Count") + conn.log_expect(command_prompt, shell_timout) + result_plug_count = conn.before.split("\n") # type: ignore + if len(result_plug_count) != 3: + fail(EC_STATUS) + return int(result_plug_count[1].strip()) + + +def get_plug_status(conn, plug_id, command_prompt, shell_timout): + """ + Get the current status of the plug. The return value of this doesn't account for operations that will act via + schedules or a delay. As such the status is only valid at the time of retrieval. + + :param conn: The "fspawn" object. + :param plug_id: The ID of the plug that should be powered off. Counting plugs starts at 1. + :returns: The current status of the plug. + """ + # fspawn is subclassed from pexpect which is not correctly type annotated in all cases. + conn.send_eol(f"get PDU.OutletSystem.Outlet[{plug_id}].PresentStatus.SwitchOnOff") + conn.log_expect(command_prompt, shell_timout) + result_plug_status = conn.before.split("\n") # type: ignore + if len(result_plug_status) != 3: + fail(EC_STATUS) + if result_plug_status[1].strip() == "0": + return FenceEatonPowerActions.OFF + elif result_plug_status[1].strip() == "1": + return FenceEatonPowerActions.ON + else: + return FenceEatonPowerActions.ERROR + + +def power_on_plug(conn, plug_id, command_prompt, shell_timout, delay=0): + """ + Powers on a plug with an optional delay. + + :param conn: The "fspawn" object. + :param plug_id: The ID of the plug that should be powered off. Counting plugs starts at 1. + :param command_prompt: The characters that make up the base prompt. This is important to detect a finished command. + :param shell_timeout: The maximum time the shell should wait for a response. + :param delay: The delay in seconds. Passing "-1" aborts the power off action. + """ + conn.send_eol(f"set PDU.OutletSystem.Outlet[{plug_id}].DelayBeforeStartup {delay}") + conn.log_expect(command_prompt, shell_timout) + + +def power_off_plug(conn, plug_id, command_prompt, shell_timout, delay=0): + """ + Powers off a plug with an optional delay. + + :param conn: The "fspawn" object. + :param plug_id: The ID of the plug that should be powered off. Counting plugs starts at 1. + :param command_prompt: The characters that make up the base prompt. This is important to detect a finished command. + :param shell_timeout: The maximum time the shell should wait for a response. + :param delay: The delay in seconds. Passing "-1" aborts the power off action. + """ + conn.send_eol(f"set PDU.OutletSystem.Outlet[{plug_id}].DelayBeforeShutdown {delay}") + conn.log_expect(command_prompt, shell_timout) + + +def get_power_status(conn, options): + """ + Retrieve the power status for the requested plug. Since we have a serial like interface via SSH we need to parse the + output of the SSH session manually. + + If abnormal behavior is detected the method will exit via "fail()". + + :param conn: The "fspawn" object. + :param options: The option dictionary. + :returns: In case there is an error this method does not return but instead calls "sys.exit". Otherwhise one of + "off", "on" or "error" is returned. + """ + if conn is None: + fail(EC_LOGIN_DENIED) + + requested_plug = options.get("--plug", "") + if not requested_plug: + fail(EC_STATUS) + plug_status = get_plug_status( + conn, # type: ignore + int(requested_plug), + options["--command-prompt"], + int(options["--shell-timeout"]) + ) + if plug_status == FenceEatonPowerActions.OFF: + return "off" + elif plug_status == FenceEatonPowerActions.ON: + return "on" + else: + return "error" + + +def set_power_status(conn, options): + """ + Set the power status for the requested plug. Only resposible for powering on and off. + + If abnormal behavior is detected the method will exit via "fail()". + + :param conn: The "fspawn" object. + :param options: The option dictionary. + :returns: In case there is an error this method does not return but instead calls "sys.exit". + """ + if conn is None: + fail(EC_LOGIN_DENIED) + + requested_plug = options.get("--plug", "") + if not requested_plug: + fail(EC_STATUS) + requested_action = options.get("--action", "") + if not requested_action: + fail(EC_STATUS) + + if requested_action == "off": + power_off_plug( + conn, # type: ignore + int(requested_plug), + options["--command-prompt"], + int(options["--shell-timeout"]) + ) + elif requested_action == "on": + power_on_plug( + conn, # type: ignore + int(requested_plug), + options["--command-prompt"], + int(options["--shell-timeout"]) + ) + else: + fail(EC_STATUS) + + +def get_outlet_list(conn, options): + """ + Retrieves the list of plugs with their correspondin status. + + :param conn: The "fspawn" object. + :param options: The option dictionary. + :returns: Keys are the Plug IDs which each have a Tuple with the alias for the plug and its status. + """ + if conn is None: + fail(EC_LOGIN_DENIED) + + result = {} + plug_count = get_plug_count(conn, options["--command-prompt"], int(options["--shell-timeout"])) # type: ignore + for counter in range(1, plug_count): + plug_names = get_plug_names( + conn, # type: ignore + [counter], + options["--command-prompt"], + int(options["--shell-timeout"]) + ) + plug_status_enum = get_plug_status( + conn, # type: ignore + counter, + options["--command-prompt"], + int(options["--shell-timeout"]) + ) + if plug_status_enum == FenceEatonPowerActions.OFF: + plug_status = "OFF" + elif plug_status_enum == FenceEatonPowerActions.ON: + plug_status = "ON" + else: + plug_status = None + result[str(counter)] = (plug_names[counter], plug_status) + return result + + +def reboot_cycle(conn, options) -> None: + """ + Responsible for power cycling a machine. Not responsible for singular on and off actions. + + :param conn: The "fspawn" object. + :param options: The option dictionary. + """ + requested_plug = options.get("--plug", "") + if not requested_plug: + fail(EC_STATUS) + + power_off_plug( + conn, # type: ignore + int(requested_plug), + options["--command-prompt"], + int(options["--shell-timeout"]) + ) + power_on_plug( + conn, # type: ignore + int(requested_plug), + options["--command-prompt"], + int(options["--shell-timeout"]) + ) + + +def main(): + """ + Main entrypoint for the fence_agent. + """ + device_opt = ["secure", "ipaddr", "login", "passwd", "port", "cmd_prompt"] + atexit.register(atexit_handler) + options = check_input(device_opt, process_input(device_opt)) + options["--ssh"] = None + options["--ipport"] = 22 + options["--command-prompt"] = "pdu#0>" + + docs = {} + docs["shortdesc"] = "Fence agent for Eaton ePDU G3 over SSH" + docs["longdesc"] = "fence_eaton_ssh is a fence agent that connects to Eaton ePDU devices. It logs into \ +device via ssh and reboot a specified outlet." + docs["vendorurl"] = "https://www.eaton.com/" + show_docs(options, docs) + + conn = fence_login(options) + result = fence_action(conn, options, set_power_status, get_power_status, get_outlet_list, reboot_cycle) + fence_logout(conn, "quit") + sys.exit(result) + + +if __name__ == "__main__": + main() diff --git a/configure.ac b/configure.ac index 65a9718d..8436ba25 100644 --- a/configure.ac +++ b/configure.ac @@ -1,593 +1,593 @@ # Process this file with autoconf to produce a configure script. AC_PREREQ([2.63]) # TODO: port .gitarchiver AC_INIT([fence-agents], [m4_esyscmd([make/git-version-gen .tarball-version])], [developers@clusterlabs.org]) AC_CONFIG_AUX_DIR([.]) # Don't let AC_PROC_CC (invoked by AC_USE_SYSTEM_EXTENSIONS) replace # undefined CFLAGS with -g -O2, overriding our special OPT_CFLAGS. : ${CFLAGS=""} AC_USE_SYSTEM_EXTENSIONS AM_INIT_AUTOMAKE([1.13 dist-bzip2 dist-xz color-tests -Wno-portability subdir-objects]) # Sanitize path if test "$prefix" = "NONE"; then prefix="/usr" if test "$localstatedir" = "\${prefix}/var"; then localstatedir="/var" fi if test "$sysconfdir" = "\${prefix}/etc"; then sysconfdir="/etc" fi if test "$libdir" = "\${exec_prefix}/lib"; then if test -e /usr/lib64; then libdir="/usr/lib64" else libdir="/usr/lib" fi fi fi case $exec_prefix in NONE) exec_prefix=$prefix;; prefix) exec_prefix=$prefix;; esac # It is necessary to have this done before libtool does linker detection. # See also: https://github.com/kronosnet/kronosnet/issues/107 # --as-needed: Modern systems have builtin ceil() making -lm superfluous but # AC_SEARCH_LIBS can't detect this because it tests with a false prototype AX_CHECK_LINK_FLAG([-Wl,--enable-new-dtags], [AM_LDFLAGS=-Wl,--enable-new-dtags], [AC_MSG_ERROR(["Linker support for --enable-new-dtags is required"])]) AX_CHECK_LINK_FLAG([-Wl,--as-needed], [AM_LDFLAGS="$AM_LDFLAGS -Wl,--as-needed"]) LT_PREREQ([2.2.6]) LT_INIT AC_CONFIG_MACRO_DIR([m4]) AC_CONFIG_SRCDIR([lib/fencing.py.py]) AC_CONFIG_HEADERS([make/config.h]) AC_CANONICAL_HOST AC_PROG_LIBTOOL AC_LANG([C]) # Checks for programs. # check stolen from gnulib/m4/gnu-make.m4 if ! ${MAKE-make} --version /cannot/make/this >/dev/null 2>&1; then AC_MSG_ERROR([you don't seem to have GNU make; it is required]) fi AC_PROG_CC AM_PROG_CC_C_O AC_PROG_GCC_TRADITIONAL AC_PROG_LN_S AC_PROG_INSTALL AC_PROG_MAKE_SET AC_PROG_AWK AC_PROG_CXX AC_PROG_YACC AC_PROG_LEX PKG_PROG_PKG_CONFIG ## local helper functions # this function checks if CC support options passed as # args. Global CFLAGS are ignored during this test. cc_supports_flag() { local CFLAGS="-Werror $@" AC_MSG_CHECKING([whether $CC supports "$@"]) AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ ]], [[ ]])], [RC=0; AC_MSG_RESULT([yes])], [RC=1; AC_MSG_RESULT([no])]) return $RC } # Checks for header files. AC_HEADER_DIRENT AC_HEADER_STDC AC_HEADER_SYS_WAIT AC_HEADER_TIME AC_CHECK_HEADERS([arpa/inet.h fcntl.h malloc.h netdb.h netinet/in.h stdint.h stdlib.h string.h sys/ioctl.h sys/socket.h sys/time.h syslog.h termios.h unistd.h libintl.h limits.h netdb.h stddef.h]) # Checks for typedefs, structures, and compiler characteristics. AC_C_INLINE AC_C_CONST AC_TYPE_SIZE_T AC_TYPE_SSIZE_T AC_TYPE_UINT32_T AC_TYPE_OFF_T AC_TYPE_SIGNAL # Checks for library functions. AC_FUNC_FORK AC_FUNC_MALLOC AC_FUNC_CLOSEDIR_VOID AC_FUNC_MEMCMP AC_FUNC_SELECT_ARGTYPES AC_FUNC_STAT AC_CHECK_FUNCS([alarm atexit bzero dup2 memmove memset select socket strcasecmp strchr strdup strerror strtol gettimeofday]) # local options AC_ARG_ENABLE([debug], [ --enable-debug enable debug build. ], [ default="no" ]) AC_ARG_WITH([fenceagentslibdir], [ --with-fenceagentslibdir=PATH installation path for fence library. ], [ FENCEAGENTSLIBDIR="$withval" ], [ FENCEAGENTSLIBDIR="${datadir}/fence" ]) AC_ARG_WITH([agents], [ --with-agents=LIST list of agents to build/ship (default: all). ], [ AGENTS_LIST="$withval" ], [ AGENTS_LIST="all" ]) FENCETMPDIR=${localstatedir}/run/fence-agents AC_ARG_WITH(fencetmpdir, [ --with-fencetmpdir=DIR directory for fence agents state files [${FENCETMPDIR}]], [ FENCETMPDIR="$withval" ]) # Expand $prefix eval FENCETMPDIR="`eval echo ${FENCETMPDIR}`" AC_DEFINE_UNQUOTED(FENCETMPDIR,"$FENCETMPDIR", Where Fence agents keep state files) AC_SUBST(FENCETMPDIR) if test "x$AGENTS_LIST" = x; then AC_ERROR([No agents selected]) fi # PKG_CHECK_MODULES will fail if systemd is not found by default, so make sure # we set the proper vars and deal with it PKG_CHECK_MODULES([systemd], [systemd], [HAS_SYSTEMD=yes], [HAS_SYSTEMD=no]) if test "x$HAS_SYSTEMD" == "xyes"; then PKG_CHECK_VAR([SYSTEMD_TMPFILES_DIR], [systemd], [tmpfilesdir]) if test "x$SYSTEMD_TMPFILES_DIR" == "x"; then AC_MSG_ERROR([Unable to detect systemd tmpfiles directory automatically]) fi # sanitize systed vars when using non standard prefix if test "$prefix" != "/usr"; then SYSTEMD_TMPFILES_DIR="$prefix/$SYSTEMD_TMPFILES_DIR" AC_SUBST([SYSTEMD_TMPFILES_DIR]) fi fi AM_CONDITIONAL(HAVE_SYSTEMD, [test "x$HAS_SYSTEMD" == xyes ]) FENCE_KDUMP=0 if echo "$AGENTS_LIST" | grep -q -E "all|kdump"; then case "$host_os" in *bsd*) ;; *) FENCE_KDUMP=1 ;; esac AGENTS_LIST=$(echo "$AGENTS_LIST" | sed -E "s/kdump( |$)//") fi FENCE_MANUAL=0 if echo "$AGENTS_LIST" | grep -q -E "all|manual"; then FENCE_MANUAL=1 AGENTS_LIST=$(echo "$AGENTS_LIST" | sed -E "s/manual( |$)//") fi FENCE_MPATH=0 if echo "$AGENTS_LIST" | grep -q -E "all|mpath"; then FENCE_MPATH=1 fi FENCE_SCSI=0 if echo "$AGENTS_LIST" | grep -q -E "all|scsi"; then FENCE_SCSI=1 fi FENCE_ZVM=0 if echo "$AGENTS_LIST" | grep -q -E "zvm( |$)"; then FENCE_ZVM=1 fi FENCE_VIRT=0 if echo "$AGENTS_LIST" | grep -q -E "all|(^| )virt( |$)"; then AGENTS_LIST=$(echo "$AGENTS_LIST" | sed -E "s/(^| )virt( |$)//") case "$host_os" in *bsd*) ;; *) FENCE_VIRT=1 VIRT_AM_LDFLAGS="$AM_LDFLAGS -fPIC -fPIE -Wl,-z,now" AC_SUBST([VIRT_AM_LDFLAGS]) VIRT_AM_CFLAGS="-fPIC -fPIE -I\$(top_srcdir)/agents/virt/include -D_GNU_SOURCE" AC_SUBST([VIRT_AM_CFLAGS]) VIRT_COMMON_LDFLAGS="-Wl,-wrap,syslog,-wrap,closelog" AC_SUBST([VIRT_COMMON_LDFLAGS]) VIRT_COMMON_LIBS="-Wl,-Bstatic -L\$(top_builddir)/agents/virt/common -lfence_virt -Wl,-Bdynamic" AC_SUBST([VIRT_COMMON_LIBS]) VIRT_CONFIG_LIBS="-L\$(top_builddir)/agents/virt/config -lsimpleconfig" AC_SUBST([VIRT_CONFIG_LIBS]) # Checks for libraries. AX_PTHREAD(,[AC_MSG_ERROR([POSIX threads support is required])]) PKG_CHECK_MODULES([nss], [nss]) PKG_CHECK_MODULES([xml2], [libxml-2.0]) PKG_CHECK_MODULES([uuid], [uuid]) saved_LIBS="$LIBS" LIBS= AC_SEARCH_LIBS([dlopen], [dl dld], , [AC_MSG_ERROR([dlopen not found])]) AC_SUBST([dl_LIBS], [$LIBS]) LIBS="$saved_LIBS" ;; esac fi if test "x$AGENTS_LIST" != xall; then for j in $AGENTS_LIST; do if ! test -f agents/$j/fence_$j*.py; then AC_ERROR([Agent $j does not exist]) fi AGENTS_LIST=`echo "$AGENTS_LIST" | sed -E -e "s#$j([^_/]|$)#$j/fence_$j\1#g" -e "s#zvm/fence_zvm( |$)#zvm/fence_zvmip\1#g"` done fi if test "x$AGENTS_LIST" = xall; then AGENTS_LIST=`find $srcdir/agents -mindepth 2 -maxdepth 2 -name 'fence_*.py' -print0 | xargs -0 | sed -E -e 's#[^ ]*/agents/##g' -e 's#lib/[A-Za-z_.]*( |$)##g' -e 's#nss_wrapper/[A-Za-z_.]*( |$)##g' -e 's#autodetect/[A-Za-z_.]*( |$)##g'` fi XENAPILIB=0 if echo "$AGENTS_LIST" | grep -q xenapi; then XENAPILIB=1 fi ## random vars LOGDIR=${localstatedir}/log/cluster CLUSTERVARRUN=${localstatedir}/run/cluster CLUSTERDATA=${datadir}/cluster AC_PATH_PROGS(XMLLINT, xmllint) AM_CONDITIONAL(BUILD_DOC, test "x$XMLLINT" != "x" ) if test "x$XMLLINT" = "x"; then AC_MSG_WARN([xmllint not installed, unable to (re-)build manual pages]) exit 1 fi AC_SUBST(XMLLINT) AC_PATH_PROGS(XSLTPROC, xsltproc) AM_CONDITIONAL(BUILD_DOC, test "x$XSLTPROC" != "x" ) if test "x$XSLTPROC" = "x"; then AC_MSG_WARN([xsltproc not installed, unable to (re-)build manual pages]) exit 1 fi AC_SUBST(XSLTPROC) AM_PATH_PYTHON if test -z "$PYTHON"; then echo "*** Essential program python not found" 1>&2 exit 1 fi dnl Ensure PYTHON is an absolute path AC_PATH_PROG([PYTHON], [$PYTHON]) AC_PYTHON_MODULE(pexpect, 1) AC_PYTHON_MODULE(pycurl, 1) AC_PYTHON_MODULE(requests, 1) if echo "$AGENTS_LIST" | grep -q amt_ws; then AC_PYTHON_MODULE(pywsman) if test "x${HAVE_PYMOD_PYWSMAN}" != xyes; then AGENTS_LIST=$(echo "$AGENTS_LIST" | sed -E "s#amt_ws/fence_amt_ws.py( |$)##") AC_MSG_WARN("Not building fence_amt_ws") fi fi if echo "$AGENTS_LIST" | grep -q -E "ovh|vmware_soap"; then AC_PYTHON_MODULE(suds) if test "x${HAVE_PYMOD_SUDS}" != xyes; then AGENTS_LIST=$(echo "$AGENTS_LIST" | sed -E "s#(ovh/fence_ovh|vmware_soap/fence_vmware_soap).py( |$)##g") AC_MSG_WARN("Not building fence_ovh and fence_vmware_soap") fi fi if echo "$AGENTS_LIST" | grep -q gce; then AC_PYTHON_MODULE(google.auth) fi ## path to 3rd-party binaries AC_PATH_PROG([IPMITOOL_PATH], [ipmitool], [/usr/bin/ipmitool]) AC_PATH_PROG([OPENSTACK_PATH], [openstack], [/usr/bin/openstack]) AC_PATH_PROG([AMTTOOL_PATH], [amttool], [/usr/bin/amttool]) AC_PATH_PROG([GNUTLSCLI_PATH], [gnutlscli], [/usr/bin/gnutls-cli]) AC_PATH_PROG([COROSYNC_CMAPCTL_PATH], [corosync-cmapctl], [/usr/sbin/corosync-cmapctl]) AC_PATH_PROG([SG_PERSIST_PATH], [sg_persist], [/usr/bin/sg_persist]) AC_PATH_PROG([SG_TURS_PATH], [sg_turs], [/usr/bin/sg_turs]) AC_PATH_PROG([VGS_PATH], [vgs], [/usr/sbin/vgs]) AC_PATH_PROG([SUDO_PATH], [sudo], [/usr/bin/sudo]) AC_PATH_PROG([SSH_PATH], [ssh], [/usr/bin/ssh]) AC_PATH_PROG([TELNET_PATH], [telnet], [/usr/bin/telnet]) AC_PATH_PROG([MPATH_PATH], [mpathpersist], [/usr/sbin/mpathpersist]) AC_PATH_PROG([SBD_PATH], [sbd], [/sbin/sbd]) AC_PATH_PROG([SUDO_PATH], [sudo], [/usr/bin/sudo]) AC_PATH_PROG([SNMPWALK_PATH], [snmpwalk], [/usr/bin/snmpwalk]) AC_PATH_PROG([SNMPSET_PATH], [snmpset], [/usr/bin/snmpset]) AC_PATH_PROG([SNMPGET_PATH], [snmpget], [/usr/bin/snmpget]) AC_PATH_PROG([NOVA_PATH], [nova], [/usr/bin/nova]) AC_PATH_PROG([POWERMAN_PATH], [powerman], [/usr/bin/powerman]) AC_PATH_PROG([PING_CMD], [ping]) AC_PATH_PROG([PING6_CMD], [ping6]) AC_PATH_PROG([PING4_CMD], [ping4]) if test "x${ac_cv_path_PING_CMD}" = x; then # assume multicall-ping just not available in build-environment PING_CMD="/bin/ping" PING4_CMD="/bin/ping -4" PING6_CMD="/bin/ping -6" elif test "x${ac_cv_path_PING6_CMD}" = x; then # just IPv4 PING4_CMD="${ac_cv_path_PING_CMD}" elif test -L ${ac_cv_path_PING6_CMD}; then # assume multicall-ping PING4_CMD="${ac_cv_path_PING_CMD} -4" else # ping is just IPv4 PING4_CMD="${ac_cv_path_PING_CMD}" fi ## do subst AC_SUBST([LOGDIR]) AC_SUBST([CLUSTERVARRUN]) AC_SUBST([CLUSTERDATA]) AC_SUBST([FENCEAGENTSLIBDIR]) AC_SUBST([SNMPBIN]) AC_SUBST([AGENTS_LIST]) AM_CONDITIONAL(BUILD_FENCE_KDUMP, test $FENCE_KDUMP -eq 1) AM_CONDITIONAL(BUILD_FENCE_MANUAL, test $FENCE_MANUAL -eq 1) AM_CONDITIONAL(BUILD_FENCE_MPATH, test $FENCE_MPATH -eq 1) AM_CONDITIONAL(BUILD_FENCE_SCSI, test $FENCE_SCSI -eq 1) AM_CONDITIONAL(BUILD_FENCE_ZVM, test $FENCE_ZVM -eq 1) AM_CONDITIONAL(BUILD_FENCE_VIRT, test $FENCE_VIRT -eq 1) AM_CONDITIONAL(BUILD_XENAPILIB, test $XENAPILIB -eq 1) AC_SUBST([IPMITOOL_PATH]) AC_SUBST([OPENSTACK_PATH]) AC_SUBST([AMTTOOL_PATH]) AC_SUBST([COROSYNC_CMAPCTL_PATH]) AC_SUBST([SG_PERSIST_PATH]) AC_SUBST([SG_TURS_PATH]) AC_SUBST([VGS_PATH]) AC_SUBST([POWERMAN_PATH]) ## fence-virt stuff if test "x$FENCE_VIRT" = "x1"; then sysconf=$(eval echo $sysconfdir) AC_DEFINE_UNQUOTED([SYSCONFDIR], ["$sysconf"], [Default config dir]) fi ### The following options only are used when $modules="yes" ### # libvirt plugin: Enabled by default AC_ARG_ENABLE(libvirt-plugin, [AS_HELP_STRING([--disable-libvirt-plugin], [Disable local-mode libvirt backend plugin])], [ modlibvirt=$enableval ], [ modlibvirt=yes ]) AM_CONDITIONAL([modlibvirt], [test "x$modlibvirt" == "xyes"]) if test "x$modlibvirt" == "xyes" && test "x$FENCE_VIRT" = "x1"; then PKG_CHECK_MODULES([virt], [libvirt]) fi # cpg plugin: Disabled by default AC_ARG_ENABLE(cpg-plugin, [AS_HELP_STRING([--disable-cpg-plugin], [Enable CPG/libvirt backend plugin])], [ modcpg=$enableval ], [ modcpg=yes ]) AM_CONDITIONAL([modcpg], [test "x$modcpg" == "xyes"]) if test "x$modcpg" == "xyes" && test "x$FENCE_VIRT" = "x1"; then PKG_CHECK_MODULES([cpg], [libcpg]) fi # multicast plugin: Enabled by default AC_ARG_ENABLE(multicast-plugin, [AS_HELP_STRING([--disable-multicast-plugin], [Disable multicast listener plugin])], [ modmulticast=$enableval ], [ modmulticast=yes ]) AM_CONDITIONAL([modmulticast], [test "x$modmulticast" == "xyes"]) # tcp plugin: Enabled by default AC_ARG_ENABLE(tcp-plugin, [AS_HELP_STRING([--disable-tcp-plugin], [Disable TCP listener plugin])], [ modtcp=$enableval ], [ modtcp=yes ]) AM_CONDITIONAL([modtcp], [test "x$modtcp" == "xyes"]) # serial/libvirt plugin: Enabled by default AC_ARG_ENABLE(serial-plugin, [AS_HELP_STRING([--disable-serial-plugin], [Disable serial listener plugin])], [ modserial=$enableval ], [ modserial=yes ]) AM_CONDITIONAL([modserial], [test "x$modserial" == "xyes"]) # vsock plugin: Enabled by default AC_ARG_ENABLE(vsock-plugin, [AS_HELP_STRING([--disable-vsock-plugin], [Disable TCP listener plugin])], [ modvsock=$enableval ], [ modvsock=yes ]) AM_CONDITIONAL([modvsock], [test "x$modvsock" == "xyes"]) # # Compatibility symlink: enabled by default # AC_ARG_ENABLE(xvm-compat, [AS_HELP_STRING([--disable-xvm-compat], [Disable fence_xvm symlink compatibility])], [ xvmcompat=$enableval ], [ xvmcompat=yes ]) AM_CONDITIONAL([xvmcompat], [test "x$xvmcompat" == "xyes"]) # Try to detect the appropriate conf dir. Several systems have both /etc/default # and /etc/sysconfig but latter is always primary. AC_ARG_VAR(initconfdir, [directory for initscripts configuration]) if test "x$initconfdir" = x && test "x$FENCE_VIRT" = "x1"; then AC_CHECK_FILE(/etc/conf.d, [initconfdir='$(sysconfdir)/conf.d}'], [# Gentoo/Arch AC_CHECK_FILE(/etc/sysconfig, [initconfdir='$(sysconfdir)/sysconfig'], [# RedHat/Fedora/Slax/Mandriva/S AC_CHECK_FILE(/etc/default, [initconfdir='$(sysconfdir)/default'], [# Debian/Ubuntu AC_MSG_ERROR([could not determine system initscripts config dir; please set initconfdir manually.])])])]) fi ## *FLAGS handling ENV_CFLAGS="$CFLAGS" ENV_CPPFLAGS="$CPPFLAGS" ENV_LDFLAGS="$LDFLAGS" # debug build stuff if test "x${enable_debug}" = xyes; then AC_DEFINE_UNQUOTED([DEBUG], [1], [Compiling Debugging code]) OPT_CFLAGS="-O0" else OPT_CFLAGS="-O2" fi # gdb flags if test "x${GCC}" = xyes; then GDB_FLAGS="-ggdb3" else GDB_FLAGS="-g" fi # extra warnings EXTRA_WARNINGS="" WARNLIST=" error all shadow missing-prototypes missing-declarations strict-prototypes declaration-after-statement pointer-arith write-strings cast-align bad-function-cast missing-format-attribute format=2 format-security format-nonliteral no-long-long unsigned-char gnu89-inline no-strict-aliasing " for j in $WARNLIST; do if cc_supports_flag -W$j; then EXTRA_WARNINGS="$EXTRA_WARNINGS -W$j"; fi done AM_CFLAGS="$ENV_CFLAGS $OPT_CFLAGS $GDB_FLAGS $EXTRA_WARNINGS" AC_SUBST([AM_CFLAGS]) CPPFLAGS="-I\$(top_builddir)/make -I\$(top_srcdir)/make -I. $ENV_CPPFLAGS" LDFLAGS="$ENV_LDFLAGS" AM_EXTRA_RECURSIVE_TARGETS([delay-check xml-check xml-upload]) AX_PROG_DATE AS_IF([test "$ax_cv_prog_date_gnu_date:$ax_cv_prog_date_gnu_utc" = yes:yes], [UTC_DATE_AT="date -u -d@"], [AS_IF([test "x$ax_cv_prog_date_bsd_date" = xyes], [UTC_DATE_AT="date -u -r"], [AC_MSG_ERROR([date utility unable to convert epoch to UTC])])]) AC_SUBST([UTC_DATE_AT]) AC_ARG_VAR([SOURCE_EPOCH],[last modification date of the source]) AC_MSG_NOTICE([trying to determine source epoch]) AC_MSG_CHECKING([for source epoch in \$SOURCE_EPOCH]) AS_IF([test -n "$SOURCE_EPOCH"], [AC_MSG_RESULT([yes])], [AC_MSG_RESULT([no]) AC_MSG_CHECKING([for source epoch in source_epoch file]) AS_IF([test -e "$srcdir/source_epoch"], [read SOURCE_EPOCH <"$srcdir/source_epoch" AC_MSG_RESULT([yes])], [AC_MSG_RESULT([no]) AC_MSG_CHECKING([for source epoch baked in by gitattributes export-subst]) SOURCE_EPOCH='$Format:%at$' # template for rewriting by git-archive AS_CASE([$SOURCE_EPOCH], [?Format:*], # was not rewritten [AC_MSG_RESULT([no]) AC_MSG_CHECKING([for source epoch in \$SOURCE_DATE_EPOCH]) AS_IF([test "x$SOURCE_DATE_EPOCH" != x], [SOURCE_EPOCH="$SOURCE_DATE_EPOCH" AC_MSG_RESULT([yes])], [AC_MSG_RESULT([no]) AC_MSG_CHECKING([whether git log can provide a source epoch]) SOURCE_EPOCH=f${SOURCE_EPOCH#\$F} # convert into git log --pretty format SOURCE_EPOCH=$(cd "$srcdir" && git log -1 --pretty=${SOURCE_EPOCH%$} 2>/dev/null) AS_IF([test -n "$SOURCE_EPOCH"], [AC_MSG_RESULT([yes])], [AC_MSG_RESULT([no, using current time and breaking reproducibility]) SOURCE_EPOCH=$(date +%s)])])], [AC_MSG_RESULT([yes])] )]) ]) AC_MSG_NOTICE([using source epoch $($UTC_DATE_AT$SOURCE_EPOCH +'%F %T %Z')]) if test "x$VERSION" = "xUNKNOWN"; then AC_MSG_ERROR([m4_text_wrap([ configure was unable to determine the source tree's current version. This generally happens when using git archive (or the github download button) generated tarball/zip file. In order to workaround this issue, either use git - clone https://github.com/ClusterLabs/fence-virt.git or use an official release + clone https://github.com/ClusterLabs/fence-agents.git or use an official release tarball. Alternatively you can add a compatible version in a .tarball-version file at the top of the source tree, wipe your autom4te.cache dir and generated configure, and rerun autogen.sh. ], [ ], [ ], [76])]) fi AC_CONFIG_FILES([Makefile fence-agents.pc agents/Makefile lib/Makefile doc/Makefile systemd/Makefile systemd/fence-agents.conf agents/virt/Makefile agents/virt/config/Makefile agents/virt/common/Makefile agents/virt/client/Makefile agents/virt/server/Makefile agents/virt/man/Makefile ]) AC_OUTPUT diff --git a/docker/Dockerfile b/docker/Dockerfile new file mode 100644 index 00000000..6ac9480c --- /dev/null +++ b/docker/Dockerfile @@ -0,0 +1,34 @@ +FROM opensuse/leap:15.5 + +RUN zypper in -y \ + git \ + autoconf \ + automake \ + libtool \ + make \ + gcc \ + libcorosync-devel \ + libxslt1 \ + libxslt-tools \ + python3-devel \ + python3-httplib2 \ + python3-pexpect \ + python3-pycurl \ + python3-requests \ + python3-suds-jurko \ + python3-openwsman \ + python3-boto3 \ + python3-novaclient \ + python3-keystoneclient \ + mozilla-nss-devel \ + mozilla-nspr-devel \ + libvirt-devel \ + libxml2-devel \ + flex \ + bison \ + libuuid-devel \ + systemd + +WORKDIR /code +VOLUME /code +ENTRYPOINT ["./docker/entrypoint.sh"] diff --git a/docker/README.md b/docker/README.md new file mode 100644 index 00000000..2aef7421 --- /dev/null +++ b/docker/README.md @@ -0,0 +1,10 @@ +# Dockerfile to build the fence-agents locally + +Usage is as follows: + +``` +podman build -f docker/Dockerfile -t fence-agents:main . +podman run -it -v $PWD:/code --rm localhost/fence-agents:main +``` + +In case you are running docker replace `podman` with `docker` and it should work the same. diff --git a/docker/entrypoint.sh b/docker/entrypoint.sh new file mode 100755 index 00000000..caa778e2 --- /dev/null +++ b/docker/entrypoint.sh @@ -0,0 +1,8 @@ +#!/usr/bin/bash + +echo "### Running autogen" +./autogen.sh +echo "### Running configure" +./configure +echo "### Running make" +make diff --git a/fence-agents.spec.in b/fence-agents.spec.in index b6af20d9..343f1c1a 100644 --- a/fence-agents.spec.in +++ b/fence-agents.spec.in @@ -1,1445 +1,1458 @@ ############################################################################### ############################################################################### ## ## Copyright (C) 2019-2021 Red Hat, Inc. All rights reserved. ## ## This copyrighted material is made available to anyone wishing to use, ## modify, copy, or redistribute it subject to the terms and conditions ## of the GNU General Public License v.2. ## ############################################################################### ############################################################################### %global rcver @rcver@ %global alphatag @alphatag@ %global numcomm @numcomm@ %global dirty @dirty@ Name: fence-agents Summary: Set of unified programs capable of host isolation ("fencing") Version: @version@ Release: @specver@%{?rcver:%{rcver}}%{?numcomm:.%{numcomm}}%{?alphatag:.%{alphatag}}%{?dirty:.%{dirty}}%{?dist} License: GPL-2.0-or-later AND LGPL-2.0-or-later Group: System Environment/Base URL: https://github.com/ClusterLabs/fence-agents Source0: %{name}-%{version}%{?rcver:%{rcver}}%{?numcomm:.%{numcomm}}%{?alphatag:-%{alphatag}}%{?dirty:-%{dirty}}.tar.bz2 %if 0%{?rhel} == 7 %ifarch s390x %define rhel7_s390x 1 %endif %endif %if 0%{?rhel} == 9 %ifarch ppc64le s390x %define rhel9_ppc64le_s390x 1 %endif %endif # skipped: pve, raritan, rcd-serial, virsh %global allfenceagents %(cat < 7 || 0%{?rhel} > 7 || 0%{?suse_version} BuildRequires: python3-devel BuildRequires: python3-httplib2 python3-pexpect python3-pycurl python3-requests %if 0%{?suse_version} > 1500 BuildRequires: python3-suds-community %else BuildRequires: python3-suds %endif %if 0%{?fedora} || 0%{?centos} > 7 || 0%{?rhel} > 7 BuildRequires: openwsman-python3 %if ! %{defined rhel9_ppc64le_s390x} BuildRequires: python3-boto3 %endif %endif %if 0%{?suse_version} BuildRequires: python3-openwsman python3-boto3 %endif %else BuildRequires: python-devel BuildRequires: pexpect python-pycurl python-requests BuildRequires: python-suds openwsman-python %if ! %{defined rhel7_s390x} BuildRequires: python-boto3 python-httplib2 %endif # (-openstack) %ifarch x86_64 ppc64le BuildRequires: python-novaclient python-keystoneclient %endif %endif # fence-virt %if 0%{?suse_version} %define nss_devel mozilla-nss-devel %define nspr_devel mozilla-nspr-devel %define systemd_units systemd %else %define nss_devel nss-devel %define nspr_devel nspr-devel %define systemd_units systemd-units %endif BuildRequires: corosynclib-devel libvirt-devel BuildRequires: libxml2-devel %{nss_devel} %{nspr_devel} BuildRequires: flex bison libuuid-devel BuildRequires: %{systemd_units} # turn off the brp-python-bytecompile script # (for F28+ or equivalent, the latter is the preferred form) %global __os_install_post %(echo '%{__os_install_post}' | sed -e 's!/usr/lib[^[:space:]]*/brp-python-bytecompilespace:.*$!!g') #undefine __brp_python_bytecompile %prep %setup -q -n %{name}-%{version}%{?rcver:%{rcver}}%{?numcomm:.%{numcomm}}%{?alphatag:-%{alphatag}}%{?dirty:-%{dirty}} %autopatch -p1 # prevent compilation of something that won't get used anyway sed -i.orig 's|FENCE_ZVM=1|FENCE_ZVM=0|' configure.ac %build %if 0%{?fedora} || 0%{?centos} > 7 || 0%{?rhel} > 7 || 0%{?suse_version} export PYTHON="%{__python3}" %endif ./autogen.sh %{configure} \ %if %{defined _tmpfilesdir} SYSTEMD_TMPFILES_DIR=%{_tmpfilesdir} \ --with-fencetmpdir=/run/fence-agents %endif CFLAGS="$(echo '%{optflags}')" make %{_smp_mflags} %install rm -rf %{buildroot} make install DESTDIR=%{buildroot} mkdir -p %{buildroot}/%{_unitdir}/ install -m 0644 agents/virt/fence_virtd.service %{buildroot}/%{_unitdir}/ # bytecompile Python source code in a non-standard location %if 0%{?fedora} || 0%{?centos} > 7 || 0%{?rhel} > 7 %py_byte_compile %{__python3} %{buildroot}%{_datadir}/fence %endif # XXX unsure if /usr/sbin/fence_* should be compiled as well ## tree fix up # fix libfence permissions chmod 0755 %{buildroot}%{_datadir}/fence/*.py # remove docs rm -rf %{buildroot}/usr/share/doc/fence-agents # remove .a files rm -f %{buildroot}/%{_libdir}/%{name}/*.*a rm -f %{buildroot}/%{_libdir}/fence-virt/*.*a %post ccs_update_schema > /dev/null 2>&1 ||: # https://fedoraproject.org/wiki/Packaging:ScriptletSnippets#Systemd if [ $1 -eq 1 ] ; then # Initial installation /bin/systemctl daemon-reload >/dev/null 2>&1 || : fi %preun # https://fedoraproject.org/wiki/Packaging:ScriptletSnippets#Systemd if [ $1 -eq 0 ] ; then # Package removal, not upgrade /bin/systemctl --no-reload disable fence_virtd.service &> /dev/null || : /bin/systemctl stop fence_virtd.service &> /dev/null || : fi %postun # https://fedoraproject.org/wiki/Packaging:ScriptletSnippets#Systemd /bin/systemctl daemon-reload &> /dev/null || : if [ $1 -ge 1 ] ; then # Package upgrade, not uninstall /bin/systemctl try-restart fence_virtd.service &> /dev/null || : fi %triggerun -- fence_virtd < 0.3.0-1 # https://fedoraproject.org/wiki/Packaging:ScriptletSnippets#Packages_migrating_to_a_systemd_unit_file_from_a_SysV_initscript /usr/bin/systemd-sysv-convert --save fence_virtd &> /dev/null || : /sbin/chkconfig --del fence_virtd &> /dev/null || : /bin/systemctl daemon-reload >/dev/null 2>&1 || : /bin/systemctl try-restart fence_virtd.service &> /dev/null || : %description A collection of executables to handle isolation ("fencing") of possibly misbehaving hosts by the means of remote power management, blocking network, storage, or similar. They operate through a unified interface (calling conventions) devised for the original Red Hat clustering solution. %package common License: GPL-2.0-or-later AND LGPL-2.0-or-later Summary: Common base for Fence Agents %if 0%{?fedora} || 0%{?centos} > 7 || 0%{?rhel} > 7 || 0%{?suse_version} Requires: python3-pexpect python3-pycurl %else Requires: pexpect python-pycurl %endif BuildArch: noarch %description common A collection of executables to handle isolation ("fencing") of possibly misbehaving hosts by the means of remote power management, blocking network, storage, or similar. This package contains support files including the Python fencing library. %files common %doc doc/COPYING.* doc/COPYRIGHT doc/README.licence %{_datadir}/fence %exclude %{_datadir}/fence/azure_fence.* %exclude %{_datadir}/fence/__pycache__/azure_fence.* %exclude %{_datadir}/fence/XenAPI.* %exclude %{_datadir}/fence/__pycache__/XenAPI.* %{_datadir}/cluster %exclude %{_datadir}/cluster/fence_mpath_check* %exclude %{_datadir}/cluster/fence_scsi_check* %{_datadir}/pkgconfig/%{name}.pc %exclude %{_sbindir}/* %exclude %{_mandir}/man8/* %if %{defined _tmpfilesdir} %{_tmpfilesdir}/%{name}.conf %endif %if %{defined _tmpfilesdir} %dir %attr (1755, root, root) /run/%{name} %else %dir %attr (1755, root, root) %{_var}/run/%{name} %endif %package all License: GPL-2.0-or-later AND LGPL-2.0-or-later AND Apache-2.0 Summary: Set of unified programs capable of host isolation ("fencing") Requires: %{allfenceagents} Provides: fence-agents = %{version}-%{release} Obsoletes: fence-agents < 3.1.13 %description all A collection of executables to handle isolation ("fencing") of possibly misbehaving hosts by the means of remote power management, blocking network, storage, or similar. This package serves as a catch-all for all supported fence agents. %files all %ifarch x86_64 %package aliyun License: GPL-2.0-or-later AND LGPL-2.0-or-later AND Apache-2.0 AND BSD-3-Clause AND MIT Group: System Environment/Base Summary: Fence agent for Alibaba Cloud (Aliyun) Requires: fence-agents-common >= %{version}-%{release} Requires: python3-jmespath >= 0.9.0 Obsoletes: %{name} < %{version}-%{release} %description aliyun The fence-agents-aliyun package contains a fence agent for Alibaba Cloud (Aliyun) instances. %files aliyun %defattr(-,root,root,-) %{_sbindir}/fence_aliyun %{_mandir}/man8/fence_aliyun.8* %endif %package alom License: GPL-2.0-or-later AND LGPL-2.0-or-later Summary: Fence agent for SUN ALOM Requires: openssh-clients %if 0%{?fedora} < 33 || (0%{?rhel} && 0%{?rhel} < 9) || (0%{?centos} && 0%{?centos} < 9) || 0%{?suse_version} %if (0%{?rhel} && 0%{?rhel} < 8) || (0%{?centos} && 0%{?centos} < 8) Requires: telnet %else Recommends: telnet %endif %endif Requires: fence-agents-common = %{version}-%{release} BuildArch: noarch %description alom Fence agent for SUN ALOM. %files alom %{_sbindir}/fence_alom %{_mandir}/man8/fence_alom.8* %package amt License: GPL-2.0-or-later AND LGPL-2.0-or-later Summary: Fence agent for Intel AMT devices Requires: amtterm Requires: fence-agents-common = %{version}-%{release} BuildArch: noarch %description amt Fence agent for AMT compatibile devices that are accessed via 3rd party software. %files amt %{_sbindir}/fence_amt %{_mandir}/man8/fence_amt.8* %package amt-ws License: Apache-2.0 Summary: Fence agent for Intel AMT (WS-Man) devices Requires: fence-agents-common = %{version}-%{release} %if 0%{?fedora} || 0%{?centos} > 7 || 0%{?rhel} > 7 || 0%{?suse_version} %if 0%{?fedora} || 0%{?centos} > 7 || 0%{?rhel} > 7 Requires: openwsman-python3 %endif %if 0%{?suse_version} Requires: python3-openwsman %endif %else Requires: openwsman-python %endif BuildArch: noarch %description amt-ws Fence agent for AMT (WS-Man) devices. %files amt-ws %{_sbindir}/fence_amt_ws %{_mandir}/man8/fence_amt_ws.8* %package apc License: GPL-2.0-or-later AND LGPL-2.0-or-later Summary: Fence agent for APC devices Requires: openssh-clients %if 0%{?fedora} < 33 || (0%{?rhel} && 0%{?rhel} < 9) || (0%{?centos} && 0%{?centos} < 9) || 0%{?suse_version} %if (0%{?rhel} && 0%{?rhel} < 8) || (0%{?centos} && 0%{?centos} < 8) Requires: telnet %else Recommends: telnet %endif %endif Requires: fence-agents-common = %{version}-%{release} BuildArch: noarch %description apc Fence agent for APC devices that are accessed via telnet or SSH. %files apc %{_sbindir}/fence_apc %{_mandir}/man8/fence_apc.8* %package apc-snmp License: GPL-2.0-or-later AND LGPL-2.0-or-later Summary: Fence agents for APC devices (SNMP) Requires: net-snmp-utils Requires: fence-agents-common = %{version}-%{release} BuildArch: noarch %description apc-snmp Fence agents for APC devices that are accessed via the SNMP protocol. %files apc-snmp %{_sbindir}/fence_apc_snmp %{_mandir}/man8/fence_apc_snmp.8* %{_sbindir}/fence_tripplite_snmp %{_mandir}/man8/fence_tripplite_snmp.8* %if ! %{defined rhel7_s390x} %package aws License: GPL-2.0-or-later AND LGPL-2.0-or-later Summary: Fence agent for Amazon AWS Requires: fence-agents-common = %{version}-%{release} %if 0%{?fedora} || 0%{?centos} > 7 || 0%{?rhel} > 7 || 0%{?suse_version} Requires: python3-boto3 %else Requires: python-boto3 %endif BuildArch: noarch Obsoletes: fence-agents < 3.1.13 %description aws Fence agent for Amazon AWS instances. %files aws %{_sbindir}/fence_aws %{_mandir}/man8/fence_aws.8* %endif %package azure-arm License: GPL-2.0-or-later AND LGPL-2.0-or-later Summary: Fence agent for Azure Resource Manager Requires: fence-agents-common = %{version}-%{release} %if 0%{?fedora} || 0%{?centos} > 7 || 0%{?rhel} > 7 || 0%{?suse_version} %if 0%{?fedora} > 34 Requires: python3-azure-common Requires: python3-azure-identity Requires: python3-azure-mgmt-compute Requires: python3-azure-mgmt-network Requires: python3-msrestazure %else Requires: python3-azure-sdk %endif %else Requires: python-azure-sdk %endif BuildArch: noarch Obsoletes: fence-agents < 3.1.13 %description azure-arm Fence agent for Azure Resource Manager instances. %files azure-arm %{_sbindir}/fence_azure_arm %{_datadir}/fence/azure_fence.py* %if 0%{?fedora} || 0%{?centos} > 7 || 0%{?rhel} > 7 %{_datadir}/fence/__pycache__/azure_fence.* %endif %{_mandir}/man8/fence_azure_arm.8* %package bladecenter License: GPL-2.0-or-later AND LGPL-2.0-or-later Summary: Fence agent for IBM BladeCenter Requires: openssh-clients %if 0%{?fedora} < 33 || (0%{?rhel} && 0%{?rhel} < 9) || (0%{?centos} && 0%{?centos} < 9) || 0%{?suse_version} %if (0%{?rhel} && 0%{?rhel} < 8) || (0%{?centos} && 0%{?centos} < 8) Requires: telnet %else Recommends: telnet %endif %endif Requires: fence-agents-common = %{version}-%{release} BuildArch: noarch %description bladecenter Fence agent for IBM BladeCenter devices that are accessed via telnet or SSH. %files bladecenter %{_sbindir}/fence_bladecenter %{_mandir}/man8/fence_bladecenter.8* %package brocade License: GPL-2.0-or-later AND LGPL-2.0-or-later Summary: Fence agent for Brocade switches Requires: openssh-clients %if 0%{?fedora} < 33 || (0%{?rhel} && 0%{?rhel} < 9) || (0%{?centos} && 0%{?centos} < 9) || 0%{?suse_version} %if (0%{?rhel} && 0%{?rhel} < 8) || (0%{?centos} && 0%{?centos} < 8) Requires: telnet %else Recommends: telnet %endif %endif Requires: fence-agents-common = %{version}-%{release} BuildArch: noarch %description brocade Fence agent for Brocade devices that are accessed via telnet or SSH. %files brocade %{_sbindir}/fence_brocade %{_mandir}/man8/fence_brocade.8* %package cdu License: GPL-3.0-only Summary: Fence agent for a Sentry Switch CDU Requires: fence-agents-common = %{version}-%{release} BuildArch: noarch %description cdu Fence agent for Sentry Switch CDU power switch. %files cdu %{_sbindir}/fence_cdu %{_mandir}/man8/fence_cdu.8* %package cisco-mds License: GPL-2.0-or-later AND LGPL-2.0-or-later Summary: Fence agent for Cisco MDS 9000 series Requires: net-snmp-utils Requires: fence-agents-common = %{version}-%{release} BuildArch: noarch %description cisco-mds Fence agent for Cisco MDS 9000 series devices that are accessed via the SNMP protocol. %files cisco-mds %{_sbindir}/fence_cisco_mds %{_mandir}/man8/fence_cisco_mds.8* %package cisco-ucs License: GPL-2.0-or-later AND LGPL-2.0-or-later Summary: Fence agent for Cisco UCS series %if 0%{?fedora} || 0%{?centos} > 7 || 0%{?rhel} > 7 || 0%{?suse_version} Requires: python3-pycurl %else Requires: python-pycurl %endif Requires: fence-agents-common = %{version}-%{release} BuildArch: noarch %description cisco-ucs Fence agent for Cisco UCS series devices that are accessed via the SNMP protocol. %files cisco-ucs %{_sbindir}/fence_cisco_ucs %{_mandir}/man8/fence_cisco_ucs.8* %ifarch x86_64 ppc64le %package compute License: GPL-2.0-or-later AND LGPL-2.0-or-later Summary: Fence agent for Nova compute nodes %if 0%{?fedora} || 0%{?centos} > 7 || 0%{?rhel} > 7 || 0%{?suse_version} Requires: python3-requests Requires: python3-novaclient %else Requires: python-requests Requires: python2-novaclient %endif Requires: fence-agents-common = %{version}-%{release} BuildArch: noarch %description compute Fence agent for Nova compute nodes. %files compute %{_sbindir}/fence_compute %{_sbindir}/fence_evacuate %{_mandir}/man8/fence_compute.8* %{_mandir}/man8/fence_evacuate.8* %endif %package cyberpower-ssh License: GPL-2.0-or-later AND LGPL-2.0-or-later Summary: Fence agent for CyberPower network PDUs Requires: openssh-clients Requires: fence-agents-common = %{version}-%{release} BuildArch: noarch %description cyberpower-ssh %files cyberpower-ssh %{_sbindir}/fence_cyberpower_ssh %{_mandir}/man8/fence_cyberpower_ssh.8* %package docker License: GPL-2.0-or-later AND LGPL-2.0-or-later Summary: Fence agent for Docker %if 0%{?fedora} || 0%{?centos} > 7 || 0%{?rhel} > 7 || 0%{?suse_version} Requires: python3-pycurl %else Requires: python-pycurl %endif Requires: fence-agents-common = %{version}-%{release} BuildArch: noarch %description docker Fence agent for Docker images that are accessed over HTTP. %files docker %{_sbindir}/fence_docker %{_mandir}/man8/fence_docker.8* %package drac License: GPL-2.0-or-later AND LGPL-2.0-or-later Summary: Fence agent for Dell DRAC Requires: telnet Requires: fence-agents-common = %{version}-%{release} BuildArch: noarch %description drac Fence agent for Dell DRAC IV series devices that are accessed via telnet. %files drac %{_sbindir}/fence_drac %{_mandir}/man8/fence_drac.8* %package drac5 License: GPL-2.0-or-later AND LGPL-2.0-or-later Summary: Fence agent for Dell DRAC 5 Requires: openssh-clients %if 0%{?fedora} < 33 || (0%{?rhel} && 0%{?rhel} < 9) || (0%{?centos} && 0%{?centos} < 9) || 0%{?suse_version} %if (0%{?rhel} && 0%{?rhel} < 8) || (0%{?centos} && 0%{?centos} < 8) Requires: telnet %else Recommends: telnet %endif %endif Requires: fence-agents-common = %{version}-%{release} BuildArch: noarch %description drac5 Fence agent for Dell DRAC 5 series devices that are accessed via telnet or SSH. %files drac5 %{_sbindir}/fence_drac5 %{_mandir}/man8/fence_drac5.8* %package eaton-snmp License: GPL-2.0-or-later AND LGPL-2.0-or-later Summary: Fence agent for Eaton network power switches Requires: net-snmp-utils Requires: fence-agents-common = %{version}-%{release} BuildArch: noarch %description eaton-snmp Fence agent for Eaton network power switches that are accessed via the SNMP protocol. %files eaton-snmp %{_sbindir}/fence_eaton_snmp %{_mandir}/man8/fence_eaton_snmp.8* +%package eaton-ssh +License: GPL-2.0-or-later AND LGPL-2.0-or-later +Summary: Fence agent for Eaton network power switches +Requires: fence-agents-common = %{version}-%{release} +BuildArch: noarch +%description eaton-ssh +Fence agent for Eaton network power switches that are accessed +via the serial protocol tunnel over SSH. +%files eaton-ssh +%{_sbindir}/fence_eaton_ssh +%{_mandir}/man8/fence_eaton_ssh.8* + %package ecloud License: GPL-2.0-or-later AND LGPL-2.0-or-later Summary: Fence agent for eCloud and eCloud VPC Requires: python3-requests %if 0%{?fedora} || 0%{?centos} > 7 || 0%{?rhel} > 7 || 0%{?suse_version} Requires: python3-requests %else Requires: python-requests %endif Requires: fence-agents-common = %{version}-%{release} BuildArch: noarch %description ecloud Fence agent for eCloud and eCloud VPC from ANS Group Limited %files ecloud %{_sbindir}/fence_ecloud %{_mandir}/man8/fence_ecloud.8* %package emerson License: GPL-2.0-or-later AND LGPL-2.0-or-later Summary: Fence agent for Emerson devices (SNMP) Requires: fence-agents-common = %{version}-%{release} BuildArch: noarch %description emerson Fence agent for Emerson devices that are accessed via the SNMP protocol. %files emerson %{_sbindir}/fence_emerson %{_mandir}/man8/fence_emerson.8* %package eps License: GPL-2.0-or-later AND LGPL-2.0-or-later Summary: Fence agent for ePowerSwitch 8M+ power switches Requires: fence-agents-common = %{version}-%{release} BuildArch: noarch %description eps Fence agent for ePowerSwitch 8M+ power switches that are accessed via the HTTP(s) protocol. %files eps %{_sbindir}/fence_eps %{_mandir}/man8/fence_eps.8* %if ! %{defined rhel7_s390x} %package gce License: GPL-2.0-or-later AND LGPL-2.0-or-later Summary: Fence agent for GCE (Google Cloud Engine) Requires: fence-agents-common = %{version}-%{release} %if 0%{?fedora} || 0%{?centos} > 7 || 0%{?rhel} > 7 || 0%{?suse_version} %if 0%{?fedora} || 0%{?centos} > 7 || 0%{?rhel} > 7 Requires: python3-google-api-client %endif %if 0%{?suse_version} Requires: python3-google-api-python-client %endif %else Requires: python-google-api-client %endif BuildArch: noarch Obsoletes: fence-agents < 3.1.13 %description gce Fence agent for GCE (Google Cloud Engine) instances. %files gce %{_sbindir}/fence_gce %{_mandir}/man8/fence_gce.8* %endif %package hds-cb License: GPL-2.0-or-later AND LGPL-2.0-or-later Summary: Fence agent for Hitachi Compute Blade systems Requires: telnet Requires: fence-agents-common = %{version}-%{release} BuildArch: noarch %description hds-cb Fence agent for Hitachi Compute Blades that are accessed via telnet. %files hds-cb %{_sbindir}/fence_hds_cb %{_mandir}/man8/fence_hds_cb.8* %package heuristics-ping License: GPL-2.0-or-later AND LGPL-2.0-or-later Summary: Pseudo fence agent to affect other agents based on ping-heuristics Requires: fence-agents-common = %{version}-%{release} BuildArch: noarch Obsoletes: fence-agents < 3.1.13 %description heuristics-ping Fence pseudo agent used to affect other agents based on ping-heuristics. %files heuristics-ping %{_sbindir}/fence_heuristics_ping %{_mandir}/man8/fence_heuristics_ping.8* %package hpblade License: GPL-2.0-or-later AND LGPL-2.0-or-later Summary: Fence agent for HP BladeSystem devices Requires: openssh-clients %if 0%{?fedora} < 33 || (0%{?rhel} && 0%{?rhel} < 9) || (0%{?centos} && 0%{?centos} < 9) || 0%{?suse_version} %if (0%{?rhel} && 0%{?rhel} < 8) || (0%{?centos} && 0%{?centos} < 8) Requires: telnet %else Recommends: telnet %endif %endif Requires: fence-agents-common = %{version}-%{release} BuildArch: noarch %description hpblade Fence agent for HP BladeSystem devices that are accessed via telnet or SSH. %files hpblade %{_sbindir}/fence_hpblade %{_mandir}/man8/fence_hpblade.8* %package ibmblade License: GPL-2.0-or-later AND LGPL-2.0-or-later Summary: Fence agent for IBM BladeCenter Requires: net-snmp-utils Requires: fence-agents-common = %{version}-%{release} BuildArch: noarch %description ibmblade Fence agent for IBM BladeCenter devices that are accessed via the SNMP protocol. %files ibmblade %{_sbindir}/fence_ibmblade %{_mandir}/man8/fence_ibmblade.8* %package ibmz License: GPL-2.0-or-later AND LGPL-2.0-or-later Summary: Fence agent for IBM z LPARs %if 0%{?fedora} || 0%{?centos} > 7 || 0%{?rhel} > 7 || 0%{?suse_version} Requires: python3-requests %else Requires: python-requests %endif Requires: fence-agents-common = %{version}-%{release} BuildArch: noarch %description ibmz Fence agent for IBM z LPARs that are accessed via the HMC Web Services REST API. %files ibmz %{_sbindir}/fence_ibmz %{_mandir}/man8/fence_ibmz.8* %package ibm-powervs License: GPL-2.0-or-later AND LGPL-2.0-or-later Summary: Fence agent for IBM PowerVS Requires: fence-agents-common = %{version}-%{release} BuildArch: noarch %description ibm-powervs Fence agent for IBM PowerVS that are accessed via REST API. %files ibm-powervs %{_sbindir}/fence_ibm_powervs %{_mandir}/man8/fence_ibm_powervs.8* %package ibm-vpc License: GPL-2.0-or-later AND LGPL-2.0-or-later Summary: Fence agent for IBM Cloud VPC Requires: fence-agents-common = %{version}-%{release} BuildArch: noarch %description ibm-vpc Fence agent for IBM Cloud VPC that are accessed via REST API. %files ibm-vpc %{_sbindir}/fence_ibm_vpc %{_mandir}/man8/fence_ibm_vpc.8* %package ifmib License: GPL-2.0-or-later AND LGPL-2.0-or-later Summary: Fence agent for devices with IF-MIB interfaces Requires: net-snmp-utils Requires: fence-agents-common = %{version}-%{release} BuildArch: noarch %description ifmib Fence agent for IF-MIB interfaces that are accessed via the SNMP protocol. %files ifmib %{_sbindir}/fence_ifmib %{_mandir}/man8/fence_ifmib.8* %package ilo2 License: GPL-2.0-or-later AND LGPL-2.0-or-later Summary: Fence agents for HP iLO2 devices Requires: gnutls-utils Requires: fence-agents-common = %{version}-%{release} BuildArch: noarch %description ilo2 Fence agents for HP iLO2 devices that are accessed via the HTTP(s) protocol. %files ilo2 %{_sbindir}/fence_ilo %{_sbindir}/fence_ilo2 %{_mandir}/man8/fence_ilo.8* %{_mandir}/man8/fence_ilo2.8* %package ilo-moonshot License: GPL-2.0-or-later AND LGPL-2.0-or-later Summary: Fence agent for HP iLO Moonshot devices Requires: openssh-clients %if 0%{?fedora} < 33 || (0%{?rhel} && 0%{?rhel} < 9) || (0%{?centos} && 0%{?centos} < 9) || 0%{?suse_version} %if (0%{?rhel} && 0%{?rhel} < 8) || (0%{?centos} && 0%{?centos} < 8) Requires: telnet %else Recommends: telnet %endif %endif Requires: fence-agents-common = %{version}-%{release} BuildArch: noarch %description ilo-moonshot Fence agent for HP iLO Moonshot devices that are accessed via telnet or SSH. %files ilo-moonshot %{_sbindir}/fence_ilo_moonshot %{_mandir}/man8/fence_ilo_moonshot.8* %package ilo-mp License: GPL-2.0-or-later AND LGPL-2.0-or-later Summary: Fence agent for HP iLO MP devices Requires: openssh-clients %if 0%{?fedora} < 33 || (0%{?rhel} && 0%{?rhel} < 9) || (0%{?centos} && 0%{?centos} < 9) || 0%{?suse_version} %if (0%{?rhel} && 0%{?rhel} < 8) || (0%{?centos} && 0%{?centos} < 8) Requires: telnet %else Recommends: telnet %endif %endif Requires: fence-agents-common = %{version}-%{release} BuildArch: noarch %description ilo-mp Fence agent for HP iLO MP devices that are accessed via telnet or SSH. %files ilo-mp %{_sbindir}/fence_ilo_mp %{_mandir}/man8/fence_ilo_mp.8* %package ilo-ssh License: GPL-2.0-or-later AND LGPL-2.0-or-later Summary: Fence agents for HP iLO devices over SSH Requires: openssh-clients Requires: fence-agents-common = %{version}-%{release} BuildArch: noarch %description ilo-ssh Fence agents for HP iLO devices that are accessed via telnet or SSH. %files ilo-ssh %{_sbindir}/fence_ilo_ssh %{_mandir}/man8/fence_ilo_ssh.8* %{_sbindir}/fence_ilo3_ssh %{_mandir}/man8/fence_ilo3_ssh.8* %{_sbindir}/fence_ilo4_ssh %{_mandir}/man8/fence_ilo4_ssh.8* %{_sbindir}/fence_ilo5_ssh %{_mandir}/man8/fence_ilo5_ssh.8* %package intelmodular License: GPL-2.0-or-later AND LGPL-2.0-or-later Summary: Fence agent for devices with Intel Modular interfaces Requires: net-snmp-utils Requires: fence-agents-common = %{version}-%{release} BuildArch: noarch %description intelmodular Fence agent for Intel Modular interfaces that are accessed via the SNMP protocol. %files intelmodular %{_sbindir}/fence_intelmodular %{_mandir}/man8/fence_intelmodular.8* %package ipdu License: GPL-2.0-or-later AND LGPL-2.0-or-later Summary: Fence agent for IBM iPDU network power switches Requires: net-snmp-utils Requires: fence-agents-common = %{version}-%{release} BuildArch: noarch %description ipdu Fence agent for IBM iPDU network power switches that are accessed via the SNMP protocol. %files ipdu %{_sbindir}/fence_ipdu %{_mandir}/man8/fence_ipdu.8* %package ipmilan License: GPL-2.0-or-later AND LGPL-2.0-or-later Summary: Fence agents for devices with IPMI interface Requires: /usr/bin/ipmitool Requires: fence-agents-common = %{version}-%{release} BuildArch: noarch %description ipmilan Fence agents for devices with IPMI interface. %files ipmilan %{_sbindir}/fence_ipmilan %{_mandir}/man8/fence_ipmilan.8* %{_sbindir}/fence_idrac %{_mandir}/man8/fence_idrac.8* %{_sbindir}/fence_ilo3 %{_mandir}/man8/fence_ilo3.8* %{_sbindir}/fence_ilo4 %{_mandir}/man8/fence_ilo4.8* %{_sbindir}/fence_ilo5 %{_mandir}/man8/fence_ilo5.8* %{_sbindir}/fence_ipmilanplus %{_mandir}/man8/fence_ipmilanplus.8* %{_sbindir}/fence_imm %{_mandir}/man8/fence_imm.8* %ifarch x86_64 ppc64le %package ironic License: GPL-2.0-or-later AND LGPL-2.0-or-later Summary: Fence agent for OpenStack's Ironic (Bare Metal as a service) Requires: fence-agents-common = %{version}-%{release} BuildArch: noarch %description ironic Fence agent for OpenStack's Ironic (Bare Metal as a service) service. %files ironic %{_sbindir}/fence_ironic %{_mandir}/man8/fence_ironic.8* %endif %package kdump License: GPL-2.0-or-later AND LGPL-2.0-or-later Summary: Fence agent for use with kdump crash recovery service Requires: fence-agents-common = %{version}-%{release} # this cannot be noarch since it's compiled %description kdump Fence agent for use with kdump crash recovery service. %files kdump %{_sbindir}/fence_kdump %{_libexecdir}/fence_kdump_send %{_mandir}/man8/fence_kdump.8* %{_mandir}/man8/fence_kdump_send.8* %package kubevirt License: GPL-2.0-or-later AND LGPL-2.0-or-later Summary: Fence agent for KubeVirt platform Requires: python3-openshift >= 0.12.1 Requires: fence-agents-common = %{version}-%{release} BuildArch: noarch %description kubevirt Fence agent for KubeVirt platform. %files kubevirt %{_sbindir}/fence_kubevirt %{_mandir}/man8/fence_kubevirt.8* %package ldom License: GPL-2.0-or-later AND LGPL-2.0-or-later Summary: Fence agent for Sun LDom virtual machines Requires: openssh-clients %if 0%{?fedora} < 33 || (0%{?rhel} && 0%{?rhel} < 9) || (0%{?centos} && 0%{?centos} < 9) || 0%{?suse_version} %if (0%{?rhel} && 0%{?rhel} < 8) || (0%{?centos} && 0%{?centos} < 8) Requires: telnet %else Recommends: telnet %endif %endif Requires: fence-agents-common = %{version}-%{release} BuildArch: noarch %description ldom Fence agent for APC devices that are accessed via telnet or SSH. %files ldom %{_sbindir}/fence_ldom %{_mandir}/man8/fence_ldom.8* %package lpar License: GPL-2.0-or-later AND LGPL-2.0-or-later Summary: Fence agent for IBM LPAR Requires: openssh-clients %if 0%{?fedora} < 33 || (0%{?rhel} && 0%{?rhel} < 9) || (0%{?centos} && 0%{?centos} < 9) || 0%{?suse_version} %if (0%{?rhel} && 0%{?rhel} < 8) || (0%{?centos} && 0%{?centos} < 8) Requires: telnet %else Recommends: telnet %endif %endif Requires: fence-agents-common = %{version}-%{release} BuildArch: noarch %description lpar Fence agent for IBM LPAR devices that are accessed via telnet or SSH. %files lpar %{_sbindir}/fence_lpar %{_mandir}/man8/fence_lpar.8* %package mpath License: GPL-2.0-or-later AND LGPL-2.0-or-later Summary: Fence agent for reservations over Device Mapper Multipath Requires: device-mapper-multipath Requires: fence-agents-common = %{version}-%{release} BuildArch: noarch %description mpath Fence agent for SCSI persistent reservation over Device Mapper Multipath. %files mpath %{_sbindir}/fence_mpath %{_datadir}/cluster/fence_mpath_check* %{_mandir}/man8/fence_mpath.8* %package netio License: GPL-2.0-or-later AND LGPL-2.0-or-later Summary: Fence agent for Koukaam NETIO devices Requires: openssh-clients %if 0%{?fedora} < 33 || (0%{?rhel} && 0%{?rhel} < 9) || (0%{?centos} && 0%{?centos} < 9) || 0%{?suse_version} %if (0%{?rhel} && 0%{?rhel} < 8) || (0%{?centos} && 0%{?centos} < 8) Requires: telnet %else Recommends: telnet %endif %endif Requires: fence-agents-common = %{version}-%{release} BuildArch: noarch %description netio Fence agent for Koukaam NETIO devices that are accessed via telnet or SSH. %files netio %{_sbindir}/fence_netio %{_mandir}/man8/fence_netio.8* %ifarch x86_64 ppc64le %package openstack License: GPL-2.0-or-later AND LGPL-2.0-or-later Summary: Fence agent for OpenStack's Nova service %if 0%{?fedora} || 0%{?centos} > 7 || 0%{?rhel} > 7 || 0%{?suse_version} Requires: python3-requests %else Requires: python-requests %endif Requires: fence-agents-common = %{version}-%{release} BuildArch: noarch %description openstack Fence agent for OpenStack's Nova service. %files openstack %{_sbindir}/fence_openstack %{_mandir}/man8/fence_openstack.8* %endif %package ovh License: GPL-2.0-or-later AND LGPL-2.0-or-later Summary: Fence agent for OVH provider %if 0%{?fedora} || 0%{?centos} > 7 || 0%{?rhel} > 7 || 0%{?suse_version} %if 0%{?suse_version} > 1500 Requires: python3-suds-community %else Requires: python3-suds %endif %else Requires: python-suds %endif Requires: fence-agents-common = %{version}-%{release} BuildArch: noarch %description ovh Fence agent for OVH hosting provider. %files ovh %{_sbindir}/fence_ovh %{_mandir}/man8/fence_ovh.8* # skipped from allfenceagents %package pve License: GPL-2.0-or-later AND LGPL-2.0-or-later Summary: Fence agent for PVE %if 0%{?fedora} || 0%{?centos} > 7 || 0%{?rhel} > 7 || 0%{?suse_version} Requires: python3-pycurl %else Requires: python-pycurl %endif Requires: fence-agents-common = %{version}-%{release} BuildArch: noarch %description pve Fence agent for PVE. %files pve %{_sbindir}/fence_pve %{_mandir}/man8/fence_pve.8* # skipped from allfenceagents %package raritan License: GPL-2.0-or-later AND LGPL-2.0-or-later Summary: Fence agent for Raritan Dominion PX Requires: fence-agents-common = %{version}-%{release} BuildArch: noarch %description raritan Fence agent for Raritan Dominion PX. %files raritan %{_sbindir}/fence_raritan %{_mandir}/man8/fence_raritan.8* # skipped from allfenceagents %package rcd-serial License: GPL-2.0-or-later AND LGPL-2.0-or-later Summary: Fence agent for RCD serial Requires: fence-agents-common = %{version}-%{release} BuildArch: noarch %description rcd-serial Fence agent for RCD serial. %files rcd-serial %{_sbindir}/fence_rcd_serial %{_mandir}/man8/fence_rcd_serial.8* %package redfish License: GPL-2.0-or-later AND LGPL-2.0-or-later Group: System Environment/Base Summary: Fence agent for Redfish Requires: fence-agents-common >= %{version}-%{release} %if 0%{?fedora} || 0%{?centos} > 7 || 0%{?rhel} > 7 || 0%{?suse_version} Requires: python3-requests %else Requires: python-requests %endif Obsoletes: fence-agents < 3.1.13 %description redfish The fence-agents-redfish package contains a fence agent for Redfish %files redfish %defattr(-,root,root,-) %{_sbindir}/fence_redfish %{_mandir}/man8/fence_redfish.8* %package rhevm License: GPL-2.0-or-later AND LGPL-2.0-or-later Summary: Fence agent for RHEV-M Requires: fence-agents-common = %{version}-%{release} BuildArch: noarch %description rhevm Fence agent for RHEV-M via REST API. %files rhevm %{_sbindir}/fence_rhevm %{_mandir}/man8/fence_rhevm.8* %package rsa License: GPL-2.0-or-later AND LGPL-2.0-or-later Summary: Fence agent for IBM RSA II Requires: openssh-clients %if 0%{?fedora} < 33 || (0%{?rhel} && 0%{?rhel} < 9) || (0%{?centos} && 0%{?centos} < 9) || 0%{?suse_version} %if (0%{?rhel} && 0%{?rhel} < 8) || (0%{?centos} && 0%{?centos} < 8) Requires: telnet %else Recommends: telnet %endif %endif Requires: fence-agents-common = %{version}-%{release} BuildArch: noarch %description rsa Fence agent for IBM RSA II devices that are accessed via telnet or SSH. %files rsa %{_sbindir}/fence_rsa %{_mandir}/man8/fence_rsa.8* %package rsb License: GPL-2.0-or-later AND LGPL-2.0-or-later Summary: Fence agent for Fujitsu RSB Requires: openssh-clients %if 0%{?fedora} < 33 || (0%{?rhel} && 0%{?rhel} < 9) || (0%{?centos} && 0%{?centos} < 9) || 0%{?suse_version} %if (0%{?rhel} && 0%{?rhel} < 8) || (0%{?centos} && 0%{?centos} < 8) Requires: telnet %else Recommends: telnet %endif %endif Requires: fence-agents-common = %{version}-%{release} BuildArch: noarch %description rsb Fence agent for Fujitsu RSB devices that are accessed via telnet or SSH. %files rsb %{_sbindir}/fence_rsb %{_mandir}/man8/fence_rsb.8* %package sanbox2 License: GPL-2.0-or-later AND LGPL-2.0-or-later Summary: Fence agent for QLogic SANBox2 FC switches Requires: telnet Requires: fence-agents-common = %{version}-%{release} BuildArch: noarch %description sanbox2 Fence agent for QLogic SANBox2 switches that are accessed via telnet. %files sanbox2 %{_sbindir}/fence_sanbox2 %{_mandir}/man8/fence_sanbox2.8* %package sbd License: GPL-2.0-or-later AND LGPL-2.0-or-later Summary: Fence agent for SBD (storage-based death) Requires: sbd Requires: fence-agents-common = %{version}-%{release} BuildArch: noarch %description sbd Fence agent for SBD (storage-based death). %files sbd %{_sbindir}/fence_sbd %{_mandir}/man8/fence_sbd.8* %package scsi License: GPL-2.0-or-later AND LGPL-2.0-or-later Summary: Fence agent for SCSI persistent reservations Requires: sg3_utils Requires: fence-agents-common = %{version}-%{release} BuildArch: noarch %description scsi Fence agent for SCSI persistent reservations. %files scsi %{_sbindir}/fence_scsi %{_datadir}/cluster/fence_scsi_check %{_datadir}/cluster/fence_scsi_check_hardreboot %{_mandir}/man8/fence_scsi.8* %package vbox License: GPL-2.0-or-later AND LGPL-2.0-or-later Summary: Fence agent for VirtualBox Requires: openssh-clients Requires: fence-agents-common = %{version}-%{release} BuildArch: noarch %description vbox Fence agent for VirtualBox dom0 accessed via SSH. %files vbox %{_sbindir}/fence_vbox %{_mandir}/man8/fence_vbox.8* # skipped from allfenceagents %package virsh License: GPL-2.0-or-later AND LGPL-2.0-or-later Summary: Fence agent for virtual machines based on libvirt Requires: openssh-clients /usr/bin/virsh Requires: fence-agents-common = %{version}-%{release} BuildArch: noarch %description virsh Fence agent for virtual machines that are accessed via SSH. %files virsh %{_sbindir}/fence_virsh %{_mandir}/man8/fence_virsh.8* %package vmware License: GPL-2.0-or-later AND LGPL-2.0-or-later Summary: Fence agent for VMWare with VI Perl Toolkit or vmrun %if 0%{?fedora} || 0%{?centos} > 7 || 0%{?rhel} > 7 || 0%{?suse_version} Requires: python3-pexpect %else Requires: pexpect %endif Requires: fence-agents-common = %{version}-%{release} BuildArch: noarch %description vmware Fence agent for VMWare accessed with VI Perl Toolkit or vmrun. %files vmware %{_sbindir}/fence_vmware %{_mandir}/man8/fence_vmware.8* %package vmware-rest License: GPL-2.0-or-later AND LGPL-2.0-or-later Summary: Fence agent for VMWare with REST API Requires: fence-agents-common = %{version}-%{release} BuildArch: noarch Obsoletes: fence-agents < 3.1.13 %description vmware-rest Fence agent for VMWare with REST API. %files vmware-rest %{_sbindir}/fence_vmware_rest %{_mandir}/man8/fence_vmware_rest.8* %package vmware-soap License: GPL-2.0-or-later AND LGPL-2.0-or-later Summary: Fence agent for VMWare with SOAP API v4.1+ %if 0%{?fedora} || 0%{?centos} > 7 || 0%{?rhel} > 7 || 0%{?suse_version} %if 0%{?suse_version} > 1500 Requires: python3-suds-community %else Requires: python3-suds %endif %else Requires: python-suds %endif Requires: fence-agents-common = %{version}-%{release} BuildArch: noarch %description vmware-soap Fence agent for VMWare with SOAP API v4.1+. %files vmware-soap %{_sbindir}/fence_vmware_soap %{_mandir}/man8/fence_vmware_soap.8* %package vmware-vcloud License: GPL-2.0-or-later AND LGPL-2.0-or-later Summary: Fence agent for VMWare vCloud Director Requires: fence-agents-common = %{version}-%{release} BuildArch: noarch Obsoletes: fence-agents < 3.1.13 %description vmware-vcloud Fence agent for VMWare vCloud Director. %files vmware-vcloud %{_sbindir}/fence_vmware_vcloud %{_mandir}/man8/fence_vmware_vcloud.8* %package wti License: GPL-2.0-or-later AND LGPL-2.0-or-later Summary: Fence agent for WTI Network power switches Requires: openssh-clients %if 0%{?fedora} < 33 || (0%{?rhel} && 0%{?rhel} < 9) || (0%{?centos} && 0%{?centos} < 9) || 0%{?suse_version} %if (0%{?rhel} && 0%{?rhel} < 8) || (0%{?centos} && 0%{?centos} < 8) Requires: telnet %else Recommends: telnet %endif %endif Requires: fence-agents-common = %{version}-%{release} BuildArch: noarch %description wti Fence agent for WTI network power switches that are accessed via telnet or SSH. %files wti %{_sbindir}/fence_wti %{_mandir}/man8/fence_wti.8* %package xenapi License: GPL-2.0-or-later AND LGPL-2.0-or-later Summary: Fence agent for Citrix XenServer over XenAPI %if 0%{?fedora} || 0%{?centos} > 7 || 0%{?rhel} > 7 || 0%{?suse_version} Requires: python3-pexpect %else Requires: pexpect %endif Requires: fence-agents-common = %{version}-%{release} BuildArch: noarch %description xenapi Fence agent for Citrix XenServer accessed over XenAPI. %files xenapi %{_sbindir}/fence_xenapi %{_datadir}/fence/XenAPI.py* %if 0%{?fedora} || 0%{?centos} > 7 || 0%{?rhel} > 7 %{_datadir}/fence/__pycache__/XenAPI.* %endif %{_mandir}/man8/fence_xenapi.8* %package zvm License: GPL-2.0-or-later AND LGPL-2.0-or-later Summary: Fence agent for IBM z/VM over IP Requires: fence-agents-common = %{version}-%{release} BuildArch: noarch %description zvm Fence agent for IBM z/VM over IP. %files zvm %{_sbindir}/fence_zvmip %{_mandir}/man8/fence_zvmip.8* # fence-virt %package -n fence-virt Summary: A pluggable fencing framework for virtual machines Requires(post): systemd-sysv %{systemd_units} Requires(preun): %{systemd_units} Requires(postun): %{systemd_units} %description -n fence-virt Fencing agent for virtual machines. %files -n fence-virt %doc agents/virt/docs/* %{_sbindir}/fence_virt %{_sbindir}/fence_xvm %{_mandir}/man8/fence_virt.* %{_mandir}/man8/fence_xvm.* %package -n fence-virtd Summary: Daemon which handles requests from fence-virt %description -n fence-virtd This package provides the host server framework, fence_virtd, for fence_virt. The fence_virtd host daemon is resposible for processing fencing requests from virtual machines and routing the requests to the appropriate physical machine for action. %files -n fence-virtd %{_sbindir}/fence_virtd %{_unitdir}/fence_virtd.service %config(noreplace) %{_sysconfdir}/fence_virt.conf %dir %{_libdir}/fence-virt %{_libdir}/fence-virt/vsock.so %{_mandir}/man5/fence_virt.conf.* %{_mandir}/man8/fence_virtd.* %package -n fence-virtd-multicast Summary: Multicast listener for fence-virtd Requires: fence-virtd %description -n fence-virtd-multicast Provides multicast listener capability for fence-virtd. %files -n fence-virtd-multicast %{_libdir}/fence-virt/multicast.so %package -n fence-virtd-serial Summary: Serial VMChannel listener for fence-virtd Requires: libvirt >= 0.6.2 Requires: fence-virtd %description -n fence-virtd-serial Provides serial VMChannel listener capability for fence-virtd. %files -n fence-virtd-serial %{_libdir}/fence-virt/serial.so %package -n fence-virtd-tcp Summary: TCP listener for fence-virtd Requires: fence-virtd %description -n fence-virtd-tcp Provides TCP listener capability for fence-virtd. %files -n fence-virtd-tcp %{_libdir}/fence-virt/tcp.so %package -n fence-virtd-libvirt Summary: Libvirt backend for fence-virtd Requires: libvirt >= 0.6.0 Requires: fence-virtd %description -n fence-virtd-libvirt Provides fence_virtd with a connection to libvirt to fence virtual machines. Useful for running a cluster of virtual machines on a desktop. %files -n fence-virtd-libvirt %{_libdir}/fence-virt/virt.so %package -n fence-virtd-cpg Summary: CPG/libvirt backend for fence-virtd Requires: corosynclib Requires: fence-virtd %description -n fence-virtd-cpg Provides fence_virtd with a connection to libvirt to fence virtual machines. Uses corosync CPG to keep track of VM locations to allow for non-local VMs to be fenced when VMs are located on corosync cluster nodes. %files -n fence-virtd-cpg %{_libdir}/fence-virt/cpg.so %changelog * @date@ Autotools generated version - @version@-@specver@-@numcomm@.@alphatag@.@dirty@ - Autotools generated version diff --git a/tests/data/metadata/fence_eaton_ssh.xml b/tests/data/metadata/fence_eaton_ssh.xml new file mode 100644 index 00000000..a3be1ac6 --- /dev/null +++ b/tests/data/metadata/fence_eaton_ssh.xml @@ -0,0 +1,206 @@ + + +fence_eaton_ssh is a fence agent that connects to Eaton ePDU devices. It logs into device via ssh and reboot a specified outlet. +https://www.eaton.com/ + + + + + Fencing action + + + + + Force Python regex for command prompt + + + + + Force Python regex for command prompt + + + + Identity file (private key) for SSH + + + + + Forces agent to use IPv4 addresses only + + + + + Forces agent to use IPv6 addresses only + + + + + IP address or hostname of fencing device + + + + + IP address or hostname of fencing device + + + + + TCP/UDP port to use for connection with device + + + + + Login name + + + + + Login password or passphrase + + + + + Script to run to retrieve password + + + + + Login password or passphrase + + + + + Script to run to retrieve password + + + + + Physical plug number on device, UUID or identification of machine + + + + + Physical plug number on device, UUID or identification of machine + + + + + Use SSH connection + + + + + Use SSH connection + + + + + SSH options to use + + + + + Login name + + + + + Disable logging to stderr. Does not affect --verbose or --debug-file or logging to syslog. + + + + + Verbose mode. Multiple -v flags can be stacked on the command line (e.g., -vvv) to increase verbosity. + + + + + Level of debugging detail in output. Defaults to the number of --verbose flags specified on the command line, or to 1 if verbose=1 in a stonith device configuration (i.e., on stdin). + + + + + Write debug information to given file + + + + Write debug information to given file + + + + + Display version information and exit + + + + + Display help and exit + + + + + Separator for plug parameter when specifying more than 1 plug + + + + + Separator for CSV created by 'list' operation + + + + + Wait X seconds before fencing is started + + + + + Disable timeout (true/false) (default: true when run from Pacemaker 2.0+) + + + + + Wait X seconds for cmd prompt after login + + + + + Test X seconds for status change after ON/OFF + + + + + Wait X seconds after issuing ON/OFF + + + + + Wait X seconds for cmd prompt after issuing command + + + + + Sleep X seconds between status calls during a STONITH action + + + + + Count of attempts to retry power on + + + + Path to ssh binary + + + + + + + + + + + + + + +