Browse Source

Adding snapcraft build support from source

Signed-off-by: Ondrej Kubik <ondrej.kubik@canonical.com>
Ondrej Kubik 8 years ago
parent
commit
a538c14976

+ 4 - 0
.gitignore

@@ -9,3 +9,7 @@ node_modules/
 packages/kadira-flow-router/
 packages/meteor-useraccounts-core/
 package-lock.json
+**/parts/
+**/stage
+**/prime
+**/*.snap

+ 44 - 0
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"

+ 23 - 0
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}

+ 31 - 0
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

+ 16 - 0
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

+ 26 - 0
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

+ 48 - 0
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 <path to backup>"
+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 <key name>='<key value>'"
+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"

+ 36 - 0
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

BIN
snap/gui/icon.png


+ 32 - 0
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."

+ 125 - 0
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