diff --git a/build b/build index 4e899c83..7e616199 100755 --- a/build +++ b/build @@ -4,6 +4,8 @@ set -ef PKGSRC=${PKGSRC:-github.com/RiV-chain/RiV-mesh/src/version} PKGNAME=${PKGNAME:-$(sh contrib/semver/name.sh)} PKGVER=${PKGVER:-$(sh contrib/semver/version.sh --bare)} +echo "Building: $PKGVER" + if [ "$LDFLAGS" ]; then LDFLAGS="$LDFLAGS -X $PKGSRC.buildName=$PKGNAME -X $PKGSRC.buildVersion=$PKGVER" else @@ -42,10 +44,10 @@ buildbin() { local CMD=$(realpath $1) echo "Building: $CMD for $GOOS-$GOARCH" - (cd $TARGET_PATH && go build $ARGS -ldflags "${LDFLAGS}${LDFLAGS2}" -gcflags "$GCFLAGS" $CMD) + (cd "$TARGET_PATH" && go build $ARGS -ldflags "${LDFLAGS}${LDFLAGS2}" -gcflags "$GCFLAGS" "$CMD") if [ $UPX ]; then - upx --brute $CMD + upx --brute "$CMD" fi } @@ -58,10 +60,6 @@ build_meshctl() { } build_mesh_ui() { - #only UI should be built with windowsgui flag - if [ "$GOOS" == "windows" ]; then - LDFLAGS2=" -H windowsgui" - fi buildbin ./contrib/ui/mesh-ui } diff --git a/contrib/deb/generate.sh b/contrib/deb/generate.sh index 30622c19..ed8f86fe 100644 --- a/contrib/deb/generate.sh +++ b/contrib/deb/generate.sh @@ -4,13 +4,13 @@ # mesh and enables it in systemd. You can give it the PKGARCH= argument # i.e. PKGARCH=i386 sh contrib/deb/generate.sh -if [ `pwd` != `git rev-parse --show-toplevel` ] +if [ "$(pwd)" != "$(git rev-parse --show-toplevel)" ] then echo "You should run this script from the top-level directory of the git repo" exit 1 fi -PKGBRANCH=$(basename `git name-rev --name-only HEAD`) +PKGBRANCH=$(basename "$(git name-rev --name-only HEAD)") PKG=$(sh contrib/semver/name.sh) PKGVERSION=$(sh contrib/semver/version.sh --bare) PKGARCH=${PKGARCH-amd64} @@ -113,7 +113,7 @@ EOF cp mesh /tmp/$PKGNAME/usr/bin/ cp meshctl /tmp/$PKGNAME/usr/bin/ ln -s /usr/bin/meshctl /tmp/$PKGNAME/usr/local/bin/meshctl -if [ $LOGLEVEL = "DEBUG" ]; then cp contrib/systemd/mesh-debug.service /tmp/$PKGNAME/etc/systemd/system/mesh.service +if [ "$LOGLEVEL" = "DEBUG" ]; then cp contrib/systemd/mesh-debug.service /tmp/$PKGNAME/etc/systemd/system/mesh.service else cp contrib/systemd/mesh.service /tmp/$PKGNAME/etc/systemd/system/ fi diff --git a/contrib/macos/create-pkg-gui.sh b/contrib/macos/create-pkg-gui.sh index d098fffa..df6181f7 100644 --- a/contrib/macos/create-pkg-gui.sh +++ b/contrib/macos/create-pkg-gui.sh @@ -47,11 +47,16 @@ cp meshctl pkgbuild/root/usr/local/bin cp mesh pkgbuild/root/Applications/RiV-mesh.app/Contents/MacOS cp mesh-ui pkgbuild/root/Applications/RiV-mesh.app/Contents/MacOS cp riv.icns pkgbuild/root/Applications/RiV-mesh.app/Contents/Resources -cp contrib/ui/mesh-ui/ui/index.html pkgbuild/root/Applications/RiV-mesh.app/Contents/MacOS -cp -r contrib/ui/mesh-ui/ui/assets pkgbuild/root/Applications/RiV-mesh.app/Contents/MacOS -cp -r contrib/ui/mesh-ui/ui/webfonts pkgbuild/root/Applications/RiV-mesh.app/Contents/MacOS +cp -r contrib/ui/mesh-ui/ui pkgbuild/root/Applications/RiV-mesh.app/Contents/Resources cp contrib/macos/mesh.plist pkgbuild/root/Library/LaunchDaemons +# Create open script +cat > pkgbuild/root/Applications/RiV-mesh.app/Contents/MacOS/open-mesh-ui << EOF +#!/usr/bin/env bash + +exec /Applications/RiV-mesh.app/Contents/MacOS/mesh-ui /Applications/RiV-mesh.app/Contents/Resources/ui/index.html 1>/tmp/mesh-ui.stdout.log 2>/tmp/mesh-ui.stderr.log +EOF + # Create the postinstall script cat > pkgbuild/scripts/postinstall << EOF #!/bin/sh @@ -82,7 +87,7 @@ chmod 755 pkgbuild/scripts/postinstall chmod 755 pkgbuild/root/usr/local/bin/meshctl chmod 755 pkgbuild/root/Applications/RiV-mesh.app/Contents/MacOS/mesh chmod 755 pkgbuild/root/Applications/RiV-mesh.app/Contents/MacOS/mesh-ui -chmod 755 pkgbuild/root/Applications/RiV-mesh.app/Contents/MacOS/index.html +chmod 755 pkgbuild/root/Applications/RiV-mesh.app/Contents/MacOS/open-mesh-ui # Work out metadata for the package info PKGNAME=$(sh contrib/semver/name.sh) @@ -115,13 +120,9 @@ cat > pkgbuild/root/Applications/RiV-mesh.app/Contents/Info.plist << EOF CFBundleShortVersionString ${PKGVERSION} CFBundleExecutable - mesh-ui + open-mesh-ui CFBundleIdentifier io.github.RiV-mesh.pkg - StandardOutPath - /tmp/mesh-ui.stdout.log - StandardErrorPath - /tmp/mesh-ui.stderr.log EOF diff --git a/contrib/mobile/mobile.go b/contrib/mobile/mobile.go index a9f24e83..530deea8 100644 --- a/contrib/mobile/mobile.go +++ b/contrib/mobile/mobile.go @@ -47,13 +47,17 @@ func (m *Mesh) StartJSON(configjson []byte) error { if err := json.Unmarshal(configjson, &m.config); err != nil { return err } - // Setup the Yggdrasil node itself. + // Setup the Mesh node itself. { sk, err := hex.DecodeString(m.config.PrivateKey) if err != nil { panic(err) } - options := []core.SetupOption{} + options := []core.SetupOption{ + core.NodeInfo(m.config.NodeInfo), + core.NodeInfoPrivacy(m.config.NodeInfoPrivacy), + core.NetworkDomain(m.config.NetworkDomain), + } for _, peer := range m.config.Peers { options = append(options, core.Peer{URI: peer}) } diff --git a/contrib/semver/version.sh b/contrib/semver/version.sh index d2ec6ce1..2b61ed22 100644 --- a/contrib/semver/version.sh +++ b/contrib/semver/version.sh @@ -3,9 +3,9 @@ case "$*" in *--bare*) # Remove the "v" prefix - git describe --tags --match="v[0-9]*\.[0-9]*\.[0-9]*" | cut -c 2- + git describe --tags --match="v[0-9]*\.[0-9]*\.[0-9]*" --abbrev=7 | cut -c 2- ;; *) - git describe --tags --match="v[0-9]*\.[0-9]*\.[0-9]*" + git describe --tags --match="v[0-9]*\.[0-9]*\.[0-9]*" --abbrev=7 ;; esac diff --git a/contrib/ui/mesh-ui/ui/index.html b/contrib/ui/mesh-ui/ui/index.html index 4d0265fb..1da3059b 100755 --- a/contrib/ui/mesh-ui/ui/index.html +++ b/contrib/ui/mesh-ui/ui/index.html @@ -1,34 +1,39 @@ - - - - + - RiV-mesh - - + + + + + RiV-mesh + + -
-
- -
- -
- - - + + + + + + \ No newline at end of file diff --git a/contrib/ui/mesh-ui/webview.go b/contrib/ui/mesh-ui/webview.go old mode 100755 new mode 100644 index e76dad2f..0ef8e776 --- a/contrib/ui/mesh-ui/webview.go +++ b/contrib/ui/mesh-ui/webview.go @@ -21,9 +21,35 @@ import ( "github.com/RiV-chain/RiV-mesh/src/admin" "github.com/RiV-chain/RiV-mesh/src/defaults" + "github.com/docopt/docopt-go" ) +var usage = `Graphical interface for RiV mesh. + +Usage: + mesh-ui [] [-c] + mesh-ui -h | --help + mesh-ui -v | --version + +Options: + Index file name [default: index.html]. + -c --console Show debug console window. + -h --help Show this screen. + -v --version Show version.` + +var confui struct { + IndexHtml string `docopt:""` + Console bool `docopt:"-c,--console"` +} + +var uiVersion = "0.0.1" + func main() { + opts, _ := docopt.ParseArgs(usage, os.Args[1:], uiVersion) + opts.Bind(&confui) + if !confui.Console { + Console(false) + } debug := true w := webview.New(debug) defer w.Destroy() @@ -67,18 +93,32 @@ func main() { } } } - var path string - if len(os.Args) > 1 { - path, err = filepath.Abs(filepath.Dir(os.Args[1])) - } else { - path, err = filepath.Abs(filepath.Dir(os.Args[0])) + if confui.IndexHtml == "" { + confui.IndexHtml = "index.html" } - if err != nil { - log.Fatal(err) + //Check is it URL already + indexUrl, err := url.ParseRequestURI(confui.IndexHtml) + if err != nil || len(indexUrl.Scheme) < 2 { // handling no scheme at all and windows c:\ as scheme detection + confui.IndexHtml, err = filepath.Abs(confui.IndexHtml) + if err != nil { + panic(errors.New("Index file not found: " + err.Error())) + } + if stat, err := os.Stat(confui.IndexHtml); err != nil { + panic(errors.New(fmt.Sprintf("Index file %v not found or permissians denied: %v", confui.IndexHtml, err.Error()))) + } else if stat.IsDir() { + panic(errors.New(fmt.Sprintf("Index file %v not found", confui.IndexHtml))) + } + path_prefix := "" + if indexUrl != nil && len(indexUrl.Scheme) == 1 { + path_prefix = "/" + } + indexUrl, err = url.ParseRequestURI("file://" + path_prefix + strings.ReplaceAll(confui.IndexHtml, "\\", "/")) + if err != nil { + panic(errors.New("Index file URL parse error: " + err.Error())) + } } - log.Println(path) w.Bind("onLoad", func() { log.Println("page loaded") go run(w) @@ -105,10 +145,8 @@ func main() { w.Bind("ping", func(peer_list string) { go ping(w, peer_list) }) - //dat, err := ioutil.ReadFile(path+"/index.html") - //w.Navigate("data:text/html,"+url.QueryEscape(string(dat))) - //w.Navigate("data:text/html,"+""+path+"") - w.Navigate("file://" + path + "/index.html") + log.Printf("Opening: %v", indexUrl) + w.Navigate(indexUrl.String()) w.Run() } @@ -179,6 +217,7 @@ func get_self(w webview.WebView) { go setFieldValue(w, "ipv6", res.IPAddress) go setFieldValue(w, "pub_key", res.PublicKey) go setFieldValue(w, "priv_key", res.PrivateKey) + go setFieldValue(w, "version", fmt.Sprintf("v%v/%v", res.BuildVersion, uiVersion)) //found subnet fmt.Printf("Subnet: %s\n", res.Subnet) go setFieldValue(w, "subnet", res.Subnet) diff --git a/contrib/ui/mesh-ui/webview_other.go b/contrib/ui/mesh-ui/webview_other.go new file mode 100644 index 00000000..313ad87f --- /dev/null +++ b/contrib/ui/mesh-ui/webview_other.go @@ -0,0 +1,7 @@ +//go:build !windows +// +build !windows + +package main + +func Console(show bool) { +} diff --git a/contrib/ui/mesh-ui/webview_windows.go b/contrib/ui/mesh-ui/webview_windows.go new file mode 100755 index 00000000..556afedd --- /dev/null +++ b/contrib/ui/mesh-ui/webview_windows.go @@ -0,0 +1,24 @@ +//go:build windows +// +build windows + +package main + +import ( + "syscall" +) + +func Console(show bool) { + var getWin = syscall.NewLazyDLL("kernel32.dll").NewProc("GetConsoleWindow") + var showWin = syscall.NewLazyDLL("user32.dll").NewProc("ShowWindow") + hwnd, _, _ := getWin.Call() + if hwnd == 0 { + return + } + if show { + var SW_RESTORE uintptr = 9 + showWin.Call(hwnd, SW_RESTORE) + } else { + var SW_HIDE uintptr = 0 + showWin.Call(hwnd, SW_HIDE) + } +} diff --git a/go.mod b/go.mod index ef843c08..ee1d4d0d 100644 --- a/go.mod +++ b/go.mod @@ -23,6 +23,7 @@ require ( ) require ( + github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815 // indirect github.com/dustin/go-humanize v1.0.0 // indirect github.com/getlantern/context v0.0.0-20190109183933-c447772a6520 // indirect github.com/getlantern/ema v0.0.0-20190620044903-5943d28f40e4 // indirect diff --git a/go.sum b/go.sum index 30f678f1..4c41cad8 100644 --- a/go.sum +++ b/go.sum @@ -12,6 +12,8 @@ github.com/cheggaaa/pb/v3 v3.0.8/go.mod h1:UICbiLec/XO6Hw6k+BHEtHeQFzzBH4i2/qk/o github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815 h1:bWDMxwH3px2JBh6AyO7hdCn/PkvCZXii8TGj7sbtEbQ= +github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= github.com/dustin/go-humanize v1.0.0 h1:VSnTsYCnlFHaM2/igO1h6X3HA71jcobQuxemgkq4zYo= github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/fatih/color v1.10.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= diff --git a/src/core/core.go b/src/core/core.go index a150ee0f..58b383d9 100644 --- a/src/core/core.go +++ b/src/core/core.go @@ -20,7 +20,7 @@ import ( // The Core object represents the Mesh node. You should create a Core // object for each Mesh node you plan to run. type Core struct { - address Address + // This is the main data structure that holds everything else for a node // We're going to keep our own copy of the provided config - that way we can // guarantee that it will be covered by the mutex diff --git a/src/defaults/defaults.go b/src/defaults/defaults.go index ef358ed8..97482078 100644 --- a/src/defaults/defaults.go +++ b/src/defaults/defaults.go @@ -8,6 +8,12 @@ type NetworkDomainConfig = config.NetworkDomainConfig var defaultConfig = "" // LDFLAGS='-X github.com/yggdrasil-network/yggdrasil-go/src/defaults.defaultConfig=/path/to/config var defaultAdminListen = "" // LDFLAGS='-X github.com/yggdrasil-network/yggdrasil-go/src/defaults.defaultAdminListen=unix://path/to/sock' +type defaultParameters struct { + + //Network domain + DefaultNetworkDomain NetworkDomainConfig +} + // Defines which parameters are expected by default for configuration on a // specific platform. These values are populated in the relevant defaults_*.go // for the platform being targeted. They must be set. @@ -21,15 +27,23 @@ type platformDefaultParameters struct { // Multicast interfaces DefaultMulticastInterfaces []MulticastInterfaceConfig - //Network domain - DefaultNetworkDomain NetworkDomainConfig - // TUN MaximumIfMTU uint64 DefaultIfMTU uint64 DefaultIfName string } +// Defines defaults for the all platforms. +func define() defaultParameters { + return defaultParameters{ + + // Network domain + DefaultNetworkDomain: NetworkDomainConfig{ + Prefix: "fc", + }, + } +} + func GetDefaults() platformDefaultParameters { defaults := getDefaults() if defaultConfig != "" { @@ -56,10 +70,10 @@ func GenerateConfig() *config.NodeConfig { cfg.InterfacePeers = map[string][]string{} cfg.AllowedPublicKeys = []string{} cfg.MulticastInterfaces = defaults.DefaultMulticastInterfaces - cfg.NetworkDomain = defaults.DefaultNetworkDomain cfg.IfName = defaults.DefaultIfName cfg.IfMTU = defaults.DefaultIfMTU cfg.NodeInfoPrivacy = false + cfg.NetworkDomain = define().DefaultNetworkDomain return cfg } diff --git a/src/defaults/defaults_darwin.go b/src/defaults/defaults_darwin.go index 670fca88..9698d2ba 100644 --- a/src/defaults/defaults_darwin.go +++ b/src/defaults/defaults_darwin.go @@ -19,11 +19,6 @@ func getDefaults() platformDefaultParameters { {Regex: "bridge.*", Beacon: true, Listen: true}, }, - // Network domain - DefaultNetworkDomain: NetworkDomainConfig{ - Prefix: "fc", - }, - // TUN MaximumIfMTU: 65535, DefaultIfMTU: 65535, diff --git a/src/defaults/defaults_freebsd.go b/src/defaults/defaults_freebsd.go index 2a50c25c..a0b8658b 100644 --- a/src/defaults/defaults_freebsd.go +++ b/src/defaults/defaults_freebsd.go @@ -18,11 +18,6 @@ func getDefaults() platformDefaultParameters { {Regex: ".*", Beacon: true, Listen: true}, }, - // Network domain - DefaultNetworkDomain: NetworkDomainConfig{ - Prefix: "fc", - }, - // TUN MaximumIfMTU: 32767, DefaultIfMTU: 32767, diff --git a/src/defaults/defaults_linux.go b/src/defaults/defaults_linux.go index 2c2690c7..8ade70c1 100644 --- a/src/defaults/defaults_linux.go +++ b/src/defaults/defaults_linux.go @@ -18,11 +18,6 @@ func getDefaults() platformDefaultParameters { {Regex: ".*", Beacon: true, Listen: true}, }, - // Network domain - DefaultNetworkDomain: NetworkDomainConfig{ - Prefix: "fc", - }, - // TUN MaximumIfMTU: 65535, DefaultIfMTU: 65535, diff --git a/src/defaults/defaults_openbsd.go b/src/defaults/defaults_openbsd.go index 3772d07b..a07092ad 100644 --- a/src/defaults/defaults_openbsd.go +++ b/src/defaults/defaults_openbsd.go @@ -18,11 +18,6 @@ func getDefaults() platformDefaultParameters { {Regex: ".*", Beacon: true, Listen: true}, }, - // Network domain - DefaultNetworkDomain: NetworkDomainConfig{ - Prefix: "fc", - }, - // TUN MaximumIfMTU: 16384, DefaultIfMTU: 16384, diff --git a/src/defaults/defaults_other.go b/src/defaults/defaults_other.go index 21c32160..53b68be4 100644 --- a/src/defaults/defaults_other.go +++ b/src/defaults/defaults_other.go @@ -18,11 +18,6 @@ func getDefaults() platformDefaultParameters { {Regex: ".*", Beacon: true, Listen: true}, }, - // Network domain - DefaultNetworkDomain: NetworkDomainConfig{ - Prefix: "fc", - }, - // TUN MaximumIfMTU: 65535, DefaultIfMTU: 65535, diff --git a/src/defaults/defaults_windows.go b/src/defaults/defaults_windows.go index 95a8cc80..b3545969 100644 --- a/src/defaults/defaults_windows.go +++ b/src/defaults/defaults_windows.go @@ -18,11 +18,6 @@ func getDefaults() platformDefaultParameters { {Regex: ".*", Beacon: true, Listen: true}, }, - // Network domain - DefaultNetworkDomain: NetworkDomainConfig{ - Prefix: "fc", - }, - // TUN MaximumIfMTU: 65535, DefaultIfMTU: 65535,