def main(argv): print('Kamonohashi Slackbot') # KQI実行のための環境変数追加 if os.name == 'posix': # linux: kqiが格納されている場所 (デフォルトの想定場所) # 本当は外だしすべき kqicli = '/home/(username)/.local/bin' os.environ['PATH'] = os.environ['PATH'] + ':' + kqicli # 設定ファイルの読込み sec = JsonManager(filepath=os.path.join(FLAGS.config_root, 'secure.json')) cfg = JsonManager(filepath=os.path.join(FLAGS.config_root, 'config.json')) msg = MessageManager(filepath=os.path.join(FLAGS.config_root, 'message.json'), kamonohashi_uri=sec['KAMONOHASHI']['Server'], postmessage_uri=sec['SlackURI']) # 監視状態変数 watch_status = { 'dailyjob' : False, 'watching' : False, 'waketime' : datetime.now() } # テナント状態変数 tenant_status = { 'count' : {}, 'state' : {} } tenant_active_job = {} # 監視開始 print('Watch Loop Start') while True: sec.Load() kqi.Login(sec['KAMONOHASHI']['Application']['Username'], sec['KAMONOHASHI']['Application']['Password']) tenants = kqi.GetTenantDict() print('Daily Loop Start') while datetime.now().day == watch_status['waketime'].day: # JSONファイルの更新確認 msg.Load() if cfg.Load(): # 設定ファイルの更新があればテナント情報も再取得する tenants = kqi.GetTenantDict() # 監視状態更新 watch_status = UpdateWatchStatus(watch_status, GetWatchCondition(cfg), msg) # 監視状態変数のクリア tenant_status['count'] = {} # 監視状態がアクティブの場合はテナント毎に監視処理を行う for tenant in tenants: tenant_condition = {} if str(tenant) in cfg['Tenant']: tenant_condition = cfg['Tenant'][str(tenant)] kqi.SwitchTenant(tenant) # 監視状態かどうか tenant_status = UpdateTenantTrainStatus(tenant_status, tenant_condition, tenant, tenants, watch_status, msg, kqi) tenant_status = UpdateTenantInferStatus(tenant_status, tenant_condition, tenant, tenants, watch_status, msg, kqi) # サーバーヘルス監視(特に監視したいのはGPU温度) # T.B.D # すべての監視対象テナントでしばらくメッセージ送信していない場合は実行中に応じてメッセージを投げる if watch_status['watching'] and msg.IsPassedTime(seconds=120 * 60): msg.SendMessage(msg.CreateTenantsRunningInfo(tenants, tenant_status['count'])) msg.UpdateTimestamp() # 連続で処理すると負荷がかかるため、指定したポーリング間隔で待機 time.sleep(cfg['Polling']) # 日の処理完了を抜けた場合はリセットする watch_status['dailyjob'] = False watch_status['waketime'] = datetime.now()