2011年 02月 01日
僕は最近はコマンドライン型のLaunchyに乗り換えました。以前はボタン型ランチャーのnrLaunchでした。
ボタン型からコマンドライン型のランチャーに乗り換えて思うのが、コマンドライン型ではURLを指定してイシュートラッカーのページを開いたり、引数を渡した状態でプログラムを起動するのが面倒だと言うことです。
ボタン型の場合は引数指定は比較的簡単に設定できます。でも設定をエディタで編集できないし、バージョン管理できないです。
コマンドライン型でも、バッチファイルなどを一個一個用意してあげれば何とかなるんですけど、コピペばかりで管理が大変です。
というわけで、そういう面倒さを何とかするためにスクリプトを書くのでした。
(root)/
|-_tools/
| |-mklink.rb
| \-mkttl.rb
|-timedia/ # プロジェクト毎のディレクトリ
|-link.yml
\-ttl.yml
ランチャはファイルを開いたりプログラムを実行する事ができます。ここでは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などを登録してます。
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も起動してくれます。
単体では少し使いにくい場合でも補助するプログラムを作ってあげればその不満も無くなります。
お気に入りのツールを使いやすくするための、ちょっとしたプログラムを作成してみてはどうでしょうか。