# Citrix Automated Reporting

Code to create automated citrix acceptance reports

    
    import requests
    import json
    from requests.auth import HTTPBasicAuth
    
    # Citrix VPX credentials and Nitro API endpoint
    citrix_vpx_url = 'https://<citrix-vpx-ip>/nitro/v1/config/'
    username = '<your-username>'
    password = '<your-password>'
    auth = HTTPBasicAuth(username, password)
    
    # Disable SSL warnings for self-signed certificates
    requests.packages.urllib3.disable_warnings()
    
    # Function to get data from the Nitro API
    def get_data_from_vpx(endpoint):
        url = citrix_vpx_url + endpoint
        response = requests.get(url, auth=auth, verify=False)
        if response.status_code == 200:
            return response.json()
        else:
            print(f"Failed to fetch {endpoint}: {response.status_code}")
            return None
    
    # Fetch system-level details
    def get_system_report():
        system_info = get_data_from_vpx('nsconfig')
        if system_info:
            ns_ip_address = system_info['nsconfig'][0].get('IPAddress', 'N/A')
            hostname = system_info['nsconfig'][0].get('hostname', 'N/A')
            ha_status = system_info['nsconfig'][0].get('hacurstatus', 'N/A')
            print(f"System IP Address: {ns_ip_address}")
            print(f"Hostname: {hostname}")
            print(f"HA Status: {ha_status}\n")
    
    # Fetch and classify backend health status for virtual servers, also calculate health score
    def get_load_balancer_report():
        lb_vservers = get_data_from_vpx('lbvserver')
        if lb_vservers:
            print(f"Load Balancing Virtual Servers:\n{'-'*30}")
    
            # Separate servers by health status
            perfect_servers = []
            degraded_servers = []
            down_servers = []
            
            # Counters for health score calculation
            total_servers = 0
            perfect_count = 0
            degraded_count = 0
    
            for vserver in lb_vservers['lbvserver']:
                name = vserver.get('name', 'N/A')
                ip = vserver.get('ipv46', 'N/A')
                state = vserver.get('curstate', 'N/A')
                total_servers += 1
    
                # Fetch backend service health status
                services_bound = get_data_from_vpx(f'lbvserver_service_binding/{name}')
                if services_bound:
                    backend_health = {'perfect': True, 'degraded': False}
                    for service in services_bound.get('lbvserver_service_binding', []):
                        service_name = service.get('servicename', 'N/A')
                        service_health = get_data_from_vpx(f'service/{service_name}')
                        if service_health:
                            health_status = service_health['service'][0].get('svrstate', 'N/A')
                            if health_status == 'DOWN':
                                backend_health['perfect'] = False
                                backend_health['degraded'] = True
                            elif health_status != 'UP':
                                backend_health['perfect'] = False
    
                    if backend_health['perfect']:
                        perfect_servers.append(f"Name: {name} | IP: {ip} | State: {state}")
                        perfect_count += 1
                    elif backend_health['degraded']:
                        degraded_servers.append(f"Name: {name} | IP: {ip} | State: {state}")
                        degraded_count += 1
                    else:
                        down_servers.append(f"Name: {name} | IP: {ip} | State: {state}")
                else:
                    down_servers.append(f"Name: {name} | IP: {ip} | State: {state}")
    
            # Print out categorized servers
            print("Perfect (Green) Servers:\n" + "-" * 30)
            for server in perfect_servers:
                print(server)
            print("\nDegraded (Yellow) Servers:\n" + "-" * 30)
            for server in degraded_servers:
                print(server)
            print("\nDown (Red) Servers:\n" + "-" * 30)
            for server in down_servers:
                print(server)
            print('\n')
    
            # Calculate overall health score
            total_degraded = degraded_count * 0.5
            total_health_contrib = perfect_count + total_degraded
            overall_health_score = (total_health_contrib / total_servers) * 100 if total_servers > 0 else 0
    
            print(f"Overall Health Score: {overall_health_score:.2f}%\n")
    
    # Fetch SSL certificate details, including expiration dates
    def get_ssl_report():
        ssl_certificates = get_data_from_vpx('sslcertkey')
        if ssl_certificates:
            print(f"SSL Certificates:\n{'-'*30}")
            for cert in ssl_certificates['sslcertkey']:
                cert_name = cert.get('certkey', 'N/A')
                cert_alias = cert.get('cert', 'N/A')
                exp_date = cert.get('expirymonitor', 'N/A')  # This field might vary depending on your Citrix version
                print(f"Cert Name: {cert_name} | Alias: {cert_alias} | Expiry Date: {exp_date}")
            print('\n')
    
    # Fetch high availability details
    def get_ha_report():
        ha_status = get_data_from_vpx('hanode')
        if ha_status:
            print(f"High Availability Details:\n{'-'*30}")
            for node in ha_status['hanode']:
                node_id = node.get('id', 'N/A')
                node_state = node.get('state', 'N/A')
                print(f"Node ID: {node_id} | State: {node_state}")
            print('\n')
    
    # Main function to generate the report
    def generate_report():
        print("Citrix VPX High-Level Report\n")
        get_system_report()
        get_load_balancer_report()
        get_ssl_report()
        get_ha_report()
    
    if __name__ == '__main__':
        generate_report()