From faa3c4f421c66a3e1297217e8de7980f2f86b790 Mon Sep 17 00:00:00 2001 From: gauravyeole Date: Tue, 23 Jan 2018 21:14:56 -0500 Subject: [PATCH 01/12] ipopstat-0.15 with MongoDB --- ipopstat-0.15/DEBIAN/control | 9 ++ ipopstat-0.15/DEBIAN/postinst | 3 + ipopstat-0.15/DEBIAN/preinst | 8 ++ ipopstat-0.15/etc/init.d/ipop-stat | 134 ++++++++++++++++++ ipopstat-0.15/usr/share/ipop-stat/MANIFEST.in | 2 + .../usr/share/ipop-stat/config/config.yml | 32 +++++ .../usr/share/ipop-stat/config/debug.yml | 36 +++++ .../usr/share/ipop-stat/flask_run.py | 23 +++ .../share/ipop-stat/ipop_stats/__init__.py | 1 + .../usr/share/ipop-stat/ipop_stats/app.py | 37 +++++ .../share/ipop-stat/ipop_stats/database.py | 18 +++ .../usr/share/ipop-stat/ipop_stats/errors.py | 33 +++++ .../ipop-stat/ipop_stats/views/__init__.py | 1 + .../ipop-stat/ipop_stats/views/submit.py | 35 +++++ ipopstat-0.15/usr/share/ipop-stat/run.py | 33 +++++ ipopstat-0.15/usr/share/ipop-stat/setup.py | 14 ++ 16 files changed, 419 insertions(+) create mode 100644 ipopstat-0.15/DEBIAN/control create mode 100755 ipopstat-0.15/DEBIAN/postinst create mode 100755 ipopstat-0.15/DEBIAN/preinst create mode 100755 ipopstat-0.15/etc/init.d/ipop-stat create mode 100644 ipopstat-0.15/usr/share/ipop-stat/MANIFEST.in create mode 100644 ipopstat-0.15/usr/share/ipop-stat/config/config.yml create mode 100644 ipopstat-0.15/usr/share/ipop-stat/config/debug.yml create mode 100755 ipopstat-0.15/usr/share/ipop-stat/flask_run.py create mode 100644 ipopstat-0.15/usr/share/ipop-stat/ipop_stats/__init__.py create mode 100644 ipopstat-0.15/usr/share/ipop-stat/ipop_stats/app.py create mode 100644 ipopstat-0.15/usr/share/ipop-stat/ipop_stats/database.py create mode 100644 ipopstat-0.15/usr/share/ipop-stat/ipop_stats/errors.py create mode 100644 ipopstat-0.15/usr/share/ipop-stat/ipop_stats/views/__init__.py create mode 100644 ipopstat-0.15/usr/share/ipop-stat/ipop_stats/views/submit.py create mode 100755 ipopstat-0.15/usr/share/ipop-stat/run.py create mode 100644 ipopstat-0.15/usr/share/ipop-stat/setup.py diff --git a/ipopstat-0.15/DEBIAN/control b/ipopstat-0.15/DEBIAN/control new file mode 100644 index 0000000..eac5eec --- /dev/null +++ b/ipopstat-0.15/DEBIAN/control @@ -0,0 +1,9 @@ +Package: ipop-stat +Source: linux +Version: 0.14 +Architecture: amd64 +Maintainer: Kyuho Jeong +Installed-Size: 41150 +Pre-Depends: dpkg (>= 1.10.24) +Depends: python-pip, python-flask, python-sqlalchemy, sqlite3, python-yaml, python-tornado +Description: Humble stat server diff --git a/ipopstat-0.15/DEBIAN/postinst b/ipopstat-0.15/DEBIAN/postinst new file mode 100755 index 0000000..ab74539 --- /dev/null +++ b/ipopstat-0.15/DEBIAN/postinst @@ -0,0 +1,3 @@ +#!/usr/bin/env bash +service ipop-stat start +update-rc.d ipop-stat defaults diff --git a/ipopstat-0.15/DEBIAN/preinst b/ipopstat-0.15/DEBIAN/preinst new file mode 100755 index 0000000..ea9b334 --- /dev/null +++ b/ipopstat-0.15/DEBIAN/preinst @@ -0,0 +1,8 @@ +#!/usr/bin/env bash +mkdir -p /var/lib/ipop-stat +touch /var/lib/ipop-stat/ipop-stat.db +touch /var/log/ipop-stat.log +useradd -d /var/lib/ipop-stat ipop +chown --quiet ipop:ipop /var/lib/ipop-stat +chown --quiet ipop:ipop /var/lib/ipop-stat/ipop-stat.db +chown --quiet ipop:ipop /var/log/ipop-stat.log diff --git a/ipopstat-0.15/etc/init.d/ipop-stat b/ipopstat-0.15/etc/init.d/ipop-stat new file mode 100755 index 0000000..70b9afd --- /dev/null +++ b/ipopstat-0.15/etc/init.d/ipop-stat @@ -0,0 +1,134 @@ +#! /bin/sh +### BEGIN INIT INFO +# Provides: ipop-stat service +# Required-Start: $remote_fs $syslog +# Required-Stop: $remote_fs $syslog +# Default-Start: 2 3 4 5 +# Default-Stop: 0 1 6 +# Short-Description: ipop stat +# Description: ipop stat +### END INIT INFO + +# Author: Kyuho Jeong + +PATH=/sbin:/usr/sbin:/bin:/usr/bin +DESC="ipop stat" +NAME=ipop-stat +DAEMON=/usr/share/$NAME/run.py +DAEMON_ARGS="-c /usr/share/$NAME/config/debug.yml" +PIDFILE=/var/run/$NAME.pid +SCRIPTNAME=/etc/init.d/$NAME + +. /lib/lsb/init-functions + +do_start() +{ + # Return + # 0 if daemon has been started + # 1 if daemon was already running + # 2 if daemon could not be started + start-stop-daemon --start --quiet --pidfile --chuid ipop $PIDFILE --exec $DAEMON --test > /dev/null \ + || return 1 + start-stop-daemon --start --quiet --chuid ipop --make-pidfile --pidfile $PIDFILE --background \ + --startas /bin/bash -- -c "exec $DAEMON $DAEMON_ARGS > /dev/null" \ + || return 2 +} + +# +# Function that stops the daemon/service +# +do_stop() +{ + # Return + # 0 if daemon has been stopped + # 1 if daemon was already stopped + # 2 if daemon could not be stopped + # other if a failure occurred + start-stop-daemon --stop --quiet --retry=TERM/30/KILL/5 --pidfile $PIDFILE --name $NAME + RETVAL="$?" + [ "$RETVAL" = 2 ] && return 2 + # Wait for children to finish too if this is a daemon that forks + # and if the daemon is only ever run from this initscript. + # If the above conditions are not satisfied then add some other code + # that waits for the process to drop all resources that could be + # needed by services started subsequently. A last resort is to + # sleep for some time. + start-stop-daemon --stop --quiet --chuid ipop --oknodo --retry=0/30/KILL/5 --exec $DAEMON + [ "$?" = 2 ] && return 2 + # Many daemons don't delete their pidfiles when they exit. + rm -f $PIDFILE + return "$RETVAL" +} + +# +# Function that sends a SIGHUP to the daemon/service +# +do_reload() { + # + # If the daemon can reload its configuration without + # restarting (for example, when it is sent a SIGHUP), + # then implement that here. + # + start-stop-daemon --stop --signal 1 --quiet --chuid ipop --pidfile $PIDFILE --name $NAME + return 0 +} + +case "$1" in + start) + [ "$VERBOSE" != no ] && log_daemon_msg "Starting $DESC" "$NAME" + do_start + case "$?" in + 0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;; + 2) [ "$VERBOSE" != no ] && log_end_msg 1 ;; + esac + ;; + stop) + [ "$VERBOSE" != no ] && log_daemon_msg "Stopping $DESC" "$NAME" + do_stop + case "$?" in + 0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;; + 2) [ "$VERBOSE" != no ] && log_end_msg 1 ;; + esac + ;; + status) + status_of_proc "$DAEMON" "$NAME" && exit 0 || exit $? + ;; + #reload|force-reload) + # + # If do_reload() is not implemented then leave this commented out + # and leave 'force-reload' as an alias for 'restart'. + # + #log_daemon_msg "Reloading $DESC" "$NAME" + #do_reload + #log_end_msg $? + #;; + restart|force-reload) + # + # If the "reload" option is implemented then remove the + # 'force-reload' alias + # + log_daemon_msg "Restarting $DESC" "$NAME" + do_stop + case "$?" in + 0|1) + do_start + case "$?" in + 0) log_end_msg 0 ;; + 1) log_end_msg 1 ;; # Old process is still running + *) log_end_msg 1 ;; # Failed to start + esac + ;; + *) + # Failed to stop + log_end_msg 1 + ;; + esac + ;; + *) + #echo "Usage: $SCRIPTNAME {start|stop|restart|reload|force-reload}" >&2 + echo "Usage: $SCRIPTNAME {start|stop|status|restart|force-reload}" >&2 + exit 3 + ;; +esac + +: diff --git a/ipopstat-0.15/usr/share/ipop-stat/MANIFEST.in b/ipopstat-0.15/usr/share/ipop-stat/MANIFEST.in new file mode 100644 index 0000000..0d8e19d --- /dev/null +++ b/ipopstat-0.15/usr/share/ipop-stat/MANIFEST.in @@ -0,0 +1,2 @@ +recursive-include ipop_stats/templates * +recursive-include ipop_stats/static * diff --git a/ipopstat-0.15/usr/share/ipop-stat/config/config.yml b/ipopstat-0.15/usr/share/ipop-stat/config/config.yml new file mode 100644 index 0000000..f32ffed --- /dev/null +++ b/ipopstat-0.15/usr/share/ipop-stat/config/config.yml @@ -0,0 +1,32 @@ +# http://flask.pocoo.org/docs/config/ +database_name: "usage_report" +database_uri: "mongodb://localhost:27017" +new_database: False +flask: + debug: true + testing: true +# http://docs.python.org/2/library/logging.config.html#logging-config-dictschema +logging: + version: 1 + root: + level: DEBUG + handlers: + console: + class: logging.RotatingFileHandler + stream: ext://sys.stdout + formatter: default + file: + class : logging.handlers.RotatingFileHandler + formatter: default + filename: /var/log/ipop-stat.log + maxBytes: 99999999 + backupCount: 9 + formatters: + default: + format: '%(asctime)s %(levelname)-8s %(name)-15s %(message)s' + datefmt: '%Y-%m-%d %H:%M:%S' +ratelimit: + burst: 10 # allow a burst "pool" + uuid: 60 # seconds + ipv4: 60 # seconds + ipv6: 60 # seconds diff --git a/ipopstat-0.15/usr/share/ipop-stat/config/debug.yml b/ipopstat-0.15/usr/share/ipop-stat/config/debug.yml new file mode 100644 index 0000000..7677d6c --- /dev/null +++ b/ipopstat-0.15/usr/share/ipop-stat/config/debug.yml @@ -0,0 +1,36 @@ +# http://flask.pocoo.org/docs/config/ +database_name: "usage_report" +database_uri: "mongodb://localhost:27017" +new_database: False +flask: + debug: true + testing: true +# http://docs.python.org/2/library/logging.config.html#logging-config-dictschema +logging: + version: 1 + root: + level: DEBUG + handlers: + console: + class: logging.StreamHandler + stream: ext://sys.stdout + formatter: default + file: + class : logging.handlers.RotatingFileHandler + formatter: default + filename: /var/log/ipop-stat.log + maxBytes: 9999999 + backupCount: 9 + formatters: + default: + format: '%(asctime)s %(levelname)-8s %(name)-15s %(message)s' + datefmt: '%Y-%m-%d %H:%M:%S' + loggers: + all: + level: DEBUG + handlers: [console, file] +ratelimit: + burst: 10 # allow a burst "pool" + uuid: 60 # seconds + ipv4: 60 # seconds + ipv6: 60 # seconds diff --git a/ipopstat-0.15/usr/share/ipop-stat/flask_run.py b/ipopstat-0.15/usr/share/ipop-stat/flask_run.py new file mode 100755 index 0000000..6e3b9c3 --- /dev/null +++ b/ipopstat-0.15/usr/share/ipop-stat/flask_run.py @@ -0,0 +1,23 @@ +#!/usr/bin/env python +from ipop_stats.app import create as create_app +from flask import Flask +import argparse +import os, os.path + +parser = argparse.ArgumentParser(description="Standalone test server for " + "ipop-stats") + +try: + default_config_path = os.path.abspath(os.environ["IPOP_STATS_SETTINGS"]) +except: + default_config_path = "config/debug.yml" + +parser.add_argument( + "-c", "--config", + default=default_config_path, + type=os.path.abspath, + help="the flask config file for the server" +) + +args = parser.parse_args() +create_app(**vars(args)).run(host="0.0.0.0", port=8080) diff --git a/ipopstat-0.15/usr/share/ipop-stat/ipop_stats/__init__.py b/ipopstat-0.15/usr/share/ipop-stat/ipop_stats/__init__.py new file mode 100644 index 0000000..2ae2839 --- /dev/null +++ b/ipopstat-0.15/usr/share/ipop-stat/ipop_stats/__init__.py @@ -0,0 +1 @@ +pass diff --git a/ipopstat-0.15/usr/share/ipop-stat/ipop_stats/app.py b/ipopstat-0.15/usr/share/ipop-stat/ipop_stats/app.py new file mode 100644 index 0000000..d43096f --- /dev/null +++ b/ipopstat-0.15/usr/share/ipop-stat/ipop_stats/app.py @@ -0,0 +1,37 @@ +from flask import Flask +import yaml +import os.path +import logging.config +from database import Database + +def create(config): + """http://flask.pocoo.org/docs/patterns/appfactories/""" + + app = Flask(__name__.split('.')[0]) + + # Load YAML config into app.config + if not isinstance(config, dict): + with open(os.path.join(app.instance_path, config)) as f: + config = yaml.load(f) + config.update({k.upper(): v for k, v in config["flask"].items()}) + app.config.update(config) + del config + + # Configure logging + logging.config.dictConfig(app.config["logging"]) + logger = logging.getLogger('all') + logger.info("BUILT LOGGER. Logging started") + + # Initialize database + app.database = Database(app) + + # Load blueprints + from .views.submit import submit + app.register_blueprint(submit) + + if False and app.debug: + app.logger.warning("Debug mode is on. Do not use this in production.") + from .views.debug import debug + app.register_blueprint(debug) + + return app diff --git a/ipopstat-0.15/usr/share/ipop-stat/ipop_stats/database.py b/ipopstat-0.15/usr/share/ipop-stat/ipop_stats/database.py new file mode 100644 index 0000000..0a8d636 --- /dev/null +++ b/ipopstat-0.15/usr/share/ipop-stat/ipop_stats/database.py @@ -0,0 +1,18 @@ + +import logging +import uuid +import functools +from contextlib import contextmanager + +from pymongo import MongoClient + +class Database(object): + def __init__(self, app): + self.app = app + + self.stat_mongo = MongoClient(self.app.config["database_uri"]) + logger = logging.getLogger('all') + logger.info("MongoDB Server is running at :{0}".format(self.app.config["database_uri"])) + self._db = self.stat_mongo[self.app.config["database_name"]] + self.user_collection = self._db["user"] + diff --git a/ipopstat-0.15/usr/share/ipop-stat/ipop_stats/errors.py b/ipopstat-0.15/usr/share/ipop-stat/ipop_stats/errors.py new file mode 100644 index 0000000..54ed3e8 --- /dev/null +++ b/ipopstat-0.15/usr/share/ipop-stat/ipop_stats/errors.py @@ -0,0 +1,33 @@ +from flask import jsonify +from werkzeug.exceptions import HTTPException + +# We follow the JSend spec for API errors: http://labs.omniti.com/labs/jsend + +class ApiFail(HTTPException): + """There was a problem with the data submitted, or some pre-condition of the + API call wasn't satisfied""" + def __init__(message=None, data=None, code=400, **kwargs): + data = data or kwargs + if instanceof(message, str): + data, message = message, None + if message: + data["message"] = message + + response = jsonify(status="fail", data=data) + response.status_code = status_code + HTTPException.__init__(self, message, response) + self.code = code + +class ApiError(HTTPException): + "An error occurred in processing the request, i.e. an exception was thrown" + def __init__(message, code=500, data=None, **kwargs): + data = data or kwargs + response_dict = {"status": "error", "message": message} + if code != 500: + response_dict["code"] = code + if data: + response_dict["data"] = data + response = jsonify(response_dict) + response.status_code = status_code + HTTPException.__init__(self, message, response) + self.code = code diff --git a/ipopstat-0.15/usr/share/ipop-stat/ipop_stats/views/__init__.py b/ipopstat-0.15/usr/share/ipop-stat/ipop_stats/views/__init__.py new file mode 100644 index 0000000..2ae2839 --- /dev/null +++ b/ipopstat-0.15/usr/share/ipop-stat/ipop_stats/views/__init__.py @@ -0,0 +1 @@ +pass diff --git a/ipopstat-0.15/usr/share/ipop-stat/ipop_stats/views/submit.py b/ipopstat-0.15/usr/share/ipop-stat/ipop_stats/views/submit.py new file mode 100644 index 0000000..d7e3e6e --- /dev/null +++ b/ipopstat-0.15/usr/share/ipop-stat/ipop_stats/views/submit.py @@ -0,0 +1,35 @@ +from ..errors import * +from flask import Blueprint, request, jsonify +from flask import current_app as app +import datetime +import socket +import uuid +import logging + +from pymongo import MongoClient + + +submit = Blueprint("submit", __name__, url_prefix="/api") + +@submit.route("/submit", methods=["POST"]) +def update(): + logger = logging.getLogger('all') + logger.info("Report Message Received") + data = request.json + report = {"Report": data} + obj_id = app.database.user_collection.insert_one(report) + response = jsonify(result=uuid.uuid4().hex, status="success") # TODO: what is result? + return response + +@submit.route("/") +def hello(): + return "IPOP-Usage Stat Server!" + +@submit.route("/generate_uuid") +def generate_uuid(): + """Convenience uuid generator, for clients who don't have a convenient local + generator.""" + response = jsonify(result=uuid.uuid4().hex, status="success") + response.headers["Expires"] = "-1" + response.headers["Cache-Control"] = "no-cache, no-store" + return response diff --git a/ipopstat-0.15/usr/share/ipop-stat/run.py b/ipopstat-0.15/usr/share/ipop-stat/run.py new file mode 100755 index 0000000..d674125 --- /dev/null +++ b/ipopstat-0.15/usr/share/ipop-stat/run.py @@ -0,0 +1,33 @@ +#!/usr/bin/env python + +from flask import Flask +from tornado.wsgi import WSGIContainer +from tornado.httpserver import HTTPServer +from tornado.ioloop import IOLoop +from ipop_stats.app import create as create_app +import argparse +import os, os.path + +parser = argparse.ArgumentParser(description="Standalone test server for " + "ipop-stats") + +try: + default_config_path = os.path.abspath(os.environ["IPOP_STATS_SETTINGS"]) +except: + default_config_path = "config/debug.yml" + +parser.add_argument( + "-c", "--config", + default=default_config_path, + type=os.path.abspath, + help="the flask config file for the server" +) + +# Create Flask APP +args = parser.parse_args() +app = create_app(**vars(args)) #run(host="0.0.0.0", port=8080) + +# Run with Tonado +http_server = HTTPServer(WSGIContainer(app)) +http_server.listen(8080) +IOLoop.instance().start() diff --git a/ipopstat-0.15/usr/share/ipop-stat/setup.py b/ipopstat-0.15/usr/share/ipop-stat/setup.py new file mode 100644 index 0000000..de3b226 --- /dev/null +++ b/ipopstat-0.15/usr/share/ipop-stat/setup.py @@ -0,0 +1,14 @@ +from setuptools import * + +setup( + name="ipop-stats", + version="0.0.1", + install_requires=[ + "flask>=0.10.1,<0.11", + "pymongo>=3.6,<4", + "PyYAML>=3.10,<4.0", + ], + description="Gathers anonymous usage statistics of IPOP users", + packages=find_packages(), + scripts=["bin/ipop-stats"], +) From d250fecae35456dc46008adcd7c510767a5f24b8 Mon Sep 17 00:00:00 2001 From: gauravyeole Date: Tue, 23 Jan 2018 21:40:47 -0500 Subject: [PATCH 02/12] update README --- README.md | 39 ++++++--------------------------------- 1 file changed, 6 insertions(+), 33 deletions(-) diff --git a/README.md b/README.md index 05e37e0..ec67238 100644 --- a/README.md +++ b/README.md @@ -64,10 +64,14 @@ module][nginx limit req]. Running server (without installing as an debian package) -------------- ``` +sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 2930ADAE8CAF5059EE73BB4B58712A2291FA4AD5 +echo "deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu xenial/mongodb-org/3.6 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-3.6.list sudo apt-get update -sudo apt-get install git python-pip python-flask python-sqlalchemy sqlite3 python-yaml +sudo apt-get install -y mongodb-org +sudo apt-get install -y mongodb-org=3.6.0 mongodb-org-server=3.6.0 mongodb-org-shell=3.6.0 mongodb-org-mongos=3.6.0 mongodb-org-tools=3.6.0 +sudo apt-get install git python-pip python-flask pymongo python-yaml git clone https://github.com/ipop-project/ipop-stats.git -cd ipop-stats/ipopstat-0.12/DEBIAN +cd ipop-stats/ipopstat-0.15/DEBIAN sudo bash preinst sudo passwd ipop Enter new UNIX password: ipop @@ -87,37 +91,6 @@ controller reports status info http://ip_address:8080/api/submit -sqlite database file is located /var/lib/ipop-stat/ipop-stat.db - -Simple database query snippets below. -``` -$sqlite3 /var/lib/ipop-stat/ipop-stat.db -sqlite>select * from user; -sqlite>select * from ping; -``` - -Building Debian Packages ------------------------- - - -Locate at the parent directory of ipop-stat then run below. - -``` -dpkg-deb --build ipopstat-0.14 -``` - - - -Install and Running ipopstat from Debian Package ------------------------------------------------- - -``` -sudo dpkg -i ipopstat-0.14.deb -sudo apt-get update -sudo apt-get -f install -``` - - Note for next time ------------------------------------------------ From 7f333fe246bd25274bfec7d28b3696cb3cfbbac8 Mon Sep 17 00:00:00 2001 From: gauravyeole Date: Wed, 24 Jan 2018 14:19:10 -0500 Subject: [PATCH 03/12] Update readme --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index ec67238..8f1ab37 100644 --- a/README.md +++ b/README.md @@ -68,7 +68,7 @@ sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 2930ADAE8CAF50 echo "deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu xenial/mongodb-org/3.6 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-3.6.list sudo apt-get update sudo apt-get install -y mongodb-org -sudo apt-get install -y mongodb-org=3.6.0 mongodb-org-server=3.6.0 mongodb-org-shell=3.6.0 mongodb-org-mongos=3.6.0 mongodb-org-tools=3.6.0 +python -m pip install pymongo sudo apt-get install git python-pip python-flask pymongo python-yaml git clone https://github.com/ipop-project/ipop-stats.git cd ipop-stats/ipopstat-0.15/DEBIAN @@ -77,6 +77,7 @@ sudo passwd ipop Enter new UNIX password: ipop Retype new UNIX password: ipop passwd: password updated successfully +sudo service mongod start su ipop Password:ipop cd ../usr/share/ipop-stat From b5d6d647d0a87f8c59d48b770db159964abb86e1 Mon Sep 17 00:00:00 2001 From: gauravyeole Date: Wed, 24 Jan 2018 14:27:03 -0500 Subject: [PATCH 04/12] update readme: instruction --- README.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/README.md b/README.md index 8f1ab37..b5f500f 100644 --- a/README.md +++ b/README.md @@ -92,6 +92,15 @@ controller reports status info http://ip_address:8080/api/submit +database location: +/var/lib/mongodb/ + +you can query database using Mongo shell as: +$ mongo +> use usage_report +> db.user.find() // to get the data in database +> db.user.count() // to get number of documents in collection + Note for next time ------------------------------------------------ From 0dddf271fbfcb9344d8f5c95b0ecc85145338510 Mon Sep 17 00:00:00 2001 From: gauravyeole Date: Wed, 24 Jan 2018 14:28:11 -0500 Subject: [PATCH 05/12] update readme: minor bug fix --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index b5f500f..978dea4 100644 --- a/README.md +++ b/README.md @@ -96,11 +96,12 @@ database location: /var/lib/mongodb/ you can query database using Mongo shell as: +``` $ mongo > use usage_report > db.user.find() // to get the data in database > db.user.count() // to get number of documents in collection - +``` Note for next time ------------------------------------------------ From 177bc84dcfd22187d1034c057dc7a9bbda0d95dd Mon Sep 17 00:00:00 2001 From: gauravyeole Date: Thu, 15 Feb 2018 13:55:16 -0500 Subject: [PATCH 06/12] update client for python3 --- client.py | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/client.py b/client.py index 444d332..581d492 100755 --- a/client.py +++ b/client.py @@ -1,16 +1,18 @@ -#!/usr/bin/env python +#!/usr/bin/env import datetime import json import hashlib -import urllib2 +import urllib.request as urllib2 +import urllib.parse -data = json.dumps({ - "xmpp_host" : hashlib.sha1("127.0.0.1").hexdigest(), - "uid": hashlib.sha1("abcd").hexdigest(), - "xmpp_username":hashlib.sha1("username").hexdigest(), +report_data = { + "xmpp_host": hashlib.sha1("127.0.0.1".encode("utf-8")).hexdigest(), + "xmpp_username": hashlib.sha1("xmpp_username".encode("utf-8")).hexdigest(), "time": str(datetime.datetime.now()), "controller": "test_client", - "version": 3}) + "version": 3} + +data = json.dumps(report_data).encode('utf8') try: url="http://" + "127.0.0.1" + ":" +str(8080) + "/api/submit" @@ -22,6 +24,6 @@ res.read())) if res.getcode() != 200: raise -except: - print("Status report failed.") +except Exception as error: + print("Status report failed. Error is {0}".format(error)) From 0aacc9a006d70bd36d8d0567125d5373d7b830d6 Mon Sep 17 00:00:00 2001 From: gauravyeole Date: Thu, 15 Feb 2018 14:05:07 -0500 Subject: [PATCH 07/12] working ipop-stat0.15 --- ipopstat-0.15/usr/share/ipop-stat/run.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/ipopstat-0.15/usr/share/ipop-stat/run.py b/ipopstat-0.15/usr/share/ipop-stat/run.py index d674125..695e10c 100755 --- a/ipopstat-0.15/usr/share/ipop-stat/run.py +++ b/ipopstat-0.15/usr/share/ipop-stat/run.py @@ -8,6 +8,7 @@ import argparse import os, os.path + parser = argparse.ArgumentParser(description="Standalone test server for " "ipop-stats") @@ -31,3 +32,5 @@ http_server = HTTPServer(WSGIContainer(app)) http_server.listen(8080) IOLoop.instance().start() + + From 6fd13619e0858a7dc718a7df91ade81ab9974923 Mon Sep 17 00:00:00 2001 From: gauravyeole Date: Thu, 15 Feb 2018 21:03:44 -0500 Subject: [PATCH 08/12] ipop-usagereport added --- ipopusagereport-0.1/DEBIAN/control | 9 ++ ipopusagereport-0.1/DEBIAN/postinst | 3 + ipopusagereport-0.1/DEBIAN/preinst | 4 + .../etc/init.d/ipop-usagereport | 121 ++++++++++++++++++ .../usr/share/ipop-usagereport/MANIFEST.in | 2 + .../share/ipop-usagereport/config/config.yml | 32 +++++ .../share/ipop-usagereport/config/debug.yml | 36 ++++++ .../usr/share/ipop-usagereport/flask_run.py | 23 ++++ .../ipop-usagereport/ipop_stats/__init__.py | 1 + .../share/ipop-usagereport/ipop_stats/app.py | 37 ++++++ .../ipop-usagereport/ipop_stats/database.py | 18 +++ .../ipop-usagereport/ipop_stats/errors.py | 33 +++++ .../ipop_stats/views/__init__.py | 1 + .../ipop_stats/views/submit.py | 35 +++++ .../usr/share/ipop-usagereport/run.py | 34 +++++ .../usr/share/ipop-usagereport/setup.py | 14 ++ 16 files changed, 403 insertions(+) create mode 100644 ipopusagereport-0.1/DEBIAN/control create mode 100755 ipopusagereport-0.1/DEBIAN/postinst create mode 100755 ipopusagereport-0.1/DEBIAN/preinst create mode 100755 ipopusagereport-0.1/etc/init.d/ipop-usagereport create mode 100644 ipopusagereport-0.1/usr/share/ipop-usagereport/MANIFEST.in create mode 100644 ipopusagereport-0.1/usr/share/ipop-usagereport/config/config.yml create mode 100644 ipopusagereport-0.1/usr/share/ipop-usagereport/config/debug.yml create mode 100755 ipopusagereport-0.1/usr/share/ipop-usagereport/flask_run.py create mode 100644 ipopusagereport-0.1/usr/share/ipop-usagereport/ipop_stats/__init__.py create mode 100644 ipopusagereport-0.1/usr/share/ipop-usagereport/ipop_stats/app.py create mode 100644 ipopusagereport-0.1/usr/share/ipop-usagereport/ipop_stats/database.py create mode 100644 ipopusagereport-0.1/usr/share/ipop-usagereport/ipop_stats/errors.py create mode 100644 ipopusagereport-0.1/usr/share/ipop-usagereport/ipop_stats/views/__init__.py create mode 100644 ipopusagereport-0.1/usr/share/ipop-usagereport/ipop_stats/views/submit.py create mode 100755 ipopusagereport-0.1/usr/share/ipop-usagereport/run.py create mode 100644 ipopusagereport-0.1/usr/share/ipop-usagereport/setup.py diff --git a/ipopusagereport-0.1/DEBIAN/control b/ipopusagereport-0.1/DEBIAN/control new file mode 100644 index 0000000..ae1f468 --- /dev/null +++ b/ipopusagereport-0.1/DEBIAN/control @@ -0,0 +1,9 @@ +Package: ipop-usagereport +Source: linux +Version: 0.1 +Architecture: amd64 +Maintainer: Gaurav Yeole +Installed-Size: 41150 +Pre-Depends: dpkg (>= 1.10.24) +Depends: python-pip, python-flask, python-yaml, python-tornado +Description: IPOP Usage Report Server diff --git a/ipopusagereport-0.1/DEBIAN/postinst b/ipopusagereport-0.1/DEBIAN/postinst new file mode 100755 index 0000000..b6e89b6 --- /dev/null +++ b/ipopusagereport-0.1/DEBIAN/postinst @@ -0,0 +1,3 @@ +#!/usr/bin/env bash +service ipop-usagereport start +update-rc.d ipop-usagereport defaults diff --git a/ipopusagereport-0.1/DEBIAN/preinst b/ipopusagereport-0.1/DEBIAN/preinst new file mode 100755 index 0000000..e022fc7 --- /dev/null +++ b/ipopusagereport-0.1/DEBIAN/preinst @@ -0,0 +1,4 @@ +#!/usr/bin/env bash +touch /var/log/ipop-usagereport.log +useradd -d /var/lib/ipop-usagereport ipop +chown --quiet ipop:ipop /var/log/ipop-usagereport.log diff --git a/ipopusagereport-0.1/etc/init.d/ipop-usagereport b/ipopusagereport-0.1/etc/init.d/ipop-usagereport new file mode 100755 index 0000000..5b3a17c --- /dev/null +++ b/ipopusagereport-0.1/etc/init.d/ipop-usagereport @@ -0,0 +1,121 @@ +#!/bin/sh +### BEGIN INIT INFO +# Provides: ipop-usagereport +# Required-Start: $remote_fs $syslog +# Required-Stop: $remote_fs $syslog +# Default-Start: 2 3 4 5 +# Default-Stop: 0 1 6 +# Short-Description: ipop usage report +# Description: ipop usage report +### END INIT INFO + +# Author: Gaurav Yeole + +PATH=/sbin:/usr/sbin:/bin:/usr/bin +DESC="ipop usage report" +NAME=ipop-usagereport +DAEMON=/usr/share/$NAME/run.py +DAEMON_ARGS="-c /usr/share/$NAME/config/debug.yml" +PIDFILE=/var/run/$NAME.pid +SCRIPTNAME=/etc/init.d/$NAME + +. /lib/lsb/init-functions + +do_start() +{ + # Return + # 0 if daemon has been started + # 1 if daemon was already running + # 2 if daemon could not be started + start-stop-daemon --start --quiet --pidfile --chuid ipop $PIDFILE --exec $DAEMON --test > /dev/null \ + || return 1 + start-stop-daemon --start --quiet --chuid ipop --make-pidfile --pidfile $PIDFILE --background \ + --startas /bin/bash -- -c "exec $DAEMON $DAEMON_ARGS > /dev/null" \ + || return 2 +} + +# +# Function that stops the daemon/service +# +do_stop() +{ + # Return + # 0 if daemon has been stopped + # 1 if daemon was already stopped + # 2 if daemon could not be stopped + # other if a failure occurred + start-stop-daemon --stop --quiet --oknodo --pidfile $PIDFILE +} + +# +# Function that sends a SIGHUP to the daemon/service +# +do_reload() { + # + # If the daemon can reload its configuration without + # restarting (for example, when it is sent a SIGHUP), + # then implement that here. + # + start-stop-daemon --stop --signal 1 --quiet --chuid ipop --pidfile $PIDFILE --name $NAME + return 0 +} + +case "$1" in + start) + [ "$VERBOSE" != no ] && log_daemon_msg "Starting $DESC" "$NAME" + do_start + case "$?" in + 0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;; + 2) [ "$VERBOSE" != no ] && log_end_msg 1 ;; + esac + ;; + stop) + [ "$VERBOSE" != no ] && log_daemon_msg "Stopping $DESC" "$NAME" + do_stop + case "$?" in + 0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;; + 2) [ "$VERBOSE" != no ] && log_end_msg 1 ;; + esac + ;; + status) + status_of_proc "$DAEMON" "$NAME" && exit 0 || exit $? + ;; + #reload|force-reload) + # + # If do_reload() is not implemented then leave this commented out + # and leave 'force-reload' as an alias for 'restart'. + # + #log_daemon_msg "Reloading $DESC" "$NAME" + #do_reload + #log_end_msg $? + #;; + restart|force-reload) + # + # If the "reload" option is implemented then remove the + # 'force-reload' alias + # + log_daemon_msg "Restarting $DESC" "$NAME" + do_stop + case "$?" in + 0|1) + do_start + case "$?" in + 0) log_end_msg 0 ;; + 1) log_end_msg 1 ;; # Old process is still running + *) log_end_msg 1 ;; # Failed to start + esac + ;; + *) + # Failed to stop + log_end_msg 1 + ;; + esac + ;; + *) + #echo "Usage: $SCRIPTNAME {start|stop|restart|reload|force-reload}" >&2 + echo "Usage: $SCRIPTNAME {start|stop|status|restart|force-reload}" >&2 + exit 3 + ;; +esac + +: diff --git a/ipopusagereport-0.1/usr/share/ipop-usagereport/MANIFEST.in b/ipopusagereport-0.1/usr/share/ipop-usagereport/MANIFEST.in new file mode 100644 index 0000000..0d8e19d --- /dev/null +++ b/ipopusagereport-0.1/usr/share/ipop-usagereport/MANIFEST.in @@ -0,0 +1,2 @@ +recursive-include ipop_stats/templates * +recursive-include ipop_stats/static * diff --git a/ipopusagereport-0.1/usr/share/ipop-usagereport/config/config.yml b/ipopusagereport-0.1/usr/share/ipop-usagereport/config/config.yml new file mode 100644 index 0000000..f32ffed --- /dev/null +++ b/ipopusagereport-0.1/usr/share/ipop-usagereport/config/config.yml @@ -0,0 +1,32 @@ +# http://flask.pocoo.org/docs/config/ +database_name: "usage_report" +database_uri: "mongodb://localhost:27017" +new_database: False +flask: + debug: true + testing: true +# http://docs.python.org/2/library/logging.config.html#logging-config-dictschema +logging: + version: 1 + root: + level: DEBUG + handlers: + console: + class: logging.RotatingFileHandler + stream: ext://sys.stdout + formatter: default + file: + class : logging.handlers.RotatingFileHandler + formatter: default + filename: /var/log/ipop-stat.log + maxBytes: 99999999 + backupCount: 9 + formatters: + default: + format: '%(asctime)s %(levelname)-8s %(name)-15s %(message)s' + datefmt: '%Y-%m-%d %H:%M:%S' +ratelimit: + burst: 10 # allow a burst "pool" + uuid: 60 # seconds + ipv4: 60 # seconds + ipv6: 60 # seconds diff --git a/ipopusagereport-0.1/usr/share/ipop-usagereport/config/debug.yml b/ipopusagereport-0.1/usr/share/ipop-usagereport/config/debug.yml new file mode 100644 index 0000000..7677d6c --- /dev/null +++ b/ipopusagereport-0.1/usr/share/ipop-usagereport/config/debug.yml @@ -0,0 +1,36 @@ +# http://flask.pocoo.org/docs/config/ +database_name: "usage_report" +database_uri: "mongodb://localhost:27017" +new_database: False +flask: + debug: true + testing: true +# http://docs.python.org/2/library/logging.config.html#logging-config-dictschema +logging: + version: 1 + root: + level: DEBUG + handlers: + console: + class: logging.StreamHandler + stream: ext://sys.stdout + formatter: default + file: + class : logging.handlers.RotatingFileHandler + formatter: default + filename: /var/log/ipop-stat.log + maxBytes: 9999999 + backupCount: 9 + formatters: + default: + format: '%(asctime)s %(levelname)-8s %(name)-15s %(message)s' + datefmt: '%Y-%m-%d %H:%M:%S' + loggers: + all: + level: DEBUG + handlers: [console, file] +ratelimit: + burst: 10 # allow a burst "pool" + uuid: 60 # seconds + ipv4: 60 # seconds + ipv6: 60 # seconds diff --git a/ipopusagereport-0.1/usr/share/ipop-usagereport/flask_run.py b/ipopusagereport-0.1/usr/share/ipop-usagereport/flask_run.py new file mode 100755 index 0000000..6e3b9c3 --- /dev/null +++ b/ipopusagereport-0.1/usr/share/ipop-usagereport/flask_run.py @@ -0,0 +1,23 @@ +#!/usr/bin/env python +from ipop_stats.app import create as create_app +from flask import Flask +import argparse +import os, os.path + +parser = argparse.ArgumentParser(description="Standalone test server for " + "ipop-stats") + +try: + default_config_path = os.path.abspath(os.environ["IPOP_STATS_SETTINGS"]) +except: + default_config_path = "config/debug.yml" + +parser.add_argument( + "-c", "--config", + default=default_config_path, + type=os.path.abspath, + help="the flask config file for the server" +) + +args = parser.parse_args() +create_app(**vars(args)).run(host="0.0.0.0", port=8080) diff --git a/ipopusagereport-0.1/usr/share/ipop-usagereport/ipop_stats/__init__.py b/ipopusagereport-0.1/usr/share/ipop-usagereport/ipop_stats/__init__.py new file mode 100644 index 0000000..2ae2839 --- /dev/null +++ b/ipopusagereport-0.1/usr/share/ipop-usagereport/ipop_stats/__init__.py @@ -0,0 +1 @@ +pass diff --git a/ipopusagereport-0.1/usr/share/ipop-usagereport/ipop_stats/app.py b/ipopusagereport-0.1/usr/share/ipop-usagereport/ipop_stats/app.py new file mode 100644 index 0000000..d43096f --- /dev/null +++ b/ipopusagereport-0.1/usr/share/ipop-usagereport/ipop_stats/app.py @@ -0,0 +1,37 @@ +from flask import Flask +import yaml +import os.path +import logging.config +from database import Database + +def create(config): + """http://flask.pocoo.org/docs/patterns/appfactories/""" + + app = Flask(__name__.split('.')[0]) + + # Load YAML config into app.config + if not isinstance(config, dict): + with open(os.path.join(app.instance_path, config)) as f: + config = yaml.load(f) + config.update({k.upper(): v for k, v in config["flask"].items()}) + app.config.update(config) + del config + + # Configure logging + logging.config.dictConfig(app.config["logging"]) + logger = logging.getLogger('all') + logger.info("BUILT LOGGER. Logging started") + + # Initialize database + app.database = Database(app) + + # Load blueprints + from .views.submit import submit + app.register_blueprint(submit) + + if False and app.debug: + app.logger.warning("Debug mode is on. Do not use this in production.") + from .views.debug import debug + app.register_blueprint(debug) + + return app diff --git a/ipopusagereport-0.1/usr/share/ipop-usagereport/ipop_stats/database.py b/ipopusagereport-0.1/usr/share/ipop-usagereport/ipop_stats/database.py new file mode 100644 index 0000000..0a8d636 --- /dev/null +++ b/ipopusagereport-0.1/usr/share/ipop-usagereport/ipop_stats/database.py @@ -0,0 +1,18 @@ + +import logging +import uuid +import functools +from contextlib import contextmanager + +from pymongo import MongoClient + +class Database(object): + def __init__(self, app): + self.app = app + + self.stat_mongo = MongoClient(self.app.config["database_uri"]) + logger = logging.getLogger('all') + logger.info("MongoDB Server is running at :{0}".format(self.app.config["database_uri"])) + self._db = self.stat_mongo[self.app.config["database_name"]] + self.user_collection = self._db["user"] + diff --git a/ipopusagereport-0.1/usr/share/ipop-usagereport/ipop_stats/errors.py b/ipopusagereport-0.1/usr/share/ipop-usagereport/ipop_stats/errors.py new file mode 100644 index 0000000..54ed3e8 --- /dev/null +++ b/ipopusagereport-0.1/usr/share/ipop-usagereport/ipop_stats/errors.py @@ -0,0 +1,33 @@ +from flask import jsonify +from werkzeug.exceptions import HTTPException + +# We follow the JSend spec for API errors: http://labs.omniti.com/labs/jsend + +class ApiFail(HTTPException): + """There was a problem with the data submitted, or some pre-condition of the + API call wasn't satisfied""" + def __init__(message=None, data=None, code=400, **kwargs): + data = data or kwargs + if instanceof(message, str): + data, message = message, None + if message: + data["message"] = message + + response = jsonify(status="fail", data=data) + response.status_code = status_code + HTTPException.__init__(self, message, response) + self.code = code + +class ApiError(HTTPException): + "An error occurred in processing the request, i.e. an exception was thrown" + def __init__(message, code=500, data=None, **kwargs): + data = data or kwargs + response_dict = {"status": "error", "message": message} + if code != 500: + response_dict["code"] = code + if data: + response_dict["data"] = data + response = jsonify(response_dict) + response.status_code = status_code + HTTPException.__init__(self, message, response) + self.code = code diff --git a/ipopusagereport-0.1/usr/share/ipop-usagereport/ipop_stats/views/__init__.py b/ipopusagereport-0.1/usr/share/ipop-usagereport/ipop_stats/views/__init__.py new file mode 100644 index 0000000..2ae2839 --- /dev/null +++ b/ipopusagereport-0.1/usr/share/ipop-usagereport/ipop_stats/views/__init__.py @@ -0,0 +1 @@ +pass diff --git a/ipopusagereport-0.1/usr/share/ipop-usagereport/ipop_stats/views/submit.py b/ipopusagereport-0.1/usr/share/ipop-usagereport/ipop_stats/views/submit.py new file mode 100644 index 0000000..d7e3e6e --- /dev/null +++ b/ipopusagereport-0.1/usr/share/ipop-usagereport/ipop_stats/views/submit.py @@ -0,0 +1,35 @@ +from ..errors import * +from flask import Blueprint, request, jsonify +from flask import current_app as app +import datetime +import socket +import uuid +import logging + +from pymongo import MongoClient + + +submit = Blueprint("submit", __name__, url_prefix="/api") + +@submit.route("/submit", methods=["POST"]) +def update(): + logger = logging.getLogger('all') + logger.info("Report Message Received") + data = request.json + report = {"Report": data} + obj_id = app.database.user_collection.insert_one(report) + response = jsonify(result=uuid.uuid4().hex, status="success") # TODO: what is result? + return response + +@submit.route("/") +def hello(): + return "IPOP-Usage Stat Server!" + +@submit.route("/generate_uuid") +def generate_uuid(): + """Convenience uuid generator, for clients who don't have a convenient local + generator.""" + response = jsonify(result=uuid.uuid4().hex, status="success") + response.headers["Expires"] = "-1" + response.headers["Cache-Control"] = "no-cache, no-store" + return response diff --git a/ipopusagereport-0.1/usr/share/ipop-usagereport/run.py b/ipopusagereport-0.1/usr/share/ipop-usagereport/run.py new file mode 100755 index 0000000..4d75b47 --- /dev/null +++ b/ipopusagereport-0.1/usr/share/ipop-usagereport/run.py @@ -0,0 +1,34 @@ +#!/usr/bin/env python + +from flask import Flask +from tornado.wsgi import WSGIContainer +from tornado.httpserver import HTTPServer +from tornado.ioloop import IOLoop +from ipop_stats.app import create as create_app +import argparse +import os, os.path + + +parser = argparse.ArgumentParser(description="Standalone test server for " + "ipop-stats") + +try: + default_config_path = os.path.abspath(os.environ["IPOP_STATS_SETTINGS"]) +except: + default_config_path = "config/debug.yml" + +parser.add_argument( + "-c", "--config", + default=default_config_path, + type=os.path.abspath, + help="the flask config file for the server" +) + +# Create Flask APP +args = parser.parse_args() +app = create_app(**vars(args)) #run(host="0.0.0.0", port=8080) + +# Run with Tonado +http_server = HTTPServer(WSGIContainer(app)) +http_server.listen(8081) +IOLoop.instance().start() \ No newline at end of file diff --git a/ipopusagereport-0.1/usr/share/ipop-usagereport/setup.py b/ipopusagereport-0.1/usr/share/ipop-usagereport/setup.py new file mode 100644 index 0000000..de3b226 --- /dev/null +++ b/ipopusagereport-0.1/usr/share/ipop-usagereport/setup.py @@ -0,0 +1,14 @@ +from setuptools import * + +setup( + name="ipop-stats", + version="0.0.1", + install_requires=[ + "flask>=0.10.1,<0.11", + "pymongo>=3.6,<4", + "PyYAML>=3.10,<4.0", + ], + description="Gathers anonymous usage statistics of IPOP users", + packages=find_packages(), + scripts=["bin/ipop-stats"], +) From 10ee1ecbda3dfa337bb7bf0c8725ee1511970850 Mon Sep 17 00:00:00 2001 From: gauravyeole Date: Fri, 16 Feb 2018 11:45:56 -0500 Subject: [PATCH 09/12] update address of log file --- .../usr/share/ipop-usagereport/config/config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ipopusagereport-0.1/usr/share/ipop-usagereport/config/config.yml b/ipopusagereport-0.1/usr/share/ipop-usagereport/config/config.yml index f32ffed..d0a18db 100644 --- a/ipopusagereport-0.1/usr/share/ipop-usagereport/config/config.yml +++ b/ipopusagereport-0.1/usr/share/ipop-usagereport/config/config.yml @@ -18,7 +18,7 @@ logging: file: class : logging.handlers.RotatingFileHandler formatter: default - filename: /var/log/ipop-stat.log + filename: /var/log/ipop-usagereport.log maxBytes: 99999999 backupCount: 9 formatters: From 612308da998ef5646d8b9af7a984afb2ace73a7b Mon Sep 17 00:00:00 2001 From: gauravyeole Date: Fri, 16 Feb 2018 15:41:20 -0500 Subject: [PATCH 10/12] bug fix: log file path --- ipopusagereport-0.1/usr/share/ipop-usagereport/config/debug.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ipopusagereport-0.1/usr/share/ipop-usagereport/config/debug.yml b/ipopusagereport-0.1/usr/share/ipop-usagereport/config/debug.yml index 7677d6c..ce025ba 100644 --- a/ipopusagereport-0.1/usr/share/ipop-usagereport/config/debug.yml +++ b/ipopusagereport-0.1/usr/share/ipop-usagereport/config/debug.yml @@ -18,7 +18,7 @@ logging: file: class : logging.handlers.RotatingFileHandler formatter: default - filename: /var/log/ipop-stat.log + filename: /var/log/ipop-usagereport.log maxBytes: 9999999 backupCount: 9 formatters: From 15a1ab9f2da4db75bed13f5d12da63ca41952c59 Mon Sep 17 00:00:00 2001 From: Gaurav Yeole Date: Fri, 16 Feb 2018 17:12:32 -0500 Subject: [PATCH 11/12] bug fix: add user ipopreport --- ipopusagereport-0.1/DEBIAN/postinst | 3 ++- ipopusagereport-0.1/DEBIAN/preinst | 4 ++-- ipopusagereport-0.1/etc/init.d/ipop-usagereport | 6 +++--- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/ipopusagereport-0.1/DEBIAN/postinst b/ipopusagereport-0.1/DEBIAN/postinst index b6e89b6..2ce1ea2 100755 --- a/ipopusagereport-0.1/DEBIAN/postinst +++ b/ipopusagereport-0.1/DEBIAN/postinst @@ -1,3 +1,4 @@ #!/usr/bin/env bash -service ipop-usagereport start update-rc.d ipop-usagereport defaults +service ipop-usagereport start + diff --git a/ipopusagereport-0.1/DEBIAN/preinst b/ipopusagereport-0.1/DEBIAN/preinst index e022fc7..3c58c3d 100755 --- a/ipopusagereport-0.1/DEBIAN/preinst +++ b/ipopusagereport-0.1/DEBIAN/preinst @@ -1,4 +1,4 @@ #!/usr/bin/env bash touch /var/log/ipop-usagereport.log -useradd -d /var/lib/ipop-usagereport ipop -chown --quiet ipop:ipop /var/log/ipop-usagereport.log +useradd -d /var/lib/ipop-usagereport ipopreport +chown --quiet ipopreport:ipopreport /var/log/ipop-usagereport.log diff --git a/ipopusagereport-0.1/etc/init.d/ipop-usagereport b/ipopusagereport-0.1/etc/init.d/ipop-usagereport index 5b3a17c..0cf97a7 100755 --- a/ipopusagereport-0.1/etc/init.d/ipop-usagereport +++ b/ipopusagereport-0.1/etc/init.d/ipop-usagereport @@ -27,9 +27,9 @@ do_start() # 0 if daemon has been started # 1 if daemon was already running # 2 if daemon could not be started - start-stop-daemon --start --quiet --pidfile --chuid ipop $PIDFILE --exec $DAEMON --test > /dev/null \ + start-stop-daemon --start --quiet --pidfile --chuid ipopreport $PIDFILE --exec $DAEMON --test > /dev/null \ || return 1 - start-stop-daemon --start --quiet --chuid ipop --make-pidfile --pidfile $PIDFILE --background \ + start-stop-daemon --start --quiet --chuid ipopreport --make-pidfile --pidfile $PIDFILE --background \ --startas /bin/bash -- -c "exec $DAEMON $DAEMON_ARGS > /dev/null" \ || return 2 } @@ -56,7 +56,7 @@ do_reload() { # restarting (for example, when it is sent a SIGHUP), # then implement that here. # - start-stop-daemon --stop --signal 1 --quiet --chuid ipop --pidfile $PIDFILE --name $NAME + start-stop-daemon --stop --signal 1 --quiet --chuid ipopreport --pidfile $PIDFILE --name $NAME return 0 } From 8d0691a41191133172d085d4a4814600b1cd2fbf Mon Sep 17 00:00:00 2001 From: Gaurav Yeole Date: Fri, 16 Mar 2018 12:23:23 -0400 Subject: [PATCH 12/12] update README --- README.md | 72 +++++++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 59 insertions(+), 13 deletions(-) diff --git a/README.md b/README.md index 978dea4..7bbee16 100644 --- a/README.md +++ b/README.md @@ -64,53 +64,99 @@ module][nginx limit req]. Running server (without installing as an debian package) -------------- ``` +# install MongoDB and Pymongo client sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 2930ADAE8CAF5059EE73BB4B58712A2291FA4AD5 echo "deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu xenial/mongodb-org/3.6 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-3.6.list sudo apt-get update sudo apt-get install -y mongodb-org python -m pip install pymongo + sudo apt-get install git python-pip python-flask pymongo python-yaml git clone https://github.com/ipop-project/ipop-stats.git -cd ipop-stats/ipopstat-0.15/DEBIAN +cd ipop-stats/ipopusagereport-0.1/DEBIAN sudo bash preinst -sudo passwd ipop +sudo passwd ipopreport Enter new UNIX password: ipop Retype new UNIX password: ipop passwd: password updated successfully sudo service mongod start -su ipop +su ipopreport Password:ipop -cd ../usr/share/ipop-stat +cd ../usr/share/ipop-usagereport ./run.py ``` now you can access this server through webbrowser. -http://ip_address:8080/api +http://ip_address:8081/api controller reports status info -http://ip_address:8080/api/submit +http://ip_address:8081/api/submit + database location: +``` /var/lib/mongodb/ +``` you can query database using Mongo shell as: ``` $ mongo > use usage_report -> db.user.find() // to get the data in database -> db.user.count() // to get number of documents in collection +> db.user.find() # to get the data in database +> db.user.count() # to get number of documents in collection ``` -Note for next time +Reset Database: +``` +$ mongo +> show dbs +> use usage_report +> db.dropDatabase() +``` + +Building Debian Package ------------------------------------------------ -I need to stop the ipop-stat before update. -Add the command in preinst or something like "service ipop-stat stop" +locate at the parent directory of ipopusagereport-0.1 +``` +$ cd ipopusagereport-0.1 +$ dpkg-deb --build ipopusagereport-0.1 +``` + +Installation and Runnnig ipopusagereport debian package +------------------------------------------------ +``` +sudo dpkg -i ipopusagereport-0.1.deb +sudo apt-get update +sudo apt-get -f install +``` -Issues +Start, Stop, Restart ipopusagereport service ------------------------------------------------ -For some reason, "service ipop-stat start/stop" does not work. +Start service: (make sure mongodb server is running before starting ipopusagereport) +``` +$ service mongod start +$ service ipop-usagereport start + +``` + +Stop service: +``` +$ service ipop-usagereport stop +``` + +Restart Service: +``` +$ service ipop-usagereport restart +``` + +Check status: +``` +$ service ipop-usagereport status +``` + +