質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.61%

cloudstack-cloudmonkeyのpython3化 hashlib

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 1,421

Kentaro0919

score 246

cloudnをAPIで利用するために、python2 で書かれているcloudstack-cloudmonkey をpython3で動かそうとしているのですが、途中でつまずいています。

2to3 で変換した後、importとかを修正することで pipインストールして起動するとことろまで行きました。

cloudmonkey
☁ Apache CloudStack 🐵 cloudmonkey 5.3.3. Type help or ? to list commands.

Using management server profile: local

(local) 🐵 >

秘密鍵の登録まではうまくいくようになったのですが、コマンドを実行するとエラーになってしまいます。

(local) 🐵 > list virtualmachines
Traceback (most recent call last):
  File "/usr/local/bin/cloudmonkey", line 11, in <module>
    load_entry_point('cloudmonkey', 'console_scripts', 'cloudmonkey')()
  File "/Users/kentaro/python/cloudstack-cloudmonkey/cloudmonkey/cloudmonkey.py", line 920, in main
    shell.cmdloop()
  File "/Users/kentaro/python/cloudstack-cloudmonkey/cloudmonkey/cloudmonkey.py", line 155, in cmdloop
    super(CloudMonkeyShell, self).cmdloop(intro="")
  File "/usr/local/Cellar/python3/3.5.2_1/Frameworks/Python.framework/Versions/3.5/lib/python3.5/cmd.py", line 138, in cmdloop
    stop = self.onecmd(line)
  File "/usr/local/Cellar/python3/3.5.2_1/Frameworks/Python.framework/Versions/3.5/lib/python3.5/cmd.py", line 217, in onecmd
    return func(arg)
  File "/Users/kentaro/python/cloudstack-cloudmonkey/cloudmonkey/cloudmonkey.py", line 208, in grammar_closure
    self.default("{0} {1}".format(cmd, args))
  File "/Users/kentaro/python/cloudstack-cloudmonkey/cloudmonkey/cloudmonkey.py", line 482, in default
    result = self.make_request(apiname, args_dict, isasync)
  File "/Users/kentaro/python/cloudstack-cloudmonkey/cloudmonkey/cloudmonkey.py", line 395, in make_request
    self.signatureversion)
  File "/Users/kentaro/python/cloudstack-cloudmonkey/cloudmonkey/requester.py", line 262, in monkeyrequest
    signatureversion)
  File "/Users/kentaro/python/cloudstack-cloudmonkey/cloudmonkey/requester.py", line 223, in make_request
    args["signature"] = sign_request(args, credentials['secretkey'])
  File "/Users/kentaro/python/cloudstack-cloudmonkey/cloudmonkey/requester.py", line 220, in sign_request
    hashlib.sha1).digest()).strip()
  File "/usr/local/Cellar/python3/3.5.2_1/Frameworks/Python.framework/Versions/3.5/lib/python3.5/hmac.py", line 144, in new
    return HMAC(key, msg, digestmod)
  File "/usr/local/Cellar/python3/3.5.2_1/Frameworks/Python.framework/Versions/3.5/lib/python3.5/hmac.py", line 42, in __init__
    raise TypeError("key: expected bytes or bytearray, but got %r" % type(key).__name__)
TypeError: key: expected bytes or bytearray, but got 'str'


cloudnのマニュアル

秘密鍵を使用し HMAC SHA-1でハッシュをかけます。
ハッシュにはopensslコマンドを利用し、ハッシュ結果はBASE64で文字列化します。
となっている箇所だと思うのですが、どこをバイナリにすればいいのかよくわかりません。

def sign_request(params, secret_key):
        request = list(zip(list(params.keys()), list(params.values())))
        request.sort(key=lambda x: x[0].lower())
        hash_str = "&".join(
            ["=".join(
                [r[0].lower(),
                 urllib.parse.quote_plus(str(r[1]), safe="*").lower()
                 .replace("+", "%20").replace("%3A", ":")]
            ) for r in request]
        )

        return base64.encodestring(hmac.new(secret_key, hash_str,
                                            hashlib.sha1).digest()).strip()

http://docs.python.jp/3.5/library/hashlib.html#hashlib.new

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

0

ほとんど勘というか他所の成功例の引用レベルですけど、

#def sign_requestの最後

return base64.encodestring(hmac.new(secret_key.encode('utf-8'), hash_str.encode('utf-8'),
                                            hashlib.sha1).digest()).strip()

でどうでしょうか。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/08/27 23:07 編集

    ありがとうございます、この部分はこれで正しく先に進みました、しかし、進んでみると、出来ていると思っていた秘密鍵の登録がうまくいっていないことがわかりました😢

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.61%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る