-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathDirigentExtension.php
More file actions
117 lines (99 loc) · 5.96 KB
/
DirigentExtension.php
File metadata and controls
117 lines (99 loc) · 5.96 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
<?php
namespace CodedMonkey\Dirigent\DependencyInjection;
use Symfony\Component\Config\Definition\ConfigurationInterface;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\HttpKernel\DependencyInjection\ConfigurableExtension;
use Symfony\Component\String\Slugger\AsciiSlugger;
class DirigentExtension extends ConfigurableExtension
{
protected function loadInternal(array $mergedConfig, ContainerBuilder $container): void
{
$slug = $mergedConfig['slug'];
$slug ??= (new AsciiSlugger())->slug($mergedConfig['title'])->lower()->toString();
$container->setParameter('dirigent.title', $mergedConfig['title']);
$container->setParameter('dirigent.slug', $slug);
$this->registerEncryptionConfiguration($mergedConfig['encryption'], $container);
$this->registerMetadataConfiguration($mergedConfig['metadata'], $container);
$this->registerPackagesConfiguration($mergedConfig['packages'], $container);
$container->setParameter('dirigent.security.public_access', $mergedConfig['security']['public']);
$container->setParameter('dirigent.security.registration_enabled', $mergedConfig['security']['registration']);
if (isset($_SERVER['DIRIGENT_IMAGE'])) {
$container->setParameter('dirigent.storage.path', '/srv/data');
} else {
$container->setParameter('dirigent.storage.path', $mergedConfig['storage']['path']);
}
$container->setParameter('dirigent.dist_mirroring.enabled', $mergedConfig['dist_mirroring']['enabled']);
$container->setParameter('dirigent.dist_mirroring.preferred', $mergedConfig['dist_mirroring']['preferred']);
$container->setParameter('dirigent.dist_mirroring.dev_packages', $mergedConfig['dist_mirroring']['dev_packages']);
}
#[\Override]
public function getConfiguration(array $config, ContainerBuilder $container): ConfigurationInterface
{
return new DirigentConfiguration();
}
/**
* @param array{private_key: ?string, private_key_path: ?string, public_key: ?string, public_key_path: ?string, rotated_keys: array<string>, rotated_key_paths: array<string>} $config
*/
private function registerEncryptionConfiguration(array $config, ContainerBuilder $container): void
{
$container->setParameter('dirigent.encryption.private_key', $config['private_key']);
$container->setParameter('dirigent.encryption.public_key', $config['public_key']);
$container->setParameter('dirigent.encryption.rotated_keys', $config['rotated_keys']);
$container->setParameter('dirigent.encryption.private_key_path', $config['private_key_path']);
$container->setParameter('dirigent.encryption.public_key_path', $config['public_key_path']);
$container->setParameter('dirigent.encryption.rotated_key_paths', $config['rotated_key_paths']);
}
/**
* @param array{mirror_vcs_repositories: bool, retain_stale_revisions: array{enabled: bool, tagged_versions: bool, dev_versions: bool}, retain_pruned_versions: array{enabled: bool, tagged_versions: bool, dev_versions: bool}} $config
*/
private function registerMetadataConfiguration(array $config, ContainerBuilder $container): void
{
$container->setParameter('dirigent.metadata.mirror_vcs_repositories', $config['mirror_vcs_repositories']);
$retainPrunedVersions = $config['retain_pruned_versions']['enabled'];
$container->setParameter(
name: 'dirigent.metadata.retain_pruned_versions.tagged_versions',
value: $retainPrunedVersions && $config['retain_pruned_versions']['tagged_versions'],
);
$container->setParameter(
name: 'dirigent.metadata.retain_pruned_versions.dev_versions',
value: $retainPrunedVersions && $config['retain_pruned_versions']['dev_versions'],
);
$retainStaleRevisions = $config['retain_stale_revisions']['enabled'];
$container->setParameter(
name: 'dirigent.metadata.retain_stale_revisions.tagged_versions',
value: $retainStaleRevisions && $config['retain_stale_revisions']['tagged_versions'],
);
$container->setParameter(
name: 'dirigent.metadata.retain_stale_revisions.dev_versions',
value: $retainStaleRevisions && $config['retain_stale_revisions']['dev_versions'],
);
}
/**
* @param array{periodic_update_interval: string, periodic_updates: bool, dynamic_update_delay: string, dynamic_updates: bool} $config
*/
private function registerPackagesConfiguration(array $config, ContainerBuilder $container): void
{
$dynamicUpdatesEnabled = $config['dynamic_updates'];
$dynamicUpdateDelay = $dynamicUpdatesEnabled ? $config['dynamic_update_delay'] : null;
$periodicUpdatesEnabled = $config['periodic_updates'];
$periodicUpdateInterval = $periodicUpdatesEnabled ? $config['periodic_update_interval'] : null;
if (null !== $dynamicUpdateDelay) {
try {
new \DateInterval($dynamicUpdateDelay);
} catch (\DateMalformedIntervalStringException) {
throw new \LogicException("Invalid dynamic update delay: '$dynamicUpdateDelay' is not a valid ISO 8601 duration.");
}
}
if (null !== $periodicUpdateInterval) {
try {
new \DateInterval($periodicUpdateInterval);
} catch (\DateMalformedIntervalStringException) {
throw new \LogicException("Invalid periodic update interval: '$periodicUpdateInterval' is not a valid ISO 8601 duration.");
}
}
$container->setParameter('dirigent.packages.dynamic_updates', $dynamicUpdatesEnabled);
$container->setParameter('dirigent.packages.dynamic_update_delay', $dynamicUpdateDelay);
$container->setParameter('dirigent.packages.periodic_updates', $periodicUpdatesEnabled);
$container->setParameter('dirigent.packages.periodic_update_interval', $periodicUpdateInterval);
}
}