7
7
import libiocage .lib .JailConfigLegacy
8
8
import libiocage .lib .JailConfigResolver
9
9
import libiocage .lib .JailConfigZFS
10
+ import libiocage .lib .JailConfigDefaults
10
11
import libiocage .lib .errors
11
12
import libiocage .lib .helpers
12
13
@@ -45,7 +46,12 @@ class JailConfig(dict, object):
45
46
46
47
"""
47
48
48
- def __init__ (self , data = {}, jail = None , logger = None , new = False ):
49
+ def __init__ (self ,
50
+ data = {},
51
+ jail = None ,
52
+ logger = None ,
53
+ new = False ,
54
+ defaults_file = None ):
49
55
50
56
dict .__init__ (self )
51
57
@@ -59,7 +65,9 @@ def __init__(self, data={}, jail=None, logger=None, new=False):
59
65
if jail :
60
66
self .jail = jail
61
67
fstab = libiocage .lib .JailConfigFstab .JailConfigFstab (
62
- jail = jail , logger = self .logger )
68
+ jail = jail ,
69
+ logger = self .logger
70
+ )
63
71
self .fstab = fstab
64
72
else :
65
73
self .jail = None
@@ -81,9 +89,40 @@ def __init__(self, data={}, jail=None, logger=None, new=False):
81
89
except :
82
90
self ["legacy" ] = False
83
91
92
+ self .defaults_file = defaults_file
93
+ self .defaults = None
94
+
84
95
self .clone (data )
85
96
97
+ def load_defaults (self , defaults_file = None ):
98
+
99
+ if defaults_file is not None :
100
+ self .defaults_file = defaults_file
101
+
102
+ if defaults_file is None and self .jail is not None :
103
+ root_mountpoint = self .jail .host .datasets .root .mountpoint
104
+ defaults_file = f"{ root_mountpoint } /defaults.json"
105
+
106
+ self .defaults = libiocage .lib .JailConfigDefaults .JailConfigDefaults (
107
+ file = defaults_file ,
108
+ logger = self .logger
109
+ )
110
+
86
111
def clone (self , data , skip_on_error = False ):
112
+ """
113
+ Apply data from a data dictionary to the JailConfig
114
+
115
+ Existing jail configuration is not emptied using.
116
+
117
+ Args:
118
+
119
+ data (dict):
120
+ Dictionary containing the configuration to apply
121
+
122
+ skip_on_error (bool):
123
+ Passed to __setitem__
124
+
125
+ """
87
126
for key in data :
88
127
self .__setitem__ (key , data [key ], skip_on_error = skip_on_error )
89
128
@@ -291,9 +330,6 @@ def _set_defaultrouter(self, value, **kwargs):
291
330
value = 'none'
292
331
self .data ['defaultrouter' ] = value
293
332
294
- def _default_defaultrouter (self ):
295
- return None
296
-
297
333
def _get_defaultrouter6 (self ):
298
334
value = self .data ['defaultrouter6' ]
299
335
return value if (value != "none" and value is not None ) else None
@@ -303,9 +339,6 @@ def _set_defaultrouter6(self, value, **kwargs):
303
339
value = 'none'
304
340
self .data ['defaultrouter6' ] = value
305
341
306
- def _default_defaultrouter6 (self ):
307
- return None
308
-
309
342
def _get_vnet (self ):
310
343
return libiocage .lib .helpers .parse_user_input (self .data ["vnet" ])
311
344
@@ -316,16 +349,21 @@ def _set_vnet(self, value, **kwargs):
316
349
def _get_jail_zfs_dataset (self ):
317
350
try :
318
351
return self .data ["jail_zfs_dataset" ].split ()
319
- except :
320
- pass
321
- return []
352
+ except KeyError :
353
+ return []
322
354
323
355
def _set_jail_zfs_dataset (self , value , ** kwargs ):
324
356
value = [value ] if isinstance (value , str ) else value
325
357
self .data ["jail_zfs_dataset" ] = " " .join (value )
326
358
327
359
def _get_jail_zfs (self ):
328
- enabled = libiocage .lib .helpers .parse_user_input (self .data ["jail_zfs" ])
360
+ try :
361
+ enabled = libiocage .lib .helpers .parse_user_input (
362
+ self .data ["jail_zfs" ]
363
+ )
364
+ except :
365
+ enabled = self ._default_jail_zfs ()
366
+
329
367
if not enabled :
330
368
if len (self .jail_zfs_dataset ) > 0 :
331
369
raise libiocage .lib .errors .JailConigZFSIsNotAllowed (
@@ -340,16 +378,13 @@ def _set_jail_zfs(self, value, **kwargs):
340
378
value , true = "on" , false = "off" )
341
379
342
380
def _default_jail_zfs (self ):
343
- # if self.data["jail_zfs"] does not explicitly exist, _get_jail_zfs
344
- # would raise
381
+ # if self.data["jail_zfs"] does not explicitly exist,
382
+ # _get_jail_zfs would raise
345
383
try :
346
- return len (self . jail_zfs_dataset ) > 0
384
+ return len (self [ " jail_zfs_dataset" ] ) > 0
347
385
except :
348
386
return False
349
387
350
- def _default_mac_prefix (self ):
351
- return "02ff60"
352
-
353
388
def _get_resolver (self ):
354
389
return self .__create_special_property_resolver ()
355
390
@@ -370,18 +405,28 @@ def _get_cloned_release(self):
370
405
return self ["release" ]
371
406
372
407
def _get_basejail_type (self ):
373
- return self .data ["basejail_type" ]
374
408
375
- def _default_basejail_type (self ):
409
+ # first see if basejail_type was explicitly set
410
+ try :
411
+ return self .data ["basejail_type" ]
412
+ except :
413
+ pass
414
+
415
+ # if it was not, the default for is 'nullfs' if the jail is a basejail
376
416
try :
377
417
if self ["basejail" ]:
378
418
return "nullfs"
379
419
except :
380
420
pass
421
+
422
+ # otherwise the jail does not have a basejail_type
381
423
return None
382
424
383
425
def _get_login_flags (self ):
384
- return JailConfigList (self .data ["login_flags" ].split ())
426
+ try :
427
+ return JailConfigList (self .data ["login_flags" ].split ())
428
+ except KeyError :
429
+ return JailConfigList (["-f" , "root" ])
385
430
386
431
def _set_login_flags (self , value , ** kwargs ):
387
432
if value is None :
@@ -413,128 +458,17 @@ def _set_tags(self, value, **kwargs):
413
458
logger = self .logger
414
459
)
415
460
416
- def _default_login_flags (self ):
417
- return JailConfigList (["-f" , "root" ])
418
-
419
- def _default_vnet (self ):
420
- return False
421
-
422
- def _default_ip4_saddrsel (self ):
423
- return 1
424
-
425
- def _default_ip6_saddrsel (self ):
426
- return 1
427
-
428
- def _default_ip4 (self ):
429
- return "new"
430
-
431
- def _default_ip6 (self ):
432
- return "new"
433
-
434
- def _default_host_hostname (self ):
435
- return self .jail .humanreadable_name
436
-
437
- def _default_host_hostuuid (self ):
438
- return self ["id" ]
439
-
440
- def _default_host_domainname (self ):
441
- return "none"
442
-
443
- def _default_devfs_ruleset (self ):
444
- return "4"
445
-
446
- def _default_enforce_statfs (self ):
447
- return "2"
448
-
449
- def _default_children_max (self ):
450
- return "0"
451
-
452
- def _default_allow_set_hostname (self ):
453
- return "1"
454
-
455
- def _default_allow_sysvipc (self ):
456
- return "0"
457
-
458
- def _default_allow_raw_sockets (self ):
459
- return "0"
460
-
461
- def _default_allow_chflags (self ):
462
- return "0"
463
-
464
- def _default_allow_mount (self ):
465
- return "0"
466
-
467
- def _default_allow_mount_devfs (self ):
468
- return "0"
469
-
470
- def _default_allow_mount_nullfs (self ):
471
- return "0"
472
-
473
- def _default_allow_mount_procfs (self ):
474
- return "0"
475
-
476
- def _default_allow_mount_zfs (self ):
477
- return "0"
478
-
479
- def _default_allow_mount_tmpfs (self ):
480
- return "0"
481
-
482
- def _default_allow_quotas (self ):
483
- return "0"
484
-
485
- def _default_allow_socket_af (self ):
486
- return "0"
487
-
488
- def _default_sysvmsg (self ):
489
- return "new"
490
-
491
- def _default_sysvsem (self ):
492
- return "new"
493
-
494
- def _default_sysvshm (self ):
495
- return "new"
496
-
497
- def _default_exec_clean (self ):
498
- return "1"
499
-
500
- def _default_exec_fib (self ):
501
- return "0"
502
-
503
- def _default_exec_prestart (self ):
504
- return "/usr/bin/true"
505
-
506
- def _default_exec_start (self ):
507
- return "/bin/sh /etc/rc"
508
-
509
- def _default_exec_poststart (self ):
510
- return "/usr/bin/true"
511
-
512
- def _default_exec_prestop (self ):
513
- return "/usr/bin/true"
514
-
515
- def _default_exec_stop (self ):
516
- return "/bin/sh /etc/rc.shutdown"
517
-
518
- def _default_exec_poststop (self ):
519
- return "/usr/bin/true"
520
-
521
- def _default_exec_timeout (self ):
522
- return "60"
523
-
524
- def _default_stop_timeout (self ):
525
- return "30"
526
-
527
- def _default_mount_devfs (self ):
528
- return "1"
529
-
530
- def _default_mount_fdescfs (self ):
531
- return "1"
532
-
533
- def _default_securelevel (self ):
534
- return "2"
461
+ def _get_host_hostname (self ):
462
+ try :
463
+ return self .data ["host_hostname" ]
464
+ except KeyError :
465
+ return self .jail .humanreadable_name
535
466
536
- def _default_tags (self ):
537
- return []
467
+ def _get_host_hostuuid (self ):
468
+ try :
469
+ return self .data ["host_hostuuid" ]
470
+ except KeyError :
471
+ return self ["id" ]
538
472
539
473
def __create_special_property_resolver (self ):
540
474
@@ -557,6 +491,9 @@ def get_string(self, key):
557
491
return self .__getitem__ (key , string = True )
558
492
559
493
def _skip_on_error (self , ** kwargs ):
494
+ """
495
+ A helper to resolve skip_on_error attribute
496
+ """
560
497
try :
561
498
return kwargs ["skip_on_error" ] is True
562
499
except AttributeError :
@@ -586,8 +523,7 @@ def __getitem__(self, key, string=False):
586
523
587
524
# then fall back to default
588
525
try :
589
- fallback_method = self .__getattribute__ (f"_default_{ key } " )
590
- return self .stringify (fallback_method (), string )
526
+ return self .defaults [key ]
591
527
except :
592
528
raise KeyError (f"Config variable { key } not found" )
593
529
@@ -661,5 +597,6 @@ def stringify(self, value, enabled=True):
661
597
662
598
663
599
class JailConfigList (list ):
600
+
664
601
def __str__ (self ):
665
602
return " " .join (self )
0 commit comments