ROOT logo
// $Id: AEVMlSucker.cxx 2458 2010-11-16 15:19:59Z matevz $

// Copyright (C) 1999-2008, Matevz Tadel. All rights reserved.
// This file is part of GLED, released under GNU General Public License version 2.
// For the licensing terms see $GLEDSYS/LICENSE or http://www.gnu.org/.

#include "AEVMlSucker.h"
#include "AEVManager.h"
#include "AEVMlSucker.c7"

#include "AEVMapViz.h"
#include "AEVSite.h"
#include "AEVSiteList.h"

#include <Gled/GThread.h>

#include <TMath.h>
#include <TSystem.h>
#include <TSocket.h>

// AEVMlSucker

//__________________________________________________________________________
//
//

ClassImp(AEVMlSucker);

/**************************************************************************/

namespace
{
bool s_map_init_done = false;

// Site Int_t and Float_t setters

typedef void (AEVSite::*site_set_int_foo)  (Int_t);
typedef void (AEVSite::*site_set_float_foo)(Float_t);

map<TString, site_set_int_foo>     s_site_set_int_map;
map<TString, site_set_float_foo>   s_site_set_float_map;

void call_foo(AEVSite* site, const TString& key, Int_t val)
{
  site_set_int_foo foo = s_site_set_int_map[key];
  if (foo == 0)
    throw(Exc_t("site_set_int - unknown key '") + key + "'.");

  // printf("Calling setter for key '%s'\n", key.Data());
  GLensWriteHolder lock(site);
  (site->*foo)(val);
}

void call_foo(AEVSite* site, const TString& key, Float_t val)
{
  site_set_float_foo foo = s_site_set_float_map[key];
  if (foo == 0)
    throw(Exc_t("site_set_float - unknown key '") + key + "'.");

  // printf("Calling setter for key '%s'\n", key.Data());
  GLensWriteHolder lock(site);
  (site->*foo)(val);
}

}

void AEVMlSucker::_init()
{
  // from local dump: "cat nc-dump"
  mSuckHost  = "pcalimonitor2.cern.ch";
  mSuckPort  = 7014;
  mFooSleep = 0;

  mSuckerThread = 0;

  mGlobWordRE.Reset("([-\\w\\.]+)\\s+", "g");
  mGlobVarRE .Reset("([-_\\w]+)=([\\d\\.eE]+)(?:[,\\s]*)", "g");
  mUScoreRE  .Reset("(\\w+)_([-\\w]+)");

  mSock = 0;

  if ( ! s_map_init_done)
  {
    s_site_set_int_map["max_RUNNING"]    = &AEVSite::SetSiteSize;

    s_site_set_int_map["jobs_STARTED"]   = &AEVSite::SetJobsStarted;
    s_site_set_int_map["jobs_RUNNING"]   = &AEVSite::SetJobsRunning;
    s_site_set_int_map["jobs_SAVING"]    = &AEVSite::SetJobsSaving;
    s_site_set_int_map["jobs_DONE"]      = &AEVSite::SetJobsDone;
    s_site_set_int_map["jobs_ERROR_ALL"] = &AEVSite::SetJobsError;
    s_site_set_int_map["jobs_ERR"]       = &AEVSite::SetJobsError;

    s_site_set_int_map["totevents"]      = &AEVSite::SetEventsAll;
    s_site_set_int_map["events"]         = &AEVSite::SetEventsDone;

    s_site_set_float_map["geo_LAT"] = &AEVSite::SetLatitude;
    s_site_set_float_map["geo_LON"] = &AEVSite::SetLongitude;
  }
}

//==============================================================================

TString AEVMlSucker::next_word(const TString& s)
{
  if (mGlobWordRE.Match(s) != 2)
  {
    throw (Exc_t("Failed getting next word."));
  }

  return mGlobWordRE[1];
}

bool AEVMlSucker::next_var(const TString& s, TString& var, TString& val)
{
  if (mGlobVarRE.Match(s) != 3)
  {
    return false;
  }

  var = mGlobVarRE[1];
  val = mGlobVarRE[2];

  return true;
}

bool AEVMlSucker::next_var(const TString& s, TString& var, Float_t& val)
{
  TString v;
  bool ret = next_var(s, var, v);
  val = v.Atof();
  return ret;
}

//==============================================================================

void* AEVMlSucker::tl_Suck(AEVMlSucker* s)
{
  s->Suck();
  delete s->mSock; s->mSock = 0;
  s->mSuckerThread = 0;
  return 0;
}

void AEVMlSucker::Suck()
{
  static const Exc_t _eh("AEVMlSucker::Suck ");

  mSock = new TSocket(mSuckHost, mSuckPort);
  if (mSock->IsValid() == kFALSE)
  {
    printf("%sfailed opening the socket.\n", _eh.Data());
    return;
  }

  const Int_t buf_size = 1024;
  char        buf[buf_size];

  Int_t count = 0;

  while (true)
  {
    {
      Int_t len = 0;
      while (1)
      {
	Int_t ret = mSock->RecvRaw(&buf[len], 1);
	if (ret < 0) {
	  printf("%sError sucking %d.\n", _eh.Data(), ret);
	  mSock->Close();
	  return;
	}
	if (buf[len] == 10) {
	  buf[len] = 0;
	  break;
	}
	++len;
      }
    }

    TString l(buf);

    mGlobWordRE.ResetGlobalState();

    ++count;

    // printf("%-4d: '%s'\n", count, l.Data());

    try
    {
      TString l1 = next_word(l);

      if (l1 == "site")
      {
	TString name = next_word(l);

	AEVSiteList *sites  = find_lens<AEVSiteList>("Sites");

	bool new_site = false;
	AEVSite *site = sites->FindSite(name);
	if (site == 0)
	{
	  printf("New site '%s'.\n", name.Data());
	  new_site = true;
	  site = new AEVSite(name);
	}

	mGlobVarRE.AssignGlobalState(mGlobWordRE);
	TString var;
	Float_t val;
	Bool_t   reposition = false;
	while (next_var(l, var, val))
	{
	  if (var.BeginsWith("geo_"))
	  {
	    call_foo(site, var, val);
	    reposition = true;
	  }
	  else if (var.BeginsWith("jobs_") || var.BeginsWith("max_") || var.Contains("events"))
	  {
	    call_foo(site, var, TMath::Nint(val));
	  }
	  else
	  {
	    // printf("site - unhandled variable '%s'.\n", var.Data());
	  }
	}

	if (new_site)
	{
	  // !!! For cluster op, should IncarnateWAttach();
	  GLensWriteHolder wrlck(sites);

	  mQueen->CheckIn(site);
	  sites->Add(site);
	}

	assert_manager(_eh);

	GLensWriteHolder wrlck(*mManager);

	if (new_site)
	  mManager->SiteNew(site);
	if (reposition)
	  mManager->SitePositionChanged(site);
	mManager->SiteChanged(site);
      }
    }
    catch(Exc_t exc)
    {
      printf("Error sucking line %d: '%s'\n  Exception='%s'\n", count, l.Data(), exc.Data());
    }

    if (mFooSleep > 0)
      gSystem->Sleep(mFooSleep);
  }
}

void AEVMlSucker::StartSucker()
{
  static const Exc_t _eh("AEVMlSucker::StartSucker ");

  if (mSuckerThread)
    throw (_eh + "already running.");


  mSuckerThread = new GThread("AEVMlSucker-Sucker",
			      (GThread_foo) tl_Suck, this,
			      false);
  mSuckerThread->SetNice(20);
  mSuckerThread->Spawn();
}

void AEVMlSucker::StopSucker()
{
  static const Exc_t _eh("AEVMlSucker::StopSucker ");

  if (mSuckerThread == 0)
    throw (_eh + "not running.");

  mSuckerThread->Cancel();
  mSuckerThread->Join();
  mSuckerThread = 0;
}

//==============================================================================

void AEVMlSucker::SendLine(const TString& cmd)
{
  static const Exc_t _eh("AEVMlSucker::SendLine ");

  if (mSock == 0)
    throw(_eh + "socket not open.");

  Int_t ret = mSock->SendRaw(cmd.Data(), cmd.Length());
  if (ret < 0)
  {
    printf("%serror sending command %d.\n", _eh.Data(), ret);
  }
}
 AEVMlSucker.cxx:1
 AEVMlSucker.cxx:2
 AEVMlSucker.cxx:3
 AEVMlSucker.cxx:4
 AEVMlSucker.cxx:5
 AEVMlSucker.cxx:6
 AEVMlSucker.cxx:7
 AEVMlSucker.cxx:8
 AEVMlSucker.cxx:9
 AEVMlSucker.cxx:10
 AEVMlSucker.cxx:11
 AEVMlSucker.cxx:12
 AEVMlSucker.cxx:13
 AEVMlSucker.cxx:14
 AEVMlSucker.cxx:15
 AEVMlSucker.cxx:16
 AEVMlSucker.cxx:17
 AEVMlSucker.cxx:18
 AEVMlSucker.cxx:19
 AEVMlSucker.cxx:20
 AEVMlSucker.cxx:21
 AEVMlSucker.cxx:22
 AEVMlSucker.cxx:23
 AEVMlSucker.cxx:24
 AEVMlSucker.cxx:25
 AEVMlSucker.cxx:26
 AEVMlSucker.cxx:27
 AEVMlSucker.cxx:28
 AEVMlSucker.cxx:29
 AEVMlSucker.cxx:30
 AEVMlSucker.cxx:31
 AEVMlSucker.cxx:32
 AEVMlSucker.cxx:33
 AEVMlSucker.cxx:34
 AEVMlSucker.cxx:35
 AEVMlSucker.cxx:36
 AEVMlSucker.cxx:37
 AEVMlSucker.cxx:38
 AEVMlSucker.cxx:39
 AEVMlSucker.cxx:40
 AEVMlSucker.cxx:41
 AEVMlSucker.cxx:42
 AEVMlSucker.cxx:43
 AEVMlSucker.cxx:44
 AEVMlSucker.cxx:45
 AEVMlSucker.cxx:46
 AEVMlSucker.cxx:47
 AEVMlSucker.cxx:48
 AEVMlSucker.cxx:49
 AEVMlSucker.cxx:50
 AEVMlSucker.cxx:51
 AEVMlSucker.cxx:52
 AEVMlSucker.cxx:53
 AEVMlSucker.cxx:54
 AEVMlSucker.cxx:55
 AEVMlSucker.cxx:56
 AEVMlSucker.cxx:57
 AEVMlSucker.cxx:58
 AEVMlSucker.cxx:59
 AEVMlSucker.cxx:60
 AEVMlSucker.cxx:61
 AEVMlSucker.cxx:62
 AEVMlSucker.cxx:63
 AEVMlSucker.cxx:64
 AEVMlSucker.cxx:65
 AEVMlSucker.cxx:66
 AEVMlSucker.cxx:67
 AEVMlSucker.cxx:68
 AEVMlSucker.cxx:69
 AEVMlSucker.cxx:70
 AEVMlSucker.cxx:71
 AEVMlSucker.cxx:72
 AEVMlSucker.cxx:73
 AEVMlSucker.cxx:74
 AEVMlSucker.cxx:75
 AEVMlSucker.cxx:76
 AEVMlSucker.cxx:77
 AEVMlSucker.cxx:78
 AEVMlSucker.cxx:79
 AEVMlSucker.cxx:80
 AEVMlSucker.cxx:81
 AEVMlSucker.cxx:82
 AEVMlSucker.cxx:83
 AEVMlSucker.cxx:84
 AEVMlSucker.cxx:85
 AEVMlSucker.cxx:86
 AEVMlSucker.cxx:87
 AEVMlSucker.cxx:88
 AEVMlSucker.cxx:89
 AEVMlSucker.cxx:90
 AEVMlSucker.cxx:91
 AEVMlSucker.cxx:92
 AEVMlSucker.cxx:93
 AEVMlSucker.cxx:94
 AEVMlSucker.cxx:95
 AEVMlSucker.cxx:96
 AEVMlSucker.cxx:97
 AEVMlSucker.cxx:98
 AEVMlSucker.cxx:99
 AEVMlSucker.cxx:100
 AEVMlSucker.cxx:101
 AEVMlSucker.cxx:102
 AEVMlSucker.cxx:103
 AEVMlSucker.cxx:104
 AEVMlSucker.cxx:105
 AEVMlSucker.cxx:106
 AEVMlSucker.cxx:107
 AEVMlSucker.cxx:108
 AEVMlSucker.cxx:109
 AEVMlSucker.cxx:110
 AEVMlSucker.cxx:111
 AEVMlSucker.cxx:112
 AEVMlSucker.cxx:113
 AEVMlSucker.cxx:114
 AEVMlSucker.cxx:115
 AEVMlSucker.cxx:116
 AEVMlSucker.cxx:117
 AEVMlSucker.cxx:118
 AEVMlSucker.cxx:119
 AEVMlSucker.cxx:120
 AEVMlSucker.cxx:121
 AEVMlSucker.cxx:122
 AEVMlSucker.cxx:123
 AEVMlSucker.cxx:124
 AEVMlSucker.cxx:125
 AEVMlSucker.cxx:126
 AEVMlSucker.cxx:127
 AEVMlSucker.cxx:128
 AEVMlSucker.cxx:129
 AEVMlSucker.cxx:130
 AEVMlSucker.cxx:131
 AEVMlSucker.cxx:132
 AEVMlSucker.cxx:133
 AEVMlSucker.cxx:134
 AEVMlSucker.cxx:135
 AEVMlSucker.cxx:136
 AEVMlSucker.cxx:137
 AEVMlSucker.cxx:138
 AEVMlSucker.cxx:139
 AEVMlSucker.cxx:140
 AEVMlSucker.cxx:141
 AEVMlSucker.cxx:142
 AEVMlSucker.cxx:143
 AEVMlSucker.cxx:144
 AEVMlSucker.cxx:145
 AEVMlSucker.cxx:146
 AEVMlSucker.cxx:147
 AEVMlSucker.cxx:148
 AEVMlSucker.cxx:149
 AEVMlSucker.cxx:150
 AEVMlSucker.cxx:151
 AEVMlSucker.cxx:152
 AEVMlSucker.cxx:153
 AEVMlSucker.cxx:154
 AEVMlSucker.cxx:155
 AEVMlSucker.cxx:156
 AEVMlSucker.cxx:157
 AEVMlSucker.cxx:158
 AEVMlSucker.cxx:159
 AEVMlSucker.cxx:160
 AEVMlSucker.cxx:161
 AEVMlSucker.cxx:162
 AEVMlSucker.cxx:163
 AEVMlSucker.cxx:164
 AEVMlSucker.cxx:165
 AEVMlSucker.cxx:166
 AEVMlSucker.cxx:167
 AEVMlSucker.cxx:168
 AEVMlSucker.cxx:169
 AEVMlSucker.cxx:170
 AEVMlSucker.cxx:171
 AEVMlSucker.cxx:172
 AEVMlSucker.cxx:173
 AEVMlSucker.cxx:174
 AEVMlSucker.cxx:175
 AEVMlSucker.cxx:176
 AEVMlSucker.cxx:177
 AEVMlSucker.cxx:178
 AEVMlSucker.cxx:179
 AEVMlSucker.cxx:180
 AEVMlSucker.cxx:181
 AEVMlSucker.cxx:182
 AEVMlSucker.cxx:183
 AEVMlSucker.cxx:184
 AEVMlSucker.cxx:185
 AEVMlSucker.cxx:186
 AEVMlSucker.cxx:187
 AEVMlSucker.cxx:188
 AEVMlSucker.cxx:189
 AEVMlSucker.cxx:190
 AEVMlSucker.cxx:191
 AEVMlSucker.cxx:192
 AEVMlSucker.cxx:193
 AEVMlSucker.cxx:194
 AEVMlSucker.cxx:195
 AEVMlSucker.cxx:196
 AEVMlSucker.cxx:197
 AEVMlSucker.cxx:198
 AEVMlSucker.cxx:199
 AEVMlSucker.cxx:200
 AEVMlSucker.cxx:201
 AEVMlSucker.cxx:202
 AEVMlSucker.cxx:203
 AEVMlSucker.cxx:204
 AEVMlSucker.cxx:205
 AEVMlSucker.cxx:206
 AEVMlSucker.cxx:207
 AEVMlSucker.cxx:208
 AEVMlSucker.cxx:209
 AEVMlSucker.cxx:210
 AEVMlSucker.cxx:211
 AEVMlSucker.cxx:212
 AEVMlSucker.cxx:213
 AEVMlSucker.cxx:214
 AEVMlSucker.cxx:215
 AEVMlSucker.cxx:216
 AEVMlSucker.cxx:217
 AEVMlSucker.cxx:218
 AEVMlSucker.cxx:219
 AEVMlSucker.cxx:220
 AEVMlSucker.cxx:221
 AEVMlSucker.cxx:222
 AEVMlSucker.cxx:223
 AEVMlSucker.cxx:224
 AEVMlSucker.cxx:225
 AEVMlSucker.cxx:226
 AEVMlSucker.cxx:227
 AEVMlSucker.cxx:228
 AEVMlSucker.cxx:229
 AEVMlSucker.cxx:230
 AEVMlSucker.cxx:231
 AEVMlSucker.cxx:232
 AEVMlSucker.cxx:233
 AEVMlSucker.cxx:234
 AEVMlSucker.cxx:235
 AEVMlSucker.cxx:236
 AEVMlSucker.cxx:237
 AEVMlSucker.cxx:238
 AEVMlSucker.cxx:239
 AEVMlSucker.cxx:240
 AEVMlSucker.cxx:241
 AEVMlSucker.cxx:242
 AEVMlSucker.cxx:243
 AEVMlSucker.cxx:244
 AEVMlSucker.cxx:245
 AEVMlSucker.cxx:246
 AEVMlSucker.cxx:247
 AEVMlSucker.cxx:248
 AEVMlSucker.cxx:249
 AEVMlSucker.cxx:250
 AEVMlSucker.cxx:251
 AEVMlSucker.cxx:252
 AEVMlSucker.cxx:253
 AEVMlSucker.cxx:254
 AEVMlSucker.cxx:255
 AEVMlSucker.cxx:256
 AEVMlSucker.cxx:257
 AEVMlSucker.cxx:258
 AEVMlSucker.cxx:259
 AEVMlSucker.cxx:260
 AEVMlSucker.cxx:261
 AEVMlSucker.cxx:262
 AEVMlSucker.cxx:263
 AEVMlSucker.cxx:264
 AEVMlSucker.cxx:265
 AEVMlSucker.cxx:266
 AEVMlSucker.cxx:267
 AEVMlSucker.cxx:268
 AEVMlSucker.cxx:269
 AEVMlSucker.cxx:270
 AEVMlSucker.cxx:271
 AEVMlSucker.cxx:272
 AEVMlSucker.cxx:273
 AEVMlSucker.cxx:274
 AEVMlSucker.cxx:275
 AEVMlSucker.cxx:276
 AEVMlSucker.cxx:277
 AEVMlSucker.cxx:278
 AEVMlSucker.cxx:279
 AEVMlSucker.cxx:280
 AEVMlSucker.cxx:281
 AEVMlSucker.cxx:282
 AEVMlSucker.cxx:283
 AEVMlSucker.cxx:284
 AEVMlSucker.cxx:285
 AEVMlSucker.cxx:286
 AEVMlSucker.cxx:287
 AEVMlSucker.cxx:288
 AEVMlSucker.cxx:289
 AEVMlSucker.cxx:290
 AEVMlSucker.cxx:291
 AEVMlSucker.cxx:292
 AEVMlSucker.cxx:293
 AEVMlSucker.cxx:294
 AEVMlSucker.cxx:295
 AEVMlSucker.cxx:296
 AEVMlSucker.cxx:297
 AEVMlSucker.cxx:298
 AEVMlSucker.cxx:299