a73x

cmd/nono-proxy/main.go

Ref:   Size: 1.4 KiB

package main

import (
	"fmt"
	"log"
	"net/http"
	"os"
	"path/filepath"

	"github.com/xanderle/nono/ca"
	"github.com/xanderle/nono/proxy"
	"github.com/xanderle/nono/scanner"
)

func main() {
	store := storePath()

	if len(os.Args) > 1 && os.Args[1] == "allow" {
		if len(os.Args) < 3 {
			fmt.Fprintln(os.Stderr, "usage: nono-proxy allow <host>")
			os.Exit(1)
		}
		hostsFile := filepath.Join(store, "approved_hosts")
		if err := proxy.Allow(hostsFile, os.Args[2]); err != nil {
			log.Fatalf("failed to allow host: %v", err)
		}
		fmt.Printf("allowed %s\n", os.Args[2])
		return
	}

	addr := ":9854"
	os.MkdirAll(store, 0755)

	hostsFile := filepath.Join(store, "approved_hosts")
	rulesPath := filepath.Join(store, "rules.yaml")

	if err := scanner.WriteDefaultRules(rulesPath); err != nil {
		log.Fatalf("failed to write default rules: %v", err)
	}

	caCert, caKey, err := ca.LoadOrCreate(store)
	if err != nil {
		log.Fatalf("failed to load/create CA: %v", err)
	}
	log.Printf("CA cert: %s/ca.pem", store)

	opts := []proxy.Option{
		proxy.WithRules(rulesPath),
		proxy.WithCA(caCert, caKey),
	}

	p := proxy.New(hostsFile, opts...)
	log.Printf("nono-proxy listening on %s (hosts: %s, rules: %s)", addr, hostsFile, rulesPath)
	log.Fatal(http.ListenAndServe(addr, p))
}

func storePath() string {
	store := os.Getenv("NONO_STORE")
	if store == "" {
		home, _ := os.UserHomeDir()
		store = filepath.Join(home, ".local", "share", "nono")
	}
	return store
}