157 lines
4.5 KiB
Go
157 lines
4.5 KiB
Go
|
// Licensed to Elasticsearch B.V. under one or more contributor
|
|||
|
// license agreements. See the NOTICE file distributed with
|
|||
|
// this work for additional information regarding copyright
|
|||
|
// ownership. Elasticsearch B.V. licenses this file to you under
|
|||
|
// the Apache License, Version 2.0 (the "License"); you may
|
|||
|
// not use this file except in compliance with the License.
|
|||
|
// You may obtain a copy of the License at
|
|||
|
//
|
|||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
|||
|
//
|
|||
|
// Unless required by applicable law or agreed to in writing,
|
|||
|
// software distributed under the License is distributed on an
|
|||
|
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|||
|
// KIND, either express or implied. See the License for the
|
|||
|
// specific language governing permissions and limitations
|
|||
|
// under the License.
|
|||
|
|
|||
|
// Package paths provides a common way to handle paths
|
|||
|
// configuration for all Beats.
|
|||
|
//
|
|||
|
// Currently the following paths are defined:
|
|||
|
//
|
|||
|
// path.home - It’s the default folder for everything that doesn't fit in
|
|||
|
// the categories below
|
|||
|
//
|
|||
|
// path.data - Contains things that are expected to change often during normal
|
|||
|
// operations (“registry” files, UUID file, etc.)
|
|||
|
//
|
|||
|
// path.config - Configuration files and Elasticsearch template default location
|
|||
|
//
|
|||
|
// These settings can be set via the configuration file or via command line flags.
|
|||
|
// The CLI flags overwrite the configuration file options.
|
|||
|
//
|
|||
|
// Use the Resolve function to resolve files to their absolute paths. For example,
|
|||
|
// to look for a file in the config path:
|
|||
|
//
|
|||
|
// cfgfilePath := paths.Resolve(paths.Config, "beat.yml"
|
|||
|
package paths
|
|||
|
|
|||
|
import (
|
|||
|
"fmt"
|
|||
|
"os"
|
|||
|
"path/filepath"
|
|||
|
)
|
|||
|
|
|||
|
type Path struct {
|
|||
|
Home string
|
|||
|
Config string
|
|||
|
Data string
|
|||
|
Logs string
|
|||
|
}
|
|||
|
|
|||
|
// FileType is an enumeration type representing the file types.
|
|||
|
// Currently existing file types are: Home, Config, Data
|
|||
|
type FileType string
|
|||
|
|
|||
|
const (
|
|||
|
Home FileType = "home"
|
|||
|
Config FileType = "config"
|
|||
|
Data FileType = "data"
|
|||
|
Logs FileType = "logs"
|
|||
|
)
|
|||
|
|
|||
|
// Paths is the Path singleton on which the top level functions from this
|
|||
|
// package operate.
|
|||
|
var Paths = New()
|
|||
|
|
|||
|
// New creates a new Paths object with all values set to empty values.
|
|||
|
func New() *Path {
|
|||
|
return &Path{}
|
|||
|
}
|
|||
|
|
|||
|
// InitPaths sets the default paths in the configuration based on CLI flags,
|
|||
|
// configuration file and default values. It also tries to create the data
|
|||
|
// path with mode 0750 and returns an error on failure.
|
|||
|
func (paths *Path) InitPaths(cfg *Path) error {
|
|||
|
err := paths.initPaths(cfg)
|
|||
|
if err != nil {
|
|||
|
return err
|
|||
|
}
|
|||
|
|
|||
|
// make sure the data path exists
|
|||
|
err = os.MkdirAll(paths.Data, 0750)
|
|||
|
if err != nil {
|
|||
|
return fmt.Errorf("Failed to create data path %s: %v", paths.Data, err)
|
|||
|
}
|
|||
|
|
|||
|
return nil
|
|||
|
}
|
|||
|
|
|||
|
// InitPaths sets the default paths in the configuration based on CLI flags,
|
|||
|
// configuration file and default values. It also tries to create the data
|
|||
|
// path with mode 0750 and returns an error on failure.
|
|||
|
func InitPaths(cfg *Path) error {
|
|||
|
return Paths.InitPaths(cfg)
|
|||
|
}
|
|||
|
|
|||
|
// initPaths sets the default paths in the configuration based on CLI flags,
|
|||
|
// configuration file and default values.
|
|||
|
func (paths *Path) initPaths(cfg *Path) error {
|
|||
|
*paths = *cfg
|
|||
|
|
|||
|
// default for config path
|
|||
|
if paths.Config == "" {
|
|||
|
paths.Config = paths.Home
|
|||
|
}
|
|||
|
|
|||
|
// default for data path
|
|||
|
if paths.Data == "" {
|
|||
|
paths.Data = filepath.Join(paths.Home, "data")
|
|||
|
}
|
|||
|
|
|||
|
// default for logs path
|
|||
|
if paths.Logs == "" {
|
|||
|
paths.Logs = filepath.Join(paths.Home, "logs")
|
|||
|
}
|
|||
|
|
|||
|
return nil
|
|||
|
}
|
|||
|
|
|||
|
// Resolve resolves a path to a location in one of the default
|
|||
|
// folders. For example, Resolve(Home, "test") returns an absolute
|
|||
|
// path for "test" in the home path.
|
|||
|
func (paths *Path) Resolve(fileType FileType, path string) string {
|
|||
|
// absolute paths are not changed
|
|||
|
if filepath.IsAbs(path) {
|
|||
|
return path
|
|||
|
}
|
|||
|
|
|||
|
switch fileType {
|
|||
|
case Home:
|
|||
|
return filepath.Join(paths.Home, path)
|
|||
|
case Config:
|
|||
|
return filepath.Join(paths.Config, path)
|
|||
|
case Data:
|
|||
|
return filepath.Join(paths.Data, path)
|
|||
|
case Logs:
|
|||
|
return filepath.Join(paths.Logs, path)
|
|||
|
default:
|
|||
|
panic(fmt.Sprintf("Unknown file type: %s", fileType))
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
// Resolve resolves a path to a location in one of the default
|
|||
|
// folders. For example, Resolve(Home, "test") returns an absolute
|
|||
|
// path for "test" in the home path.
|
|||
|
// In case path is already an absolute path, the path itself is returned.
|
|||
|
func Resolve(fileType FileType, path string) string {
|
|||
|
return Paths.Resolve(fileType, path)
|
|||
|
}
|
|||
|
|
|||
|
// String returns a textual representation
|
|||
|
func (paths *Path) String() string {
|
|||
|
return fmt.Sprintf("Home path: [%s] Config path: [%s] Data path: [%s] Logs path: [%s]",
|
|||
|
paths.Home, paths.Config, paths.Data, paths.Logs)
|
|||
|
}
|