30
30
import time
31
31
from pathlib import Path
32
32
from requests import get , ConnectionError
33
+ from flask import Flask
34
+ from flask_httpauth import HTTPTokenAuth
35
+ from waitress import serve
33
36
34
37
from opengrok_tools .utils .log import get_console_logger , \
35
38
get_log_level , get_class_basename
62
65
OPENGROK_WEBAPPS_DIR = os .path .join (tomcat_root , "webapps" )
63
66
OPENGROK_JAR = os .path .join (OPENGROK_LIB_DIR , 'opengrok.jar' )
64
67
68
+ expected_token = None
69
+
70
+ sleep_event = threading .Event ()
71
+ app = Flask (__name__ )
72
+ auth = HTTPTokenAuth (scheme = 'Bearer' )
73
+
74
+
75
+ @auth .verify_token
76
+ def verify_token (token ):
77
+ if expected_token is None :
78
+ return "yes"
79
+
80
+ if token is not None and token == expected_token :
81
+ return "yes"
82
+
83
+
84
+ @app .route ('/reindex' )
85
+ @auth .login_required
86
+ def index ():
87
+ # Signal the sync/indexer thread.
88
+ sleep_event .set ()
89
+ sleep_event .clear ()
90
+
91
+ return "Reindex triggered"
92
+
93
+
94
+ def rest_function (logger , rest_port ):
95
+ logger .info ("Starting REST app on port {}" .format (rest_port ))
96
+ serve (app , host = "0.0.0.0" , port = rest_port )
97
+
65
98
66
99
def set_url_root (logger , url_root ):
67
100
"""
@@ -230,7 +263,14 @@ def indexer_no_projects(logger, uri, config_path, sync_period,
230
263
231
264
wait_for_tomcat (logger , uri )
232
265
266
+ periodic_sync = True
267
+ if sync_period is None or sync_period == 0 :
268
+ periodic_sync = False
269
+
233
270
while True :
271
+ if not periodic_sync :
272
+ sleep_event .wait ()
273
+
234
274
indexer_options = ['-s' , OPENGROK_SRC_ROOT ,
235
275
'-d' , OPENGROK_DATA_ROOT ,
236
276
'-c' , '/usr/local/bin/ctags' ,
@@ -246,9 +286,10 @@ def indexer_no_projects(logger, uri, config_path, sync_period,
246
286
jar = OPENGROK_JAR , doprint = True )
247
287
indexer .execute ()
248
288
249
- sleep_seconds = sync_period * 60
250
- logger .info ("Sleeping for {} seconds" .format (sleep_seconds ))
251
- time .sleep (sleep_seconds )
289
+ if periodic_sync :
290
+ sleep_seconds = sync_period * 60
291
+ logger .info ("Sleeping for {} seconds" .format (sleep_seconds ))
292
+ time .sleep (sleep_seconds )
252
293
253
294
254
295
def project_syncer (logger , loglevel , uri , config_path , sync_period ,
@@ -262,7 +303,14 @@ def project_syncer(logger, loglevel, uri, config_path, sync_period,
262
303
263
304
set_config_value (logger , 'projectsEnabled' , 'true' , uri )
264
305
306
+ periodic_sync = True
307
+ if sync_period is None or sync_period == 0 :
308
+ periodic_sync = False
309
+
265
310
while True :
311
+ if not periodic_sync :
312
+ sleep_event .wait ()
313
+
266
314
refresh_projects (logger , uri )
267
315
268
316
if os .environ .get ('OPENGROK_SYNC_YML' ): # debug only
@@ -298,9 +346,10 @@ def project_syncer(logger, loglevel, uri, config_path, sync_period,
298
346
299
347
save_config (logger , uri , config_path )
300
348
301
- sleep_seconds = sync_period * 60
302
- logger .info ("Sleeping for {} seconds" .format (sleep_seconds ))
303
- time .sleep (sleep_seconds )
349
+ if periodic_sync :
350
+ sleep_seconds = sync_period * 60
351
+ logger .info ("Sleeping for {} seconds" .format (sleep_seconds ))
352
+ time .sleep (sleep_seconds )
304
353
305
354
306
355
def create_bare_config (logger , extra_indexer_options = None ):
@@ -333,6 +382,21 @@ def create_bare_config(logger, extra_indexer_options=None):
333
382
raise Exception ("Failed to create bare configuration" )
334
383
335
384
385
+ def get_num_from_env (logger , env_name , default_value ):
386
+ value = default_value
387
+ env_str = os .environ .get (env_name )
388
+ if env_str :
389
+ try :
390
+ n = int (env_str )
391
+ if n >= 0 :
392
+ value = n
393
+ except ValueError :
394
+ logger .error ("{} is not a number: {}" .
395
+ format (env_name , env_str ))
396
+
397
+ return value
398
+
399
+
336
400
def main ():
337
401
log_level = os .environ .get ('OPENGROK_LOG_LEVEL' )
338
402
if log_level :
@@ -347,17 +411,7 @@ def main():
347
411
logger .debug ("URI = {}" .format (uri ))
348
412
349
413
# default period for syncing (in minutes)
350
- sync_period = 10
351
- sync_env = os .environ .get ('SYNC_TIME_MINUTES' )
352
- if sync_env :
353
- try :
354
- n = int (sync_env )
355
- if n >= 0 :
356
- sync_period = n
357
- except ValueError :
358
- logger .error ("SYNC_TIME_MINUTES is not a number: {}" .
359
- format (sync_env ))
360
-
414
+ sync_period = get_num_from_env (logger , 'SYNC_TIME_MINUTES' , 10 )
361
415
if sync_period == 0 :
362
416
logger .info ("synchronization disabled" )
363
417
else :
@@ -390,34 +444,36 @@ def main():
390
444
os .path .getsize (OPENGROK_CONFIG_FILE ) == 0 :
391
445
create_bare_config (logger , extra_indexer_options .split ())
392
446
393
- if sync_period > 0 :
394
- if use_projects :
395
- num_workers = multiprocessing .cpu_count ()
396
- workers_env = os .environ .get ('WORKERS' )
397
- if workers_env :
398
- try :
399
- n = int (workers_env )
400
- if n > 0 :
401
- num_workers = n
402
- except ValueError :
403
- logger .error ("WORKERS is not a number: {}" .
404
- format (workers_env ))
405
-
406
- logger .info ('Number of sync workers: {}' .format (num_workers ))
407
-
408
- worker_function = project_syncer
409
- syncer_args = (logger , log_level , uri ,
410
- OPENGROK_CONFIG_FILE ,
411
- sync_period , num_workers , env )
412
- else :
413
- worker_function = indexer_no_projects
414
- syncer_args = (logger , uri , OPENGROK_CONFIG_FILE , sync_period ,
415
- extra_indexer_options )
416
-
417
- logger .debug ("Starting sync thread" )
418
- thread = threading .Thread (target = worker_function , name = "Sync thread" ,
419
- args = syncer_args )
420
- thread .start ()
447
+ if use_projects :
448
+ num_workers = get_num_from_env (logger , 'WORKERS' ,
449
+ multiprocessing .cpu_count ())
450
+ logger .info ('Number of sync workers: {}' .format (num_workers ))
451
+
452
+ worker_function = project_syncer
453
+ syncer_args = (logger , log_level , uri ,
454
+ OPENGROK_CONFIG_FILE ,
455
+ sync_period , num_workers , env )
456
+ else :
457
+ worker_function = indexer_no_projects
458
+ syncer_args = (logger , uri , OPENGROK_CONFIG_FILE , sync_period ,
459
+ extra_indexer_options )
460
+
461
+ logger .debug ("Starting sync thread" )
462
+ thread = threading .Thread (target = worker_function , name = "Sync thread" ,
463
+ args = syncer_args )
464
+ thread .start ()
465
+
466
+ rest_port = get_num_from_env (logger , 'REST_PORT' , 5000 )
467
+ token = os .environ .get ('REST_TOKEN' )
468
+ global expected_token
469
+ if token :
470
+ logger .debug ("Setting expected token for REST endpoint"
471
+ "on port {} to '{}'" .format (rest_port , token ))
472
+ expected_token = token
473
+ logger .debug ("Starting REST thread" )
474
+ thread = threading .Thread (target = rest_function , name = "REST thread" ,
475
+ args = (logger , rest_port ))
476
+ thread .start ()
421
477
422
478
# Start Tomcat last. It will be the foreground process.
423
479
logger .info ("Starting Tomcat" )
0 commit comments