2 * Copyright 2000, International Business Machines Corporation and others.
5 * This software has been released under the terms of the IBM Public
6 * License. For details, see the LICENSE file in the top-level source
7 * directory or online at http://www.openafs.org/dl/license10.html
14 #include <afsconfig.h>
15 #include <afs/param.h>
20 #include "TaAfsAdmSvrInternal.h"
24 * VARIABLES __________________________________________________________________
31 DWORD timeLastRefresh;
32 DWORD cminRefreshRate;
34 } REFRESHTHREAD, *LPREFRESHTHREAD;
38 REFRESHTHREAD *aRefreshThreads;
39 size_t cRefreshThreads;
40 CRITICAL_SECTION *pcsRefreshThreads;
45 * AUTO-REFRESH _______________________________________________________________
49 DWORD WINAPI AfsAdmSvr_AutoRefreshThread (PVOID lp)
51 ASID idCell = (ASID)lp;
54 EnterCriticalSection (l.pcsRefreshThreads);
57 DWORD cminRefreshRate;
58 DWORD timeLastRefresh;
59 for (size_t iThread = 0; (!fFound) && (iThread < l.cRefreshThreads); ++iThread)
61 LPREFRESHTHREAD pThread = &l.aRefreshThreads[ iThread ];
62 if (pThread->idCell == idCell)
65 cminRefreshRate = pThread->cminRefreshRate;
66 timeLastRefresh = pThread->timeLastRefresh;
70 LeaveCriticalSection (l.pcsRefreshThreads);
75 DWORD timeNextRefresh = timeLastRefresh + cminRefreshRate;
76 if ((cminRefreshRate) && ((!timeLastRefresh) || (AfsAdmSvr_GetCurrentTime() >= timeNextRefresh)))
78 Print (dlDETAIL, TEXT("Auto-refresh: %lu minutes elapsed; refreshing cell 0x%08lX"), cminRefreshRate, idCell);
81 if ((lpCell = ((LPIDENT)idCell)->OpenCell()) != NULL)
86 if (!lpCell->RefreshAll (&status))
87 Print (dlERROR, TEXT("Auto-refresh: RefreshCell failed; error 0x%08lX"), status);
89 Print (dlSTANDARD, TEXT("Auto-refresh of cell 0x%08lX successful"), idCell);
94 Sleep (60L * 1000L); // sleep for one minute
101 void AfsAdmSvr_PrepCellRefresh (void)
103 if (!l.pcsRefreshThreads)
105 l.pcsRefreshThreads = New (CRITICAL_SECTION);
106 InitializeCriticalSection (l.pcsRefreshThreads);
111 void AfsAdmSvr_SetCellRefreshRate (ASID idCell, ULONG cminRefreshRate)
113 AfsAdmSvr_PrepCellRefresh();
114 EnterCriticalSection (l.pcsRefreshThreads);
117 for (iThread = 0; iThread < l.cRefreshThreads; ++iThread)
119 LPREFRESHTHREAD pThread = &l.aRefreshThreads[ iThread ];
120 if (pThread->idCell == idCell)
122 pThread->cminRefreshRate = cminRefreshRate;
126 if (iThread == l.cRefreshThreads)
128 for (iThread = 0; iThread < l.cRefreshThreads; ++iThread)
130 LPREFRESHTHREAD pThread = &l.aRefreshThreads[ iThread ];
131 if (pThread->idCell == 0)
134 if (REALLOC (l.aRefreshThreads, l.cRefreshThreads, 1+iThread, 1))
138 LPREFRESHTHREAD pThread = &l.aRefreshThreads[ iThread ];
139 pThread->idCell = idCell;
140 pThread->timeLastRefresh = AfsAdmSvr_GetCurrentTime();
141 pThread->cminRefreshRate = cminRefreshRate;
142 pThread->hThread = CreateThread (NULL, 0, (LPTHREAD_START_ROUTINE)AfsAdmSvr_AutoRefreshThread, (LPVOID)idCell, 0, &idThread);
146 LeaveCriticalSection (l.pcsRefreshThreads);
150 void AfsAdmSvr_StopCellRefreshThread (ASID idCell)
152 AfsAdmSvr_PrepCellRefresh();
153 EnterCriticalSection (l.pcsRefreshThreads);
155 for (size_t iThread = 0; iThread < l.cRefreshThreads; ++iThread)
157 LPREFRESHTHREAD pThread = &l.aRefreshThreads[ iThread ];
158 if (pThread->idCell == idCell)
162 LeaveCriticalSection (l.pcsRefreshThreads);
166 void AfsAdmSvr_MarkRefreshThread (ASID idCell)
168 AfsAdmSvr_PrepCellRefresh();
169 EnterCriticalSection (l.pcsRefreshThreads);
171 for (size_t iThread = 0; iThread < l.cRefreshThreads; ++iThread)
173 LPREFRESHTHREAD pThread = &l.aRefreshThreads[ iThread ];
174 if (pThread->idCell == idCell)
175 pThread->timeLastRefresh = AfsAdmSvr_GetCurrentTime();
178 LeaveCriticalSection (l.pcsRefreshThreads);
183 * OBJECT PROPERTIES __________________________________________________________
187 void AfsAdmSvr_ObtainRudimentaryProperties (LPASOBJPROP pProperties)
189 LPIDENT lpi = (LPIDENT)(pProperties->idObject);
191 switch (GetAsidType (pProperties->idObject))
194 pProperties->Type = TYPE_CELL;
195 lpi->GetCellName (pProperties->szName);
199 pProperties->Type = TYPE_SERVER;
200 pProperties->idParentCell = (ASID)( lpi->GetCell() );
201 lpi->GetServerName (pProperties->szName);
205 pProperties->Type = TYPE_SERVICE;
206 pProperties->idParentCell = (ASID)( lpi->GetCell() );
207 pProperties->idParentServer = (ASID)( lpi->GetServer() );
208 lpi->GetServiceName (pProperties->szName);
212 pProperties->Type = TYPE_PARTITION;
213 pProperties->idParentCell = (ASID)( lpi->GetCell() );
214 pProperties->idParentServer = (ASID)( lpi->GetServer() );
215 lpi->GetAggregateName (pProperties->szName);
219 pProperties->Type = TYPE_VOLUME;
220 pProperties->idParentCell = (ASID)( lpi->GetCell() );
221 pProperties->idParentServer = (ASID)( lpi->GetServer() );
222 pProperties->idParentPartition = (ASID)( lpi->GetAggregate() );
223 lpi->GetFilesetName (pProperties->szName);
227 pProperties->Type = TYPE_USER;
228 pProperties->idParentCell = (ASID)( lpi->GetCell() );
229 lpi->GetUserName (pProperties->szName);
233 pProperties->Type = TYPE_GROUP;
234 pProperties->idParentCell = (ASID)( lpi->GetCell() );
235 lpi->GetGroupName (pProperties->szName);
239 pProperties->verProperties = verPROP_NO_OBJECT;
243 if (pProperties->verProperties == verPROP_NO_OBJECT)
244 pProperties->verProperties = verPROP_RUDIMENTARY;
248 BOOL AfsAdmSvr_ObtainFullProperties (LPASOBJPROP pProperties, ULONG *pStatus)
253 AfsAdmSvr_ObtainRudimentaryProperties (pProperties);
255 if (pProperties->verProperties != verPROP_NO_OBJECT)
257 LPIDENT lpi = (LPIDENT)(pProperties->idObject);
259 switch (GetAsidType (pProperties->idObject))
262 PTSPROPERTIES PtsProperties;
263 if ((rc = AfsClass_GetPtsProperties (lpi, &PtsProperties, &status)) == TRUE)
265 pProperties->u.CellProperties.idUserMax = (DWORD)PtsProperties.idUserMax;
266 pProperties->u.CellProperties.idGroupMax = (DWORD)PtsProperties.idGroupMax;
272 if ((lpServer = lpi->OpenServer (&status)) == NULL)
277 if (!lpServer->GetStatus (&ss, TRUE, &status))
281 pProperties->u.ServerProperties.nAddresses = 0;
282 for (size_t ii = 0; ii < ss.nAddresses; ++ii)
284 if (!ss.aAddresses[ii].sin_addr.s_addr)
286 if (pProperties->u.ServerProperties.nAddresses < ASOBJPROP_SERVER_MAXADDRESS)
288 pProperties->u.ServerProperties.aAddresses[ pProperties->u.ServerProperties.nAddresses ] = ntohl(ss.aAddresses[ii].sin_addr.s_addr);
289 pProperties->u.ServerProperties.nAddresses ++;
299 if ((lpService = lpi->OpenService (&status)) == NULL)
304 if (!lpService->GetStatus (&ss, TRUE, &status))
308 pProperties->u.ServiceProperties.ServiceType = ss.type;
309 pProperties->u.ServiceProperties.ServiceState = ss.state;
310 lstrcpy (pProperties->u.ServiceProperties.szAuxStatus, ss.szAuxStatus);
311 lstrcpy (pProperties->u.ServiceProperties.szParams, ss.szParams);
312 lstrcpy (pProperties->u.ServiceProperties.szNotifier, ss.szNotifier);
313 memcpy (&pProperties->u.ServiceProperties.timeLastStart, &ss.timeLastStart, sizeof(SYSTEMTIME));
314 memcpy (&pProperties->u.ServiceProperties.timeLastStop, &ss.timeLastStop, sizeof(SYSTEMTIME));
315 memcpy (&pProperties->u.ServiceProperties.timeLastFail, &ss.timeLastFail, sizeof(SYSTEMTIME));
316 pProperties->u.ServiceProperties.nStarts = ss.nStarts;
317 pProperties->u.ServiceProperties.dwErrLast = ss.dwErrLast;
318 pProperties->u.ServiceProperties.dwSigLast = ss.dwSigLast;
325 LPAGGREGATE lpAggregate;
326 if ((lpAggregate = lpi->OpenAggregate(&status)) == NULL)
331 if (!lpAggregate->GetStatus (&as, TRUE, &status))
335 pProperties->u.PartitionProperties.dwID = as.dwID;
336 pProperties->u.PartitionProperties.ckStorageTotal = as.ckStorageTotal;
337 pProperties->u.PartitionProperties.ckStorageFree = as.ckStorageFree;
338 pProperties->u.PartitionProperties.ckStorageAllocated = as.ckStorageAllocated;
340 lpAggregate->Close();
346 if ((lpFileset = lpi->OpenFileset(&status)) == NULL)
351 if (!lpFileset->GetStatus (&fs, TRUE, &status))
355 pProperties->u.VolumeProperties.id = fs.id;
356 pProperties->u.VolumeProperties.idReadWrite = fs.idReadWrite;
357 pProperties->u.VolumeProperties.idReplica = fs.idReplica;
358 pProperties->u.VolumeProperties.idClone = fs.idClone;
359 memcpy (&pProperties->u.VolumeProperties.timeCreation, &fs.timeCreation, sizeof(SYSTEMTIME));
360 memcpy (&pProperties->u.VolumeProperties.timeLastUpdate, &fs.timeLastUpdate, sizeof(SYSTEMTIME));
361 memcpy (&pProperties->u.VolumeProperties.timeLastAccess, &fs.timeLastAccess, sizeof(SYSTEMTIME));
362 memcpy (&pProperties->u.VolumeProperties.timeLastBackup, &fs.timeLastBackup, sizeof(SYSTEMTIME));
363 memcpy (&pProperties->u.VolumeProperties.timeCopyCreation, &fs.timeCopyCreation, sizeof(SYSTEMTIME));
364 pProperties->u.VolumeProperties.nFiles = fs.nFiles;
365 pProperties->u.VolumeProperties.ckQuota = (UINT_PTR)fs.ckQuota;
366 pProperties->u.VolumeProperties.ckUsed = (UINT_PTR)fs.ckUsed;
367 pProperties->u.VolumeProperties.FilesetType = fs.Type;
368 pProperties->u.VolumeProperties.FilesetState = fs.State;
376 if ((lpUser = lpi->OpenUser (&status)) == NULL)
381 if (!lpUser->GetStatus (&us, TRUE, &status))
385 lpUser->GetName (NULL, pProperties->u.UserProperties.szInstance);
387 if ((pProperties->u.UserProperties.fHaveKasInfo = us.fHaveKasInfo) == TRUE)
389 pProperties->u.UserProperties.KASINFO.fIsAdmin = us.KASINFO.fIsAdmin;
390 pProperties->u.UserProperties.KASINFO.fCanGetTickets = us.KASINFO.fCanGetTickets;
391 pProperties->u.UserProperties.KASINFO.fEncrypt = us.KASINFO.fEncrypt;
392 pProperties->u.UserProperties.KASINFO.fCanChangePassword = us.KASINFO.fCanChangePassword;
393 pProperties->u.UserProperties.KASINFO.fCanReusePasswords = us.KASINFO.fCanReusePasswords;
394 memcpy (&pProperties->u.UserProperties.KASINFO.timeExpires, &us.KASINFO.timeExpires, sizeof(SYSTEMTIME));
395 memcpy (&pProperties->u.UserProperties.KASINFO.timeLastPwChange, &us.KASINFO.timeLastPwChange, sizeof(SYSTEMTIME));
396 memcpy (&pProperties->u.UserProperties.KASINFO.timeLastMod, &us.KASINFO.timeLastMod, sizeof(SYSTEMTIME));
397 pProperties->u.UserProperties.KASINFO.szUserLastMod[0] = TEXT('\0');
398 pProperties->u.UserProperties.KASINFO.csecTicketLifetime = us.KASINFO.csecTicketLifetime;
399 pProperties->u.UserProperties.KASINFO.keyVersion = us.KASINFO.keyVersion;
400 memcpy (&pProperties->u.UserProperties.KASINFO.keyData, us.KASINFO.key.key, ENCRYPTIONKEYLENGTH);
401 pProperties->u.UserProperties.KASINFO.dwKeyChecksum = us.KASINFO.dwKeyChecksum;
402 pProperties->u.UserProperties.KASINFO.cdayPwExpire = us.KASINFO.cdayPwExpire;
403 pProperties->u.UserProperties.KASINFO.cFailLogin = us.KASINFO.cFailLogin;
404 pProperties->u.UserProperties.KASINFO.csecFailLoginLock = us.KASINFO.csecFailLoginLock;
405 if (us.KASINFO.lpiLastMod)
406 us.KASINFO.lpiLastMod->GetUserName (pProperties->u.UserProperties.KASINFO.szUserLastMod);
408 if ((pProperties->u.UserProperties.fHavePtsInfo = us.fHavePtsInfo) == TRUE)
410 pProperties->u.UserProperties.PTSINFO.cgroupCreationQuota = us.PTSINFO.cgroupCreationQuota;
411 pProperties->u.UserProperties.PTSINFO.cgroupMember = us.PTSINFO.cgroupMember;
412 pProperties->u.UserProperties.PTSINFO.uidName = us.PTSINFO.uidName;
413 pProperties->u.UserProperties.PTSINFO.uidOwner = us.PTSINFO.uidOwner;
414 pProperties->u.UserProperties.PTSINFO.uidCreator = us.PTSINFO.uidCreator;
415 lstrcpy (pProperties->u.UserProperties.PTSINFO.szOwner, us.PTSINFO.szOwner);
416 lstrcpy (pProperties->u.UserProperties.PTSINFO.szCreator, us.PTSINFO.szCreator);
417 pProperties->u.UserProperties.PTSINFO.aaListStatus = us.PTSINFO.aaListStatus;
418 pProperties->u.UserProperties.PTSINFO.aaGroupsOwned = us.PTSINFO.aaGroupsOwned;
419 pProperties->u.UserProperties.PTSINFO.aaMembership = us.PTSINFO.aaMembership;
427 lpi->GetGroupName (pProperties->szName);
430 if ((lpGroup = lpi->OpenGroup (&status)) == NULL)
435 if (!lpGroup->GetStatus (&gs, TRUE, &status))
439 pProperties->u.GroupProperties.nMembers = gs.nMembers;
440 pProperties->u.GroupProperties.uidName = gs.uidName;
441 pProperties->u.GroupProperties.uidOwner = gs.uidOwner;
442 pProperties->u.GroupProperties.uidCreator = gs.uidCreator;
443 pProperties->u.GroupProperties.aaListStatus = gs.aaListStatus;
444 pProperties->u.GroupProperties.aaListGroupsOwned = gs.aaListGroupsOwned;
445 pProperties->u.GroupProperties.aaListMembers = gs.aaListMembers;
446 pProperties->u.GroupProperties.aaAddMember = gs.aaAddMember;
447 pProperties->u.GroupProperties.aaDeleteMember = gs.aaDeleteMember;
448 lstrcpy (pProperties->u.GroupProperties.szOwner, gs.szOwner);
449 lstrcpy (pProperties->u.GroupProperties.szCreator, gs.szCreator);
457 if (rc && (pProperties->verProperties < verPROP_FIRST_SCAN))
458 pProperties->verProperties = verPROP_FIRST_SCAN;
461 pProperties->verProperties = verPROP_NO_OBJECT;
469 BOOL AfsAdmSvr_PropertiesDiffer (LPASOBJPROP pProp1, LPASOBJPROP pProp2)
471 if (pProp1->idObject != pProp2->idObject)
473 if (pProp1->Type != pProp2->Type)
475 if (pProp1->idParentCell != pProp2->idParentCell)
477 if (pProp1->idParentServer != pProp2->idParentServer)
479 if (pProp1->idParentPartition != pProp2->idParentPartition)
481 if (lstrcmp (pProp1->szName, pProp2->szName))
483 if (memcmp (&pProp1->u, &pProp2->u, sizeof(pProp1->u)))
490 void AfsAdmSvr_TestProperties (ASID idObject)
492 LPASOBJPROP pProperties;
493 if ((pProperties = (LPASOBJPROP)((LPIDENT)idObject)->GetUserParam()) == NULL)
496 if (pProperties->verProperties >= verPROP_FIRST_SCAN)
498 ASOBJPROP NewProperties;
499 memcpy (&NewProperties, pProperties, sizeof(ASOBJPROP));
500 memset (&NewProperties.u, 0x00, sizeof(NewProperties.u));
502 if (AfsAdmSvr_ObtainFullProperties (&NewProperties))
504 if (AfsAdmSvr_PropertiesDiffer (&NewProperties, pProperties))
506 LPIDENT lpi = (LPIDENT)(pProperties->idObject);
508 LPASOBJPROP pStoredProp;
509 if ((pStoredProp = (LPASOBJPROP)(lpi->GetUserParam())) != NULL)
511 pStoredProp->idParentCell = NewProperties.idParentCell;
512 pStoredProp->idParentServer = NewProperties.idParentServer;
513 pStoredProp->idParentPartition = NewProperties.idParentPartition;
514 lstrcpy (pStoredProp->szName, NewProperties.szName);
515 memcpy (&pStoredProp->u, &NewProperties.u, sizeof(NewProperties.u));
516 pStoredProp->verProperties ++;
524 BOOL CALLBACK AfsAdmSvr_NotifyCallback (NOTIFYEVENT evt, PNOTIFYPARAMS pParams)
530 if ((lpiCreate = pParams->lpi1) != NULL)
532 if ((lpiCreate->GetUserParam()) == NULL)
534 LPASOBJPROP pProperties = New (ASOBJPROP);
535 memset (pProperties, 0x00, sizeof(ASOBJPROP));
536 pProperties->idObject = (ASID)lpiCreate;
537 AfsAdmSvr_ObtainRudimentaryProperties (pProperties);
538 lpiCreate->SetUserParam(pProperties);
541 AfsAdmSvr_TestProperties ((ASID)lpiCreate);
546 if (GetAsidType ((ASID)pParams->lpi1) == itCELL)
547 AfsAdmSvr_StopCellRefreshThread ((ASID)(pParams->lpi1));
550 case evtRefreshAllBegin:
551 AfsAdmSvr_Action_StartRefresh ((ASID)(pParams->lpi1));
554 case evtRefreshAllEnd:
555 AfsAdmSvr_Action_StopRefresh ((ASID)(pParams->lpi1));
558 case evtRefreshStatusEnd:
559 AfsAdmSvr_TestProperties ((ASID)(pParams->lpi1));
567 LPASOBJPROP AfsAdmSvr_GetCurrentProperties (ASID idObject, ULONG *pStatus)
569 switch (GetAsidType (idObject))
573 if ((lpCell = ((LPIDENT)idObject)->OpenCell (pStatus)) == NULL)
580 if ((lpServer = ((LPIDENT)idObject)->OpenServer (pStatus)) == NULL)
587 if ((lpService = ((LPIDENT)idObject)->OpenService (pStatus)) == NULL)
593 LPAGGREGATE lpAggregate;
594 if ((lpAggregate = ((LPIDENT)idObject)->OpenAggregate (pStatus)) == NULL)
596 lpAggregate->Close();
601 if ((lpFileset = ((LPIDENT)idObject)->OpenFileset (pStatus)) == NULL)
608 if ((lpUser = ((LPIDENT)idObject)->OpenUser (pStatus)) == NULL)
615 if ((lpGroup = ((LPIDENT)idObject)->OpenGroup (pStatus)) == NULL)
621 return (LPASOBJPROP)NULL_(ERROR_INVALID_PARAMETER,pStatus);
624 LPASOBJPROP pCurrentProperties;
625 if ((pCurrentProperties = (LPASOBJPROP)((LPIDENT)idObject)->GetUserParam()) == NULL)
627 return (LPASOBJPROP)NULL_(ERROR_NOT_ENOUGH_MEMORY,pStatus);
630 return pCurrentProperties;
634 BOOL AfsAdmSvr_InvalidateObjectProperties (ASID idObject, ULONG *pStatus)
636 switch (GetAsidType (idObject))
640 if ((lpCell = ((LPIDENT)idObject)->OpenCell (pStatus)) == NULL)
642 lpCell->Invalidate();
648 if ((lpServer = ((LPIDENT)idObject)->OpenServer (pStatus)) == NULL)
650 lpServer->Invalidate();
656 if ((lpService = ((LPIDENT)idObject)->OpenService (pStatus)) == NULL)
658 lpService->Invalidate();
663 LPAGGREGATE lpAggregate;
664 if ((lpAggregate = ((LPIDENT)idObject)->OpenAggregate (pStatus)) == NULL)
666 lpAggregate->Invalidate();
667 lpAggregate->Close();
672 if ((lpFileset = ((LPIDENT)idObject)->OpenFileset (pStatus)) == NULL)
674 lpFileset->Invalidate();
680 if ((lpUser = ((LPIDENT)idObject)->OpenUser (pStatus)) == NULL)
682 lpUser->Invalidate();
688 if ((lpGroup = ((LPIDENT)idObject)->OpenGroup (pStatus)) == NULL)
690 lpGroup->Invalidate();
695 return FALSE_(ERROR_INVALID_PARAMETER,pStatus);