Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
36 changes: 16 additions & 20 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -232,59 +232,55 @@ Easily manage IPv4 and IPv6 routes, including adding, deleting, and listing rout

```bash
# Add an IPv4 network route
./fcom route add --family inet --net 10.0.0.0/24 --gw 10.0.0.1
./fcom network route add --family inet --net 10.0.0.0/24 --gw 10.0.0.1

# Add an IPv6 network route
./fcom route add --family inet6 --net 2001:db8::/64 --gw 2001:db8::1
./fcom network route add --family inet6 --net 2001:db8::/64 --gw 2001:db8::1

# Add an IPv4 network route via a specific interface
./fcom route add --family inet --net 10.0.0.0/24 --gw 10.0.0.1 --iface em0
./fcom network route add --family inet --net 10.0.0.0/24 --gw 10.0.0.1 --iface em0

# Add an IPv6 network route via a specific interface
./fcom route add --family inet6 --net 2001:db8::/64 --gw 2001:db8::1 --iface em1
./fcom network route add --family inet6 --net 2001:db8::/64 --gw 2001:db8::1 --iface em1

# Add a default IPv4 route
./fcom route add --family inet --net default --gw 192.168.1.1
./fcom network route add --family inet --net default --gw 192.168.1.1

# Add a host route (single IP)
./fcom route add --family inet --net 192.168.1.50/32 --gw 10.0.0.1
./fcom network route add --family inet --net 192.168.1.50/32 --gw 10.0.0.1
```

> **Note:** The `--iface` flag sets the outgoing interface for the route (uses FreeBSD's `-ifp` option). It is optional.

#### Delete a Route

```bash
# Delete an IPv4 network route
./fcom route del --family inet --net 10.0.0.0/24
./fcom network route del --family inet --net 10.0.0.0/24

# Delete an IPv6 network route
./fcom route del --family inet6 --net 2001:db8::/64
./fcom network route del --family inet6 --net 2001:db8::/64

# Delete a default route (will fail if it's the last default route)
./fcom route del --family inet --net default
# Output: cannot delete the last default route
# Delete a default route (if more than one exists)
./fcom network route del --family inet --net default
```

#### List Routes

```bash
# List all IPv4 routes
./fcom route list --family inet

# List IPv6 routes
./fcom route list --family inet6
./fcom network route list --family inet

# List all IPv6 routes
./fcom network route list --family inet6

# List all routes
./fcom route list
# List all routes (both families)
./fcom network route list
```

#### Example: Safe Default Route Handling

```bash
# Attempting to delete the last default route will fail:
./fcom route del --family inet --net default
./fcom network route del --family inet --net default
# Output: cannot delete the last default route
```

Expand Down
98 changes: 64 additions & 34 deletions cmd/jail.go
Original file line number Diff line number Diff line change
Expand Up @@ -29,18 +29,23 @@ var jailCreateCmd = &cobra.Command{
Mount: jailMount,
}

if err := manager.Create(cfg); err != nil {
fmt.Fprintln(os.Stderr, err)
os.Exit(1)
}

result := map[string]interface{}{
err := manager.Create(cfg)
if err != nil {
if e := internal.Output(map[string]interface{}{
"error": err.Error(),
}); e != nil {
fmt.Fprintln(os.Stderr, err)
os.Exit(1)
}
return
}
if e := internal.Output(map[string]interface{}{
"jail_id": jailName,
"status": "created",
"ip": jailIP,
"network": "br-jails", // make dynamic ?
}
if err := internal.Output(result); err != nil {
"network": "br-jails", // todo: make dynamic !
}); e != nil {
fmt.Fprintln(os.Stderr, err)
os.Exit(1)
}
},
Expand All @@ -53,15 +58,20 @@ var jailStartCmd = &cobra.Command{
manager := jail.DefaultManager()

if err := manager.Start(jailName); err != nil {
fmt.Fprintln(os.Stderr, err)
os.Exit(1)
if e := internal.Output(map[string]interface{}{
"error": err.Error(),
}); e != nil {
fmt.Fprintln(os.Stderr, err)
os.Exit(1)
}
return
}

result := map[string]interface{}{
if err := internal.Output(map[string]interface{}{
"jail_id": jailName,
"status": "started",
}
if err := internal.Output(result); err != nil {
}); err != nil {
fmt.Fprintln(os.Stderr, err)
os.Exit(1)
}
},
Expand All @@ -74,15 +84,20 @@ var jailStopCmd = &cobra.Command{
manager := jail.DefaultManager()

if err := manager.Stop(jailName); err != nil {
fmt.Fprintln(os.Stderr, err)
os.Exit(1)
if e := internal.Output(map[string]interface{}{
"error": err.Error(),
}); e != nil {
fmt.Fprintln(os.Stderr, err)
os.Exit(1)
}
return
}

result := map[string]interface{}{
if err := internal.Output(map[string]interface{}{
"jail_id": jailName,
"status": "stopped",
}
if err := internal.Output(result); err != nil {
}); err != nil {
fmt.Fprintln(os.Stderr, err)
os.Exit(1)
}
},
Expand All @@ -95,15 +110,20 @@ var jailDestroyCmd = &cobra.Command{
manager := jail.DefaultManager()

if err := manager.Destroy(jailName); err != nil {
fmt.Fprintln(os.Stderr, err)
os.Exit(1)
if e := internal.Output(map[string]interface{}{
"error": err.Error(),
}); e != nil {
fmt.Fprintln(os.Stderr, err)
os.Exit(1)
}
return
}

result := map[string]interface{}{
if err := internal.Output(map[string]interface{}{
"jail_id": jailName,
"status": "destroyed",
}
if err := internal.Output(result); err != nil {
}); err != nil {
fmt.Fprintln(os.Stderr, err)
os.Exit(1)
}
},
Expand All @@ -117,15 +137,20 @@ var jailListCmd = &cobra.Command{

jails, err := manager.List()
if err != nil {
fmt.Fprintln(os.Stderr, err)
os.Exit(1)
if e := internal.Output(map[string]interface{}{
"error": err.Error(),
}); e != nil {
fmt.Fprintln(os.Stderr, err)
os.Exit(1)
}
return
}

result := map[string]interface{}{
if err := internal.Output(map[string]interface{}{
"jails": jails,
"count": len(jails),
}
if err := internal.Output(result); err != nil {
}); err != nil {
fmt.Fprintln(os.Stderr, err)
os.Exit(1)
}
},
Expand All @@ -139,14 +164,19 @@ var jailInfoCmd = &cobra.Command{

info, err := manager.GetInfo(jailName)
if err != nil {
fmt.Fprintln(os.Stderr, err)
os.Exit(1)
if e := internal.Output(map[string]interface{}{
"error": err.Error(),
}); e != nil {
fmt.Fprintln(os.Stderr, err)
os.Exit(1)
}
return
}

result := map[string]interface{}{
if err := internal.Output(map[string]interface{}{
"jail_info": info,
}
if err := internal.Output(result); err != nil {
}); err != nil {
fmt.Fprintln(os.Stderr, err)
os.Exit(1)
}
},
Expand Down
Loading
Loading