#!/usr/bin/env python3 """ Example script for listing Snowflake objects and current access grants """ import sys import os sys.path.append(os.path.dirname(os.path.dirname(__file__))) import json from sigma_api_client import SigmaAPIClient from snowflake_object_manager import SnowflakeObjectManager from user_management import UserManager, PermissionManager from config import ConfigManager def print_json(data, title=""): """Pretty print JSON data""" if title: print(f"\n{title}") print("=" * len(title)) print(json.dumps(data, indent=2)) def main(): """ Example: List Snowflake objects and analyze current access """ try: # Load configuration config_manager = ConfigManager() sigma_config = config_manager.get_sigma_config() # Initialize API client and managers api_client = SigmaAPIClient(sigma_config) snowflake_manager = SnowflakeObjectManager(api_client) user_manager = UserManager(api_client) permission_manager = PermissionManager(api_client) print("Sigma Snowflake Object Listing and Access Analysis") print("=" * 50) # 1. List all connections print("\n1. Data Connections:") connections = snowflake_manager.list_connections() for conn in connections: print(f" - {conn.get('name')} ({conn.get('type')}) - ID: {conn.get('connectionId')}") # 2. Get Snowflake objects print("\n2. Snowflake Objects Structure:") connection_name = config_manager.get_snowflake_connection_name() snowflake_objects = snowflake_manager.get_snowflake_objects(connection_name) if 'error' in snowflake_objects: print(f"Error: {snowflake_objects['error']}") return connection_info = snowflake_objects['connection'] print(f"Connection: {connection_info['name']} (ID: {connection_info['connectionId']})") total_objects = 0 for db_name, db_info in snowflake_objects['databases'].items(): schema_count = len(db_info['schemas']) table_count = sum(len(schema['tables']) for schema in db_info['schemas'].values()) total_objects += table_count print(f"\nšŸ“ Database: {db_name}") print(f" Schemas: {schema_count}, Tables: {table_count}") for schema_name, schema_info in db_info['schemas'].items(): table_names = [table['name'] for table in schema_info['tables']] print(f" šŸ“‚ {schema_name}: {', '.join(table_names[:5])}") if len(table_names) > 5: print(f" ... and {len(table_names) - 5} more tables") print(f"\nTotal Snowflake objects: {total_objects}") # 3. List current members print("\n3. Current Sigma Members:") members = user_manager.list_members() print(f"Total members: {len(members)}") for member in members[:10]: # Show first 10 members email = member.get('email', 'N/A') account_type = member.get('accountType', 'N/A') status = member.get('isActive', False) print(f" - {email} ({account_type}) - Active: {status}") if len(members) > 10: print(f" ... and {len(members) - 10} more members") # 4. List current grants print("\n4. Current Access Grants:") try: grants = permission_manager.list_grants() print(f"Total grants: {len(grants)}") except Exception as e: print(f"Error accessing grants: {e}") grants = [] # Group grants by grantee grants_by_user = {} for grant in grants: grantee = grant.get('grantee') if grantee not in grants_by_user: grants_by_user[grantee] = [] grants_by_user[grantee].append(grant) # Show sample grants sample_count = 0 for grantee_id, user_grants in grants_by_user.items(): if sample_count >= 5: # Limit to first 5 users break # Find user email user_email = "Unknown" for member in members: if member.get('memberId') == grantee_id: user_email = member.get('email', 'N/A') break print(f"\n User: {user_email} ({len(user_grants)} grants)") for grant in user_grants[:3]: # Show first 3 grants per user resource = grant.get('resource', 'N/A') permission = grant.get('permission', 'N/A') print(f" - Resource: {resource} (Permission: {permission})") if len(user_grants) > 3: print(f" ... and {len(user_grants) - 3} more grants") sample_count += 1 if len(grants_by_user) > 5: print(f"\n ... and {len(grants_by_user) - 5} more users with grants") # 5. Export detailed object list (optional) export_choice = input("\nExport detailed object list to JSON? (y/n): ").strip().lower() if export_choice == 'y': filename = "snowflake_objects_export.json" with open(filename, 'w') as f: json.dump(snowflake_objects, f, indent=2) print(f"Exported to {filename}") except Exception as e: print(f"Error: {e}") print("\nPlease ensure your configuration is set up correctly.") print("Run: python config.py") if __name__ == "__main__": main()