Python: Выполнение локальной команды Powershell и получение объекта обратно

Python 3.6 / Windows management framework 5.1


import subprocess
import json
output = subprocess.check_output(["powershell.exe", "Get-Process -Name smss | ConvertTo-Json"], shell=True)

#print (output)
#print (type(output))
decoded = output.decode('ascii')
#print(type(decoded))
imported = json.loads(decoded)
#print(imported)
#print(type(imported))

print(imported['StartInfo']['Environment'][4][16:-1])

Python: Экранирование строк от спецсимволов регулярных выражений

Бывает так что из конфига или от пользователя нужно собрать строку, которая потом идёт в регулярное выражение.

Для того чтобы эффективно и быстро заэскейпить все спецссимволы регулярок в этой сроке используется re.escape(контент) - она возвращает заэкранированный контент.

т.е. реально можно использовать вот так:

re.search(re.escape(resource['mask'])+'.*'+re.escape(resource['format']),object.filename)

Postfix: Submission

Ошибка:

Время создания:      Tue, 11 Oct 2016 16:47:12 +0600 (YEKST)
Тема:                Undelivered Mail Returned to Sender
Прикрепленные файлы: Отчёт.txt, Часть.txt
This is the mail system at host mail.MY_COMPANY.ru.
I'm sorry to have to inform you that your message could not
be delivered to one or more recipients. It's attached below.
For further assistance, please send mail to postmaster.
If you do so, please include this problem report. You can
delete your own text from the attached returned message.
               The mail system
<info@tel-kom.ru>: host mail.tel-kom.ru[195.191.82.20] said: 530 5.7.0 Must
issue a STARTTLS command first (in reply to MAIL FROM command)


Oct 11 15:41:32 mail postfix/smtp[39211]: 531A51DA548: to=<abn-korkino@tel-kom.ru>, relay=mail.tel-kom.ru[195.191.82.20]:25, delay=0.43, delays=0.01/0/0.38/0.03, dsn=5.7.0, status=bounced (host mail.tel-kom.ru[195.191.82.20] said: 530 5.7.0 Must issue a STARTTLS command first (in reply to MAIL FROM command))
Oct 11 16:47:12 mail postfix/smtp[42194]: AD6201DA5A1: to=<info@tel-kom.ru>, relay=mail.tel-kom.ru[195.191.82.20]:25, delay=0.42, delays=0.01/0.01/0.37/0.03, dsn=5.7.0, status=bounced (host mail.tel-kom.ru[195.191.82.20] said: 530 5.7.0 Must issue a STARTTLS command first (in reply to MAIL FROM command))

Решение

Включение(раскомментирование) submission в main.cf:

#submission inet n       -       n       -       -       smtpd

+ рестарт постфикса:

/etc/init.d/postfix restart

Python: I broke my pip!

root@Zabbix:~# pip3 freeze
Traceback (most recent call last):
File "/usr/bin/pip3", line 9, in <module>
  load_entry_point('pip==1.5.6', 'console_scripts', 'pip3')()
File "/usr/lib/python3/dist-packages/pkg_resources.py", line 356, in load_entry_point
  return get_distribution(dist).load_entry_point(group, name)
File "/usr/lib/python3/dist-packages/pkg_resources.py", line 2476, in load_entry_point
  return ep.load()
File "/usr/lib/python3/dist-packages/pkg_resources.py", line 2190, in load
  ['__name__'])
File "/usr/lib/python3/dist-packages/pip/__init__.py", line 74, in <module>
  from pip.vcs import git, mercurial, subversion, bazaar  # noqa
File "/usr/lib/python3/dist-packages/pip/vcs/mercurial.py", line 9, in <module>
  from pip.download import path_to_url
File "/usr/lib/python3/dist-packages/pip/download.py", line 25, in <module>
  from requests.compat import IncompleteRead
ImportError: cannot import name 'IncompleteRead'
root@Zabbix:~# pip3 search pip
Traceback (most recent call last):
File "/usr/bin/pip3", line 9, in <module>
  load_entry_point('pip==1.5.6', 'console_scripts', 'pip3')()
File "/usr/lib/python3/dist-packages/pkg_resources.py", line 356, in load_entry_point
  return get_distribution(dist).load_entry_point(group, name)
File "/usr/lib/python3/dist-packages/pkg_resources.py", line 2476, in load_entry_point
  return ep.load()
File "/usr/lib/python3/dist-packages/pkg_resources.py", line 2190, in load
  ['__name__'])
File "/usr/lib/python3/dist-packages/pip/__init__.py", line 74, in <module>
  from pip.vcs import git, mercurial, subversion, bazaar  # noqa
File "/usr/lib/python3/dist-packages/pip/vcs/mercurial.py", line 9, in <module>
  from pip.download import path_to_url
File "/usr/lib/python3/dist-packages/pip/download.py", line 25, in <module>
  from requests.compat import IncompleteRead
ImportError: cannot import name 'IncompleteRead'




FIX


This seems to be an issue with pip's interaction with the requests package. requests dropped the IncompleteRead module but older versions of pip, which you have, still rely on it, newer versions don't.

You should try updating pip via easy_install-3.5 (if you have Python 3.5) or easy_install-3for other versions:


sudo easy_install-3.5 -U pip

or:


sudo easy_install-3 -U pip

and you should be good to go.

Python: Управление pip

Для того чтобы узнать какие версии пакета есть на репозиториях можно воспользоваться кривым приколом с попыткой установки несуществующей версии:

root@Zabbix:~# pip3 install pysmb==sdgsdgh
Downloading/unpacking pysmb==sdgsdgh
Could not find a version that satisfies the requirement pysmb==sdgsdgh (from versions: 1.0.3, 1.1.6, 1.1.8, 1.1.1, 1.1.9, 1.1.2, 1.1.12, 1.1.3, 1.1.5, 1.1.11, 1.1.4, 1.1.9, 1.1.17, 1.1.2, 1.1.4, 1.0.0a, 1.1.16, 1.1.10, 1.1.14, 1.1.16, 1.1.5, 1.1.15, 1.1.0, 1.0.1, 1.0.5, 1.0.1, 1.1.14, 1.1.7, 1.0.5, 1.0.2, 1.1.12, 1.1.7, 1.0.4, 1.0.3, 1.1.18, 1.1.0, 1.0.4, 1.1.3, 1.1.6, 1.1.17, 1.1.8, 1.0.2, 1.1.15, 1.1.10, 1.1.11, 1.1.13, 1.1.18, 1.0.0a, 1.1.13, 1.1.1)
Cleaning up...
No distributions matching the version for pysmb==sdgsdgh
Storing debug log for failure in /root/.pip/pip.log

Устанавливаем нужную нам версию:

pip install pysmb==1.1.18

The Bat! Восстановление писем из повреждённых TBB/tmp

В бат есть два типа файлов которые составляют папку ящика:
1) Само бинарное хранилище писем TBB (Иногда Bat создаёт его резервные копии вида Inbox\bat879F.tmp)
2) Файл индексов хранилища TBN(ранее до версии 4.2 TBI) по которому Bat ориентируется. Часто он автоматически его пересоздаёт, если он утерян, но иногда это может не произойти. Особенно если файл TBB повредился.

Файл TBB можно подменить файлом tmp, переименовав его,  с ненулевой вероятностью получить реиндексацию и новый файл TBN, но опять же в случае повреждённого tmp этого может не произойти.

Можно так же попробовать подсунуть переименованный tmp в новый, ванильный я щик в Bat 7. Есть шансы что он его прочитает даже с повреждением. Затем можно запустить процедуру проверки целостности и уже файлы TBB/TBN из этого ящика вставить обратно в исходный Bat.

Есть так же возможность гранулярного восстановления писем из повреждённого TBB/tmp.

Для этого можно использовать программу tbb2mbx. Она может:

- показать содержимое файла (в виде списка писем
tbb2mbx.exe -ld C:\Users\lol\Desktop\TEST\Inbox\MESSAGES2.TBB

- восстановить любое письмо или группу писем из списка в формате eml с вложениями(если конечно тело письма осталось неповреждённым)
tbb2mbx.exe -x C:\Users\lol\Desktop\TEST\Inbox\MESSAGES3.TBB 00000007.eml
или по списку
tbb2mbx.exe -x C:\Users\lol\Desktop\TEST\Inbox\MESSAGES3.TBB @C:\Users\gan\Desktop\filelist.txt
список можно получить банальным копировнием с окна консоли вывода команды tbb2mbx.exe -ld, только потом нужно с помощью notepad++ сделать групповую замену по регулярному выражению чтобы примести файл в пригодный вид: в "найти и заменить" идёт Найти .*\\ Заменить на пустое поле.

Восстановление идёт в папку C:\Users\lol\AppData\Local\VirtualStore\Windows\SysWOW64



Теперь о главном - как работать с повреждённым TBB/tmp:


Сам файл бинарный и работать с ним можно в ASCII режиме например с помощью специального редактора TED Notepad. Notepad++ не подойдёт потому что его буфер обмена заменяет ряды бинарных нулей на пробелы и ведёт к коррупции бинарных данных файла.

tbb2mbx в случае повреждения(либо в случае файла размером больше 2гб или около ) может отобразить лишь часть писем.

Если нам нужны например только письма за последнюю неделю, то можно с помощью Win версии dd извлечь из файла только его последние 40 или сколько хотите мегабайт:

dd.exe bs=1048576 skip=4200 if=C:\Users\lol\Desktop\TEST\Inbox\MESSAGES.TBB of="C:\Users\lol\Desktop\TEST\Inbox\TAIL.TBB"

Но просто так tbb2mbx этот тэйл не обработает и найдёт в нём 0 писем. Ему нужно начало любого нормального TBB или даже того же файла с которым мы работаем поэтому мы сделаем ещё и это начало:

dd.exe bs=1048576 count=5 if=C:\Users\gan\Desktop\TEST\Inbox\MESSAGES.TBB of="C:\Users\gan\Desktop\TEST\Inbox\MESSAGES2.TBB"

На самом деле 5мб взято грубо(для проверки что tbb2mbx видит начало и несколько первых писем) нужно из него всё до сепаратора писем, который выглядит в ASCII примерно вот так:

! p0   cYћнміT                ј+         DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=mail.ru; s=mail2;
h=References:In-Reply-To:Content-Type:Message-ID:Reply-To:Date:MIME-Version:Subject:To:From; bh=47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU=;
b=eBur0FJd9RYqF71I1Ijd9SD7dFI/ih/MSDtnsNEnhaAmORJ32jzC2zPwbIZd2WNxxTTyVB98Q1wwFGhtaQ1n2Fh4a+2YdEpyZv18hiFghiOerngrsgSmoWmwWvzO6LFHymIeOC05GAs0frb2UhMU+swUtwHqIEVh/ufT40DljCs=;
Return-path: <info@npa74.ru>
Received: from [185.41.170.160] (ident=mail)

Этот сепаратор видно в самом начале файла и потом при разделении границ писем. Он как бы начинается с восклицательного знака.

В нашем "хвосте" файла находим первый такой сепаратор и вставляем его в то место где такой сепаратор встретился в нашем начальном 5мб файле. Всё делается в TED Notepad!


Готовый файл можно скормить tbb2mbx и воспользоваться процедурой экспорта.

А вообще бэкапы рулят. Серьёзно. Надо их проверять.

Postfix: Комплексное удаление ящиков

При использовании связки Postfix + PostfixAdmin возникает необходимость комплексно удалять ящики помеченные неактивными из двух таблиц базы данных и сами директории:


#!/bin/sh

unused_mailboxes=`/usr/local/bin/mysql -u root -D postfix -B -e "SELECT username FROM mailbox WHERE active='0'" | tail -n +2 | sort`

cd /var/spool/mail

removed=0

for i in $unused_mailboxes; do
    echo "    REMOVING $i FROM ALIAS TABLE..."
    /usr/local/bin/mysql -u root -D postfix -B -e "DELETE FROM alias WHERE address="\'$i\'""
 echo "    REMOVING $i FROM MAILBOX TABLE..."
 /usr/local/bin/mysql -u root -D postfix -B -e "DELETE FROM mailbox WHERE username="\'$i\'""
 echo "    REMOVING $i MAILDIR..."
 rm -r $i
 removed=$((removed+1))
done

echo
echo "Complete!"
echo "There was $removed mailboxes removed"

Python: Запрос к MSSQL

https://msdn.microsoft.com/library/mt715796.aspx


apt-get install freetds-dev freetds-bin python-dev
pip install pymssql


import pymssql  
    conn = pymssql.connect(server='yourserver.database.windows.net', user='yourusername@yourserver', password='yourpassword', database='AdventureWorks')  
    cursor = conn.cursor()  
    cursor.execute('SELECT c.CustomerID, c.CompanyName,COUNT(soh.SalesOrderID) AS OrderCount FROM SalesLT.Customer AS c LEFT OUTER JOIN SalesLT.SalesOrderHeader AS soh ON c.CustomerID = soh.CustomerID GROUP BY c.CustomerID, c.CompanyName ORDER BY OrderCount DESC;')  
    row = cursor.fetchone()  
    while row:  
        print str(row[0]) + " " + str(row[1]) + " " + str(row[2])     
        row = cursor.fetchone()