netbox-atlassian 0.1.0__py3-none-any.whl → 0.2.1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- netbox_atlassian/__init__.py +2 -1
- netbox_atlassian/atlassian_client.py +22 -7
- netbox_atlassian/templates/netbox_atlassian/device_tab.html +5 -5
- netbox_atlassian/templates/netbox_atlassian/vm_tab.html +5 -5
- {netbox_atlassian-0.1.0.dist-info → netbox_atlassian-0.2.1.dist-info}/METADATA +29 -5
- netbox_atlassian-0.2.1.dist-info/RECORD +13 -0
- netbox_atlassian-0.1.0.dist-info/RECORD +0 -13
- {netbox_atlassian-0.1.0.dist-info → netbox_atlassian-0.2.1.dist-info}/WHEEL +0 -0
- {netbox_atlassian-0.1.0.dist-info → netbox_atlassian-0.2.1.dist-info}/top_level.txt +0 -0
netbox_atlassian/__init__.py
CHANGED
|
@@ -7,7 +7,7 @@ Searches by configurable fields (hostname, serial, role, etc.) with OR logic.
|
|
|
7
7
|
|
|
8
8
|
from netbox.plugins import PluginConfig
|
|
9
9
|
|
|
10
|
-
__version__ = "0.1
|
|
10
|
+
__version__ = "0.2.1"
|
|
11
11
|
|
|
12
12
|
|
|
13
13
|
class AtlassianConfig(PluginConfig):
|
|
@@ -31,6 +31,7 @@ class AtlassianConfig(PluginConfig):
|
|
|
31
31
|
"jira_url": "", # e.g., "https://jira.example.com"
|
|
32
32
|
"jira_username": "",
|
|
33
33
|
"jira_password": "", # or API token
|
|
34
|
+
"jira_token": "", # Personal Access Token (PAT) - preferred for on-prem
|
|
34
35
|
"jira_verify_ssl": True,
|
|
35
36
|
# Confluence settings (on-prem)
|
|
36
37
|
"confluence_url": "", # e.g., "https://confluence.example.com"
|
|
@@ -44,6 +44,7 @@ class AtlassianClient:
|
|
|
44
44
|
self.jira_url = self.config.get("jira_url", "").rstrip("/")
|
|
45
45
|
self.jira_username = self.config.get("jira_username", "")
|
|
46
46
|
self.jira_password = self.config.get("jira_password", "")
|
|
47
|
+
self.jira_token = self.config.get("jira_token", "") # Personal Access Token
|
|
47
48
|
self.jira_verify_ssl = self.config.get("jira_verify_ssl", True)
|
|
48
49
|
|
|
49
50
|
# Confluence settings
|
|
@@ -98,13 +99,24 @@ class AtlassianClient:
|
|
|
98
99
|
session = self._get_session()
|
|
99
100
|
|
|
100
101
|
try:
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
102
|
+
# Use PAT (Bearer token) if available, otherwise basic auth
|
|
103
|
+
if self.jira_token:
|
|
104
|
+
headers = {"Authorization": f"Bearer {self.jira_token}"}
|
|
105
|
+
response = session.get(
|
|
106
|
+
url,
|
|
107
|
+
headers=headers,
|
|
108
|
+
params=params,
|
|
109
|
+
verify=self.jira_verify_ssl,
|
|
110
|
+
timeout=self.timeout,
|
|
111
|
+
)
|
|
112
|
+
else:
|
|
113
|
+
response = session.get(
|
|
114
|
+
url,
|
|
115
|
+
auth=self._get_jira_auth(),
|
|
116
|
+
params=params,
|
|
117
|
+
verify=self.jira_verify_ssl,
|
|
118
|
+
timeout=self.timeout,
|
|
119
|
+
)
|
|
108
120
|
response.raise_for_status()
|
|
109
121
|
return response.json()
|
|
110
122
|
except requests.exceptions.RequestException as e:
|
|
@@ -322,6 +334,9 @@ class AtlassianClient:
|
|
|
322
334
|
if not self.jira_url:
|
|
323
335
|
return False, "Jira URL not configured"
|
|
324
336
|
|
|
337
|
+
if not self.jira_token and not self.jira_username:
|
|
338
|
+
return False, "Jira credentials not configured (need token or username/password)"
|
|
339
|
+
|
|
325
340
|
result = self._jira_request("myself")
|
|
326
341
|
if result:
|
|
327
342
|
return True, f"Connected as {result.get('displayName', result.get('name', 'Unknown'))}"
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
<i class="mdi mdi-magnify"></i>
|
|
10
10
|
<strong>Searching for:</strong>
|
|
11
11
|
{% for term in search_terms %}
|
|
12
|
-
<span class="badge bg-
|
|
12
|
+
<span class="badge bg-info text-white ms-1">{{ term }}</span>{% if not forloop.last %}<span class="text-muted ms-1">OR</span>{% endif %}
|
|
13
13
|
{% empty %}
|
|
14
14
|
<span class="text-muted">No search terms available</span>
|
|
15
15
|
{% endfor %}
|
|
@@ -27,7 +27,7 @@
|
|
|
27
27
|
<h5 class="card-title mb-0">
|
|
28
28
|
<i class="mdi mdi-jira text-primary"></i> Jira Issues
|
|
29
29
|
{% if jira_results.total > 0 %}
|
|
30
|
-
<span class="badge bg-
|
|
30
|
+
<span class="badge bg-info text-white">{{ jira_results.total }} issue{{ jira_results.total|pluralize }}</span>
|
|
31
31
|
{% endif %}
|
|
32
32
|
</h5>
|
|
33
33
|
{% if jira_url %}
|
|
@@ -71,11 +71,11 @@
|
|
|
71
71
|
</td>
|
|
72
72
|
<td>
|
|
73
73
|
{% if issue.status_category == 'done' %}
|
|
74
|
-
<span class="badge bg-success">{{ issue.status }}</span>
|
|
74
|
+
<span class="badge bg-success text-white">{{ issue.status }}</span>
|
|
75
75
|
{% elif issue.status_category == 'indeterminate' %}
|
|
76
|
-
<span class="badge bg-primary">{{ issue.status }}</span>
|
|
76
|
+
<span class="badge bg-primary text-white">{{ issue.status }}</span>
|
|
77
77
|
{% else %}
|
|
78
|
-
<span class="badge bg-secondary">{{ issue.status }}</span>
|
|
78
|
+
<span class="badge bg-secondary text-white">{{ issue.status }}</span>
|
|
79
79
|
{% endif %}
|
|
80
80
|
</td>
|
|
81
81
|
<td>
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
<i class="mdi mdi-magnify"></i>
|
|
10
10
|
<strong>Searching for:</strong>
|
|
11
11
|
{% for term in search_terms %}
|
|
12
|
-
<span class="badge bg-
|
|
12
|
+
<span class="badge bg-info text-white ms-1">{{ term }}</span>{% if not forloop.last %}<span class="text-muted ms-1">OR</span>{% endif %}
|
|
13
13
|
{% empty %}
|
|
14
14
|
<span class="text-muted">No search terms available</span>
|
|
15
15
|
{% endfor %}
|
|
@@ -27,7 +27,7 @@
|
|
|
27
27
|
<h5 class="card-title mb-0">
|
|
28
28
|
<i class="mdi mdi-jira text-primary"></i> Jira Issues
|
|
29
29
|
{% if jira_results.total > 0 %}
|
|
30
|
-
<span class="badge bg-
|
|
30
|
+
<span class="badge bg-info text-white">{{ jira_results.total }} issue{{ jira_results.total|pluralize }}</span>
|
|
31
31
|
{% endif %}
|
|
32
32
|
</h5>
|
|
33
33
|
{% if jira_url %}
|
|
@@ -71,11 +71,11 @@
|
|
|
71
71
|
</td>
|
|
72
72
|
<td>
|
|
73
73
|
{% if issue.status_category == 'done' %}
|
|
74
|
-
<span class="badge bg-success">{{ issue.status }}</span>
|
|
74
|
+
<span class="badge bg-success text-white">{{ issue.status }}</span>
|
|
75
75
|
{% elif issue.status_category == 'indeterminate' %}
|
|
76
|
-
<span class="badge bg-primary">{{ issue.status }}</span>
|
|
76
|
+
<span class="badge bg-primary text-white">{{ issue.status }}</span>
|
|
77
77
|
{% else %}
|
|
78
|
-
<span class="badge bg-secondary">{{ issue.status }}</span>
|
|
78
|
+
<span class="badge bg-secondary text-white">{{ issue.status }}</span>
|
|
79
79
|
{% endif %}
|
|
80
80
|
</td>
|
|
81
81
|
<td>
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: netbox-atlassian
|
|
3
|
-
Version: 0.1
|
|
3
|
+
Version: 0.2.1
|
|
4
4
|
Summary: NetBox plugin to display Jira issues and Confluence pages related to devices
|
|
5
5
|
Author-email: sieteunoseis <jeremy.worden@gmail.com>
|
|
6
6
|
License: Apache-2.0
|
|
@@ -27,6 +27,11 @@ Requires-Dist: pytest; extra == "dev"
|
|
|
27
27
|
|
|
28
28
|
# NetBox Atlassian Plugin
|
|
29
29
|
|
|
30
|
+

|
|
31
|
+

|
|
32
|
+
[](https://opensource.org/licenses/Apache-2.0)
|
|
33
|
+
[](https://pypi.org/project/netbox-atlassian/)
|
|
34
|
+
|
|
30
35
|
Display Jira issues and Confluence pages related to devices in NetBox.
|
|
31
36
|
|
|
32
37
|
## Features
|
|
@@ -35,8 +40,10 @@ Display Jira issues and Confluence pages related to devices in NetBox.
|
|
|
35
40
|
- **VM Tab** - Same functionality for Virtual Machines
|
|
36
41
|
- **Configurable Search Fields** - Search by hostname, serial, asset tag, role, IP, etc.
|
|
37
42
|
- **OR Search Logic** - Finds content matching any configured field
|
|
38
|
-
- **On-Premise Support** - Works with Jira Server/Data Center and Confluence Server/Data Center
|
|
39
|
-
- **Cloud Ready** - Prepared for Atlassian Cloud (
|
|
43
|
+
- **On-Premise Support** - Works with Jira Server/Data Center and Confluence Server/Data Center (tested)
|
|
44
|
+
- **Cloud Ready** - Prepared for Atlassian Cloud (not yet tested)
|
|
45
|
+
- **Legacy SSL Support** - Works with older servers requiring legacy SSL renegotiation
|
|
46
|
+
- **PAT Authentication** - Supports Personal Access Tokens for Confluence
|
|
40
47
|
- **Caching** - Results cached to reduce API calls
|
|
41
48
|
- **Project/Space Filtering** - Limit searches to specific Jira projects or Confluence spaces
|
|
42
49
|
|
|
@@ -74,8 +81,10 @@ PLUGINS_CONFIG = {
|
|
|
74
81
|
|
|
75
82
|
# Confluence settings (on-prem)
|
|
76
83
|
"confluence_url": "https://confluence.example.com",
|
|
77
|
-
"
|
|
78
|
-
|
|
84
|
+
"confluence_token": "personal-access-token", # PAT (preferred)
|
|
85
|
+
# OR use username/password:
|
|
86
|
+
# "confluence_username": "api_user",
|
|
87
|
+
# "confluence_password": "api_password",
|
|
79
88
|
"confluence_verify_ssl": True,
|
|
80
89
|
"confluence_spaces": [], # Empty = all spaces
|
|
81
90
|
|
|
@@ -96,6 +105,7 @@ PLUGINS_CONFIG = {
|
|
|
96
105
|
"timeout": 30,
|
|
97
106
|
"cache_timeout": 300,
|
|
98
107
|
"device_types": [], # Filter by manufacturer (empty = all)
|
|
108
|
+
"enable_legacy_ssl": False, # Enable for older servers
|
|
99
109
|
}
|
|
100
110
|
}
|
|
101
111
|
```
|
|
@@ -151,6 +161,16 @@ The plugin adds these endpoints:
|
|
|
151
161
|
3. For on-prem, ensure `verify_ssl` matches your certificate setup
|
|
152
162
|
4. Check firewall rules allow outbound HTTPS
|
|
153
163
|
|
|
164
|
+
### SSL Renegotiation Errors
|
|
165
|
+
|
|
166
|
+
If you see "unsafe legacy renegotiation disabled" errors, enable legacy SSL:
|
|
167
|
+
|
|
168
|
+
```python
|
|
169
|
+
"enable_legacy_ssl": True,
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
This is required for some older Confluence/Jira servers.
|
|
173
|
+
|
|
154
174
|
### No Results
|
|
155
175
|
|
|
156
176
|
1. Verify search fields are enabled in configuration
|
|
@@ -177,6 +197,10 @@ isort netbox_atlassian/
|
|
|
177
197
|
flake8 netbox_atlassian/
|
|
178
198
|
```
|
|
179
199
|
|
|
200
|
+
## Changelog
|
|
201
|
+
|
|
202
|
+
See [CHANGELOG.md](CHANGELOG.md) for release history.
|
|
203
|
+
|
|
180
204
|
## License
|
|
181
205
|
|
|
182
206
|
Apache 2.0
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
netbox_atlassian/__init__.py,sha256=L53QJQQEwrbcHmtMfZt68zq0OC5bgPbLqXN6phEDg8o,2835
|
|
2
|
+
netbox_atlassian/atlassian_client.py,sha256=NaCwsHOx5kB9bz_g6rtfbjXFsE3J3KdrVY-wewAUIzg,13567
|
|
3
|
+
netbox_atlassian/forms.py,sha256=b8MKsU3Ou-c0s7Cga_72m7E3UCCliZF-17woybN66dk,3385
|
|
4
|
+
netbox_atlassian/navigation.py,sha256=tpRgS8qESmxm5eEuCOd1UjEVXEDTMM12H4lEaZk1BRw,497
|
|
5
|
+
netbox_atlassian/urls.py,sha256=kIiL-G8wfMd1tdSrnWeWcTuHZMx6CCc5mLr_WjKn8Rs,454
|
|
6
|
+
netbox_atlassian/views.py,sha256=EQlU2hcHNcRfwsD5C73L1X5u82WeB26XqSPcMVxl9S4,10118
|
|
7
|
+
netbox_atlassian/templates/netbox_atlassian/device_tab.html,sha256=9HD8mx43vBogO6Yq3brHZghm9gmJQwbWfqLk9YHroMs,9546
|
|
8
|
+
netbox_atlassian/templates/netbox_atlassian/settings.html,sha256=bmiIzzJ6m1vwT5AOcOrdJ7uD3V31GbKUpT4M6TIP3wE,11709
|
|
9
|
+
netbox_atlassian/templates/netbox_atlassian/vm_tab.html,sha256=H6QL0sRTXo8O-0Xlha-U46NQ0UWNA8L3KzKe50tQeFE,9564
|
|
10
|
+
netbox_atlassian-0.2.1.dist-info/METADATA,sha256=9cHCqt65varpaFPgYBWztA9Rpnp2OE1oikHu_yJ33ks,6641
|
|
11
|
+
netbox_atlassian-0.2.1.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
|
|
12
|
+
netbox_atlassian-0.2.1.dist-info/top_level.txt,sha256=VaKVLTW0o2SE7896PzRTWUaEeYt8CWsryBXI6Ij4ECg,17
|
|
13
|
+
netbox_atlassian-0.2.1.dist-info/RECORD,,
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
netbox_atlassian/__init__.py,sha256=caHvJRtHTHUx1tRKQyNXzYvMihUJ71fFWkJPqgunTIs,2754
|
|
2
|
-
netbox_atlassian/atlassian_client.py,sha256=oO4maq4AWknbf-HEin72BS30gM7HcRsunC0xv9O9YUI,12859
|
|
3
|
-
netbox_atlassian/forms.py,sha256=b8MKsU3Ou-c0s7Cga_72m7E3UCCliZF-17woybN66dk,3385
|
|
4
|
-
netbox_atlassian/navigation.py,sha256=tpRgS8qESmxm5eEuCOd1UjEVXEDTMM12H4lEaZk1BRw,497
|
|
5
|
-
netbox_atlassian/urls.py,sha256=kIiL-G8wfMd1tdSrnWeWcTuHZMx6CCc5mLr_WjKn8Rs,454
|
|
6
|
-
netbox_atlassian/views.py,sha256=EQlU2hcHNcRfwsD5C73L1X5u82WeB26XqSPcMVxl9S4,10118
|
|
7
|
-
netbox_atlassian/templates/netbox_atlassian/device_tab.html,sha256=Vs1QMlCa6vcWF0HrL1VlV6mHrl9iaCC_R3IsjH1BcJQ,9521
|
|
8
|
-
netbox_atlassian/templates/netbox_atlassian/settings.html,sha256=bmiIzzJ6m1vwT5AOcOrdJ7uD3V31GbKUpT4M6TIP3wE,11709
|
|
9
|
-
netbox_atlassian/templates/netbox_atlassian/vm_tab.html,sha256=Q_Psv-08lyLys_CAF4oJvAUIWcg_2OnkcMFbdnKg8vk,9539
|
|
10
|
-
netbox_atlassian-0.1.0.dist-info/METADATA,sha256=Zw0phWkrxAmDEXe0oySURhi5xLQ7RRBamQcpXqDIlfY,5675
|
|
11
|
-
netbox_atlassian-0.1.0.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
|
|
12
|
-
netbox_atlassian-0.1.0.dist-info/top_level.txt,sha256=VaKVLTW0o2SE7896PzRTWUaEeYt8CWsryBXI6Ij4ECg,17
|
|
13
|
-
netbox_atlassian-0.1.0.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|