on_Binary__13_apt_install.py 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. #!/usr/bin/env python3
  2. """
  3. Install a binary using apt package manager.
  4. Usage: on_Binary__install_using_apt_provider.py --binary-id=<uuid> --machine-id=<uuid> --name=<name>
  5. Output: Binary JSONL record to stdout after installation
  6. """
  7. import json
  8. import sys
  9. import rich_click as click
  10. from abx_pkg import Binary, AptProvider, BinProviderOverrides
  11. # Fix pydantic forward reference issue
  12. AptProvider.model_rebuild()
  13. @click.command()
  14. @click.option('--binary-id', required=True, help="Binary UUID")
  15. @click.option('--machine-id', required=True, help="Machine UUID")
  16. @click.option('--name', required=True, help="Binary name to install")
  17. @click.option('--binproviders', default='*', help="Allowed providers (comma-separated)")
  18. @click.option('--overrides', default=None, help="JSON-encoded overrides dict")
  19. def main(binary_id: str, machine_id: str, name: str, binproviders: str, overrides: str | None):
  20. """Install binary using apt package manager."""
  21. # Check if apt provider is allowed
  22. if binproviders != '*' and 'apt' not in binproviders.split(','):
  23. click.echo(f"apt provider not allowed for {name}", err=True)
  24. sys.exit(0) # Not an error, just skip
  25. # Use abx-pkg AptProvider to install binary
  26. provider = AptProvider()
  27. if not provider.INSTALLER_BIN:
  28. click.echo("apt not available on this system", err=True)
  29. sys.exit(1)
  30. click.echo(f"Installing {name} via apt...", err=True)
  31. try:
  32. # Parse overrides if provided
  33. overrides_dict = None
  34. if overrides:
  35. try:
  36. overrides_dict = json.loads(overrides)
  37. # Extract apt-specific overrides
  38. overrides_dict = overrides_dict.get('apt', {})
  39. click.echo(f"Using apt install overrides: {overrides_dict}", err=True)
  40. except json.JSONDecodeError:
  41. click.echo(f"Warning: Failed to parse overrides JSON: {overrides}", err=True)
  42. binary = Binary(name=name, binproviders=[provider], overrides={'apt': overrides_dict} if overrides_dict else {}).install()
  43. except Exception as e:
  44. click.echo(f"apt install failed: {e}", err=True)
  45. sys.exit(1)
  46. if not binary.abspath:
  47. click.echo(f"{name} not found after apt install", err=True)
  48. sys.exit(1)
  49. # Output Binary JSONL record to stdout
  50. record = {
  51. 'type': 'Binary',
  52. 'name': name,
  53. 'abspath': str(binary.abspath),
  54. 'version': str(binary.version) if binary.version else '',
  55. 'sha256': binary.sha256 or '',
  56. 'binprovider': 'apt',
  57. 'machine_id': machine_id,
  58. 'binary_id': binary_id,
  59. }
  60. print(json.dumps(record))
  61. # Log human-readable info to stderr
  62. click.echo(f"Installed {name} at {binary.abspath}", err=True)
  63. click.echo(f" version: {binary.version}", err=True)
  64. sys.exit(0)
  65. if __name__ == '__main__':
  66. main()