Проект: http://code.google.com/p/xroot/
Исходники: http://xroot.googlecode.com/files/xroot-src-0.0.3.tar.gz
Готова версия xroot-0.0.3 для тестирования.
На сайте http://code.google.com/p/xroot/downloads/list выложены архивы для 32bit и для 64bit. Из них надо лишь извлечь исполняемый файл xroot неважно куда (например, в /usr/bin/). Можно просто положить xroot на Рабочий стол и дважды щелкнуть - запустится окно, в котором будет предложено ввести команду, пароль и выбрать su/sudo. Возможна отладка: надо запустить xroot в консоли с параметром debug, поэтому если какая-то программа ведет себя странно, то попытайтесь по возможности выяснить почему.
Более подробное описание: http://code.google.com/p/xroot/wiki/003
Необходимо составить и здесь написать список программ, которые запускаются удачно и список программ проблемных.
Также необходимо протестировать в различных DE (KDE, LXDE, Gnome и т.д.) и в различных дистрибутивах у кого какие установлены.
Просьба ко всем принять участие в тестировании, это очень несложно и с этим справится любой желающий.
Все замечания будут проанализированы и по возможности учтены.
Нужна помощь в проекте xroot - GUI для su/sudo
romkaromka, исходные тексты доступны?
romkaromka, исходные тексты доступны?
Конечно, rpm- и deb- пакеты тоже можно собрать, в исходниках для этого всё есть, это всего лишь один исполняемый файл. Когда тесты пройдут успешно, то пакеты начну собирать.
конечно
Увы, сразу не нашёл :o
Где именно?
в исходниках для этого всё есть, это всего лишь один исполняемый файл.
Вы меня либо не правильно поняли, либо делаете вид, что не поняли.
Исходные тексты этого исполняемого файла есть?
Исходные тексты этого исполняемого файла есть?
http://code.google.com/p/xroot/source/browse/#svn%2Ftrunk%2Fxroot
Где исходные тексты этого файла — _http://code.google.com/p/xroot/source/browse/trunk/xroot/xroot ?
Где исходные тексты этого файла — http://code.google.com/p/xroot/source/browse/trunk/xroot/xroot ?
убрал его из svn.
убрал его из svn.
...и что изменилось? В тарболах по-прежнему бинарный блоб без исходных текстов.
Тему закрываю, ваш аккаунт, если завтра, до 10 часов утра по московскому времени, не проясните мне ситуацию, будет заблокирован.
romkaromka в первое сообщение добавил ссылку на svn-репозиторий.
Сам я далёк от программирования, поэтому жду комментариев более сведущих в этом деле людей.
Получить бинарник из исходников просто:
1) установить пакеты fpc и fpc-src,
2) затем выполнить скрипт get_msegui_32_64,
3) затем выполнить скрипт build_xroot_without_gui_32 (или build_xroot_without_gui_64).
Для сборки rpm-пакетов есть xroot.spec, а для сборки deb-пакетов есть скрипт debian.compile.sh
поэтому жду комментариев более сведущих в этом деле людей.
http://freepascal.ru/forum/viewtopic.php?f=10&t=7722 - комментарии
procedure ttermfo.on_receive(const sender: TObject; var atext: AnsiString;
const errorinput: Boolean);
//это событие возникает когда в терминал поступает новый текст
...
if (system.pos('Password',atext) > 0) or (system.pos('password',atext) > 0) then
begin
termfo.term.writestrln(mainfo.password_str.value); //пишем в терминал пароль
end;
...
//команда не найдена
if (system.pos('command not found',atext) > 0) or (system.pos('команда не найдена',atext) > 0) then
begin
Во-1-ых, достаточно if system.pos('assword')>0 then
Во-2-ых, если делать несколько языков, то применённый подход в корне порочен. Анализируется сообщение от bash, так зачем проверять английский и только русский, если можно посмотреть на LANG, сходить в /usr/share/locale/xx_XX/LC_MESSAGES/bash.mo и посмотреть, как эта строка переведена для текущей локали (см. man 3 gettext).
Для поиска нужных исходных (английских) сообщений bash можно использовать
msgunfmt /usr/share/locale/ru/LC_MESSAGES/bash.mo | iconv -f koi8-r | less
Для сообщения "command not found" это "%s: command not found".
В моей текущей (русской) локали это (использована консольная команда gettext)
[console]$ gettext bash '%s: command not found'; echo
%s: команда не найдена[/console]
В 3-их, двуязычие в стиле:
message2ru='Команда для выполнения:';
message2en='Command for executing:';
не самый лучший вариант, если не самый худший. Есть же resourcestring и TranslateResourceStrings().
В 4-ых, "grep -R DISPLAY" по исходникам молчит как партизан, значит, скорее всего, вот этот трюк не используется, а зря:
http://wasen.net/index.php?option=com_content&view=article&id=57:su-and-x&catid=36:linuxserver-related&Itemid=54
Спасибо, за то, что посмотрели код и написали замечания.
1) Не достаточно, иначе будет реагировать на всякий чих-пых ассворд'ов, должно же реагировать только на пароль,
2) Естественно, xroot еще не совершенен, анализ сообщенией от bash будет улучшен с учетом вашего замечания,
3) У xroot будет только один единственный исполняемый файл, поэтому языки и их переводы будут прямо в коде, пока таких языков 2 - русский и английский, можно сколько угодно говорить, что так делать не принято (но так делают), но программист имеет право решить как лучше сделать в конкретном случае, мне нужен лишь один бинарник для моих же других проектов - в этом и есть смысл создания xroot только одним бинарником.
4) Объясните про это подробнее, чего конкретно в коде не так и как исправить.
1) Посмотрите ещё раз внимательно на условие:
содержит "Password" или содержит "password"
и на исходники su/sudo:
grep -R assword ./
Я не вижу там других слов, содержащих assword. Да и в англо-русском словаре тоже как-то не попадалось.
3) Вам решать. Только учтите, что unit GetText у вас уже используется (см. main.pas, Gettext.GetLanguageIDs()), почему бы не дать возможность кому-либо закинуть в
/usr/share/locale/его_ЛОКАЛЬ/LC_MESSAGES/
файлик xroot.mo с переводом вашей программы на свой язык, без каких-либо усилий с вашей стороны, кроме пары дополнительных вызовов. По-моему, плата совсем не велика.
4) Для su вижу ключ -p, т.е. XAUTHORITY и DISPLAY должны сохраняться от текущего пользователя.
Для sudo вижу обработку XAUTHORITY, но не вижу экспорта переменной DISPLAY. Если запустить ещё одни X-ы и позвать X-овое приложение через xroot, на каком DISPLAY будет его вывод? Если на правильном, то ложная тревога.
И ещё один момент про sudo, не знаю, возможно уже его рассматривали: при выполнении "sudo -s" также сохраняется окружение пользователя, включая переменные XAUTHORITY и DISPLAY (равноценно "su -p").
1) лучше перестраховаться,
3) сам переведу на любой язык - присылайте только переводы, там переводить-то нечего, всего несколько фраз, концепция xroot - это возможность работать без установки, а xroot.mo - это уже использование каким-то образом внешних файлов, хранящихся не там, где находится бинарный файл, поэтому следуя идеи о том, что xroot не должен зависеть ни от чего по максимуму, то пока так считаю правильным,
4) для sudo используется скрипт xsudo (просто это неявно сделано):
http://dev-loki.blogspot.com/2010/06/sudo-x-applications-on-opensuse.html
http://pkgs.org/search/?keyword=xsudo
http://linuxforum.ru/viewtopic.php?pid=110528#p110528
в нем DISPLAY не экспортируется, надеясь вроде как на sudoers, но проверьте на нескольких иксах, если есть ошибки, то вносить правку надо в скрипт xsudo в первую очередь.
В моей текущей (русской) локали это (использована консольная команда gettext)
[console]$ gettext bash '%s: command not found'; echo
%s: команда не найдена[/console]
исправил в trunk
- воспользовался модулем gettext и беру теперь переводы из coreutils.mo, bash.mo, соответственно execprog теперь по всем правилам.
- учел возможность локализации на другие языки (добавил свой переводчик в код), двуязычие из кода убрал.
Проверяйте trunk где еще чего поправить.
воспользовался модулем gettext и беру теперь переводы из coreutils.mo, bash.mo, соответственно execprog теперь по всем правилам.
Хочу предостеречь от следующего момента. Библиотечный C-шный dgettext() учитывает текущую локаль и конвертирует строки из локали .mo в локаль приложения. А в исходниках fpc-шного юнита gettext я подобного кода не увидел, может быть плохо смотрел.
В моей системе /usr/share/locale/ru/LC_MESSAGES/bash.mo в кодировке KOI8-R, консоль в ru_RU.UTF-8:
[console]
$ msgufmt /usr/share/locale/ru/LC_MESSAGES/bash.mo | grep "Content-Type"
"Content-Type: text/plain; charset=KOI8-R\n"
$ echo $LANG
ru_RU.UTF-8
[/console]
Тестовый код на C даёт строку в локали приложения:
#include <locale.h>
#include <libintl.h>
#include <stdio.h>
#define BASH_MSG "%s: command not found"
int main (int argc, char **argv) {
setlocale(LC_ALL, "");
printf("%s\n", dgettext("bash", BASH_MSG));
return 0;
}
[console]
$ gcc testс.c -o testс
$ ./testс
%s: команда не найдена
$ ./testс | hexdump -C
00000000 25 73 3a 20 d0 ba d0 be d0 bc d0 b0 d0 bd d0 b4 |%s: ............|
00000010 d0 b0 20 d0 bd d0 b5 20 d0 bd d0 b0 d0 b9 d0 b4 |.. .... ........|
00000020 d0 b5 d0 bd d0 b0 0a |.......|
00000027
[/console]
Тестовый код для fpc даёт строку в локали .mo файла:
uses gettext;
const
BASH_MO = '/usr/share/locale/ru/LC_MESSAGES/bash.mo';
BASH_MSG = '%s: command not found';
var
mof: TMOFile;
begin
mof := TMOFile.Create(BASH_MO);
WriteLn(mof.Translate(BASH_MSG));
mof.Free;
end.
[console]
$ fpc testpp.pp
$ testpp | iconv -f koi8-r
%s: команда не найдена
$ testpp | hexdump -C
00000000 25 73 3a 20 cb cf cd c1 ce c4 c1 20 ce c5 20 ce |%s: ....... .. .|
00000010 c1 ca c4 c5 ce c1 0a |.......|
00000017
[/console]
Я не знаток fpc, возможно требуется какой-то вызов, аналогичный setlocale(), чтобы всё работало как задумано. Во всяком случае, проверьте, правильно ли у вас будет работать ваш код, использующий модуль gettext, когда локаль приложения и кодировка .mo отличаются.
Пока проблема с кодировкой всплыла в Mageia (и то только с bash.mo), но они и сами могли перемудрить, тестил в других дистрибутивах - нормально.
Скорее, код xroot в этой части "недомудрён" -- не содердит приведения прочитанной из .mo строки к локали приложения.
Как посмотреть кодировку .mo, писал выше.