wiresharkの-Tfields
■[Software]wiresharkの-Tfields
tsharkで -te -Tfields -e frame.time オプションつけてフレームの届いた時刻を出そうとしても、epoch にならずにこーなる。
Oct 12, 2008 15:48:08.871946000
日付の出し方がイマイチ不明(%dか%eか)なのでソースチェック。
$ ack %b
epan/ftypes/ftype-time.c
243: curptr = strptime(s,"%b %d, %Y %H:%M:%S", &tm);
%bで引っかかったところで、同じ形式はここなので、恐らくここかな。
strptimeはパースする関数だからstrftimeで探したけど該当したものはない。
どこから呼ばれているか確認しようとしてgtags待ち。(昨日パッチ書いて消してしまった)
とりあえず、時刻のパースはコレで
#!/usr/bin/perl
use Time;:Piece;
my $date = 'Oct 12, 2008 15:48:08.871946000';
$date =~ s/\.[0-9]{9}$//;
my $t = Time::Piece->strptime($date,"%b %d, %Y %H:%M:%S);
print $t->datetime;
2008-10-12T15:48:08
<
■[Software]PeerReviewPlugin
なぜか、コードレビューを一番して欲しい人の端末からだけバグが発生。。。
入れ方。
svnから落とす
http://trac-hacks.org/svn/peerreviewplugin/tags/2.1-toddler-rc1/
easy_install 2.1-toddler-rc1
インストール完了!
pythonラクチンだな。
cpanでチマチマ入れているのが嘘みたい。
設定
各プロジェクトの conf/trac.ini を修正します。
[components]
codereview.* = enabled
を追記する。
変更を反映する。
権限の付与
trac-admin tracプロジェクト permission add adways_taro CODE_REVIEW_DEV CODE_REVIEW_MGR
webにログインするとtracの右端にpeerReviewが追加されています。
使い勝手としては、まぁ悪くない。けど、求めてるのとちょっと違う。。。
その他
ひじょーに重いのでmod_python化を試みましたが、、centos4でmod_python入れたらsegmentation faultで死。
結局fastcgiになりました。
参考にしたページ
http://mist.suenaga.cse.nagoya-u.ac.jp/trac/wiki/TracFastCgi
まぁfastcgiの方が簡単でいいね。
FastCgiConfigよりは.fcgi内に書く方がいいと思う。
■[software] Redmineのマイページが微妙なので
書き換えた。。。
Redmineをプライベートのタスク管理で利用してるんだけど、マイページのカレンダーが一週間しか表示しなくって、見通しが悪すぎなので。
なんか最近こんなんばっかしてる気がする。
今回は直接書き換えたけど、追加した方がすっきりするはず。
機能追加されないかなー。
使用中の環境はubuntu-8.0.4, Redmine-0.70, Rails-1.1.6-3
--- lib/redmine/helpers/calendar.rb.org 2008-04-28 19:41:38.000000000 +0900 +++ lib/redmine/helpers/calendar.rb 2008-05-07 01:46:52.000000000 +0900 @@ -40,6 +40,9 @@ when :week @startdt = date - (date.cwday - first_wday)%7 @enddt = date + (last_wday - date.cwday)%7 + when :two_week + @startdt = date - (date.cwday - first_wday)%7 + @enddt = date + (last_wday - date.cwday)%7 + 7 else raise 'Invalid period' end --- app/views/my/blocks/_calendar.rhtml.org 2008-05-07 01:47:51.000000000 +0900 +++ app/views/my/blocks/_calendar.rhtml 2008-05-07 01:47:03.000000000 +0900 @@ -1,6 +1,6 @@ <h3><%= l(:label_calendar) %></h3> -<% calendar = Redmine::Helpers::Calendar.new(Date.today, current_language, :week) +<% calendar = Redmine::Helpers::Calendar.new(Date.today, current_language, :two_week) calendar.events = Issue.find :all, :conditions => ["#{Issue.table_name}.project_id in (#{@user.projects.collect{|m| m.id}.join(',')}) AND ((start_date>=? and start_date<=?) or (due_date>=? and due_date<=?))", calendar.startdt, calendar.enddt + 7 , calendar.startdt, calendar.enddt + 7], :include => [:project, :tracker, :priority, :assigned_to] unless @user.projects.empty? %>
データベース・リファクタリング
■[software]ApacheでWindows の統合認証ができるっぽい
http://d.hatena.ne.jp/dayflower/20070711/1184141979
これは便利かも。
検証しよー
NTLM⇒LDAP⇒htpasswdとフォールバックもできるとベスト
http://samba.org/ftp/unpacked/lorikeet/mod_auth_ntlm_winbind/README
を見たところ
# to enable 'NTLM+Negotiate' authentication too: <Directory "/srv/www/auth"> AuthName "NTLM Authentication thingy" NTLMAuth on NegotiateAuth on NTLMAuthHelper "/usr/bin/ntlm_auth --helper-protocol=squid-2.5-ntlmssp" NegotiateAuthHelper "/usr/bin/ntlm_auth --helper-protocol=gss-spnego" NTLMBasicAuthoritative on AuthType NTLM AuthType Negotiate require valid-user </Directory>
ってことは、複数のauthtypeを使えるのかも。
NTLM or LDAPもできそうな気がする。優先順位のつけ方がよく分からないので、フォールバックになるかは不明だけど。
要検証
Pound でRemoteAddressが使えない
■[Software]Poundいじって遊んでみた
PoundではRemoteAddressが使えないって騒いでいる人がいたのでつけてみた。
そんなことしたければapacheでやればいいじゃんって話だけど。
- 機能
コンフィグのService部分にRemoteAddress IPと書くとマッチしたIPしかServiceに振り分けられなくなる。
RemoteAddressはひとつのServiceに複数かけて、一応Regexが使える。
IPアドレスの癖にネットワークアドレスが書けないあたりが残念な感じ。
そのうちCのネットワーク周りの勉強も兼ねて書き換えたい。
PoundのConfigでRemoteAddressを使えるようにするパッチ
$ diff -uar --exclude=config.log --exclude=config.status Pound-2.4.1 Pound-2.4.1.RemoteAddress/ diff -uar --exclude=config.log --exclude=config.status Pound-2.4.1/config.c Pound-2.4.1.RemoteAddress/config.c --- Pound-2.4.1/config.c 2008-04-05 18:45:43.000000000 +0900 +++ Pound-2.4.1.RemoteAddress/config.c 2008-05-02 00:51:48.000000000 +0900 @@ -78,6 +78,7 @@ static regex_t Service, ServiceName, URL, HeadRequire, HeadDeny, BackEnd, Emergency, Priority, HAport, HAportAddr; static regex_t Redirect, RedirectN, TimeOut, Session, Type, TTL, ID, DynScale; static regex_t ClientCert, AddHeader, Ciphers, CAlist, VerifyList, CRLlist, NoHTTPS11; +static regex_t RemoteAddress; static regex_t Grace; static regmatch_t matches[5]; @@ -435,6 +436,28 @@ logmsg(LOG_ERR, "line %d: URL bad pattern \"%s\" - aborted", n_lin, lin + matches[1].rm_so); exit(1); } + } else if(!regexec(&RemoteAddress, lin, 4, matches, 0)) { + if(res->remote_address) { + for(m = res->remote_address; m->next; m = m->next) + ; + if((m->next = (MATCHER *)malloc(sizeof(MATCHER))) == NULL) { + logmsg(LOG_ERR, "line %d: RemoteAddress config: out of memory - aborted", n_lin); + exit(1); + } + m = m->next; + } else { + if((res->remote_address = (MATCHER *)malloc(sizeof(MATCHER))) == NULL) { + logmsg(LOG_ERR, "line %d: RemoteAdrress config: out of memory - aborted", n_lin); + exit(1); + } + m = res->remote_address; + } + memset(m, 0, sizeof(MATCHER)); + lin[matches[1].rm_eo] = '\0'; + if(regcomp(&m->pat, lin + matches[1].rm_so, REG_ICASE | REG_NEWLINE | REG_EXTENDED)) { + logmsg(LOG_ERR, "line %d: RemoteAddress bad pattern \"%s\" - aborted", n_lin, lin + matches[1].rm_so); + exit(1); + } } else if(!regexec(&HeadRequire, lin, 4, matches, 0)) { if(res->req_head) { for(m = res->req_head; m->next; m = m->next) @@ -1213,6 +1236,7 @@ || regcomp(&ListenHTTPS, "^[ \t]*ListenHTTPS[ \t]*$", REG_ICASE | REG_NEWLINE | REG_EXTENDED) || regcomp(&End, "^[ \t]*End[ \t]*$", REG_ICASE | REG_NEWLINE | REG_EXTENDED) || regcomp(&Address, "^[ \t]*Address[ \t]+([^ \t]+)[ \t]*$", REG_ICASE | REG_NEWLINE | REG_EXTENDED) + || regcomp(&RemoteAddress, "^[ \t]*RemoteAddress[ \t]+([^ \t]+)[ \t]*$", REG_ICASE | REG_NEWLINE | REG_EXTENDED) || regcomp(&Port, "^[ \t]*Port[ \t]+([1-9][0-9]*)[ \t]*$", REG_ICASE | REG_NEWLINE | REG_EXTENDED) || regcomp(&Cert, "^[ \t]*Cert[ \t]+\"(.+)\"[ \t]*$", REG_ICASE | REG_NEWLINE | REG_EXTENDED) || regcomp(&xHTTP, "^[ \t]*xHTTP[ \t]+([01234])[ \t]*$", REG_ICASE | REG_NEWLINE | REG_EXTENDED) @@ -1367,6 +1391,7 @@ regfree(&ListenHTTPS); regfree(&End); regfree(&Address); + regfree(&RemoteAddress); regfree(&Port); regfree(&Cert); regfree(&xHTTP); diff -uar --exclude=config.log --exclude=config.status Pound-2.4.1/http.c Pound-2.4.1.RemoteAddress/http.c --- Pound-2.4.1/http.c 2008-04-05 18:45:43.000000000 +0900 +++ Pound-2.4.1.RemoteAddress/http.c 2008-05-01 22:00:40.000000000 +0900 @@ -719,7 +719,7 @@ } /* check that the requested URL still fits the old back-end (if any) */ - if((svc = get_service(lstn, url, &headers[1])) == NULL) { + if((svc = get_service(lstn, url, &headers[1], &from_host)) == NULL) { addr2str(caddr, MAXBUF - 1, &from_host, 1); logmsg(LOG_NOTICE, "(%lx) e503 no service \"%s\" from %s", pthread_self(), request, caddr); err_reply(cl, h503, lstn->err503); diff -uar --exclude=config.log --exclude=config.status Pound-2.4.1/pound.h Pound-2.4.1.RemoteAddress/pound.h --- Pound-2.4.1/pound.h 2008-04-05 18:45:43.000000000 +0900 +++ Pound-2.4.1.RemoteAddress/pound.h 2008-05-02 01:01:43.000000000 +0900 @@ -317,6 +317,7 @@ char name[KEY_SIZE + 1]; /* symbolic name */ MATCHER *url, /* request matcher */ *req_head, /* required headers */ + *remote_address, /* request remote_address */ *deny_head; /* forbidden headers */ BACKEND *backends; BACKEND *emergency; @@ -442,7 +443,7 @@ /* * Find the right service for a request */ -extern SERVICE *get_service(const LISTENER *, const char *, char **const); +extern SERVICE *get_service(const LISTENER *, const char *, char **const, const struct addrinfo *); /* * Find the right back-end for a request diff -uar --exclude=config.log --exclude=config.status Pound-2.4.1/svc.c Pound-2.4.1.RemoteAddress/svc.c --- Pound-2.4.1/svc.c 2008-04-05 18:45:43.000000000 +0900 +++ Pound-2.4.1.RemoteAddress/svc.c 2008-05-02 01:13:40.000000000 +0900 @@ -302,7 +302,7 @@ } static int -match_service(const SERVICE *svc, const char *request, char **const headers) +match_service(const SERVICE *svc, const char *request, char **const headers, const char *caddr) { MATCHER *m; int i, found; @@ -312,6 +312,14 @@ if(regexec(&m->pat, request, 0, NULL, 0)) return 0; + /* check for remote address */ + for(m = svc->remote_address; m; m = m->next){ + if(!regexec(&m->pat, caddr, 0, NULL, 0)) + break; + if(! m->next) + return 0; + } + /* check for required headers */ for(m = svc->req_head; m; m = m->next) { for(found = i = 0; i < (MAXHEADERS - 1) && !found; i++) @@ -337,14 +345,15 @@ * Find the right service for a request */ SERVICE * -get_service(const LISTENER *lstn, const char *request, char **const headers) +get_service(const LISTENER *lstn, const char *request, char **const headers, const struct addrinfo *from_host) { SERVICE *svc; - + char caddr[MAXBUF]; + addr2str(caddr, MAXBUF - 1, from_host, 1); for(svc = lstn->services; svc; svc = svc->next) { if(svc->disabled) continue; - if(match_service(svc, request, headers)) + if(match_service(svc, request, headers, caddr)) return svc; } @@ -352,7 +361,7 @@ for(svc = services; svc; svc = svc->next) { if(svc->disabled) continue; - if(match_service(svc, request, headers)) + if(match_service(svc, request, headers, caddr)) return svc; }
http://www.rwds.net/kuroita/cgi-bin/diary/Master/200406.htm#20040619-3