summaryrefslogtreecommitdiff
path: root/gnu
diff options
context:
space:
mode:
Diffstat (limited to 'gnu')
-rw-r--r--gnu/local.mk1
-rw-r--r--gnu/packages/networking.scm95
-rw-r--r--gnu/packages/patches/yggdrasil-extra-config.patch86
3 files changed, 182 insertions, 0 deletions
diff --git a/gnu/local.mk b/gnu/local.mk
index 72f81a9913..3a8f1e30fc 100644
--- a/gnu/local.mk
+++ b/gnu/local.mk
@@ -1725,6 +1725,7 @@ dist_patch_DATA = \
%D%/packages/patches/xsane-fix-snprintf-buffer-length.patch \
%D%/packages/patches/xsane-support-ipv6.patch \
%D%/packages/patches/xsane-tighten-default-umask.patch \
+ %D%/packages/patches/yggdrasil-extra-config.patch \
%D%/packages/patches/zziplib-CVE-2018-16548.patch
MISC_DISTRO_FILES = \
diff --git a/gnu/packages/networking.scm b/gnu/packages/networking.scm
index fefb9a5bf8..f94c3e410f 100644
--- a/gnu/packages/networking.scm
+++ b/gnu/packages/networking.scm
@@ -97,6 +97,7 @@
#:use-module (gnu packages glib)
#:use-module (gnu packages gnome)
#:use-module (gnu packages gnupg)
+ #:use-module (gnu packages golang)
#:use-module (gnu packages graphviz)
#:use-module (gnu packages gstreamer)
#:use-module (gnu packages gtk)
@@ -3821,3 +3822,97 @@ stamps.")
client and server. It allows you to use remote block devices over a TCP/IP
network.")
(license license:gpl2)))
+
+(define-public yggdrasil
+ (package
+ (name "yggdrasil")
+ (version "0.3.15")
+ (source
+ (origin
+ (method git-fetch)
+ (uri
+ (git-reference
+ (url "https://github.com/yggdrasil-network/yggdrasil-go")
+ (commit (string-append "v" version))
+ (recursive? #t)))
+ (file-name (git-file-name name version))
+ (sha256
+ (base32
+ "0gk7gy8yq5nrnblv4imxzzm2hac4ri0hlw19ajfbc1zll5kj32gf"))
+ (patches (search-patches "yggdrasil-extra-config.patch"))))
+ (build-system go-build-system)
+ (arguments
+ '(#:import-path "github.com/yggdrasil-network/yggdrasil-go"
+ ;; TODO: figure out how tests are run
+ #:tests? #f
+ #:install-source? #f
+ #:phases (modify-phases %standard-phases
+ (replace 'build
+ (lambda _
+ (for-each
+ (lambda (c)
+ (invoke
+ "go" "build" "-v" "-ldflags=-s -w"
+ (string-append
+ "github.com/yggdrasil-network/yggdrasil-go/cmd/" c)))
+ (list "yggdrasil" "yggdrasilctl"))
+ #t))
+ (replace 'install
+ (lambda* (#:key outputs #:allow-other-keys)
+ (let* ((out (assoc-ref outputs "out"))
+ (bin (string-append out "/bin/"))
+ (doc (string-append out "/share/doc/yggdrasil/")))
+ (mkdir-p bin)
+ (for-each
+ (lambda (f)
+ (install-file f bin))
+ (list "yggdrasil" "yggdrasilctl"))
+ (mkdir-p doc)
+ (copy-recursively
+ (string-append
+ "src/github.com/yggdrasil-network/yggdrasil-go/"
+ "doc/yggdrasil-network.github.io")
+ doc))
+ #t)))))
+ ;; https://github.com/kardianos/minwinsvc is windows only
+ (propagated-inputs
+ `(("go-github-com-arceliar-phony" ,go-github-com-arceliar-phony)
+ ("go-github-com-cheggaaa-pb" ,go-github-com-cheggaaa-pb)
+ ("go-github-com-gologme-log" ,go-github-com-gologme-log)
+ ("go-github-com-hashicorp-go-syslog" ,go-github-com-hashicorp-go-syslog)
+ ("go-github-com-hjson-hjson-go" ,go-github-com-hjson-hjson-go)
+ ("go-github-com-kardianos-minwinsvc" ,go-github-com-kardianos-minwinsvc)
+ ("go-github-com-mitchellh-mapstructure"
+ ,go-github-com-mitchellh-mapstructure)
+ ("go-golang-org-x-crypto" ,go-golang-org-x-crypto)
+ ("go-golang-org-x-net" ,go-golang-org-x-net)
+ ("go-golang-org-x-text" ,go-golang-org-x-text)
+ ("go-golang-zx2c4-com-wireguard" ,go-golang-zx2c4-com-wireguard)
+ ("go-netlink" ,go-netlink)
+ ("go-netns" ,go-netns)))
+ (home-page "https://yggdrasil-network.github.io/blog.html")
+ (synopsis
+ "Experiment in scalable routing as an encrypted IPv6 overlay network")
+ (description
+ "Yggdrasil is an early-stage implementation of a fully end-to-end encrypted
+IPv6 network. It is lightweight, self-arranging, supported on multiple
+platforms and allows pretty much any IPv6-capable application to communicate
+securely with other Yggdrasil nodes. Yggdrasil does not require you to have
+IPv6 Internet connectivity - it also works over IPv4.")
+ (license
+ ;; As a special exception to the GNU Lesser General Public License
+ ;; version 3 ("LGPL3"), the copyright holders of this Library give you
+ ;; permission to convey to a third party a Combined Work that links
+ ;; statically or dynamically to this Library without providing any Minimal
+ ;; Corresponding Source or Minimal Application Code as set out in 4d or
+ ;; providing the installation information set out in section 4e, provided
+ ;; that you comply with the other provisions of LGPL3 and provided that you
+ ;; meet, for the Application the terms and conditions of the license(s)
+ ;; which apply to the Application. Except as stated in this special
+ ;; exception, the provisions of LGPL3 will continue to comply in full to
+ ;; this Library. If you modify this Library, you may apply this exception
+ ;; to your version of this Library, but you are not obliged to do so. If
+ ;; you do not wish to do so, delete this exception statement from your
+ ;; version. This exception does not (and cannot) modify any license terms
+ ;; which apply to the Application, with which you must still comply
+ license:lgpl3)))
diff --git a/gnu/packages/patches/yggdrasil-extra-config.patch b/gnu/packages/patches/yggdrasil-extra-config.patch
new file mode 100644
index 0000000000..c21ca29a84
--- /dev/null
+++ b/gnu/packages/patches/yggdrasil-extra-config.patch
@@ -0,0 +1,86 @@
+diff --git a/cmd/yggdrasil/main.go b/cmd/yggdrasil/main.go
+index 813e950..08d35cc 100644
+--- a/cmd/yggdrasil/main.go
++++ b/cmd/yggdrasil/main.go
+@@ -40,11 +40,12 @@ type node struct {
+ admin module.Module // admin.AdminSocket
+ }
+
+-func readConfig(useconf *bool, useconffile *string, normaliseconf *bool) *config.NodeConfig {
++func readConfig(useconf *bool, useconffile *string, extraconffile *string, normaliseconf *bool) *config.NodeConfig {
+ // Use a configuration file. If -useconf, the configuration will be read
+ // from stdin. If -useconffile, the configuration will be read from the
+ // filesystem.
+ var conf []byte
++ var extraconf []byte
+ var err error
+ if *useconffile != "" {
+ // Read the file from the filesystem
+@@ -56,6 +57,21 @@ func readConfig(useconf *bool, useconffile *string, normaliseconf *bool) *config
+ if err != nil {
+ panic(err)
+ }
++ if *extraconffile != "" {
++ extraconf, err = ioutil.ReadFile(*extraconffile);
++ }
++ if err != nil {
++ panic(err)
++ }
++ // Generate a new configuration - this gives us a set of sane defaults -
++ // then parse the configuration we loaded above on top of it. The effect
++ // of this is that any configuration item that is missing from the provided
++ // configuration will use a sane default.
++ cfg := config.GenerateConfig()
++ var confs [2][]byte
++ confs[0]=conf
++ confs[1]=extraconf
++ for _, conf := range confs { if len(conf)>0 {
+ // If there's a byte order mark - which Windows 10 is now incredibly fond of
+ // throwing everywhere when it's converting things into UTF-16 for the hell
+ // of it - remove it and decode back down into UTF-8. This is necessary
+@@ -69,11 +85,6 @@ func readConfig(useconf *bool, useconffile *string, normaliseconf *bool) *config
+ panic(err)
+ }
+ }
+- // Generate a new configuration - this gives us a set of sane defaults -
+- // then parse the configuration we loaded above on top of it. The effect
+- // of this is that any configuration item that is missing from the provided
+- // configuration will use a sane default.
+- cfg := config.GenerateConfig()
+ var dat map[string]interface{}
+ if err := hjson.Unmarshal(conf, &dat); err != nil {
+ panic(err)
+@@ -112,6 +123,7 @@ func readConfig(useconf *bool, useconffile *string, normaliseconf *bool) *config
+ if err = mapstructure.Decode(dat, &cfg); err != nil {
+ panic(err)
+ }
++ }}
+ return cfg
+ }
+
+@@ -164,6 +176,7 @@ func main() {
+ genconf := flag.Bool("genconf", false, "print a new config to stdout")
+ useconf := flag.Bool("useconf", false, "read HJSON/JSON config from stdin")
+ useconffile := flag.String("useconffile", "", "read HJSON/JSON config from specified file path")
++ extraconffile := flag.String("extraconffile", "", "extra (usually private) HJSON/JSON config from specified file path")
+ normaliseconf := flag.Bool("normaliseconf", false, "use in combination with either -useconf or -useconffile, outputs your configuration normalised")
+ confjson := flag.Bool("json", false, "print configuration from -genconf or -normaliseconf as JSON instead of HJSON")
+ autoconf := flag.Bool("autoconf", false, "automatic mode (dynamic IP, peer with IPv6 neighbors)")
+@@ -187,7 +200,7 @@ func main() {
+ cfg = config.GenerateConfig()
+ case *useconffile != "" || *useconf:
+ // Read the configuration from either stdin or from the filesystem
+- cfg = readConfig(useconf, useconffile, normaliseconf)
++ cfg = readConfig(useconf, useconffile, extraconffile, normaliseconf)
+ // If the -normaliseconf option was specified then remarshal the above
+ // configuration and print it back to stdout. This lets the user update
+ // their configuration file with newly mapped names (like above) or to
+@@ -332,7 +345,7 @@ func main() {
+ goto exit
+ case _ = <-r:
+ if *useconffile != "" {
+- cfg = readConfig(useconf, useconffile, normaliseconf)
++ cfg = readConfig(useconf, useconffile, extraconffile, normaliseconf)
+ logger.Infoln("Reloading configuration from", *useconffile)
+ n.core.UpdateConfig(cfg)
+ n.tuntap.UpdateConfig(cfg)