Git post-receive Python перехватывает электронную почту на окнах не удается: [Errno 10107] Системный вызов не выполнен - PullRequest
0 голосов
/ 13 октября 2018

У меня есть коллекция пустых репозиториев Git на сервере Windows 2012.Я хочу настроить уведомления по электронной почте на push.

Я создал хук пост-получения, содержащий:

#!C:/Program\ Files/Git/usr/bin/sh.exe
/c/Python27/python.exe hooks/pr.py $* >> log.txt

и скрипт Python:

#!/usr/bin/env python
from __future__ import with_statement

import re
import smtplib
import subprocess
import sys
import time
import traceback
from collections import defaultdict
from email.mime.text import MIMEText
from StringIO import StringIO

MAILINGLIST = 'hooks.mailinglist'
EMAILPREFIX = 'hooks.emailprefix'
SMTP_SUBJECT = 'hooks.smtp-subject'
SMTP_HOST = 'hooks.smtp-host'
SMTP_PORT = 'hooks.smtp-port'
SMTP_SENDER = 'hooks.smtp-sender'
SMTP_SENDER_PASSWORD = 'hooks.smtp-sender-password'
POST_RECEIVE_LOGFILE = 'hooks.post-receive-logfile'

class Mailer(object):
    def __init__(self, smtp_host, smtp_port,
                 sender, sender_password, recipients):
        self.smtp_host = smtp_host
        self.smtp_port = smtp_port
        self.sender = sender
        self.sender_password = sender_password
        self.recipients = recipients

    def send(self, subject, reply_to, message):
        if not self.recipients:
            return

        mime_text = MIMEText(message, _charset='utf-8')
        mime_text['From'] = self.sender
        mime_text['Reply-To'] = reply_to
        mime_text['To'] = ', '.join(self.recipients)
        mime_text['Subject'] = subject

        print("send email to %s:%d..." % (self.smtp_host, self.smtp_port))
        server = smtplib.SMTP(self.smtp_host, self.smtp_port)
        print("ehlo...")
        server.ehlo()
        print("sendmail...")
        server.sendmail(self.sender, self.recipients, 
                        mime_text.as_string())
        print("rset...")
        server.rset()
        print("quit...")
        server.quit()
        print("email sent")

def git_config_get(name):
    p = subprocess.Popen(['git', 'config', '--get', name], 
                         stdout=subprocess.PIPE)
    # Cut off the last \n character.
    return p.stdout.read()[:-1]

def get_config_variables():
    def optional(variable):
        config[variable] = git_config_get(variable)
        print("%s=%s" % (variable, config[variable]))
    def required(variable, type_=str):
        v = git_config_get(variable)
        if not v:
            raise RuntimeError('This script needs %s to work.' % variable)
        config[variable] = type_(v)
    def recipients(variable):
        v = git_config_get(variable)
        config[variable] = [r for r in re.split(' *, *| +', v) if r]

    config = {}
    optional(EMAILPREFIX)
    optional(SMTP_SUBJECT)
    required(SMTP_HOST)
    required(SMTP_PORT, int)
    required(SMTP_SENDER)
    required(SMTP_SENDER_PASSWORD)
    recipients(MAILINGLIST)
    return config

def main():
    try:
        config = get_config_variables()
        mailer = Mailer(config[SMTP_HOST], config[SMTP_PORT],
                        config[SMTP_SENDER], config[SMTP_SENDER_PASSWORD],
                        config[MAILINGLIST])
        mailer.send('test', 'test@my_smtp_server.com', 'message')
    except Exception as ex:
        print('Error: %s' % ex)

if __name__ == '__main__':
    main()
  • если я вручную запускаю из git's sh.exe /c/Python27/python.exe hooks/pr.py >> log.txt, электронное письмо отправляется
  • , если я вручную запускаю "c:\Program Files\Git\usr\bin\sh.exe" hooks\post-receive из windows cmd.exe, электронное письмо отправляется
  • , но когда выполняется ловушкаавтоматически, log.txt сообщает, что на линии Error: [Errno 10107] A system call has failed server = smtplib.SMTP(self.smtp_host, self.smtp_port)

Я заметил, что при автоматическом запуске whoami сообщает IIS_user, который является ограниченным пользователем.Поэтому я попытался использовать PsExec для запуска промежуточного сценария:

WD=$(pwd)
/c/Share/PSTools/PsExec \\\\localhost -accepteula -nobanner -w $WD -u domain\\me -p mypa$$word "c:\\Program Files\\Git\\usr\bin\\sh.exe" $WD/hooks/pr.sh

с pr.sh, содержащим

/c/Python27/python.exe hooks/pr.py >> test.txt

Это дает ошибку [Errno 10107] A system call has failed при создании объекта smtplib.SMTP,теперь даже когда я вызываю ловушку вручную.

Следующий шаг, я настроил локальный SMTP-сервер с полностью открытым доступом на данный момент, и я предоставил разрешения как для своего собственного пользователя, так и для локального пользователя IIS.

Теперь я могу отправить электронное письмо, когда запускаю ловушку вручную (с моими учетными данными), но я получаю Error: [Errno 10061] No connection could be made because the target machine actively refused it

...