CVS Commit 로그를 남겨보자

-. 요구사항 파악 및 설계

적용 패키지 작성을 위해 수정된 파일 목록을 추출 할 방법을 찾아 보기로 했다.
업무 때문에 소스 관리를 CVS 로 하고 있다. CVS의 단점은 개별 파일이력은 확인 할 수 있는데, 
수정된 파일 목록을 뽑기가 쉽지 않다는 것이다.

구글링을 해보니 CVS에서 Commit 시점에 뭔가 처리할 수 있다는 것을 알았다.

먼저, CVS 서버에 접속해서 저장소의 CVSROOT 디렉토리를 보자

-rwxrwxr-- 1 cvs cvs       544  4월 22 09:23 checkoutlist

-rwxrwxr-- 1 cvs cvs       694  3월 21  2009 checkoutlist,v

-rwxrwxr-- 1 cvs cvs       882  4월 26 16:03 commitinfo

-rwxrwxr-- 1 cvs cvs       959  3월 21  2009 commitinfo,v

-rwxrwxr-- 1 cvs cvs       993  3월 21  2009 config

-rwxrwxr-- 1 cvs cvs      1192  3월 21  2009 config,v

-rwxrwxr-- 1 cvs cvs       602  2월  8 16:32 cvswrappers

-rwxrwxr-- 1 cvs cvs       801  3월 21  2009 cvswrappers,v

-rwxrwxr-- 1 cvs cvs      1025  3월 21  2009 editinfo

-rwxrwxr-- 1 cvs cvs      1224  3월 21  2009 editinfo,v

-rwxrwxr-- 1 cvs cvs 292081967  4월 29 18:14 history

-rwxrwxr-- 1 cvs cvs      1245  4월 21 11:32 loginfo

-rwxrwxr-- 1 cvs cvs      1367  3월 21  2009 loginfo,v

-rwxrwxr-- 1 cvs cvs      1151  3월 21  2009 modules

-rwxrwxr-- 1 cvs cvs      1350  3월 21  2009 modules,v

-rwxrwxr-- 1 cvs cvs       564  3월 21  2009 notify

-rwxrwxr-- 1 cvs cvs       763  3월 21  2009 notify,v

-rwxrwxr-- 1 cvs cvs       640  4월 25 12:43 passwd

-rwxrwxr-- 1 cvs cvs       649  3월 21  2009 rcsinfo

-rwxrwxr-- 1 cvs cvs       848  3월 21  2009 rcsinfo,v

-rwxrwxr-- 1 cvs cvs       879  3월 21  2009 taginfo

-rwxrwxr-- 1 cvs cvs      1078  3월 21  2009 taginfo,v

-rwxrwxrw- 1 cvs cvs       187 11월 10 17:15 val-tags

-rwxrwxr-- 1 cvs cvs      1026  3월 21  2009 verifymsg

-rwxrwxr-- 1 cvs cvs      1225  3월 21  2009 verifymsg,v


위와 같은 파일들을 볼 수 있는데.. 
여기서 commitinfo 란 파일이 CVS에서 Commit 하기 바로전에 실행되는 파일이다.

방향은 정해졌다. 
작업 구성은 아래와 같은 순서로 하기로 했다.

     1. CVS가 Commit 되는 시점에 파일명을 DB에 저장한다.
         -> CVSROOT/commitinfo에 등록할 쉘 스크립트를 작성.
     2.  저장된 DB를 조회할 간단한 WEB Page 제작
         -> 평소 관심을 갖고 있던, jQuery를 이용.

[ 1. CVS가 Commit 되는 시점에 파일명을 DB에 저장한다 ]

commitinfo 파일에 아래와 같이 내용을 추가 한다.

$ vi CVSROOT/commitinfo 

ALL /home/cvs/myproject/CVSROOT/cvscommitlog.sh 


DB에 테이블을 생성 한다.

CREATE TABLE CVS_COMMIT
(
   SEQ              NUMBER(10) NOT NULL,
   USERID           VARCHAR2(20) NOT NULL,
   REG_DATE         DATE DEFAULT SYSDATE,
   PROJECT          VARCHAR2(50) NOT NULL,
   FILENAME         VARCHAR2(500) NOT NULL
);

* index는 REG_DATE, TO_CHAR(reg_date, 'YYYY/MM/DDHH24:MI'), USERID, PROJECT 를 걸었다.

commitinfo 파일이 실행할 쉘스크립트를 작성한다.

#!/bin/sh
export ORACLE_BASE=/oracle
export ORACLE_HOME=$ORACLE_BASE/product/10.2.0/db_1
export ORACLE_SID=ORACLE_SID
export PATH=$PATH:$ORACLE_HOME/bin
export ORACLE_OWNER=oracle
export LANG=c
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$ORACLE_HOME/lib;

DATE=`date "+%Y-%m-%d %H:%M:%S"`
DT=`date "+%Y%m%d"`
LOG_FILE="/home/cvs/cvs_log/commit.$DT.log"
DIR=$1
USER=$USER
PROJECT=`echo $DIR | cut -d/ -f4`
#(echo ""; id;) >> $LOG_FILE
shift
for file in $*
do
    echo "$PROJECT, $USER, $DATE, $DIR/$file" >> $LOG_FILE
        result=`$ORACLE_HOME/bin/sqlplus oracle_user/oracle_pwd@oracledb <<EOF 
        INSERT INTO CVS_COMMIT 
        VALUES ( (SELECT NVL(MAX(SEQ), 0) +1 FROM CVS_COMMIT), 
                       '$USER', TO_DATE('$DATE', 'YYYY-MM-DD hh24:mi:ss'), 
                       '$PROJECT', '$DIR/$file');
        COMMIT;
        EOF
        `
done



[ 2.  저장된 DB를 조회할 간단한 WEB Page 제작 ]
jsp 파일 하나와 html파일 하나로 이루어졌고, jQuery와 JSON을 이용 했다.
DATE Picker는 jQuery Plugin 중에 하나를 이용했다.

html 내용 보기


jsp 내용 보기



로그파일에서 문자열 검색 쉘스크립트


*.20070315*
같은 형식의 로그 파일들이 많이 있다고 하면,
어제 로그들 중에서 특정 문자열을 검색해 갯수를 카운트 하는
스크립트 입니다.

#!/bin/ksh
 
TZ=KST+15
sDATE="`date +%Y%m%d`"
 
if [ "$1" = "" ]; then
    echo " ";
    echo "   View Counter";
    echo " ";
    echo "   usage> vc.sh [PageString]";
    echo " ";
else
        grep $1 *.${sDATE}* | wc -l
fi

간단히 설명하자면

1. 타임존 설정에서 울나라가 -9니까   +24 해서 +15로 설정하여 어제 날짜를 계산합니다.
2. 날짜 문자열 구합니다.
3. 파라미터 검사해서 검색할 문자열이 없으면 에러
4. grep으로 문자열 찾고, wc -l로 line을 count 합니다.

이상입니다.

부팅시 자동 실행 하기

부팅시 자동 실행 하기




테스트 장비 : HP-UX B.11.11 U 9000/800 (tm)

root 권한으로

1. 실행할 데몬 이나 스크립트를 만든다.

/sbin/init.d 디렉토리 밑에
실행할 데몬이나 스크립트를 넣어둔다.
스크립트인 경우 내용은 아래와 같다.

case "$1" in
start_msg)
        export dname; ewritemsg -M vras.mesg:2409 "VVR - Starting $dname daemon"
        ;;
'start')
        # start 할때 실행할 것
        su - tesuser -c /disk4/home/tesuser/test.sh
    ;;
'stop')
        # kill 할때 실행할 것
    ;;
*)
        export progname; ewritemsg -M vras.mesg:2408 \
                "Usage: $progname { start | stop }"
    exit 1
    ;;
esac
 
exit 0

쉘의 경우 이때 실행 owner는 root이다.
이 경우 환경 변수를 제대로 읽지 못할 수 있다.

실행할때 특정 권한으로 실행하므로 문제를 해결 할 수 있다.
su - 사용자계정 -c 실행명령
su - oracle -c /user/oracle/app/product805/bin/dbstart

아니면 쉘 안에 환경 변수를 지정해 줄 수 도 있다.
export 적용할 환경변수
export TEST_HOME=/disk4/home/test/temp
export CONFIG_HOME=/disk4/home/test/config
export LOGHOME=/disk4/home/test/log




2. 링크 파일을 생성한다.

/sbin/rc2.d 디렉트로 밑에
위에서 만든 실행할 파일의 링크를 만들어 넣어둔다.
ln -s /sbin/init.d/test.sh S999test

링크 파일명은 [S + 고유ID + 이름] 으로 한다.
S는 Start를 의미 K는 Kill을 의미 한다.