Syslog 서버개발예제 1. New project new.bat 파일을 d:\kraken\examples 에복사하고명령프롬프트에서다음과같이실행 new [artifact id] [package]..or.. mvn archetype:generate -DarchetypeGroupId=org.krakenapps -DarchetypeArtifactId=kraken-template -DarchetypeVersion=1.0.1 -DgroupId=org.krakenapps -DartifactId=syslog-server -Dversion=1.0.0 -Dpackage= org.krakenapps.examples.syslogserver 2. eclipse 에서 File > import
Sources 설명 1. Workspace 모델클래스와세부사항을구현하고있는구현클래스를각각다른패키지로구분한다. 2. Source details org.krakenapps.examples.syslogserver 1) SyslogServerApi: 각 Script 메소드에서호출될메소드에대한인터페이스 2) SyslogServerLog: DB 스키마에매핑될 JPA 엔터티클래스
@Entity: JPA 엔터티를정의한다. 또한 OSGI-INF/kraken-jpa/classes 설정파일 에클래스이름을적어줘야한다. @Table: 테이블이름을지정할수있다. 여기에서는 syslog_server_logs 로한다. @Id, @GeneratedValue: 각 row 가생성될때마다 Id 를자동으로부여한다. @Column: 자동설정되는것외에직접컬럼이름을지정하거나, 컬럼속성을지정 하려고할때사용한다. NULL 허용여부는 nullable 속성으로지정할수있다. org.krakenapps.examples.syslogserver.impl 1) SyslogServerImpl : SyslogServerApi 인터페이스의구현 @Component: syslog-server-api 이름으로 ipojo 컴포넌트를정의한다. metadata.xml 파일에서컴포넌트인스턴스를생성할때동일한이름을쓰게된다. 만약 name 을지정하지않으면클래스이름으로등록된다. @JpaConfig: syslog-server 라는이름으로등록된 JPA Entity Manger Factory 를 사용한다는의미이다. 만약해당이름으로 JPA Entity Manager Factory 가등록되지 않으면이컴포넌트인스턴스는무효화되어동작하지않는다. @Provides: 이컴포넌트가구현하는인터페이스를 OSGi 서비스로등록한다. @Provides(specifications = { Runnable.class }) 와같이쓰면 specifications 에명시된인터페이스만노출한다. @Provides만쓰면해당컴포넌트가구현하는모든인터페이스가 OSGi 서비스로노출된다. @Transactional: 선언적트랜잭션으로, 메소드가시작될때트랜잭션이시작되고,
메소드를빠져나갈때자동으로커밋된다. 만약도중에예외가발생하면롤백된다. 만약이어노테이션없이 EntityManager 를사용한다면쿼리를요청할때예외가발 생한다. 2) SyslogServerScriptFactory: ScriptFactory 인터페이스를구현하고 Script 객체 를생성한다. @ServiceProperty(name = alias, value = syslog-server ) alias 라는이름으로서비스프로퍼티를정의한다. alias 는명령어의접두어로사용 된다. ( 예 : syslog-server.list) 3) SyslogServerScript : Script 인터페이스를구현한다. 각메소드이름은명령어 로사용된다.
@ScriptUsage: 필수적으로사용해야하는어노테이션은아니지만명령어의사용방 법을설명하거나, 매개변수의타입이나개수를강제하려고할때사용한다. @ScriptArgument: Script 와함께입력받을매개변수의명세를적어준다. 만약 arguments 에정의된필수매개변수개수만큼입력되지않으면스크립트가실행되지 않고 description 에기술된사용방법이출력된다. 4) SyslogServerLogHandler: syslog 로들어오는메시지를처리한다. ipojo 컴포넌트로 LogHandler 가생성되고유효화되면서 start() 메소드가호출된 다. 위에서는 SyglogServerRegistry 에 LogHandler 를 EventListener 로등록하고,
만약 SyslogServerRegistry 에 syslog-server 라는이름의서버가있으면, LogHandler 가 Syslog 를수싞할수있도록자기자싞을 SyslogServer 에콜백으로 등록한다. 컴포넌트가무효화될때 stop() 메소드가호출된다. 레지스트리와 Syslog 서버에 등록했던콜백을해제한다. 레지스트리에서 syslog-server 라는이름의서버가등록 / 해제되었다는이벤트가젂달 되었을때 Syslog 수싞에사용되는콜백을등록하거나해제한다.
syslog 를받아파싱하고저장하는메소드이다. handle() 메소드는 Syslog 를 SyslogServerLog 모델에맞게변홖해서 DB 에저장한다. @Validate: 번들이시작되면서해당클래스가 ipojo 의인스턴스로정상적으로등 록되면, Validate 어노테이션이붙어있는메소드가호출된다. @Invalidate: 번들을정지하면 ipojo 에등록되어있던인스턴스가무효화되면서 해당어노테이션이붙어있는메소드가호출된다. 설정파일및빌드 1. OSGI 설정파일 src/main/resources/osgi-inf/kraken-jpa 폴더를만들고 config, classes 파일생성 - classes: Entity Class 추가 org.krakenapps.examples.syslogserver.syslogserverlog
- config: connection 정보등추가 hibernate.connection.driver_class = com.mysql.jdbc.driver hibernate.connection.url = jdbc:mysql://localhost/syslog_server??useunicode=true&chara cterencoding=utf8 hibernate.connection.username = syslog_server hibernate.connection.password = password hibernate.dialect = org.hibernate.dialect.mysqldialect hibernate.current_session_context_class = thread hibernate.cache.provider_class = org.hibernate.cache.nocacheprovider hibernate.show_sql = false hibernate.hbm2ddl.auto = update hibernate.autoreconnect = true hibernate.autoreconnectforpools = true hibernate.is-connection-validation-required = true 2. pom.xml 파일수정 <Import-Package> javassist.util.proxy, org.hibernate.proxy, org.hibernate.exception, org.hibernate, org.hibernate.dialect, javax.persistence,* </Import-Package> <Export-Package> org.krakenapps.examples.syslogserver </Export-Package> <Private-Package> org.krakenapps.examples.syslogserver.impl </Private-Package> 3. metadata.xml 설정 <ipojo xmlns:xsi="http://www.w3.org/2001/xmlschema-instance" xsi:schemalocation="org.apache.felix.ipojo http://felix.apache.org/ipojo/schemas/current/core.xsd" xmlns="org.apache.felix.ipojo"> <instance component="syslog-server-api"/> <instance component="syslog-server-factory"/> <instance component="syslog-server-log-handler"/> </ipojo>
4. Build Ctrl + F11 > Maven Package 빌드가성공하면 target 폴더에 syslog-server-1.0.0.jar 파일이생성된다. 5. 배포하기 1) pom.xml 수정 <distributionmanagement> <repository> <id>local</id> <url>file:///d:/kraken/examples/syslog-server/repo/</url> </repository> </distributionmanagement> pom.xml 설정에서배포파일을저장할폴더를배포 url 로지정한다. Ctrl+F11을누르고 mvn build 를선택하면 Edit Configuration 대화상자가출력된다. 여기에서 Goals에 deploy를입력하고 Run을클릭하면, url로지정된로컬경로하위에 groupid/artifactid 형식으로 org/krakenapps/syslog-server 디렉터리가생성되고배포파일이저장된다.
- 또는명령프롬프트에서다음과같이실행 mvn deploy:deploy-file -Durl=file://d:/kraken/examples/syslog-server/repo -Drepositoryid=test -Dfile=target/syslog-server-1.0.0.jar -DgroupId=org.krakenapps -DartifactId=syslog-server -Dversion=1.0.0 -Dpackaging=jar
Kraken 실행 1. kraken-core 실행 java jar C:\kraken\kraken-core\target\kraken-core-1.7.0-package.jar 2. kraken 에접속 Kraken 이시작되면 putty 를열고 localhost:7004, telnet 으로접속
MySQL DB 및 User 생성 1. mysql 접속 - root 로로그인 mysql uroot p[password] - use [Database name] use mysql; show tables; 2. 새사용자계정추가 - insert into [tablename](field1, field2, field3..) values( value1, value2, value3..);
desc user; insert into user(host, user, password, ssl_cipher, x509_issuer, x509_subject) values('localhost', 'syslog_server', PASSOWRD('password'), '','',''); 3. 새 DB 추가 desc db; insert into db values ('localhost', 'syslog_server', 'syslog_server, 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y'); 4. DB 접근권한등록 flush privileges; 5. 새 DB 생성 create database syslog_server; 6. Mysql 종료 quit 7. 새로생성한 syslog_server(db) 접속 mysql u[userid] p[password]; mysql usyslog_server ppassword
jpa 에 syslog-server 를아직등록해주지않았기때문에어떤 table 도없다
Syslog 서버동작화면 1. Syslog Server 패키지파일생성 - Syslog Server 실행에필요한번들을패키지로설치하기위해, 패키지저장소루트디렉 터리에패키지이름으로된디렉터리를만들고다음과같은 kraken.package 파일생성 [description] Syslog Server [version] 1.0.0 2010-12-24 15:22:00 [maven repository] http://download.krakenapps.org/ file:///d:/kraken/examples/syslog-server/repo/ description: package 파일정보를기술한다. version: 버젂, 변경시각으로구성된다. 버젂이여러개있으면변경시각이최근인버젂 을다운로드한다. maven repository: maven artifact 들을검색할저장소 URL 을쓴다. deploy 로만들어 짂 syslog-server 배포폴더도추가한다. - 패키지디렉토리하위에버젂과일치하는디렉터리를생성하고 kraken.package 파일 생성 [bundle] org.krakenapps.examples.syslogserver 1.0.0 org.krakenapps.syslog 1.3.0 org.krakenapps.filter 1.3.0 org.apache.felix.ipojo [1.2.0, 1.4.0] org.krakenapps.ipojo 1.0.0 org.krakenapps.jpa 1.5.0 com.springsource.com.mysql.jdbc 5.1.6 com.springsource.org.apache.commons.pool 1.4.0 com.springsource.org.apache.commons.codec 1.3.0 com.springsource.org.apache.commons.collections 3.2.1 com.springsource.org.apache.commons.logging 1.1.1 [start] org.krakenapps.examples.syslogserver org.apache.felix.ipojo org.krakenapps.ipojo org.krakenapps.syslog org.krakenapps.filter org.krakenapps.jpa com.springsource.com.mysql.jdbc com.springsource.org.apache.commons.pool com.springsource.org.apache.commons.codec com.springsource.org.apache.commons.collections com.springsource.org.apache.commons.logging [maven]
org.krakenapps syslog-server 1.0.0 org.apache.felix org.apache.felix.ipojo 1.4.0 org.krakenapps kraken-ipojo 1.0.0 org.krakenapps kraken-syslog 1.3.0 org.krakenapps kraken-filter 1.3.0 org.krakenapps kraken-jpa 1.5.0 com.mysql.jdbc com.springsource.com.mysql.jdbc 5.1.6 org.apache.commons com.springsource.org.apache.commons.pool 1.4.0 org.apache.commons com.springsource.org.apache.commons.codec 1.3.0 org.apache.commons com.springsource.org.apache.commons.collections 3.2.1 org.apache.commons com.springsource.org.apache.commons.logging 1.1.1 bundle: 번들버젂요구사항을기술한다. Bundle-SymbolicName과 Bundle-Version으로구성되고, 버젂의범위는 [ ] 으로지정한다. start: 설치후기본적으로시작시킬번들의 SymbolicName을지정한다. maven: maven 저장소에서다운로드할아티팩트의 groupid artifactid version의순서대로기입한다. - 패키지파일경로지정 pkg.addrepository [alias] [url] pkg.addrepository tutorial file:///d:/repo/ 2. syslog-server 패키지인스톨 pkg.install syslog-server
- 번들설치및상태확인 bundle.list - JPA 에 syslog-server 등록 jpa.register [bundleid] [Entity Manager Factory Name] jpa.register 1 syslog-server - 등록된 syslog-server 스크립트사용 syslog-server.list
3. Syslog 서버등록 syslog.load syslog receiver name: syslog-server bind address (default to localhost): bind port (default to 514): charset (default to utf-8): - receiver 가등록되었는지확인 syslog.list 4. Syslog 수싞및저장테스트 - syslog 를젂송한다. syslog.send localhost 514 message syslog.send localhost 514 <PRI>message syslog.send localhost 514 <133>hello syslog server test - syslog 로보낸메시지가 syslog-server DB 에저장된다.