Поиск:

Ответ в темуСоздание новой темы Создание опроса
> xml-rpc с граблями и trac, помогите разобраться 
:(
    Опции темы
bilbobagginz
Дата 22.8.2010, 13:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Naughtius Maximus
****


Профиль
Группа: Экс. модератор
Сообщений: 8813
Регистрация: 2.3.2004
Где: Israel

Репутация: нет
Всего: 317



привет. 
ситуация такова (все в интeрнете), есть 
  • trac сайт
  • в wiki 2 странички: builds, builds2
  • hudson, который в данном случае создает несколько (11) файлов.
  • эти файлы вручную закачиваются как аттачменты на данные 2 страницы, и обновляется табличка ссылок, с которой файлы скачиваются.
  • связь с сервером защищена SSL + user certificate (X.509) + пользователь + пароль.
процесс с момента законченного билда занимает ~ 10-30 минут закачки, проверки корректности и т.д.

задача:
автоматизировать эту процедуру, тем самым экономить эти минуты на билд. в день может быть несколько.
присмотрелся на XML-RPC. разбил на под-задачи, т.е. из руби скрипта:
  • 1. соединиться с сервантом
  • 2. записать страничку вики
  • 3. загрузить файл на созданную страничку.
процесс шел так:
1. накопал trac4r.
2. понял, что стандартный xmlrpc клиент не поддерживает работу с SSL+certificates
3. понял что проблема в конфигурации объекта. создал патчи (приатачил) для xmlrpc/client.rb, и для trac4r/lib/query.rb, trac4r/trac4r.rb

Прошел легко пункты 1, 2.
на третьем завис.

код клиента  подключения (опустил данные аутентификации) тут:
Код

require 'rubygems'
require 'uri'
require 'net/https'
require 'openssl'
require 'trac4r'
require 'base64'

vars = YAML::loadfile(ENV['HOME'] + "/.credentials/creds.yml")

pkcs = OpenSSL::PKCS12.new(File.open(vars['certname']),vars['certpass'])
cert = pkcs.certificate
key = pkcs.key

url = vars['tracserver']
user = vars['tracuser']
pass = vars['tracpass']

trg_page = vars['pagename1']
file_to_attach = vars['srcfname']

begin
trac = Trac.new(url, user, pass, vars['ca_cert'], cert, key)
rescue Exception => e
    puts "e.message: #{e.message}, e.backtrace: #{e.backtrace}"
end

result = trac.wiki.get_raw trg_page

new_out = " = New Title! =\n"
new_out += "I am kukuriku!"

trac.wiki.put trg_page,new_out

puts "result:"
result = trac.wiki.get_raw trg_page
puts result
gets
# до сих пор - РАБОТАЕТ!
fh = File.open(file_to_attach)
fdata = fh.read
enc_data = [fdata].pack("m")

comment = vars['filecomment']
name = vars['filename']
trac.wiki.put_attachment(trg_page, name, comment, enc_data, true)


Получил:
Код

/usr/lib/ruby/gems/1.8/gems/trac4r-1.2.3/lib/trac4r/query.rb:60:in `query': 
Wrong content-type (received 'application/xml' but expected 'text/xml') when trying 
URL http://server.domain:443/project/login/xmlrpc 
and method wiki.putAttachmentEx(TestXML.make-diskimage.sh.nice script to create disk image 
on Mac.IyEvYmluL2Jhc2gKIyBDcmVhdGUgYSByZWFkLW9ubHkgZGlzayBpbWFnZSBv (Trac::TracException)
<и тут дамп файла в кодировке Base64>


я не совсем понимаю где я устанавливаю (и я ли)  это content-type.



помогите старому хоббиту пинком в нужное направление.

Это сообщение отредактировал(а) bilbobagginz - 22.8.2010, 13:40

Присоединённый файл ( Кол-во скачиваний: 1 )
Присоединённый файл  patches.zip 1,61 Kb


--------------------
Я ещё не демон. Я только учусь.
PM WWW   Вверх
source777
Дата 22.8.2010, 16:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1878
Регистрация: 12.3.2007

Репутация: 6
Всего: 56



В XMLRPC::Client#do_rpc есть проверка следующего вида:
Код

      ct = parse_content_type(resp["Content-Type"]).first
      if ct != "text/xml"
        if ct == "text/html"
          raise "Wrong content-type (received '#{ct}' but expected 'text/xml'): \n#{data}"
        else
          raise "Wrong content-type (received '#{ct}' but expected 'text/xml')" # твой вариант
        end
      end


А Trac по ходу дела возвращает данные с Content-Type = application/xml
Так что придётся тебе через class_eval переопределить вышеуказанный метод, чтобы он application/xml тоже переваривал.

P.S. А вообще совет на будущее, как искать причину исключения:
1) Смотришь что находится по указанному адресу: /usr/lib/ruby/gems/1.8/gems/trac4r-1.2.3/lib/trac4r/query.rb:60:in `query'
А там глобальный перехват исключений:
Код

      begin
        return @connection.call(command,*args)
      rescue => e
        raise TracException.new(e.message,@host,@port,@path,command,args,e)
      end


2) Оставляешь только 
return @connection.call(command,*args) 
и сразу видишь где на самом деле произошла ошибка. Хоть и не комильфо, но зато помогает, когда некоторые умельцы stack trace прячут.

Это сообщение отредактировал(а) source777 - 22.8.2010, 16:46


--------------------
Если бы программистам платили за то, чтобы убирать код из программы вместо того, чтобы добавлять его, программы были бы намного лучше © Николас Негропонте
PM MAIL   Вверх
bilbobagginz
Дата 22.8.2010, 20:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Naughtius Maximus
****


Профиль
Группа: Экс. модератор
Сообщений: 8813
Регистрация: 2.3.2004
Где: Israel

Репутация: нет
Всего: 317



я обратил внимание, что есть очень немало реализаций XMLRPC клиента.
интересно почему выбор разработчика trac4r пал именно на эту реализацию, и еще интересно почему именно эта реализация находится в дистрибутиве ruby :(


Цитата(source777 @  22.8.2010,  15:45 Найти цитируемый пост)
Так что придётся тебе через class_eval переопределить вышеуказанный метод, чтобы он application/xml тоже переваривал

a почему бы не расширить класс Client ?
есть какие-то "против" ?



--------------------
Я ещё не демон. Я только учусь.
PM WWW   Вверх
source777
Дата 22.8.2010, 23:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1878
Регистрация: 12.3.2007

Репутация: 6
Всего: 56



Цитата(bilbobagginz @  22.8.2010,  20:10 Найти цитируемый пост)
интересно почему выбор разработчика trac4r пал именно на эту реализацию

вероятно, потому что она входит в стандартную библиотеку Ruby

Цитата(bilbobagginz @  22.8.2010,  20:10 Найти цитируемый пост)
и еще интересно почему именно эта реализация находится в дистрибутиве ruby :(

Спроси что полегче... В стандартную библиотеку вообще входит достаточно много отстойных классов, взять тот же Net::HTTP или REXML. Почему так получилось хз, видимо исторически сложилось... Благо отказаться от использования этих классов ничего не стоит, т.к. есть масса достойных альтернатив.


Цитата(bilbobagginz @  22.8.2010,  20:10 Найти цитируемый пост)
a почему бы не расширить класс Client ?

Что ты подразумеваешь под "расширить"?






--------------------
Если бы программистам платили за то, чтобы убирать код из программы вместо того, чтобы добавлять его, программы были бы намного лучше © Николас Негропонте
PM MAIL   Вверх
bilbobagginz
Дата 23.8.2010, 08:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Naughtius Maximus
****


Профиль
Группа: Экс. модератор
Сообщений: 8813
Регистрация: 2.3.2004
Где: Israel

Репутация: нет
Всего: 317



Цитата(source777 @  22.8.2010,  22:02 Найти цитируемый пост)
Что ты подразумеваешь под "расширить"?

я о реализации: когда вижу какой-то eval у меня ушки на макушке, т.к. стараюсь им пользоваться редко и с богобоязнью.
если на настоящий момент единственный контент, поддерживаемый trac4r - "text/xml", то надеюсь можно сделать и без eval-oв.
как начинающий, для мя метапрограммирование пока тонкое искусство...

акромя того, это как добавить в только свои instances какую-то методу, а другим - не дам. жадно smile
я как-раз за то, чтобы мои добавки кода проревизили и влили в стабильную ветку.
и мне хорошо, и людям. авось откликнется.




--------------------
Я ещё не демон. Я только учусь.
PM WWW   Вверх
source777
Дата 23.8.2010, 12:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1878
Регистрация: 12.3.2007

Репутация: 6
Всего: 56



Цитата(bilbobagginz @  23.8.2010,  08:55 Найти цитируемый пост)
я как-раз за то, чтобы мои добавки кода проревизили и влили в стабильную ветку.

Это хороший подход, но в данном случае придётся ждать Ruby 1.9.3, чтобы насладиться твоим патчем, если его примут. Или ты trac4r решил на другой XML-RPC клиент перевести? В общем я запутался, что ты собрался делать...  smile 



--------------------
Если бы программистам платили за то, чтобы убирать код из программы вместо того, чтобы добавлять его, программы были бы намного лучше © Николас Негропонте
PM MAIL   Вверх
bilbobagginz
Дата 23.8.2010, 20:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Naughtius Maximus
****


Профиль
Группа: Экс. модератор
Сообщений: 8813
Регистрация: 2.3.2004
Где: Israel

Репутация: нет
Всего: 317



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

нужно было посылать в функцию putAttachmentEx 
объект типа XMLRPC::Base64. его создание было тупо:
Код

fh = File.open(filename, "rb")
d = fh.read
data = XMLRPC::Base64.new(d)

меня вдуплила инструкция, в которой написано было "конвертировать в Base64", и я принял его как кодировку, а не тип объекта.
в общем разобрался!

теперь мой хадсон шлет билды на вику трэка, и оповещает о них по джабберу/почте к делу относящихся. smile



--------------------
Я ещё не демон. Я только учусь.
PM WWW   Вверх
source777
Дата 23.8.2010, 22:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1878
Регистрация: 12.3.2007

Репутация: 6
Всего: 56



Ну что ж, поздравляю. Оказывается надо было просто заглянуть в логи Trac'a  smile 


--------------------
Если бы программистам платили за то, чтобы убирать код из программы вместо того, чтобы добавлять его, программы были бы намного лучше © Николас Негропонте
PM MAIL   Вверх
bilbobagginz
Дата 23.8.2010, 23:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Naughtius Maximus
****


Профиль
Группа: Экс. модератор
Сообщений: 8813
Регистрация: 2.3.2004
Где: Israel

Репутация: нет
Всего: 317



smile нет, этого не было достаточно, т.к. я не догнал, что за структура данных там использовалась.
пообщался по irc, там один питонец меня направил, сказав, что видимо я не загрузил в правильную структуру на клиенте. 
все доработал скрипт работает как часы, табличку со ссылками заполняет. прикольно smile
надо кинуть куда-то скрипт на github



--------------------
Я ещё не демон. Я только учусь.
PM WWW   Вверх
source777
Дата 24.8.2010, 14:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1878
Регистрация: 12.3.2007

Репутация: 6
Всего: 56



Цитата(bilbobagginz @  23.8.2010,  23:24 Найти цитируемый пост)
надо кинуть куда-то скрипт на github

http://gist.github.com/



--------------------
Если бы программистам платили за то, чтобы убирать код из программы вместо того, чтобы добавлять его, программы были бы намного лучше © Николас Негропонте
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Ruby: Общие вопросы"
source777
  • С чего начать? начинаем
  • Ссылки на полезные ресурсы смотрим тут
  • Обязательно следуйте правилам Vingrad.
  • Пожалуйста, прочитайте рекомендации по работе в форуме и навигации по Vingrad.
  • Для вставки кодов Ruby используйте тег: [code=ruby]код[/code]. Когда в будущем подсветка синтаксиса для Ruby будет реализована, весь исходных код преобразится.
  • Используйтe чекбокс "Транслит" (возле кнопок кодов), если у Вас нет русских шрифтов.
  • Помните, для каждого вопроса должна быть своя тема.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, source777.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Ruby: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0541 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.