Наработки для сети

[ python ]

14 Nov 2013

К сожалению, разрабатывать мониторилку оказалось бессмысленно ввиду жёсткой конкуренции со стороны Zabbix и Nagios, их продвинутости, и (с выходом Zabbix 2.2) модульности. Однако остались намётки работы с сетью, с помощью некоторых библиотек Python 2, которые, возможно, могут пригодиться для быстрого написания какого-нибудь скрипта без трат время на документацию. Сначала хотел на Гитхаб всё оформить, но потом постеснялся всего того что есть - так как не вижу смысла писать тулзу, которая делает только одну задачу, а если же просматривать множество возможных путей - непонятно, зачем прослойка, если используются те же библиотечные функции.

В общем, тут будет краткий экскурс))

  • HTTP
  • SSH
  • SFTP

1. HTTP

Первое - самое популярное, поэтому начну с него. Для работы буду использовать отличную библиотеку requests. Она есть как в pip, так и в easy_install и вообще на гитхабе лежит, если что.

r = requests.get("http://example.com/stat",
                 auth=('user', 'pass'))
print r.status_code, r.text

Или если нужны параметры:

payload = {'key1': 'value1', 'key2': 'value2'}
cookies = {'sessionid': '45647567568'}
r = requests.get("http://httpbin.org/get",
                 params=payload, cookies=cookies)

То же с POST, просто нужно вызывать requests.post(…)

2. SSH

Для SSH будет использоваться библиотека paramiko (мне она просто понравилась лаконичностью запросов)

import paramiko

client = paramiko.SSHClient()
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())

client.connect(hostname=address, port=port, timeout=3,
                       username='user', password='password')
stdin, stdout, stderr = client.exec_command('ls')
for line in stdout:
    print '... ' + line.strip('\n')
client.close()

3. SFTP

Тут же, пока умеем работать с SSH:

transport = paramiko.Transport((address, port))
transport.connect(username='user', password='password')
sftp = paramiko.SFTPClient.from_transport(transport)
dirlist = sftp.listdir('.')
sftp.mkdir("Input")
sftp.open('Input/status', 'w').write('OK\n')
status = sftp.file("Input/status").read()

sftp.get("Input/status", "new_status.txt")
sftp.put("new_status.txt", "STATUS")

4. SMTP

Воспользуемся библиотекой smtplib

try:
    smtp = smtplib.SMTP(host="example.com", port=25,
                        timeout=3)

    smtp.login('user', 'password')

    smtp.sendmail('fromMe', 'toYou', 'Hello, World!')

    smtp.close()
except socket.timeout:
        pass
except smtplib.SMTPRecipientsRefused as e:
    result = "Cannot send message: " + str(e)
except smtplib.SMTPException as e:
    result = "Cannot login: " + str(e)
except Exception as e:
    result = str(e)