mirror of
https://github.com/status-im/status-node.git
synced 2026-08-27 09:21:13 +00:00
Initial import
This commit is contained in:
@@ -0,0 +1,14 @@
|
||||
#!/bin/bash
|
||||
APPDIR="$(dirname "$(readlink -f "${0}")")"
|
||||
export LD_LIBRARY_PATH="${APPDIR}/usr/lib/:${LD_LIBRARY_PATH}"
|
||||
export QT_QPA_PLATFORM="xcb"
|
||||
|
||||
DEFAULT_LANG=en_US.UTF-8
|
||||
if [[ "$LANG" == "C.UTF-8" ]]
|
||||
then
|
||||
export LANG=$DEFAULT_LANG
|
||||
else
|
||||
export LANG="${VARIABLE:=$DEFAULT_LANG}"
|
||||
fi
|
||||
|
||||
exec "${APPDIR}/usr/bin/status_node" "$@"
|
||||
@@ -0,0 +1,28 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>CFBundleDisplayName</key>
|
||||
<string>Status Node DEV</string>
|
||||
<key>CFBundleExecutable</key>
|
||||
<string>status_node</string>
|
||||
<key>CFBundleIconFile</key>
|
||||
<string>status-dev.icns</string>
|
||||
<key>CFBundleIdentifier</key>
|
||||
<string>im.Status.StatusNodeDev</string>
|
||||
<key>CFBundleInfoDictionaryVersion</key>
|
||||
<string>6.0</string>
|
||||
<key>CFBundleName</key>
|
||||
<string>StatusDev</string>
|
||||
<key>CFBundlePackageType</key>
|
||||
<string>APPL</string>
|
||||
<key>CFBundleShortVersionString</key>
|
||||
<string>1.0.0</string>
|
||||
<key>IFMajorVersion</key>
|
||||
<integer>1</integer>
|
||||
<key>IFMinorVersion</key>
|
||||
<integer>0</integer>
|
||||
<key>NSHighResolutionCapable</key>
|
||||
<string>True</string>
|
||||
</dict>
|
||||
</plist>
|
||||
+28
@@ -0,0 +1,28 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>CFBundleDisplayName</key>
|
||||
<string>Status Node</string>
|
||||
<key>CFBundleExecutable</key>
|
||||
<string>status_node</string>
|
||||
<key>CFBundleIconFile</key>
|
||||
<string>status.icns</string>
|
||||
<key>CFBundleIdentifier</key>
|
||||
<string>im.Status.StatusNode</string>
|
||||
<key>CFBundleInfoDictionaryVersion</key>
|
||||
<string>6.0</string>
|
||||
<key>CFBundleName</key>
|
||||
<string>Status</string>
|
||||
<key>CFBundlePackageType</key>
|
||||
<string>APPL</string>
|
||||
<key>CFBundleShortVersionString</key>
|
||||
<string>1.0.0</string>
|
||||
<key>IFMajorVersion</key>
|
||||
<integer>1</integer>
|
||||
<key>IFMinorVersion</key>
|
||||
<integer>0</integer>
|
||||
<key>NSHighResolutionCapable</key>
|
||||
<string>True</string>
|
||||
</dict>
|
||||
</plist>
|
||||
@@ -0,0 +1,459 @@
|
||||
# Copyright (c) 2019-2020 Status Research & Development GmbH. Licensed under
|
||||
# either of:
|
||||
# - Apache License, version 2.0
|
||||
# - MIT license
|
||||
# at your option. This file may not be copied, modified, or distributed except
|
||||
# according to those terms.
|
||||
|
||||
SHELL := bash # the shell used internally by Make
|
||||
|
||||
# used inside the included makefiles
|
||||
BUILD_SYSTEM_DIR := vendor/nimbus-build-system
|
||||
|
||||
# we don't want an error here, so we can handle things later, in the ".DEFAULT" target
|
||||
-include $(BUILD_SYSTEM_DIR)/makefiles/variables.mk
|
||||
|
||||
.PHONY: \
|
||||
all \
|
||||
bottles \
|
||||
check-pkg-target-linux \
|
||||
check-pkg-target-macos \
|
||||
check-pkg-target-windows \
|
||||
clean \
|
||||
deps \
|
||||
fleets-remove \
|
||||
fleets-update \
|
||||
status_node \
|
||||
nim_windows_launcher \
|
||||
pkg \
|
||||
pkg-linux \
|
||||
pkg-macos \
|
||||
pkg-windows \
|
||||
run \
|
||||
run-linux \
|
||||
run-macos \
|
||||
run-windows \
|
||||
status-go \
|
||||
update
|
||||
|
||||
ifeq ($(NIM_PARAMS),)
|
||||
# "variables.mk" was not included, so we update the submodules.
|
||||
GIT_SUBMODULE_UPDATE := git submodule update --init --recursive
|
||||
.DEFAULT:
|
||||
+@ echo -e "Git submodules not found. Running '$(GIT_SUBMODULE_UPDATE)'.\n"; \
|
||||
$(GIT_SUBMODULE_UPDATE); \
|
||||
echo
|
||||
# Now that the included *.mk files appeared, and are newer than this file, Make will restart itself:
|
||||
# https://www.gnu.org/software/make/manual/make.html#Remaking-Makefiles
|
||||
#
|
||||
# After restarting, it will execute its original goal, so we don't have to start a child Make here
|
||||
# with "$(MAKE) $(MAKECMDGOALS)". Isn't hidden control flow great?
|
||||
|
||||
else # "variables.mk" was included. Business as usual until the end of this file.
|
||||
|
||||
all: status_node
|
||||
|
||||
# must be included after the default target
|
||||
-include $(BUILD_SYSTEM_DIR)/makefiles/targets.mk
|
||||
|
||||
ifeq ($(OS),Windows_NT) # is Windows_NT on XP, 2000, 7, Vista, 10...
|
||||
detected_OS := Windows
|
||||
else
|
||||
detected_OS := $(strip $(shell uname))
|
||||
endif
|
||||
|
||||
ifeq ($(detected_OS),Darwin)
|
||||
CFLAGS := -mmacosx-version-min=10.14
|
||||
export CFLAGS
|
||||
CGO_CFLAGS := -mmacosx-version-min=10.14
|
||||
export CGO_CFLAGS
|
||||
LIBSTATUS_EXT := dylib
|
||||
MACOSX_DEPLOYMENT_TARGET := 10.14
|
||||
export MACOSX_DEPLOYMENT_TARGET
|
||||
PKG_TARGET := pkg-macos
|
||||
RUN_TARGET := run-macos
|
||||
else ifeq ($(detected_OS),Windows)
|
||||
LIBSTATUS_EXT := dll
|
||||
PKG_TARGET := pkg-windows
|
||||
RUN_TARGET := run-windows
|
||||
VCINSTALLDIR ?= C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\BuildTools\\VC\\
|
||||
export VCINSTALLDIR
|
||||
else
|
||||
LIBSTATUS_EXT := so
|
||||
PKG_TARGET := pkg-linux
|
||||
RUN_TARGET := run-linux
|
||||
endif
|
||||
|
||||
check-pkg-target-linux:
|
||||
ifneq ($(detected_OS),Linux)
|
||||
$(error The pkg-linux target must be run on Linux)
|
||||
endif
|
||||
|
||||
check-pkg-target-macos:
|
||||
ifneq ($(detected_OS),Darwin)
|
||||
$(error The pkg-macos target must be run on macOS)
|
||||
endif
|
||||
|
||||
check-pkg-target-windows:
|
||||
ifneq ($(detected_OS),Windows)
|
||||
$(error The pkg-windows target must be run on Windows)
|
||||
endif
|
||||
|
||||
ifeq ($(detected_OS),Darwin)
|
||||
bottles/openssl:
|
||||
./scripts/fetch-brew-bottle.sh openssl
|
||||
|
||||
bottles/pcre: bottles/openssl
|
||||
./scripts/fetch-brew-bottle.sh pcre
|
||||
|
||||
bottles: bottles/openssl bottles/pcre
|
||||
endif
|
||||
|
||||
deps: | deps-common bottles
|
||||
|
||||
update: | update-common
|
||||
|
||||
# Qt5 dirs (we can't indent with tabs here)
|
||||
ifneq ($(detected_OS),Windows)
|
||||
QT5_PCFILEDIR := $(shell pkg-config --variable=pcfiledir Qt5Core 2>/dev/null)
|
||||
QT5_LIBDIR := $(shell pkg-config --variable=libdir Qt5Core 2>/dev/null)
|
||||
ifeq ($(QT5_PCFILEDIR),)
|
||||
ifeq ($(QTDIR),)
|
||||
$(error Cannot find your Qt5 installation. Please run "$(MAKE) QTDIR=/path/to/your/Qt5/installation/prefix ...")
|
||||
else
|
||||
QT5_PCFILEDIR := $(QTDIR)/lib/pkgconfig
|
||||
QT5_LIBDIR := $(QTDIR)/lib
|
||||
# some manually installed Qt5 instances have wrong paths in their *.pc files, so we pass the right one to the linker here
|
||||
ifeq ($(detected_OS),Darwin)
|
||||
NIM_PARAMS += -L:"-framework Foundation -framework Security -framework IOKit -framework CoreServices"
|
||||
# Fix for failures due to 'can't allocate code signature data for'
|
||||
NIM_PARAMS += --passL:"-headerpad_max_install_names"
|
||||
NIM_PARAMS += --passL:"-F$(QT5_LIBDIR)"
|
||||
export QT5_LIBDIR
|
||||
else
|
||||
NIM_PARAMS += --passL:"-L$(QT5_LIBDIR)"
|
||||
endif
|
||||
endif
|
||||
endif
|
||||
DOTHERSIDE := vendor/DOtherSide/build/lib/libDOtherSideStatic.a
|
||||
DOTHERSIDE_CMAKE_PARAMS := -DENABLE_DYNAMIC_LIBS=OFF -DENABLE_STATIC_LIBS=ON
|
||||
# order matters here, due to "-Wl,-as-needed"
|
||||
NIM_PARAMS += --passL:"$(DOTHERSIDE)" --passL:"$(shell PKG_CONFIG_PATH="$(QT5_PCFILEDIR)" pkg-config --libs Qt5Core Qt5Qml Qt5Gui Qt5Quick Qt5QuickControls2 Qt5Widgets Qt5Svg)"
|
||||
else
|
||||
DOTHERSIDE := vendor/DOtherSide/build/lib/Release/DOtherSide.dll
|
||||
DOTHERSIDE_CMAKE_PARAMS := -T"v141" -A x64 -DENABLE_DYNAMIC_LIBS=ON -DENABLE_STATIC_LIBS=OFF
|
||||
NIM_PARAMS += -L:$(DOTHERSIDE)
|
||||
NIM_EXTRA_PARAMS := --passL:"-lsetupapi -lhid"
|
||||
endif
|
||||
DOTHERSIDE_BUILD_CMD := cmake --build . --config Release $(HANDLE_OUTPUT)
|
||||
|
||||
RELEASE ?= false
|
||||
ifeq ($(RELEASE),false)
|
||||
# We need `-d:debug` to get Nim's default stack traces
|
||||
NIM_PARAMS += -d:debug
|
||||
# Enable debugging symbols in DOtherSide, in case we need GDB backtraces
|
||||
CFLAGS += -g
|
||||
CXXFLAGS += -g
|
||||
RCC_PARAMS = --no-compress
|
||||
else
|
||||
# Additional optimization flags for release builds are not included at present;
|
||||
# adding them will involve refactoring config.nims in the root of this repo
|
||||
NIM_PARAMS += -d:release
|
||||
endif
|
||||
|
||||
NIM_PARAMS += --outdir:./bin
|
||||
|
||||
$(DOTHERSIDE): | deps
|
||||
echo -e $(BUILD_MSG) "DOtherSide"
|
||||
+ cd vendor/DOtherSide && \
|
||||
mkdir -p build && \
|
||||
cd build && \
|
||||
rm -f CMakeCache.txt && \
|
||||
cmake $(DOTHERSIDE_CMAKE_PARAMS)\
|
||||
-DCMAKE_BUILD_TYPE=Release \
|
||||
-DENABLE_DOCS=OFF \
|
||||
-DENABLE_TESTS=OFF \
|
||||
.. $(HANDLE_OUTPUT) && \
|
||||
$(DOTHERSIDE_BUILD_CMD)
|
||||
|
||||
STATUSGO := vendor/status-go/build/bin/libstatus.$(LIBSTATUS_EXT)
|
||||
STATUSGO_LIBDIR := $(shell pwd)/$(shell dirname "$(STATUSGO)")
|
||||
export STATUSGO_LIBDIR
|
||||
|
||||
status-go: $(STATUSGO)
|
||||
$(STATUSGO): | deps
|
||||
echo -e $(BUILD_MSG) "status-go"
|
||||
+ cd vendor/status-go && \
|
||||
$(MAKE) statusgo-shared-library $(HANDLE_OUTPUT)
|
||||
|
||||
FLEETS := fleets.json
|
||||
$(FLEETS):
|
||||
echo -e $(BUILD_MSG) "Getting latest $(FLEETS)"
|
||||
curl -s https://fleets.status.im/ \
|
||||
| jq --indent 4 --sort-keys . \
|
||||
> $(FLEETS)
|
||||
|
||||
fleets-remove:
|
||||
rm -f $(FLEETS)
|
||||
|
||||
fleets-update: fleets-remove $(FLEETS)
|
||||
|
||||
rcc:
|
||||
echo -e $(BUILD_MSG) "resources.rcc"
|
||||
rm -f ./resources.rcc
|
||||
rm -f ./ui/resources.qrc
|
||||
go run ui/generate-rcc.go -source=ui -output=ui/resources.qrc
|
||||
rcc -binary $(RCC_PARAMS) ui/resources.qrc -o ./resources.rcc
|
||||
|
||||
# default token is a free-tier token with limited capabilities and usage
|
||||
# limits; our docs should include directions for community contributor to setup
|
||||
# their own Infura account and token instead of relying on this default token
|
||||
# during development
|
||||
DEFAULT_TOKEN := 220a1abb4b6943a093c35d0ce4fb0732
|
||||
INFURA_TOKEN ?= $(DEFAULT_TOKEN)
|
||||
NIM_PARAMS += -d:INFURA_TOKEN:"$(INFURA_TOKEN)"
|
||||
|
||||
DEFAULT_TENOR_API_KEY := DU7DWZ27STB2
|
||||
TENOR_API_KEY ?= $(DEFAULT_TENOR_API_KEY)
|
||||
NIM_PARAMS += -d:TENOR_API_KEY:"$(TENOR_API_KEY)"
|
||||
|
||||
# generate a status-node.log file with chronicles output. This file will be truncated each time the app starts
|
||||
NIM_PARAMS += -d:chronicles_sinks="textlines[stdout],textlines[nocolors,file(status-node.log,truncate)]"
|
||||
|
||||
RESOURCES_LAYOUT := -d:development
|
||||
|
||||
status_node: NIM_PARAMS += $(RESOURCES_LAYOUT)
|
||||
status_node: | $(DOTHERSIDE) $(STATUSGO) $(FLEETS) rcc deps
|
||||
echo -e $(BUILD_MSG) "$@" && \
|
||||
$(ENV_SCRIPT) nim c $(NIM_PARAMS) --passL:"-L$(STATUSGO_LIBDIR)" --passL:"-lstatus" $(NIM_EXTRA_PARAMS) --passL:"-lm" src/status_node.nim && \
|
||||
[[ $$? = 0 ]] && \
|
||||
(([[ $(detected_OS) = Darwin ]] && \
|
||||
install_name_tool -change \
|
||||
libstatus.dylib \
|
||||
@rpath/libstatus.dylib \
|
||||
bin/status_node) || true)
|
||||
|
||||
_APPIMAGE_TOOL := appimagetool-x86_64.AppImage
|
||||
APPIMAGE_TOOL := tmp/linux/tools/$(_APPIMAGE_TOOL)
|
||||
|
||||
$(APPIMAGE_TOOL):
|
||||
echo -e "\e[92mFetching:\e[39m appimagetool"
|
||||
rm -rf tmp/linux
|
||||
mkdir -p tmp/linux/tools
|
||||
wget -nv https://github.com/AppImage/AppImageKit/releases/download/continuous/$(_APPIMAGE_TOOL)
|
||||
mv $(_APPIMAGE_TOOL) tmp/linux/tools/
|
||||
chmod +x $(APPIMAGE_TOOL)
|
||||
|
||||
STATUS_CLIENT_APPIMAGE ?= pkg/Status.AppImage
|
||||
STATUS_CLIENT_TARBALL ?= pkg/Status.tar.gz
|
||||
STATUS_CLIENT_TARBALL_FULL ?= $(shell realpath $(STATUS_CLIENT_TARBALL))
|
||||
|
||||
$(STATUS_CLIENT_APPIMAGE): override RESOURCES_LAYOUT := -d:production
|
||||
$(STATUS_CLIENT_APPIMAGE): status_node $(APPIMAGE_TOOL) status-node.desktop
|
||||
rm -rf pkg/*.AppImage
|
||||
rm -rf tmp/linux/dist
|
||||
mkdir -p tmp/linux/dist/usr/bin
|
||||
mkdir -p tmp/linux/dist/usr/lib
|
||||
mkdir -p tmp/linux/dist/usr/qml
|
||||
|
||||
# General Files
|
||||
cp bin/status_node tmp/linux/dist/usr/bin
|
||||
cp status-node.desktop tmp/linux/dist/.
|
||||
cp status.svg tmp/linux/dist/status.svg
|
||||
cp status.svg tmp/linux/dist/usr/.
|
||||
cp -R resources.rcc tmp/linux/dist/usr/.
|
||||
cp -R $(FLEETS) tmp/linux/dist/usr/.
|
||||
mkdir -p tmp/linux/dist/usr/i18n
|
||||
cp ui/i18n/* tmp/linux/dist/usr/i18n
|
||||
|
||||
# Libraries
|
||||
cp -r /usr/lib/x86_64-linux-gnu/nss tmp/linux/dist/usr/lib/
|
||||
cp -P /usr/lib/x86_64-linux-gnu/libgst* tmp/linux/dist/usr/lib/
|
||||
cp -r /usr/lib/x86_64-linux-gnu/gstreamer-1.0 tmp/linux/dist/usr/lib/
|
||||
cp -r /usr/lib/x86_64-linux-gnu/gstreamer1.0 tmp/linux/dist/usr/lib/
|
||||
cp vendor/status-go/build/bin/libstatus.so tmp/linux/dist/usr/lib/
|
||||
|
||||
echo -e $(BUILD_MSG) "AppImage"
|
||||
linuxdeployqt tmp/linux/dist/status-node.desktop -no-copy-copyright-files -qmldir=ui -qmlimport=$(QTDIR)/qml -bundle-non-qt-libs
|
||||
|
||||
rm tmp/linux/dist/AppRun
|
||||
cp AppRun tmp/linux/dist/.
|
||||
|
||||
mkdir -p pkg
|
||||
$(APPIMAGE_TOOL) tmp/linux/dist $(STATUS_CLIENT_APPIMAGE)
|
||||
# if LINUX_GPG_PRIVATE_KEY_FILE is not set then we don't generate a signature
|
||||
ifdef LINUX_GPG_PRIVATE_KEY_FILE
|
||||
scripts/sign-linux-file.sh $(STATUS_CLIENT_APPIMAGE)
|
||||
endif
|
||||
|
||||
$(STATUS_CLIENT_TARBALL): $(STATUS_CLIENT_APPIMAGE)
|
||||
cd $(shell dirname $(STATUS_CLIENT_APPIMAGE)) && \
|
||||
tar czvf $(STATUS_CLIENT_TARBALL_FULL) --ignore-failed-read \
|
||||
$(shell basename $(STATUS_CLIENT_APPIMAGE)){,.asc}
|
||||
ifdef LINUX_GPG_PRIVATE_KEY_FILE
|
||||
scripts/sign-linux-file.sh $(STATUS_CLIENT_TARBALL)
|
||||
endif
|
||||
|
||||
DMG_TOOL := node_modules/.bin/create-dmg
|
||||
|
||||
$(DMG_TOOL):
|
||||
echo -e "\e[92mInstalling:\e[39m create-dmg"
|
||||
npm i
|
||||
|
||||
MACOS_OUTER_BUNDLE := tmp/macos/dist/Status.app
|
||||
MACOS_INNER_BUNDLE := $(MACOS_OUTER_BUNDLE)/Contents/Frameworks/QtWebEngineCore.framework/Versions/Current/Helpers/QtWebEngineProcess.app
|
||||
|
||||
STATUS_CLIENT_DMG ?= pkg/Status.dmg
|
||||
|
||||
$(STATUS_CLIENT_DMG): override RESOURCES_LAYOUT := -d:production
|
||||
$(STATUS_CLIENT_DMG): status_node $(DMG_TOOL)
|
||||
rm -rf tmp/macos pkg/*.dmg
|
||||
mkdir -p $(MACOS_OUTER_BUNDLE)/Contents/MacOS
|
||||
mkdir -p $(MACOS_OUTER_BUNDLE)/Contents/Resources
|
||||
cp Info.plist $(MACOS_OUTER_BUNDLE)/Contents/
|
||||
cp bin/status_node $(MACOS_OUTER_BUNDLE)/Contents/MacOS/
|
||||
cp status.icns $(MACOS_OUTER_BUNDLE)/Contents/Resources/
|
||||
cp status-macos.svg $(MACOS_OUTER_BUNDLE)/Contents/
|
||||
cp -R resources.rcc $(MACOS_OUTER_BUNDLE)/Contents/
|
||||
cp -R $(FLEETS) $(MACOS_OUTER_BUNDLE)/Contents/
|
||||
mkdir -p $(MACOS_OUTER_BUNDLE)/Contents/i18n
|
||||
cp ui/i18n/* $(MACOS_OUTER_BUNDLE)/Contents/i18n
|
||||
|
||||
echo -e $(BUILD_MSG) "app"
|
||||
macdeployqt \
|
||||
$(MACOS_OUTER_BUNDLE) \
|
||||
-executable=$(MACOS_OUTER_BUNDLE)/Contents/MacOS/status_node \
|
||||
-qmldir=ui
|
||||
macdeployqt \
|
||||
$(MACOS_INNER_BUNDLE) \
|
||||
-executable=$(MACOS_INNER_BUNDLE)/Contents/MacOS/QtWebEngineProcess
|
||||
|
||||
# if MACOS_CODESIGN_IDENT is not set then the outer and inner .app
|
||||
# bundles are not signed
|
||||
ifdef MACOS_CODESIGN_IDENT
|
||||
scripts/sign-macos-pkg.sh $(MACOS_OUTER_BUNDLE) $(MACOS_CODESIGN_IDENT)
|
||||
scripts/sign-macos-pkg.sh $(MACOS_INNER_BUNDLE) $(MACOS_CODESIGN_IDENT) \
|
||||
--entitlements QtWebEngineProcess.plist
|
||||
endif
|
||||
echo -e $(BUILD_MSG) "dmg"
|
||||
mkdir -p pkg
|
||||
# See: https://github.com/sindresorhus/create-dmg#dmg-icon
|
||||
# GraphicsMagick must be installed for create-dmg to make the custom
|
||||
# DMG icon based on app icon, but should otherwise work without it
|
||||
npx create-dmg \
|
||||
--identity="NOBODY" \
|
||||
$(MACOS_OUTER_BUNDLE) \
|
||||
pkg || true
|
||||
# We ignore failure above create-dmg can't skip signing.
|
||||
# To work around that a dummy identity - 'NOBODY' - is specified.
|
||||
# This causes non-zero exit code despite DMG being created.
|
||||
# It is just not signed, hence the next command should succeed.
|
||||
mv "`ls pkg/*.dmg`" $(STATUS_CLIENT_DMG)
|
||||
|
||||
ifdef MACOS_CODESIGN_IDENT
|
||||
scripts/sign-macos-pkg.sh $(STATUS_CLIENT_DMG) $(MACOS_CODESIGN_IDENT)
|
||||
endif
|
||||
|
||||
notarize-macos: export CHECK_INTERVAL_SEC ?= 30
|
||||
notarize-macos: export CHECK_RETRY_LIMIT ?= 20
|
||||
notarize-macos: export MACOS_BUNDLE_ID ?= im.status.ethereum.node
|
||||
notarize-macos:
|
||||
scripts/notarize-macos-pkg.sh $(STATUS_CLIENT_DMG)
|
||||
|
||||
NIM_WINDOWS_PREBUILT_DLLS ?= tmp/windows/tools/pcre.dll
|
||||
|
||||
$(NIM_WINDOWS_PREBUILT_DLLS):
|
||||
echo -e "\e[92mFetching:\e[39m prebuilt DLLs from nim-lang.org"
|
||||
rm -rf tmp/windows
|
||||
mkdir -p tmp/windows/tools
|
||||
cd tmp/windows/tools && \
|
||||
wget -nv https://nim-lang.org/download/dlls.zip && \
|
||||
unzip dlls.zip
|
||||
|
||||
nim_windows_launcher: | deps
|
||||
$(ENV_SCRIPT) nim c -d:debug --outdir:./bin --passL:"-static-libgcc -Wl,-Bstatic,--whole-archive -lwinpthread -Wl,--no-whole-archive" src/nim_windows_launcher.nim
|
||||
|
||||
STATUS_CLIENT_EXE ?= pkg/Status.exe
|
||||
|
||||
$(STATUS_CLIENT_EXE): override RESOURCES_LAYOUT := -d:production
|
||||
$(STATUS_CLIENT_EXE): OUTPUT := tmp/windows/dist/Status
|
||||
$(STATUS_CLIENT_EXE): INSTALLER_OUTPUT := pkg
|
||||
$(STATUS_CLIENT_EXE): status_node nim_windows_launcher $(NIM_WINDOWS_PREBUILT_DLLS)
|
||||
rm -rf pkg/*.exe tmp/windows/dist
|
||||
mkdir -p $(OUTPUT)/bin $(OUTPUT)/resources $(OUTPUT)/vendor $(OUTPUT)/resources/i18n
|
||||
cat windows-install.txt | unix2dos > $(OUTPUT)/INSTALL.txt
|
||||
cp status.ico status.svg resources.rcc $(FLEETS) $(OUTPUT)/resources/
|
||||
cp ui/i18n/* $(OUTPUT)/resources/i18n
|
||||
cp bin/status_node.exe $(OUTPUT)/bin/Status.exe
|
||||
cp bin/nim_windows_launcher.exe $(OUTPUT)/Status.exe
|
||||
rcedit $(OUTPUT)/bin/Status.exe --set-icon $(OUTPUT)/resources/status.ico
|
||||
rcedit $(OUTPUT)/Status.exe --set-icon $(OUTPUT)/resources/status.ico
|
||||
cp $(DOTHERSIDE) $(STATUSGO) tmp/windows/tools/*.dll $(OUTPUT)/bin/
|
||||
cp "$(shell which libgcc_s_seh-1.dll)" $(OUTPUT)/bin/
|
||||
cp "$(shell which libwinpthread-1.dll)" $(OUTPUT)/bin/
|
||||
echo -e $(BUILD_MSG) "deployable folder"
|
||||
windeployqt --compiler-runtime --qmldir ui --release \
|
||||
tmp/windows/dist/Status/bin/DOtherSide.dll
|
||||
mv tmp/windows/dist/Status/bin/vc_redist.x64.exe tmp/windows/dist/Status/vendor/
|
||||
cp status.iss $(OUTPUT)/status.iss
|
||||
# if WINDOWS_CODESIGN_PFX_PATH is not set then DLLs, EXEs are not signed
|
||||
ifdef WINDOWS_CODESIGN_PFX_PATH
|
||||
scripts/sign-windows-bin.sh ./tmp/windows/dist/Status
|
||||
endif
|
||||
echo -e $(BUILD_MSG) "exe"
|
||||
mkdir -p $(INSTALLER_OUTPUT)
|
||||
ISCC \
|
||||
-O"$(INSTALLER_OUTPUT)" \
|
||||
-D"BaseName=$(shell basename $(STATUS_CLIENT_EXE) .exe)" \
|
||||
-D"Version=$(shell cat VERSION)" \
|
||||
$(OUTPUT)/status.iss
|
||||
ifdef WINDOWS_CODESIGN_PFX_PATH
|
||||
scripts/sign-windows-bin.sh $(INSTALLER_OUTPUT)
|
||||
endif
|
||||
|
||||
pkg: $(PKG_TARGET)
|
||||
|
||||
pkg-linux: check-pkg-target-linux $(STATUS_CLIENT_APPIMAGE)
|
||||
|
||||
tgz-linux: $(STATUS_CLIENT_TARBALL)
|
||||
|
||||
pkg-macos: check-pkg-target-macos $(STATUS_CLIENT_DMG)
|
||||
|
||||
pkg-windows: check-pkg-target-windows $(STATUS_CLIENT_EXE)
|
||||
|
||||
clean: | clean-common
|
||||
rm -rf bin/* node_modules bottles/* pkg/* tmp/* $(STATUSGO)
|
||||
+ $(MAKE) -C vendor/DOtherSide/build --no-print-directory clean
|
||||
|
||||
run: rcc $(RUN_TARGET)
|
||||
|
||||
ICON_TOOL := node_modules/.bin/fileicon
|
||||
|
||||
$(ICON_TOOL):
|
||||
echo -e "\e[92mInstalling:\e[39m fileicon"
|
||||
npm i
|
||||
|
||||
# Currently not in use: https://github.com/status-im/status-desktop/pull/1858
|
||||
# STATUS_PORT ?= 30306
|
||||
|
||||
run-linux:
|
||||
echo -e "\e[92mRunning:\e[39m bin/status_node"
|
||||
LD_LIBRARY_PATH="$(QT5_LIBDIR)":"$(STATUSGO_LIBDIR)" \
|
||||
./bin/status_node
|
||||
|
||||
run-macos: $(ICON_TOOL)
|
||||
mkdir -p bin/StatusDev.app/Contents/{MacOS,Resources}
|
||||
cp Info.dev.plist bin/StatusDev.app/Contents/Info.plist
|
||||
cp status-dev.icns bin/StatusDev.app/Contents/Resources/
|
||||
cd bin/StatusDev.app/Contents/MacOS && \
|
||||
ln -fs ../../../status_node ./
|
||||
npx fileicon set bin/status_node status-dev.icns
|
||||
echo -e "\e[92mRunning:\e[39m bin/StatusDev.app/Contents/MacOS/status_node"
|
||||
./bin/StatusDev.app/Contents/MacOS/status_node
|
||||
|
||||
run-windows: $(NIM_WINDOWS_PREBUILT_DLLS)
|
||||
echo -e "\e[92mRunning:\e[39m bin/status_node.exe"
|
||||
PATH="$(shell pwd)"/"$(shell dirname "$(DOTHERSIDE)")":"$(STATUSGO_LIBDIR)":"$(shell pwd)"/"$(shell dirname "$(NIM_WINDOWS_PREBUILT_DLLS)")":"$(PATH)" \
|
||||
./bin/status_node.exe
|
||||
|
||||
endif # "variables.mk" was not included
|
||||
@@ -0,0 +1,8 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>com.apple.security.cs.disable-executable-page-protection</key>
|
||||
<true/>
|
||||
</dict>
|
||||
</plist>
|
||||
Executable
+17
@@ -0,0 +1,17 @@
|
||||
#!/bin/bash
|
||||
|
||||
# This script assumes $PWD is the same dir in which this script is located
|
||||
|
||||
# Helps avoid permissions problems with `jenkins` user in docker container when
|
||||
# making a local packaged build
|
||||
git clean -dfx
|
||||
|
||||
docker run -it --rm \
|
||||
--cap-add SYS_ADMIN \
|
||||
--security-opt apparmor:unconfined \
|
||||
--device /dev/fuse \
|
||||
-u jenkins:$(getent group $(whoami) | cut -d: -f3) \
|
||||
-v "${PWD}:/status-node" \
|
||||
-w /status-node \
|
||||
statusteam/status-node-build:0.1.0 \
|
||||
./docker-linux-app-image.sh
|
||||
@@ -0,0 +1,46 @@
|
||||
FROM a12e/docker-qt:5.14-gcc_64
|
||||
|
||||
# $QT_PATH and $QT_PLATFORM are provided by the docker image
|
||||
# $QT_PATH/$QT_VERSION/$QT_PLATFORM/bin is already prepended to $PATH
|
||||
# However $QT_VERSION is not exposed to environment so set it here
|
||||
ENV QT_VERSION="5.14.0"
|
||||
ENV QTDIR="${QT_PATH}/${QT_VERSION}/${QT_PLATFORM}"
|
||||
ENV LD_LIBRARY_PATH="${QTDIR}/lib:${LD_LIBRARY_PATH}"
|
||||
# $OPENSSL_PREFIX is provided by the docker image
|
||||
ENV LIBRARY_PATH="${OPENSSL_PREFIX}/lib:${LIBRARY_PATH}"
|
||||
|
||||
RUN export DEBIAN_FRONTEND=noninteractive \
|
||||
&& sudo apt update -yq \
|
||||
&& sudo apt install -yq software-properties-common \
|
||||
&& sudo add-apt-repository -y ppa:git-core/ppa \
|
||||
&& sudo apt update -yq \
|
||||
&& sudo apt purge -yq gnupg \
|
||||
&& sudo apt install -yq --fix-missing \
|
||||
build-essential cmake jq git s3cmd gnupg2 \
|
||||
libpcre3-dev libnss3 libxcomposite1 libxtst6
|
||||
|
||||
# Installing Golang
|
||||
RUN GOLANG_SHA256="aed845e4185a0b2a3c3d5e1d0a35491702c55889192bb9c30e67a3de6849c067" \
|
||||
&& GOLANG_TARBALL="go1.14.4.linux-amd64.tar.gz" \
|
||||
&& wget -q "https://dl.google.com/go/${GOLANG_TARBALL}" \
|
||||
&& echo "${GOLANG_SHA256} ${GOLANG_TARBALL}" | sha256sum -c \
|
||||
&& sudo tar -C /usr/local -xzf "${GOLANG_TARBALL}" \
|
||||
&& rm "${GOLANG_TARBALL}" \
|
||||
&& sudo ln -s /usr/local/go/bin/go /usr/local/bin
|
||||
|
||||
# Re-install Qt with QtWebEngine by adjusting QT_CI_PACKAGES
|
||||
# The http_proxy=invalid is a fix for getting stuck on 'Welcome Page'
|
||||
RUN sudo sed /tmp/build/install-qt.sh -i \
|
||||
-e 's/^QT_CI_PACKAGES=.*/export QT_CI_PACKAGES=qt.qt5.5140.gcc_64,qt.qt5.5140.qtwebengine,qt.qt5/' \
|
||||
-e '\#^/tmp/build/bin/extract-qt-installer.*#i export http_proxy=invalid' \
|
||||
&& sudo -E /tmp/build/install-qt.sh
|
||||
|
||||
# Jenkins user needs a specific UID/GID to work
|
||||
RUN sudo groupadd -g 1001 jenkins \
|
||||
&& sudo useradd --create-home -u 1001 -g 1001 jenkins
|
||||
USER jenkins
|
||||
ENV HOME="/home/jenkins"
|
||||
|
||||
LABEL maintainer="jakub@status.im"
|
||||
LABEL source="https://github.com/status-im/status-node"
|
||||
LABEL description="Build image for Status Desktop Node"
|
||||
+1
@@ -0,0 +1 @@
|
||||
Jenkinsfile.combined
|
||||
@@ -0,0 +1,87 @@
|
||||
library 'status-jenkins-lib@ci-linux-signing'
|
||||
|
||||
pipeline {
|
||||
agent { label 'linux' }
|
||||
|
||||
options {
|
||||
timestamps()
|
||||
disableConcurrentBuilds()
|
||||
/* Prevent Jenkins jobs from running forever */
|
||||
timeout(time: 35, unit: 'MINUTES')
|
||||
/* Limit builds retained */
|
||||
buildDiscarder(logRotator(
|
||||
numToKeepStr: '10',
|
||||
daysToKeepStr: '30',
|
||||
artifactNumToKeepStr: '10',
|
||||
))
|
||||
}
|
||||
|
||||
parameters {
|
||||
booleanParam(
|
||||
name: 'PUBLISH',
|
||||
description: 'Trigger publishing of build results to GitHub.',
|
||||
defaultValue: getPublishDefault(params.PUBLISH),
|
||||
)
|
||||
}
|
||||
|
||||
stages {
|
||||
stage('Build') {
|
||||
parallel {
|
||||
stage('Linux') { steps { script {
|
||||
linux = jenkins.Build('status-node/platforms/linux')
|
||||
} } }
|
||||
stage('Windows') { steps { script {
|
||||
windows = jenkins.Build('status-node/platforms/windows')
|
||||
} } }
|
||||
stage('MacOS') { steps { script {
|
||||
macos = jenkins.Build('status-node/platforms/macos')
|
||||
} } }
|
||||
}
|
||||
}
|
||||
stage('Archive') {
|
||||
steps { script {
|
||||
sh('rm -f pkg/*')
|
||||
jenkins.copyArts(linux)
|
||||
jenkins.copyArts(windows)
|
||||
jenkins.copyArts(macos)
|
||||
sha = "pkg/${utils.pkgFilename('sha256')}"
|
||||
dir('pkg') {
|
||||
/* generate sha256 checksums for upload */
|
||||
sh "sha256sum * | tee ../${sha}"
|
||||
archiveArtifacts('*')
|
||||
}
|
||||
} }
|
||||
}
|
||||
stage('Upload') {
|
||||
steps { script {
|
||||
/* object for easier URLs handling */
|
||||
urls = [
|
||||
/* mobile */
|
||||
Linux: utils.pkgUrl(linux),
|
||||
Windows: utils.pkgUrl(windows),
|
||||
MacOS: utils.pkgUrl(macos),
|
||||
/* upload the sha256 checksums file too */
|
||||
SHA: s3.uploadArtifact(sha),
|
||||
]
|
||||
/* add URLs to the build description */
|
||||
jenkins.setBuildDesc(urls)
|
||||
} }
|
||||
}
|
||||
stage('Publish') {
|
||||
when { expression { params.PUBLISH } }
|
||||
steps { script {
|
||||
github.publishReleaseFiles(repo: 'status-node');
|
||||
} }
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* Helper that makes PUBLISH default to 'false' unless:
|
||||
* - The build is for a release branch
|
||||
* - A user explicitly specified a value
|
||||
* Since release builds create and re-create GitHub drafts every time. */
|
||||
def Boolean getPublishDefault(Boolean previousValue) {
|
||||
if (env.JOB_NAME.startsWith('status-node/release')) { return true }
|
||||
if (previousValue != null) { return previousValue }
|
||||
return false
|
||||
}
|
||||
@@ -0,0 +1,93 @@
|
||||
library 'status-jenkins-lib@ci-linux-signing'
|
||||
|
||||
pipeline {
|
||||
agent {
|
||||
docker {
|
||||
label 'linux'
|
||||
image 'statusteam/nim-status-client-build:1.0.3'
|
||||
/* allows jenkins use cat and mounts '/dev/fuse' for linuxdeployqt */
|
||||
args '--entrypoint="" --cap-add SYS_ADMIN --security-opt apparmor:unconfined --device /dev/fuse'
|
||||
}
|
||||
}
|
||||
|
||||
parameters {
|
||||
string(
|
||||
name: 'BUILD_TYPE',
|
||||
description: 'Specify build type. Values: pr / nightly / release',
|
||||
defaultValue: 'pr',
|
||||
)
|
||||
}
|
||||
|
||||
options {
|
||||
timestamps()
|
||||
/* Prevent Jenkins jobs from running forever */
|
||||
timeout(time: 15, unit: 'MINUTES')
|
||||
/* manage how many builds we keep */
|
||||
buildDiscarder(logRotator(
|
||||
numToKeepStr: '10',
|
||||
daysToKeepStr: '30',
|
||||
artifactNumToKeepStr: '3',
|
||||
))
|
||||
}
|
||||
|
||||
environment {
|
||||
TARGET = 'linux'
|
||||
/* Improve make performance */
|
||||
MAKEFLAGS = '-j4'
|
||||
/* Disable colors in Nim compiler logs */
|
||||
NIMFLAGS = '--colors:off'
|
||||
/* Makefile assumes the compiler folder is included */
|
||||
QTDIR = "/opt/qt/5.14.0/gcc_64"
|
||||
/* Control output the filename */
|
||||
STATUS_CLIENT_APPIMAGE = "pkg/${utils.pkgFilename('AppImage')}"
|
||||
STATUS_CLIENT_TARBALL = "pkg/${utils.pkgFilename('tar.gz')}"
|
||||
}
|
||||
|
||||
stages {
|
||||
stage('Deps') {
|
||||
steps {
|
||||
/* trigger fetching of git submodules */
|
||||
sh 'make check-pkg-target-linux'
|
||||
/* avoid re-compiling Nim by using cache */
|
||||
cache(maxCacheSize: 250, caches: [[
|
||||
$class: 'ArbitraryFileCache',
|
||||
includes: '**/*',
|
||||
path: 'vendor/nimbus-build-system/vendor/Nim/bin'
|
||||
]]) {
|
||||
sh 'make deps'
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
stage('status-go') {
|
||||
steps { sh 'make status-go' }
|
||||
}
|
||||
|
||||
stage('Package') {
|
||||
steps { script {
|
||||
linux.bundle('tgz-linux')
|
||||
} }
|
||||
}
|
||||
|
||||
stage('Parallel Upload') {
|
||||
parallel {
|
||||
stage('Upload') {
|
||||
steps { script {
|
||||
env.PKG_URL = s3.uploadArtifact(env.STATUS_CLIENT_TARBALL)
|
||||
jenkins.setBuildDesc(AppImage: env.PKG_URL)
|
||||
} }
|
||||
}
|
||||
stage('Archive') {
|
||||
steps { script {
|
||||
archiveArtifacts("${env.STATUS_CLIENT_TARBALL}*")
|
||||
} }
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
post {
|
||||
success { script { github.notifyPR(true) } }
|
||||
failure { script { github.notifyPR(false) } }
|
||||
always { cleanWs() }
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,105 @@
|
||||
library 'status-jenkins-lib@ci-linux-signing'
|
||||
|
||||
pipeline {
|
||||
agent {
|
||||
label 'macos'
|
||||
}
|
||||
|
||||
parameters {
|
||||
string(
|
||||
name: 'BUILD_TYPE',
|
||||
description: 'Specify build type. Values: pr / nightly / release',
|
||||
defaultValue: 'pr',
|
||||
)
|
||||
}
|
||||
|
||||
options {
|
||||
timestamps()
|
||||
/* Prevent Jenkins jobs from running forever */
|
||||
timeout(time: 15, unit: 'MINUTES')
|
||||
/* manage how many builds we keep */
|
||||
buildDiscarder(logRotator(
|
||||
numToKeepStr: '10',
|
||||
daysToKeepStr: '30',
|
||||
artifactNumToKeepStr: '3',
|
||||
))
|
||||
}
|
||||
|
||||
environment {
|
||||
TARGET = 'macos'
|
||||
/* Improve make performance */
|
||||
MAKEFLAGS = '-j4'
|
||||
/* Disable colors in Nim compiler logs */
|
||||
NIMFLAGS = '--colors:off'
|
||||
/* Qt location is pre-defined */
|
||||
QTDIR = '/usr/local/qt/clang_64'
|
||||
PATH = "${env.QTDIR}/bin:${env.PATH}"
|
||||
/* Control output the filename */
|
||||
STATUS_CLIENT_DMG = "pkg/${utils.pkgFilename('dmg')}"
|
||||
/* Apple Team ID for Notarization */
|
||||
MACOS_NOTARIZE_TEAM_ID = "DTX7Z4U3YA"
|
||||
}
|
||||
|
||||
stages {
|
||||
stage('Deps') {
|
||||
steps {
|
||||
/* trigger fetching of git submodules */
|
||||
sh 'make check-pkg-target-macos'
|
||||
/* avoid re-compiling Nim by using cache */
|
||||
cache(maxCacheSize: 250, caches: [[
|
||||
$class: 'ArbitraryFileCache',
|
||||
includes: '**/*',
|
||||
path: 'vendor/nimbus-build-system/vendor/Nim/bin'
|
||||
]]) {
|
||||
withCredentials([
|
||||
usernamePassword( /* For fetching HomeBrew bottles. */
|
||||
credentialsId: "status-im-auto-pkgs",
|
||||
usernameVariable: 'GITHUB_USER',
|
||||
passwordVariable: 'GITHUB_TOKEN'
|
||||
)
|
||||
]) {
|
||||
sh 'make deps'
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
stage('status-go') {
|
||||
steps { sh 'make status-go' }
|
||||
}
|
||||
|
||||
stage('Package') {
|
||||
steps { script {
|
||||
macos.bundle()
|
||||
} }
|
||||
}
|
||||
|
||||
stage('Notarize') {
|
||||
when { expression { utils.isReleaseBuild() } }
|
||||
steps { script {
|
||||
macos.notarize()
|
||||
} }
|
||||
}
|
||||
|
||||
stage('Parallel Upload') {
|
||||
parallel {
|
||||
stage('Upload') {
|
||||
steps { script {
|
||||
env.PKG_URL = s3.uploadArtifact(env.STATUS_CLIENT_DMG)
|
||||
jenkins.setBuildDesc(Dmg: env.PKG_URL)
|
||||
} }
|
||||
}
|
||||
stage('Archive') {
|
||||
steps { script {
|
||||
archiveArtifacts(env.STATUS_CLIENT_DMG)
|
||||
} }
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
post {
|
||||
success { script { github.notifyPR(true) } }
|
||||
failure { script { github.notifyPR(false) } }
|
||||
always { cleanWs() }
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,85 @@
|
||||
library 'status-jenkins-lib@ci-linux-signing'
|
||||
|
||||
pipeline {
|
||||
agent { label 'windows' }
|
||||
|
||||
parameters {
|
||||
string(
|
||||
name: 'BUILD_TYPE',
|
||||
description: 'Specify build type. Values: pr / nightly / release',
|
||||
defaultValue: 'pr',
|
||||
)
|
||||
}
|
||||
|
||||
options {
|
||||
timestamps()
|
||||
/* Prevent Jenkins jobs from running forever */
|
||||
timeout(time: 25, unit: 'MINUTES')
|
||||
/* manage how many builds we keep */
|
||||
buildDiscarder(logRotator(
|
||||
numToKeepStr: '10',
|
||||
daysToKeepStr: '30',
|
||||
artifactNumToKeepStr: '3',
|
||||
))
|
||||
}
|
||||
|
||||
environment {
|
||||
TARGET = 'windows'
|
||||
/* Improve make performance */
|
||||
MAKEFLAGS = '-j4'
|
||||
/* Disable colors in Nim compiler logs */
|
||||
NIMFLAGS = '--colors:off'
|
||||
/* Control output the filename */
|
||||
STATUS_CLIENT_EXE = "pkg/${utils.pkgFilename('exe')}"
|
||||
/* RFC 3161 timestamping URL for DigiCert */
|
||||
WINDOWS_CODESIGN_TIMESTAMP_URL = 'http://timestamp.digicert.com'
|
||||
}
|
||||
|
||||
stages {
|
||||
stage('Deps') {
|
||||
steps {
|
||||
/* trigger fetching of git submodules */
|
||||
sh 'make check-pkg-target-windows'
|
||||
/* avoid re-compiling Nim by using cache */
|
||||
cache(maxCacheSize: 250, caches: [[
|
||||
$class: 'ArbitraryFileCache',
|
||||
includes: '**/*',
|
||||
path: 'vendor/nimbus-build-system/vendor/Nim/bin'
|
||||
]]) {
|
||||
sh 'make deps'
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
stage('status-go') {
|
||||
steps { sh 'make status-go' }
|
||||
}
|
||||
|
||||
stage('Package') {
|
||||
steps { script {
|
||||
windows.bundle(env.STATUS_CLIENT_EXE)
|
||||
} }
|
||||
}
|
||||
|
||||
stage('Parallel Upload') {
|
||||
parallel {
|
||||
stage('Upload') {
|
||||
steps { script {
|
||||
env.PKG_URL = s3.uploadArtifact(env.STATUS_CLIENT_EXE)
|
||||
jenkins.setBuildDesc(Exe: env.PKG_URL)
|
||||
} }
|
||||
}
|
||||
stage('Archive') {
|
||||
steps { script {
|
||||
archiveArtifacts(env.STATUS_CLIENT_EXE)
|
||||
} }
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
post {
|
||||
success { script { github.notifyPR(true) } }
|
||||
failure { script { github.notifyPR(false) } }
|
||||
always { cleanWs() }
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,28 @@
|
||||
# Description
|
||||
|
||||
These `Jenkinsfile`s are used to run CI jobs in Jenkins. You can find them here:
|
||||
https://ci.status.im/job/status-node/
|
||||
|
||||
# Builds
|
||||
|
||||
## Linux
|
||||
|
||||
In order to build the Linux version of the application we use a modified `a12e/docker-qt:5.14-gcc_64` Docker image with the addition of Git and Golang.
|
||||
|
||||
The image is built with [`Dockerfile`](./Dockerfile) using:
|
||||
```
|
||||
docker build -t statusteam/nim-status-client-build:latest .
|
||||
```
|
||||
And pushed to: https://hub.docker.com/r/statusteam/nim-status-client-build
|
||||
|
||||
## MacOS
|
||||
|
||||
The MacOS builds are run on MacOS hosts and expect Command Line Toold and XCode to be installed, as well as QT being available under `/usr/local/qt`.
|
||||
|
||||
It also expects the presence of the following credentials:
|
||||
|
||||
* `macos-keychain-identity` - ID of used signing certificate.
|
||||
* `macos-keychain-pass` - Password to unlock the keychain.
|
||||
* `macos-keychain-file` - Keychain file with the MacOS signing certificate.
|
||||
|
||||
You can read about how to create such a keychain [here](https://github.com/status-im/infra-docs/blob/master/articles/macos_signing_keychain.md).
|
||||
+47
@@ -0,0 +1,47 @@
|
||||
if defined(release):
|
||||
switch("nimcache", "nimcache/release/$projectName")
|
||||
else:
|
||||
switch("nimcache", "nimcache/debug/$projectName")
|
||||
|
||||
--threads:on
|
||||
--opt:speed # -O3
|
||||
--debugger:native # passes "-g" to the C compiler
|
||||
--define:ssl # needed by the stdlib to enable SSL procedures
|
||||
|
||||
if defined(macosx):
|
||||
--dynlibOverrideAll # don't use dlopen()
|
||||
--tlsEmulation:off
|
||||
switch("passL", "-lstdc++")
|
||||
# DYLD_LIBRARY_PATH doesn't always work when running/packaging so set rpath
|
||||
# note: macdeployqt rewrites rpath appropriately when building the .app bundle
|
||||
switch("passL", "-rpath" & " " & getEnv("QT5_LIBDIR"))
|
||||
switch("passL", "-rpath" & " " & getEnv("STATUSGO_LIBDIR"))
|
||||
# statically link these libs
|
||||
switch("passL", "bottles/openssl/lib/libcrypto.a")
|
||||
switch("passL", "bottles/openssl/lib/libssl.a")
|
||||
switch("passL", "bottles/pcre/lib/libpcre.a")
|
||||
# https://code.videolan.org/videolan/VLCKit/-/issues/232
|
||||
switch("passL", "-Wl,-no_compact_unwind")
|
||||
# set the minimum supported macOS version to 10.14
|
||||
switch("passC", "-mmacosx-version-min=10.14")
|
||||
elif defined(windows):
|
||||
--app:gui
|
||||
--tlsEmulation:off
|
||||
switch("passL", "-Wl,-as-needed")
|
||||
else:
|
||||
--dynlibOverrideAll # don't use dlopen()
|
||||
# dynamically link these libs, since we're opting out of dlopen()
|
||||
switch("passL", "-lcrypto")
|
||||
switch("passL", "-lssl")
|
||||
# don't link libraries we're not actually using
|
||||
switch("passL", "-Wl,-as-needed")
|
||||
|
||||
--define:chronicles_line_numbers # useful when debugging
|
||||
|
||||
# The compiler doth protest too much, methinks, about all these cases where it can't
|
||||
# do its (N)RVO pass: https://github.com/nim-lang/RFCs/issues/230
|
||||
switch("warning", "ObservableStores:off")
|
||||
|
||||
# Too many false positives for "Warning: method has lock level <unknown>, but another method has 0 [LockLevel]"
|
||||
switch("warning", "LockLevel:off")
|
||||
|
||||
Executable
+12
@@ -0,0 +1,12 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Workaround for permissions problems with `jenkins` user inside the container
|
||||
cp -R . ~/status-node
|
||||
cd ~/status-node
|
||||
|
||||
git clean -dfx && rm -rf vendor/* && make -j4 V=1 update
|
||||
make V=1 pkg
|
||||
|
||||
# Make AppImage build accessible to the docker host
|
||||
cd - && cp -R ~/status-node/pkg .
|
||||
chmod -R 775 ./pkg
|
||||
@@ -0,0 +1,8 @@
|
||||
#!/bin/bash
|
||||
|
||||
# We use ${BASH_SOURCE[0]} instead of $0 to allow sourcing this file
|
||||
# and we fall back to a Zsh-specific special var to also support Zsh.
|
||||
REL_PATH="$(dirname ${BASH_SOURCE[0]:-${(%):-%x}})"
|
||||
ABS_PATH="$(cd ${REL_PATH}; pwd)"
|
||||
source ${ABS_PATH}/vendor/nimbus-build-system/scripts/env.sh
|
||||
|
||||
+131
@@ -0,0 +1,131 @@
|
||||
{
|
||||
"fleets": {
|
||||
"eth.prod": {
|
||||
"boot": {
|
||||
"boot-01.ac-cn-hongkong-c.eth.prod": "enode://6e6554fb3034b211398fcd0f0082cbb6bd13619e1a7e76ba66e1809aaa0c5f1ac53c9ae79cf2fd4a7bacb10d12010899b370c75fed19b991d9c0cdd02891abad@47.75.99.169:443",
|
||||
"boot-01.do-ams3.eth.prod": "enode://436cc6f674928fdc9a9f7990f2944002b685d1c37f025c1be425185b5b1f0900feaf1ccc2a6130268f9901be4a7d252f37302c8335a2c1a62736e9232691cc3a@178.128.138.128:443",
|
||||
"boot-01.gc-us-central1-a.eth.prod": "enode://32ff6d88760b0947a3dee54ceff4d8d7f0b4c023c6dad34568615fcae89e26cc2753f28f12485a4116c977be937a72665116596265aa0736b53d46b27446296a@34.70.75.208:443",
|
||||
"boot-02.ac-cn-hongkong-c.eth.prod": "enode://23d0740b11919358625d79d4cac7d50a34d79e9c69e16831c5c70573757a1f5d7d884510bc595d7ee4da3c1508adf87bbc9e9260d804ef03f8c1e37f2fb2fc69@47.52.106.107:443",
|
||||
"boot-02.do-ams3.eth.prod": "enode://5395aab7833f1ecb671b59bf0521cf20224fe8162fc3d2675de4ee4d5636a75ec32d13268fc184df8d1ddfa803943906882da62a4df42d4fccf6d17808156a87@178.128.140.188:443",
|
||||
"boot-02.gc-us-central1-a.eth.prod": "enode://5405c509df683c962e7c9470b251bb679dd6978f82d5b469f1f6c64d11d50fbd5dd9f7801c6ad51f3b20a5f6c7ffe248cc9ab223f8bcbaeaf14bb1c0ef295fd0@35.223.215.156:443"
|
||||
},
|
||||
"mail": {
|
||||
"mail-01.ac-cn-hongkong-c.eth.prod": "enode://606ae04a71e5db868a722c77a21c8244ae38f1bd6e81687cc6cfe88a3063fa1c245692232f64f45bd5408fed5133eab8ed78049332b04f9c110eac7f71c1b429@47.75.247.214:443",
|
||||
"mail-01.do-ams3.eth.prod": "enode://c42f368a23fa98ee546fd247220759062323249ef657d26d357a777443aec04db1b29a3a22ef3e7c548e18493ddaf51a31b0aed6079bd6ebe5ae838fcfaf3a49@178.128.142.54:443",
|
||||
"mail-01.gc-us-central1-a.eth.prod": "enode://ee2b53b0ace9692167a410514bca3024695dbf0e1a68e1dff9716da620efb195f04a4b9e873fb9b74ac84de801106c465b8e2b6c4f0d93b8749d1578bfcaf03e@104.197.238.144:443",
|
||||
"mail-02.ac-cn-hongkong-c.eth.prod": "enode://2c8de3cbb27a3d30cbb5b3e003bc722b126f5aef82e2052aaef032ca94e0c7ad219e533ba88c70585ebd802de206693255335b100307645ab5170e88620d2a81@47.244.221.14:443",
|
||||
"mail-02.do-ams3.eth.prod": "enode://7aa648d6e855950b2e3d3bf220c496e0cae4adfddef3e1e6062e6b177aec93bc6cdcf1282cb40d1656932ebfdd565729da440368d7c4da7dbd4d004b1ac02bf8@178.128.142.26:443",
|
||||
"mail-02.gc-us-central1-a.eth.prod": "enode://30211cbd81c25f07b03a0196d56e6ce4604bb13db773ff1c0ea2253547fafd6c06eae6ad3533e2ba39d59564cfbdbb5e2ce7c137a5ebb85e99dcfc7a75f99f55@23.236.58.92:443",
|
||||
"mail-03.ac-cn-hongkong-c.eth.prod": "enode://e85f1d4209f2f99da801af18db8716e584a28ad0bdc47fbdcd8f26af74dbd97fc279144680553ec7cd9092afe683ddea1e0f9fc571ebcb4b1d857c03a088853d@47.244.129.82:443",
|
||||
"mail-03.do-ams3.eth.prod": "enode://8a64b3c349a2e0ef4a32ea49609ed6eb3364be1110253c20adc17a3cebbc39a219e5d3e13b151c0eee5d8e0f9a8ba2cd026014e67b41a4ab7d1d5dd67ca27427@178.128.142.94:443",
|
||||
"mail-03.gc-us-central1-a.eth.prod": "enode://44160e22e8b42bd32a06c1532165fa9e096eebedd7fa6d6e5f8bbef0440bc4a4591fe3651be68193a7ec029021cdb496cfe1d7f9f1dc69eb99226e6f39a7a5d4@35.225.221.245:443"
|
||||
},
|
||||
"rendezvous": {
|
||||
"boot-01.ac-cn-hongkong-c.eth.prod": "/ip4/47.75.99.169/tcp/30703/ethv4/16Uiu2HAmV8Hq9e3zm9TMVP4zrVHo3BjqW5D6bDVV6VQntQd687e4",
|
||||
"boot-01.do-ams3.eth.prod": "/ip4/178.128.138.128/tcp/30703/ethv4/16Uiu2HAmRHPzF3rQg55PgYPcQkyvPVH9n2hWsYPhUJBZ6kVjJgdV",
|
||||
"boot-01.gc-us-central1-a.eth.prod": "/ip4/34.70.75.208/tcp/30703/ethv4/16Uiu2HAm6ZsERLx2BwVD2UM9SVPnnMU6NBycG8XPtu8qKys5awsU",
|
||||
"boot-02.ac-cn-hongkong-c.eth.prod": "/ip4/47.52.106.107/tcp/30703/ethv4/16Uiu2HAmEHiptiDDd9gqNY8oQqo8hHUWMHJzfwt5aLRdD6W2zcXR",
|
||||
"boot-02.do-ams3.eth.prod": "/ip4/178.128.140.188/tcp/30703/ethv4/16Uiu2HAmLqTXuY4Sb6G28HNooaFUXUKzpzKXCcgyJxgaEE2i5vnf",
|
||||
"boot-02.gc-us-central1-a.eth.prod": "/ip4/35.223.215.156/tcp/30703/ethv4/16Uiu2HAmQEUFE2YaJohavWtHxPTEFv3sEGJtDqvtGEv78DFoEWQF"
|
||||
},
|
||||
"whisper": {
|
||||
"node-01.ac-cn-hongkong-c.eth.prod": "enode://b957e51f41e4abab8382e1ea7229e88c6e18f34672694c6eae389eac22dab8655622bbd4a08192c321416b9becffaab11c8e2b7a5d0813b922aa128b82990dab@47.75.222.178:443",
|
||||
"node-01.do-ams3.eth.prod": "enode://66ba15600cda86009689354c3a77bdf1a97f4f4fb3ab50ffe34dbc904fac561040496828397be18d9744c75881ffc6ac53729ddbd2cdbdadc5f45c400e2622f7@178.128.141.87:443",
|
||||
"node-01.gc-us-central1-a.eth.prod": "enode://182ed5d658d1a1a4382c9e9f7c9e5d8d9fec9db4c71ae346b9e23e1a589116aeffb3342299bdd00e0ab98dbf804f7b2d8ae564ed18da9f45650b444aed79d509@34.68.132.118:443",
|
||||
"node-02.ac-cn-hongkong-c.eth.prod": "enode://8bebe73ddf7cf09e77602c7d04c93a73f455b51f24ae0d572917a4792f1dec0bb4c562759b8830cc3615a658d38c1a4a38597a1d7ae3ba35111479fc42d65dec@47.75.85.212:443",
|
||||
"node-02.do-ams3.eth.prod": "enode://4ea35352702027984a13274f241a56a47854a7fd4b3ba674a596cff917d3c825506431cf149f9f2312a293bb7c2b1cca55db742027090916d01529fe0729643b@134.209.136.79:443",
|
||||
"node-02.gc-us-central1-a.eth.prod": "enode://fbeddac99d396b91d59f2c63a3cb5fc7e0f8a9f7ce6fe5f2eed5e787a0154161b7173a6a73124a4275ef338b8966dc70a611e9ae2192f0f2340395661fad81c0@34.67.230.193:443",
|
||||
"node-03.ac-cn-hongkong-c.eth.prod": "enode://ac3948b2c0786ada7d17b80cf869cf59b1909ea3accd45944aae35bf864cc069126da8b82dfef4ddf23f1d6d6b44b1565c4cf81c8b98022253c6aea1a89d3ce2@47.75.88.12:443",
|
||||
"node-03.do-ams3.eth.prod": "enode://ce559a37a9c344d7109bd4907802dd690008381d51f658c43056ec36ac043338bd92f1ac6043e645b64953b06f27202d679756a9c7cf62fdefa01b2e6ac5098e@134.209.136.123:443",
|
||||
"node-03.gc-us-central1-a.eth.prod": "enode://c07aa0deea3b7056c5d45a85bca42f0d8d3b1404eeb9577610f386e0a4744a0e7b2845ae328efc4aa4b28075af838b59b5b3985bffddeec0090b3b7669abc1f3@35.226.92.155:443",
|
||||
"node-04.ac-cn-hongkong-c.eth.prod": "enode://385579fc5b14e04d5b04af7eee835d426d3d40ccf11f99dbd95340405f37cf3bbbf830b3eb8f70924be0c2909790120682c9c3e791646e2d5413e7801545d353@47.244.221.249:443",
|
||||
"node-04.do-ams3.eth.prod": "enode://4e0a8db9b73403c9339a2077e911851750fc955db1fc1e09f81a4a56725946884dd5e4d11258eac961f9078a393c45bcab78dd0e3bc74e37ce773b3471d2e29c@134.209.136.101:443",
|
||||
"node-04.gc-us-central1-a.eth.prod": "enode://0624b4a90063923c5cc27d12624b6a49a86dfb3623fcb106801217fdbab95f7617b83fa2468b9ae3de593ff6c1cf556ccf9bc705bfae9cb4625999765127b423@35.222.158.246:443",
|
||||
"node-05.ac-cn-hongkong-c.eth.prod": "enode://b77bffc29e2592f30180311dd81204ab845e5f78953b5ba0587c6631be9c0862963dea5eb64c90617cf0efd75308e22a42e30bc4eb3cd1bbddbd1da38ff6483e@47.75.10.177:443",
|
||||
"node-05.do-ams3.eth.prod": "enode://a8bddfa24e1e92a82609b390766faa56cf7a5eef85b22a2b51e79b333c8aaeec84f7b4267e432edd1cf45b63a3ad0fc7d6c3a16f046aa6bc07ebe50e80b63b8c@178.128.141.249:443",
|
||||
"node-05.gc-us-central1-a.eth.prod": "enode://a5fe9c82ad1ffb16ae60cb5d4ffe746b9de4c5fbf20911992b7dd651b1c08ba17dd2c0b27ee6b03162c52d92f219961cc3eb14286aca8a90b75cf425826c3bd8@104.154.230.58:443",
|
||||
"node-06.ac-cn-hongkong-c.eth.prod": "enode://cf5f7a7e64e3b306d1bc16073fba45be3344cb6695b0b616ccc2da66ea35b9f35b3b231c6cf335fdfaba523519659a440752fc2e061d1e5bc4ef33864aac2f19@47.75.221.196:443",
|
||||
"node-06.do-ams3.eth.prod": "enode://887cbd92d95afc2c5f1e227356314a53d3d18855880ac0509e0c0870362aee03939d4074e6ad31365915af41d34320b5094bfcc12a67c381788cd7298d06c875@178.128.141.0:443",
|
||||
"node-06.gc-us-central1-a.eth.prod": "enode://282e009967f9f132a5c2dd366a76319f0d22d60d0c51f7e99795a1e40f213c2705a2c10e4cc6f3890319f59da1a535b8835ed9b9c4b57c3aad342bf312fd7379@35.223.240.17:443",
|
||||
"node-07.ac-cn-hongkong-c.eth.prod": "enode://13d63a1f85ccdcbd2fb6861b9bd9d03f94bdba973608951f7c36e5df5114c91de2b8194d71288f24bfd17908c48468e89dd8f0fb8ccc2b2dedae84acdf65f62a@47.244.210.80:443",
|
||||
"node-07.do-ams3.eth.prod": "enode://2b01955d7e11e29dce07343b456e4e96c081760022d1652b1c4b641eaf320e3747871870fa682e9e9cfb85b819ce94ed2fee1ac458904d54fd0b97d33ba2c4a4@134.209.136.112:443",
|
||||
"node-07.gc-us-central1-a.eth.prod": "enode://b706a60572634760f18a27dd407b2b3582f7e065110dae10e3998498f1ae3f29ba04db198460d83ed6d2bfb254bb06b29aab3c91415d75d3b869cd0037f3853c@35.239.5.162:443",
|
||||
"node-08.ac-cn-hongkong-c.eth.prod": "enode://32915c8841faaef21a6b75ab6ed7c2b6f0790eb177ad0f4ea6d731bacc19b938624d220d937ebd95e0f6596b7232bbb672905ee12601747a12ee71a15bfdf31c@47.75.59.11:443",
|
||||
"node-08.do-ams3.eth.prod": "enode://0d9d65fcd5592df33ed4507ce862b9c748b6dbd1ea3a1deb94e3750052760b4850aa527265bbaf357021d64d5cc53c02b410458e732fafc5b53f257944247760@178.128.141.42:443",
|
||||
"node-08.gc-us-central1-a.eth.prod": "enode://e87f1d8093d304c3a9d6f1165b85d6b374f1c0cc907d39c0879eb67f0a39d779be7a85cbd52920b6f53a94da43099c58837034afa6a7be4b099bfcd79ad13999@35.238.106.101:443"
|
||||
}
|
||||
},
|
||||
"eth.staging": {
|
||||
"boot": {
|
||||
"boot-01.ac-cn-hongkong-c.eth.staging": "enode://630b0342ca4e9552f50714b6c8e28d6955bc0fd14e7950f93bc3b2b8cc8c1f3b6d103df66f51a13d773b5db0f130661fb5c7b8fa21c48890c64c79b41a56a490@47.91.229.44:443",
|
||||
"boot-01.do-ams3.eth.staging": "enode://f79fb3919f72ca560ad0434dcc387abfe41e0666201ebdada8ede0462454a13deb05cda15f287d2c4bd85da81f0eb25d0a486bbbc8df427b971ac51533bd00fe@174.138.107.239:443",
|
||||
"boot-01.gc-us-central1-a.eth.staging": "enode://10a78c17929a7019ef4aa2249d7302f76ae8a06f40b2dc88b7b31ebff4a623fbb44b4a627acba296c1ced3775d91fbe18463c15097a6a36fdb2c804ff3fc5b35@35.238.97.234:443"
|
||||
},
|
||||
"mail": {
|
||||
"mail-01.ac-cn-hongkong-c.eth.staging": "enode://b74859176c9751d314aeeffc26ec9f866a412752e7ddec91b19018a18e7cca8d637cfe2cedcb972f8eb64d816fbd5b4e89c7e8c7fd7df8a1329fa43db80b0bfe@47.52.90.156:443",
|
||||
"mail-01.do-ams3.eth.staging": "enode://69f72baa7f1722d111a8c9c68c39a31430e9d567695f6108f31ccb6cd8f0adff4991e7fdca8fa770e75bc8a511a87d24690cbc80e008175f40c157d6f6788d48@206.189.240.16:443",
|
||||
"mail-01.gc-us-central1-a.eth.staging": "enode://e4fc10c1f65c8aed83ac26bc1bfb21a45cc1a8550a58077c8d2de2a0e0cd18e40fd40f7e6f7d02dc6cd06982b014ce88d6e468725ffe2c138e958788d0002a7f@35.239.193.41:443"
|
||||
},
|
||||
"rendezvous": {
|
||||
"boot-01.ac-cn-hongkong-c.eth.staging": "/ip4/47.91.229.44/tcp/30703/ethv4/16Uiu2HAmRnt2Eyoknh3auxh4fJwkRgqkH1gqrWGes8Pk1k3MV4xu",
|
||||
"boot-01.do-ams3.eth.staging": "/ip4/174.138.107.239/tcp/30703/ethv4/16Uiu2HAm8UZXUHEPZrpJbcQ3yVFH6UtKrwsG6jH4ai72PsbLfVFb",
|
||||
"boot-01.gc-us-central1-a.eth.staging": "/ip4/35.238.97.234/tcp/30703/ethv4/16Uiu2HAm6G9sDMkrB4Xa5EH3Zx2dysCxFgBTSRzghic3Z9tRFRNE"
|
||||
},
|
||||
"whisper": {
|
||||
"node-01.ac-cn-hongkong-c.eth.staging": "enode://088cf5a93c576fae52f6f075178467b8ff98bacf72f59e88efb16dfba5b30f80a4db78f8e3cb3d87f2f6521746ef4a8768465ef2896c6af24fd77a425e95b6dd@47.52.226.137:443",
|
||||
"node-01.do-ams3.eth.staging": "enode://914c0b30f27bab30c1dfd31dad7652a46fda9370542aee1b062498b1345ee0913614b8b9e3e84622e84a7203c5858ae1d9819f63aece13ee668e4f6668063989@167.99.19.148:443",
|
||||
"node-01.gc-us-central1-a.eth.staging": "enode://d3878441652f010326889f28360e69f2d09d06540f934fada0e17b374ce5319de64279aba3c44a5bf807d9967c6d705b3b4c6b03fa70763240e2ee6af01a539e@35.192.0.86:443"
|
||||
}
|
||||
},
|
||||
"eth.test": {
|
||||
"boot": {
|
||||
"boot-01.ac-cn-hongkong-c.eth.test": "enode://daae2e72820e86e942fa2a8aa7d6e9954d4043a753483d8bd338e16be82cf962392d5c0e1ae57c3d793c3d3dddd8fd58339262e4234dc966f953cd73b535f5fa@47.52.188.149:443",
|
||||
"boot-01.do-ams3.eth.test": "enode://9e0988575eb7717c25dea72fd11c7b37767dc09c1a7686f7c2ec577d308d24b377ceb675de4317474a1a870e47882732967f4fa785b02ba95d669b31d464dec0@206.189.243.164:443",
|
||||
"boot-01.gc-us-central1-a.eth.test": "enode://c1e5018887c863d64e431b69bf617561087825430e4401733f5ba77c70db14236df381fefb0ebe1ac42294b9e261bbe233dbdb83e32c586c66ae26c8de70cb4c@35.188.168.137:443"
|
||||
},
|
||||
"mail": {
|
||||
"mail-01.ac-cn-hongkong-c.eth.test": "enode://619dbb5dda12e85bf0eb5db40fb3de625609043242737c0e975f7dfd659d85dc6d9a84f9461a728c5ab68c072fed38ca6a53917ca24b8e93cc27bdef3a1e79ac@47.52.188.196:443",
|
||||
"mail-01.do-ams3.eth.test": "enode://e4865fe6c2a9c1a563a6447990d8e9ce672644ae3e08277ce38ec1f1b690eef6320c07a5d60c3b629f5d4494f93d6b86a745a0bf64ab295bbf6579017adc6ed8@206.189.243.161:443",
|
||||
"mail-01.gc-us-central1-a.eth.test": "enode://707e57453acd3e488c44b9d0e17975371e2f8fb67525eae5baca9b9c8e06c86cde7c794a6c2e36203bf9f56cae8b0e50f3b33c4c2b694a7baeea1754464ce4e3@35.192.229.172:443"
|
||||
},
|
||||
"rendezvous": {
|
||||
"boot-01.ac-cn-hongkong-c.eth.test": "/ip4/47.52.188.149/tcp/30703/ethv4/16Uiu2HAm9Vatqr4GfVCqnyeaPtCF3q8fz8kDDUgqXVfFG7ZfSA7w",
|
||||
"boot-01.do-ams3.eth.test": "/ip4/206.189.243.164/tcp/30703/ethv4/16Uiu2HAmBCh5bgYr6V3fDuLqUzvtSAsFTQJCQ3TVHT8ta8bTu2Jm",
|
||||
"boot-01.gc-us-central1-a.eth.test": "/ip4/35.188.168.137/tcp/30703/ethv4/16Uiu2HAm3MUqtGjmetyZ9L4SN2R8oHDWvACUcec25LjtDD5euiRH"
|
||||
},
|
||||
"whisper": {
|
||||
"node-01.ac-cn-hongkong-c.eth.test": "enode://ad38f94030a846cc7005b7a1f3b6b01bf4ef59d34e8d3d6f4d12df23d14ba8656702a435d34cf4df3b412c0c1923df5adcce8461321a0d8ffb9435b26e572c2a@47.52.255.194:443",
|
||||
"node-01.do-ams3.eth.test": "enode://1d193635e015918fb85bbaf774863d12f65d70c6977506187ef04420d74ec06c9e8f0dcb57ea042f85df87433dab17a1260ed8dde1bdf9d6d5d2de4b7bf8e993@206.189.243.163:443",
|
||||
"node-01.gc-us-central1-a.eth.test": "enode://f593a27731bc0f8eb088e2d39222c2d59dfb9bf0b3950d7a828d51e8ab9e08fffbd9916a82fd993c1a080c57c2bd70ed6c36f489a969de697aff93088dbee1a9@35.194.31.108:443"
|
||||
}
|
||||
},
|
||||
"wakuv2.prod": {
|
||||
"waku": {
|
||||
"node-01.ac-cn-hongkong-c.wakuv2.prod": "/ip4/8.210.222.231/tcp/30303/p2p/16Uiu2HAm4v86W3bmT1BiH6oSPzcsSr24iDQpSN5Qa992BCjjwgrD",
|
||||
"node-01.do-ams3.wakuv2.prod": "/ip4/188.166.135.145/tcp/30303/p2p/16Uiu2HAmL5okWopX7NqZWBUKVqW8iUxCEmd5GMHLVPwCgzYzQv3e",
|
||||
"node-01.gc-us-central1-a.wakuv2.prod": "/ip4/34.121.100.108/tcp/30303/p2p/16Uiu2HAmVkKntsECaYfefR1V2yCR79CegLATuTPE6B9TxgxBiiiA"
|
||||
},
|
||||
"waku-websocket": {
|
||||
"node-01.ac-cn-hongkong-c.wakuv2.prod": "/dns4/node-01.ac-cn-hongkong-c.wakuv2.prod.statusim.net/tcp/443/wss/p2p/16Uiu2HAm4v86W3bmT1BiH6oSPzcsSr24iDQpSN5Qa992BCjjwgrD",
|
||||
"node-01.do-ams3.wakuv2.prod": "/dns4/node-01.do-ams3.wakuv2.prod.statusim.net/tcp/443/wss/p2p/16Uiu2HAmL5okWopX7NqZWBUKVqW8iUxCEmd5GMHLVPwCgzYzQv3e",
|
||||
"node-01.gc-us-central1-a.wakuv2.prod": "/dns4/node-01.gc-us-central1-a.wakuv2.prod.statusim.net/tcp/443/wss/p2p/16Uiu2HAmVkKntsECaYfefR1V2yCR79CegLATuTPE6B9TxgxBiiiA"
|
||||
}
|
||||
},
|
||||
"wakuv2.test": {
|
||||
"waku": {
|
||||
"node-01.ac-cn-hongkong-c.wakuv2.test": "/ip4/47.242.210.73/tcp/30303/p2p/16Uiu2HAkvWiyFsgRhuJEb9JfjYxEkoHLgnUQmr1N5mKWnYjxYRVm",
|
||||
"node-01.do-ams3.wakuv2.test": "/ip4/134.209.139.210/tcp/30303/p2p/16Uiu2HAmPLe7Mzm8TsYUubgCAW1aJoeFScxrLj8ppHFivPo97bUZ",
|
||||
"node-01.gc-us-central1-a.wakuv2.test": "/ip4/104.154.239.128/tcp/30303/p2p/16Uiu2HAmJb2e28qLXxT5kZxVUUoJt72EMzNGXB47Rxx5hw3q4YjS"
|
||||
},
|
||||
"waku-websocket": {
|
||||
"node-01.ac-cn-hongkong-c.wakuv2.test": "/dns4/node-01.ac-cn-hongkong-c.wakuv2.test.statusim.net/tcp/443/wss/p2p/16Uiu2HAkvWiyFsgRhuJEb9JfjYxEkoHLgnUQmr1N5mKWnYjxYRVm",
|
||||
"node-01.do-ams3.wakuv2.test": "/dns4/node-01.do-ams3.wakuv2.test.statusim.net/tcp/443/wss/p2p/16Uiu2HAmPLe7Mzm8TsYUubgCAW1aJoeFScxrLj8ppHFivPo97bUZ",
|
||||
"node-01.gc-us-central1-a.wakuv2.test": "/dns4/node-01.gc-us-central1-a.wakuv2.test.statusim.net/tcp/443/wss/p2p/16Uiu2HAmJb2e28qLXxT5kZxVUUoJt72EMzNGXB47Rxx5hw3q4YjS"
|
||||
}
|
||||
}
|
||||
},
|
||||
"meta": {
|
||||
"hostname": "node-01.do-ams3.proxy.misc",
|
||||
"timestamp": "2021-06-04T15:30:41.320046"
|
||||
}
|
||||
}
|
||||
Generated
+1186
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,13 @@
|
||||
{
|
||||
"name": "status-node",
|
||||
"version": "0.0.0",
|
||||
"private": true,
|
||||
"files": [],
|
||||
"devDependencies": {
|
||||
"create-dmg": "status-im/create-dmg#678fbd4",
|
||||
"fileicon": "0.2.4"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=8"
|
||||
}
|
||||
}
|
||||
Executable
+73
@@ -0,0 +1,73 @@
|
||||
#!/usr/bin/env bash
|
||||
set -eof pipefail
|
||||
|
||||
# This script is used to fetch HomeBrew bottles for PCRE and OpenSSL.
|
||||
|
||||
function get_gh_pkgs_token() {
|
||||
curl --fail -Ls -u "${GITHUB_USER}:${GITHUB_TOKEN}" https://ghcr.io/token | jq -r '.token'
|
||||
}
|
||||
|
||||
function get_bottle_json() {
|
||||
brew info --json=v1 "${1}" | jq '.[0].bottle.stable.files.mojave'
|
||||
}
|
||||
|
||||
function fetch_bottle() {
|
||||
if [[ -n "${BEARER_TOKEN}" ]]; then
|
||||
AUTH=("-H" "Authorization: Bearer ${BEARER_TOKEN}")
|
||||
else
|
||||
AUTH=("-u" "_:_") # WARNING: Unauthorized requests can be throttled.
|
||||
fi
|
||||
curl --fail -Ls "${AUTH[@]}" -o "${1}" "${2}"
|
||||
}
|
||||
|
||||
if [[ $(uname) != "Darwin" ]]; then
|
||||
echo "This script is intended for use on macOS!" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [[ $# -ne 1 ]]; then
|
||||
echo "usage: $0 <bottle_name>" >&2
|
||||
exit 1
|
||||
fi
|
||||
BOTTLE_NAME="${1}"
|
||||
BOTTLE_PATH="/tmp/${BOTTLE_NAME}.tar.gz"
|
||||
|
||||
# GitHub Packages requires authentication.
|
||||
GITHUB_USER="${GITHUB_USER:-_}"
|
||||
GITHUB_TOKEN="${GITHUB_TOKEN:-_}"
|
||||
if [[ "${GITHUB_USER}" == "_" ]] || [[ "${GITHUB_TOKEN}" == "_" ]]; then
|
||||
echo "No GITHUB_USER or GITHUB_TOKEN variable set!" >&2
|
||||
echo "GitHub Packages can throttle unauthorized requests." >&2
|
||||
else
|
||||
echo "${BOTTLE_NAME} - Fetching GH Pkgs Token"
|
||||
BEARER_TOKEN=$(get_gh_pkgs_token)
|
||||
fi
|
||||
|
||||
# We want the most recent available version of the package.
|
||||
if [[ $(stat -f %u /usr/local/var/homebrew) -ne "${UID}" ]]; then
|
||||
echo "Missing permissions to update Homebrew formulae!" >&2
|
||||
else
|
||||
echo "${BOTTLE_NAME} - Updating HomeBrew repository"
|
||||
brew update >/dev/null
|
||||
fi
|
||||
|
||||
echo "${BOTTLE_NAME} - Finding bottle URL"
|
||||
BOTTLE_JSON=$(get_bottle_json "${BOTTLE_NAME}")
|
||||
BOTTLE_URL=$(echo "${BOTTLE_JSON}" | jq -r .url)
|
||||
BOTTLE_SHA=$(echo "${BOTTLE_JSON}" | jq -r .sha256)
|
||||
|
||||
echo "${BOTTLE_NAME} - Fetching bottle for macOS"
|
||||
fetch_bottle "${BOTTLE_PATH}" "${BOTTLE_URL}"
|
||||
trap "rm -fr ${BOTTLE_PATH}" EXIT ERR INT QUIT
|
||||
|
||||
echo "${BOTTLE_NAME} - Checking SHA256 checksum"
|
||||
BOTTLE_LOCAL_SHA=$(shasum -a 256 "${BOTTLE_PATH}" | awk '{print $1}')
|
||||
|
||||
if [[ "${BOTTLE_LOCAL_SHA}" != "${BOTTLE_SHA}" ]]; then
|
||||
echo "The SHA256 of downloaded bottle did not match!" >&2
|
||||
exit 1;
|
||||
fi
|
||||
|
||||
echo "${BOTTLE_NAME} - Unpacking bottle tarball"
|
||||
mkdir -p "bottles/${BOTTLE_NAME}"
|
||||
tar xzf "${BOTTLE_PATH}" --strip-components 2 -C "bottles/${BOTTLE_NAME}"
|
||||
Executable
+70
@@ -0,0 +1,70 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
set -e
|
||||
|
||||
[[ $(uname) != 'Darwin' ]] && { echo 'This only works on macOS.' >&2; exit 1; }
|
||||
[[ $# -ne 1 ]] && { echo 'notarize-macos-pkg.sh <bundle_to_notarize>' >&2; exit 1; }
|
||||
|
||||
# Credential necessary for the upload.
|
||||
[[ -z "${MACOS_NOTARIZE_TEAM_ID}" ]] && { echo -e "Missing env variable: MACOS_NOTARIZE_TEAM_ID" 1>&2; exit 1; }
|
||||
[[ -z "${MACOS_NOTARIZE_USERNAME}" ]] && { echo -e "Missing env variable: MACOS_NOTARIZE_USERNAME" 1>&2; exit 1; }
|
||||
[[ -z "${MACOS_NOTARIZE_PASSWORD}" ]] && { echo -e "Missing env variable: MACOS_NOTARIZE_PASSWORD" 1>&2; exit 1; }
|
||||
|
||||
# Path to MacOS bundle created by XCode.
|
||||
BUNDLE_PATH="${1}"
|
||||
# Notarization request check intervals/retries.
|
||||
CHECK_INTERVAL_SEC="${CHECK_INTERVAL_SEC:-30}"
|
||||
CHECK_RETRY_LIMIT="${CHECK_RETRY_LIMIT:-20}"
|
||||
# Unique ID of MacOS application.
|
||||
MACOS_BUNDLE_ID="${MACOS_BUNDLE_ID:-im.status.ethereum.node}"
|
||||
# Log file path
|
||||
NOTARIZATION_LOG="${NOTARIZATION_LOG:-${PWD}/notarization.log}"
|
||||
|
||||
function xcrun_altool() {
|
||||
xcrun altool "${@}" \
|
||||
--team-id "${MACOS_NOTARIZE_TEAM_ID}" \
|
||||
--username "${MACOS_NOTARIZE_USERNAME}" \
|
||||
--password "${MACOS_NOTARIZE_PASSWORD}" \
|
||||
--output-format "json" \
|
||||
2>&1 | tee -a "${NOTARIZATION_LOG}"
|
||||
}
|
||||
|
||||
# Submit app for notarization. Should take 5-10 minutes.
|
||||
echo -e "\n### Creating Notarization Request..."
|
||||
OUT=$(xcrun_altool --notarize-app -f "${BUNDLE_PATH}" --primary-bundle-id "${MACOS_BUNDLE_ID}")
|
||||
# Necessary to track notarization request progress.
|
||||
REQUEST_UUID=$(echo "${OUT}" | jq -r '."notarization-upload".RequestUUID')
|
||||
|
||||
if [[ -z "${REQUEST_UUID}" ]]; then
|
||||
echo "\n!!! FAILURE: No notarization request UUID found." >&1
|
||||
exit 1
|
||||
fi
|
||||
echo -e "\n### Request ID: ${REQUEST_UUID}"
|
||||
|
||||
# Check notarization ticket status periodically.
|
||||
echo -e "\n### Checking Notarization Status..."
|
||||
while sleep "${CHECK_INTERVAL_SEC}"; do
|
||||
OUT=$(xcrun_altool --notarization-info "${REQUEST_UUID}")
|
||||
|
||||
# Once notarization is complete, run stapler and exit.
|
||||
if $(echo "${OUT}" | jq -er '."notarization-info".Status == "in progress"'); then
|
||||
((CHECK_RETRY_LIMIT-=1))
|
||||
if [[ "${CHECK_RETRY_LIMIT}" -eq 0 ]]; then
|
||||
echo -e "\n!!! FAILURE: Notarization timed out."
|
||||
exit 1
|
||||
fi
|
||||
echo "In progress, sleeping ${CHECK_INTERVAL_SEC}s..."
|
||||
elif $(echo "${OUT}" | jq -er '."notarization-info".Status == "success"'); then
|
||||
echo -e "\n### Successful Notarization"
|
||||
break
|
||||
else
|
||||
echo -e "\n!!! Notariztion Error"
|
||||
echo "${OUT}" >&2
|
||||
exit 1
|
||||
fi
|
||||
done
|
||||
|
||||
# Optional but preferrable to attach the ticket to the bundle.
|
||||
echo -e "\n### Stapling Notarization Ticket..."
|
||||
xcrun stapler staple "${BUNDLE_PATH}"
|
||||
exit $?
|
||||
Executable
+72
@@ -0,0 +1,72 @@
|
||||
#!/usr/bin/env bash
|
||||
set -eof pipefail
|
||||
|
||||
# Checks -----------------------------------------------------------------------
|
||||
|
||||
if [[ $(uname) != 'Linux' ]]; then
|
||||
echo 'This only works on Linux.' >&2
|
||||
exit 1
|
||||
fi
|
||||
if [[ $# -lt 1 ]]; then
|
||||
echo 'sign-linux-tarball.sh <file_to_sign>' >&2
|
||||
exit 1
|
||||
fi
|
||||
if [[ -z "${LINUX_GPG_PRIVATE_KEY_FILE}" ]]; then
|
||||
echo "Unable to import GPG key file if LINUX_GPG_PRIVATE_KEY_FILE is not set!" >&2
|
||||
exit 1
|
||||
fi
|
||||
if [[ -z "${LINUX_GPG_PRIVATE_KEY_PASS}" ]]; then
|
||||
echo "Unable to import GPG key file if LINUX_GPG_PRIVATE_KEY_PASS is not set!" >&2
|
||||
exit 1
|
||||
fi
|
||||
if [[ ! -f "${LINUX_GPG_PRIVATE_KEY_FILE}" ]]; then
|
||||
echo "No such file exists: ${LINUX_GPG_PRIVATE_KEY_FILE}" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Signing ----------------------------------------------------------------------
|
||||
|
||||
function clean_up {
|
||||
STATUS=$?
|
||||
if [[ "${STATUS}" -ne 0 ]]; then
|
||||
echo -e "\n###### ERROR: See above for details."
|
||||
fi
|
||||
set +e
|
||||
|
||||
echo -e "\n### Removing Temporary Keyring..."
|
||||
rm -frv "${GNUPGHOME}"
|
||||
exit $STATUS
|
||||
}
|
||||
|
||||
# First and only argument is the file to create signature for
|
||||
TARGET="${1}"
|
||||
|
||||
# Use a temporary GPG home and for the keyring.
|
||||
export GNUPGHOME=$(mktemp -d $HOME/.gnupg.tmp.XXXXXX)
|
||||
# Remove the GPG home along with the keyring regardless of how script exits.
|
||||
trap clean_up EXIT
|
||||
|
||||
# Fix for 'gpg: signing failed: Inappropriate ioctl for device' in Docker
|
||||
echo 'allow-loopback-pinentry' > "${GNUPGHOME}/gpg-agent.conf"
|
||||
echo 'pinentry-mode loopback' > "${GNUPGHOME}/gpg.conf"
|
||||
|
||||
# Import the GPG key file into the temporary keyring.
|
||||
echo -e "\n### Importing GPG private key..."
|
||||
gpg2 --batch --yes --passphrase-fd 0 \
|
||||
--import "${LINUX_GPG_PRIVATE_KEY_FILE}" \
|
||||
<<< "${LINUX_GPG_PRIVATE_KEY_PASS}"
|
||||
|
||||
# Trust all immported keys ultimately.
|
||||
gpg2 --list-secret-keys --with-colons \
|
||||
| awk -F: '/fpr/{printf "%s:6:\n", $10}' \
|
||||
| gpg2 --import-ownertrust --batch
|
||||
|
||||
echo -e "\n### Signing target..."
|
||||
gpg2 --batch --yes --passphrase-fd 0 --verbose \
|
||||
--armor --detach-sign "${TARGET}" \
|
||||
<<< "${LINUX_GPG_PRIVATE_KEY_PASS}"
|
||||
|
||||
echo -e "\n### Verifying signature..."
|
||||
gpg2 --batch --verify "${TARGET}.asc" "${TARGET}"
|
||||
|
||||
echo -e "\n### DONE"
|
||||
Executable
+94
@@ -0,0 +1,94 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
set -e
|
||||
|
||||
[[ $(uname) != 'Darwin' ]] && { echo 'This only works on macOS.' >&2; exit 1; }
|
||||
[[ $# -lt 2 ]] && { echo 'sign-macos-bundle.sh <file_to_sign> <sign_identity>' >&2; exit 1; }
|
||||
|
||||
# First is the target file/directory to sign
|
||||
TARGET="${1}"
|
||||
# Second argument is the signing identity
|
||||
CODESIGN_ID="${2}"
|
||||
# Rest are extra command line flags for codesign
|
||||
shift 2
|
||||
CODESIGN_OPTS_EXTRA=("${@}")
|
||||
|
||||
[[ ! -e "${TARGET}" ]] && { echo 'Target file does not exist.' >&2; exit 1; }
|
||||
|
||||
function clean_up {
|
||||
STATUS=$?
|
||||
if [[ "${STATUS}" -eq 0 ]]; then
|
||||
echo -e "\n###### ERROR: See above for details."
|
||||
fi
|
||||
set +e
|
||||
|
||||
echo -e "\n###### Cleaning up..."
|
||||
echo -e "\n### Locking keychain..."
|
||||
security lock-keychain "${MACOS_KEYCHAIN_FILE}"
|
||||
echo -e "\n### Restoring default keychain search list..."
|
||||
security list-keychains -s ${ORIG_KEYCHAIN_LIST}
|
||||
security list-keychains
|
||||
|
||||
exit $STATUS
|
||||
}
|
||||
|
||||
# Flags for codesign
|
||||
CODESIGN_OPTS=(
|
||||
"--sign ${CODESIGN_ID}"
|
||||
"--options runtime"
|
||||
"--verbose=4"
|
||||
"--force"
|
||||
)
|
||||
# Add extra flags provided via command line
|
||||
CODESIGN_OPTS+=(
|
||||
${CODESIGN_OPTS_EXTRA[@]}
|
||||
)
|
||||
|
||||
# Setting MACOS_KEYCHAIN_FILE nd MACOS_KEYCHAIN_PASS is not required because
|
||||
# MACOS_CODESIGN_IDENT can be found in e.g. your login keychain.
|
||||
# Those would normally be specified only in CI.
|
||||
if [[ -n "${MACOS_KEYCHAIN_FILE}" ]]; then
|
||||
if [[ -z "${MACOS_KEYCHAIN_PASS}" ]]; then
|
||||
echo "Unable to unlock the keychain without MACOS_KEYCHAIN_PASS!" >&2
|
||||
exit 1
|
||||
fi
|
||||
echo -e "\n### Storing original keychain search list..."
|
||||
# We want to restore the normal keychains and ignore Jenkis created ones
|
||||
ORIG_KEYCHAIN_LIST=$(security list-keychains | grep -v -e "^/private" -e "secretFiles" | xargs)
|
||||
|
||||
# The keychain file needs to be locked afterwards
|
||||
trap clean_up EXIT ERR
|
||||
|
||||
echo -e "\n### Adding keychain to search list..."
|
||||
security list-keychains -s ${ORIG_KEYCHAIN_LIST} "${MACOS_KEYCHAIN_FILE}"
|
||||
security list-keychains
|
||||
echo -e "\n### Unlocking keychain..."
|
||||
security unlock-keychain -p "${MACOS_KEYCHAIN_PASS}" "${MACOS_KEYCHAIN_FILE}"
|
||||
|
||||
# Add a flag to use the unlocked keychain
|
||||
CODESIGN_OPTS+=("--keychain ${MACOS_KEYCHAIN_FILE}")
|
||||
fi
|
||||
|
||||
# If 'TARGET' is a directory, we assume it's an app
|
||||
# bundle, otherwise we consider it to be a dmg.
|
||||
if [[ -d "${TARGET}" ]]; then
|
||||
CODESIGN_OPTS+=("--deep")
|
||||
fi
|
||||
|
||||
echo -e "\n### Signing target..."
|
||||
codesign ${CODESIGN_OPTS[@]} "${TARGET}"
|
||||
|
||||
echo -e "\n### Verifying signature..."
|
||||
codesign --verify --strict=all --deep --verbose=4 "${TARGET}"
|
||||
|
||||
echo -e "\n### Assessing Gatekeeper validation..."
|
||||
if [[ -d "${TARGET}" ]]; then
|
||||
spctl --assess --type execute --verbose=2 "${TARGET}"
|
||||
else
|
||||
echo "WARNING: The 'open' type security assesment is disabled due to lack of 'Notarization'"
|
||||
# Issue: https://github.com/status-im/status-react/pull/9172
|
||||
# Details: https://developer.apple.com/documentation/security/notarizing_your_app_before_distribution
|
||||
#spctl --assess --type open --context context:primary-signature --verbose=2 "${OBJECT}"
|
||||
fi
|
||||
|
||||
echo -e "\n###### DONE"
|
||||
Executable
+49
@@ -0,0 +1,49 @@
|
||||
#!/usr/bin/env bash
|
||||
set -eof pipefail
|
||||
|
||||
if [[ $# -ne 1 ]]; then
|
||||
echo "No path to search for EXE and DLL files provided!" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
function must_get_env() {
|
||||
declare -n VAR_VALUE="$1"
|
||||
if [[ -z "${VAR_VALUE}" ]]; then
|
||||
echo -e "Missing env variable: ${!VAR_VALUE}" 1>&2
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
# The signing certificate, password, and timestamp server is required.
|
||||
must_get_env WINDOWS_CODESIGN_PFX_PATH
|
||||
must_get_env WINDOWS_CODESIGN_PASSWORD
|
||||
must_get_env WINDOWS_CODESIGN_TIMESTAMP_URL
|
||||
|
||||
# Signing Tool usually comes with the Windows Kits.
|
||||
WINDOWS_KITS='/c/Program Files (x86)/Windows Kits'
|
||||
SIGNTOOL=$(find "${WINDOWS_KITS}" -iname 'signtool.exe' | grep x64 | sort | head -n1)
|
||||
if [[ -z "${SIGNTOOL}" ]]; then
|
||||
echo "No signtool.exe was found in '${WINDOWS_KITS}'!" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Find the files to sign.
|
||||
FOUND_FILES=$(find "${1}" -type f -iname '*.dll' -or -iname '*.exe')
|
||||
declare -a FILES_TO_SIGN
|
||||
|
||||
for FILE in ${FOUND_FILES}; do
|
||||
# Some files like Qt libraries are already signed.
|
||||
if "${SIGNTOOL}" verify -pa ${FILE} &>/dev/null; then
|
||||
continue
|
||||
fi
|
||||
FILES_TO_SIGN+=("${FILE}")
|
||||
done
|
||||
|
||||
# Sign all the non-signed binaries. Add -debug if need be.
|
||||
"${SIGNTOOL}" sign -v -fd SHA256 \
|
||||
-p "${WINDOWS_CODESIGN_PASSWORD}" \
|
||||
-f "${WINDOWS_CODESIGN_PFX_PATH}" \
|
||||
-tr "${WINDOWS_CODESIGN_TIMESTAMP_URL}" \
|
||||
"${FILES_TO_SIGN[@]}" | dos2unix
|
||||
|
||||
echo "Signed successfully!"
|
||||
@@ -0,0 +1,88 @@
|
||||
#---------------------------------------------------------------------
|
||||
# Configures a build envrionment for nim-status-client on windows.
|
||||
#---------------------------------------------------------------------
|
||||
|
||||
# Helpers
|
||||
function Install-Scoop {
|
||||
if ((Get-Command scoop -ErrorAction SilentlyContinue) -ne $null) {
|
||||
Write-Host "Scoop already installed!"
|
||||
} else {
|
||||
Write-Host "Installing Scoop package manager..."
|
||||
Invoke-Expression (New-Object System.Net.WebClient).DownloadString('https://get.scoop.sh')
|
||||
}
|
||||
}
|
||||
|
||||
# Install Git and other dependencies
|
||||
function Install-Dependencies {
|
||||
Write-Host "Installing dependencies..."
|
||||
scoop install --global 7zip git dos2unix findutils wget make cmake gcc go rcedit inno-setup
|
||||
scoop bucket add extras
|
||||
scoop install --global vcredist2017
|
||||
}
|
||||
|
||||
function Install-Qt-SDK {
|
||||
Write-Host "Installing Qt $QtVersion SDK..."
|
||||
pip install aqtinstall
|
||||
aqt install --output "C:\Qt" $QtVersion windows desktop win64_msvc2017_64 -m qtwebengine
|
||||
}
|
||||
|
||||
# Install Microsoft Visual C++ Build Tools 15.8.9
|
||||
function Install-VC-BuildTools {
|
||||
$VCBuildToolsUrl = "https://download.visualstudio.microsoft.com/download/pr/e286f66e-4366-425f-bcc5-c88627c6e95a/0401d4decb00884a7d50f69732e1d680/vs_buildtools.exe"
|
||||
$VCBuildToolsExe = "$HOME\Downloads\vs_BuildTools.exe"
|
||||
|
||||
Write-Host "Downloading Microsoft Visual C++ Build Tools..."
|
||||
(New-Object System.Net.WebClient).DownloadFile($VCBuildToolsUrl, $VCBuildToolsExe)
|
||||
|
||||
Write-Host "Installing Microsoft Visual C++ Build Tools..."
|
||||
$VCBuildToolsArgs = $(
|
||||
"--installPath", "C:\BuildTools",
|
||||
"--quiet", "--wait", "--norestart", "--nocache",
|
||||
"--add", "Microsoft.VisualStudio.Workload.MSBuildTools",
|
||||
"--add", "Microsoft.VisualStudio.Workload.VCTools",
|
||||
"--add", "Microsoft.VisualStudio.Component.VC.Tools.x86.x64",
|
||||
"--add", "Microsoft.VisualStudio.Component.VC.Redist.14.Latest",
|
||||
"--add", "Microsoft.VisualStudio.Component.Windows10SDK.10240",
|
||||
"--add", "Microsoft.VisualStudio.Component.Windows10SDK.14393",
|
||||
"--add", "Microsoft.VisualStudio.Component.Windows81SDK",
|
||||
"--add", "Microsoft.VisualStudio.ComponentGroup.NativeDesktop.Win81"
|
||||
)
|
||||
Start-Process -Wait -PassThru -FilePath $VCBuildToolsExe -ArgumentList $VCBuildToolsArgs
|
||||
}
|
||||
|
||||
function Show-Success-Message {
|
||||
Write-Host @"
|
||||
|
||||
SUCCESS!
|
||||
|
||||
Before you attempt to build nim-status-client you'll need a few environment variables set:
|
||||
|
||||
export QTDIR="/c/Qt/$QtVersion/msvc2017_64"
|
||||
export Qt5_DIR="/c/Qt/$QtVersion/msvc2017_64"
|
||||
export VCINSTALLDIR="/c/BuildTools/VC"
|
||||
|
||||
You might also have to include the following paths in your `$PATH:
|
||||
|
||||
export PATH=`"/c/BuildTools/MSBuild/Current/Bin:`$PATH`"
|
||||
export PATH=`"/c/BuildTools/VC/Tools/MSVC/14.27.29110/bin:`$PATH`"
|
||||
export PATH=`"/c/ProgramData/scoop/apps/inno-setup/current:`$PATH`"
|
||||
"@
|
||||
}
|
||||
|
||||
#---------------------------------------------------------------------
|
||||
|
||||
# Stop the script after first error
|
||||
$ErrorActionPreference = 'Stop'
|
||||
# Version of Qt SDK available form aqt
|
||||
$QtVersion = "5.14.2"
|
||||
|
||||
# Don't run when sourcing script
|
||||
If ($MyInvocation.InvocationName -ne ".") {
|
||||
Install-Scoop
|
||||
Install-Dependencies
|
||||
Install-Qt-SDK
|
||||
Install-VC-BuildTools
|
||||
Show-Success-Message
|
||||
}
|
||||
|
||||
#---------------------------------------------------------------------
|
||||
@@ -0,0 +1,52 @@
|
||||
import # system libs
|
||||
tables
|
||||
|
||||
import # deps
|
||||
uuids
|
||||
|
||||
type
|
||||
Args* = ref object of RootObj # ...args
|
||||
Handler* = proc (args: Args) {.closure.} # callback function type
|
||||
EventEmitter* = ref object
|
||||
events: Table[string, Table[UUID, Handler]]
|
||||
|
||||
proc createEventEmitter*(): EventEmitter =
|
||||
result.new
|
||||
result.events = initTable[string, Table[UUID, Handler]]()
|
||||
|
||||
|
||||
proc on(this: EventEmitter, name: string, handlerId: UUID, handler: Handler): void =
|
||||
if this.events.hasKey(name):
|
||||
this.events[name].add handlerId, handler
|
||||
return
|
||||
|
||||
this.events[name] = [(handlerId, handler)].toTable
|
||||
|
||||
proc on*(this: EventEmitter, name: string, handler: Handler): void =
|
||||
var uuid: UUID
|
||||
this.on(name, uuid, handler)
|
||||
|
||||
proc once*(this:EventEmitter, name:string, handler:Handler): void =
|
||||
var handlerId = genUUID()
|
||||
this.on(name, handlerId) do(a: Args):
|
||||
handler(a)
|
||||
this.events[name].del handlerId
|
||||
|
||||
proc emit*(this:EventEmitter, name:string, args:Args): void =
|
||||
if this.events.hasKey(name):
|
||||
for (id, handler) in this.events[name].pairs:
|
||||
handler(args)
|
||||
|
||||
when isMainModule:
|
||||
block:
|
||||
type ReadyArgs = ref object of Args
|
||||
text: string
|
||||
var evts = createEventEmitter()
|
||||
evts.on("ready") do(a: Args):
|
||||
var args = ReadyArgs(a)
|
||||
echo args.text, ": from [1st] handler"
|
||||
evts.once("ready") do(a: Args):
|
||||
var args = ReadyArgs(a)
|
||||
echo args.text, ": from [2nd] handler"
|
||||
evts.emit("ready", ReadyArgs(text:"Hello, World"))
|
||||
evts.emit("ready", ReadyArgs(text:"Hello, World"))
|
||||
@@ -0,0 +1,17 @@
|
||||
from os import getAppDir, joinPath
|
||||
from winlean import Handle, shellExecuteW
|
||||
|
||||
const NULL: Handle = 0
|
||||
let launcherDir = getAppDir()
|
||||
let workDir_str = joinPath(launcherDir, "bin")
|
||||
let exePath_str = joinPath(workDir_str, "Status.exe")
|
||||
let open_str = "open"
|
||||
let params_str = ""
|
||||
let workDir = newWideCString(workDir_str)
|
||||
let exePath = newWideCString(exePath_str)
|
||||
let open = newWideCString(open_str)
|
||||
let params = newWideCString(params_str)
|
||||
# SW_SHOW (5): activates window and displays it in its current size and position
|
||||
const showCmd: int32 = 5
|
||||
|
||||
discard shellExecuteW(NULL, open, exePath, params, workDir, showCmd)
|
||||
@@ -0,0 +1,163 @@
|
||||
import NimQml, chronicles, os, strformat
|
||||
|
||||
#import app/node/core as node
|
||||
#import app/utilsView/core as utilsView
|
||||
#import status/signals/core as signals
|
||||
#import status/types
|
||||
#import status/constants
|
||||
import status_go
|
||||
#import status/status as statuslib
|
||||
import ./eventemitter
|
||||
|
||||
var signalsQObjPointer: pointer
|
||||
|
||||
logScope:
|
||||
topics = "main"
|
||||
|
||||
proc mainProc() =
|
||||
if defined(macosx) and defined(production):
|
||||
setCurrentDir(getAppDir())
|
||||
|
||||
var currentLanguageCode: string
|
||||
|
||||
let fleets =
|
||||
if defined(windows) and defined(production):
|
||||
"/../resources/fleets.json"
|
||||
else:
|
||||
"/../fleets.json"
|
||||
|
||||
let
|
||||
fleetConfig = readFile(joinPath(getAppDir(), fleets))
|
||||
# status = statuslib.newStatusInstance(fleetConfig)
|
||||
|
||||
#status.initNode()
|
||||
|
||||
enableHDPI()
|
||||
initializeOpenGL()
|
||||
|
||||
let app = newQGuiApplication()
|
||||
defer: app.delete()
|
||||
|
||||
let resources =
|
||||
if defined(windows) and defined(production):
|
||||
"/../resources/resources.rcc"
|
||||
else:
|
||||
"/../resources.rcc"
|
||||
QResource.registerResource(app.applicationDirPath & resources)
|
||||
|
||||
let statusAppIcon =
|
||||
if defined(production):
|
||||
if defined(macosx):
|
||||
"" # not used in macOS
|
||||
elif defined(windows):
|
||||
"/../resources/status.svg"
|
||||
else:
|
||||
"/../status.svg"
|
||||
else:
|
||||
if defined(macosx):
|
||||
"" # not used in macOS
|
||||
else:
|
||||
"/../status-dev.svg"
|
||||
|
||||
if not defined(macosx):
|
||||
app.icon(app.applicationDirPath & statusAppIcon)
|
||||
|
||||
var i18nPath = ""
|
||||
if defined(development):
|
||||
i18nPath = joinPath(getAppDir(), "../ui/i18n")
|
||||
elif (defined(windows)):
|
||||
i18nPath = joinPath(getAppDir(), "../resources/i18n")
|
||||
elif (defined(macosx)):
|
||||
i18nPath = joinPath(getAppDir(), "../i18n")
|
||||
elif (defined(linux)):
|
||||
i18nPath = joinPath(getAppDir(), "../i18n")
|
||||
|
||||
|
||||
let engine = newQQmlApplicationEngine()
|
||||
defer: engine.delete()
|
||||
engine.addImportPath("qrc:/./StatusQ/src")
|
||||
|
||||
# Register events objects
|
||||
let dockShowAppEvent = newStatusDockShowAppEventObject(engine)
|
||||
defer: dockShowAppEvent.delete()
|
||||
let osThemeEvent = newStatusOSThemeEventObject(engine)
|
||||
defer: osThemeEvent.delete()
|
||||
app.installEventFilter(dockShowAppEvent)
|
||||
app.installEventFilter(osThemeEvent)
|
||||
|
||||
# let signalController = signals.newController(status)
|
||||
#defer:
|
||||
# signalsQObjPointer = nil
|
||||
#signalController.delete()
|
||||
|
||||
# We need this global variable in order to be able to access the application
|
||||
# from the non-closure callback passed to `libstatus.setSignalEventCallback`
|
||||
#signalsQObjPointer = cast[pointer](signalController.vptr)
|
||||
|
||||
|
||||
# var node = node.newController(status, netAccMgr)
|
||||
#defer: node.delete()
|
||||
#engine.setRootContextProperty("nodeModel", node.variant)
|
||||
|
||||
#var utilsController = utilsView.newController(status)
|
||||
#defer: utilsController.delete()
|
||||
#engine.setRootContextProperty("utilsModel", utilsController.variant)
|
||||
|
||||
proc changeLanguage(locale: string) =
|
||||
if (locale == currentLanguageCode):
|
||||
return
|
||||
currentLanguageCode = locale
|
||||
let shouldRetranslate = not defined(linux)
|
||||
engine.setTranslationPackage(joinPath(i18nPath, fmt"qml_{locale}.qm"), shouldRetranslate)
|
||||
|
||||
|
||||
|
||||
# status.tasks.marathon.onLoggedIn()
|
||||
|
||||
|
||||
|
||||
# this should be the last defer in the scope
|
||||
defer:
|
||||
info "Status app is shutting down..."
|
||||
#status.tasks.teardown()
|
||||
|
||||
|
||||
#initControllers()
|
||||
|
||||
# Handle node.stopped signal when user has logged out
|
||||
# status.events.once("nodeStopped") do(a: Args):
|
||||
# TODO: remove this once accounts are not tracked in the AccountsModel
|
||||
# status.reset()
|
||||
|
||||
# 2. Re-init controllers that don't require a running node
|
||||
# initControllers()
|
||||
|
||||
# engine.setRootContextProperty("signals", signalController.variant)
|
||||
|
||||
var prValue = newQVariant(if defined(production): true else: false)
|
||||
engine.setRootContextProperty("production", prValue)
|
||||
|
||||
# We're applying default language before we load qml. Also we're aware that
|
||||
# switch language at runtime will have some impact to cpu usage.
|
||||
# https://doc.qt.io/archives/qtjambi-4.5.2_01/com/trolltech/qt/qtjambi-linguist-programmers.html
|
||||
changeLanguage("en")
|
||||
|
||||
engine.load(newQUrl("qrc:///main.qml"))
|
||||
|
||||
# Please note that this must use the `cdecl` calling convention because
|
||||
# it will be passed as a regular C function to libstatus. This means that
|
||||
# we cannot capture any local variables here (we must rely on globals)
|
||||
var callback: SignalCallback = proc(p0: cstring) {.cdecl.} =
|
||||
discard
|
||||
# if signalsQObjPointer != nil:
|
||||
#signal_handler(signalsQObjPointer, p0, "receiveSignal")
|
||||
|
||||
status_go.setSignalEventCallback(callback)
|
||||
|
||||
# Qt main event loop is entered here
|
||||
# The termination of the loop will be performed when exit() or quit() is called
|
||||
info "Starting application..."
|
||||
app.exec()
|
||||
|
||||
when isMainModule:
|
||||
mainProc()
|
||||
Binary file not shown.
@@ -0,0 +1,17 @@
|
||||
<svg width="1024" height="1024" viewBox="0 0 1024 1024" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<g filter="url(#filter0_d)">
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M512 60.0073C262.365 60 60 262.362 60 512C60 761.638 262.365 964 512 964C761.635 964 964 761.631 964 512C964 262.369 761.635 60.0073 512 60.0073Z" fill="white"/>
|
||||
</g>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M588.242 507.825C534.068 510.947 500.117 498.327 445.935 501.457C432.497 502.211 419.152 504.159 406.057 507.277C414.055 407.079 484.967 319.428 581.397 313.857C640.572 310.443 699.719 346.978 702.926 406.29C706.083 464.585 661.634 503.584 588.25 507.818L588.242 507.825ZM442.764 712.775C386.074 715.978 329.421 681.774 326.345 626.272C323.319 571.713 365.909 535.214 436.21 531.251C488.102 528.327 520.632 540.142 572.524 537.21C585.391 536.505 598.173 534.682 610.726 531.763C603.078 625.534 535.147 707.569 442.764 712.775ZM512 60.0073C262.365 60 60 262.362 60 512C60 761.638 262.365 964 512 964C761.635 964 964 761.631 964 512C964 262.369 761.635 60 512 60" fill="orangered"/>
|
||||
<defs>
|
||||
<filter id="filter0_d" x="35" y="60.0073" width="954" height="962.993" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
|
||||
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
|
||||
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0"/>
|
||||
<feOffset dy="34"/>
|
||||
<feGaussianBlur stdDeviation="12.5"/>
|
||||
<feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.05 0"/>
|
||||
<feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow"/>
|
||||
<feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow" result="shape"/>
|
||||
</filter>
|
||||
</defs>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.7 KiB |
@@ -0,0 +1,94 @@
|
||||
<svg width="1024" height="1024" viewBox="0 0 1024 1024" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<g filter="url(#filter0_d)">
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M924 356.628C924 346.845 924.004 337.062 923.944 327.279C923.895 319.039 923.8 310.8 923.576 302.562C923.092 284.61 922.033 266.503 918.84 248.75C915.602 230.741 910.314 213.98 901.981 197.617C893.789 181.534 883.088 166.817 870.32 154.057C857.556 141.298 842.835 130.605 826.746 122.417C810.366 114.083 793.587 108.796 775.558 105.56C757.803 102.371 739.691 101.314 721.739 100.829C713.496 100.607 705.253 100.512 697.008 100.461C687.22 100.402 677.432 100.406 667.644 100.406L553.997 100H468.997L357.361 100.407C347.554 100.407 337.747 100.402 327.94 100.461C319.679 100.512 311.421 100.607 303.162 100.829C285.167 101.315 267.014 102.373 249.217 105.564C231.164 108.801 214.36 114.085 197.958 122.414C181.836 130.601 167.083 141.296 154.291 154.057C141.501 166.816 130.78 181.529 122.573 197.61C114.218 213.981 108.919 230.751 105.673 248.771C102.477 266.516 101.418 284.618 100.931 302.562C100.709 310.801 100.613 319.039 100.563 327.279C100.503 337.063 100 349.217 100 359L100.003 469.09L100 555L100.508 667.428C100.508 677.224 100.504 687.02 100.563 696.816C100.613 705.069 100.709 713.319 100.932 721.568C101.418 739.544 102.479 757.676 105.678 775.454C108.923 793.487 114.22 810.271 122.569 826.656C130.777 842.761 141.5 857.498 154.291 870.275C167.082 883.051 181.831 893.759 197.95 901.959C214.362 910.304 231.174 915.597 249.238 918.838C267.027 922.032 285.174 923.09 303.162 923.576C311.421 923.798 319.68 923.893 327.941 923.944C337.748 924.003 347.554 924 357.361 924L470.006 924.003H555.217L667.644 923.999C677.432 923.999 687.22 924.003 697.008 923.944C705.253 923.893 713.496 923.798 721.739 923.576C739.698 923.089 757.816 922.03 775.579 918.835C793.597 915.593 810.368 910.302 826.739 901.961C842.831 893.763 857.555 883.053 870.32 870.275C883.086 857.5 893.786 842.765 901.978 826.663C910.316 810.27 915.604 793.477 918.844 775.432C922.034 757.663 923.092 739.537 923.577 721.568C923.8 713.318 923.895 705.068 923.944 696.816C924.005 687.02 924 677.224 924 667.428C924 667.428 923.994 556.985 923.994 555V469C923.994 467.534 924 356.628 924 356.628Z" fill="orangered"/>
|
||||
</g>
|
||||
<g filter="url(#filter1_ddiii)">
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M595.412 506.135C533.72 509.69 495.058 495.319 433.358 498.883C418.055 499.742 402.858 501.96 387.946 505.51C397.053 391.409 477.806 291.595 587.616 285.251C655.003 281.362 722.357 322.968 726.01 390.51C729.605 456.894 678.988 501.306 595.42 506.127L595.412 506.135Z" fill="url(#paint0_radial)"/>
|
||||
</g>
|
||||
<g filter="url(#filter2_ddiii)">
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M429.746 739.525C365.19 743.172 300.676 704.222 297.172 641.018C293.727 578.889 342.227 537.325 422.283 532.812C481.376 529.482 518.419 542.937 577.513 539.598C592.165 538.795 606.72 536.719 621.015 533.395C612.306 640.178 534.949 733.597 429.746 739.525Z" fill="url(#paint1_radial)"/>
|
||||
</g>
|
||||
<defs>
|
||||
<filter id="filter0_d" x="89.0001" y="89.0002" width="854" height="854.003" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
|
||||
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
|
||||
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0"/>
|
||||
<feOffset dx="4" dy="4"/>
|
||||
<feGaussianBlur stdDeviation="7.5"/>
|
||||
<feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.3 0"/>
|
||||
<feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow"/>
|
||||
<feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow" result="shape"/>
|
||||
</filter>
|
||||
<filter id="filter1_ddiii" x="312.946" y="240" width="488.244" height="371.705" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
|
||||
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
|
||||
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0"/>
|
||||
<feOffset dy="30"/>
|
||||
<feGaussianBlur stdDeviation="37.5"/>
|
||||
<feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.2 0"/>
|
||||
<feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow"/>
|
||||
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0"/>
|
||||
<feOffset dy="13"/>
|
||||
<feGaussianBlur stdDeviation="13.5"/>
|
||||
<feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.3 0"/>
|
||||
<feBlend mode="normal" in2="effect1_dropShadow" result="effect2_dropShadow"/>
|
||||
<feBlend mode="normal" in="SourceGraphic" in2="effect2_dropShadow" result="shape"/>
|
||||
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
|
||||
<feOffset dy="-38"/>
|
||||
<feGaussianBlur stdDeviation="61"/>
|
||||
<feComposite in2="hardAlpha" operator="arithmetic" k2="-1" k3="1"/>
|
||||
<feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.1 0"/>
|
||||
<feBlend mode="normal" in2="shape" result="effect3_innerShadow"/>
|
||||
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
|
||||
<feOffset dx="-10" dy="-33"/>
|
||||
<feGaussianBlur stdDeviation="20"/>
|
||||
<feComposite in2="hardAlpha" operator="arithmetic" k2="-1" k3="1"/>
|
||||
<feColorMatrix type="matrix" values="0 0 0 0 0.262745 0 0 0 0 0.376471 0 0 0 0 0.87451 0 0 0 0.17 0"/>
|
||||
<feBlend mode="normal" in2="effect3_innerShadow" result="effect4_innerShadow"/>
|
||||
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
|
||||
<feOffset dx="10" dy="24"/>
|
||||
<feGaussianBlur stdDeviation="32"/>
|
||||
<feComposite in2="hardAlpha" operator="arithmetic" k2="-1" k3="1"/>
|
||||
<feColorMatrix type="matrix" values="0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0"/>
|
||||
<feBlend mode="normal" in2="effect4_innerShadow" result="effect5_innerShadow"/>
|
||||
</filter>
|
||||
<filter id="filter2_ddiii" x="222" y="487.277" width="474.015" height="357.483" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
|
||||
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
|
||||
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0"/>
|
||||
<feOffset dy="30"/>
|
||||
<feGaussianBlur stdDeviation="37.5"/>
|
||||
<feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.2 0"/>
|
||||
<feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow"/>
|
||||
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0"/>
|
||||
<feOffset dy="13"/>
|
||||
<feGaussianBlur stdDeviation="13.5"/>
|
||||
<feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.3 0"/>
|
||||
<feBlend mode="normal" in2="effect1_dropShadow" result="effect2_dropShadow"/>
|
||||
<feBlend mode="normal" in="SourceGraphic" in2="effect2_dropShadow" result="shape"/>
|
||||
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
|
||||
<feOffset dy="-38"/>
|
||||
<feGaussianBlur stdDeviation="61"/>
|
||||
<feComposite in2="hardAlpha" operator="arithmetic" k2="-1" k3="1"/>
|
||||
<feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.1 0"/>
|
||||
<feBlend mode="normal" in2="shape" result="effect3_innerShadow"/>
|
||||
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
|
||||
<feOffset dx="-10" dy="-33"/>
|
||||
<feGaussianBlur stdDeviation="20"/>
|
||||
<feComposite in2="hardAlpha" operator="arithmetic" k2="-1" k3="1"/>
|
||||
<feColorMatrix type="matrix" values="0 0 0 0 0.262745 0 0 0 0 0.376471 0 0 0 0 0.87451 0 0 0 0.17 0"/>
|
||||
<feBlend mode="normal" in2="effect3_innerShadow" result="effect4_innerShadow"/>
|
||||
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
|
||||
<feOffset dx="10" dy="24"/>
|
||||
<feGaussianBlur stdDeviation="32"/>
|
||||
<feComposite in2="hardAlpha" operator="arithmetic" k2="-1" k3="1"/>
|
||||
<feColorMatrix type="matrix" values="0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0"/>
|
||||
<feBlend mode="normal" in2="effect4_innerShadow" result="effect5_innerShadow"/>
|
||||
</filter>
|
||||
<radialGradient id="paint0_radial" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(454.281 295.52) rotate(45.988) scale(250.586 365.62)">
|
||||
<stop stop-color="white"/>
|
||||
<stop offset="1" stop-color="white" stop-opacity="0.8"/>
|
||||
</radialGradient>
|
||||
<radialGradient id="paint1_radial" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(360.545 542.122) rotate(45.3201) scale(237.198 346.271)">
|
||||
<stop stop-color="white"/>
|
||||
<stop offset="1" stop-color="white" stop-opacity="0.8"/>
|
||||
</radialGradient>
|
||||
</defs>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 8.3 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 188 KiB |
@@ -0,0 +1,94 @@
|
||||
<svg width="1024" height="1024" viewBox="0 0 1024 1024" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<g filter="url(#filter0_d)">
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M924 356.628C924 346.845 924.004 337.062 923.944 327.279C923.895 319.039 923.8 310.8 923.576 302.562C923.092 284.61 922.033 266.503 918.84 248.75C915.602 230.741 910.314 213.98 901.981 197.617C893.789 181.534 883.088 166.817 870.32 154.057C857.556 141.298 842.835 130.605 826.746 122.417C810.366 114.083 793.587 108.796 775.558 105.56C757.803 102.371 739.691 101.314 721.739 100.829C713.496 100.607 705.253 100.512 697.008 100.461C687.22 100.402 677.432 100.406 667.644 100.406L553.997 100H468.997L357.361 100.407C347.554 100.407 337.747 100.402 327.94 100.461C319.679 100.512 311.421 100.607 303.162 100.829C285.167 101.315 267.014 102.373 249.217 105.564C231.164 108.801 214.36 114.085 197.958 122.414C181.836 130.601 167.083 141.296 154.291 154.057C141.501 166.816 130.78 181.529 122.573 197.61C114.218 213.981 108.919 230.751 105.673 248.771C102.477 266.516 101.418 284.618 100.931 302.562C100.709 310.801 100.613 319.039 100.563 327.279C100.503 337.063 100 349.217 100 359L100.003 469.09L100 555L100.508 667.428C100.508 677.224 100.504 687.02 100.563 696.816C100.613 705.069 100.709 713.319 100.932 721.568C101.418 739.544 102.479 757.676 105.678 775.454C108.923 793.487 114.22 810.271 122.569 826.656C130.777 842.761 141.5 857.498 154.291 870.275C167.082 883.051 181.831 893.759 197.95 901.959C214.362 910.304 231.174 915.597 249.238 918.838C267.027 922.032 285.174 923.09 303.162 923.576C311.421 923.798 319.68 923.893 327.941 923.944C337.748 924.003 347.554 924 357.361 924L470.006 924.003H555.217L667.644 923.999C677.432 923.999 687.22 924.003 697.008 923.944C705.253 923.893 713.496 923.798 721.739 923.576C739.698 923.089 757.816 922.03 775.579 918.835C793.597 915.593 810.368 910.302 826.739 901.961C842.831 893.763 857.555 883.053 870.32 870.275C883.086 857.5 893.786 842.765 901.978 826.663C910.316 810.27 915.604 793.477 918.844 775.432C922.034 757.663 923.092 739.537 923.577 721.568C923.8 713.318 923.895 705.068 923.944 696.816C924.005 687.02 924 677.224 924 667.428C924 667.428 923.994 556.985 923.994 555V469C923.994 467.534 924 356.628 924 356.628Z" fill="#4360DF"/>
|
||||
</g>
|
||||
<g filter="url(#filter1_ddiii)">
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M595.412 506.135C533.72 509.69 495.058 495.319 433.358 498.883C418.055 499.742 402.858 501.96 387.946 505.51C397.053 391.409 477.806 291.595 587.616 285.251C655.003 281.362 722.357 322.968 726.01 390.51C729.605 456.894 678.988 501.306 595.42 506.127L595.412 506.135Z" fill="url(#paint0_radial)"/>
|
||||
</g>
|
||||
<g filter="url(#filter2_ddiii)">
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M429.746 739.525C365.19 743.172 300.676 704.222 297.172 641.018C293.727 578.889 342.227 537.325 422.283 532.812C481.376 529.482 518.419 542.937 577.513 539.598C592.165 538.795 606.72 536.719 621.015 533.395C612.306 640.178 534.949 733.597 429.746 739.525Z" fill="url(#paint1_radial)"/>
|
||||
</g>
|
||||
<defs>
|
||||
<filter id="filter0_d" x="89.0001" y="89.0002" width="854" height="854.003" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
|
||||
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
|
||||
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0"/>
|
||||
<feOffset dx="4" dy="4"/>
|
||||
<feGaussianBlur stdDeviation="7.5"/>
|
||||
<feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.3 0"/>
|
||||
<feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow"/>
|
||||
<feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow" result="shape"/>
|
||||
</filter>
|
||||
<filter id="filter1_ddiii" x="312.946" y="240" width="488.244" height="371.705" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
|
||||
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
|
||||
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0"/>
|
||||
<feOffset dy="30"/>
|
||||
<feGaussianBlur stdDeviation="37.5"/>
|
||||
<feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.2 0"/>
|
||||
<feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow"/>
|
||||
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0"/>
|
||||
<feOffset dy="13"/>
|
||||
<feGaussianBlur stdDeviation="13.5"/>
|
||||
<feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.3 0"/>
|
||||
<feBlend mode="normal" in2="effect1_dropShadow" result="effect2_dropShadow"/>
|
||||
<feBlend mode="normal" in="SourceGraphic" in2="effect2_dropShadow" result="shape"/>
|
||||
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
|
||||
<feOffset dy="-38"/>
|
||||
<feGaussianBlur stdDeviation="61"/>
|
||||
<feComposite in2="hardAlpha" operator="arithmetic" k2="-1" k3="1"/>
|
||||
<feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.1 0"/>
|
||||
<feBlend mode="normal" in2="shape" result="effect3_innerShadow"/>
|
||||
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
|
||||
<feOffset dx="-10" dy="-33"/>
|
||||
<feGaussianBlur stdDeviation="20"/>
|
||||
<feComposite in2="hardAlpha" operator="arithmetic" k2="-1" k3="1"/>
|
||||
<feColorMatrix type="matrix" values="0 0 0 0 0.262745 0 0 0 0 0.376471 0 0 0 0 0.87451 0 0 0 0.17 0"/>
|
||||
<feBlend mode="normal" in2="effect3_innerShadow" result="effect4_innerShadow"/>
|
||||
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
|
||||
<feOffset dx="10" dy="24"/>
|
||||
<feGaussianBlur stdDeviation="32"/>
|
||||
<feComposite in2="hardAlpha" operator="arithmetic" k2="-1" k3="1"/>
|
||||
<feColorMatrix type="matrix" values="0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0"/>
|
||||
<feBlend mode="normal" in2="effect4_innerShadow" result="effect5_innerShadow"/>
|
||||
</filter>
|
||||
<filter id="filter2_ddiii" x="222" y="487.277" width="474.015" height="357.483" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
|
||||
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
|
||||
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0"/>
|
||||
<feOffset dy="30"/>
|
||||
<feGaussianBlur stdDeviation="37.5"/>
|
||||
<feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.2 0"/>
|
||||
<feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow"/>
|
||||
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0"/>
|
||||
<feOffset dy="13"/>
|
||||
<feGaussianBlur stdDeviation="13.5"/>
|
||||
<feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.3 0"/>
|
||||
<feBlend mode="normal" in2="effect1_dropShadow" result="effect2_dropShadow"/>
|
||||
<feBlend mode="normal" in="SourceGraphic" in2="effect2_dropShadow" result="shape"/>
|
||||
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
|
||||
<feOffset dy="-38"/>
|
||||
<feGaussianBlur stdDeviation="61"/>
|
||||
<feComposite in2="hardAlpha" operator="arithmetic" k2="-1" k3="1"/>
|
||||
<feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.1 0"/>
|
||||
<feBlend mode="normal" in2="shape" result="effect3_innerShadow"/>
|
||||
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
|
||||
<feOffset dx="-10" dy="-33"/>
|
||||
<feGaussianBlur stdDeviation="20"/>
|
||||
<feComposite in2="hardAlpha" operator="arithmetic" k2="-1" k3="1"/>
|
||||
<feColorMatrix type="matrix" values="0 0 0 0 0.262745 0 0 0 0 0.376471 0 0 0 0 0.87451 0 0 0 0.17 0"/>
|
||||
<feBlend mode="normal" in2="effect3_innerShadow" result="effect4_innerShadow"/>
|
||||
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
|
||||
<feOffset dx="10" dy="24"/>
|
||||
<feGaussianBlur stdDeviation="32"/>
|
||||
<feComposite in2="hardAlpha" operator="arithmetic" k2="-1" k3="1"/>
|
||||
<feColorMatrix type="matrix" values="0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0"/>
|
||||
<feBlend mode="normal" in2="effect4_innerShadow" result="effect5_innerShadow"/>
|
||||
</filter>
|
||||
<radialGradient id="paint0_radial" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(454.281 295.52) rotate(45.988) scale(250.586 365.62)">
|
||||
<stop stop-color="white"/>
|
||||
<stop offset="1" stop-color="white" stop-opacity="0.8"/>
|
||||
</radialGradient>
|
||||
<radialGradient id="paint1_radial" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(360.545 542.122) rotate(45.3201) scale(237.198 346.271)">
|
||||
<stop stop-color="white"/>
|
||||
<stop offset="1" stop-color="white" stop-opacity="0.8"/>
|
||||
</radialGradient>
|
||||
</defs>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 8.3 KiB |
@@ -0,0 +1,8 @@
|
||||
[Desktop Entry]
|
||||
Type=Application
|
||||
Name=Status Node
|
||||
Exec=status_node
|
||||
Icon=status
|
||||
Comment=Status Node
|
||||
Terminal=true
|
||||
Categories=Network;
|
||||
@@ -0,0 +1 @@
|
||||
INF 2021-08-17 19:21:57.963-04:00 Starting application... topics="main" tid=4152225 file=status_node.nim:159
|
||||
BIN
Binary file not shown.
BIN
Binary file not shown.
|
After Width: | Height: | Size: 43 KiB |
+122
@@ -0,0 +1,122 @@
|
||||
#define Name "Status"
|
||||
#define Publisher "Status.im"
|
||||
#define URL "https://status.im"
|
||||
#define ExeName "Status.exe"
|
||||
#define IcoName "status.ico"
|
||||
|
||||
[Setup]
|
||||
|
||||
; Generated from Tools -> Generate GUID
|
||||
AppId={{F3E2EDB6-78E8-4539-9C8B-A78F059D8647}}
|
||||
|
||||
AppName={#Name}
|
||||
AppVersion={#Version}
|
||||
AppPublisher={#Publisher}
|
||||
AppPublisherURL={#URL}
|
||||
AppSupportURL={#URL}
|
||||
AppUpdatesURL={#URL}
|
||||
DefaultDirName={localappdata}\{#Name}App
|
||||
UsePreviousAppDir=no
|
||||
PrivilegesRequired=lowest
|
||||
WizardStyle=modern
|
||||
UninstallDisplayIcon={app}\{#ExeName}
|
||||
DefaultGroupName={#Name}
|
||||
CloseApplications=yes
|
||||
|
||||
; output dir for installer
|
||||
OutputBaseFileName={#BaseName}
|
||||
|
||||
; Icon file
|
||||
SetupIconFile=resources\{#IcoName}
|
||||
|
||||
; Compression (default is lzma2/max)
|
||||
SolidCompression=yes
|
||||
|
||||
[Languages]
|
||||
Name: "english"; MessagesFile: "compiler:Default.isl"
|
||||
Name: "it"; MessagesFile: "compiler:Languages\Italian.isl"
|
||||
Name: "es"; MessagesFile: "compiler:Languages\Spanish.isl"
|
||||
Name: "de"; MessagesFile: "compiler:Languages\German.isl"
|
||||
Name: "nl"; MessagesFile: "compiler:Languages\Dutch.isl"
|
||||
Name: "pt_BR"; MessagesFile: "compiler:Languages\BrazilianPortuguese.isl"
|
||||
Name: "ru"; MessagesFile: "compiler:Languages\Russian.isl"
|
||||
Name: "fr"; MessagesFile: "compiler:Languages\French.isl"
|
||||
Name: "ua"; MessagesFile: "compiler:Languages\Ukrainian.isl"
|
||||
|
||||
[Files]
|
||||
|
||||
; Path to exe on
|
||||
Source: {#ExeName}; DestDir: "{app}"; Flags: ignoreversion
|
||||
|
||||
; Resources
|
||||
Source: "bin\*"; DestDir: "{app}\bin"; Flags: ignoreversion recursesubdirs createallsubdirs
|
||||
|
||||
Source: "resources\*"; DestDir: "{app}\resources"; Flags: ignoreversion recursesubdirs createallsubdirs
|
||||
|
||||
Source: "vendor\*"; DestDir: "{app}\vendor"; Flags: ignoreversion recursesubdirs createallsubdirs
|
||||
|
||||
[Tasks]
|
||||
Name: desktopicon; Description: "Create a &desktop icon"; GroupDescription: "Additional icons:";
|
||||
|
||||
[Icons]
|
||||
Name: "{group}\{#Name}"; Filename: "{app}\{#ExeName}"; WorkingDir: "{app}"
|
||||
Name: "{group}\Uninstall {#Name}"; Filename: "{uninstallexe}"
|
||||
Name: "{userdesktop}\{#Name}"; Filename: "{app}\{#ExeName}"; IconFilename: "{app}\resources\{#IcoName}"; Tasks: desktopicon
|
||||
|
||||
[Run]
|
||||
Filename: "{app}\{#ExeName}"; Description: {cm:LaunchProgram,{#Name}}; Flags: nowait postinstall skipifsilent
|
||||
|
||||
[UninstallDelete]
|
||||
Type: filesandordirs; Name: "{app}"
|
||||
Type: files; Name: "{userdesktop}\{#Name}"
|
||||
Type: files; Name: "{commondesktop}\{#Name}"
|
||||
|
||||
[Registry]
|
||||
Root: HKCU; Subkey: "Software\Classes\status-im"; ValueType: "string"; ValueData: "URL:status-im protocol"; Flags: uninsdeletekey
|
||||
Root: HKCU; Subkey: "Software\Classes\status-im"; ValueType: "string"; ValueName: "URL Protocol"; ValueData: ""
|
||||
Root: HKCU; Subkey: "Software\Classes\status-im\DefaultIcon"; ValueType: "string"; ValueData: "{app}\Status.exe,1"
|
||||
Root: HKCU; Subkey: "Software\Classes\status-im\shell\open\command"; ValueType: "string"; ValueData: """{app}\Status.exe"" ""--url=""%1"""
|
||||
|
||||
[Code]
|
||||
function IsAppRunning(const FileName : string): Boolean;
|
||||
var
|
||||
FSWbemLocator: Variant;
|
||||
FWMIService: Variant;
|
||||
FWbemObjectSet: Variant;
|
||||
begin
|
||||
Result := false;
|
||||
FSWbemLocator := CreateOleObject('WBEMScripting.SWBEMLocator');
|
||||
FWMIService := FSWbemLocator.ConnectServer('', 'root\CIMV2', '', '');
|
||||
FWbemObjectSet := FWMIService.ExecQuery(Format('SELECT Name FROM Win32_Process Where Name="%s"',[FileName]));
|
||||
Result := (FWbemObjectSet.Count > 0);
|
||||
FWbemObjectSet := Unassigned;
|
||||
FWMIService := Unassigned;
|
||||
FSWbemLocator := Unassigned;
|
||||
end;
|
||||
|
||||
function InitializeUninstall(): Boolean;
|
||||
var
|
||||
ErrorCode: Integer;
|
||||
begin
|
||||
Result := true;
|
||||
if IsAppRunning('{#ExeName}') then
|
||||
begin
|
||||
if MsgBox('Status application is still running. Do you want to terminate the app?', mbConfirmation, MB_YESNO or MB_DEFBUTTON1) = IDYES
|
||||
then
|
||||
ShellExec('', ExpandConstant('{sys}\taskkill.exe'),'/f /im {#ExeName}', '', SW_HIDE, ewWaitUntilTerminated, ErrorCode)
|
||||
else
|
||||
Result := false;
|
||||
end
|
||||
end;
|
||||
|
||||
procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
|
||||
begin
|
||||
if CurUninstallStep = usPostUninstall then
|
||||
begin
|
||||
if DirExists(ExpandConstant('{localappdata}\Status')) then
|
||||
if MsgBox('Do you want to delete application data?', mbConfirmation, MB_YESNO or MB_DEFBUTTON2) = IDYES
|
||||
then
|
||||
DelTree(ExpandConstant('{localappdata}\Status'), True, True, True);
|
||||
end;
|
||||
end;
|
||||
|
||||
+17
@@ -0,0 +1,17 @@
|
||||
<svg width="1024" height="1024" viewBox="0 0 1024 1024" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<g filter="url(#filter0_d)">
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M512 60.0073C262.365 60 60 262.362 60 512C60 761.638 262.365 964 512 964C761.635 964 964 761.631 964 512C964 262.369 761.635 60.0073 512 60.0073Z" fill="white"/>
|
||||
</g>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M588.242 507.825C534.068 510.947 500.117 498.327 445.935 501.457C432.497 502.211 419.152 504.159 406.057 507.277C414.055 407.079 484.967 319.428 581.397 313.857C640.572 310.443 699.719 346.978 702.926 406.29C706.083 464.585 661.634 503.584 588.25 507.818L588.242 507.825ZM442.764 712.775C386.074 715.978 329.421 681.774 326.345 626.272C323.319 571.713 365.909 535.214 436.21 531.251C488.102 528.327 520.632 540.142 572.524 537.21C585.391 536.505 598.173 534.682 610.726 531.763C603.078 625.534 535.147 707.569 442.764 712.775ZM512 60.0073C262.365 60 60 262.362 60 512C60 761.638 262.365 964 512 964C761.635 964 964 761.631 964 512C964 262.369 761.635 60 512 60" fill="#4360DF"/>
|
||||
<defs>
|
||||
<filter id="filter0_d" x="35" y="60.0073" width="954" height="962.993" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
|
||||
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
|
||||
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0"/>
|
||||
<feOffset dy="34"/>
|
||||
<feGaussianBlur stdDeviation="12.5"/>
|
||||
<feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.05 0"/>
|
||||
<feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow"/>
|
||||
<feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow" result="shape"/>
|
||||
</filter>
|
||||
</defs>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.7 KiB |
@@ -0,0 +1,13 @@
|
||||
# Package
|
||||
|
||||
version = "0.1.0"
|
||||
author = "Status Research & Development GmbH"
|
||||
description = "Status Node"
|
||||
license = "MPL2"
|
||||
srcDir = "src"
|
||||
bin = @["status_node"]
|
||||
skipExt = @["nim"]
|
||||
|
||||
# Deps
|
||||
|
||||
requires "nim >= 1.0.0", " nimqml >= 0.7.0", "stint", "nimcrypto >= 0.4.11", "uuids >= 0.1.10"
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,69 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"flag"
|
||||
"fmt"
|
||||
"log"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"strings"
|
||||
)
|
||||
|
||||
var qrcExtensions = map[string]bool{
|
||||
".qml": true,
|
||||
".js": true,
|
||||
".svg": true,
|
||||
".png": true,
|
||||
".ico": true,
|
||||
".icns": true,
|
||||
".mp3": true,
|
||||
".wav": true,
|
||||
".otf": true,
|
||||
".ttf": true,
|
||||
".webm": true,
|
||||
".qm": true,
|
||||
}
|
||||
|
||||
func main() {
|
||||
sourceDirName := flag.String("source", "", "source dir containing ui files")
|
||||
qrcFileName := flag.String("output", "resources.qrc", "output filename")
|
||||
flag.Parse()
|
||||
if flag.NFlag() == 0 {
|
||||
flag.Usage()
|
||||
return
|
||||
}
|
||||
|
||||
qrcFile, err := os.Create(*qrcFileName)
|
||||
if err != nil {
|
||||
log.Fatalf("Failed creating qrc file: %s", err)
|
||||
}
|
||||
defer qrcFile.Close()
|
||||
|
||||
qrcFile.WriteString("<!DOCTYPE RCC>\n")
|
||||
qrcFile.WriteString("<RCC version=\"1.0\">\n")
|
||||
qrcFile.WriteString(" <qresource>\n")
|
||||
|
||||
counter := 0
|
||||
err = filepath.Walk(*sourceDirName,
|
||||
func(path string, info os.FileInfo, err error) error {
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if !info.IsDir() {
|
||||
ext := filepath.Ext(path)
|
||||
base := filepath.Base(path)
|
||||
if qrcExtensions[ext] || base == "qmldir" {
|
||||
counter++
|
||||
fixedPath := strings.ReplaceAll(path, "\\", "/")
|
||||
fixedPath = "./" + strings.TrimPrefix(fixedPath, *sourceDirName)
|
||||
qrcFile.WriteString(" <file>" + fixedPath + "</file>\n")
|
||||
}
|
||||
}
|
||||
return nil
|
||||
})
|
||||
|
||||
qrcFile.WriteString(" </qresource>\n")
|
||||
qrcFile.WriteString("</RCC>")
|
||||
|
||||
fmt.Printf("%d resources added\n", counter)
|
||||
}
|
||||
Binary file not shown.
+5059
File diff suppressed because it is too large
Load Diff
Binary file not shown.
+5192
File diff suppressed because it is too large
Load Diff
Binary file not shown.
+5190
File diff suppressed because it is too large
Load Diff
Binary file not shown.
+5504
File diff suppressed because it is too large
Load Diff
Binary file not shown.
+5190
File diff suppressed because it is too large
Load Diff
Binary file not shown.
+5190
File diff suppressed because it is too large
Load Diff
Binary file not shown.
+5171
File diff suppressed because it is too large
Load Diff
Binary file not shown.
+5163
File diff suppressed because it is too large
Load Diff
Binary file not shown.
+5171
File diff suppressed because it is too large
Load Diff
Binary file not shown.
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user