chore: auto-commit uncommitted changes
|
|
@ -0,0 +1,96 @@
|
||||||
|
# Clovis — build pipeline
|
||||||
|
# FIPS 140-3: BoringCrypto via GOEXPERIMENT=boringcrypto
|
||||||
|
# Requires Go 1.24+ (verified: go1.24.0)
|
||||||
|
#
|
||||||
|
# Usage:
|
||||||
|
# make deploy — build + test + restart vault
|
||||||
|
# make deploy-vault — build + test + restart vault only
|
||||||
|
# make cli — build CLI binary
|
||||||
|
# make status — check what's running
|
||||||
|
|
||||||
|
GOEXPERIMENT := boringcrypto
|
||||||
|
export GOEXPERIMENT
|
||||||
|
|
||||||
|
VAULT_DIR := clovis-vault
|
||||||
|
CLI_DIR := clovis-cli
|
||||||
|
CRYPTO_DIR := clovis-crypto
|
||||||
|
|
||||||
|
VAULT_BIN := $(VAULT_DIR)/clavitor
|
||||||
|
CLI_BIN := $(CLI_DIR)/clovis-cli
|
||||||
|
|
||||||
|
VAULT_ENTRY := ./cmd/clavitor
|
||||||
|
|
||||||
|
LDFLAGS := -s -w
|
||||||
|
GOFLAGS := -trimpath
|
||||||
|
|
||||||
|
.PHONY: all vault cli test clean deploy deploy-vault \
|
||||||
|
restart restart-vault stop stop-vault status verify-fips
|
||||||
|
|
||||||
|
# --- build ---
|
||||||
|
|
||||||
|
all: vault cli
|
||||||
|
|
||||||
|
vault:
|
||||||
|
cp $(CRYPTO_DIR)/*.js $(VAULT_DIR)/cmd/vault1984/web/ 2>/dev/null || true
|
||||||
|
sed -i 's/__BUILD_TIME__/$(shell date -u +%Y%m%d-%H%M%S)/' $(VAULT_DIR)/cmd/vault1984/web/index.html 2>/dev/null || true
|
||||||
|
cd $(VAULT_DIR) && go build $(GOFLAGS) -ldflags '$(LDFLAGS)' -o clavitor $(VAULT_ENTRY)
|
||||||
|
@echo "built $(VAULT_BIN) (FIPS)"
|
||||||
|
|
||||||
|
cli:
|
||||||
|
$(MAKE) -C $(CLI_DIR)
|
||||||
|
@strip $(CLI_BIN) 2>/dev/null || true
|
||||||
|
@echo "built $(CLI_BIN) ($$(wc -c < $(CLI_BIN)) bytes, stripped)"
|
||||||
|
|
||||||
|
# --- test ---
|
||||||
|
|
||||||
|
test:
|
||||||
|
cd $(VAULT_DIR) && go test ./api/... -v
|
||||||
|
|
||||||
|
# --- deploy ---
|
||||||
|
|
||||||
|
deploy: vault cli test verify-fips restart-vault
|
||||||
|
@echo "--- deployed ---"
|
||||||
|
|
||||||
|
deploy-vault: vault test verify-fips restart-vault
|
||||||
|
@echo "--- vault deployed ---"
|
||||||
|
|
||||||
|
# --- verify ---
|
||||||
|
|
||||||
|
verify-fips: verify-fips-vault
|
||||||
|
|
||||||
|
verify-fips-vault:
|
||||||
|
@go version -m $(VAULT_BIN) | grep -q 'GOEXPERIMENT=boringcrypto' && echo "vault: FIPS 140-3 (BoringCrypto) ✓" || { echo "vault: BoringCrypto NOT linked ✗"; exit 1; }
|
||||||
|
|
||||||
|
# --- process management ---
|
||||||
|
|
||||||
|
stop-vault:
|
||||||
|
@pkill -f './clavitor$$' 2>/dev/null || pkill -f 'clovis-vault/clavitor$$' 2>/dev/null || true
|
||||||
|
@sleep 0.5
|
||||||
|
|
||||||
|
stop: stop-vault
|
||||||
|
|
||||||
|
restart-vault: stop-vault
|
||||||
|
cd $(VAULT_DIR) && set -a && . ./.env && set +a && nohup ./clavitor > /tmp/clovis-vault.log 2>&1 &
|
||||||
|
@sleep 1
|
||||||
|
@ss -tlnp | grep -q ':1984' && echo "vault running on :1984 ✓" || { echo "vault failed to start ✗"; cat /tmp/clovis-vault.log; exit 1; }
|
||||||
|
|
||||||
|
restart: restart-vault
|
||||||
|
|
||||||
|
status:
|
||||||
|
@echo "--- processes ---"
|
||||||
|
@ps aux | grep -E '(clavitor|clovis)' | grep -v grep || echo "nothing running"
|
||||||
|
@echo "--- ports ---"
|
||||||
|
@ss -tlnp | grep -E ':1984' || echo "no vault port open"
|
||||||
|
@echo "--- fips ---"
|
||||||
|
@go version -m $(VAULT_BIN) 2>/dev/null | grep -q 'GOEXPERIMENT=boringcrypto' && echo "vault: FIPS ✓" || echo "vault: not built or no FIPS"
|
||||||
|
|
||||||
|
# --- logs ---
|
||||||
|
|
||||||
|
logs-vault:
|
||||||
|
@tail -f /tmp/clovis-vault.log
|
||||||
|
|
||||||
|
# --- clean ---
|
||||||
|
|
||||||
|
clean:
|
||||||
|
rm -f $(VAULT_BIN)
|
||||||
|
-$(MAKE) -C $(CLI_DIR) clean 2>/dev/null || true
|
||||||
|
|
@ -0,0 +1,54 @@
|
||||||
|
# Clovis
|
||||||
|
|
||||||
|
Secure vault platform with multi-client support.
|
||||||
|
|
||||||
|
## Architecture
|
||||||
|
|
||||||
|
**Clovis is the vault server.** Everything else is a client that talks to it.
|
||||||
|
|
||||||
|
## Structure
|
||||||
|
|
||||||
|
### Active Development
|
||||||
|
| Directory | Purpose | Status |
|
||||||
|
|-----------|---------|--------|
|
||||||
|
| `clovis-vault/` | Vault server with embedded UI (Go, FIPS 140-3) | **Active** |
|
||||||
|
| `clovis-crypto/` | JavaScript crypto layer | **Active** |
|
||||||
|
| `clovis-cli/` | CLI for agents | **Active** |
|
||||||
|
| `clovis-chrome/` | Chrome browser extension | **Active** |
|
||||||
|
|
||||||
|
### Planned
|
||||||
|
| Directory | Purpose | Status |
|
||||||
|
|-----------|---------|--------|
|
||||||
|
| `clovis-firefox/` | Firefox browser extension | Announced |
|
||||||
|
| `clovis-safari/` | Safari browser extension | Announced |
|
||||||
|
| `clovis-ios/` | iOS native app | Announced |
|
||||||
|
| `clovis-android/` | Android native app | Announced |
|
||||||
|
|
||||||
|
## Build
|
||||||
|
|
||||||
|
```bash
|
||||||
|
make deploy # Build + test + restart everything
|
||||||
|
make deploy-vault # Build + test + restart vault only
|
||||||
|
make deploy-web # Build + restart website only
|
||||||
|
make status # Check running processes
|
||||||
|
make logs-vault # Tail vault logs
|
||||||
|
make logs-web # Tail web logs
|
||||||
|
```
|
||||||
|
|
||||||
|
## Clients
|
||||||
|
|
||||||
|
The vault supports multiple client types:
|
||||||
|
- **Web**: Built-in UI served by vault (`clovis-vault/`)
|
||||||
|
- **CLI**: Command-line tool for automation/agents (`clovis-cli/`)
|
||||||
|
- **Browser Extension**: Auto-fill and TOTP in Chrome (`clovis-chrome/`)
|
||||||
|
- **Mobile**: Native iOS/Android apps (planned)
|
||||||
|
|
||||||
|
## Security
|
||||||
|
|
||||||
|
- FIPS 140-3 validated crypto (BoringCrypto via GOEXPERIMENT)
|
||||||
|
- Zero-knowledge architecture
|
||||||
|
- Vault server is the single source of truth
|
||||||
|
|
||||||
|
## License
|
||||||
|
|
||||||
|
Proprietary — © Clavitor
|
||||||
|
|
@ -0,0 +1,10 @@
|
||||||
|
# Clovis Android
|
||||||
|
|
||||||
|
Android application for Clovis vault.
|
||||||
|
|
||||||
|
**Status:** Planned, not yet implemented.
|
||||||
|
|
||||||
|
Will require native Kotlin development for:
|
||||||
|
- Autofill Framework integration
|
||||||
|
- Android Keystore access
|
||||||
|
- TOTP generation
|
||||||
|
|
@ -0,0 +1,5 @@
|
||||||
|
# Clovis Chrome Extension
|
||||||
|
|
||||||
|
Browser extension for Chrome.
|
||||||
|
|
||||||
|
TODO: Add Chrome extension implementation.
|
||||||
|
|
@ -32,7 +32,7 @@ VENDOR_DIR := vendor
|
||||||
BEARSSL_DIR := $(VENDOR_DIR)/bearssl
|
BEARSSL_DIR := $(VENDOR_DIR)/bearssl
|
||||||
QUICKJS_DIR := $(VENDOR_DIR)/quickjs
|
QUICKJS_DIR := $(VENDOR_DIR)/quickjs
|
||||||
CJSON_DIR := $(VENDOR_DIR)/cjson
|
CJSON_DIR := $(VENDOR_DIR)/cjson
|
||||||
CRYPTO_DIR := ../crypto
|
CRYPTO_DIR := ../clovis-crypto
|
||||||
|
|
||||||
# Output binary
|
# Output binary
|
||||||
BIN := clavitor-cli
|
BIN := clavitor-cli
|
||||||
|
|
@ -0,0 +1,5 @@
|
||||||
|
# Clovis Crypto Layer
|
||||||
|
|
||||||
|
JavaScript cryptographic primitives for Clovis clients.
|
||||||
|
|
||||||
|
TODO: Add crypto implementation.
|
||||||
|
|
@ -0,0 +1,7 @@
|
||||||
|
# Clovis Firefox Extension
|
||||||
|
|
||||||
|
Browser extension for Firefox.
|
||||||
|
|
||||||
|
**Status:** Planned, not yet implemented.
|
||||||
|
|
||||||
|
This extension will share the core logic with clovis-chrome.
|
||||||
|
|
@ -0,0 +1,10 @@
|
||||||
|
# Clovis iOS
|
||||||
|
|
||||||
|
iOS application for Clovis vault.
|
||||||
|
|
||||||
|
**Status:** Planned, not yet implemented.
|
||||||
|
|
||||||
|
Will require native Swift development for:
|
||||||
|
- Password AutoFill integration
|
||||||
|
- Secure Enclave/Keychain access
|
||||||
|
- TOTP generation
|
||||||
|
|
@ -0,0 +1,8 @@
|
||||||
|
# Clovis Safari Extension
|
||||||
|
|
||||||
|
Browser extension for Safari.
|
||||||
|
|
||||||
|
**Status:** Planned, not yet implemented.
|
||||||
|
|
||||||
|
Apple's Safari extension API differs significantly from Chrome/Firefox.
|
||||||
|
May require native app wrapper for full functionality.
|
||||||
|
|
@ -4,7 +4,10 @@ REMOTE_PATH := /opt/clavitor/bin
|
||||||
|
|
||||||
export GOFIPS140 := latest
|
export GOFIPS140 := latest
|
||||||
|
|
||||||
.PHONY: build deploy
|
.PHONY: build deploy clean
|
||||||
|
|
||||||
|
clean:
|
||||||
|
rm -f $(BINARY)
|
||||||
|
|
||||||
build:
|
build:
|
||||||
rm -f $(BINARY)
|
rm -f $(BINARY)
|
||||||
|
|
@ -261,8 +261,8 @@ func TestTierIsolationDB(t *testing.T) {
|
||||||
func TestCLICrypto(t *testing.T) {
|
func TestCLICrypto(t *testing.T) {
|
||||||
// Find CLI binary via absolute path
|
// Find CLI binary via absolute path
|
||||||
home := os.Getenv("HOME")
|
home := os.Getenv("HOME")
|
||||||
cliBin := home + "/dev/clavitor/oss/cli/clavitor-cli"
|
cliBin := home + "/dev/clavitor/clovis/clovis-cli/clovis-cli"
|
||||||
cliDir := home + "/dev/clavitor/oss/cli"
|
cliDir := home + "/dev/clavitor/clovis/clovis-cli"
|
||||||
if _, err := os.Stat(cliBin); err != nil {
|
if _, err := os.Stat(cliBin); err != nil {
|
||||||
t.Skip("clavitor-cli not found — run 'make cli' first")
|
t.Skip("clavitor-cli not found — run 'make cli' first")
|
||||||
}
|
}
|
||||||
|
Before Width: | Height: | Size: 355 B After Width: | Height: | Size: 355 B |
|
Before Width: | Height: | Size: 130 KiB After Width: | Height: | Size: 130 KiB |
|
Before Width: | Height: | Size: 118 B After Width: | Height: | Size: 118 B |
|
Before Width: | Height: | Size: 87 B After Width: | Height: | Size: 87 B |
|
Before Width: | Height: | Size: 100 B After Width: | Height: | Size: 100 B |
|
After Width: | Height: | Size: 4.0 KiB |
|
|
@ -0,0 +1,4 @@
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100" width="80" height="80" role="img" aria-label="Clavitor">
|
||||||
|
<title>Clavitor</title>
|
||||||
|
<rect x="5" y="5" width="90" height="90" fill="#0A0A0A"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 212 B |
|
|
@ -101,10 +101,10 @@
|
||||||
|
|
||||||
/* Logo Lockup — The Trinity */
|
/* Logo Lockup — The Trinity */
|
||||||
.logo-lockup { display: inline-flex; gap: 20px; align-items: stretch; }
|
.logo-lockup { display: inline-flex; gap: 20px; align-items: stretch; }
|
||||||
.logo-lockup-square { width: 96px; height: 96px; background: var(--brand-black); flex-shrink: 0; }
|
.logo-lockup-square { width: 80px; height: 80px; background: var(--brand-black); flex-shrink: 0; }
|
||||||
.logo-lockup-text { display: flex; flex-direction: column; justify-content: space-between; height: 96px; padding: 8px 0 10px; }
|
.logo-lockup-text { display: flex; flex-direction: column; justify-content: space-between; height: 80px; }
|
||||||
.logo-lockup-wordmark { font-family: var(--font-family); font-size: 56px; font-weight: var(--wordmark-weight); letter-spacing: var(--wordmark-spacing); text-transform: uppercase; color: var(--brand-accent); line-height: 1; }
|
.logo-lockup-wordmark { font-family: var(--font-family); font-size: 56px; font-weight: var(--wordmark-weight); letter-spacing: var(--wordmark-spacing); text-transform: uppercase; color: var(--brand-accent); line-height: 1; }
|
||||||
.logo-lockup-tagline { font-size: 12px; font-weight: 500; color: var(--text-tertiary); letter-spacing: 0.18em; text-transform: uppercase; line-height: 1; }
|
.logo-lockup-tagline { font-size: 16px; font-weight: 500; color: var(--text-tertiary); letter-spacing: 0.22em; text-transform: uppercase; line-height: 1; margin-bottom: -2px; }
|
||||||
|
|
||||||
/* Colors */
|
/* Colors */
|
||||||
.color-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(140px, 1fr)); gap: 16px; }
|
.color-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(140px, 1fr)); gap: 16px; }
|
||||||
|
|
@ -115,14 +115,15 @@
|
||||||
|
|
||||||
/* Layout Patterns (from vault1984.com) */
|
/* Layout Patterns (from vault1984.com) */
|
||||||
.max-width { max-width: 1200px; margin: 0 auto; padding: 0 24px; }
|
.max-width { max-width: 1200px; margin: 0 auto; padding: 0 24px; }
|
||||||
.grid-2-equal { display: grid; grid-template-columns: 1fr 1fr; gap: 48px; align-items: center; }
|
.grid-2-equal { display: grid; grid-template-columns: 1fr 1fr; gap: 48px; align-items: center; overflow: visible; }
|
||||||
.grid-3-equal { display: grid; grid-template-columns: repeat(3, 1fr); gap: 32px; }
|
.grid-3-equal { display: grid; grid-template-columns: repeat(3, 1fr); gap: 32px; }
|
||||||
.grid-4-equal { display: grid; grid-template-columns: repeat(4, 1fr); gap: 24px; text-align: center; }
|
.grid-4-equal { display: grid; grid-template-columns: repeat(4, 1fr); gap: 24px; text-align: center; }
|
||||||
|
|
||||||
.pill-row { display: flex; flex-wrap: wrap; gap: 12px; }
|
.pill-row { display: flex; flex-wrap: wrap; gap: 12px; overflow: visible; }
|
||||||
.pill {
|
.pill {
|
||||||
display: inline-flex; align-items: center;
|
display: inline-flex; align-items: center;
|
||||||
height: 32px; padding: 0 16px;
|
height: 32px; padding: 0 16px;
|
||||||
|
white-space: nowrap;
|
||||||
background: var(--bg-secondary);
|
background: var(--bg-secondary);
|
||||||
border: 1px solid var(--border-default);
|
border: 1px solid var(--border-default);
|
||||||
border-radius: 9999px;
|
border-radius: 9999px;
|
||||||
|
|
@ -240,8 +241,61 @@
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<p class="text-tertiary text-xs" style="margin-top: 16px;">
|
<p class="text-tertiary text-xs" style="margin-top: 16px;">
|
||||||
<strong>Spec:</strong> 72px black square, Figtree 700, 0.25em spacing, aligned left edge to left edge
|
<strong>Spec:</strong> Square: 80×80px #0A0A0A (Black Square) · Wordmark: Figtree 700, 56px, 0.25em, #7C3AED (Violet) · Tagline: 16px, 0.22em, uppercase, #737373 (Text Tertiary)
|
||||||
</p>
|
</p>
|
||||||
|
<p style="margin-top: 12px; display: flex; gap: 24px;">
|
||||||
|
<a href="clavitor-logo.svg" download="clavitor-logo.svg" style="font-size: 14px; color: var(--brand-accent); font-weight: 500;">↓ Download clavitor-logo.svg</a>
|
||||||
|
<a href="clavitor-logo.png" download="clavitor-logo.png" style="font-size: 14px; color: var(--brand-accent); font-weight: 500;">↓ Download clavitor-logo.png (800×800)</a>
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Logo Lockup — Scale Variants -->
|
||||||
|
<div class="section">
|
||||||
|
<div class="section-title">Logo Lockup — Scale Variants</div>
|
||||||
|
|
||||||
|
<p class="text-tertiary text-xs" style="margin-bottom: 16px;">200%</p>
|
||||||
|
<div style="transform: scale(2); transform-origin: top left; margin-bottom: 180px; display: inline-block;">
|
||||||
|
<div class="logo-lockup">
|
||||||
|
<div class="logo-lockup-square"></div>
|
||||||
|
<div class="logo-lockup-text">
|
||||||
|
<div class="logo-lockup-wordmark">CLAVITOR</div>
|
||||||
|
<div class="logo-lockup-tagline">Black-box credential issuance</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<p class="text-tertiary text-xs" style="margin-bottom: 16px;">150%</p>
|
||||||
|
<div style="transform: scale(1.5); transform-origin: top left; margin-bottom: 80px; display: inline-block;">
|
||||||
|
<div class="logo-lockup">
|
||||||
|
<div class="logo-lockup-square"></div>
|
||||||
|
<div class="logo-lockup-text">
|
||||||
|
<div class="logo-lockup-wordmark">CLAVITOR</div>
|
||||||
|
<div class="logo-lockup-tagline">Black-box credential issuance</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<p class="text-tertiary text-xs" style="margin-bottom: 16px;">100%</p>
|
||||||
|
<div style="margin-bottom: 40px; display: inline-block;">
|
||||||
|
<div class="logo-lockup">
|
||||||
|
<div class="logo-lockup-square"></div>
|
||||||
|
<div class="logo-lockup-text">
|
||||||
|
<div class="logo-lockup-wordmark">CLAVITOR</div>
|
||||||
|
<div class="logo-lockup-tagline">Black-box credential issuance</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<p class="text-tertiary text-xs" style="margin-bottom: 16px;">50%</p>
|
||||||
|
<div style="transform: scale(0.5); transform-origin: top left; margin-bottom: -20px; display: inline-block;">
|
||||||
|
<div class="logo-lockup">
|
||||||
|
<div class="logo-lockup-square"></div>
|
||||||
|
<div class="logo-lockup-text">
|
||||||
|
<div class="logo-lockup-wordmark">CLAVITOR</div>
|
||||||
|
<div class="logo-lockup-tagline">Black-box credential issuance</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- Brand Colors -->
|
<!-- Brand Colors -->
|
||||||
|
|
@ -367,3 +421,6 @@
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
>
|
>
|
||||||
|
|
||||||
|
</html>
|
||||||
|
>
|
||||||
|
|
|
||||||
119
oss/Makefile
|
|
@ -1,119 +0,0 @@
|
||||||
# clavitor — build pipeline
|
|
||||||
# FIPS 140-3: BoringCrypto via GOEXPERIMENT=boringcrypto
|
|
||||||
# Requires Go 1.24+ (verified: go1.24.0)
|
|
||||||
#
|
|
||||||
# Usage:
|
|
||||||
# make deploy — build + test + restart everything
|
|
||||||
# make deploy-app — build + test + restart app only
|
|
||||||
# make deploy-web — build + restart website only
|
|
||||||
# make status — check what's running
|
|
||||||
|
|
||||||
GOEXPERIMENT := boringcrypto
|
|
||||||
export GOEXPERIMENT
|
|
||||||
|
|
||||||
APP_DIR := app
|
|
||||||
WEB_DIR := website
|
|
||||||
CLI_DIR := cli
|
|
||||||
APP_BIN := $(APP_DIR)/clavitor
|
|
||||||
WEB_BIN := $(WEB_DIR)/clavitor-web
|
|
||||||
CLI_BIN := $(CLI_DIR)/clavitor-cli
|
|
||||||
APP_ENTRY := ./cmd/vault1984
|
|
||||||
WEB_ENTRY := .
|
|
||||||
|
|
||||||
LDFLAGS := -s -w
|
|
||||||
GOFLAGS := -trimpath
|
|
||||||
|
|
||||||
.PHONY: all app website cli test clean deploy deploy-app deploy-web \
|
|
||||||
restart restart-app restart-web stop stop-app stop-web status verify-fips
|
|
||||||
|
|
||||||
# --- build ---
|
|
||||||
|
|
||||||
all: app website
|
|
||||||
|
|
||||||
app:
|
|
||||||
cp crypto/*.js $(APP_DIR)/cmd/vault1984/web/
|
|
||||||
sed -i 's/__BUILD_TIME__/$(shell date -u +%Y%m%d-%H%M%S)/' $(APP_DIR)/cmd/vault1984/web/index.html
|
|
||||||
cd $(APP_DIR) && go build $(GOFLAGS) -ldflags '$(LDFLAGS)' -o clavitor $(APP_ENTRY)
|
|
||||||
@echo "built $(APP_BIN) (FIPS)"
|
|
||||||
|
|
||||||
website:
|
|
||||||
cd $(WEB_DIR) && go build $(GOFLAGS) -ldflags '$(LDFLAGS)' -o clavitor-web $(WEB_ENTRY)
|
|
||||||
@echo "built $(WEB_BIN) (FIPS)"
|
|
||||||
|
|
||||||
cli:
|
|
||||||
$(MAKE) -C $(CLI_DIR)
|
|
||||||
@strip $(CLI_BIN) 2>/dev/null || true
|
|
||||||
@echo "built $(CLI_BIN) ($$(wc -c < $(CLI_BIN)) bytes, stripped)"
|
|
||||||
|
|
||||||
# --- test ---
|
|
||||||
|
|
||||||
test:
|
|
||||||
cd $(APP_DIR) && go test ./api/... -v
|
|
||||||
|
|
||||||
# --- deploy ---
|
|
||||||
|
|
||||||
deploy: all test verify-fips restart
|
|
||||||
@echo "--- deployed ---"
|
|
||||||
|
|
||||||
deploy-app: app test verify-fips-app restart-app
|
|
||||||
@echo "--- app deployed ---"
|
|
||||||
|
|
||||||
deploy-web: website verify-fips-web restart-web
|
|
||||||
@echo "--- website deployed ---"
|
|
||||||
|
|
||||||
# --- verify ---
|
|
||||||
|
|
||||||
verify-fips: verify-fips-app verify-fips-web
|
|
||||||
|
|
||||||
verify-fips-app:
|
|
||||||
@go version -m $(APP_BIN) | grep -q 'GOEXPERIMENT=boringcrypto' && echo "app: FIPS 140-3 (BoringCrypto) ✓" || { echo "app: BoringCrypto NOT linked ✗"; exit 1; }
|
|
||||||
|
|
||||||
verify-fips-web:
|
|
||||||
@go version -m $(WEB_BIN) | grep -q 'GOEXPERIMENT=boringcrypto' && echo "web: FIPS 140-3 (BoringCrypto) ✓" || { echo "web: BoringCrypto NOT linked ✗"; exit 1; }
|
|
||||||
|
|
||||||
# --- process management ---
|
|
||||||
|
|
||||||
stop-app:
|
|
||||||
@pkill -f './clavitor$$' 2>/dev/null || pkill -f 'clavitor/clavitor$$' 2>/dev/null || true
|
|
||||||
@sleep 0.5
|
|
||||||
|
|
||||||
stop-web:
|
|
||||||
@pkill -f 'clavitor-web$$' 2>/dev/null || true
|
|
||||||
@sleep 0.5
|
|
||||||
|
|
||||||
stop: stop-app stop-web
|
|
||||||
|
|
||||||
restart-app: stop-app
|
|
||||||
cd $(APP_DIR) && set -a && . ./.env && set +a && nohup ./clavitor > /tmp/clavitor.log 2>&1 &
|
|
||||||
@sleep 1
|
|
||||||
@ss -tlnp | grep -q ':1984' && echo "app running on :1984 ✓" || { echo "app failed to start ✗"; cat /tmp/clavitor.log; exit 1; }
|
|
||||||
|
|
||||||
restart-web: stop-web
|
|
||||||
cd $(WEB_DIR) && nohup ./clavitor-web > /tmp/clavitor-web.log 2>&1 &
|
|
||||||
@sleep 1
|
|
||||||
@ss -tlnp | grep -q ':8099' && echo "website running on :8099 ✓" || { echo "website failed to start ✗"; cat /tmp/clavitor-web.log; exit 1; }
|
|
||||||
|
|
||||||
restart: restart-app restart-web
|
|
||||||
|
|
||||||
status:
|
|
||||||
@echo "--- processes ---"
|
|
||||||
@ps aux | grep -E 'clavitor(-web)?$$' | grep -v grep || echo "nothing running"
|
|
||||||
@echo "--- ports ---"
|
|
||||||
@ss -tlnp | grep -E ':1984|:8099' || echo "no ports open"
|
|
||||||
@echo "--- fips ---"
|
|
||||||
@go version -m $(APP_BIN) 2>/dev/null | grep -q 'GOEXPERIMENT=boringcrypto' && echo "app: FIPS ✓" || echo "app: not built or no FIPS"
|
|
||||||
@go version -m $(WEB_BIN) 2>/dev/null | grep -q 'GOEXPERIMENT=boringcrypto' && echo "web: FIPS ✓" || echo "web: not built or no FIPS"
|
|
||||||
|
|
||||||
# --- logs ---
|
|
||||||
|
|
||||||
logs-app:
|
|
||||||
@tail -f /tmp/clavitor.log
|
|
||||||
|
|
||||||
logs-web:
|
|
||||||
@tail -f /tmp/clavitor-web.log
|
|
||||||
|
|
||||||
# --- clean ---
|
|
||||||
|
|
||||||
clean:
|
|
||||||
rm -f $(APP_BIN) $(WEB_BIN)
|
|
||||||
$(MAKE) -C $(CLI_DIR) clean
|
|
||||||