Skip to content

Commit

Permalink
feat: add 'log' flag
Browse files Browse the repository at this point in the history
  • Loading branch information
nixpig committed Oct 2, 2024
1 parent 5a5cccb commit 6eda7a6
Show file tree
Hide file tree
Showing 5 changed files with 115 additions and 59 deletions.
122 changes: 96 additions & 26 deletions cmd/cmd.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,14 +5,16 @@ import (
"encoding/json"
"fmt"
"os"
"path/filepath"
"strconv"

"github.com/nixpig/brownie/internal/commands"
"github.com/nixpig/brownie/pkg"
"github.com/rs/zerolog"
"github.com/spf13/cobra"
)

func RootCmd(log *zerolog.Logger) *cobra.Command {
func RootCmd() *cobra.Command {
root := &cobra.Command{
Use: "brownie",
Short: "An experimental Linux container runtime.",
Expand All @@ -22,20 +24,27 @@ func RootCmd(log *zerolog.Logger) *cobra.Command {
}

root.AddCommand(
createCmd(log),
startCmd(log),
stateCmd(log),
deleteCmd(log),
killCmd(log),
forkCmd(log),
createCmd(),
startCmd(),
stateCmd(),
deleteCmd(),
killCmd(),
forkCmd(),
)

root.CompletionOptions.HiddenDefaultCmd = true

root.PersistentFlags().StringP(
"log",
"l",
filepath.Join(pkg.BrownieRootDir, "logs", "brownie.log"),
"Location of log file",
)

return root
}

func createCmd(log *zerolog.Logger) *cobra.Command {
func createCmd() *cobra.Command {
create := &cobra.Command{
Use: "create [flags] CONTAINER_ID",
Short: "Create a container",
Expand All @@ -60,10 +69,15 @@ func createCmd(log *zerolog.Logger) *cobra.Command {
}

opts := &commands.CreateOpts{
ID: containerID,
Bundle: bundle,
ConsoleSocketPath: consoleSocket,
PIDFile: pidFile,
ID: containerID,
Bundle: bundle,
ConsoleSocket: consoleSocket,
PIDFile: pidFile,
}

log, err := createLogger(cmd)
if err != nil {
return err
}

return commands.Create(opts, log)
Expand All @@ -78,7 +92,7 @@ func createCmd(log *zerolog.Logger) *cobra.Command {
return create
}

func startCmd(log *zerolog.Logger) *cobra.Command {
func startCmd() *cobra.Command {
start := &cobra.Command{
Use: "start [flags] CONTAINER_ID",
Short: "Start a container",
Expand All @@ -93,13 +107,18 @@ func startCmd(log *zerolog.Logger) *cobra.Command {
ID: containerID,
}

log, err := createLogger(cmd)
if err != nil {
return err
}

return commands.Start(opts, log)
}

return start
}

func killCmd(log *zerolog.Logger) *cobra.Command {
func killCmd() *cobra.Command {
kill := &cobra.Command{
Use: "kill [flags] CONTAINER_ID SIGNAL",
Short: "Kill a container",
Expand All @@ -114,15 +133,20 @@ func killCmd(log *zerolog.Logger) *cobra.Command {
Signal: signal,
}

log, err := createLogger(cmd)
if err != nil {
return err
}

return commands.Kill(opts, log)
},
}

return kill
}

func deleteCmd(log *zerolog.Logger) *cobra.Command {
delete := &cobra.Command{
func deleteCmd() *cobra.Command {
del := &cobra.Command{
Use: "delete [flags] CONTAINER_ID",
Short: "Delete a container",
Args: cobra.ExactArgs(1),
Expand All @@ -140,16 +164,21 @@ func deleteCmd(log *zerolog.Logger) *cobra.Command {
Force: force,
}

log, err := createLogger(cmd)
if err != nil {
return err
}

return commands.Delete(opts, log)
},
}

delete.Flags().BoolP("force", "f", false, "force delete")
del.Flags().BoolP("force", "f", false, "force delete")

return delete
return del
}

func forkCmd(log *zerolog.Logger) *cobra.Command {
func forkCmd() *cobra.Command {
fork := &cobra.Command{
Use: "fork [flags] CONTAINER_ID INIT_SOCK_ADDR CONTAINER_SOCK_ADDR",
Short: "Fork container process\n\n \033[31m ⚠ FOR INTERNAL USE ONLY - DO NOT RUN DIRECTLY ⚠ \033[0m",
Expand All @@ -159,16 +188,21 @@ func forkCmd(log *zerolog.Logger) *cobra.Command {
RunE: func(cmd *cobra.Command, args []string) error {
containerID := args[0]
initSockAddr := args[1]
consoleSocketFD := args[2]
iconsolesocketfd, err := strconv.Atoi(consoleSocketFD)

consoleSocketFD, err := strconv.Atoi(args[2])
if err != nil {
return fmt.Errorf("convert console socket fd to int: %w", err)
}

opts := &commands.ForkOpts{
ID: containerID,
InitSockAddr: initSockAddr,
ConsoleSocketFD: iconsolesocketfd,
ConsoleSocketFD: consoleSocketFD,
}

log, err := createLogger(cmd)
if err != nil {
return err
}

return commands.Fork(opts, log)
Expand All @@ -178,7 +212,7 @@ func forkCmd(log *zerolog.Logger) *cobra.Command {
return fork
}

func stateCmd(log *zerolog.Logger) *cobra.Command {
func stateCmd() *cobra.Command {
state := &cobra.Command{
Use: "state [flags] CONTAINER_ID",
Short: "Query a container state",
Expand All @@ -191,18 +225,54 @@ func stateCmd(log *zerolog.Logger) *cobra.Command {
ID: containerID,
}

log, err := createLogger(cmd)
if err != nil {
return err
}

state, err := commands.State(opts, log)
if err != nil {
return err
}

var prettified bytes.Buffer
json.Indent(&prettified, []byte(state), "", " ")
var formattedState bytes.Buffer
json.Indent(&formattedState, []byte(state), "", " ")

if _, err := cmd.OutOrStdout().Write(
formattedState.Bytes(),
); err != nil {
return err
}

fmt.Fprint(cmd.OutOrStdout(), prettified.String())
return nil
},
}

return state
}

func createLogger(cmd *cobra.Command) (*zerolog.Logger, error) {
logPath, err := cmd.InheritedFlags().GetString("log")
if err != nil {
return nil, err
}

logDir, _ := filepath.Split(logPath)

if err := os.MkdirAll(logDir, 0666); err != nil {
return nil, fmt.Errorf("create log dir: %w", err)
}

logFile, err := os.OpenFile(
logPath,
os.O_APPEND|os.O_CREATE|os.O_WRONLY,
0644,
)
if err != nil {
return nil, fmt.Errorf("open log file: %w", err)
}

log := zerolog.New(logFile).With().Timestamp().Logger()

return &log, nil
}
12 changes: 6 additions & 6 deletions internal/commands/create.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,10 +17,10 @@ import (
)

type CreateOpts struct {
ID string
Bundle string
ConsoleSocketPath string
PIDFile string
ID string
Bundle string
ConsoleSocket string
PIDFile string
}

func Create(opts *CreateOpts, log *zerolog.Logger) error {
Expand Down Expand Up @@ -60,10 +60,10 @@ func Create(opts *CreateOpts, log *zerolog.Logger) error {
}
defer closer()

useTerminal := container.Spec.Process != nil && container.Spec.Process.Terminal && opts.ConsoleSocketPath != ""
useTerminal := container.Spec.Process != nil && container.Spec.Process.Terminal && opts.ConsoleSocket != ""
var termFD int
if useTerminal {
termSock, err := terminal.New(opts.ConsoleSocketPath)
termSock, err := terminal.New(opts.ConsoleSocket)
if err != nil {
return fmt.Errorf("create terminal socket: %w", err)
}
Expand Down
9 changes: 7 additions & 2 deletions internal/state.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,15 @@ import (

"github.com/nixpig/brownie/pkg"
"github.com/opencontainers/runtime-spec/specs-go"
"github.com/rs/zerolog"
)

func GetState(containerID string) (*specs.State, error) {
containerPath := filepath.Join(pkg.BrownieRootDir, "containers", containerID)
type StateOpts struct {
ID string
}

func GetState(opts *StateOpts, log *zerolog.Logger) (*specs.State, error) {
containerPath := filepath.Join(pkg.BrownieRootDir, "containers", opts.ID)

stateJSON, err := os.ReadFile(filepath.Join(containerPath, "state.json"))
if err != nil {
Expand Down
27 changes: 3 additions & 24 deletions main.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,36 +3,15 @@ package main
import (
"fmt"
"os"
"path/filepath"

"github.com/nixpig/brownie/cmd"
"github.com/nixpig/brownie/pkg"
"github.com/rs/zerolog"
)

func main() {
err := os.MkdirAll(filepath.Join(pkg.BrownieRootDir, "logs"), 0666)
if err != nil {
fmt.Println("create log dir: %w", err)
os.Exit(1)
}

logfile, err := os.OpenFile(
filepath.Join(pkg.BrownieRootDir, "logs", "brownie.log"),
os.O_APPEND|os.O_CREATE|os.O_WRONLY,
0644,
)
if err != nil {
fmt.Println("open log file: %w", err)
os.Exit(1)
}

log := zerolog.New(logfile).With().Timestamp().Logger()

rootCmd := cmd.RootCmd(&log)

if err := rootCmd.Execute(); err != nil {
if err := cmd.RootCmd().Execute(); err != nil {
fmt.Println(err)
os.Exit(1)
}

os.Exit(0)
}
4 changes: 3 additions & 1 deletion pkg/config.go
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
package pkg

const BrownieRootDir = "/var/lib/brownie"
const (
BrownieRootDir = "/var/lib/brownie"
)

0 comments on commit 6eda7a6

Please sign in to comment.