dev: automated commit - 2025-10-19 12:15:20
This commit is contained in:
parent
6b67d64cef
commit
b40e30baef
6 changed files with 404 additions and 34 deletions
178
local-bin/.local/bin/generate_tinyrdm_connections.py
Executable file
178
local-bin/.local/bin/generate_tinyrdm_connections.py
Executable file
|
|
@ -0,0 +1,178 @@
|
|||
#!/usr/bin/env python3
|
||||
"""
|
||||
Generate TinyRDM connections.yaml from sdm status --json output
|
||||
Organizes Redis connections into Internal, Stage, and Production groups
|
||||
Excludes activate and readonly connections
|
||||
"""
|
||||
|
||||
import subprocess
|
||||
import json
|
||||
import re
|
||||
import os
|
||||
from collections import defaultdict
|
||||
|
||||
def run_sdm_status():
|
||||
try:
|
||||
result = subprocess.run(['sdm', 'status', '--json'], capture_output=True, text=True)
|
||||
if result.returncode != 0:
|
||||
print(f"Error running sdm status: {result.stderr}")
|
||||
return None
|
||||
return json.loads(result.stdout)
|
||||
except FileNotFoundError:
|
||||
print("Error: sdm command not found")
|
||||
return None
|
||||
except json.JSONDecodeError as e:
|
||||
print(f"Error parsing JSON: {e}")
|
||||
return None
|
||||
|
||||
def parse_redis_connections(sdm_data):
|
||||
connections = []
|
||||
|
||||
for item in sdm_data:
|
||||
if item.get('type') == 'redis':
|
||||
name = item.get('name', '')
|
||||
address = item.get('address', '')
|
||||
|
||||
if ('activate-cache' in name or 'activate-readonly' in name or
|
||||
'readonly-redis' in name):
|
||||
continue
|
||||
|
||||
if ':' in address:
|
||||
addr, port = address.split(':')
|
||||
port = int(port)
|
||||
else:
|
||||
continue
|
||||
|
||||
env_info = parse_connection_name(name)
|
||||
if env_info:
|
||||
connections.append({
|
||||
'name': name,
|
||||
'addr': addr,
|
||||
'port': port,
|
||||
'environment': env_info['environment'],
|
||||
'customer': env_info['customer'],
|
||||
'stage': env_info['stage']
|
||||
})
|
||||
|
||||
return connections
|
||||
|
||||
def parse_connection_name(name):
|
||||
pattern = r'oc-([^-]+)-([^-]+)-.*'
|
||||
match = re.match(pattern, name)
|
||||
|
||||
if not match:
|
||||
return None
|
||||
|
||||
environment = match.group(1)
|
||||
customer = match.group(2)
|
||||
|
||||
if environment in ['dev', 'nextrc', 'nextrc2']:
|
||||
stage = 'internal'
|
||||
elif environment in ['stage', 'stage2', 'uat']:
|
||||
stage = 'stage'
|
||||
elif environment in ['prod', 'prod2']:
|
||||
stage = 'production'
|
||||
else:
|
||||
stage = 'unknown'
|
||||
|
||||
return {
|
||||
'environment': environment,
|
||||
'customer': customer,
|
||||
'stage': stage
|
||||
}
|
||||
|
||||
def create_connection_yaml(name, addr, port, stage):
|
||||
colors = {
|
||||
'internal': '#4ECF60',
|
||||
'stage': '#FFA500',
|
||||
'production': '#FF0000'
|
||||
}
|
||||
|
||||
color = colors.get(stage, '#808080')
|
||||
|
||||
return f""" - name: {name}
|
||||
last_db: 0
|
||||
network: tcp
|
||||
addr: {addr}
|
||||
port: {port}
|
||||
default_filter: '*'
|
||||
key_separator: ':'
|
||||
conn_timeout: 60
|
||||
exec_timeout: 60
|
||||
db_filter_type: none
|
||||
load_size: 10000
|
||||
mark_color: '{color}'
|
||||
refresh_interval: 5"""
|
||||
|
||||
def group_connections(connections):
|
||||
groups = defaultdict(list)
|
||||
|
||||
for conn in connections:
|
||||
if conn['customer'] == 'internal':
|
||||
group_name = 'Internal'
|
||||
conn_stage = 'internal'
|
||||
elif conn['stage'] in ['stage']:
|
||||
group_name = 'Stage'
|
||||
conn_stage = 'stage'
|
||||
elif conn['stage'] in ['production']:
|
||||
group_name = 'Production'
|
||||
conn_stage = 'production'
|
||||
else:
|
||||
continue
|
||||
|
||||
conn_yaml = create_connection_yaml(
|
||||
conn['name'],
|
||||
conn['addr'],
|
||||
conn['port'],
|
||||
conn_stage
|
||||
)
|
||||
|
||||
groups[group_name].append(conn_yaml)
|
||||
|
||||
return groups
|
||||
|
||||
def generate_yaml_content(groups):
|
||||
yaml_lines = []
|
||||
group_order = ['Internal', 'Stage', 'Production']
|
||||
|
||||
for group_name in group_order:
|
||||
if group_name in groups:
|
||||
yaml_lines.append(f"- name: {group_name}")
|
||||
yaml_lines.append(" last_db: 0")
|
||||
yaml_lines.append(" type: group")
|
||||
yaml_lines.append(" connections:")
|
||||
|
||||
for conn_yaml in groups[group_name]:
|
||||
yaml_lines.append(conn_yaml)
|
||||
|
||||
yaml_lines.append("")
|
||||
|
||||
return '\n'.join(yaml_lines)
|
||||
|
||||
def main():
|
||||
print("Generating TinyRDM connections.yaml from sdm status --json...")
|
||||
|
||||
sdm_data = run_sdm_status()
|
||||
if not sdm_data:
|
||||
return
|
||||
|
||||
connections = parse_redis_connections(sdm_data)
|
||||
print(f"Found {len(connections)} Redis connections")
|
||||
|
||||
groups = group_connections(connections)
|
||||
|
||||
for group_name, conns in groups.items():
|
||||
print(f" {group_name}: {len(conns)} connections")
|
||||
|
||||
yaml_content = generate_yaml_content(groups)
|
||||
|
||||
output_file = os.path.expanduser('~/.config/TinyRDM/connections.yaml')
|
||||
try:
|
||||
with open(output_file, 'w') as f:
|
||||
f.write(yaml_content)
|
||||
print(f"✅ Successfully generated {output_file}")
|
||||
except Exception as e:
|
||||
print(f"❌ Error writing file: {e}")
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
||||
Loading…
Add table
Add a link
Reference in a new issue