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
11 #include <afs/param.h>
15 #include "TaAfsAdmSvrInternal.h"
19 * VARIABLES __________________________________________________________________
26 DWORD timeLastRefresh;
27 DWORD cminRefreshRate;
29 } REFRESHTHREAD, *LPREFRESHTHREAD;
33 REFRESHTHREAD *aRefreshThreads;
34 size_t cRefreshThreads;
35 CRITICAL_SECTION *pcsRefreshThreads;
40 * AUTO-REFRESH _______________________________________________________________
44 DWORD WINAPI AfsAdmSvr_AutoRefreshThread (PVOID lp)
46 ASID idCell = (ASID)lp;
49 EnterCriticalSection (l.pcsRefreshThreads);
52 DWORD cminRefreshRate;
53 DWORD timeLastRefresh;
54 for (size_t iThread = 0; (!fFound) && (iThread < l.cRefreshThreads); ++iThread)
56 LPREFRESHTHREAD pThread = &l.aRefreshThreads[ iThread ];
57 if (pThread->idCell == idCell)
60 cminRefreshRate = pThread->cminRefreshRate;
61 timeLastRefresh = pThread->timeLastRefresh;
65 LeaveCriticalSection (l.pcsRefreshThreads);
70 DWORD timeNextRefresh = timeLastRefresh + cminRefreshRate;
71 if ((cminRefreshRate) && ((!timeLastRefresh) || (AfsAdmSvr_GetCurrentTime() >= timeNextRefresh)))
73 Print (dlDETAIL, TEXT("Auto-refresh: %lu minutes elapsed; refreshing cell 0x%08lX"), cminRefreshRate, idCell);
76 if ((lpCell = ((LPIDENT)idCell)->OpenCell()) != NULL)
81 if (!lpCell->RefreshAll (&status))
82 Print (dlERROR, TEXT("Auto-refresh: RefreshCell failed; error 0x%08lX"), status);
84 Print (dlSTANDARD, TEXT("Auto-refresh of cell 0x%08lX successful"), idCell);
89 Sleep (60L * 1000L); // sleep for one minute
96 void AfsAdmSvr_PrepCellRefresh (void)
98 if (!l.pcsRefreshThreads)
100 l.pcsRefreshThreads = New (CRITICAL_SECTION);
101 InitializeCriticalSection (l.pcsRefreshThreads);
106 void AfsAdmSvr_SetCellRefreshRate (ASID idCell, ULONG cminRefreshRate)
108 AfsAdmSvr_PrepCellRefresh();
109 EnterCriticalSection (l.pcsRefreshThreads);
111 for (size_t iThread = 0; iThread < l.cRefreshThreads; ++iThread)
113 LPREFRESHTHREAD pThread = &l.aRefreshThreads[ iThread ];
114 if (pThread->idCell == idCell)
116 pThread->cminRefreshRate = cminRefreshRate;
120 if (iThread == l.cRefreshThreads)
122 for (size_t iThread = 0; iThread < l.cRefreshThreads; ++iThread)
124 LPREFRESHTHREAD pThread = &l.aRefreshThreads[ iThread ];
125 if (pThread->idCell == 0)
128 if (REALLOC (l.aRefreshThreads, l.cRefreshThreads, 1+iThread, 1))
132 LPREFRESHTHREAD pThread = &l.aRefreshThreads[ iThread ];
133 pThread->idCell = idCell;
134 pThread->timeLastRefresh = AfsAdmSvr_GetCurrentTime();
135 pThread->cminRefreshRate = cminRefreshRate;
136 pThread->hThread = CreateThread (NULL, 0, (LPTHREAD_START_ROUTINE)AfsAdmSvr_AutoRefreshThread, (LPVOID)idCell, 0, &idThread);
140 LeaveCriticalSection (l.pcsRefreshThreads);
144 void AfsAdmSvr_StopCellRefreshThread (ASID idCell)
146 AfsAdmSvr_PrepCellRefresh();
147 EnterCriticalSection (l.pcsRefreshThreads);
149 for (size_t iThread = 0; iThread < l.cRefreshThreads; ++iThread)
151 LPREFRESHTHREAD pThread = &l.aRefreshThreads[ iThread ];
152 if (pThread->idCell == idCell)
156 LeaveCriticalSection (l.pcsRefreshThreads);
160 void AfsAdmSvr_MarkRefreshThread (ASID idCell)
162 AfsAdmSvr_PrepCellRefresh();
163 EnterCriticalSection (l.pcsRefreshThreads);
165 for (size_t iThread = 0; iThread < l.cRefreshThreads; ++iThread)
167 LPREFRESHTHREAD pThread = &l.aRefreshThreads[ iThread ];
168 if (pThread->idCell == idCell)
169 pThread->timeLastRefresh = AfsAdmSvr_GetCurrentTime();
172 LeaveCriticalSection (l.pcsRefreshThreads);
177 * OBJECT PROPERTIES __________________________________________________________
181 void AfsAdmSvr_ObtainRudimentaryProperties (LPASOBJPROP pProperties)
183 LPIDENT lpi = (LPIDENT)(pProperties->idObject);
185 switch (GetAsidType (pProperties->idObject))
188 pProperties->Type = TYPE_CELL;
189 lpi->GetCellName (pProperties->szName);
193 pProperties->Type = TYPE_SERVER;
194 pProperties->idParentCell = (ASID)( lpi->GetCell() );
195 lpi->GetServerName (pProperties->szName);
199 pProperties->Type = TYPE_SERVICE;
200 pProperties->idParentCell = (ASID)( lpi->GetCell() );
201 pProperties->idParentServer = (ASID)( lpi->GetServer() );
202 lpi->GetServiceName (pProperties->szName);
206 pProperties->Type = TYPE_PARTITION;
207 pProperties->idParentCell = (ASID)( lpi->GetCell() );
208 pProperties->idParentServer = (ASID)( lpi->GetServer() );
209 lpi->GetAggregateName (pProperties->szName);
213 pProperties->Type = TYPE_VOLUME;
214 pProperties->idParentCell = (ASID)( lpi->GetCell() );
215 pProperties->idParentServer = (ASID)( lpi->GetServer() );
216 pProperties->idParentPartition = (ASID)( lpi->GetAggregate() );
217 lpi->GetFilesetName (pProperties->szName);
221 pProperties->Type = TYPE_USER;
222 pProperties->idParentCell = (ASID)( lpi->GetCell() );
223 lpi->GetUserName (pProperties->szName);
227 pProperties->Type = TYPE_GROUP;
228 pProperties->idParentCell = (ASID)( lpi->GetCell() );
229 lpi->GetGroupName (pProperties->szName);
233 pProperties->verProperties = verPROP_NO_OBJECT;
237 if (pProperties->verProperties == verPROP_NO_OBJECT)
238 pProperties->verProperties = verPROP_RUDIMENTARY;
242 BOOL AfsAdmSvr_ObtainFullProperties (LPASOBJPROP pProperties, ULONG *pStatus)
247 AfsAdmSvr_ObtainRudimentaryProperties (pProperties);
249 if (pProperties->verProperties != verPROP_NO_OBJECT)
251 LPIDENT lpi = (LPIDENT)(pProperties->idObject);
253 switch (GetAsidType (pProperties->idObject))
256 PTSPROPERTIES PtsProperties;
257 if ((rc = AfsClass_GetPtsProperties (lpi, &PtsProperties, &status)) == TRUE)
259 pProperties->u.CellProperties.idUserMax = (DWORD)PtsProperties.idUserMax;
260 pProperties->u.CellProperties.idGroupMax = (DWORD)PtsProperties.idGroupMax;
266 if ((lpServer = lpi->OpenServer (&status)) == NULL)
271 if (!lpServer->GetStatus (&ss, TRUE, &status))
275 pProperties->u.ServerProperties.nAddresses = 0;
276 for (size_t ii = 0; ii < ss.nAddresses; ++ii)
278 if (!ss.aAddresses[ii].sin_addr.s_addr)
280 if (pProperties->u.ServerProperties.nAddresses < ASOBJPROP_SERVER_MAXADDRESS)
282 pProperties->u.ServerProperties.aAddresses[ pProperties->u.ServerProperties.nAddresses ] = ntohl(ss.aAddresses[ii].sin_addr.s_addr);
283 pProperties->u.ServerProperties.nAddresses ++;
293 if ((lpService = lpi->OpenService (&status)) == NULL)
298 if (!lpService->GetStatus (&ss, TRUE, &status))
302 pProperties->u.ServiceProperties.ServiceType = ss.type;
303 pProperties->u.ServiceProperties.ServiceState = ss.state;
304 lstrcpy (pProperties->u.ServiceProperties.szAuxStatus, ss.szAuxStatus);
305 lstrcpy (pProperties->u.ServiceProperties.szParams, ss.szParams);
306 lstrcpy (pProperties->u.ServiceProperties.szNotifier, ss.szNotifier);
307 memcpy (&pProperties->u.ServiceProperties.timeLastStart, &ss.timeLastStart, sizeof(SYSTEMTIME));
308 memcpy (&pProperties->u.ServiceProperties.timeLastStop, &ss.timeLastStop, sizeof(SYSTEMTIME));
309 memcpy (&pProperties->u.ServiceProperties.timeLastFail, &ss.timeLastFail, sizeof(SYSTEMTIME));
310 pProperties->u.ServiceProperties.nStarts = ss.nStarts;
311 pProperties->u.ServiceProperties.dwErrLast = ss.dwErrLast;
312 pProperties->u.ServiceProperties.dwSigLast = ss.dwSigLast;
319 LPAGGREGATE lpAggregate;
320 if ((lpAggregate = lpi->OpenAggregate(&status)) == NULL)
325 if (!lpAggregate->GetStatus (&as, TRUE, &status))
329 pProperties->u.PartitionProperties.dwID = as.dwID;
330 pProperties->u.PartitionProperties.ckStorageTotal = as.ckStorageTotal;
331 pProperties->u.PartitionProperties.ckStorageFree = as.ckStorageFree;
332 pProperties->u.PartitionProperties.ckStorageAllocated = as.ckStorageAllocated;
334 lpAggregate->Close();
340 if ((lpFileset = lpi->OpenFileset(&status)) == NULL)
345 if (!lpFileset->GetStatus (&fs, TRUE, &status))
349 pProperties->u.VolumeProperties.id = fs.id;
350 pProperties->u.VolumeProperties.idReadWrite = fs.idReadWrite;
351 pProperties->u.VolumeProperties.idReplica = fs.idReplica;
352 pProperties->u.VolumeProperties.idClone = fs.idClone;
353 memcpy (&pProperties->u.VolumeProperties.timeCreation, &fs.timeCreation, sizeof(SYSTEMTIME));
354 memcpy (&pProperties->u.VolumeProperties.timeLastUpdate, &fs.timeLastUpdate, sizeof(SYSTEMTIME));
355 memcpy (&pProperties->u.VolumeProperties.timeLastAccess, &fs.timeLastAccess, sizeof(SYSTEMTIME));
356 memcpy (&pProperties->u.VolumeProperties.timeLastBackup, &fs.timeLastBackup, sizeof(SYSTEMTIME));
357 memcpy (&pProperties->u.VolumeProperties.timeCopyCreation, &fs.timeCopyCreation, sizeof(SYSTEMTIME));
358 pProperties->u.VolumeProperties.nFiles = fs.nFiles;
359 pProperties->u.VolumeProperties.ckQuota = fs.ckQuota;
360 pProperties->u.VolumeProperties.ckUsed = fs.ckUsed;
361 pProperties->u.VolumeProperties.FilesetType = fs.Type;
362 pProperties->u.VolumeProperties.FilesetState = fs.State;
370 if ((lpUser = lpi->OpenUser (&status)) == NULL)
375 if (!lpUser->GetStatus (&us, TRUE, &status))
379 lpUser->GetName (NULL, pProperties->u.UserProperties.szInstance);
381 if ((pProperties->u.UserProperties.fHaveKasInfo = us.fHaveKasInfo) == TRUE)
383 pProperties->u.UserProperties.KASINFO.fIsAdmin = us.KASINFO.fIsAdmin;
384 pProperties->u.UserProperties.KASINFO.fCanGetTickets = us.KASINFO.fCanGetTickets;
385 pProperties->u.UserProperties.KASINFO.fEncrypt = us.KASINFO.fEncrypt;
386 pProperties->u.UserProperties.KASINFO.fCanChangePassword = us.KASINFO.fCanChangePassword;
387 pProperties->u.UserProperties.KASINFO.fCanReusePasswords = us.KASINFO.fCanReusePasswords;
388 memcpy (&pProperties->u.UserProperties.KASINFO.timeExpires, &us.KASINFO.timeExpires, sizeof(SYSTEMTIME));
389 memcpy (&pProperties->u.UserProperties.KASINFO.timeLastPwChange, &us.KASINFO.timeLastPwChange, sizeof(SYSTEMTIME));
390 memcpy (&pProperties->u.UserProperties.KASINFO.timeLastMod, &us.KASINFO.timeLastMod, sizeof(SYSTEMTIME));
391 pProperties->u.UserProperties.KASINFO.szUserLastMod[0] = TEXT('\0');
392 pProperties->u.UserProperties.KASINFO.csecTicketLifetime = us.KASINFO.csecTicketLifetime;
393 pProperties->u.UserProperties.KASINFO.keyVersion = us.KASINFO.keyVersion;
394 memcpy (&pProperties->u.UserProperties.KASINFO.keyData, us.KASINFO.key.key, ENCRYPTIONKEYLENGTH);
395 pProperties->u.UserProperties.KASINFO.dwKeyChecksum = us.KASINFO.dwKeyChecksum;
396 pProperties->u.UserProperties.KASINFO.cdayPwExpire = us.KASINFO.cdayPwExpire;
397 pProperties->u.UserProperties.KASINFO.cFailLogin = us.KASINFO.cFailLogin;
398 pProperties->u.UserProperties.KASINFO.csecFailLoginLock = us.KASINFO.csecFailLoginLock;
399 if (us.KASINFO.lpiLastMod)
400 us.KASINFO.lpiLastMod->GetUserName (pProperties->u.UserProperties.KASINFO.szUserLastMod);
402 if ((pProperties->u.UserProperties.fHavePtsInfo = us.fHavePtsInfo) == TRUE)
404 pProperties->u.UserProperties.PTSINFO.cgroupCreationQuota = us.PTSINFO.cgroupCreationQuota;
405 pProperties->u.UserProperties.PTSINFO.cgroupMember = us.PTSINFO.cgroupMember;
406 pProperties->u.UserProperties.PTSINFO.uidName = us.PTSINFO.uidName;
407 pProperties->u.UserProperties.PTSINFO.uidOwner = us.PTSINFO.uidOwner;
408 pProperties->u.UserProperties.PTSINFO.uidCreator = us.PTSINFO.uidCreator;
409 lstrcpy (pProperties->u.UserProperties.PTSINFO.szOwner, us.PTSINFO.szOwner);
410 lstrcpy (pProperties->u.UserProperties.PTSINFO.szCreator, us.PTSINFO.szCreator);
411 pProperties->u.UserProperties.PTSINFO.aaListStatus = us.PTSINFO.aaListStatus;
412 pProperties->u.UserProperties.PTSINFO.aaGroupsOwned = us.PTSINFO.aaGroupsOwned;
413 pProperties->u.UserProperties.PTSINFO.aaMembership = us.PTSINFO.aaMembership;
421 lpi->GetGroupName (pProperties->szName);
424 if ((lpGroup = lpi->OpenGroup (&status)) == NULL)
429 if (!lpGroup->GetStatus (&gs, TRUE, &status))
433 pProperties->u.GroupProperties.nMembers = gs.nMembers;
434 pProperties->u.GroupProperties.uidName = gs.uidName;
435 pProperties->u.GroupProperties.uidOwner = gs.uidOwner;
436 pProperties->u.GroupProperties.uidCreator = gs.uidCreator;
437 pProperties->u.GroupProperties.aaListStatus = gs.aaListStatus;
438 pProperties->u.GroupProperties.aaListGroupsOwned = gs.aaListGroupsOwned;
439 pProperties->u.GroupProperties.aaListMembers = gs.aaListMembers;
440 pProperties->u.GroupProperties.aaAddMember = gs.aaAddMember;
441 pProperties->u.GroupProperties.aaDeleteMember = gs.aaDeleteMember;
442 lstrcpy (pProperties->u.GroupProperties.szOwner, gs.szOwner);
443 lstrcpy (pProperties->u.GroupProperties.szCreator, gs.szCreator);
451 if (rc && (pProperties->verProperties < verPROP_FIRST_SCAN))
452 pProperties->verProperties = verPROP_FIRST_SCAN;
455 pProperties->verProperties = verPROP_NO_OBJECT;
463 BOOL AfsAdmSvr_PropertiesDiffer (LPASOBJPROP pProp1, LPASOBJPROP pProp2)
465 if (pProp1->idObject != pProp2->idObject)
467 if (pProp1->Type != pProp2->Type)
469 if (pProp1->idParentCell != pProp2->idParentCell)
471 if (pProp1->idParentServer != pProp2->idParentServer)
473 if (pProp1->idParentPartition != pProp2->idParentPartition)
475 if (lstrcmp (pProp1->szName, pProp2->szName))
477 if (memcmp (&pProp1->u, &pProp2->u, sizeof(pProp1->u)))
484 void AfsAdmSvr_TestProperties (ASID idObject)
486 LPASOBJPROP pProperties;
487 if ((pProperties = (LPASOBJPROP)((LPIDENT)idObject)->GetUserParam()) == NULL)
490 if (pProperties->verProperties >= verPROP_FIRST_SCAN)
492 ASOBJPROP NewProperties;
493 memcpy (&NewProperties, pProperties, sizeof(ASOBJPROP));
494 memset (&NewProperties.u, 0x00, sizeof(NewProperties.u));
496 if (AfsAdmSvr_ObtainFullProperties (&NewProperties))
498 if (AfsAdmSvr_PropertiesDiffer (&NewProperties, pProperties))
500 LPIDENT lpi = (LPIDENT)(pProperties->idObject);
502 LPASOBJPROP pStoredProp;
503 if ((pStoredProp = (LPASOBJPROP)(lpi->GetUserParam())) != NULL)
505 pStoredProp->idParentCell = NewProperties.idParentCell;
506 pStoredProp->idParentServer = NewProperties.idParentServer;
507 pStoredProp->idParentPartition = NewProperties.idParentPartition;
508 lstrcpy (pStoredProp->szName, NewProperties.szName);
509 memcpy (&pStoredProp->u, &NewProperties.u, sizeof(NewProperties.u));
510 pStoredProp->verProperties ++;
518 BOOL CALLBACK AfsAdmSvr_NotifyCallback (NOTIFYEVENT evt, PNOTIFYPARAMS pParams)
524 if ((lpiCreate = pParams->lpi1) != NULL)
526 if ((lpiCreate->GetUserParam()) == NULL)
528 LPASOBJPROP pProperties = New (ASOBJPROP);
529 memset (pProperties, 0x00, sizeof(ASOBJPROP));
530 pProperties->idObject = (ASID)lpiCreate;
531 AfsAdmSvr_ObtainRudimentaryProperties (pProperties);
532 lpiCreate->SetUserParam(pProperties);
535 AfsAdmSvr_TestProperties ((ASID)lpiCreate);
540 if (GetAsidType ((ASID)pParams->lpi1) == itCELL)
541 AfsAdmSvr_StopCellRefreshThread ((ASID)(pParams->lpi1));
544 case evtRefreshAllBegin:
545 AfsAdmSvr_Action_StartRefresh ((ASID)(pParams->lpi1));
548 case evtRefreshAllEnd:
549 AfsAdmSvr_Action_StopRefresh ((ASID)(pParams->lpi1));
552 case evtRefreshStatusEnd:
553 AfsAdmSvr_TestProperties ((ASID)(pParams->lpi1));
561 LPASOBJPROP AfsAdmSvr_GetCurrentProperties (ASID idObject, ULONG *pStatus)
563 switch (GetAsidType (idObject))
567 if ((lpCell = ((LPIDENT)idObject)->OpenCell (pStatus)) == NULL)
574 if ((lpServer = ((LPIDENT)idObject)->OpenServer (pStatus)) == NULL)
581 if ((lpService = ((LPIDENT)idObject)->OpenService (pStatus)) == NULL)
587 LPAGGREGATE lpAggregate;
588 if ((lpAggregate = ((LPIDENT)idObject)->OpenAggregate (pStatus)) == NULL)
590 lpAggregate->Close();
595 if ((lpFileset = ((LPIDENT)idObject)->OpenFileset (pStatus)) == NULL)
602 if ((lpUser = ((LPIDENT)idObject)->OpenUser (pStatus)) == NULL)
609 if ((lpGroup = ((LPIDENT)idObject)->OpenGroup (pStatus)) == NULL)
615 return (LPASOBJPROP)FALSE_(ERROR_INVALID_PARAMETER,pStatus);
618 LPASOBJPROP pCurrentProperties;
619 if ((pCurrentProperties = (LPASOBJPROP)((LPIDENT)idObject)->GetUserParam()) == NULL)
621 return (LPASOBJPROP)FALSE_(ERROR_NOT_ENOUGH_MEMORY,pStatus);
624 return pCurrentProperties;
628 BOOL AfsAdmSvr_InvalidateObjectProperties (ASID idObject, ULONG *pStatus)
630 switch (GetAsidType (idObject))
634 if ((lpCell = ((LPIDENT)idObject)->OpenCell (pStatus)) == NULL)
636 lpCell->Invalidate();
642 if ((lpServer = ((LPIDENT)idObject)->OpenServer (pStatus)) == NULL)
644 lpServer->Invalidate();
650 if ((lpService = ((LPIDENT)idObject)->OpenService (pStatus)) == NULL)
652 lpService->Invalidate();
657 LPAGGREGATE lpAggregate;
658 if ((lpAggregate = ((LPIDENT)idObject)->OpenAggregate (pStatus)) == NULL)
660 lpAggregate->Invalidate();
661 lpAggregate->Close();
666 if ((lpFileset = ((LPIDENT)idObject)->OpenFileset (pStatus)) == NULL)
668 lpFileset->Invalidate();
674 if ((lpUser = ((LPIDENT)idObject)->OpenUser (pStatus)) == NULL)
676 lpUser->Invalidate();
682 if ((lpGroup = ((LPIDENT)idObject)->OpenGroup (pStatus)) == NULL)
684 lpGroup->Invalidate();
689 return FALSE_(ERROR_INVALID_PARAMETER,pStatus);