proper packaging and upstart scripts for ubuntu

single-host
Marc Wäckerlin 8 years ago
parent 702a064814
commit 9a9a17da92
  1. 78
      ax_init_standard_project.m4
  2. 112
      bootstrap.sh
  3. 2
      build-in-docker.sh
  4. 2
      debian/control.in
  5. 6
      debian/servicedock.postinst
  6. 4
      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:
# 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([
SVN_REVISION="ERROR-UNDEFINED-REVISION-to-be-built-in-subdirectory-of-svn-checkout"
for path in . .. ../..; do
if svn info $path 2>&1 > /dev/null; then
SVN_REVISION=$(LANG= svn info $path | sed -n 's/Last Changed Rev: //p')
if test -z "${SVN_REVISION}"; then SVN_REVISION=0; fi
break;
fi
done
echo $ECHO_N $(($SVN_REVISION))
]), mrw_esyscmd_s([
SVN_REVISION="ERROR-UNDEFINED-REVISION-to-be-built-in-subdirectory-of-svn-checkout"
for path in . .. ../..; do
if svn info $path 2>&1 > /dev/null; then
SVN_REVISION=$(LANG= svn info $path | sed -n 's/Last Changed Rev: //p')
if test -z "${SVN_REVISION}"; then SVN_REVISION=0; fi
break;
fi
done
# Mac does not support LEAST > 255
echo $ECHO_N $(($SVN_REVISION%256))
])))
m4_define(x_least, m4_ifdef([x_least_fix], [x_least_fix],
m4_ifdef([x_least_diff],
mrw_esyscmd_s([
VCS_REVISION="ERROR-UNDEFINED-REVISION-to-be-built-in-subdirectory-of-checkout"
for path in . .. ../..; do
if test -d .svn; then
VCS_REVISION=$(LANG= svn info $path | sed -n 's/Last Changed Rev: //p')
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;
fi
done
echo $ECHO_N $(($VCS_REVISION))
]), mrw_esyscmd_s([
VCS_REVISION="ERROR-UNDEFINED-REVISION-to-be-built-in-subdirectory-of-checkout"
for path in . .. ../..; do
if test -d .svn; then
VCS_REVISION=$(LANG= svn info $path | sed -n 's/Last Changed Rev: //p')
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;
fi
done
# Mac does not support LEAST > 255
echo $ECHO_N $(($VCS_REVISION%256))
])
)
))
# define version number from subversion's revision number:
# it is taken modulo 256 due to a bug on Apple's MacOSX
# add to x_minor if revision number is > 256
m4_define(x_minor_diff, mrw_esyscmd_s([
SVN_REVISION="ERROR-UNDEFINED-REVISION-to-be-built-in-subdirectory-of-svn-checkout"
m4_define(x_minor_diff, m4_ifdef([x_least_fix], 0, mrw_esyscmd_s([
VCS_REVISION="ERROR-UNDEFINED-REVISION-to-be-built-in-subdirectory-of-checkout"
for path in . .. ../..; do
if svn info $path 2>&1 > /dev/null; then
SVN_REVISION=$(LANG= svn info $path | sed -n 's/Last Changed Rev: //p')
if test -z "${SVN_REVISION}"; then SVN_REVISION=0; fi
if test -d .svn; then
VCS_REVISION=$(LANG= svn info $path | sed -n 's/Last Changed Rev: //p')
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;
fi;
done
# Mac does not support LEAST > 255
echo $ECHO_N $(($SVN_REVISION/256))
]))
echo $ECHO_N $(($VCS_REVISION/256))
])))
# 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]))])
@ -384,7 +401,7 @@ EXTRA_DIST += debian
clean-debian-targets:
-rm -rf \${PACKAGE_NAME}_\${PACKAGE_VERSION}~\${DISTRO}.\${BUILD_NUMBER}.{dsc,tar.gz} \${PACKAGE_NAME}_\${PACKAGE_VERSION}~\${DISTRO}.\${BUILD_NUMBER}*.changes \$\$(sed -n 's,Package: \(.*\),\1_${PACKAGE_VERSION}~${DISTRO}.${BUILD_NUMBER}*.deb,p;' debian/control)
deb: distdir
cd \${PACKAGE_NAME}-\${PACKAGE_VERSION} && ( export CFLAGS="\${CFLAGS}"; export CPPFLAGS="\${CPPFLAGS}"; export CXXFLAGS="\${CXXFLAGS}"; export LDFLAGS="\${LDFLAGS}"; export DEB_CFLAGS_APPEND="\${CFLAGS}"; export DEB_CPPFLAGS_APPEND="\${CPPFLAGS}"; export DEB_CXXFLAGS_APPEND="\${CXXFLAGS}"; export DEB_LDFLAGS_APPEND="\${LDFLAGS}"; dpkg-buildpackage )
cd \${PACKAGE_NAME}-\${PACKAGE_VERSION} && ( export CFLAGS="\${CFLAGS}"; export CPPFLAGS="\${CPPFLAGS}"; export CXXFLAGS="\${CXXFLAGS}"; export LDFLAGS="\${LDFLAGS}"; export DEB_CFLAGS_APPEND="\${CFLAGS}"; export DEB_CPPFLAGS_APPEND="\${CPPFLAGS}"; export DEB_CXXFLAGS_APPEND="\${CXXFLAGS}"; export DEB_LDFLAGS_APPEND="\${LDFLAGS}"; dpkg-buildpackage )
distclean-debian-targets:
-rm debian/changelog debian/control
#### End: $0
@ -618,6 +635,7 @@ AC_DEFUN([AX_PKG_CHECK], [
# make sure, a specific header exists
# - parameter:
# $1 = header name
# $2 = pathes to search for
AC_DEFUN([AX_REQUIRE_HEADER], [
AC_CHECK_HEADER($1, [], [
if test -n "$2"; then

@ -61,7 +61,7 @@ DESCRIPTION
configure.ac. Automatically copies or creates all required template
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.
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
${MY_NAME} (which is actually ${PROJECT_PATH}) should be the path to
your newly created project. Please note that your project must be a
checked out subversion repository, since this build environment
relies on subversion.
checked out subversion or git repository, since this build
environment relies on subversion or git.
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
svn co https://dev.marc.waeckerlin.org/svn/bootstrap-build-environment/trunk \\
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
../bootstrap-build-environment/bootstrap.sh
@ -201,13 +212,14 @@ FILES
${DEFAULT_PROJECT_NAME}::description().
* ChangeLog: Your changelog is automatically maintained from
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
the project name, the major and minor version. The
least version number is automatically taken from
subversion's revision, so every checkin
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 LibTool library creation: AX_USE_LIBTOOL
* Enable Scripts: AX_USE_SCRIPTS
@ -247,6 +259,20 @@ EOF
shift;
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\$"'
##
@ -270,6 +296,7 @@ CHEADER='/** @id '"\$Id\$"'
// 1 2 3 4 5 6 7 8
// 45678901234567890123456789012345678901234567890123456789012345678901234567890
'
notice() {
@ -318,7 +345,9 @@ contains() {
checkdir() {
if ! test -d "$1"; then # create path
run mkdir -p "$1"
run svn add "$1"
if test -n "${VCS}"; then
run ${VCS} add "$1"
fi
fi
}
@ -365,8 +394,12 @@ to() {
fi
chmod $mode $1
if test $exists -eq 0; then
run svn add "$1"
run svn propset svn:keywords "Id" "$1"
if test -n "${VCS}"; then
run ${VCS} add "$1"
if test "${VCS}" = "svn"; then
run svn propset svn:keywords "Id" "$1"
fi
fi
fi
return 0
}
@ -386,8 +419,12 @@ copy() {
fi
run cp "${source}" "$1"
if test $exists -eq 0; then
run svn add "$1"
run svn propset svn:keywords "Id" "$1"
if test -n "${VCS}"; then
run ${VCS} add "$1"
if test "${VCS}" = "svn"; then
run svn propset svn:keywords "Id" "$1"
fi
fi
fi
}
@ -413,10 +450,29 @@ doxyadd() {
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:
if test "$(LANG= svn info | sed -n 's,Relative URL: *,,p')" = "^/"; then
svn mkdir trunk branches tags
cd trunk
if test "${VCS}" = "svn"; then
if test "$(LANG= svn info | sed -n 's,Relative URL: *,,p')" = "^/"; then
svn mkdir trunk branches tags
cd trunk
fi
fi
# Initialize the environment:
@ -723,7 +779,9 @@ ${HEADER}dist_bin_SCRIPTS =
MAINTAINERCLEANFILES = makefile.in
EOF
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
${HEADER}$(if testtag AX_USE_CXX; then
cat <<EOF2
@ -761,8 +819,12 @@ if testtag AX_USE_DOXYGEN; then
contains doc/doxyfile.in "${rebuildfiles[@]}"; then
run doxygen -g doc/doxyfile.in
if test $exists -eq 0; then
run svn add doc/doxyfile.in
run svn propset svn:keywords "Id" 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
fi
fi
fi
doxyreplace PROJECT_NAME "@PACKAGE_NAME@"
doxyreplace PROJECT_NUMBER "@PACKAGE_VERSION@"
@ -842,7 +904,7 @@ if testtag AX_USE_DEBIAN_PACKAGING; then
-- @AUTHOR@ @BUILD_DATE@
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
Source: @PACKAGE_NAME@
Priority: extra
@ -913,7 +975,7 @@ else
fi)
Source0: %{name}-%{version}.tar.gz
BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root
BuildRequires: gnupg, subversion, automake, autoconf$(
BuildRequires: gnupg, ${VCSDEPENDS} automake, autoconf$(
if testtag AX_USE_DOXYGEN; then
echo -n ", doxygen";
fi)
@ -1046,7 +1108,13 @@ ${HEADER}SUBDIRS =${SUBDIRS}
desktopdir = \${datadir}/applications
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
MAINTAINERCLEANFILES = makefile.in
@ -1072,7 +1140,7 @@ if test -f makefile; then
fi
#### Bootstrap Before Configure ####
run --no-check svn2cl
run --no-check vcs2cl
run aclocal
if testtag AX_USE_LIBTOOL; then run libtoolize --force; fi
run automake -a

@ -196,5 +196,5 @@ for command in "${commands[@]}"; do
ifthenelse "${command}" "ARG"
done
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}"

2
debian/control.in vendored

@ -6,7 +6,7 @@ Build-Depends: debhelper, subversion, pkg-config, automake, libtool, autotools-d
Package: @PACKAGE_NAME@
Section: web
Architecture: any
Depends: ${shlibs:Depends}, ${misc:Depends}, nodejs
Depends: ${shlibs:Depends}, ${misc:Depends}, nodejs, libc-bin, adduser, upstart
Description: @DESCRIPTION@
@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
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)
if test -e "${MENU_NIB}"; then
rsync -r "${MENU_NIB}" ${1}/Contents/Resources/
@ -100,4 +100,4 @@ else
</dict>
</plist>
EOF
fi
fi

@ -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
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

@ -14,6 +14,18 @@ var config = require(package.path.config);
var docker = require(__dirname+'/docker')(app);
// 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.set('views', __dirname + '/views');

Loading…
Cancel
Save