mirror of
https://github.com/hanzoai/dev.git
synced 2026-10-17 15:34:54 +00:00
`codex-cli/` published `@hanzo/dev`, so the directory carrying our npm package was named after someone else's product. It is `npm/`. `patches/codex.json` is `patches/upstream.json` — it anchors edits against upstream, and the file should say so rather than name one of them. Deleted outright: `justfile`, whose first line was `set working-directory := "codex-rs"` for a directory this repository has never had; `announcement_tip.toml`, an example file for a TUI we do not ship; and `.codex/` and `.code/`, which held upstream's own process skills — babysit-pr, codex-bug, pushing-ci-changes — that were never ours. Three branding leaks a real run turned up, none of which the help text showed: `dev exec` announced "OpenAI Codex v0.7.0-dev.1" as its first line, the status card was missed when the session header was anchored, and both bubblewrap warnings said "Codex's Linux sandbox". README: say what ships. It claimed the agent drives a browser, which is the port that has not landed, and showed a screenshot of it doing so. Both are gone until the bridge is back. The model count is "hundreds" — `/v1/models` answers 458 today, an earlier line here said "over 500", and hanzo.ai derives its own count precisely because typed ones drift. Document the npm install beside the curl one; both give the same build.
116 lines
3.8 KiB
Bash
116 lines
3.8 KiB
Bash
#!/bin/bash
|
|
set -euo pipefail # Exit on error, undefined vars, and pipeline failures
|
|
IFS=$'\n\t' # Stricter word splitting
|
|
|
|
# Read allowed domains from file
|
|
ALLOWED_DOMAINS_FILE="/etc/codex/allowed_domains.txt"
|
|
if [ -f "$ALLOWED_DOMAINS_FILE" ]; then
|
|
ALLOWED_DOMAINS=()
|
|
while IFS= read -r domain; do
|
|
ALLOWED_DOMAINS+=("$domain")
|
|
done < "$ALLOWED_DOMAINS_FILE"
|
|
echo "Using domains from file: ${ALLOWED_DOMAINS[*]}"
|
|
else
|
|
# Fallback to default domains
|
|
ALLOWED_DOMAINS=("api.openai.com")
|
|
echo "Domains file not found, using default: ${ALLOWED_DOMAINS[*]}"
|
|
fi
|
|
|
|
# Ensure we have at least one domain
|
|
if [ ${#ALLOWED_DOMAINS[@]} -eq 0 ]; then
|
|
echo "ERROR: No allowed domains specified"
|
|
exit 1
|
|
fi
|
|
|
|
# Flush existing rules and delete existing ipsets
|
|
iptables -F
|
|
iptables -X
|
|
iptables -t nat -F
|
|
iptables -t nat -X
|
|
iptables -t mangle -F
|
|
iptables -t mangle -X
|
|
ipset destroy allowed-domains 2>/dev/null || true
|
|
|
|
# First allow DNS and localhost before any restrictions
|
|
# Allow outbound DNS
|
|
iptables -A OUTPUT -p udp --dport 53 -j ACCEPT
|
|
# Allow inbound DNS responses
|
|
iptables -A INPUT -p udp --sport 53 -j ACCEPT
|
|
# Allow localhost
|
|
iptables -A INPUT -i lo -j ACCEPT
|
|
iptables -A OUTPUT -o lo -j ACCEPT
|
|
|
|
# Create ipset with CIDR support
|
|
ipset create allowed-domains hash:net
|
|
|
|
# Resolve and add other allowed domains
|
|
for domain in "${ALLOWED_DOMAINS[@]}"; do
|
|
echo "Resolving $domain..."
|
|
ips=$(dig +short A "$domain")
|
|
if [ -z "$ips" ]; then
|
|
echo "ERROR: Failed to resolve $domain"
|
|
exit 1
|
|
fi
|
|
|
|
while read -r ip; do
|
|
if [[ ! "$ip" =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]; then
|
|
echo "ERROR: Invalid IP from DNS for $domain: $ip"
|
|
exit 1
|
|
fi
|
|
echo "Adding $ip for $domain"
|
|
ipset add allowed-domains "$ip"
|
|
done < <(echo "$ips")
|
|
done
|
|
|
|
# Get host IP from default route
|
|
HOST_IP=$(ip route | grep default | cut -d" " -f3)
|
|
if [ -z "$HOST_IP" ]; then
|
|
echo "ERROR: Failed to detect host IP"
|
|
exit 1
|
|
fi
|
|
|
|
HOST_NETWORK=$(echo "$HOST_IP" | sed "s/\.[0-9]*$/.0\/24/")
|
|
echo "Host network detected as: $HOST_NETWORK"
|
|
|
|
# Set up remaining iptables rules
|
|
iptables -A INPUT -s "$HOST_NETWORK" -j ACCEPT
|
|
iptables -A OUTPUT -d "$HOST_NETWORK" -j ACCEPT
|
|
|
|
# Set default policies to DROP first
|
|
iptables -P INPUT DROP
|
|
iptables -P FORWARD DROP
|
|
iptables -P OUTPUT DROP
|
|
|
|
# First allow established connections for already approved traffic
|
|
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
|
|
iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
|
|
|
|
# Then allow only specific outbound traffic to allowed domains
|
|
iptables -A OUTPUT -m set --match-set allowed-domains dst -j ACCEPT
|
|
|
|
# Append final REJECT rules for immediate error responses
|
|
# For TCP traffic, send a TCP reset; for UDP, send ICMP port unreachable.
|
|
iptables -A INPUT -p tcp -j REJECT --reject-with tcp-reset
|
|
iptables -A INPUT -p udp -j REJECT --reject-with icmp-port-unreachable
|
|
iptables -A OUTPUT -p tcp -j REJECT --reject-with tcp-reset
|
|
iptables -A OUTPUT -p udp -j REJECT --reject-with icmp-port-unreachable
|
|
iptables -A FORWARD -p tcp -j REJECT --reject-with tcp-reset
|
|
iptables -A FORWARD -p udp -j REJECT --reject-with icmp-port-unreachable
|
|
|
|
echo "Firewall configuration complete"
|
|
echo "Verifying firewall rules..."
|
|
if curl --connect-timeout 5 https://example.com >/dev/null 2>&1; then
|
|
echo "ERROR: Firewall verification failed - was able to reach https://example.com"
|
|
exit 1
|
|
else
|
|
echo "Firewall verification passed - unable to reach https://example.com as expected"
|
|
fi
|
|
|
|
# Always verify OpenAI API access is working
|
|
if ! curl --connect-timeout 5 https://api.openai.com >/dev/null 2>&1; then
|
|
echo "ERROR: Firewall verification failed - unable to reach https://api.openai.com"
|
|
exit 1
|
|
else
|
|
echo "Firewall verification passed - able to reach https://api.openai.com as expected"
|
|
fi
|