changelog shortlog graph tags branches changeset files file revisions raw help

Mercurial > core / annotate lisp/lib/cli/tools/wg.lisp

changeset 698: 96958d3eb5b0
parent: 16a3cdc06cbc
author: Richard Westhaver <ellis@rwest.io>
date: Fri, 04 Oct 2024 22:04:59 -0400
permissions: -rw-r--r--
description: fixes
589
16a3cdc06cbc add cli/tools/wg
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
1
 ;;; wg.lisp --- WireGuard Tools
16a3cdc06cbc add cli/tools/wg
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
2
 
16a3cdc06cbc add cli/tools/wg
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
3
 ;; CLI Access to wg* tools from lisp. Requires the wireguard package.
16a3cdc06cbc add cli/tools/wg
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
4
 
16a3cdc06cbc add cli/tools/wg
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
5
 ;;; Code:
16a3cdc06cbc add cli/tools/wg
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
6
 (in-package :cli/tools/wg)
16a3cdc06cbc add cli/tools/wg
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
7
 (deferror cc-error (simple-error error) ())
16a3cdc06cbc add cli/tools/wg
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
8
 
16a3cdc06cbc add cli/tools/wg
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
9
 (defun wg-error (fmt &rest args)
16a3cdc06cbc add cli/tools/wg
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
10
   (error 'wg-error :format-arguments args :format-control fmt))
16a3cdc06cbc add cli/tools/wg
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
11
 
16a3cdc06cbc add cli/tools/wg
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
12
 (defparameter *wg* (find-exe "wg"))
16a3cdc06cbc add cli/tools/wg
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
13
 
16a3cdc06cbc add cli/tools/wg
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
14
 (defun run-wg* (args &optional (output *standard-output*) input)
16a3cdc06cbc add cli/tools/wg
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
15
   (let ((proc (if input
16a3cdc06cbc add cli/tools/wg
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
16
                   (sb-ext:run-program *wg* (or args nil) :output :stream :input input)
16a3cdc06cbc add cli/tools/wg
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
17
                   (sb-ext:run-program *wg* (or args nil) :output :stream))))
16a3cdc06cbc add cli/tools/wg
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
18
   (with-open-stream (s (sb-ext:process-output proc))
16a3cdc06cbc add cli/tools/wg
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
19
     (loop for l = (read-line s nil nil)
16a3cdc06cbc add cli/tools/wg
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
20
           while l
16a3cdc06cbc add cli/tools/wg
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
21
           do (write-string l  output)))
16a3cdc06cbc add cli/tools/wg
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
22
   (if (eq 0 (sb-ext:process-exit-code proc))
16a3cdc06cbc add cli/tools/wg
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
23
       nil
16a3cdc06cbc add cli/tools/wg
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
24
       (wg-error "WG command failed: ~A ~A" *wg* (or args "")))))
16a3cdc06cbc add cli/tools/wg
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
25
 
16a3cdc06cbc add cli/tools/wg
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
26
 (defun run-wg (&rest args)
16a3cdc06cbc add cli/tools/wg
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
27
   (run-wg* args))
16a3cdc06cbc add cli/tools/wg
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
28
 
16a3cdc06cbc add cli/tools/wg
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
29
 (defun wg-private-key ()
16a3cdc06cbc add cli/tools/wg
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
30
   (with-output-to-string (s)
16a3cdc06cbc add cli/tools/wg
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
31
     (run-wg* '("genkey") s)))
16a3cdc06cbc add cli/tools/wg
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
32
 
16a3cdc06cbc add cli/tools/wg
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
33
 (defun wg-public-key (private-key)
16a3cdc06cbc add cli/tools/wg
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
34
   (with-output-to-string (public-key)
16a3cdc06cbc add cli/tools/wg
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
35
     (with-input-from-string (s private-key)
16a3cdc06cbc add cli/tools/wg
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
36
       (run-wg* '("pubkey") public-key s))))
16a3cdc06cbc add cli/tools/wg
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
37
 
16a3cdc06cbc add cli/tools/wg
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
38
 (defun wg-generate-keys ()
16a3cdc06cbc add cli/tools/wg
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
39
   "Generate a wireguard keypair, returning (values PUBLIC-KEY PRIVATE-KEY)."
16a3cdc06cbc add cli/tools/wg
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
40
   (let* ((privkey (wg-private-key))
16a3cdc06cbc add cli/tools/wg
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
41
          (pubkey (wg-public-key privkey)))
16a3cdc06cbc add cli/tools/wg
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
42
     (values pubkey privkey)))
16a3cdc06cbc add cli/tools/wg
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
43
 
16a3cdc06cbc add cli/tools/wg
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
44
 
16a3cdc06cbc add cli/tools/wg
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
45
 (defun wg-generate-key-files (&optional (private "private.key") (public "public.key"))
16a3cdc06cbc add cli/tools/wg
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
46
   (multiple-value-bind (pubkey privkey) (wg-generate-keys)
16a3cdc06cbc add cli/tools/wg
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
47
     (with-umask #o077
16a3cdc06cbc add cli/tools/wg
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
48
       (log:trace! "setting umask to 077")
16a3cdc06cbc add cli/tools/wg
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
49
       (with-open-file (f public :direction :output)
16a3cdc06cbc add cli/tools/wg
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
50
         (write-line pubkey f))
16a3cdc06cbc add cli/tools/wg
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
51
       (with-open-file (f private :direction :output)
16a3cdc06cbc add cli/tools/wg
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
52
         (write-line privkey f)))))
16a3cdc06cbc add cli/tools/wg
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
53