98103466d8
Sanitized version of red team infrastructure automation platform. Operational content (implant pipelines, lures, credential capture) replaced with documented stubs. Architecture and infrastructure automation code intact.
81 lines
2.5 KiB
Python
81 lines
2.5 KiB
Python
#!/usr/bin/env python3
|
|
"""
|
|
Linode provider utilities for C2ingRed deployment system
|
|
"""
|
|
|
|
import os
|
|
import logging
|
|
import subprocess
|
|
from .common import COLORS, load_vars_file
|
|
|
|
def get_linode_credentials(provider_vars=None):
|
|
"""Get Linode API token — Infisical first, vars.yaml fallback, then prompt."""
|
|
default_token = ''
|
|
|
|
try:
|
|
default_token = subprocess.check_output(
|
|
[os.path.expanduser('~/.local/bin/creds'), 'get', 'LINODE_TOKEN', 'homelab'],
|
|
text=True, stderr=subprocess.DEVNULL,
|
|
).strip()
|
|
except Exception:
|
|
pass
|
|
|
|
if not default_token:
|
|
if not provider_vars:
|
|
provider_vars = load_vars_file('linode')
|
|
default_token = provider_vars.get('linode_token', '')
|
|
|
|
print(f"\n{COLORS['BLUE']}Linode Configuration{COLORS['RESET']}")
|
|
token = input(f"Linode API Token [{'*****' if default_token else 'required'}]: ") or default_token
|
|
|
|
if not token:
|
|
print(f"{COLORS['RED']}Linode API token is required{COLORS['RESET']}")
|
|
return None
|
|
|
|
return {'linode_token': token}
|
|
|
|
def select_linode_regions(provider_vars=None) -> list[str]:
|
|
"""Return region list — single entry if user specified one, all regions if blank (random per-node)."""
|
|
if not provider_vars:
|
|
provider_vars = load_vars_file('linode')
|
|
|
|
regions = provider_vars.get('region_choices', ['us-east'])
|
|
|
|
print(f"\nAvailable Linode regions:")
|
|
for i, region in enumerate(regions, 1):
|
|
print(f" {i:2}. {region}")
|
|
|
|
region_input = input("\nSelect region (number or leave blank for random per-node): ").strip()
|
|
|
|
if not region_input:
|
|
return regions
|
|
|
|
try:
|
|
idx = int(region_input)
|
|
if 1 <= idx <= len(regions):
|
|
return [regions[idx - 1]]
|
|
except ValueError:
|
|
pass
|
|
|
|
print(f"{COLORS['RED']}Invalid input, using random per-node regions{COLORS['RESET']}")
|
|
return regions
|
|
|
|
def gather_linode_config():
|
|
"""Gather all Linode-specific configuration"""
|
|
provider_vars = load_vars_file('linode')
|
|
config = {}
|
|
|
|
linode_creds = get_linode_credentials(provider_vars)
|
|
if not linode_creds:
|
|
return None
|
|
config.update(linode_creds)
|
|
|
|
linode_regions = select_linode_regions(provider_vars)
|
|
config['linode_regions'] = linode_regions
|
|
config['linode_region'] = linode_regions[0]
|
|
|
|
config['linode_instance_type'] = provider_vars.get('linode_instance_type', 'g6-nanode-1')
|
|
config['linode_image'] = provider_vars.get('linode_image', 'linode/debian12')
|
|
|
|
return config
|