Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

MacOS Installer Package #1242

Merged
merged 12 commits into from
Jun 17, 2022
3 changes: 3 additions & 0 deletions .appveyor.yml
Original file line number Diff line number Diff line change
Expand Up @@ -117,8 +117,11 @@ for:
install:
- brew install goreleaser
- brew install gh
- brew install jq
- brew install wget
build_script:
- make github-release-non-linux
- make mac-installer-release

- # Docker Deploy (Master)
skip_tags: true
Expand Down
2 changes: 1 addition & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ Char
/scripts/mac_installer/icon_128x128.png
/scripts/mac_installer/icon_128x128@2x.png
/mac_build
/SkywireInstaller*.pkg
/skywire-installer*.pkg
*.dmg
/scripts/mac_installer/icon.iconset/
releaseChangelog.md
Expand Down
14 changes: 7 additions & 7 deletions .goreleaser.yml
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ builds:
env:
- CGO_ENABLED=1
main: ./cmd/skywire-visor/
ldflags: -s -w -X github.com/skycoin/skywire-utilities/pkg/buildinfo.version=v{{.Version}} -X github.com/skycoin/skywire-utilities/pkg/buildinfo.commit={{.ShortCommit}} -X github.com/skycoin/skywire-utilities/pkg/buildinfo.date={{.Date}} -X github.com/skycoin/skywire/pkg/visor.BuildTag={{.Os}}_{{.Arch}}
ldflags: -s -w -X github.com/skycoin/skywire-utilities/pkg/buildinfo.version=v{{.Version}} -X github.com/skycoin/skywire-utilities/pkg/buildinfo.commit={{.ShortCommit}} -X github.com/skycoin/skywire-utilities/pkg/buildinfo.date={{.Date}} -X github.com/skycoin/skywire/pkg/visor.BuildTag={{.Os}}

- id: skywire-cli
binary: skywire-cli
Expand All @@ -53,7 +53,7 @@ builds:
env:
- CGO_ENABLED=0
main: ./cmd/skywire-cli/
ldflags: -s -w -X github.com/skycoin/skywire-utilities/pkg/buildinfo.version=v{{.Version}} -X github.com/skycoin/skywire-utilities/pkg/buildinfo.commit={{.ShortCommit}} -X github.com/skycoin/skywire-utilities/pkg/buildinfo.date={{.Date}} -X github.com/skycoin/skywire/pkg/visor.BuildTag={{.Os}}_{{.Arch}}
ldflags: -s -w -X github.com/skycoin/skywire-utilities/pkg/buildinfo.version=v{{.Version}} -X github.com/skycoin/skywire-utilities/pkg/buildinfo.commit={{.ShortCommit}} -X github.com/skycoin/skywire-utilities/pkg/buildinfo.date={{.Date}}

- id: skychat
binary: apps/skychat
Expand All @@ -72,7 +72,7 @@ builds:
env:
- CGO_ENABLED=0
main: ./cmd/apps/skychat/
ldflags: -s -w -X github.com/skycoin/skywire-utilities/pkg/buildinfo.version=v{{.Version}} -X github.com/skycoin/skywire-utilities/pkg/buildinfo.commit={{.ShortCommit}} -X github.com/skycoin/skywire-utilities/pkg/buildinfo.date={{.Date}} -X github.com/skycoin/skywire/pkg/visor.BuildTag={{.Os}}_{{.Arch}}
ldflags: -s -w -X github.com/skycoin/skywire-utilities/pkg/buildinfo.version=v{{.Version}} -X github.com/skycoin/skywire-utilities/pkg/buildinfo.commit={{.ShortCommit}} -X github.com/skycoin/skywire-utilities/pkg/buildinfo.date={{.Date}}

- id: skysocks
binary: apps/skysocks
Expand All @@ -91,7 +91,7 @@ builds:
env:
- CGO_ENABLED=0
main: ./cmd/apps/skysocks/
ldflags: -s -w -X github.com/skycoin/skywire-utilities/pkg/buildinfo.version=v{{.Version}} -X github.com/skycoin/skywire-utilities/pkg/buildinfo.commit={{.ShortCommit}} -X github.com/skycoin/skywire-utilities/pkg/buildinfo.date={{.Date}} -X github.com/skycoin/skywire/pkg/visor.BuildTag={{.Os}}_{{.Arch}}
ldflags: -s -w -X github.com/skycoin/skywire-utilities/pkg/buildinfo.version=v{{.Version}} -X github.com/skycoin/skywire-utilities/pkg/buildinfo.commit={{.ShortCommit}} -X github.com/skycoin/skywire-utilities/pkg/buildinfo.date={{.Date}}

- id: skysocks-client
binary: apps/skysocks-client
Expand All @@ -110,7 +110,7 @@ builds:
env:
- CGO_ENABLED=0
main: ./cmd/apps/skysocks-client/
ldflags: -s -w -X github.com/skycoin/skywire-utilities/pkg/buildinfo.version=v{{.Version}} -X github.com/skycoin/skywire-utilities/pkg/buildinfo.commit={{.ShortCommit}} -X github.com/skycoin/skywire-utilities/pkg/buildinfo.date={{.Date}} -X github.com/skycoin/skywire/pkg/visor.BuildTag={{.Os}}_{{.Arch}}
ldflags: -s -w -X github.com/skycoin/skywire-utilities/pkg/buildinfo.version=v{{.Version}} -X github.com/skycoin/skywire-utilities/pkg/buildinfo.commit={{.ShortCommit}} -X github.com/skycoin/skywire-utilities/pkg/buildinfo.date={{.Date}}

- id: vpn-server
binary: apps/vpn-server
Expand All @@ -129,7 +129,7 @@ builds:
env:
- CGO_ENABLED=0
main: ./cmd/apps/vpn-server/
ldflags: -s -w -X github.com/skycoin/skywire-utilities/pkg/buildinfo.version=v{{.Version}} -X github.com/skycoin/skywire-utilities/pkg/buildinfo.commit={{.ShortCommit}} -X github.com/skycoin/skywire-utilities/pkg/buildinfo.date={{.Date}} -X github.com/skycoin/skywire/pkg/visor.BuildTag={{.Os}}_{{.Arch}}
ldflags: -s -w -X github.com/skycoin/skywire-utilities/pkg/buildinfo.version=v{{.Version}} -X github.com/skycoin/skywire-utilities/pkg/buildinfo.commit={{.ShortCommit}} -X github.com/skycoin/skywire-utilities/pkg/buildinfo.date={{.Date}}

- id: vpn-client
binary: apps/vpn-client
Expand All @@ -148,7 +148,7 @@ builds:
env:
- CGO_ENABLED=0
main: ./cmd/apps/vpn-client/
ldflags: -s -w -X github.com/skycoin/skywire-utilities/pkg/buildinfo.version=v{{.Version}} -X github.com/skycoin/skywire-utilities/pkg/buildinfo.commit={{.ShortCommit}} -X github.com/skycoin/skywire-utilities/pkg/buildinfo.date={{.Date}} -X github.com/skycoin/skywire/pkg/visor.BuildTag={{.Os}}_{{.Arch}}
ldflags: -s -w -X github.com/skycoin/skywire-utilities/pkg/buildinfo.version=v{{.Version}} -X github.com/skycoin/skywire-utilities/pkg/buildinfo.commit={{.ShortCommit}} -X github.com/skycoin/skywire-utilities/pkg/buildinfo.date={{.Date}}

archives:
- id: darwin-windows
Expand Down
5 changes: 5 additions & 0 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -379,6 +379,11 @@ mac-installer: ## Create signed and notarized application, run make mac-installe
mac-installer-help: ## Show installer creation help
./scripts/mac_installer/create_installer.sh -h

mac-installer-release: mac-installer ## Upload created signed and notarized applciation to github
$(eval GITHUB_TAG=$(shell git describe --abbrev=0 --tags))
gh release upload --repo skycoin/skywire ${GITHUB_TAG} ./skywire-installer-${GITHUB_TAG}-darwin-amd64.pkg
gh release upload --repo skycoin/skywire ${GITHUB_TAG} ./skywire-installer-${GITHUB_TAG}-darwin-arm64.pkg

win-installer:
@powershell '.\scripts\win_installer\script.ps1'

Expand Down
4 changes: 4 additions & 0 deletions internal/gui/gui_darwin.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,3 +17,7 @@ func checkIsPackage() bool {
_, err := os.Stat(deinstallerPath)
return err == nil
}

func isRoot() bool {
return false
}
11 changes: 11 additions & 0 deletions internal/gui/gui_linux.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ package gui

import (
"os"
"os/user"
)

// TODO (darkrengarius): change path
Expand All @@ -17,3 +18,13 @@ func checkIsPackage() bool {
_, err := os.Stat(deinstallerPath)
return err == nil
}

func isRoot() bool {
userLvl, err := user.Current()
if err == nil {
if userLvl.Username == "root" {
return true
}
}
return false
}
12 changes: 0 additions & 12 deletions internal/gui/gui_unix.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,21 +4,9 @@
package gui

import (
"os/user"

"github.com/skycoin/skywire/pkg/util/osutil"
)

func platformExecUninstall() error {
return osutil.Run("/bin/bash", "-c", deinstallerPath)
}

func isRoot() bool {
userLvl, err := user.Current()
if err == nil {
if userLvl.Username == "root" {
return true
}
}
return false
}
4 changes: 2 additions & 2 deletions pkg/skyenv/values_darwin.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ const (
// PackageConfig contains installation paths (for mac)
func PackageConfig() PkgConfig {
var pkgconfig PkgConfig
pkgconfig.Launcher.BinPath = "/Library/Application Support/Skywire/apps"
pkgconfig.Launcher.BinPath = "/Applications/Skywire.app/Contents/MacOS/apps"
pkgconfig.LocalPath = "/Library/Application Support/Skywire/local"
pkgconfig.Hypervisor.DbPath = "/Library/Application Support/Skywire/users.db"
pkgconfig.Hypervisor.EnableAuth = true
Expand All @@ -25,7 +25,7 @@ func PackageConfig() PkgConfig {
// UserConfig contains installation paths (for mac)
func UserConfig() PkgConfig {
var usrconfig PkgConfig
usrconfig.Launcher.BinPath = "/Library/Application Support/Skywire/apps"
usrconfig.Launcher.BinPath = "/Applications/Skywire.app/Contents/MacOS/apps"
usrconfig.LocalPath = HomePath() + "/.skywire/local"
usrconfig.Hypervisor.DbPath = HomePath() + "/.skywire/users.db"
usrconfig.Hypervisor.EnableAuth = true
Expand Down
56 changes: 16 additions & 40 deletions scripts/mac_installer/create_installer.sh
Original file line number Diff line number Diff line change
Expand Up @@ -6,14 +6,11 @@ installer_build_dir="./mac_build"
installer_package_dir="${installer_build_dir}"/binaries/Skywire.app
git_tag=$(git describe --tags)
date_format=$(date -u "+%Y-%m-%d")
go_arch=$(go env GOARCH) # build for amd64 and arm64 from single host
go_arch=
sign_binary=false
notarize_binary=false
staple_notarization=false
package_path=
developer_id=
output=
BUILDTAG=MacOS

greent='\033[0;32m'
yellowt='\033[0;33m'
Expand All @@ -27,21 +24,14 @@ if [[ "$current_os" != "Darwin" ]]; then
fi

function print_usage() {
echo "Usage: sh create_installer.sh [-o|--output output_skywire_dir] [-s | --sign signs the binary] [-n | --notarize notarize the binary ] [-t <PACKAGE_PATH> | --staple <PACKAGE_PATH> ]"
echo "Usage: sh create_installer.sh [-o|--output output_skywire_dir] [-s | --sign signs the binary] [-n | --notarize notarize the binary ]"
echo "You need to provide the following environment variables if you want to sign and notarize the binary:"
echo -e "${greent}MAC_HASH_APPLICATION_ID${nct}: Hash of Developer ID Application"
echo -e "${greent}MAC_HASH_INSTALLER_ID${nct} : Hash of Developer ID Installer"
echo -e "${greent}MAC_DEVELOPER_USERNAME${nct} : Developer Account Email"
echo -e "${greent}MAC_DEVELOPER_PASSWORD${nct} : Application specific / Apple ID password ${yellowt}https://support.apple.com/en-us/HT204397${nct}"
}

function staple_installer() {
if [ -z "$package_path" ]; then
echo "package_path of option -t cannot be empty"
fi
xcrun stapler staple "${package_path}"
}

function build_installer() {
set -euo pipefail

Expand All @@ -57,9 +47,10 @@ function build_installer() {
echo "Storing installer to ${output}"
fi

# build skywire binariea
make CGO_ENABLED=1 GOOS=darwin GOARCH="${go_arch}" build-systray BUILDTAG=$BUILDTAG

# fetch skywire binaries from last release
download_url=$(eval curl https://api.github.com/repos/skycoin/skywire/releases | jq '.[0].assets[] | select(.name|match("darwin-'${go_arch}'.tar.gz")) | .browser_download_url')
wget ${download_url:1:$((${#download_url} - 2))} -O - | tar -xz

if [ -d ${installer_build_dir}/binaries/Skywire.app ]; then
rm -rf ${installer_build_dir}/binaries/Skywire.app
fi
Expand All @@ -69,7 +60,7 @@ function build_installer() {
mkdir -p ${installer_package_dir}/Contents/{Resources,MacOS/apps}

# build deinstaller
go build -o ${installer_package_dir}/Contents/MacOS/deinstaller ${mac_script_dir}/desktop-deinstaller
go build -o ${installer_package_dir}/Contents/MacOS/deinstaller ${mac_script_dir}/desktop-deinstaller/deinstaller.go

# prepare Distribution.xml
cp ${mac_script_dir}/Distribution.xml ${installer_build_dir}/
Expand All @@ -88,7 +79,7 @@ function build_installer() {
cat <<EOF >${installer_package_dir}/Contents/MacOS/Skywire
#!/bin/bash

osascript -e "do shell script \"/Applications/Skywire.app/Contents/MacOS/skywire-visor --systray > /Users/\${USER}/Library/Logs/skywire/visor.log\" with administrator privileges"
osascript -e "do shell script \"/Applications/Skywire.app/Contents/MacOS/skywire-visor -c '/Users/\${USER}/Library/Application Support/Skywire/skywire-config.json' > /Users/\${USER}/Library/Logs/skywire/visor.log\" with administrator privileges"

EOF

Expand Down Expand Up @@ -117,7 +108,7 @@ EOF
pkgbuild --root ${installer_build_dir}/binaries --identifier com.skycoin.skywire.updater --install-location /Applications/ --scripts ${installer_build_dir}/update_scripts ${installer_build_dir}/updater.pkg
pkgbuild --nopayload --identifier com.skycoin.skywire.remover --scripts ${installer_build_dir}/remove_scripts ${installer_build_dir}/remover.pkg

package_name=SkywireInstaller-${git_tag}-${date_format}-${go_arch}.pkg
package_name=skywire-installer-${git_tag}-darwin-${go_arch}.pkg

cp ${mac_script_dir}/Distribution_customized.xml ${installer_build_dir}/Distribution.xml

Expand All @@ -137,6 +128,8 @@ EOF
echo -e "${greent}check your email for notarization status${nct}"
}
fi

rm -rf ${installer_build_dir}
}

while :; do
Expand Down Expand Up @@ -169,11 +162,6 @@ while :; do
notarize_binary=true
shift
;;
-t | --staple)
staple_notarization=true
package_path="${2}"
shift
;;
-?*)
printf 'WARN: Unknown option (ignored): %s\n' "$1" >&2
;;
Expand All @@ -184,22 +172,10 @@ while :; do
shift
done

# call build_installer twice, once for the original host architecture
# and one for the other one (x86_64 and arm64 or vice versa)
# call build_installer twice, once for amd64 and once for arm64

if [ "$staple_notarization" == false ]; then
build_installer
go_arch=arm64
build_installer

case ${go_arch} in
amd64)
go_arch=arm64
build_installer
;;
# arm64)
# go_arch=amd64
# build_installer
# ;;
esac
else
staple_installer
fi
go_arch=amd64
build_installer
17 changes: 12 additions & 5 deletions scripts/mac_installer/install_scripts/postinstall
Original file line number Diff line number Diff line change
Expand Up @@ -5,17 +5,17 @@ set -euo pipefail
skywire_dir=/Users/${USER}/Library/Application\ Support/Skywire
log_dir=/Users/${USER}/Library/Logs/skywire

mkdir -p "${skywire_dir}"

if [[ -d ${skywire_dir}/Skywireapp ]]; then
rm -rf "${skywire_dir}"/Skywireapp
if [[ -d ${skywire_dir} ]]; then
rm -rf "${skywire_dir}"
fi

mkdir -p "${skywire_dir}"

chown -R "${USER}" "$skywire_dir"

echo "generating skywire config if it doesn't exist"
if [[ ! -f "${skywire_dir}"/skywire-config.json ]]; then
/Applications/Skywire.app/Contents/MacOS/skywire-cli config gen -p -o "${skywire_dir}"/skywire-config.json --is-hypervisor
/Applications/Skywire.app/Contents/MacOS/skywire-cli config gen -bpio "${skywire_dir}"/skywire-config.json --disableapps skychat,skysocks,skysocks-client,vpn-server
fi
chown "${USER}" "${skywire_dir}"/skywire-config.json

Expand All @@ -24,6 +24,9 @@ LOG_CLEANER_PLIST_PATH=/Users/${USER}/Library/LaunchAgents/com.skycoin.skywire.l
LOG_PATH=${log_dir}/visor.log

## Log cleaner to truncate logs every hour
if [[ ! -d /Users/${USER}/Library/LaunchAgents ]]; then
mkdir /Users/${USER}/Library/LaunchAgents
fi
cat <<EOF >"${LOG_CLEANER_PLIST_PATH}"
<?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\">
Expand All @@ -45,8 +48,12 @@ EOF

echo "loading logcleaner as service"
chown "${USER}" "${LOG_CLEANER_PLIST_PATH}"
sudo -u "$USER" launchctl load -w "${LOG_CLEANER_PLIST_PATH}"

echo "moving applications to /Applications"
if [[ ! -d /usr/local/bin ]]; then
mkdir /usr/local/bin
fi
if [[ ! -L /usr/local/bin/skywire-cli ]]; then
ln -s /Applications/Skywire.app/Contents/MacOS/skywire-cli /usr/local/bin/skywire-cli
fi
6 changes: 2 additions & 4 deletions scripts/mac_installer/update_scripts/postinstall
Original file line number Diff line number Diff line change
Expand Up @@ -21,10 +21,8 @@ if [[ -L /usr/local/bin/skywire-cli ]]; then
unlink /usr/local/bin/skywire-cli
fi

if [[ ! -f "${skywire_dir}"/skywire-config.json ]]; then
/Applications/Skywireapp/Contents/MacOS/skywire-cli config gen -p -o "${skywire_dir}"/skywire-config.json --is-hypervisor
chown "${USER}" "${skywire_dir}"/skywire-config.json
fi
/Applications/Skywire.app/Contents/MacOS/skywire-cli config gen -bprio "${skywire_dir}"/skywire-config.json --disableapps skychat,skysocks,skysocks-client,vpn-server
chown "${USER}" "${skywire_dir}"/skywire-config.json

echo "updating skywire"
if [[ ! -L /usr/local/bin/skywire-cli ]]; then
Expand Down