From a538c149768ee565ea1b0db3ef8e3bb2a7759da0 Mon Sep 17 00:00:00 2001 From: Ondrej Kubik Date: Mon, 26 Jun 2017 17:04:27 +0000 Subject: Adding snapcraft build support from source Signed-off-by: Ondrej Kubik --- .gitignore | 4 ++ snap-src/config | 44 +++++++++++++++ snap-src/mongodb-backup | 23 ++++++++ snap-src/mongodb-control | 31 +++++++++++ snap-src/mongodb-restore | 16 ++++++ snap-src/wekan-control | 26 +++++++++ snap-src/wekan-help | 48 +++++++++++++++++ snap-src/wekan-read-settings | 36 +++++++++++++ snap/gui/icon.png | Bin 0 -> 12302 bytes snap/hooks/configure | 32 +++++++++++ snapcraft.yaml | 125 +++++++++++++++++++++++++++++++++++++++++++ 11 files changed, 385 insertions(+) create mode 100755 snap-src/config create mode 100755 snap-src/mongodb-backup create mode 100755 snap-src/mongodb-control create mode 100755 snap-src/mongodb-restore create mode 100755 snap-src/wekan-control create mode 100755 snap-src/wekan-help create mode 100755 snap-src/wekan-read-settings create mode 100644 snap/gui/icon.png create mode 100755 snap/hooks/configure create mode 100644 snapcraft.yaml diff --git a/.gitignore b/.gitignore index 0ee9499b..7642f23d 100644 --- a/.gitignore +++ b/.gitignore @@ -9,3 +9,7 @@ node_modules/ packages/kadira-flow-router/ packages/meteor-useraccounts-core/ package-lock.json +**/parts/ +**/stage +**/prime +**/*.snap diff --git a/snap-src/config b/snap-src/config new file mode 100755 index 00000000..dbf8402c --- /dev/null +++ b/snap-src/config @@ -0,0 +1,44 @@ +#!/bin/sh + +# store here all configuration options for wekan snap +# read configured settings first +SETTINGS_FILE="$SNAP_COMMON/wekan_settings.sh" +[ -f $SETTINGS_FILE ] && . $SETTINGS_FILE + +# list of supported keys +keys="MONGODB_BIND_UNIX_SOCKET MONGODB_BIND_IP MONGODB_PORT MAIL_URL MAIL_FROM ROOT_URL PORT DISABLE_MONGODB" + +# default values +DESCRIPTION_MONGODB_BIND_UNIX_SOCKET="mongodb binding unix socket:\n"\ +"\t\t\t Default behaviour will preffer binding over unix socket, to disable unix socket binding set value to 'nill' string\n"\ +"\t\t\t To bind to instance of mongo provided through contect interface set to relative path to the socket inside shared directory" +DEFAULT_MONGODB_BIND_UNIX_SOCKET="$SNAP_DATA/share" +KEY_MONGODB_BIND_UNIX_SOCKET="mongodb-bind-unix-socket" + +DESCRIPTION_MONGODB_PORT="mongodb binding port: eg 27017 when using localhost" +DEFAULT_MONGODB_PORT="27019" +KEY_MONGODB_PORT='mongodb-port' + +DESCRIPTION_MONGODB_BIND_IP="mongodb binding ip address: eg 127.0.0.1 for localhost\n\t\tIf not defined default unix socket is used instead" +DEFAULT_MONGODB_BIND_IP="" +KEY_MONGODB_BIND_IP="mongodb-bind-ip" + +DESCRIPTION_MAIL_URL="wekan mail binding" +DEFAULT_MAIL_URL="smtp://user:pass@mailserver.examples.com:25/" +KEY_MAIL_URL="mail-url" + +DESCRIPTION_MAIL_FROM="wekan's admin mail from name email address" +DEFAULT_MAIL_FROM="wekan-admin@example.com" +KEY_MAIL_FROM="mail-from" + +DESCRIPTION_ROOT_URL="wekan's root url, eg http://127.0.0.1, https://example.com, https://wekan.example.com, http://example.com/wekan" +DEFAULT_ROOT_URL="http://127.0.0.1" +KEY_ROOT_URL="root-url" + +DESCRIPTION_PORT="port wekan is exposed at" +DEFAULT_PORT="8080" +KEY_PORT="port" + +DESCRIPTION_DISABLE_MONGODB="Disable mongodb service: use only if binding to database outside of the snap. Valid values: [true,false]" +DEFAULT_DISABLE_MONGODB="false" +KEY_DISABLE_MONGODB="disable-mongodb" diff --git a/snap-src/mongodb-backup b/snap-src/mongodb-backup new file mode 100755 index 00000000..bef8bf9b --- /dev/null +++ b/snap-src/mongodb-backup @@ -0,0 +1,23 @@ +#!/bin/bash + +# get wekan/mongo settings +source $SNAP/bin/wekan-read-settings + +# make sure we have set minimum env variables for locale +if [ -z "$LANG" ]; then + export LANG=en_US.UTF-8 +fi + +export LC_ALL=C + +if [ -z $1 ]; then + DATE=`/bin/date +%Y%m%dT%H%M%S` + mkdir -p $SNAP_COMMON/db-backups/ + ARCHIVE=$SNAP_COMMON/db-backups/wekan-$DATE.backup +else + ARCHIVE=$1 +fi +# start mongodb backup +[ "x" == "x${MONGODB_BIND_IP}" ] && MONGODB_BIND_IP="127.0.0.1" + echo "using bind ip" +mongodump --host $MONGODB_BIND_IP --port $MONGODB_PORT -d wekan --gzip --archive=${ARCHIVE} diff --git a/snap-src/mongodb-control b/snap-src/mongodb-control new file mode 100755 index 00000000..08af132d --- /dev/null +++ b/snap-src/mongodb-control @@ -0,0 +1,31 @@ +#!/bin/bash + +# get wekan/mongo settings +source $SNAP/bin/wekan-read-settings + +if [ "true" == "${DISABLE_MONGODB}" ]; then + echo "mongodb is disabled. Not starting it" + exit 0 +fi + +# make sure we have set minimum env variables for locale +if [ -z "$LANG" ]; then + export LANG=en_US.UTF-8 +fi + +export LC_ALL=C + +# start mongo deamon +BIND_OPTIONS="" +if [ "nill" != "$MONGODB_BIND_UNIX_SOCKET" ] && [ "x" != "x${MONGODB_BIND_UNIX_SOCKET}" ]; then + BIND_OPTIONS+=" --unixSocketPrefix $MONGODB_BIND_UNIX_SOCKET" +fi +if [ "x" != "x${MONGODB_BIND_IP}" ]; then + BIND_OPTIONS+=" --bind_ip $MONGODB_BIND_IP" +fi +if [ "x" != "x${MONGODB_PORT}" ]; then + BIND_OPTIONS+=" --port $MONGODB_PORT" +fi +echo "mongodb bind options: $BIND_OPTIONS" + +mongod --dbpath $SNAP_COMMON --logpath $SNAP_COMMON/mongodb.log --logappend --journal $BIND_OPTIONS diff --git a/snap-src/mongodb-restore b/snap-src/mongodb-restore new file mode 100755 index 00000000..c1c82775 --- /dev/null +++ b/snap-src/mongodb-restore @@ -0,0 +1,16 @@ +#!/bin/bash + +# get wekan/mongo settings +source $SNAP/bin/wekan-read-settings + +# make sure we have set minimum env variables for locale +if [ -z "$LANG" ]; then + export LANG=en_US.UTF-8 +fi + +export LC_ALL=C + +# start mongodb backup +[ "x" == "x${MONGODB_BIND_IP}" ] && MONGODB_BIND_IP="127.0.0.1" +echo "using bind ip" +mongorestore --host $MONGODB_BIND_IP --port $MONGODB_PORT -d wekan --gzip --archive=$1 diff --git a/snap-src/wekan-control b/snap-src/wekan-control new file mode 100755 index 00000000..905642ed --- /dev/null +++ b/snap-src/wekan-control @@ -0,0 +1,26 @@ +#!/bin/bash + +SYSTEMD_WEKAN_SERVICE="snap.${SNAP_NAME}.wekan" +SYSTEMD_MONGODB_SERVICE="snap.${SNAP_NAME}.mongodb" + +# get wekan/mongo settings +source $SNAP/bin/wekan-read-settings + +export NODE_PATH=$SNAP/bin +# if possible we prefer to bind over unix socket +if [ "nill" != "$MONGODB_BIND_UNIX_SOCKET" ] && [ "x" != "x$MONGODB_BIND_UNIX_SOCKET" ]; then + if [ -d $MONGODB_BIND_UNIX_SOCKET ]; then + export MONGO_URL="mongodb://$MONGODB_BIND_UNIX_SOCKET/mongodb-${MONGODB_PORT}.sock/wekan" + else + export MONGO_URL="mongodb://$SNAP_DATA/shared/$MONGODB_BIND_UNIX_SOCKET/wekan" + fi +else + [ "x" == "x$MONGODB_BIND_IP" ] && MONGODB_BIND_IP="127.0.0.1" + export MONGO_URL="mongodb://$MONGODB_BIND_IP:$MONGODB_PORT/wekan" +fi + +echo -e "MONGO_URL=$MONGO_URL" +APPLICATION_DIRECTORY=$SNAP +APPLICATION_START=main.js +cd $APPLICATION_DIRECTORY +$NODE_PATH/node $APPLICATION_START diff --git a/snap-src/wekan-help b/snap-src/wekan-help new file mode 100755 index 00000000..bbf0e138 --- /dev/null +++ b/snap-src/wekan-help @@ -0,0 +1,48 @@ +#!/bin/bash + +source $SNAP/bin/config &>/dev/null + +echo -e "Wekan: The open-source Trello-like kanban.\n" +echo -e "Make sure you have connected all interfaces, check more by calling $ snap interfaces" +echo -e "\n" +echo -e "${SNAP_NAME} has two services, to check status/restart/stop use systemd commands" +echo -e "mongodb service:" +echo -e "\t$ sudo systemctl status/start/stop/restart snap.$SNAP_NAME.mongodb" +echo -e "wekan service" +echo -e "\t$ sudo systemctl status/start/stop/restart snap.$SNAP_NAME.wekan" +echo -e "\n" +echo -e "To make backup of wekan's database use: $ ${SNAP_NAME}.database-backup [backup file]" +echo -e "\t backup file is optional parameter, if not passed backup is created in directory:" +echo -e "\t\t${SNAP_COMMON}/db-backups" +echo -e "To list existing backups in default directory: $ ${SNAP_NAME}.database-list-backups" +echo -e "To restore wekan's database use: ${SNAP_NAME}.database-restore " +echo -e "\n" +echo -e "wekan can be configured to share mongodb with other services using content interface" +echo -e "\t-sharing mongodb from $SNAP_NAME to other snap(s):" +echo -e "\t\t-connect mongodb-slot with plug from corresponding snap(s)" +echo -e "\t\t-configure corresponding service to use mongodb unix socket in shared directory, socket file name is: mongodb-$MONGODB_PORT.sock" +echo -e "\t-sharing mongodb from other snap to $SNAP_NAME:" +echo -e "\t\t-connect mongodb-plug with slot from snap providing mongodb" +echo -e "\t\t-disable mongodb in $SNAP_NAME by calling: $ snap set $SNAP_NAME set disable-mongodb='true'" +echo -e "\t\t-set mongodb-bind-unix-socket to point to serving mongodb. Use relative path inside shared directory, e.g run/mongodb-27017.sock" +echo -e "\n" +# parse config file for supported settings keys +echo -e "wekan supports settings keys" +echo -e "values can be changed by calling\n$ snap set $SNAP_NAME =''" +echo -e "list of supported keys:" +for key in ${keys[@]} +do + default_value="DEFAULT_$key" + description="DESCRIPTION_$key" + snappy_key="KEY_$key" + echo -e "\t${!snappy_key}: ${!description}" + if [ "x" == "x${!key}" ]; then + echo -e "\t\tNo value set, using default value: '${!default_value}'" + else + echo -e "\t\tCurrent value set to: '${!key}', (default value: '${!default_value}')" + fi +done +echo -e "\nFor changes to take effect restart wekan service," +echo -e "if mongodb key was change also restart mongodb service, before restarting wekan" +echo -e "to restart mongodb: $ sudo systemctl restart snap.$SNAP_NAME.mongodb" +echo -e "to restart wekan: $ sudo systemctl restart snap.$SNAP_NAME.wekan" diff --git a/snap-src/wekan-read-settings b/snap-src/wekan-read-settings new file mode 100755 index 00000000..aec05bba --- /dev/null +++ b/snap-src/wekan-read-settings @@ -0,0 +1,36 @@ +#!/bin/sh + +# read wekan config +source $SNAP/bin/config + +# TODO: uncomment following, once snapctl can be called from outside the hooks +# for key in ${keys[@]} +# do +# # snappy is picky about key syntax, using mapping +# MAP_KEY="KEY_$key" +# SNAPPY_KEY= +# if value=$(snapctl get ${!MAP_KEY}); then +# echo "$key='$value'" +# export $key=$value +# else +# # use default value +# default_value="DEFAULT_$key" +# echo "using default value: $key='${!default_value}'" +# export $key=${!default_value} +# fi +# done + +# TODO: get rid of this workaround once above can be used +# loop through all values, and if not defined, use default value +for key in ${keys[@]} +do + if [ "x" == "x${!key}" ]; then + # use default value + default_value="DEFAULT_$key" + echo "using default value: $key='${!default_value}'" + export $key=${!default_value} + # echo "export $key='${!def_value}'" >> $SETTINGS_FILE + else + echo "$key='${!key}'" + fi +done diff --git a/snap/gui/icon.png b/snap/gui/icon.png new file mode 100644 index 00000000..1382e256 Binary files /dev/null and b/snap/gui/icon.png differ diff --git a/snap/hooks/configure b/snap/hooks/configure new file mode 100755 index 00000000..1e2b0ec7 --- /dev/null +++ b/snap/hooks/configure @@ -0,0 +1,32 @@ +#!/bin/bash + +# read wekan config +. $SNAP/bin/config + +# create run dir, we're going to use it for unix socket +mkdir -p $SNAP_DATA/share +mkdir -p $SNAP_DATA/shared + +# settings were altered by user, safest way to get them applied is to restart service + +# TODO: remove this workaround once it's not needed +# for the moment we can't read settings outside of the hook, +# so store all settings in helpper script which is then picked by main wrapper +echo -e "#!/bin/sh\n" > $SETTINGS_FILE +for key in ${keys[@]} +do + # snappy is picky about key syntax, using mapping + MAP_KEY="KEY_$key" + if value=$(snapctl get ${!MAP_KEY}); then + echo "export $key='$value'" >> $SETTINGS_FILE + elif [ -d "${!key}" ]; then + # store back value from SETTINGS_FILE + echo "export $key='${!key}'" >> $SETTINGS_FILE + fi +done + +# set file executable +chmod 755 $SETTINGS_FILE +# we can't use snapctl to restart service, may be one day .... + +echo "Setting has been updated, restart service." diff --git a/snapcraft.yaml b/snapcraft.yaml new file mode 100644 index 00000000..6dcc735f --- /dev/null +++ b/snapcraft.yaml @@ -0,0 +1,125 @@ +name: wekan +version: "0.26-SNAPSHOT" +summary: The open-source Trello-like kanban +description: | + Wekan is an open-source and collaborative kanban board application. + + Whether you’re maintaining a personal todo list, planning your holidays with some friends, or working in a team on your next revolutionary idea, Kanban boards are an unbeatable tool to keep your things organized. They give you a visual overview of the current state of your project, and make you productive by allowing you to focus on the few items that matter the most. + Depending on target environment, some configuration settings might need to be adjusted. + For full list of configuration options call: + $ wekan.help + +confinement: strict +grade: stable + +architectures: + - amd64 + +plugs: + mongodb-plug: + interface: content + target: $SNAP_DATA/shared + +slots: + mongodb-slot: + interface: content + write: + - $SNAP_DATA/share + +apps: + wekan: + command: wekan-control + daemon: simple + plugs: [network, network-bind] + + mongodb: + command: mongodb-control + daemon: simple + plugs: [network, network-bind] + + help: + command: wekan-help + + database-backup: + command: mongodb-backup + plugs: [network, network-bind] + + database-list-backups: + command: ls -ald $SNAP_COMMON/db-backups/* + + database-restore: + command: mongodb-restore + plugs: [network, network-bind] + +parts: + mongodb: + source: https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-ubuntu1604-3.2.14.tgz + plugin: dump + stage-packages: [libssl1.0.0] + filesets: + mongo: + - usr + - bin + - lib + stage: + - $mongo + prime: + - $mongo + + wekan: + source: . + plugin: nodejs + node-engine: 4.8.1 + node-packages: + - npm@4.6.1 + - node-gyp + - node-pre-gyp + - fibers@1.0.15 + build-packages: + - python + - g++ + - capnproto + - nodejs + - nodejs-legacy + - curl + prepare: | + echo "Cleaning environment first" + rm -rf ~/.meteor ~/.npm /usr/local/lib/node_modules + echo "installing meteor first" + curl https://install.meteor.com/ -o install_meteor.sh + sed -i "s|RELEASE=.*|RELEASE=\"1.4.4.1\"|g" install_meteor.sh + chmod +x install_meteor.sh + sh install_meteor.sh + rm install_meteor.sh + mkdir -p packages + git clone https://github.com/wekan/flow-router.git packages/kadira-flow-router + git clone https://github.com/meteor-useraccounts/core.git packages/meteor-useraccounts-core + build: | + rm -rf package-lock.json .build + meteor add standard-minifier-js --allow-superuser + meteor npm install --allow-superuser + meteor build .build --directory --allow-superuser + cp fix-download-unicode/cfs_access-point.txt .build/bundle/programs/server/packages/cfs_access-point.js + sed -i "s|build\/Release\/bson|browser_build\/bson|g" .build/bundle/programs/server/npm/node_modules/meteor/cfs_gridfs/node_modules/mongodb/node_modules/bson/ext/index.js + cd .build/bundle/programs/server/npm/node_modules/meteor/npm-bcrypt + rm -rf node_modules/bcrypt + npm install bcrypt + cd ../../../../ + npm install + install: | + cp -r .build/bundle/* $SNAPCRAFT_PART_INSTALL/ + cp .build/bundle/.node_version.txt $SNAPCRAFT_PART_INSTALL/ + organize: + README: README.wekan + + helpers: + source: snap-src + plugin: dump + organize: + wekan-control: bin/wekan-control + mongodb-control: bin/mongodb-control + wekan-read-settings: bin/wekan-read-settings + wekan-help: bin/wekan-help + mongodb-backup: bin/mongodb-backup + mongodb-restore: bin/mongodb-restore + config: bin/config -- cgit v1.2.3-1-g7c22