net-misc/gns3-gui: bump to version 2.2.8
authorAaron Bauman <bman@gentoo.org>
Sun, 24 May 2020 22:33:53 +0000 (18:33 -0400)
committerAaron Bauman <bman@gentoo.org>
Sun, 24 May 2020 22:33:53 +0000 (18:33 -0400)
* Fix all the crazy dep changes
* Add upstream patch to remove dev-python/raven dep
* Takeover maintainership
* Only support py3.7 and py3.8 to minimize conditionals

Closes: https://bugs.gentoo.org/688016
Closes: https://bugs.gentoo.org/712964
Closes: https://bugs.gentoo.org/714840
Closes: https://bugs.gentoo.org/718444

Signed-off-by: Aaron Bauman <bman@gentoo.org>
net-misc/gns3-server/Manifest
net-misc/gns3-server/files/gns3-server-rmraven.patch [new file with mode: 0644]
net-misc/gns3-server/gns3-server-2.2.8.ebuild [new file with mode: 0644]
net-misc/gns3-server/metadata.xml

index cd72eb35b74d3b820b29ea4eaaf3b9d3298762d3..0ce776a9a169433dbb29974b25569c7ed847c27b 100644 (file)
@@ -1 +1,2 @@
 DIST gns3-server-2.1.21.tar.gz 1713993 BLAKE2B 719306e05fd86b22b7413a60eb6fccc0d16a25cc3a34850344124433d0871bce5e85b195386615c1eaebf083295775de4031eee93c477bb8bd07078b839b2ee1 SHA512 3aeb7609f0fad3cf239a4de24affb124b5bed4a3af78c6a6e287a1b771e206c476849a04cf4ab731ce4923ca072d66928068fec5720bc0eb81d6819ed63f71c8
+DIST gns3-server-2.2.8.tar.gz 11248484 BLAKE2B 14843a86c0348b92e9c54af5c966f46249f72ef9aa74fc8cda27f3209d00d2e129df98c75f301d8fe2046fb1c04f3e24e163adbead787fed2c1d364c50228902 SHA512 3394d368c986ce8378739bdbc15359c46bdf787a38e18bae9035653dd6dc6683973bf1b7952137189f57fd83074f3d5ea6040f5d7a1d0503f6cf21d2835cd693
diff --git a/net-misc/gns3-server/files/gns3-server-rmraven.patch b/net-misc/gns3-server/files/gns3-server-rmraven.patch
new file mode 100644 (file)
index 0000000..612a16a
--- /dev/null
@@ -0,0 +1,194 @@
+From c63aad8eca00bca2ec48fcb667bbdfd80a22a7ab Mon Sep 17 00:00:00 2001
+From: grossmj <grossmj@gns3.net>
+Date: Tue, 19 May 2020 15:48:53 +0930
+Subject: [PATCH] Replace Raven by Sentry SDK. Fixes
+ https://github.com/GNS3/gns3-server/issues/1758
+
+---
+ gns3server/crash_report.py | 93 ++++++++++++++++++++------------------
+ gns3server/web/route.py    |  2 +-
+ requirements.txt           |  3 +-
+ 3 files changed, 53 insertions(+), 45 deletions(-)
+
+diff --git a/gns3server/crash_report.py b/gns3server/crash_report.py
+index 87e22a213..7f92d38e6 100644
+--- a/gns3server/crash_report.py
++++ b/gns3server/crash_report.py
+@@ -15,22 +15,21 @@
+ # You should have received a copy of the GNU General Public License
+ # along with this program.  If not, see <http://www.gnu.org/licenses/>.
++try:
++    import sentry_sdk
++    from sentry_sdk.integrations.aiohttp import AioHttpIntegration
++    SENTRY_SDK_AVAILABLE = True
++except ImportError:
++    # Sentry SDK is not installed with deb package in order to simplify packaging
++    SENTRY_SDK_AVAILABLE = False
++
+ import os
+ import sys
+ import struct
+-import aiohttp
+ import platform
+ import locale
+ import distro
+-try:
+-    import raven
+-    from raven.transport.http import HTTPTransport
+-    RAVEN_AVAILABLE = True
+-except ImportError:
+-    # raven is not installed with deb package in order to simplify packaging
+-    RAVEN_AVAILABLE = False
+-
+ from .version import __version__, __version_info__
+ from .config import Config
+ from .utils.get_resource import get_resource
+@@ -59,48 +58,45 @@ class CrashReport:
+     """
+     DSN = "https://dbfb677c73304b1286aef33dfbb749c6:93b9a937d4884426a1b15f37536fcd94@o19455.ingest.sentry.io/38482"
+-    if hasattr(sys, "frozen"):
+-        cacert = get_resource("cacert.pem")
+-        if cacert is not None and os.path.isfile(cacert):
+-            DSN += "?ca_certs={}".format(cacert)
+-        else:
+-            log.warning("The SSL certificate bundle file '{}' could not be found".format(cacert))
+     _instance = None
+     def __init__(self):
+-        self._client = None
+-        # We don't want sentry making noise if an error is catched when you don't have internet
++        # We don't want sentry making noise if an error is caught when you don't have internet
+         sentry_errors = logging.getLogger('sentry.errors')
+         sentry_errors.disabled = True
+         sentry_uncaught = logging.getLogger('sentry.errors.uncaught')
+         sentry_uncaught.disabled = True
+-    def capture_exception(self, request=None):
+-        if not RAVEN_AVAILABLE:
+-            return
+-        if os.path.exists(".git"):
+-            log.warning("A .git directory exist crash report is turn off for developers")
+-            return
+-        server_config = Config.instance().get_section_config("Server")
+-        if server_config.getboolean("report_errors"):
+-            if self._client is None:
+-                self._client = raven.Client(CrashReport.DSN, release=__version__, raise_send_errors=True, transport=HTTPTransport)
+-            if request is not None:
+-                self._client.http_context({
+-                    "method": request.method,
+-                    "url": request.path,
+-                    "data": request.json,
+-                })
+-
+-            context = {
++        if SENTRY_SDK_AVAILABLE:
++            cacert = None
++            if hasattr(sys, "frozen"):
++                cacert_resource = get_resource("cacert.pem")
++                if cacert_resource is not None and os.path.isfile(cacert_resource):
++                    cacert = cacert_resource
++                else:
++                    log.error("The SSL certificate bundle file '{}' could not be found".format(cacert_resource))
++
++            sentry_sdk.init(dsn=CrashReport.DSN,
++                            release=__version__,
++                            ca_certs=cacert,
++                            integrations=[AioHttpIntegration()])
++
++            tags = {
+                 "os:name": platform.system(),
+                 "os:release": platform.release(),
+                 "os:win_32": " ".join(platform.win32_ver()),
+                 "os:mac": "{} {}".format(platform.mac_ver()[0], platform.mac_ver()[2]),
+                 "os:linux": " ".join(distro.linux_distribution()),
+-                "aiohttp:version": aiohttp.__version__,
++
++            }
++
++            with sentry_sdk.configure_scope() as scope:
++                for key, value in tags.items():
++                    scope.set_tag(key, value)
++
++            extra_context = {
+                 "python:version": "{}.{}.{}".format(sys.version_info[0],
+                                                     sys.version_info[1],
+                                                     sys.version_info[2]),
+@@ -113,8 +109,8 @@ def capture_exception(self, request=None):
+                 # add locale information
+                 try:
+                     language, encoding = locale.getlocale()
+-                    context["locale:language"] = language
+-                    context["locale:encoding"] = encoding
++                    extra_context["locale:language"] = language
++                    extra_context["locale:encoding"] = encoding
+                 except ValueError:
+                     pass
+@@ -124,17 +120,28 @@ def capture_exception(self, request=None):
+                 if os.path.isfile(gns3vm_version):
+                     try:
+                         with open(gns3vm_version) as fd:
+-                            context["gns3vm:version"] = fd.readline().strip()
++                            extra_context["gns3vm:version"] = fd.readline().strip()
+                     except OSError:
+                         pass
+-            self._client.tags_context(context)
++            with sentry_sdk.configure_scope() as scope:
++                for key, value in extra_context.items():
++                    scope.set_extra(key, value)
++
++    def capture_exception(self):
++        if not SENTRY_SDK_AVAILABLE:
++            return
++        if os.path.exists(".git"):
++            log.warning(".git directory detected, crash reporting is turned off for developers.")
++            return
++        server_config = Config.instance().get_section_config("Server")
++        if server_config.getboolean("report_errors"):
++
+             try:
+-                report = self._client.captureException()
++                sentry_sdk.capture_exception()
++                log.info("Crash report sent with event ID: {}".format(sentry_sdk.last_event_id()))
+             except Exception as e:
+                 log.error("Can't send crash report to Sentry: {}".format(e))
+-                return
+-            log.info("Crash report sent with event ID: {}".format(self._client.get_ident(report)))
+     @classmethod
+     def instance(cls):
+diff --git a/gns3server/web/route.py b/gns3server/web/route.py
+index d1275250d..c70dbbc3a 100644
+--- a/gns3server/web/route.py
++++ b/gns3server/web/route.py
+@@ -242,7 +242,7 @@ async def control_schema(request):
+                     log.error("Uncaught exception detected: {type}".format(type=type(e)), exc_info=1)
+                     response = Response(request=request, route=route)
+                     response.set_status(500)
+-                    CrashReport.instance().capture_exception(request)
++                    CrashReport.instance().capture_exception()
+                     exc_type, exc_value, exc_tb = sys.exc_info()
+                     lines = traceback.format_exception(exc_type, exc_value, exc_tb)
+                     if api_version is not None:
+diff --git a/requirements.txt b/requirements.txt
+index 57fbb7938..0af9e0d68 100644
+--- a/requirements.txt
++++ b/requirements.txt
+@@ -4,9 +4,10 @@ jsonschema==2.6.0; python_version < '3.8'  # pyup: ignore
+ aiohttp==3.6.2
+ aiohttp-cors==0.7.0
+ aiofiles==0.4.0
++aiocontextvars==0.2.2
+ async_generator>=1.10
+ Jinja2>=2.7.3
+-raven>=5.23.0
++sentry-sdk>=0.14.4
+ psutil==5.6.6
+ async-timeout==3.0.1
+ distro>=1.3.0
diff --git a/net-misc/gns3-server/gns3-server-2.2.8.ebuild b/net-misc/gns3-server/gns3-server-2.2.8.ebuild
new file mode 100644 (file)
index 0000000..ed01d69
--- /dev/null
@@ -0,0 +1,71 @@
+# Copyright 1999-2020 Gentoo Authors
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+PYTHON_COMPAT=( python3_{7,8} )
+
+inherit distutils-r1
+
+DESCRIPTION="GNS3 server to asynchronously manage emulators"
+HOMEPAGE="https://www.gns3.net/"
+SRC_URI="https://github.com/GNS3/${PN}/archive/v${PV}.tar.gz -> ${P}.tar.gz"
+
+LICENSE="GPL-3+"
+SLOT="0"
+KEYWORDS="~amd64 ~x86"
+
+RDEPEND="
+       >=app-emulation/dynamips-0.2.18
+       >=dev-python/aiofiles-0.4.0[${PYTHON_USEDEP}]
+       >=dev-python/aiohttp-3.6.2[${PYTHON_USEDEP}]
+       >=dev-python/aiohttp-cors-0.7.0-r1[${PYTHON_USEDEP}]
+       >=dev-python/async_generator-1.10[${PYTHON_USEDEP}]
+       >=dev-python/async_timeout-3.0.1[${PYTHON_USEDEP}]
+       >=dev-python/jinja-2.7.3[${PYTHON_USEDEP}]
+       $(python_gen_cond_dep '>=dev-python/jsonschema-3.2.0:=[${PYTHON_USEDEP}]' 'python3_8')
+       $(python_gen_cond_dep '<=dev-python/jsonschema-2.6.0:=[${PYTHON_USEDEP}]' 'python3_7')
+       >=dev-python/psutil-5.7.0[${PYTHON_USEDEP}]
+       dev-python/py-cpuinfo[${PYTHON_USEDEP}]
+       >=dev-python/sentry-sdk-0.14.4[${PYTHON_USEDEP}]
+       >=dev-python/yarl-1.4.2[${PYTHON_USEDEP}]
+       >=net-misc/ubridge-0.9.14
+"
+DEPEND="dev-python/setuptools[${PYTHON_USEDEP}]"
+
+PATCHES=( "${FILESDIR}/gns3-server-rmraven.patch" )
+
+src_prepare() {
+       default
+
+       # newer psutils is fine
+       sed -i -e '/psutil==5.6.6/d' requirements.txt || die "fixing requirements failed"
+
+       # We don't support <py3.7
+       sed -i -e '/aiocontextvars==0.2.2/d' requirements.txt || die "fixing requirements failed"
+       sed -i -e '/yarl==1.3.0/d' requirements.txt || die "fixing requirements failed 2"
+
+       #Remove Pre-built busybox binary
+       rm gns3server/compute/docker/resources/bin/busybox || die
+
+       # Package installs 'tests' package which is forbidden
+       rm -rf tests || die
+       eapply_user
+}
+
+python_install() {
+       distutils-r1_python_install
+
+       mkdir -p "${D}$(python_get_sitedir)/gns3server/compute/docker/resources/bin" || die
+       ln -s /bin/busybox "${D}$(python_get_sitedir)/gns3server/compute/docker/resources/bin/busybox" || die
+}
+
+pkg_postinst() {
+       elog "net-misc/gns3-server has several optional packages that must be merged manually for additional functionality."
+       elog ""
+       elog "The following is a list of packages that can be added:"
+       elog "app-emulation/qemu, app-emulation/virtualbox"
+       elog "app-emulation/docker and net-analyzer/wireshark"
+       elog ""
+       elog "The following packages are currently unsupported:"
+       elog "iouyap and vpcs"
+}
index e4aa7df0de5ae26d909c0ea0376f58262ab6f21f..09439c8762b5bc22fa3eb81beddeec0b7b12778c 100644 (file)
@@ -2,12 +2,8 @@
 <!DOCTYPE pkgmetadata SYSTEM "http://www.gentoo.org/dtd/metadata.dtd">
 <pkgmetadata>
        <maintainer type="person">
-               <email>onigino@protonmail.com</email>
-               <name>Gino McCarty</name>
-       </maintainer>
-       <maintainer type="project">
-               <email>proxy-maint@gentoo.org</email>
-               <name>Proxy Maintainers</name>
+               <email>bman@gentoo.org</email>
+               <name>Aaron Bauman</name>
        </maintainer>
        <upstream>
                <remote-id type="sourceforge">gns-3</remote-id>