32 #include <sys/types.h>
61 {
if (last) last->
next = tP;
71 for (
int i = 0; i < anum; i++) {vec[i] = tP; tP = tP->
next;}
79 while(tP) {tP=tP->
next; n++;}
92 while(tP && strcmp(item,tP->
text)) {tP=tP->
next; i++;}
100 while((tP = first)) {first = tP->
next;
delete tP;}
164 bool XrdCmsBlackList::AddBL(
BL_Grip &bAnchor,
char *hSpec,
167 const char *bwTag = (
isWList ?
"whitelist '" :
"blacklist '");
172 char *Ast, blBuff[512];
181 {
int i = AddRD(rAnchor, rSpec, hSpec);
182 if (i < 0)
return false;
188 if (!(Ast = index(hSpec,
'*')))
189 {
if ((eText = blAddr.
Set(hSpec,0)))
190 {snprintf(blBuff,
sizeof(blBuff),
"'; %s", eText);
191 Say.
Say(
"Config ",
"Unable to ", bwTag, hSpec, blBuff);
199 Hdr.
v.pfxLen = Ast - hSpec;
200 Hdr.
v.sfxLen = strlen(hSpec + Hdr.
v.pfxLen + 1);
201 Hdr.
v.totLen = Hdr.
v.pfxLen + Hdr.
v.sfxLen;
215 int XrdCmsBlackList::AddRD(
BL_Grip *rAnchor,
char *rSpec,
char *hSpec)
224 if (rAnchor[0].Include(rSpec, ival))
return ival;
229 {
Say.
Say(
"Config ",
"Too many different redirects at ", hSpec,
241 while((rTarg = rToks.GetToken()) && *rTarg) aOK &= AddRD(&rList,rTarg,hSpec);
246 rP = Flatten(rList, rList->val);
251 while((rP = rList)) {rList = rList->
next;
delete rP;}
260 bool XrdCmsBlackList::AddRD(
XrdOucTList **rList,
char *rSpec,
char *hSpec)
267 {
if (!(rPort = index(rSpec,
']')))
268 {
Say.
Say(
"Config ",
"Invalid ",hSpec,
" redirect specification - ",rSpec);
271 }
else rPort = rSpec;
275 if ((rPort = index(rPort,
':')))
276 {
if (!(*(rPort+1))) rPort = 0;
277 else *rPort++ =
'\0';
282 if (!rPort) {
Say.
Say(
"Config ",
"redirect port not specified for ", hSpec);
298 XrdOucTList **blOldRedr = 0, **blNewRedr = 0, *blNewReal = 0, *tP = 0, *nP;
299 int rc, blOldRcnt = 0, blNewRcnt;
300 bool doUpdt =
false, doPrt =
false;
307 if (GetBL(blNewReal, blNewRedr, blNewRcnt))
322 {
if (doPrt)
Say.
Say(
"Config ", tP->text,
" removed from blacklist.");
323 nP = tP->next;
delete tP; tP = nP;
329 {
for (
int i = 0; i < blOldRcnt; i++)
delete blOldRedr[i];
349 char buff[4096], bPort[8], *bP = buff;
350 int n, pLen, bleft =
sizeof(buff);
351 short xdata[4] = {0};
355 pLen = sprintf(bPort,
":%d", tPort);
361 {n = strlen(tP->
text)+pLen+2;
362 if (n >= bleft)
break;
363 n = sprintf(bP,
" %s%s", tP->
text, bPort);
370 xdata[0] = strlen(buff+1) + 1;
371 xdata[1] = xdata[0] +
sizeof(short);
372 xdata[2] = htons(xdata[0]);
387 static int msgCnt = 0;
391 const char *fType, *oEmsg, *rEmsg;
392 char *hsp, *rsp, hspBuff[512], rSpec[4096];
399 {oEmsg =
"open whitelist file";
400 rEmsg =
"read whitelist file";
403 oEmsg =
"open blacklist file";
404 rEmsg =
"read blacklist file";
410 if ( (blFD =
open(
blFN, O_RDONLY, 0)) < 0)
411 {
if (errno == ENOENT)
return true;
412 if (!(msgCnt & 0x03))
Say.
Emsg(
"GetBL", errno, oEmsg,
blFN);
415 blFile.Attach(blFD, 4096);
419 Say.
Say(
"Config processing ", fType,
" file ",
blFN);
423 while((hsp = blFile.GetMyFirstWord()))
424 {
if (strlen(hsp) >=
sizeof(hspBuff))
425 {
Say.
Say(
"Config ", hsp,
" is too long."); aOK =
false;
continue;}
426 strcpy(hspBuff, hsp); hsp = hspBuff;
427 if ( (rsp = blFile.GetWord()) && *rsp)
428 {
if (strcmp(
"redirect", rsp))
429 {
Say.
Say(
"Config ", rsp,
" is an invalid modifier for ", hsp);
433 *rSpec = 0; rsp = rSpec;
434 if (!blFile.GetRest(rSpec,
sizeof(rSpec)))
435 {
Say.
Say(
"Config ",
"redirect target too long ", hsp);
440 {
Say.
Say(
"Config ",
"redirect target missing for ", hsp);
446 if (!AddBL(bAnchor, hsp, rAnchor, rsp)) aOK =
false;
451 if ((retc = blFile.LastError()))
452 {
Say.
Emsg(
"GetBL", retc, rEmsg,
blFN); aOK =
false;}
453 else if (!aOK)
Say.
Emsg(
"GetBL",
"Error(s) encountered in",fType,
"file!");
458 bList = ((aOK || isInit) ? bAnchor.
Export() :
nullptr);
459 rList = rAnchor[1].
Array(rcnt);
468 const char *blfn,
int chkt)
480 if (chkt < 0) {
isWList =
true; chkt = -chkt;}
484 if (blfn)
blFN = strdup(blfn);
485 else if (!(cfn = getenv(
"XRDCONFIGFN")))
return;
486 else {
char pBuff[2048], *Slash;
488 if (!(Slash = rindex(pBuff,
'/')))
return;
489 strcpy(Slash+1, (
isWList ?
"cms.whitelist" :
"cms.blacklist"));
490 blFN = strdup(pBuff);
516 char *rBuff,
int rBLen)
524 if (!hName || !
blSched)
return 0;
528 if (bList) doUnLk =
false;
543 hLen = strlen(hName);
545 {Hdr.
info = bList->dval;
547 {
if (!strcmp(hName, bList->
text))
break;}
548 else if (hLen >= Hdr.
v.totLen)
550 || !strncmp(bList->
text, hName, Hdr.
v.pfxLen))
552 || !strncmp(bList->
text+Hdr.
v.pfxLen+1,
553 hName + (hLen - Hdr.
v.sfxLen),
554 Hdr.
v.sfxLen))
break;
566 {retval = rP->sval[1];
567 if (!rBuff || retval > rBLen) retval = -retval;
568 else {memcpy(rBuff, &(rP->sval[2]),
sizeof(
short));
569 memcpy(rBuff+
sizeof(
short), rP->
text, rP->sval[0]);
573 }
else retval = (
isWList ? -1 : 0);
589 const char *bwTag = (
isWList ?
"Whitelisting " :
"Blacklisting ");
599 {Hdr.
info = tP->dval;
int stat(const char *path, struct stat *buf)
int open(const char *path, int oflag,...)
void Add(XrdOucTList *tP)
XrdOucTList ** Array(int &anum)
bool Include(const char *item, int &i)
void DoIt()
Time driven method for checking black list file.
static int Present(const char *hName, XrdOucTList *bList=0, char *rbuff=0, int rblen=0)
static void Init(XrdScheduler *sP, XrdCmsCluster *cP, const char *blfn, int chkt=600)
virtual void BlackList(XrdOucTList *blP)
static bool ParseMan(XrdSysError *eDest, XrdOucTList **oldMans, char *hSpec, char *hPort, int *sPort=0, bool hush=false)
void Ring()
This method gets called at midnight.
static const int noPort
Do not add port number.
int Format(char *bAddr, int bLen, fmtUse fmtType=fmtAuto, int fmtOpts=0)
@ fmtName
Hostname if it is resolvable o/w use fmtAddr.
const char * Set(const char *hSpec, int pNum=PortInSpec)
void Schedule(XrdJob *jp)
int Emsg(const char *esfx, int ecode, const char *text1, const char *text2=0)
void Say(const char *text1, const char *text2=0, const char *txt3=0, const char *text4=0, const char *text5=0, const char *txt6=0)
XrdSysLogger * logger(XrdSysLogger *lp=0)
void AtMidnight(Task *mnTask)
XrdCmsBlackList BlackList
XrdCmsCluster * blCluster