# Alan Adı DNS Kancaları

https://dev.wisecp.com/tr/alan-adi-dns-kancalari

Alan adının nereyi gösterdiğini kuran on kanca: ad sunucuları, DNS kayıtları, DNSSEC ve alt ad sunucuları.

## Genel Bakış

Bu dört alanın ortak yanı şu: hepsi **canlı** çalışır. Okuma da yazma da sağlayıcıya gerçek bir istek gönderir, bizim tarafımızdaki kayıt yalnız aynadır.

Deseni bir kez öğrenin, dördü de aynı: yazma işleminin önünde bir kapı, ardında bir olay; okuma tarafında ise listeyi referansla veren bir filtre.

## Referans

### Ad sunucusu yazımını durdurma

gatedomain.nameservers_save

`AdminServices::save_nameservers()` `ClientDomains:197` iki yoldan da

Ad sunucusu listesi sağlayıcıya yazılmadan önce çalışır; girdiler doğrulanmıştır. Panelden ve müşteri panelinden gelen yolların **ikisi de** buradan geçer.

Parametreler 2

$servicearrayAlan adı hizmet kaydı.

$dnsarrayYazılacak ad sunucusu listesi. Boş olmayan `ns1..ns4` değerleri, sırayla.

Dönüş 1

stringBoş olmayan bir string işlemi **durdurur**; metin hata olarak fırlatılır ve sağlayıcı çağrılmaz. `null` ya da boş string akışı sürdürür.

Dinleyici PHP

```php
Hook::add('gate:domain.nameservers_save', 10, function ($service, $dns) {
    // Transfer surerken NS degistirmek transferi bozar.
    if (($service['status'] ?? '') === 'transfer')
        return 'Transfer surerken ad sunucusu degistirilemez.';

    return null;
});
```

### Ad sunucusu değişikliğini izleme

actiondomain.nameservers_saved

`AdminServices::save_nameservers()` yalnız başarıda

Sağlayıcı çağrısı başarılı döndükten, değerler hizmete işlendikten ve etkinlik kaydı yazıldıktan sonra çalışır.

Parametreler 2

$servicearrayAlan adı hizmet kaydı.

$dnsarraySağlayıcıya yazılan liste.

Dönüş 1

voidDönüş yoksayılır.

Dinleyici PHP

```php
Hook::add('action:domain.nameservers_saved', 10, function ($service, $dns) {
    DnsMonitor::resync($service['name'] ?? '', $dns);
});
```

### DNS kaydı değişikliğini durdurma

gatedomain.dns_record_save

`AdminServices::save_dns_record()` `AdminServices::delete_dns_record()` üç işlem tek kanca

Bir DNS kaydı sağlayıcıda değişmeden önce çalışır. Ekleme, güncelleme ve silmenin **üçü de** aynı kancadan geçer; hangisi olduğunu üçüncü parametre söyler.

Parametreler 3

$servicearrayAlan adı hizmet kaydı.

$recordarrayİşlenecek kayıt: `type`, `name`, `value`, `identity`. Güncellemede ayrıca `ttl` ve `priority`.

$taskstringİşlem: `create`, `update` ya da `delete`.

Dönüş 1

stringBoş olmayan bir string işlemi **durdurur**; metin hata olarak fırlatılır ve sağlayıcı çağrılmaz. `null` ya da boş string akışı sürdürür.

Dinleyici PHP

```php
Hook::add('gate:domain.dns_record_save', 10, function ($service, $record, $task) {
    $type = strtoupper((string) ($record['type'] ?? ''));

    // Posta akisini kesen silmeyi durdur; ekleme ve guncelleme serbest.
    if ($task === 'delete' && $type === 'MX')
        return 'MX kaydi silinemez; once posta ayarlarini degistirin.';

    return null;
});
```

### DNS kaydı değişikliğini izleme

actiondomain.dns_record_saved

`AdminServices::save_dns_record()` yalnız başarıda

Sağlayıcıdaki değişiklik başarıyla tamamlandıktan sonra çalışır.

Parametreler 3

$servicearrayAlan adı hizmet kaydı.

$recordarrayİşlenen kayıt.

$taskstringYapılan işlem.

Dönüş 1

voidDönüş yoksayılır.

Dinleyici PHP

```php
Hook::add('action:domain.dns_record_saved', 10, function ($service, $record, $task) {
    Audit::dns($service['name'] ?? '', $task, $record);
});
```

### DNSSEC kaydı işlemini durdurma

gatedomain.dnssec_save

`AdminServices` ekleme ve silme

Bir DS kaydı sağlayıcıda eklenmeden ya da silinmeden önce çalışır.

Parametreler 3

$servicearrayAlan adı hizmet kaydı.

$recordarrayDS kaydı: `digest`, `key_tag`, `digest_type`, `algorithm`. Silmede ayrıca `identity`.

$verbstring`create` ya da `delete`.

Dönüş 1

stringBoş olmayan bir string işlemi **durdurur**; metin hata olarak fırlatılır ve sağlayıcı çağrılmaz. `null` ya da boş string akışı sürdürür.

Dinleyici PHP

```php
Hook::add('gate:domain.dnssec_save', 10, function ($service, $record, $verb) {
    // Son DS kaydini silmek dogrulamayi komple kapatir.
    if ($verb === 'delete' && Acme::dsCount((int) ($service['id'] ?? 0)) <= 1)
        return 'Son DNSSEC kaydi silinemez.';

    return null;
});
```

### DNSSEC değişikliğini izleme

actiondomain.dnssec_saved

`AdminServices` yalnız başarıda

DS kaydı sağlayıcıda işlendikten sonra çalışır.

Parametreler 3

$servicearrayAlan adı hizmet kaydı.

$recordarrayİşlenen DS kaydı.

$verbstringYapılan işlem.

Dönüş 1

voidDönüş yoksayılır.

Dinleyici PHP

```php
Hook::add('action:domain.dnssec_saved', 10, function ($service, $record, $verb) {
    Audit::dnssec($service['name'] ?? '', $verb, $record['key_tag'] ?? '');
});
```

### Alt ad sunucusu işlemini durdurma

gatedomain.child_ns_save

`ClientDomains` ekleme ve silme

Bir alt ad sunucusu sağlayıcıya eklenmeden ya da silinmeden önce çalışır.

Parametreler 4

$servicearrayAlan adı hizmet kaydı.

$hoststringTam nitelikli ad, örneğin `ns1.example.com`.

$ipstringAda bağlı adres. Silme işleminde boş gelebilir.

$verbstring`create` ya da `delete`.

Dönüş 1

stringBoş olmayan bir string işlemi **durdurur**; metin hata olarak fırlatılır ve sağlayıcı çağrılmaz. `null` ya da boş string akışı sürdürür.

Dinleyici PHP

```php
Hook::add('gate:domain.child_ns_save', 10, function ($service, $host, $ip, $verb) {
    if ($verb === 'delete') return null;

    // Kendi ag blogunuz disindaki adrese glue vermeyin.
    if (!Acme::ownsIp($ip)) return 'Bu IP adresi bize ait degil.';

    return null;
});
```

### Alt ad sunucusu değişikliğini izleme

actiondomain.child_ns_saved

`ClientDomains` yalnız başarıda

Alt ad sunucusu sağlayıcıda işlendikten sonra çalışır.

Parametreler 4

$servicearrayAlan adı hizmet kaydı.

$hoststringİşlenen ad.

$ipstringAda bağlı adres.

$verbstringYapılan işlem.

Dönüş 1

voidDönüş yoksayılır.

Dinleyici PHP

```php
Hook::add('action:domain.child_ns_saved', 10, function ($service, $host, $ip, $verb) {
    Ipam::glue($verb, $host, $ip);
});
```

### Alt ad sunucusu listesini değiştirme

filterdomain.child_ns_list

`Hook::runRefs` referansla

Sağlayıcıdan okunan liste normalleştirildikten sonra, ekrana gitmeden önce çalışır.

Parametreler 2

$listarrayrefNormalleştirilmiş liste: her satır `ns` ve `ip` anahtarlarını taşır. Şekli koruyun; ekran tarafı bu sözleşmeye göre gösterir.

$servicearrayAlan adı hizmet kaydı.

Dönüş 1

voidDeğer **referansla** değişir; dönüş kullanılmaz.

Dinleyici PHP

```php
Hook::add('filter:domain.child_ns_list', 10, function (&$list, $service) {
    // Sekli bozmadan sirala: ekran ns + ip anahtarlarini bekler.
    usort($list, fn ($a, $b) => strcmp($a['ns'] ?? '', $b['ns'] ?? ''));
});
```

### DNSSEC listesini değiştirme

filterdomain.dnssec_records

`Hook::runRefs` referansla

Sağlayıcıdan okunan DS kayıtları normalleştirildikten sonra çalışır.

Parametreler 2

$recordsarrayrefNormalleştirilmiş kayıtlar: `identity`, `digest`, `key_tag`, `digest_type`, `algorithm`. Silme çağrısı `identity` alanını geri gönderir; onu düşürmeyin.

$servicearrayAlan adı hizmet kaydı.

Dönüş 1

voidDeğer **referansla** değişir; dönüş kullanılmaz.

Dinleyici PHP

```php
Hook::add('filter:domain.dnssec_records', 10, function (&$records, $service) {
    // identity alanini KORU: silme cagrisi kaydi onunla hedefler.
    $records = array_values(array_filter($records,
        fn ($r) => (int) ($r['algorithm'] ?? 0) !== 5));   // eski algoritmayi gizle
});
```

## Tuzaklar

> **Tek kapı üç işlemi birden taşır**
> 
> DNS kaydı kapısı ekleme, güncelleme ve silme için **aynı** kancadır. Üçüncü parametreyi okumazsanız "silmeyi engelle" diye yazdığınız kural eklemeyi de engeller. Aynı durum DNSSEC ve alt ad sunucusu kapıları için de geçerlidir: orada işlem türü dördüncü parametrededir.

> **Liste filtrelerinde şekli koruyun**
> 
> Okuma filtreleri ekranın **doğrudan gösterdiği** diziyi verir. Anahtar adını değiştirmek ya da `identity` alanını düşürmek listeyi bozmakla kalmaz, **silme çağrısını da** hedefsiz bırakır: kayıt o alanla bulunur.

> **Kapı iki yoldan da geçilir**
> 
> Ad sunucusu kapısı hem yönetim panelinden hem müşteri panelinden geçer. Kuralınızı "müşteri yapmasın" diye yazarsanız **operatör de** yapamaz. Hangi yoldan gelindiğini ayırmak istiyorsanız hizmet kaydına değil, çağıran bağlama bakın.

> **Yayılma anında değildir**
> 
> Olay kancası sağlayıcının **kabul ettiğini** söyler, dünyanın o kaydı gördüğünü değil. Değişikliğin yayılması dakikalar sürer. Yeni değere göre iş yapan bir dinleyici, doğrulamayı hemen yaparsa **eski cevabı** alır.

## İlgili Makaleler

- [Alan Adı Edinme Kancaları](https://dev.wisecp.com/tr/alan-adi-edinme-kancalari)
- Alan Adı Kancaları
- [Kanca Dinleyicisi Yazma](https://dev.wisecp.com/tr/kanca-dinleyicisi-yazma)
