proper packaging and upstart scripts for ubuntu

single-host
Marc Wäckerlin 9 years ago
parent 702a064814
commit 9a9a17da92
  1. 58
      ax_init_standard_project.m4
  2. 102
      bootstrap.sh
  3. 2
      build-in-docker.sh
  4. 2
      debian/control.in
  5. 6
      debian/servicedock.postinst
  6. 2
      mac-create-app-bundle.sh
  7. 10
      nodejs/etc/default/servicedock
  8. 38
      nodejs/etc/init/servicedock.conf
  9. 2
      nodejs/etc/servicedock.json
  10. 6
      nodejs/makefile.am
  11. 12
      nodejs/servicedock.js

@ -8,43 +8,60 @@ m4_define([mrw_esyscmd_s], [m4_normalize(m4_esyscmd([$1]))])
# define least version number from subversion's revision number: # define least version number from subversion's revision number:
# it is taken modulo 256 due to a bug on Apple's MacOSX # it is taken modulo 256 due to a bug on Apple's MacOSX
m4_define(x_least, m4_ifdef([x_least_diff], mrw_esyscmd_s([ m4_define(x_least, m4_ifdef([x_least_fix], [x_least_fix],
SVN_REVISION="ERROR-UNDEFINED-REVISION-to-be-built-in-subdirectory-of-svn-checkout" m4_ifdef([x_least_diff],
mrw_esyscmd_s([
VCS_REVISION="ERROR-UNDEFINED-REVISION-to-be-built-in-subdirectory-of-checkout"
for path in . .. ../..; do for path in . .. ../..; do
if svn info $path 2>&1 > /dev/null; then if test -d .svn; then
SVN_REVISION=$(LANG= svn info $path | sed -n 's/Last Changed Rev: //p') VCS_REVISION=$(LANG= svn info $path | sed -n 's/Last Changed Rev: //p')
if test -z "${SVN_REVISION}"; then SVN_REVISION=0; fi if test -z "${VCS_REVISION}"; then VCS_REVISION=0; fi
break;
elif test -d .git; then
VCS_REVISION=$(git rev-list --all --count)
if test -z "${VCS_REVISION}"; then VCS_REVISION=0; fi
break; break;
fi fi
done done
echo $ECHO_N $(($SVN_REVISION)) echo $ECHO_N $(($VCS_REVISION))
]), mrw_esyscmd_s([ ]), mrw_esyscmd_s([
SVN_REVISION="ERROR-UNDEFINED-REVISION-to-be-built-in-subdirectory-of-svn-checkout" VCS_REVISION="ERROR-UNDEFINED-REVISION-to-be-built-in-subdirectory-of-checkout"
for path in . .. ../..; do for path in . .. ../..; do
if svn info $path 2>&1 > /dev/null; then if test -d .svn; then
SVN_REVISION=$(LANG= svn info $path | sed -n 's/Last Changed Rev: //p') VCS_REVISION=$(LANG= svn info $path | sed -n 's/Last Changed Rev: //p')
if test -z "${SVN_REVISION}"; then SVN_REVISION=0; fi if test -z "${VCS_REVISION}"; then VCS_REVISION=0; fi
break;
elif test -d .git; then
VCS_REVISION=$(git rev-list --all --count)
if test -z "${VCS_REVISION}"; then VCS_REVISION=0; fi
break; break;
fi fi
done done
# Mac does not support LEAST > 255 # Mac does not support LEAST > 255
echo $ECHO_N $(($SVN_REVISION%256)) echo $ECHO_N $(($VCS_REVISION%256))
]))) ])
)
))
# define version number from subversion's revision number: # define version number from subversion's revision number:
# it is taken modulo 256 due to a bug on Apple's MacOSX # it is taken modulo 256 due to a bug on Apple's MacOSX
# add to x_minor if revision number is > 256 # add to x_minor if revision number is > 256
m4_define(x_minor_diff, mrw_esyscmd_s([ m4_define(x_minor_diff, m4_ifdef([x_least_fix], 0, mrw_esyscmd_s([
SVN_REVISION="ERROR-UNDEFINED-REVISION-to-be-built-in-subdirectory-of-svn-checkout" VCS_REVISION="ERROR-UNDEFINED-REVISION-to-be-built-in-subdirectory-of-checkout"
for path in . .. ../..; do for path in . .. ../..; do
if svn info $path 2>&1 > /dev/null; then if test -d .svn; then
SVN_REVISION=$(LANG= svn info $path | sed -n 's/Last Changed Rev: //p') VCS_REVISION=$(LANG= svn info $path | sed -n 's/Last Changed Rev: //p')
if test -z "${SVN_REVISION}"; then SVN_REVISION=0; fi if test -z "${VCS_REVISION}"; then VCS_REVISION=0; fi
break;
elif test -d .git; then
VCS_REVISION=$(git rev-list --all --count)
if test -z "${VCS_REVISION}"; then VCS_REVISION=0; fi
break; break;
fi; fi;
done done
# Mac does not support LEAST > 255 # Mac does not support LEAST > 255
echo $ECHO_N $(($SVN_REVISION/256)) echo $ECHO_N $(($VCS_REVISION/256))
])) ])))
# setup version number # setup version number
m4_define(x_version, [x_major.m4_ifdef([x_least_diff], x_minor, m4_eval(x_minor+x_minor_diff)).m4_eval(m4_ifdef([x_least_diff], [x_least-x_least_diff], [x_least]))]) m4_define(x_version, [x_major.m4_ifdef([x_least_diff], x_minor, m4_eval(x_minor+x_minor_diff)).m4_eval(m4_ifdef([x_least_diff], [x_least-x_least_diff], [x_least]))])
@ -618,6 +635,7 @@ AC_DEFUN([AX_PKG_CHECK], [
# make sure, a specific header exists # make sure, a specific header exists
# - parameter: # - parameter:
# $1 = header name # $1 = header name
# $2 = pathes to search for
AC_DEFUN([AX_REQUIRE_HEADER], [ AC_DEFUN([AX_REQUIRE_HEADER], [
AC_CHECK_HEADER($1, [], [ AC_CHECK_HEADER($1, [], [
if test -n "$2"; then if test -n "$2"; then

@ -61,7 +61,7 @@ DESCRIPTION
configure.ac. Automatically copies or creates all required template configure.ac. Automatically copies or creates all required template
files. files.
From your new and empty project's subversion path, call $0 to From your new and empty project's subversion or git path, call $0 to
initialize your build environment. initialize your build environment.
Before you call ${MY_NAME} the very first time, edit ${0#/*}/AUTHORS Before you call ${MY_NAME} the very first time, edit ${0#/*}/AUTHORS
@ -80,16 +80,27 @@ DESCRIPTION
https://dev.marc.waeckerlin.org/, and the path from where you call https://dev.marc.waeckerlin.org/, and the path from where you call
${MY_NAME} (which is actually ${PROJECT_PATH}) should be the path to ${MY_NAME} (which is actually ${PROJECT_PATH}) should be the path to
your newly created project. Please note that your project must be a your newly created project. Please note that your project must be a
checked out subversion repository, since this build environment checked out subversion or git repository, since this build
relies on subversion. environment relies on subversion or git.
Example for an initial run, where your new projet is stored in Example for an initial run, where your new projet is stored in
subversion on svn:/path/to/your/new-project: subversion on https:/path/to/your/new-project:
cd ~/svn cd ~/svn
svn co https://dev.marc.waeckerlin.org/svn/bootstrap-build-environment/trunk \\ svn co https://dev.marc.waeckerlin.org/svn/bootstrap-build-environment/trunk \\
bootstrap-build-environment bootstrap-build-environment
svn co svn:/path/to/your/new-project/trunk new-project svn co https:/path/to/your/new-project/trunk new-project
cd new-project
../bootstrap-build-environment/bootstrap.sh
Example for an initial run, where your new projet is stored in
git on https:/path/to/your/new-project:
cd ~/svn
svn co https://dev.marc.waeckerlin.org/svn/bootstrap-build-environment/trunk \\
bootstrap-build-environment
cd ~/git
git clone https:/path/to/your/new-project
cd new-project cd new-project
../bootstrap-build-environment/bootstrap.sh ../bootstrap-build-environment/bootstrap.sh
@ -201,13 +212,14 @@ FILES
${DEFAULT_PROJECT_NAME}::description(). ${DEFAULT_PROJECT_NAME}::description().
* ChangeLog: Your changelog is automatically maintained from * ChangeLog: Your changelog is automatically maintained from
subversion history, using svn2cl. You don't need to subversion history, using svn2cl. You don't need to
care about. care about. It uses git2cl on git repositories.
* configure.ac: This file becomes very short and simple. You provide * configure.ac: This file becomes very short and simple. You provide
the project name, the major and minor version. The the project name, the major and minor version. The
least version number is automatically taken from least version number is automatically taken from
subversion's revision, so every checkin subversion's revision, so every checkin
automatically increments the least version automatically increments the least version
number. The following macros are supported: number. In git, git rev-list --all --count is used.
The following macros are supported in configure.ac:
* Enable C++: AX_USE_CXX * Enable C++: AX_USE_CXX
* Enable LibTool library creation: AX_USE_LIBTOOL * Enable LibTool library creation: AX_USE_LIBTOOL
* Enable Scripts: AX_USE_SCRIPTS * Enable Scripts: AX_USE_SCRIPTS
@ -247,6 +259,20 @@ EOF
shift; shift;
done done
echo -en "\e[1m-> checking:\e[0m for version control system ..."
VCS=""
VCSDEPENDS=""
if test -d .svn; then
VCS="svn"
VCSDEPENDS="subversion,"
echo -e " \e[32msuccess\e[0m detected ${VCS}"
elif test -d .git; then
VCS="git"
VCSDEPENDS="git,"
echo -e " \e[32msuccess\e[0m detected ${VCS}"
else
echo -e " \e[33mignored\e[0m"
fi
HEADER='## @id '"\$Id\$"' HEADER='## @id '"\$Id\$"'
## ##
@ -270,6 +296,7 @@ CHEADER='/** @id '"\$Id\$"'
// 1 2 3 4 5 6 7 8 // 1 2 3 4 5 6 7 8
// 45678901234567890123456789012345678901234567890123456789012345678901234567890 // 45678901234567890123456789012345678901234567890123456789012345678901234567890
' '
notice() { notice() {
@ -318,7 +345,9 @@ contains() {
checkdir() { checkdir() {
if ! test -d "$1"; then # create path if ! test -d "$1"; then # create path
run mkdir -p "$1" run mkdir -p "$1"
run svn add "$1" if test -n "${VCS}"; then
run ${VCS} add "$1"
fi
fi fi
} }
@ -365,9 +394,13 @@ to() {
fi fi
chmod $mode $1 chmod $mode $1
if test $exists -eq 0; then if test $exists -eq 0; then
run svn add "$1" if test -n "${VCS}"; then
run ${VCS} add "$1"
if test "${VCS}" = "svn"; then
run svn propset svn:keywords "Id" "$1" run svn propset svn:keywords "Id" "$1"
fi fi
fi
fi
return 0 return 0
} }
@ -386,9 +419,13 @@ copy() {
fi fi
run cp "${source}" "$1" run cp "${source}" "$1"
if test $exists -eq 0; then if test $exists -eq 0; then
run svn add "$1" if test -n "${VCS}"; then
run ${VCS} add "$1"
if test "${VCS}" = "svn"; then
run svn propset svn:keywords "Id" "$1" run svn propset svn:keywords "Id" "$1"
fi fi
fi
fi
} }
doxyreplace() { doxyreplace() {
@ -413,10 +450,29 @@ doxyadd() {
fi fi
} }
vcs2cl() {
exists=0
if test -f "Changelog"; then
exists=1
fi
if test "${VCS}" = "git"; then
${VCS}2cl > ChangeLog
elif test -n "${VCS}"; then
${VCS}2cl
fi
if test $exists -eq 0; then
if test -n "${VCS}"; then
run ${VCS} add ChangeLog
fi
fi
}
# Check if we are in subversion root, if so, create trunk, branches, tags: # Check if we are in subversion root, if so, create trunk, branches, tags:
if test "$(LANG= svn info | sed -n 's,Relative URL: *,,p')" = "^/"; then if test "${VCS}" = "svn"; then
if test "$(LANG= svn info | sed -n 's,Relative URL: *,,p')" = "^/"; then
svn mkdir trunk branches tags svn mkdir trunk branches tags
cd trunk cd trunk
fi
fi fi
# Initialize the environment: # Initialize the environment:
@ -723,7 +779,9 @@ ${HEADER}dist_bin_SCRIPTS =
MAINTAINERCLEANFILES = makefile.in MAINTAINERCLEANFILES = makefile.in
EOF EOF
echo "${HEADER}MAINTAINERCLEANFILES = makefile.in" | to --condition AX_USE_DOXYGEN doc/makefile.am echo "${HEADER}MAINTAINERCLEANFILES = makefile.in" | to --condition AX_USE_DOXYGEN doc/makefile.am
to --condition AX_BUILD_TEST test/runtests.sh < ${0%/*}/test/runtests.sh if testtag AX_BUILD_TEST; then
to test/runtests.sh < ${0%/*}/test/runtests.sh
fi
to --condition 'AX_BUILD_TEST|AX_USE_CPPUNIT' test/makefile.am <<EOF to --condition 'AX_BUILD_TEST|AX_USE_CPPUNIT' test/makefile.am <<EOF
${HEADER}$(if testtag AX_USE_CXX; then ${HEADER}$(if testtag AX_USE_CXX; then
cat <<EOF2 cat <<EOF2
@ -761,9 +819,13 @@ if testtag AX_USE_DOXYGEN; then
contains doc/doxyfile.in "${rebuildfiles[@]}"; then contains doc/doxyfile.in "${rebuildfiles[@]}"; then
run doxygen -g doc/doxyfile.in run doxygen -g doc/doxyfile.in
if test $exists -eq 0; then if test $exists -eq 0; then
run svn add doc/doxyfile.in if test -n "${VCS}"; then
run ${VCS} add doc/doxyfile.in
if test "${VCS}" = "svn"; then
run svn propset svn:keywords "Id" doc/doxyfile.in run svn propset svn:keywords "Id" doc/doxyfile.in
fi fi
fi
fi
doxyreplace PROJECT_NAME "@PACKAGE_NAME@" doxyreplace PROJECT_NAME "@PACKAGE_NAME@"
doxyreplace PROJECT_NUMBER "@PACKAGE_VERSION@" doxyreplace PROJECT_NUMBER "@PACKAGE_VERSION@"
doxyreplace PROJECT_BRIEF "@DESCRIPTION@" doxyreplace PROJECT_BRIEF "@DESCRIPTION@"
@ -842,7 +904,7 @@ if testtag AX_USE_DEBIAN_PACKAGING; then
-- @AUTHOR@ @BUILD_DATE@ -- @AUTHOR@ @BUILD_DATE@
EOF EOF
BUILD_DEPENDS="debhelper, subversion, pkg-config, automake, libtool, autotools-dev, lsb-release $(if testtag AX_USE_DOXYGEN; then echo -n ", doxygen, graphviz, mscgen"; fi; if testtag AX_USE_CPPUNIT; then echo -n ", libcppunit-dev"; fi; if testtag AX_CXX_QT || testtag AX_CHECK_QT AX_REQUIRE_QT; then echo -n ", qt5-default | libqt4-core | libqtcore4, qt5-qmake | qt4-qmake, qtbase5-dev | libqt4-dev, qtbase5-dev-tools | qt4-dev-tools, qttools5-dev-tools | qt4-dev-tools, qttools5-dev-tools | qt4-dev-tools"; fi)" BUILD_DEPENDS="debhelper, ${VCSDEPENDS} pkg-config, automake, libtool, autotools-dev, lsb-release $(if testtag AX_USE_DOXYGEN; then echo -n ", doxygen, graphviz, mscgen"; fi; if testtag AX_USE_CPPUNIT; then echo -n ", libcppunit-dev"; fi; if testtag AX_CXX_QT || testtag AX_CHECK_QT AX_REQUIRE_QT; then echo -n ", qt5-default | libqt4-core | libqtcore4, qt5-qmake | qt4-qmake, qtbase5-dev | libqt4-dev, qtbase5-dev-tools | qt4-dev-tools, qttools5-dev-tools | qt4-dev-tools, qttools5-dev-tools | qt4-dev-tools"; fi)"
to debian/control.in <<EOF to debian/control.in <<EOF
Source: @PACKAGE_NAME@ Source: @PACKAGE_NAME@
Priority: extra Priority: extra
@ -913,7 +975,7 @@ else
fi) fi)
Source0: %{name}-%{version}.tar.gz Source0: %{name}-%{version}.tar.gz
BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root
BuildRequires: gnupg, subversion, automake, autoconf$( BuildRequires: gnupg, ${VCSDEPENDS} automake, autoconf$(
if testtag AX_USE_DOXYGEN; then if testtag AX_USE_DOXYGEN; then
echo -n ", doxygen"; echo -n ", doxygen";
fi) fi)
@ -1046,7 +1108,13 @@ ${HEADER}SUBDIRS =${SUBDIRS}
desktopdir = \${datadir}/applications desktopdir = \${datadir}/applications
desktop_DATA = @PACKAGE_DESKTOP@ desktop_DATA = @PACKAGE_DESKTOP@
dist_pkgdata_DATA = @PACKAGE_ICON@ dist_pkgdata_DATA = @PACKAGE_ICON@ ax_check_qt.m4 bootstrap.sh \\
resolve-rpmbuilddeps.sh \\
ax_cxx_compile_stdcxx_11.m4 build-in-docker.sh \\
build-resource-file.sh \\
ax_init_standard_project.m4 \\
mac-create-app-bundle.sh resolve-debbuilddeps.sh \\
sql-to-dot.sed
dist_doc_DATA = AUTHORS NEWS README COPYING INSTALL ChangeLog dist_doc_DATA = AUTHORS NEWS README COPYING INSTALL ChangeLog
MAINTAINERCLEANFILES = makefile.in MAINTAINERCLEANFILES = makefile.in
@ -1072,7 +1140,7 @@ if test -f makefile; then
fi fi
#### Bootstrap Before Configure #### #### Bootstrap Before Configure ####
run --no-check svn2cl run --no-check vcs2cl
run aclocal run aclocal
if testtag AX_USE_LIBTOOL; then run libtoolize --force; fi if testtag AX_USE_LIBTOOL; then run libtoolize --force; fi
run automake -a run automake -a

@ -196,5 +196,5 @@ for command in "${commands[@]}"; do
ifthenelse "${command}" "ARG" ifthenelse "${command}" "ARG"
done done
docker exec ${DOCKER_ID} ./resolve-debbuilddeps.sh docker exec ${DOCKER_ID} ./resolve-debbuilddeps.sh
docker exec -u $(id -u) ${DOCKER_ID} svn upgrade || true docker exec -u $(id -u) ${DOCKER_ID} test -d .svn && svn upgrade || true
docker exec -u $(id -u) ${DOCKER_ID} ./bootstrap.sh -t "${targets}" docker exec -u $(id -u) ${DOCKER_ID} ./bootstrap.sh -t "${targets}"

2
debian/control.in vendored

@ -6,7 +6,7 @@ Build-Depends: debhelper, subversion, pkg-config, automake, libtool, autotools-d
Package: @PACKAGE_NAME@ Package: @PACKAGE_NAME@
Section: web Section: web
Architecture: any Architecture: any
Depends: ${shlibs:Depends}, ${misc:Depends}, nodejs Depends: ${shlibs:Depends}, ${misc:Depends}, nodejs, libc-bin, adduser, upstart
Description: @DESCRIPTION@ Description: @DESCRIPTION@
@README_DEB@ @README_DEB@

@ -0,0 +1,6 @@
#!/bin/bash -e
# create user if it doesn't already exist.
if ! getent passwd servicedock >/dev/null; then
adduser servicedock --quiet --system --ingroup docker --no-create-home --home /usr/share/servicedock
fi

@ -75,7 +75,7 @@ cd ${oldpath}
# Step 4: if necessary, install qt_menu.nib # Step 4: if necessary, install qt_menu.nib
if test -n "${QTDIR}"; then if test -n "${QTDIR}"; then
MENU_NIB=$(find ${QTDIR} -name .svn -prune -o -name qt_menu.nib -print \ MENU_NIB=$(find ${QTDIR} -name .svn -o -name .git -prune -o -name qt_menu.nib -print \
| head -1) | head -1)
if test -e "${MENU_NIB}"; then if test -e "${MENU_NIB}"; then
rsync -r "${MENU_NIB}" ${1}/Contents/Resources/ rsync -r "${MENU_NIB}" ${1}/Contents/Resources/

@ -0,0 +1,10 @@
# set values for servicedock process
#EXEC_SERVICEDOCK="/usr/bin/nodejs /usr/share/servicedock/nodejs/servicedock"
# by default logs to /var/log/servicedock.log
SERVICEDOCK_LOG="/dev/null"
#SERVICEDOCK_USER="servicedock"
#SERVICEDOCK_PORT="8888"

@ -0,0 +1,38 @@
#!upstart
description "ServiceDock"
author "Marc Wäckerlin"
start on (local-filesystems and net-device-up)
stop on runlevel [!2345]
respawn
script
echo $$ > /var/run/servicedock.pid
# there are some useful defaults
# do not edit this file, overwrite values in /etc/default/servicedock
EXEC_SERVICEDOCK="/usr/bin/nodejs /usr/share/servicedock/nodejs/servicedock"
SERVICEDOCK_LOG="/var/log/servicedock.log"
SERVICEDOCK_USER="servicedock"
SERVICEDOCK_PORT=""
[ -r /etc/default/servicedock ] && . /etc/default/servicedock
if test -n "${SERVICEDOCK_USER}"; then
exec sudo -u "${SERVICEDOCK_USER}" ${EXEC_SERVICEDOCK} ${SERVICEDOCK_PORT} >> ${SERVICEDOCK_LOG} 2>&1
else
exec ${NODEJS_BIN} >> ${SERVICEDOCK_LOG} 2>&1
fi
end script
pre-start script
SERVICEDOCK_LOG="/var/log/servicedock.log"
[ -r /etc/default/servicedock ] && . /etc/default/servicedock
# Date format same as (new Date()).toISOString() for consistency
echo "[`date -u +%Y-%m-%dT%T.%3NZ`] (sys) Starting" >> ${SERVICEDOCK_LOG}
end script
pre-stop script
SERVICEDOCK_LOG="/var/log/servicedock.log"
[ -r /etc/default/servicedock ] && . /etc/default/servicedock
rm /var/run/servicedock.pid
echo "[`date -u +%Y-%m-%dT%T.%3NZ`] (sys) Stopping" >> ${SERVICEDOCK_LOG}
end script

@ -1,3 +1,3 @@
{ {
"port": 8889 "port": 8888
} }

@ -8,7 +8,11 @@ EXTRA_DIST = servicedock.js package.json.in public routes sockets docker views
nodejsdir = ${pkgdatadir}/nodejs nodejsdir = ${pkgdatadir}/nodejs
sysconf_DATA = etc/@PACKAGE_NAME@.json sysconfdefaultdir = ${sysconfdir}/default
sysconfinitdir = ${sysconfdir}/init
dist_sysconf_DATA = etc/@PACKAGE_NAME@.json
dist_sysconfdefault_DATA = etc/default/servicedock
dist_sysconfinit_DATA = etc/init/servicedock.conf
all: node_modules all: node_modules

@ -14,6 +14,18 @@ var config = require(package.path.config);
var docker = require(__dirname+'/docker')(app); var docker = require(__dirname+'/docker')(app);
// Configuration // Configuration
process.argv.forEach(function(val, index) {
if (index<2) {return}
if (index!=2 || typeof val != 'number') {
console.log("**** ERROR: Unexpected Argument - allowed is only a port number");
process.exit(1);
}
config.port = val;
});
if (typeof config.port != 'number') {
console.log("**** WARNING: no valid port given, defaults to 8888");
config.port = 8888;
}
app.configure(function(){ app.configure(function(){
app.set('views', __dirname + '/views'); app.set('views', __dirname + '/views');

Loading…
Cancel
Save