5.20.2014

CCIEの再認定試験受験

この記事は
http://blog.feasible-lab.com/ccie-recertify/
に移動しました。

2.10.2014

戻りのプロンプト値を見て処理を分けるteratermマクロ

ASAとCiscoルータでは、terminalコマンドが少し違うので、一連のマクロでconfigなどを取得しようとすると、ASAはASA用にマクロを切り替えなければならないので、ちょっと面倒だ。

だが、recvln関数を使うことで意外と簡単に解決できることがわかったので、メモしておこうと思う。

プロジェクト適度な期間で転がっているエンジニアにとっては、shellをがっつり作り込むのは面倒だけど、楽はしたいっていうのが常に命題なので、teratermのマクロは結構便利だったりする。

下のマクロとwhile文を適度に組み合わせれば、いい具合にしのげるマクロになると思う。


connect SSH ;適当なSSH connect
pause 3 

;login 
wait '>' 
mpause 500 
sendln ;戻り値を取得するための空enter
recvln ;recvln関数でinputstrに戻り値を格納

;be enable mode 
sendln 'en' 
mpause 500 
wait 'assword' 
mpause 500 
sendln 'cisco' ;passは仮でcisco
mpause 500
;ここでは仮にASAのhostnameが"ASA"から始まることとする
sendln

;strmatch関数でinputstrに格納した値にASA.*(正規表現)が含まれているかどうか確認
strmatch inputstr 'ASA.*' 

if result=0 then ;含まれない場合0が返り、含まれる場合1が返る
     wait '#' ;以下は0の場合なので、IOSルータ向け処理
     pause 1
     sendln 'ter len 0' ;IOSルータにつきter len 0
     pause 1
     wait '#'
     pause 1
     sendln 'show run'
     pause 5
     wait '#'
     sendln 'exit'
     pause 5
else ;elseなのでASA向けの処理
     wait '#'
     pause 1
     sendln 'ter pa 0' ;ASAなのでter pa 0
     pause 1     
     wait '#'
     pause 2
     sendln 'show run'
     pause 10
     wait '#'
     sendln 'exit'
     pause 5
endif
     pause 1
     messagebox 'マクロ終了' '' 
end


else ifで色々と分岐条件を書いていけば、ベンダーフリーで対応できるマクロになるので、まあそれなりに潰しの効くツールになるのではないだろうか。



2.07.2014

wordpress+google analyticsでファイルダウンロード数のカウント

せっかくツールを作っているので、どのぐらいの方にダウンロードいただいているのかは気になるところだ。 

というわけで、google analyticsのevent tracking機能を使用し、ダウンロード数のカウントをしようと色々ググってみるも、どうも現行のバージョンで動作するものがパッと見つからない。 

というわけで、マニュアルを読みつつ適用できたので、方法を記しておこうと思う。   

まず、wordpressのヘッダファイルを編集する。 

</head>のタグを検索し、その寸前に以下のコードを投入する。
<script type="text/javascript">

  var _gaq = _gaq || [];
  _gaq.push(['_setAccount', 'UA-XXXXX-X']);
  _gaq.push(['_trackPageview']);

  (function() {
    var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
    ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
    var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
  })();

</script>
  
このスクリプトの4行目のUA-xx部分には、google analyticsで使用しているIDを投入するので、それぞれユニークな値が入る。   

続いて、トラッキングしたいリンクの書き方を少し変更する必要がある。   例えば、当サイトであれば、
<a href="/file/flash_subnet_for_win.zip>Flash Subnet for Win</a>
  

のリンクがファイルのダウンロードリンクになるわけだが、こちらを以下の通り編集する。
<a onclick="_gaq.push(['_trackEvent','Files','Download','Flash Subnet for Win']);" href="/file/flash_subnet_for_win.zip">Flash Subnet for Win</a>
  
赤太字にしている部分については、それぞれ環境に応じて好きな値を投入すればいいと思う。 

各パラメータのイメージは以下の通り。左からカテゴリ、アクション、ラベルの並び。

  スクリーンショット 2014-01-14 21.31.52
  スクリーンショット 2014-01-14 21.32.09
  スクリーンショット 2014-01-14 21.32.17



2.06.2014

【Python】Ciscoルータへのtelnet

風邪で一日中ダウンしていて、何も手につかない状態だったが、そういう時に限っていろいろと思いついてしまって結局ベッドでパチパチキーボードを叩いていた。 

とは言っても、頭をフル回転させてコードを書く気力はなく、自宅のciscoルータに対して、telnet試験をひたすら繰り返していた。 

今まであまり気にしていなかったが、pythonにおけるtelnetlibで気づいたことがあったのでメモしておく。 

telnetlibではtelnetの戻り値を指定することのできるread_until関数が用意されているが、ciscoルータなどのコマンド入力をシーケンシャルに進めて行く場合、このread_untilで"#"などを待ち、次のステップに進むなどの書き方がスムーズだ。 

例えば、先日書き直しをしたLoggetのciscoルータアクセス部分のコードは以下のようなイメージである。


class RemoteAccess:
    "remote access class"
    def __init__(self,address,login_pass,login_id,en_pass):
        self.address = address
        self.login_pass = login_pass
        self.login_id = login_id
        self.en_pass = en_pass

    def TnetNoIdCisco(self):
        "telnet without login ID"
        now = datetime.datetime.now()
        nowstr = str(now.strftime("%Y%m%d-%H%M(%S)"))
        logname = nowstr + '_' + self.address + '_log.txt'
        tn = telnetlib.Telnet(self.address, 23, 5)
        log = open(logname, 'wb')
        tn.read_until('assword:',2)
        tn.write(self.login_pass + '\r\n')
        tn.read_until('>',2)
        tn.write('en' + '\r\n')
        tn.read_until('assword:',2)
        tn.write(self.en_pass + '\r\n')
        tn.read_until('#',2)        
        tn.write('ter len 0' + '\r\n')
        ccom = open('cisco_show.txt','r')
        ccoms = ccom.readline().replace(('\n'or'\r'),'\r\n')
        ccli = ccoms.rstrip('\n')
        while ccli:
            tn.write(ccli.encode('ascii') + '\r\n')
            ccoms = ccom.readline().replace(('\n'or'\r'),'\r\n')
            ccli = ccoms.rstrip('\r\n')
        tn.write('exit' + '\r\n')
        output = tn.read_all()
        log.write(output)
        log.close()

贅肉がつきまくっていてちょっと恥ずかしいコードではあるものの、 ポイントはそこではなく、read_unitl関数の引数であるtimeout値である。


tn.read_until("#",2)
  

timeout値は必須の引数ではなく、空欄でも動作するため、これまでは特に指定していなかった。

しかし、実験を繰り返して行くうちにtimeoutを指定しないと複雑な処理に分岐させていった時に、処理がハングしてしまって、原因不明のフリーズが起きるときがあった。 

色々とデバッグしつつパラメータを入れていったところ、read_until関数にtimeoutの引数を指定すれば、フリーズすることがなくなった。

2.05.2014

【Python】Flash Subnet For Winの公開

Windows版のIP計算機、Flash Subnetのベータ版をすることにした。

 flash

 IP計算機の公開などと言っても非常に今更感があるが、軽く、使いやすくするにはどうすればいいを重視して作成した。

使い難い、こういう機能があるといい、などのフィードバックは非常にありがたいが、何よりも使ってもらえるのがありがたい。

使い方は単純明快である。

  flash1
IPアドレス欄にIPアドレスを投入する。
Subnet Mask or Prefix欄に、サブネットマスクかプリフィクスのどちらかを入力する。
そしてCalcボタンを押すと結果がOutputに表示される。   

これまでのIP計算機と大きく違う点としてお勧めしたいのは2点ある。 

1. Subnet maskやprefixの分類を気にせず投入できること

2. インプットボックスがオクテットごとに分かれていないこと 

1について、大体のIP計算機はサブネットマスクかプリフィクスのどちらかしか入力できない。片方しかサポートしてくれないのは非常にストレスだ。なぜなら、IP計算機が必要なタイミングで必ずプリフィクスを入力するとは限らないし、必ずサブネットマスクとも限らない。

2について、大体の計算機はインプットボックスがオクテットごとに分離されている。
それのせいで、資料やテキストからcopy &pasteができず、アドレスを入力するたびにTabでボックスを移動するなど、非常にストレスが大きい。

Flash Subnetではその二つのストレスを取り去り、完全無料・商用利用可能のIP計算フリーソフトとして公開した。

 ダウンロードはダウンロードページから。