heroku证书:info --app appname不写入STDOUT或STDERR

时间:2013-10-12 16:16:05

标签: heroku heroku-toolbelt

我正在尝试处理heroku certs命令的输出。 heroku toolbelt中的其他命令写入STDOUT,但是heroku certsheroku certs:info之类的相关命令似乎没有写在ubuntu上我预期的任何地方。正常运行时输出:

$ heroku certs:info --app appname
Fetching SSL Endpoint changedname-3302.herokussl.com info for appname... done
Certificate details:
Common Name(s): *.domain.com
                domain.com

...etc

尝试重定向或管道输出的输出:

$ heroku certs --app appname | grep ssl
$ heroku certs --app appname | cat
$ heroku certs:info --app appname | grep ssl
$ heroku certs:info --app appname 2>&1 | grep ssl
$ heroku certs:info --app appname &> /tmp/certs.info; cat /tmp/certs.info
$ heroku certs:info --app appname > /tmp/certs.info; cat /tmp/certs.info

其他heroku命令按预期工作:

$ heroku ps --app appname | grep web
=== web (1X): `node www`
web.1: idle 2013/10/12 05:44:15 (~ 10h ago)

$ heroku status --app appname | grep -i status
=== Heroku Status

这是一个应该报告的错误还是我遗漏的错误?

1 个答案:

答案 0 :(得分:4)

我同样尝试捕获heroku certs的输出,以便我们可以自动化DNS设置。

正如您所发现的,Heroku toolbelt脚本不会重定向任何certs命令的输出。深入研究ruby实现,这就是“显示”方法的重写:

def display(msg = "", new_line = true)
  super if $stdout.tty?
end

https://github.com/heroku/heroku/blob/master/lib/heroku/command/certs.rb#L188

如果它不认为它输出到/ dev / tty,它将不会打印任何内容。

作为一个快速黑客,我改为使用curl等价物作为直接替换:

curl -n -s -X GET https://api.heroku.com/apps/my_app_name/ssl-endpoints -H "Accept: application/vnd.heroku+json; version=3"

-n选项将使用curl来使用heroku脚本已经使用的〜/ .netrc条目。输出是JSON,沿着这些行。

[
  {
    "cname":"xxxx-xxxx.herokussl.com",
    "id":"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
    "name":"xxxx-xxxx",
    "warnings":[],
    "ssl_cert":{
      "ca_signed?":true,
      "cert_domains":[
        "*.xxxxxxxx.com",
        "xxxxxxxx.com"
      ],
      "expires_at":"xxxx",
      "issuer":"xxxx",
      "self_signed?":false,
      "starts_at":"xxxx",
      "subject":"xxxx"
    },
    "ssl_cert_prev":null
  }
]

根据您包装脚本的方式,这可能比heroku输出更加可解析。