コマンドライン型ランチャを活用するためのスクリプト(URLとリモートログイン編)


2011年 02月 01日

ランチャー使ってますか?

僕は最近はコマンドライン型のLaunchyに乗り換えました。以前はボタン型ランチャーのnrLaunchでした。
ボタン型からコマンドライン型のランチャーに乗り換えて思うのが、コマンドライン型ではURLを指定してイシュートラッカーのページを開いたり、引数を渡した状態でプログラムを起動するのが面倒だと言うことです。

ボタン型の場合は引数指定は比較的簡単に設定できます。でも設定をエディタで編集できないし、バージョン管理できないです。
コマンドライン型でも、バッチファイルなどを一個一個用意してあげれば何とかなるんですけど、コピペばかりで管理が大変です。

というわけで、そういう面倒さを何とかするためにスクリプトを書くのでした。

コード置き場

  • https://github.com/troter/launcher-helper

次の様なディレクトリ構成を想定してます。

(root)/
 |-_tools/
 |  |-mklink.rb
 |  \-mkttl.rb
 |-timedia/   # プロジェクト毎のディレクトリ
    |-link.yml
    \-ttl.yml

指定したURLに遷移するHTMLを生成する

ランチャはファイルを開いたりプログラムを実行する事ができます。ここではHTMLを開いてそのHTMLから指定したURLに遷移したいと思います。
(バッチファイルを作ったりvbsのファイルを生成してもいいのですが、ランチャにWebページを開く事を全く連想させないアイコンが表示されるのでやめます。)

次の様なHTMLをベースに自動生成します。

<html>
<meta http-equiv="REFRESH" content="0;URL=http://www.google.co.jp">
</html>

このHTMLを生成するためにはファイル名とURLが必要です。timedia/link.ymlを作成して定義しましょう

- name: timedia-labs-blog
  url: http://labs.timedia.co.jp/
- name: timedia-labs-tophatenar
  url: http://tophatenar.com/view/http://labs.timedia.co.jp/

次のスクリプトでHTMLを生成します。(_tools/mklink.rb)

# -*- coding:utf-8 -*-

require 'yaml'
$KCODE = "U"

module LinkMaker

  class RedirectMaker
    def initialize(config)
      @dirname = File.dirname(config)
      @config = YAML.load_file(config)
    end

    def run
      @config.each do |data|
        make_link(data)
      end
    end

    def make_link(data)
      name = data['name']
      html = <<EOS
<html>
<meta http-equiv="REFRESH" content="0;URL=#{data['url']}">
</html>
EOS
      File.open("#{@dirname}/#{name}.html", "w") do |f|
        f << html
      end
    end
  end

  def self.run
    Dir["../**/link.yml"].each do |config|
      LinkMaker::RedirectMaker.new(config).run
    end
  end
end

LinkMaker.run

スクリプトを実行するとlink.ymlと同じフォルダにHTMLが生成されます。

<html>
<meta http-equiv="REFRESH" content="0;URL=http://labs.timedia.co.jp/">
</html>

いろいろなURLを追加してランチャから呼び出しましょう。僕はイシュートラッカーやHudson、社内のWikiなどを登録してます。

リモートログインするTera Termのマクロを生成する

SourceForge.JP Magazine にとても参考になる記事(Tera Termマクロ活用入門(1):各種ログインを自動化する)が掲載されています。
この記事を参考にTera Termのマクロを生成しましょう。

情報としては次の情報があればよいでしょう。timedia/ttl.ymlとして保存します。

- name: "hogehoge-dev"
  auth: "password"             # 認証方式 password or publickey
  hostname: "192.168.xx.xx"    # ホスト名
  username: "troter"
  wait: "$"                    # ログイン時に表示される文字
  command: "screen -rD -R"     # ログイン後実行するコマンド
  options: ""                  # teratermに渡すコマンドラインオプション
- name: "foobar-dev"
  auth: "publickey"
  keyfile: "path/to/keyfile"   # 秘密鍵の場所
  hostname: "192.168.xx.yy"
  username: "troter"
  wait: "$"
  command: "screen -rD -R"
  options: ""

次のスクリプト(_tools/mkttl.rb)でttlファイルを生成します。

# -*- coding:utf-8 -*-

require 'yaml'
$KCODE = "U"

#
# ref: http://sourceforge.jp/magazine/10/01/08/0825239/2
# ref: http://sourceforge.jp/magazine/10/01/18/105235
module TTLMaker

  class TTLConfig
    def initialize(config)
      @dirname = File.dirname(config)
      @config = YAML.load_file(config)
    end

    def run
      @config.each do |data|
        make_ttl(data)
      end
    end

    def make_ttl(data)
      case data['auth']
      when "password"
        make_ttl_password(data)
      when "publickey"
        make_ttl_publickey(data)
      else
      end
    end

    def make_ttl_password(data)
      p data["sshl"]
      options = data["options"].nil? ? "" : " #{data["options"]}";
      macro = <<-EOS
username = '#{data['username']}'
hostname = '#{data['hostname']}'
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
msg = 'Enter password for user '
strconcat msg username;
strconcat msg '@';
strconcat msg hostname
passwordbox msg 'Get password'

command = hostname
strconcat command ':22 /ssh /auth=password /user='
strconcat command username
strconcat command ' /passwd='
strconcat command inputstr
strconcat command '#{options}'

connect command
      EOS
      macro << "wait '#{data["wait"]}'\n" unless data['wait'].nil?
      macro << "sendln '#{data["command"]}'\n" unless data['command'].nil?
      make_ttl_file(data["name"], macro)
    end

    def make_ttl_publickey(data)
      ssh_l = data["ssh_l"].nil? ? "" : " /ssh-L#{data["ssh_l"]}";
      options = data["options"].nil? ? "" : " #{data["options"]}";
      macro = <<-EOS
username = '#{data['username']}'
hostname = '#{data['hostname']}'
keyfile = '#{data['keyfile']}'
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
msg = 'Enter publickey passphrase for user '
strconcat msg username;
strconcat msg '@';
strconcat msg hostname
passwordbox msg 'Get password'

command = hostname
strconcat command ':22 /ssh /auth=publickey /user='
strconcat command username
strconcat command ' /keyfile='
strconcat command keyfile
strconcat command ' /passwd='
strconcat command inputstr
strconcat command '#{options}'

connect command
      EOS

      macro << "wait '#{data["wait"]}'\n" unless data['wait'].nil?
      macro << "sendln '#{data["command"]}'\n" unless data['command'].nil?
      make_ttl_file(data["name"], macro)
    end

    def make_ttl_file(name, macro)
      puts "============================================================"
      puts "FILE: #{@dirname}/#{name}.ttl"
      puts "------------------------------------------------------------"
      puts "CONTENT"
      puts "------------------------------------------------------------"
      puts macro
      puts "============================================================"

      File.open("#{@dirname}/#{name}.ttl", "w") do |f|
        f << macro
      end
    end
  end

  def self.run
    Dir["../**/ttl.yml"].each do |config|
      TTLMaker::TTLConfig.new(config).run
    end
  end
end

TTLMaker.run

実行すると次の様なttlファイルが作成されます。

username = 'troter'
hostname = '192.168.xx.yy'
keyfile = 'path/to/keyfile'
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
msg = 'Enter publickey passphrase for user '
strconcat msg username;
strconcat msg '@';
strconcat msg hostname
passwordbox msg 'Get password'

command = hostname
strconcat command ':22 /ssh /auth=publickey /user='
strconcat command username
strconcat command ' /keyfile='
strconcat command keyfile
strconcat command ' /passwd='
strconcat command inputstr
strconcat command ' '

connect command
wait '$'
sendln 'screen -rD -R'

ttlファイルをランチャから呼び出せばパスワード入力のウィンドウが表示されます。自動でscreenも起動してくれます。

まとめ

単体では少し使いにくい場合でも補助するプログラムを作ってあげればその不満も無くなります。
お気に入りのツールを使いやすくするための、ちょっとしたプログラムを作成してみてはどうでしょうか。