本文整理汇总了Golang中github.com/lxc/lxd/shared.LogPath函数的典型用法代码示例。如果您正苦于以下问题:Golang LogPath函数的具体用法?Golang LogPath怎么用?Golang LogPath使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了LogPath函数的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的Golang代码示例。
示例1: startContainer
/*
* This is called by lxd when called as "lxd forkstart <container>"
* 'forkstart' is used instead of just 'start' in the hopes that people
* do not accidentally type 'lxd start' instead of 'lxc start'
*
* We expect to read the lxcconfig over fd 3.
*/
func startContainer(args []string) error {
if len(args) != 4 {
return fmt.Errorf("Bad arguments: %q\n", args)
}
name := args[1]
lxcpath := args[2]
configPath := args[3]
c, err := lxc.NewContainer(name, lxcpath)
if err != nil {
return fmt.Errorf("Error initializing container for start: %q", err)
}
err = c.LoadConfigFile(configPath)
if err != nil {
return fmt.Errorf("Error opening startup config file: %q", err)
}
err = c.Start()
if err != nil {
os.Remove(configPath)
} else {
shared.FileMove(configPath, shared.LogPath(name, "lxc.conf"))
}
return err
}
示例2: containerLogsGet
func containerLogsGet(d *Daemon, r *http.Request) Response {
/* Let's explicitly *not* try to do a containerLoadByName here. In some
* cases (e.g. when container creation failed), the container won't
* exist in the DB but it does have some log files on disk.
*
* However, we should check this name and ensure it's a valid container
* name just so that people can't list arbitrary directories.
*/
name := mux.Vars(r)["name"]
if err := containerValidName(name); err != nil {
return BadRequest(err)
}
result := []string{}
dents, err := ioutil.ReadDir(shared.LogPath(name))
if err != nil {
return SmartError(err)
}
for _, f := range dents {
result = append(result, fmt.Sprintf("/%s/containers/%s/logs/%s", shared.APIVersion, name, f.Name()))
}
return SyncResponse(true, result)
}
示例3: containerLogsGet
func containerLogsGet(d *Daemon, r *http.Request) Response {
/* Let's explicitly *not* try to do a containerLXDLoad here. In some
* cases (e.g. when container creation failed), the container won't
* exist in the DB but it does have some log files on disk.
*
* However, we should check this name and ensure it's a valid container
* name just so that people can't list arbitrary directories.
*/
name := mux.Vars(r)["name"]
if err := validContainerName(name); err != nil {
return BadRequest(err)
}
result := []map[string]interface{}{}
dents, err := ioutil.ReadDir(shared.LogPath(name))
if err != nil {
return SmartError(err)
}
for _, f := range dents {
result = append(result, map[string]interface{}{
"name": f.Name(),
"size": f.Size(),
})
}
return SyncResponse(true, result)
}
示例4: startContainer
/*
* This is called by lxd when called as "lxd forkstart <container>"
* 'forkstart' is used instead of just 'start' in the hopes that people
* do not accidentally type 'lxd start' instead of 'lxc start'
*
* We expect to read the lxcconfig over fd 3.
*/
func startContainer(args []string) error {
if len(args) != 4 {
return fmt.Errorf("Bad arguments: %q", args)
}
name := args[1]
lxcpath := args[2]
configPath := args[3]
c, err := lxc.NewContainer(name, lxcpath)
if err != nil {
return fmt.Errorf("Error initializing container for start: %q", err)
}
err = c.LoadConfigFile(configPath)
if err != nil {
return fmt.Errorf("Error opening startup config file: %q", err)
}
/* due to https://github.com/golang/go/issues/13155 and the
* CollectOutput call we make for the forkstart process, we need to
* close our stdin/stdout/stderr here. Collecting some of the logs is
* better than collecting no logs, though.
*/
os.Stdin.Close()
os.Stderr.Close()
os.Stdout.Close()
err = c.Start()
if err != nil {
os.Remove(configPath)
} else {
shared.FileMove(configPath, shared.LogPath(name, "lxc.conf"))
}
return err
}
示例5: startContainer
/*
* This is called by lxd when called as "lxd forkstart <container>"
* 'forkstart' is used instead of just 'start' in the hopes that people
* do not accidentally type 'lxd start' instead of 'lxc start'
*
* We expect to read the lxcconfig over fd 3.
*/
func startContainer(args []string) error {
if len(args) != 4 {
return fmt.Errorf("Bad arguments: %q", args)
}
name := args[1]
lxcpath := args[2]
configPath := args[3]
c, err := lxc.NewContainer(name, lxcpath)
if err != nil {
return fmt.Errorf("Error initializing container for start: %q", err)
}
err = c.LoadConfigFile(configPath)
if err != nil {
return fmt.Errorf("Error opening startup config file: %q", err)
}
/* due to https://github.com/golang/go/issues/13155 and the
* CollectOutput call we make for the forkstart process, we need to
* close our stdin/stdout/stderr here. Collecting some of the logs is
* better than collecting no logs, though.
*/
os.Stdin.Close()
os.Stderr.Close()
os.Stdout.Close()
// Redirect stdout and stderr to a log file
logPath := shared.LogPath(name, "forkstart.log")
if shared.PathExists(logPath) {
os.Remove(logPath)
}
logFile, err := os.OpenFile(logPath, os.O_WRONLY|os.O_CREATE|os.O_SYNC, 0644)
if err == nil {
syscall.Dup3(int(logFile.Fd()), 1, 0)
syscall.Dup3(int(logFile.Fd()), 2, 0)
}
// Move the config so we can inspect it on failure
shared.FileMove(configPath, shared.LogPath(name, "lxc.conf"))
return c.Start()
}
示例6: containerLogDelete
func containerLogDelete(d *Daemon, r *http.Request) Response {
name := mux.Vars(r)["name"]
file := mux.Vars(r)["file"]
if err := validContainerName(name); err != nil {
return BadRequest(err)
}
if !validLogFileName(file) {
return BadRequest(fmt.Errorf("log file name %s not valid", file))
}
return SmartError(os.Remove(shared.LogPath(name, file)))
}
示例7: Start
func (c *lxdContainer) Start() error {
f, err := ioutil.TempFile("", "lxd_lxc_startconfig_")
if err != nil {
return err
}
configPath := f.Name()
if err = f.Chmod(0600); err != nil {
f.Close()
os.Remove(configPath)
return err
}
f.Close()
err = c.c.SaveConfigFile(configPath)
if err != nil {
return err
}
err = templateApply(c, "start")
if err != nil {
return err
}
err = exec.Command(
os.Args[0],
"forkstart",
c.name,
c.daemon.lxcpath,
configPath).Run()
if err != nil {
err = fmt.Errorf(
"Error calling 'lxd forkstart %s %s %s': err='%v'",
c.name,
c.daemon.lxcpath,
shared.LogPath(c.name, "lxc.conf"),
err)
}
if err == nil && c.ephemeral == true {
containerWatchEphemeral(c)
}
return err
}
示例8: containerLogGet
func containerLogGet(d *Daemon, r *http.Request) Response {
name := mux.Vars(r)["name"]
file := mux.Vars(r)["file"]
if err := validContainerName(name); err != nil {
return BadRequest(err)
}
if !validLogFileName(file) {
return BadRequest(fmt.Errorf("log file name %s not valid", file))
}
ent := fileResponseEntry{
path: shared.LogPath(name, file),
filename: file,
}
return FileResponse(r, []fileResponseEntry{ent}, nil, false)
}
示例9: Init
//.........这里部分代码省略.........
}
architecture, err := shared.ArchitectureId(architectureName)
if err != nil {
return err
}
architectures = append(architectures, architecture)
personalities, err := shared.ArchitecturePersonalities(architecture)
if err != nil {
return err
}
for _, personality := range personalities {
architectures = append(architectures, personality)
}
d.architectures = architectures
/* Set container path */
d.lxcpath = shared.VarPath("containers")
/* Make sure all our directories are available */
if err := os.MkdirAll(shared.VarPath("containers"), 0711); err != nil {
return err
}
if err := os.MkdirAll(shared.VarPath("devices"), 0711); err != nil {
return err
}
if err := os.MkdirAll(shared.VarPath("devlxd"), 0755); err != nil {
return err
}
if err := os.MkdirAll(shared.VarPath("images"), 0700); err != nil {
return err
}
if err := os.MkdirAll(shared.LogPath(), 0700); err != nil {
return err
}
if err := os.MkdirAll(shared.VarPath("security"), 0700); err != nil {
return err
}
if err := os.MkdirAll(shared.VarPath("shmounts"), 0711); err != nil {
return err
}
if err := os.MkdirAll(shared.VarPath("snapshots"), 0700); err != nil {
return err
}
/* Detect the filesystem */
d.BackingFs, err = filesystemDetect(d.lxcpath)
if err != nil {
shared.Log.Error("Error detecting backing fs", log.Ctx{"err": err})
}
/* Read the uid/gid allocation */
d.IdmapSet, err = shared.DefaultIdmapSet()
if err != nil {
shared.Log.Warn("Error reading idmap", log.Ctx{"err": err.Error()})
shared.Log.Warn("Only privileged containers will be able to run")
} else {
shared.Log.Info("Default uid/gid map:")
for _, lxcmap := range d.IdmapSet.ToLxcString() {
shared.Log.Info(strings.TrimRight(" - "+lxcmap, "\n"))
}
}
/* Initialize the database */
err = initializeDbObject(d, shared.VarPath("lxd.db"))
示例10: execContainer
/*
* This is called by lxd when called as "lxd forkexec <container>"
*/
func execContainer(args []string) (int, error) {
if len(args) < 6 {
return -1, fmt.Errorf("Bad arguments: %q", args)
}
wait := true
if args[1] == "nowait" {
wait = false
}
name := args[2]
lxcpath := args[3]
configPath := args[4]
c, err := lxc.NewContainer(name, lxcpath)
if err != nil {
return -1, fmt.Errorf("Error initializing container for start: %q", err)
}
err = c.LoadConfigFile(configPath)
if err != nil {
return -1, fmt.Errorf("Error opening startup config file: %q", err)
}
syscall.Dup3(int(os.Stdin.Fd()), 200, 0)
syscall.Dup3(int(os.Stdout.Fd()), 201, 0)
syscall.Dup3(int(os.Stderr.Fd()), 202, 0)
syscall.Close(int(os.Stdin.Fd()))
syscall.Close(int(os.Stdout.Fd()))
syscall.Close(int(os.Stderr.Fd()))
opts := lxc.DefaultAttachOptions
opts.ClearEnv = true
opts.StdinFd = 200
opts.StdoutFd = 201
opts.StderrFd = 202
logPath := shared.LogPath(name, "forkexec.log")
if shared.PathExists(logPath) {
os.Remove(logPath)
}
logFile, err := os.OpenFile(logPath, os.O_WRONLY|os.O_CREATE|os.O_SYNC, 0644)
if err == nil {
syscall.Dup3(int(logFile.Fd()), 1, 0)
syscall.Dup3(int(logFile.Fd()), 2, 0)
}
env := []string{}
cmd := []string{}
section := ""
for _, arg := range args[5:len(args)] {
// The "cmd" section must come last as it may contain a --
if arg == "--" && section != "cmd" {
section = ""
continue
}
if section == "" {
section = arg
continue
}
if section == "env" {
fields := strings.SplitN(arg, "=", 2)
if len(fields) == 2 && fields[0] == "HOME" {
opts.Cwd = fields[1]
}
env = append(env, arg)
} else if section == "cmd" {
cmd = append(cmd, arg)
} else {
return -1, fmt.Errorf("Invalid exec section: %s", section)
}
}
opts.Env = env
var status int
if wait {
status, err = c.RunCommandStatus(cmd, opts)
if err != nil {
return -1, fmt.Errorf("Failed running command and waiting for it to exit: %q", err)
}
} else {
status, err = c.RunCommandNoWait(cmd, opts)
if err != nil {
return -1, fmt.Errorf("Failed running command: %q", err)
}
// Send the PID of the executing process.
w := os.NewFile(uintptr(3), "attachedPid")
defer w.Close()
err = json.NewEncoder(w).Encode(status)
if err != nil {
return -1, fmt.Errorf("Failed sending PID of executing command: %q", err)
//.........这里部分代码省略.........
示例11: containerCreateInternal
func containerCreateInternal(d *Daemon, args containerArgs) (container, error) {
// Set default values
if args.Profiles == nil {
args.Profiles = []string{"default"}
}
if args.Config == nil {
args.Config = map[string]string{}
}
if args.BaseImage != "" {
args.Config["volatile.base_image"] = args.BaseImage
}
if args.Devices == nil {
args.Devices = shared.Devices{}
}
if args.Architecture == 0 {
args.Architecture = d.architectures[0]
}
// Validate container name
if args.Ctype == cTypeRegular {
err := containerValidName(args.Name)
if err != nil {
return nil, err
}
}
// Validate container config
err := containerValidConfig(d, args.Config, false, false)
if err != nil {
return nil, err
}
// Validate container devices
err = containerValidDevices(args.Devices, false, false)
if err != nil {
return nil, err
}
// Validate architecture
_, err = shared.ArchitectureName(args.Architecture)
if err != nil {
return nil, err
}
// Validate profiles
profiles, err := dbProfiles(d.db)
if err != nil {
return nil, err
}
for _, profile := range args.Profiles {
if !shared.StringInSlice(profile, profiles) {
return nil, fmt.Errorf("Requested profile '%s' doesn't exist", profile)
}
}
path := containerPath(args.Name, args.Ctype == cTypeSnapshot)
if shared.PathExists(path) {
if shared.IsSnapshot(args.Name) {
return nil, fmt.Errorf("Snapshot '%s' already exists", args.Name)
}
return nil, fmt.Errorf("The container already exists")
}
// Wipe any existing log for this container name
os.RemoveAll(shared.LogPath(args.Name))
// Create the container entry
id, err := dbContainerCreate(d.db, args)
if err != nil {
return nil, err
}
args.Id = id
// Read the timestamp from the database
dbArgs, err := dbContainerGet(d.db, args.Name)
if err != nil {
return nil, err
}
args.CreationDate = dbArgs.CreationDate
args.LastUsedDate = dbArgs.LastUsedDate
return containerLXCCreate(d, args)
}
示例12: Init
//.........这里部分代码省略.........
}
architecture, err := shared.ArchitectureId(architectureName)
if err != nil {
return err
}
architectures = append(architectures, architecture)
personalities, err := shared.ArchitecturePersonalities(architecture)
if err != nil {
return err
}
for _, personality := range personalities {
architectures = append(architectures, personality)
}
d.architectures = architectures
/* Set container path */
d.lxcpath = shared.VarPath("containers")
/* Make sure all our directories are available */
if err := os.MkdirAll(shared.VarPath("containers"), 0711); err != nil {
return err
}
if err := os.MkdirAll(shared.VarPath("devices"), 0711); err != nil {
return err
}
if err := os.MkdirAll(shared.VarPath("devlxd"), 0755); err != nil {
return err
}
if err := os.MkdirAll(shared.VarPath("images"), 0700); err != nil {
return err
}
if err := os.MkdirAll(shared.LogPath(), 0700); err != nil {
return err
}
if err := os.MkdirAll(shared.VarPath("security"), 0700); err != nil {
return err
}
if err := os.MkdirAll(shared.VarPath("shmounts"), 0711); err != nil {
return err
}
if err := os.MkdirAll(shared.VarPath("snapshots"), 0700); err != nil {
return err
}
/* Detect the filesystem */
d.BackingFs, err = filesystemDetect(d.lxcpath)
if err != nil {
shared.Log.Error("Error detecting backing fs", log.Ctx{"err": err})
}
/* Read the uid/gid allocation */
d.IdmapSet, err = shared.DefaultIdmapSet()
if err != nil {
shared.Log.Warn("Error reading idmap", log.Ctx{"err": err.Error()})
shared.Log.Warn("Only privileged containers will be able to run")
} else {
shared.Log.Info("Default uid/gid map:")
for _, lxcmap := range d.IdmapSet.ToLxcString() {
shared.Log.Info(strings.TrimRight(" - "+lxcmap, "\n"))
}
}
/* Initialize the database */
err = initializeDbObject(d, shared.VarPath("lxd.db"))
示例13: newLxdContainer
func newLxdContainer(name string, daemon *Daemon) (*lxdContainer, error) {
d := &lxdContainer{
daemon: daemon,
ephemeral: false,
architecture: -1,
cType: -1,
id: -1}
ephemInt := -1
templateConfBase := "ubuntu"
templateConfDir := os.Getenv("LXC_TEMPLATE_CONFIG")
if templateConfDir == "" {
templateConfDir = "/usr/share/lxc/config"
}
q := "SELECT id, architecture, type, ephemeral FROM containers WHERE name=?"
arg1 := []interface{}{name}
arg2 := []interface{}{&d.id, &d.architecture, &d.cType, &ephemInt}
err := dbQueryRowScan(daemon.db, q, arg1, arg2)
if err != nil {
return nil, err
}
if d.id == -1 {
return nil, fmt.Errorf("Unknown container")
}
if ephemInt == 1 {
d.ephemeral = true
}
c, err := lxc.NewContainer(name, daemon.lxcpath)
if err != nil {
return nil, err
}
d.c = c
dir := shared.LogPath(c.Name())
err = os.MkdirAll(dir, 0700)
if err != nil {
return nil, err
}
if err = d.c.SetLogFile(filepath.Join(dir, "lxc.log")); err != nil {
return nil, err
}
personality, err := shared.ArchitecturePersonality(d.architecture)
if err == nil {
err = c.SetConfigItem("lxc.arch", personality)
if err != nil {
return nil, err
}
}
err = c.SetConfigItem("lxc.include", fmt.Sprintf("%s/%s.common.conf", templateConfDir, templateConfBase))
if err != nil {
return nil, err
}
if !d.isPrivileged() {
err = c.SetConfigItem("lxc.include", fmt.Sprintf("%s/%s.userns.conf", templateConfDir, templateConfBase))
if err != nil {
return nil, err
}
}
config, err := dbGetConfig(daemon.db, d.id)
if err != nil {
return nil, err
}
d.config = config
profiles, err := dbGetProfiles(daemon.db, d.id)
if err != nil {
return nil, err
}
d.profiles = profiles
d.devices = shared.Devices{}
d.name = name
rootfsPath := shared.VarPath("lxc", name, "rootfs")
err = c.SetConfigItem("lxc.rootfs", rootfsPath)
if err != nil {
return nil, err
}
err = c.SetConfigItem("lxc.loglevel", "0")
if err != nil {
return nil, err
}
err = c.SetConfigItem("lxc.utsname", name)
if err != nil {
return nil, err
}
err = c.SetConfigItem("lxc.tty", "0")
if err != nil {
return nil, err
}
if err := setupDevLxdMount(c); err != nil {
//.........这里部分代码省略.........
示例14: ExpireLogs
func (d *Daemon) ExpireLogs() error {
entries, err := ioutil.ReadDir(shared.LogPath())
if err != nil {
return err
}
result, err := dbContainersList(d.db, cTypeRegular)
if err != nil {
return err
}
newestFile := func(path string, dir os.FileInfo) time.Time {
newest := dir.ModTime()
entries, err := ioutil.ReadDir(path)
if err != nil {
return newest
}
for _, entry := range entries {
if entry.ModTime().After(newest) {
newest = entry.ModTime()
}
}
return newest
}
for _, entry := range entries {
// Check if the container still exists
if shared.StringInSlice(entry.Name(), result) {
// Remove any log file which wasn't modified in the past 48 hours
logs, err := ioutil.ReadDir(shared.LogPath(entry.Name()))
if err != nil {
return err
}
for _, logfile := range logs {
path := shared.LogPath(entry.Name(), logfile.Name())
// Always keep the LXC config
if logfile.Name() == "lxc.conf" {
continue
}
// Deal with directories (snapshots)
if logfile.IsDir() {
newest := newestFile(path, logfile)
if time.Since(newest).Hours() >= 48 {
os.RemoveAll(path)
if err != nil {
return err
}
}
continue
}
// Individual files
if time.Since(logfile.ModTime()).Hours() >= 48 {
err := os.Remove(path)
if err != nil {
return err
}
}
}
} else {
// Empty directory if unchanged in the past 24 hours
path := shared.LogPath(entry.Name())
newest := newestFile(path, entry)
if time.Since(newest).Hours() >= 24 {
err := os.RemoveAll(path)
if err != nil {
return err
}
}
}
}
return nil
}
示例15: LogPathGet
func (c *containerLXD) LogPathGet() string {
return shared.LogPath(c.NameGet())
}