summaryrefslogtreecommitdiff
path: root/net-misc/gns3-gui/files/gns3-gui-rmraven.patch
blob: 9a8be4e624959cb55ea8cb5ace0cd069067062e3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
From 2ea1946c0f83672f5289edcce207a8d2de03cc43 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

---
 gns3/crash_report.py | 111 +++++++++++++++++++++++++------------------
 requirements.txt     |   2 +-
 2 files changed, 66 insertions(+), 47 deletions(-)

diff --git a/gns3/crash_report.py b/gns3/crash_report.py
index a6a555fd5..dfbb9fc46 100644
--- a/gns3/crash_report.py
+++ b/gns3/crash_report.py
@@ -23,12 +23,11 @@
 import distro
 
 try:
-    import raven
-    from raven.transport.http import HTTPTransport
-    RAVEN_AVAILABLE = True
+    import sentry_sdk
+    SENTRY_SDK_AVAILABLE = True
 except ImportError:
-    # raven is not installed with deb package in order to simplify packaging
-    RAVEN_AVAILABLE = False
+    # Sentry SDK is not installed with deb package in order to simplify packaging
+    SENTRY_SDK_AVAILABLE = False
 
 from .utils.get_resource import get_resource
 from .version import __version__, __version_info__
@@ -69,49 +68,50 @@ def __init__(self):
         sentry_uncaught = logging.getLogger('sentry.errors.uncaught')
         sentry_uncaught.disabled = True
 
-    def captureException(self, exception, value, tb):
-        from .local_server import LocalServer
-        from .local_config import LocalConfig
-        from .controller import Controller
-        from .compute_manager import ComputeManager
-
-        local_server = LocalServer.instance().localServerSettings()
-        if local_server["report_errors"]:
-            if not RAVEN_AVAILABLE:
-                return
-
-            if os.path.exists(LocalConfig.instance().runAsRootPath()):
-                log.warning("User has run application as root. Crash reports are disabled.")
-                sys.exit(1)
-                return
+        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))
 
-            if os.path.exists(".git"):
-                log.warning("A .git directory exist crash report is turn off for developers. Instant exit")
-                sys.exit(1)
-                return
+            sentry_sdk.init(dsn=CrashReport.DSN,
+                            release=__version__,
+                            ca_certs=cacert)
 
-            if hasattr(exception, "fingerprint"):
-                client = raven.Client(CrashReport.DSN, release=__version__, fingerprint=['{{ default }}', exception.fingerprint], transport=HTTPTransport)
-            else:
-                client = raven.Client(CrashReport.DSN, release=__version__, transport=HTTPTransport)
-            context = {
+            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()),
+
+            }
+
+            self._add_qt_information(tags)
+
+            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]),
                 "python:bit": struct.calcsize("P") * 8,
                 "python:encoding": sys.getdefaultencoding(),
-                "python:frozen": "{}".format(hasattr(sys, "frozen")),
+                "python:frozen": "{}".format(hasattr(sys, "frozen"))
             }
 
             # extra controller and compute information
-            extra_context = {"controller:version": Controller.instance().version(),
-                             "controller:host": Controller.instance().host(),
-                             "controller:connected": Controller.instance().connected()}
+            from .controller import Controller
+            from .compute_manager import ComputeManager
+            extra_context["controller:version"] = Controller.instance().version()
+            extra_context["controller:host"] = Controller.instance().host()
+            extra_context["controller:connected"] = Controller.instance().connected()
+
             for index, compute in enumerate(ComputeManager.instance().computes()):
                 extra_context["compute{}:id".format(index)] = compute.id()
                 extra_context["compute{}:name".format(index)] = compute.name(),
@@ -120,27 +120,46 @@ def captureException(self, exception, value, tb):
                 extra_context["compute{}:platform".format(index)] = compute.capabilities().get("platform")
                 extra_context["compute{}:version".format(index)] = compute.capabilities().get("version")
 
-            context = self._add_qt_information(context)
-            client.tags_context(context)
-            client.extra_context(extra_context)
+            with sentry_sdk.configure_scope() as scope:
+                for key, value in extra_context.items():
+                    scope.set_extra(key, value)
+
+    def captureException(self, exception, value, tb):
+        from .local_server import LocalServer
+        from .local_config import LocalConfig
+
+        local_server = LocalServer.instance().localServerSettings()
+        if local_server["report_errors"]:
+            if not SENTRY_SDK_AVAILABLE:
+                return
+
+            if os.path.exists(LocalConfig.instance().runAsRootPath()):
+                log.warning("User is running application as root. Crash reports disabled.")
+                sys.exit(1)
+                return
+
+            if os.path.exists(".git"):
+                log.warning("A .git directory exists, crash reporting is turned off for developers.")
+                sys.exit(1)
+                return
+
             try:
-                report = client.captureException((exception, value, tb))
+                sentry_sdk.capture_exception((exception, value, tb))
+                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.debug("Crash report sent with event ID: {}".format(client.get_ident(report)))
 
-    def _add_qt_information(self, context):
+    def _add_qt_information(self, tags):
+
         try:
             from .qt import QtCore
             from .qt import sip
         except ImportError:
-            return context
-        context["psutil:version"] = psutil.__version__
-        context["pyqt:version"] = QtCore.PYQT_VERSION_STR
-        context["qt:version"] = QtCore.QT_VERSION_STR
-        context["sip:version"] = sip.SIP_VERSION_STR
-        return context
+            return tags
+        tags["pyqt:version"] = QtCore.PYQT_VERSION_STR
+        tags["qt:version"] = QtCore.QT_VERSION_STR
+        tags["sip:version"] = sip.SIP_VERSION_STR
+        return tags
 
     @classmethod
     def instance(cls):
diff --git a/requirements.txt b/requirements.txt
index 99e803f1b..abd6cc7c9 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -1,5 +1,5 @@
 jsonschema==3.2.0; python_version >= '3.8'  # pyup: ignore
 jsonschema==2.6.0; python_version < '3.8'  # pyup: ignore
-raven>=5.23.0
+sentry-sdk>=0.14.4
 psutil==5.6.6
 distro>=1.3.0