Справочник по APT
apt (advanced packaging tool) — программа для установки, обновления и удаления программных пакетов в операционных системах Debian и основанных на них (Ubuntu, Edubuntu и т. п.). Способна автоматически устанавливать и настраивать программы для UNIX-подобных операционных систем как из предварительно откомпилированных пакетов, так и из исходных кодов. источник: wikipedia
| Команда | Описание |
|---|---|
| apt-get install packagename | установка пакета с именем packagename, ключ -s симулирует установку, ключ -f форсирует установку зависимостей |
| apt-get update | кеширование списка доступных приложений на удаленных репозитариях |
| add-apt-repository ppa_name | добавление репозитария ppa_name |
| ppa-purge ppa_name | удаление репозитария ppa_name (требуется установка ppa-purge) |
| apt-get upgrade | установка обновлений |
| apt-get dist-upgrade | обновление дистрибутива до последней версии |
| apt-get remove packagename | удаление пакета с именем packagename, ключ --purge удаляет все связанные с пакетом файлы (конфиги и т.д.) |
| apt-get clean | очищает кэш apt (/var/cache/apt/archives/) |
| apt-get autoclean | удаляет старые пакеты |
| apt-get check | обновление кэша apt и поиск сломанных зависимостей |
| apt-get source packagename | скачать исходники для пакета packagename |
| apt-get build-dep packagename | установить зависимости для пакета packagename |
| apt-cache stats | статистика по локальному репозитарию |
| apt-cache depends packagename | список зависимостей для пакета packagename |
| apt-cache dump | список установленных пакетов |
| apt-cache search packagename | ищет пакет packagename в кэше |
| apt-cache show packagename | вывод информации о пакете packagename |
| apt-file search filename | поиск в кэше apt пакета, который содержит файл filename (требуется установка apt-file) |
| sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys keynum | импортировать ключ keynum |
dpkg — это программное обеспечение, являющееся основой системы управления пакетами в Debian. dpkg используется для установки, удаления, и получения информации о .deb пакетах. источник: wikipedia
| Команда | Описание |
|---|---|
| dpkg -i package.deb | установка/обновление пакета package.deb |
| dpkg -R /path/to/dir | установка всех пакетов из папки /path/to/dir |
| dpkg -r package | удаление пакета package (кроме конфигурационных файлов) |
| dpkg -P package | удаление пакета package вместе с конфигурационными файлами |
| dpkg -l | список установленных пакетов |
| dpkg -L packagename | список файлов, установленных пакетом packagename |
| dpkg -S /path/to/filename | поиск установленного пакета, который содержит файл filename |
| dpkg -c package.deb | содержимое пакета package.deb, вместе с путями, по которым будут установлены файлы |
| dpkg -s package | статус и информация о установленном пакете package |
| dpkg -x package.deb /path/to/extract | извлечения содержимого пакета package.deb в папку /path/to/extract |
Дополнительное чтиво:
Справочник по YUM
YUM (Yellow dog Updater, Modified) — открытый консольный менеджер RPM-пакетов. Позволяет облегчить каскадное обновление Linux систем с отслеживанием взаимосвязей RPM-пакетов. Распространяется под лицензией GNU. Первоначально был разработан программистом Seth Vidal и группой волонтёров. Для работы с YUM используется интерфейс командной строки, однако существуют надстройки, предоставляющие графический интерфейс для функционала YUM. источник: wikipedia
| Команда | Описание |
|---|---|
| yum list updates | список пакетов для обновления |
| yum list recent | список пакетов, добавленные за последние 7 дней в любой из подключенных репозиториев |
| yum list installed | список установленных пакетов |
| yum list package | поиск пакета package |
| yum list extras | список пакетов, установленных с неофициальных репозиториев RHN (Red Hat Network) |
| yum search package | поиск пакета package |
| yum install package | установка пакета package |
| yum reinstall package | пере установка пакета package |
| yum info package | информация о пакете package |
| yum deplist package | список зависимостей для пакета package |
| yum remove package | удаление пакета package |
| yum check-update | кэширование списка доступных приложений на удаленных репозиториях |
| yum update | обновить все пакеты до последней версий |
| yum update package | обновить пакет package до последней версии |
| yum whatprovides /path/to/file | определение пакета, которому принадлежит файл file |
| yum grouplist | список групп приложений |
| yum groupinfo groupname | информация о группе groupname |
| yum groupinstall groupname | установка приложений из группы groupname |
| yum groupupdate groupname | обновление приложений из группы groupname |
| yum groupremove groupname | удаление всех приложений, принадлежащих группе groupname |
| yum repolist | список репозиториев |
| yum clean all | очищает кэш yum (/var/cache/yum/) |
RPM (RPM Package Manager) - формат пакетов программного обеспечения и программа, созданная для управления этими пакетами. источник: wikipedia
| Команда | Описание |
|---|---|
| rpm -ivh package.rpm | установка пакета package.rpm |
| rpm -Uvh package.rpm | обновление пакета package.rpm |
| rpm -ev package | удаление пакета package |
| rpm -qa | список всех установленных пакетов, ключ --last - список недавно установленных пакетов |
| rpm -ql package | список файлов, установленных пакетом package |
| rpm -qf /path/to/file | определение пакета, которому принадлежит файл file |
| rpm -qc package | список конфигурационных файлов для пакета package |
| rpm -qpR package.rpm | список зависимостей для пакета package.rpm |
| rpm -qR package | список зависимостей для пакета package |
| rpm2cpio package.rpm | cpio -idv | извлечение содержимого пакета package.rpm в текущею директорию |
Дополнительное чтиво:
Python и менеджер контекста
Наткнулся в интернете на интересный пример использования менеджера контекста и оператора with, но перед тем как я покажу что мне понравилось немного матчасти.
Менеджер контекста представляет собой объект, который создает контекст выполнения внутри оператора with и обладает двумя методами __enter__ и __exit__.
Простой пример использования менеджера контекста и оператора with:
class Logger(object):
def __init__(self, val):
self.val = val
print "%d :: __init__" % self.val
def __enter__(self):
print "%d :: __enter__" % self.val
def __exit__(self, exc_type, exc_val, exc_tb):
print "%d :: __exit__ " % self.val
for i in xrange(5):
with Logger(i) as log:
pass
Истинное предназначения оператора with это замена подхода setup..try..except..finally:
do_init()
try :
do_task()
except SomeError :
do_exception_handling()
finally :
do_exit()
Т.е. мы сначала инициализируем наш ресурс (метод __init__ объект менеджера контекста), потом выполняем попытку работы с нашим ресурсом в блоке try..except..finally (внутренний блок оператора with). Если возник ексепшен то попадаем в ветку except и обрабатываем ошибку (метод __exit__ менеджера контекста). По-окончанию выполняется ветка finally (метод __exit__ менеджера контекста) где производим зачистку и освобождение нашего ресурса.
Добавим обработчик ексепшенов в приведенный выше пример работы с менеджером контекста:
class Logger(object):
def __init__(self, val):
self.val = val
print "%d :: __init__" % self.val
def __enter__(self):
print "%d :: __enter__" % self.val
def __exit__(self, exc_type, exc_val, exc_tb):
print "%d :: __exit__ " % self.val
if exc_type:
print "%d !! error " % self.val
return True
for i in xrange(3):
with Logger(i) as log:
if i == 1:
raise ValueError(i)
Получим такой вывод:
0 :: __init__ 0 :: __enter__ 0 :: __exit__ 1 :: __init__ 1 :: __enter__ 1 :: __exit__ 1 !! error 2 :: __init__ 2 :: __enter__ 2 :: __exit__
Это было беглое введение в менеджер контекста, более подробно можно ознакомится на docs.python.org или у sykora.
А теперь пример кода который мне понравился. Этот код показывает как можно начать работать с несколькими файлами используя менеджер контекст и одновременно с этим подчеркивает всю элегантность и наглядность кода на python, за что мы его и любим :). Причем мы можем не переживать за закрытие файлов и освобождение ресурсов (это уже реализовано внутри метода __exit__ класса mfw), просто передаем имя файлов и режим работы с ним.
class mfw:
"""
mfw : Multi-File With
This utility class is a list of file handles. It implements __enter__
and __exit__ methods so that it can be used via the with clause.
"""
def __init__(self, *args):
self.handles = []
for (the_file, mode) in args:
self.handles.append(open(the_file, mode))
def __enter__(self):
return self.handles
def __exit__(self, type, value, traceback):
for handle in self.handles:
handle.close()
with mfw(('f1.txt', 'r'), ('f2.txt', 'w')) as (infile, outfile):
print infile.name
print outfile.name
Dajngo и статика для админки
Иногда бывает необходимость расширить стандартную django'вскую админку новыми изображениями, javascript, css или прикрутить django-grappelli. Для указания расположения статитки админки существует настройка ADMIN_MEDIA_PREFIX, но есть одна особенность: значение этой настройки должно отличатся от значения MEDIA_URL, иначе при доступе к файлу получим Page not found, а при просмотре папки через брауезер - Permission denied. Последние две ошибки можно увидеть под встроенным, девелоперским, сервером.
Есть два варианта выхода из сложившейся ситуации.
Первый, если у нас такие настройки в settings.py
MEDIA_URL = '/static/' ADMIN_MEDIA_PREFIX = '/static/admin/media/'
то запускаем девелоперский сервер с указанием пути к статике для админки
./manage.py runserver 127.0.0.1:8000 --adminmedia=/fullpath/to/your/admin/media/
Второй, добавляем в settings.py, в переменную ADMIN_MEDIA_PREFIX домен/ip сайта
ADMIN_MEDIA_PREFIX = 'http://127.0.0.1:8000/static/admin/media/'
Fabric : автоматизация административных задач на python
Fabric позволяет автоматизировать разные операции на удаленном хосте, наиболее яркий пример - развёртывание проекта: прогоняем тесты, пакуем нужные файлы и заливаем на сервер, развертываем архив, перезапускаем сервер.
Но одним лишь развертыванием проекта возможности fabric не ограничиваются, большинство административных задач можно реализовать на нем с разными ухищрениями. Для соединения с удаленным хостом используется Paramiko - python-библиотека реализующая протокол SSH2.
Для начала поставим сам fabric
pip install fabric
Следующим этапом надо составить список инструкций, которые хранятся в специально предназначенном файле fabfile.py. Например, напишем простую команду для бекапа папки www на разных серверах:
from fabric.api import *
env.hosts = ['usr1@host1:22', 'usr2@host2:22']
def backup():
run("tar cfvz /tmp/backup.tar.gz /var/www/")
В env.hosts хранится список хостов к которым fabric будет последовательно подключатся и выполнять указанную команду, строка подключения представляют собой обычный адрес хоста, который используется в консольной команде SSH. Имя функции backup() и есть команда которую мы хотим выполнить, а функция run() запускает указанную shell-команду на удаленном хосте.
Запуск производится так:
fab backup
В конечном результате мы получим архив со всеми сайтами в файле /tmp/backup.tar.gz на каждом из указанных серверов. Дальше этот архив можно забрать на локальную машину с помошью функции get(), описана ниже.
Словарь env содержит разные настроечные параметры для fabric, полный список приведен тут. Еще вкусности про которые хотелось бы упомянуть:
- возможность передачи параметров в написанные команды
- для каждой команды можно задать декораторы, которые будут ограничивать выполнение только для указанного хоста
- проверка результата выполнения команды - если обнаружены ошибки, то прекращается выполнение остальных команд
- возможность интерактивного запроса команд от пользователя
- набор команд для работы с папками и файлами
- гибкий набор аргументов для fab
Внутри самописных команд можно использовать такие встроенные функции fabric:
sudo('ls /') - запустить ls с привилегиями суперпользователя (по умолчанию root) на удаленном хосте
put('/local/path/file.tar.gz', '/remote/path/file.tar.gz') - копирует локальный файл file.tar.gz на удаленном хост
run('ls /') - запускает ls на удаленном хосте
get('/remote/path/file.tar.gz', '/local/path/file.tar.gz') - копирует файл file.tar.gz на удаленном хосте на локальный хост
local('ls /', capture=False) - запускает ls на локальном хосте, аргумент capture=False не подавляет вывод запускаемой команды
Дополнительное чтиво:
Миграция моделей и данных в Django

Always, always, backup your database before doing any kind of potentially destructive migration. One time, it will go wrong.
(из south документации)
South привносит в django возможность миграции структуры и данных модели. На практике это означает, что если мы что-то поменяли в модели (добавили/удалили поле) то south сам увидит изменения и создаст инструкции для внесения изменений в БД, которые останется только применить на всех экземплярах приложения.
Основные особенности, которые отмечают разработчики:
- отслеживание изменений в модели и создание миграций
- независимость от движков БД (заявлена поддержка 5 разных типов БД)
- создание миграций только для выбранного приложения (application)
- сообщение о возможных конфликтах при комите миграций от других разработчиков
Ставим последнею версию South
pip install South
Добавляем south в INSTALLED_APPS и делаем syncdb.
Создаем точку отсчета миграций для приложения foo и применяем их
./manage.py schemamigration foo --initial ./manage.py migrate foo
Добавим новое поле в модель foo и укажем south на изменения
./manage.py schemamigration foo --auto
South создаст миграцию в папке foo/migrations (путь можно поменять в настройках south, переменная SOUTH_MIGRATION_MODULES), дав произвольное имя для файла. Внутри py-файла с миграцией есть класс Migration с двумя методами: forwards, который отвечает за выполняемые инструкции при выполнении команды migrate, и метод backwards - отвечающий за откаты при желании отменить миграцию.
Просмотр списка миграций
./manage.py migrate --list
звездочкой отмечены те миграции, что уже применены.
Кроме миграции структуры модели возможна миграция и данных. Используется, например, для изменения данных в модели для соответствия новой структуре.
Создаем заготовку foo_datamigration_0 для новой миграции данных:
./manage.py datamigration foo foo_datamigration_0
Правим нашу заготовку для миграции данных, для этого в методе forwards(self, orm) добавляем действия для манипуляциии над дынными, в передаваемом параметре orm находится уже хорошо знакомый django orm.
def forwards(self, orm):
for foo in orm.Foo.objects.all():
foo.title = "new title %d" % random.randrange(1,100)
foo.save()
South также может отобразить графически процес миграции, начиная с самого начала.
./manage.py graphmigrations | dot -Tpng -omigrations.png
Дополнительное чтиво:
Screen: менеджер терминалов
Этот пост представляет собой больше узелок на память, чем развернутый ответ на вопросы что? где? когда? ... почему? :)
Screen является консольной утилитой для работы с несколькими консолями в одной терминальной сессии. Грубо говоря screen позволяет запускать несколько приложений в одном терминале и легко между ними маневрировать, делить окно на несколько частей и в каждой части отображать разные приложения (например, на сервере можно в одном окне сразу смотреть top и mytop).
Работа с screen
screen - создание новой сессии
screen -ls - список запущенных сессий
screen -S "session_name" - запустить новую сессию с именем session_name
screen -r [session_name] - восстановить последнюю рабочую сессию, необязательный параметр - имя сессии
screen top - запустить программу top в первой консоле
Шоткаты для screen
Ctrl+a c - создать новое окно
Ctrl+a k - убить выбранное окно
Ctrl+a d - выход из screen, сессия остается работать в фоновом режиме
Ctrl+a " - показать список всех открытых окон
Ctrl+a n - переключиться на следующие окно
Ctrl+a p - переключиться на предыдущие окно
Ctrl+a <номер окна> - переключиться на окно с выбранным номером
Ctrl+a :source ~/.screenrc - перезагрузить конфиг
Ctrl+a S - разбить окно на регионы по-горизонтали
Ctrl+a TAB - переключится на другой регион
Ctrl+a Q - закрыть все регионы, кроме текущего
Ctrl+a A - переименовать окно
Ctrl+a [ (или Ctrl+a ESC) - перейти в режим копирования
Ctrl+a ] - вставить содержимое буфера по умолчанию
Ctrl+a m - установить отметку о мониторинге за данным окном, если что-то поменяется то screen просигнализирует об этом
Мой .screenrc
startup_message off
hardstatus alwayslastline
hardstatus string "%= %{kW}[ %H ] [ %t ]"
caption always "%{.bW}%-w%{.rW}%n %t%{-}%+w %=%{..G} %{..Y} %l %c %d/%m/%Y "
# detach on hangup
autodetach on
# set a big scrolling buffer
defscrollback 5000
termcapinfo xterm|xterms|xs|rxvt ti@:te@
Дополнительное чтиво:
- GNU Screen от Дмитрия Васильева
- Описание еще одного терминального оконного менеджер Tmux
Django и WYSIWYG-редактор
Изначально пост планировался о наборе приложений без которых не обходится ни один мой проект на django, но потом я решил попробовать связку dajngo + wysiwyg-редактор с возможностью загрузки изображений. В итоге пост получился о том как построить простой сайт на flatpages с возможностью редактирования страниц и загрузки файлов.
Для начала нам понадобится:
- подключить flatpages
- установить django-annoying - удобный django-модуль, который содержит разные полезные дополнения. В частности декоратор render_to, функции get_object_or_None, get_config, StaticServer middleware и т.д. с полным списком можно ознакомится по выше приведенной ссылке.
- django-tinymce, подключение описано тут
У меня получился такой settings.py и urls.py.
Теперь надо связать flatpages и только-что установленный django-tinymce, для этого в папке tinymce (я установил django-tinymce простым копированием нужных файлов в корень проекта) создаем admin.py. Все, теперь мы имеем работающую связку tinymce + flatpages, остается только настроить tinymce по вкусу.
Следующим этапом прикрутим загрузчик файлов. Для tinymce хватает разных загрузчиков - и платных и бесплатных, небольшой обзор есть тут. Но не у всех реализаций есть бекенд на python, точнее мне известен только для Image Manager, который рассматривается ниже.
Начнем с django-filebrowser, его требования:
Настройка django-filebrowser описана тут, а установка Grappelli описана тут. Grappelli меняет скин дефолтной админки django, скриншоты можно посмотреть тут. Django-filebrowser отказывается работать без Grappelli. Но после настройки этой связки все работает как положено: изображения и другие типы файлов грузятся без проблем, файлы можно сортировать по папкам, последние можно создавать/удалять.
Еще один вариант загрузчика изображений - Image Manager, демка. Сам загрузчик берем тут, коннектор для django тут. Автором коннектора является Андрея Гладилина, но у меня не заработал его коннектор, пришлось патчить:
- подправил ссылки на python-коннектор,
- пути для загрузки изображений,
- функцию ShowDir()
Установка:
- Скаченный Image Manager распаковываем в папку PROJECT_PATH/static/js/tiny_mce/plugins
- Правим settings.py и urls.py, рабочие примеры с комментариями приведены выше.
- Архив python-images-patched.zip распаковываем в папку tinymce, в корне проекта. В settings.py правим IMAGE_MANAGER_DIR и указываем путь для аплоада картинок.
Еще два WYSIWYG-редактор которые дружат с django:
Кстати, markItUp! + postmarkup = отличный BBCode редактор на python.
Мониторинг ресурсов в PostgresSQL
Смотрим процессы которые сейчас работают:
ps -ef | grep postgres
Более универсальная утилита ptop - позволят в реальном времени мониторить работу PostgreSQL сервера. Скриншоты и короткие инструкции.
SQL-команда, выводящая активные postgres-процессы, пользователей, запросы:
SELECT * FROM pg_stat_activity;
SQL-команда, выводящая активные блокировки (lock):
SELECT * FROM pg_locks;
Дополнительное чтиво:
