linuxfabrik-lib 3.3.0__tar.gz → 3.4.1__tar.gz

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.
Files changed (49) hide show
  1. {linuxfabrik_lib-3.3.0 → linuxfabrik_lib-3.4.1}/PKG-INFO +6 -6
  2. {linuxfabrik_lib-3.3.0 → linuxfabrik_lib-3.4.1}/README.md +5 -5
  3. {linuxfabrik_lib-3.3.0 → linuxfabrik_lib-3.4.1}/endoflifedate.py +128 -68
  4. {linuxfabrik_lib-3.3.0 → linuxfabrik_lib-3.4.1}/librenms.py +14 -7
  5. {linuxfabrik_lib-3.3.0 → linuxfabrik_lib-3.4.1}/linuxfabrik_lib.egg-info/PKG-INFO +6 -6
  6. {linuxfabrik_lib-3.3.0 → linuxfabrik_lib-3.4.1}/pyproject.toml +1 -1
  7. {linuxfabrik_lib-3.3.0 → linuxfabrik_lib-3.4.1}/time.py +56 -1
  8. {linuxfabrik_lib-3.3.0 → linuxfabrik_lib-3.4.1}/LICENSE +0 -0
  9. {linuxfabrik_lib-3.3.0 → linuxfabrik_lib-3.4.1}/__init__.py +0 -0
  10. {linuxfabrik_lib-3.3.0 → linuxfabrik_lib-3.4.1}/args.py +0 -0
  11. {linuxfabrik_lib-3.3.0 → linuxfabrik_lib-3.4.1}/base.py +0 -0
  12. {linuxfabrik_lib-3.3.0 → linuxfabrik_lib-3.4.1}/cache.py +0 -0
  13. {linuxfabrik_lib-3.3.0 → linuxfabrik_lib-3.4.1}/db_mysql.py +0 -0
  14. {linuxfabrik_lib-3.3.0 → linuxfabrik_lib-3.4.1}/db_sqlite.py +0 -0
  15. {linuxfabrik_lib-3.3.0 → linuxfabrik_lib-3.4.1}/disk.py +0 -0
  16. {linuxfabrik_lib-3.3.0 → linuxfabrik_lib-3.4.1}/distro.py +0 -0
  17. {linuxfabrik_lib-3.3.0 → linuxfabrik_lib-3.4.1}/dmidecode.py +0 -0
  18. {linuxfabrik_lib-3.3.0 → linuxfabrik_lib-3.4.1}/feedparser.py +0 -0
  19. {linuxfabrik_lib-3.3.0 → linuxfabrik_lib-3.4.1}/globals.py +0 -0
  20. {linuxfabrik_lib-3.3.0 → linuxfabrik_lib-3.4.1}/grassfish.py +0 -0
  21. {linuxfabrik_lib-3.3.0 → linuxfabrik_lib-3.4.1}/huawei.py +0 -0
  22. {linuxfabrik_lib-3.3.0 → linuxfabrik_lib-3.4.1}/human.py +0 -0
  23. {linuxfabrik_lib-3.3.0 → linuxfabrik_lib-3.4.1}/icinga.py +0 -0
  24. {linuxfabrik_lib-3.3.0 → linuxfabrik_lib-3.4.1}/infomaniak.py +0 -0
  25. {linuxfabrik_lib-3.3.0 → linuxfabrik_lib-3.4.1}/jitsi.py +0 -0
  26. {linuxfabrik_lib-3.3.0 → linuxfabrik_lib-3.4.1}/keycloak.py +0 -0
  27. {linuxfabrik_lib-3.3.0 → linuxfabrik_lib-3.4.1}/lftest.py +0 -0
  28. {linuxfabrik_lib-3.3.0 → linuxfabrik_lib-3.4.1}/linuxfabrik_lib.egg-info/SOURCES.txt +0 -0
  29. {linuxfabrik_lib-3.3.0 → linuxfabrik_lib-3.4.1}/linuxfabrik_lib.egg-info/dependency_links.txt +0 -0
  30. {linuxfabrik_lib-3.3.0 → linuxfabrik_lib-3.4.1}/linuxfabrik_lib.egg-info/requires.txt +0 -0
  31. {linuxfabrik_lib-3.3.0 → linuxfabrik_lib-3.4.1}/linuxfabrik_lib.egg-info/top_level.txt +0 -0
  32. {linuxfabrik_lib-3.3.0 → linuxfabrik_lib-3.4.1}/net.py +0 -0
  33. {linuxfabrik_lib-3.3.0 → linuxfabrik_lib-3.4.1}/nextcloud.py +0 -0
  34. {linuxfabrik_lib-3.3.0 → linuxfabrik_lib-3.4.1}/nodebb.py +0 -0
  35. {linuxfabrik_lib-3.3.0 → linuxfabrik_lib-3.4.1}/powershell.py +0 -0
  36. {linuxfabrik_lib-3.3.0 → linuxfabrik_lib-3.4.1}/psutil.py +0 -0
  37. {linuxfabrik_lib-3.3.0 → linuxfabrik_lib-3.4.1}/qts.py +0 -0
  38. {linuxfabrik_lib-3.3.0 → linuxfabrik_lib-3.4.1}/redfish.py +0 -0
  39. {linuxfabrik_lib-3.3.0 → linuxfabrik_lib-3.4.1}/rocket.py +0 -0
  40. {linuxfabrik_lib-3.3.0 → linuxfabrik_lib-3.4.1}/setup.cfg +0 -0
  41. {linuxfabrik_lib-3.3.0 → linuxfabrik_lib-3.4.1}/shell.py +0 -0
  42. {linuxfabrik_lib-3.3.0 → linuxfabrik_lib-3.4.1}/smb.py +0 -0
  43. {linuxfabrik_lib-3.3.0 → linuxfabrik_lib-3.4.1}/txt.py +0 -0
  44. {linuxfabrik_lib-3.3.0 → linuxfabrik_lib-3.4.1}/uptimerobot.py +0 -0
  45. {linuxfabrik_lib-3.3.0 → linuxfabrik_lib-3.4.1}/url.py +0 -0
  46. {linuxfabrik_lib-3.3.0 → linuxfabrik_lib-3.4.1}/veeam.py +0 -0
  47. {linuxfabrik_lib-3.3.0 → linuxfabrik_lib-3.4.1}/version.py +0 -0
  48. {linuxfabrik_lib-3.3.0 → linuxfabrik_lib-3.4.1}/wildfly.py +0 -0
  49. {linuxfabrik_lib-3.3.0 → linuxfabrik_lib-3.4.1}/winrm.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: linuxfabrik-lib
3
- Version: 3.3.0
3
+ Version: 3.4.1
4
4
  Summary: Python libraries used in various Linuxfabrik projects, including the 'Linuxfabrik Monitoring Plugins' project.
5
5
  Author-email: "Linuxfabrik GmbH, Zurich, Switzerland" <info@linuxfabrik.ch>
6
6
  License: This is free and unencumbered software released into the public domain.
@@ -97,6 +97,11 @@ A mature, production-grade Python library collection providing 35+ modules with
97
97
  The library requires Python 3.9+ and runs on every platform.
98
98
 
99
99
 
100
+ ## Documentation
101
+
102
+ Full documentation is available at [linuxfabrik.github.io/lib](https://linuxfabrik.github.io/lib/). It is automatically built and deployed on every push to `main`.
103
+
104
+
100
105
  ## Installation
101
106
 
102
107
  Add `linuxfabrik-lib` as a dependency to your project, or install it manually:
@@ -106,11 +111,6 @@ pip install --user linuxfabrik-lib
106
111
  ```
107
112
 
108
113
 
109
- ## Documentation
110
-
111
- Full API documentation is available at [linuxfabrik.github.io/lib](https://linuxfabrik.github.io/lib/). It is automatically built and deployed on every push to `main`.
112
-
113
-
114
114
  ## Design Principles
115
115
 
116
116
  These libraries are built with a clear set of priorities:
@@ -29,6 +29,11 @@ A mature, production-grade Python library collection providing 35+ modules with
29
29
  The library requires Python 3.9+ and runs on every platform.
30
30
 
31
31
 
32
+ ## Documentation
33
+
34
+ Full documentation is available at [linuxfabrik.github.io/lib](https://linuxfabrik.github.io/lib/). It is automatically built and deployed on every push to `main`.
35
+
36
+
32
37
  ## Installation
33
38
 
34
39
  Add `linuxfabrik-lib` as a dependency to your project, or install it manually:
@@ -38,11 +43,6 @@ pip install --user linuxfabrik-lib
38
43
  ```
39
44
 
40
45
 
41
- ## Documentation
42
-
43
- Full API documentation is available at [linuxfabrik.github.io/lib](https://linuxfabrik.github.io/lib/). It is automatically built and deployed on every push to `main`.
44
-
45
-
46
46
  ## Design Principles
47
47
 
48
48
  These libraries are built with a clear set of priorities:
@@ -54,8 +54,8 @@ ENDOFLIFE_DATE = {
54
54
  'https://endoflife.date/api/composer.json': [
55
55
  { 'cycle': '2.9',
56
56
  'eol': False,
57
- 'latest': '2.9.5',
58
- 'latestReleaseDate': '2026-01-29',
57
+ 'latest': '2.9.7',
58
+ 'latestReleaseDate': '2026-04-14',
59
59
  'lts': False,
60
60
  'releaseDate': '2025-11-13'},
61
61
  { 'cycle': '2.8',
@@ -96,10 +96,22 @@ ENDOFLIFE_DATE = {
96
96
  'releaseDate': '2022-03-30'},
97
97
  { 'cycle': '2.2',
98
98
  'eol': False,
99
- 'latest': '2.2.26',
100
- 'latestReleaseDate': '2025-12-30',
99
+ 'latest': '2.2.27',
100
+ 'latestReleaseDate': '2026-04-14',
101
101
  'lts': True,
102
102
  'releaseDate': '2021-12-22'},
103
+ { 'cycle': '2.1',
104
+ 'eol': '2021-12-22',
105
+ 'latest': '2.1.14',
106
+ 'latestReleaseDate': '2021-11-30',
107
+ 'lts': False,
108
+ 'releaseDate': '2021-06-03'},
109
+ { 'cycle': '2.0',
110
+ 'eol': '2021-06-03',
111
+ 'latest': '2.0.14',
112
+ 'latestReleaseDate': '2021-05-21',
113
+ 'lts': False,
114
+ 'releaseDate': '2020-10-24'},
103
115
  { 'cycle': '1',
104
116
  'eol': '2020-10-24',
105
117
  'latest': '1.10.27',
@@ -110,6 +122,12 @@ ENDOFLIFE_DATE = {
110
122
 
111
123
 
112
124
  'https://endoflife.date/api/fedora.json': [
125
+ { 'cycle': '44',
126
+ 'eol': '2027-06-02',
127
+ 'latest': '44',
128
+ 'latestReleaseDate': '2026-04-28',
129
+ 'lts': False,
130
+ 'releaseDate': '2026-04-28'},
113
131
  { 'cycle': '43',
114
132
  'eol': '2026-12-09',
115
133
  'latest': '43',
@@ -118,7 +136,7 @@ ENDOFLIFE_DATE = {
118
136
  'releaseDate': '2025-10-28'},
119
137
  { 'codename': 'Adams',
120
138
  'cycle': '42',
121
- 'eol': '2026-05-13',
139
+ 'eol': '2026-05-27',
122
140
  'latest': '42',
123
141
  'latestReleaseDate': '2025-04-15',
124
142
  'lts': False,
@@ -433,6 +451,11 @@ ENDOFLIFE_DATE = {
433
451
 
434
452
 
435
453
  'https://endoflife.date/api/fortios.json': [
454
+ { 'cycle': '8.0',
455
+ 'eol': '2030-10-21',
456
+ 'lts': False,
457
+ 'releaseDate': '2026-04-21',
458
+ 'support': '2029-04-21'},
436
459
  { 'cycle': '7.6',
437
460
  'eol': '2030-01-25',
438
461
  'lts': False,
@@ -472,17 +495,24 @@ ENDOFLIFE_DATE = {
472
495
 
473
496
 
474
497
  'https://endoflife.date/api/gitlab.json': [
498
+ { 'cycle': '18.11',
499
+ 'eol': '2026-07-16',
500
+ 'latest': '18.11.2',
501
+ 'latestReleaseDate': '2026-04-28',
502
+ 'lts': False,
503
+ 'releaseDate': '2026-04-16',
504
+ 'support': '2026-05-21'},
475
505
  { 'cycle': '18.10',
476
506
  'eol': '2026-06-18',
477
- 'latest': '18.10.3',
478
- 'latestReleaseDate': '2026-04-07',
507
+ 'latest': '18.10.5',
508
+ 'latestReleaseDate': '2026-04-28',
479
509
  'lts': False,
480
510
  'releaseDate': '2026-03-19',
481
511
  'support': '2026-04-16'},
482
512
  { 'cycle': '18.9',
483
513
  'eol': '2026-05-21',
484
- 'latest': '18.9.5',
485
- 'latestReleaseDate': '2026-04-07',
514
+ 'latest': '18.9.6',
515
+ 'latestReleaseDate': '2026-04-21',
486
516
  'lts': False,
487
517
  'releaseDate': '2026-02-19',
488
518
  'support': '2026-03-19'},
@@ -903,13 +933,20 @@ ENDOFLIFE_DATE = {
903
933
 
904
934
 
905
935
  'https://endoflife.date/api/grafana.json': [
936
+ { 'cycle': '13.0',
937
+ 'eol': '2027-01-09',
938
+ 'latest': '13.0.1',
939
+ 'latestReleaseDate': '2026-04-17',
940
+ 'lts': False,
941
+ 'releaseDate': '2026-04-14',
942
+ 'support': True},
906
943
  { 'cycle': '12.4',
907
944
  'eol': '2027-05-24',
908
- 'latest': '12.4.2',
909
- 'latestReleaseDate': '2026-03-25',
945
+ 'latest': '12.4.3',
946
+ 'latestReleaseDate': '2026-04-14',
910
947
  'lts': False,
911
948
  'releaseDate': '2026-02-24',
912
- 'support': '2026-04-24'},
949
+ 'support': '2026-04-17'},
913
950
  { 'cycle': '12.3',
914
951
  'eol': '2026-08-19',
915
952
  'latest': '12.3.6+security-01',
@@ -1262,15 +1299,22 @@ ENDOFLIFE_DATE = {
1262
1299
 
1263
1300
 
1264
1301
  'https://endoflife.date/api/icinga.json': [
1302
+ { 'cycle': '2.16',
1303
+ 'eol': False,
1304
+ 'latest': '2.16.0',
1305
+ 'latestReleaseDate': '2026-04-22',
1306
+ 'lts': False,
1307
+ 'releaseDate': '2026-04-23',
1308
+ 'support': True},
1265
1309
  { 'cycle': '2.15',
1266
1310
  'eol': False,
1267
- 'latest': '2.15.2',
1268
- 'latestReleaseDate': '2026-01-29',
1311
+ 'latest': '2.15.3',
1312
+ 'latestReleaseDate': '2026-04-22',
1269
1313
  'lts': False,
1270
1314
  'releaseDate': '2025-06-17',
1271
- 'support': True},
1315
+ 'support': '2026-04-23'},
1272
1316
  { 'cycle': '2.14',
1273
- 'eol': False,
1317
+ 'eol': '2026-04-23',
1274
1318
  'latest': '2.14.8',
1275
1319
  'latestReleaseDate': '2026-01-29',
1276
1320
  'lts': False,
@@ -1388,8 +1432,8 @@ ENDOFLIFE_DATE = {
1388
1432
  'https://endoflife.date/api/keycloak.json': [
1389
1433
  { 'cycle': '26.6',
1390
1434
  'eol': False,
1391
- 'latest': '26.6.0',
1392
- 'latestReleaseDate': '2026-04-08',
1435
+ 'latest': '26.6.1',
1436
+ 'latestReleaseDate': '2026-04-15',
1393
1437
  'lts': False,
1394
1438
  'releaseDate': '2026-04-08'},
1395
1439
  { 'cycle': '26.5',
@@ -1769,20 +1813,20 @@ ENDOFLIFE_DATE = {
1769
1813
  'https://endoflife.date/api/mastodon.json': [
1770
1814
  { 'cycle': '4.5',
1771
1815
  'eol': False,
1772
- 'latest': '4.5.8',
1773
- 'latestReleaseDate': '2026-03-24',
1816
+ 'latest': '4.5.9',
1817
+ 'latestReleaseDate': '2026-04-15',
1774
1818
  'lts': False,
1775
1819
  'releaseDate': '2025-11-06'},
1776
1820
  { 'cycle': '4.4',
1777
1821
  'eol': False,
1778
- 'latest': '4.4.15',
1779
- 'latestReleaseDate': '2026-03-24',
1822
+ 'latest': '4.4.16',
1823
+ 'latestReleaseDate': '2026-04-15',
1780
1824
  'lts': False,
1781
1825
  'releaseDate': '2025-07-08'},
1782
1826
  { 'cycle': '4.3',
1783
1827
  'eol': '2026-05-06',
1784
- 'latest': '4.3.21',
1785
- 'latestReleaseDate': '2026-03-24',
1828
+ 'latest': '4.3.22',
1829
+ 'latestReleaseDate': '2026-04-15',
1786
1830
  'lts': False,
1787
1831
  'releaseDate': '2024-10-08'},
1788
1832
  { 'cycle': '4.2',
@@ -1857,8 +1901,8 @@ ENDOFLIFE_DATE = {
1857
1901
  'https://endoflife.date/api/matomo.json': [
1858
1902
  { 'cycle': '5',
1859
1903
  'eol': False,
1860
- 'latest': '5.8.0',
1861
- 'latestReleaseDate': '2026-03-05',
1904
+ 'latest': '5.10.0',
1905
+ 'latestReleaseDate': '2026-05-04',
1862
1906
  'lts': False,
1863
1907
  'releaseDate': '2023-12-18',
1864
1908
  'support': True},
@@ -1988,26 +2032,34 @@ ENDOFLIFE_DATE = {
1988
2032
 
1989
2033
 
1990
2034
  'https://endoflife.date/api/moodle.json': [
2035
+ { 'cycle': '5.2',
2036
+ 'eol': '2027-10-04',
2037
+ 'latest': '5.2.0',
2038
+ 'latestReleaseDate': '2026-04-16',
2039
+ 'lts': False,
2040
+ 'releaseDate': '2026-04-20',
2041
+ 'support': '2027-04-19',
2042
+ 'supportedPhpVersions': '8.2 - 8.4'},
1991
2043
  { 'cycle': '5.1',
1992
2044
  'eol': '2027-04-19',
1993
- 'latest': '5.1.3',
1994
- 'latestReleaseDate': '2026-02-11',
2045
+ 'latest': '5.1.4',
2046
+ 'latestReleaseDate': '2026-04-16',
1995
2047
  'lts': False,
1996
2048
  'releaseDate': '2025-10-06',
1997
2049
  'support': '2026-10-05',
1998
2050
  'supportedPhpVersions': '8.2 - 8.4'},
1999
2051
  { 'cycle': '5.0',
2000
2052
  'eol': '2026-10-05',
2001
- 'latest': '5.0.6',
2002
- 'latestReleaseDate': '2026-02-11',
2053
+ 'latest': '5.0.7',
2054
+ 'latestReleaseDate': '2026-04-16',
2003
2055
  'lts': False,
2004
2056
  'releaseDate': '2025-04-14',
2005
2057
  'support': '2026-04-20',
2006
2058
  'supportedPhpVersions': '8.1 - 8.4'},
2007
2059
  { 'cycle': '4.5',
2008
2060
  'eol': '2027-10-04',
2009
- 'latest': '4.5.10',
2010
- 'latestReleaseDate': '2026-02-11',
2061
+ 'latest': '4.5.11',
2062
+ 'latestReleaseDate': '2026-04-16',
2011
2063
  'lts': True,
2012
2064
  'releaseDate': '2024-10-07',
2013
2065
  'support': '2025-10-06',
@@ -2088,14 +2140,22 @@ ENDOFLIFE_DATE = {
2088
2140
 
2089
2141
 
2090
2142
  'https://endoflife.date/api/mysql.json': [
2143
+ { 'cycle': '9.7',
2144
+ 'eol': '2034-04-21',
2145
+ 'latest': '9.7.0',
2146
+ 'latestReleaseDate': '2026-04-07',
2147
+ 'link': 'https://dev.mysql.com/doc/relnotes/mysql/9.7/en/news-9-7-0.html',
2148
+ 'lts': True,
2149
+ 'releaseDate': '2026-04-21',
2150
+ 'support': True},
2091
2151
  { 'cycle': '9.6',
2092
- 'eol': False,
2093
- 'latest': '9.6.0',
2094
- 'latestReleaseDate': '2025-12-23',
2152
+ 'eol': '2026-04-21',
2153
+ 'latest': '9.6.1',
2154
+ 'latestReleaseDate': '2026-01-16',
2095
2155
  'link': 'https://dev.mysql.com/doc/relnotes/mysql/9.6/en/news-9-6-0.html',
2096
2156
  'lts': False,
2097
2157
  'releaseDate': '2026-01-20',
2098
- 'support': True},
2158
+ 'support': '2026-04-21'},
2099
2159
  { 'cycle': '9.5',
2100
2160
  'eol': '2026-01-20',
2101
2161
  'latest': '9.5.2',
@@ -2145,8 +2205,8 @@ ENDOFLIFE_DATE = {
2145
2205
  'support': '2024-10-15'},
2146
2206
  { 'cycle': '8.4',
2147
2207
  'eol': '2032-04-30',
2148
- 'latest': '8.4.8',
2149
- 'latestReleaseDate': '2025-12-24',
2208
+ 'latest': '8.4.9',
2209
+ 'latestReleaseDate': '2026-04-07',
2150
2210
  'lts': True,
2151
2211
  'releaseDate': '2024-04-10',
2152
2212
  'support': '2029-04-30'},
@@ -2173,8 +2233,8 @@ ENDOFLIFE_DATE = {
2173
2233
  'support': '2023-10-25'},
2174
2234
  { 'cycle': '8.0',
2175
2235
  'eol': '2026-04-30',
2176
- 'latest': '8.0.45',
2177
- 'latestReleaseDate': '2026-01-20',
2236
+ 'latest': '8.0.46',
2237
+ 'latestReleaseDate': '2026-04-07',
2178
2238
  'lts': '2023-07-18',
2179
2239
  'releaseDate': '2018-04-08',
2180
2240
  'support': '2025-04-30'},
@@ -2207,14 +2267,14 @@ ENDOFLIFE_DATE = {
2207
2267
  'https://endoflife.date/api/nextcloud.json': [
2208
2268
  { 'cycle': '33',
2209
2269
  'eol': '2027-02-28',
2210
- 'latest': '33.0.2',
2211
- 'latestReleaseDate': '2026-04-02',
2270
+ 'latest': '33.0.3',
2271
+ 'latestReleaseDate': '2026-04-30',
2212
2272
  'lts': False,
2213
2273
  'releaseDate': '2026-02-18'},
2214
2274
  { 'cycle': '32',
2215
2275
  'eol': '2026-09-30',
2216
- 'latest': '32.0.8',
2217
- 'latestReleaseDate': '2026-04-02',
2276
+ 'latest': '32.0.9',
2277
+ 'latestReleaseDate': '2026-04-30',
2218
2278
  'lts': False,
2219
2279
  'releaseDate': '2025-09-27'},
2220
2280
  { 'cycle': '31',
@@ -2361,15 +2421,15 @@ ENDOFLIFE_DATE = {
2361
2421
  'https://endoflife.date/api/openvpn.json': [
2362
2422
  { 'cycle': '2.7',
2363
2423
  'eol': False,
2364
- 'latest': '2.7.1',
2365
- 'latestReleaseDate': '2026-03-31',
2424
+ 'latest': '2.7.4',
2425
+ 'latestReleaseDate': '2026-04-30',
2366
2426
  'lts': False,
2367
2427
  'releaseDate': '2026-02-11',
2368
2428
  'support': True},
2369
2429
  { 'cycle': '2.6',
2370
2430
  'eol': '2028-08-31',
2371
- 'latest': '2.6.19',
2372
- 'latestReleaseDate': '2026-02-04',
2431
+ 'latest': '2.6.20',
2432
+ 'latestReleaseDate': '2026-04-22',
2373
2433
  'lts': False,
2374
2434
  'releaseDate': '2023-01-25',
2375
2435
  'support': '2026-08-31'},
@@ -2544,29 +2604,29 @@ ENDOFLIFE_DATE = {
2544
2604
  'https://endoflife.date/api/postfix.json': [
2545
2605
  { 'cycle': '3.11',
2546
2606
  'eol': False,
2547
- 'latest': '3.11.1',
2548
- 'latestReleaseDate': '2026-03-11',
2607
+ 'latest': '3.11.2',
2608
+ 'latestReleaseDate': '2026-05-02',
2549
2609
  'link': 'https://www.postfix.org/announcements/postfix-3.11.0.html',
2550
2610
  'lts': False,
2551
2611
  'releaseDate': '2026-03-06'},
2552
2612
  { 'cycle': '3.10',
2553
2613
  'eol': False,
2554
- 'latest': '3.10.8',
2555
- 'latestReleaseDate': '2026-02-19',
2614
+ 'latest': '3.10.9',
2615
+ 'latestReleaseDate': '2026-05-02',
2556
2616
  'link': 'https://www.postfix.org/announcements/postfix-3.10.0.html',
2557
2617
  'lts': False,
2558
2618
  'releaseDate': '2025-02-16'},
2559
2619
  { 'cycle': '3.9',
2560
2620
  'eol': False,
2561
- 'latest': '3.9.9',
2562
- 'latestReleaseDate': '2026-02-19',
2621
+ 'latest': '3.9.10',
2622
+ 'latestReleaseDate': '2026-05-02',
2563
2623
  'link': 'https://www.postfix.org/announcements/postfix-3.9.2.html',
2564
2624
  'lts': False,
2565
2625
  'releaseDate': '2024-03-06'},
2566
2626
  { 'cycle': '3.8',
2567
2627
  'eol': False,
2568
- 'latest': '3.8.15',
2569
- 'latestReleaseDate': '2026-02-19',
2628
+ 'latest': '3.8.16',
2629
+ 'latestReleaseDate': '2026-05-02',
2570
2630
  'link': 'https://www.postfix.org/announcements/postfix-3.9.2.html',
2571
2631
  'lts': False,
2572
2632
  'releaseDate': '2023-04-17'},
@@ -3191,43 +3251,43 @@ ENDOFLIFE_DATE = {
3191
3251
  'support': '2026-03-02'},
3192
3252
  { 'cycle': '8.1',
3193
3253
  'eol': '2026-08-31',
3194
- 'latest': '8.1.2',
3195
- 'latestReleaseDate': '2026-03-16',
3254
+ 'latest': '8.1.3',
3255
+ 'latestReleaseDate': '2026-04-13',
3196
3256
  'lts': False,
3197
3257
  'releaseDate': '2026-02-10',
3198
3258
  'support': '2026-02-10'},
3199
3259
  { 'cycle': '8.0',
3200
3260
  'eol': '2026-06-30',
3201
- 'latest': '8.0.3',
3202
- 'latestReleaseDate': '2026-03-16',
3261
+ 'latest': '8.0.4',
3262
+ 'latestReleaseDate': '2026-04-13',
3203
3263
  'lts': False,
3204
3264
  'releaseDate': '2026-01-12',
3205
3265
  'support': '2026-01-12'},
3206
3266
  { 'cycle': '7.13',
3207
3267
  'eol': '2026-05-31',
3208
- 'latest': '7.13.5',
3209
- 'latestReleaseDate': '2026-03-16',
3268
+ 'latest': '7.13.6',
3269
+ 'latestReleaseDate': '2026-04-13',
3210
3270
  'lts': False,
3211
3271
  'releaseDate': '2025-12-05',
3212
3272
  'support': '2025-12-05'},
3213
3273
  { 'cycle': '7.12',
3214
3274
  'eol': '2026-04-30',
3215
- 'latest': '7.12.6',
3216
- 'latestReleaseDate': '2026-03-16',
3275
+ 'latest': '7.12.7',
3276
+ 'latestReleaseDate': '2026-04-13',
3217
3277
  'lts': False,
3218
3278
  'releaseDate': '2025-10-31',
3219
3279
  'support': '2025-10-31'},
3220
3280
  { 'cycle': '7.11',
3221
3281
  'eol': '2026-03-31',
3222
- 'latest': '7.11.6',
3223
- 'latestReleaseDate': '2026-03-16',
3282
+ 'latest': '7.11.7',
3283
+ 'latestReleaseDate': '2026-04-13',
3224
3284
  'lts': False,
3225
3285
  'releaseDate': '2025-10-17',
3226
3286
  'support': '2025-10-17'},
3227
3287
  { 'cycle': '7.10',
3228
3288
  'eol': '2026-06-30',
3229
- 'latest': '7.10.9',
3230
- 'latestReleaseDate': '2026-03-16',
3289
+ 'latest': '7.10.10',
3290
+ 'latestReleaseDate': '2026-04-13',
3231
3291
  'lts': True,
3232
3292
  'releaseDate': '2025-09-04',
3233
3293
  'support': '2025-09-04'},
@@ -12,7 +12,7 @@
12
12
  needed by LibreNMS check plugins."""
13
13
 
14
14
  __author__ = 'Linuxfabrik GmbH, Zurich/Switzerland'
15
- __version__ = '2025042001'
15
+ __version__ = '2026042401'
16
16
 
17
17
  from . import (
18
18
  base, # pylint: disable=C0413
@@ -124,12 +124,17 @@ def get_state(librestate, severity='crit'):
124
124
  """
125
125
  Translate LibreNMS service state to a Nagios-compatible state.
126
126
 
127
- LibreNMS returns a custom service state where:
128
- - 0 = OK
129
- - 1 = Alert
130
- - 2 = Acknowledged
127
+ LibreNMS encodes the alert lifecycle in `alerts.state` (see
128
+ `LibreNMS/Enum/AlertState.php`):
129
+ - 0 = CLEAR / RECOVERED
130
+ - 1 = ACTIVE
131
+ - 2 = ACKNOWLEDGED
132
+ - 3 = WORSE
133
+ - 4 = BETTER
134
+ - 5 = CHANGED
131
135
 
132
- This function maps these LibreNMS states to Nagios exit codes.
136
+ ACTIVE, WORSE, BETTER and CHANGED all represent an open, notifiable
137
+ alert, so they map to WARN/CRIT. ACKNOWLEDGED and CLEAR map to OK.
133
138
 
134
139
  ### Parameters
135
140
  - **librestate** (`int`):
@@ -154,8 +159,10 @@ def get_state(librestate, severity='crit'):
154
159
  1
155
160
  >>> get_state(1, severity='crit')
156
161
  2
162
+ >>> get_state(3, severity='crit')
163
+ 2
157
164
  """
158
165
 
159
- if librestate != 1:
166
+ if librestate not in (1, 3, 4, 5):
160
167
  return STATE_OK
161
168
  return STATE_CRIT if severity == 'crit' else STATE_WARN
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: linuxfabrik-lib
3
- Version: 3.3.0
3
+ Version: 3.4.1
4
4
  Summary: Python libraries used in various Linuxfabrik projects, including the 'Linuxfabrik Monitoring Plugins' project.
5
5
  Author-email: "Linuxfabrik GmbH, Zurich, Switzerland" <info@linuxfabrik.ch>
6
6
  License: This is free and unencumbered software released into the public domain.
@@ -97,6 +97,11 @@ A mature, production-grade Python library collection providing 35+ modules with
97
97
  The library requires Python 3.9+ and runs on every platform.
98
98
 
99
99
 
100
+ ## Documentation
101
+
102
+ Full documentation is available at [linuxfabrik.github.io/lib](https://linuxfabrik.github.io/lib/). It is automatically built and deployed on every push to `main`.
103
+
104
+
100
105
  ## Installation
101
106
 
102
107
  Add `linuxfabrik-lib` as a dependency to your project, or install it manually:
@@ -106,11 +111,6 @@ pip install --user linuxfabrik-lib
106
111
  ```
107
112
 
108
113
 
109
- ## Documentation
110
-
111
- Full API documentation is available at [linuxfabrik.github.io/lib](https://linuxfabrik.github.io/lib/). It is automatically built and deployed on every push to `main`.
112
-
113
-
114
114
  ## Design Principles
115
115
 
116
116
  These libraries are built with a clear set of priorities:
@@ -6,7 +6,7 @@ build-backend = "setuptools.build_meta"
6
6
 
7
7
  [project]
8
8
  name = "linuxfabrik-lib"
9
- version = "3.3.0"
9
+ version = "3.4.1"
10
10
  description = "Python libraries used in various Linuxfabrik projects, including the 'Linuxfabrik Monitoring Plugins' project."
11
11
  readme = "README.md"
12
12
  authors = [
@@ -11,9 +11,10 @@
11
11
  """Provides datetime functions."""
12
12
 
13
13
  __author__ = 'Linuxfabrik GmbH, Zurich/Switzerland'
14
- __version__ = '2025052801'
14
+ __version__ = '2026042201'
15
15
 
16
16
  import datetime
17
+ import re
17
18
  import sys
18
19
  import time
19
20
 
@@ -96,6 +97,60 @@ def get_weekday(epoch):
96
97
  return _WEEKDAYS[time.localtime(epoch).tm_wday]
97
98
 
98
99
 
100
+ _MACRO_COMPONENT = re.compile(r'\{%([YymdHMS])\}')
101
+
102
+
103
+ def macro2timestr(s, format=''):
104
+ """
105
+ Expand time macros in a string.
106
+
107
+ Supported macros (case-sensitive, strftime-faithful):
108
+
109
+ - `{today}` → current date, formatted with `format` (default `%Y-%m-%d`).
110
+ - `{yesterday}` → current date minus one day, formatted with `format`.
111
+ - `{%Y}` / `{%y}` → 4-digit / 2-digit year of `now`.
112
+ - `{%m}` → month of `now` (01-12).
113
+ - `{%d}` → day of `now` (01-31).
114
+ - `{%H}` → hour of `now` (00-23).
115
+ - `{%M}` → minute of `now` (00-59).
116
+ - `{%S}` → second of `now` (00-59).
117
+
118
+ Unknown tokens are passed through unchanged.
119
+
120
+ ### Parameters
121
+ - **s** (`str`): Template string.
122
+ - **format** (`str`, optional): strftime pattern used for `{today}`
123
+ and `{yesterday}`. Defaults to ISO 8601 date `%Y-%m-%d`.
124
+
125
+ ### Returns
126
+ - **str**: `s` with all recognised macros replaced.
127
+
128
+ ### Example
129
+ >>> # Assuming today is 2026-04-22:
130
+ >>> macro2timestr('/var/log/laravel/laravel-{today}.log')
131
+ '/var/log/laravel/laravel-2026-04-22.log'
132
+ >>> macro2timestr('C:\\\\logs\\\\{%Y}{%m}{%d}.log')
133
+ 'C:\\\\logs\\\\20260422.log'
134
+ >>> macro2timestr('{today}', format='%Y%m%d')
135
+ '20260422'
136
+ >>> macro2timestr('{yesterday}', format='%d.%m.%Y')
137
+ '21.04.2026'
138
+ """
139
+ default_format = format or '%Y-%m-%d'
140
+ base = now(as_type='datetime')
141
+
142
+ result = s.replace('{today}', base.strftime(default_format))
143
+ result = result.replace(
144
+ '{yesterday}',
145
+ (base - datetime.timedelta(days=1)).strftime(default_format),
146
+ )
147
+
148
+ return _MACRO_COMPONENT.sub(
149
+ lambda match: base.strftime('%' + match.group(1)),
150
+ result,
151
+ )
152
+
153
+
99
154
  def now(as_type=''):
100
155
  """
101
156
  Returns the current date and time in various formats.
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes