Геолокація для IP-адреси

Достатньо простий скрипт на python. Повертає ISO код країни для IP-адреси. Використовується для визначення чи належить ip-адреса до українського сегмента. Я цей скрипт використав у конфіг-файлі поштового сервера Exim4 (приклад нижче скрипту) Читати далі →

Пошук по серверу в терміналі

Давно вже користуюсь mc і шукаю через менюшку, бо це зручно як мені здається. Але життя бентежне та інколи зайвого на сервер не ставлять і тоді треба щось пошукати по простому

Для початку, треба знайти txt-файли у яких є  “такий собі текст” Читати далі →

logrotate

Як організувати обертання (ротацію)  лог-файлів (наприклад для Ubuntu). Наприклад маємо /var/www/path/data.log який треба це робити щотижня та зберігати 10 файлів.

тут коротко, щоб не захаращувати зайвим.

sudo nano /etc/logrotate.d/data.log

текст Читати далі →

Синхронізація двох баз данних

Треба синхронізувати деякі таблиці для того щоб працювати з точною реплікою бази і не навантажувати основний сервер БД.

Цікава задача, довго думав як це зробити. гугління не допомагало і ось прийшло натхнення.

1) спочатку створюємо цільову базу на сервері БД:
sudo -u postgres psql
postgres=# CREATE DATABASE [dbname];
postgres=# CREATE USER [username] WITH PASSWORD ‘[password]‘;
postgres=# GRANT ALL PRIVILEGES ON DATABASE [dbname] TO [username];
дозволяю зовнішні підключення тут:
sudo nano /etc/postgresql/[version]/main/pg_hba.conf
для дозволу підключатись з іншого хоста додати такий рядок:
host [dbname] [username] [IP addr зовнішнього хоста] md5
sudo service postgresql restart

2)далі треба встановити модулі для скрипта

pip install sqlalchemy pyodbc psycopg2

3)у скрипті заповнюємо MSSQL_CONNECTION_LINE POSTGRESQL_CONNECTION_LINE TABLE_NAME валідними даними:

import time
from sqlalchemy import create_engine, Table, Column, Integer, String, MetaData, select, insert


# constants
# example: mssql+pyodbc://username:password@mssql_server
MSSQL_CONNECTION_LINE = 'mssql+pyodbc://username:password@mssql_server'
# example: postgresql://username:password@postgres_server/dbname
POSTGRESQL_CONNECTION_LINE = 'postgresql://username:password@postgres_server/dbname'
# Define block size for sync
BLOCK_SIZE = 1000
# MSSQL table name to synchronize
TABLE_NAME = 'table_name'

# Connect to MSSQL database
mssql_engine = create_engine(MSSQL_CONNECTION_LINE)
# Connect to PostgreSQL database
postgres_engine = create_engine(POSTGRESQL_CONNECTION_LINE)
# Read metadata from MSSQL
mssql_metadata = MetaData(bind=mssql_engine)
table = Table(TABLE_NAME, mssql_metadata, autoload=True)
# Create table in PostgreSQL if it doesn't exist postgres_metadata = MetaData(bind=postgres_engine) table.metadata = postgres_metadata table.create(checkfirst=True) # because after first run all other runs table exist
# Get total number of rows from MSSQL
mssql_conn = mssql_engine.connect()
row_count = mssql_conn.execute(select([table.c.id]).select_from(table).count()).scalar()
mssql_conn.close()
# Copy data from MSSQL to PostgreSQL in blocks
postgres_conn = postgres_engine.connect()
total_time = 0
for i in range(0, row_count, BLOCK_SIZE):
    start_time = time.perf_counter()
    data = mssql_conn.execute(select([table]).select_from(table).offset(i).limit(BLOCK_SIZE))
    postgres_conn.execute( insert(table).from_select(table.columns.keys(), data)
        .on_conflict_do_update( index_elements=table.primary_key,
        set_={c: getattr(table.c, c) for c in table.columns.keys()}
        )
    )
    end_time = time.perf_counter()
    batch_time = end_time - start_time
postgres_conn.close()

print(f"Table: {TABLE_NAME}")
print(f"Total rows synced: {row_count}")
print(f"Total time: {total_time:.2f} seconds")

Запускаємо скрипт. якщо не буде помилок – виведе в консоль як довго перекачував данні для таблиці. Щонайменше раз треба подивитись щоб дізнатись час синхронізації

Отримати із WHOIS дату подовження домену

Невеликий скрипт для отримання дати закінчення домену із whois бази. Можливо отримати реєстратора та багато іншого, але в цілому завдання скрипту отримати дату закінчення реєстрації домену який передається як аргумент командного рядка.

Скрипт можливо використовувати як функцію у CMS (як і планується, але пізніше)

Читати далі →

Django/Wagtail публікація в Docker

Для публікації проєкт Django/Wagtail треба налаштувати Docker контейнер.

Власне цим і займемось. Проект тестовий, тому вважаємо, БД SQLite або окремий сервер БД. Це шаблон, звичайно можемо змінювати версії всього до актуальних,  стандартний сервер для розробки (python manage.py runserver) замінити на unicorn для продакшену і таке інше.
Читати далі →

Зробити свій розклад та організація робочого часу

Це так званий тайм менеджмент.

Головне – роби те, що подобається. Це основа для драйву, який робить можливим будь-яке досягнення.

Читати далі →