4
0

Makefile 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183
  1. ################################################################################
  2. # Build & release helpers
  3. ################################################################################
  4. DOCKER_IMAGE_TAG_GO_RELEASER := goreleaser/goreleaser:v2.15.4
  5. # Docker builds cannot load a macOS USB PKCS#11 token. Options: (1) SKIP_CODE_SIGN=1 and skip;
  6. # (2) SIGN_HTTP_URL=http://host.docker.internal:8765 plus `make sign-server` on the host to
  7. # sign via HTTP; (3) run release-sign with host goreleaser (no Docker).
  8. SKIP_CODE_SIGN ?= 1
  9. # When set (e.g. http://host.docker.internal:8765), GoReleaser in Docker calls the host
  10. # sign_server to run PKCS#11 signing on the same bind-mounted dist/ tree.
  11. SIGN_HTTP_URL ?=
  12. SIGN_SERVER_TOKEN ?=
  13. GORELEASER ?= goreleaser
  14. GOLANGCI_LINT ?= golangci-lint
  15. DOCKER_RUN_GO_RELEASER := @docker run \
  16. --env CGO_ENABLED=0 \
  17. --env GITHUB_TOKEN=$(GITHUB_TOKEN) \
  18. --env SKIP_CODE_SIGN=$(SKIP_CODE_SIGN) \
  19. --env SIGN_HTTP_URL=$(SIGN_HTTP_URL) \
  20. --env SIGN_SERVER_TOKEN=$(SIGN_SERVER_TOKEN) \
  21. --rm \
  22. --volume `pwd`:/go/src/open-oscar-server \
  23. --workdir /go/src/open-oscar-server \
  24. $(DOCKER_IMAGE_TAG_GO_RELEASER)
  25. OSCAR_HOST ?= ras.dev
  26. # Tag of the SSL terminator image. docker-compose.yaml defaults to the same
  27. # value, so keep the two in sync when bumping nginx.
  28. NGINX_IMAGE ?= ras-nginx:1.28.0-openssl-1.0.2u
  29. # Host directory holding the web client that nginx serves.
  30. CLIENT_DIR ?= ./clients
  31. .PHONY: config
  32. config: ## Generate all config file templates from Config struct
  33. go generate ./config
  34. .PHONY: lint
  35. lint: ## Run formatting and static analysis checks
  36. @fmt_output="$$(gofmt -s -l .)"; \
  37. if [ -n "$$fmt_output" ]; then \
  38. echo "The following files need formatting:"; \
  39. echo "$$fmt_output"; \
  40. exit 1; \
  41. fi
  42. $(GOLANGCI_LINT) run ./...
  43. go vet ./...
  44. .PHONY: release
  45. release: ## Run a clean, full GoReleaser run (publish + validate)
  46. $(DOCKER_RUN_GO_RELEASER) --clean
  47. .PHONY: release-dry-run
  48. release-dry-run: ## GoReleaser dry-run (skips validate & publish)
  49. $(DOCKER_RUN_GO_RELEASER) --clean --skip=validate --skip=publish
  50. SIGN_SERVER_PORT ?= 8765
  51. .PHONY: sign-server
  52. sign-server: ## Local HTTP signer for Windows PE (run before Docker release if using SIGN_HTTP_URL)
  53. go run ./cmd/sign_server
  54. .PHONY: sign-server-stop
  55. sign-server-stop: ## Stop whatever is listening on SIGN_SERVER_PORT (usually a leftover sign_server)
  56. -@kill $$(lsof -t -iTCP:$(SIGN_SERVER_PORT) -sTCP:LISTEN) 2>/dev/null || true
  57. # Default URL for GoReleaser-in-Docker → host signing (Docker Desktop Mac/Win).
  58. # On Linux Docker, use host.docker.internal:8765 only if you add
  59. # --add-host=host.docker.internal:host-gateway to the docker run (or set SIGN_DOCKER_URL).
  60. SIGN_DOCKER_URL ?= http://host.docker.internal:8765
  61. .PHONY: release-dry-run-sign-docker
  62. release-dry-run-sign-docker: ## Dry-run in Docker; Windows Authenticode via host sign_server (run `make sign-server` first)
  63. @$(MAKE) release-dry-run SIGN_HTTP_URL=$(SIGN_DOCKER_URL)
  64. .PHONY: release-sign-docker
  65. release-sign-docker: ## Full release in Docker; Windows Authenticode via host sign_server (run `make sign-server` first)
  66. @$(MAKE) release SIGN_HTTP_URL=$(SIGN_DOCKER_URL)
  67. .PHONY: release-dry-run-nosign
  68. release-dry-run-nosign: ## GoReleaser dry-run on host without Windows Authenticode
  69. SKIP_CODE_SIGN=1 $(GORELEASER) --clean --skip=validate --skip=publish
  70. .PHONY: release-nosign
  71. release-nosign: ## Full GoReleaser on host without Windows Authenticode
  72. SKIP_CODE_SIGN=1 $(GORELEASER) --clean
  73. .PHONY: release-dry-run-sign
  74. release-dry-run-sign: ## GoReleaser dry-run on host with Windows signing (needs $(GORELEASER), PKCS#11 env)
  75. SKIP_CODE_SIGN=0 $(GORELEASER) --clean --skip=validate --skip=publish
  76. .PHONY: release-sign
  77. release-sign: ## Full GoReleaser on host with Windows signing (needs $(GORELEASER), PKCS#11 env)
  78. SKIP_CODE_SIGN=0 $(GORELEASER) --clean
  79. .PHONY: docker-image-ras
  80. docker-image-ras: ## Build Open OSCAR Server image
  81. docker build -t ras:latest -f Dockerfile .
  82. .PHONY: docker-image-nginx
  83. docker-image-nginx: ## Build nginx image pinned to v1.28.0 / OpenSSL 1.0.2u
  84. docker build -t $(NGINX_IMAGE) -f Dockerfile.nginx .
  85. .PHONY: docker-image-certgen
  86. docker-image-certgen: ## Build minimal helper image with openssl & nss tools
  87. docker build -t ras-certgen:latest -f Dockerfile.certgen .
  88. .PHONY: docker-images
  89. docker-images: docker-image-ras docker-image-nginx docker-image-certgen
  90. .PHONY: docker-run
  91. docker-run:
  92. OSCAR_HOST=$(OSCAR_HOST) NGINX_IMAGE=$(NGINX_IMAGE) CLIENT_DIR=$(CLIENT_DIR) docker compose up open-oscar-server nginx
  93. .PHONY: docker-run-bg
  94. docker-run-bg: ## Run Open OSCAR Server in background with docker-compose
  95. OSCAR_HOST=$(OSCAR_HOST) NGINX_IMAGE=$(NGINX_IMAGE) CLIENT_DIR=$(CLIENT_DIR) docker compose up -d open-oscar-server nginx
  96. .PHONY: docker-run-stop
  97. docker-run-stop: ## Stop Open OSCAR Server docker-compose services
  98. OSCAR_HOST=$(OSCAR_HOST) NGINX_IMAGE=$(NGINX_IMAGE) CLIENT_DIR=$(CLIENT_DIR) docker compose down
  99. .PHONY: run
  100. run: # run the server with plain socket config
  101. ./scripts/run_dev.sh ./config/settings.env
  102. .PHONY: run-ssl
  103. run-ssl: # run the server with ssl socket config
  104. ./scripts/run_dev.sh ./config/ssl/settings.env
  105. .PHONY: run-nginx
  106. run-nginx: # run nginx for SSL termination
  107. NGINX_IMAGE=$(NGINX_IMAGE) CLIENT_DIR=$(CLIENT_DIR) ./scripts/run_nginx.sh ./certs/server.pem
  108. ################################################################################
  109. # SSL Helpers
  110. ################################################################################
  111. .PHONY: docker-cert
  112. docker-cert: clean-certs ## Create SSL certificates for server
  113. mkdir -p certs/
  114. OSCAR_HOST=$(OSCAR_HOST) docker compose run --no-TTY --rm cert-gen
  115. .PHONY: docker-nss
  116. docker-nss: ## Create NSS certificate database for AIM 6.x clients
  117. OSCAR_HOST=$(OSCAR_HOST) docker compose run --no-TTY --rm nss-gen
  118. .PHONY: clean-certs
  119. clean-certs: ## Remove all generated certificates & NSS DB
  120. rm -rf certs/*
  121. # Root CA that docker-cert mints, and the common name it is filed under in the
  122. # keychain.
  123. CA_CERT ?= ./certs/ca.crt
  124. CA_CERT_CN ?= Open OSCAR Server Root CA
  125. .PHONY: macos-trust-ca
  126. macos-trust-ca: ## Trust $(CA_CERT) as a root in the macOS system keychain, replacing any previous copy
  127. @[ "$$(uname)" = "Darwin" ] || { echo "macos-trust-ca only runs on macOS"; exit 1; }
  128. @[ -f $(CA_CERT) ] || { echo "$(CA_CERT) not found, run 'make docker-cert' first"; exit 1; }
  129. # Authenticate before the loop below, whose 2>/dev/null would otherwise hide a
  130. # sudo password failure and report it as "no previous certificate".
  131. @sudo -v
  132. # Every prior copy goes, not just the first: delete-certificate removes one match
  133. # per call, and a stale root left behind still validates old certs.
  134. @while sudo security delete-certificate -c "$(CA_CERT_CN)" /Library/Keychains/System.keychain 2>/dev/null; do \
  135. echo "removed previous $(CA_CERT_CN)"; \
  136. done
  137. sudo security add-trusted-cert -d -r trustRoot -k /Library/Keychains/System.keychain $(CA_CERT)
  138. ################################################################################
  139. # Web Clients
  140. ################################################################################
  141. # Seconds between Wayback Machine requests. The archive throttles by refusing
  142. # connections outright, so raise this rather than retrying harder if a run
  143. # starts stalling.
  144. WAYBACK_DELAY ?= 2.5
  145. .PHONY: fetch-aim-express
  146. fetch-aim-express: ## Mirror the archived AIM Express web clients from the Wayback Machine into $(CLIENT_DIR)
  147. mkdir -p $(CLIENT_DIR)
  148. ./scripts/fetch_aimex.sh -o $(CLIENT_DIR) -d $(WAYBACK_DELAY)