wnm 0.0.8__py3-none-any.whl → 0.0.10__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.
Potentially problematic release.
This version of wnm might be problematic. Click here for more details.
- wnm/__init__.py +1 -1
- wnm/__main__.py +206 -953
- wnm/actions.py +45 -0
- wnm/common.py +21 -0
- wnm/config.py +653 -1
- wnm/decision_engine.py +388 -0
- wnm/executor.py +1292 -0
- wnm/firewall/__init__.py +13 -0
- wnm/firewall/base.py +71 -0
- wnm/firewall/factory.py +95 -0
- wnm/firewall/null_firewall.py +71 -0
- wnm/firewall/ufw_manager.py +118 -0
- wnm/migration.py +42 -0
- wnm/models.py +389 -122
- wnm/process_managers/__init__.py +23 -0
- wnm/process_managers/base.py +203 -0
- wnm/process_managers/docker_manager.py +371 -0
- wnm/process_managers/factory.py +83 -0
- wnm/process_managers/launchd_manager.py +592 -0
- wnm/process_managers/setsid_manager.py +340 -0
- wnm/process_managers/systemd_manager.py +443 -0
- wnm/reports.py +286 -0
- wnm/utils.py +403 -0
- wnm-0.0.10.dist-info/METADATA +316 -0
- wnm-0.0.10.dist-info/RECORD +28 -0
- {wnm-0.0.8.dist-info → wnm-0.0.10.dist-info}/WHEEL +1 -1
- wnm-0.0.8.dist-info/METADATA +0 -93
- wnm-0.0.8.dist-info/RECORD +0 -9
- {wnm-0.0.8.dist-info → wnm-0.0.10.dist-info}/entry_points.txt +0 -0
- {wnm-0.0.8.dist-info → wnm-0.0.10.dist-info}/top_level.txt +0 -0
wnm/models.py
CHANGED
|
@@ -1,122 +1,320 @@
|
|
|
1
|
-
import json_fix
|
|
2
|
-
|
|
3
1
|
# Turn a class into a storable object with ORM
|
|
4
2
|
from typing import Optional
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
from sqlalchemy
|
|
8
|
-
|
|
9
|
-
|
|
3
|
+
|
|
4
|
+
import json_fix
|
|
5
|
+
from sqlalchemy import (
|
|
6
|
+
Float,
|
|
7
|
+
ForeignKey,
|
|
8
|
+
Integer,
|
|
9
|
+
Unicode,
|
|
10
|
+
UnicodeText,
|
|
11
|
+
create_engine,
|
|
12
|
+
insert,
|
|
13
|
+
select,
|
|
14
|
+
update,
|
|
15
|
+
)
|
|
16
|
+
from sqlalchemy.orm import (
|
|
17
|
+
DeclarativeBase,
|
|
18
|
+
Mapped,
|
|
19
|
+
mapped_column,
|
|
20
|
+
relationship,
|
|
21
|
+
scoped_session,
|
|
22
|
+
sessionmaker,
|
|
23
|
+
)
|
|
24
|
+
|
|
10
25
|
|
|
11
26
|
# create a Base class bound to sqlalchemy
|
|
12
27
|
class Base(DeclarativeBase):
|
|
13
28
|
pass
|
|
14
29
|
|
|
30
|
+
|
|
15
31
|
# Extend the Base class to create our Host info
|
|
16
32
|
class Machine(Base):
|
|
17
|
-
|
|
33
|
+
"""One row per wnm instance (single physical machine)"""
|
|
34
|
+
|
|
35
|
+
__tablename__ = "machine"
|
|
18
36
|
# No schema in sqlite3
|
|
19
37
|
# __table_args__ = {"schema": "colony"}
|
|
20
38
|
id: Mapped[int] = mapped_column(Integer, primary_key=True)
|
|
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
|
-
|
|
39
|
+
|
|
40
|
+
# System configuration
|
|
41
|
+
cpu_count: Mapped[int] = mapped_column(Integer)
|
|
42
|
+
node_cap: Mapped[int] = mapped_column(Integer)
|
|
43
|
+
|
|
44
|
+
# Resource thresholds for adding nodes
|
|
45
|
+
cpu_less_than: Mapped[int] = mapped_column(Integer)
|
|
46
|
+
mem_less_than: Mapped[int] = mapped_column(Integer)
|
|
47
|
+
hd_less_than: Mapped[int] = mapped_column(Integer)
|
|
48
|
+
hdio_read_less_than: Mapped[int] = mapped_column(Integer)
|
|
49
|
+
hdio_write_less_than: Mapped[int] = mapped_column(Integer)
|
|
50
|
+
netio_read_less_than: Mapped[int] = mapped_column(Integer)
|
|
51
|
+
netio_write_less_than: Mapped[int] = mapped_column(Integer)
|
|
52
|
+
|
|
53
|
+
# Resource thresholds for removing nodes
|
|
54
|
+
cpu_remove: Mapped[int] = mapped_column(Integer)
|
|
55
|
+
mem_remove: Mapped[int] = mapped_column(Integer)
|
|
56
|
+
hd_remove: Mapped[int] = mapped_column(Integer)
|
|
57
|
+
hdio_read_remove: Mapped[int] = mapped_column(Integer)
|
|
58
|
+
hdio_write_remove: Mapped[int] = mapped_column(Integer)
|
|
59
|
+
netio_read_remove: Mapped[int] = mapped_column(Integer)
|
|
60
|
+
netio_write_remove: Mapped[int] = mapped_column(Integer)
|
|
61
|
+
|
|
62
|
+
# Load average thresholds
|
|
63
|
+
max_load_average_allowed: Mapped[float] = mapped_column(Float)
|
|
64
|
+
desired_load_average: Mapped[float] = mapped_column(Float)
|
|
65
|
+
|
|
66
|
+
# Delay timers (in seconds, changed from minutes)
|
|
67
|
+
delay_start: Mapped[int] = mapped_column(Integer)
|
|
68
|
+
delay_upgrade: Mapped[int] = mapped_column(Integer)
|
|
69
|
+
delay_remove: Mapped[int] = mapped_column(Integer)
|
|
70
|
+
|
|
71
|
+
# Node configuration
|
|
72
|
+
node_storage: Mapped[str] = mapped_column(UnicodeText)
|
|
73
|
+
rewards_address: Mapped[str] = mapped_column(UnicodeText)
|
|
74
|
+
donate_address: Mapped[str] = mapped_column(UnicodeText)
|
|
75
|
+
|
|
76
|
+
# Port configuration
|
|
77
|
+
port_start: Mapped[int] = mapped_column(Integer)
|
|
78
|
+
metrics_port_start: Mapped[int] = mapped_column(Integer)
|
|
79
|
+
|
|
80
|
+
# System state
|
|
81
|
+
last_stopped_at: Mapped[int] = mapped_column(Integer)
|
|
82
|
+
host: Mapped[str] = mapped_column(UnicodeText)
|
|
83
|
+
crisis_bytes: Mapped[int] = mapped_column(Integer)
|
|
84
|
+
|
|
85
|
+
# Runtime configuration
|
|
86
|
+
environment: Mapped[Optional[str]] = mapped_column(UnicodeText)
|
|
87
|
+
start_args: Mapped[Optional[str]] = mapped_column(UnicodeText)
|
|
88
|
+
|
|
89
|
+
# NEW: Concurrency limits (Phase 5)
|
|
90
|
+
max_concurrent_upgrades: Mapped[int] = mapped_column(Integer, default=1)
|
|
91
|
+
max_concurrent_starts: Mapped[int] = mapped_column(Integer, default=2)
|
|
92
|
+
max_concurrent_removals: Mapped[int] = mapped_column(Integer, default=1)
|
|
93
|
+
|
|
94
|
+
# NEW: Node selection strategy (Phase 6)
|
|
95
|
+
node_removal_strategy: Mapped[str] = mapped_column(
|
|
96
|
+
UnicodeText, default="youngest"
|
|
97
|
+
)
|
|
98
|
+
|
|
99
|
+
# Relationships
|
|
100
|
+
containers: Mapped[list["Container"]] = relationship(
|
|
101
|
+
back_populates="machine", cascade="all, delete-orphan"
|
|
102
|
+
)
|
|
103
|
+
nodes: Mapped[list["Node"]] = relationship(
|
|
104
|
+
back_populates="machine", cascade="all, delete-orphan"
|
|
105
|
+
)
|
|
106
|
+
|
|
107
|
+
def __init__(
|
|
108
|
+
self,
|
|
109
|
+
cpu_count,
|
|
110
|
+
node_cap,
|
|
111
|
+
cpu_less_than,
|
|
112
|
+
cpu_remove,
|
|
113
|
+
mem_less_than,
|
|
114
|
+
mem_remove,
|
|
115
|
+
hd_less_than,
|
|
116
|
+
hd_remove,
|
|
117
|
+
delay_start,
|
|
118
|
+
delay_upgrade,
|
|
119
|
+
delay_remove,
|
|
120
|
+
node_storage,
|
|
121
|
+
rewards_address,
|
|
122
|
+
donate_address,
|
|
123
|
+
max_load_average_allowed,
|
|
124
|
+
desired_load_average,
|
|
125
|
+
port_start,
|
|
126
|
+
hdio_read_less_than,
|
|
127
|
+
hdio_read_remove,
|
|
128
|
+
hdio_write_less_than,
|
|
129
|
+
hdio_write_remove,
|
|
130
|
+
netio_read_less_than,
|
|
131
|
+
netio_read_remove,
|
|
132
|
+
netio_write_less_than,
|
|
133
|
+
netio_write_remove,
|
|
134
|
+
last_stopped_at,
|
|
135
|
+
host,
|
|
136
|
+
crisis_bytes,
|
|
137
|
+
metrics_port_start,
|
|
138
|
+
environment,
|
|
139
|
+
start_args,
|
|
140
|
+
max_concurrent_upgrades=1,
|
|
141
|
+
max_concurrent_starts=2,
|
|
142
|
+
max_concurrent_removals=1,
|
|
143
|
+
node_removal_strategy="youngest",
|
|
144
|
+
):
|
|
145
|
+
self.cpu_count = cpu_count
|
|
146
|
+
self.node_cap = node_cap
|
|
147
|
+
self.cpu_less_than = cpu_less_than
|
|
148
|
+
self.cpu_remove = cpu_remove
|
|
149
|
+
self.mem_less_than = mem_less_than
|
|
150
|
+
self.mem_remove = mem_remove
|
|
151
|
+
self.hd_less_than = hd_less_than
|
|
152
|
+
self.hd_remove = hd_remove
|
|
153
|
+
self.delay_start = delay_start
|
|
154
|
+
self.delay_upgrade = delay_upgrade
|
|
155
|
+
self.delay_remove = delay_remove
|
|
156
|
+
self.node_storage = node_storage
|
|
157
|
+
self.rewards_address = rewards_address
|
|
158
|
+
self.donate_address = donate_address
|
|
159
|
+
self.max_load_average_allowed = max_load_average_allowed
|
|
160
|
+
self.desired_load_average = desired_load_average
|
|
161
|
+
self.port_start = port_start
|
|
162
|
+
self.hdio_read_less_than = hdio_read_less_than
|
|
163
|
+
self.hdio_read_remove = hdio_read_remove
|
|
164
|
+
self.hdio_write_less_than = hdio_write_less_than
|
|
165
|
+
self.hdio_write_remove = hdio_write_remove
|
|
166
|
+
self.netio_read_less_than = netio_read_less_than
|
|
167
|
+
self.netio_read_remove = netio_read_remove
|
|
168
|
+
self.netio_write_less_than = netio_write_less_than
|
|
169
|
+
self.netio_write_remove = netio_write_remove
|
|
170
|
+
self.last_stopped_at = last_stopped_at
|
|
171
|
+
self.host = host
|
|
172
|
+
self.crisis_bytes = crisis_bytes
|
|
173
|
+
self.metrics_port_start = metrics_port_start
|
|
174
|
+
self.environment = environment
|
|
175
|
+
self.start_args = start_args
|
|
176
|
+
self.max_concurrent_upgrades = max_concurrent_upgrades
|
|
177
|
+
self.max_concurrent_starts = max_concurrent_starts
|
|
178
|
+
self.max_concurrent_removals = max_concurrent_removals
|
|
179
|
+
self.node_removal_strategy = node_removal_strategy
|
|
84
180
|
|
|
85
181
|
def __repr__(self):
|
|
86
|
-
return
|
|
87
|
-
f
|
|
88
|
-
f
|
|
89
|
-
f
|
|
90
|
-
f
|
|
91
|
-
f',{self.
|
|
92
|
-
f
|
|
93
|
-
f
|
|
94
|
-
f
|
|
95
|
-
f
|
|
96
|
-
f
|
|
97
|
-
|
|
182
|
+
return (
|
|
183
|
+
f"Machine({self.cpu_count},{self.node_cap},{self.cpu_less_than},{self.cpu_remove}"
|
|
184
|
+
+ f",{self.mem_less_than},{self.mem_remove},{self.hd_less_than}"
|
|
185
|
+
+ f",{self.hd_remove},{self.delay_start},{self.delay_upgrade}"
|
|
186
|
+
+ f",{self.delay_remove}"
|
|
187
|
+
+ f',"{self.node_storage}","{self.rewards_address}","{self.donate_address}"'
|
|
188
|
+
+ f",{self.max_load_average_allowed},{self.desired_load_average}"
|
|
189
|
+
+ f",{self.port_start},{self.hdio_read_less_than},{self.hdio_read_remove}"
|
|
190
|
+
+ f",{self.hdio_write_less_than},{self.hdio_write_remove}"
|
|
191
|
+
+ f",{self.netio_read_less_than},{self.netio_read_remove}"
|
|
192
|
+
+ f",{self.netio_write_less_than},{self.netio_write_remove}"
|
|
193
|
+
+ f",{self.last_stopped_at},{self.host},{self.crisis_bytes}"
|
|
194
|
+
+ f",{self.metrics_port_start},{self.environment},{self.start_args})"
|
|
195
|
+
)
|
|
196
|
+
|
|
98
197
|
def __json__(self):
|
|
99
|
-
return {
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
198
|
+
return {
|
|
199
|
+
"cpu_count": self.cpu_count,
|
|
200
|
+
"node_cap": self.node_cap,
|
|
201
|
+
"cpu_less_than": self.cpu_less_than,
|
|
202
|
+
"cpu_remove": self.cpu_remove,
|
|
203
|
+
"mem_less_than": self.mem_less_than,
|
|
204
|
+
"mem_remove": self.mem_remove,
|
|
205
|
+
"hd_less_than": self.hd_less_than,
|
|
206
|
+
"hd_remove": self.hd_remove,
|
|
207
|
+
"delay_start": self.delay_start,
|
|
208
|
+
"delay_upgrade": self.delay_upgrade,
|
|
209
|
+
"delay_remove": self.delay_remove,
|
|
210
|
+
"node_storage": f"{self.node_storage}",
|
|
211
|
+
"rewards_address": f"{self.rewards_address}",
|
|
212
|
+
"donate_address": f"{self.donate_address}",
|
|
213
|
+
"max_load_average_allowed": self.max_load_average_allowed,
|
|
214
|
+
"desired_load_average": self.desired_load_average,
|
|
215
|
+
"port_start": self.port_start,
|
|
216
|
+
"hdio_read_less_than": self.hdio_read_less_than,
|
|
217
|
+
"hdio_read_remove": self.hdio_read_remove,
|
|
218
|
+
"hdio_write_less_than": self.hdio_write_less_than,
|
|
219
|
+
"hdio_write_remove": self.hdio_write_remove,
|
|
220
|
+
"netio_read_less_than": self.netio_read_less_than,
|
|
221
|
+
"netio_read_remove": self.netio_read_remove,
|
|
222
|
+
"netio_write_less_than": self.netio_write_less_than,
|
|
223
|
+
"netio_write_remove": self.netio_write_remove,
|
|
224
|
+
"last_stopped_at": self.last_stopped_at,
|
|
225
|
+
"host": f"{self.host}",
|
|
226
|
+
"crisis_bytes": self.crisis_bytes,
|
|
227
|
+
"metrics_port_start": self.metrics_port_start,
|
|
228
|
+
"environment": f"{self.environment}",
|
|
229
|
+
"start_args": f"{self.start_args}",
|
|
230
|
+
"max_concurrent_upgrades": self.max_concurrent_upgrades,
|
|
231
|
+
"max_concurrent_starts": self.max_concurrent_starts,
|
|
232
|
+
"max_concurrent_removals": self.max_concurrent_removals,
|
|
233
|
+
"node_removal_strategy": f"{self.node_removal_strategy}",
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
|
|
237
|
+
# NEW: Container table for Docker container management
|
|
238
|
+
class Container(Base):
|
|
239
|
+
"""Optional: Docker containers hosting nodes"""
|
|
240
|
+
|
|
241
|
+
__tablename__ = "container"
|
|
242
|
+
id: Mapped[int] = mapped_column(Integer, primary_key=True)
|
|
243
|
+
|
|
244
|
+
# Foreign key to machine
|
|
245
|
+
machine_id: Mapped[int] = mapped_column(ForeignKey("machine.id"), default=1)
|
|
246
|
+
|
|
247
|
+
# Docker container details
|
|
248
|
+
container_id: Mapped[str] = mapped_column(Unicode(64), unique=True)
|
|
249
|
+
name: Mapped[str] = mapped_column(UnicodeText)
|
|
250
|
+
image: Mapped[str] = mapped_column(UnicodeText)
|
|
251
|
+
status: Mapped[str] = mapped_column(Unicode(32)) # running, stopped, etc.
|
|
252
|
+
created_at: Mapped[int] = mapped_column(Integer)
|
|
253
|
+
|
|
254
|
+
# Relationships
|
|
255
|
+
machine: Mapped["Machine"] = relationship(back_populates="containers")
|
|
256
|
+
nodes: Mapped[list["Node"]] = relationship(
|
|
257
|
+
back_populates="container", cascade="all, delete-orphan"
|
|
258
|
+
)
|
|
259
|
+
|
|
260
|
+
def __init__(
|
|
261
|
+
self,
|
|
262
|
+
container_id,
|
|
263
|
+
name,
|
|
264
|
+
image,
|
|
265
|
+
status,
|
|
266
|
+
created_at,
|
|
267
|
+
machine_id=1,
|
|
268
|
+
):
|
|
269
|
+
self.container_id = container_id
|
|
270
|
+
self.name = name
|
|
271
|
+
self.image = image
|
|
272
|
+
self.status = status
|
|
273
|
+
self.created_at = created_at
|
|
274
|
+
self.machine_id = machine_id
|
|
275
|
+
|
|
276
|
+
def __repr__(self):
|
|
277
|
+
return (
|
|
278
|
+
f'Container({self.id},"{self.container_id}","{self.name}","{self.image}"'
|
|
279
|
+
+ f',"{self.status}",{self.created_at})'
|
|
280
|
+
)
|
|
281
|
+
|
|
282
|
+
def __json__(self):
|
|
283
|
+
return {
|
|
284
|
+
"id": self.id,
|
|
285
|
+
"container_id": f"{self.container_id}",
|
|
286
|
+
"name": f"{self.name}",
|
|
287
|
+
"image": f"{self.image}",
|
|
288
|
+
"status": f"{self.status}",
|
|
289
|
+
"created_at": self.created_at,
|
|
290
|
+
"machine_id": self.machine_id,
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
|
|
112
294
|
# Extend the Base class to create our Node info
|
|
113
295
|
class Node(Base):
|
|
114
|
-
|
|
296
|
+
"""Nodes on host OS or in containers"""
|
|
297
|
+
|
|
298
|
+
__tablename__ = "node"
|
|
115
299
|
# No schema in sqlite3
|
|
116
|
-
#__table_args__ = {"schema": "colony"}
|
|
300
|
+
# __table_args__ = {"schema": "colony"}
|
|
117
301
|
id: Mapped[int] = mapped_column(Integer, primary_key=True)
|
|
302
|
+
|
|
303
|
+
# Foreign key to machine
|
|
304
|
+
machine_id: Mapped[int] = mapped_column(ForeignKey("machine.id"), default=1)
|
|
305
|
+
|
|
306
|
+
# NEW: Optional container reference
|
|
307
|
+
container_id: Mapped[Optional[int]] = mapped_column(
|
|
308
|
+
ForeignKey("container.id"), nullable=True
|
|
309
|
+
)
|
|
310
|
+
|
|
311
|
+
# NEW: Process manager type
|
|
312
|
+
manager_type: Mapped[str] = mapped_column(
|
|
313
|
+
UnicodeText, default="systemd"
|
|
314
|
+
) # "systemd", "docker", "setsid", "antctl", "launchctl"
|
|
315
|
+
|
|
118
316
|
# Maps to antnode-{nodename}
|
|
119
|
-
|
|
317
|
+
node_name: Mapped[str] = mapped_column(Unicode(10))
|
|
120
318
|
# service definition name
|
|
121
319
|
service: Mapped[str] = mapped_column(UnicodeText)
|
|
122
320
|
# User running node
|
|
@@ -134,30 +332,67 @@ class Node(Base):
|
|
|
134
332
|
# Network to use ( Live is evm-arbitrum-one )
|
|
135
333
|
network: Mapped[str] = mapped_column(UnicodeText)
|
|
136
334
|
# Reward address
|
|
137
|
-
wallet: Mapped[Optional[str]] = mapped_column(Unicode(42),index=True)
|
|
335
|
+
wallet: Mapped[Optional[str]] = mapped_column(Unicode(42), index=True)
|
|
138
336
|
# Reported peer_id
|
|
139
337
|
peer_id: Mapped[Optional[str]] = mapped_column(Unicode(52))
|
|
140
338
|
# Node's last probed status
|
|
141
|
-
status: Mapped[str] = mapped_column(Unicode(32),index=True)
|
|
339
|
+
status: Mapped[str] = mapped_column(Unicode(32), index=True)
|
|
142
340
|
# Timestamp of last update
|
|
143
|
-
timestamp: Mapped[int] = mapped_column(Integer,index=True)
|
|
341
|
+
timestamp: Mapped[int] = mapped_column(Integer, index=True)
|
|
144
342
|
# Number of node records stored as reported by node
|
|
145
|
-
records: Mapped[int] = mapped_column(Integer,index=True)
|
|
343
|
+
records: Mapped[int] = mapped_column(Integer, index=True)
|
|
146
344
|
# Node reported uptime
|
|
147
345
|
uptime: Mapped[int] = mapped_column(Integer)
|
|
148
346
|
# Number of shuns
|
|
149
347
|
shunned: Mapped[int] = mapped_column(Integer)
|
|
348
|
+
# Number of connected peers as reported by node
|
|
349
|
+
connected_peers: Mapped[int] = mapped_column(Integer, default=0)
|
|
150
350
|
# Timestamp of node first launch
|
|
151
351
|
age: Mapped[int] = mapped_column(Integer)
|
|
152
|
-
# Host ip
|
|
153
|
-
host: Mapped[
|
|
352
|
+
# Host ip for data
|
|
353
|
+
host: Mapped[str] = mapped_column(UnicodeText)
|
|
354
|
+
# node launch method
|
|
355
|
+
method: Mapped[str] = mapped_column(UnicodeText)
|
|
356
|
+
# node layout
|
|
357
|
+
layout: Mapped[str] = mapped_column(UnicodeText)
|
|
358
|
+
# node environment settings
|
|
359
|
+
environment: Mapped[Optional[str]] = mapped_column(UnicodeText)
|
|
154
360
|
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
361
|
+
# Relationships
|
|
362
|
+
machine: Mapped["Machine"] = relationship(back_populates="nodes")
|
|
363
|
+
container: Mapped[Optional["Container"]] = relationship(back_populates="nodes")
|
|
364
|
+
|
|
365
|
+
def __init__(
|
|
366
|
+
self,
|
|
367
|
+
id,
|
|
368
|
+
node_name,
|
|
369
|
+
service,
|
|
370
|
+
user,
|
|
371
|
+
binary,
|
|
372
|
+
version,
|
|
373
|
+
root_dir,
|
|
374
|
+
port,
|
|
375
|
+
metrics_port,
|
|
376
|
+
network,
|
|
377
|
+
wallet,
|
|
378
|
+
peer_id,
|
|
379
|
+
status,
|
|
380
|
+
timestamp,
|
|
381
|
+
records,
|
|
382
|
+
uptime,
|
|
383
|
+
shunned,
|
|
384
|
+
connected_peers=0,
|
|
385
|
+
age=None,
|
|
386
|
+
host=None,
|
|
387
|
+
method=None,
|
|
388
|
+
layout=None,
|
|
389
|
+
environment=None,
|
|
390
|
+
machine_id=1,
|
|
391
|
+
container_id=None,
|
|
392
|
+
manager_type="systemd",
|
|
393
|
+
):
|
|
159
394
|
self.id = id
|
|
160
|
-
self.
|
|
395
|
+
self.node_name = node_name
|
|
161
396
|
self.service = service
|
|
162
397
|
self.user = user
|
|
163
398
|
self.binary = binary
|
|
@@ -173,20 +408,52 @@ class Node(Base):
|
|
|
173
408
|
self.records = records
|
|
174
409
|
self.uptime = uptime
|
|
175
410
|
self.shunned = shunned
|
|
411
|
+
self.connected_peers = connected_peers
|
|
176
412
|
self.age = age
|
|
177
413
|
self.host = host
|
|
414
|
+
self.method = method
|
|
415
|
+
self.layout = layout
|
|
416
|
+
self.environment = environment
|
|
417
|
+
self.machine_id = machine_id
|
|
418
|
+
self.container_id = container_id
|
|
419
|
+
self.manager_type = manager_type
|
|
178
420
|
|
|
179
421
|
def __repr__(self):
|
|
180
|
-
return
|
|
181
|
-
f',"{self.
|
|
182
|
-
f',"{self.
|
|
183
|
-
f',{self.
|
|
184
|
-
|
|
422
|
+
return (
|
|
423
|
+
f'Node({self.id},"{self.node_name}","{self.service}","{self.user},"{self.binary}"'
|
|
424
|
+
+ f',"{self.version}","{self.root_dir}",{self.port},{self.metrics_port}'
|
|
425
|
+
+ f',"{self.network}","{self.wallet}","{self.peer_id}","{self.status}",{self.timestamp}'
|
|
426
|
+
+ f',{self.records},{self.uptime},{self.shunned},{self.connected_peers},{self.age},"{self.host}"'
|
|
427
|
+
+ f',{self.method},{self.layout},"{self.environment}"'
|
|
428
|
+
+ f',{self.machine_id},{self.container_id},"{self.manager_type}")'
|
|
429
|
+
)
|
|
430
|
+
|
|
185
431
|
def __json__(self):
|
|
186
|
-
return {
|
|
187
|
-
"
|
|
188
|
-
"
|
|
189
|
-
"
|
|
190
|
-
"
|
|
191
|
-
"
|
|
192
|
-
"
|
|
432
|
+
return {
|
|
433
|
+
"id": self.id,
|
|
434
|
+
"node_name": f"{self.node_name}",
|
|
435
|
+
"service": f"{self.service}",
|
|
436
|
+
"user": f"{self.user}",
|
|
437
|
+
"binary": f"{self.binary}",
|
|
438
|
+
"version": f"{self.version}",
|
|
439
|
+
"root_dir": f"{self.root_dir}",
|
|
440
|
+
"port": self.port,
|
|
441
|
+
"metrics_port": self.metrics_port,
|
|
442
|
+
"network": f"{self.network}",
|
|
443
|
+
"wallet": f"{self.wallet}",
|
|
444
|
+
"peer_id": f"{self.peer_id}",
|
|
445
|
+
"status": f"{self.status}",
|
|
446
|
+
"timestamp": self.timestamp,
|
|
447
|
+
"records": self.records,
|
|
448
|
+
"uptime": self.uptime,
|
|
449
|
+
"shunned": self.shunned,
|
|
450
|
+
"connected_peers": self.connected_peers,
|
|
451
|
+
"age": self.age,
|
|
452
|
+
"host": f"{self.host}",
|
|
453
|
+
"method": f"{self.method}",
|
|
454
|
+
"layout": f"{self.layout}",
|
|
455
|
+
"environment": f"{self.environment}",
|
|
456
|
+
"machine_id": self.machine_id,
|
|
457
|
+
"container_id": self.container_id,
|
|
458
|
+
"manager_type": f"{self.manager_type}",
|
|
459
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Process managers for node lifecycle management.
|
|
3
|
+
|
|
4
|
+
Supports multiple backends: systemd, docker, setsid, antctl, launchctl
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from wnm.process_managers.base import NodeProcess, ProcessManager
|
|
8
|
+
from wnm.process_managers.docker_manager import DockerManager
|
|
9
|
+
from wnm.process_managers.factory import get_default_manager_type, get_process_manager
|
|
10
|
+
from wnm.process_managers.launchd_manager import LaunchctlManager
|
|
11
|
+
from wnm.process_managers.setsid_manager import SetsidManager
|
|
12
|
+
from wnm.process_managers.systemd_manager import SystemdManager
|
|
13
|
+
|
|
14
|
+
__all__ = [
|
|
15
|
+
"NodeProcess",
|
|
16
|
+
"ProcessManager",
|
|
17
|
+
"get_process_manager",
|
|
18
|
+
"get_default_manager_type",
|
|
19
|
+
"SystemdManager",
|
|
20
|
+
"DockerManager",
|
|
21
|
+
"SetsidManager",
|
|
22
|
+
"LaunchctlManager",
|
|
23
|
+
]
|