Добавь установку Swift-приложения VPN
This commit is contained in:
141
install.sh
141
install.sh
@@ -15,6 +15,8 @@ USE_BITWARDEN=1
|
||||
USE_TOUCHID=1
|
||||
INSTALL_SUDOERS=1
|
||||
INSTALL_ALIASES=1
|
||||
INSTALL_APP=1
|
||||
INSTALL_AUTOSTART=1
|
||||
CONFIGURE_KEYCHAIN=0
|
||||
DRY_RUN=0
|
||||
FORCE=0
|
||||
@@ -23,7 +25,11 @@ BITWARDEN_FORCED=0
|
||||
TOUCHID_FORCED=0
|
||||
SUDOERS_FORCED=0
|
||||
SHELL_FORCED=0
|
||||
APP_FORCED=0
|
||||
AUTOSTART_FORCED=0
|
||||
CONFIGURE_KEYCHAIN_FORCED=0
|
||||
APP_DIR="${LEMANA_VPN_APP_DIR:-$HOME/Applications/LemanaVPN.app}"
|
||||
LAUNCH_AGENT="$HOME/Library/LaunchAgents/ru.dokops.LemanaVPN.plist"
|
||||
|
||||
usage() {
|
||||
cat <<'USAGE'
|
||||
@@ -41,6 +47,10 @@ Options:
|
||||
--raw-base-url URL Raw file base URL for curl installs
|
||||
--no-sudoers Do not install sudoers rules
|
||||
--no-shell Do not update ~/.zshrc aliases
|
||||
--with-app Build/install macOS menu bar app (default)
|
||||
--without-app Do not build/install macOS menu bar app
|
||||
--with-autostart Install LaunchAgent for menu bar app (default)
|
||||
--without-autostart Do not install LaunchAgent
|
||||
--interactive Ask before installing optional missing modules
|
||||
--non-interactive Use selected/default modules without prompts
|
||||
--minimal Same as --without-bitwarden --without-touchid
|
||||
@@ -100,6 +110,24 @@ while [ "$#" -gt 0 ]; do
|
||||
INSTALL_ALIASES=0
|
||||
SHELL_FORCED=1
|
||||
;;
|
||||
--with-app)
|
||||
INSTALL_APP=1
|
||||
APP_FORCED=1
|
||||
;;
|
||||
--without-app)
|
||||
INSTALL_APP=0
|
||||
INSTALL_AUTOSTART=0
|
||||
APP_FORCED=1
|
||||
AUTOSTART_FORCED=1
|
||||
;;
|
||||
--with-autostart)
|
||||
INSTALL_AUTOSTART=1
|
||||
AUTOSTART_FORCED=1
|
||||
;;
|
||||
--without-autostart)
|
||||
INSTALL_AUTOSTART=0
|
||||
AUTOSTART_FORCED=1
|
||||
;;
|
||||
--interactive) INTERACTIVE=1 ;;
|
||||
--non-interactive) INTERACTIVE=0 ;;
|
||||
--minimal)
|
||||
@@ -215,6 +243,9 @@ print_detected_state() {
|
||||
log " DNS cleanup: $(bool_word test -x "$DNS_CLEANUP")"
|
||||
log " sudoers: $(bool_word test -f /etc/sudoers.d/lemana-vpn-openconnect)/$(bool_word test -f /etc/sudoers.d/lemana-vpn-dns)"
|
||||
log " shell aliases: $(bool_word zsh_aliases_installed)"
|
||||
log " Swift: $(bool_word command -v swift)"
|
||||
log " Menu Bar app: $(bool_word test -x "$APP_DIR/Contents/MacOS/LemanaVPN")"
|
||||
log " LaunchAgent: $(bool_word test -f "$LAUNCH_AGENT")"
|
||||
log " Keychain password: $(bool_word keychain_has openconnect-lite "$USERNAME")"
|
||||
log " Keychain TOTP seed: $(bool_word keychain_has openconnect-lite "totp/$USERNAME")"
|
||||
}
|
||||
@@ -269,6 +300,23 @@ choose_modules() {
|
||||
fi
|
||||
fi
|
||||
|
||||
if [ "$APP_FORCED" -eq 0 ] && ! [ -x "$APP_DIR/Contents/MacOS/LemanaVPN" ]; then
|
||||
if yes_no "Swift Menu Bar app не найден. Собрать и установить LemanaVPN.app?" y; then
|
||||
INSTALL_APP=1
|
||||
else
|
||||
INSTALL_APP=0
|
||||
INSTALL_AUTOSTART=0
|
||||
fi
|
||||
fi
|
||||
|
||||
if [ "$AUTOSTART_FORCED" -eq 0 ] && [ "$INSTALL_APP" -eq 1 ] && ! [ -f "$LAUNCH_AGENT" ]; then
|
||||
if yes_no "Включить автозапуск LemanaVPN.app при логине?" y; then
|
||||
INSTALL_AUTOSTART=1
|
||||
else
|
||||
INSTALL_AUTOSTART=0
|
||||
fi
|
||||
fi
|
||||
|
||||
if [ "$CONFIGURE_KEYCHAIN_FORCED" -eq 0 ] && [ "$USE_BITWARDEN" -eq 0 ]; then
|
||||
if ! keychain_has openconnect-lite "$USERNAME" || ! keychain_has openconnect-lite "totp/$USERNAME"; then
|
||||
if yes_no "Bitwarden отключён, а Keychain credentials неполные. Записать LDAP-пароль и TOTP seed после установки?" y; then
|
||||
@@ -432,6 +480,92 @@ install_touchid_helper() {
|
||||
run install -m 700 "$tmp/keychain-fingerprint-bin" "$INSTALL_BIN_DIR/keychain-fingerprint"
|
||||
}
|
||||
|
||||
install_menu_bar_app() {
|
||||
[ "$INSTALL_APP" -eq 1 ] || return 0
|
||||
|
||||
need_cmd swift
|
||||
|
||||
tmp="$1"
|
||||
app_src="$tmp/app"
|
||||
run mkdir -p "$app_src/Sources/LemanaVPN"
|
||||
|
||||
download_file "app/Package.swift" "$app_src/Package.swift"
|
||||
download_file "app/Sources/LemanaVPN/LemanaVPNApp.swift" "$app_src/Sources/LemanaVPN/LemanaVPNApp.swift"
|
||||
download_file "app/Sources/LemanaVPN/VPNManager.swift" "$app_src/Sources/LemanaVPN/VPNManager.swift"
|
||||
|
||||
log "Building LemanaVPN.app"
|
||||
run swift build -c release --package-path "$app_src"
|
||||
|
||||
app_bin="$app_src/.build/release/LemanaVPN"
|
||||
info_plist="$tmp/Info.plist"
|
||||
|
||||
if [ "$DRY_RUN" -eq 0 ] && [ ! -x "$app_bin" ]; then
|
||||
die "Swift build did not produce $app_bin"
|
||||
fi
|
||||
|
||||
run mkdir -p "$APP_DIR/Contents/MacOS" "$APP_DIR/Contents/Resources"
|
||||
run install -m 755 "$app_bin" "$APP_DIR/Contents/MacOS/LemanaVPN"
|
||||
|
||||
write_file "$info_plist" '<?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>CFBundleExecutable</key>
|
||||
<string>LemanaVPN</string>
|
||||
<key>CFBundleIdentifier</key>
|
||||
<string>ru.dokops.LemanaVPN</string>
|
||||
<key>CFBundleName</key>
|
||||
<string>LemanaVPN</string>
|
||||
<key>CFBundleDisplayName</key>
|
||||
<string>LemanaVPN</string>
|
||||
<key>CFBundlePackageType</key>
|
||||
<string>APPL</string>
|
||||
<key>CFBundleShortVersionString</key>
|
||||
<string>1.0</string>
|
||||
<key>CFBundleVersion</key>
|
||||
<string>1</string>
|
||||
<key>LSMinimumSystemVersion</key>
|
||||
<string>13.0</string>
|
||||
<key>LSUIElement</key>
|
||||
<true/>
|
||||
</dict>
|
||||
</plist>'
|
||||
run install -m 644 "$info_plist" "$APP_DIR/Contents/Info.plist"
|
||||
}
|
||||
|
||||
install_launch_agent() {
|
||||
[ "$INSTALL_AUTOSTART" -eq 1 ] || return 0
|
||||
[ "$INSTALL_APP" -eq 1 ] || return 0
|
||||
|
||||
tmp="$1"
|
||||
plist="$tmp/ru.dokops.LemanaVPN.plist"
|
||||
|
||||
run mkdir -p "$HOME/Library/LaunchAgents"
|
||||
write_file "$plist" "<?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>Label</key>
|
||||
<string>ru.dokops.LemanaVPN</string>
|
||||
<key>ProgramArguments</key>
|
||||
<array>
|
||||
<string>$APP_DIR/Contents/MacOS/LemanaVPN</string>
|
||||
</array>
|
||||
<key>RunAtLoad</key>
|
||||
<true/>
|
||||
<key>KeepAlive</key>
|
||||
<false/>
|
||||
</dict>
|
||||
</plist>"
|
||||
run install -m 644 "$plist" "$LAUNCH_AGENT"
|
||||
if [ "$DRY_RUN" -eq 0 ]; then
|
||||
launchctl unload "$LAUNCH_AGENT" >/dev/null 2>&1 || true
|
||||
launchctl load "$LAUNCH_AGENT" >/dev/null 2>&1 || true
|
||||
else
|
||||
printf '+ launchctl load %s\n' "$LAUNCH_AGENT"
|
||||
fi
|
||||
}
|
||||
|
||||
install_shell_aliases() {
|
||||
[ "$INSTALL_ALIASES" -eq 1 ] || return 0
|
||||
|
||||
@@ -491,7 +625,7 @@ main() {
|
||||
choose_modules
|
||||
|
||||
log "Installing Lemana VPN"
|
||||
log "Modules: bitwarden=$USE_BITWARDEN touchid=$USE_TOUCHID sudoers=$INSTALL_SUDOERS shell=$INSTALL_ALIASES"
|
||||
log "Modules: bitwarden=$USE_BITWARDEN touchid=$USE_TOUCHID sudoers=$INSTALL_SUDOERS shell=$INSTALL_ALIASES app=$INSTALL_APP autostart=$INSTALL_AUTOSTART"
|
||||
|
||||
install_homebrew_packages
|
||||
install_openconnect_lite
|
||||
@@ -500,6 +634,8 @@ main() {
|
||||
install_dns_cleanup "$tmp"
|
||||
install_sudoers "$tmp"
|
||||
install_touchid_helper "$tmp"
|
||||
install_menu_bar_app "$tmp"
|
||||
install_launch_agent "$tmp"
|
||||
install_shell_aliases "$tmp"
|
||||
maybe_login_bitwarden
|
||||
|
||||
@@ -512,6 +648,9 @@ main() {
|
||||
log "Open a new shell or run: exec zsh"
|
||||
log "Connect: vpn"
|
||||
log "Status: vpn --status"
|
||||
if [ "$INSTALL_APP" -eq 1 ]; then
|
||||
log "App: open '$APP_DIR'"
|
||||
fi
|
||||
}
|
||||
|
||||
main "$@"
|
||||
|
||||
Reference in New Issue
Block a user