pyth_utils.py 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. import logging
  2. import os
  3. import socketserver
  4. import subprocess
  5. import sys
  6. log = logging.getLogger(__name__)
  7. # Settings specific to local devnet Pyth instance
  8. PYTH = os.environ.get("PYTH", "./pyth")
  9. PYTH_KEY_STORE = os.environ.get("PYTH_KEY_STORE", "/home/pyth/.pythd")
  10. PYTH_PROGRAM_KEYPAIR = os.environ.get(
  11. "PYTH_PROGRAM_KEYPAIR", f"{PYTH_KEY_STORE}/publish_key_pair.json"
  12. )
  13. PYTH_PROGRAM_SO_PATH = os.environ.get("PYTH_PROGRAM_SO", "../target/oracle.so")
  14. PYTH_PUBLISHER_KEYPAIR = os.environ.get(
  15. "PYTH_PUBLISHER_KEYPAIR", f"{PYTH_KEY_STORE}/publish_key_pair.json"
  16. )
  17. PYTH_PUBLISHER_INTERVAL = float(os.environ.get("PYTH_PUBLISHER_INTERVAL", "5"))
  18. # 0 setting disables airdropping
  19. SOL_AIRDROP_AMT = int(os.environ.get("SOL_AIRDROP_AMT", 0))
  20. # SOL RPC settings
  21. SOL_RPC_HOST = os.environ.get("SOL_RPC_HOST", "solana-devnet")
  22. SOL_RPC_PORT = int(os.environ.get("SOL_RPC_PORT", 8899))
  23. SOL_RPC_URL = os.environ.get(
  24. "SOL_RPC_URL", "{0}:{1}".format(SOL_RPC_HOST, SOL_RPC_PORT)
  25. )
  26. # A TCP port we open when a service is ready
  27. READINESS_PORT = int(os.environ.get("READINESS_PORT", "2000"))
  28. def run_or_die(args, die=True, **kwargs):
  29. """
  30. Opinionated subprocess.run() call with fancy logging
  31. """
  32. args_readable = " ".join(args)
  33. logging.debug(f"CMD RUN: {args_readable}")
  34. ret = subprocess.run(args, text=True, **kwargs)
  35. if ret.returncode != 0:
  36. if str(ret.stdout) != '':
  37. logging.info(f"STDOUT: {ret.stdout}")
  38. if str(ret.stderr) != '':
  39. logging.error(f"STDERR: {ret.stderr}")
  40. if die:
  41. sys.exit(ret.returncode)
  42. else:
  43. logging.warn("CMD DIE FALSE")
  44. else:
  45. logging.debug(f"CMD OK: {args_readable}")
  46. return ret
  47. def pyth_run_or_die(subcommand, args=[], debug=False, confirm=True, **kwargs):
  48. """
  49. Pyth boilerplate in front of run_or_die
  50. """
  51. return run_or_die(
  52. [PYTH, subcommand] + args + (["-d"] if debug else [])
  53. # Note: not all pyth subcommands accept -n
  54. + ([] if confirm else ["-n"])
  55. + ["-k", PYTH_KEY_STORE]
  56. + ["-r", SOL_RPC_HOST]
  57. + ["-c", "finalized"],
  58. **kwargs,
  59. )
  60. def sol_run_or_die(subcommand, args=[], **kwargs):
  61. """
  62. Solana boilerplate in front of run_or_die
  63. """
  64. return run_or_die(["solana", subcommand] + args + ["--url", SOL_RPC_URL], **kwargs)
  65. class ReadinessTCPHandler(socketserver.StreamRequestHandler):
  66. def handle(self):
  67. """TCP black hole"""
  68. self.rfile.read(64)
  69. def readiness():
  70. """
  71. Accept connections from readiness probe
  72. """
  73. with socketserver.TCPServer(
  74. ("0.0.0.0", READINESS_PORT), ReadinessTCPHandler
  75. ) as srv:
  76. srv.serve_forever()