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
8 changes: 8 additions & 0 deletions go/internal/audit/audit.go
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,14 @@ func NewLogger(path string) (*Logger, error) {
}, nil
}

func NewNopLogger() *Logger {
f, _ := os.OpenFile(os.DevNull, os.O_WRONLY, 0644)
return &Logger{
file: f,
enc: json.NewEncoder(f),
}
}

func generateRequestID() string {
b := make([]byte, 16)
if _, err := rand.Read(b); err != nil {
Expand Down
5 changes: 5 additions & 0 deletions go/internal/policy/manager.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package policy

import (
"fmt"
"log/slog"
"os"
"path/filepath"
"strings"
Expand All @@ -22,6 +23,10 @@ func NewManager(configDir string) (*Manager, error) {

entries, err := os.ReadDir(configDir)
if err != nil {
if os.IsNotExist(err) {
slog.Warn("config dir not found, starting with empty policy set", "dir", configDir)
return m, nil
}
return nil, fmt.Errorf("failed to read config directory %s: %w", configDir, err)
}

Expand Down
4 changes: 2 additions & 2 deletions go/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -39,8 +39,8 @@ func main() {

auditLog, err := audit.NewLogger(*logFile)
if err != nil {
slog.Error("failed to initialize audit logger", "error", err)
os.Exit(1)
slog.Warn("audit logging disabled", "error", err)
auditLog = audit.NewNopLogger()
}
defer auditLog.Close()

Expand Down
11 changes: 11 additions & 0 deletions rs/src/audit.rs
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,17 @@ impl AuditLogger {
})
}

pub fn nop() -> Self {
let file = OpenOptions::new()
.create(true)
.append(true)
.open("/dev/null")
.expect("failed to open /dev/null");
AuditLogger {
file: Mutex::new(file),
}
}

pub fn allow(&self, method: &str, uri: &str) {
self.log("ALLOW", method, uri, "");
}
Expand Down
8 changes: 7 additions & 1 deletion rs/src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,13 @@ async fn main() -> Result<(), Box<dyn std::error::Error>> {

let router = Arc::new(proxy::Router::new(policy_manager));
let chain = middleware::Chain::new(cli.readonly);
let audit = audit::AuditLogger::new(&cli.log_file)?;
let audit = match audit::AuditLogger::new(&cli.log_file) {
Ok(logger) => logger,
Err(e) => {
eprintln!("warn: audit logging disabled: {}", e);
audit::AuditLogger::nop()
}
};
let transport: Box<dyn transport::Transport> = Box::new(transport::UnixSocketTransport::new(&cli.docker_host));
let handler = Arc::new(handler::Handler::new(router, chain, audit, transport));

Expand Down
9 changes: 8 additions & 1 deletion rs/src/policy.rs
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,14 @@ impl Manager {

pub fn new(config_dir: &str) -> Result<Self, Box<dyn std::error::Error>> {
let mut policies_by_name = HashMap::new();
let entries = std::fs::read_dir(config_dir)?;
let entries = match std::fs::read_dir(config_dir) {
Ok(d) => d,
Err(e) if e.kind() == std::io::ErrorKind::NotFound => {
eprintln!("warn: config dir {} not found, starting with empty policy set", config_dir);
return Ok(Manager { policies_by_name });
}
Err(e) => return Err(e.into()),
};

for entry in entries {
let entry = entry?;
Expand Down
12 changes: 11 additions & 1 deletion ts/src/policy.ts
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,17 @@ export class Manager {
private policiesByName = new Map<string, Policy>();

constructor(configDir: string) {
const entries = readdirSync(configDir);
let entries: string[];
try {
entries = readdirSync(configDir);
} catch (err: any) {
if (err.code === "ENOENT") {
console.warn(`warn: config dir ${configDir} not found, starting with empty policy set`);
entries = [];
} else {
throw err;
}
}

for (const entry of entries) {
if (!entry.endsWith(".yaml") && !entry.endsWith(".yml")) continue;
Expand Down
Loading