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

[NEW] Config hooks for snap #12351

Merged
merged 9 commits into from
Dec 6, 2018
4 changes: 2 additions & 2 deletions .snapcraft/resources/Caddyfile
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
http://:8080
proxy / localhost:3000 {
_caddy-url_
proxy / localhost:_port_ {
websocket
transparent
}
49 changes: 46 additions & 3 deletions .snapcraft/resources/initcaddy
Original file line number Diff line number Diff line change
@@ -1,3 +1,46 @@
#!/bin/sh
cp $SNAP/bin/Caddyfile $SNAP_DATA/Caddyfile
echo "Replace $SNAP_DATA/Caddyfile with your own to customize reverse proxy"
#!/bin/bash

# Config options for Caddyfile
#options="site path port"
options="caddy-url port"

refresh_opt_in_config() {
geekgonecrazy marked this conversation as resolved.
Show resolved Hide resolved
# replace an option inside the config file.
opt=$1
value="$2"
if $(grep -q "_${opt}_" $Caddyfile); then
sed "s,_${opt}_,$value," $Caddyfile 2>/dev/null > ${Caddyfile}.new
mv -f ${Caddyfile}.new $Caddyfile 2>/dev/null
else
echo "Fail to update $opt in Caddyfile"
fi
}

create_caddyfile(){
# Copy template to config Caddyfile
cp $SNAP/bin/Caddyfile $SNAP_DATA/Caddyfile
}

update_caddyfile(){
# Config file path for Caddyfile
Caddyfile=$SNAP_DATA/Caddyfile

# Iterate through the config options array
for opt in $options
do
# Use snapctl to get the value registered by the snap set command
refresh_opt_in_config $opt $(snapctl get $opt)
done
}

caddy="$(snapctl get caddy)"
if [[ $caddy == "disable" ]]; then
echo "Caddy is not enabled, please set caddy-url=<your_url> and caddy=enable"
exit 1
fi

create_caddyfile
update_caddyfile

echo "Your URL was successfully configured - Please restart rocketchat and caddy services to apply configuration changes"

16 changes: 13 additions & 3 deletions .snapcraft/resources/startRocketChat
Original file line number Diff line number Diff line change
Expand Up @@ -16,10 +16,20 @@ function start_rocketchat {
export NODE_ENV=production
export BABEL_CACHE_DIR=/tmp
export ROOT_URL=http://localhost
export PORT=3000
export MONGO_URL=mongodb://localhost:27017/parties
export MONGO_OPLOG_URL=mongodb://localhost:27017/local
export PORT="$(snapctl get port)"
export MONGO_URL="$(snapctl get mongo-url)"
export MONGO_OPLOG_URL="$(snapctl get mongo-oplog-url)"
export Accounts_AvatarStorePath=$SNAP_COMMON/uploads
siteurl="$(snapctl get siteurl)"
if [ -n "$siteurl" ]; then
export OVERWRITE_SETTING_Site_Url=$siteurl

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It would be great to see this expanded to allow configuration of any rocketchat setting from snap.
Something similar to that performed by the ansible rocketchat role here: RocketChat/Rocket.Chat.Ansible@81060e9
(See also RocketChat/Rocket.Chat.Ansible#67)

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should be right after that, can drop any file with env variables in $SNAP_COMMON directory and they will be exported

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@nickbroon the problem we run into is snap settings are very picky. So we can't even use the exact same syntax. If we could we could easily let any setting be set. But we would either have to have a predefined list or a very reliable way of converting between one format and another.

the environment variable file in the root is the current way we're going to recommend doing this.

fi

for filename in $SNAP_COMMON/*.env; do
while read env_var; do
export "$env_var"
done < $filename
done

node $SNAP/main.js
}
Expand Down
122 changes: 122 additions & 0 deletions .snapcraft/snap/hooks/configure
Original file line number Diff line number Diff line change
@@ -0,0 +1,122 @@
#!/bin/bash

export PATH="$SNAP/usr/sbin:$SNAP/usr/bin:$SNAP/sbin:$SNAP/bin:$PATH"
export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:$SNAP/lib:$SNAP/usr/lib:$SNAP/lib/x86_64-linux-gnu:$SNAP/usr/lib/x86_64-linux-gnu"
export LD_LIBRARY_PATH=$SNAP_LIBRARY_PATH:$LD_LIBRARY_PATH

# Obtain caddyurl value
caddyurl="$(snapctl get caddy-url)"
# Validate it
#caddyurl_regex='^https?:\/\/([0-9A-Za-z\.-]+){1,}(\.[a-z\.]{2,6})?([\/\da-z\.-]+)?$' #(supporting path)
caddyurl_regex='^https?:\/\/([0-9A-Za-z\.-]+){1,}(\.[a-z\.]{2,6})?$'
if [ -n "$caddyurl" ]; then
if ! [[ $caddyurl =~ $caddyurl_regex ]]; then
echo "\"$caddyurl\" is not a valid url" >&2
exit 1
fi
#else
# if [[ $siteurl =~ ^http: ]] && [[ $siteurl =~ ^http:\/\/([0-9A-Za-z\.-]+){1,}?(\.[a-z\.]{2,6})?\/([\/\da-z\.-]+){1,}$ ]]; then
# path=${siteurl#http://*/}
# site=${siteurl#"http://"}
# site=${site%%/*}
# site=http://$site
# elif [[ $siteurl =~ ^https: ]] && [[ $siteurl =~ ^https:\/\/([0-9A-Za-z\.-]+){1,}?(\.[a-z\.]{2,6})?\/([\/\da-z\.-]+){1,}$ ]]; then
# path=${siteurl#https://*/}
# site=${siteurl#"https://"}
# site=${site%%/*}
# site=https://$site
# else
# path=""
# site=$siteurl
# fi
# snapctl set path=$path
# snapctl set site=$site
fi

# Obtain caddy value
caddy="$(snapctl get caddy)"
# Validate it
caddy_regex='((enable)|(disable))'
if ! [[ $caddy =~ $caddy_regex ]]; then
echo "\"$caddy_regex\" is not a valid, set to enable or disable" >&2
exit 1
else
if [[ $caddy == enable ]]; then
caddyurl="$(snapctl get caddy-url)"
if [ -z "$caddyurl" ]; then
echo "You tried to enable caddy but caddy-url is not set yet, please set up caddy-url first and then enable caddy again" >&2
snapctl set caddy=disable
exit 1
else
snapctl set siteurl=$caddyurl
fi
else
siteurl="$(snapctl get siteurl)"
if [ -n "$siteurl" ]; then
snapctl set siteurl=
fi
fi
fi

# Obtain port value
port="$(snapctl get port)"
# Validate it
port_regex='^([0-9]{1,4}|[1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-5])$'
if ! [[ $port =~ $port_regex ]]; then
echo "\"$port\" is not a valid port" >&2
exit 1
fi

# Obtain mongourl value
mongourl="$(snapctl get mongo-url)"
# Validate it
mongourl_regex='^mongodb:\/\/([0-9A-Za-z\.\-\_]+){1,}(([a-z\.\-\_]+){2,6})?(:[0-9]{2,5})?\/([0-9A-Za-z\_\-]+)$'
if ! [[ $mongourl =~ $mongourl_regex ]] ; then
echo "\"$mongourl\" is not a valid url" >&2
exit 1
fi

# Obtain mongooplogurl value
mongooplogurl="$(snapctl get mongo-oplog-url)"
# Validate it
mongooplogurl_regex='^mongodb:\/\/([0-9A-Za-z\.\-\_]+){1,}(([a-z\.\-\_]+){2,6})?(:[0-9]{2,5})?\/local$'
if ! [[ $mongooplogurl =~ $mongooplogurl_regex ]] ; then
echo "\"$mongooplogurl\" is not a valid url" >&2
exit 1
fi

# Obtain site protocol
https="$(snapctl get https)"
# Validate it
https_regex='((enable)|(disable))'
if ! [[ $https =~ $https_regex ]]; then
echo "\"$https\" should be enable or disable" >&2
exit 1
else
if [[ $https == enable ]] && [[ $caddyurl =~ ^http: ]]; then
echo "Error: You enabled https but your site URL starts with http, disabling https ..."
snapctl set https=disable
exit 1
elif [[ $https == enable ]] && [[ $caddyurl =~ ^https: ]]; then
domain=${caddyurl#"https://"}
domain=${domain%%/*}
pubip=$(dig $domain |grep -A1 ";; ANSWER SECTION:" |tail -1 | awk '{print $5}')
if [ -z "$pubip" ]; then
echo "Error: Can't resove DNS query for $domain, check your DNS configuration, disabling https ..."
snapctl set https=disable
exit 1
else
ip=$(curl ipinfo.io/ip 2>/dev/null)
if [[ $ip != $pubip ]]; then
echo "Error: Your public IP doesn't match the one resolved for caddy-url, disabling https ..."
snapctl set https=disable
exit 1
fi
fi
elif [[ $https == enable ]] && [ -z "$caddyurl" ]; then
echo "Error: You enabled https but your site URL is empty, please set caddy-url=<your_site_url>, disabling https ..."
snapctl set https=disable
exit 1
fi
fi

16 changes: 16 additions & 0 deletions .snapcraft/snap/hooks/install
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
#!/bin/bash

# Initialize the CADDY_URL to a default
snapctl set caddy=disable

# Initialize the PORT to a default
snapctl set port=3000

# Initialize the MONGO_URL to a default
snapctl set mongo-url=mongodb://localhost:27017/parties

# Initialize the MONGO_OPLOG_URL to a default
snapctl set mongo-oplog-url=mongodb://localhost:27017/local

# Initialize the protocol to a default
snapctl set https=disable
14 changes: 13 additions & 1 deletion .snapcraft/snapcraft.yaml → .snapcraft/snap/snapcraft.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ apps:
daemon: simple
plugs: [network, network-bind]
rocketchat-caddy:
command: env LC_ALL=C caddy -conf=$SNAP_DATA/Caddyfile -host=localhost:8080
command: env LC_ALL=C caddy -conf=$SNAP_DATA/Caddyfile
daemon: simple
plugs: [network, network-bind]
mongo:
Expand All @@ -36,6 +36,9 @@ apps:
plugs: [network]
initcaddy:
command: env LC_ALL=C initcaddy
hooks:
configure:
plugs: [network]
parts:
node:
plugin: dump
Expand Down Expand Up @@ -95,3 +98,12 @@ parts:
organize:
caddy: bin/caddy
after: [mongodb]
hooks:
plugin: nil
stage-packages:
- dnsutils
- curl
prime:
- usr
- lib