burp-ui/setup.py
2021-05-12 18:08:44 +02:00

373 lines
14 KiB
Python
Executable file

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import os
import sys
from subprocess import check_output, call, STDOUT
from distutils import log
from distutils.core import Command
from setuptools import setup, find_packages
from setuptools.command.develop import develop
from setuptools.command.sdist import sdist
from setuptools.command.install import install
from setuptools.command.bdist_egg import bdist_egg
from setuptools.command.egg_info import egg_info
ROOT = os.path.join(os.path.dirname(os.path.realpath(__file__)))
DEVNULL = open(os.devnull, "wb")
# Not sure bower was a great idea...
VENDOR_TO_KEEP = [
"burpui/static/vendor/bootswatch/slate/bootstrap.min.css",
"burpui/static/vendor/bootswatch/fonts/glyphicons-halflings-regular.eot",
"burpui/static/vendor/bootswatch/fonts/glyphicons-halflings-regular.svg",
"burpui/static/vendor/bootswatch/fonts/glyphicons-halflings-regular.ttf",
"burpui/static/vendor/bootswatch/fonts/glyphicons-halflings-regular.woff",
"burpui/static/vendor/bootswatch/fonts/glyphicons-halflings-regular.woff2",
"burpui/static/vendor/nvd3/build/nv.d3.min.css",
"burpui/static/vendor/datatables.net-bs/css/dataTables.bootstrap.min.css",
"burpui/static/vendor/datatables.net-responsive-bs/css/responsive.bootstrap.min.css",
"burpui/static/vendor/datatables.net-select-bs/css/select.bootstrap.min.css",
"burpui/static/vendor/datatables.net-buttons-bs/css/buttons.bootstrap.min.css",
"burpui/static/vendor/datatables.net-fixedheader-bs/css/fixedHeader.bootstrap.min.css",
"burpui/static/vendor/jquery.fancytree/dist/skin-bootstrap/ui.fancytree.min.css",
"burpui/static/vendor/bootstrap-switch/dist/css/bootstrap3/bootstrap-switch.min.css",
"burpui/static/vendor/angular-ui-select/dist/select.min.css",
"burpui/static/vendor/jquery/dist/jquery.min.js",
"burpui/static/vendor/jquery-ui/jquery-ui.min.js",
"burpui/static/vendor/bootstrap/dist/js/bootstrap.min.js",
"burpui/static/vendor/typeahead.js/dist/typeahead.jquery.min.js",
"burpui/static/vendor/d3/d3.min.js",
"burpui/static/vendor/nvd3/build/nv.d3.min.js",
"burpui/static/vendor/datatables.net/js/jquery.dataTables.min.js",
"burpui/static/vendor/datatables.net-bs/js/dataTables.bootstrap.min.js",
"burpui/static/vendor/datatables.net-responsive/js/dataTables.responsive.min.js",
"burpui/static/vendor/datatables.net-responsive-bs/js/responsive.bootstrap.min.js",
"burpui/static/vendor/datatables.net-select/js/dataTables.select.min.js",
"burpui/static/vendor/datatables.net-buttons/js/dataTables.buttons.min.js",
"burpui/static/vendor/datatables.net-buttons-bs/js/buttons.bootstrap.min.js",
"burpui/static/vendor/datatables.net-fixedheader/js/dataTables.fixedHeader.min.js",
"burpui/static/vendor/jquery.floatThead/dist/jquery.floatThead.min.js",
"burpui/static/vendor/jquery.fancytree/dist/jquery.fancytree-all.min.js",
"burpui/static/vendor/jquery-file-download/src/Scripts/jquery.fileDownload.js",
"burpui/static/vendor/lodash/dist/lodash.min.js",
"burpui/static/vendor/angular/angular.min.js",
"burpui/static/vendor/angular-route/angular-route.min.js",
"burpui/static/vendor/angular-sanitize/angular-sanitize.min.js",
"burpui/static/vendor/angular-resource/angular-resource.min.js",
"burpui/static/vendor/angular-animate/angular-animate.min.js",
"burpui/static/vendor/bootstrap-switch/dist/js/bootstrap-switch.min.js",
"burpui/static/vendor/angular-bootstrap-switch/dist/angular-bootstrap-switch.min.js",
"burpui/static/vendor/angular-ui-select/dist/select.min.js",
"burpui/static/vendor/angular-strap/dist/angular-strap.min.js",
"burpui/static/vendor/angular-strap/dist/angular-strap.tpl.min.js",
"burpui/static/vendor/angular-onbeforeunload/build/angular-onbeforeunload.js",
"burpui/static/vendor/angular-datatables-0.6.2/dist/angular-datatables.min.js",
"burpui/static/vendor/angular-highlightjs/build/angular-highlightjs.min.js",
"burpui/static/vendor/moment/min/moment.min.js",
"burpui/static/vendor/moment/locale/fr.js",
"burpui/static/vendor/moment/locale/es.js",
"burpui/static/vendor/moment/locale/it.js",
"burpui/static/vendor/moment-timezone/builds/moment-timezone-with-data-10-year-range.min.js",
"burpui/static/vendor/angular-ui-calendar/src/calendar.js",
"burpui/static/vendor/fullcalendar/dist/fullcalendar.min.css",
"burpui/static/vendor/fullcalendar/dist/fullcalendar.print.min.css",
"burpui/static/vendor/fullcalendar/dist/fullcalendar.min.js",
"burpui/static/vendor/fullcalendar/dist/gcal.min.js",
"burpui/static/vendor/fullcalendar/dist/locale/fr.js",
"burpui/static/vendor/fullcalendar/dist/locale/es.js",
"burpui/static/vendor/fullcalendar/dist/locale/it.js",
"burpui/static/vendor/angular-bootstrap/ui-bootstrap.min.js",
"burpui/static/vendor/angular-bootstrap/ui-bootstrap-tpls.min.js",
"burpui/static/vendor/components-font-awesome/css/font-awesome.min.css",
"burpui/static/vendor/components-font-awesome/fonts/FontAwesome.otf",
"burpui/static/vendor/components-font-awesome/fonts/fontawesome-webfont.eot",
"burpui/static/vendor/components-font-awesome/fonts/fontawesome-webfont.svg",
"burpui/static/vendor/components-font-awesome/fonts/fontawesome-webfont.ttf",
"burpui/static/vendor/components-font-awesome/fonts/fontawesome-webfont.woff",
"burpui/static/vendor/components-font-awesome/fonts/fontawesome-webfont.woff2",
"burpui/static/vendor/socket.io-client/dist/socket.io.js",
"burpui/static/vendor/js-cookie/src/js.cookie.js",
"burpui/static/vendor/ace-builds/src-min-noconflict/ace.js",
"burpui/static/vendor/ace-builds/src-min-noconflict/mode-json.js",
"burpui/static/vendor/ace-builds/src-min-noconflict/worker-json.js",
"burpui/static/vendor/ace-builds/src-min-noconflict/theme-ambiance.js",
]
for p in VENDOR_TO_KEEP:
if not os.path.exists(p):
log.info("!! missing: {}".format(p))
class DevelopWithBuildStatic(develop):
def install_for_development(self):
self.run_command("build_static")
return develop.install_for_development(self)
class EggWithBuildStatic(egg_info):
def initialize_options(self):
self.run_command("build_static")
return egg_info.initialize_options(self)
class BdistWithBuildStatic(bdist_egg):
def initialize_options(self):
self.run_command("build_static")
return bdist_egg.initialize_options(self)
class SdistWithBuildStatic(sdist):
def make_distribution(self):
self.run_command("build_static")
return sdist.make_distribution(self)
class PyTest(Command):
user_options = []
description = "Run tests"
def initialize_options(self):
pass
def finalize_options(self):
pass
def run(self):
try:
errno = call(["make", "test"])
raise SystemExit(errno)
except OSError:
log.error("Looks like the tools to run the tests are missing")
class BuildStatic(Command):
user_options = []
description = "Install bower dependencies"
def initialize_options(self):
pass
def finalize_options(self):
pass
def run(self):
os.chdir(ROOT)
log.info("compiling translations")
call(
"{} ./burpui -m manage compile-translation".format(sys.executable).split(),
stderr=DEVNULL,
)
log.info("getting revision number")
rev = "stable"
ci = os.getenv("CI")
commit = os.getenv("CI_COMMIT_SHA")
if (
not ci
and os.path.exists(".git")
and call("which git", shell=True, stderr=STDOUT, stdout=DEVNULL) == 0
):
try:
branch = check_output("git rev-parse HEAD", shell=True).rstrip()
ver = open(os.path.join("burpui", "VERSION")).read().rstrip()
log.info("version: {}".format(ver))
if branch and "dev" in ver:
rev = branch
try:
log.info("revision: {}".format(rev))
with open("burpui/RELEASE", "wb") as f:
f.write(rev)
except:
log.error("Unable to create release file")
except:
pass
elif ci:
try:
ver = open(os.path.join("burpui", "VERSION")).read().rstrip()
if "dev" in ver:
rev = commit
try:
with open("burpui/RELEASE", "wb") as f:
f.write(rev)
except:
pass
except:
pass
else:
log.info("using upstream revision")
keep = VENDOR_TO_KEEP
dirlist = []
for dirname, subdirs, files in os.walk("burpui/static/vendor"):
for filename in files:
path = os.path.join(dirname, filename)
_, ext = os.path.splitext(path)
if (
os.path.isfile(path)
and path not in keep
and filename not in ["bower.json", "package.json"]
):
if (rev == "stable" and ext == ".map") or ext != ".map":
os.unlink(path)
elif os.path.isdir(path):
dirlist.append(path)
dirlist.sort(reverse=True)
for d in dirlist:
if os.path.isdir(d) and not os.listdir(d):
os.rmdir(d)
class CustomInstall(install):
def run(self):
self.run_command("build_static")
install.run(self)
def readme():
"""
Function used to skip the screenshots part
"""
desc = ""
cpt = 0
skip = False
with open(os.path.join(ROOT, "README.rst")) as f:
for line in f.readlines():
if line.rstrip() == "Screenshots":
skip = True
if skip:
cpt += 1
if cpt > 6:
skip = False
if skip:
continue
desc += line
return desc
sys.path.insert(0, os.path.join(ROOT))
from burpui.desc import (
__author__,
__author_email__,
__description__,
__url__,
__title__,
) # noqa
name = __title__
author = __author__
author_email = __author_email__
description = __description__
url = __url__
with open(os.path.join(ROOT, "requirements.txt")) as f:
requires = [x.strip() for x in f if x.strip()]
dev_requires = ["flake8", "pylint", "black"]
test_requires = [
"pytest",
"pytest-cov",
"pytest-flask",
"pytest-mock",
"nose",
"coverage",
"mock",
"mockredispy",
"Flask-Session",
"Celery",
"redis",
"Flask-SQLAlchemy",
"Flask-Migrate",
"sqlalchemy_utils",
]
datadir = os.path.join("share", "burpui")
confdir = os.path.join(datadir, "etc")
contrib = os.path.join(datadir, "contrib")
migrations = [
(
os.path.join(datadir, root),
[os.path.join(root, f) for f in files if not f.endswith(".pyc")],
)
for root, dirs, files in os.walk("migrations")
]
setup(
name=name,
version=open(os.path.join(ROOT, "burpui", "VERSION")).read().rstrip(),
description=description,
long_description=readme(),
license=open(os.path.join(ROOT, "LICENSE")).readline().rstrip(),
author=author,
author_email=author_email,
url=url,
keywords="burp web ui backup monitoring",
packages=find_packages(),
include_package_data=True,
package_data={
"static": ["burpui/static/*"],
"templates": ["burpui/templates/*"],
"VERSION": ["burpui/VERSION"],
},
entry_points={
"console_scripts": [
"burp-ui=burpui.__main__:server",
"bui-celery=burpui.__main__:celery",
"bui-manage=burpui.__main__:manage",
"bui-agent-legacy=burpui.__main__:agent",
"bui-monitor=burpui.__main__:monitor",
"burp-ui-legacy=burpui.__main__:legacy",
],
},
data_files=[
(confdir, [os.path.join(confdir, "burpui.sample.cfg")]),
(os.path.join(contrib, "centos"), ["contrib/centos/init.sh"]),
(os.path.join(contrib, "freebsd"), ["contrib/freebsd/gunicorn.rc"]),
(os.path.join(contrib, "gunicorn"), ["contrib/gunicorn/burpui_gunicorn.py"]),
(
os.path.join(contrib, "systemd"),
[
"contrib/systemd/bui-agent.service",
"contrib/systemd/bui-celery.service",
"contrib/systemd/bui-celery-beat.service",
"contrib/systemd/bui-gunicorn.service",
"contrib/systemd/bui-monitor.service",
"contrib/systemd/bui-websocket.service",
],
),
]
+ migrations,
python_requires=">=3.6",
install_requires=requires,
extras_require={
"ldap_authentication": ["ldap3"],
"gunicorn": ["gunicorn"],
"gunicorn-extra": ["redis"],
"ci": test_requires,
"dev": dev_requires,
"celery": ["Celery>=4.3", "redis"],
"sql": ["Flask-SQLAlchemy", "Flask-Migrate>=2.1.0", "sqlalchemy-utils"],
"limit": ["Flask-Limiter", "redis"],
"websocket": ["flask-socketio", "redis", "gevent-websocket"],
"rtd": ["sphinxcontrib-httpdomain==1.6.1"],
},
tests_require=test_requires,
classifiers=[
"Framework :: Flask",
"Intended Audience :: System Administrators",
"Natural Language :: English",
"License :: OSI Approved :: BSD License",
"Operating System :: POSIX :: Linux",
"Programming Language :: Python",
"Programming Language :: Python :: 3.6",
"Topic :: System :: Archiving :: Backup",
"Topic :: System :: Monitoring",
],
cmdclass={
"build_static": BuildStatic,
"develop": DevelopWithBuildStatic,
"sdist": SdistWithBuildStatic,
"install": CustomInstall,
"bdist_egg": BdistWithBuildStatic,
"egg_info": EggWithBuildStatic,
},
)