everydayminder

learn something everyday

Archive for December 2013

Sonar + Jenkins 설정

leave a comment »

현재 Jenkins를 통해 CI(Continuouse Integration)를 하고 있고,
코드의 정적 분석을 FindBugs, PMD, CheckStyle을 써서 리포트를 보고 있긴 하지만,
Sonar를 접하고 설치/ 사용해보고자 한다.

Sonar는 http://www.sonarqube.org에서 세부 정보를 확인할 수 있다.
Installation Guide 링크를 따라 가보니, Confluence를 사용하여 위키를 꾸며놨다.

“Get Started in Two Minutes”의 설명에 따르면,
설치하고, 실행하는 방법은 무척이나 단순해 보인다.

1. SonarQube 배포판을 압축풀고, 실행시킨다.
2. SonarQube Runner 배포판을 압축풀고, 실행시킨다.
3. 샘플 프로젝트를 압축풀고, sonar-runner를 실행시켜서 분석시킨다.
4. 결과를 화면에서 확인한다. (http://localhost:9000)

여기까지 사실로부터 유추할 수 있는 사실은,
– SonarQube는 서버 프로그램이다.
– SonarQube는 클라이언트 프로그램이다. (소스 분석을 위해 실행시켜야 함)
– 별도의 웹서버/DB 설정이 필요없다.

정도이다.

Sonar에 대한 소개/분석 자료를 통해 좀더 알아보면,

Sonar가 지원하는 DBMS는

Apache Derby (내장)
mySQL
Oracle
PostgreSQL
MS-SQL Server

등이다.

설치에 앞서 JDK가 1.5+으로 설치되어 있어야 하며,
Runner(소스 분석을 위해 실행시키는 프로그램)로는
– SonarQube Runner
– Maven
– Ant
를 지원한다고 한다.

따라서, 앞서 언급한 Installation guide는 최소한의 설정으로 가장 빨리
한 번 실행시켜보기 위한 설정이라 할 수 있다.

0. 설치/테스트 환경
OS : Windows7 (64)
JDK : JDK1.6
DB : –

1. 설치
압축을 풀고 (c:\dev\sonarqube-4.0, 이하 $SONAR_HOME), $SONAR_HOME\bin\windows-x86-64\bin에
있는 SartSonar.bat를 실행시킨다.

wrapper | --> Wrapper Started as Console
wrapper | Launching a JVM...
jvm 1 | Wrapper (Version 3.2.3) http://wrapper.tanukisoftware.org
jvm 1 | Copyright 1999-2006 Tanuki Software, Inc. All Rights Reserved.
jvm 1 |
jvm 1 | 2013.12.18 11:02:42 INFO Web server is started

와 같은 메시지가 보이면서 시작되었다.
브라우저를 통해, localhost:9000으로 접속해봐도 화면이 휑하다.
Sonar의 기본 관리자 계정 정보는 admin:admin이니 접속해 보자.

2. 환경설정 확인
$SONAR_HOME\conf\sonar.properties 파일을 확인해 보자.
별도 DB 설정을 하지 않았기에, Apache Derby 내장 DBMS를 사용하도록 설정된 채이다.

sonar.jdbc.username=sonar
sonar.jdbc.password=sonar

#—– Embedded database H2
# Note: it does not accept connections from remote hosts, so the
# SonarQube server and the maven plugin must be executed on the same host.

# Comment the following line to deactivate the default embedded database.
sonar.jdbc.url=jdbc:h2:tcp://localhost:9092/sonar

와 같은 문구가 보이고,
그 밑으로는 Sonar가 지원하는 여러 다른 종류의 DBMS의 configuration들이 주석처리 되어 있다.
해당 DBMS를 사용할 경우, 변경하여 사용하면 될 것 같다.

3. 프로젝트 분석은 어떻게?
Sonar는 분석 결과를 보여주는 웹 애플리케이션이고, 결국 분석은 다른 프로그램들이 도와줘야 한다.
http://docs.codehaus.org/display/SONAR/Analyzing+Source+Code
에 안내된 바에 따르면,

프로젝트 분석은 아래의 방법중 하나를 택하면 된다.
Analyzing with SonarQube Runner (recommended analyzer)
Analyzing with SonarQube Ant Task
Analyzing with Maven
Analyzing with Gradle
CI Engines

Sonar에 안내된 2분안에 시작하기 튜토리얼에서도 샘플 프로젝트 디렉토리로부터, SonarQube Runner를
실행시키는 것으로 프로젝트 등록/분석을 시도하였다.

결국, Runner 등과 같은 프로그램이 분석 결과를 DBMS에 기록을 하면, Sonar 웹은 그 데이터를 DB로부터 읽어서
보여줄 뿐일 것이다.

프로젝트 등록을 위한 UI도 존재하지 않는 것 같은데, 공식 도움말에서도 이런 문구를 발견할 수 있다.
Adding a project to SonarQube is not done through the web interface, but automatically when the project is analyzed for the first time.

어쨌든, 프로젝트를 등록하기 위해서는 일단 분석을 한 번 시도하면 된다는 이야기이다.

4. Jenkins + Sonar 설정
나는 Jenkins를 이미 사용하고 있으므로, Jenkins에 Sonar 설정을 하는 방법에 대해 살펴보고자 한다.
Jenkins에 Maven 관련 설정이 되어있다고 가정한다.

Jenkins 관리 > 플러그인관리 > Sonar 관련 플러그인들을 찾아 설치한다. (Jenkins Sonar Plugin, Sonargraph Plugin)
이후, Jenkins를 재시작하고, Jenkins의 global 설정으로부터 Sonar 환경설정을 하자.

Jenkins 관리 > 시스템설정 > Sonar (고급 메뉴) 관련 항목을 지정한다.
Apache Derby 사용 및 기본 설정으로 그대로 사용한다면, 아마 다음과 같이 입력하게 될 것이다.

Server URL : http://localhost:9000
Sonar account login : admin
Sonar acocun password : admin
Database URL : jdbc:h2:tcp://localhost:9092/sonar
Database login : sonar
Database password : sonar

Sonar Runner에 대한 설정은 별도로 수행하지 않았다.
프로젝트 설정의 Post-build Actions로부터 Sonar를 선택하고, jdk 설치 정보만 변경하고 저장하였다.
(다른 설정은 디폴트 사용)

이후, 빌드를 수행하면, 해당프로젝트의 대시보드에도 Sonar 아이콘이 생겨있고, 링크도 클릭가능하다.
해당 링크를 클릭하면, 결국 처음에 설정한 바와 같이 http://localhost:9000으로 리다이렉션 될 것이다.
그리고, 이전에 비어있던 화면에 무언가 정보가 채워져 있는 것을 발견할 수 있다.
당연히, Jenkins를 통하지 않고도, 브라우저에서 직접 http://localhost:9000을 접속하면 동일한 화면을 볼 수 있다.
(DB에 분석 데이터가 있으니까)

볼 수 있는 내용들은 다음과 같다.
Lines of code
Documentation
Duplications
Complexity
Issues
Package tangle index
Unit Tests Coverage

해당 항목들을 클릭하면, 상세 내용을 볼 수 있다.
이슈들을 클릭하면, 어떤 부분이 문제가 되고, 어떻게 해결하면 좋을지도 조언해 주기 때문에
코드의 퀄리티를 높이는데 큰 도움이 될 것 같다.

Jenkins에 이미 SCM 관련 설정을 해두어, 소스코드 변동에 따른 폴링/자동 빌드를 설정해 두었기 때문에
소스 변동시마다 Sonar도 분석을 자동으로 업데이트 하게 되었다.

5. Maven 단독
Maven으로 소스 분석을 하려면, maven 관련 설정을 변경해줘야 한다.
Sonar에 공식적으로 안내된, maven 설정은

<settings>
<profiles>
<profile>
<id>sonar</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<!– Example for MySQL–>
<sonar.jdbc.url>
jdbc:mysql://localhost:3306/sonar?useUnicode=true&amp;characterEncoding=utf8
</sonar.jdbc.url>
<sonar.jdbc.username>sonar</sonar.jdbc.username>
<sonar.jdbc.password>sonar</sonar.jdbc.password>

<!– Optional URL to server. Default value is http://localhost:9000 –>
<sonar.host.url>
http://myserver:9000
</sonar.host.url>
</properties>
</profile>
</profiles>
</settings>

실행은,
mvn clean install -DskipTests=true
mvn sonar:sonar
와 같이 실행하면 된다.

그런데, 위의 설정만으로는 실제 사용시 번거로울 것 같다.

위의 설정에서 언급한 바와 같이, 분석을 어떻게 수행하느냐의 문제에 대해 생각해 보자.
Jenkins에 설정한 경우,
– Who : Jenkins
– How : Maven 또는 Runner
– When : 소스 변경이 되었을 때
로 생각할 수 있는데 비해,

Maven으로 단독 설정할 경우,
– Who : 사용자
– How : Maven
– When : 사용자가 명령어를 실행할 경우
가 되어 버린다. 결국, 소스를 사용자가 직접 최신 버전으로 업데이트 한 후, maven 명령어를 돌려야 의미가 있을 것이다.

즉, 소스 변경과 함께 자동으로 최신 소스를 검사할 수 있도록 설정하지 않고서는 별도의 maven 실행을 통한 소스 검사만으로는
활용도가 낮아진다.

6. 요약
– Jenkins와 같은 CI tool과 연계해서 Sonar 검사를 하도록 하거나
– 열심히 알아서 소스 갱신/ 검사 돌리자.

* SCM Activity라는 플러그인이 있는 것을 확인했으나, 주기적으로 폴링하여 소스를 가져오고 검사하는 용도가 아닌
SCM blame 정보를 출력해주기 위한 용도인 듯하다. (http://docs.codehaus.org/display/SONAR/SCM+Activity+Plugin)

*  소스 정적 검사 및 해결책 제시가 제법 괜찮다. 쓸만 한 것 같다.

Written by everydayminder

December 26, 2013 at 23:01

Posted in java, tools, Uncategorized

아이폰으로 집의 네트워크에 VPN으로 접속하려면?

leave a comment »

나중에 다시 할 수도 있는 재설치를 위해 기록으로 남겨둔다.

예전에 사용하던 IPTIME 공유기를 가지고 있었다면,
일단 우선적으로 공유기에서 제공하는 VPN 기능을 검토했을 것이다. (그랬으면 쉬웠을텐데..다시 살까?)

일단, 현재 집에서 사용하는 공유기는 Netgear 공유기이다.
이 모델에는 VPN 기능이 제공되지 않는다.

따라서, 검색/ 정보 수집을 통해 PPTPD, OpenVPN, OpenSwan 등을 조사했으며,
공유기 내부에서도 잘 동작한다고 알려진 OpenVPN을 설치하기로 하였다.

우선, OpenVPN에 대한 설치파일/세부 정보는 openvpn.net으로부터 확인할 수 있다.
최초 설치 시도는 CentOS VM상에 yum install을 통해 설치/실행하는 것을 진행하였으나,
OpenVPN-AS(Access Server)가 설치가 쉽다는 내용을 접하고, OpenVPN-AS로 급선회하였다.

OpenVPN Server와 달리, AS의 경우 설치 과정이 매우 간단했다.
해당 RPM 설치 후, 모든 설정을 관리자웹 상에서 설정해 주기만 하면 될 뿐만 아니라,
사이트내에 각 기능별 설명들이 기본적으로 표기가 되어 있어서 도움이 되었다.
(OpenVPN 서버의 경우, 기본 값들이 무슨 기능을 하는지 주석이 달려있기는 하지만,
다소 설명이 부족하다는 느낌을 받았다.)

1. 집 네트워크 구성

PC1 -+
         |
PC2 -+—-+ 공유기 +—-+ ISP 공유기 +—-+ 인터넷 +—-+ 아이폰
         |
PC3 -+

예전에 케이블 인터넷을 사용했을 경우, ISP 공유기 대신 케이블 모뎀이 위치했고,
내 공유기 설정에서 포트포워딩을 설정해주는 것만으로 집 내부 PC들에
접근이 가능했으나, 이사 후 ISP 제공 공유기가 앞단에 더 존재하게 되어 ISP 공유기
설정도 함께 변경해 줘야만 내부 접근이 가능하게 되었다. (DMZ로 설정하거나, 다른 룰을 추가하거나)

2. VPN 연결 개요
위의 환경 구성을 바탕으로, VPN을 다음과 같이 환경을 구성하였다.

     +——————————- VPN Tunnel ——————————–+
Linux     –+
(VPNGW)  |
NIC#1(e)  |
NIC#2      |
                |
PC1       –+—-+ 공유기 +—-+ ISP 공유기 +—-+ 인터넷 +—-+ 아이폰
NIC#3      |      NIC#5(e)            NIC#7(e)                                 NIC#9
                |      NIC#6                 NIC#8
PC2       –+
NIC#4

* e : external

집 내부 공유기 내부에서의 PC들간은 별도의 설정이 없어도 공유기에 연결한 것만으로
NIC#6를 통해 NIC#2, NIC#3, NIC#4끼리 통신할 것이다.

내부에서 외부로 접속하고자 한다면, NIC#5를 거쳐 나갈 것이다.

다만, 위의 경우와 같이 2개의 공유기를 거쳐야 한다면, NIC#5로부터 #8, #7을 거쳐 외부로
나갈 것이다.

Linux를 VPNGW로 삼고, 외부에서 이 Linux를 VPNGW로 접속하여 PC1,2로 연결하도록 하는
것이 목표이다.

3. OpenVPN-AS 설치
http://www.openvpn.net에 접속하여, OpenVPN-AS(Access Server)를 다운로드한다.
내 경우는 CentOS용 RPM을 다운로드하였고, 설치하였다.

passwd openvpn
을 실행하여, openvpn 계정의 비밀번호를 변경한다.
그러면, 추후 OpenVPN관리자 계정의 비밀번호로 사용할 수 있게 된다.

설치는 일반 OpenVPN 서버 설치 과정에 비해 OpenVPN-AS 설치 과정이 훨씬 간단했다.
(easy-rsa를 사용한 server, client 인증서 생성 등의 과정을 별도로 할 필요가 없다.)

정상적으로 설치가 되었다면, https://vpngw의 비공인 IP:943으로 접속하면,
OpenVPN-AS의 관리 페이지가 뜬다. 이 때, 인증서를 신뢰할 수 없다고 뜨면 무시하기를
눌러서 진행하자.

1) 서버용관리 – https://주소:943/admin
2) 클라이언트 – https://주소:943

서버용 페이지에 접속하여 살펴보면, 좌측의 큰 메뉴 기준으로 Status/Configuration/
User Management/Authentication/Tools 메뉴가 존재한다.

이 메뉴들 중, 실제로 내용 수정을 한 페이지 기준으로 기록한다.
* Status : 별도 수정 항목 없음
* Configuration
– License : 기본 라이센스 (2명)
– Server Network Settings
– Hostname or IP Address : 내 집에서 달고 나가는 공인 IP (공유기 관리웹에서 확인하거나, 내 IP를 확인해 주는 사이트 등을 통해 확인 가능)
– Interface and IP Address : NIC#2의 주소 기록
– VPN Mode : Layer 3 (routing/NAT)
– VPN Settings
– Dynamic IP Address Network : Network Address 디폴트값 그대로 사용 (ex – 172.27.224.0)
– Routing : using NAT
– Specify private subnet : NIC#2, #3, #4용 (ex – 192.168.1.0/24)
나머지 값들은 기본 값을 그대로 사용해도 된다.

이렇게 서버를 설정하고 나서, 클라이언트의 원활한 설정을 위해 집 내부망에서 아이폰으로
https://주소:943으로 접속해보자.
그러면, 클라이언트를 다운로드할 수 있는 링크가 출력되고, 아이폰의 경우 결국 AppStore에서
OpenVPN 클라이언트를 다운로드할 수 있도록 연결된다.

클라이언트에서 접속한 웹 페이지로부터 하단의 링크를 클릭하면,
직접 profile을 다운로드 할 수 있다. 다운로드한 파일을 OpenVPN 클라이언트에서 열기를
지정해주면, 결국 이 설정 파일은 OpenVPN 클라이언트에 import 되면서, 자동으로
프로파일이 추가된다.

(만약, OpenVPN-AS버전이 아니라 Community Edition으로 직접 수동 설치를 진행했다면,
인증서 파일 및 클라이언트 설정파일을 복사/수정하여 client.ovpn 파일을 만들어 주었어야
했을 것이며, opvn 파일 및 인증서 등을 itunes를 사용하여 동기화 해주거나, 이메일로
직접 전송해서 import시켜야 했을 것이다.)

이후, 아이폰의 네트워크를 3G/LTE 등 외부망으로 선택하고, OpenVPN 클라이언트를 통해
접속시도하면, 성공적으로 VPN 접속이 이뤄지는 것을 확인할 수 있다.

IP를 확인해보면, 터널IP를 새로 받은 것을 확인할 수 있으며, telnet 클라이언트를
이용하여 내부망에 있는 PC로 ping을 날려도 정상적으로 동작하는 것을 확인할 수 있다.

Written by everydayminder

December 24, 2013 at 23:58

Posted in linux, networking

FreeNX 설치 (CentOS 6.x; 64bits)

leave a comment »

VNC보다 성능이 좋다고 이름이 나있는 FreeNX (www.nomachine.com)을 설치하는 방법은 의외로 간단하다.

환경 : 서버측 CentOS6.4 (64bits)
클라이언트측 Windows7 (64bits)

CentOS6.x 기준으로 설치하고, 클라이언트 접속을 테스트해보자.
먼저 yum 명령어로 freenx를 다음과 같이 간편하게 설치할 수 있다.

freenx는 extras repository에 이미 있기 때문에

yum install freenx
yum install nxagent

(내 경우, nxagent를 처음에 설치하지 않았더니,
freenx는 정상적으로 설치하고, 계정까지 생성했지만, 접속이 실패하였고
로그를 보았더니 nxagent를 찾을 수 없다는 에러가 발견되었다.)

이 명령만으로도 freenx의 설치는 일단 완료된다.
freenx의 설정관련 내용은 /etc/nxserver에 설치된다.

server의 환경설정은 node.conf를 수정하는 것만으로 완료되는데,
node.conf를 백업해두고, node.conf.sample의 사본으로 작업하자.

mv node.conf node.conf.bak
cp node.conf.sample node.conf

vi node.conf를 실행하여, nxserver의 환경설정을 다음과 같이 변경/주석 해제한다.

SSHD_PORT=22 (주석 해제)
ENABLE_PASSDB_AUTHENTICATION="1"
ENABLE_SSH_AUTHENTICATION="1"

파일을 저장한다.

nxserver를 실행하면 여러가지 실행 옵션이 있다.
nxserver –status를 실행하여 현재 상태를 확인한다.

NX> 100 NXSERVER – Version 3.2.0-74-SVN OS (GPL, using backend: not detected)
NX> 110 NX Server is running
NX> 999 Bye

현재 설치된 버전의 3.2.0-74이고, 동작중이라는 것을 알 수 있다.

nxsever --stop

을 실행하면, freenx가 종료된다.

이제 사용자를 추가한다.

nxserver --adduser luran

freenx 접속을 위해 luran이라는 계정이 생성될 것이다.

nxserver --passwd luran

luran이라는 계정의 패스워드를 물어올 것이다.

여기까지 실행하면,
/home/luran/.ssh 디렉토리에 ssh 접속을 위한 키가 생성되었을 것이고,
/etc/nxserver에도 해당 ID용 공개키가 client.id_dsa.key 로 생성되었을 것이다.

이제 client.id_dsa.key파일 또는 파일의 내용을 실제 접속할 클라이언트에서 쓸 수 있도록 복사하자.
만약, SSH 기본 포트 이외의 다른 포트로 변경했다면 방화벽 룰도 변경해줘야 한다.

nxserver --start

를 실행하여 띄운다.

클라이언트에서 설정할 내용은 간단하다.
Windows의 경우, 3.5 버전의 NXClient를 구해서 설치한 후,

Host와 Port 정보를 기입하고, Key 버튼을 클릭하여 앞서 별도로 저장한 key 파일을 지정한다.
Desktop은 Unix/GNOME으로 하고, 접속속도는 원하는대로 설정한다.

앞서 생성한 계정정보를 입력하는 것으로, 설정을 모두 마쳤다.
이제 접속하여 창이 뜨는지 확인하자.

Written by everydayminder

December 4, 2013 at 13:06

Posted in linux, Uncategorized

Tagged with ,