diff --git a/monetdb/centos7/Dockerfile b/monetdb/centos7/Dockerfile new file mode 100644 index 00000000..462632ba --- /dev/null +++ b/monetdb/centos7/Dockerfile @@ -0,0 +1,20 @@ +FROM registry.centos.org/centos/centos:7 + +MAINTAINER Mohammed Zeeshan Ahmed + +#RUN yum -y update && yum clean all + +RUN mkdir -p /opt/scripts + +ADD install.sh fix-permissions.sh run.sh passwd.template supervisord.conf.template /opt/scripts/ + +RUN . /opt/scripts/install.sh + +USER monetdb + +EXPOSE 50000 + +WORKDIR /var/monetdbdata + +ENTRYPOINT ["/opt/scripts/run.sh"] +CMD ["monetdb"] \ No newline at end of file diff --git a/monetdb/centos7/fix-permissions.sh b/monetdb/centos7/fix-permissions.sh new file mode 100755 index 00000000..7eaf8135 --- /dev/null +++ b/monetdb/centos7/fix-permissions.sh @@ -0,0 +1,9 @@ +#!/usr/bin/env bash +# Fix permissions on the given directory to allow group read/write of +# regular files and execute of directories. +set -eux +find "$1" -exec chown ${2} {} \; +find "$1" -exec chgrp 0 {} \; +find "$1" -exec chmod g+rw {} \; +find "$1" -type d -exec chmod g+x {} + + diff --git a/monetdb/centos7/install.sh b/monetdb/centos7/install.sh new file mode 100755 index 00000000..d608ac56 --- /dev/null +++ b/monetdb/centos7/install.sh @@ -0,0 +1,47 @@ +#!/usr/bin/env bash + +# Initialize Variables + +set -eux; + +EPEL="epel-release"; +BASIC_PACKAGES="nss_wrapper gettext supervisor"; +TMP_PAKCAGES="wget"; + +MONETDB_REPO="http://dev.monetdb.org/downloads/epel/MonetDB-release-epel-1.1-1.monetdb.noarch.rpm"; +MONETDB_GPG_KEY="http://dev.monetdb.org/downloads/MonetDB-GPG-KEY"; + +CORE_PACKAGES="MonetDB-SQL-server5-hugeint MonetDB-client"; + +MONETDB_HOME="/opt/monetdb" +MONETDB_DATA="/var/monetdbdata" +MONETDB_FARM_DIR="${MONETDB_DATA}/db" + +# Install begins + +# * Create monetdbuser + +useradd -u 1001 -g 0 -d ${MONETDB_HOME} monetdb; +mkdir -p ${MONETDB_DATA} && touch ${MONETDB_HOME}/supervisord.conf + +# * EPEL and basic packages + +yum -y install ${EPEL} && yum -y install ${BASIC_PACKAGES} ${TMP_PAKCAGES}; + +# * MonetDB Repo Setup + +rpm --import ${MONETDB_GPG_KEY} && yum -y install ${MONETDB_REPO}; + +# * MonetDB Packages + +yum -y install ${CORE_PACKAGES}; + +# * Fix the permissions + +for item in ${MONETDB_HOME} ${MONETDB_DATA}; do + . /opt/scripts/fix-permissions.sh ${item} monetdb; + chmod -R g+s ${item}; +done + +# Clean up +yum -y remove ${TMP_PAKCAGES} && yum clean all; \ No newline at end of file diff --git a/monetdb/centos7/passwd.template b/monetdb/centos7/passwd.template new file mode 100644 index 00000000..499c566f --- /dev/null +++ b/monetdb/centos7/passwd.template @@ -0,0 +1,15 @@ +root:x:0:0:root:/root:/bin/bash +bin:x:1:1:bin:/bin:/sbin/nologin +daemon:x:2:2:daemon:/sbin:/sbin/nologin +adm:x:3:4:adm:/var/adm:/sbin/nologin +lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin +sync:x:5:0:sync:/sbin:/bin/sync +shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown +halt:x:7:0:halt:/sbin:/sbin/halt +mail:x:8:12:mail:/var/spool/mail:/sbin/nologin +operator:x:11:0:operator:/root:/sbin/nologin +games:x:12:100:games:/usr/games:/sbin/nologin +ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin +nobody:x:99:99:Nobody:/:/sbin/nologin +monetdb:x:${USER_ID}:${GROUP_ID}:Apache User:${HOME}:/bin/bash + diff --git a/monetdb/centos7/run.sh b/monetdb/centos7/run.sh new file mode 100755 index 00000000..16501718 --- /dev/null +++ b/monetdb/centos7/run.sh @@ -0,0 +1,94 @@ +#!/usr/bin/env bash + +set -eux; + +# Permissions +export USER_ID=$(id -u); +export GROUP_ID=$(id -g); +export HOME="/opt/monetdb" +envsubst < /opt/scripts/passwd.template > /tmp/passwd; +export LD_PRELOAD=libnss_wrapper.so; +export NSS_WRAPPER_PASSWD=/tmp/passwd; +export NSS_WRAPPER_GROUP=/etc/group; + +export DATABASE_NAME=${DATABASE_NAME:-"db"}; +export DATABASE_USER=${DATABASE_USER:-"monetdb"} +export DATABASE_PASSWD=${DATABASE_PASSWD:-"monetdb"} +export DATABASE_OLD_PASSWD=${DATABASE_OLD_PASSWD:-"monetdb"} + +MONETDB_DATA="/var/monetdbdata"; +MONETDB_FARM_DIR="${MONETDB_DATA}/db"; +MONETDB_DATABASE_LOCATION="${MONETDB_FARM_DIR}/${DATABASE_NAME}" + +TOUCH_PASSWD(){ + USR=$1 + PASSWD=$2 + PASSWD_FILE="${HOME}/.monetdb" + echo -e "user=${USR}\npassword=${PASSWD}" > ${PASSWD_FILE} +} + +DEL_PASSWD(){ + + rm -rf "${HOME}/.monetdb" + +} + +SET_PASSWORD(){ + + echo "Setting new password for database ${DATABASE_NAME} and user ${DATABASE_USER}"; + TOUCH_PASSWD ${DATABASE_USER} ${DATABASE_OLD_PASSWD}; + mclient -d ${DATABASE_NAME} -s "ALTER USER SET PASSWORD '${DATABASE_PASSWD}' USING OLD PASSWORD '${DATABASE_OLD_PASSWD}'"; + DEL_PASSWD; +} + +SETUP(){ + + if [ ! -d ${MONETDB_FARM_DIR} ]; then + monetdbd create ${MONETDB_FARM_DIR}; + monetdbd set listenaddr=0.0.0.0 ${MONETDB_FARM_DIR}; + monetdbd start ${MONETDB_FARM_DIR}; + TOUCH_PASSWD ${DATABASE_USER} ${DATABASE_OLD_PASSWD}; + sleep 5; + + if [ ! -d ${MONETDB_DATABASE_LOCATION} ]; then + monetdb create ${DATABASE_NAME} && monetdb set embedr=true ${DATABASE_NAME} && monetdb release \ + ${DATABASE_NAME}; + + else + echo "Existing database found at ${MONETDB_DATABASE_LOCATION}" + fi + + for i in {30..0}; do + echo "Testing connection..." $i; + mclient -d ${DATABASE_NAME} -s 'SELECT 1' &> /dev/null; + if [ $? -ne 0 ]; then + echo "Waiting for cdb to start..."; + sleep 1; + else + echo "MonetDB is running...."; + break; + fi + done + + if [ $i -eq 0 ]; then + echo "MonetDB startup failed"; + exit 1; + fi + + SET_PASSWORD; + monetdb stop ${DATABASE_NAME}; + rm -rf .monetdb + sleep 10; + echo "Setup complete..."; + fi + +} + + +if [ $1 == "monetdb" ]; then + SETUP; + envsubst < /opt/scripts/supervisord.conf.template > ${HOME}/supervisord.conf + /usr/bin/supervisord -c ${HOME}/supervisord.conf +else + exec $@ +fi diff --git a/monetdb/centos7/supervisord.conf.template b/monetdb/centos7/supervisord.conf.template new file mode 100644 index 00000000..b028d3ca --- /dev/null +++ b/monetdb/centos7/supervisord.conf.template @@ -0,0 +1,13 @@ +[supervisord] +nodaemon=true +logfile=/tmp/supervisord.log + +[program:monetdbd] +command=monetdbd start /var/monetdbdata/db/${DATABASE_NAME} +autorestart=false +redirect_stderr=true +stdout_logfile=syslog +stderr_logfile=syslog +priority=1 +exitcodes=0 +startsecs=0 \ No newline at end of file