improved changelog; support bootstrap of node.js + express.js project
This commit is contained in:
		| @@ -194,10 +194,13 @@ AC_DEFUN([AX_INIT_STANDARD_PROJECT], [ | ||||
|   AX_SUBST(COPYING) | ||||
|   _AM_SUBST_NOTMAKE([COPYING]) | ||||
|   CHANGELOG=$(<ChangeLog) | ||||
|   AX_SUBST(CHANGELOG) | ||||
|   AC_SUBST(CHANGELOG) | ||||
|   _AM_SUBST_NOTMAKE([CHANGELOG]) | ||||
|   DEB_CHANGELOG=$(sed '/^[[^\t]]/{h;N;d};/^\t\* /{s,,,;H;g;s,^,\t* ,;s,\n\([[^ ]]*\) *, \1\n\t  ,}' ChangeLog) | ||||
|   AX_SUBST(DEB_CHANGELOG) | ||||
|   if test -z "$DEB_CHANGELOG"; then | ||||
|     DEB_CHANGELOG="	* see file ChangeLog and project management web site" | ||||
|   fi | ||||
|   AC_SUBST(DEB_CHANGELOG) | ||||
|   _AM_SUBST_NOTMAKE([DEB_CHANGELOG]) | ||||
|   AUTHOR=$(head -1 AUTHORS) | ||||
|   AUTHOR_NAME=$(echo $AUTHOR | sed 's, *[[<(]].*$,,') | ||||
|   | ||||
| @@ -149,6 +149,22 @@ GENERATED FILES | ||||
|     * src/version.cxx - if you enabled AX_USE_CXX | ||||
|     * html/makefile.am - if you enabled AX_BUILD_HTML | ||||
|     * scripts/makefile.am - if you enabled AX_USE_SCRIPTS | ||||
|     * nodejs/makefile.am - if you add AX_USE_NODEJS | ||||
|     * nodejs/${DEFAULT_PROJECT_NAME}.js - if you add AX_USE_NODEJS | ||||
|     * nodejs/package.json.in - if you add AX_USE_NODEJS | ||||
|     * nodejs/etc/${DEFAULT_PROJECT_NAME}.json - if you add AX_USE_NODEJS | ||||
|     * nodejs/etc/default/${DEFAULT_PROJECT_NAME} - if you add AX_USE_NODEJS | ||||
|     * nodejs/etc/init/${DEFAULT_PROJECT_NAME}.conf - if you add AX_USE_NODEJS | ||||
|     * nodejs/etc/systemd/system/${DEFAULT_PROJECT_NAME}.service - if you add AX_USE_NODEJS | ||||
|     * nodejs/public - if you add AX_USE_NODEJS | ||||
|     * nodejs/public/images - if you add AX_USE_NODEJS | ||||
|     * nodejs/public/javascripts/${DEFAULT_PROJECT_NAME}.js - if you add AX_USE_NODEJS | ||||
|     * nodejs/public/stylesheets/style.styl - if you add AX_USE_NODEJS | ||||
|     * nodejs/routes/index.js - if you add AX_USE_NODEJS | ||||
|     * nodejs/sockets/index.js - if you add AX_USE_NODEJS | ||||
|     * nodejs/views/index.ejs - if you add AX_USE_NODEJS | ||||
|     * nodejs/views/layout.ejs - if you add AX_USE_NODEJS | ||||
|     * nodejs/node_modules - if you add AX_USE_NODEJS | ||||
|     * doc/makefile.am - if you enabled AX_USE_DOXYGEN or AX_USE_PERLDOC | ||||
|     * doc/doxyfile.in - if you enabled AX_USE_DOXYGEN | ||||
|     * doc/header.html.in - if you enabled AX_USE_DOXYGEN | ||||
| @@ -242,6 +258,7 @@ FILES | ||||
|       * Enable C++: AX_USE_CXX | ||||
|       * Enable LibTool library creation: AX_USE_LIBTOOL | ||||
|       * Enable Scripts: AX_USE_SCRIPTS | ||||
|       * Enable NodeJS project: AX_USE_NODEJS | ||||
|       * Enable Doxygen documentation generation: AX_USE_DOXYGEN | ||||
|       * Enable Perldoc documentation generation: AX_USE_PERLDOC | ||||
|       * Enable Debian packaging by calling "make deb": AX_USE_DEBIAN_PACKAGING | ||||
| @@ -552,6 +569,7 @@ AX_INIT_STANDARD_PROJECT | ||||
| #AX_USE_CXX | ||||
| #AX_USE_LIBTOOL | ||||
| #AX_USE_SCRIPTS | ||||
| #AX_USE_NODEJS | ||||
| #AX_USE_DOXYGEN | ||||
| #AX_USE_PERLDOC | ||||
| #AX_USE_DEBIAN_PACKAGING | ||||
| @@ -839,6 +857,345 @@ ${HEADER}dist_bin_SCRIPTS = | ||||
|  | ||||
| MAINTAINERCLEANFILES = makefile.in | ||||
| EOF | ||||
| to --condition AX_USE_NODEJS nodejs/makefile.am <<EOF | ||||
| ${HEADER}EXTRA_DIST = @PACKAGE_NAME@.js package.json.in public routes sockets views | ||||
|  | ||||
| nodejsdir = \${pkgdatadir}/nodejs | ||||
|  | ||||
| sysconfdefaultdir = \${sysconfdir}/default | ||||
| sysconfinitdir = \${sysconfdir}/init | ||||
| dist_sysconf_DATA = etc/@PACKAGE_NAME@.json | ||||
| dist_sysconfdefault_DATA = etc/default/@PACKAGE_NAME@ | ||||
| dist_sysconfinit_DATA = etc/init/@PACKAGE_NAME@.conf | ||||
|  | ||||
| all: node_modules | ||||
|  | ||||
| node_modules: package.json.in | ||||
| 	HOME=. npm install | ||||
|  | ||||
| clean-local: | ||||
| 	-rm -r node_modules .npm | ||||
|  | ||||
| install-data-hook: | ||||
| 	test -d \$(DESTDIR)\${nodejsdir} || mkdir -p \$(DESTDIR)\${nodejsdir} | ||||
| 	chmod -R u+w \$(DESTDIR)\${nodejsdir} | ||||
| 	cp -r . \$(DESTDIR)\${nodejsdir} | ||||
|  | ||||
| uninstall-local: | ||||
| 	-chmod -R u+w \$(DESTDIR)\${nodejsdir} | ||||
| 	-rm -rf \$(DESTDIR)\${nodejsdir} | ||||
|  | ||||
| MAINTAINERCLEANFILES = makefile.in | ||||
| EOF | ||||
| to --condition AX_USE_NODEJS nodejs/${PACKAGE_NAME}.js <<EOF | ||||
| ${CHEADER}try { | ||||
|  | ||||
|   process.on('uncaughtException', function(e) { | ||||
|     console.log("**** UNCAUGHT EXCEPTION ****"); | ||||
|     console.log(e); | ||||
|     console.log(e.stack); | ||||
|     process.exit(1); | ||||
|   }); | ||||
|    | ||||
|   /** | ||||
|    * Module dependencies. | ||||
|    */ | ||||
|  | ||||
|   var express = require('express') | ||||
|     , routes = require(__dirname+'/routes'); | ||||
|  | ||||
|   var app = module.exports = express.createServer(); | ||||
|   var io  = require('socket.io').listen(app); | ||||
|   var package = require(__dirname+'/package.json'); | ||||
|   var config = require(package.path.config); | ||||
|   var authentication = require(__dirname+'/authentication')(config.restrict); | ||||
|   var sockets = require(__dirname+'/sockets')(io, authentication); | ||||
|  | ||||
|   // Configuration | ||||
|   process.argv.forEach(function(val, index) { | ||||
|     if (index<2) {return} | ||||
|     if (index!=2 || isNaN(val)) { | ||||
|       console.log("**** ERROR: Unexpected Argument - allowed is only a port number"); | ||||
|       process.exit(1); | ||||
|     } | ||||
|     config.port = parseInt(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'); | ||||
|     app.set('view engine', 'ejs'); | ||||
|     app.use(express.bodyParser()); | ||||
|     app.use(express.methodOverride()); | ||||
|     app.use(require('stylus').middleware({ src: __dirname + '/public' })); | ||||
|     app.use(app.router); | ||||
|     app.use(express.static(__dirname + '/public')); | ||||
|   }); | ||||
|  | ||||
|   app.configure('development', function(){ | ||||
|     app.use(express.errorHandler({ dumpExceptions: true, showStack: true })); | ||||
|   }); | ||||
|  | ||||
|   app.configure('production', function(){ | ||||
|     app.use(express.errorHandler()); | ||||
|   }); | ||||
|  | ||||
|   // Routes | ||||
|   app.get('/', routes.index); | ||||
|  | ||||
|   app.listen(config.port, function() { | ||||
|     console.log("Express server listening on port %d in %s mode", | ||||
|                 app.address().port, app.settings.env); | ||||
|   }); | ||||
| } catch (e) { | ||||
|   console.log("**** EXCEPTION ****"); | ||||
|   console.log(e); | ||||
|   console.log(e.stack); | ||||
|   process.exit(1); | ||||
| } | ||||
| EOF | ||||
| to --condition AX_USE_NODEJS nodejs/package.json.in <<EOF | ||||
| { | ||||
|   "name": "@PACKAGE_NAME@", | ||||
|   "version": "@PACKAGE_VERSION@", | ||||
|   "private": true, | ||||
|   "dependencies": { | ||||
|     "express": "~2.5.8", | ||||
|     "stylus": "~0.53.0", | ||||
|     "ejs": ">= 0.0.1", | ||||
|     "socket.io": "~1.4.4", | ||||
|     "socketio-auth": "0.0.5", | ||||
|     "ldapauth": "git+https://github.com/DimensionSoftware/node-ldapauth.git" | ||||
|   }, | ||||
|   "description": "@DESCRIPTION@", | ||||
|   "main": "@PACKAGE_NAME@.js", | ||||
|   "devDependencies": {}, | ||||
|   "scripts": { | ||||
|     "test": "echo \"Error: no test specified\" && exit 1" | ||||
|   }, | ||||
|   "author": "@AUTHOR@", | ||||
|   "license": "@LICENSE@", | ||||
|   "path": { | ||||
|       "prefix": "@PREFIX@", | ||||
|       "sysconf": "@SYSCONFDIR@", | ||||
|       "pkgdata": "@PKGDATADIR@", | ||||
|       "localstate": "@LOCALSTATEDIR@", | ||||
|       "log": "@LOCALSTATEDIR@/log/@PACKAGE_NAME@.log", | ||||
|       "config":  "@SYSCONFDIR@/@PACKAGE_NAME@.json", | ||||
|       "nodejs": "@PKGDATADIR@/nodejs" | ||||
|   } | ||||
| } | ||||
| EOF | ||||
| to --condition AX_USE_NODEJS nodejs/etc/${PACKAGE_NAME}.json <<EOF | ||||
| { | ||||
|   "port": 8888, | ||||
|   "restrict": { | ||||
|     "passwords": { | ||||
|       "foo": ["sha256", "fcde2b2edxx56bf408601fb721fe9b5c338d10ee429ea04fae5511b68fbf8fb9"] | ||||
|     }, | ||||
|     "ldap": { | ||||
|       "url": "ldap://dev.marc.waeckerlin.org", | ||||
|       "adminDn": "cn=tmp,ou=system,ou=people,dc=dev,dc=marc,dc=waeckerlin,dc=org", | ||||
|       "adminPassword": "secret", | ||||
|       "searchBase": "ou=person,ou=people,dc=dev,dc=marc,dc=waeckerlin,dc=org", | ||||
|       "searchFilter": "(uid={{username}})" | ||||
|     } | ||||
|   } | ||||
| } | ||||
| EOF | ||||
| to --condition AX_USE_NODEJS nodejs/etc/default/${PACKAGE_NAME} <<EOF | ||||
| #EXEC_${PACKAGE_NAME^^}="/usr/bin/nodejs /usr/share/${PACKAGE_NAME}/nodejs/${PACKAGE_NAME}" | ||||
| #${PACKAGE_NAME^^}_LOG="/var/log/${PACKAGE_NAME^^}.log" | ||||
| #${PACKAGE_NAME^^}="${PACKAGE_NAME}" | ||||
| #${PACKAGE_NAME^^}_PORT="8888" | ||||
| EOF | ||||
| to --condition AX_USE_NODEJS nodejs/etc/init/${PACKAGE_NAME}.conf <<EOF | ||||
| #!upstart | ||||
| description "$(head -1 README)" | ||||
| author      "$(head -1 AUTHORS)" | ||||
|  | ||||
| start on (local-filesystems and net-device-up) | ||||
| stop on runlevel [!2345] | ||||
|  | ||||
| respawn | ||||
|  | ||||
| script | ||||
|     echo \$\$ > /var/run/${PACKAGE_NAME}.pid | ||||
|     # there are some useful defaults | ||||
|     # do not edit this file, overwrite values in /etc/default/${PACKAGE_NAME} | ||||
|     EXEC_${PACKAGE_NAME^^}="/usr/bin/nodejs /usr/share/${PACKAGE_NAME}/nodejs/${PACKAGE_NAME}" | ||||
|     ${PACKAGE_NAME^^}_LOG="/var/log/${PACKAGE_NAME}.log" | ||||
|     ${PACKAGE_NAME^^}_USER="${PACKAGE_NAME}" | ||||
|     ${PACKAGE_NAME^^}_PORT="" | ||||
|     [ -r /etc/default/${PACKAGE_NAME} ] && . /etc/default/${PACKAGE_NAME} | ||||
|     if test -n "\${${PACKAGE_NAME^^}_USER}"; then | ||||
|         exec sudo -u "\${${PACKAGE_NAME^^}_USER}" \${EXEC_${PACKAGE_NAME^^}} \${${PACKAGE_NAME^^}_PORT} >> \${${PACKAGE_NAME^^}_LOG} 2>&1 | ||||
|     else | ||||
|         exec \${EXEC_${PACKAGE_NAME^^}} \${${PACKAGE_NAME^^}_PORT} >> \${${PACKAGE_NAME^^}_LOG} 2>&1 | ||||
|     fi | ||||
| end script | ||||
|  | ||||
| pre-start script | ||||
|     ${PACKAGE_NAME^^}_LOG="/var/log/${PACKAGE_NAME}.log" | ||||
|     [ -r /etc/default/${PACKAGE_NAME} ] && . /etc/default/${PACKAGE_NAME} | ||||
|     # Date format same as (new Date()).toISOString() for consistency | ||||
|     echo "[`date -u +%Y-%m-%dT%T.%3NZ`] (sys) Starting" >> \${${PACKAGE_NAME^^}_LOG} | ||||
| end script | ||||
|  | ||||
| pre-stop script | ||||
|     ${PACKAGE_NAME^^}_LOG="/var/log/${PACKAGE_NAME}.log" | ||||
|     [ -r /etc/default/${PACKAGE_NAME} ] && . /etc/default/${PACKAGE_NAME} | ||||
|     rm /var/run/${PACKAGE_NAME}.pid | ||||
|     echo "[`date -u +%Y-%m-%dT%T.%3NZ`] (sys) Stopping" >> \${${PACKAGE_NAME^^}_LOG} | ||||
| end script | ||||
| EOF | ||||
| to --condition AX_USE_NODEJS nodejs/etc/systemd/system/${PACKAGE_NAME}.service <<EOF | ||||
| [Unit] | ||||
| Description=$(head -1 README) | ||||
|  | ||||
| [Service] | ||||
| ExecStart=/usr/bin/nodejs /usr/share/${PACKAGE_NAME}/nodejs/${PACKAGE_NAME} > /var/log/${PACKAGE_NAME}.log | ||||
| Restart=on-abort | ||||
|  | ||||
| [Install] | ||||
| WantedBy=multi-user.target | ||||
| EOF | ||||
| if testtag AX_USE_DEBIAN_PACKAGING; then | ||||
|     checkdir AX_USE_NODEJS nodejs/public/images | ||||
| fi | ||||
| to --condition AX_USE_NODEJS nodejs/public/javascripts/${PACKAGE_NAME}.js <<EOF | ||||
| ${CHEADER}var socket = null; | ||||
| function init() { | ||||
|   socket = io.connect(); | ||||
|   /* | ||||
|   socket | ||||
|     .io | ||||
|     .on("connect", connect) | ||||
|     .on("reconnect", connect) | ||||
|     .on("disconnect", disconnected) | ||||
|     .on("error", disconnected); | ||||
|   socket | ||||
|     .on("authenticated", authenticated) | ||||
|     .on("unauthorized", unauthorized) | ||||
|     .on("fail", error); | ||||
|   */ | ||||
| } | ||||
|  | ||||
| /// On Load, Call @ref start | ||||
| /* | ||||
|    \$(window.onbeforeunload = function() { | ||||
|    return "Are you sure you want to navigate away?"; | ||||
|    }); | ||||
|  */ | ||||
| \$(init); | ||||
| EOF | ||||
| to --condition AX_USE_NODEJS nodejs/public/stylesheets/style.styl <<EOF | ||||
| body | ||||
|   padding: 50px | ||||
|   font: 14px "Lucida Grande", Helvetica, Arial, sans-serif | ||||
| a | ||||
|   color: #00B7FF | ||||
| EOF | ||||
| to --condition AX_USE_NODEJS nodejs/routes/index.js <<EOF | ||||
| ${CHEADER}var package = require(__dirname+"/../package.json"); | ||||
|  | ||||
| exports.index = function(req, res) { | ||||
|   res.render('index', { | ||||
|     packagename: package.name, | ||||
|     packageversion: package.version | ||||
|   }); | ||||
| }; | ||||
| EOF | ||||
| to --condition AX_USE_NODEJS nodejs/sockets/index.js <<EOF | ||||
| module.exports = function(io, authentication) { | ||||
|  | ||||
|   var module={}; | ||||
|    | ||||
|   function broadcast(signal, data) { | ||||
|     console.log("<= signal: "+signal); | ||||
|     io.sockets.emit(signal, data); | ||||
|   } | ||||
|    | ||||
|   function fail(txt, data) { | ||||
|     console.log("** "+txt, data); | ||||
|   } | ||||
|  | ||||
|   function connection(socket, userdata) { | ||||
|      | ||||
|     console.log("=> new connection from "+userdata.username); | ||||
|  | ||||
|     function emit(signal, data, info) { | ||||
|       if (typeof data == 'string' && !data.match("\n")) { | ||||
|         console.log("<- signal: "+signal+"("+data+")"); | ||||
|       } else { | ||||
|         console.log("<- signal: "+signal); | ||||
|       } | ||||
|       if (info) console.log(info); | ||||
|       socket.emit(signal, data); | ||||
|     } | ||||
|  | ||||
|     function fail(txt, data) { | ||||
|       console.log("** "+txt, data); | ||||
|       emit("fail", txt); | ||||
|     } | ||||
|  | ||||
|     /* | ||||
|     socket | ||||
|       .on("xxx", xxx) | ||||
|       .on("yyy", yyy; | ||||
|     */ | ||||
|  | ||||
|   } | ||||
|    | ||||
|   // Handle Connection | ||||
|   require('socketio-auth')(io, { | ||||
|     authenticate: function (socket, data, callback) { | ||||
|       console.log("=> authenticate: ", data.username); | ||||
|       //get credentials sent by the client | ||||
|       var username = data.username; | ||||
|       var password = data.password; | ||||
|       authentication(data.username, data.password, | ||||
|                      function() { | ||||
|                        console.log("####LOGIN-SUCESS####"); | ||||
|                        callback(null, true) | ||||
|                      }, | ||||
|                      function() { | ||||
|                        console.log("####LOGIN-FAIL####"); | ||||
|                        callback(new Error("wrong credentials")) | ||||
|                      }); | ||||
|     }, | ||||
|     postAuthenticate: connection, | ||||
|     timeout: "none" | ||||
|   }); | ||||
|  | ||||
|   return module; | ||||
| } | ||||
| EOF | ||||
| to --condition AX_USE_NODEJS nodejs/views/index.ejs <<EOF | ||||
| <!DOCTYPE html> | ||||
| <html> | ||||
|   <head> | ||||
|     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> | ||||
|     <meta name="viewport" content="width=device-width initial-scale=1" /> | ||||
|     <link href="stylesheets/style.css" rel="stylesheet" type="text/css" /> | ||||
|     <script type="text/javascript" src="/socket.io/socket.io.js"></script> | ||||
|     <script type="text/javascript" src="javascripts/${PACKAGE_NAME}.js"></script> | ||||
|     <title>$(head -1 README)</title> | ||||
|   </head> | ||||
|  | ||||
|   <body> | ||||
|     <h1>$(head -1 README)</h1> | ||||
|     <p>generated by bootstrap, please edit</p> | ||||
|   </body> | ||||
| </html> | ||||
|  | ||||
| EOF | ||||
| to --condition AX_USE_NODEJS nodejs/views/layout.ejs <<EOF | ||||
| <%- body %> | ||||
| EOF | ||||
| echo "${HEADER}MAINTAINERCLEANFILES = makefile.in" | to --condition 'AX_USE_DOXYGEN|AX_USE_PERLDOC' doc/makefile.am | ||||
| if testtag AX_BUILD_TEST; then | ||||
|     to test/runtests.sh < ${0%/*}/test/runtests.sh | ||||
|   | ||||
		Reference in New Issue
	
	Block a user