static void FixNetworkInterfaces( PSTR pszComputerName, LWException **exc ) { DWORD ceError = ERROR_SUCCESS; int EE = 0; BOOLEAN bFileExists = FALSE; BOOLEAN bDirExists = FALSE; PSTR* ppszPaths = NULL; DWORD nPaths = 0; DWORD iPath = 0; CHAR szBuf[1024]; PSTR pszPathifcfg = NULL; BOOLEAN bDHCPHost = FALSE; PSTR pszMachineSID = NULL; PCSTR networkConfigPath = "/etc/sysconfig/network"; LW_CLEANUP_CTERR(exc, DJGetMachineSID(&pszMachineSID)); /* * fixup HOSTNAME variable in /etc/sysconfig/network file if it exists * note that 'network' is a *directory* on some dists (ie SUSE), * is a *file* on others (ie Redhat). weird. */ LW_CLEANUP_CTERR(exc, CTCheckFileExists(networkConfigPath, &bFileExists)); if (bFileExists) { sprintf(szBuf, "s/^.*\\(HOSTNAME\\).*=.*$/\\1=%s/", pszComputerName); LW_CLEANUP_CTERR(exc, CTRunSedOnFile(networkConfigPath, networkConfigPath, FALSE, szBuf)); } LW_CLEANUP_CTERR(exc, CTCheckDirectoryExists("/etc/sysconfig/network", &bDirExists)); if (!bDirExists) { LW_CLEANUP_CTERR(exc, CTCheckDirectoryExists("/etc/sysconfig/network-scripts", &bDirExists)); } if (bDirExists) { struct { PCSTR dir; PCSTR glob; } const searchPaths[] = { {"/etc/sysconfig/network", "ifcfg-eth-id-[^.]*$"}, {"/etc/sysconfig/network", "ifcfg-eth0[^.]*$"}, {"/etc/sysconfig/network", "ifcfg-eth[^.]*$"}, {"/etc/sysconfig/network", "ifcfg-eth-bus[^.]*$"}, //SLES 10.1 on zSeries uses one of: // /etc/sysconfig/network/ifcfg-qeth-bus-ccw-0.0.0500 // /etc/sysconfig/network/ifcfg-ctc-bus-ccw-0.0.0004 {"/etc/sysconfig/network", "ifcfg-qeth-bus.*\\.[0-9]\\+$"}, {"/etc/sysconfig/network", "ifcfg-ctc-bus.*\\.[0-9]\\+$"}, // Redhat uses /etc/sysconfig/network-scripts/ifcfg-eth<number> {"/etc/sysconfig/network-scripts", "ifcfg-eth[^.]*$"}, // RHEL 6 uses this {"/etc/sysconfig/network-scripts", "ifcfg-Auto_eth[^.]*$"}, // ESX 3.5 and 4.0 use // /etc/sysconfig/network-scripts/ifcfg-vswif<number> {"/etc/sysconfig/network-scripts", "ifcfg-vswif[^.]*$"}, // RHEL 7: network interface naming seems to be ensXX or enoXXXX, etc. {"/etc/sysconfig/network-scripts", "ifcfg-en[^.]*$"}, {NULL, NULL} }; // Find the ifcfg file pszPathifcfg = NULL; for(iPath = 0; searchPaths[iPath].dir != NULL && pszPathifcfg == NULL; iPath++) { if (ppszPaths) { CTFreeStringArray(ppszPaths, nPaths); ppszPaths = NULL; } ceError = CTGetMatchingFilePathsInFolder(searchPaths[iPath].dir, searchPaths[iPath].glob, &ppszPaths, &nPaths); if(ceError == ERROR_DIRECTORY) { ceError = ERROR_SUCCESS; continue; } LW_CLEANUP_CTERR(exc, ceError); if(nPaths > 0) { LW_CLEANUP_CTERR(exc, CTAllocateString(ppszPaths[0], &pszPathifcfg)); } } if (IsNullOrEmptyString(pszPathifcfg)) { LW_CLEANUP_CTERR(exc, ERROR_FILE_NOT_FOUND); } DJ_LOG_INFO("Found ifcfg file at %s", pszPathifcfg); LW_CLEANUP_CTERR(exc, DJCheckIfDHCPHost(pszPathifcfg, &bDHCPHost)); if (bDHCPHost) { LW_CLEANUP_CTERR(exc, DJFixDHCPHost(pszPathifcfg, pszComputerName)); } } ceError = CTShell("/bin/hostname %hostname >/dev/null", CTSHELL_STRING(hostname, pszComputerName)); LW_CLEANUP_CTERR(exc, ceError); // Only DHCP boxes need to restart their networks if (bDHCPHost) { LW_CLEANUP_CTERR(exc, DJConfigureDHCPService(pszComputerName)); } cleanup: // This ensures that we do not change the SID after a machine name // change. The issue here is that Samba implements its SAM such that // a machine name change changes the seeding used for the machine SID. // Therefore, we must re-store the old SID with the new machine name // seed. if (pszMachineSID) { if (*pszMachineSID != '\0') DJSetMachineSID(pszMachineSID); CTFreeString(pszMachineSID); } if (ppszPaths) CTFreeStringArray(ppszPaths, nPaths); if (pszPathifcfg) CTFreeString(pszPathifcfg); DJ_LOG_VERBOSE("FixNetworkInterfaces LEAVE -> 0x%08x (EE = %d)", ceError, EE); }
static DWORD DJFixNetworkManagerOnlineTimeout( ) { DWORD ceError = ERROR_SUCCESS; PSTR pszFilePath = "/etc/sysconfig/network/config"; DWORD dwTimeout = 60; int EE = 0; BOOLEAN bFileExists = FALSE; char *isEnabled = NULL; char *currentTimeout = NULL; char *sedExpression = NULL; long currentTimeoutLong; char *conversionEnd; ceError = CTCheckFileExists(pszFilePath, &bFileExists); CLEANUP_ON_DWORD_EE(ceError, EE); if(!bFileExists) goto cleanup; ceError = CTShell(". %pszFilePath; echo \"$NETWORKMANAGER\" >%enabled; echo \"$NM_ONLINE_TIMEOUT\" >%timeout", CTSHELL_STRING (pszFilePath, pszFilePath), CTSHELL_BUFFER (enabled, &isEnabled), CTSHELL_BUFFER (timeout, ¤tTimeout)); CLEANUP_ON_DWORD_EE(ceError, EE); CTStripTrailingWhitespace(isEnabled); CTStripTrailingWhitespace(currentTimeout); DJ_LOG_VERBOSE("Network manager enabled [%s] network manager timeout [%s]", isEnabled, currentTimeout); if(strcasecmp(isEnabled, "yes")) { DJ_LOG_INFO("Network manager is not enabled"); goto cleanup; } currentTimeoutLong = strtol(currentTimeout, &conversionEnd, 10); if(*conversionEnd != '\0') { DJ_LOG_INFO("Unable to convert network manager timeout to long"); currentTimeoutLong = 0; } if(currentTimeoutLong < dwTimeout) { DJ_LOG_INFO("Setting network manager timeout to %d", dwTimeout); ceError = CTAllocateStringPrintf(&sedExpression, "s/^\\([ \t]*NM_ONLINE_TIMEOUT[ \t]*=[ \t]*\\).*$/\\1%d/", dwTimeout); CLEANUP_ON_DWORD_EE(ceError, EE); ceError = CTRunSedOnFile(pszFilePath, pszFilePath, FALSE, sedExpression); CLEANUP_ON_DWORD_EE(ceError, EE); } cleanup: DJ_LOG_VERBOSE("DJFixNetworkManagerOnlineTimeout LEAVE -> 0x%08x (EE = %d)", ceError, EE); CT_SAFE_FREE_STRING(isEnabled); CT_SAFE_FREE_STRING(currentTimeout); CT_SAFE_FREE_STRING(sedExpression); return ceError; }
static void ConfigureApparmor(BOOLEAN enable, LWException **exc) { DWORD ceError = ERROR_SUCCESS; BOOLEAN hasApparmor; BOOLEAN configured; BOOLEAN usingMr; FILE *file = NULL; PCSTR addString; PSTR restartPath = NULL; PSTR restartCommand = NULL; char *tempName = NULL; char *finalName = NULL; LW_CLEANUP_CTERR(exc, IsApparmorConfigured(&configured)); if(configured == enable) goto cleanup; LW_CLEANUP_CTERR(exc, CTCheckFileOrLinkExists(APPARMOR_NSSWITCH, &hasApparmor)); if(!hasApparmor) goto cleanup; GCE(ceError = CTGetFileTempPath( APPARMOR_NSSWITCH, &finalName, &tempName)); LW_CLEANUP_CTERR(exc, CTCheckFileHoldsPattern(finalName, "mr,", &usingMr)); if(usingMr) addString = PREFIXDIR "/lib/*.so* mr,\n" PREFIXDIR "/lib64/*.so* mr,\n" "/tmp/.lwidentity/pipe rw,\n" LOCALSTATEDIR "/lib/likewise/.lsassd rw,\n" LOCALSTATEDIR "/tmp/.lsaclient_* rw,\n"; else addString = PREFIXDIR "/lib/*.so* r,\n" PREFIXDIR "/lib64/*.so* r,\n" "/tmp/.lwidentity/pipe rw,\n" LOCALSTATEDIR "/lib/likewise/.lsassd rw,\n" LOCALSTATEDIR "/tmp/.lsaclient_* rw,\n"; if(enable) { LW_CLEANUP_CTERR(exc, CTCopyFileWithOriginalPerms(finalName, tempName)); LW_CLEANUP_CTERR(exc, CTOpenFile(tempName, "a", &file)); LW_CLEANUP_CTERR(exc, CTFilePrintf(file, "# likewise\n%s# end likewise\n", addString)); CTSafeCloseFile(&file); LW_CLEANUP_CTERR(exc, CTSafeReplaceFile(finalName, tempName)); } else { LW_CLEANUP_CTERR(exc, CTRunSedOnFile(finalName, finalName, FALSE, "/^[ \t]*#[ \t]*likewise[ \t]*$/,/^[ \t]*#[ \t]*end likewise[ \t]*$/d")); LW_CLEANUP_CTERR(exc, CTRunSedOnFile(finalName, finalName, FALSE, "/^[ \t]*#[ \t]*centeris[ \t]*$/,/^[ \t]*#[ \t]*end centeris[ \t]*$/d")); } ceError = CTFindFileInPath("rcapparmor", "/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin", &restartPath); if(ceError == ERROR_FILE_NOT_FOUND) { ceError = CTFindFileInPath("apparmor", "/etc/init.d/apparmor", &restartPath); } if(ceError == ERROR_FILE_NOT_FOUND) { ceError = ERROR_SUCCESS; } else if(!ceError) { LW_CLEANUP_CTERR(exc, CTAllocateStringPrintf(&restartCommand, "%s restart", restartPath)); LW_TRY(exc, CTCaptureOutputToExc(restartCommand, &LW_EXC)); } LW_CLEANUP_CTERR(exc, ceError); cleanup: if(file != NULL) { CTCloseFile(file); CTRemoveFile(tempName); } CT_SAFE_FREE_STRING(restartPath); CT_SAFE_FREE_STRING(restartCommand); CT_SAFE_FREE_STRING(tempName); CT_SAFE_FREE_STRING(finalName); }
static DWORD WriteHostnameToSunFiles( PCSTR pOldShortHostname, PCSTR pNewShortHostname, PCSTR pDnsDomainName, PCSTR pOldFqdnHostname, PCSTR pNewFqdnHostname ) { DWORD ceError = ERROR_SUCCESS; FILE* fp = NULL; PSTR* ppszHostfilePaths = NULL; DWORD nPaths = 0; DWORD iPath = 0; PSTR pRealPath = NULL; PSTR pTempPath = NULL; PSTR pOldEscapedShortHostname = NULL; PSTR pOldEscapedFqdnHostname = NULL; PSTR pOldSedExpression = NULL; PSTR pSedExpression = NULL; BOOLEAN isSame = FALSE; DJ_LOG_INFO("Setting hostname to [%s]", pNewShortHostname); ceError = CTGetFileTempPath( "/etc/nodename", &pRealPath, &pTempPath); BAIL_ON_CENTERIS_ERROR(ceError); ceError = CTOpenFile( pTempPath, "w", &fp); BAIL_ON_CENTERIS_ERROR(ceError); if (fprintf(fp, "%s\n", pNewShortHostname) < 0) { ceError = LwMapErrnoToLwError(errno); BAIL_ON_CENTERIS_ERROR(ceError); } ceError = CTSafeCloseFile(&fp); BAIL_ON_CENTERIS_ERROR(ceError); ceError = CTFileContentsSame( pTempPath, pRealPath, &isSame); BAIL_ON_CENTERIS_ERROR(ceError); if (isSame) { BAIL_ON_CENTERIS_ERROR(ceError = CTRemoveFile(pTempPath)); } else { ceError = CTSafeReplaceFile(pRealPath, pTempPath); BAIL_ON_CENTERIS_ERROR(ceError); } CT_SAFE_FREE_STRING(pRealPath); CT_SAFE_FREE_STRING(pTempPath); ceError = CTGetFileTempPath( "/etc/defaultdomain", &pRealPath, &pTempPath); BAIL_ON_CENTERIS_ERROR(ceError); ceError = CTOpenFile( pTempPath, "w", &fp); BAIL_ON_CENTERIS_ERROR(ceError); fprintf(fp, "%s\n", pDnsDomainName); ceError = CTSafeCloseFile(&fp); BAIL_ON_CENTERIS_ERROR(ceError); ceError = CTFileContentsSame( pTempPath, pRealPath, &isSame); BAIL_ON_CENTERIS_ERROR(ceError); if (isSame) { BAIL_ON_CENTERIS_ERROR(ceError = CTRemoveFile(pTempPath)); } else { ceError = CTSafeReplaceFile(pRealPath, pTempPath); BAIL_ON_CENTERIS_ERROR(ceError); } /* The first column of the /etc/hostname.<interface> files is the IP * address of the interface. It may either be specified directly in the * file, or the file may refer to an entry in /etc/hosts. This program is * editing /etc/hosts, any old entries in the hostname files need to be * fixed. */ ceError = CTGetMatchingFilePathsInFolder("/etc", "hostname.*", &ppszHostfilePaths, &nPaths); BAIL_ON_CENTERIS_ERROR(ceError); ceError = SedEscapeLiteral( pOldShortHostname, &pOldEscapedShortHostname); BAIL_ON_CENTERIS_ERROR(ceError); ceError = LwAllocateStringPrintf( &pSedExpression, "s/^%s\\([ ].*\\)\\{0,1\\}$/%s\\1/", pOldEscapedShortHostname, pNewShortHostname); BAIL_ON_CENTERIS_ERROR(ceError); if (pOldFqdnHostname != NULL) { ceError = SedEscapeLiteral( pOldFqdnHostname, &pOldEscapedFqdnHostname); BAIL_ON_CENTERIS_ERROR(ceError); pOldSedExpression = pSedExpression; pSedExpression = NULL; ceError = LwAllocateStringPrintf( &pSedExpression, "%s;s/^%s\\([ ].*\\)\\{0,1\\}$/%s\\1/", pOldSedExpression, pOldEscapedFqdnHostname, pNewFqdnHostname); BAIL_ON_CENTERIS_ERROR(ceError); } for (iPath = 0; iPath < nPaths; iPath++) { if (!CTStrEndsWith(ppszHostfilePaths[iPath], ".lwidentity.bak") && !CTStrEndsWith(ppszHostfilePaths[iPath], ".lwidentity.orig")) { ceError = CTRunSedOnFile( ppszHostfilePaths[iPath], ppszHostfilePaths[iPath], FALSE, pSedExpression); BAIL_ON_CENTERIS_ERROR(ceError); } } error: if (ppszHostfilePaths) CTFreeStringArray(ppszHostfilePaths, nPaths); if (fp) { fclose(fp); } CT_SAFE_FREE_STRING(pRealPath); CT_SAFE_FREE_STRING(pTempPath); CT_SAFE_FREE_STRING(pOldEscapedShortHostname); CT_SAFE_FREE_STRING(pOldEscapedFqdnHostname); CT_SAFE_FREE_STRING(pOldSedExpression); CT_SAFE_FREE_STRING(pSedExpression); return ceError; }
void DJManageDaemons( BOOLEAN bStart, LWException **exc ) { BOOLEAN bFileExists = TRUE; FILE* fp = NULL; LWException *innerExc = NULL; int i; PLSA_LOG_INFO pLogInfo = NULL; BOOLEAN bLsassContacted = FALSE; DWORD dwError = 0; LW_HANDLE hLsa = NULL; LW_CLEANUP_CTERR(exc, CTCheckFileExists(PWGRD, &bFileExists)); if(bFileExists) { //Shutdown pwgr (a nscd-like daemon) on HP-UX because it only handles //usernames up to 8 characters in length. LW_TRY(exc, DJStartStopDaemon("pwgr", FALSE, &LW_EXC)); LW_CLEANUP_CTERR(exc, CTRunSedOnFile(PWGRD, PWGRD, FALSE, "s/=1/=0/")); } if(bStart) { // Set registry value for gpagentd to autostart. dwError = SetBooleanRegistryValue("Services\\gpagent", "Autostart", TRUE); // Trigger gpagentd start dwError = DJStartService("gpagent"); // Make sure lsass is responding bLsassContacted = FALSE; for (i = 0; !bLsassContacted && i < 30; i++) { DJ_LOG_INFO("Trying to contact lsassd"); if (hLsa) { LsaCloseServer(hLsa); hLsa = NULL; } dwError = LsaOpenServer(&hLsa); if (dwError == ERROR_FILE_NOT_FOUND || dwError == LW_ERROR_ERRNO_ECONNREFUSED) { DJ_LOG_INFO("Failed with %d", dwError); dwError = 0; sleep(1); continue; } LW_CLEANUP_CTERR(exc, dwError); LW_CLEANUP_CTERR(exc, LsaGetLogInfo(hLsa, &pLogInfo)); bLsassContacted = TRUE; } if (!bLsassContacted) { LW_RAISE_EX(exc, ERROR_SERVICE_NOT_ACTIVE, "Unable to reach lsassd", "The lsass daemon could not be reached for 30 seconds after trying to start it. Please verify it is running."); goto cleanup; } } else { dwError = SetBooleanRegistryValue("Services\\gpagent", "Autostart", FALSE); dwError = DJStopService("gpagent"); } cleanup: CTSafeCloseFile(&fp); if (pLogInfo) { LsaFreeLogInfo(pLogInfo); } if (hLsa) { LsaCloseServer(hLsa); } LW_HANDLE(&innerExc); }