Debbugsとのnつきあいかた

: subtitle

SOAP編

: author

Kentaro Hayashi

: institution

ClearCode Inc.

: content-source

東京エリアDebian勉強会

: date

2017-05-20

: allotted-time

15m

: theme

.

自己紹介(1)

# image
# relative-height = 40
# src = https://pbs.twimg.com/profile_images/2290018079/cvcy12slbeva80jboxzf_400x400.png

自己紹介(2)

# image
# relative-height = 60
# src = images/track-points.png

参考画像の出典

# image
# relative-height = 80
# src = images/irasutoya.png

パッケージ関連の活動

閑話休題

((‘tag:center’)) そろそろ本題に

本日の話題

本日の話題

話さないこと

Debbugsとは?

# image
# relative-height = 100
# src = images/debbugs-debbugs.png

Debbugsとは?

ふつうの人のバグ報告(1)

# image
# relative-height = 80
# src = images/reportbug.png

ふつうの人のバグ報告(2)

# image
# relative-height = 80
# src = images/reportbug-ng.png

Debbugsのよいところ

Debbugsの見方

# image
# relative-height = 80
# src = images/debbugs-status.png

Debbugsの重要度

Debbugsのタグ

Debbugsの状態

なぜDebbugsに興味を?

botに処理させるには?

SOAP!

サンプルコードもあるよ

require 'soap/rpc/driver'

host = "bugs.debian.org"
port = 80
server="http://#{host}:#{port}/cgi-bin/soap.cgi"
ns = 'Debbugs/SOAP/'
drv = SOAP::RPC::Driver.new(server, ns)
drv.wiredump_dev = STDOUT if $DEBUG
drv.add_method('get_status','bugnumber')
drv.add_method('get_bugs','keyparam')

p drv.get_status(drv.get_bugs(['package', 'pbuilder', 'severity', 'wishlist']))

Rubyの事情

雨後の筍 soap4r

soapXr

upstream on Debian

混沌とした世界

SOAPを使うには

WSDL

DebbugsのWSDL

WSDLを探せ

# image
# relative-height = 70
# src = images/debbugs-wsdl-found.png

Debbugs.wsdl

WSDLの構造

<wsdl:types>

<complexType name="ArrayOfBugNumber">
  <complexContent>
    <restriction base="soapenc:Array">
      <attribute ref="soapenc:arrayType" wsdl:arrayType="xsd:int[]"/>
    </restriction>
  </complexContent>
</complexType>

<wsdl:message>

<wsdl:message name="get_statusRequest">
  <wsdl:part name="bugs" type="types:ArrayOfBugNumber"/>
</wsdl:message>
<wsdl:message name="get_statusResponse">
  <wsdl:part name="s-gensym3" type="apachens:Map"/>
</wsdl:message>

<wsdl:portType>

<wsdl:operation>

<wsdl:operation name="get_status" parameterOrder="bugs">
  <wsdl:input message="tns:get_statusRequest">
    <soap:body
          encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
          namespace="urn:Debbugs/SOAP"
          use="encoded"/>
  </wsdl:input>
  <wsdl:output message="tns:get_statusResponse">
    <soap:body
          encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
          namespace="urn:Debbugs/SOAP"
          use="encoded"/>
  </wsdl:output>
</wsdl:operation>

<wsdl:binding>

<wsdl:service>

実践:debbugs

何を使う?

savonの使い方

savonクライアント

client = Savon.client(wsdl: "(WSDLのURL)",
                      endpoint: "http://bugs.debian.org/cgi-bin/soap.cgi",
                      namespace: "Debbugs/SOAP")

メソッドを呼ぶ

# fetch status of pbuilder specific bugs
response = client.call(:get_status) do
  message(bugs: ["807406", "837812"])
end

レスポンスを表示する

bugs = response.body[:get_status_response][:s_gensym3][:item]
bugs.each do |bug|
  item = bug[:value]
  puts "#{bug[:key]}:#{item[:pending]}:#{item[:subject]}"
end
#=> 
807406:pending:pbuilder: drop all the 'xenial' (...)
837812:pending:[pbuilder] New hook improving dpkgi

まとめ