[완료] 자바에서 아파치 conf 파일을 파싱해서 쓰고 싶은데 방법이 없을까요?

viper9의 이미지

JSP에서 아파치의 conf 파일을 파싱해서 쓰고 싶습니다.

환경은 리눅스서버에 Tomcat 6, JSP입니다.

파싱하고 싶은 파일은 대략 다음과 같은 내용을 가지고 있습니다.

...중략...
 
<VirtualHost *:80>
        ServerAdmin <a href="mailto:info@foo.com" rel="nofollow">info@foo.com</a>
        ServerName ww.foo.com
        ServerAlias foo.com
        ServerAlias mydomain.foo.com
        DocumentRoot /home/foo_directory/public_html
        <Directory "/home/foo_directory/public_html">
                RewriteEngine On
                AllowOverride All
                Allow from all
        </Directory>
</VirtualHost>
 
<VirtualHost *:80>
        ServerAdmin <a href="mailto:info@foo.com" rel="nofollow">info@foo.com</a>
        ServerName ww.foo2.com
        ServerAlias foo2.com
        ServerAlias mydomain2.foo2.com
        DocumentRoot /home/foo2_directory/public_html
        <Directory "/home/foo2_directory/public_html">
                RewriteEngine On
                AllowOverride All
                Allow from all
        </Directory>
</VirtualHost>
....중략....

대략 이런 내용입니다.

여기서 각 VirtualHost마다 ServerName, ServerAlias, DocumentRoot 정보를 뽑아서 JSP에서 출력하려고 합니다.

JSP에서 위 파일을 열어서 스트링에다가 저장하는 것까지는 했는데 어떻게 저 정보를 뽑아야할지 몰라서 질문드려봅니다. 정규표현식으로 하면 될것 같은데 아무리 해봐도 정규표현식으로는 잘 안되네요.

비슷한 질문을 검색해보니 http://kldp.org/node/41728 이런 글이 잡히긴하는데 이 파일은 윈도우의 ini 파일과 형식이 달라서 안될 것 같구요.. 혹시 이런 형식의 파일을 파싱해주는 자바 라이브러리가 있다면 알려주시면 감사합니다.

혹시나 답변 달아주실 분들께 미리 감사드립니다. (__)

snowall의 이미지

xml형식으로 보이는데 xml파서를 써서 일단 읽어온 후, 거기서부터 접근하면 되지 않을까요?

전용 라이브러리가 있으면 좋겠지만요

피할 수 있을때 즐겨라! http://melotopia.net/b

viper9의 이미지

XML처럼 완벽하게 노드가 나뉘어져있지 않아서 고민했었습니다.

찾아보니 전용 라이브러리도 어느 정도 있긴 있었습니다. 자바와 파이썬, 펄로 나와있더군요.

raymundo의 이미지

라이브러리 같은 건 모르겠는데 저건 정규표현식으로 추출하기 아주 무난한 텍스트 같은데요.

제가 자바 정규표현식은 잘 몰라서 일단 Perl로 해 봤는데, 매치되는 부분을 추출하는 것도 자바에서도 지원을 할 테니...
- 일단 VirtualHost ... /VirtualHost 두 태그로 둘러싸인 부분을 추출하고
- 그 내용 안에서 다시 추출하기 원하는 항목이 있는 라인만 찾아 값을 추출하는
형태로 하면 잘 될 것 같은데요.

참고하십사 하고 펄 코드를 올려봅니다

#!/usr/bin/env perl
use strict;
use warnings;
use File::Slurp;
 
 
my $text = read_file('httpd.conf');
 
# 각 가상서버 설정 단락 단위로 루프
while ( $text =~ m!<VirtualHost.+?>(.+?)</VirtualHost>!sg) {
 
    # $inner_text 에는 <VirtualHost>와 </VirtualHost> 사이의 텍스트가 들어감
    my $inner_text = $1;
 
    # 항목에 따라서 값이 두개 이상 있을 수 있으므로,
    # 각 항목별로 다시 배열로 만들기로 함
    # %hash = (
    #           'ServerName'   => [ 'aaa', 'bbb', ... ],
    #           'ServerAlias'  => [ 'AAA', 'BBB', ... ],
    #           'DocumentRoot' => [ '/aaa', '/bbb', ... ],
    #         )
 
    my %hash = ();
 
    while ( $inner_text =~ m!^\s*(ServerName|ServerAlias|DocumentRoot)\s+(\S+)\s*$!mg ) {
        # $1에는 세 가지 항목 이름 중 하나가,
        # $2에는 그 항목의 값이 세팅되어 있음
        push @{$hash{$1}}, $2;
    }
 
    # 출력
    foreach my $key ( qw/ServerName ServerAlias DocumentRoot/ ) {
        print "$key :\n";
        foreach my $value ( @{$hash{$key}} ) {
            print "  $value\n";
        }
    }
 
    print "\n\n";
}

출력:

$ ./parser.pl
ServerName :
  ww.foo.com
ServerAlias :
  foo.com
  mydomain.foo.com
DocumentRoot :
  /home/foo_directory/public_html
 
 
ServerName :
  ww.foo2.com
ServerAlias :
  foo2.com
  mydomain2.foo2.com
DocumentRoot :
  /home/foo2_directory/public_html

좋은 하루 되세요!

raymundo의 이미지

이왕 해 본 김에 자바로도 해봤습니다. 펄 코드와 흐름은 완전히 똑같고, 자바 정규식은 익숙치 않아서 효율적인지는 잘 모르겠습니다만.

출력도 동일하게 나오고요.

import java.util.*;
import java.io.*;
import java.util.regex.*;
 
public class Parser {
    public static void main(String args[]) {
        String keys[] = { "ServerName", "ServerAlias", "DocumentRoot" };
 
        // 파일 텍스트 전체를 whole_text 에 담기
        // 한줄씩 읽어서 붙여나갔는데, 한번에 읽는 편한 방법이 뭔지... ^^?
        String whole_text = "";
 
        try {
            BufferedReader in = new BufferedReader(new FileReader("httpd.conf"));
            String s;
 
            while ( (s = in.readLine()) != null ) {
                whole_text += s + "\n";
            }
            in.close();
        }
        catch (IOException e) {
            System.err.println(e);
            System.exit(1);
        }
 
 
        // 각 가상서버 설정 단락 별로 추출할 패턴과 매처
        Pattern p_host = Pattern.compile("<VirtualHost.+?>(.+?)</VirtualHost>", Pattern.DOTALL );
        Matcher m_host = p_host.matcher(whole_text);
 
        // 단락 단위로 루프
        while ( m_host.find() ) {
            String inner_text = m_host.group(1);
 
            // 항목과 값들을 담을 해시맵
            HashMap<String, ArrayList<String>> hash =
                new HashMap<String, ArrayList<String>>();
 
            for ( String key : keys ) {
                hash.put(key, new ArrayList<String>());
            }
 
            // 각 항목과 값을 추출할 패턴과 매처
            Pattern p_info = Pattern.compile("^\\s*(ServerName|ServerAlias|DocumentRoot)\\s+(\\S+)\\s*$",
                                             Pattern.MULTILINE );
            Matcher m_info = p_info.matcher(inner_text);
 
            // 추출하여 해시맵에 저장
            while ( m_info.find() ) {
                hash.get(m_info.group(1)).add(m_info.group(2));
            }
 
            // 출력
            for ( String key : keys ) {
                System.out.println(key + ":");
                for ( String val : hash.get(key) ) {
                    System.out.println("  " + val);
                }
            }
 
            System.out.println("\n");
        }
    }
}

좋은 하루 되세요!

viper9의 이미지

적어주신 코드를 JSP에 적용하고 출력 부분만 약간 수정했더니 제가 원하는대로 딱 맞게 나오네요. :-)

펄에는 문외한인지라 여기저기 찾아보고 한참 뒤졌었는데 자바 코드까지 작성해주실줄은 몰랐네요. 거기에 주석까지 친절히 달아주셨네요.

여튼 문제는 잘 해결되었고 이 코드로 공부 많이 해야겠다는 생각이 드네요.

다시 한번 정말 감사드립니다. ^^

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.