linuxfabrik-lib 3.2.0__tar.gz → 3.4.0__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.2.0 → linuxfabrik_lib-3.4.0}/PKG-INFO +1 -1
  2. {linuxfabrik_lib-3.2.0 → linuxfabrik_lib-3.4.0}/args.py +8 -1
  3. {linuxfabrik_lib-3.2.0 → linuxfabrik_lib-3.4.0}/endoflifedate.py +55 -33
  4. {linuxfabrik_lib-3.2.0 → linuxfabrik_lib-3.4.0}/linuxfabrik_lib.egg-info/PKG-INFO +1 -1
  5. {linuxfabrik_lib-3.2.0 → linuxfabrik_lib-3.4.0}/pyproject.toml +1 -1
  6. {linuxfabrik_lib-3.2.0 → linuxfabrik_lib-3.4.0}/time.py +56 -1
  7. {linuxfabrik_lib-3.2.0 → linuxfabrik_lib-3.4.0}/LICENSE +0 -0
  8. {linuxfabrik_lib-3.2.0 → linuxfabrik_lib-3.4.0}/README.md +0 -0
  9. {linuxfabrik_lib-3.2.0 → linuxfabrik_lib-3.4.0}/__init__.py +0 -0
  10. {linuxfabrik_lib-3.2.0 → linuxfabrik_lib-3.4.0}/base.py +0 -0
  11. {linuxfabrik_lib-3.2.0 → linuxfabrik_lib-3.4.0}/cache.py +0 -0
  12. {linuxfabrik_lib-3.2.0 → linuxfabrik_lib-3.4.0}/db_mysql.py +0 -0
  13. {linuxfabrik_lib-3.2.0 → linuxfabrik_lib-3.4.0}/db_sqlite.py +0 -0
  14. {linuxfabrik_lib-3.2.0 → linuxfabrik_lib-3.4.0}/disk.py +0 -0
  15. {linuxfabrik_lib-3.2.0 → linuxfabrik_lib-3.4.0}/distro.py +0 -0
  16. {linuxfabrik_lib-3.2.0 → linuxfabrik_lib-3.4.0}/dmidecode.py +0 -0
  17. {linuxfabrik_lib-3.2.0 → linuxfabrik_lib-3.4.0}/feedparser.py +0 -0
  18. {linuxfabrik_lib-3.2.0 → linuxfabrik_lib-3.4.0}/globals.py +0 -0
  19. {linuxfabrik_lib-3.2.0 → linuxfabrik_lib-3.4.0}/grassfish.py +0 -0
  20. {linuxfabrik_lib-3.2.0 → linuxfabrik_lib-3.4.0}/huawei.py +0 -0
  21. {linuxfabrik_lib-3.2.0 → linuxfabrik_lib-3.4.0}/human.py +0 -0
  22. {linuxfabrik_lib-3.2.0 → linuxfabrik_lib-3.4.0}/icinga.py +0 -0
  23. {linuxfabrik_lib-3.2.0 → linuxfabrik_lib-3.4.0}/infomaniak.py +0 -0
  24. {linuxfabrik_lib-3.2.0 → linuxfabrik_lib-3.4.0}/jitsi.py +0 -0
  25. {linuxfabrik_lib-3.2.0 → linuxfabrik_lib-3.4.0}/keycloak.py +0 -0
  26. {linuxfabrik_lib-3.2.0 → linuxfabrik_lib-3.4.0}/lftest.py +0 -0
  27. {linuxfabrik_lib-3.2.0 → linuxfabrik_lib-3.4.0}/librenms.py +0 -0
  28. {linuxfabrik_lib-3.2.0 → linuxfabrik_lib-3.4.0}/linuxfabrik_lib.egg-info/SOURCES.txt +0 -0
  29. {linuxfabrik_lib-3.2.0 → linuxfabrik_lib-3.4.0}/linuxfabrik_lib.egg-info/dependency_links.txt +0 -0
  30. {linuxfabrik_lib-3.2.0 → linuxfabrik_lib-3.4.0}/linuxfabrik_lib.egg-info/requires.txt +0 -0
  31. {linuxfabrik_lib-3.2.0 → linuxfabrik_lib-3.4.0}/linuxfabrik_lib.egg-info/top_level.txt +0 -0
  32. {linuxfabrik_lib-3.2.0 → linuxfabrik_lib-3.4.0}/net.py +0 -0
  33. {linuxfabrik_lib-3.2.0 → linuxfabrik_lib-3.4.0}/nextcloud.py +0 -0
  34. {linuxfabrik_lib-3.2.0 → linuxfabrik_lib-3.4.0}/nodebb.py +0 -0
  35. {linuxfabrik_lib-3.2.0 → linuxfabrik_lib-3.4.0}/powershell.py +0 -0
  36. {linuxfabrik_lib-3.2.0 → linuxfabrik_lib-3.4.0}/psutil.py +0 -0
  37. {linuxfabrik_lib-3.2.0 → linuxfabrik_lib-3.4.0}/qts.py +0 -0
  38. {linuxfabrik_lib-3.2.0 → linuxfabrik_lib-3.4.0}/redfish.py +0 -0
  39. {linuxfabrik_lib-3.2.0 → linuxfabrik_lib-3.4.0}/rocket.py +0 -0
  40. {linuxfabrik_lib-3.2.0 → linuxfabrik_lib-3.4.0}/setup.cfg +0 -0
  41. {linuxfabrik_lib-3.2.0 → linuxfabrik_lib-3.4.0}/shell.py +0 -0
  42. {linuxfabrik_lib-3.2.0 → linuxfabrik_lib-3.4.0}/smb.py +0 -0
  43. {linuxfabrik_lib-3.2.0 → linuxfabrik_lib-3.4.0}/txt.py +0 -0
  44. {linuxfabrik_lib-3.2.0 → linuxfabrik_lib-3.4.0}/uptimerobot.py +0 -0
  45. {linuxfabrik_lib-3.2.0 → linuxfabrik_lib-3.4.0}/url.py +0 -0
  46. {linuxfabrik_lib-3.2.0 → linuxfabrik_lib-3.4.0}/veeam.py +0 -0
  47. {linuxfabrik_lib-3.2.0 → linuxfabrik_lib-3.4.0}/version.py +0 -0
  48. {linuxfabrik_lib-3.2.0 → linuxfabrik_lib-3.4.0}/wildfly.py +0 -0
  49. {linuxfabrik_lib-3.2.0 → linuxfabrik_lib-3.4.0}/winrm.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: linuxfabrik-lib
3
- Version: 3.2.0
3
+ Version: 3.4.0
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.
@@ -11,7 +11,7 @@
11
11
  """Extends argparse by new input argument data types on demand."""
12
12
 
13
13
  __author__ = 'Linuxfabrik GmbH, Zurich/Switzerland'
14
- __version__ = '2026041003'
14
+ __version__ = '2026041901'
15
15
 
16
16
 
17
17
  # Help text descriptions only - no "Default:" here.
@@ -38,6 +38,13 @@ HELP_TEXTS = {
38
38
  'version is not yet EOL. '
39
39
  'Example: running v26.2.7 (not yet EOL) and v26.2.8 is available.'
40
40
  ),
41
+ '--check-security': (
42
+ 'Alert when the vendor version-check service reports a security-relevant update '
43
+ 'for the currently installed version (security severity, critical vulnerability '
44
+ 'or similar). '
45
+ 'Requires online access to the vendor service. '
46
+ 'Has no effect on plugins that do not implement an upstream security check.'
47
+ ),
41
48
  '--count': (
42
49
  'Number of consecutive checks the threshold must be exceeded before alerting.'
43
50
  ),
@@ -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,8 +96,8 @@ 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
103
  { 'cycle': '1',
@@ -472,6 +472,13 @@ ENDOFLIFE_DATE = {
472
472
 
473
473
 
474
474
  'https://endoflife.date/api/gitlab.json': [
475
+ { 'cycle': '18.11',
476
+ 'eol': '2026-07-16',
477
+ 'latest': '18.11.0',
478
+ 'latestReleaseDate': '2026-04-15',
479
+ 'lts': False,
480
+ 'releaseDate': '2026-04-16',
481
+ 'support': '2026-05-21'},
475
482
  { 'cycle': '18.10',
476
483
  'eol': '2026-06-18',
477
484
  'latest': '18.10.3',
@@ -903,13 +910,20 @@ ENDOFLIFE_DATE = {
903
910
 
904
911
 
905
912
  'https://endoflife.date/api/grafana.json': [
913
+ { 'cycle': '13.0',
914
+ 'eol': False,
915
+ 'latest': '13.0.1',
916
+ 'latestReleaseDate': '2026-04-17',
917
+ 'lts': False,
918
+ 'releaseDate': '2026-04-17',
919
+ 'support': True},
906
920
  { 'cycle': '12.4',
907
921
  'eol': '2027-05-24',
908
- 'latest': '12.4.2',
909
- 'latestReleaseDate': '2026-03-25',
922
+ 'latest': '12.4.3',
923
+ 'latestReleaseDate': '2026-04-14',
910
924
  'lts': False,
911
925
  'releaseDate': '2026-02-24',
912
- 'support': '2026-04-24'},
926
+ 'support': '2026-04-17'},
913
927
  { 'cycle': '12.3',
914
928
  'eol': '2026-08-19',
915
929
  'latest': '12.3.6+security-01',
@@ -1388,8 +1402,8 @@ ENDOFLIFE_DATE = {
1388
1402
  'https://endoflife.date/api/keycloak.json': [
1389
1403
  { 'cycle': '26.6',
1390
1404
  'eol': False,
1391
- 'latest': '26.6.0',
1392
- 'latestReleaseDate': '2026-04-08',
1405
+ 'latest': '26.6.1',
1406
+ 'latestReleaseDate': '2026-04-15',
1393
1407
  'lts': False,
1394
1408
  'releaseDate': '2026-04-08'},
1395
1409
  { 'cycle': '26.5',
@@ -1769,20 +1783,20 @@ ENDOFLIFE_DATE = {
1769
1783
  'https://endoflife.date/api/mastodon.json': [
1770
1784
  { 'cycle': '4.5',
1771
1785
  'eol': False,
1772
- 'latest': '4.5.8',
1773
- 'latestReleaseDate': '2026-03-24',
1786
+ 'latest': '4.5.9',
1787
+ 'latestReleaseDate': '2026-04-15',
1774
1788
  'lts': False,
1775
1789
  'releaseDate': '2025-11-06'},
1776
1790
  { 'cycle': '4.4',
1777
1791
  'eol': False,
1778
- 'latest': '4.4.15',
1779
- 'latestReleaseDate': '2026-03-24',
1792
+ 'latest': '4.4.16',
1793
+ 'latestReleaseDate': '2026-04-15',
1780
1794
  'lts': False,
1781
1795
  'releaseDate': '2025-07-08'},
1782
1796
  { 'cycle': '4.3',
1783
1797
  'eol': '2026-05-06',
1784
- 'latest': '4.3.21',
1785
- 'latestReleaseDate': '2026-03-24',
1798
+ 'latest': '4.3.22',
1799
+ 'latestReleaseDate': '2026-04-15',
1786
1800
  'lts': False,
1787
1801
  'releaseDate': '2024-10-08'},
1788
1802
  { 'cycle': '4.2',
@@ -1988,26 +2002,34 @@ ENDOFLIFE_DATE = {
1988
2002
 
1989
2003
 
1990
2004
  'https://endoflife.date/api/moodle.json': [
2005
+ { 'cycle': '5.2',
2006
+ 'eol': '2027-10-04',
2007
+ 'latest': '5.2.0',
2008
+ 'latestReleaseDate': '2026-04-16',
2009
+ 'lts': False,
2010
+ 'releaseDate': '2026-04-20',
2011
+ 'support': '2027-04-19',
2012
+ 'supportedPhpVersions': '8.2 - 8.4'},
1991
2013
  { 'cycle': '5.1',
1992
2014
  'eol': '2027-04-19',
1993
- 'latest': '5.1.3',
1994
- 'latestReleaseDate': '2026-02-11',
2015
+ 'latest': '5.1.4',
2016
+ 'latestReleaseDate': '2026-04-16',
1995
2017
  'lts': False,
1996
2018
  'releaseDate': '2025-10-06',
1997
2019
  'support': '2026-10-05',
1998
2020
  'supportedPhpVersions': '8.2 - 8.4'},
1999
2021
  { 'cycle': '5.0',
2000
2022
  'eol': '2026-10-05',
2001
- 'latest': '5.0.6',
2002
- 'latestReleaseDate': '2026-02-11',
2023
+ 'latest': '5.0.7',
2024
+ 'latestReleaseDate': '2026-04-16',
2003
2025
  'lts': False,
2004
2026
  'releaseDate': '2025-04-14',
2005
2027
  'support': '2026-04-20',
2006
2028
  'supportedPhpVersions': '8.1 - 8.4'},
2007
2029
  { 'cycle': '4.5',
2008
2030
  'eol': '2027-10-04',
2009
- 'latest': '4.5.10',
2010
- 'latestReleaseDate': '2026-02-11',
2031
+ 'latest': '4.5.11',
2032
+ 'latestReleaseDate': '2026-04-16',
2011
2033
  'lts': True,
2012
2034
  'releaseDate': '2024-10-07',
2013
2035
  'support': '2025-10-06',
@@ -3191,43 +3213,43 @@ ENDOFLIFE_DATE = {
3191
3213
  'support': '2026-03-02'},
3192
3214
  { 'cycle': '8.1',
3193
3215
  'eol': '2026-08-31',
3194
- 'latest': '8.1.2',
3195
- 'latestReleaseDate': '2026-03-16',
3216
+ 'latest': '8.1.3',
3217
+ 'latestReleaseDate': '2026-04-13',
3196
3218
  'lts': False,
3197
3219
  'releaseDate': '2026-02-10',
3198
3220
  'support': '2026-02-10'},
3199
3221
  { 'cycle': '8.0',
3200
3222
  'eol': '2026-06-30',
3201
- 'latest': '8.0.3',
3202
- 'latestReleaseDate': '2026-03-16',
3223
+ 'latest': '8.0.4',
3224
+ 'latestReleaseDate': '2026-04-13',
3203
3225
  'lts': False,
3204
3226
  'releaseDate': '2026-01-12',
3205
3227
  'support': '2026-01-12'},
3206
3228
  { 'cycle': '7.13',
3207
3229
  'eol': '2026-05-31',
3208
- 'latest': '7.13.5',
3209
- 'latestReleaseDate': '2026-03-16',
3230
+ 'latest': '7.13.6',
3231
+ 'latestReleaseDate': '2026-04-13',
3210
3232
  'lts': False,
3211
3233
  'releaseDate': '2025-12-05',
3212
3234
  'support': '2025-12-05'},
3213
3235
  { 'cycle': '7.12',
3214
3236
  'eol': '2026-04-30',
3215
- 'latest': '7.12.6',
3216
- 'latestReleaseDate': '2026-03-16',
3237
+ 'latest': '7.12.7',
3238
+ 'latestReleaseDate': '2026-04-13',
3217
3239
  'lts': False,
3218
3240
  'releaseDate': '2025-10-31',
3219
3241
  'support': '2025-10-31'},
3220
3242
  { 'cycle': '7.11',
3221
3243
  'eol': '2026-03-31',
3222
- 'latest': '7.11.6',
3223
- 'latestReleaseDate': '2026-03-16',
3244
+ 'latest': '7.11.7',
3245
+ 'latestReleaseDate': '2026-04-13',
3224
3246
  'lts': False,
3225
3247
  'releaseDate': '2025-10-17',
3226
3248
  'support': '2025-10-17'},
3227
3249
  { 'cycle': '7.10',
3228
3250
  'eol': '2026-06-30',
3229
- 'latest': '7.10.9',
3230
- 'latestReleaseDate': '2026-03-16',
3251
+ 'latest': '7.10.10',
3252
+ 'latestReleaseDate': '2026-04-13',
3231
3253
  'lts': True,
3232
3254
  'releaseDate': '2025-09-04',
3233
3255
  'support': '2025-09-04'},
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: linuxfabrik-lib
3
- Version: 3.2.0
3
+ Version: 3.4.0
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.
@@ -6,7 +6,7 @@ build-backend = "setuptools.build_meta"
6
6
 
7
7
  [project]
8
8
  name = "linuxfabrik-lib"
9
- version = "3.2.0"
9
+ version = "3.4.0"
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