12 #ifndef ROOT_XrdProofdProofServMgr 
   13 #define ROOT_XrdProofdProofServMgr 
   32 #  include <sys/types.h> 
   33 #  include <sys/socket.h> 
   34 #  include "XrdNet/XrdNetPeer.hh" 
   36 #  include "XrdNet/XrdNetAddr.hh" 
   38 #include "XrdOuc/XrdOucHash.hh" 
   39 #include "XrdOuc/XrdOucString.hh" 
   45 class XrdProtocol_Config;
 
   46 class XrdProofdManager;
 
   51 #define PSMCNTOK(t) (t >= 0 && t < PSMMAXCNTS) 
   54 typedef int (*XrdSecCredsSaver_t)(XrdSecCredentials *, 
const char *fn, 
const XrdProofUI &ui);
 
   58    XrdProofdProofServ *fPS;
 
   61    XrdOucString fLogFile;
 
   62    XrdOucString fSessionTag;
 
   63    XrdOucString fTopSessionTag;
 
   64    XrdOucString fSessionDir;
 
   69 class XpdClientSessions {
 
   71    XrdSysRecMutex   fMutex;
 
   72    XrdProofdClient *fClient;
 
   73    std::list<XrdProofdProofServ *> fProofServs;
 
   74    XpdClientSessions(XrdProofdClient *c = 0) : fClient(c) { }
 
   75    int operator==(
const XpdClientSessions c) { 
return (c.fClient == fClient) ? 1 : 0; }
 
   78 class XrdProofSessionInfo {
 
   88    XrdOucString   fUnixPath;
 
   91    XrdOucString   fLogFile;
 
   92    XrdOucString   fOrdinal;
 
   93    XrdOucString   fUserEnvs;
 
   94    XrdOucString   fROOTTag;
 
   95    XrdOucString   fAdminPath;
 
   98    XrdProofSessionInfo(XrdProofdClient *c, XrdProofdProofServ *s);
 
   99    XrdProofSessionInfo(
const char *file) { ReadFromFile(file); }
 
  101    void FillProofServ(XrdProofdProofServ &s, XrdROOTMgr *rmgr);
 
  102    int ReadFromFile(
const char *file);
 
  104    int SaveToFile(
const char *file);
 
  112    XrdOucString   fGroups;
 
  117    XpdEnv(
const char *n, 
const char *env, 
const char *usr = 0, 
const char *grp = 0,
 
  118           int smi = -1, 
int smx = -1, 
int vmi = -1, 
int vmx = -1) :
 
  119           fName(n), fEnv(env), fUsers(usr), fGroups(grp),
 
  120           fSvnMin(smi), fSvnMax(smx), fVerMin(vmi), fVerMax(vmx) { }
 
  121    void Reset(
const char *n, 
const char *env, 
const char *usr = 0, 
const char *grp = 0,
 
  122               int smi = -1, 
int smx = -1, 
int vmi = -1, 
int vmx = -1) {
 
  123               fName = n; fEnv = env; fUsers = usr; fGroups = grp;
 
  124               fSvnMin = smi; fSvnMax = smx; fVerMin = vmi; fVerMax = vmx; }
 
  125    int Matches(
const char *usr, 
const char *grp, 
int ver = -1);
 
  126    void Print(
const char *what);
 
  127    static int     ToVersCode(
int ver, 
bool hex = 0);
 
  130 class XrdProofdProofServMgr : 
public XrdProofdConfig {
 
  132    XrdProofdManager  *fMgr;
 
  133    XrdSysRecMutex     fMutex;
 
  134    XrdSysRecMutex     fRecoverMutex;
 
  135    XrdSysRecMutex     fEnvsMutex;    
 
  136    XrdSysSemWait      fForkSem;   
 
  137    XrdSysSemWait      fProcessSem;   
 
  138    XrdSysLogger      *fLogger;    
 
  140    XrdOucString       fProofPlugin;    
 
  141    std::list<XpdEnv>  fProofServEnvs;  
 
  142    std::list<XpdEnv>  fProofServRCs;   
 
  150    int                fTerminationTimeOut;
 
  153    int                fReconnectTimeOut;
 
  155    int                fRecoverDeadline;
 
  158    XrdOucString       fParentExecs;   
 
  160    int                fCounters[PSMMAXCNTS];  
 
  161    int                fCurrentSessions;       
 
  163    unsigned int       fSeqSessionN;   
 
  165    int                fNextSessionsCheck; 
 
  167    XrdOucString       fActiAdminPath; 
 
  168    XrdOucString       fTermAdminPath; 
 
  170    XrdOucHash<XrdProofdProofServ> fSessions; 
 
  171    std::list<XrdProofdProofServ *> fActiveSessions;     
 
  172    std::list<XpdClientSessions *> *fRecoverClients; 
 
  174    XrdSecCredsSaver_t fCredsSaver; 
 
  176    std::map<XrdProofdProtocol*,int> fDestroyTimes; 
 
  178    int                DoDirectiveProofServMgr(
char *, XrdOucStream *, 
bool);
 
  179    int                DoDirectivePutEnv(
char *, XrdOucStream *, 
bool);
 
  180    int                DoDirectivePutRc(
char *, XrdOucStream *, 
bool);
 
  181    int                DoDirectiveShutdown(
char *, XrdOucStream *, 
bool);
 
  182    void               ExtractEnv(
char *, XrdOucStream *,
 
  183                                  XrdOucString &users, XrdOucString &groups,
 
  184                                  XrdOucString &rcval, XrdOucString &rcnam,
 
  185                                  int &smi, 
int &smx, 
int &vmi, 
int &vmx, 
bool &hex);
 
  186    void               FillEnvList(std::list<XpdEnv> *el, 
const char *nam, 
const char *val,
 
  187                                   const char *usrs = 0, 
const char *grps = 0,
 
  188                                   int smi = -1, 
int smx = -1, 
int vmi = -1, 
int vmx = -1, 
bool hex = 0);
 
  189    unsigned int       GetSeqSessionN() { XrdSysMutexHelper mhp(fMutex); 
return ++fSeqSessionN; }
 
  191    int                CreateAdminPath(XrdProofdProofServ *xps,
 
  192                                       XrdProofdProtocol *p, 
int pid, XrdOucString &emsg);
 
  193    int                CreateSockPath(XrdProofdProofServ *xps, XrdProofdProtocol *p,
 
  194                                      unsigned int seq, XrdOucString &emsg);
 
  196    int                CreateProofServEnvFile(XrdProofdProtocol *p,
 
  197                                             void *input, 
const char *envfn, 
const char *rcfn);
 
  198    int                CreateProofServRootRc(XrdProofdProtocol *p,
 
  199                                             void *input, 
const char *rcfn);
 
  201    int                SetupProtocol(XrdNetPeer &peerpsrv,
 
  203    int                SetupProtocol(XrdNetAddr &netaddr,
 
  205                                     XrdProofdProofServ *xps, XrdOucString &e);
 
  206    void               ParseCreateBuffer(XrdProofdProtocol *p,  XrdProofdProofServ *xps,
 
  207                                         XrdOucString &tag, XrdOucString &ord,
 
  208                                         XrdOucString &cffile, XrdOucString &uenvs,
 
  210    XrdProofdProofServ *PrepareProofServ(XrdProofdProtocol *p,
 
  211                                         XrdProofdResponse *r, 
unsigned short &sid);
 
  212    int                PrepareSessionRecovering();
 
  213    int                ResolveSession(
const char *fpid);
 
  215    void               SendErrLog(
const char *errlog, XrdProofdResponse *r);
 
  218    int                AddSession(XrdProofdProtocol *p, XrdProofdProofServ *s);
 
  219    bool               IsSessionSocket(
const char *fpid);
 
  220    int                RmSession(
const char *fpid);
 
  221    int                TouchSession(
const char *fpid, 
const char *path = 0);
 
  222    int                VerifySession(
const char *fpid, 
int to = -1, 
const char *path = 0);
 
  224    void               ResolveKeywords(XrdOucString &s, ProofServEnv_t *in);
 
  225    int                SetUserOwnerships(XrdProofdProtocol *p, 
const char *ord, 
const char *stag);
 
  228    XrdProofdProofServMgr(XrdProofdManager *mgr, XrdProtocol_Config *pi, XrdSysError *e);
 
  229    virtual ~XrdProofdProofServMgr() { }
 
  231    enum PSMProtocol { kSessionRemoval = 0, kClientDisconnect = 1, kCleanSessions = 2, kProcessReq = 3, kChgSessionSt = 4} ;
 
  232    enum PSMCounters { kCreateCnt = 0, kCleanSessionsCnt = 1, kProcessCnt = 2} ;
 
  234    XrdSysRecMutex   *Mutex() { 
return &fMutex; }
 
  236    int               Config(
bool rcf = 0);
 
  237    int               DoDirective(XrdProofdDirective *d,
 
  238                                  char *val, XrdOucStream *cfg, 
bool rcf);
 
  239    void              RegisterDirectives();
 
  241    int               CheckFrequency()
 const { 
return fCheckFrequency; }
 
  242    int               InternalWait()
 const { 
return fInternalWait; }
 
  243    int               VerifyTimeOut()
 const { 
return fVerifyTimeOut; }
 
  245    inline int        NextSessionsCheck()
 
  246                         { XrdSysMutexHelper mhp(fMutex); 
return fNextSessionsCheck; }
 
  247    inline void       SetNextSessionsCheck(
int t)
 
  248                         { XrdSysMutexHelper mhp(fMutex); fNextSessionsCheck = t; }
 
  250    bool              IsReconnecting();
 
  251    bool              IsClientRecovering(
const char *usr, 
const char *grp, 
int &deadline);
 
  252    void              SetReconnectTime(
bool on = 1);
 
  254    bool              Alive(XrdProofdProtocol *p);
 
  256    int               Process(XrdProofdProtocol *p);
 
  257    XrdSysSemWait    *ProcessSem() { 
return &fProcessSem; }
 
  259    int               AcceptPeer(XrdProofdProofServ *xps, 
int to, XrdOucString &e);
 
  260    int               Attach(XrdProofdProtocol *p);
 
  261    int               Create(XrdProofdProtocol *p);
 
  262    int               Destroy(XrdProofdProtocol *p);
 
  263    int               Detach(XrdProofdProtocol *p);
 
  264    int               Recover(XpdClientSessions *cl);
 
  266    void              UpdateCounter(
int t, 
int n) { 
if (PSMCNTOK(t)) {
 
  267                                  XrdSysMutexHelper mhp(fMutex); fCounters[t] += n;
 
  268                                           if (fCounters[t] < 0) fCounters[t] = 0;} }
 
  269    int               CheckCounter(
int t) { 
int cnt = -1; 
if (PSMCNTOK(t)) {
 
  270                                  XrdSysMutexHelper mhp(fMutex); cnt = fCounters[t];}
 
  273    void              BroadcastClusterInfo();
 
  274    int               BroadcastPriorities();
 
  275    int               CurrentSessions(
bool recalculate = 0);
 
  276    void              DisconnectFromProofServ(
int pid);
 
  278    std::list<XrdProofdProofServ *> *ActiveSessions() { 
return &fActiveSessions; }
 
  279    XrdProofdProofServ *GetActiveSession(
int pid);
 
  281    int               CleanupProofServ(
bool all = 0, 
const char *usr = 0);
 
  283    void              FormFileNameInSessionDir(XrdProofdProtocol *p,
 
  284                                               XrdProofdProofServ *xps,
 
  285                                               const char *sessiondir,
 
  286                                               const char *extension,
 
  287                                               XrdOucString &outfn);
 
  289    void              GetTagDirs(
int opt, XrdProofdProtocol *p, XrdProofdProofServ *xps,
 
  290                                 XrdOucString &sesstag, XrdOucString &topsesstag,
 
  291                                 XrdOucString &sessiondir, XrdOucString &sesswrkdir);
 
  293    int               SetProofServEnv(XrdProofdProtocol *p, 
void *in);
 
  294    int               SetProofServEnvOld(XrdProofdProtocol *p, 
void *in);
 
  295    int               SetUserEnvironment(XrdProofdProtocol *p);
 
  297    static int        SetProofServEnv(XrdProofdManager *m, XrdROOT *r);
 
  299    inline XrdProofdPipe *Pipe() { 
return &fPipe; }
 
  302    int               DeleteFromSessions(
const char *pid);
 
  303    int               MvSession(
const char *fpid);
 
  304    int               CheckActiveSessions(
bool verify = 1);
 
  305    int               CheckTerminatedSessions();
 
  306    int               CleanClientSessions(
const char *usr, 
int srvtype);
 
  307    int               CleanupLostProofServ();
 
  308    int               RecoverActiveSessions();
 
  311 class XpdSrvMgrCreateCnt {
 
  314    XrdProofdProofServMgr *fMgr;
 
  315    XpdSrvMgrCreateCnt(XrdProofdProofServMgr *m, 
int t) : fType(t), fMgr(m)
 
  316                                         { 
if (m && PSMCNTOK(t)) m->UpdateCounter(t,1); }
 
  317    ~XpdSrvMgrCreateCnt() { 
if (fMgr && PSMCNTOK(fType)) fMgr->UpdateCounter(fType,-1); }
 
  320 class XpdSrvMgrCreateGuard {
 
  323    XpdSrvMgrCreateGuard(
int *c = 0) { Set(c); }
 
  324    ~XpdSrvMgrCreateGuard() { 
if (fCnt) (*fCnt)--; }
 
  325    void Set(
int *c) { fCnt = c; 
if (fCnt) (*fCnt)++;}