NitinBot002 commited on
Commit
8b24bef
·
verified ·
1 Parent(s): d984e51

Create corol_wrapper.py

Browse files
Files changed (1) hide show
  1. corol_wrapper.py +193 -0
corol_wrapper.py ADDED
@@ -0,0 +1,193 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/usr/bin/env python3
2
+ """
3
+ Coral Server Python Wrapper
4
+ Starts and manages the coral-server on port 5555
5
+ """
6
+
7
+ import os
8
+ import sys
9
+ import subprocess
10
+ import signal
11
+ import time
12
+ import logging
13
+ from threading import Thread
14
+
15
+ # Configure logging
16
+ logging.basicConfig(
17
+ level=logging.INFO,
18
+ format='%(asctime)s - %(name)s - %(levelname)s - %(message)s'
19
+ )
20
+ logger = logging.getLogger('coral-wrapper')
21
+
22
+ class CoralServerWrapper:
23
+ def __init__(self, port=5555, jar_path='coral-server.jar'):
24
+ self.port = int(os.environ.get('CORAL_PORT', port))
25
+ self.jar_path = jar_path
26
+ self.process = None
27
+ self.running = False
28
+
29
+ def check_java_version(self):
30
+ """Verify Java version is > 17"""
31
+ try:
32
+ result = subprocess.run(
33
+ ['java', '-version'],
34
+ capture_output=True,
35
+ text=True
36
+ )
37
+ version_info = result.stderr or result.stdout
38
+ logger.info(f"Java version: {version_info.split()[2].strip('\"')}")
39
+
40
+ # Extract major version
41
+ version_str = version_info.split()[2].strip('"')
42
+ major_version = int(version_str.split('.')[0])
43
+
44
+ if major_version < 17:
45
+ logger.error(f"Java version {major_version} is < 17. Please upgrade.")
46
+ return False
47
+ return True
48
+ except Exception as e:
49
+ logger.error(f"Error checking Java version: {e}")
50
+ return False
51
+
52
+ def start_server(self):
53
+ """Start the coral-server"""
54
+ if not self.check_java_version():
55
+ sys.exit(1)
56
+
57
+ try:
58
+ # Java command to run coral-server
59
+ java_cmd = [
60
+ 'java',
61
+ '-Xmx512m',
62
+ '-Xms256m',
63
+ '-XX:+UseContainerSupport',
64
+ '-XX:MaxRAMPercentage=75.0',
65
+ '-jar',
66
+ self.jar_path,
67
+ '--sse-server-ktor',
68
+ str(self.port)
69
+ ]
70
+
71
+ logger.info(f"Starting coral-server on port {self.port}...")
72
+ logger.info(f"Command: {' '.join(java_cmd)}")
73
+
74
+ # Start the process
75
+ self.process = subprocess.Popen(
76
+ java_cmd,
77
+ stdout=subprocess.PIPE,
78
+ stderr=subprocess.STDOUT,
79
+ universal_newlines=True,
80
+ bufsize=1
81
+ )
82
+
83
+ self.running = True
84
+
85
+ # Start thread to monitor output
86
+ output_thread = Thread(target=self.monitor_output)
87
+ output_thread.daemon = True
88
+ output_thread.start()
89
+
90
+ # Wait a moment to ensure server starts
91
+ time.sleep(3)
92
+
93
+ if self.process.poll() is None:
94
+ logger.info(f"✓ Coral-server started successfully on port {self.port}")
95
+ logger.info(f" Server URL: http://localhost:{self.port}")
96
+ else:
97
+ logger.error("Server failed to start")
98
+ self.running = False
99
+ sys.exit(1)
100
+
101
+ except FileNotFoundError:
102
+ logger.error(f"JAR file not found: {self.jar_path}")
103
+ sys.exit(1)
104
+ except Exception as e:
105
+ logger.error(f"Error starting server: {e}")
106
+ sys.exit(1)
107
+
108
+ def monitor_output(self):
109
+ """Monitor and log server output"""
110
+ try:
111
+ for line in iter(self.process.stdout.readline, ''):
112
+ if line:
113
+ logger.info(f"[coral-server] {line.strip()}")
114
+ if not self.running:
115
+ break
116
+ except Exception as e:
117
+ logger.error(f"Error monitoring output: {e}")
118
+
119
+ def stop_server(self):
120
+ """Stop the coral-server gracefully"""
121
+ if self.process and self.running:
122
+ logger.info("Stopping coral-server...")
123
+ self.running = False
124
+
125
+ # Send SIGTERM for graceful shutdown
126
+ self.process.terminate()
127
+
128
+ # Wait for process to end (max 10 seconds)
129
+ try:
130
+ self.process.wait(timeout=10)
131
+ logger.info("✓ Coral-server stopped gracefully")
132
+ except subprocess.TimeoutExpired:
133
+ logger.warning("Force killing coral-server...")
134
+ self.process.kill()
135
+ self.process.wait()
136
+ logger.info("✓ Coral-server force stopped")
137
+
138
+ def restart_server(self):
139
+ """Restart the coral-server"""
140
+ logger.info("Restarting coral-server...")
141
+ self.stop_server()
142
+ time.sleep(2)
143
+ self.start_server()
144
+
145
+ def health_check(self):
146
+ """Check if server is healthy"""
147
+ if self.process and self.process.poll() is None:
148
+ return True
149
+ return False
150
+
151
+ def run(self):
152
+ """Main run method - starts server and handles signals"""
153
+ # Setup signal handlers
154
+ signal.signal(signal.SIGTERM, self.signal_handler)
155
+ signal.signal(signal.SIGINT, self.signal_handler)
156
+
157
+ # Start the server
158
+ self.start_server()
159
+
160
+ # Keep running and monitor health
161
+ try:
162
+ while self.running:
163
+ time.sleep(5)
164
+ if not self.health_check():
165
+ logger.error("Server health check failed!")
166
+ logger.info("Attempting restart...")
167
+ self.restart_server()
168
+ except KeyboardInterrupt:
169
+ logger.info("Received interrupt signal")
170
+ finally:
171
+ self.stop_server()
172
+
173
+ def signal_handler(self, signum, frame):
174
+ """Handle shutdown signals"""
175
+ logger.info(f"Received signal {signum}")
176
+ self.running = False
177
+
178
+ def main():
179
+ """Main entry point"""
180
+ logger.info("="*50)
181
+ logger.info("Coral Server Python Wrapper")
182
+ logger.info("="*50)
183
+
184
+ # Get configuration from environment
185
+ port = os.environ.get('CORAL_PORT', 5555)
186
+ jar_path = os.environ.get('CORAL_JAR_PATH', 'coral-server.jar')
187
+
188
+ # Create and run wrapper
189
+ wrapper = CoralServerWrapper(port=port, jar_path=jar_path)
190
+ wrapper.run()
191
+
192
+ if __name__ == "__main__":
193
+ main()