[Shell Script] 인라인 파이썬코드로 ini 파일 파싱

Shell Script에서 python 을 이용하여 ini 파일 파싱


의도

쉘 스크립트를 이용해 /etc/systemd/system/서비스명 파일을 분석하려고 하니 스크립트에서 ini 형태의 파일을 분석하는게 조금 노가다성이라 pythonConfigParser 를 이용하면 좋겠다라는 생각이 들어 사용하였습니다.

[/etc/systemd/system/web-monitor.service] 샘플

[Unit]
Description=CHIeru Webmonitoring system.

[Service]
ExecStart=/usr/bin/node $INSTALL_PATH/server/server.js
Restart=always
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=web-monitor
User=root
Environment=\"NODE_CONFIG_DIR=$INSTALL_PATH/config\"

[Install]
WantedBy=multi-user.target

위의 부분에서 제가 필요한 부분은 Service 섹션의 ExecStart 값중 INSTALL_PATH 경로를 가져오는 것입니다.

[Shell Script code]

pathFromService=$(python - <<EOF
import ConfigParser
import os
Config = ConfigParser.ConfigParser()
Config.read('/etc/systemd/system/web-monitor.service')
executeCommand = Config.get('Service', 'ExecStart')
executeFilePath = executeCommand.split(' ')[1]

installationPath = os.path.abspath(os.path.dirname(executeFilePath) +'/../')

print installationPath
EOF
)
    LEN=$(echo ${#pathFromService})
    echo $pathFromService

[Shell Script] JSON parsing using Nodejs

Shell Script에서 Nodejs를 이용하여 JSON 값 가져오기


의도

쉘 스크립트를 이용해 프로그램 설치시 방화벽에 자동으로 포트를 추가하려고 하니 설정 정보는 JSON 파일로 되어 있어 쉘 스크립트만으로 파싱하기는 어려움이 있습니다.

다행히 프로그램이 nodejs 기반으로 돌아가는 어플리케이션이라 쉘 스크립트에서 nodejs 를 이용하여 파싱하고 값을 가져오는 처리를 하였습니다.

※ 다른 방법도 많이 있습니다. awkpython 을 이용하여 값을 가져오는 방법도 있으니 구글링해보시길 바랍니다.

입력, 실행 파일


[JSON file]

// default.json
{
    "http": {
        "port": 9080
    },
    "websocket": {
        "port": 9070
    },
    "peerjs": {
        "path": "/peerjs",
        "port": 9000,
    }
}

[Shell script file]

// test.sh

# http 포트 정보 가져오기 
HTTP_PORT=$(node -pe 'JSON.parse(process.argv[1]).http.port' "$(cat default.json)")

# peerjs 포트 정보 가져오기
PEERJS_PORT=$(node -pe 'JSON.parse(process.argv[1]).peerjs.port' "$(cat default.json)")

# websocket 포트 정보 가져오기
WEBSOCKET_PORT=$(node -pe 'JSON.parse(process.argv[1]).websocket.port' "$(cat default.json)")

echo "HTTP port is $HTTP_PORT"
echo "PEERJS port is $PEERJS_PORT"
echo "WEBSOCKET port is $WEBSOCKET_PORT"

# Output
# HTTP port is 9080
# PEERJS port is 9000
# WEBSOCKET port is 9070

실행


// 스크립트에 실행 권한을 추가 
> chmod u+x test.sh

// 스크립트 실행
> ./test.sh

[Script] bash root 권한 확인

Bash 스크립트 작성시 ROOT 여부 확인

아래와 같이 코드를 도입부에 추가하면 루트 권한이 있는 경우에만 실행 되도록 할 수 있습니다.

#!/bin/bash
ROOT_UID=0
E_NOTROOT=67

if [ "$UID" -ne "$ROOT_UID" ]
then
echo "Script have to execute on ROOT mode"
exit $E_NOTROOT
fi

Euckr to UTF-8

폴더 Euckr to UTF-8


문제점

자바를 처음 시작하면서 이클립스의 기본 인코딩인 Euckr를 이용하여 코딩을 하다 Linux 또는 OSX로 IDE를 변경하게 되면
UTF-8이 기본 인코딩으로 되어 한글이 깨지는 문제가 발생됨.

해결

아래의 스크립트를 이용하여 폴더(하위 폴더 포함)에 포함된 모든 자바 파일의 인코딩을 Euckr 에서 UTF-8로 변경

#!/bin/sh
# Author: 	coozplz@gmail.com
# Date	:	2015.03. 25
# Desc	: 	Convert 'Euckr encoded Java file' to 'UTF-8 encoded Java file' in specific directory.

if [ -z "$1" ]; then
	echo "[ERROR] No argument supplied, need directory path "
	exit 1
fi

echo "Convert euckr to utf8"
echo "target dir $1"

for fName in $(find $1 -name *.java -type f -print); do
	iconv -c -f euc-kr -t utf-8 $fName > $fName.tmp && mv $fName.tmp $fName
done

[awk] log4j를 로그를 이용한 실행시간 분석

Log4j 로그를 이용한 실행 시간 분석 예제

log4j 를 이용한 출력 결과에서 입력된 시간 이상의 로그를 추출하는 awk 스크립트.
(연습하는 중이라 내용에 불필요한 데이터가 많습니다..또한 더 쉬운 방법도 있을 겁니다.)

coozplz@localhost:~/tutorial/awk$ cat catalina.out

[Sample.log]

[INFO ] [2014-03-24 10:01:59] [Processor:534] connectionAlerting – 양재남[0991, 0424] // Alerting END takes 127ms, callID=294352, callingNum=0424, calledNum=0704]
[INFO ] [2014-03-24 10:01:59] [Processor:306] connectionEstablished – 문창운[0990, 0313] // Established END takes 94ms, callID=0, callingNum=0313, calledNum=0286]

[getExecutionTime.awk]

#
# getExecutionTime.awk
# 설명: 로그 파일에서 실행 시간만을 추출한다.
#
BEGIN {
   print “”;
   print “==================================================================”;
   print “사용법: awk -f getExecutionTime.awk iTime=[실행시간] [파일명]     “;
   print “실행시간 입력이 없는 경우 1000 ms 를 기본값                        “;
   print “==================================================================”;
   print “”;
}
{
   timeStr = $14;     # output= 127ms,  
   time = substr(timeStr, 0, length(timeStr) -length(“ms,”)+1);   # time=127
   time = time+0.1; #문자열을 숫자로 캐스팅한다.
   if(length(iTime) == 0) {
       iTime = 1000;
   }
   if( time > iTime ) {
       print $0;
   }
}

[사용방법]

사용법: awk -f getExecutionTime.awk iTime=[실행시간] [파일명]     
실행시간 입력이 없는 경우 1000 ms 를 기본값                        
coozplz@localhost:~/tutorial/awk$ awk -f getExecutionTime.awk iTime=100 catalina.out