summaryrefslogtreecommitdiff
blob: c57328714c1a926e5994f3ea1072b555f98491a1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
# Copyright 1999-2007 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
# $Header: $ 

inherit webapp eutils depend.php einput

DESCRIPTION="Web-based PostgreSQL log analyzer used to determine which queries you should optimize to speed up your PostgreSQL based application."
HOMEPAGE="http://pgfouine.projects.postgresql.org/"
SRC_URI="http://pgfoundry.org/frs/download.php/1334/${P}.tar.gz"
LICENSE="GPL-2"
KEYWORDS="~alpha ~amd64 ~hppa ~mips ~ppc ~sparc ~x86"
IUSE="vhosts tests graphs"
RDEPEND=">=dev-db/postgresql-7.3 
        sys-apps/findutils"

pkg_setup() {
	ewarn "Checking if PHP has been installed as a CLI"
	ewarn "If the following fails, PHP needs to be compiled with the CLI use flag"
	require_php_cli
	webapp_pkg_setup
	has_php
	if use graphs;then
		require_php_with_any_use "gd" "gd-external"
	fi
}

src_unpack() {
	unpack ${A}
	cd ${S}
	find ${S} -name rpm-specific\* -or \( -type d -name patches -prune \) -or \
	\( -type f -name pgfouine.spec \) -exec rm -rf {} \;
	if ! use tests;then
	find ${S} -type d -name tests -prune -exec rm -rf {} \;
	fi
}

src_compile() {
		einfo "Nothing left to compile"
}

src_install() {
	webapp_src_preinst
	local docs="AUTHORS ChangeLog README COPYING THANKS INSTALL"
	cd ${S}
	dodoc ${docs}
		
	rm -rf ${docs}

	einfo "Installing main files into ${MY_MYHOSTROOTDIR}/${P}"
	cp -rf . ${D}${MY_HOSTROOTDIR}/${P}
	cp -f ${FILESDIR}/spgfouine ${D}${MY_HOSTROOTDIR}/${P}
	insinto ${MY_MYHOSTROOTDIR}/${P}
	webapp_src_install
}

pkg_postinst() {
	webapp_pkg_postinst
	einfo
	einfo
	einfo "Because of the irregularity of postgresql.conf files"
	einfo "you will need to add/update the following variables to"
	einfo "your own postgresql.conf manually to enable logging:"
	einfo "log_duration = true"
	einfo "log_min_duration_statement = 0" 
	if has_version '>=dev-db/postgresql-8';then
	einfo "log_destination = 'syslog'"
	pg8=1
	else
	einfo "syslog = 2"
	pg8=0
	fi
	einfo "pgfouine brings many new features, including vacuum support."
	einfo "Please see http://pgfouine.projects.postgresql.org/vacuum.html for more information."
	ewarn ""
	ewarn "IMPORTANT: run emerge --config pgfouine"
	ewarn ""
}

pkg_config() {
	G_HOSTNAME="localhost"
	webapp_read_config
	szInstallPath=${ROOT}${VHOST_ROOT}/${PN}
	has_php
	szVerPath=${ROOT}${VHOST_ROOT}/${P}
	szSysLogDir="/var/log/postgresql"
	if has_version ">=app-admin/syslog-ng-1.0";then
	einfo "The following config will help you setup:"
	einfo
	einfo "a) syslog-ng.conf rules for PostgreSQL logging"
	einfo "b) cron to generate reports on a regular basis"
	einfo
	einput_confirm "Continue with setting up /etc/syslog-ng/syslog-ng.conf rules for PostgreSQL?"
	if [ "${EINPUT_IANSWER}" == "y" ] || [ "${EINPUT_IANSWER}" == "yes" ];then
	einfo
	einfo "If you don't know what to do, the defaults denoted inside brackets usually suffice"
	einfo "(just hit enter)"
	einfo
	if [ -w /etc/syslog-ng/syslog-ng.conf ];then
	einput_confirm "Detected a syslog-ng.conf in /etc/syslog-ng/, is this the one you want to use?"
		if [ "${EINPUT_IANSWER}" == "y" ] || [ "${EINPUT_IANSWER}" == "yes" ];then
			szSysLogConf="/etc/syslog-ng/syslog-ng.conf"
		else
			einput_prompt "Please specify the path to your syslog-ng.conf" "/etc/syslog-ng/syslog-ng.conf"
		fi
	fi
	
	if [ ! -w ${szSysLogConf} ];then
	einput_prompt "Cannot use ${szSysLogConf}, please specify the path to a valid syslog-ng.conf" "/etc/syslog-ng/syslog-ng.conf"
		if [ -w $EINPUT_IANSWER ];then
			szSysLogConfpgfouine$2
		else
			eerror "Unable to find a writable syslog-ng.conf in $2. Exiting"
		fi
	fi
	einput_prompt "syslog-ng filter?" "filter f_postgres { program(\"postgres\"); };"
	szSysLogFilter=${EINPUT_IANSWER}
	if [ ! -d /var/log/postgresql ];then
		einput_prompt "Specify where I should attempt to create the PostgreSQL log directory" "/var/log/postgresql"
		szSysLogDir=${EINPUT_IANSWER}
		mkdir -p ${EINPUT_IANSWER}
	fi
	szDefaultDest="destination dest_postgres { file(\"${szSysLogDir}/log-sql.\$YEAR.\$MONTH.\$DAY\"); };"
	einput_prompt "syslog-ng destination?" "${szDefaultDest}"
	szSysLogDest="${EINPUT_ANSWER}"

	if [ "${szSysLogDest}" != "${szDefaultDest}" ]; then
		ewarn "${szSysLogDest}"
		ewarn "Not using default destination rule, be sure to modify the INPUT_SCHEMA in ${szVerPath}/spgfouine"
		ewarn "to reflect your changes!"
		ewarn "${szDefaultDest}"
	fi
	
	einput_prompt "syslog-ng rule?" "log { source(src); filter(f_postgres); destination(dest_postgres); };"
	szSysLogRule=${EINPUT_IANSWER}
	einfo
	einfo "The following will be written to ${szSysLogConf}"
	einfo
	einfo "${szSysLogFilter}"
	einfo "${szSysLogDest}"
	einfo "${szSysLogRule}"
	einfo 
	einput_confirm "Continue with writing these rules to ${szSysLogConf}?"
		if [ "${EINPUT_IANSWER}" == "y" ] || [ "${EINPUT_IANSWER}" == "yes" ];then
			echo "${szSysLogFilter}" >> ${szSysLogConf}
			echo "${szSysLogDest}" >> ${szSysLogConf}
			echo "${szSysLogRule}" >> ${szSysLogConf}
			einfo "Restarting syslog-ng"
			/etc/init.d/syslog-ng restart
		else
			ewarn "Nothing written to ${szSysLogConf}, please add the rules"
			ewarn "manually"
		fi
	fi
	einput_confirm "Continue with setting up a daily cron job for reports?"
	if [ ${EINPUT_IANSWER} == "y" ] || [ ${EINPUT_IANSWER} == "yes" ];then
		einfo
		einfo "Moving spgfouine from ${szVerPath}/spgfouine to /etc/cron.daily"
		einfo
		mv -f ${szVerPath}/spgfouine /etc/cron.daily
		einfo
		einfo "chmod'ing spgfouine to 0755"
		einfo
		chmod 0755 /etc/cron.daily/spgfouine
		sed -i -re "s:PATH_TO_PHP=\"\":PATH_TO_PHP=\"${PHPCLI}\":g" /etc/cron.daily/spgfouine
		sed -i -re "s:PATH_TO_LOGS=\"\":PATH_TO_LOGS=\"${szSysLogDir}\":g" /etc/cron.daily/spgfouine
		sed -i -re "s:PATH_TO_REPORTS=\"\":PATH_TO_REPORTS=\"${szInstallPath}/reports\":g" /etc/cron.daily/spgfouine
		sed -i -re "s:PATH_TO_PGFOUINE=\"\":PATH_TO_PGFOUINE=\"${szVerPath}/pgfouine.php\":g" /etc/cron.daily/spgfouine
		if [ ! -d ${szInstallPath}/reports ];then
			mkdir -p ${szInstallPath}/reports
			einfo "Created ${szInstallPath}/reports"
		fi
		einfo
		einfo "NOTE: By default reports will be put in"
		einfo "${szInstallPath}/pgsql_report.\$YEAR.\$MONTH.\$DAY.html"
		einfo "You can modify this and other paths by editing /etc/cron.daily/spgfouine"
		einfo
	fi
	einfo "Nothing left to do :-)"
	else
		einfo "Syslog-ng is not emerged on this system. You will need to edit ${szVerPath}/spgfouine"
		einfo "manually and setup your syslog rules accordingly. Please refer to"
		einfo "http://pgfouine.projects.postgresql.org/tutorial.html"
		einfo "for more information on how to do this."
		einfo "You can use ${szVerPath}/spgfouine to automate report generation"
	fi
}

pkg_postrm() {
	if [ -e /etc/cron.daily/spgfouine ];then
		ewarn "/etc/cron.daily/spgfouine exists, please remove this file"
		ewarn "manually."
	fi
}