From 6fa93bb3fc74e9ee0fc6d29e7ccb7cf8e4d9f1ad Mon Sep 17 00:00:00 2001 From: atlurie <atlurie@uab.edu> Date: Fri, 10 Jun 2022 12:37:47 -0500 Subject: [PATCH] Agent that adds a user to a group list --- prod_rmq_agents/group_member.py | 90 +++++++++++++++++++++++++++++++++ 1 file changed, 90 insertions(+) create mode 100644 prod_rmq_agents/group_member.py diff --git a/prod_rmq_agents/group_member.py b/prod_rmq_agents/group_member.py new file mode 100644 index 0000000..1f621a0 --- /dev/null +++ b/prod_rmq_agents/group_member.py @@ -0,0 +1,90 @@ +#!/usr/bin/env python +import os +import json +import pika +import shlex +import rc_util +from subprocess import Popen,PIPE +from pathlib import Path +from rc_rmq import RCRMQ +import rabbit_config as rcfg + +task = "group_member" + +args = rc_util.get_args() +logger = rc_util.get_logger(args) + +# Instantiate rabbitmq object +rc_rmq = RCRMQ({"exchange": rcfg.Exchange, "exchange_type": "topic"}) + + +def group_member(ch, method, properties, body): + msg = json.loads(body) + username = msg["username"] + action = msg["action"] + msg["task"] = task + state = msg["state"] + + try: + + if action == 'add': + for each_group in msg["groupnames"]: + logger.debug(f'Adding user {username} to group {each_group}') + grp_add_user_cmd = f'/cm/local/apps/cmd/bin/cmsh -n -c "group; append {each_group} members {username}; commit;"' + proc = Popen(shlex.split(grp_add_user_cmd), stdout=PIPE, stderr=PIPE) + logger.info(f'Running command: {grp_add_user_cmd}') + out,err = proc.communicate() + logger.debug(f'Result: {err}') + logger.info(f'User {username} is added to {each_group} group') + + elif action == 'remove': + for each_group in msg["groupnames"]: + logger.debug(f'Removing user {username} from group {each_group}') + grp_remove_user_cmd = f'/cm/local/apps/cmd/bin/cmsh -n -c "group; removefrom {each_group} members {username}; commit;"' + proc = Popen(shlex.split(grp_remove_user_cmd), stdout=PIPE, stderr=PIPE) + out,err = proc.communicate() + logger.info(f'Running command: {grp_remove_user_cmd}') + logger.debug(f'Result: {err}') + logger.info(f'User {username} is removed from {each_group} group') + + msg["success"] = True + + except Exception: + msg["success"] = False + msg["errmsg"] = "Exception raised, while adding user to group {groupname}, check the logs for stack trace" + logger.error("", exc_info=True) + + + corr_id = properties.correlation_id + reply_to = properties.reply_to + + logger.debug(f'corr_id: {corr_id} \n reply_to: {reply_to}') + # send response to the callback queue + if reply_to: + props = pika.BasicProperties(correlation_id=corr_id) + logger.debug("Sending confirmation back to reply_to") + rc_rmq.publish_msg( + { + "routing_key": reply_to, + "props": props, + "msg": msg + } + ) + else: + print("Error: no reply_to") + + logger.debug(f'User {username} confirmation sent for {action}ing {task}') + + ch.basic_ack(delivery_tag=method.delivery_tag) + + +logger.info(f"Start listening to queue: {task}") +rc_rmq.bind_queue(queue=task, routing_key='group_member.*', durable=True) + +rc_rmq.start_consume( + {"queue": task, "cb": group_member} +) + +logger.info("Disconnected") +rc_rmq.disconnect() + -- GitLab