mirror of
https://github.com/yggdrasil-network/yggdrasil-go.git
synced 2025-04-29 22:55:06 +03:00
changed Yggdrasil to RiV-mesh
added webview GUI
This commit is contained in:
parent
3613614b41
commit
b5ee2aa023
75 changed files with 1066 additions and 471 deletions
|
@ -37,9 +37,9 @@ jobs:
|
|||
echo 'export CIVERSIONRPM=$(sh contrib/semver/version.sh --bare | tr "-" ".")' >> $BASH_ENV
|
||||
echo 'export CIBRANCH=$(echo $CIRCLE_BRANCH | tr -d "/")' >> $BASH_ENV
|
||||
case "$CINAME" in \
|
||||
"yggdrasil") (echo 'export CICONFLICTS=yggdrasil-develop' >> $BASH_ENV) ;; \
|
||||
"yggdrasil-develop") (echo 'export CICONFLICTS=yggdrasil' >> $BASH_ENV) ;; \
|
||||
*) (echo 'export CICONFLICTS="yggdrasil yggdrasil-develop"' >> $BASH_ENV) ;; \
|
||||
"mesh") (echo 'export CICONFLICTS=mesh-develop' >> $BASH_ENV) ;; \
|
||||
"mesh-develop") (echo 'export CICONFLICTS=mesh' >> $BASH_ENV) ;; \
|
||||
*) (echo 'export CICONFLICTS="mesh mesh-develop"' >> $BASH_ENV) ;; \
|
||||
esac
|
||||
git config --global user.email "$(git log --format='%ae' HEAD -1)";
|
||||
git config --global user.name "$(git log --format='%an' HEAD -1)";
|
||||
|
@ -55,43 +55,43 @@ jobs:
|
|||
name: Test debug builds
|
||||
command: |
|
||||
./build -d
|
||||
test -f yggdrasil && test -f yggdrasilctl
|
||||
test -f mesh && test -f meshctl
|
||||
|
||||
- run:
|
||||
name: Build for Linux (including Debian packages)
|
||||
command: |
|
||||
rm -f {yggdrasil,yggdrasilctl}
|
||||
PKGARCH=amd64 sh contrib/deb/generate.sh && mv yggdrasil /tmp/upload/$CINAME-$CIVERSION-linux-amd64 && mv yggdrasilctl /tmp/upload/$CINAME-$CIVERSION-yggdrasilctl-linux-amd64;
|
||||
PKGARCH=i386 sh contrib/deb/generate.sh && mv yggdrasil /tmp/upload/$CINAME-$CIVERSION-linux-i386 && mv yggdrasilctl /tmp/upload/$CINAME-$CIVERSION-yggdrasilctl-linux-i386;
|
||||
PKGARCH=mipsel sh contrib/deb/generate.sh && mv yggdrasil /tmp/upload/$CINAME-$CIVERSION-linux-mipsel && mv yggdrasilctl /tmp/upload/$CINAME-$CIVERSION-yggdrasilctl-linux-mipsel;
|
||||
PKGARCH=mips sh contrib/deb/generate.sh && mv yggdrasil /tmp/upload/$CINAME-$CIVERSION-linux-mips && mv yggdrasilctl /tmp/upload/$CINAME-$CIVERSION-yggdrasilctl-linux-mips;
|
||||
PKGARCH=armhf sh contrib/deb/generate.sh && mv yggdrasil /tmp/upload/$CINAME-$CIVERSION-linux-armhf && mv yggdrasilctl /tmp/upload/$CINAME-$CIVERSION-yggdrasilctl-linux-armhf;
|
||||
PKGARCH=armel sh contrib/deb/generate.sh && mv yggdrasil /tmp/upload/$CINAME-$CIVERSION-linux-armel && mv yggdrasilctl /tmp/upload/$CINAME-$CIVERSION-yggdrasilctl-linux-armel;
|
||||
PKGARCH=arm64 sh contrib/deb/generate.sh && mv yggdrasil /tmp/upload/$CINAME-$CIVERSION-linux-arm64 && mv yggdrasilctl /tmp/upload/$CINAME-$CIVERSION-yggdrasilctl-linux-arm64;
|
||||
rm -f {mesh,meshctl}
|
||||
PKGARCH=amd64 sh contrib/deb/generate.sh && mv mesh /tmp/upload/$CINAME-$CIVERSION-linux-amd64 && mv meshctl /tmp/upload/$CINAME-$CIVERSION-meshctl-linux-amd64;
|
||||
PKGARCH=i386 sh contrib/deb/generate.sh && mv mesh /tmp/upload/$CINAME-$CIVERSION-linux-i386 && mv meshctl /tmp/upload/$CINAME-$CIVERSION-meshctl-linux-i386;
|
||||
PKGARCH=mipsel sh contrib/deb/generate.sh && mv mesh /tmp/upload/$CINAME-$CIVERSION-linux-mipsel && mv meshctl /tmp/upload/$CINAME-$CIVERSION-meshctl-linux-mipsel;
|
||||
PKGARCH=mips sh contrib/deb/generate.sh && mv mesh /tmp/upload/$CINAME-$CIVERSION-linux-mips && mv meshctl /tmp/upload/$CINAME-$CIVERSION-meshctl-linux-mips;
|
||||
PKGARCH=armhf sh contrib/deb/generate.sh && mv mesh /tmp/upload/$CINAME-$CIVERSION-linux-armhf && mv meshctl /tmp/upload/$CINAME-$CIVERSION-meshctl-linux-armhf;
|
||||
PKGARCH=armel sh contrib/deb/generate.sh && mv mesh /tmp/upload/$CINAME-$CIVERSION-linux-armel && mv meshctl /tmp/upload/$CINAME-$CIVERSION-meshctl-linux-armel;
|
||||
PKGARCH=arm64 sh contrib/deb/generate.sh && mv mesh /tmp/upload/$CINAME-$CIVERSION-linux-arm64 && mv meshctl /tmp/upload/$CINAME-$CIVERSION-meshctl-linux-arm64;
|
||||
mv *.deb /tmp/upload/
|
||||
|
||||
- run:
|
||||
name: Build for Linux (RPM packages)
|
||||
command: |
|
||||
git clone https://github.com/yggdrasil-network/yggdrasil-package-rpm ~/rpmbuild/SPECS
|
||||
cd ../ && tar -czvf ~/rpmbuild/SOURCES/v$CIVERSIONRPM --transform "s/project/yggdrasil-go-$CIBRANCH-$CIVERSIONRPM/" project
|
||||
sed -i "s/yggdrasil-go/yggdrasil-go-$CIBRANCH/" ~/rpmbuild/SPECS/yggdrasil.spec
|
||||
sed -i "s/^PKGNAME=yggdrasil/PKGNAME=yggdrasil-$CIBRANCH/" ~/rpmbuild/SPECS/yggdrasil.spec
|
||||
sed -i "s/^Name\:.*/Name\: $CINAME/" ~/rpmbuild/SPECS/yggdrasil.spec
|
||||
sed -i "s/^Version\:.*/Version\: $CIVERSIONRPM/" ~/rpmbuild/SPECS/yggdrasil.spec
|
||||
sed -i "s/^Conflicts\:.*/Conflicts\: $CICONFLICTS/" ~/rpmbuild/SPECS/yggdrasil.spec
|
||||
cat ~/rpmbuild/SPECS/yggdrasil.spec
|
||||
GOARCH=amd64 rpmbuild -v --nodeps --target=x86_64 -ba ~/rpmbuild/SPECS/yggdrasil.spec
|
||||
#GOARCH=386 rpmbuild -v --nodeps --target=i386 -bb ~/rpmbuild/SPECS/yggdrasil.spec
|
||||
git clone https://github.com/RiV-chain/mesh-package-rpm ~/rpmbuild/SPECS
|
||||
cd ../ && tar -czvf ~/rpmbuild/SOURCES/v$CIVERSIONRPM --transform "s/project/RiV-mesh-$CIBRANCH-$CIVERSIONRPM/" project
|
||||
sed -i "s/RiV-mesh/RiV-mesh-$CIBRANCH/" ~/rpmbuild/SPECS/mesh.spec
|
||||
sed -i "s/^PKGNAME=mesh/PKGNAME=mesh-$CIBRANCH/" ~/rpmbuild/SPECS/mesh.spec
|
||||
sed -i "s/^Name\:.*/Name\: $CINAME/" ~/rpmbuild/SPECS/mesh.spec
|
||||
sed -i "s/^Version\:.*/Version\: $CIVERSIONRPM/" ~/rpmbuild/SPECS/mesh.spec
|
||||
sed -i "s/^Conflicts\:.*/Conflicts\: $CICONFLICTS/" ~/rpmbuild/SPECS/mesh.spec
|
||||
cat ~/rpmbuild/SPECS/mesh.spec
|
||||
GOARCH=amd64 rpmbuild -v --nodeps --target=x86_64 -ba ~/rpmbuild/SPECS/mesh.spec
|
||||
#GOARCH=386 rpmbuild -v --nodeps --target=i386 -bb ~/rpmbuild/SPECS/mesh.spec
|
||||
find ~/rpmbuild/RPMS/ -name '*.rpm' -exec mv {} /tmp/upload \;
|
||||
find ~/rpmbuild/SRPMS/ -name '*.rpm' -exec mv {} /tmp/upload \;
|
||||
|
||||
- run:
|
||||
name: Build for EdgeRouter and VyOS
|
||||
command: |
|
||||
rm -f {yggdrasil,yggdrasilctl}
|
||||
git clone https://github.com/neilalexander/vyatta-yggdrasil /tmp/vyatta-yggdrasil;
|
||||
cd /tmp/vyatta-yggdrasil;
|
||||
rm -f {mesh,meshctl}
|
||||
git clone https://github.com/neilalexander/vyatta-mesh /tmp/vyatta-mesh;
|
||||
cd /tmp/vyatta-mesh;
|
||||
BUILDDIR_YGG=$CIRCLE_WORKING_DIRECTORY ./build-edgerouter-x $CIRCLE_BRANCH;
|
||||
BUILDDIR_YGG=$CIRCLE_WORKING_DIRECTORY ./build-edgerouter-lite $CIRCLE_BRANCH;
|
||||
BUILDDIR_YGG=$CIRCLE_WORKING_DIRECTORY ./build-vyos-i386 $CIRCLE_BRANCH
|
||||
|
@ -107,7 +107,7 @@ jobs:
|
|||
macos:
|
||||
xcode: "10.0.0"
|
||||
|
||||
working_directory: ~/go/src/github.com/yggdrasil-network/yggdrasil-go
|
||||
working_directory: ~/go/src/github.com/RiV-chain/RiV-mesh
|
||||
|
||||
steps:
|
||||
- checkout
|
||||
|
@ -140,8 +140,8 @@ jobs:
|
|||
name: Build for macOS
|
||||
command: |
|
||||
GO111MODULE=on GOOS=darwin GOARCH=amd64 ./build
|
||||
cp yggdrasil /tmp/upload/$CINAME-$CIVERSION-darwin-amd64
|
||||
cp yggdrasilctl /tmp/upload/$CINAME-$CIVERSION-yggdrasilctl-darwin-amd64;
|
||||
cp mesh /tmp/upload/$CINAME-$CIVERSION-darwin-amd64
|
||||
cp meshctl /tmp/upload/$CINAME-$CIVERSION-meshctl-darwin-amd64;
|
||||
|
||||
- run:
|
||||
name: Build for macOS (.pkg format)
|
||||
|
@ -152,8 +152,8 @@ jobs:
|
|||
#- run:
|
||||
# name: Build framework for iOS (.framework format)
|
||||
# command: |
|
||||
# sudo GO111MODULE=off go get -v github.com/yggdrasil-network/yggdrasil-go/cmd/...
|
||||
# sudo GO111MODULE=off go get -v github.com/yggdrasil-network/yggdrasil-go/src/...
|
||||
# sudo GO111MODULE=off go get -v github.com/RiV-chain/RiV-mesh/cmd/...
|
||||
# sudo GO111MODULE=off go get -v github.com/RiV-chain/RiV-mesh/src/...
|
||||
# GO111MODULE=off ./build -i
|
||||
# mv *.framework /tmp/upload
|
||||
|
||||
|
@ -181,23 +181,23 @@ jobs:
|
|||
- run:
|
||||
name: Build for OpenBSD
|
||||
command: |
|
||||
rm -f {yggdrasil,yggdrasilctl}
|
||||
GOOS=openbsd GOARCH=amd64 ./build && mv yggdrasil /tmp/upload/$CINAME-$CIVERSION-openbsd-amd64 && mv yggdrasilctl /tmp/upload/$CINAME-$CIVERSION-yggdrasilctl-openbsd-amd64;
|
||||
GOOS=openbsd GOARCH=386 ./build && mv yggdrasil /tmp/upload/$CINAME-$CIVERSION-openbsd-i386 && mv yggdrasilctl /tmp/upload/$CINAME-$CIVERSION-yggdrasilctl-openbsd-i386;
|
||||
rm -f {mesh,meshctl}
|
||||
GOOS=openbsd GOARCH=amd64 ./build && mv mesh /tmp/upload/$CINAME-$CIVERSION-openbsd-amd64 && mv meshctl /tmp/upload/$CINAME-$CIVERSION-meshctl-openbsd-amd64;
|
||||
GOOS=openbsd GOARCH=386 ./build && mv mesh /tmp/upload/$CINAME-$CIVERSION-openbsd-i386 && mv meshctl /tmp/upload/$CINAME-$CIVERSION-meshctl-openbsd-i386;
|
||||
|
||||
- run:
|
||||
name: Build for FreeBSD
|
||||
command: |
|
||||
rm -f {yggdrasil,yggdrasilctl}
|
||||
GOOS=freebsd GOARCH=amd64 ./build && mv yggdrasil /tmp/upload/$CINAME-$CIVERSION-freebsd-amd64 && mv yggdrasilctl /tmp/upload/$CINAME-$CIVERSION-yggdrasilctl-freebsd-amd64;
|
||||
GOOS=freebsd GOARCH=386 ./build && mv yggdrasil /tmp/upload/$CINAME-$CIVERSION-freebsd-i386 && mv yggdrasilctl /tmp/upload/$CINAME-$CIVERSION-yggdrasilctl-freebsd-i386;
|
||||
rm -f {mesh,meshctl}
|
||||
GOOS=freebsd GOARCH=amd64 ./build && mv mesh /tmp/upload/$CINAME-$CIVERSION-freebsd-amd64 && mv meshctl /tmp/upload/$CINAME-$CIVERSION-meshctl-freebsd-amd64;
|
||||
GOOS=freebsd GOARCH=386 ./build && mv mesh /tmp/upload/$CINAME-$CIVERSION-freebsd-i386 && mv meshctl /tmp/upload/$CINAME-$CIVERSION-meshctl-freebsd-i386;
|
||||
|
||||
- run:
|
||||
name: Build for Windows
|
||||
command: |
|
||||
rm -f {yggdrasil,yggdrasilctl}
|
||||
GOOS=windows GOARCH=amd64 ./build && mv yggdrasil.exe /tmp/upload/$CINAME-$CIVERSION-windows-amd64.exe && mv yggdrasilctl.exe /tmp/upload/$CINAME-$CIVERSION-yggdrasilctl-windows-amd64.exe;
|
||||
GOOS=windows GOARCH=386 ./build && mv yggdrasil.exe /tmp/upload/$CINAME-$CIVERSION-windows-i386.exe && mv yggdrasilctl.exe /tmp/upload/$CINAME-$CIVERSION-yggdrasilctl-windows-i386.exe;
|
||||
rm -f {mesh,meshctl}
|
||||
GOOS=windows GOARCH=amd64 ./build && mv mesh.exe /tmp/upload/$CINAME-$CIVERSION-windows-amd64.exe && mv meshctl.exe /tmp/upload/$CINAME-$CIVERSION-meshctl-windows-amd64.exe;
|
||||
GOOS=windows GOARCH=386 ./build && mv mesh.exe /tmp/upload/$CINAME-$CIVERSION-windows-i386.exe && mv meshctl.exe /tmp/upload/$CINAME-$CIVERSION-meshctl-windows-i386.exe;
|
||||
|
||||
- persist_to_workspace:
|
||||
root: /tmp
|
||||
|
|
104
CHANGELOG.md
104
CHANGELOG.md
|
@ -27,9 +27,9 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.
|
|||
|
||||
## [0.4.0] - 2021-07-04
|
||||
### Added
|
||||
- New routing scheme, which is backwards incompatible with previous versions of Yggdrasil
|
||||
- New routing scheme, which is backwards incompatible with previous versions of Mesh
|
||||
- The wire protocol version number, exchanged as part of the peer setup handshake, has been increased to 0.4
|
||||
- Nodes running this new version **will not** be able to peer with earlier versions of Yggdrasil
|
||||
- Nodes running this new version **will not** be able to peer with earlier versions of Mesh
|
||||
- Please note that **the network may be temporarily unstable** while infrastructure is being upgraded to the new release
|
||||
- TLS connections now use public key pinning
|
||||
- If no public key was already pinned, then the public key received as part of the TLS handshake is pinned to the connection
|
||||
|
@ -38,7 +38,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.
|
|||
### Changed
|
||||
- IP addresses are now derived from ed25519 public (signing) keys
|
||||
- Previously, addresses were derived from a hash of X25519 (Diffie-Hellman) keys
|
||||
- Importantly, this means that **all internal IPv6 addresses will change with this release** — this will affect anyone running public services or relying on Yggdrasil for remote access
|
||||
- Importantly, this means that **all internal IPv6 addresses will change with this release** — this will affect anyone running public services or relying on Mesh for remote access
|
||||
- It is now recommended to peer over TLS
|
||||
- Link-local peers from multicast peer discovery will now connect over TLS, with the key from the multicast beacon pinned to the connection
|
||||
- `socks://` peers now expect the destination endpoint to be a `tls://` listener, instead of a `tcp://` listener
|
||||
|
@ -56,7 +56,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.
|
|||
- The greedy routing scheme, used to forward all traffic in previous releases, is now only used for protocol traffic (i.e. DHT setup and source route discovery)
|
||||
- The routing logic now lives in a [standalone library](https://github.com/Arceliar/ironwood). You are encouraged **not** to use it, as it's still considered pre-alpha, but it's available for those who want to experiment with the new routing algorithm in other contexts
|
||||
- Session MTUs may be slightly lower now, in order to accommodate large packet headers if required
|
||||
- Many of the admin functions available over `yggdrasilctl` have been changed or removed as part of rewrites to the code
|
||||
- Many of the admin functions available over `meshctl` have been changed or removed as part of rewrites to the code
|
||||
- Several remote `debug` functions have been added temporarily, to allow for crawling and census gathering during the transition to the new version, but we intend to remove this at some point in the (possibly distant) future
|
||||
- The list of available functions will likely be expanded in future releases
|
||||
- The configuration file format has been updated in response to the changed/removed features
|
||||
|
@ -64,7 +64,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.
|
|||
### Removed
|
||||
- Tunnel routing (a.k.a. crypto-key routing or "CKR") has been removed
|
||||
- It was far too easy to accidentally break routing altogether by capturing the route to peers with the TUN adapter
|
||||
- We recommend tunnelling an existing standard over Yggdrasil instead (e.g. `ip6gre`, `ip6gretap` or other similar encapsulations, using Yggdrasil IPv6 addresses as the tunnel endpoints)
|
||||
- We recommend tunnelling an existing standard over Mesh instead (e.g. `ip6gre`, `ip6gretap` or other similar encapsulations, using Mesh IPv6 addresses as the tunnel endpoints)
|
||||
- All `TunnelRouting` configuration options will no longer take effect
|
||||
- Session firewall has been removed
|
||||
- This was never a true firewall — it didn't behave like a stateful IP firewall, often allowed return traffic unexpectedly and was simply a way to prevent a node from being flooded with unwanted sessions, so the name could be misleading and usually lead to a false sense of security
|
||||
|
@ -79,7 +79,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.
|
|||
|
||||
## [0.3.16] - 2021-03-18
|
||||
### Added
|
||||
- New simulation code under `cmd/yggdrasilsim` (work-in-progress)
|
||||
- New simulation code under `cmd/meshsim` (work-in-progress)
|
||||
|
||||
### Changed
|
||||
- Multi-threading in the switch
|
||||
|
@ -109,7 +109,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.
|
|||
- By encryption public key: `tcp://host:port?curve25519=key`
|
||||
- By both: `tcp://host:port?ed25519=key&curve25519=key`
|
||||
- By multiple, in case of DNS round-robin or similar: `tcp://host:port?curve25519=key&curve25519=key&ed25519=key&ed25519=key`
|
||||
- Some checks to prevent Yggdrasil-over-Yggdrasil peerings have been added
|
||||
- Some checks to prevent Mesh-over-Mesh peerings have been added
|
||||
- Added support for SOCKS proxy authentication, e.g. `socks://user@password:host/...`
|
||||
|
||||
### Fixed
|
||||
|
@ -121,7 +121,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.
|
|||
### Changed
|
||||
- `DisconnectPeer` and `RemovePeer` have been separated and implemented properly now
|
||||
- Less nodes are stored in the DHT now, reducing ambient network traffic and possible instability
|
||||
- Default config file for FreeBSD is now at `/usr/local/etc/yggdrasil.conf` instead of `/etc/yggdrasil.conf`
|
||||
- Default config file for FreeBSD is now at `/usr/local/etc/mesh.conf` instead of `/etc/mesh.conf`
|
||||
|
||||
## [0.3.14] - 2020-03-28
|
||||
### Fixed
|
||||
|
@ -136,14 +136,14 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.
|
|||
- Windows `.msi` installer files are now supported (bundling the Wireguard TUN driver)
|
||||
- NodeInfo code is now actorised, should be more reliable
|
||||
- The DHT now tries to store the two closest nodes in either direction instead of one, such that if a node goes offline, the replacement is already known
|
||||
- The Yggdrasil API now supports dialing a remote node using the public key instead of the Node ID
|
||||
- The Mesh API now supports dialing a remote node using the public key instead of the Node ID
|
||||
|
||||
### Changed
|
||||
- The `-loglevel` command line parameter is now cumulative and automatically includes all levels below the one specified
|
||||
- DHT search code has been significantly simplified and processes rumoured nodes in parallel, speeding up search time
|
||||
- DHT search results are now sorted
|
||||
- The systemd service now handles configuration generation in a different unit
|
||||
- The Yggdrasil API now returns public keys instead of node IDs when querying for local and remote addresses
|
||||
- The Mesh API now returns public keys instead of node IDs when querying for local and remote addresses
|
||||
|
||||
### Fixed
|
||||
- The multicast code no longer panics when shutting down the node
|
||||
|
@ -159,7 +159,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.
|
|||
### Added
|
||||
- New API functions `SetMaximumSessionMTU` and `GetMaximumSessionMTU`
|
||||
- New command line parameters `-address` and `-subnet` for getting the address/subnet from the config file, for use with `-useconffile` or `-useconf`
|
||||
- A warning is now produced in the Yggdrasil output at startup when the MTU in the config is invalid or has been adjusted for some reason
|
||||
- A warning is now produced in the Mesh output at startup when the MTU in the config is invalid or has been adjusted for some reason
|
||||
|
||||
### Changed
|
||||
- On Linux, outgoing `InterfacePeers` connections now use `SO_BINDTODEVICE` to prefer an outgoing interface
|
||||
|
@ -175,14 +175,14 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.
|
|||
|
||||
## [0.3.11] - 2019-10-25
|
||||
### Added
|
||||
- Support for TLS listeners and peers has been added, allowing the use of `tls://host:port` in `Peers`, `InterfacePeers` and `Listen` configuration settings - this allows hiding Yggdrasil peerings inside regular TLS connections
|
||||
- Support for TLS listeners and peers has been added, allowing the use of `tls://host:port` in `Peers`, `InterfacePeers` and `Listen` configuration settings - this allows hiding Mesh peerings inside regular TLS connections
|
||||
|
||||
### Changed
|
||||
- Go 1.13 or later is now required for building Yggdrasil
|
||||
- Go 1.13 or later is now required for building Mesh
|
||||
- Some exported API functions have been updated to work with standard Go interfaces:
|
||||
- `net.Conn` instead of `yggdrasil.Conn`
|
||||
- `net.Dialer` (the interface it would satisfy if it wasn't a concrete type) instead of `yggdrasil.Dialer`
|
||||
- `net.Listener` instead of `yggdrasil.Listener`
|
||||
- `net.Conn` instead of `mesh.Conn`
|
||||
- `net.Dialer` (the interface it would satisfy if it wasn't a concrete type) instead of `mesh.Dialer`
|
||||
- `net.Listener` instead of `mesh.Listener`
|
||||
- Session metadata is now updated correctly when a search completes for a node to which we already have an open session
|
||||
- Multicast module reloading behaviour has been improved
|
||||
|
||||
|
@ -192,20 +192,20 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.
|
|||
|
||||
## [0.3.10] - 2019-10-10
|
||||
### Added
|
||||
- The core library now includes several unit tests for peering and `yggdrasil.Conn` connections
|
||||
- The core library now includes several unit tests for peering and `mesh.Conn` connections
|
||||
|
||||
### Changed
|
||||
- On recent Linux kernels, Yggdrasil will now set the `tcp_congestion_control` algorithm used for its own TCP sockets to [BBR](https://github.com/google/bbr), which reduces latency under load
|
||||
- The systemd service configuration in `contrib` (and, by extension, some of our packages) now attempts to load the `tun` module, in case TUN/TAP support is available but not loaded, and it restricts Yggdrasil to the `CAP_NET_ADMIN` capability for managing the TUN/TAP adapter, rather than letting it do whatever the (typically `root`) user can do
|
||||
- On recent Linux kernels, Mesh will now set the `tcp_congestion_control` algorithm used for its own TCP sockets to [BBR](https://github.com/google/bbr), which reduces latency under load
|
||||
- The systemd service configuration in `contrib` (and, by extension, some of our packages) now attempts to load the `tun` module, in case TUN/TAP support is available but not loaded, and it restricts Mesh to the `CAP_NET_ADMIN` capability for managing the TUN/TAP adapter, rather than letting it do whatever the (typically `root`) user can do
|
||||
|
||||
### Fixed
|
||||
- The `yggdrasil.Conn.RemoteAddr()` function no longer blocks, fixing a deadlock when CKR is used while under heavy load
|
||||
- The `mesh.Conn.RemoteAddr()` function no longer blocks, fixing a deadlock when CKR is used while under heavy load
|
||||
|
||||
## [0.3.9] - 2019-09-27
|
||||
### Added
|
||||
- Yggdrasil will now complain more verbosely when a peer URI is incorrectly formatted
|
||||
- Mesh will now complain more verbosely when a peer URI is incorrectly formatted
|
||||
- Soft-shutdown methods have been added, allowing a node to shut down gracefully when terminated
|
||||
- New multicast interval logic which sends multicast beacons more often when Yggdrasil is first started to increase the chance of finding nearby nodes quickly after startup
|
||||
- New multicast interval logic which sends multicast beacons more often when Mesh is first started to increase the chance of finding nearby nodes quickly after startup
|
||||
|
||||
### Changed
|
||||
- The switch now buffers packets more eagerly in an attempt to give the best link a chance to send, which appears to reduce packet reordering when crossing aggregate sets of peerings
|
||||
|
@ -223,7 +223,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.
|
|||
- A race condition when dialing a remote node by both the node address and routed prefix simultaneously has been fixed
|
||||
- A race condition between the router and the dial code resulting in a panic has been fixed
|
||||
- A panic which could occur when the TUN/TAP interface disappears (e.g. during soft-shutdown) has been fixed
|
||||
- A bug in the semantic versioning script which accompanies Yggdrasil for builds has been fixed
|
||||
- A bug in the semantic versioning script which accompanies Mesh for builds has been fixed
|
||||
- A panic which could occur when the TUN/TAP interface reads an undersized/corrupted packet has been fixed
|
||||
|
||||
### Removed
|
||||
|
@ -231,7 +231,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.
|
|||
|
||||
## [0.3.8] - 2019-08-21
|
||||
### Changed
|
||||
- Yggdrasil can now send multiple packets from the switch at once, which results in improved throughput with smaller packets or lower MTUs
|
||||
- Mesh can now send multiple packets from the switch at once, which results in improved throughput with smaller packets or lower MTUs
|
||||
- Performance has been slightly improved by not allocating cancellations where not necessary
|
||||
- Crypto-key routing options have been renamed for clarity
|
||||
- `IPv4Sources` is now named `IPv4LocalSubnets`
|
||||
|
@ -243,10 +243,10 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.
|
|||
- New nonce tracking should help to reduce the number of packets dropped as a result of multiple/aggregate paths or congestion control in the switch
|
||||
|
||||
### Fixed
|
||||
- A deadlock was fixed in the session code which could result in Yggdrasil failing to pass traffic after some time
|
||||
- A deadlock was fixed in the session code which could result in Mesh failing to pass traffic after some time
|
||||
|
||||
### Security
|
||||
- Address verification was not strict enough, which could result in a malicious session sending traffic with unexpected or spoofed source or destination addresses which Yggdrasil could fail to reject
|
||||
- Address verification was not strict enough, which could result in a malicious session sending traffic with unexpected or spoofed source or destination addresses which Mesh could fail to reject
|
||||
- Versions `0.3.6` and `0.3.7` are vulnerable - users of these versions should upgrade as soon as possible
|
||||
- Versions `0.3.5` and earlier are not affected
|
||||
|
||||
|
@ -259,7 +259,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.
|
|||
### Fixed
|
||||
- A number of significant performance regressions introduced in version 0.3.6 have been fixed, resulting in better performance
|
||||
- Flow labels are now used to prioritise traffic flows again correctly
|
||||
- In low-traffic scenarios where there are multiple peerings between a pair of nodes, Yggdrasil now prefers the most active peering instead of the least active, helping to reduce packet reordering
|
||||
- In low-traffic scenarios where there are multiple peerings between a pair of nodes, Mesh now prefers the most active peering instead of the least active, helping to reduce packet reordering
|
||||
- The `Listen` statement, when configured as a string rather than an array, will now be parsed correctly
|
||||
- The admin socket now returns `coords` as a correct array of unsigned 64-bit integers, rather than the internal representation
|
||||
- The admin socket now returns `box_pub_key` in string format again
|
||||
|
@ -271,18 +271,18 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.
|
|||
|
||||
## [0.3.6] - 2019-08-03
|
||||
### Added
|
||||
- Yggdrasil now has a public API with interfaces such as `yggdrasil.ConnDialer`, `yggdrasil.ConnListener` and `yggdrasil.Conn` for using Yggdrasil as a transport directly within applications
|
||||
- Mesh now has a public API with interfaces such as `mesh.ConnDialer`, `mesh.ConnListener` and `mesh.Conn` for using Mesh as a transport directly within applications
|
||||
- Session gatekeeper functions, part of the API, which can be used to control whether to allow or reject incoming or outgoing sessions dynamically (compared to the previous fixed whitelist/blacklist approach)
|
||||
- Support for logging to files or syslog (where supported)
|
||||
- Platform defaults now include the ability to set sane defaults for multicast interfaces
|
||||
|
||||
### Changed
|
||||
- Following a massive refactoring exercise, Yggdrasil's codebase has now been broken out into modules
|
||||
- Core node functionality in the `yggdrasil` package with a public API
|
||||
- This allows Yggdrasil to be integrated directly into other applications and used as a transport
|
||||
- IP-specific code has now been moved out of the core `yggdrasil` package, making Yggdrasil effectively protocol-agnostic
|
||||
- Following a massive refactoring exercise, Mesh's codebase has now been broken out into modules
|
||||
- Core node functionality in the `mesh` package with a public API
|
||||
- This allows Mesh to be integrated directly into other applications and used as a transport
|
||||
- IP-specific code has now been moved out of the core `mesh` package, making Mesh effectively protocol-agnostic
|
||||
- Multicast peer discovery functionality is now in the `multicast` package
|
||||
- Admin socket functionality is now in the `admin` package and uses the Yggdrasil public API
|
||||
- Admin socket functionality is now in the `admin` package and uses the Mesh public API
|
||||
- TUN/TAP, ICMPv6 and all IP-specific functionality is now in the `tuntap` package
|
||||
- `PPROF` debug output is now sent to `stderr` instead of `stdout`
|
||||
- Node IPv6 addresses on macOS are now configured as `secured`
|
||||
|
@ -290,7 +290,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.
|
|||
|
||||
### Fixed
|
||||
- Multicast discovery is no longer disabled if the nominated interfaces aren't available on the system yet, e.g. during boot
|
||||
- Multicast interfaces are now re-evaluated more frequently so that Yggdrasil doesn't need to be restarted to use interfaces that have become available since startup
|
||||
- Multicast interfaces are now re-evaluated more frequently so that Mesh doesn't need to be restarted to use interfaces that have become available since startup
|
||||
- Admin socket error cases are now handled better
|
||||
- Various fixes in the TUN/TAP module, particularly surrounding Windows platform support
|
||||
- Invalid keys will now cause the node to fail to start, rather than starting but silently not working as before
|
||||
|
@ -313,9 +313,9 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.
|
|||
- New multicast behaviour where each multicast interface is given its own link-local listener and does not depend on the `Listen` configuration
|
||||
- Blocking detection in the switch to avoid parenting a blocked peer
|
||||
- Support for adding and removing listeners and multicast interfaces when reloading configuration during runtime
|
||||
- Yggdrasil will now attempt to clean up UNIX admin sockets on startup if left behind by a previous crash
|
||||
- Mesh will now attempt to clean up UNIX admin sockets on startup if left behind by a previous crash
|
||||
- Admin socket `getTunnelRouting` and `setTunnelRouting` calls for enabling and disabling crypto-key routing during runtime
|
||||
- On macOS, Yggdrasil will now try to wake up AWDL on start-up when `awdl0` is a configured multicast interface, to keep it awake after system sleep, and to stop waking it when no longer needed
|
||||
- On macOS, Mesh will now try to wake up AWDL on start-up when `awdl0` is a configured multicast interface, to keep it awake after system sleep, and to stop waking it when no longer needed
|
||||
- Added `LinkLocalTCPPort` option for controlling the port number that link-local TCP listeners will listen on by default when setting up `MulticastInterfaces` (a node restart is currently required for changes to `LinkLocalTCPPort` to take effect - it cannot be updated by reloading config during runtime)
|
||||
|
||||
### Changed
|
||||
|
@ -328,17 +328,17 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.
|
|||
|
||||
### Fixed
|
||||
- Admin socket `getTunTap` call now returns properly instead of claiming no interface is enabled in all cases
|
||||
- Handling of `getRoutes` etc in `yggdrasilctl` is now working
|
||||
- Handling of `getRoutes` etc in `meshctl` is now working
|
||||
- Local interface names are no longer leaked in multicast packets
|
||||
- Link-local TCP connections, particularly those initiated because of multicast beacons, are now always correctly scoped for the target interface
|
||||
- Yggdrasil now correctly responds to multicast interfaces going up and down during runtime
|
||||
- Mesh now correctly responds to multicast interfaces going up and down during runtime
|
||||
|
||||
## [0.3.3] - 2019-02-18
|
||||
### Added
|
||||
- Dynamic reconfiguration, which allows reloading the configuration file to make changes during runtime by sending a `SIGHUP` signal (note: this only works with `-useconffile` and not `-useconf` and currently reconfiguring TUN/TAP is not supported)
|
||||
- Support for building Yggdrasil as an iOS or Android framework if the appropriate tools (e.g. `gomobile`/`gobind` + SDKs) are available
|
||||
- Support for building Mesh as an iOS or Android framework if the appropriate tools (e.g. `gomobile`/`gobind` + SDKs) are available
|
||||
- Connection contexts used for TCP connections which allow more exotic socket options to be set, e.g.
|
||||
- Reusing the multicast socket to allow multiple running Yggdrasil instances without having to disable multicast
|
||||
- Reusing the multicast socket to allow multiple running Mesh instances without having to disable multicast
|
||||
- Allowing supported Macs to peer with other nearby Macs that aren't even on the same Wi-Fi network using AWDL
|
||||
- Flexible logging support, which allows for logging at different levels of verbosity
|
||||
|
||||
|
@ -380,37 +380,37 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.
|
|||
- Adds flags `-c`, `-l` and `-t` to `build` script for specifying `GCFLAGS`, `LDFLAGS` or whether to keep symbol/DWARF tables
|
||||
|
||||
### Changed
|
||||
- Default `AdminListen` in newly generated config is now `unix:///var/run/yggdrasil.sock`
|
||||
- Default `AdminListen` in newly generated config is now `unix:///var/run/mesh.sock`
|
||||
- Formatting of `getRoutes` in the admin socket has been improved
|
||||
- Debian package now adds `yggdrasil` group to assist with `AF_UNIX` admin socket permissions
|
||||
- Debian package now adds `mesh` group to assist with `AF_UNIX` admin socket permissions
|
||||
- Crypto, address and other utility code refactored into separate Go packages
|
||||
|
||||
### Fixed
|
||||
- Switch peer convergence is now much faster again (previously it was taking up to a minute once the peering was established)
|
||||
- `yggdrasilctl` is now less prone to crashing when parameters are specified incorrectly
|
||||
- `meshctl` is now less prone to crashing when parameters are specified incorrectly
|
||||
- Panic fixed when `Peers` or `InterfacePeers` was commented out
|
||||
|
||||
## [0.3.0] - 2018-12-12
|
||||
### Added
|
||||
- Crypto-key routing support for tunnelling both IPv4 and IPv6 over Yggdrasil
|
||||
- Crypto-key routing support for tunnelling both IPv4 and IPv6 over Mesh
|
||||
- Add advanced `SwitchOptions` in configuration file for tuning the switch
|
||||
- Add `dhtPing` to the admin socket to aid in crawling the network
|
||||
- New macOS .pkgs built automatically by CircleCI
|
||||
- Add Dockerfile to repository for Docker support
|
||||
- Add `-json` command line flag for generating and normalising configuration in plain JSON instead of HJSON
|
||||
- Build name and version numbers are now imprinted onto the build, accessible through `yggdrasil -version` and `yggdrasilctl getSelf`
|
||||
- Build name and version numbers are now imprinted onto the build, accessible through `mesh -version` and `meshctl getSelf`
|
||||
- Add ability to disable admin socket by setting `AdminListen` to `"none"`
|
||||
- `yggdrasilctl` now tries to look for the default configuration file to find `AdminListen` if `-endpoint` is not specified
|
||||
- `yggdrasilctl` now returns more useful logging in the event of a fatal error
|
||||
- `meshctl` now tries to look for the default configuration file to find `AdminListen` if `-endpoint` is not specified
|
||||
- `meshctl` now returns more useful logging in the event of a fatal error
|
||||
|
||||
### Changed
|
||||
- Switched to Chord DHT (instead of Kademlia, although still compatible at the protocol level)
|
||||
- The `AdminListen` option and `yggdrasilctl` now default to `unix:///var/run/yggdrasil.sock` on BSDs, macOS and Linux
|
||||
- The `AdminListen` option and `meshctl` now default to `unix:///var/run/mesh.sock` on BSDs, macOS and Linux
|
||||
- Cleaned up some of the parameter naming in the admin socket
|
||||
- Latency-based parent selection for the switch instead of uptime-based (should help to avoid high latency links somewhat)
|
||||
- Real peering endpoints now shown in the admin socket `getPeers` call to help identify peerings
|
||||
- Reuse the multicast port on supported platforms so that multiple Yggdrasil processes can run
|
||||
- `yggdrasilctl` now has more useful help text (with `-help` or when no arguments passed)
|
||||
- Reuse the multicast port on supported platforms so that multiple Mesh processes can run
|
||||
- `meshctl` now has more useful help text (with `-help` or when no arguments passed)
|
||||
|
||||
### Fixed
|
||||
- Memory leaks in the DHT fixed
|
||||
|
@ -444,7 +444,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.
|
|||
|
||||
## [0.2.5] - 2018-07-19
|
||||
### Changed
|
||||
- Make `yggdrasilctl` less case sensitive
|
||||
- Make `meshctl` less case sensitive
|
||||
- More verbose TCP disconnect messages
|
||||
|
||||
### Fixed
|
||||
|
@ -475,7 +475,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.
|
|||
|
||||
## [0.2.2] - 2018-06-21
|
||||
### Added
|
||||
- Add `yggdrasilconf` utility for testing with the `vyatta-yggdrasil` package.
|
||||
- Add `meshconf` utility for testing with the `vyatta-mesh` package.
|
||||
- Add a randomized retry delay after TCP disconnects, to prevent synchronization livelocks.
|
||||
|
||||
### Changed
|
||||
|
|
189
LICENSE.rtf
Normal file
189
LICENSE.rtf
Normal file
|
@ -0,0 +1,189 @@
|
|||
{\rtf1\ansi\ansicpg1251\deff0\nouicompat\deflang1049{\fonttbl{\f0\fnil\fcharset0 Roboto;}}
|
||||
{\colortbl ;\red0\green0\blue255;}
|
||||
{\*\generator Riched20 10.0.19041}\viewkind4\uc1
|
||||
\pard\sl240\slmult1\f0\fs16\lang9 This software is licensed under the LGPLv3, included below.\par
|
||||
\par
|
||||
As a special exception to the GNU Lesser General Public License version 3\par
|
||||
("LGPL3"), the copyright holders of this Library give you permission to\par
|
||||
convey to a third party a Combined Work that links statically or dynamically\par
|
||||
to this Library without providing any Minimal Corresponding Source or\par
|
||||
Minimal Application Code as set out in 4d or providing the installation\par
|
||||
information set out in section 4e, provided that you comply with the other\par
|
||||
provisions of LGPL3 and provided that you meet, for the Application the\par
|
||||
terms and conditions of the license(s) which apply to the Application.\par
|
||||
\par
|
||||
Except as stated in this special exception, the provisions of LGPL3 will\par
|
||||
continue to comply in full to this Library. If you modify this Library, you\par
|
||||
may apply this exception to your version of this Library, but you are not\par
|
||||
obliged to do so. If you do not wish to do so, delete this exception\par
|
||||
statement from your version. This exception does not (and cannot) modify any\par
|
||||
license terms which apply to the Application, with which you must still\par
|
||||
comply.\par
|
||||
\par
|
||||
GNU LESSER GENERAL PUBLIC LICENSE\par
|
||||
Version 3, 29 June 2007\par
|
||||
\par
|
||||
Copyright (C) 2007 Free Software Foundation, Inc. <{{\field{\*\fldinst{HYPERLINK "https://fsf.org/"}}{\fldrslt{https://fsf.org/\ul0\cf0}}}}\f0\fs16 >\par
|
||||
Everyone is permitted to copy and distribute verbatim copies\par
|
||||
of this license document, but changing it is not allowed.\par
|
||||
\par
|
||||
\par
|
||||
This version of the GNU Lesser General Public License incorporates\par
|
||||
the terms and conditions of version 3 of the GNU General Public\par
|
||||
License, supplemented by the additional permissions listed below.\par
|
||||
\par
|
||||
0. Additional Definitions.\par
|
||||
\par
|
||||
As used herein, "this License" refers to version 3 of the GNU Lesser\par
|
||||
General Public License, and the "GNU GPL" refers to version 3 of the GNU\par
|
||||
General Public License.\par
|
||||
\par
|
||||
"The Library" refers to a covered work governed by this License,\par
|
||||
other than an Application or a Combined Work as defined below.\par
|
||||
\par
|
||||
An "Application" is any work that makes use of an interface provided\par
|
||||
by the Library, but which is not otherwise based on the Library.\par
|
||||
Defining a subclass of a class defined by the Library is deemed a mode\par
|
||||
of using an interface provided by the Library.\par
|
||||
\par
|
||||
A "Combined Work" is a work produced by combining or linking an\par
|
||||
Application with the Library. The particular version of the Library\par
|
||||
with which the Combined Work was made is also called the "Linked\par
|
||||
Version".\par
|
||||
\par
|
||||
The "Minimal Corresponding Source" for a Combined Work means the\par
|
||||
Corresponding Source for the Combined Work, excluding any source code\par
|
||||
for portions of the Combined Work that, considered in isolation, are\par
|
||||
based on the Application, and not on the Linked Version.\par
|
||||
\par
|
||||
The "Corresponding Application Code" for a Combined Work means the\par
|
||||
object code and/or source code for the Application, including any data\par
|
||||
and utility programs needed for reproducing the Combined Work from the\par
|
||||
Application, but excluding the System Libraries of the Combined Work.\par
|
||||
\par
|
||||
1. Exception to Section 3 of the GNU GPL.\par
|
||||
\par
|
||||
You may convey a covered work under sections 3 and 4 of this License\par
|
||||
without being bound by section 3 of the GNU GPL.\par
|
||||
\par
|
||||
2. Conveying Modified Versions.\par
|
||||
\par
|
||||
If you modify a copy of the Library, and, in your modifications, a\par
|
||||
facility refers to a function or data to be supplied by an Application\par
|
||||
that uses the facility (other than as an argument passed when the\par
|
||||
facility is invoked), then you may convey a copy of the modified\par
|
||||
version:\par
|
||||
\par
|
||||
a) under this License, provided that you make a good faith effort to\par
|
||||
ensure that, in the event an Application does not supply the\par
|
||||
function or data, the facility still operates, and performs\par
|
||||
whatever part of its purpose remains meaningful, or\par
|
||||
\par
|
||||
b) under the GNU GPL, with none of the additional permissions of\par
|
||||
this License applicable to that copy.\par
|
||||
\par
|
||||
3. Object Code Incorporating Material from Library Header Files.\par
|
||||
\par
|
||||
The object code form of an Application may incorporate material from\par
|
||||
a header file that is part of the Library. You may convey such object\par
|
||||
code under terms of your choice, provided that, if the incorporated\par
|
||||
material is not limited to numerical parameters, data structure\par
|
||||
layouts and accessors, or small macros, inline functions and templates\par
|
||||
(ten or fewer lines in length), you do both of the following:\par
|
||||
\par
|
||||
a) Give prominent notice with each copy of the object code that the\par
|
||||
Library is used in it and that the Library and its use are\par
|
||||
covered by this License.\par
|
||||
\par
|
||||
b) Accompany the object code with a copy of the GNU GPL and this license\par
|
||||
document.\par
|
||||
\par
|
||||
4. Combined Works.\par
|
||||
\par
|
||||
You may convey a Combined Work under terms of your choice that,\par
|
||||
taken together, effectively do not restrict modification of the\par
|
||||
portions of the Library contained in the Combined Work and reverse\par
|
||||
engineering for debugging such modifications, if you also do each of\par
|
||||
the following:\par
|
||||
\par
|
||||
a) Give prominent notice with each copy of the Combined Work that\par
|
||||
the Library is used in it and that the Library and its use are\par
|
||||
covered by this License.\par
|
||||
\par
|
||||
b) Accompany the Combined Work with a copy of the GNU GPL and this license\par
|
||||
document.\par
|
||||
\par
|
||||
c) For a Combined Work that displays copyright notices during\par
|
||||
execution, include the copyright notice for the Library among\par
|
||||
these notices, as well as a reference directing the user to the\par
|
||||
copies of the GNU GPL and this license document.\par
|
||||
\par
|
||||
d) Do one of the following:\par
|
||||
\par
|
||||
0) Convey the Minimal Corresponding Source under the terms of this\par
|
||||
License, and the Corresponding Application Code in a form\par
|
||||
suitable for, and under terms that permit, the user to\par
|
||||
recombine or relink the Application with a modified version of\par
|
||||
the Linked Version to produce a modified Combined Work, in the\par
|
||||
manner specified by section 6 of the GNU GPL for conveying\par
|
||||
Corresponding Source.\par
|
||||
\par
|
||||
1) Use a suitable shared library mechanism for linking with the\par
|
||||
Library. A suitable mechanism is one that (a) uses at run time\par
|
||||
a copy of the Library already present on the user's computer\par
|
||||
system, and (b) will operate properly with a modified version\par
|
||||
of the Library that is interface-compatible with the Linked\par
|
||||
Version.\par
|
||||
\par
|
||||
e) Provide Installation Information, but only if you would otherwise\par
|
||||
be required to provide such information under section 6 of the\par
|
||||
GNU GPL, and only to the extent that such information is\par
|
||||
necessary to install and execute a modified version of the\par
|
||||
Combined Work produced by recombining or relinking the\par
|
||||
Application with a modified version of the Linked Version. (If\par
|
||||
you use option 4d0, the Installation Information must accompany\par
|
||||
the Minimal Corresponding Source and Corresponding Application\par
|
||||
Code. If you use option 4d1, you must provide the Installation\par
|
||||
Information in the manner specified by section 6 of the GNU GPL\par
|
||||
for conveying Corresponding Source.)\par
|
||||
\par
|
||||
5. Combined Libraries.\par
|
||||
\par
|
||||
You may place library facilities that are a work based on the\par
|
||||
Library side by side in a single library together with other library\par
|
||||
facilities that are not Applications and are not covered by this\par
|
||||
License, and convey such a combined library under terms of your\par
|
||||
choice, if you do both of the following:\par
|
||||
\par
|
||||
a) Accompany the combined library with a copy of the same work based\par
|
||||
on the Library, uncombined with any other library facilities,\par
|
||||
conveyed under the terms of this License.\par
|
||||
\par
|
||||
b) Give prominent notice with the combined library that part of it\par
|
||||
is a work based on the Library, and explaining where to find the\par
|
||||
accompanying uncombined form of the same work.\par
|
||||
\par
|
||||
6. Revised Versions of the GNU Lesser General Public License.\par
|
||||
\par
|
||||
The Free Software Foundation may publish revised and/or new versions\par
|
||||
of the GNU Lesser General Public License from time to time. Such new\par
|
||||
versions will be similar in spirit to the present version, but may\par
|
||||
differ in detail to address new problems or concerns.\par
|
||||
\par
|
||||
Each version is given a distinguishing version number. If the\par
|
||||
Library as you received it specifies that a certain numbered version\par
|
||||
of the GNU Lesser General Public License "or any later version"\par
|
||||
applies to it, you have the option of following the terms and\par
|
||||
conditions either of that published version or of any later version\par
|
||||
published by the Free Software Foundation. If the Library as you\par
|
||||
received it does not specify a version number of the GNU Lesser\par
|
||||
General Public License, you may choose any version of the GNU Lesser\par
|
||||
General Public License ever published by the Free Software Foundation.\par
|
||||
\par
|
||||
If the Library as you received it specifies that a proxy can decide\par
|
||||
whether future versions of the GNU Lesser General Public License shall\par
|
||||
apply, that proxy's public statement of acceptance of any version is\par
|
||||
permanent authorization for you to choose that version for the\par
|
||||
Library.\par
|
||||
}
|
||||
|