diff --git a/subdomains/README.md b/subdomains/README.md index 03f5edc5..e149fddd 100644 --- a/subdomains/README.md +++ b/subdomains/README.md @@ -11,6 +11,12 @@ By default every server has a subdomain limit of 0. You can change this limit by Note: You can't create subdomains for servers with `0.0.0.0` or `::` as allocation! +## Configuring domains + +Each domain is composed of a name and an optional prefix. The name must be a valid Cloudflare Zone, while the prefix can be used to specify a subdomain on which the server subdomains will be created. + +For example: when creating a subdomain `server1` on a domain with name `example.com` and prefix `abc`, the created record will be `server1.abc.example.com`. + ## SRV Records In order to create SRV records instead of A/AAAA you need to do the following: diff --git a/subdomains/database/migrations/005_add_prefix_to_cloudflare_domains.php b/subdomains/database/migrations/005_add_prefix_to_cloudflare_domains.php new file mode 100644 index 00000000..e8d51470 --- /dev/null +++ b/subdomains/database/migrations/005_add_prefix_to_cloudflare_domains.php @@ -0,0 +1,22 @@ +string('prefix')->nullable()->after('name'); + }); + } + + public function down(): void + { + Schema::table('cloudflare_domains', function (Blueprint $table) { + $table->dropColumn('prefix'); + }); + } +}; diff --git a/subdomains/lang/de/strings.php b/subdomains/lang/de/strings.php index aebc0008..7c32c2ad 100644 --- a/subdomains/lang/de/strings.php +++ b/subdomains/lang/de/strings.php @@ -13,6 +13,7 @@ 'create_subdomain' => 'Subdomain erstellen', 'name' => 'Name', + 'prefix' => 'Präfix', 'record_type' => 'Record Typ', 'is_synced' => 'Ist synchronisiert?', 'srv_target' => 'SRV Ziel', diff --git a/subdomains/lang/en/strings.php b/subdomains/lang/en/strings.php index a578f9ec..7ce18016 100644 --- a/subdomains/lang/en/strings.php +++ b/subdomains/lang/en/strings.php @@ -13,6 +13,7 @@ 'create_subdomain' => 'Create Subdomain', 'name' => 'Name', + 'prefix' => 'Prefix', 'record_type' => 'Record type', 'is_synced' => 'Is Synced?', 'srv_target' => 'SRV target', diff --git a/subdomains/src/Filament/Admin/Resources/CloudflareDomains/CloudflareDomainResource.php b/subdomains/src/Filament/Admin/Resources/CloudflareDomains/CloudflareDomainResource.php index 3c394e5d..cf2fc742 100644 --- a/subdomains/src/Filament/Admin/Resources/CloudflareDomains/CloudflareDomainResource.php +++ b/subdomains/src/Filament/Admin/Resources/CloudflareDomains/CloudflareDomainResource.php @@ -56,6 +56,8 @@ public static function table(Table $table): Table ->columns([ TextColumn::make('name') ->label(trans('subdomains::strings.name')), + TextColumn::make('prefix') + ->label(trans('subdomains::strings.prefix')), TextColumn::make('subdomains_count') ->label(trans_choice('subdomains::strings.subdomain', 2)) ->counts('subdomains'), @@ -116,12 +118,14 @@ public static function table(Table $table): Table public static function form(Schema $schema): Schema { return $schema - ->columns(1) + ->columns(2) ->components([ TextInput::make('name') ->label(trans('subdomains::strings.name')) ->required() ->unique(), + TextInput::make('prefix') + ->label(trans('subdomains::strings.prefix')), ]); } diff --git a/subdomains/src/Filament/Admin/Resources/Servers/RelationManagers/SubdomainRelationManager.php b/subdomains/src/Filament/Admin/Resources/Servers/RelationManagers/SubdomainRelationManager.php index 5bba4bf1..721128b4 100644 --- a/subdomains/src/Filament/Admin/Resources/Servers/RelationManagers/SubdomainRelationManager.php +++ b/subdomains/src/Filament/Admin/Resources/Servers/RelationManagers/SubdomainRelationManager.php @@ -116,7 +116,7 @@ public function form(Schema $schema): Schema ->alphaDash() ->rule(new NotOnBlacklist()) ->columnSpanFull() - ->suffix(fn (Get $get) => '.' . CloudflareDomain::find($get('domain_id'))?->name), + ->suffix(fn (Get $get) => '.' . CloudflareDomain::find($get('domain_id'))?->nameWithPrefix()), Select::make('domain_id') ->label(trans_choice('subdomains::strings.domain', 1)) ->disabledOn('edit') diff --git a/subdomains/src/Filament/Server/Resources/Subdomains/SubdomainResource.php b/subdomains/src/Filament/Server/Resources/Subdomains/SubdomainResource.php index e9f2f0e6..fa724741 100644 --- a/subdomains/src/Filament/Server/Resources/Subdomains/SubdomainResource.php +++ b/subdomains/src/Filament/Server/Resources/Subdomains/SubdomainResource.php @@ -147,7 +147,7 @@ public static function form(Schema $schema): Schema ->alphaDash() ->rule(new NotOnBlacklist()) ->columnSpanFull() - ->suffix(fn (Get $get) => '.' . CloudflareDomain::find($get('domain_id'))?->name), + ->suffix(fn (Get $get) => '.' . CloudflareDomain::find($get('domain_id'))?->nameWithPrefix()), Select::make('domain_id') ->label(trans_choice('subdomains::strings.domain', 1)) ->disabledOn('edit') diff --git a/subdomains/src/Models/CloudflareDomain.php b/subdomains/src/Models/CloudflareDomain.php index 4d8e3ce4..90a0065f 100644 --- a/subdomains/src/Models/CloudflareDomain.php +++ b/subdomains/src/Models/CloudflareDomain.php @@ -10,12 +10,14 @@ /** * @property int $id * @property string $name + * @property ?string $prefix * @property ?string $cloudflare_id */ class CloudflareDomain extends Model { protected $fillable = [ 'name', + 'prefix', 'cloudflare_id', ]; @@ -33,6 +35,16 @@ public function subdomains(): HasMany return $this->hasMany(Subdomain::class, 'domain_id'); } + public function nameWithPrefix(): string + { + return is_null($this->prefix) ? $this->name : "$this->prefix.$this->name"; + } + + public function prependPrefix(string $subdomain): string + { + return is_null($this->prefix) ? $subdomain : "$subdomain.$this->prefix"; + } + /** @throws Exception */ public function fetchCloudflareId(): void { diff --git a/subdomains/src/Models/Subdomain.php b/subdomains/src/Models/Subdomain.php index 4b808ab9..4c834c4f 100644 --- a/subdomains/src/Models/Subdomain.php +++ b/subdomains/src/Models/Subdomain.php @@ -52,7 +52,7 @@ public function server(): BelongsTo public function getLabel(): string|Htmlable|null { - return $this->name . '.' . $this->domain->name; + return $this->name . '.' . $this->domain->nameWithPrefix(); } /** @throws Exception */ @@ -75,7 +75,7 @@ public function upsertOnCloudflare(): void throw new Exception('Server has no SRV type'); } - $searchName = "$srvServiceType->value.$this->name"; + $searchName = $this->domain->prependPrefix("$srvServiceType->value.$this->name"); $payload = [ 'name' => $searchName, @@ -94,7 +94,7 @@ public function upsertOnCloudflare(): void throw new Exception('Server has invalid allocation ip (0.0.0.0 or ::)'); } - $searchName = $this->name; + $searchName = $this->domain->prependPrefix($this->name); $payload = [ 'name' => $searchName,