Skip to main content

agent

Module to manage Agent classes.

Description:

This module:

  1. Processes a variety of information from agents
  2. Posts the data using HTTP to a server listed in the configuration file

Agent Objects

class Agent()

Agent class for daemons.

__init__

def __init__(parent, child=None, config=None)

Initialize the class.

Arguments:

  • parent - Name of parent daemon
  • child - Name of child daemon
  • config - ConfigCore object

Returns:

None

name

def name()

Return agent name.

Arguments:

None

Returns:

  • value - Name of agent

query

def query()

Create placeholder method. Do not delete.

Arguments:

None

Returns:

None

_AgentRun Objects

class _AgentRun()

Class that defines basic run function for AgentDaemons.

__init__

def __init__(agent)

Initialize the class.

Arguments:

  • agent - agent object

Returns:

None

run

def run()

Start Polling.

Arguments:

None

Returns:

None

AgentDaemon Objects

class AgentDaemon(_AgentRun, Daemon)

Class that manages base agent daemonization.

__init__

def __init__(agent)

Initialize the class.

Arguments:

  • agent - agent object

Returns:

None

GracefulAgentDaemon Objects

class GracefulAgentDaemon(_AgentRun, GracefulDaemon)

Class that manages graceful agent daemonization.

__init__

def __init__(agent, timeout=30)

Initialize the class.

Arguments:

  • agent - agent object
  • timeout - agent timeout

Returns:

None

AgentCLI Objects

class AgentCLI()

Class that manages the agent CLI.

Arguments:

None

Returns:

None

__init__

def __init__(graceful=False)

Initialize the class.

Arguments:

  • graceful - True if graceful restart is required

Returns:

None

process

def process(additional_help=None)

Return all the CLI options.

Arguments:

  • additional_help - CLI additional help string for argparse

Returns:

  • args - Namespace() containing all of our CLI arguments as objects
    • filename: Path to the configuration file

control

def control(agent, timeout=60)

Control the agent from the CLI.

Arguments:

  • agent - Agent object
  • timeout - Agent timeout

Returns:

None

AgentAPI Objects

class AgentAPI(Agent)

Applcication API agent that serves web pages.

Arguments:

None

Returns:

None

__init__

def __init__(parent, child, app, config=None)

Initialize the class.

Arguments:

  • parent - Name of parent daemon
  • child - Name of child daemon
  • app - Flask App
  • config - ConfigCore object

Returns:

None

query

def query()

Query all remote targets for data.

Arguments:

None

Returns:

None

_StandaloneApplication Objects

class _StandaloneApplication(BaseApplication)

Class to integrate the Gunicorn WSGI with the Flask application.

Modified from: http://docs.gunicorn.org/en/latest/custom.html

__init__

def __init__(app, parent, options=None)

Initialize the class.

Arguments:

  • app - Flask application object of type Flask(name)
  • parent - Name of parent process that is invoking the API
  • options - Gunicorn CLI options

Returns:

None

load_config

def load_config()

Load the configuration.

Arguments:

None

Returns:

None

load

def load()

Run the Flask application throught the Gunicorn WSGI.

Arguments:

None

Returns:

  • self.application - Flask application object

configuration

switchmap classes that manage various configurations.

_Config Objects

class _Config()

Class gathers all configuration information.

__init__

def __init__()

Intialize the class.

Arguments:

None

Returns:

None

ConfigCore Objects

class ConfigCore(_Config)

Class gathers all configuration information.

__init__

def __init__()

Intialize the class.

Arguments:

None

Returns:

None

agent_subprocesses

def agent_subprocesses()

Get agent_subprocesses.

Arguments:

None

Returns:

  • result - result

api_log_file

def api_log_file(daemon)

Get api_log_file.

Arguments:

  • daemon - Name of API daemon

Returns:

  • result - result

daemon_directory

def daemon_directory()

Determine the daemon_directory.

Arguments:

None

Returns:

  • result - daemon_directory

log_directory

def log_directory()

Determine the log_directory.

Arguments:

None

Returns:

  • result - configured log_directory

log_file

def log_file()

Get log_file.

Arguments:

None

Returns:

  • result - result

log_level

def log_level()

Get log_level.

Arguments:

None

Returns:

  • result - result

multiprocessing

def multiprocessing()

Get multiprocessing.

Arguments:

None

Returns:

  • result - result

system_directory

def system_directory()

Determine the system_directory.

Arguments:

None

Returns:

  • result - configured system_directory

ConfigAPIClient Objects

class ConfigAPIClient(ConfigCore)

Class gathers all configuration information.

__init__

def __init__(section)

Intialize the class.

Arguments:

  • section - Section of the config file to read

Returns:

None

server_address

def server_address()

Get server_address.

Arguments:

None

Returns:

  • result - result

server_bind_port

def server_bind_port()

Get server_bind_port.

Arguments:

None

Returns:

  • result - result

server_https

def server_https()

Get server_https.

Arguments:

None

Returns:

  • result - result

server_password

def server_password()

Get server_password.

Arguments:

None

Returns:

  • result - result

server_username

def server_username()

Get server_username.

Arguments:

None

Returns:

  • result - result

server_url_root

def server_url_root()

Return server_url_root value.

Arguments:

None

Returns:

  • result - server_url_root value

ConfigAPI Objects

class ConfigAPI(ConfigCore)

Class gathers all configuration information.

__init__

def __init__(section)

Intialize the class.

Arguments:

  • section - Section of the config file to read

Returns:

None

api_bind_port

def api_bind_port()

Get api_bind_port.

Arguments:

None

Returns:

  • result - result

api_listen_address

def api_listen_address()

Get api_listen_address.

Arguments:

None

Returns:

  • result - result

api_https

def api_https()

Get api_https.

Arguments:

None

Returns:

  • result - result

api_password

def api_password()

Get api_password.

Arguments:

None

Returns:

  • result - result

api_username

def api_username()

Get api_username.

Arguments:

None

Returns:

  • result - result

api_url_root

def api_url_root()

Return api_url_root value.

Arguments:

None

Returns:

  • result - api_url_root value

log

Logging module.

ExceptionWrapper Objects

class ExceptionWrapper()

Class to handle unexpected exceptions with multiprocessing.

Based on: https://stackoverflow.com/questions/6126007/python-getting-a-traceback-from-a-multiprocessing-process

NOTE The subprocess needs to return a value for this to work. Returning an implicit "None" isn't sufficient

__init__

def __init__(error_exception)

Initialize the class.

Arguments:

  • error_exception - Exception object

Returns:

None

re_raise

def re_raise()

Extend the re_raise method.

Arguments:

None

Returns:

None

_GetLog Objects

class _GetLog()

Class to manage the logging without duplicates.

__init__

def __init__()

Initialize the class.

Arguments:

None

Returns:

None

logfile

def logfile()

Return logger for file IO.

Arguments:

None

Returns:

  • value - Value of logger

stdout

def stdout()

Return logger for terminal IO.

Arguments:

None

Returns:

  • value - Value of logger

log2console

def log2console(code, message)

Log message to STDOUT only and die.

Arguments:

  • code - Message code
  • message - Message text

Returns:

None

log2die_safe

def log2die_safe(code, message)

Log message to STDOUT only and die.

Arguments:

  • code - Message code
  • message - Message text

Returns:

None

log2warning

def log2warning(code, message)

Log warning message to file only, but don't die.

Arguments:

  • code - Message code
  • message - Message text

Returns:

None

log2debug

def log2debug(code, message)

Log debug message to file only, but don't die.

Arguments:

  • code - Message code
  • message - Message text

Returns:

None

log2info

def log2info(code, message)

Log status message to file only, but don't die.

Arguments:

  • code - Message code
  • message - Message text

Returns:

None

log2see

def log2see(code, message)

Log message to file and STDOUT, but don't die.

Arguments:

  • code - Message code
  • message - Message text

Returns:

None

log2die

def log2die(code, message)

Log to STDOUT and file, then die.

Arguments:

  • code - Error number
  • message - Descriptive error string

Returns:

None

log2exception_die

def log2exception_die(code, sys_exc_info, message=None)

Log trace message to file and STDOUT, but don't die.

Arguments:

  • code - Message code
  • sys_exc_info - Tuple from exception from sys.exc_info
  • message - Descriptive error string

Returns:

None

log2exception

def log2exception(code, sys_exc_info, message=None, die=False)

Log trace message to file and STDOUT, but don't die.

Arguments:

  • code - Message code
  • sys_exc_info - Tuple from exception from sys.exc_info
  • message - Message to log
  • die - Die if True

Returns:

None

check_environment

def check_environment()

Check environmental variables. Die if incorrect.

Arguments:

None

Returns:

  • path - Path to the configurtion directory

root_directory

def root_directory()

Determine the root directory in which switchmap is installed.

Arguments:

None

Returns:

  • result - Root directory

graphene

Module with graphene functions.

normalize

def normalize(data)

Remove all 'edges' and 'node' keys from graphene results.

Arguments:

  • data - Dict of graphene results

Returns:

  • result - Dict withoug 'edges' and 'node' keys

nodes

def nodes(_nodes)

Strip the 'node' key from a list of graphene nodes.

Arguments:

  • _nodes - List of graphene node dicts

Returns:

  • result - List without the 'node' key

daemon

Generic linux daemon base class for python 3.x.

Daemon Objects

class Daemon()

A generic daemon class.

Usage: subclass the daemon class and override the run() method.

Modified from http://www.jejik.com/files/examples/daemon3x.py

__init__

def __init__(agent)

Initialize the class.

Arguments:

  • agent - Agent object

Returns:

None

delpid

def delpid()

Delete the PID file.

Arguments:

None

Returns:

None

delskip

def delskip()

Delete the skip file.

Arguments:

None

Returns:

None

dellock

def dellock()

Delete the lock file.

Arguments:

None

Returns:

None

start

def start()

Start the daemon.

Arguments:

None

Returns:

None

force

def force()

Stop the daemon by deleting the lock file first.

Arguments:

None

Returns:

None

stop

def stop()

Stop the daemon.

Arguments:

None

Returns:

None

restart

def restart()

Restart the daemon.

Arguments:

None

Returns:

None

status

def status()

Get daemon status.

Arguments:

None

Returns:

  • result - True if the PID and PID file exists

run

def run()

Override this method when you subclass Daemon.

This method will be called after the process has been daemonized by start() or restart(). The base implementation does nothing and should be overridden in derived classes to add actual daemon functionality.

Arguments:

None

Returns:

None

GracefulDaemon Objects

class GracefulDaemon(Daemon)

Daemon that allows for graceful shutdown.

This daemon should allow for stop/restart commands to perform graceful shutdown of a given process. A graceful shutdown involves checking that whether a current process is running and only ending the process once the current process has completed its currently running task.

__init__

def __init__(agent, timeout=30)

Initialize the class.

Arguments:

  • agent - Agent object
  • timeout - Timeout for graceful shutdown

Returns:

None

graceful_shutdown

def graceful_shutdown(callback)

Initializes the wrapper with the callback function fn.

Arguments:

  • callback - callback method

Returns:

  • wrapper - Wrapper function

stop

def stop()

Stop the daemon gracefully.

Uses parent class stop method after checking that daemon is no longer processing data or making use of a resource.

Arguments:

None

Returns:

None

restart

def restart()

Restarts the daemon gracefully.

Uses parent class restart method after checking that daemon is not processing data or making use of a resource.

Arguments:

None

Returns:

None

data

Module for data handling.

hashstring

def hashstring(string, sha=256, utf8=False)

Create a UTF encoded SHA hash string.

Arguments:

  • string - String to hash
  • sha - Length of SHA hash
  • utf8 - Return utf8 encoded string if true

Returns:

  • result - Result of hash

dictify

def dictify(data)

Convert NamedTuple to dict.

Arguments:

  • data - NamedTuple

Returns:

  • result - Dict representation of object

general

Module with general purpose functions.

check_user

def check_user(config)

Check to make sure the user environment is correct.

Arguments:

  • config - Config object

Returns:

None

check_sudo

def check_sudo()

Check user isn't running as sudo.

Arguments:

None

Returns:

None

cleanstring

def cleanstring(data)

Remove multiple whitespaces and linefeeds from string.

Arguments:

  • data - String to process

Returns:

  • result - Stipped data

octetstr_2_string

def octetstr_2_string(bytes_string)

Convert SNMP OCTETSTR to string.

Arguments:

  • bytes_string - Binary value to convert

Returns:

  • result - String equivalent of bytes_string

random_hash

def random_hash()

Create a random Hex hash.

Arguments:

None

Returns:

  • result - Hex hash

mac

def mac(_mac)

Convert MAC address to a standardized format.

Arguments:

  • _mac - MAC address

Returns:

  • result - MacAddress object

root_directory

def root_directory()

Determine the root directory in which switchmap is installed.

Arguments:

None

Returns:

  • result - Root directory

ipaddress

def ipaddress(_ip)

Validate an IP address.

Arguments:

  • _ip - IP address

Returns:

  • result - IP Object

make_bool

def make_bool(result)

Create a boolean version of the argument.

Arguments:

  • result - Object to transform

Returns:

  • result - boolean

consistent_keys

def consistent_keys(_data)

Convert dict keys to ints if possible.

Arguments:

  • _data - Multidimensional dict

Returns:

  • result - dict

group_consecutive

def group_consecutive(data)

Group consecutive numbers in a list.

https://stackoverflow.com/questions/2154249/ identify-groups-of-consecutive-numbers-in-a-list

Arguments:

  • data - list

Returns:

  • ranges - List of lists

human_readable

def human_readable(num, suffix="B", storage=False)

Convert number to human readable value.

https://stackoverflow.com/questions/1094841/ get-human-readable-version-of-file-size

Arguments:

  • num - Number to convert
  • suffix - The suffix for the human readable output
  • storage - Use binary 1024 for evaluating storage otherwise use regular decimal.

Returns:

  • result - Numeric string

padded_list_of_lists

def padded_list_of_lists(data, width=4, pad=None)

Create a padded list of list.

Arguments:

  • data - List to process
  • width - Width of the list of lists
  • pad - Value to pad the last row of the list of lists with

Returns:

  • result - list of lists

rest

Functions for creating URIs.

post

def post(uri, data, config, server=True)

Create URI for datacenter RRD and oid_id data.

Arguments:

  • uri - URI for posting
  • data - Data to post
  • config - ConfitAPIClient object
  • server - Posting to a server if True, API if False

Returns:

  • data - Post named tuple

get

def get(uri, config, server=True, die=True)

Get data fro URI from API server.

Arguments:

  • uri - URI for posting
  • config - ConfigAPIClient object
  • server - True if getting data from an database API server
  • die - Die if the connection fails if True

Returns:

  • success - True if successful

get_graphql

def get_graphql(query, config, die=True)

Get data fro URI from API server.

Arguments:

  • query - Query string from GraphQL server
  • config - ConfigAPIClient object
  • die - Die if the connection fails if True

Returns:

  • success - True if successful

files

Switchmap files library.

_Directory Objects

class _Directory()

A class for creating the names of system directories.

__init__

def __init__(config)

Initialize the class.

Arguments:

  • config - Config object

Returns:

None

pid

def pid()

Define the system pid directory.

Arguments:

None

Returns:

  • value - pid directory

lock

def lock()

Define the system lock directory.

Arguments:

None

Returns:

  • value - lock directory

snmp

def snmp()

Define the system snmp directory.

Arguments:

None

Returns:

  • value - snmp directory

_File Objects

class _File()

A class for creating the names of system files.

__init__

def __init__(config)

Initialize the class.

Arguments:

  • config - Config object

Returns:

None

pid

def pid(prefix)

Define the pid file.

Arguments:

  • prefix - Prefix of file

Returns:

  • value - pid directory

lock

def lock(prefix)

Define the lock file.

Arguments:

  • prefix - Prefix of file

Returns:

  • value - lock directory

skip

def skip(prefix)

Define the skip file.

Arguments:

  • prefix - Prefix of file

Returns:

  • value - skip directory

snmp

def snmp(prefix, create=True)

Define the system snmp directory.

Arguments:

  • prefix - Prefix of file
  • create - Create file if True

Returns:

  • value - snmp directory

move_yaml_files

def move_yaml_files(src, dst)

Move all yaml files from source to destination directory.

Arguments:

  • src - Source directory
  • dst - Destination directory

Returns:

None

read_yaml_files

def read_yaml_files(directories)

Read the contents of all yaml files in a directory.

Arguments:

  • directories - List of directory names with configuration files

Returns:

  • config_dict - Dict of yaml read

read_yaml_file

def read_yaml_file(filepath, as_string=False, die=True)

Read the contents of a YAML file.

Arguments:

  • filepath - Path to file to be read
  • as_string - Return a string if True
  • die - Die if there is an error

Returns:

  • result - Dict of yaml read

mkdir

def mkdir(directory)

Create a directory if it doesn't already exist.

Arguments:

  • directory - Directory name

Returns:

None

pid_file

def pid_file(agent_name, config)

Get the pidfile for an agent.

Arguments:

  • agent_name - Agent name
  • config - Config object

Returns:

  • result - Name of pid file

lock_file

def lock_file(agent_name, config)

Get the lockfile for an agent.

Arguments:

  • agent_name - Agent name
  • config - Config object

Returns:

  • result - Name of lock file

skip_file

def skip_file(agent_name, config)

Get the skip file for an agent.

Arguments:

  • agent_name - Agent name
  • config - Config object

Returns:

  • result - Name of skip file

snmp_file

def snmp_file(hostname, config)

Get the snmpfile for an agent.

Arguments:

  • hostname - hostname
  • config - Config object

Returns:

  • result - Name of snmp file

execute

def execute(command, die=True)

Run the command UNIX CLI command and record output.

Arguments:

  • command - CLI command to execute
  • die - Die if errors found

Returns:

  • returncode - Return code of command execution

config_filepath

def config_filepath()

Get the configuration filename.

Arguments:

None

Returns:

  • result - Filename

variables

Module for classes that format variables.

AgentAPIVariable Objects

class AgentAPIVariable()

Variable representation for data required by the AgentAPI.

__init__

def __init__(ip_bind_port=20201, ip_listen_address="0.0.0.0")

Initialize the class.

Arguments:

  • ip_bind_port - ip_bind_port
  • ip_listen_address - TCP/IP address on which the API is listening.

Returns:

None

__repr__

def __repr__()

Return a representation of the attributes of the class.

Arguments:

None

Returns:

  • result - String representation.

__init__

Define the switchmap.core package.

Arguments:

None

Returns:

None