From b91c13e05416040b1f0d7b39c047280a88279747 Mon Sep 17 00:00:00 2001 From: Felipe Cecagno <fcecagno@gmail.com> Date: Wed, 25 Jul 2018 15:14:55 -0300 Subject: [PATCH] update instructions and implementation of a working docker-compose (no recordings yet) --- DOCKER.md | 282 ++-- akka-bbb-apps/Dockerfile | 7 - akka-bbb-fsesl/Dockerfile | 36 +- akka-bbb-transcode/Dockerfile | 30 +- bbb-common-web/Dockerfile | 1 - bbb-fsesl-client/Dockerfile | 13 + bbb-webhooks/Dockerfile | 2 +- bbb-webhooks/application.js | 8 +- bbb-webhooks/callback_emitter.js | 5 +- bbb-webhooks/config.js | 2 + .../config/custom-environment-variables.yml | 4 - bbb-webhooks/config/monit-bbb-webhooks | 12 - bbb-webhooks/config/upstart-bbb-webhooks.conf | 34 - bbb-webhooks/extra/events.js | 2 +- bbb-webhooks/package-lock.json | 1427 ++++++++++------- bbb-webhooks/package.json | 3 +- bbb-webhooks/test/test.js | 12 +- bbb-webhooks/web_server.js | 3 +- bigbluebutton-html5/.dockerignore | 1 - bigbluebutton-html5/Dockerfile | 20 +- bigbluebutton-html5/docker-entrypoint.sh | 5 + bigbluebutton-web/Dockerfile | 20 +- .../{entrypoint.sh => docker-entrypoint.sh} | 5 +- .../grails-app/conf/Config.groovy | 4 +- bigbluebutton-web/turn-stun-servers.xml.tmpl | 53 + freeswitch.dockerfile | 21 - labs/bbb-webrtc-sfu/Dockerfile | 6 +- .../config/custom-environment-variables.yml | 2 - ...webrtc-sfu-run.sh => docker-entrypoint.sh} | 3 +- labs/docker/coturn/Dockerfile | 14 + labs/docker/coturn/turnserver.conf.tmpl | 21 + labs/docker/docker-compose.yml | 172 +- labs/docker/freeswitch/Dockerfile | 21 + labs/docker/freeswitch/docker-entrypoint.sh | 11 + labs/docker/freeswitch/event_socket_conf.xml | 10 + labs/docker/kurento/Dockerfile | 5 +- labs/docker/kurento/docker-entrypoint.sh | 21 + labs/docker/kurento/entrypoint.sh | 20 - .../docker/libreoffice/Dockerfile | 7 +- labs/docker/libreoffice/docker-entrypoint.sh | 12 + labs/docker/nginx/.dockerfile | 1 + labs/docker/nginx/Dockerfile | 17 +- .../nginx/{nginx.conf => nginx.conf.tmpl} | 116 +- labs/docker/sbt/Dockerfile | 1 - libreoffice-run.sh | 7 - 45 files changed, 1434 insertions(+), 1045 deletions(-) create mode 100644 bbb-fsesl-client/Dockerfile delete mode 100644 bbb-webhooks/config/custom-environment-variables.yml delete mode 100755 bbb-webhooks/config/monit-bbb-webhooks delete mode 100644 bbb-webhooks/config/upstart-bbb-webhooks.conf create mode 100755 bigbluebutton-html5/docker-entrypoint.sh rename bigbluebutton-web/{entrypoint.sh => docker-entrypoint.sh} (63%) create mode 100644 bigbluebutton-web/turn-stun-servers.xml.tmpl delete mode 100644 freeswitch.dockerfile rename labs/bbb-webrtc-sfu/{bbb-webrtc-sfu-run.sh => docker-entrypoint.sh} (62%) create mode 100644 labs/docker/coturn/Dockerfile create mode 100644 labs/docker/coturn/turnserver.conf.tmpl create mode 100644 labs/docker/freeswitch/Dockerfile create mode 100755 labs/docker/freeswitch/docker-entrypoint.sh create mode 100644 labs/docker/freeswitch/event_socket_conf.xml create mode 100755 labs/docker/kurento/docker-entrypoint.sh delete mode 100755 labs/docker/kurento/entrypoint.sh rename libreoffice.dockerfile => labs/docker/libreoffice/Dockerfile (57%) create mode 100755 labs/docker/libreoffice/docker-entrypoint.sh create mode 100644 labs/docker/nginx/.dockerfile rename labs/docker/nginx/{nginx.conf => nginx.conf.tmpl} (57%) delete mode 100755 libreoffice-run.sh diff --git a/DOCKER.md b/DOCKER.md index 5de8d5a538..67e33df986 100644 --- a/DOCKER.md +++ b/DOCKER.md @@ -1,125 +1,167 @@ -## BUILD -``` -mconf@docker-bbb:~/bigbluebutton/bigbluebutton-html5$ docker build -t bbb-html5 . -mconf@docker-bbb:~/bigbluebutton/labs/docker/sbt$ docker build -t 'sbt:0.13.8' . -mconf@docker-bbb:~/bigbluebutton/bbb-common-message$ docker build -t 'bbb-common-message' --build-arg COMMON_VERSION=0.0.1-SNAPSHOT . -mconf@docker-bbb:~/bigbluebutton$ docker build -f akka-bbb-apps/Dockerfile -t bbb-apps-akka --build-arg COMMON_VERSION=0.0.1-SNAPSHOT . -mconf@docker-bbb:~/bigbluebutton$ docker build -f akka-bbb-transcode/Dockerfile -t bbb-transcode --build-arg COMMON_VERSION=0.0.1-SNAPSHOT . -mconf@docker-bbb:~/bigbluebutton/bigbluebutton-web$ docker build -f Dockerfile -t bbb-web --build-arg COMMON_VERSION=0.0.1-SNAPSHOT . -mconf@docker-bbb:~/bigbluebutton$ docker build -f freeswitch.dockerfile -t bbb-freeswitch . -mconf@docker-bbb:~/bigbluebutton$ docker build -f akka-bbb-fsesl/Dockerfile -t bbb-fsesl-akka --build-arg COMMON_VERSION=0.0.1-SNAPSHOT . -mconf@docker-bbb:~/bigbluebutton$ docker build -f libreoffice.dockerfile -t libreoffice . -mconf@docker-bbb:~/bigbluebutton/labs/bbb-webrtc-sfu$ docker build -t bbb-webrtc-sfu . -mconf@docker-bbb:~/bigbluebutton/bbb-webhooks$ docker build -t bbb-webhooks . -mconf@felipe-docker:~/bigbluebutton/labs/docker/kurento$ docker build -t kurento . -docker build -t bbb-lti . +## Build + +sbt is needed to build the Scala components +``` +$ cd labs/docker/sbt/ +$ docker build -t 'sbt:0.13.8' . +``` + +Build libraries +``` +$ cd bbb-common-message/ +$ docker build -t 'bbb-common-message' --build-arg COMMON_VERSION=0.0.1-SNAPSHOT . + +$ cd bbb-common-web/ +$ docker build -t 'bbb-common-web' --build-arg COMMON_VERSION=0.0.1-SNAPSHOT . + +$ cd bbb-fsesl-client/ +$ docker build -t 'bbb-fsesl-client' --build-arg COMMON_VERSION=0.0.1-SNAPSHOT . +``` + +Build akka components +``` +$ cd akka-bbb-apps/ +$ docker build -t bbb-apps-akka --build-arg COMMON_VERSION=0.0.1-SNAPSHOT . + +# it's not needed, since we're setting up HTML5 only +$ cd akka-bbb-transcode/ +$ docker build -t bbb-transcode --build-arg COMMON_VERSION=0.0.1-SNAPSHOT . + +$ cd akka-bbb-fsesl/ +$ docker build -t bbb-fsesl-akka --build-arg COMMON_VERSION=0.0.1-SNAPSHOT . +``` + +Build bbb-web +``` +$ cd bigbluebutton-web/ +$ docker build -t bbb-web --build-arg COMMON_VERSION=0.0.1-SNAPSHOT . +``` + +Build bbb-html5 +``` +$ cd bigbluebutton-html5/ +$ docker build -t bbb-html5 . +``` + +Build bbb-webrtc-sfu +``` +$ cd labs/bbb-webrtc-sfu/ +$ docker build -t bbb-webrtc-sfu . +``` + +Build bbb-webhooks +``` +$ cd bbb-webhooks/ +$ docker build -t bbb-webhooks . +``` + +Build Kurento Media Server +``` +$ cd labs/docker/kurento/ +$ docker build -t kurento . +``` + +Build FreeSWITCH +``` +$ cd labs/docker/freeswitch/ +$ docker build -t bbb-freeswitch . +``` + +Build nginx +``` +$ cd labs/docker/nginx/ +$ docker build -t nginx . +``` + +Build nginx-dhp (used to generate the Diffie-Hellman file) +``` +$ cd labs/docker/nginx-dhp/ +$ docker build -t nginx-dhp . +``` + +Build coturn +``` +$ cd labs/docker/coturn +$ docker build -t coturn . +``` + +(Optional) Build bbb-lti + +``` +$ cd bbb-lti/ +$ docker build -t bbb-lti . ``` ## RUN + +Create a volume for the SSL certs + +``` +$ docker volume create docker_ssl-conf +``` + +Generate SSL certs + +``` +$ export SERVER_DOMAIN=felipe.dev.mconf.com +$ docker run --rm -p 80:80 -v docker_ssl-conf:/etc/letsencrypt -it certbot/certbot certonly --non-interactive --register-unsafely-without-email --agree-tos --expand --domain $SERVER_DOMAIN --standalone + +# certificate path: docker_ssl-conf/live/$SERVER_DOMAIN/fullchain.pem +# key path: docker_ssl-conf/live/$SERVER_DOMAIN/privkey.pem +``` + +Generate Diffie-Hellman file + +``` +$ docker run --rm -v docker_ssl-conf:/data -it nginx-dhp + +# dh-param path: docker_ssl-conf/dhp-2048.pem +``` + +Create a volume for the static files + +``` +$ docker volume create docker_static +$ cd bigbluebutton-config/web/ +$ docker run -d --rm --name nginx -v docker_static:/var/www/bigbluebutton-default nginx tail -f /dev/null +$ docker cp . nginx:/var/www/bigbluebutton-default +$ docker exec -it nginx chown -R www-data:www-data /var/www/bigbluebutton-default +$ docker stop nginx + +``` + +These are the instructions to run the containers individually ``` -docker run --rm --name bbb-lti -it -e SHARED_SECRET=123456 -e SERVER_DOMAIN=felipe-docker.mconf.com -e LTI_CONSUMERS=demo:welcome,consumer1:secret1 -p 8888:8080 bbb-lti -# docker run --rm --name coturn -p 3478:3478 -p 3478:3478/udp -d kurento/coturn -docker run --rm --name coturn --net host -d kurento/coturn -docker run --rm --name haveged --privileged -d harbur/haveged -docker run --rm --name mongo -d mongo:3.4 -docker run --rm --name redis -d redis -# docker run --rm --name kurento -d kurento/kurento-media-server -# docker run --rm --name kurento --net host -d kurento/kurento-media-server -docker run --rm --name kurento --net host -d kurento -docker run --rm --name bbb-html5 --link mongo --link redis -e MONGO_URL=mongodb://mongo/bbbhtml5 -e METEOR_SETTINGS="$(cat private/config/settings-production.json)" -e REDIS_HOST=redis -e ROOT_URL=http://127.0.0.1/html5client -d bbb-html5 -docker run --rm --name bbb-webhooks -p 3005:3005 --link redis -e REDIS_HOST=redis -d bbb-webhooks -docker run --rm --name bbb-apps-akka --link redis -e REDIS_HOST=redis -d bbb-apps-akka -docker run --rm --name bbb-transcode --link redis -e REDIS_HOST=redis -d bbb-transcode -docker run --rm --name bbb-web --link redis -e REDIS_HOST=redis -e SERVER_URL=https://felipe-docker.mconf.com -d bbb-web -docker run --rm --name greenlight -v $(pwd)/db/production:/usr/src/app/db/production --env-file greenlight.env -d bigbluebutton/greenlight -docker run --rm --name bbb-freeswitch -d bbb-freeswitch -docker run --rm --name bbb-fsesl-akka --link redis --link bbb-freeswitch -e REDIS_HOST=redis -e ESL_HOST=freeswitch -d bbb-fsesl-akka -docker run --rm --name libreoffice -p 8100:8100 -d libreoffice -# docker run --rm --name bbb-webrtc-sfu -p 3008:3008 --link redis --link kurento --link bbb-transcode -e KURENTO_IP=206.189.162.193 -e KURENTO_URL=ws://kurento:8888/kurento -e TRANSCODE_IP=bbb-transcode -e REDIS_HOST=redis -d bbb-webrtc-sfu -docker run --rm --name bbb-webrtc-sfu -p 3008:3008 --link redis --link bbb-transcode -e KURENTO_IP=206.189.162.193 -e KURENTO_URL=ws://localhost:8888/kurento -e TRANSCODE_IP=bbb-transcode -e REDIS_HOST=redis -d bbb-webrtc-sfu - -docker run --rm --name certbot -p 80:80 -v ~/certs:/etc/letsencrypt -it certbot/certbot certonly --non-interactive --register-unsafely-without-email --agree-tos --expand --domain felipe-docker.mconf.com --webroot -w /var/www/bigbluebutton-default/ -docker run --rm --name certbot -p 80:80 -v ~/certs:/etc/letsencrypt -it certbot/certbot certonly --non-interactive --register-unsafely-without-email --agree-tos --expand --domain felipe-docker.mconf.com --standalone - -openssl dhparam -out /root/dhp-2048.pem 2048 - -docker run --rm --name nginx --link bbb-webhooks --link bbb-web --link bbb-html5 --link bbb-webrtc-sfu --link greenlight -p 80:80 -p 443:443 -v ~/certs:/etc/letsencrypt -v $(pwd)/dhp-2048.pem:/etc/nginx/ssl/dhp-2048.pem -v $(pwd)/nginx.conf:/etc/nginx/nginx.conf -v $(pwd)/bigbluebutton-client/resources/config.xml.template:/var/www/bigbluebutton/client/conf/config.xml -d nginx - -docker exec -ti bbb-web cat webapps/bigbluebutton/WEB-INF/classes/bigbluebutton.properties | grep '^securitySalt=' | cut -d'=' -f2 -docker exec -ti redis redis-cli monitor - -docker run --rm --name bbb-web --link redis -e -it bbb-web sh -c 'export JAVA_OPTS="$JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -DsecuritySalt=123456 -Dredis.host=redis -Dbigbluebutton.web.serverURL=https://felipe-docker.mconf.com"; sed -i "s|^securerandom\.source=.*|securerandom.source=file:/dev/./urandom|g" $JAVA_HOME/lib/security/java.security; exec catalina.sh run' - - -docker run --rm -v vconfig:/data -ti tannerfe/alpine-openssl openssl dhparam -out /data/nginx/dhp-2048.pem 2048 -``` - -## TODO -- reboot libreoffice in case of failure -- connect bbb-common-web to libreoffice running in a different container (decouple bbb-web from libreoffice); remove libreoffice from bbb-web image -- configure ip on freeswitch -v configure to connect to redis: - v akka-bbb-apps/src/main/resources/application.conf - v akka-bbb-fsesl/src/main/resources/application.conf - v akka-bbb-transcode/src/main/resources/application.conf - v bbb-webhooks/config_local.coffee.example - v bigbluebutton-html5/private/config/settings-production.json - v bigbluebutton-web/grails-app/conf/application.conf - v bigbluebutton-web/grails-app/conf/bigbluebutton.properties - v labs/bbb-webrtc-sfu/config/default.example.yml -- set log filename on bigbluebutton-html5/private/config/settings-production.json to /dev/stdout -- set freeswitch esl host on akka-bbb-fsesl/src/main/resources/application.conf to bbb-freeswitch -- set server URL and secret on bigbluebutton-web/grails-app/conf/bigbluebutton.properties -- set secret on bbb-webhooks/config_local.coffee.example -- remove FileAppender from bigbluebutton-web/grails-app/conf/logback.xml -- set kurentoUrl on labs/bbb-webrtc-sfu/config/default.example.yml to ws://kurento/kurento -- recordings -v reverse proxy using traefik (used nginx instead) -- docker composer -- UDP ports -- generate dhparam -- configure kurento public IP on bbb-webrtc-sfu -- use config library to load the process.env automatically as it is on bbb-webrtc-sfu -- configure custom params on the html5 client -- configure udp ports on coturn -- configure udp ports on kms -- configure udp ports on freeswitch -- explore using stunclient stun.l.google.com 19302 | grep 'Mapped address' | cut -d':' -f2 | sed 's/[[:blank:]]//g' to figure out the public IP -- syncookies when using ufw - -Last minute notes: - -docker run --rm --name kurento --net host -d kurento -docker run --rm --name mongo -d mongo:3.4 -docker run --rm --name redis -d redis -docker run --rm --name coturn --net host -d kurento/coturn -# docker run --rm --name bbb-webrtc-sfu -p 3008:3008 --link redis --link kurento --link bbb-transcode -e KURENTO_IP=206.189.162.193 -e KURENTO_URL=ws://kurento:8888/kurento -e TRANSCODE_IP=bbb-transcode -e REDIS_HOST=redis -d bbb-webrtc-sfu -docker run --rm --name bbb-webrtc-sfu -p 3008:3008 --link redis --link bbb-transcode -e KURENTO_IP=206.189.162.193 -e KURENTO_URL=ws://felipe-docker.mconf.com:8888/kurento -e TRANSCODE_IP=bbb-transcode -e REDIS_HOST=redis -d bbb-webrtc-sfu - - - -docker run --rm --name haveged --privileged -d harbur/haveged -# docker run --rm --name kurento -d kurento/kurento-media-server -# docker run --rm --name kurento --net host -d kurento/kurento-media-server -docker run --rm --name kurento --net host -d kurento - -docker run --rm --name bbb-html5 --link mongo --link redis -e MONGO_URL=mongodb://mongo/bbbhtml5 -e METEOR_SETTINGS="$(cat private/config/settings-production.json)" -e REDIS_HOST=redis -e ROOT_URL=http://127.0.0.1/html5client -d bbb-html5 -docker run --rm --name bbb-webhooks --link redis -e REDIS_HOST=redis -d bbb-webhooks -docker run --rm --name bbb-apps-akka --link redis -e REDIS_HOST=redis -d bbb-apps-akka -docker run --rm --name bbb-transcode --link redis -e REDIS_HOST=redis -d bbb-transcode -docker run --rm --name bbb-web --link redis -e REDIS_HOST=redis -e SERVER_URL=https://felipe-docker.mconf.com -d bbb-web -docker run --rm --name greenlight -v $(pwd)/db/production:/usr/src/app/db/production --env-file greenlight.env -d bigbluebutton/greenlight -docker run --rm --name bbb-freeswitch -d bbb-freeswitch -docker run --rm --name bbb-fsesl-akka --link redis --link bbb-freeswitch -e REDIS_HOST=redis -e ESL_HOST=freeswitch -d bbb-fsesl-akka -docker run --rm --name libreoffice -p 8100:8100 -d libreoffice - -docker run --rm --name certbot -p 80:80 -v ~/certs:/etc/letsencrypt -it certbot/certbot certonly --non-interactive --register-unsafely-without-email --agree-tos --expand --domain felipe-docker.mconf.com --webroot -w /var/www/bigbluebutton-default/ -docker run --rm --name certbot -p 80:80 -v ~/certs:/etc/letsencrypt -it certbot/certbot certonly --non-interactive --register-unsafely-without-email --agree-tos --expand --domain felipe-docker.mconf.com --standalone - -openssl dhparam -out /root/dhp-2048.pem 2048 - -docker run --rm --name nginx --link bbb-webhooks --link bbb-web --link bbb-html5 --link bbb-webrtc-sfu --link greenlight -p 80:80 -p 443:443 -v ~/certs:/etc/letsencrypt -v $(pwd)/dhp-2048.pem:/etc/nginx/ssl/dhp-2048.pem -v $(pwd)/nginx.conf:/etc/nginx/nginx.conf -v $(pwd)/bigbluebutton-client/resources/config.xml.template:/var/www/bigbluebutton/client/conf/config.xml -d nginx - -docker exec -ti bbb-web cat webapps/bigbluebutton/WEB-INF/classes/bigbluebutton.properties | grep '^securitySalt=' | cut -d'=' -f2 -docker exec -ti redis redis-cli monitor +$ export SERVER_DOMAIN=felipe.dev.mconf.com +$ export EXTERNAL_IP=`dig +short $SERVER_DOMAIN` +$ export SHARED_SECRET=`openssl rand -hex 16` +$ export COTURN_REST_SECRET=`openssl rand -hex 16` +$ export SCREENSHARE_EXTENSION_LINK=https://chrome.google.com/webstore/detail/mconf-screenshare/mbfngdphjegmlbfobcblikeefpidfncb +$ export SCREENSHARE_EXTENSION_KEY=mbfngdphjegmlbfobcblikeefpidfncb + +$ docker run --rm --name mongo -d mongo:3.4 + +$ docker run --rm --name redis -d redis + +$ docker run --rm --name bbb-html5 --link mongo --link redis -e MONGO_URL=mongodb://mongo/bbbhtml5 -e METEOR_SETTINGS_MODIFIER=".public.kurento.wsUrl = \"wss://${SERVER_DOMAIN}/bbb-webrtc-sfu\" | .public.kurento.enableVideo = true | .public.kurento.enableScreensharing = true | .public.kurento.chromeDefaultExtensionKey = \"${SCREENSHARE_EXTENSION_KEY}\" | .public.kurento.chromeDefaultExtensionLink = \"${SCREENSHARE_EXTENSION_LINK}\"" -e REDIS_HOST=redis -e ROOT_URL=http://127.0.0.1/html5client -d bbb-html5 + +$ docker run --rm --name bbb-apps-akka --link redis -e REDIS_HOST=redis -d bbb-apps-akka +$ docker run --rm --name bbb-fsesl-akka --link redis --link bbb-freeswitch -e REDIS_HOST=redis -e ESL_HOST=bbb-freeswitch -d bbb-fsesl-akka + +$ docker run --rm --name bbb-web --link redis -e REDIS_HOST=redis -e SERVER_DOMAIN=${SERVER_DOMAIN} -e SHARED_SECRET=${SHARED_SECRET} -e TURN_SECRET=${COTURN_REST_SECRET} -v bigbluebutton:/var/bigbluebutton -d bbb-web + +$ docker run --rm --name bbb-webrtc-sfu --link redis --link kurento -e KURENTO_IP=${EXTERNAL_IP} -e KURENTO_URL=ws://kurento:8888/kurento -e REDIS_HOST=redis -d bbb-webrtc-sfu + +$ docker run --rm --name coturn -v docker_ssl-conf:/etc/nginx/ssl -e SERVER_DOMAIN=${SERVER_DOMAIN} -e SSL_CERT_PATH=/etc/nginx/ssl/live/${SERVER_DOMAIN}/fullchain.pem -e SSL_KEY_PATH=/etc/nginx/ssl/live/${SERVER_DOMAIN}/privkey.pem -e SSL_DHPARAM_PATH=/etc/nginx/ssl/dhp-2048.pem -e SECRET=${COTURN_REST_SECRET} -e EXTERNAL_IP=${EXTERNAL_IP} -e ENABLE_REST_API=1 -e PORT=3478 -e PORT_TLS=5349 -p 3478:3478/udp -p 3478:3478/tcp -p 5349:5349/tcp -d coturn + +$ docker run --rm --name bbb-freeswitch --link coturn -d bbb-freeswitch + +$ docker run --rm --name bbb-fsesl-akka --link redis --link bbb-freeswitch -e REDIS_HOST=redis -e ESL_HOST=freeswitch -d bbb-fsesl-akka + +$ docker run --rm --name nginx --link bbb-freeswitch --link bbb-web --link bbb-html5 --link bbb-webrtc-sfu --link bbb-webhooks -p 80:80 -p 443:443 -v docker_static:/var/www/bigbluebutton-default -v docker_ssl-conf:/etc/nginx/ssl -e SERVER_DOMAIN=${SERVER_DOMAIN} -e SSL_CERT_PATH=/etc/nginx/ssl/live/${SERVER_DOMAIN}/fullchain.pem -e SSL_KEY_PATH=/etc/nginx/ssl/live/${SERVER_DOMAIN}/privkey.pem -e SSL_DHPARAM_PATH=/etc/nginx/ssl/dhp-2048.pem -d nginx + +$ docker run --rm --name kurento -e KMS_STUN_IP=${EXTERNAL_IP} -e KMS_STUN_PORT=3478 -d kurento + +$ docker run --rm --name bbb-webhooks --link redis -e REDIS_HOST=redis -e SHARED_SECRET=${SHARED_SECRET} -d bbb-webhooks +``` diff --git a/akka-bbb-apps/Dockerfile b/akka-bbb-apps/Dockerfile index 003229be0f..e8adc296c1 100644 --- a/akka-bbb-apps/Dockerfile +++ b/akka-bbb-apps/Dockerfile @@ -21,11 +21,4 @@ COPY --from=builder /source/target/*.deb /root/ RUN dpkg -i /root/*.deb -#RUN dpkg -i /root/*.deb || true \ -# && apt-get update \ -# && apt-get -y -f install - CMD ["/usr/share/bbb-apps-akka/bin/bbb-apps-akka"] - -# CMD ["sbt", "run"] - diff --git a/akka-bbb-fsesl/Dockerfile b/akka-bbb-fsesl/Dockerfile index bf4fe7b5be..f1a7483010 100644 --- a/akka-bbb-fsesl/Dockerfile +++ b/akka-bbb-fsesl/Dockerfile @@ -1,31 +1,25 @@ -FROM sbt:0.13.8 +FROM bbb-fsesl-client AS builder -ARG COMMON_VERSION +ARG COMMON_VERSION=0.0.1-SNAPSHOT -COPY ./bbb-common-message /bbb-common-message - -RUN cd /bbb-common-message \ - && sed -i "s|\(version := \)\".*|\1\"$COMMON_VERSION\"|g" build.sbt \ - && echo 'publishTo := Some(Resolver.file("file", new File(Path.userHome.absolutePath+"/.m2/repository")))' | tee -a build.sbt \ - && sbt compile \ - && sbt publishLocal - -COPY ./bbb-fsesl-client /bbb-fsesl-client - -RUN cd /bbb-fsesl-client \ - && sed -i "s|\(version := \)\".*|\1\"$COMMON_VERSION\"|g" build.sbt \ - && echo 'publishTo := Some(Resolver.file("file", new File(Path.userHome.absolutePath+"/.m2/repository")))' | tee -a build.sbt \ - && sbt compile \ - && sbt publishLocal - -COPY ./akka-bbb-fsesl /source +COPY . /source RUN cd /source \ && find -name build.sbt -exec sed -i "s|\(.*org.bigbluebutton.*bbb-common-message[^\"]*\"[ ]*%[ ]*\)\"[^\"]*\"\(.*\)|\1\"$COMMON_VERSION\"\2|g" {} \; \ && find -name build.sbt -exec sed -i "s|\(.*org.bigbluebutton.*bbb-fsesl-client[^\"]*\"[ ]*%[ ]*\)\"[^\"]*\"\(.*\)|\1\"$COMMON_VERSION\"\2|g" {} \; \ && sbt compile -WORKDIR /source +RUN apt-get update \ + && apt-get -y install fakeroot + +RUN cd /source \ + && sbt debian:packageBin + +# FROM ubuntu:16.04 +FROM openjdk:8-jre-slim-stretch + +COPY --from=builder /source/target/*.deb /root/ -CMD ["sbt", "run"] +RUN dpkg -i /root/*.deb +CMD ["/usr/share/bbb-fsesl-akka/bin/bbb-fsesl-akka"] diff --git a/akka-bbb-transcode/Dockerfile b/akka-bbb-transcode/Dockerfile index 5ed7784006..96225399a7 100644 --- a/akka-bbb-transcode/Dockerfile +++ b/akka-bbb-transcode/Dockerfile @@ -1,26 +1,26 @@ -FROM sbt:0.13.8 +FROM bbb-common-message AS builder -ARG COMMON_VERSION +ARG COMMON_VERSION=0.0.1-SNAPSHOT -COPY ./bbb-common-message /bbb-common-message - -RUN cd /bbb-common-message \ - && sed -i "s|\(version := \)\".*|\1\"$COMMON_VERSION\"|g" build.sbt \ - && echo 'publishTo := Some(Resolver.file("file", new File(Path.userHome.absolutePath+"/.m2/repository")))' | tee -a build.sbt \ - && sbt compile \ - && sbt publishLocal - -COPY ./akka-bbb-transcode /source +COPY . /source RUN cd /source \ - && find -name build.gradle -exec sed -i "s|\(.*org.bigbluebutton.*bbb-common-message[^:]*\):.*|\1:$COMMON_VERSION'|g" {} \; \ && find -name build.sbt -exec sed -i "s|\(.*org.bigbluebutton.*bbb-common-message[^\"]*\"[ ]*%[ ]*\)\"[^\"]*\"\(.*\)|\1\"$COMMON_VERSION\"\2|g" {} \; \ && sbt compile RUN apt-get update \ - && apt-get -y install ffmpeg + && apt-get -y install fakeroot -WORKDIR /source +RUN cd /source \ + && sbt debian:packageBin -CMD ["sbt", "run"] +# FROM ubuntu:16.04 +FROM openjdk:8-jre-slim-stretch + +COPY --from=builder /source/target/*.deb /root/ + +RUN dpkg -i /root/*.deb \ + && apt-get update \ + && apt-get -y install ffmpeg +CMD ["/usr/share/bbb-transcode-akka/bin/bbb-transcode-akka"] diff --git a/bbb-common-web/Dockerfile b/bbb-common-web/Dockerfile index c6b0c4b9ff..874219a3ba 100644 --- a/bbb-common-web/Dockerfile +++ b/bbb-common-web/Dockerfile @@ -11,4 +11,3 @@ RUN cd /bbb-common-web \ && sbt compile \ && sbt publish \ && sbt publishLocal - diff --git a/bbb-fsesl-client/Dockerfile b/bbb-fsesl-client/Dockerfile new file mode 100644 index 0000000000..c9fd93a841 --- /dev/null +++ b/bbb-fsesl-client/Dockerfile @@ -0,0 +1,13 @@ +FROM bbb-common-message + +ARG COMMON_VERSION + +COPY . /bbb-fsesl-client + +RUN cd /bbb-fsesl-client \ + && sed -i "s|\(version := \)\".*|\1\"$COMMON_VERSION\"|g" build.sbt \ + && find -name build.sbt -exec sed -i "s|\(.*org.bigbluebutton.*bbb-common-message[^\"]*\"[ ]*%[ ]*\)\"[^\"]*\"\(.*\)|\1\"$COMMON_VERSION\"\2|g" {} \; \ + && echo 'publishTo := Some(Resolver.file("file", new File(Path.userHome.absolutePath+"/.m2/repository")))' | tee -a build.sbt \ + && sbt compile \ + && sbt publish \ + && sbt publishLocal diff --git a/bbb-webhooks/Dockerfile b/bbb-webhooks/Dockerfile index 7e83f1aea3..39d1b3dc31 100644 --- a/bbb-webhooks/Dockerfile +++ b/bbb-webhooks/Dockerfile @@ -1,7 +1,7 @@ FROM node:8 ADD . /source -RUN cp /source/config_local.coffee.example /source/config_local.coffee +RUN cp /source/config_local.js.example /source/config_local.js ENV NODE_ENV production diff --git a/bbb-webhooks/application.js b/bbb-webhooks/application.js index 2817826712..12d9e74dd8 100644 --- a/bbb-webhooks/application.js +++ b/bbb-webhooks/application.js @@ -13,8 +13,12 @@ const async = require("async"); module.exports = class Application { constructor() { - config.redis.pubSubClient = redis.createClient(); - config.redis.client = redis.createClient() + let options = { + host : process.env.REDIS_HOST || config.redis.host, + port : process.env.REDIS_PORT || config.redis.port + }; + config.redis.pubSubClient = redis.createClient(options); + config.redis.client = redis.createClient(options); this.webHooks = new WebHooks(); this.webServer = new WebServer(); } diff --git a/bbb-webhooks/callback_emitter.js b/bbb-webhooks/callback_emitter.js index 11416774cb..ab4cf34808 100644 --- a/bbb-webhooks/callback_emitter.js +++ b/bbb-webhooks/callback_emitter.js @@ -62,6 +62,7 @@ module.exports = class CallbackEmitter extends EventEmitter { _emitMessage(callback) { let data,requestOptions; + const sharedSecret = process.env.SHARED_SECRET || config.bbb.sharedSecret; if (config.bbb.auth2_0) { // Send data as a JSON @@ -76,7 +77,7 @@ module.exports = class CallbackEmitter extends EventEmitter { method: "POST", form: data, auth: { - bearer: config.bbb.sharedSecret + bearer: sharedSecret } }; } @@ -89,7 +90,7 @@ module.exports = class CallbackEmitter extends EventEmitter { }; // calculate the checksum - const checksum = Utils.checksum(`${this.callbackURL}${JSON.stringify(data)}${config.bbb.sharedSecret}`); + const checksum = Utils.checksum(`${this.callbackURL}${JSON.stringify(data)}${sharedSecret}`); // get the final callback URL, including the checksum const urlObj = url.parse(this.callbackURL, true); diff --git a/bbb-webhooks/config.js b/bbb-webhooks/config.js index 80845f1fc9..cfc7ccda07 100644 --- a/bbb-webhooks/config.js +++ b/bbb-webhooks/config.js @@ -51,6 +51,8 @@ config.mappings.timeout = 1000*60*60*24; // 24 hours, in ms // Redis config.redis = {}; +config.redis.host = '127.0.0.1'; +config.redis.port = 6379; config.redis.keys = {}; config.redis.keys.hook = id => `bigbluebutton:webhooks:hook:${id}`; config.redis.keys.hooks = "bigbluebutton:webhooks:hooks"; diff --git a/bbb-webhooks/config/custom-environment-variables.yml b/bbb-webhooks/config/custom-environment-variables.yml deleted file mode 100644 index eb173affbb..0000000000 --- a/bbb-webhooks/config/custom-environment-variables.yml +++ /dev/null @@ -1,4 +0,0 @@ -config: - redis: - host: REDIS_HOST - diff --git a/bbb-webhooks/config/monit-bbb-webhooks b/bbb-webhooks/config/monit-bbb-webhooks deleted file mode 100755 index 18e1f1e445..0000000000 --- a/bbb-webhooks/config/monit-bbb-webhooks +++ /dev/null @@ -1,12 +0,0 @@ -#!monit -set logfile /var/log/monit.log - -check process bbb-webhooks with pidfile "/var/run/bbb-webhooks.pid" - start program = "/sbin/start bbb-webhooks" - stop program = "/sbin/stop bbb-webhooks" - - if failed port 3005 protocol HTTP - request /bigbluebutton/api/hooks/ping - with timeout 30 seconds - then restart - # if 5 restarts within 5 cycles then timeout diff --git a/bbb-webhooks/config/upstart-bbb-webhooks.conf b/bbb-webhooks/config/upstart-bbb-webhooks.conf deleted file mode 100644 index af2e506934..0000000000 --- a/bbb-webhooks/config/upstart-bbb-webhooks.conf +++ /dev/null @@ -1,34 +0,0 @@ -# bbb-webhooks - -description "bbb-webhooks" -author "BigBlueButton" - -start on (local-filesystems and net-device-up IFACE=eth3) -stop on shutdown - -# respawn # we're using monit for it - -env USER=firstuser -env APP=app.js -env CMD_OPTS="" -env SRC_DIR="/usr/local/bigbluebutton/bbb-webhooks" -env LOGFILE="/var/log/bbb-webhooks.log" -env NODE=/usr/local/bin/node -env PIDFILE="/var/run/bbb-webhooks.pid" -env NODE_ENV="production" - -script - cd $SRC_DIR - echo $$ > $PIDFILE - exec sudo -u $USER NODE_ENV=$NODE_ENV $NODE $APP $CMD_OPTS 1>> $LOGFILE 2>> $LOGFILE -end script - -pre-start script - # Date format same as (new Date()).toISOString() for consistency - echo "[`date -u +%Y-%m-%dT%T.%3NZ`] (sys) Starting" >> $LOGFILE -end script - -pre-stop script - rm $PIDFILE - echo "[`date -u +%Y-%m-%dT%T.%3NZ`] (sys) Stopping" >> $LOGFILE -end script diff --git a/bbb-webhooks/extra/events.js b/bbb-webhooks/extra/events.js index 9abaf828d5..c527879ac9 100644 --- a/bbb-webhooks/extra/events.js +++ b/bbb-webhooks/extra/events.js @@ -6,7 +6,7 @@ const redis = require("redis"); const config = require('../config.js'); var target_meeting = null; var events_printed = []; -var subscriber = redis.createClient(); +var subscriber = redis.createClient(process.env.REDIS_PORT || config.redis.port, process.env.REDIS_HOST || config.redis.host); subscriber.on("psubscribe", function(channel, count) { console.log("subscribed to " + channel); diff --git a/bbb-webhooks/package-lock.json b/bbb-webhooks/package-lock.json index 756667bad9..d219d53434 100644 --- a/bbb-webhooks/package-lock.json +++ b/bbb-webhooks/package-lock.json @@ -4,42 +4,14 @@ "lockfileVersion": 1, "requires": true, "dependencies": { - "accepts": { - "version": "https://registry.npmjs.org/accepts/-/accepts-1.1.4.tgz", - "integrity": "sha1-1xyW99QdD+2iw4zRToonwEFY30o=", - "requires": { - "mime-types": "https://registry.npmjs.org/mime-types/-/mime-types-2.0.14.tgz", - "negotiator": "https://registry.npmjs.org/negotiator/-/negotiator-0.4.9.tgz" - }, - "dependencies": { - "mime-db": { - "version": "https://registry.npmjs.org/mime-db/-/mime-db-1.12.0.tgz", - "integrity": "sha1-PQxjGA9FjrENMlqqN9fFiuMS6dc=" - }, - "mime-types": { - "version": "https://registry.npmjs.org/mime-types/-/mime-types-2.0.14.tgz", - "integrity": "sha1-MQ4VnbI+B3+Lsit0jav6SVcUCqY=", - "requires": { - "mime-db": "https://registry.npmjs.org/mime-db/-/mime-db-1.12.0.tgz" - } - } - } - }, - "asn1": { - "version": "https://registry.npmjs.org/asn1/-/asn1-0.1.11.tgz", - "integrity": "sha1-VZvhg3bQik7E2+gId9J4GGObLfc=" - }, - "assert-plus": { - "version": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.1.5.tgz", - "integrity": "sha1-7nQAlBMALYTOxyGcasgRgS5yMWA=" - }, "assertion-error": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.0.2.tgz", "integrity": "sha1-E8pRXYYgbaC6xm6DTdOX2HWBCUw=" }, "async": { - "version": "https://registry.npmjs.org/async/-/async-0.9.0.tgz", + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/async/-/async-0.9.0.tgz", "integrity": "sha1-rDYTsdqb7RtHUQu0ZRuJMeRxRsc=" }, "asynckit": { @@ -48,44 +20,152 @@ "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", "dev": true }, - "aws-sign2": { - "version": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.5.0.tgz", - "integrity": "sha1-xXED96F/wDfwLXwuZLYC6iI/fWM=" - }, "balanced-match": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", "dev": true }, - "bl": { - "version": "https://registry.npmjs.org/bl/-/bl-0.9.5.tgz", - "integrity": "sha1-wGt5evCF6gC8Unr8jvzxHeIjIFQ=", - "requires": { - "readable-stream": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz" - } - }, "body-parser": { - "version": "https://registry.npmjs.org/body-parser/-/body-parser-1.17.2.tgz", - "integrity": "sha1-+IkqvI+eYn1Crtr7yma/WrmRBO4=", - "requires": { - "bytes": "https://registry.npmjs.org/bytes/-/bytes-2.4.0.tgz", - "content-type": "https://registry.npmjs.org/content-type/-/content-type-1.0.2.tgz", - "debug": "https://registry.npmjs.org/debug/-/debug-2.6.7.tgz", - "depd": "https://registry.npmjs.org/depd/-/depd-1.1.1.tgz", - "http-errors": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.2.tgz", - "iconv-lite": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.15.tgz", - "on-finished": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "qs": "https://registry.npmjs.org/qs/-/qs-6.4.0.tgz", - "raw-body": "https://registry.npmjs.org/raw-body/-/raw-body-2.2.0.tgz", - "type-is": "https://registry.npmjs.org/type-is/-/type-is-1.6.15.tgz" - } - }, - "boom": { - "version": "https://registry.npmjs.org/boom/-/boom-0.4.2.tgz", - "integrity": "sha1-emNune1O/O+xnO9JR6PGffrukRs=", + "version": "1.18.3", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.3.tgz", + "integrity": "sha1-WykhmP/dVTs6DyDe0FkrlWlVyLQ=", "requires": { - "hoek": "https://registry.npmjs.org/hoek/-/hoek-0.9.1.tgz" + "bytes": "3.0.0", + "content-type": "1.0.4", + "debug": "2.6.9", + "depd": "1.1.2", + "http-errors": "1.6.3", + "iconv-lite": "0.4.23", + "on-finished": "2.3.0", + "qs": "6.5.2", + "raw-body": "2.3.3", + "type-is": "1.6.16" + }, + "dependencies": { + "bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=" + }, + "content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" + }, + "http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", + "requires": { + "depd": "1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": "1.5.0" + } + }, + "iconv-lite": { + "version": "0.4.23", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz", + "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==", + "requires": { + "safer-buffer": "2.1.2" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" + }, + "mime-db": { + "version": "1.35.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.35.0.tgz", + "integrity": "sha512-JWT/IcCTsB0Io3AhWUMjRqucrHSPsSf2xKLaRldJVULioggvkJvggZ3VXNNSRkCddE6D+BUI4HEIZIA2OjwIvg==" + }, + "mime-types": { + "version": "2.1.19", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.19.tgz", + "integrity": "sha512-P1tKYHVSZ6uFo26mtnve4HQFE3koh1UWVkp8YUC+ESBHe945xWSoXuHHiGarDqcEZ+whpCDnlNw5LON0kLo+sw==", + "requires": { + "mime-db": "1.35.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "requires": { + "ee-first": "1.1.1" + } + }, + "qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" + }, + "raw-body": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.3.tgz", + "integrity": "sha512-9esiElv1BrZoI3rCDuOuKCBRbuApGGaDPQfjSflGxdy4oyzqghxu6klEkkVIvBje+FF0BX9coEv8KqW6X/7njw==", + "requires": { + "bytes": "3.0.0", + "http-errors": "1.6.3", + "iconv-lite": "0.4.23", + "unpipe": "1.0.0" + } + }, + "setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" + }, + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" + }, + "type-is": { + "version": "1.6.16", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.16.tgz", + "integrity": "sha512-HRkVv/5qY2G6I8iab9cI7v1bOIdhm94dVjQCPFElW9W+3GeDOSHmy2EBYe4VTApuzolPcmgFTN3ftVJRKR2J9Q==", + "requires": { + "media-typer": "0.3.0", + "mime-types": "2.1.19" + } + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" + } } }, "brace-expansion": { @@ -104,45 +184,27 @@ "integrity": "sha1-81HTKWnTL6XXpVZxVCY9korjvR8=", "dev": true }, - "bytes": { - "version": "https://registry.npmjs.org/bytes/-/bytes-2.4.0.tgz", - "integrity": "sha1-fZcZb51br39pNeJZhVSe3SpsIzk=" - }, - "caseless": { - "version": "https://registry.npmjs.org/caseless/-/caseless-0.6.0.tgz", - "integrity": "sha1-gWfBq4OX+1u5X5bSjlqBxQ8kesQ=" - }, - "chai": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/chai/-/chai-3.5.0.tgz", - "integrity": "sha1-TQJjewZ/6Vi9v906QOxW/vc3Mkc=", - "requires": { - "assertion-error": "1.0.2", - "deep-eql": "0.1.3", - "type-detect": "1.0.0" - } - }, - "charenc": { - "version": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz", - "integrity": "sha1-wKHS86cJLgN3S/qD8UwPxXkKhmc=" - }, - "coffee-script": { - "version": "https://registry.npmjs.org/coffee-script/-/coffee-script-1.8.0.tgz", - "integrity": "sha1-nJ8dK0pSoADe0Vtll5FwNkgmPB0=", + "build": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/build/-/build-0.1.4.tgz", + "integrity": "sha1-cH/gJv/O3crL/c3zVur9pk8VEEY=", "requires": { - "mkdirp": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.5.tgz" + "cssmin": "0.3.2", + "jsmin": "1.0.1", + "jxLoader": "0.1.1", + "moo-server": "1.3.0", + "promised-io": "0.3.5", + "timespan": "2.3.0", + "uglify-js": "1.3.5", + "walker": "1.0.7", + "winston": "0.8.3", + "wrench": "1.3.9" } }, - "colors": { - "version": "https://registry.npmjs.org/colors/-/colors-0.6.2.tgz", - "integrity": "sha1-JCP+ZnisDF2uiFLl0OW+CMmXq8w=" - }, - "combined-stream": { - "version": "https://registry.npmjs.org/combined-stream/-/combined-stream-0.0.7.tgz", - "integrity": "sha1-ATfmV7qlp1QcV6w3rF/AfXO03B8=", - "requires": { - "delayed-stream": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-0.0.5.tgz" - } + "check-error": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", + "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=" }, "commander": { "version": "2.9.0", @@ -165,22 +227,6 @@ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", "dev": true }, - "content-disposition": { - "version": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.0.tgz", - "integrity": "sha1-QoT+auBjCHRjnkToCkGMKTQTXp4=" - }, - "content-type": { - "version": "https://registry.npmjs.org/content-type/-/content-type-1.0.2.tgz", - "integrity": "sha1-t9ETrueo3Se9IRM8TcJSnfFyHu0=" - }, - "cookie": { - "version": "https://registry.npmjs.org/cookie/-/cookie-0.1.2.tgz", - "integrity": "sha1-cv7D0k5Io0Mgc9kMEmQgBQYQBLE=" - }, - "cookie-signature": { - "version": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.5.tgz", - "integrity": "sha1-oSLj8VA+yg9TVXlbBxG7I2jUUPk=" - }, "cookiejar": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.1.tgz", @@ -189,82 +235,36 @@ }, "core-util-is": { "version": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" - }, - "crc": { - "version": "https://registry.npmjs.org/crc/-/crc-3.2.1.tgz", - "integrity": "sha1-XZyPt3okXNXsopHl0tAFM0urAII=" - }, - "crypt": { - "version": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz", - "integrity": "sha1-iNf/fsDfuG9xPch7u0LQRNPmxBs=" - }, - "cryptiles": { - "version": "https://registry.npmjs.org/cryptiles/-/cryptiles-0.2.2.tgz", - "integrity": "sha1-7ZH/HxetE9N0gohZT4pIoNJvMlw=", - "requires": { - "boom": "https://registry.npmjs.org/boom/-/boom-0.4.2.tgz" - } - }, - "ctype": { - "version": "https://registry.npmjs.org/ctype/-/ctype-0.5.3.tgz", - "integrity": "sha1-gsGMJGH3QRTvFsE1IkrQuRRMoS8=" + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true }, - "cycle": { - "version": "https://registry.npmjs.org/cycle/-/cycle-1.0.3.tgz", - "integrity": "sha1-IegLK+hYD5i0aPN5QwZisEbDStI=" + "cssmin": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/cssmin/-/cssmin-0.3.2.tgz", + "integrity": "sha1-3c5MVHtRCuDVlKjx+/iq+OLFwA0=" }, "debug": { "version": "https://registry.npmjs.org/debug/-/debug-2.6.7.tgz", "integrity": "sha1-krrR9tBbu2u6Isyoi80OyJTChh4=", + "dev": true, "requires": { "ms": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz" } }, - "deep-eql": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-0.1.3.tgz", - "integrity": "sha1-71WKyrjeJSBs1xOQbXTlaTDrafI=", - "requires": { - "type-detect": "0.1.1" - }, - "dependencies": { - "type-detect": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-0.1.1.tgz", - "integrity": "sha1-C6XsKohWQORw6k6FBZcZANrFiCI=" - } - } - }, "deep-equal": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", "integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=" }, - "delayed-stream": { - "version": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-0.0.5.tgz", - "integrity": "sha1-1LH0OpPoKW3+AmlPRoC8N6MTxz8=" - }, - "depd": { - "version": "https://registry.npmjs.org/depd/-/depd-1.1.1.tgz", - "integrity": "sha1-V4O04cRZ8G+lyif5kfPQbnoxA1k=" - }, - "destroy": { - "version": "https://registry.npmjs.org/destroy/-/destroy-1.0.3.tgz", - "integrity": "sha1-tDO0ck5x/YVR2YhRdIUcX8N34sk=" - }, "diff": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/diff/-/diff-3.2.0.tgz", "integrity": "sha1-yc45Okt8vQsFinJck98pkCeGj/k=" }, - "ee-first": { - "version": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" - }, - "escape-html": { - "version": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.1.tgz", - "integrity": "sha1-GBoobq05ejmpKFfPsdQwUuNWv/A=" + "double-ended-queue": { + "version": "2.1.0-0", + "resolved": "https://registry.npmjs.org/double-ended-queue/-/double-ended-queue-2.1.0-0.tgz", + "integrity": "sha1-ED01J/0xUo9AGIEwyEHv3XgmTlw=" }, "escape-string-regexp": { "version": "1.0.5", @@ -272,91 +272,260 @@ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", "dev": true }, - "etag": { - "version": "https://registry.npmjs.org/etag/-/etag-1.5.1.tgz", - "integrity": "sha1-VMUN4E7kJpVWKSWsVmWIKRvn6eo=", - "requires": { - "crc": "https://registry.npmjs.org/crc/-/crc-3.2.1.tgz" - } - }, "express": { - "version": "https://registry.npmjs.org/express/-/express-4.10.2.tgz", + "version": "4.10.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.10.2.tgz", "integrity": "sha1-3wbd6U2WiTKCnUQKIATF7+ZElbA=", "requires": { - "accepts": "https://registry.npmjs.org/accepts/-/accepts-1.1.4.tgz", - "content-disposition": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.0.tgz", - "cookie": "https://registry.npmjs.org/cookie/-/cookie-0.1.2.tgz", - "cookie-signature": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.5.tgz", - "debug": "https://registry.npmjs.org/debug/-/debug-2.1.3.tgz", - "depd": "https://registry.npmjs.org/depd/-/depd-1.0.1.tgz", - "escape-html": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.1.tgz", - "etag": "https://registry.npmjs.org/etag/-/etag-1.5.1.tgz", - "finalhandler": "https://registry.npmjs.org/finalhandler/-/finalhandler-0.3.2.tgz", - "fresh": "https://registry.npmjs.org/fresh/-/fresh-0.2.4.tgz", - "media-typer": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "merge-descriptors": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-0.0.2.tgz", - "methods": "https://registry.npmjs.org/methods/-/methods-1.1.0.tgz", - "on-finished": "https://registry.npmjs.org/on-finished/-/on-finished-2.1.1.tgz", - "parseurl": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.1.tgz", - "path-to-regexp": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.3.tgz", - "proxy-addr": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-1.0.10.tgz", - "qs": "https://registry.npmjs.org/qs/-/qs-2.3.2.tgz", - "range-parser": "https://registry.npmjs.org/range-parser/-/range-parser-1.0.3.tgz", - "send": "https://registry.npmjs.org/send/-/send-0.10.1.tgz", - "serve-static": "https://registry.npmjs.org/serve-static/-/serve-static-1.7.2.tgz", - "type-is": "https://registry.npmjs.org/type-is/-/type-is-1.5.7.tgz", - "utils-merge": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.0.tgz", - "vary": "https://registry.npmjs.org/vary/-/vary-1.0.1.tgz" + "accepts": "1.1.4", + "content-disposition": "0.5.0", + "cookie": "0.1.2", + "cookie-signature": "1.0.5", + "debug": "2.1.3", + "depd": "1.0.1", + "escape-html": "1.0.1", + "etag": "1.5.1", + "finalhandler": "0.3.2", + "fresh": "0.2.4", + "media-typer": "0.3.0", + "merge-descriptors": "0.0.2", + "methods": "1.1.0", + "on-finished": "2.1.1", + "parseurl": "1.3.2", + "path-to-regexp": "0.1.3", + "proxy-addr": "1.0.10", + "qs": "2.3.2", + "range-parser": "1.0.3", + "send": "0.10.1", + "serve-static": "1.7.2", + "type-is": "1.5.7", + "utils-merge": "1.0.0", + "vary": "1.0.1" }, "dependencies": { + "accepts": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.1.4.tgz", + "integrity": "sha1-1xyW99QdD+2iw4zRToonwEFY30o=", + "requires": { + "mime-types": "2.0.14", + "negotiator": "0.4.9" + } + }, + "content-disposition": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.0.tgz", + "integrity": "sha1-QoT+auBjCHRjnkToCkGMKTQTXp4=" + }, + "cookie": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.1.2.tgz", + "integrity": "sha1-cv7D0k5Io0Mgc9kMEmQgBQYQBLE=" + }, + "cookie-signature": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.5.tgz", + "integrity": "sha1-oSLj8VA+yg9TVXlbBxG7I2jUUPk=" + }, + "crc": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/crc/-/crc-3.2.1.tgz", + "integrity": "sha1-XZyPt3okXNXsopHl0tAFM0urAII=" + }, "debug": { - "version": "https://registry.npmjs.org/debug/-/debug-2.1.3.tgz", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.1.3.tgz", "integrity": "sha1-zoqxte6PvuK/o7Yzyrk9NmtjQY4=", "requires": { - "ms": "https://registry.npmjs.org/ms/-/ms-0.7.0.tgz" + "ms": "0.7.0" } }, "depd": { - "version": "https://registry.npmjs.org/depd/-/depd-1.0.1.tgz", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.0.1.tgz", "integrity": "sha1-gK7GTJ1tl+ZcwqnKqTwKpqv3Oqo=" }, + "destroy": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.3.tgz", + "integrity": "sha1-tDO0ck5x/YVR2YhRdIUcX8N34sk=" + }, "ee-first": { - "version": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.0.tgz", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.0.tgz", "integrity": "sha1-ag18YiHkkP7v2S7D9EHJzozQl/Q=" }, + "escape-html": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.1.tgz", + "integrity": "sha1-GBoobq05ejmpKFfPsdQwUuNWv/A=" + }, + "etag": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.5.1.tgz", + "integrity": "sha1-VMUN4E7kJpVWKSWsVmWIKRvn6eo=", + "requires": { + "crc": "3.2.1" + } + }, + "finalhandler": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-0.3.2.tgz", + "integrity": "sha1-ezibD9Nkem+QvVZOImJL+KSnf7U=", + "requires": { + "debug": "2.1.3", + "escape-html": "1.0.1", + "on-finished": "2.1.1" + } + }, + "forwarded": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", + "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" + }, + "fresh": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.2.4.tgz", + "integrity": "sha1-NYJJkgbJcjcUGQ7ddLRgT+tKYUw=" + }, + "ipaddr.js": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.0.5.tgz", + "integrity": "sha1-X6eM8wG4JceKvDBC2BJyMEnqI8c=" + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" + }, + "merge-descriptors": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-0.0.2.tgz", + "integrity": "sha1-w2pSp4FDdRPFcnXzndnTF1FKyMc=" + }, + "methods": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.0.tgz", + "integrity": "sha1-XcpO4S31L/OwVhRZhqjwHLyGQ28=" + }, + "mime": { + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.2.11.tgz", + "integrity": "sha1-WCA+7Ybjpe8XrtK32evUfwpg3RA=" + }, "mime-db": { - "version": "https://registry.npmjs.org/mime-db/-/mime-db-1.12.0.tgz", + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.12.0.tgz", "integrity": "sha1-PQxjGA9FjrENMlqqN9fFiuMS6dc=" }, "mime-types": { - "version": "https://registry.npmjs.org/mime-types/-/mime-types-2.0.14.tgz", + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.0.14.tgz", "integrity": "sha1-MQ4VnbI+B3+Lsit0jav6SVcUCqY=", "requires": { - "mime-db": "https://registry.npmjs.org/mime-db/-/mime-db-1.12.0.tgz" + "mime-db": "1.12.0" } }, "ms": { - "version": "https://registry.npmjs.org/ms/-/ms-0.7.0.tgz", + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.0.tgz", "integrity": "sha1-hlvpTC5zl62KV9pqYzpuLzB5i4M=" }, + "negotiator": { + "version": "0.4.9", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.4.9.tgz", + "integrity": "sha1-kuRrbbU8fkIe1koryU8IvnYw3z8=" + }, "on-finished": { - "version": "https://registry.npmjs.org/on-finished/-/on-finished-2.1.1.tgz", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.1.1.tgz", "integrity": "sha1-+CyhyeOk8yhrG5k4YQ5bhja9PLI=", "requires": { - "ee-first": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.0.tgz" + "ee-first": "1.1.0" + } + }, + "parseurl": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", + "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=" + }, + "path-to-regexp": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.3.tgz", + "integrity": "sha1-IbmrgidCed4lsVbqCP0SylG4rss=" + }, + "proxy-addr": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-1.0.10.tgz", + "integrity": "sha1-DUCoL4Afw1VWfS7LZe/j8HfxIcU=", + "requires": { + "forwarded": "0.1.2", + "ipaddr.js": "1.0.5" } }, "qs": { - "version": "https://registry.npmjs.org/qs/-/qs-2.3.2.tgz", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-2.3.2.tgz", "integrity": "sha1-1F7CSeS5sCmvAIgpoQHV/36XJ5A=" }, + "range-parser": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.0.3.tgz", + "integrity": "sha1-aHKCNTXGkuLCoBA4Jq/YLC4P8XU=" + }, + "send": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.10.1.tgz", + "integrity": "sha1-d0XFDscvEVEVmA6PsXmuwBkA4Io=", + "requires": { + "debug": "2.1.3", + "depd": "1.0.1", + "destroy": "1.0.3", + "escape-html": "1.0.1", + "etag": "1.5.1", + "fresh": "0.2.4", + "mime": "1.2.11", + "ms": "0.6.2", + "on-finished": "2.1.1", + "range-parser": "1.0.3" + }, + "dependencies": { + "ms": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.6.2.tgz", + "integrity": "sha1-2JwhJMb9wTU9Zai3e/GqxLGTcIw=" + } + } + }, + "serve-static": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.7.2.tgz", + "integrity": "sha1-MWTOBtTmw0Wb3MnWAY+0+zXoSzk=", + "requires": { + "escape-html": "1.0.1", + "parseurl": "1.3.2", + "send": "0.10.1", + "utils-merge": "1.0.0" + } + }, "type-is": { - "version": "https://registry.npmjs.org/type-is/-/type-is-1.5.7.tgz", + "version": "1.5.7", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.5.7.tgz", "integrity": "sha1-uTaKWTzG730GReeLL0xky+zQXpA=", "requires": { - "media-typer": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "mime-types": "https://registry.npmjs.org/mime-types/-/mime-types-2.0.14.tgz" + "media-typer": "0.3.0", + "mime-types": "2.0.14" } + }, + "utils-merge": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.0.tgz", + "integrity": "sha1-ApT7kiu5N1FTVBxPcJYjHyh8ivg=" + }, + "vary": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.0.1.tgz", + "integrity": "sha1-meSYFWaihhGN+yuBc1ffeZM3bRA=" } } }, @@ -366,56 +535,6 @@ "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=", "dev": true }, - "eyes": { - "version": "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz", - "integrity": "sha1-Ys8SAjTGg3hdkCNIqADvPgzCC8A=" - }, - "finalhandler": { - "version": "https://registry.npmjs.org/finalhandler/-/finalhandler-0.3.2.tgz", - "integrity": "sha1-ezibD9Nkem+QvVZOImJL+KSnf7U=", - "requires": { - "debug": "https://registry.npmjs.org/debug/-/debug-2.1.3.tgz", - "escape-html": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.1.tgz", - "on-finished": "https://registry.npmjs.org/on-finished/-/on-finished-2.1.1.tgz" - }, - "dependencies": { - "debug": { - "version": "https://registry.npmjs.org/debug/-/debug-2.1.3.tgz", - "integrity": "sha1-zoqxte6PvuK/o7Yzyrk9NmtjQY4=", - "requires": { - "ms": "https://registry.npmjs.org/ms/-/ms-0.7.0.tgz" - } - }, - "ee-first": { - "version": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.0.tgz", - "integrity": "sha1-ag18YiHkkP7v2S7D9EHJzozQl/Q=" - }, - "ms": { - "version": "https://registry.npmjs.org/ms/-/ms-0.7.0.tgz", - "integrity": "sha1-hlvpTC5zl62KV9pqYzpuLzB5i4M=" - }, - "on-finished": { - "version": "https://registry.npmjs.org/on-finished/-/on-finished-2.1.1.tgz", - "integrity": "sha1-+CyhyeOk8yhrG5k4YQ5bhja9PLI=", - "requires": { - "ee-first": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.0.tgz" - } - } - } - }, - "forever-agent": { - "version": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.5.2.tgz", - "integrity": "sha1-bQ4JxJIflKJ/Y9O0nF/v8epMUTA=" - }, - "form-data": { - "version": "https://registry.npmjs.org/form-data/-/form-data-0.1.4.tgz", - "integrity": "sha1-kavXiKupcCsaq/qLwBAxoqyeOxI=", - "requires": { - "async": "https://registry.npmjs.org/async/-/async-0.9.0.tgz", - "combined-stream": "https://registry.npmjs.org/combined-stream/-/combined-stream-0.0.7.tgz", - "mime": "https://registry.npmjs.org/mime/-/mime-1.2.11.tgz" - } - }, "formatio": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/formatio/-/formatio-1.2.0.tgz", @@ -430,20 +549,17 @@ "integrity": "sha1-lriIb3w8NQi5Mta9cMTTqI818ak=", "dev": true }, - "forwarded": { - "version": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.0.tgz", - "integrity": "sha1-Ge+YdMSuHCl7zweP3mOgm2aoQ2M=" - }, - "fresh": { - "version": "https://registry.npmjs.org/fresh/-/fresh-0.2.4.tgz", - "integrity": "sha1-NYJJkgbJcjcUGQ7ddLRgT+tKYUw=" - }, "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", "dev": true }, + "get-func-name": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", + "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=" + }, "glob": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.1.tgz", @@ -476,43 +592,6 @@ "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", "dev": true }, - "hawk": { - "version": "https://registry.npmjs.org/hawk/-/hawk-1.1.1.tgz", - "integrity": "sha1-h81JH5tG5OKurKM1QWdmiF0tHtk=", - "requires": { - "boom": "https://registry.npmjs.org/boom/-/boom-0.4.2.tgz", - "cryptiles": "https://registry.npmjs.org/cryptiles/-/cryptiles-0.2.2.tgz", - "hoek": "https://registry.npmjs.org/hoek/-/hoek-0.9.1.tgz", - "sntp": "https://registry.npmjs.org/sntp/-/sntp-0.2.4.tgz" - } - }, - "hoek": { - "version": "https://registry.npmjs.org/hoek/-/hoek-0.9.1.tgz", - "integrity": "sha1-PTIkYrrfB3Fup+uFuviAec3c5QU=" - }, - "http-errors": { - "version": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.2.tgz", - "integrity": "sha1-CgAsyFcHGSp+eUbO7cERVfYOxzY=", - "requires": { - "depd": "https://registry.npmjs.org/depd/-/depd-1.1.1.tgz", - "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "setprototypeof": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.3.tgz", - "statuses": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz" - } - }, - "http-signature": { - "version": "https://registry.npmjs.org/http-signature/-/http-signature-0.10.1.tgz", - "integrity": "sha1-T72sEyVZqoMjEh5UB3nAoBKyfmY=", - "requires": { - "asn1": "https://registry.npmjs.org/asn1/-/asn1-0.1.11.tgz", - "assert-plus": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.1.5.tgz", - "ctype": "https://registry.npmjs.org/ctype/-/ctype-0.5.3.tgz" - } - }, - "iconv-lite": { - "version": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.15.tgz", - "integrity": "sha1-/iZaIYrGpXz+hUkn6dBMGYJe3es=" - }, "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", @@ -525,23 +604,22 @@ }, "inherits": { "version": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" - }, - "ipaddr.js": { - "version": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.0.5.tgz", - "integrity": "sha1-X6eM8wG4JceKvDBC2BJyMEnqI8c=" + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true }, "isarray": { "version": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" }, - "isstream": { - "version": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" + "js-yaml": { + "version": "0.3.7", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-0.3.7.tgz", + "integrity": "sha1-1znY7oZGHlSzVNan19HyrZoWf2I=" }, - "json-stringify-safe": { - "version": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" + "jsmin": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/jsmin/-/jsmin-1.0.1.tgz", + "integrity": "sha1-570NzWSWw79IYyNb9GGj2YqjuYw=" }, "json3": { "version": "3.3.2", @@ -554,8 +632,20 @@ "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-1.1.22.tgz", "integrity": "sha1-MzCvdWyralQnAMZLLk5KoGLVL/8=" }, + "jxLoader": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jxLoader/-/jxLoader-0.1.1.tgz", + "integrity": "sha1-ATTqUUTlM7WU/B/yX/GU4jXFPs0=", + "requires": { + "js-yaml": "0.3.7", + "moo-server": "1.3.0", + "promised-io": "0.3.5", + "walker": "1.0.7" + } + }, "lodash": { - "version": "https://registry.npmjs.org/lodash/-/lodash-2.4.1.tgz", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.4.1.tgz", "integrity": "sha1-W3cjA03aTSYuWkb7LFjXzCL3FCA=" }, "lodash._baseassign": { @@ -603,6 +693,11 @@ "lodash._isiterateecall": "3.0.9" } }, + "lodash.get": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", + "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=" + }, "lodash.isarguments": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", @@ -631,29 +726,23 @@ "resolved": "https://registry.npmjs.org/lolex/-/lolex-2.1.2.tgz", "integrity": "sha1-JpS5U8nqTQE+W4v7qJHJkQJbJik=" }, - "media-typer": { - "version": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" - }, - "merge-descriptors": { - "version": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-0.0.2.tgz", - "integrity": "sha1-w2pSp4FDdRPFcnXzndnTF1FKyMc=" - }, - "methods": { - "version": "https://registry.npmjs.org/methods/-/methods-1.1.0.tgz", - "integrity": "sha1-XcpO4S31L/OwVhRZhqjwHLyGQ28=" - }, - "mime": { - "version": "https://registry.npmjs.org/mime/-/mime-1.2.11.tgz", - "integrity": "sha1-WCA+7Ybjpe8XrtK32evUfwpg3RA=" + "makeerror": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.11.tgz", + "integrity": "sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw=", + "requires": { + "tmpl": "1.0.4" + } }, "mime-db": { "version": "https://registry.npmjs.org/mime-db/-/mime-db-1.29.0.tgz", - "integrity": "sha1-SNJtI1WJZRcErFkWygYAGRQmaHg=" + "integrity": "sha1-SNJtI1WJZRcErFkWygYAGRQmaHg=", + "dev": true }, "mime-types": { "version": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.16.tgz", "integrity": "sha1-K4WKUuXs1RbbiXrCvodIeDBpjiM=", + "dev": true, "requires": { "mime-db": "https://registry.npmjs.org/mime-db/-/mime-db-1.29.0.tgz" } @@ -672,10 +761,6 @@ "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" }, - "mkdirp": { - "version": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.5.tgz", - "integrity": "sha1-3j5fiWHIjHh+4TaN+EmsRBPsqNc=" - }, "mocha": { "version": "3.5.0", "resolved": "https://registry.npmjs.org/mocha/-/mocha-3.5.0.tgz", @@ -715,19 +800,21 @@ } } }, + "moo-server": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/moo-server/-/moo-server-1.3.0.tgz", + "integrity": "sha1-XceVaVZaENbv7VQ5SR5p0jkuWPE=" + }, "ms": { "version": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true }, "native-promise-only": { "version": "0.8.1", "resolved": "https://registry.npmjs.org/native-promise-only/-/native-promise-only-0.8.1.tgz", "integrity": "sha1-IKMYwwy0X3H+et+/eyHJnBRy7xE=" }, - "negotiator": { - "version": "https://registry.npmjs.org/negotiator/-/negotiator-0.4.9.tgz", - "integrity": "sha1-kuRrbbU8fkIe1koryU8IvnYw3z8=" - }, "nise": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/nise/-/nise-1.0.1.tgz", @@ -755,25 +842,59 @@ } }, "nock": { - "version": "9.0.14", - "resolved": "https://registry.npmjs.org/nock/-/nock-9.0.14.tgz", - "integrity": "sha1-IhFVAlMXPOKYvNifyoJeg4E8pys=", + "version": "9.4.3", + "resolved": "https://registry.npmjs.org/nock/-/nock-9.4.3.tgz", + "integrity": "sha512-inJFXR3REBvHbZy6nVVwaoKbVTR8Y4Ag051Y/pd2pNPy7HDYtQkenfilBwxToNsW9p1RTeBUml4SPK/mWrFihA==", "requires": { - "chai": "3.5.0", - "debug": "https://registry.npmjs.org/debug/-/debug-2.6.7.tgz", + "chai": "4.1.2", + "debug": "3.1.0", "deep-equal": "1.0.1", - "json-stringify-safe": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "lodash": "4.17.4", + "json-stringify-safe": "5.0.1", + "lodash": "4.17.10", "mkdirp": "0.5.1", - "propagate": "0.4.0", - "qs": "https://registry.npmjs.org/qs/-/qs-6.4.0.tgz", - "semver": "5.4.1" + "propagate": "1.0.0", + "qs": "6.5.2", + "semver": "5.5.0" }, "dependencies": { + "chai": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.1.2.tgz", + "integrity": "sha1-D2RYS6ZC8PKs4oBiefTwbKI61zw=", + "requires": { + "assertion-error": "1.0.2", + "check-error": "1.0.2", + "deep-eql": "3.0.1", + "get-func-name": "2.0.0", + "pathval": "1.1.0", + "type-detect": "4.0.8" + } + }, + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "requires": { + "ms": "2.0.0" + } + }, + "deep-eql": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", + "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", + "requires": { + "type-detect": "4.0.8" + } + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" + }, "lodash": { - "version": "4.17.4", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", - "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=" + "version": "4.17.10", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", + "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==" }, "mkdirp": { "version": "0.5.1", @@ -782,24 +903,34 @@ "requires": { "minimist": "0.0.8" } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "propagate": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/propagate/-/propagate-1.0.0.tgz", + "integrity": "sha1-AMLa7t2iDofjeCs0Stuhzd1q1wk=" + }, + "qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" + }, + "semver": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", + "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==" + }, + "type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==" } } }, - "node-uuid": { - "version": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.8.tgz", - "integrity": "sha1-sEDrCSOWivq/jTL7HxfxFn/auQc=" - }, - "oauth-sign": { - "version": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.4.0.tgz", - "integrity": "sha1-8ilW8x6nFRqCHl8vsywRPK2Ln2k=" - }, - "on-finished": { - "version": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", - "requires": { - "ee-first": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz" - } - }, "once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -809,23 +940,16 @@ "wrappy": "1.0.2" } }, - "parseurl": { - "version": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.1.tgz", - "integrity": "sha1-yKuMkiO6NIiKpkopeyiFO+wY2lY=" - }, "path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", "dev": true }, - "path-to-regexp": { - "version": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.3.tgz", - "integrity": "sha1-IbmrgidCed4lsVbqCP0SylG4rss=" - }, - "pkginfo": { - "version": "https://registry.npmjs.org/pkginfo/-/pkginfo-0.3.1.tgz", - "integrity": "sha1-Wyn2qB9wcXFC4J52W76rl7T4HiE=" + "pathval": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.0.tgz", + "integrity": "sha1-uULm1L3mUwBe9rcTYd74cn0GReA=" }, "process-nextick-args": { "version": "1.0.7", @@ -833,83 +957,259 @@ "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", "dev": true }, - "propagate": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/propagate/-/propagate-0.4.0.tgz", - "integrity": "sha1-8/zKCm/gZzanulcpZgaWF8EwtIE=" - }, - "proxy-addr": { - "version": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-1.0.10.tgz", - "integrity": "sha1-DUCoL4Afw1VWfS7LZe/j8HfxIcU=", - "requires": { - "forwarded": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.0.tgz", - "ipaddr.js": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.0.5.tgz" - } + "promised-io": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/promised-io/-/promised-io-0.3.5.tgz", + "integrity": "sha1-StIXuzZYvKrplGsXqGaOzYUeE1Y=" }, - "punycode": { - "version": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" + "psl": { + "version": "1.1.28", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.28.tgz", + "integrity": "sha512-+AqO1Ae+N/4r7Rvchrdm432afjT9hqJRyBN3DQv9At0tPz4hIFSGKbq64fN9dVoCow4oggIIax5/iONx0r9hZw==" }, "qs": { "version": "https://registry.npmjs.org/qs/-/qs-6.4.0.tgz", - "integrity": "sha1-E+JtKK1rD/qpExLNO/cI7TUecjM=" - }, - "range-parser": { - "version": "https://registry.npmjs.org/range-parser/-/range-parser-1.0.3.tgz", - "integrity": "sha1-aHKCNTXGkuLCoBA4Jq/YLC4P8XU=" + "integrity": "sha1-E+JtKK1rD/qpExLNO/cI7TUecjM=", + "dev": true }, - "raw-body": { - "version": "https://registry.npmjs.org/raw-body/-/raw-body-2.2.0.tgz", - "integrity": "sha1-mUl2z2pQlqQRYoQEkvC9xdbn+5Y=", + "redis": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/redis/-/redis-2.8.0.tgz", + "integrity": "sha512-M1OkonEQwtRmZv4tEWF2VgpG0JWJ8Fv1PhlgT5+B+uNq2cA3Rt1Yt/ryoR+vQNOQcIEgdCdfH0jr3bDpihAw1A==", "requires": { - "bytes": "https://registry.npmjs.org/bytes/-/bytes-2.4.0.tgz", - "iconv-lite": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.15.tgz", - "unpipe": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz" + "double-ended-queue": "2.1.0-0", + "redis-commands": "1.3.5", + "redis-parser": "2.6.0" } }, - "readable-stream": { - "version": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", - "requires": { - "core-util-is": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "isarray": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "string_decoder": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz" - } + "redis-commands": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/redis-commands/-/redis-commands-1.3.5.tgz", + "integrity": "sha512-foGF8u6MXGFF++1TZVC6icGXuMYPftKXt1FBT2vrfU9ZATNtZJ8duRC5d1lEfE8hyVe3jhelHGB91oB7I6qLsA==" }, - "redis": { - "version": "https://registry.npmjs.org/redis/-/redis-0.12.1.tgz", - "integrity": "sha1-ZN92rQ/IrOuuvSoGReikj6xJGF4=" + "redis-parser": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/redis-parser/-/redis-parser-2.6.0.tgz", + "integrity": "sha1-Uu0J2srBCPGmMcB+m2mUHnoZUEs=" }, "request": { - "version": "https://registry.npmjs.org/request/-/request-2.47.0.tgz", + "version": "2.47.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.47.0.tgz", "integrity": "sha1-Cen9Gk/tZZOoBe+CArIPDF7LSF8=", "requires": { - "aws-sign2": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.5.0.tgz", - "bl": "https://registry.npmjs.org/bl/-/bl-0.9.5.tgz", - "caseless": "https://registry.npmjs.org/caseless/-/caseless-0.6.0.tgz", - "combined-stream": "https://registry.npmjs.org/combined-stream/-/combined-stream-0.0.7.tgz", - "forever-agent": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.5.2.tgz", - "form-data": "https://registry.npmjs.org/form-data/-/form-data-0.1.4.tgz", - "hawk": "https://registry.npmjs.org/hawk/-/hawk-1.1.1.tgz", - "http-signature": "https://registry.npmjs.org/http-signature/-/http-signature-0.10.1.tgz", - "json-stringify-safe": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "mime-types": "https://registry.npmjs.org/mime-types/-/mime-types-1.0.2.tgz", - "node-uuid": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.8.tgz", - "oauth-sign": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.4.0.tgz", - "qs": "https://registry.npmjs.org/qs/-/qs-2.3.3.tgz", - "stringstream": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", - "tough-cookie": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.2.tgz", - "tunnel-agent": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.3.tgz" + "aws-sign2": "0.5.0", + "bl": "0.9.5", + "caseless": "0.6.0", + "combined-stream": "0.0.7", + "forever-agent": "0.5.2", + "form-data": "0.1.4", + "hawk": "1.1.1", + "http-signature": "0.10.1", + "json-stringify-safe": "5.0.1", + "mime-types": "1.0.2", + "node-uuid": "1.4.8", + "oauth-sign": "0.4.0", + "qs": "2.3.3", + "stringstream": "0.0.6", + "tough-cookie": "2.4.3", + "tunnel-agent": "0.4.3" }, "dependencies": { + "asn1": { + "version": "0.1.11", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.1.11.tgz", + "integrity": "sha1-VZvhg3bQik7E2+gId9J4GGObLfc=" + }, + "assert-plus": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.1.5.tgz", + "integrity": "sha1-7nQAlBMALYTOxyGcasgRgS5yMWA=" + }, + "aws-sign2": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.5.0.tgz", + "integrity": "sha1-xXED96F/wDfwLXwuZLYC6iI/fWM=" + }, + "bl": { + "version": "0.9.5", + "resolved": "https://registry.npmjs.org/bl/-/bl-0.9.5.tgz", + "integrity": "sha1-wGt5evCF6gC8Unr8jvzxHeIjIFQ=", + "requires": { + "readable-stream": "1.0.34" + } + }, + "boom": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/boom/-/boom-0.4.2.tgz", + "integrity": "sha1-emNune1O/O+xnO9JR6PGffrukRs=", + "requires": { + "hoek": "0.9.1" + } + }, + "caseless": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.6.0.tgz", + "integrity": "sha1-gWfBq4OX+1u5X5bSjlqBxQ8kesQ=" + }, + "combined-stream": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-0.0.7.tgz", + "integrity": "sha1-ATfmV7qlp1QcV6w3rF/AfXO03B8=", + "requires": { + "delayed-stream": "0.0.5" + } + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "cryptiles": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-0.2.2.tgz", + "integrity": "sha1-7ZH/HxetE9N0gohZT4pIoNJvMlw=", + "requires": { + "boom": "0.4.2" + } + }, + "ctype": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/ctype/-/ctype-0.5.3.tgz", + "integrity": "sha1-gsGMJGH3QRTvFsE1IkrQuRRMoS8=" + }, + "delayed-stream": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-0.0.5.tgz", + "integrity": "sha1-1LH0OpPoKW3+AmlPRoC8N6MTxz8=" + }, + "forever-agent": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.5.2.tgz", + "integrity": "sha1-bQ4JxJIflKJ/Y9O0nF/v8epMUTA=" + }, + "form-data": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-0.1.4.tgz", + "integrity": "sha1-kavXiKupcCsaq/qLwBAxoqyeOxI=", + "requires": { + "async": "0.9.0", + "combined-stream": "0.0.7", + "mime": "1.2.11" + } + }, + "hawk": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/hawk/-/hawk-1.1.1.tgz", + "integrity": "sha1-h81JH5tG5OKurKM1QWdmiF0tHtk=", + "requires": { + "boom": "0.4.2", + "cryptiles": "0.2.2", + "hoek": "0.9.1", + "sntp": "0.2.4" + } + }, + "hoek": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/hoek/-/hoek-0.9.1.tgz", + "integrity": "sha1-PTIkYrrfB3Fup+uFuviAec3c5QU=" + }, + "http-signature": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-0.10.1.tgz", + "integrity": "sha1-T72sEyVZqoMjEh5UB3nAoBKyfmY=", + "requires": { + "asn1": "0.1.11", + "assert-plus": "0.1.5", + "ctype": "0.5.3" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" + }, + "mime": { + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.2.11.tgz", + "integrity": "sha1-WCA+7Ybjpe8XrtK32evUfwpg3RA=" + }, "mime-types": { - "version": "https://registry.npmjs.org/mime-types/-/mime-types-1.0.2.tgz", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-1.0.2.tgz", "integrity": "sha1-mVrhOSq4r/y/yyZB3QVOlDwNXc4=" }, + "node-uuid": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.8.tgz", + "integrity": "sha1-sEDrCSOWivq/jTL7HxfxFn/auQc=" + }, + "oauth-sign": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.4.0.tgz", + "integrity": "sha1-8ilW8x6nFRqCHl8vsywRPK2Ln2k=" + }, + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" + }, "qs": { - "version": "https://registry.npmjs.org/qs/-/qs-2.3.3.tgz", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-2.3.3.tgz", "integrity": "sha1-6eha2+ddoLvkyOBHaghikPhjtAQ=" + }, + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "0.0.1", + "string_decoder": "0.10.31" + } + }, + "sntp": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/sntp/-/sntp-0.2.4.tgz", + "integrity": "sha1-+4hfGLDzqtGJ+CSGJTa87ux1CQA=", + "requires": { + "hoek": "0.9.1" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" + }, + "stringstream": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.6.tgz", + "integrity": "sha512-87GEBAkegbBcweToUrdzf3eLhWNg06FJTebl4BVJz/JgWy8CvEr9dRtX5qWphiynMSQlxxi+QqN0z5T32SLlhA==" + }, + "tough-cookie": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", + "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", + "requires": { + "psl": "1.1.28", + "punycode": "1.4.1" + } + }, + "tunnel-agent": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.3.tgz", + "integrity": "sha1-Y3PbdpCf5XDgjXNYM2Xtgop07us=" } } }, @@ -919,142 +1219,75 @@ "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==", "dev": true }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, "samsam": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/samsam/-/samsam-1.2.1.tgz", "integrity": "sha1-7dOQk6MYQ3DLhZJDsr3yVefY6mc=" }, - "semver": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz", - "integrity": "sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg==" - }, - "send": { - "version": "https://registry.npmjs.org/send/-/send-0.10.1.tgz", - "integrity": "sha1-d0XFDscvEVEVmA6PsXmuwBkA4Io=", + "sha1": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/sha1/-/sha1-1.1.0.tgz", + "integrity": "sha1-j8IEe+OezrHcVOv+NaUEmxigBAs=", "requires": { - "debug": "https://registry.npmjs.org/debug/-/debug-2.1.3.tgz", - "depd": "https://registry.npmjs.org/depd/-/depd-1.0.1.tgz", - "destroy": "https://registry.npmjs.org/destroy/-/destroy-1.0.3.tgz", - "escape-html": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.1.tgz", - "etag": "https://registry.npmjs.org/etag/-/etag-1.5.1.tgz", - "fresh": "https://registry.npmjs.org/fresh/-/fresh-0.2.4.tgz", - "mime": "https://registry.npmjs.org/mime/-/mime-1.2.11.tgz", - "ms": "https://registry.npmjs.org/ms/-/ms-0.6.2.tgz", - "on-finished": "https://registry.npmjs.org/on-finished/-/on-finished-2.1.1.tgz", - "range-parser": "https://registry.npmjs.org/range-parser/-/range-parser-1.0.3.tgz" + "charenc": "0.0.2", + "crypt": "0.0.2" }, "dependencies": { - "debug": { - "version": "https://registry.npmjs.org/debug/-/debug-2.1.3.tgz", - "integrity": "sha1-zoqxte6PvuK/o7Yzyrk9NmtjQY4=", - "requires": { - "ms": "https://registry.npmjs.org/ms/-/ms-0.7.0.tgz" - }, - "dependencies": { - "ms": { - "version": "https://registry.npmjs.org/ms/-/ms-0.7.0.tgz", - "integrity": "sha1-hlvpTC5zl62KV9pqYzpuLzB5i4M=" - } - } - }, - "depd": { - "version": "https://registry.npmjs.org/depd/-/depd-1.0.1.tgz", - "integrity": "sha1-gK7GTJ1tl+ZcwqnKqTwKpqv3Oqo=" + "charenc": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz", + "integrity": "sha1-wKHS86cJLgN3S/qD8UwPxXkKhmc=" }, - "ee-first": { - "version": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.0.tgz", - "integrity": "sha1-ag18YiHkkP7v2S7D9EHJzozQl/Q=" - }, - "ms": { - "version": "https://registry.npmjs.org/ms/-/ms-0.6.2.tgz", - "integrity": "sha1-2JwhJMb9wTU9Zai3e/GqxLGTcIw=" - }, - "on-finished": { - "version": "https://registry.npmjs.org/on-finished/-/on-finished-2.1.1.tgz", - "integrity": "sha1-+CyhyeOk8yhrG5k4YQ5bhja9PLI=", - "requires": { - "ee-first": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.0.tgz" - } + "crypt": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz", + "integrity": "sha1-iNf/fsDfuG9xPch7u0LQRNPmxBs=" } } }, - "serve-static": { - "version": "https://registry.npmjs.org/serve-static/-/serve-static-1.7.2.tgz", - "integrity": "sha1-MWTOBtTmw0Wb3MnWAY+0+zXoSzk=", - "requires": { - "escape-html": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.1.tgz", - "parseurl": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.1.tgz", - "send": "https://registry.npmjs.org/send/-/send-0.10.1.tgz", - "utils-merge": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.0.tgz" - } - }, - "setprototypeof": { - "version": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.3.tgz", - "integrity": "sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ=" - }, - "sha1": { - "version": "https://registry.npmjs.org/sha1/-/sha1-1.1.0.tgz", - "integrity": "sha1-j8IEe+OezrHcVOv+NaUEmxigBAs=", - "requires": { - "charenc": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz", - "crypt": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz" - } - }, "sinon": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/sinon/-/sinon-3.2.1.tgz", - "integrity": "sha512-KY3OLOWpek/I4NGAMHetuutVgS2aRgMR5g5/1LSYvPJ3qo2BopIvk3esFztPxF40RWf/NNNJzdFPriSkXUVK3A==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/sinon/-/sinon-3.3.0.tgz", + "integrity": "sha512-/flfGfIxIRXSvZBHJzIf3iAyGYkmMQq6SQjA0cx9SOuVuq+4ZPPO4LJtH1Ce0Lznax1KSG1U6Dad85wIcSW19w==", "requires": { + "build": "0.1.4", "diff": "3.2.0", "formatio": "1.2.0", + "lodash.get": "4.4.2", "lolex": "2.1.2", "native-promise-only": "0.8.1", "nise": "1.0.1", "path-to-regexp": "1.7.0", "samsam": "1.2.1", "text-encoding": "0.6.4", - "type-detect": "4.0.3" + "type-detect": "4.0.8" }, "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, "path-to-regexp": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.7.0.tgz", "integrity": "sha1-Wf3g9DW62suhA6hOnTvGTpa5k30=", "requires": { - "isarray": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz" + "isarray": "0.0.1" } }, "type-detect": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.3.tgz", - "integrity": "sha1-Dj8mcLRAmbC0bChNE2p+9Jx0wuo=" + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==" } } }, - "sntp": { - "version": "https://registry.npmjs.org/sntp/-/sntp-0.2.4.tgz", - "integrity": "sha1-+4hfGLDzqtGJ+CSGJTa87ux1CQA=", - "requires": { - "hoek": "https://registry.npmjs.org/hoek/-/hoek-0.9.1.tgz" - } - }, - "stack-trace": { - "version": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", - "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=" - }, - "statuses": { - "version": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", - "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=" - }, - "string_decoder": { - "version": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" - }, - "stringstream": { - "version": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", - "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=" - }, "superagent": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/superagent/-/superagent-3.6.0.tgz", @@ -1175,33 +1408,20 @@ "resolved": "https://registry.npmjs.org/text-encoding/-/text-encoding-0.6.4.tgz", "integrity": "sha1-45mpgiV6J22uQou5KEXLcb3CbRk=" }, - "tough-cookie": { - "version": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.2.tgz", - "integrity": "sha1-8IH3bkyFcg5sN6X6ztc3FQ2EByo=", - "requires": { - "punycode": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz" - } - }, - "tunnel-agent": { - "version": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.3.tgz", - "integrity": "sha1-Y3PbdpCf5XDgjXNYM2Xtgop07us=" - }, - "type-detect": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-1.0.0.tgz", - "integrity": "sha1-diIXzAbbJY7EiQihKY6LlRIejqI=" + "timespan": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/timespan/-/timespan-2.3.0.tgz", + "integrity": "sha1-SQLOBAvRPYRcj1myfp1ZutbzmSk=" }, - "type-is": { - "version": "https://registry.npmjs.org/type-is/-/type-is-1.6.15.tgz", - "integrity": "sha1-yrEPtJCeRByChC6v4a1kbIGARBA=", - "requires": { - "media-typer": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "mime-types": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.16.tgz" - } + "tmpl": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.4.tgz", + "integrity": "sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE=" }, - "unpipe": { - "version": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" + "uglify-js": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-1.3.5.tgz", + "integrity": "sha1-S1v/+Rhu/7qoiOTJ6UvZ/EyUkp0=" }, "util-deprecate": { "version": "1.0.2", @@ -1209,30 +1429,62 @@ "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", "dev": true }, - "utils-merge": { - "version": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.0.tgz", - "integrity": "sha1-ApT7kiu5N1FTVBxPcJYjHyh8ivg=" - }, - "vary": { - "version": "https://registry.npmjs.org/vary/-/vary-1.0.1.tgz", - "integrity": "sha1-meSYFWaihhGN+yuBc1ffeZM3bRA=" + "walker": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.7.tgz", + "integrity": "sha1-L3+bj9ENZ3JisYqITijRlhjgKPs=", + "requires": { + "makeerror": "1.0.11" + } }, "winston": { - "version": "https://registry.npmjs.org/winston/-/winston-0.8.3.tgz", + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/winston/-/winston-0.8.3.tgz", "integrity": "sha1-ZLar9M0Brcrv1QCTk7HY6L7BnbA=", "requires": { - "async": "https://registry.npmjs.org/async/-/async-0.2.10.tgz", - "colors": "https://registry.npmjs.org/colors/-/colors-0.6.2.tgz", - "cycle": "https://registry.npmjs.org/cycle/-/cycle-1.0.3.tgz", - "eyes": "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz", - "isstream": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "pkginfo": "https://registry.npmjs.org/pkginfo/-/pkginfo-0.3.1.tgz", - "stack-trace": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz" + "async": "0.2.10", + "colors": "0.6.2", + "cycle": "1.0.3", + "eyes": "0.1.8", + "isstream": "0.1.2", + "pkginfo": "0.3.1", + "stack-trace": "0.0.10" }, "dependencies": { "async": { - "version": "https://registry.npmjs.org/async/-/async-0.2.10.tgz", + "version": "0.2.10", + "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz", "integrity": "sha1-trvgsGdLnXGXCMo43owjfLUmw9E=" + }, + "colors": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/colors/-/colors-0.6.2.tgz", + "integrity": "sha1-JCP+ZnisDF2uiFLl0OW+CMmXq8w=" + }, + "cycle": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/cycle/-/cycle-1.0.3.tgz", + "integrity": "sha1-IegLK+hYD5i0aPN5QwZisEbDStI=" + }, + "eyes": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz", + "integrity": "sha1-Ys8SAjTGg3hdkCNIqADvPgzCC8A=" + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" + }, + "pkginfo": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/pkginfo/-/pkginfo-0.3.1.tgz", + "integrity": "sha1-Wyn2qB9wcXFC4J52W76rl7T4HiE=" + }, + "stack-trace": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", + "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=" } } }, @@ -1242,6 +1494,11 @@ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", "dev": true }, + "wrench": { + "version": "1.3.9", + "resolved": "https://registry.npmjs.org/wrench/-/wrench-1.3.9.tgz", + "integrity": "sha1-bxPsNRRTF+spLKX2UxORskQRFBE=" + }, "xmldom": { "version": "0.1.27", "resolved": "https://registry.npmjs.org/xmldom/-/xmldom-0.1.27.tgz", diff --git a/bbb-webhooks/package.json b/bbb-webhooks/package.json index cbe8a8dc77..b6b938e669 100755 --- a/bbb-webhooks/package.json +++ b/bbb-webhooks/package.json @@ -10,11 +10,10 @@ "dependencies": { "async": "0.9.0", "body-parser": "^1.9.2", - "coffee-script": "1.8.0", "express": "4.10.2", "lodash": "2.4.1", "nock": "^9.0.14", - "redis": "0.12.1", + "redis": "^2.8.0", "request": "2.47.0", "sha1": "1.1.0", "sinon": "^3.2.1", diff --git a/bbb-webhooks/test/test.js b/bbb-webhooks/test/test.js index 51b2d0ab20..460ce5af88 100644 --- a/bbb-webhooks/test/test.js +++ b/bbb-webhooks/test/test.js @@ -9,6 +9,8 @@ const Helpers = require('./helpers.js') const sinon = require('sinon'); const winston = require('winston'); +const sharedSecret = process.env.SHARED_SECRET || sharedSecrett; + // Block winston from logging Logger.remove(winston.transports.Console); describe('bbb-webhooks tests', () => { @@ -38,7 +40,7 @@ describe('bbb-webhooks tests', () => { describe('GET /hooks/list permanent', () => { it('should list permanent hook', (done) => { - let getUrl = utils.checksumAPI(Helpers.url + Helpers.listUrl, config.bbb.sharedSecret); + let getUrl = utils.checksumAPI(Helpers.url + Helpers.listUrl, sharedSecrett); getUrl = Helpers.listUrl + '?checksum=' + getUrl request(Helpers.url) @@ -62,7 +64,7 @@ describe('bbb-webhooks tests', () => { Hook.removeSubscription(hooks[hooks.length-1].id, () => { done(); }); }); it('should create a hook', (done) => { - let getUrl = utils.checksumAPI(Helpers.url + Helpers.createUrl, config.bbb.sharedSecret); + let getUrl = utils.checksumAPI(Helpers.url + Helpers.createUrl, sharedSecrett); getUrl = Helpers.createUrl + '&checksum=' + getUrl request(Helpers.url) @@ -87,7 +89,7 @@ describe('bbb-webhooks tests', () => { it('should destroy a hook', (done) => { const hooks = Hook.allGlobalSync(); const hook = hooks[hooks.length-1].id; - let getUrl = utils.checksumAPI(Helpers.url + Helpers.destroyUrl(hook), config.bbb.sharedSecret); + let getUrl = utils.checksumAPI(Helpers.url + Helpers.destroyUrl(hook), sharedSecrett); getUrl = Helpers.destroyUrl(hook) + '&checksum=' + getUrl request(Helpers.url) @@ -103,7 +105,7 @@ describe('bbb-webhooks tests', () => { describe('GET /hooks/destroy permanent hook', () => { it('should not destroy the permanent hook', (done) => { - let getUrl = utils.checksumAPI(Helpers.url + Helpers.destroyPermanent, config.bbb.sharedSecret); + let getUrl = utils.checksumAPI(Helpers.url + Helpers.destroyPermanent, sharedSecrett); getUrl = Helpers.destroyPermanent + '&checksum=' + getUrl request(Helpers.url) .get(getUrl) @@ -126,7 +128,7 @@ describe('bbb-webhooks tests', () => { Hook.removeSubscription(hooks[hooks.length-1].id, () => { done(); }); }); it('should create a hook with getRaw=true', (done) => { - let getUrl = utils.checksumAPI(Helpers.url + Helpers.createUrl + Helpers.createRaw, config.bbb.sharedSecret); + let getUrl = utils.checksumAPI(Helpers.url + Helpers.createUrl + Helpers.createRaw, sharedSecrett); getUrl = Helpers.createUrl + '&checksum=' + getUrl + Helpers.createRaw request(Helpers.url) diff --git a/bbb-webhooks/web_server.js b/bbb-webhooks/web_server.js index e0f77f0b40..be5a005783 100644 --- a/bbb-webhooks/web_server.js +++ b/bbb-webhooks/web_server.js @@ -144,8 +144,9 @@ module.exports = class WebServer { _validateChecksum(req, res, next) { const urlObj = url.parse(req.url, true); const checksum = urlObj.query["checksum"]; + const sharedSecret = process.env.SHARED_SECRET || config.bbb.sharedSecret; - if (checksum === Utils.checksumAPI(req.url, config.bbb.sharedSecret)) { + if (checksum === Utils.checksumAPI(req.url, sharedSecret)) { next(); } else { Logger.info("[WebServer] checksum check failed, sending a checksumError response"); diff --git a/bigbluebutton-html5/.dockerignore b/bigbluebutton-html5/.dockerignore index a1bdef1424..bf9b07fdc2 100644 --- a/bigbluebutton-html5/.dockerignore +++ b/bigbluebutton-html5/.dockerignore @@ -1,3 +1,2 @@ -private/config/settings-production.json Dockerfile Dockerfile.dev diff --git a/bigbluebutton-html5/Dockerfile b/bigbluebutton-html5/Dockerfile index 94d070ac51..8e4b24cb17 100644 --- a/bigbluebutton-html5/Dockerfile +++ b/bigbluebutton-html5/Dockerfile @@ -1,13 +1,17 @@ FROM node:8 -COPY . /source - RUN set -x \ && curl -sL https://install.meteor.com | sed s/--progress-bar/-sL/g | /bin/sh \ - && useradd -m -G users -s /bin/bash meteor \ - && chown -R meteor:meteor /source + && useradd -m -G users -s /bin/bash meteor -RUN mkdir /app \ +RUN apt-get update && apt-get -y install jq + +COPY . /source + +RUN cd /source \ + && mv docker-entrypoint.sh /usr/local/bin/ \ + && chown -R meteor:meteor . \ + && mkdir /app \ && chown -R meteor:meteor /app USER meteor @@ -26,9 +30,9 @@ WORKDIR /app/bundle ENV MONGO_URL=mongodb://mongo:27017/html5client \ PORT=3000 \ - ROOT_URL=http://localhost:3000 + ROOT_URL=http://localhost:3000 \ + METEOR_SETTINGS_MODIFIER=. EXPOSE 3000 -CMD ["node", "main.js"] - +CMD ["docker-entrypoint.sh"] diff --git a/bigbluebutton-html5/docker-entrypoint.sh b/bigbluebutton-html5/docker-entrypoint.sh new file mode 100755 index 0000000000..576313a793 --- /dev/null +++ b/bigbluebutton-html5/docker-entrypoint.sh @@ -0,0 +1,5 @@ +#!/bin/bash -e + +export METEOR_SETTINGS=` jq "${METEOR_SETTINGS_MODIFIER}" /source/private/config/settings-production.json ` + +node main.js diff --git a/bigbluebutton-web/Dockerfile b/bigbluebutton-web/Dockerfile index 74ec97ba02..a980f59723 100644 --- a/bigbluebutton-web/Dockerfile +++ b/bigbluebutton-web/Dockerfile @@ -30,10 +30,19 @@ FROM tomcat:7-jre8 WORKDIR $CATALINA_HOME +ENV DOCKERIZE_VERSION v0.6.1 +RUN wget https://github.com/jwilder/dockerize/releases/download/$DOCKERIZE_VERSION/dockerize-linux-amd64-$DOCKERIZE_VERSION.tar.gz \ + && tar -C /usr/local/bin -xzvf dockerize-linux-amd64-$DOCKERIZE_VERSION.tar.gz \ + && rm dockerize-linux-amd64-$DOCKERIZE_VERSION.tar.gz + +ENV DEBIAN_FRONTEND noninteractive RUN apt-get update \ - && apt-get -y install imagemagick xpdf-utils libreoffice ttf-liberation psmisc fonts-crosextra-carlito fonts-crosextra-caladea unzip + && apt-get -y install imagemagick xpdf-utils netcat libreoffice ttf-liberation fonts-crosextra-carlito fonts-crosextra-caladea unzip procps \ + && wget http://ftp.us.debian.org/debian/pool/main/libj/libjpeg8/libjpeg8_8d-1+deb7u1_amd64.deb \ + && dpkg -i libjpeg8*.deb \ + && rm libjpeg8*.deb -RUN echo "deb http://ubuntu.bigbluebutton.org/xenial-200 bigbluebutton-xenial main " | tee /etc/apt/sources.list.d/bigbluebutton.list \ +RUN echo "deb http://ubuntu.bigbluebutton.org/xenial-200-dev bigbluebutton-xenial main " | tee /etc/apt/sources.list.d/bigbluebutton.list \ && wget http://ubuntu.bigbluebutton.org/repo/bigbluebutton.asc -O- | apt-key add - \ && apt-get update \ && apt-get -y install bbb-swftools @@ -46,7 +55,10 @@ COPY --from=builder /source/target/bigbluebutton-0.9.0.war webapps/bigbluebutton RUN unzip -q webapps/bigbluebutton.war -d webapps/bigbluebutton \ && rm webapps/bigbluebutton.war -COPY entrypoint.sh . +COPY turn-stun-servers.xml.tmpl turn-stun-servers.xml.tmpl -CMD ["./entrypoint.sh"] +COPY docker-entrypoint.sh /usr/local/bin/ +CMD [ "dockerize", \ + "-template", "turn-stun-servers.xml.tmpl:webapps/bigbluebutton/WEB-INF/spring/turn-stun-servers.xml", \ + "docker-entrypoint.sh" ] diff --git a/bigbluebutton-web/entrypoint.sh b/bigbluebutton-web/docker-entrypoint.sh similarity index 63% rename from bigbluebutton-web/entrypoint.sh rename to bigbluebutton-web/docker-entrypoint.sh index 02092041cd..2c57dc634c 100755 --- a/bigbluebutton-web/entrypoint.sh +++ b/bigbluebutton-web/docker-entrypoint.sh @@ -11,8 +11,7 @@ mkdir -p /var/bigbluebutton/published mkdir -p /var/bigbluebutton/deleted mkdir -p /var/bigbluebutton/unpublished -export JAVA_OPTS="$JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -DsecuritySalt=$SHARED_SECRET -Dredis.host=redis -Dbigbluebutton.web.serverURL=https://$SERVER_DOMAIN" -sed -i "s|^securerandom\.source=.*|securerandom.source=file:/dev/./urandom|g" $JAVA_HOME/lib/security/java.security +export JAVA_OPTS="${JAVA_OPTS} -Djava.security.egd=file:/dev/./urandom -DsecuritySalt=${SHARED_SECRET} -Dredis.host=redis -Dbigbluebutton.web.serverURL=https://${SERVER_DOMAIN} -DattendeesJoinViaHTML5Client=true -DmoderatorsJoinViaHTML5Client=true -DsvgImagesRequired=true" +sed -i "s|^securerandom\.source=.*|securerandom.source=file:/dev/urandom|g" ${JAVA_HOME}/lib/security/java.security catalina.sh run - diff --git a/bigbluebutton-web/grails-app/conf/Config.groovy b/bigbluebutton-web/grails-app/conf/Config.groovy index cd9d36a9d3..d03d3eb93f 100755 --- a/bigbluebutton-web/grails-app/conf/Config.groovy +++ b/bigbluebutton-web/grails-app/conf/Config.groovy @@ -130,5 +130,7 @@ log4j = { 'org.hibernate', 'net.sf.ehcache.hibernate' - debug 'org.bigbluebutton' + debug 'org.bigbluebutton', + 'grails.app.controllers', + 'grails.app.services', } diff --git a/bigbluebutton-web/turn-stun-servers.xml.tmpl b/bigbluebutton-web/turn-stun-servers.xml.tmpl new file mode 100644 index 0000000000..238ca04544 --- /dev/null +++ b/bigbluebutton-web/turn-stun-servers.xml.tmpl @@ -0,0 +1,53 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + +BigBlueButton open source conferencing system - http://www.bigbluebutton.org/ + +Copyright (c) 2018 BigBlueButton Inc. and by respective authors (see below). + +This program is free software; you can redistribute it and/or modify it under the +terms of the GNU Lesser General Public License as published by the Free Software +Foundation; either version 3.0 of the License, or (at your option) any later +version. + +BigBlueButton is distributed in the hope that it will be useful, but WITHOUT ANY +WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A +PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License along +with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. + +--> +<beans xmlns="http://www.springframework.org/schema/beans" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://www.springframework.org/schema/beans + http://www.springframework.org/schema/beans/spring-beans-2.5.xsd + "> + + <bean id="turn1" class="org.bigbluebutton.web.services.turn.TurnServer"> + <constructor-arg index="0" value="{{ .Env.TURN_SECRET }}"/> + <constructor-arg index="1" value="turn:{{ .Env.SERVER_DOMAIN }}:3478"/> + <constructor-arg index="2" value="86400"/> + </bean> + + <bean id="turn2" class="org.bigbluebutton.web.services.turn.TurnServer"> + <constructor-arg index="0" value="{{ .Env.TURN_SECRET }}"/> + <constructor-arg index="1" value="turn:{{ .Env.SERVER_DOMAIN }}:5349?transport=tcp"/> + <constructor-arg index="2" value="86400"/> + </bean> + + <bean id="stunTurnService" class="org.bigbluebutton.web.services.turn.StunTurnService"> + <property name="stunServers"> + <set/> + </property> + <property name="turnServers"> + <set> + <ref bean="turn1" /> + <ref bean="turn2" /> + </set> + </property> + <property name="remoteIceCandidates"> + <set/> + </property> + </bean> +</beans> diff --git a/freeswitch.dockerfile b/freeswitch.dockerfile deleted file mode 100644 index 98c26a9080..0000000000 --- a/freeswitch.dockerfile +++ /dev/null @@ -1,21 +0,0 @@ -FROM ubuntu:16.04 - -ENV DEBIAN_FRONTEND noninteractive - -RUN apt-get update \ - && apt-get -y install wget libedit-dev - -RUN echo "deb http://ubuntu.bigbluebutton.org/xenial-200 bigbluebutton-xenial main " | tee /etc/apt/sources.list.d/bigbluebutton.list \ - && wget http://ubuntu.bigbluebutton.org/repo/bigbluebutton.asc -O- | apt-key add - \ - && apt-get update \ - && apt-get -y install bbb-freeswitch-core - -RUN apt-get -y install xmlstarlet \ - && xmlstarlet edit --inplace --update "//param[@name='listen-ip']/@value" --value "0.0.0.0" /opt/freeswitch/etc/freeswitch/autoload_configs/event_socket.conf.xml - -EXPOSE 8021 -EXPOSE 5060 -EXPOSE 5066 -EXPOSE 7443 - -CMD [ "/opt/freeswitch/bin/freeswitch" ] diff --git a/labs/bbb-webrtc-sfu/Dockerfile b/labs/bbb-webrtc-sfu/Dockerfile index 54ce0eca12..b0cfd9d4f1 100644 --- a/labs/bbb-webrtc-sfu/Dockerfile +++ b/labs/bbb-webrtc-sfu/Dockerfile @@ -6,12 +6,10 @@ RUN cp /source/config/default.example.yml /source/config/production.yml ENV NODE_ENV production RUN cd /source \ + && mv docker-entrypoint.sh /usr/local/bin/ \ && npm install \ && npm cache clear --force WORKDIR /source -EXPOSE 3008 - -CMD [ "./bbb-webrtc-sfu-run.sh" ] - +CMD [ "docker-entrypoint.sh" ] diff --git a/labs/bbb-webrtc-sfu/config/custom-environment-variables.yml b/labs/bbb-webrtc-sfu/config/custom-environment-variables.yml index 081fc75102..322efff11b 100644 --- a/labs/bbb-webrtc-sfu/config/custom-environment-variables.yml +++ b/labs/bbb-webrtc-sfu/config/custom-environment-variables.yml @@ -1,5 +1,3 @@ kurentoUrl: KURENTO_URL kurentoIp: KURENTO_IP -localIpAddress: TRANSCODE_IP redisHost: REDIS_HOST - diff --git a/labs/bbb-webrtc-sfu/bbb-webrtc-sfu-run.sh b/labs/bbb-webrtc-sfu/docker-entrypoint.sh similarity index 62% rename from labs/bbb-webrtc-sfu/bbb-webrtc-sfu-run.sh rename to labs/bbb-webrtc-sfu/docker-entrypoint.sh index 45c1c36112..5f513af89e 100755 --- a/labs/bbb-webrtc-sfu/bbb-webrtc-sfu-run.sh +++ b/labs/bbb-webrtc-sfu/docker-entrypoint.sh @@ -3,6 +3,5 @@ CONTAINER_IP=$(hostname -I | awk '{print $1}') sed -i "s|^\(localIpAddress\):.*|\1: \"$CONTAINER_IP\"|g" config/production.yml -sed -i "s|^\(kurentoIp\):.*|\1: \"$KURENTO_IP\"|g" config/production.yml -node server.js +npm start diff --git a/labs/docker/coturn/Dockerfile b/labs/docker/coturn/Dockerfile new file mode 100644 index 0000000000..aa4912ae02 --- /dev/null +++ b/labs/docker/coturn/Dockerfile @@ -0,0 +1,14 @@ +FROM ubuntu:16.04 + +RUN apt-get update && apt-get install -y coturn wget + +ENV DOCKERIZE_VERSION v0.6.1 +RUN wget https://github.com/jwilder/dockerize/releases/download/$DOCKERIZE_VERSION/dockerize-linux-amd64-$DOCKERIZE_VERSION.tar.gz \ + && tar -C /usr/local/bin -xzvf dockerize-linux-amd64-$DOCKERIZE_VERSION.tar.gz \ + && rm dockerize-linux-amd64-$DOCKERIZE_VERSION.tar.gz + +COPY ./turnserver.conf.tmpl /etc/turnserver.conf.tmpl + +CMD [ "dockerize", \ + "-template", "/etc/turnserver.conf.tmpl:/etc/turnserver.conf", \ + "turnserver", "--syslog" ] diff --git a/labs/docker/coturn/turnserver.conf.tmpl b/labs/docker/coturn/turnserver.conf.tmpl new file mode 100644 index 0000000000..209455fa3f --- /dev/null +++ b/labs/docker/coturn/turnserver.conf.tmpl @@ -0,0 +1,21 @@ +listening-port={{ .Env.PORT }} +tls-listening-port={{ .Env.PORT_TLS}} +min-port=49152 +max-port=65535 +fingerprint +lt-cred-mech +realm={{ .Env.SERVER_DOMAIN }} +cert={{ .Env.SSL_CERT_PATH }} +pkey={{ .Env.SSL_KEY_PATH }} +cipher-list="ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:RSA+AESGCM:RSA+AES:!aNULL:!MD5:!DSS:!AES256" +dh-file={{ .Env.SSL_DHPARAM_PATH }} +no-tlsv1 +no-tlsv1_1 +external-ip={{ .Env.EXTERNAL_IP }} + +{{ if isTrue .Env.ENABLE_REST_API }} +use-auth-secret +static-auth-secret={{ .Env.SECRET }} +{{ else }} +user={{ .Env.LT_USER }}:{{ .Env.LT_SECRET }} +{{ end }} diff --git a/labs/docker/docker-compose.yml b/labs/docker/docker-compose.yml index 1dbfdfcef9..875777117c 100644 --- a/labs/docker/docker-compose.yml +++ b/labs/docker/docker-compose.yml @@ -1,28 +1,32 @@ version: '2' -services: -# nginx-dhp: -# image: nginx-dhp -# volumes: -# - config-nginx-dhp:/data - -# nginx-ssl: -# image: certbot/certbot -# ports: -# - 80:80 -# volumes: -# - config-nginx-ssl:/etc/letsencrypt -# command: certonly --non-interactive --register-unsafely-without-email --agree-tos --expand --domain ${SERVER_DOMAIN} --standalone +# export SERVER_DOMAIN=felipe.dev.mconf.com +# export EXTERNAL_IP=`dig +short $SERVER_DOMAIN` +# export SHARED_SECRET=`openssl rand -hex 16` +# export COTURN_REST_SECRET=`openssl rand -hex 16` +# export SCREENSHARE_EXTENSION_LINK=https://chrome.google.com/webstore/detail/mconf-screenshare/mbfngdphjegmlbfobcblikeefpidfncb +# export SCREENSHARE_EXTENSION_KEY=mbfngdphjegmlbfobcblikeefpidfncb -# mongo: -# image: mongo:3.4 -# restart: unless-stopped +services: + mongo: + image: mongo:3.4 + restart: unless-stopped redis: image: redis restart: unless-stopped - volumes: - - recordings-redis:/data + + bbb-html5: + image: bbb-html5 + restart: unless-stopped + links: + - mongo + - redis + environment: + MONGO_URL: mongodb://mongo/bbbhtml5 + METEOR_SETTINGS_MODIFIER: ".public.kurento.wsUrl = \"wss://${SERVER_DOMAIN}/bbb-webrtc-sfu\" | .public.kurento.enableVideo = true | .public.kurento.enableScreensharing = true | .public.kurento.chromeDefaultExtensionKey = \"${SCREENSHARE_EXTENSION_KEY}\" | .public.kurento.chromeDefaultExtensionLink = \"${SCREENSHARE_EXTENSION_LINK}\"" + REDIS_HOST: redis + ROOT_URL: http://127.0.0.1/html5client bbb-webhooks: image: bbb-webhooks @@ -31,35 +35,80 @@ services: - redis environment: REDIS_HOST: redis + SHARED_SECRET: ${SHARED_SECRET} -# coturn: -# image: kurento/coturn -# restart: unless-stopped -# network_mode: host + bbb-freeswitch: + image: bbb-freeswitch + restart: unless-stopped + links: + - coturn -# kurento: -# image: kurento -# restart: unless-stopped -# network_mode: host + bbb-webrtc-sfu: + image: bbb-webrtc-sfu + restart: unless-stopped + links: + - redis + - kurento + environment: + KURENTO_IP: ${EXTERNAL_IP} + KURENTO_URL: ws://kurento:8888/kurento + REDIS_HOST: redis -# bbb-apps-akka: -# image: bbb-apps-akka -# restart: unless-stopped -# links: -# - redis -# environment: -# JAVA_OPTS: -Dredis.host=redis + coturn: + image: coturn + restart: unless-stopped + volumes: + - ssl-conf:/etc/nginx/ssl + environment: + SERVER_DOMAIN: ${SERVER_DOMAIN} + SSL_CERT_PATH: /etc/nginx/ssl/live/${SERVER_DOMAIN}/fullchain.pem + SSL_KEY_PATH: /etc/nginx/ssl/live/${SERVER_DOMAIN}/privkey.pem + SSL_DHPARAM_PATH: /etc/nginx/ssl/dhp-2048.pem + SECRET: ${COTURN_REST_SECRET} + EXTERNAL_IP: ${EXTERNAL_IP} + ENABLE_REST_API: 1 + PORT: 3478 + PORT_TLS: 5349 + ports: + - 3478:3478/udp + - 3478:3478/tcp + - 5349:5349/tcp -# bbb-web: -# image: bbb-web -# restart: unless-stopped -# links: -# - redis -# volumes: -# - recordings-storage:/var/bigbluebutton -# environment: -# SERVER_DOMAIN: ${SERVER_DOMAIN} -# SHARED_SECRET: ${SHARED_SECRET} + kurento: + image: kurento + restart: unless-stopped + environment: + KMS_STUN_IP: ${EXTERNAL_IP} + KMS_STUN_PORT: 3478 + + bbb-apps-akka: + image: bbb-apps-akka + restart: unless-stopped + links: + - redis + environment: + JAVA_OPTS: -Dredis.host=redis + + bbb-fsesl-akka: + image: bbb-fsesl-akka + restart: unless-stopped + links: + - bbb-freeswitch + - redis + environment: + JAVA_OPTS: -Dredis.host=redis -Dfreeswitch.esl.host=bbb-freeswitch + + bbb-web: + image: bbb-web + restart: unless-stopped + links: + - redis + volumes: + - bigbluebutton:/var/bigbluebutton + environment: + SERVER_DOMAIN: ${SERVER_DOMAIN} + SHARED_SECRET: ${SHARED_SECRET} + TURN_SECRET: ${COTURN_REST_SECRET} # greenlight-env: # image: bigbluebutton/greenlight @@ -67,11 +116,11 @@ services: # - config-greenlight:/data # command: rake secret > /data/env - greenlight: - image: bigbluebutton/greenlight - restart: unless-stopped - volumes: - - db-greenlight:/usr/src/app/db/production +# greenlight: +# image: bigbluebutton/greenlight +# restart: unless-stopped +# volumes: +# - db-greenlight:/usr/src/app/db/production nginx: image: nginx @@ -81,22 +130,23 @@ services: - bbb-web - bbb-html5 - bbb-webrtc-sfu - - greenlight + - bbb-freeswitch +# - greenlight ports: - 80:80 - 443:443 volumes: - - config-nginx-ssl:/etc/letsencrypt - - config-nginx-dhp/dhp-2048.pem:/etc/nginx/ssl/dhp-2048.pem - - - -docker run --rm --name nginx --link bbb-webhooks --link bbb-web --link bbb-html5 --link bbb-webrtc-sfu --link greenlight -p 80:80 -p 443:443 -v ~/certs:/etc/letsencrypt -v $(pwd)/dhp-2048.pem:/etc/nginx/ssl/dhp-2048.pem -v $(pwd)/nginx.conf:/etc/nginx/nginx.conf -v $(pwd)/bigbluebutton-client/resources/config.xml.template:/var/www/bigbluebutton/client/conf/config.xml -d nginx + - ssl-conf:/etc/nginx/ssl + - static:/var/www/bigbluebutton-default + environment: + SERVER_DOMAIN: ${SERVER_DOMAIN} + SSL_CERT_PATH: /etc/nginx/ssl/live/${SERVER_DOMAIN}/fullchain.pem + SSL_KEY_PATH: /etc/nginx/ssl/live/${SERVER_DOMAIN}/privkey.pem + SSL_DHPARAM_PATH: /etc/nginx/ssl/dhp-2048.pem volumes: - config-nginx-dhp: - config-nginx-ssl: - config-greenlight: - recordings-redis: - recordings-storage: - db-greenlight: + ssl-conf: + driver: local + static: + driver: local + bigbluebutton: diff --git a/labs/docker/freeswitch/Dockerfile b/labs/docker/freeswitch/Dockerfile new file mode 100644 index 0000000000..8e0636bea9 --- /dev/null +++ b/labs/docker/freeswitch/Dockerfile @@ -0,0 +1,21 @@ +FROM ubuntu:16.04 + +ENV DEBIAN_FRONTEND noninteractive + +RUN apt-get update \ + && apt-get -y install wget libedit-dev xmlstarlet + +RUN echo "deb http://ubuntu.bigbluebutton.org/xenial-200-dev bigbluebutton-xenial main " | tee /etc/apt/sources.list.d/bigbluebutton.list \ + && wget http://ubuntu.bigbluebutton.org/repo/bigbluebutton.asc -O- | apt-key add - \ + && apt-get update \ + && apt-get -y install bbb-freeswitch-core + +EXPOSE 8021 +EXPOSE 5060 +EXPOSE 5066 +EXPOSE 7443 + +COPY docker-entrypoint.sh /usr/local/bin/ +COPY event_socket_conf.xml /opt/freeswitch/conf/autoload_configs/event_socket.conf.xml + +CMD [ "docker-entrypoint.sh" ] diff --git a/labs/docker/freeswitch/docker-entrypoint.sh b/labs/docker/freeswitch/docker-entrypoint.sh new file mode 100755 index 0000000000..68472535f6 --- /dev/null +++ b/labs/docker/freeswitch/docker-entrypoint.sh @@ -0,0 +1,11 @@ +#!/bin/bash -xe + +IP=$(hostname -I | cut -d' ' -f1) + +xmlstarlet edit --inplace --update '//X-PRE-PROCESS[@cmd="set" and starts-with(@data, "external_rtp_ip=")]/@data' --value "stun:coturn" /opt/freeswitch/conf/vars.xml +xmlstarlet edit --inplace --update '//X-PRE-PROCESS[@cmd="set" and starts-with(@data, "external_sip_ip=")]/@data' --value "stun:coturn" /opt/freeswitch/conf/vars.xml +xmlstarlet edit --inplace --update '//X-PRE-PROCESS[@cmd="set" and starts-with(@data, "local_ip_v4=")]/@data' --value "${IP}" /opt/freeswitch/conf/vars.xml +xmlstarlet edit --inplace --update '//param[@name="ws-binding"]/@value' --value ":7443" /opt/freeswitch/conf/sip_profiles/external.xml +xmlstarlet edit --inplace --update '//param[@name="ws-binding"]/@name' --value "wss-binding" /opt/freeswitch/conf/sip_profiles/external.xml + +/opt/freeswitch/bin/freeswitch diff --git a/labs/docker/freeswitch/event_socket_conf.xml b/labs/docker/freeswitch/event_socket_conf.xml new file mode 100644 index 0000000000..c10b16fb1b --- /dev/null +++ b/labs/docker/freeswitch/event_socket_conf.xml @@ -0,0 +1,10 @@ +<?xml version="1.0"?> +<configuration name="event_socket.conf" description="Socket Client"> + <settings> + <param name="nat-map" value="false"/> + <param name="listen-ip" value="0.0.0.0"/> + <param name="listen-port" value="8021"/> + <param name="password" value="ClueCon"/> + <param name="apply-inbound-acl" value="localnet.auto"/> + </settings> +</configuration> diff --git a/labs/docker/kurento/Dockerfile b/labs/docker/kurento/Dockerfile index 635c347fd2..528aa57eb3 100644 --- a/labs/docker/kurento/Dockerfile +++ b/labs/docker/kurento/Dockerfile @@ -17,12 +17,11 @@ RUN apt-get update \ EXPOSE 8888 -COPY ./entrypoint.sh /entrypoint.sh +COPY ./docker-entrypoint.sh /usr/local/bin/ COPY ./healthchecker.sh /healthchecker.sh HEALTHCHECK --start-period=15s --interval=30s --timeout=3s --retries=1 CMD /healthchecker.sh ENV GST_DEBUG=Kurento*:5 -ENTRYPOINT ["/entrypoint.sh"] - +ENTRYPOINT ["docker-entrypoint.sh"] diff --git a/labs/docker/kurento/docker-entrypoint.sh b/labs/docker/kurento/docker-entrypoint.sh new file mode 100755 index 0000000000..c700df012b --- /dev/null +++ b/labs/docker/kurento/docker-entrypoint.sh @@ -0,0 +1,21 @@ +#!/bin/bash -x +set -e + +apt-get install -y openh264-gst-plugins-bad-1.5 + +echo | tee /etc/kurento/modules/kurento/WebRtcEndpoint.conf.ini + +if [ -n "$KMS_TURN_URL" ]; then + echo "turnURL=$KMS_TURN_URL" | tee -a /etc/kurento/modules/kurento/WebRtcEndpoint.conf.ini +fi + +if [ -n "$KMS_STUN_IP" -a -n "$KMS_STUN_PORT" ]; then + # Generate WebRtcEndpoint configuration + echo "stunServerAddress=$KMS_STUN_IP" | tee -a /etc/kurento/modules/kurento/WebRtcEndpoint.conf.ini + echo "stunServerPort=$KMS_STUN_PORT" | tee -a /etc/kurento/modules/kurento/WebRtcEndpoint.conf.ini +fi + +# Remove ipv6 local loop until ipv6 is supported +cat /etc/hosts | sed '/::1/d' | tee /etc/hosts > /dev/null + +exec /usr/bin/kurento-media-server "$@" diff --git a/labs/docker/kurento/entrypoint.sh b/labs/docker/kurento/entrypoint.sh deleted file mode 100755 index cacc90dc62..0000000000 --- a/labs/docker/kurento/entrypoint.sh +++ /dev/null @@ -1,20 +0,0 @@ -#!/bin/bash -x -set -e - -apt-get install -y openh264-gst-plugins-bad-1.5 - -if [ -n "$KMS_TURN_URL" ]; then - echo "turnURL=$KMS_TURN_URL" > /etc/kurento/modules/kurento/WebRtcEndpoint.conf.ini -fi - -if [ -n "$KMS_STUN_IP" -a -n "$KMS_STUN_PORT" ]; then - # Generate WebRtcEndpoint configuration - echo "stunServerAddress=$KMS_STUN_IP" > /etc/kurento/modules/kurento/WebRtcEndpoint.conf.ini - echo "stunServerPort=$KMS_STUN_PORT" >> /etc/kurento/modules/kurento/WebRtcEndpoint.conf.ini -fi - -# Remove ipv6 local loop until ipv6 is supported -cat /etc/hosts | sed '/::1/d' | tee /etc/hosts > /dev/null - -exec /usr/bin/kurento-media-server "$@" - diff --git a/libreoffice.dockerfile b/labs/docker/libreoffice/Dockerfile similarity index 57% rename from libreoffice.dockerfile rename to labs/docker/libreoffice/Dockerfile index c02a5a138c..d86e888234 100644 --- a/libreoffice.dockerfile +++ b/labs/docker/libreoffice/Dockerfile @@ -5,9 +5,8 @@ ENV DEBIAN_FRONTEND noninteractive RUN apt-get update \ && apt-get -y install libreoffice fonts-* hyphen-* -EXPOSE 8100 +ENV PORT 8100 -COPY ./libreoffice-run.sh /libreoffice-run.sh - -CMD [ "/libreoffice-run.sh" ] +COPY ./docker-entrypoint.sh /docker-entrypoint.sh +CMD [ "./docker-entrypoint.sh" ] diff --git a/labs/docker/libreoffice/docker-entrypoint.sh b/labs/docker/libreoffice/docker-entrypoint.sh new file mode 100755 index 0000000000..e55c77c7a1 --- /dev/null +++ b/labs/docker/libreoffice/docker-entrypoint.sh @@ -0,0 +1,12 @@ +#!/bin/bash + +IP=$(hostname -I | cut -d' ' -f1) + +while : ; do + /usr/lib/libreoffice/program/soffice.bin --headless --nologo --nofirststartwizard "--accept=socket,host=${IP},port=${PORT};urp" --pidfile=/var/run/soffice.pid + EXIT_CODE=$? + [[ $EXIT_CODE == 81 ]] || break + echo "Exit code is $EXIT_CODE, restarting..." +done + + diff --git a/labs/docker/nginx/.dockerfile b/labs/docker/nginx/.dockerfile new file mode 100644 index 0000000000..94143827ed --- /dev/null +++ b/labs/docker/nginx/.dockerfile @@ -0,0 +1 @@ +Dockerfile diff --git a/labs/docker/nginx/Dockerfile b/labs/docker/nginx/Dockerfile index b36d8fa8cb..5e87e99b36 100644 --- a/labs/docker/nginx/Dockerfile +++ b/labs/docker/nginx/Dockerfile @@ -1,6 +1,21 @@ FROM nginx -COPY ./nginx.conf /etc/nginx/nginx.conf +RUN apt-get update && apt-get install -y wget + +ENV DOCKERIZE_VERSION v0.6.1 +RUN wget https://github.com/jwilder/dockerize/releases/download/$DOCKERIZE_VERSION/dockerize-linux-amd64-$DOCKERIZE_VERSION.tar.gz \ + && tar -C /usr/local/bin -xzvf dockerize-linux-amd64-$DOCKERIZE_VERSION.tar.gz \ + && rm dockerize-linux-amd64-$DOCKERIZE_VERSION.tar.gz + +COPY ./nginx.conf.tmpl /etc/nginx/nginx.conf.tmpl COPY ./config.xml /var/www/bigbluebutton/client/conf/config.xml +RUN touch /var/log/nginx/error.log /var/log/nginx/access.log /var/log/nginx/bigbluebutton.access.log + +# "-stdout", "/var/log/nginx/access.log", \ +# "-stdout", "/var/log/nginx/bigbluebutton.access.log", \ +# "-stderr", "/var/log/nginx/error.log", \ +CMD [ "dockerize", \ + "-template", "/etc/nginx/nginx.conf.tmpl:/etc/nginx/nginx.conf", \ + "nginx", "-g", "daemon off;" ] diff --git a/labs/docker/nginx/nginx.conf b/labs/docker/nginx/nginx.conf.tmpl similarity index 57% rename from labs/docker/nginx/nginx.conf rename to labs/docker/nginx/nginx.conf.tmpl index 8cc5431620..590e2d93d6 100644 --- a/labs/docker/nginx/nginx.conf +++ b/labs/docker/nginx/nginx.conf.tmpl @@ -48,18 +48,18 @@ http { server { listen 80; listen [::]:80; - server_name felipe-docker.mconf.com; + server_name {{ .Env.SERVER_DOMAIN }}; listen 443 ssl; listen [::]:443 ssl; - ssl_certificate /etc/letsencrypt/live/felipe-docker.mconf.com/fullchain.pem; - ssl_certificate_key /etc/letsencrypt/live/felipe-docker.mconf.com/privkey.pem; + ssl_certificate {{ .Env.SSL_CERT_PATH }}; + ssl_certificate_key {{ .Env.SSL_KEY_PATH }}; ssl_session_cache shared:SSL:10m; ssl_session_timeout 10m; # need TLSv1 for the Java calls for the API, otherwise it would be removed ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH"; ssl_prefer_server_ciphers on; - ssl_dhparam /etc/nginx/ssl/dhp-2048.pem; + ssl_dhparam {{ .Env.SSL_DHPARAM_PATH }}; ssl_ecdh_curve secp384r1; ssl_session_tickets off; ssl_stapling on; @@ -68,42 +68,6 @@ http { access_log /var/log/nginx/bigbluebutton.access.log; - # Handle RTMPT (RTMP Tunneling). Forwards requests - # to Red5 on port 5080 - location ~ (/open/|/close/|/idle/|/send/|/fcs/) { - proxy_pass http://127.0.0.1:5080; - proxy_redirect off; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - - client_max_body_size 10m; - client_body_buffer_size 128k; - - proxy_connect_timeout 90; - proxy_send_timeout 90; - proxy_read_timeout 90; - - proxy_buffering off; - keepalive_requests 1000000000; - } - - # Handle desktop sharing tunneling. Forwards - # requests to Red5 on port 5080. - location /deskshare { - proxy_pass http://127.0.0.1:5080; - proxy_redirect default; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - client_max_body_size 10m; - client_body_buffer_size 128k; - proxy_connect_timeout 90; - proxy_send_timeout 90; - proxy_read_timeout 90; - proxy_buffer_size 4k; - proxy_buffers 4 32k; - proxy_busy_buffers_size 64k; - proxy_temp_file_write_size 64k; - include fastcgi_params; - } - # BigBlueButton landing page. location / { root /var/www/bigbluebutton-default; @@ -111,14 +75,6 @@ http { expires 1m; } - # BigBlueButton.html is here so we can expire it every 1 minute to - # prevent caching. - location /client/BigBlueButton.html { - root /var/www/bigbluebutton; - index index.html index.htm; - expires 1m; - } - # BigBlueButton Flash client. location /client { root /var/www/bigbluebutton; @@ -139,26 +95,8 @@ http { index index.html index.htm; } - # Handle desktop sharing tunneling. Forwards - # requests to Red5 on port 5080. - location /screenshare { - proxy_pass http://127.0.0.1:5080; - proxy_redirect default; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - client_max_body_size 10m; - client_body_buffer_size 128k; - proxy_connect_timeout 90; - proxy_send_timeout 90; - proxy_read_timeout 90; - proxy_buffer_size 4k; - proxy_buffers 4 32k; - proxy_busy_buffers_size 64k; - proxy_temp_file_write_size 64k; - include fastcgi_params; - } - location /ws { - proxy_pass https://45.55.44.165:7443; + proxy_pass https://bbb-freeswitch:7443; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "Upgrade"; @@ -226,28 +164,28 @@ http { proxy_pass http://bbb-html5:3000; } - # Routes requests to Greenlight based on the '/b' prefix - location /b { - proxy_pass http://greenlight:80; - proxy_set_header Host $host; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Proto $scheme; - proxy_http_version 1.1; - } - - location /b/cable { - proxy_pass http://greenlight:80; - proxy_set_header Host $host; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Proto $scheme; - proxy_set_header Upgrade $http_upgrade; - proxy_set_header Connection "Upgrade"; - proxy_http_version 1.1; - proxy_read_timeout 6h; - proxy_send_timeout 6h; - client_body_timeout 6h; - send_timeout 6h; - } +# # Routes requests to Greenlight based on the '/b' prefix +# location /b { +# proxy_pass http://greenlight:80; +# proxy_set_header Host $host; +# proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; +# proxy_set_header X-Forwarded-Proto $scheme; +# proxy_http_version 1.1; +# } +# +# location /b/cable { +# proxy_pass http://greenlight:80; +# proxy_set_header Host $host; +# proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; +# proxy_set_header X-Forwarded-Proto $scheme; +# proxy_set_header Upgrade $http_upgrade; +# proxy_set_header Connection "Upgrade"; +# proxy_http_version 1.1; +# proxy_read_timeout 6h; +# proxy_send_timeout 6h; +# client_body_timeout 6h; +# send_timeout 6h; +# } # Redirect server error pages to the static page /50x.html # diff --git a/labs/docker/sbt/Dockerfile b/labs/docker/sbt/Dockerfile index 522324ccbc..99e285c61d 100644 --- a/labs/docker/sbt/Dockerfile +++ b/labs/docker/sbt/Dockerfile @@ -12,4 +12,3 @@ RUN curl -L -o sbt-$SBT_VERSION.deb https://dl.bintray.com/sbt/debian/sbt-$SBT_V RUN echo 'resolvers += "Artima Maven Repository" at "http://repo.artima.com/releases"' | tee -a ~/.sbt/0.13/global.sbt WORKDIR /root - diff --git a/libreoffice-run.sh b/libreoffice-run.sh deleted file mode 100755 index f865abb737..0000000000 --- a/libreoffice-run.sh +++ /dev/null @@ -1,7 +0,0 @@ -#!/bin/bash -e - -CONTAINER_IP=$(hostname -I) -echo "Listening to $CONTAINER_IP" - -/usr/lib/libreoffice/program/soffice.bin --headless --nologo --nofirststartwizard "--accept=socket,host=$CONTAINER_IP,port=8100;urp" --pidfile=/var/run/soffice.pid - -- GitLab