35 #include <netinet/in.h>
36 #include <sys/types.h>
57 XrdXrootdAdmin::JobTable *XrdXrootdAdmin::JobList = 0;
81 JobTable *jTabp =
new JobTable();
83 jTabp->Jname = strdup(jname);
85 jTabp->Next = JobList;
95 const char *epname =
"Init";
101 {eDest->
Emsg(epname, errno,
"start admin");
113 const char *epname =
"Admin";
124 {eDest->
Emsg(epname,
"No admin login specified");
132 || strcmp(
"login", tp)
134 {eDest->
Emsg(epname,
"Invalid admin login sequence");
140 eDest->
Emsg(epname,
"Admin", TraceID,
"logged in");
150 const char *epname =
"Start";
156 while(1)
if ((InSock = AdminSock->
Accept()) >= 0)
158 {eDest->
Emsg(epname, errno,
"start admin");
161 }
else eDest->
Emsg(epname, errno,
"accept connection");
172 int XrdXrootdAdmin::do_Cj()
174 const char *fmt1 =
"<resp id=\"%s\"><rc>0</rc>";
175 const char *fmt2 =
"<num>%d</num></resp>\n";
176 char *tp, buff[1024];
184 {sendErr(8,
"cj",
"job type not specified.");
191 while(jTabp && strcmp(tp, jTabp->Jname)) jTabp = jTabp->Next;
195 if (jTabp) jobp = jTabp->Job;
196 else if (!strcmp(tp,
"*")) jobp = 0;
197 else {sendErr(8,
"cj",
"invalid job type specified.");
207 i = sprintf(buff, fmt1, reqID);
208 if (Stream.
Put(buff, i))
return -1;
212 if (jobp) rc = jobp->
Cancel(tp);
213 else {jTabp = JobList; rc = 0;
214 while(jTabp) {rc += jTabp->Job->Cancel(tp); jTabp = jTabp->Next;}
219 i = sprintf(buff, fmt2, rc);
220 return Stream.
Put(buff, i);
227 int XrdXrootdAdmin::do_Login()
231 char *tp, buff[1024];
237 {eDest->
Emsg(
"do_Login",
"login name not specified");
239 }
else strlcpy(TraceID, tp,
sizeof(TraceID));
243 blen = snprintf(buff,
sizeof(buff)-1, fmt, reqID);
244 buff[
sizeof(buff)-1] =
'\0';
245 return Stream.
Put(buff, blen);
252 int XrdXrootdAdmin::do_Lsc()
254 const char *fmt1 =
"<resp id=\"%s\"><rc>0</rc><conn>";
255 const char *fmt2 =
"</conn></resp>\n";
256 static int fmt2len = strlen(fmt2);
258 const char *mdat[3] = {buff,
" ", 0};
259 int mlen[3] = {0, 1, 0};
260 int i, rc, curr = -1;
264 if ((rc = getTarget(
"lsc")))
return 0;
268 i = sprintf(buff, fmt1, reqID);
269 if (Stream.
Put(buff, i))
return -1;
274 if (Stream.
Put(mdat, mlen))
return -1;
275 return Stream.
Put(fmt2, fmt2len);
282 int XrdXrootdAdmin::do_Lsd()
284 const char *fmt1 =
"<resp id=\"%s\"><rc>0</rc>";
285 const char *fmt2 =
"<c r=\"%c\" t=\"%lld\" v=\"%d\" m=\"%s\">";
286 const char *fmt2a=
"<io u=\"%d\"><nf>%d</nf><p>%lld<n>%d</n></p>"
287 "<i>%lld<n>%d</n></i><o>%lld<n>%d</n></o>"
288 "<s>%d</s><t>%d</t></io>";
289 const char *fmt3 =
"<auth p=\"%s\"><n>";
290 const char *fmt3e=
"</r></auth>";
291 const char *fmt4 =
"</resp>\n";
292 static int fmt3elen= strlen(fmt3e);
293 static int fmt4len = strlen(fmt4);
294 char ctyp, monit[3], *mm, cname[1024], buff[100];
296 const char *mdat[24]= {buff, cname, iobuff};
298 long long conn, inBytes, outBytes;
299 int i, rc, cver, inuse, stalls, tardies, curr = -1;
306 if ((rc = getTarget(
"lsd")))
return 0;
310 i = sprintf(buff, fmt1, reqID);
311 if (Stream.
Put(buff, i))
return -1;
320 conn =
static_cast<long long>(lp->
timeCon());
325 inuse = lp->
getIOStats(inBytes, outBytes, stalls, tardies);
326 mlen[0] = sprintf(buff, fmt2, ctyp, conn, cver, monit);
327 mlen[1] = lp->
Client(cname,
sizeof(cname));
340 mlen[i++]= sprintf(abuff, fmt3, aprot);
344 mdat[i] =
"</n><h>"; mlen[i++] = 7;
347 mdat[i] =
"</h><o>"; mlen[i++] = 7;
350 mdat[i] =
"</o><r>"; mlen[i++] = 7;
353 mdat[i] = fmt3e; mlen[i++] = fmt3elen;
355 mdat[i] =
"</c>"; mlen[i++] = 4;
356 mdat[i] = 0; mlen[i] = 0;
357 if (Stream.
Put(mdat, mlen)) {lp->
setRef(-1);
return -1;}
359 return Stream.
Put(fmt4, fmt4len);
366 int XrdXrootdAdmin::do_Lsj()
368 const char *fmt1 =
"<resp id=\"%s\"><rc>0</rc>";
369 const char *fmt2 =
"</resp>\n";
370 static int fmt2len = strlen(fmt2);
371 char *tp, buff[1024];
379 {sendErr(8,
"lsj",
"job type not specified.");
386 while(jTabp && strcmp(tp, jTabp->Jname)) jTabp = jTabp->Next;
390 if (jTabp) jobp = jTabp->Job;
391 else if (!strcmp(tp,
"*")) jobp = 0;
392 else {sendErr(8,
"lsj",
"invalid job type specified.");
398 i = sprintf(buff, fmt1, reqID);
399 if (Stream.
Put(buff, i))
return -1;
403 if (jobp) rc = do_Lsj_Xeq(jobp);
404 else {jTabp = JobList;
405 while(jTabp && !(rc = do_Lsj_Xeq(jTabp->Job))) jTabp = jTabp->Next;
410 return (rc ? rc : Stream.
Put(fmt2, fmt2len));
422 if ((tp = jp->
List()))
423 while(tp && !(rc = Stream.
Put(tp->
text, tp->val)))
424 {tpprev = tp; tp = tp->
next;
delete tpprev;}
426 while(tp) {tpprev = tp; tp = tp->
next;
delete tpprev;}
435 int XrdXrootdAdmin::do_Msg()
442 if ((rc = getTarget(
"msg", &msg)))
return 0;
446 msg = getMsg(msg, mlen);
449 if (msg)
return sendResp(
"msg",
kXR_asyncms, msg, mlen);
457 char *XrdXrootdAdmin::getMsg(
char *msg,
int &mlen)
459 if (msg)
while(*msg ==
' ') msg++;
460 if (msg && *msg) mlen = strlen(msg)+1;
461 else {msg = 0; mlen = 0;}
469 int XrdXrootdAdmin::getreqID()
474 {reqID[0] =
'?'; reqID[1] =
'\0';
475 return sendErr(4,
"request",
"id not specified.");
478 if (strlen(tp) >=
sizeof(reqID))
479 {reqID[0] =
'?'; reqID[1] =
'\0';
480 return sendErr(4,
"request",
"id too long.");
492 int XrdXrootdAdmin::getTarget(
const char *act,
char **rest)
499 {sendErr(8, act,
"target not specified.");
511 int XrdXrootdAdmin::sendErr(
int rc,
const char *act,
const char *msg)
513 const char *fmt =
"<resp id=\"%s\"><rc>%d</rc><msg>%s %s</msg></resp>\n";
517 blen = snprintf(buff,
sizeof(buff)-1, fmt, reqID, rc, act, msg);
518 buff[
sizeof(buff)-1] =
'\0';
520 return Stream.
Put(buff, blen);
527 int XrdXrootdAdmin::sendOK(
int sent)
529 const char *fmt =
"<resp id=\"%s\"><rc>0</rc><num>%d</num></resp>\n";
533 blen = snprintf(buff,
sizeof(buff)-1, fmt, reqID, sent);
534 buff[
sizeof(buff)-1] =
'\0';
536 return Stream.
Put(buff, blen);
543 int XrdXrootdAdmin::sendResp(
const char *act,
XActionCode anum)
547 int numsent = 0, curr = -1;
551 usResp.act = htonl(anum);
557 {
TRACE(RSP,
"sending " <<lp->
ID <<
' ' <<act);
558 if (lp->
Send((
const char *)&usResp,
sizeof(usResp))>0) numsent++;
563 return sendOK(numsent);
568 int XrdXrootdAdmin::sendResp(
const char *act,
XActionCode anum,
569 const char *msg,
int msgl)
573 int numsent = 0, curr = -1, bytes =
sizeof(usResp)+msgl;
577 usResp.act = htonl(anum);
578 usResp.len = htonl(msgl+4);
582 iov[0].iov_base = (caddr_t)&usResp;
583 iov[0].iov_len =
sizeof(usResp);
584 iov[1].iov_base = (caddr_t)msg;
585 iov[1].iov_len = msgl;
590 {
TRACE(RSP,
"sending " <<lp->ID <<
' ' <<act <<
' ' <<msg);
591 if (lp->Send(
iov, 2, bytes)>0) numsent++;
596 return sendOK(numsent);
603 void XrdXrootdAdmin::Xeq()
605 const char *epname =
"Xeq";
613 while((request = Stream.
GetLine()) && !rc)
614 {
TRACE(
DEBUG,
"received admin request: '" <<request <<
"'");
615 if ((rc = getreqID()))
continue;
617 {
if (!strcmp(
"cj", tp)) rc = do_Cj();
618 else if (!strcmp(
"lsc", tp)) rc = do_Lsc();
619 else if (!strcmp(
"lsd", tp)) rc = do_Lsd();
620 else if (!strcmp(
"lsj", tp)) rc = do_Lsj();
621 else if (!strcmp(
"msg", tp)) rc = do_Msg();
622 else {
eDest->
Emsg(epname,
"invalid admin request,", tp);
623 rc = sendErr(4, tp,
"is an invalid request.");
630 eDest->
Emsg(
"Admin",
"Admin", TraceID,
"logged out");
#define kXR_PROTOCOLVSTRING
static XrdSysError eDest(0,"crypto_")
#define XrdSecPROTOIDSIZE
void * XrdXrootdLoginAdmin(void *carg)
XrdSysTrace XrdXrootdTrace
void * XrdXrootdInitAdmin(void *carg)
void * Start(XrdNetSocket *AdminSock)
void Set(const char *target)
static XrdLink * Find(int &curr, XrdLinkMatch *who=0)
static int getName(int &curr, char *bname, int blen, XrdLinkMatch *who=0)
time_t timeCon() const
Return the time the link was made active (i.e. time of connection).
char * ID
Pointer to the client's link identity.
int Send(const char *buff, int blen)
int getIOStats(long long &inbytes, long long &outbytes, int &numstall, int &numtardy)
XrdProtocol * getProtocol()
Obtain current protocol object pointer.
int Client(char *buff, int blen)
int AttachIO(int infd, int outfd, int bsz=2047)
int Put(const char *data, const int dlen)
void SetEroute(XrdSysError *eroute)
char * GetToken(int lowcase=0)
char * vorg
Entity's virtual organization(s)
char prot[XrdSecPROTOIDSIZE]
Auth protocol used (e.g. krb5)
char * name
Entity's name.
char * role
Entity's role(s)
char * host
Entity's host name dnr dependent.
int Emsg(const char *esfx, int ecode, const char *text1, const char *text2=0)
static int Run(pthread_t *, void *(*proc)(void *), void *arg, int opts=0, const char *desc=0)
static int Init(XrdSysError *erp, XrdNetSocket *asock)
void * Start(XrdNetSocket *AdminSock)
static void addJob(const char *jname, XrdXrootdJob *jp)
int Cancel(const char *jkey=0, XrdXrootdResponse *resp=0)
XrdXrootdMonitor::User Monitor