понедельник, 17 августа 2015 г.

“Сборка” Python скрипта в один exe файл


Все мы знаем, что пайтон интерпретируемый язык и получить настоящий скомпилированный exe файл - нет возможности. Однако, есть такие проекты как: py2exe или cx_freeze, которые, анализируя код приложения, собирают все зависимые библиотеки и сам интерпретатор в отдельной папке, и создают запускающий exe файл. Этот exe файл при запуске подготовит окружение для нашего приложения, запустит интерпретатор python и уже в нем - наше приложение. После работ утилит py2exe или cx_freeze у нас всегда появляются куча dll и др. файлов.


Так что же сделать для получения одного exe файла, вместо кучи файлов?


Будем считать, что у нас уже есть папка (dist) с зависимыми файлами, после прогона py2exe или cx_freeze.


  • Первым делом, чистим за утилитами py2exe или cx_freeze библиотеки и файлы, которые гарантированно не будут использоваться. (например: w9xpopen.exe).Таким образом, уменьшаем размер нашего будущего exe файла и скорость его загрузки.
  • Далее, упаковываем архиватором 7zip (если у Вас его нет, то скорее качаем с официального сайта: www.7-zip.org) папку (dist) со всеми файлами.


Все параметры упаковки лучше запомнить, так как далее они понадобятся.
Я упаковку делаю из командной строки поэтому и запомнить просто :)
Например: C:\7-Zip\7z.exe a -r -t7z -m1=LZMA dist.7z dist\*.*


Далее начинается темная магия, которой порой, пользуются всякие недалекие вирусописатели.


Идем на сайт http://7zsfx.info/ru/ и скачиваем специальный модифицированный модуль (например: 7zsd.sfx) для распаковки нашего приложения “по тихому” и запуску одного из файлов внутри архива. Модуль должен быть с поддержкой именно того сжатия, которое применяем, в моем случае это LZMA, a есть еще лучше - LZMA2)


Далее готовим файл настройки для модуля 7zsd.sfx:
(config.txt)

;!@Install@!UTF-8!
RunProgram="наш_запускатор.exe /s"
GUIMode="2"
;!@InstallEnd@!


Главная строчка здесь это: RunProgram с ключем /s - говорит, что после распаковки запустить “по тихому” (/s) файл из архива.


Следующим шагом идем в командную строку и делаем следующие:
copy /b 7zsd.sfx + config.txt + dist.7z alone.exe


Итогом получаем один exe (alone.exe) файл, который на самом деле является файлом состоящем из трех частей. Распаковщика (7zsd.sfx), конфига к нему (config.txt) и нашего дистрибутива (dist.7z).


После запуска, произойдет следующее: во временной директории (TEMP) будет развернут наш дистрибутив и автоматом запустится файл из него (alone.exe). Распакованные файлы останутся лежать в  (TEMP), если оно нам не надо, то в конфигурационном файле надо добавить ключик delete=директория.
А вообще рекомендую посмотреть справку по модулю 7zsfx на официальном сайте:



Как поменять иконку приложения и описание программы?

Для этого воспользуемся программой Resource Hacker
Процесс простой, описывать думаю нет смысла.


Что дальше?

Все использованные программы могут работать из командной строки и легко принимают разные параметры. Поэтому можно легко сделать bat файл со всем этим процессом (компилятор_всея_пайтон.bat)  и запускать по мере необходимости.


Оптимизация: скорость, размер, можно попробовать воспользоваться UPX
http://upx.sourceforge.net/ для сжатия. Может оно что-то и даст.


Приятные бонусы.

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


Не могу промолчать про минусы.
  1. Возможно, некоторые антивирусы будут ругаться.
  2. Исходный код можно все равно перехватить, например, подсмотрев его во время распаковки архива во временную директорию.
  3. Медленный запуск приложения. (Можно победить подбором параметров сжатия и удалением мусорных файлов из дистрибутива) (А на SSD, так вообще не заметно:) )  


Второй пункт можно чуть улучшить, если использовать распаковку на виртуальный диск в памяти, который предварительно надо создать. Это даст еще 2 очка к безопасности кода. :) Но защита все равно очень слабенькая…



пятница, 15 октября 2010 г.

Создание сервера закачек на базе торрент-клиента Deluge в Ubuntu

   Пару месяцев назад, я решил сделать сервер закачек на основе Deluge, которым можно было бы управлять удаленно. (с любого компьютера локальной сети или даже из инета). В процессе 'гугления' нашел в инете много материалов по настройке, однако, не все оказались одинаково полезны. Некоторые рецепты работают только в старых версиях ubuntu, другие предлагают написать мегаскрипты, часть описывают только запуск и настройку deluge. В итоге, набрав разных полезных и не очень материалов написал себе иснтрукцию по установке. Может кому еще пригодится...

Заходим в терминал.

Чтобы каждый раз не набирать sudo (получим временно права рута) пишем:
sudo -s наш_администратор

Устанавливаем deluge и веб морду командой:
apt-get install deluge deluge-webui

Добавляем нового пользователя:
adduser torrent

Запускаем:
visudo

добавлем в конец файла правило:
torrent ALL = NOPASSWD: /usr/bin/deluged
Сохраняем файл.

Переключаемся на пользователя torrent командой:
su torrent

Создаем директорию:
mkdir /home/torrent/scripts

Пишем небольшой скрипт в любом редакторе (vi, nano, gedit, medit...):
#!/bin/bash

sudo deluged
deluge -u web

Сохраняем его в директорию:
/home/torrent/scripts/deluge_auto.sh

Делаем файл исполняемым:
chmod a+x /home/torrent/scripts/deluge_auto.sh

(Этот скрипт будет запускать демона и deluged и 'веб-морду '.)

Далее настраиваем автоматический вход пользователя torrent в систему.
Идем в оболочке GNOME:
Система > Администрирование > Окно входа в систему > Безопасность
Ставим галочку в правильном месте и указываем пользователя torrent в нужном поле

Теперь добавим наш скрипт в автозапуск GNOME. Идем в Система->Параметры->Запускаемые приложения. Нажимаем кнопку добавить и заполняем формочку, в команде пишем путь до нашего скрипта:
/home/torrent/scripts/deluge_auto.sh

Имя ставим, например,
AutoRun Deluge.

Вообщем все. Теперь можно перезагрузится, и зайти на этот комп по сети через браузер написав:
http://ххх.ххх.ххх.ххх:8112
(где ххх.ххх.ххх.ххх ip адрес нашего сервера, а 8112 номер порта)

Если все хорошо, то появится форма с запросом пароля.
Вводим пароль: deluge
И попадаем в интерфейс Deluge. Далее идем config->password и меняем пароль доступа к Deluge. На этом установка и первоначальная настройка закончена!

Примечание:
Настройки Deluge также находятся ~/.config/deluge

четверг, 14 октября 2010 г.

Ubuntu:Как разрешить пользователю выполнять некоторые административные 'функции'/скрипты/программы.

     Часто возникает вопрос, как пользователю дать возможность выполнять некоторые административные ф-ии, которые изначально доступны только из под рута с применением команды sudo в Ubuntu. Например :

  • монтирование разделов/дисков
  • выключение/перезагрузка
  • запуск демонов (к примеру демона торрент сервиса - deluged)
  • запуск сервера apache без запроса пароля
  • запуск каких-то скриптов
  • и т.п.

      И так, для примера дадим права на выключение/перезагрузку и монтирование/размонтирование пользователю Vasya:

  • открываем терминал
  • набираем sudo -s ваш_аккаунт_администратора (sudo -s временно нам даcт права рута)
  • далее набираем visudo (откроется файл для редактирования sudoers)
  • Далее, добавляем в файл следующее:
vasya localhost = NOPASSWD: /usr/sbin/shutdown,/usr/sbin/reboot,/usr/bin/mount,/usr/bin/umount
  • сохраняем файл (если все хорошо с  синтаксисом, то файл благополучно сохраниться)
      Почему надо использовать visudo, а не просто редактировать файл sudoers? В первую очередь в целях безопасности т.к. visudo не сохранит изменения, если имеется синтаксическая ошибка. А изменения в этом файле являются критичными для работы пользователей и системы... visudo также гарантирует правку файла 'sudoers' только в одной сессии.


      Вот и всё. Аналогичным образом можно разрешить исполнение каких либо других скриптов или программ без запроса пароля. Только не забываем о безопасности, т.к. отключив запрос пароля для некоторых программ мы можем создать потенциальную дырку  в безопасности нашей системы из вне...