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)++;}