2008年2月4日 星期一

Linux Service - cvs setup server

CVS Server 利用xinetd dispatch

1. 設定xinetd 的相關步驟, 如果是使用ssh(ext mode)access CVS Server, 應該可以不用, 似乎是使用pserver才需要

首先在/etc/xinetd.d/ 增加cvspserver 檔案
內容如下
service cvspserver
{
disable = no ==> enable the service
port = 2401 ==> cvs listen port
socket_type = stream
protocol = tcp
wait = no
user = root
passenv = PATH
server = /usr/bin/cvs
env = HOME=/var/cvs
server_args = -f --allow-root=/home/cvs/CVSROOT pserver ==> /home/cvs/CVSROOT 為CVS repository directory
bind = 127.0.0.1 ==> cvs listen address
}

注意必須包含有 /etc/xinetd.conf, 如下

#
## Simple configuration file for xinetd
##
## Some defaults, and include /etc/xinetd.d/

defaults
{
instances = 60
log_type = SYSLOG authpriv
log_on_success = HOST PID
log_on_failure = HOST
cps = 25 30
}
includedir /etc/xinetd.d

2. 重新啟動xinetd (由於我在安裝時系統沒有xinetd, 所以我去重新下載了xinetd, 編譯過後, copy contrib/xinetd /etc/rc.d/init.d/ 下成為service script)
/etc/rc.d/init.d/xinetd restart
正在停止 xinetd: [ 確定 ]
正在啟動 xinetd: [ 確定 ]


/home/cvs 的結構如下

ls -la /home/cvs/
drwxrwxrwx 3 root wheel 4096 2008-02-05 13:15 CVSROOT
drwxrwxr-x 6 username username 4096 2008-02-05 13:15 test
drwxrwxr-x 3 username username 4096 2008-02-05 20:42 test2

CVSROOT 目錄必須要讓所有人都可以有寫的權限, 因為cvs server 必須要記錄user 的cvs 行為在CVSROOT 目錄內的檔案中

如何控管CVS Server 的個別權限 (READERS, WRITERS,PASSWD...)
設定Anonymous 的權限
有空再來測試
We can manage the CVS permission by using the Linux file system permission mechanism. For example, you can group some user into a specified group. And only this group can access a cvs project which group id is the same with that user group. So we can simply use the user/group/other file permission to manage the CVS access control.

e.g.
Set the user1, user2 belong in the "cvs"(id: 501) group
# cat /etc/passwd
[omit]
user1:x:500:501:User1:/home/user1:/bin/bash
cvs:x:501:501::/home/cvs:/bin/bash
user2:x:502:501::/home/user2:/bin/bash

// Make user1 and user2 in the cvs group
# cat /etc/group
[omit]
cvs:x:501:user1,user2




3. 如何import 檔案到剛建立好的CVS Server
我的經驗是從其他CVS import 檔案進來, 首先先把原有的目錄中的 CVS/ 子目錄先刪掉(這些檔案是CVS Server 在maintain cvs 的系統檔案, 我們不用把它們upload到新的project當中)

# cd project
project/# find ./* -name CVS -exec "rm -rf {}" \;

cvs import -m "initial" test3 vendor-name main ==> 其中test3是CVS project name, vendor-name 是 branch tag, main (release tag) 是main trunk tag

cvs import -kb -m "initial files" projectName vendorName main ==> import binary files (add -kb will inform the cvs server that all the uploaded files are binary files)

import 過程的log如下
I test3/filename.o ==> ignored files (*.o, *.a..)
N test3/filename.c ==> newAdded files
[omit]


之後再來cvs client 檢查就會發現如下
# cvs st -v Makefile
username@IP-address's password:
===================================================================
File: Makefile Status: Up-to-date

Working revision: 1.1.1.1
Repository revision: 1.1.1.1 /home/cvs/test3/Makefile,v
Sticky Tag: (none)
Sticky Date: (none)
Sticky Options: (none)

Existing Tags:
main (revision: 1.1.1.1)
vendor-name (branch: 1.1.1)


之後就可以利用client CVS 來執行checkouot 該project 來work了

Note:
We can configure the /CVSROOT/cvswrappers as the following setting to separate different file expansion as binary or text file (default configuration)

*.vsd -k 'b' -m 'COPY'
*.CLASS -k 'b' -m 'COPY'
*.DOC -k 'b' -m 'COPY'

In the real CVS data file, like "file.doc,v", will contain the expand tag to record the kflag type. like following examples
head 1.1;
branch 1.1.1;
access ;
symbols main:1.1.1.1 vendor-name:1.1.1;
locks ; strict;
comment @# @;
expand @b@; ==> "b" indicate "binary"



The method of changing the kflag
$ echo '$Id$' > kotest
$ cvs add -kb -m"A test file" kotest
$ cvs ci -m"First checkin; contains a keyword" kotest

If a file accidentally gets added without '-kb', one can use the cvs admin command to recover. For example:

$ echo '$Id$' > kotest
$ cvs add -m"A test file" kotest
$ cvs ci -m"First checkin; contains a keyword" kotest
$ cvs admin -kb kotest
$ cvs update -A kotest
# For non-unix systems:
# Copy in a good copy of the file from outside CVS
$ cvs commit -m "make it binary" kotest

2007年12月20日 星期四

SIP Transaction and Dialog parameters

Transaction:
Via - Must contain a branch parameter to identify the transaction created by that request. The branch ID must always begin with the characters “z9hG4bK” as a magic cookie.
Branch parameter “branch=z9hG4bK776asdhds” to identify the transaction


Dialog:
The combination of the “To tag”, “From tag”, and “Call-ID” completely defines a peer-to-peer SIP relationship between Alice and Bob and is referred to as a dialog.

2007年12月19日 星期三

bash, tcsh shell variable experience

Default file permission is 666 (user, group, other can read/write file)
Default directory permission is 777 (user, group, other can none/add, delete/list the files of the directory)

#tcsh .tcshrc file

alias h history 25
alias j jobs -l
alias la ls -a
alias lf ls -FA
alias ll ls -lA
alias su su -m

setenv EDITOR vi
setenv VISUAL ${EDITOR}
setenv EXINIT 'set autoindent'
setenv PAGER more

set path = (~/bin /bin /sbin /usr/local/{,s}bin /usr/{bin,sbin,X11R6/bin,pkg/{,s}bin,games} )

if ($?prompt) then
# An interactive shell -- set some stuff up
set filec
set history = 1000
# set ignoreeof
set mail = (/var/mail/$USER)
set mch = `hostname -s`
set prompt = "${mch:q}: {\!} "
umask 22
endif
alias vi env TERM=xterm vim
setenv CVSROOT :ext:username@IP-Address:/home/cvsroot
setenv CVS_RSH /usr/local/bin/ssh
set prompt="[%{^[[1;32m%}%n%{^[[31m%}@%{^[[33m%}%m%{^[[36m%}(%{^[[34m%}%p%{^[[36m%}):%{^[[35m%}~%C2%{^[[0m%}]"
setenv LD_LIBRARY_PATH /usr/pkg/lib:/usr/lib/compat/aout:/usr/X11R6/lib:/usr/local/lib:/usr/X11R6/lib/aout:/usr/lib/aout:/usr/lib
#setenv ENABLE_STARTUP_LOCALE zh_TW.Big5
#setenv LC_CTYPE en_US.ISO_8859-1
#setenv LANG zh_TW.Big5
# 若要支援中文顯示, 請設定成下面的 LC settings
setenv LANG zh_TW.UTF-8
setenv LC_CTYPE zh_TW.UTF-8
setenv LC_ALL zh_TW.UTF-8
setenv LC_MESSAGES zh_TW.UTF-8
unset autologout

tcshell 的cvs environment variable設定方法
setenv CVSROOT ":ext:username@1.2.3.4:/home/cvsroot"
setenv CVS_RSH "/usr/bin/ssh"

bashrc 的cvs environment variable設定方法
export CVSROOT=:ext:username@1.2.3.4:/home/cvsroot
export CVS_RSH=/usr/bin/ssh

The following are reference from http://www.horde.org/source/using.php
sh, ksh, bash, zsh:
export CVSROOT=:pserver:cvsread@anoncvs.horde.org:/repository

csh, tcsh:
setenv CVSROOT :pserver:cvsread@anoncvs.horde.org:/repository


# 另外要設定環境變數, 一般可以使用 export (設定單個) or source (讀入一個config file)

在/root/.bashrc or /root/.bash_profile檔案中,
加入下列的參數
export PS1='[fish]# '
則shell 的prompt ]就會變成
[fish]#

sh, bash:
set environment variable:
# export Variable_Name=Variable_Value
show all the environment variable values
# set
reload config file
# source /to/path/.bashrc

csh, tcsh:
set environment variable:
# setenv Variable_Name Variable_Value
show all the environment variable values
# setenv

2007年10月9日 星期二

Fast path vs Slow path in linux kernel routing

Fast path vs Slow path in Linux kernel routing

執行順序
先做Fast Path Routing, 如果找不到, 才會做 Slow Path Routing
ip_input.c: ip_rcv_finish: PREROUTING CHAIN traversal 之後的function, 做ip packet receive 後的最後處理
ip_input.c: ip_rcv_finish: function 定義於此
ip_input.c: ip_route_input: 做fast path routing, 作法為利用rcu_dereference 循序去撈出rt_hash_table[hash] 裡面的 chain 為rth (struct rtable), 然後和 source, destination, iif, mark, tos 等作比較, 若符合, 則update lastuse 為jiffies, 另外設定 skb->dst = (struct dst_entry*)rth, 讓之後可以使用
route.c: ip_route_input: function 定義於此
route.c: ip_route_input_slow: 如果fast path routing 找不到之前的routing cache, 我們就做slow path routeing
route.c: ip_route_input_slow: function 定義於此
route.c fib_lookup: 執行fib search
net/ipv4/fib_rules.c: fib_lookup: function 定義於此
net/ipv4/fib_rules.c: fib_rules_lookup: 帶了定義在fib_rules.c 裡面特有的參數, 利用fib4_rules_ops 這個變數
net/core/fib_rules.c: fib_rules_lookup: function 定義於此
net/core/fib_rules.c: fib_rules_lookup: 利用 list_for_each_entry_rcu 去逐步檢查每個
ops->rules_list 的rule 和 fl (struct flowi) 是否符合
net/core/fib_rules.c: ops->action: 執行match rule->action
net/ipv4/fib_rules.c: fib4_rule_action: function 定義於此
net/ipv4/fib_rules.c: fib4_rule_action: 當rule->action 為 FR_ACT_TO_TBL時, 執行 include/net/ip_fib.h: fib_get_table: 如果是non-Local, 則為ip_fib_main_table, 如果是Local, 則為ip_fib_local_table
net/ipv4/fib_rules.c: tbl->tb_lookup




Fast path
* using routing cache
* accomplish by ip_route_input function
compare the data of routing cache (rth->fl, rtable->flow)



Slow path
* using FIB(Forwarding Information Base)
* accomplish by ip_route_input_slow, fib_lookup

2007年9月21日 星期五

share/static library experience sharing

一般gcc compile 預設都是使用share library (libXXX.so.X), 除非compile時, gcc 加上 -static 或是直接將.a (libXXX.a) 和.o (object files)放在一起來link成execution file

如何看static library 的成員API 有哪些
# strings libpcap.a | grep pcap_findalldevs
pcap_findalldevs
pcap_findalldevs
pcap_findalldevs

Show the member symbols/variables/functions of shared library
# nm /usr/local/src/library/libpcap/libpcap-0.9.7/libpcap.so.0.9.7 | grep pcap_findalldevs
000052c0 T pcap_findalldevs

nm can show the shared library (libXXX.so.a.b.c) and static library (libYYY.a)

More verbose command with options
with -l, it will show the symbols/variables/functions appearing place(file name and line number) originally
with -o, it will print out the symbols/variables/functions belong to which library

show the symbols of the static library
# nm -o -l /usr/lib/libeXosip2.a 2> /dev/null | grep eXosip_init
/usr/lib/libeXosip2.a:eXconf.o:00001800 T eXosip_init /usr/local/src/sip/libeXosip2-3.0.3-3/src/eXconf.c:616

show the symbols of the shared library
# nm -o -l /usr/lib/libeXosip2.so.4.2.0 2> /dev/null | grep eXosip_init
/usr/lib/libeXosip2.so.4.2.0:0000c4ce T eXosip_init /usr/local/src/sip/libeXosip2-3.0.3-3/src/eXconf.c:616

If you have ever used to strip the static/shared library, all the symbols (functions/variables) inside the file will be deleted.
# strip /usr/lib/libeXosip2.a
# strip /usr/lib/libeXosip2.so.4.2.0

The type is displayed as a letter;
lowercase means that the symbol is local,
uppercase means that the symbol is global (external).

Typical symbol types include
T (a normal definition in the code section),
D (initialized data section),
B (uninitialized data section),
U (undefined; the symbol is used by the library but not defined by the library),
W (weak; if another library also defines this symbol, that definition overrides this one)



如何看某一個程式使用哪些shared library
# ldd zip
libc.so.6 => /lib/i686/libc.so.6 (0x42000000)
/lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0xb7fee000)


Question: 下面這樣的程式編譯, 不是只要用到 static library 就可以了嗎? 為什麼還要用到 dynamic library?

# cat aaa.c
#include
#include

void main()
{
char errbuf[1024];
pcap_if_t *devices = NULL;
pcap_findalldevs(&devices, errbuf);
printf("ok\n");


# gcc -o aaa -lpcap aaa.c
aaa.c: In function `main':
aaa.c:5: warning: return type of `main' is not `int'
aaa.c:10:2: warning: no newline at end of file
/tmp/cc6CFwvH.o: In function `main':
/tmp/cc6CFwvH.o(.text+0x2f): undefined reference to `pcap_findalldevs' ==> 未定義 pcap_findalldevs, 因為libpcap.so.0 沒有包含這個API
collect2: ld returned 1 exit status

>>> libpcap static/shared library compiling procedures
# ./configure --prefix=/home/userName/usr --exec-prefix=/home/userName/usr --enable-yydebug

( DON'T set this parameter, --enable-optimizer-dbg, cause it will result the "dflag" variable in the optimize.c nondefined. And later if we compile other program will due to linking error...

my examples:
compile NSAT program...
g++ -Wall -O6 -funroll-loops -ansi -fPIC -DLINUX functions.o pidalloc.o nsat.o progress.o AuditSet.o SockSet.o Distributed.o Logging.o mod/binfo.o mod/bo.o mod/ftp.o mod/rpc.o mod/snmp.o mod/www.o mod/xp_icmp_addrmask.o mod/xp_icmp_timestamp.o mod/xp_pcap_iface.o mod/xp_utils.o mod/xp_icmp_echo.o mod/xp_logic_tree.o mod/xp_pkt_exams.o mod/xp_icmp_infr.o mod/xp_udp_probe.o libmix++/net/net.o libmix++/misc/misc.o libmix++/misc/exclude.o -o ../nsat -L/usr/X11R6/lib -L/home/userName/usr/lib -lX11 -lrpcsvc -lpcap
/home/userName/usr/lib/libpcap.so: undefined reference to `dflag'
)


make all
# make install
會編譯出來 libpcap.a static library
# make shared
# make install-shared
會編譯出來 libpcap.so.0.9.7 shared library

要真正編譯之前, 需要先到/usr/local/lib or /usr/lib 下面建立soft link 如下
ln -sf ./libpcap.so.0.9.7 ./libpcap.so

之後再去編譯程式就ok了

Or
{
# tar xvfz libpcap-1.0.0.tar.gz cd libpcap-1.0.0
# ./configure --prefix=/usr
# make shared all
# make install-shared install
# ln -sf /usr/lib/libpcap.so.1.0.0 /usr/lib/libpcap.so
# ln -sf /usr/lib/libpcap.so.1.0.0 /usr/lib/libpcap.so.1
}

[root@localhost src]# cat aaa.c
#include
#include

int main()
{
char errbuf[1024];
pcap_if_t *devices = NULL;
pcap_findalldevs(&devices, errbuf);
printf("ok\n");
return 0;
}
[root@localhost src]# gcc -o aaa -lpcap -L/usr/local/lib aaa.c
# ls aaa -la
-rwxr-x--- 1 root root 11769 Sep 21 17:45 aaa

成功編譯出 aaa 程式

How to use ldconfig to add the /usr/lib to the system permanently?
Use the following command to add the library path
PATH="$PATH:/sbin" ldconfig -n /usr/lib


openssl 編完 make install 之後秀出來的message, 告知我們如何做share library linking
* you link with static (archive) libraries. If you are truly
paranoid about security, you should use static libraries.
* you use the GNU libtool code during linking
(http://www.gnu.org/software/libtool/libtool.html)
* you use pkg-config during linking (this requires that
PKG_CONFIG_PATH includes the path to the OpenSSL shared
library directory), and make use of -R or -rpath.
(http://www.freedesktop.org/software/pkgconfig/)
* you specify the system-wide link path via a command such
as crle(1) on Solaris systems.
* you add the OpenSSL shared library directory to /etc/ld.so.conf
and run ldconfig(8) on Linux systems.

We can show all the searched directories that
# ldconfig -Nv | grep ":" | sed 's/:.*//'


* you define the LD_LIBRARY_PATH, LIBPATH, SHLIB_PATH (HP),
DYLD_LIBRARY_PATH (MacOS X) or PATH (Cygwin and DJGPP)
environment variable and add the OpenSSL shared library
directory to it.

One common tool to check the dynamic dependencies of an executable
or dynamic library is ldd(1) on most UNIX systems.

See any operating system documentation and manpages about shared
libraries for your version of UNIX. The following manpages may be
helpful: ld(1), ld.so(1), ld.so.1(1) [Solaris], dld.sl(1) [HP],
ldd(1), crle(1) [Solaris], pldd(1) [Solaris], ldconfig(8) [Linux],
chatr(1) [HP].
cp libcrypto.pc /tmp/newopenssl/lib/pkgconfig
chmod 644 /tmp/newopenssl/lib/pkgconfig/libcrypto.pc
cp libssl.pc /tmp/newopenssl/lib/pkgconfig
chmod 644 /tmp/newopenssl/lib/pkgconfig/libssl.pc
cp openssl.pc /tmp/newopenssl/lib/pkgconfig
chmod 644 /tmp/newopenssl/lib/pkgconfig/openssl.pc

2007年9月19日 星期三

Find the answer -- Asking "Google"

search specific operating system
http://www.google.com/linux
http://www.google.com/bsd

search specific patents
http://www.google.com/patents

search data within a specific site (url)
site:openmoko.org text
site:openmoko.org accelerometer

search data within a specific site (url) from desired mail-user address
site:openmoko.org text "at fic.com.tw"
site:openmoko.org text "at openmoko.org"
site:openmoko.org "release date" "at fic.com.tw"

search a keyword inside a specified site:
retransmission site:http://www.wireshark.org/docs/wsug_html_chunked/

利用 Google Co-op. 可以量身訂作打造企業自己的search engine

Find the answer of coding/programming
Google C Groups
http://groups.google.com/group/comp.lang.c/topics?lnk=gschg&hl=en&pli=1
And of course Google...
http://www.google.com

2007年9月17日 星期一

如何啟動windows 的休眠設定

1. 在電源裝置中啟動休眠
2. 選擇關機時, 會出現三個選項, 這時按下shift 鍵, 待機會變成休眠, 按下即可休眠