#!/bin/bash set -e set -u # 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 # # boilerplate for curl / wget # # # ############################### # See https://git.daplie.com/Daplie/daplie-snippets/blob/master/bash/http-get.sh http_curl_opts="-fsSL" http_wget_opts="--quiet" http_bin="" http_opts="" http_out="" detect_http_bin() { if type -p curl >/dev/null 2>&1; then http_bin="curl" http_opts="$http_curl_opts" http_out="-o" #curl -fsSL "$url" -o "$PREFIX/tmp/$pkg" elif type -p wget >/dev/null 2>&1; then http_bin="wget" http_opts="$http_wget_opts" http_out="-O" #wget --quiet "$url" -O "$PREFIX/tmp/$pkg" else echo "Aborted, could not find curl or wget" return 7 fi } http_get() { if [ -e "$1" ]; then rsync -a "$1" "$2" elif type -p curl >/dev/null 2>&1; then $http_bin $http_curl_opts $http_out "$2" "$1" elif type -p wget >/dev/null 2>&1; then $http_bin $http_wget_opts $http_out "$2" "$1" else echo "Aborted, could not find curl or wget" return 7 fi } dap_dl() { http_get "$1" "$2" } dap_dl_bash() { dap_url=$1 #dap_args=$2 rm -rf /tmp/dap-tmp-runner.sh $http_bin $http_opts $http_out /tmp/dap-tmp-runner.sh "$dap_url"; bash /tmp/dap-tmp-runner.sh; rm /tmp/dap-tmp-runner.sh } detect_http_bin ## END HTTP_GET ## mvdir_backward_compat() { old_dir=$1 new_dir=$2 # The symlink has already been set up, so no need to do anything. if [ -L $old_dir ] && [ $(readlink $old_dir) == "$new_dir" ]; then return 0 fi if [ -d $old_dir ]; then if [ $(ls $old_dir | wc -l) -gt 0 ]; then mv ${old_dir}/* ${new_dir}/ fi rm -r ${old_dir} #rmdir ${old_dir} fi ln -snf $new_dir $old_dir } ################### # # # Install service # # # ################### install_for_systemd() { echo "" echo "Installing as systemd service" echo "" 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" 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, check its status like so" echo " $sudo_cmd systemctl status $my_app_name" echo " $sudo_cmd journalctl -xe -u $my_app_name" } install_for_launchd() { echo "" 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" "$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() { #echo "install etc config $MY_ROOT / $my_app_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") || true $sudo_cmd chown -R _www:_www $(dirname "$MY_ROOT/$my_app_etc_config") || true $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 #echo "install service" installable="" if [ -d "$MY_ROOT/etc/systemd/system" ]; then install_for_systemd installable="true" fi if [ -d "/Library/LaunchDaemons" ]; then install_for_launchd installable="true" fi if [ -z "$installable" ]; then echo "" echo "Unknown system service init type. You must install as a system service manually." echo '(please file a bug with the output of "uname -a")' echo "" fi echo "" } ## END SERVICE_INSTALL ## # Create dirs, set perms create_skeleton() { $sudo_cmd mkdir -p /srv/www $sudo_cmd mkdir -p /var/log/$my_app_name $sudo_cmd mkdir -p /etc/$my_app_name $sudo_cmd mkdir -p /var/$my_app_name $sudo_cmd mkdir -p /srv/$my_app_name $sudo_cmd mkdir -p /opt/$my_app_name } # Unistall install_uninstaller() { #echo "install uninstaller" dap_dl "https://git.daplie.com/Daplie/walnut.js/raw/master/uninstall.sh" "./walnut-uninstall" $sudo_cmd chmod 755 "./walnut-uninstall" $sudo_cmd chown root:root "./walnut-uninstall" $sudo_cmd mv "./walnut-uninstall" "/usr/local/bin/uninstall-walnut" } # Dependencies export NODE_PATH=/opt/walnut/lib/node_modules export NPM_CONFIG_PREFIX=/opt/walnut $sudo_cmd mkdir -p $NODE_PATH $sudo_cmd chown -R $(whoami) /opt/walnut dap_dl_bash "https://git.daplie.com/coolaj86/node-install-script/raw/master/setup-min.sh" # Install # npm install -g 'git+https://git@git.daplie.com/Daplie/walnut.js.git#v1' my_app_name=walnut my_app_pkg_name=com.daplie.walnut.web my_app_dir=$(mktemp -d) #installer_base="https://git.daplie.com/Daplie/walnut.js/raw/master/dist" #installer_base="$( dirname "${BASH_SOURCE[0]}" )/dist" installer_base="/srv/walnut/core/dist" 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" # Install install_my_app() { # This function shouldn't need to use $sudo_cmd because it is called immediately after # /srv/walnut is chown-ed and we only mess with things in that directory. #git clone git@git.daplie.com:Daplie/walnut.js.git #git clone https://git.daplie.com/Daplie/walnut.js.git /srv/walnut/core mkdir -p /srv/walnut/{core,lib,var,etc,node_modules} rm -rf /srv/walnut/core/node_modules ln -sf ../node_modules /srv/walnut/core/node_modules mkdir -p /srv/walnut/var/sites mkdir -p /srv/walnut/etc/org.oauth3.consumer mkdir -p /srv/walnut/etc/org.oauth3.provider mkdir -p /srv/walnut/etc/client-api-grants mkdir -p /srv/walnut/packages/{rest,api,pages,services} # backwards compat mvdir_backward_compat /srv/walnut/packages/client-api-grants /srv/walnut/etc/client-api-grants mvdir_backward_compat /srv/walnut/packages/sites /srv/walnut/var/sites pushd /srv/walnut/core /opt/walnut/bin/npm install popd } $sudo_cmd mkdir -p /srv/walnut $sudo_cmd chown -R $(whoami) /srv/walnut install_my_app create_skeleton install_uninstaller install_service $sudo_cmd chown -R www-data:www-data /opt/walnut || true $sudo_cmd chown -R _www:_www /opt/walnut || true $sudo_cmd chown -R www-data:www-data /srv/walnut || true $sudo_cmd chown -R _www:_www /srv/walnut || true $sudo_cmd chmod -R ug+rwX /srv/walnut $sudo_cmd chmod -R ug+rwX /opt/walnut # +s sets the setuid/setgid bit, which when set on directories makes it so anything # created inside the directory maintains the same user/group (depending on the bits # set). Any directory created within a directory with those bits set will also have # those bits set. When setuid or setgid bits are set on a file however it means that # if the file is executed it will run with the permissions of the user/group no matter # who actually runs it (see the ping executable for example). # I'm not sure that all systems actually support the use of these bits. find /srv/walnut -type d -exec $sudo_cmd chmod ug+s {} \; || true find /opt/walnut -type d -exec $sudo_cmd chmod ug+s {} \; || true