かぴぶろぐ

またかぴったかと思った・・・(´A`;)

awstatsの情報をZopeで取得

カテゴリ[ Zope ]
アクセス解析のawstatsの情報をZopeで取得できないかと探していたら
Pythonでアクセス状況をグラフ化...できなかった

こちらの情報を見つけた。
そこで、この人が作ったPythonコードを元にZopeプロダクトにしてみた。

ファイル構成ZAWSTATS (dir)
    |_ __init__.py
    |_ app.py
    |_ icon (dir)
    |  |_ app.gif
    |_ refresh.txt (空ファイル)

__init__.py
# -*- coding: utf8 -*-

from Globals import ImageFile
import Globals
from Products.ZAWSTATS import app
from App.Common import package_home
import os


def initialize(context):
    context.registerClass(
        app.ZAWSTATS,
        permission="Add ZAWSTATS Object",
        constructors=(
            app.manage_addZAWSTATS,
        )
    )

misc_ = {
        'app_icon.gif': ImageFile('icon/app.gif', globals()),
        }

app.py
# -*- coding: utf8 -*-

import AccessControl
import Globals, OFS
from Globals import HTMLFile
from App.Common import package_home
import os
import socket
import re
import string
import urllib2


def manage_addZAWSTATS(self, REQUEST=None):
    """ ZAWSTATS ZMI Add Method """

    obj = ZAWSTATS('ZAWSTATS')
    self._setObject('ZAWSTATS', obj)
    obj = getattr(self, 'ZAWSTATS')
    obj.instance_root = obj.absolute_url()

    return self.manage_main(self, REQUEST)


class ZAWSTATS(OFS.Folder.Folder):

    """ ZAWSTATS Main Class """

    meta_type = "ZAWSTATS HP"
    icon = "misc_/ZAWSTATS/app_icon.gif"
    security = AccessControl.ClassSecurityInfo()
    security.setPermissionDefault('Manage ZAWSTATS', ['Manager'])


    def __init__(self, id):

        self.id = id
        self.flags = re.I | re.M | re.S
        self.pat_daysofmonth = re.compile('<a name="daysofmonth">&nbsp;</a><br />(.*?)<br />.<table>', self.flags)
        self.pat_table = re.compile('<center>.(.*?)end_of_html', self.flags)
        self.url = 'http://[awstats.url]/awstats.pl?config=[my.domain]&framename=mainright'


    def get_awstats_html(self):
        """ get_awstats_html """
        body = self.get_site(self.url)
        return body


    def get_site(self, url):
        """ get_site """
        socket.setdefaulttimeout(120)
        request = urllib2.Request(url)
        request.add_header("User-Agent","AWStats Scanner 1.0")
        opener = urllib2.build_opener()
        body = opener.open(request).read()
        return body


    def get_first_match(self, pat, body):
        """ get_first_match """
        m = re.search(pat,body,self.flags)
        if m and m.groups():
            return m.groups()[0]
        else:
            return ""
index_html後はZope上でプロダクトを作成して、その下にindex_htmlでMethodを呼び出すだけ。

<dtml-var standard_html_header>
<h2><dtml-var title_or_id> <dtml-var document_title></h2>
<p>
<dtml-var get_awstats_html>
</p>
<dtml-var standard_html_footer>
まあ、この形じゃプロダクト作った時点でClassが生成されるので最新の情報を取ってこない。
呼ぶ度に情報取得Classを呼ぶようにしないと使いもんにならないけど。
ZopeのProduct Classと awstats情報取得Classで分ける予定。
HTML整形ももっと細かく必要かな。

http://kapi.jp/kapi_blog/163

2008年08月20日

関連カテゴリ Zope

この記事のコメント

この記事にコメントする