The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
---
-   # èçìåíåíèÿ â ðååñòðå
    id: rusu.notify
    weight: 0
    last: 1
    match:
        - from: 'nobody@(?:ripn.net|registry.su)'
            #OR: [ 'nobody@ripn.net', 'nobody@registry.su' ]
        - OR:
           - x_filename: 'NFY.*UPDATED'
           - NOT: { x_filename: ~ }
        - subject: 'Notification of (FID|RIPN) [dD]atabase changes?'
    processors:
        - processor: chain
-   # íîâûé îáúåêò
    id: _rusu.notify.new_object
    weight: 0
    match:
        body: 'New object created'
    processors:
        - processor: filter
          filters:
            - '(?s).*New object created:'
            - '(?s)Thank [yY]ou.*'
        - processor: regexp
          regexps:
              $1=~body: '([\w_-]+):\s*(.+)'
        - processor: last
-   # íîâûé îáúåêò
    id: _rusu.notify.deleted
    weight: 2
    match:
        body:
            - '\n(PREVIOUS OBJECT|Îáúåêò):\s*\n'
            - '\n(DELETED|ÓÄÀËÅÍ)\s*\n'
    processors:
        - processor: regexp
          regexps:
              domain=~body: 'domain:\s*(.+)'
        - processor: last
-   # ïåðåíîñ ê íàì èíèöèèðîâàí
    id: _rusu.notify.transfer_in_started
    weight: 1
    match:
        body:
            - '\n(REPLACED BY|Çàìåíåí íà):\s*\n'
            - '\n(PREVIOUS OBJECT|Îáúåêò):\s*\n'
            - '\n\s{0,2}domain:\s+(.+?)\n'
            - '\n\+ reg\-ch:\s+(TEST)?REG(?:[12]|RU)\d?-[\w-]+\n' # äëÿ òåñòîâ
    processors:
        - processor: filter
          filters:
          # îñòàâëÿåì òîëüêî òåêñò ïîñëå "REPLACED BY", òî åñòü íà ÷òî çàìåí¸í
            - '(?s).*(REPLACED BY|Çàìåíåí íà):'
            - '(?s)Thank you.*'
            - [ 'registrar', 'transfer_from' ]
            - [ '\+ reg\-ch', 'transfer_to'  ]
        - processor: regexp
          regexps:
            $1=~body: '\s*(.+?):\s*(.+)'
        - processor: last
-   # ïåðåíîñ çàêîí÷åí (îò íàñ èëè ê íàì)
    id: _rusu.notify.transfer_finished
    weight: 1
    match:
        body:
          - '\n(REPLACED BY|Çàìåíåí íà):\s*\n'
          - '\n(PREVIOUS OBJECT|Îáúåêò):\s*\n'
          - '\n\s{0,2}domain:\s+(.+?)\n'
          - '\n\* registrar:\s+[\w-]+\n'
          - '\n\- reg\-ch:\s+[\w\-]+\n'
    processors:
        - processor: filter
          filters:
            - '(?s).*(PREVIOUS OBJECT|Îáúåêò):'
            - '(?s)(REPLACED BY|Çàìåíåí íà):.*'
            - [ '(?m)^\* registrar', 'transfered_from' ]
            - [ '(?m)^\- reg\-ch', 'transfered_to' ]
        - processor: regexp
          regexps:
            $1=~body: '\s*(.+?):\s*(.+)'
        - processor: last
-   # íîâûé îáúåêò
    id: _rusu.notify.updated
    weight: 1.5
    match:
       body:
          - '(?:PREVIOUS OBJECT|Îáúåêò)'
          - '(?:REPLACED BY|Çàìåíåí íà)'
    processors:
        - processor: regexp
          regexps:
            domain=~body,once: 'domain:\s*(.+)'
            req_id=~subject: 'Re: ([\d\.]+)'
            $1=~body: '(?m-s)^([*+]\s+.+?):\s+(.+)$'
        - processor: last
-   # íåò äåíåã
    id: _rusu.notify.nomoney
    weight: 2
    match:
       body: 'Not enough money for new domain'
    processors:
        - processor: last
-   # ñïèñîê äîìåíîâ çà ìåñÿö
    id: rusu.domains_report
    weight: 10
    match:
        - from:
            OR: [ 'nobody@ripn.net', 'nobody@registry.su' ]
        - OR:
           - x_filename: 'NFY.*TCSTAT'
           - NOT: { x_filename: ~ }
        - subject: 'Domain report for'
    processors:
        - processor: regexp
          regexps:
            date=~subject,once: 'for ([-\w\d]+)'
            subject=~subject,once: '(.*)'
            total=~body,once: 'Èòîãî (\d+) øò'
            sum=~body,once: 'íà ñóììó (\d+\.\d+) ðóá'
            body=~body,once: '(?s)(.*)'
        - processor: last
-   # ñèñòåìíûå óâåäîìëåíèÿ
    id: rusu.registry.notify
    weight: 7
    last: 1
    match:
        - from:
            OR: [ 'nobody@ripn.net', 'nobody@registry.su' ]
        - OR:
           - x_filename: 'NFY.*(TCSF|NOMON|NEWMONEY|REGCREDIT|REGSPEED)'
           - NOT: { x_filename: ~ }
        - subject: 'TC-[SR]U'
    processors:
        - processor: chain
-   # óäàëèëè îáúåêò
    id: _rusu.registry.notify.deleted_text
    match:
        - body:
          - 'Ñðîê ðåãèñòðàöèè äîìåíà\s*[-\w\d\.]+\s*çàêîí÷èëñÿ.'
    processors:
        - processor: regexp
          regexps:
            domain=~body: 'ðåãèñòðàöèè äîìåíà ([-\w\d\.]+)'
        - processor: last
-   # îò÷¸ò î äåíüãàõ ïðèø¸ë
    id: _rusu.registry.notify.nomon
    match:
      subject: 'Áàëàíñ ëèöåâîãî ñ÷[å¸]òà äîãîâîðà (?:59/TC-REG|6/SU-REG)'
    processors:
        - processor: regexp
          regexps:
            debet=~body: 'â íàëè÷èè ñðåäñòâ: ([\d\.]+) ðóá'
            credit=~body: 'Óñòàíîâëåíî êðåäèòîâ: ([\d\.]+) ðóá'
            available=~body: 'Äîñòóïíî äëÿ èñïîëüçîâàíèÿ: ([\d\.]+) ðóá'
        - processor: last
-   # îò÷¸ò î ïîïîëíåíèè ñ÷¸òà
    id: _rusu.registry.notify.newmoney
    match:
      subject: 'Çà÷èñëåíû ñðåäñòâà â ðàçìåðå'
    processors:
        - processor: regexp
          regexps:
            newmoney=~subject: 'â ðàçìåðå ([\d\.]+) ðóá'
        - processor: last
-   # îò÷¸ò îá èçìåíåíèè êðåäèòà
    id: _rusu.registry.notify.regcredit
    match:
      subject: 'Óñòàíîâëåí ìåñÿ÷íûé êðåäèò â ðàçìåðå'
    processors:
        - processor: regexp
          regexps:
            regcredit=~subject: 'â ðàçìåðå ([\d\.]+) ðóá'
        - processor: last
#Subject: TC-RU: Ñêîðîñòü äîñòóïà â ÒÖ äëÿ REGRU-REG-RIPN - 450 çàÿâîê/÷àñ.
-   # ñêîðîñòü äîñòóïà ïîìåíÿëè
    id: _rusu.registry.notify.regspeed
    match:
      subject: 'Ñêîðîñòü äîñòóïà â ÒÖ äëÿ REGRU-REG-RIPN'
    processors:
        - processor: regexp
          regexps:
            regspeed=~subject: 'REGRU-REG-RIPN - (\d+) çàÿâîê/÷àñ'
        - processor: last
-  # îòâåò íà action: NEW
    id: rusu.response.new
    weight: 2
    match:
        - from:
            OR: [ 'nobody@ripn.net', 'nobody@registry.su' ]
        - OR:
            - x_filename: 'ANS'
            - NOT: { x_filename:  ~ }
        - body:
           - 'Dear Colleague'
           - '(?i)action:\s*NEW'
    processors:
        - processor: filter
          filters:
            - [ '(?s)> #\[TEMPLATES END\]#.*', "> #[TEMPLATES END]#\n" ]
        - processor: split_msg
          begin: '(?si)action:\s*NEW[^#]*#\[DOMAIN TEMPLATE\]#'
          separator: '> #\[DOMAIN TEMPLATE\]#'
          end: '> #\[TEMPLATES END\]#'
          emulate: 0
        - processor: chain
- # âñ¸ ïëîõî
    id: _rusu.response.new.fail
    match:
        body: 'FATAL ERROR|Not enough money for new domain|Credit balance low'
    processors:
        - processor: filter
          filters:
            #- '(?s).*#\[DOMAIN TEMPLATE]\#'
            - '.*FATAL ERRORS.*'
        - processor: regexp
          regexps:
             error_code=~body:   '(?m)^(?!>).+'
             domain=~body:       '>\s*domain:\s*(.+)'
             req_id=~subject:    'Re: ([\d\.]+)'

- # âñ¸ õîðîøî
    id: _rusu.response.new.ok
    weight: -1
    match:
        body: 'New object created'
    processors:
        - processor: regexp
          regexps:
            domain=~body: '>\s*domain:\s*(.+)'
            req_id=~subject: 'Re: ([\d\.]+)'
-
    id: rusu.response.update
    weight: 1
    match:
       - from:
            OR: [ 'nobody@ripn.net', 'nobody@registry.su' ]
       - OR:
           - x_filename: 'ANS'
           - NOT: { x_filename: ~ }
       - body:
           - 'Dear Colleague'
           - '(?i)action:\s*UPDATE'
    processors:
        - processor: filter
          filters:
            - [ '(?s)> #\[TEMPLATES END\]#.*', "> #[TEMPLATES END]#\n" ]
        - processor: split_msg
          begin: '(?si)action:\s*UPDATE[^#]*#\[DOMAIN TEMPLATE\]#'
          separator: '> #\[DOMAIN TEMPLATE\]#'
          end: '> #\[TEMPLATES END\]#'
          emulate: 0
        - processor: chain
-
    id: _rusu.response.update.ok
    match:
        body:
            #- '\n(PREVIOUS OBJECT|Îáúåêò):\n'
            #- '\n(DELETED|ÓÄÀËÅÍ)\n'
            - '(PREVIOUS OBJECT|Îáúåêò)'
            - '(REPLACED BY|Çàìåíåí íà)'
    processors:
        - processor: regexp
          regexps:
            domain=~body: '>\s*domain:\s*(.+)'
            req_id=~subject: 'Re: ([\d\.]+)'
            $1=~body: '(?m-s)^[*+]\s+(.+?):\s+(.+)$'
-
    id: _rusu.response.update.fail
    weight: 1
    match:
        body: 'FATAL ERROR'
    processors:
        - processor: filter
          filters:
            #- '(?s).*#\[DOMAIN TEMPLATE]\#'
            - '.*FATAL ERRORS.*'
        - processor: regexp
          regexps:
             error_code=~body:   '(?m)^(?!>).+'
             domain=~body:       '>\s*domain:\s*(.+)'
             req_id=~subject:    'Re: ([\d\.]+)'
-
    id: rusu.response.delete
    weight: 5
    match:
       - from:
            OR: [ 'nobody@ripn.net', 'nobody@registry.su' ]
       - OR:
           - x_filename: 'ANS'
           - NOT: { x_filename: ~ }
       - body:
           - 'Dear Colleague'
           - 'action:\s*DELETE'
    processors:
        - processor: filter
          filters:
            - [ '(?s)> #\[TEMPLATES END\]#.*', "> #[TEMPLATES END]#\n" ]
        - processor: split_msg
          begin: '(?s)action:\s*DELETE[^#]*#\[DOMAIN TEMPLATE\]#'
          separator: '> #\[DOMAIN TEMPLATE\]#'
          end: '> #\[TEMPLATES END\]#'
          emulate: 0
        - processor: chain
-
    id: _rusu.response.delete.ok
    match:
        body:
            - '\n(?:PREVIOUS OBJECT|Îáúåêò):\n'
            - '\n(?:DELETED|Óäàë[å¸]í)\n'
    processors:
        - processor: regexp
          regexps:
            domain=~body: '>\s*domain:\s*(.+)'
            req_id=~subject: 'Re: ([\d\.]+)'
            $1=~body: '(?m-s)^[*+]\s+(.+?):\s+(.+)$'
-
    id: _rusu.response.delete.fail
    match:
        body: 'FATAL ERROR'
    processors:
        - processor: filter
          filters:
            #- '(?s).*#\[DOMAIN TEMPLATE]\#'
            - '.*FATAL ERRORS.*'
        - processor: regexp
          regexps:
             error_code=~body:   '(?m)^(?!>).+'
             domain=~body:       '>\s*domain:\s*(.+)'
             req_id=~subject:    'Re: ([\d\.]+)'
-
    id: rusu.response.renew
    weight: 3
    match:
        - from:
            OR: [ 'nobody@ripn.net', 'nobody@registry.su' ]
        - OR:
           - x_filename: 'ANS'
           - NOT: { x_filename:  ~ }
        - body:
           - 'Dear Colleague'
           - '(?i)action:\s*PROLONG'
    processors:
        - processor: filter
          filters:
            - [ '(?s)> #\[TEMPLATES END\]#.*', "> #[TEMPLATES END]#\n" ]
        - processor: split_msg
          begin: '(?si)action:\s*PROLONG[^#]*#\[DOMAIN TEMPLATE\]#'
          separator: '> #\[DOMAIN TEMPLATE\]#'
          end: '> #\[TEMPLATES END\]#'
          emulate: 0
        - processor: chain
-
    id: _rusu.response.renew.ok
    match:
        body:
            - '(PREVIOUS OBJECT|Îáúåêò)'
            - '(REPLACED BY|Çàìåíåí íà)'
    processors:
        - processor: regexp
          regexps:
            domain=~body: '>\s*domain:\s*(.+)'
            req_id=~subject: 'Re: ([\d\.]+)'
            reg_till=~body: '(?m-s)^[*]\s+reg-till:\s+(.+)$'
-
    id: _rusu.response.renew.fail
    weight: 1
    match:
        body: 'FATAL ERROR|Not enough money for new domain|Credit balance low'
    processors:
        - processor: filter
          filters:
            #- '(?s).*#\[DOMAIN TEMPLATE]\#'
            - '.*FATAL ERRORS.*'
        - processor: regexp
          regexps:
             error_code=~body:   '(?m)^(?!>).+'
             domain=~body:       '>\s*domain:\s*(.+)'
             req_id=~subject:    'Re: ([\d\.]+)'
-
    id: rusu.get_response
    weight: 4
    match:
       - from:
            OR: [ 'nobody@ripn.net', 'nobody@registry.su' ]
       - OR:
           - x_filename: 'ANS'
           - NOT: { x_filename: ~ }
       - body:
#           - 'Information on object'
           - 'action:\s*GET'
    processors:
      - processor: split_msg
        begin:  '> #\[(?:DOMAIN|REGISTRAR) TEMPLATE\]#\n'
        separator:  '> #\[(?:DOMAIN|REGISTRAR) TEMPLATE\]#\n'
        end:    '> #\[TEMPLATES END\]#\n\n'
        #emulate: 1
      - processor: chain
-
    id: _rusu.get_response.ok
    match:
        body: 'Information on object'
    processors:
        - processor: filter
          filters:
            - '(?m).*Information on object.*\n\n'
        - processor: regexp
          regexps:
            req_id=~subject: 'Re: ([\d\.]+)'
            $1=~body: '(?m-s)^\s*([^\n>].+?):\s+(.+)$'
-
    id: _rusu.get_response.fail
    match:
        body: 'FATAL ERROR'
    processors:
        - processor: filter
          filters:
            #- '(?s).*#\[DOMAIN TEMPLATE]\#'
            - '.*FATAL ERRORS.*'
        - processor: regexp
          regexps:
             error_code=~body:   '(?m)^(?!>).+'
             domain=~body:       '>\s*domain:\s*(.+)'
             req_id=~subject:    'Re: ([\d\.]+)'
-   # íåàâòîðèçîâàííûé äîñòóï
    id: rusu.authfailed
    weight: 9
    last: 1
    match:
        - from:
            OR: [ 'nobody@ripn.net', 'nobody@registry.su' ]
        - OR:
           - x_filename: 'AUTH.*AUTHFAILED'
           - NOT: { x_filename: ~ }
        - OR:
           - message_id: 'AUTH.*AUTHFAILED'
           - body: 'FID database access authentication violation'
           - body: '(?s)ïîïûòêå íåàâòîðèçîâàííîãî\näîñòóïà'
    processors:
        - processor: regexp
          regexps:
            authfailed=~subject: '(?s)(.*)'
        - processor: last
- # îøèáêà â çàïðîñå
    id: rusu.ansfailed
    weight: 9
    last: 1
    match:
        - from:
            OR: [ 'nobody@ripn.net', 'nobody@registry.su' ]
        - OR:
           - x_filename: 'ANS.*ANSFAILED'
           - NOT: { x_filename: ~ }
        - OR:
           - message_id: 'ANS.*ANSFAILED'
           - body: 'We are sorry to disappoint You'
    processors:
        - processor: regexp
          regexps:
            req_id=~subject: 'Request ([\d.]+)\:'
        - processor: last
#-   # ñëèøêîì ìíîãî çàïðîñîâ çà ÷àñ
#    id: rusu.requests_limit
#    last: 1
#    match:
#        - from:
#            OR: [ 'nobody@ripn.net', 'nobody@registry.su' ]
#        - body:
#            - 'Your request is not processed'
#            - 'maximum requests per hour limit'
##        - OR:
##           - x_filename: 'AUTH.*AUTHFAILED'
##           - NOT: { x_filename: ~ }
##        - message_id: 'AUTH.*AUTHFAILED'
#    processors:
#        - processor: last
-
  id: gtld.transfer_finished
  match:
    from: automail@resellerclub.com
    to: reg@reg.ru
    subj: '^Transfer Request.*Completed'
  processors:
    - processor: regexp
      regexps:
          domain=~body: '(?i)Domain Name: ([\-a-z0-9\.]+)'
          order_id=~body: '(?i)Order ID: (\d+)'
- # Ïåðåíîñ îò íàñ â ïðåäåëàõ DirectI
  id: gtld.moveout_finished
  match:
    from: automail@resellerclub.com
    to: reg@reg.ru
    subj: 'Completed: [\-a-z0-9\.]+ moved to another Account'
  processors:
    - processor: regexp
      regexps:
          domain=~subject: 'Completed: ([\-a-z0-9\.]+)'
- # Ïåðåíîñ îò íàñ çà DirectI
  id: gtld.transout_finished
  match:
    from: automail@resellerclub.com
    to: reg@reg.ru
    subj: 'Completed: [\-a-z0-9\.]+ transferred away to'
  processors:
    - processor: regexp
      regexps:
          domain=~subject: 'Completed: ([\-a-z0-9\.]+)'