pkg/utils/utils_linux.go (83 lines of code) (raw):

// Copyright (c) Microsoft Corporation. // Licensed under the MIT License. package utils import ( "errors" "fmt" "os" "path" "path/filepath" "regexp" "strconv" ) // agentDir is where the agent is located, a subdirectory of which we use as the data directory const agentDir = "/var/lib/waagent" func GetDataFolder(name string, version string) string { return path.Join(agentDir, name) } // Try clear files whose file names match with a regular expression except the filename passed in exceptFileName argument. // If deleteFiles is true, files will be deleted, else they will be emptied without deleting. func TryClearRegexMatchingFilesExcept(directory string, regexFileNamePattern string, exceptFileName string, deleteFiles bool) error { if regexFileNamePattern == "" { return errors.New("Empty regexFileNamePattern argument.") } // Check if the directory exists directoryFDRef, err := os.Open(directory) if err != nil { return err } regex, err := regexp.Compile(regexFileNamePattern) if err != nil { return err } dirEntries, err := directoryFDRef.ReadDir(0) if err == nil { for _, dirEntry := range dirEntries { fileName := dirEntry.Name() if fileName != exceptFileName && regex.MatchString(fileName) { fullFilePath := filepath.Join(directory, fileName) if deleteFiles { os.Remove(fullFilePath) } else { os.Truncate(fullFilePath, 0) // Calling create on existing file truncates file } } } return nil } return err } // Try delete all directories in parentDirectory excepth directory by name 'exceptDirectoryName' func TryDeleteDirectoriesExcept(parentDirectory string, exceptDirectoryName string) error { // Check if the directory exists directoryFDRef, err := os.Open(parentDirectory) if err != nil { return err } dirEntries, err := directoryFDRef.ReadDir(0) if err == nil && dirEntries != nil { for _, dirEntry := range dirEntries { entryName := dirEntry.Name() if dirEntry.IsDir() && entryName != exceptDirectoryName { fullDirectoryPath := filepath.Join(parentDirectory, entryName) os.RemoveAll(fullDirectoryPath) } } return nil } return err } //Try empty runtime settings files for an extension except last, delete scripts except last. // runtimeSettingsRegexFormatWithAnyExtName - regex identifying all settings files- example. "\\d+.settings", "RunCommandName.\\d+.settings" // runtimeSettingsLastSeqNumFormatWithAnyExtName - example. "%s.settings", "RunCommandName.%s.settings" func TryClearExtensionScriptsDirectoriesAndSettingsFilesExceptMostRecent(scriptsDirectory string, runtimeSettingsDirectory string, extensionName string, mostRecentSequenceNumberFinished uint64, runtimeSettingsRegexFormatWithAnyExtName string, runtimeSettingsLastSeqNumFormatWithAnyExtName string) error { recentSeqNumberString := strconv.FormatUint(mostRecentSequenceNumberFinished, 10) // Delete scripts belonging to previous sequence numbers. err := TryDeleteDirectoriesExcept(filepath.Join(scriptsDirectory, extensionName), recentSeqNumberString) if err != nil { return err } mostRecentRuntimeSetting := fmt.Sprintf(runtimeSettingsLastSeqNumFormatWithAnyExtName, mostRecentSequenceNumberFinished) // Empty Runtimesettings files belonging to previous sequence numbers. err = TryClearRegexMatchingFilesExcept(runtimeSettingsDirectory, runtimeSettingsRegexFormatWithAnyExtName, mostRecentRuntimeSetting, false) if err != nil { return err } return nil }