diff --git a/Library/LaunchDaemons/com.daplie.goldilocks.web.plist b/Library/LaunchDaemons/com.daplie.goldilocks.web.plist index 8dab4cd..6746afe 100644 --- a/Library/LaunchDaemons/com.daplie.goldilocks.web.plist +++ b/Library/LaunchDaemons/com.daplie.goldilocks.web.plist @@ -6,6 +6,7 @@ Goldilocks ProgramArguments + /usr/local/bin/node /usr/local/bin/goldilocks --config /etc/goldilocks/goldilocks.yml diff --git a/bin/goldilocks.js b/bin/goldilocks.js index d11f1a1..d7d4a51 100755 --- a/bin/goldilocks.js +++ b/bin/goldilocks.js @@ -32,17 +32,17 @@ function readConfigAndRun(args) { var config; if (args.config) { - filename = path.join(cwd, args.config); + filename = path.resolve(cwd, args.config); text = fs.readFileSync(filename, 'utf8'); } else { - filename = path.join(cwd, 'goldilocks.yml'); + filename = path.resolve(cwd, 'goldilocks.yml'); if (fs.existsSync(filename)) { text = fs.readFileSync(filename, 'utf8'); } else { - filename = path.join(cwd, 'goldilocks.json'); + filename = path.resolve(cwd, 'goldilocks.json'); if (fs.existsSync(filename)) { text = fs.readFileSync(filename, 'utf8'); } else { @@ -56,6 +56,10 @@ function readConfigAndRun(args) { } catch(e) { try { config = require('js-yaml').safeLoad(text); + // blank config file + if ('undefined' === typeof config) { + config = {}; + } } catch(e) { throw new Error( "Could not load '" + filename + "' as JSON nor YAML" diff --git a/etc/goldilocks/goldilocks.yml b/etc/goldilocks/goldilocks.yml new file mode 100644 index 0000000..e69de29 diff --git a/etc/systemd/system/goldilocks.service b/etc/systemd/system/goldilocks.service index 44676ea..640dadc 100644 --- a/etc/systemd/system/goldilocks.service +++ b/etc/systemd/system/goldilocks.service @@ -23,11 +23,11 @@ User=www-data Group=www-data # If we need to pass environment variables in the future -; Environment=GOLDILOCKS_PATH=/opt/goldilocks +Environment=GOLDILOCKS_PATH=/srv/www # Set a sane working directory, sane flags, and specify how to reload the config file WorkingDirectory=/srv/www -ExecStart=/usr/local/bin/goldilocks --config /etc/goldilocks/goldilocks.yml +ExecStart=/usr/local/bin/node /usr/local/bin/goldilocks --config /etc/goldilocks/goldilocks.yml ExecReload=/bin/kill -USR1 $MAINPID # Limit the number of file descriptors and processes; see `man systemd.exec` for more limit settings. @@ -46,11 +46,12 @@ ProtectSystem=full # … except TLS/SSL, ACME, and Let's Encrypt certificates # and /var/log/goldilocks, because we want a place where logs can go. # This merely retains r/w access rights, it does not add any new. Must still be writable on the host! -ReadWriteDirectories=/etc/goldilocks /etc/acme /etc/letsencrypt /etc/ssl /var/log/goldilocks /opt/goldilocks /srv/www +ReadWriteDirectories=/etc/goldilocks /etc/ssl /srv/www /var/log/goldilocks +# you may also want to add other directories such as /opt/goldilocks /etc/acme /etc/letsencrypt # Note: in v231 and above ReadWritePaths has been renamed to ReadWriteDirectories ; ReadWritePaths=/etc/goldilocks /var/log/goldilocks -; + # The following additional security directives only work with systemd v229 or later. # They further retrict privileges that can be gained. # Note that you may have to add capabilities required by any plugins in use. diff --git a/install.sh b/install.sh index 0250e7b..e524083 100644 --- a/install.sh +++ b/install.sh @@ -1,5 +1,17 @@ #!/bin/bash +# something or other about android and tmux using PREFIX +#: "${PREFIX:=''}" +MY_ROOT="" +if [ -z "${PREFIX-}" ]; then + MY_ROOT="" +else + MY_ROOT="$PREFIX" +fi +# Not every platform has or needs sudo, gotta save them O(1)s... +sudo_cmd="" +((EUID)) && [[ -z "$ANDROID_ROOT" ]] && sudo_cmd="sudo" + ############################### # # # http_get # @@ -54,15 +66,12 @@ detect_http_get # # ################### -# Not every platform has or needs sudo -sudo_cmd="" -((EUID)) && [[ -z "$ANDROID_ROOT" ]] && sudo_cmd="sudo" - my_app_name=goldilocks my_app_pkg_name=com.daplie.goldilocks.web my_app_dir=$(mktemp -d) installer_base="https://git.daplie.com/Daplie/goldilocks.js/raw/master" +my_app_etc_config="etc/${my_app_name}/${my_app_name}.yml" my_app_systemd_service="etc/systemd/system/${my_app_name}.service" my_app_systemd_tmpfiles="etc/tmpfiles.d/${my_app_name}.conf" my_app_launchd_service="Library/LaunchDaemons/${my_app_pkg_name}.plist" @@ -72,22 +81,26 @@ install_for_systemd() echo "" echo "Installing as systemd service" echo "" - dap_dl "$installer_base/$my_app_system_service" "$my_app_dir/$my_app_system_service" - $sudo_cmd mv "$my_app_dir/$my_app_system_service" "$PREFIX/$my_app_system_service" - $sudo_cmd chown -R root:root "$PREFIX/$my_app_system_service" - $sudo_cmd chmod 644 "$PREFIX/$my_app_system_service" + mkdir -p $(dirname "$my_app_dir/$my_app_systemd_service") + dap_dl "$installer_base/$my_app_systemd_service" "$my_app_dir/$my_app_systemd_service" + $sudo_cmd mv "$my_app_dir/$my_app_systemd_service" "$MY_ROOT/$my_app_systemd_service" + $sudo_cmd chown -R root:root "$MY_ROOT/$my_app_systemd_service" + $sudo_cmd chmod 644 "$MY_ROOT/$my_app_systemd_service" - dap_dl "$installer_base/$my_app_system_tmpfiles" "$my_app_dir/$my_app_system_tmpfiles" - $sudo_cmd mv "$my_app_dir/$my_app_system_tmpfiles" "$PREFIX/$my_app_system_tmpfiles" - $sudo_cmd chown -R root:root "$PREFIX/$my_app_system_tmpfiles" - $sudo_cmd chmod 644 "$PREFIX/$my_app_system_tmpfiles" + mkdir -p $(dirname "$my_app_dir/$my_app_systemd_tmpfiles") + dap_dl "$installer_base/$my_app_systemd_tmpfiles" "$my_app_dir/$my_app_systemd_tmpfiles" + $sudo_cmd mv "$my_app_dir/$my_app_systemd_tmpfiles" "$MY_ROOT/$my_app_systemd_tmpfiles" + $sudo_cmd chown -R root:root "$MY_ROOT/$my_app_systemd_tmpfiles" + $sudo_cmd chmod 644 "$MY_ROOT/$my_app_systemd_tmpfiles" $sudo_cmd systemctl stop "${my_app_name}.service" >/dev/null 2>/dev/null $sudo_cmd systemctl daemon-reload $sudo_cmd systemctl start "${my_app_name}.service" $sudo_cmd systemctl enable "${my_app_name}.service" - echo "$my_app_name started with systemctl" + echo "$my_app_name started with systemctl, check its status like so" + echo " $sudo_cmd systemctl status $my_app_name" + echo " $sudo_cmd journalctl -xe -u goldilocks" } install_for_launchd() @@ -96,20 +109,37 @@ install_for_launchd() echo "Installing as launchd service" echo "" # See http://www.launchd.info/ + mkdir -p $(dirname "$my_app_dir/$my_app_launchd_service") dap_dl "$installer_base/$my_app_launchd_service" "$my_app_dir/$my_app_launchd_service" - $sudo_cmd mv "$my_app_dir/$my_app_launchd_service" "$PREFIX/$my_app_launchd_service" - $sudo_cmd chown root:wheel "$PREFIX/$my_app_launchd_service" - $sudo_cmd chmod 0644 "$PREFIX/$my_app_launchd_service" - $sudo_cmd launchctl unload -w "$PREFIX/$my_app_launchd_service" >/dev/null 2>/dev/null - $sudo_cmd launchctl load -w "$PREFIX/$my_app_launchd_service" + $sudo_cmd mv "$my_app_dir/$my_app_launchd_service" "$MY_ROOT/$my_app_launchd_service" + $sudo_cmd chown root:wheel "$MY_ROOT/$my_app_launchd_service" + $sudo_cmd chmod 0644 "$MY_ROOT/$my_app_launchd_service" + $sudo_cmd launchctl unload -w "$MY_ROOT/$my_app_launchd_service" >/dev/null 2>/dev/null + $sudo_cmd launchctl load -w "$MY_ROOT/$my_app_launchd_service" echo "$my_app_name started with launchd" } +install_etc_config() +{ + if [ ! -e "$MY_ROOT/$my_app_etc_config" ]; then + $sudo_cmd mkdir -p $(dirname "$MY_ROOT/$my_app_etc_config") + mkdir -p $(dirname "$my_app_dir/$my_app_etc_config") + dap_dl "$installer_base/$my_app_etc_config" "$my_app_dir/$my_app_etc_config" + $sudo_cmd mv "$my_app_dir/$my_app_etc_config" "$MY_ROOT/$my_app_etc_config" + fi + + $sudo_cmd chown -R www-data:www-data $(dirname "$MY_ROOT/$my_app_etc_config") + $sudo_cmd chmod 775 $(dirname "$MY_ROOT/$my_app_etc_config") + $sudo_cmd chmod 664 "$MY_ROOT/$my_app_etc_config" +} + install_service() { + install_etc_config + installable="" - if [ -d "$PREFIX/etc/systemd/system" ]; then + if [ -d "$MY_ROOT/etc/systemd/system" ]; then install_for_systemd installable="true" fi @@ -138,5 +168,17 @@ dap_dl_bash "https://git.daplie.com/coolaj86/node-install-script/raw/master/setu # Install npm install -g 'git+https://git@git.daplie.com/Daplie/goldilocks.js.git#v1' +# Unistall +dap_dl "https://git.daplie.com/Daplie/goldilocks.js/raw/master/uninstall.sh" "./goldilocks-uninstall" +$sudo_cmd chmod 755 "./goldilocks-uninstall" +$sudo_cmd chown root:root "./goldilocks-uninstall" +$sudo_cmd mv "./goldilocks-uninstall" "/usr/local/bin/uninstall-goldilocks" + +# Set perms +$sudo_cmd mkdir -p /srv/www +$sudo_cmd mkdir -p /etc/goldilocks +$sudo_cmd mkdir -p /var/log/goldilocks +$sudo_cmd mkdir -p /opt/goldilocks + # Install Service -install_service \ No newline at end of file +install_service diff --git a/package.json b/package.json index b26bcd1..197b0d4 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "goldilocks", - "version": "2.2.0", + "version": "1.0.0-placeholder", "description": "The node.js webserver that's just right, Greenlock (HTTPS/TLS/SSL via ACME/Let's Encrypt) and tunneling (RVPN) included.", "main": "bin/goldilocks.js", "repository": { diff --git a/uninstall.sh b/uninstall.sh new file mode 100644 index 0000000..a577bec --- /dev/null +++ b/uninstall.sh @@ -0,0 +1,48 @@ +#!/bin/bash + +# something or other about android and tmux using PREFIX +#: "${PREFIX:=''}" +MY_ROOT="" +if [ -z "${PREFIX-}" ]; then + MY_ROOT="" +else + MY_ROOT="$PREFIX" +fi +# Not every platform has or needs sudo, gotta save them O(1)s... +sudo_cmd="" +((EUID)) && [[ -z "$ANDROID_ROOT" ]] && sudo_cmd="sudo" + +# you don't want any oopsies when an rm -rf is involved... +set -e +set -u + +my_app_name=goldilocks +my_app_pkg_name=com.daplie.goldilocks.web + +my_app_etc_config="etc/${my_app_name}/${my_app_name}.yml" +my_app_systemd_service="etc/systemd/system/${my_app_name}.service" +my_app_systemd_tmpfiles="etc/tmpfiles.d/${my_app_name}.conf" +my_app_launchd_service="Library/LaunchDaemons/${my_app_pkg_name}.plist" +my_app_upstart_service="etc/init.d/${my_app_name}.conf" + + +$sudo_cmd rm -f /usr/local/bin/goldilocks +$sudo_cmd rm -f /usr/local/bin/uninstall-goldilocks +$sudo_cmd rm -rf /usr/local/lib/node_modules/goldilocks + +$sudo_cmd rm -f "$MY_ROOT/$my_app_etc_config" +$sudo_cmd rmdir -p $(dirname "$MY_ROOT/$my_app_etc_config") 2>/dev/null || true +$sudo_cmd rm -f "$MY_ROOT/$my_app_systemd_service" +$sudo_cmd rm -f "$MY_ROOT/$my_app_systemd_tmpfiles" +$sudo_cmd rm -f "$MY_ROOT/$my_app_launchd_service" +$sudo_cmd rm -f "$MY_ROOT/$my_app_upstart_service" + +$sudo_cmd rm -rf /opt/$my_app_name +$sudo_cmd rm -rf /var/log/$my_app_name + +# TODO flag for --purge +#rm -rf /etc/goldilocks + +# TODO trap uninstall function + +echo "uninstall complete: $my_app_name"