Source code for src.core.haproxyupdater.sockethandler

"""
.. module:: sockethandler
   :synopsis: Module for handling socket operation

"""

import socket

[docs]class SocketHandler(object): """ Class containing methods for handling socket operation This is a generic class for handling all socket operation. All the commands which are to be sent to haproxy and done via methods in this class. Args: **kwargs (dictionary) : Dictionary containing params """ def __init__(self, **kwargs): """ Init method for the class Args: **kwargs (dictionary) : Dictionary containing params """ # get the desired params self.sock_files = kwargs.get("sock_file").split(",") self.sock_files = [sock_file.strip() for sock_file in self.sock_files] self.logger = kwargs.get("logger")
[docs] def connect_socket(self, sock_file): """ Method to connect to haproxy unix socket This method creates a socket connection to the given haproxy unix socket Returns: bool : Successfully created socket connection or not """ try: # try connecting to haproxy socket file self.socket = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) self.socket.settimeout(10) self.socket.connect(sock_file) except Exception as ex: ''' Log exception ''' self.logger.critical("Unable to connect to haproxy socket file. Encountered following exception : {}".format(str(ex))) return False return True
[docs] def send_command(self, **kwargs): """ Method to send command to haproxy unix socket and get response It will first create a socket connection to the haproxy socket and then send the given command and get response. Args: **kwargs (dictionary) : Dictionary containing params Returns: bool : Successfully sent command or not str : response sent by the haproxy unix socket """ response = None command = kwargs.get("command").encode() command_type = kwargs.get("command_type", "GET") if command_type == "GET": return self.send_one(self.sock_files[0], command) else: return self.send_all(command)
[docs] def destroy_socket(self): self.socket.close()
[docs] def send_one(self, sock_file, command): # connect to the haproxy socket connected = self.connect_socket(sock_file) if not connected: return False, None try: # send command self.socket.send(command) response = "" # Get the entire respnse in chunks of 16 bytes while True: res_buf = self.socket.recv(16) if res_buf: response += res_buf.decode() else: break except Exception as ex: ''' Log error ''' self.logger.critical("Issue in send/receive with haproxy socket. Encountered following exception : {}".format(str(ex))) response = None self.destroy_socket() if response == None: return False, response return True, response
[docs] def send_all(self, command): final_status = True for sock_file in self.sock_files: status, response = self.send_one(sock_file, command) if not status: final_status = False return final_status, response