38 #include <sys/param.h>
39 #include <sys/types.h>
53 #define eMsg(x) std::cerr <<XrdpgmName <<": " <<x << std::endl
86 int main(
int argc,
char **argv)
94 extern time_t
getXDate(
const char *cDate);
95 extern void Usage(
int rc,
const char *opn=0,
const char *opv=0);
98 enum What2Do {doAdd, doInst, doDel, doList};
100 const char *validOpts =
"dg:h:k:l:n:s:u:x:";
102 What2Do doIt = doList;
106 XrdpgmName = ((sp = rindex(argv[0],
'/')) ? sp+1 : argv[0]);
111 if (argc > 1 &&
'-' == *argv[1])
112 while ((c = getopt(argc,argv,validOpts))
113 && ((
unsigned char)c != 0xff))
116 case 'd': Opt.
Debug = 1;
118 case 'g': Opt.
KeyGrup = optarg;
120 case 'h':
if ((Opt.
Keep = atoi(optarg)) <= 0)
Usage(1,
"-s", optarg);
122 case 'k': Opt.
KeyName = optarg;
124 case 'l':
if ((Opt.
KeyLen = atoi(optarg)) <= 0
126 Usage(1,
"-l", optarg);
128 case 'n':
if ((Opt.
KeyNum = atoi(optarg)) <= 0)
Usage(1,
"-n", optarg);
130 case 's':
if ((
int)strlen(optarg) > 1 || !index(
"cgknux", *optarg))
131 Usage(1,
"-s", optarg);
134 case 'u': Opt.
KeyUser = optarg;
137 || Opt.
Expdt < (time(0)+60))
Usage(1,
"-x", optarg);
140 else {
eMsg(
"Invalid option '" <<argv[
optind-1] <<
"'");
152 if (!strcmp(argv[
optind],
"add")) doIt = doAdd;
153 else if (!strcmp(argv[
optind],
"install")) doIt = doInst;
154 else if (!strcmp(argv[
optind],
"del")) doIt = doDel;
155 else if (!strcmp(argv[
optind],
"list")) doIt = doList;
195 default: rc = 16;
eMsg(
"Internal processing error!");
216 if (!index(cDate,
'/'))
217 {theVal = strtol(cDate, &eP, 10);
218 if (errno || *eP)
return -1;
220 return static_cast<time_t
>(theVal);
225 eP = strptime(cDate,
"%D", &myTM);
227 return mktime(&myTM);
234 int isNo(
int dflt,
const char *Msg1,
const char *Msg2,
const char *Msg3)
238 std::cerr <<
XrdpgmName <<
": " <<Msg1 <<Msg2 <<Msg3;
239 std::cin.getline(Answer,
sizeof(Answer));
240 if (!*Answer)
return dflt;
242 if (!strcmp(
"y",Answer) || !strcmp(
"ye",Answer) || !strcmp(
"yes",Answer))
251 void Usage(
int rc,
const char *opn,
const char *opv)
256 {
if (opv)
eMsg(
"Invalid " <<opn <<
" argument - " <<opv);
257 else eMsg(opn <<
" argument not specified.");
260 std::cerr <<
"\nUsage: " <<
XrdpgmName <<
" [options] action\n";
261 std::cerr <<
"\nOptions: [-d] [-g grpname] [-h hold] [-k keyname] [-l keylen] [-n keynum]";
262 std::cerr <<
"\n [-s {c|g|k|n|u|x}] [-u usrname] [-x {days | mm/dd/yy}]" <<std::endl;
263 std::cerr <<
"\nActions: {add | del | install | list} [keyfn]" <<std::endl;
275 int retc, numKeys, numTot, numExp;
281 {
if (retc != ENOENT ||
isNo(0,
"Keyfile '", Opt.
KeyFile,
282 "' does not exist. Create it? (y | n): "))
return 4;
304 eMsg(numKeys <<(numKeys == 1 ?
" key":
" keys") <<
" out of "
305 <<numTot <<
" kept (" <<numExp <<
" expired).");
321 int retc, numKeys, numTot, numExp, numDel;
328 {
eMsg(
"Keyfile '" <<Opt.
KeyFile <<
"' does not exist.");}
342 {
eMsg(
"No matching key(s) found.");
349 {
if (
isNo(1,
"No keys will remain in ", Opt.
KeyFile,
350 ". Delete file? (n | y): "))
351 {
eMsg(
"No keys deleted!");
return 2;}
362 eMsg(numKeys <<(numKeys == 1 ?
" key":
" keys") <<
" out of "
363 <<(numTot+numDel) <<
" kept (" <<numExp <<
" expired).");
381 int retc, numKeys = 0, numTot, numExp;
398 {
eMsg(
"No keys named " <<Opt.
KeyName <<
" found to install.");
410 eMsg(numKeys <<(numKeys == 1 ?
" key":
" keys") <<
" out of "
411 <<numTot <<
" installed (" <<numExp <<
" expired).");
446 case 'n':
return (ktX->
Data.
ID & 0x7fffffff) < (ktS->
Data.
ID & 0x7fffffff);
452 if ((n = strcmp(sf1, sf2)))
return n < 0;
453 return (ktX->
Data.
ID & 0x7fffffff) < (ktS->
Data.
ID & 0x7fffffff);
462 static const char Hdr1[] =
463 " Number Len Date/Time Created Expires Keyname User & Group\n";
465 static const char Hdr2[] =
466 " ------ --- --------- ------- -------- -------\n";
472 char crfmt[] =
"%D %T", exfmt[] =
"%D";
473 char buff[128], crbuff[64], exbuff[16];
481 {
eMsg(
"Keyfile '" <<Opt.
KeyFile <<
"' does not exist.");}
488 {ktSort = ktP; ktP = ktP->
Next; ktSort->
Next = 0;}
493 {ktS = ktSort; ktSP = 0; ktX = ktP; ktP = ktP->
Next; ktX->
Next = 0;
496 {
if (ktSP) {ktX->
Next = ktS; ktSP->
Next = ktX;}
497 else {ktX->
Next = ktSort; ktSort = ktX;}
500 ktSP = ktS; ktS = ktS->
Next;
502 if (!ktS) ktSP->
Next = ktX;
510 {
if (pHdr) {std::cout <<Hdr1 <<Hdr2; pHdr = 0;}
511 sprintf(buff,
"%11lld %3d ", (ktP->
Data.
ID & 0x7fffffff), ktP->
Data.
Len);
512 strftime(crbuff,
sizeof(crbuff), crfmt, localtime(&ktP->
Data.
Crt));
513 if (!ktP->
Data.
Exp) strcpy(exbuff,
"--------");
514 else strftime(exbuff,
sizeof(exbuff),exfmt,localtime(&ktP->
Data.
Exp));
515 std::cout <<buff <<crbuff <<
' ' <<exbuff <<
' ' <<ktP->
Data.
Name <<
' '
int unlink(const char *path)
int XrdSecsssAdmin_insKey(XrdsecsssAdmin_Opts &Opt)
int main(int argc, char **argv)
int XrdSecsssAdmin_Here(char sType, XrdSecsssKT::ktEnt *ktX, XrdSecsssKT::ktEnt *ktS)
int isNo(int dflt, const char *Msg1, const char *Msg2, const char *Msg3)
int XrdSecsssAdmin_isKey(XrdsecsssAdmin_Opts &Opt, XrdSecsssKT::ktEnt *ktP)
static const char * XrdpgmName
int XrdSecsssAdmin_lstKey(XrdsecsssAdmin_Opts &Opt)
int XrdSecsssAdmin_addKey(XrdsecsssAdmin_Opts &Opt)
time_t getXDate(const char *cDate)
int XrdSecsssAdmin_delKey(XrdsecsssAdmin_Opts &Opt)
void Usage(int rc, const char *opn, const char *opv)
const char * XrdSysE2T(int errcode)
struct XrdSecsssKT::ktEnt::ktData Data
void setPath(const char *Path)
int Rewrite(int Keep, int &numKeys, int &numTot, int &numExp)
void addKey(ktEnt &ktNew)
static time_t Midnight(time_t tnow=0)