[[python_wiki:spacewalk_describe]]

Differences

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

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
python_wiki:spacewalk_describe [2018/06/19 20:09]
billdozor [The Code]
python_wiki:spacewalk_describe [2019/05/26 03:50] (current)
Line 38: Line 38:
 ====== The Code ====== ====== The Code ======
  
-<code python sw_describe.py>​ +The script ​is maintained here: https://gitlab.com/whowe/spacewalk
-#​!/​usr/​bin/​python +
-# Title: sw_describe.py +
-# Description:​ View/Edit descriptions for Spacewalk registered systems +
-# Date: 2017-06-13 +
-# Recent Changes:​-Initial release +
-##############################################################################​ +
- +
-#​======================= +
-# Import Modules +
-#​======================= +
- +
-# Future print function capabilities +
-from __future__ import print_function +
- +
-# sys: for stdout print buffer flush +
-import sys +
- +
-# argparse: Command line arguments +
-import argparse +
- +
-# ConfigParser:​ Use variables from external file (spacecmd config) +
-import ConfigParser +
- +
-# os: Use bash environment variables for path to spacecmd config +
-import os +
- +
-# xmlrpclib: Allows for parsing of Spacewalk APIs +
-import xmlrpclib +
- +
-#​======================= +
-# CUSTOMIZE HERE +
-#​======================= +
-# Domain Name (include first '​.'​) +
-domain_name="​.example.com"​ +
- +
-#​======================= +
-# Get Script Arguments +
-#​======================= +
-# Build argument parser information +
-parser = argparse.ArgumentParser(description="​View/​Edit descriptions for Spacewalk registered systems."​) +
-parser.add_argument("​-l","​--list",​ help="​List description(s) of single system or a group.",​ action="​store_true",​ required=False) +
-parser.add_argument("​-e","​--edit",​ help="​Edit description of a system (single systems only: --name).",​ action="​store_true",​ required=False) +
-parser.add_argument("​-d","​--describe",​ help="​Set new description of system (use with --edit).",​ required=False) +
-parser.add_argument("​-n","​--name",​ help="​Single system name (use with --list or --edit)",​ required=False) +
-parser.add_argument("​-g","​--group",​ help="​Spacewalk group or '​all'​ (use with --list)",​ required=False) +
-parser.add_argument("​-t","​--test",​ help="​Do not make any changes. Run test and output what would have happened.",​ action="​store_true",​ required=False) +
-args = vars(parser.parse_args()) +
- +
-# If testing, we don't actually want to do anything +
-if args['​test'​] == True: +
-  print("​-->>​ Test run...no modifications will be made <<​--"​) +
- +
-# Requirement:​ Need to list OR edit +
-if args['​list'​] == True and args['​edit'​] == True: +
-  print(">>​ ERROR! Either list (-l) or edit (-e) descriptions..not both! Exiting..."​) +
-  exit(1) +
-elif args['​list'​] == False and args['​edit'​] == False: +
-  print(">>​ ERROR! Choose either to list (-l) or edit (-e) descriptions. Exiting..."​) +
-  exit(1) +
- +
-# Requirement:​ Need a single system name OR a group name +
-if args['​name'​] and args['​group'​]:​ +
-  print(">>​ ERROR! Choose a single system name (-n) OR a group name (-g)..not both! Exiting..."​) +
-  exit(1) +
-elif not args['​name'​] and not args['​group'​]:​ +
-  print(">>​ ERROR! Choose a single system name (-n) OR a group name (-g). Exiting..."​) +
-  exit(1) +
- +
-# Requirement:​ If editing, need a description +
-if args['​edit'​] == True and not args['​describe'​]:​ +
-  print(">>​ ERROR! Need a description (-d <​description>​) when editing. Exiting..."​) +
-  exit(1) +
- +
-# Requirement:​ Edits only for single systems +
-if args['​edit'​] == True and args['​group'​]:​ +
-  print(">>​ ERROR! Edits for single systems (-n <​name>​) only. Exiting..."​) +
-  exit(1) +
- +
-#​======================= +
-# Config Settings +
-#​======================= +
-# Read Spacecmd Config file - Path set from $HOME variable + expected spacecmd config file +
-config = ConfigParser.ConfigParser() +
-config.read(os.environ.get('​HOME'​) + "/​.spacecmd/​config"​) +
- +
-# Parse Spacecmd Config file - Set username, password, spacewalk server +
-spacewalk_login = config.get("​spacecmd",​ "​username"​) +
-spacewalk_password = config.get("​spacecmd",​ "​password"​) +
-spacewalk_server = config.get("​spacecmd",​ "​server"​) +
-#### End of Config Settings #### +
- +
-#​===================================== +
-# Functions; Main starts after +
-#​===================================== +
- +
-# Function: List Descriptions +
-def list_descriptions(system_type,​ system_name):​ +
- +
-  # Single System +
-  if system_type == "​single":​ +
-    # Get System Details +
-    sw_system = get_system_details(system_name) +
- +
-    # Print System and Description +
-    print("​-->​ " + system_name.strip(domain_name).upper() + ": " + get_system_description(sw_system['​id'​])) +
- +
-  # Group of Systems +
-  elif system_type == "​group":​ +
-    # Get all Spacewalk Registered systems from group +
-    sw_system_list_details = get_system_list_details(system_name) +
- +
-    # Loop through list and show descriptions +
-    for sw_system in sw_system_list_details:​ +
-      print("​-->​ " + sw_system['​name'​].strip(domain_name).upper() + ": " + get_system_description(sw_system['​id'​])) +
- +
-  else: +
-    print("​->​ ERROR Unknown system type (single/​group):​ " + system_type) +
-    exit(1) +
- +
-  return +
- +
-# Function: Edit Descriptions +
-def edit_descriptions(system_type,​ system_name):​ +
- +
-  # Single System +
-  if system_type == "​single":​ +
-    # Get System Details +
-    sw_system = get_system_details(system_name) +
- +
-    # Edit System Description +
-    if args['​describe'​]:​ +
-      # Show existing description +
-      print("​->​ System (" + system_name.strip(domain_name).upper() + ") current description:​ " + get_system_description(sw_system['​id'​])) +
- +
-      # Get new description from argument +
-      new_description = args['​describe'​] +
- +
-      if not new_description:​ +
-        # If new_description ​is empty, do not set +
-        print("​-->​ Will NOT set new description for" + system_name.strip(domain_name).upper()) +
-      else: +
-        if args['​test'​] == True: +
-          # Testing; don't actually set the description +
-          print("​-->​ I would have set the new description for (" + system_name.strip(domain_name).upper() + ") to: " + new_description) +
-        else: +
-          # Not testing; Set new description and display it +
-          print("​-->​ Setting the new description for (" + system_name.strip(domain_name).upper() + ") to: " + new_description) +
-          set_system_description(sw_system['​id'​],​ {'​description':​ new_description}) +
- +
-    else: +
-      # Error catching for edit '​describe'​ argument +
-      print("​->​ ERROR! Unknown edit condition encountered."​) +
-      exit(1) +
- +
-  else: +
-    print("​->​ ERROR Unhandled system type for editing (single only): " + system_type) +
-    exit(1) +
- +
-  return +
- +
-##-- Utility functions: Short/​Reusable --## +
-# Function: Get all group names +
-def get_all_groups():​ +
-  # Get all group details +
-  all_groups = server.systemgroup.listAllGroups(key) +
-  group_list = [] +
- +
-  # Build a list of just group names +
-  for group in all_groups:​ +
-    group_list.append(group['​name'​]) +
- +
-  return group_list +
- +
-# Function: Get a list of system details given a group name +
-def get_system_list_details(group_name):​ +
-  if group_name == "​all":​ +
-    # Get all systems +
-    system_list_details = server.system.listSystems(key) +
-  else: +
-    # Get a group'​s systems +
-    system_list_details = server.systemgroup.listSystemsMinimal(key,​ group_name) +
- +
-  return system_list_details +
- +
-# Function: Get a system'​s details +
-def get_system_details(system_name):​ +
- +
-  # Get the system'​s id +
-  system_id = get_system_id(system_name) +
-  if system_id == None: +
-    print("​-->​ Error: (" + system_name + ") not found in Spacewalk!"​) +
-    exit(1) +
-  else: +
-    # Get System Details +
-    system_details = server.system.getDetails(key,​ system_id) +
- +
-  return system_details +
- +
-# Function: Get a system'​s description +
-def get_system_description(system_id):​ +
- +
-  # Retrieve system details +
-  system_details = server.system.getDetails(key,​ system_id) +
- +
-  return system_details['​description'​] +
- +
-# Function: Set a system'​s description +
-def set_system_description(system_id,​ new_description):​ +
- +
-  try: +
-    server.system.setDetails(key,​ system_id, new_description) +
-  except: +
-    print("​->​ ERROR setting system description"​) +
-    return False +
- +
-  return True +
- +
-# Function: Get a system'​s id +
-def get_system_id(system_name):​ +
- +
-  # Create all system name variants +
-  system_name_lower = system_name.strip(domain_name).lower() +
-  system_name_lower_fqdn = system_name_lower + domain_name +
-  system_name_upper = system_name.strip(domain_name).upper() +
-  system_name_upper_fqdn = system_name_upper + domain_name +
- +
-  # Attempt to get the system'​s id for each +
-  system_id_lower = server.system.getId(key,​ system_name_lower) +
-  system_id_lower_fqdn = server.system.getId(key,​ system_name_lower_fqdn) +
-  system_id_upper = server.system.getId(key,​ system_name_upper) +
-  system_id_upper_fqdn = server.system.getId(key,​ system_name_upper_fqdn) +
- +
-  # Check each for success +
-  if system_id_lower:​ +
-    system_id = system_id_lower[0]['​id'​] +
-  elif system_id_lower_fqdn:​ +
-    system_id = system_id_lower_fqdn[0]['​id'​] +
-  elif system_id_upper:​ +
-    system_id = system_id_upper[0]['​id'​] +
-  elif system_id_upper_fqdn:​ +
-    system_id = system_id_upper_fqdn[0]['​id'​] +
-  else: +
-    # System cannot be found +
-    system_id = None +
- +
-  return system_id +
- +
-#​=================== +
-# Main starts here +
-#​=================== +
- +
-# Banner +
-print("​===== Spacewalk Describe ====="​) +
- +
-# Setup server info (rpc api endpoint) +
-spacewalk_url = "https://" + spacewalk_server + "/​rpc/​api"​ +
-server = xmlrpclib.Server(spacewalk_url) +
- +
-# Attempt to login and get a session id +
-try: +
-  key = server.auth.login(spacewalk_login,​ spacewalk_password) +
-except: +
-  print("​->​ERROR:​ Spacewalk Login failed. Exiting..."​) +
-  exit(1) +
- +
-#-- Group Name Validation --# +
-if args['​group'​] and args['​group'​] != "​all":​ +
-  #- Ensure group exists if it is not "​all"​ systems -# +
-  try: +
-    # Get group'​s details +
-    group_details = server.systemgroup.getDetails(key,​ args['​group'​]) +
- +
-    # If no systems are in the group, there is nothing to do +
-    if group_details['​system_count'​] == 0: +
-      print("​->​The group("​ + args['​group'​] + ") has zero systems in it. Nothing to do..."​) +
-      exit(1) +
- +
-  except: +
-    print("​->​ERROR:​ The group("​ + args['​group'​] + ") does not exist. Exiting..."​) +
- +
-    print("​\n->​ Available '​all'​ groups are:"​) +
-    group_list = get_all_groups() +
-    for group in group_list:​ +
-      if group.startswith("​all"​):​ +
-        print("​-->​ " + group) +
-    print("​-->​ all"​) +
-    exit(1) +
- +
-#-- Edit or List System Descriptions --# +
- +
-if args['​list'​] == True: +
-  # List Descriptions +
-  print(">>​ List System Descriptions"​) +
- +
-  if args['​group'​]:​ +
-    list_descriptions("​group",​ args['​group'​]) +
-  elif args['​name'​]:​ +
-    list_descriptions("​single",​ args['​name'​]) +
-  else: +
-    print("​->​ ERROR: Group/Name not set! Exiting..."​) +
-    exit(1) +
- +
-elif args['​edit'​] == True: +
-  # Edit Descriptions +
-  print(">>​ Edit System Descriptions"​) +
- +
-  if args['​group'​]:​ +
-    edit_descriptions("​group",​ args['​group'​]) +
-  elif args['​name'​]:​ +
-    edit_descriptions("​single",​ args['​name'​]) +
-  else: +
-    print("​->​ ERROR: Group/Name not set! Exiting..."​) +
-    exit(1) +
- +
-else: +
-  # Error catching, should not get here +
-  print("​->​ ERROR: Unknown list/edit state. List=" + args['​list'​] + " , Edit=" + args['​edit'​] + ". Exiting..."​) +
-  exit(1) +
- +
-# Logout of Spacewalk server +
-server.auth.logout(key) +
-</​code>​+
  
 ---- ----
  
  • python_wiki/spacewalk_describe.txt
  • Last modified: 2019/05/26 03:50
  • (external edit)