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

Программирование на sh, быть может немного про альтернативные языки
Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
Аватара пользователя
xM
ст. лейтенант
Сообщения: 1316
Зарегистрирован: 2009-01-15 23:57:41
Откуда: Königsberg
Контактная информация:

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

Непрочитанное сообщение xM » 2017-05-01 19:33:55

Ситуация следующая. В 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
Наверняка есть вариант покрасивее.
IT voodoo blog https://kostikov.co

Хостинговая компания Host-Food.ru
Хостинг HostFood.ru
 

Услуги хостинговой компании Host-Food.ru

Хостинг HostFood.ru

Тарифы на хостинг в России, от 12 рублей: https://www.host-food.ru/tariffs/hosting/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2000 рублей (HP Proliant G5, Intel Xeon E5430 (2.66GHz, Quad-Core, 12Mb), 8Gb RAM, 2x300Gb SAS HDD, P400i, 512Mb, BBU):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/

Аватара пользователя
Alex Keda
стреляли...
Сообщения: 35454
Зарегистрирован: 2004-10-18 14:25:19
Откуда: Made in USSR
Контактная информация:

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

Непрочитанное сообщение Alex Keda » 2017-05-15 9:49:20

чего некрасиво-то?
работает - и хай работает
Убей их всех! Бог потом рассортирует...

Аватара пользователя
xM
ст. лейтенант
Сообщения: 1316
Зарегистрирован: 2009-01-15 23:57:41
Откуда: Königsberg
Контактная информация:

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

Непрочитанное сообщение xM » 2017-05-16 12:16:35

Alex Keda писал(а): чего некрасиво-то?
Нет чувства удовлетворённости :-)
IT voodoo blog https://kostikov.co

Аватара пользователя
f_andrey
майор
Сообщения: 2651
Зарегистрирован: 2007-12-26 1:22:58
Откуда: СПб
Контактная информация:

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

Непрочитанное сообщение f_andrey » 2017-05-16 13:54:30

Тогда будь пацаном, реализуй модификацию RFC 5322 http://emailregex.com/ :evil:
Если ваша тема перенесена, то смотри http://forum.lissyara.su/viewtopic.php?f=1&t=32308

Аватара пользователя
xM
ст. лейтенант
Сообщения: 1316
Зарегистрирован: 2009-01-15 23:57:41
Откуда: Königsberg
Контактная информация:

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

Непрочитанное сообщение xM » 2017-05-16 17:22:20

f_andrey писал(а): Тогда будь пацаном, реализуй модификацию RFC 5322 http://emailregex.com/
Это не о том. Но ссылка хорошая, спасибо.
IT voodoo blog https://kostikov.co

zg
полковник
Сообщения: 5845
Зарегистрирован: 2007-12-07 13:51:33
Откуда: Верх-Нейвинск

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

Непрочитанное сообщение zg » 2017-06-01 21:32:02

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

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

Аватара пользователя
xM
ст. лейтенант
Сообщения: 1316
Зарегистрирован: 2009-01-15 23:57:41
Откуда: Königsberg
Контактная информация:

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

Непрочитанное сообщение xM » 2017-06-01 23:01:44

zg, @ забыли.
IT voodoo blog https://kostikov.co

zg
полковник
Сообщения: 5845
Зарегистрирован: 2007-12-07 13:51:33
Откуда: Верх-Нейвинск

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

Непрочитанное сообщение zg » 2017-06-02 6:40:07

ой, точно :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

Аватара пользователя
xM
ст. лейтенант
Сообщения: 1316
Зарегистрирован: 2009-01-15 23:57:41
Откуда: Königsberg
Контактная информация:

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

Непрочитанное сообщение xM » 2017-06-02 11:30:58

zg писал(а): тут нужен перл
Скрипач не нужен.
zg писал(а): изначальный вариант тоже вполне красивый и рабочий
Рабочий да. А эстетического удовлетворения, как раз, нет :-)
IT voodoo blog https://kostikov.co

zg
полковник
Сообщения: 5845
Зарегистрирован: 2007-12-07 13:51:33
Откуда: Верх-Нейвинск

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

Непрочитанное сообщение zg » 2017-06-02 12:34:05

Эстетика это, конечно, да :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:

Аватара пользователя
xM
ст. лейтенант
Сообщения: 1316
Зарегистрирован: 2009-01-15 23:57:41
Откуда: Königsberg
Контактная информация:

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

Непрочитанное сообщение xM » 2017-06-02 12:56:46

zg писал(а): #!/usr/bin/env php
И этот скрипач тоже не нужен. А так-то вариантов вагон. Возможно даже, что где-то есть даже какой-нибудь Perl или Python модуль для этого.
Но я привык не умножать сущности без нужды.
IT voodoo blog https://kostikov.co