1 (17.03.2012 02:26:28 отредактировано romkaromka)

Проект: http://code.google.com/p/xroot/
Исходники: http://xroot.googlecode.com/files/xroot … 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 и т.д.) и в различных дистрибутивах у кого какие установлены.

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

Консоль на мыло. Надо развивать графику.

2

romkaromka, исходные тексты доступны?

Был, был и весь вышел...

3 (17.03.2012 01:32:05 отредактировано romkaromka)

Lupo Alberto пишет:

romkaromka, исходные тексты доступны?

Конечно, rpm- и deb- пакеты тоже можно собрать, в исходниках для этого всё есть, это всего лишь один исполняемый файл. Когда тесты пройдут успешно, то пакеты начну собирать.

Консоль на мыло. Надо развивать графику.

4

romkaromka пишет:

конечно

Увы, сразу не нашёл  :o
Где именно?

Был, был и весь вышел...

5

Lupo Alberto пишет:

в исходниках для этого всё есть, это всего лишь один исполняемый файл.

Вы меня либо не правильно поняли, либо делаете вид, что не поняли.
Исходные тексты этого исполняемого файла есть?

Был, был и весь вышел...

6

Lupo Alberto пишет:

Исходные тексты этого исполняемого файла есть?

http://code.google.com/p/xroot/source/b … nk%2Fxroot

Консоль на мыло. Надо развивать графику.

7

Где исходные тексты этого файла — _http://code.google.com/p/xroot/source/browse/trunk/xroot/xroot ?

Был, был и весь вышел...

8

Lupo Alberto пишет:

Где исходные тексты этого файла — http://code.google.com/p/xroot/source/b … root/xroot ?

убрал его из svn.

Консоль на мыло. Надо развивать графику.

9

romkaromka пишет:

убрал его из svn.

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

romkaromka в первое сообщение добавил ссылку на svn-репозиторий.
Сам я далёк от программирования, поэтому жду комментариев более сведущих в этом деле людей.

Был, был и весь вышел...

10 (17.03.2012 02:47:52 отредактировано romkaromka)

Получить бинарник из исходников просто:

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

Консоль на мыло. Надо развивать графику.

11

Lupo Alberto пишет:

поэтому жду комментариев более сведущих в этом деле людей.

http://freepascal.ru/forum/viewtopic.ph … amp;t=7722 - комментарии

Консоль на мыло. Надо развивать графику.

12 (17.03.2012 13:15:06 отредактировано bormant)

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)

 Консоль:
$ gettext bash '%s: command not found'; echo
%s: команда не найдена

В 3-их, двуязычие в стиле:

message2ru='Команда для выполнения:';
message2en='Command for executing:';

не самый лучший вариант, если не самый худший. Есть же resourcestring и TranslateResourceStrings().

В 4-ых, "grep -R DISPLAY" по исходникам молчит как партизан, значит, скорее всего, вот этот трюк не используется, а зря:
http://wasen.net/index.php?option=com_c … ;Itemid=54

13 (17.03.2012 14:12:42 отредактировано romkaromka)

Спасибо, за то, что посмотрели код и написали замечания.
1) Не достаточно, иначе будет реагировать на всякий чих-пых ассворд'ов, должно же реагировать только на пароль,
2) Естественно, xroot еще не совершенен, анализ сообщенией от bash будет улучшен с учетом вашего замечания,
3) У xroot будет только один единственный исполняемый файл, поэтому языки и их переводы будут прямо в коде, пока таких языков 2 - русский и английский, можно сколько угодно говорить, что так делать не принято (но так делают), но программист имеет право решить как лучше сделать в конкретном случае, мне нужен лишь один бинарник для моих же других проектов - в этом и есть смысл создания xroot только одним бинарником.
4) Объясните про это подробнее, чего конкретно в коде не так и как исправить.

Консоль на мыло. Надо развивать графику.

14 (17.03.2012 15:18:36 отредактировано bormant)

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").

15 (18.03.2012 15:05:34 отредактировано romkaromka)

1) лучше перестраховаться,
3) сам переведу на любой язык - присылайте только переводы, там переводить-то нечего, всего несколько фраз, концепция xroot - это возможность работать без установки, а xroot.mo - это уже использование каким-то образом внешних файлов, хранящихся не там, где находится бинарный файл, поэтому следуя идеи о том, что xroot не должен зависеть ни от чего по максимуму, то пока так считаю правильным,
4) для sudo используется скрипт xsudo (просто это неявно сделано):
http://dev-loki.blogspot.com/2010/06/su … nsuse.html
http://pkgs.org/search/?keyword=xsudo
http://linuxforum.ru/viewtopic.php?pid=110528#p110528
в нем DISPLAY не экспортируется, надеясь вроде как на sudoers, но проверьте на нескольких иксах, если есть ошибки, то вносить правку надо в скрипт xsudo в первую очередь.

Консоль на мыло. Надо развивать графику.

16

bormant пишет:

В моей текущей (русской) локали это (использована консольная команда gettext)

 Консоль:
$ gettext bash '%s: command not found'; echo
%s: команда не найдена

исправил в trunk

Консоль на мыло. Надо развивать графику.

17

- воспользовался модулем gettext и беру теперь переводы из coreutils.mo, bash.mo, соответственно execprog теперь по всем правилам.
- учел возможность локализации на другие языки (добавил свой переводчик в код), двуязычие из кода убрал.
Проверяйте trunk где еще чего поправить.

Консоль на мыло. Надо развивать графику.

18

romkaromka пишет:

воспользовался модулем 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:

 Консоль:

$ 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

Тестовый код на 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;
}

 Консоль:

$ 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

Тестовый код для 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.

 Консоль:

$ 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

Я не знаток fpc, возможно требуется какой-то вызов, аналогичный setlocale(), чтобы всё работало как задумано. Во всяком случае, проверьте, правильно ли у вас будет работать ваш код, использующий модуль gettext, когда локаль приложения и кодировка .mo отличаются.

19

Пока проблема с кодировкой всплыла в Mageia (и то только с bash.mo), но они и сами могли перемудрить, тестил в других дистрибутивах - нормально.

Консоль на мыло. Надо развивать графику.

20

Скорее, код xroot в этой части "недомудрён" -- не содердит приведения прочитанной из .mo строки к локали приложения.
Как посмотреть кодировку .mo, писал выше.

21 (21.03.2012 07:25:26 отредактировано bormant)

romkaromka,
а почему б не использовать libc и libgettextlib ?

const
  LC_ALL = 6; { for setlocale() }
                                                                                                             
function SetLocale(Category: Integer; const Locale: PChar): PChar; cdecl; external name 'setlocale';         
{$linklib c}                                                                                                 

function DGetText(const DomainName: PChar; const MsgID: PChar): PChar; cdecl; external name 'dgettext';      
{$linklib gettextlib}                                                                                        

const
  BASH_MSG = 'bash';
  BASH_MSG_CNF='%s: command not found';                                                                      

begin
  SetLocale(LC_ALL, '');
  WriteLn(DGetText(BASH_MSG, BASH_MSG_CNF));
end.

 Консоль:

$ fpc test.pp

$ ./test
%s: команда не найдена

$ echo $LANG
ru_RU.UTF-8

$ msgunfmt /usr/share/locale/ru/LC_MESSAGES/bash.mo | grep Content-Type
"Content-Type: text/plain; charset=KOI8-R\n"

22 (21.03.2012 03:23:11 отредактировано romkaromka)

накопал следующее:
- в msegui есть модуль mselibc, поэтому вызвать

setlocale(LC_ALL,'');

теоретически не проблема,
- существует модуль на паскале gnugettext для lazarus (http://sourceforge.net/projects/lazarus … dxgettext/), в котором есть dgettext,
задача сводится к подгонке модуля dxgettext:
- то, что он ищет не в директории /usr/share/locale/ru/LC_MESSAGES/bash.mo, а относительно директории проекта (переменная Directory в gnugettext.pas),
- procedure TDomain.OpenMoFile; отрабатывает неверно, условие pos('CHARSET=UTF-8',UpperCase(GetTranslationProperty('Content-Type')))=0 становится истиной, как результат:
DebugLogger ('The translation for the language code '+curlang+' (in '+filename+') does not have charset=utf-8 in its Content-Type. Translations are turned off.');

Консоль на мыло. Надо развивать графику.

23 (21.03.2012 07:27:42 отредактировано bormant)

Выше был полностью рабочий фрагмент, "%s: команда не найдена" - это переведённое сообщение -- результат DGetText(), а не ошибка кода. Плата -- libgettextlib.so в зависимостях в дополнение к libc.so.
Можно подключать .so и получать из него нужные функции руками на этапе исполнения -- код сможет запускаться без .so и обнаруживать её отсутствие.
Можно попробовать "выковырнуть" нужные объектники из libgettextlib.la (fpc не умеет линковать из .la библиотеки)  и подключить их статически через {$l}, вместо {$linklib}.
Либо допиливать перекодировку к библиотекам fpc.

24

http://www.koders.com/delphi/fidDE87976 … 80249.aspx

if pos('CHARSET=UTF-8',uppercase(GetTranslationProperty('Content-Type')))=0 then begin
    CloseMoFile;
...

походу если .mo-файл не utf-8, то модуль gnugettext бесполезен.

Консоль на мыло. Надо развивать графику.

25 (23.03.2012 23:44:12 отредактировано romkaromka)

Если есть решение без использования сторонних либ, обходясь только используемым языком программирования, то лучше без либы, хотя с либой libgettextlib.so тоже возможно сделать работоспособный вариант (http://freepascal.ru/forum/viewtopic.ph … =15#p60577).
Пропатчил модуль gnugettext: http://code.google.com/p/xroot/source/b … ettext.pas, сделал пока поддержку перевода .mo-файлов, которые в utf8 и в koi8-r.
Заранее известно, что перевести надо лишь: coreutils.mo, Linux-PAM.mo, bash.mo, shadow.mo, поэтому можно составить исчерпывающий список кодировок, которые надо включить в gnugettext. Надо лишь посмотреть исходники, которым принадлежат эти .mo-файлы, и определить списки используемых кодировок. Поэтому в данном случае поддержка абсолютно всех кодировок не нужна, а нужна поддержка только фактически используемых.
У sudo так вообще переводить нечего, все фразы, подлежащие анализу, не переведены в sudo.mo и не попали в него для перевода.
Поддержку каких кодировок надо обеспечить?

Консоль на мыло. Надо развивать графику.

26 (25.03.2012 22:05:02 отредактировано romkaromka)

romkaromka пишет:

Поддержку каких кодировок надо обеспечить?

исходя из этого http://pkgs.org/mandriva-2011/mandriva- … 6.rpm.html и .mo-файлов у bash следует добавить кодировки ISO-8859-1, ISO-8859-2, ISO-8859-15, UTF-8, KOI8-R.
Добавил их.
Какие еще добавить?

Консоль на мыло. Надо развивать графику.

27

http://ftp.gnu.org/gnu/bash/ - bash других кодировок не использует, а coreutils.mo, Linux-PAM.mo, shadow.mo в utf-8. Вроде как всё так.

Консоль на мыло. Надо развивать графику.

28

Обмозговываю сборку пакетов.
Идея: собрать deb-пакеты и rpm-пакеты для всех дистрибутивов одним махом.
Алгоритм: собрать сначала в deb-дистрибутиве deb-пакет и через alien переконвертировать его в rpm-пакет, то есть скрипт http://code.google.com/p/xroot/source/b … compile.sh соберет одновременно deb- и rpm-пакеты.
Так как у xroot нет ничего кроме одного бинарника (плюс еще .desktop-файл и иконка к нему отсилы), то alien должен сделать rpm-пакет, работоспособный во многих rpm-дистрибутивах.
Годится такой подход? Вроде простенько, но и собирать легко пакеты, и пакеты достаточно универсальные получатся.

Консоль на мыло. Надо развивать графику.

29

Собрал пакеты потестить http://code.google.com/p/xroot/downloads/list
Также есть сборка, не требующая установки.
Надо проверить не только работоспособность xroot (устанавливается в Утилиты->Системные), но и проверить насколько универсальными получились пакеты.
rpm-пакеты собраны в Ubuntu через alien из deb-пакетов - это должно позволить установить эти пакеты во всех rpm-дистрибутивах (spec-файл также имеется если нужно собрать rpm-пакет для конкретного дистрибутива в репозиторий).
Работу xroot надо проверить на разных локалях, разных кодировках и разных языках. По возможности погонять в различных дистрибутивах и DE.
Принимаются любые замечания.

Консоль на мыло. Надо развивать графику.

30 (29.03.2012 02:08:29 отредактировано verg)

romkaromka,
Установка в openSUSE12.1 (успешно):

# zypper in xroot-0.0.3-1.i386.rpm
Загрузка данных о репозиториях...
Чтение установленных пакетов...
Разрешение зависимостей пакетов...

Будет установлен следующий НОВЫЙ пакет:
  xroot 

1 новый пакет для установки.
Полный размер загрузки: 4,1 MiB. После этой операции будет использовано дополнительно 14,4 MiB.
Продолжить? [y/n/?] (y): y
Получение пакет xroot-0.0.3-1.i386 (1/1), 4,1 MiB (14,4 MiB после распаковки)
Получение пакет xroot-0.0.3-1.i386 (1/1), 4,1 MiB (14,4 MiB после распаковки)
Установка: xroot-0.0.3-1 [готово]

В классическом меню кде4: Утилиты - Другие программы - xroot (Графический интерфейс для su sudo)