generate_tinyrdm_connections.py 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178
  1. #!/usr/bin/env python3
  2. """
  3. Generate TinyRDM connections.yaml from sdm status --json output
  4. Organizes Redis connections into Internal, Stage, and Production groups
  5. Excludes activate and readonly connections
  6. """
  7. import subprocess
  8. import json
  9. import re
  10. import os
  11. from collections import defaultdict
  12. def run_sdm_status():
  13. try:
  14. result = subprocess.run(['sdm', 'status', '--json'], capture_output=True, text=True)
  15. if result.returncode != 0:
  16. print(f"Error running sdm status: {result.stderr}")
  17. return None
  18. return json.loads(result.stdout)
  19. except FileNotFoundError:
  20. print("Error: sdm command not found")
  21. return None
  22. except json.JSONDecodeError as e:
  23. print(f"Error parsing JSON: {e}")
  24. return None
  25. def parse_redis_connections(sdm_data):
  26. connections = []
  27. for item in sdm_data:
  28. if item.get('type') == 'redis':
  29. name = item.get('name', '')
  30. address = item.get('address', '')
  31. if ('activate-cache' in name or 'activate-readonly' in name or
  32. 'readonly-redis' in name):
  33. continue
  34. if ':' in address:
  35. addr, port = address.split(':')
  36. port = int(port)
  37. else:
  38. continue
  39. env_info = parse_connection_name(name)
  40. if env_info:
  41. connections.append({
  42. 'name': name,
  43. 'addr': addr,
  44. 'port': port,
  45. 'environment': env_info['environment'],
  46. 'customer': env_info['customer'],
  47. 'stage': env_info['stage']
  48. })
  49. return connections
  50. def parse_connection_name(name):
  51. pattern = r'oc-([^-]+)-([^-]+)-.*'
  52. match = re.match(pattern, name)
  53. if not match:
  54. return None
  55. environment = match.group(1)
  56. customer = match.group(2)
  57. if environment in ['dev', 'nextrc', 'nextrc2']:
  58. stage = 'internal'
  59. elif environment in ['stage', 'stage2', 'uat']:
  60. stage = 'stage'
  61. elif environment in ['prod', 'prod2']:
  62. stage = 'production'
  63. else:
  64. stage = 'unknown'
  65. return {
  66. 'environment': environment,
  67. 'customer': customer,
  68. 'stage': stage
  69. }
  70. def create_connection_yaml(name, addr, port, stage):
  71. colors = {
  72. 'internal': '#4ECF60',
  73. 'stage': '#FFA500',
  74. 'production': '#FF0000'
  75. }
  76. color = colors.get(stage, '#808080')
  77. return f""" - name: {name}
  78. last_db: 0
  79. network: tcp
  80. addr: {addr}
  81. port: {port}
  82. default_filter: '*'
  83. key_separator: ':'
  84. conn_timeout: 60
  85. exec_timeout: 60
  86. db_filter_type: none
  87. load_size: 10000
  88. mark_color: '{color}'
  89. refresh_interval: 5"""
  90. def group_connections(connections):
  91. groups = defaultdict(list)
  92. for conn in connections:
  93. if conn['customer'] == 'internal':
  94. group_name = 'Internal'
  95. conn_stage = 'internal'
  96. elif conn['stage'] in ['stage']:
  97. group_name = 'Stage'
  98. conn_stage = 'stage'
  99. elif conn['stage'] in ['production']:
  100. group_name = 'Production'
  101. conn_stage = 'production'
  102. else:
  103. continue
  104. conn_yaml = create_connection_yaml(
  105. conn['name'],
  106. conn['addr'],
  107. conn['port'],
  108. conn_stage
  109. )
  110. groups[group_name].append(conn_yaml)
  111. return groups
  112. def generate_yaml_content(groups):
  113. yaml_lines = []
  114. group_order = ['Internal', 'Stage', 'Production']
  115. for group_name in group_order:
  116. if group_name in groups:
  117. yaml_lines.append(f"- name: {group_name}")
  118. yaml_lines.append(" last_db: 0")
  119. yaml_lines.append(" type: group")
  120. yaml_lines.append(" connections:")
  121. for conn_yaml in groups[group_name]:
  122. yaml_lines.append(conn_yaml)
  123. yaml_lines.append("")
  124. return '\n'.join(yaml_lines)
  125. def main():
  126. print("Generating TinyRDM connections.yaml from sdm status --json...")
  127. sdm_data = run_sdm_status()
  128. if not sdm_data:
  129. return
  130. connections = parse_redis_connections(sdm_data)
  131. print(f"Found {len(connections)} Redis connections")
  132. groups = group_connections(connections)
  133. for group_name, conns in groups.items():
  134. print(f" {group_name}: {len(conns)} connections")
  135. yaml_content = generate_yaml_content(groups)
  136. output_file = os.path.expanduser('~/.config/TinyRDM/connections.yaml')
  137. try:
  138. with open(output_file, 'w') as f:
  139. f.write(yaml_content)
  140. print(f"✅ Successfully generated {output_file}")
  141. except Exception as e:
  142. print(f"❌ Error writing file: {e}")
  143. if __name__ == '__main__':
  144. main()