Установка python 2.7 в Oracle Linux 6

Дефолтным пайтоном в системе Oracle Linux 6 является версия 2.6. Проблема в том, что эта версия пайтона уже очень устарела и не поддерживается многими библиотеками и даже pip (который надо устанавливать из репозитория Epel) не хочет работать без сильного колдунства – выдаёт ошибку “ssl_.py:90: InsecurePlatformWarning: A true SSLContext object is not available. This prevents urllib3 from configuring SSL appropriately and may cause certain SSL connections to fail.”

Потому, если требуется использование модулей, устанавливаемых с помощью pip, то нужно установить более новый пайтон.

Его можно установить из репозитория Software Collection Library для Oracle Linux 6.10. Похожая процедура и для других RHEL 6 систем вроде CentOS 6, но там названия репозиториев и пути могут отличаться.

Выполняем команду:

yum repolist all

И ищем искомый репозиторий (по-умолчанию он выключен – disabled):

Чтобы его включить, выполняем команду:

yum-config-manager --enable public_ol6_software_collections

После чего устанавливаем нужный пайтон и утилиту для управления софтверными коллекциями:

yum install python27 scl-utils

Как зависимости сразу должны подтянуться pip и прочие необходимые пакеты.

Теперь включим пайтон 2.7 для текущей сессии:

scl enable python27 bash

Эта команда запускает новый баш, где по-умолчанию используется 2.7 пайтон вместо 2.6. И можно выполнять скрипты или команды в интерпретаторе. К сожалению, сделать 2.7й системным проблематично.

Чтобы скрипты, запущенные по cron, работали с 2.7 необходимо сделать нижеизложенное.

В задаче крона нужно прописывать путь к интерпретатору 2.7, а не просто к пайтону:

updatedb
locate python2.7

В моём случае это было /opt/rh/python27/root/usr/bin/python

Далее необходимо обновить путь загрузки библиотек, иначе пайтон 2.7, запускаясь по крону, будет выдавать ошибку “ImportError: libpython2.7.so.1.0: cannot open shared object file: No such file or directory”:

locate libpython2.7.so.1.0

В моём случае папка с библотеками пайтона: /opt/rh/python27/root/usr/lib64

Затем добавить этот путь строчкой в этот файл:

nano /etc/ld.so.conf

И выполнить команду:

ldconfig

Всё, теперь скрипты, запущенные по крон, будут работать с пайтоном 2.7. Ну и конечно же в скрипте необходимо указывать абсолютные пути к файлам или командам (например, если вызываете по subprocess).

Также не советую обновлять pip, если он попросит. Иначе вполне вероятно придётся откатывать pip примерно как описано в [6].

Пример задачи, которая выполняется раз в месяц и логирует вывод консоли вместе с ошибками, если таковые будут, в файл job.log:

0 7 1 * * su user -c "/opt/rh/python27/root/usr/bin/python /home/user/project/script.py" > /home/user/project/job.log 2>&1

Ссылки:

  1. https://stackoverflow.com/questions/20842732/libpython2-7-so-1-0-cannot-open-shared-object-file-no-such-file-or-directory
  2. https://yum.oracle.com/oracle-linux-python.html
  3. https://stackoverflow.com/questions/51646558/unable-to-install-python-packages-using-pip-in-ubuntu-linux-insecureplatformwar/54582701#54582701
  4. https://stackoverflow.com/questions/29134512/insecureplatformwarning-a-true-sslcontext-object-is-not-available-this-prevent
  5. https://access.redhat.com/documentation/en-us/red_hat_software_collections/3/html/packaging_guide/sect-enabling_the_software_collection
  6. https://iamsysadmin.net/2019/01/17/how-to-roll-back-pip/

Python, как сконвертировать файл .csv в .xlsx

Нижеприведённый код для конвертации csv -> xlsx работает на python 2.7. На 2.6 мне не удалось установить openpyxl с помощью pip install openpyxl, а на 3й версии io.open нужно заменить на просто open:

import io
from openpyxl import Workbook
# Convert to XLSX
csvfile = 'path_to_file.csv'
xlsxfile = 'path_to_file.xlsx'
workbook = Workbook(xlsxfile)
worksheet = workbook.add_worksheet()
with io.open(csvfile, 'rt', encoding='utf8') as f:
    reader = csv.reader(f)
    for r, row in enumerate(reader):
        for c, col in enumerate(row):
            worksheet.write(r, c, col)
workbook.close()

Ссылки:

  1. https://stackoverflow.com/questions/17684610/python-convert-csv-to-xlsx
  2. https://openpyxl.readthedocs.io/en/stable/index.html

Python, как приложить .xlsx файл к письму e-mail.

В принципе, таким способом можно приложить любой файл, в котором хранится не текстовая информация.

Ниже пример скрипта, отсылающего .xlsx файл:

import smtplib
from email.utils import formatdate
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.base import MIMEBase
from email import encoders

dst_emails = 'recipient1@example.com, recipient2@example.com'
xlsxfile = '/home/user/project1/example.xlsx'

# E-mail block
me = "sender@example.com"
# Filling e-mail info
msg = MIMEMultipart()
msg['Subject'] = "Xlsx file"
msg['From'] = me
msg['To'] = dst_emails
to = msg['To'].split()
msg['Date'] = formatdate(localtime=True)
html = """\
        <html>
          <head></head>
          <body>
            <p><br>
                <strong>This is a test e-mail</strong><br>
                <br>
                Place body text here

                Best regards,<br>
                Example user<br>
            </p>
          </body>
        </html>
        """
# Record the MIME type
letter = MIMEText(html, 'html')
# Attach letter into message container.
msg.attach(letter)
# Attach xlsx file
part = MIMEBase('application', "octet-stream")
part.set_payload(open(xlsxfile, "rb").read())
encoders.encode_base64(part)
part.add_header('Content-Disposition', 'attachment; filename="%s"'%(xlsxfile))
msg.attach(part)
# Send the message via example.com SMTP server.
s = smtplib.SMTP('mail.example.com')
# sendmail function takes 3 arguments: sender's address, recipient's address
# and message to send - here it is sent as one string.
s.sendmail(me, to, msg.as_string())
s.quit()

Ссылки:

  1. https://stackoverflow.com/questions/25346001/add-excel-file-attachment-when-sending-python-email

Подключение репозитория Epel к CentOS 6.x

Подключение репозитория Epel 6.7 к CentOS 6.x. Идем на сайт Эпеля, и скачиваем пакет или скармливаем установщику по URL
 
http://ftp.tlk-l.net/pub/mirrors/fedora-epel/6/i386/repoview/epel-release.html

rpm -Uvh http://ftp.tlk-l.net/pub/mirrors/fedora-epel/6/i386/epel-release-6-7.noarch.rpm
 
UPDATE:
 
Поскольку RHEL6 достигла конца суппорта, то так просто установить уже не получится. Вместо этого нужно вручную создать конфиг репозитория:
 
nano /etc/yum.repos.d/epel.repo
 
С содержимым:
[epel]
name=Extra Packages for Enterprise Linux 6 - $basearch
mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=epel-6&arch=$basearch
failovermethod=priority
enabled=1
gpgcheck=0

После этого делаем yum update

Источники:

  1. https://fedoraproject.org/wiki/EPEL#END_OF_LIFE_RELEASES
  2. https://fedora-archive.ip-connect.info/epel/6/x86_64/Packages/
  3. https://quaded.com/%D0%B4%D0%BE%D0%B1%D0%B0%D0%B2%D0%B8%D1%82%D1%8C-%D1%80%D0%B5%D0%BF%D0%BE%D0%B7%D0%B8%D1%82%D0%BE%D1%80%D0%B8%D0%B9-epel-%D0%B2-centos-6/

Debian пропадают правила iptables после перезагрузки

На старом сервере под управлением Debian 6 такая беда была – после перезагрузки все добавленные правила iptables исчезали. Что было не особо удобно.

Дабы это побороть, сначала сохраняем правила в файл (путь и имя могут быть любые):

iptables-save > /root/iptables.conf

Добавляем следующую команду в /etc/rc.local для применения правил после ребута:

iptables-restore < /etc/iptables.conf

Лучше добавить полный путь к команде, узнать который можно с помощью

which iptables-restore

Также можно добавить крон – каждый час восстанавливать правила. А то у меня они почему-то даже без ребута исчезали периодически.

Ссылки:

  1. https://unix.stackexchange.com/questions/52376/why-do-iptables-rules-disappear-when-restarting-my-debian-system

Windows, автоматическое добавление маршрутов при включении VPN.

Если вы заходите на VPN средставами Windows PPTP/L2TP (не CISCO и т. п. сторонними программами), то у вас есть 2 выбора:

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

Первый вариант – по-умолчанию. Но он плох, т. к. если вы скачиваете/загружаете большие объемы информации, то это неплохо грузит маршрутизатор, который раздаёт доступ в VPN (надо шифровать траффик) и увеличивает задержку вашего соединения (пинг).

При втором варианте – нужно при каждом подключени идобавлять маршруты на те подсети, к которым вы хотите иметь доступ, находясь в VPN. Это можно автоматизировать, о чём я и расскажу ниже.

Для начала нужно отключить передачу всего траффика через VPN. Открываем Центр сетей и общего доступа (Networking and sharing center) в Панели Управления и, зайдя в свойства VPN-соединения, отключаем шлюз по-умолчанию:

Disable default gateway

Далее нам надо создать скрипт .netsh, который будет выполняться и добавлять роуты при подключении. Создаём, например, файл C:\scripts\vpn_route.netsh с содержимым:

interface ipv4
add route prefix=192.168.23.0/24 interface="Work_VPN" store=active
add route prefix=172.16.99.0/24 interface="Work_VPN" store=active
exit

где “Work_VPN” – название VPN соединения в Центре управления сетями и общим доступом. Маршрутов может быть сколько угодно, в примере указаны два.

Далее для выполнения всей магии, необходимо создать задачу в Планировщике, которая будет выполняться при подключении. Открываем консоль cmd от администратора и выполняем команду:

schtasks /create /F /TN "VPN Routes Add" /TR "netsh -f C:\scripts\vpn_route.netsh" /SC ONEVENT /EC Application /RL HIGHEST /MO "*[System[(Level=4 or Level=0) and (EventID=20225)]] and *[EventData[Data='Work_VPN']]"

где указываем путь к созданному ранее netsh файлу и снова же имя VPN соединения. Остальное менять не нужно.

Всё.

Ссылки:

  1. https://oxo42.github.io/windows/2015/03/25/windows-add-route-on-vpn-connect

Как открывать CSV файлы в Excel c нестандартным разделителем

По-умолчанию в Excel разделителем считается символ запятой “,” для файлов CSV. Однако, бывает необходимо открывать файлы CSV с другими разделителями (например, “;”) и чтобы при этом Excel автоматически разбрасывал данные по столбикам, а не воспринимал как просто строчку.

Для достижения этого, открываем файл в текстовом редакторе и добавляем в начало строчку с содержимым (включая кавычки):

"sep=;"

где ; – новый разделитель.

Сохранияем файл и открываем его в Excel.

Ссылки:

  1. https://superuser.com/questions/606272/how-to-get-excel-to-interpret-the-comma-as-a-default-delimiter-in-csv-files

Changing hostname on RHEL

For RHEL 6:

1. Change the HOSTNAME line in /etc/sysconfig/network

2. Change the hostname (FQDN and alias) in /etc/hosts

3. Run /bin/hostname new_hostname for the hostname change to take effect immediately.

4. Run /sbin/service syslog restart for syslog to log using the new hostname.

A reboot is not required to change the system hostname.

For RHEL 7:

Method 1 : hostnamectl

Get the current hostname of the system :

hostnamectl status
Static hostname: localhost.localdomain
Icon name: computer
Chassis: n/a
Machine ID: 55cc1c57c7f24ed0b0d352648024cea6
Boot ID: a12ec8e04e6b4534841d14dc8425e38c
Virtualization: vmware
Operating System: CentOS Linux 7 (Core)
CPE OS Name: cpe:/o:centos:centos:7
Kernel: Linux 3.10.0-123.el7.x86_64
Architecture: x86_64

To set new hostname (butterfly) for the machine :

hostnamectl set-hostname butterfly

Re-login and verify the new hostname :

hostnamectl
Static hostname: butterfly
Pretty hostname: Geeks LAB
Icon name: computer
Chassis: n/a
Machine ID: 55cc1c57c7f24ed0b0d352648024cea6
Boot ID: a12ec8e04e6b4534841d14dc8425e38c
Virtualization: vmware
Operating System: CentOS Linux 7 (Core)
CPE OS Name: cpe:/o:centos:centos:7
Kernel: Linux 3.10.0-123.el7.x86_64
Architecture: x86_64

Method 2 : nmcli

Get the current hostname :

nmcli general hostname
localhost.localdomain

To change the hostname to butterfly :

nmcli general hostname butterfly

We need to restart the systemd-hostnamed service for the changes to take effect :

service systemd-hostnamed restart

Re-login and verify the hostname change :

hostname
butterfly

Method 3 : nmtui

We can also change the hostname using the nmtui tool :

nmtui

Select the option to “set the hostname” and hit enter

change hostname nmtui

Set the hostname

Restart the systemd-hostnamed service for the changes to take effect.

service systemd-hostnamed restart

Re-login and verify the hostname change.

Method 4 : Edit /etc/hostname

cat /etc/hostname
localhost.localdomain

To change the hostname to “butterfly”, replace the content of the /etc/hostname file with “butterfly”

echo "butterfly" > /etc/hostname
cat /etc/hostname
butterfly

Restart the system and verify.

shutdown -r now

Sources:

  1. https://www.thegeekdiary.com/centos-rhel-7-how-to-change-set-hostname/
  2. https://my-hlam.livejournal.com/34233.html?utm_source=3userpost

Как изменить настройки сети в VMWare vCenter Server 6.7 (VCSA)

Недавно возникла необходимость поменять шлюз по умолчанию (default gateway) на vCenter Server 6.7.

Сначала зашел в VAMI (vCenter Server Appliance Management Interface): https://<IP>or<FQDN>:5480 на вкладку Networking:

Нажал Edit, открылся мастер настройки сети, ввёл всё, что необходимо и…. и в итоге он ничего не поменял)

Как оказалось, надо было по-другому действовать.

Нужно зайти на VSCA по ssh.

Для начала включим возможность подключения по ssh на вкладке Access:

Не зря же заходили в VAMI. Теперь заходим по ссх и вводим shell

В консоли вводим команду:

/opt/vmware/share/vami/vami_config_net

Выбираем 0, смотрим текущую конфигурацию.

Затем выбираем то, что нужно изменить. В моём случае это пункт 2. Далее в меню всё интуитивно понятно что вводить и нажимать.

Изменения должны сохраниться и после перезагрузки не пропадут.

Ссылки:

  1. https://digitalkungfu.wordpress.com/2015/02/25/how-to-fix-vcsa-ip-settings-from-command-line/
  2. https://communities.vmware.com/t5/vCenter-Server-Discussions/Changing-default-gateway-on-vCenter-Appliance-version-6/td-p/433249

Не работает Ctrl+C/Ctrl+V в PyCharm или другой среде на основе Intellij IDEA

Я ставил pyCharm очень давно и вот, когда пришла пора его использовать, я понял, что у меня не работают быстрые комбинации копирования и вставки Ctrl+C и Ctrl+V. Это просто катастрофа) но интернет подсказал решение:

1. Нажимаем Ctrl+Alt+S:

2. В поиске вверху слева вводит vim и отключаем плагин или меняем комбинации кнопок везде с vim на IDE, где найдёт поиск:

Всё, конец мучениям)

Ссылки:

  1. https://intellij-support.jetbrains.com/hc/en-us/community/posts/206835985–SOLVED-Ctrl-V-and-Ctrl-C-doesn-t-work-in-intellij-IDEA-14-0-2