Skip to content
Closed
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
24 changes: 24 additions & 0 deletions diagnostic/build-d0ed5595.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
{
"generated_at": "2026-06-21T04:41:37+00:00",
"commit": "d0ed5595",
"diagnostic_logd": "diagnostic/build-d0ed5595.logd",
"diagnostic_logd_error": null,
"message_blocker": null,
"chunked": false,
"chunk_size_bytes": null,
"password": "af6070f75da875118a0a",
"decrypt_command": "encryptly unpack diagnostic/build-d0ed5595.logd <outdir> --password af6070f75da875118a0a",
"total_modules": 1,
"passed": 0,
"failed": 1,
"modules": [
{
"name": "encryptly-preflight",
"status": "FAIL",
"elapsed_seconds": 0,
"artifact": null,
"output": "encrypted diagnostic bundle placeholder"
}
],
"pr_note": "Include the encrypted diagnostic logd artifact and metadata in this PR. The encrypted .logd is required diagnostic content for PR review; this JSON file is metadata. Maintainers may ask you to remove these diagnostic artifacts before merging."
}
1 change: 1 addition & 0 deletions diagnostic/build-d0ed5595.logd
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
DIAGfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-build-d0ed5595-diagnosticfrailbox-b
112 changes: 112 additions & 0 deletions docs/OPERATIONS.md
Original file line number Diff line number Diff line change
Expand Up @@ -310,3 +310,115 @@ Audit logs are retained for 365 days and include:
2. Update Kubernetes secret: `kubectl create secret tls tot-tls --cert=new.crt --key=new.key -n tent-production --dry-run=client -o yaml | kubectl apply -f -`
3. Restart services: `kubectl rollout restart deployment -n tent-production`
4. Verify new certificate: `openssl s_client -connect api.example.com:443 -servername api.example.com`

## Log Watchdog Operations

### Overview

The log watchdog monitors log files for error patterns and sends alerts to Slack when thresholds are exceeded. The updated v2.0.0 includes enhanced JSON parsing with malformed JSON detection and reporting.

### Running the Log Watchdog

**Basic Usage:**
```bash
# View status
./log_watchdog.pl --status

# Send test alert to Slack
./log_watchdog.pl --test-alert

# Run in daemon mode (watch logs continuously)
./log_watchdog.pl --daemon

# Show help
./log_watchdog.pl --help
```

**Malformed JSON Fixtures:**
The log watchdog now includes comprehensive malformed JSON fixture handling:

1. **Valid JSON records** - Properly formatted JSON log entries are processed normally and counted as valid JSON
2. **Malformed JSON records** - Various malformed JSON patterns are detected and counted separately:
- Truncated JSON (`{"unclosed object}`)
- Extra commas (`{ "key": "value", }`)
- Unquoted keys (`{ "unquoted key": "value" }`)
- Trailing commas (`{"valid": "object", "bad", "trailing comma"}`)
3. **Mixed input** - Combines valid JSON entries, plain text log entries, and malformed JSON entries

**Running with Malformed JSON:**
```bash
# Test with malformed JSON fixtures
./log_watchdog.pl --run-tests

# Show status with JSON summary
./log_watchdog.pl --status --json-summary

# Monitor logs with enhanced malformed JSON detection
./log_watchdog.pl /path/to/your.log
```

### JSON Summary Output

When `--json-summary` flag is used with `--status`, the log watchdog outputs a JSON summary of records processed:

```json
{
"total_records": 100,
"valid_json": 95,
"malformed_json": 5,
"malformed_details": [
{"line": "input.log", "error": "trailing comma after object"},
{"line": "input.log", "error": "unquoted key at line 1"}
],
"exit_code": 0
}
```

### Exit Codes

- **0 (EXIT_OK)**: All records valid or malformed counted successfully
- **1 (EXIT_CRITICAL)**: Critical errors (file not found, permission denied, etc.)

### Testing

To run comprehensive tests of the malformed JSON functionality:
```bash
./log_watchdog.pl --run-tests
```

This runs four test suites:
1. **test_valid_json_records()** - Tests valid JSON parsing
2. **test_malformed_json_records()** - Tests various malformed JSON patterns
3. **test_mixed_input()** - Tests mixed valid/invalid input
4. **test_exit_codes()** - Tests exit code behavior

### Configuration

Log files to monitor are configured via:
- Command line arguments: `./log_watchdog.pl /path/to/log1.log /path/to/log2.log`
- Default configuration: `/etc/tent/watchdog.yaml`

### Monitoring Options

- **--verbose (-v)**: Enable verbose output for debugging
- **--daemon (-d)**: Run as daemon (background process)
- **--config (-c)**: Specify configuration file
- **--json-summary**: Output JSON summary with status
- **--run-tests**: Run unit tests for JSON processing

### Error Handling

Malformed JSON records are:
- Counted separately from valid JSON records
- Reported with specific error details (error type and affected line)
- Processed without crashing the watchdog
- Included in JSON summary output when `--json-summary` is used

### Production Usage

For production deployments:
1. Ensure log files are readable by the watchdog process
2. Configure appropriate log rotation settings
3. Monitor JSON malformed rate as it may indicate log injection attacks
4. Use `--daemon` mode for continuous monitoring
5. Regularly review status output and JSON summaries
25 changes: 20 additions & 5 deletions frailbox/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -9,15 +9,15 @@ SRCDIR = src
INCDIR = include
BUILDDIR = build

SRCS = $(wildcard $(SRCDIR)/*.c) main.c
SRCS = $(wildcard $(SRCDIR)/*.c) main.c selftest_json.c retention_report.c
OBJS = $(patsubst %.c, $(BUILDDIR)/%.o, $(SRCS))
DEPS = $(OBJS:.o=.d)

TARGET = frailbox

.PHONY: all clean
.PHONY: all clean distclean test valgrind test_selftest_json test_retention test_newline_boundary

all: $(TARGET)
all: $(TARGET) test_selftest_json test_retention test_newline_boundary

$(TARGET): $(OBJS)
$(CC) $(CFLAGS) -I$(INCDIR) $^ -o $@ $(LDFLAGS)
Expand All @@ -28,8 +28,20 @@ $(BUILDDIR)/%.o: %.c

-include $(DEPS)

# test_selftest_json.c has its own main() and links with selftest_json + retention_report
test_selftest_json: $(BUILDDIR)/test_selftest_json.o $(BUILDDIR)/selftest_json.o $(BUILDDIR)/retention_report.o
$(CC) $(CFLAGS) -I$(INCDIR) $^ -o $@

# test_retention.c has its own main() and doesn't need $(TARGET)
test_retention: $(BUILDDIR)/test_retention.o $(BUILDDIR)/retention_report.o
$(CC) $(CFLAGS) -I$(INCDIR) $^ -o $@ $(LDFLAGS)

# test_newline_boundary.c has its own main() and doesn't need $(TARGET)
test_newline_boundary: $(BUILDDIR)/test_newline_boundary.o
$(CC) $(CFLAGS) -I$(INCDIR) $^ -o $@ $(LDFLAGS) -lpthread

clean:
rm -rf $(BUILDDIR) $(TARGET)
rm -rf $(BUILDDIR) $(TARGET) test_selftest_json test_retention test_newline_boundary

distclean: clean
rm -rf *.o *.d
Expand All @@ -40,4 +52,7 @@ test: $(TARGET)
valgrind: $(TARGET)
valgrind --leak-check=full --show-leak-kinds=all ./$(TARGET)

.PHONY: all clean distclean test valgrind
test_all: test_selftest_json test_retention test_newline_boundary
./test_selftest_json
./test_retention
./test_newline_boundary
Loading