Страница 1 из 1

Получить e-mail адрес из SOA-записи DNS

Добавлено: 2017-05-01 19:33:55
xM
Ситуация следующая. В SOA-записях DNS хранится e-mail адрес в несколько необычном формате и его нужно оттуда извлечь (это просто) привести в божеский вид (несколько сложнее).
Например, e-mail this.my.email@my.lovely.personal.domain будет записан в SOA как this\.my\.email.my.lovely.personal.domain..
Задача обратить его в первоначальный вид средствами shell.
Я эту проблему решил набором перезаписей в sed но как-то, на мой вкус, некрасиво.

Код: Выделить всё

# echo "this\.my\.email.my.lovely.personal.domain." | sed -e 's/\\\./\\/g' -e 's/\./@/' -e 's/\\/\./g' -e 's/.$//'
this.my.email@my.lovely.personal.domain
Наверняка есть вариант покрасивее.

Получить e-mail адрес из SOA-записи DNS

Добавлено: 2017-05-15 9:49:20
Alex Keda
чего некрасиво-то?
работает - и хай работает

Получить e-mail адрес из SOA-записи DNS

Добавлено: 2017-05-16 12:16:35
xM
Alex Keda писал(а): чего некрасиво-то?
Нет чувства удовлетворённости :-)

Получить e-mail адрес из SOA-записи DNS

Добавлено: 2017-05-16 13:54:30
f_andrey
Тогда будь пацаном, реализуй модификацию RFC 5322 http://emailregex.com/ :evil:

Получить e-mail адрес из SOA-записи DNS

Добавлено: 2017-05-16 17:22:20
xM
f_andrey писал(а): Тогда будь пацаном, реализуй модификацию RFC 5322 http://emailregex.com/
Это не о том. Но ссылка хорошая, спасибо.

Получить e-mail адрес из SOA-записи DNS

Добавлено: 2017-06-01 21:32:02
zg

Код: Выделить всё

% echo "this\.my\.email.my.lovely.personal.domain." | sed 's/\\././g;s/\.$//'
this.my.email.my.lovely.personal.domain

Получить e-mail адрес из SOA-записи DNS

Добавлено: 2017-06-01 23:01:44
xM
zg, @ забыли.

Получить e-mail адрес из SOA-записи DNS

Добавлено: 2017-06-02 6:40:07
zg
ой, точно :smile:

ну тогда тут нужен перл, я не знать, как сед уметь ассершин

Код: Выделить всё

% echo "this\.my\.email.my.lovely.personal.domain." | perl -ne '~s/(?<!\\)\./@/; ~s/\.$//; ~s/\\\././g; print;'
this.my.email@my.lovely.personal.domain
UPD: хотя изначальный вариант тоже вполне красивый и рабочий, если его немного сократить

Код: Выделить всё

% echo "this\.my\.email.my.lovely.personal.domain." | sed 's/\\\./\\/g; s/\./@/; s/\\/\./g; s/.$//' 
this.my.email@my.lovely.personal.domain

Получить e-mail адрес из SOA-записи DNS

Добавлено: 2017-06-02 11:30:58
xM
zg писал(а): тут нужен перл
Скрипач не нужен.
zg писал(а): изначальный вариант тоже вполне красивый и рабочий
Рабочий да. А эстетического удовлетворения, как раз, нет :-)

Получить e-mail адрес из SOA-записи DNS

Добавлено: 2017-06-02 12:34:05
zg
Эстетика это, конечно, да :smile: можно и так сделать

soaemail.php

Код: Выделить всё

#!/usr/bin/env php
<?php 

interface Filter {
    function filter($data);
}

class CompositeFilter implements Filter
{
    private $filters = [];
    
    function addFiter(Filter $filter)
    {
        $this->filters[] = $filter;
    }
    
    function filter($data)
    {
        foreach ($this->filters as $filter) {
            $data = $filter->filter($data);
        }
        
        return $data;
    }
}

class SobakenFilter implements Filter
{
    function filter($data)
    {
        return preg_replace('~(?<!\\\\)\\.~', '@', $data, 1);
    }
}

class LastDotFilter implements Filter
{
    function filter($data)
    {
        return preg_replace('~\\.$~', '', $data);
    }
}

class StripSpacesFilter implements Filter
{
    function filter($data)
    {
        return trim($data);
    }
}

class StripSlashesFilter implements Filter
{
    function filter($data)
    {
        return stripslashes($data);
    }
}

class SoaEmailFilter extends CompositeFilter
{
    function __construct()
    {
        $this->addFiter(new StripSpacesFilter());
        $this->addFiter(new SobakenFilter());
        $this->addFiter(new LastDotFilter());
        $this->addFiter(new StripSlashesFilter());
    }
}

$filter = new SoaEmailFilter();

foreach (file('php://stdin') as $line) {
    echo $filter->filter($line), PHP_EOL;
} 
Использование

Код: Выделить всё

% echo "this\.my\.email.my.lovely.personal.domain." | ./soaemail.php
this.my.email@my.lovely.personal.domain
Ещё можно каждый класс тестами покрыть, потом в композер и на гитхаб :-D красотищща :drinks:

Получить e-mail адрес из SOA-записи DNS

Добавлено: 2017-06-02 12:56:46
xM
zg писал(а): #!/usr/bin/env php
И этот скрипач тоже не нужен. А так-то вариантов вагон. Возможно даже, что где-то есть даже какой-нибудь Perl или Python модуль для этого.
Но я привык не умножать сущности без нужды.