##############################################################################
# $HeadURL$
# $Id$
###############################################################################
# installation settings
include ../../config.mk
# local defines
SOURCES = ${ROOT_DIR}/src
CORE_SRC = ${SOURCES}/core
PLUG_SRC = ${SOURCES}/plugins
PROJ_SRC = ${SOURCES}/projects
CORE_USR = ${ROOT_DIR}/usr/core
PLUG_USR = ${ROOT_DIR}/usr/plugins
PROJ_USR = ${ROOT_DIR}/usr/projects
PROJ_TMP = ${ROOT_DIR}/tmp/projects
PROJ_VAR = ${ROOT_DIR}/var/projects
PORTSDIR = ${CORE_SRC}/ports
LOCAL = ${ROOT_DIR}/usr/local
PORTSWRK = ${ROOT_DIR}/var/ports
CORE_VERSION = ${shell svnversion ${CORE_SRC}}
PAGER ?= ${shell which less || which more}
RSYNC_COMMAND = ${shell which rsync}
HOSTNAME = ${shell hostname}
PROJECT_LC = ${shell echo "${PROJECT}" | tr '[:upper:]' '[:lower:]'}
# core settings
include ${CORE_SRC}/config.mk
# perl settings
include ${CORE_SRC}/ports/etc/perl.mk
# project settings
ifdef PROJECT
ifneq (${shell test -f ${PROJ_SRC}/${PROJECT}/config.mk && echo 1},1)
${error ERROR: no source ${PROJECT}/config.mk found, are you checked out project '${PROJECT}'?}
endif
-include /usr/local/etc/contenido.mk
RSYNC_SERVERS ?= ${addsuffix ::${PROJECT_LC}, ${FRONTENDS}}
include ${PROJ_SRC}/${PROJECT}/config.mk
include ${CORE_SRC}/project-default.mk
ifeq (${shell test -f ${PROJ_SRC}/${PROJECT}/GNUmakefile && echo 1},1)
include ${PROJ_SRC}/${PROJECT}/GNUmakefile
$(warning Use of GNUmakefile in project dir is deprecated, rename it to GNUmakefile.in)
endif
-include ${PROJ_SRC}/${PROJECT}/GNUmakefile.in
PROJECT_VERSION = ${shell svnversion ${PROJ_SRC}/${PROJECT}}
endif
.PHONY: \
local_clean realclean \
local_build build \
local_install install \
local_preview preview \
\
core_status cst \
core_update cup \
core_commit cci \
core_install cin \
core_info cinfo \
\
project_status pst \
project_update pup \
project_commit pci \
project_install pin \
project_conf conf \
project_rsync prs \
project_start start \
project_stop stop \
project_create create \
project_import import \
project_info pinfo \
project_reload reload \
project_fullreload full \
project_rewind rewind nano \
project_refresh refresh \
project_deinstall pdi \
project_user user \
project_switch switch swi \
project_backup backup \
\
plugin_create plc \
plugins_commit plci \
plugins_install plin \
plugins_status plst \
plugins_update plup \
plugins_deinstall pldi \
\
pgsql_init \
pgsql_start \
pgsql_stop \
pgsql_psql psql \
pgsql_dump dump \
pgsql_dumpz dumpz \
\
apache_access_log alog \
apache_pager_access_log palog \
apache_error_log elog \
apache_pager_error_log pelog \
apache_start \
apache_stop \
\
check_conf_installed \
check_core_installed \
check_owner \
check_project \
check_project_installed \
check_user \
#################
# local_* targets
#################
# build all required ports (core & project)
build: local_build ;
local_build: check_user
@for P in ${CORE_REQUIRED} ${PROJECT_REQUIRED}; do \
${MAKE} -s port_build PORT=$${P} \
|| exit 1; \
done;
@echo $@ done
# install all required ports (core & project)
install: local_install ;
local_install: check_user
@for P in ${CORE_REQUIRED} ${PROJECT_REQUIRED}; do \
${MAKE} -s port_install PORT=$${P} \
|| exit 1; \
done;
ifeq (${DB_TYPE},SINGLE)
@${MAKE} -s pgsql_init
endif
@echo $@ done
# preview of install all required ports (core & project)
preview: local_preview ;
@for P in ${CORE_REQUIRED} ${PROJECT_REQUIRED}; do \
${MAKE} -s port_install PORT=$${P} DRY_RUN=yes \
|| exit 1; \
done;
################
# core_* targets
################
# check core sources via repository
cst: core_status ;
core_status: check_user
@svn st -u ${CORE_SRC}
@echo $@ done
# update core sources from repository
cup: core_update ;
core_update: check_user
ifdef REV
@svn up -r ${REV} ${CORE_SRC}
else
@svn up ${CORE_SRC}
endif
@echo $@ done
# commit core changes to repository
cci: core_commit ;
core_commit: check_user
@svn ci ${CORE_SRC}
@echo $@ done
#
# pretty formatted core info
cinfo: core_info ;
core_info:
@REPOS=`svn info ${CORE_SRC} | grep -E '^URL' | sed -E 's/URL: //'`; \
RL=$$(($${#REPOS}+2)); \
DEVEL=`perl -e 'print "".(lc "${DEVELOPMENT}" eq "yes" ? "YES" : "NO");'`; \
DEBUG=`perl -e 'print "".(lc "${DEBUG}" eq "yes" ? "YES" : "NO");'`; \
printf "%-$${RL}s %-12s %-7s %-7s %-6s\n" REPOSITORY REVISION DEVEL DEBUG PORT; \
printf "%-$${RL}s %-12s %-7s %-7s %-6s\n" $${REPOS} ${CORE_VERSION} $${DEVEL} \
$${DEBUG} ${HTTPD_PORT}
@echo $@ done
# install core into work directory
cin: core_install ;
ifeq (${DB_TYPE},SINGLE)
core_install: check_user pgsql_init
else
core_install: check_user
endif
@if [ -d ${CORE_USR} ]; then \
chmod -R u+w ${CORE_USR} \
&& rm -Rf ${CORE_USR}; \
fi;
@mkdir ${CORE_USR} \
&& cp -Rp ${CORE_SRC}/comps ${CORE_SRC}/lib ${CORE_SRC}/services ${CORE_USR}/ \
&& find ${CORE_USR}/ -depth -type d -name .svn -exec rm -Rf {} \; \
&& find ${CORE_USR}/ -depth -type f -name '*.proto' -exec rm -f {} \;
@for PROJ in `ls -1A ${PROJ_USR}/`; do \
ln -s ${PROJ_USR}/$${PROJ}/lib/$${PROJ} ${CORE_USR}/lib/$${PROJ}; \
done;
@chmod -R a-w ${CORE_USR}
ifeq (${DB_TYPE},SINGLE)
@rm -f ${LOCAL}/pgsql/data/pg_hba.conf \
&& rm -f ${LOCAL}/pgsql/data/pg_ident.conf \
&& cp ${CORE_SRC}/conf/pgsql/pg_hba.conf ${LOCAL}/pgsql/data/ \
&& touch ${LOCAL}/pgsql/data/pg_ident.conf
@${call rewrite,${CORE_SRC}/conf/pgsql/postgresql.conf.proto, \
${LOCAL}/pgsql/data/postgresql.conf}
endif
@echo $@ done
###################
# project_* targets
###################
# check project sources via repository
pst: project_status ;
project_status:: check_project
@svn st -u ${PROJ_SRC}/${PROJECT}
@echo $@ done
# pretty formatted project info
pinfo: project_info ;
project_info:: check_project
@REPOS=`svn info ${PROJ_SRC}/${PROJECT} | grep -E '^URL' | sed -E 's/URL: //'`; \
PL=$$(($${#PROJECT}+2)); [ $${PL} -lt 9 ] && PL=9; RL=$$(($${#REPOS}+2)); \
printf "%-$${PL}s %-$${RL}s %-10s %s\n" PROJECT REPOSITORY REVISION PLUGINS; \
printf "%-$${PL}s %-$${RL}s %-10s ${PLUGINS}\n" ${PROJECT} $${REPOS} ${PROJECT_VERSION}
@echo $@ done
# update project sources from repository
pup: project_update ;
project_update:: check_project
ifdef REV
@svn up -r ${REV} ${PROJ_SRC}/${PROJECT}
else
@svn up ${PROJ_SRC}/${PROJECT}
endif
@echo $@ done
# commit project changes to repository
pci: project_commit ;
project_commit:: check_project
@svn ci ${PROJ_SRC}/${PROJECT}
@echo $@ done
# install project into work directory
pin: project_install ;
project_install:: check_core_installed check_project
@for PORT in ${PROJECT_REQUIRED}; do \
${MAKE} -s port_install PORT=$${PORT} \
|| exit 1; \
done;
@if [ -d ${PROJ_USR}/${PROJECT} ]; then \
chmod -R u+w ${PROJ_USR}/${PROJECT}; \
fi;
@if [ -n "${RSYNC_COMMAND}" ]; then \
${RSYNC_COMMAND} -a --delete --delete-excluded --include='tags' --include '*.exe' --cvs-exclude --exclude '*.proto' ${PROJ_SRC}/${PROJECT}/* ${PROJ_USR}/${PROJECT}; \
else \
if [ -d ${PROJ_USR}/${PROJECT} ]; then \
rm -Rf ${PROJ_USR}/${PROJECT}; \
fi; \
cp -R ${PROJ_SRC}/${PROJECT} ${PROJ_USR}/${PROJECT} \
&& find ${PROJ_USR}/${PROJECT}/ -depth -type d -name .svn -exec rm -Rf {} \; \
&& find ${PROJ_USR}/${PROJECT}/ -depth -type f -name '*.proto' -exec rm -f {} \; ; \
fi
@if [ \! -e ${PROJ_USR}/${PROJECT}/lib/Contenido ]; then \
mkdir ${PROJ_USR}/${PROJECT}/lib/Contenido; \
fi;
@test -d ${PROJ_USR}/${PROJECT}/conf \
&& rm -Rf ${PROJ_USR}/${PROJECT}/conf \
|| true
@if [ \! -e ${CORE_USR}/lib/${PROJECT} ]; then \
chmod u+w ${CORE_USR}/lib \
&& ln -s ${PROJ_USR}/${PROJECT}/lib/${PROJECT} \
${CORE_USR}/lib/${PROJECT} \
&& chmod u-w ${CORE_USR}/lib; \
fi;
@chmod -R a-w ${PROJ_USR}/${PROJECT}
@for D in ${PROJ_TMP}/${PROJECT} \
${PROJ_VAR}/${PROJECT}/log \
${PROJ_VAR}/${PROJECT}/mason \
${PROJ_VAR}/${PROJECT}/run; do \
test -d $${D} || mkdir -p $${D}; \
done;
@echo $@ done
# deinstall project from work directory
pdi: project_deinstall ;
project_deinstall:: check_project_installed project_stop
@if [ -d ${PROJ_USR}/${PROJECT} ]; then \
chmod -R u+w ${PROJ_USR}/${PROJECT} \
&& rm -Rf ${PROJ_USR}/${PROJECT}; \
fi;
@if [ -d ${PROJ_TMP}/${PROJECT} ]; then \
rm -Rf ${PROJ_TMP}/${PROJECT}; \
fi
@if [ -d ${PROJ_VAR}/${PROJECT} ]; then \
rm -Rf ${PROJ_VAR}/${PROJECT}; \
fi
@echo $@ done
# commit plugins changes
plci: plugins_commit ;
plugins_commit:
ifdef PLUGIN
@${MAKE} -s plugin_commit_${PLUGIN}
else
@for P in ${PLUGINS}; do \
${MAKE} -s plugin_commit_$${P}; \
done;
endif
@echo $@ done
# commit plugin changes
plugin_commit_%:
@svn ci ${PLUG_SRC}/${*}
@echo $@ done
# status of plugins sources via repository
plst: plugins_status ;
plugins_status:
ifdef PLUGIN
@${MAKE} -s plugin_status_${PLUGIN}
else
@for P in ${PLUGINS}; do \
${MAKE} -s plugin_status_$${P}; \
done;
endif
@echo $@ done
# status of plugin sources from repository
plugin_status_%:
@svn st -u ${PLUG_SRC}/${*}
@echo $@ done
# update plugins sources from repository
plup: plugins_update ;
plugins_update:
ifdef PLUGIN
@${MAKE} -s plugin_update_${PLUGIN}
else
@for P in ${PLUGINS}; do \
${MAKE} -s plugin_update_$${P}; \
done;
endif
@echo $@ done
# update plugin sources from repository
plugin_update_%:
@svn up ${PLUG_SRC}/${*}
@echo $@ done
# install plugins into work directory
plin: plugins_install ;
plugins_install: check_project_installed
#XXX It's workaround only (for old instalaltions - without usr/plugins)
@test -d ${PLUG_USR} || mkdir ${PLUG_USR}
@for P in ${PLUGINS}; do \
${MAKE} -s plugin_install_$${P}; \
done;
@echo $@ done
# install plugin
plugin_install_%:
@if [ -d ${PLUG_USR}/${*} ]; then \
chmod -R u+w ${PLUG_USR}/${*}; \
fi;
@if [ -n "${RSYNC_COMMAND}" ]; then \
${RSYNC_COMMAND} -a --delete --delete-excluded \
--cvs-exclude --exclude '*.proto' \
${PLUG_SRC}/${*}/ ${PLUG_USR}/${*}/; \
else \
if [ -d ${PLUG_USR}/${*} ]; then \
rm -Rf ${PLUG_USR}/${*}; \
fi; \
cp -R ${PLUG_SRC}/${*} ${PLUG_USR}/${*} \
&& find ${PLUG_USR}/${*}/ -depth -type d -name .svn \
-exec rm -Rf {} \; \
&& find ${PLUG_USR}/${*}/ -depth -type f -name '*.proto' \
-exec rm -f {} \; ; \
fi;
@chmod -R a-w ${PLUG_USR}/${*}
@echo $@ done
# deinstall plugins from work directory
pldi: plugins_deinstall ;
plugins_deinstall:
@for P in ${PLUGINS}; do \
${MAKE} -s plugin_deinstall_$${P}; \
done;
@echo $@ done
# deinstall plugin
plugin_deinstall_%:
@if [ -d ${PLUG_USR}/${*} ]; then \
chmod -R u+w ${PLUG_USR}/${*} \
&& rm -Rf ${PLUG_USR}/${*}; \
fi;
@echo $@ done
# create new plugin
plc: plugin_create ;
plugin_create: check_user
@if [ -z "${NAME}" ]; then \
echo "ERROR: NAME not defined"; \
echo "HINT: use 'make cmd NAME=xxx'"; \
exit 1; \
fi;
@if [ -e ${PLUG_SRC}/${NAME} ]; then \
echo "ERROR: plugin ${NAME} already exists in src/plugins"; \
echo "HINT: select other name for new plugin"; \
exit 1; \
fi;
@if [ -e ${PLUG_USR}/${NAME} ]; then \
echo "ERROR: plugin ${NAME} already exists in usr/plugins"; \
echo "HINT: select other name for new plugin"; \
exit 1; \
fi;
@mkdir -p ${PLUG_SRC} \
&& cp -Rp ${CORE_SRC}/skel/plugin ${PLUG_SRC}/${NAME} \
&& find ${PLUG_SRC}/${NAME}/ -depth -type d -name .svn -exec rm -Rf {} \; \
&& find ${PLUG_SRC}/${NAME}/ -depth -type f -name '*.proto' -and \
\! -path '*/conf/*' -exec rm -f {} \;
@${call rewrite_skel,${CORE_SRC}/skel/plugin/lib/plugin/Apache.pm.proto, \
${PLUG_SRC}/${NAME}/lib/plugin/Apache.pm}
@${call rewrite_skel,${CORE_SRC}/skel/plugin/lib/plugin/Init.pm.proto, \
${PLUG_SRC}/${NAME}/lib/plugin/Init.pm}
@${call rewrite_skel,${CORE_SRC}/skel/plugin/lib/plugin/Keeper.pm.proto, \
${PLUG_SRC}/${NAME}/lib/plugin/Keeper.pm}
@${call rewrite_skel,${CORE_SRC}/skel/plugin/lib/plugin/State.pm.proto, \
${PLUG_SRC}/${NAME}/lib/plugin/State.pm.proto}
@${call rewrite_skel,${CORE_SRC}/skel/plugin/comps/contenido/plugin/dhandler, \
${PLUG_SRC}/${NAME}/comps/contenido/plugin/dhandler}
@${call rewrite_skel,${CORE_SRC}/skel/plugin/comps/contenido/plugin/index.html, \
${PLUG_SRC}/${NAME}/comps/contenido/plugin/index.html}
@mv ${PLUG_SRC}/${NAME}/lib/plugin ${PLUG_SRC}/${NAME}/lib/${NAME}
@mv ${PLUG_SRC}/${NAME}/comps/contenido/plugin ${PLUG_SRC}/${NAME}/comps/contenido/${NAME}
@echo $@ done
# install configs into work directory
conf: project_conf ;
project_conf:: check_plugins_installed
@chmod -R u+w ${PROJ_USR}/${PROJECT}
@if [ -d ${PROJ_USR}/${PROJECT}/conf ]; then \
rm -Rf ${PROJ_USR}/${PROJECT}/conf; \
fi
@mkdir -p ${PROJ_USR}/${PROJECT}/conf/apache \
&& mkdir -p ${PROJ_USR}/${PROJECT}/conf/etc \
&& mkdir -p ${PROJ_USR}/${PROJECT}/conf/mason \
&& mkdir -p ${PROJ_USR}/${PROJECT}/conf/mod_perl
@cp ${CORE_SRC}/conf/apache/mime.conf \
${CORE_SRC}/conf/apache/mime.types \
${PROJ_USR}/${PROJECT}/conf/apache/
@${call rewrite,${CORE_SRC}/conf/apache/httpd.conf.proto, \
${PROJ_USR}/${PROJECT}/conf/apache/httpd.conf}
@${call rewrite,${PROJ_SRC}/${PROJECT}/conf/apache/httpd.conf.proto, \
${PROJ_USR}/${PROJECT}/conf/apache/httpd_project.conf}
ifeq (${CRON_ENABLE},YES)
@if [ -d ${PROJ_SRC}/${PROJECT}/conf/etc ]; then \
cd ${PROJ_SRC}/${PROJECT}/conf/etc && \
for CTPROTO in crontab.`hostname`.proto crontab.proto; do \
if [ -f $$CTPROTO ]; then \
${call rewrite,$$CTPROTO, \
${PROJ_USR}/${PROJECT}/conf/etc/crontab}; \
break; \
fi; \
done; \
fi
endif
@${call rewrite,${CORE_SRC}/conf/mason/handler.pl.proto, \
${PROJ_USR}/${PROJECT}/conf/mason/handler.pl}
@${call rewrite,${PROJ_SRC}/${PROJECT}/conf/mason/handler.pl.proto, \
${PROJ_USR}/${PROJECT}/conf/mason/handler_project.pl}
@${call rewrite,${CORE_SRC}/conf/mod_perl/startup.pl.proto, \
${PROJ_USR}/${PROJECT}/conf/mod_perl/startup.pl}
@${call rewrite,${PROJ_SRC}/${PROJECT}/conf/mod_perl/startup.pl.proto, \
${PROJ_USR}/${PROJECT}/conf/mod_perl/startup_project.pl}
@${call rewrite,${CORE_SRC}/conf/mason/Config.pm.proto, \
${PROJ_USR}/${PROJECT}/conf/mason/Config.pm}
@${call rewrite,${CORE_SRC}/lib/Contenido/State.pm.proto, \
${PROJ_USR}/${PROJECT}/lib/Contenido/State.pm}
@${call rewrite,${CORE_SRC}/lib/Modules.pm.proto, \
${PROJ_USR}/${PROJECT}/lib/Modules.pm}
@${call rewrite,${PROJ_SRC}/${PROJECT}/lib/${PROJECT}/State.pm.proto, \
${PROJ_USR}/${PROJECT}/lib/${PROJECT}/State.pm}
@chmod -R u+w ${CORE_USR}/lib ${CORE_USR}/services
@${call rewrite,${CORE_SRC}/services/inc.pl.proto, \
${CORE_USR}/services/inc.pl}
@chmod -R a-w ${CORE_USR}/lib ${CORE_USR}/services
@for P in ${PLUGINS}; do \
chmod -R u+w ${PLUG_USR}/$${P}; \
${call rewrite,${PLUG_SRC}/$${P}/lib/$${P}/State.pm.proto, \
${PLUG_USR}/$${P}/lib/$${P}/State.pm}; \
chmod -R u-w ${PLUG_USR}/$${P}; \
done;
@if [ $$((`perl -e 'print "".(lc "${DEVELOPMENT}" eq "yes" ? 1 : 0);'`)) -ne 1 ]; then \
${CORE_USR}/services/pregen \
${PROJ_SRC} ${PROJ_USR} ${PROJECT} '${PREGEN_GLOB}' ${PREGEN_LIST}; \
fi
@chmod -R a-w ${PROJ_USR}/${PROJECT}
ifeq (${DISABLE},YES)
@crontab -l | sed 's/^#*/#/' | crontab -; \
echo "Disabled crontab"
else
@if [ -f ${PROJ_USR}/${PROJECT}/conf/etc/crontab ]; then \
crontab ${PROJ_USR}/${PROJECT}/conf/etc/crontab; \
echo "Installed crontab from: ${PROJ_USR}/${PROJECT}/conf/etc/crontab"; \
fi
endif
@echo $@ done
# rsync project static files directly to frontend
prs: project_rsync ;
project_rsync:: check_project
@for D in ${RSYNC_DIRS}; do \
if [ -d ${RSYNC_ROOT}/$${D} ]; then \
D=$${D}/; \
elif [ \! -f ${RSYNC_ROOT}/$${D} ]; then \
echo "ERROR: no such dir or file: ${RSYNC_ROOT}/$${D}"; \
exit 1; \
fi; \
for S in ${RSYNC_SERVERS}; do \
echo "#######################################"; \
echo "# rsync $${D} to $${S}"; \
echo "#######################################"; \
cd ${RSYNC_ROOT} && ${RSYNC} -rtRv \
--delete --delete-excluded --exclude .svn --chmod=u+w \
$${D} $${S}; \
echo -e "done\n"; \
done; \
done;
@echo $@ done
# start project
start: project_start ;
ifneq (${DISABLE},YES)
ifeq (${DB_TYPE},SINGLE)
project_start:: pgsql_start apache_start
@echo $@ done
else
project_start:: apache_start
@echo $@ done
endif
else
project_start::
@for M in `cd ${PROJ_VAR}/${PROJECT} && ls -d mason.* 2>/dev/null`; do \
echo "cleaning old mason files: $$M"; \
rm -Rf ${PROJ_VAR}/${PROJECT}/$$M; \
done;
@echo $@ disabled
endif
# stop project
stop: project_stop ;
project_stop:: apache_stop
@echo $@ done
# full reinstall & restart core & project
full: project_fullreload ;
project_fullreload:: project_stop mason_clean core_update core_install \
project_update project_install plugins_update plugins_install \
project_conf project_start
@echo $@ done
# full reinstall & restart project
reload: project_reload ;
project_reload:: project_stop mason_clean project_update project_install \
plugins_update plugins_install project_conf project_start
@echo $@ done
# restart project without svn update
nano: project_rewind ;
rewind: project_rewind ;
project_rewind:: project_stop mason_clean project_install plugins_install \
project_conf project_start
@echo $@ done
# clean all mason temporaries & restart project
refresh: project_refresh ;
project_refresh:: project_stop mason_clean project_start
@echo $@ done
# create new project
create: project_create ;
project_create: check_user
@if [ -z "${NAME}" ]; then \
echo "ERROR: NAME not defined"; \
echo "HINT: use 'make cmd NAME=xxx'"; \
exit 1; \
fi;
@if [ -e ${PROJ_SRC}/${NAME} ]; then \
echo "ERROR: project ${NAME} already exists in src/projects"; \
echo "HINT: select other name for new project"; \
exit 1; \
fi;
@if [ -e ${PROJ_USR}/${NAME} ]; then \
echo "ERROR: project ${NAME} already exists in usr/projects"; \
echo "HINT: select other name for new project"; \
exit 1; \
fi;
@cp -Rp ${CORE_SRC}/skel/project ${PROJ_SRC}/${NAME} \
&& find ${PROJ_SRC}/${NAME}/ -depth -type d -name .svn -exec rm -Rf {} \; \
&& find ${PROJ_SRC}/${NAME}/ -depth -type f -name '*.proto' -and \
\! -path '*/conf/*' -exec rm -f {} \;
@${call rewrite_skel,${CORE_SRC}/skel/project/lib/project/Apache.pm.proto, \
${PROJ_SRC}/${NAME}/lib/project/Apache.pm}
@${call rewrite_skel,${CORE_SRC}/skel/project/lib/project/Init.pm.proto, \
${PROJ_SRC}/${NAME}/lib/project/Init.pm}
@${call rewrite_skel,${CORE_SRC}/skel/project/lib/project/Keeper.pm.proto, \
${PROJ_SRC}/${NAME}/lib/project/Keeper.pm}
@${call rewrite_skel,${CORE_SRC}/skel/project/lib/project/SampleCustomDocument.pm.proto, \
${PROJ_SRC}/${NAME}/lib/project/SampleCustomDocument.pm}
@${call rewrite_skel,${CORE_SRC}/skel/project/lib/project/SampleDefaultDocument.pm.proto, \
${PROJ_SRC}/${NAME}/lib/project/SampleDefaultDocument.pm}
@${call rewrite_skel,${CORE_SRC}/skel/project/lib/project/State.pm.proto, \
${PROJ_SRC}/${NAME}/lib/project/State.pm.proto}
@${call rewrite_skel,${CORE_SRC}/skel/project/lib/project/SQL/SampleTable.pm.proto, \
${PROJ_SRC}/${NAME}/lib/project/SQL/SampleTable.pm}
@${call rewrite_skel,${CORE_SRC}/skel/project/lib/project/SQL/SampleTable.pm.proto, \
${PROJ_SRC}/${NAME}/lib/project/SQL/SampleTable.pm}
@${call rewrite_skel,${CORE_SRC}/skel/project/comps/www/index.html.proto, \
${PROJ_SRC}/${NAME}/comps/www/index.html}
@${call rewrite_skel,${CORE_SRC}/skel/project/conf/etc/crontab.tmpl.proto, \
${PROJ_SRC}/${NAME}/conf/etc/crontab.tmpl.proto}
@${call rewrite_skel,${CORE_SRC}/skel/project/config.mk.proto, \
${PROJ_SRC}/${NAME}/config.mk}
@mv ${PROJ_SRC}/${NAME}/lib/project ${PROJ_SRC}/${NAME}/lib/${NAME}
@echo $@ done
# change active project
swi: project_switch ;
switch: project_switch ;
project_switch:
@if [ -z "${NAME}" ]; then \
echo "ERROR: NAME not defined"; \
echo "HINT: use 'make cmd NAME=xxx'"; \
exit 1; \
fi;
@if [ "${NAME}" = "${PROJECT}" ]; then \
echo "ERROR: project ${NAME} is already active"; \
exit 1; \
fi;
@if [ \! -d ${PROJ_SRC}/${NAME} ]; then \
echo "ERROR: project ${NAME} doesn't exists in src/projects"; \
echo "HINT: checkout sources for project ${NAME}"; \
exit 1; \
fi;
@${MAKE} -s project_stop
@perl -pi.orig -e 's|^([[:space:]]*PROJECT[[:space:]]*\?*\=[[:space:]]*)[^[:space:]]+([[:space:]]*)$$|$$1${NAME}$$2|' ${ROOT_DIR}/config.mk
@${MAKE} -s project_reload PROJECT=${NAME}
@echo $@ done
# backing-up project sources
backup: project_backup ;
project_backup:: check_project
@echo "compressing ${PROJECT} sources => ${PROJ_VAR}/${PROJECT}/${PROJECT}.src.tgz"
@tar -czf ${PROJ_VAR}/${PROJECT}/${PROJECT}.src.tgz -C ${PROJ_SRC} ${PROJECT}
@echo $@ done
# import project sources into repository
import: project_import ;
project_import: check_project
@if [ $$((`find ${PROJ_SRC}/${PROJECT} -type d -name .svn | wc -l`)) -ne 0 ]; then \
echo "ERROR: project '${PROJECT}' seems as already imported"; \
exit 1; \
fi
@if ! svn ls ${SVN_REPOSITORY}/${PROJECT}/trunk >&- 2>&-; then \
echo "ERROR: no repository for project '${PROJECT}' found"; \
echo "HINT: contact with respository administrators."; \
exit 1; \
fi
@if [ $$((`svn ls ${SVN_REPOSITORY}/${PROJECT}/trunk | wc -l`)) -ne 0 ]; then \
echo "ERROR: repository for project '${PROJECT}' isn't empty"; \
echo "Please contact with respository administrators."; \
exit 1; \
fi
@if svn import ${PROJ_SRC}/${PROJECT} ${SVN_REPOSITORY}/${PROJECT}/trunk \
&& mv ${PROJ_SRC}/${PROJECT} ${PROJ_SRC}/${PROJECT}.before-import \
&& svn checkout ${SVN_REPOSITORY}/${PROJECT}/trunk ${PROJ_SRC}/${PROJECT}; then \
echo "Your project directory moved to '${PROJ_SRC}/${PROJECT}.before-import'"; \
echo "Directory '${PROJ_SRC}/${PROJECT}' is now working copy"; \
else \
echo "ERROR: some errors occured during import/checkout project '${PROJECT}'"; \
echo "HINT: contact with respository administrators."; \
exit 1; \
fi
@echo $@ done
# create user (editors)
user: project_user ;
project_user: check_core_installed pgsql_template
@export PGPASSWORD=${BASE_PASSWD} && ${CORE_USR}/services/createuser | \
${PSQL} -h '${BASE_HOST}' -p ${PGSQL_PORT} -U ${BASE_USER} ${PGSQL_BASE}
@echo $@ done
##################
# apache_* targets
##################
apache_start: check_conf_installed
@${call is_alive,${PROJ_VAR}/${PROJECT}/run/httpd.pid}; \
FLAGS=`perl -e 'print " -DDEVELOPMENT" if lc "${DEVELOPMENT}" eq "yes";'`; \
FLAGS=$$FLAGS`perl -e ' \
if (lc "${RSYSLOG_ENABLE}" eq "yes") { print " -DRSYSLOG"; } \
elsif (lc "${CRONOLOG_ENABLE}" eq "yes") { print " -DCRONOLOG"; } \
else { print " -DFILELOG"; }'`; \
if [ "${LIMIT_VMEMORY_HTTPD}" ]; then \
LIMITS="${LIMIT_CMD} -v ${LIMIT_VMEMORY_HTTPD}"; \
fi; \
if [ "$${ALIVE}" = "YES" ]; then \
echo "WARNING: apache for project '${PROJECT}' already running"; \
else \
if $${LIMITS} ${LOCAL}/apache/bin/httpd $${FLAGS} \
-d ${PROJ_USR}/${PROJECT}/ \
-f ${PROJ_USR}/${PROJECT}/conf/apache/httpd.conf; then \
echo -n "apache for project '${PROJECT}' started"; \
if [ "${LIMIT_VMEMORY_HTTPD}" ]; then \
echo " (with vmem limit: ${LIMIT_VMEMORY_HTTPD})"; \
else \
echo; \
fi; \
else \
echo "ERROR: can't start apache for project '${PROJECT}'"; \
exit 1; \
fi; \
fi;
@for M in `cd ${PROJ_VAR}/${PROJECT} && ls -d mason.*`; do \
echo "cleaning old mason files: $$M"; \
rm -Rf ${PROJ_VAR}/${PROJECT}/$$M; \
done;
@echo $@ done
apache_stop: check_conf_installed
@${call is_alive,${PROJ_VAR}/${PROJECT}/run/httpd.pid}; \
if [ "$${ALIVE}" = "YES" ]; then \
kill `head -n 1 ${PROJ_VAR}/${PROJECT}/run/httpd.pid`; \
${call wait_stop,${PROJ_VAR}/${PROJECT}/run/httpd.pid,apache}; \
if [ $${STOPPED} != 'YES' ]; then \
echo "ERROR: can't stop apache for project '${PROJECT}'"; \
exit 1; \
else \
echo "apache for project '${PROJECT}' stopped"; \
fi; \
else \
echo "WARNING: apache for project '${PROJECT}' isn't running"; \
fi;
@echo $@ done
alog: apache_access_log ;
apache_access_log:
@test -e ${PROJECT_LOG}/access_log || touch ${PROJECT_LOG}/access_log
@tail -F ${PROJECT_LOG}/access_log
palog: apache_pager_access_log ;
apache_pager_access_log:
@test -e ${PROJECT_LOG}/access_log || touch ${PROJECT_LOG}/access_log
@${PAGER} ${PROJECT_LOG}/access_log
elog: apache_error_log ;
apache_error_log:
@test -e ${PROJECT_LOG}/error_log || touch ${PROJECT_LOG}/error_log
@tail -F ${PROJECT_LOG}/error_log
pelog: apache_pager_error_log ;
apache_pager_error_log:
@test -e ${PROJECT_LOG}/error_log || touch ${PROJECT_LOG}/error_log
@${PAGER} ${PROJECT_LOG}/error_log
#################
# pgsql_* targets
#################
ifeq (${DB_TYPE},SINGLE)
pgsql_init: check_user
@cd ${PORTSDIR}/all/postgresql \
&& ${MAKE} -s initdb PREFIX=${LOCAL} PORTSWRK=${PORTSWRK}
@echo $@ done
pgsql_start: pgsql_init
@${call is_alive,${LOCAL}/pgsql/data/postmaster.pid}; \
if [ "$${ALIVE}" = "YES" ]; then \
echo "WARNING: postgresql already running"; \
else \
if ${LOCAL}/pgsql/bin/pg_ctl -w -D ${LOCAL}/pgsql/data start; then \
echo "postgresql started"; \
else \
echo "ERROR: can't start postgresql"; \
exit 1; \
fi; \
fi;
@echo $@ done
pgsql_stop: check_user
@${call is_alive,${LOCAL}/pgsql/data/postmaster.pid}; \
if [ "$${ALIVE}" = "YES" ]; then \
${LOCAL}/pgsql/bin/pg_ctl -w -m fast -D ${LOCAL}/pgsql/data stop; \
${call wait_stop,${LOCAL}/pgsql/data/postmaster.pid,postgresql}; \
if [ $${STOPPED} != 'YES' ]; then \
echo "ERROR: can't stop postgresql"; \
exit 1; \
else \
echo "postgresql stopped"; \
fi; \
else \
echo "WARNING: postgresql isn't running"; \
fi;
@echo $@ done
pgsql_create: pgsql_start
@if [ $$((`${PSQL} -p ${PGSQL_PORT} -l | \
perl -ne 'print $$_ if /^\s*${PGSQL_BASE}/' | wc -l`)) -eq 0 ]; then \
${LOCAL}/pgsql/bin/createuser -SdR -p ${PGSQL_PORT} ${BASE_USER} \
|| true; \
${LOCAL}/pgsql/bin/createdb -p ${PGSQL_PORT} -O ${BASE_USER} \
${PGSQL_BASE}; \
echo "ALTER USER ${BASE_USER} PASSWORD '${BASE_PASSWD}';" | \
${PSQL} -p ${PGSQL_PORT} ${PGSQL_BASE}; \
${PSQL} -p ${PGSQL_PORT} ${PGSQL_BASE} < ${LOCAL}/pgsql/share/contrib/_int.sql; \
else \
echo "WARNING: database ${PGSQL_BASE} already exists"; \
fi;
@echo $@ done
else
pgsql_init \
pgsql_start \
pgsql_stop \
pgsql_create:
@echo "ERROR: $@ not implemented for DB_TYPE: ${DB_TYPE}"; \
echo "HINT: use 'make cmd DB_TYPE=xxx' or edit ${ROOT_DIR}/config.mk"; \
exit 1
endif
ifeq (${DB_TYPE},SINGLE)
pgsql_template: pgsql_create
else
pgsql_template: check_project
endif
@if [ $$((`export PGPASSWORD=${BASE_PASSWD} && ${PSQL} -h '${BASE_HOST}' \
-p ${PGSQL_PORT} -U ${BASE_USER} -c '\d' ${PGSQL_BASE} | \
grep documents | wc -l`)) -lt 1 ]; then \
export PGPASSWORD=${BASE_PASSWD} && ${PSQL} -h '${BASE_HOST}' \
-p ${PGSQL_PORT} -U ${BASE_USER} ${PGSQL_BASE} < \
${CORE_SRC}/sql/${STORE_METHOD}/contenido.sql; \
else \
echo "WARNING: template already loaded into database ${PGSQL_BASE}"; \
fi;
@echo $@ done
psql: pgsql_psql ;
ifeq (${DB_TYPE},SINGLE)
pgsql_psql: pgsql_create
else
pgsql_psql: check_project
endif
@(export PGPASSWORD=${BASE_PASSWD} && cd ../.. && ${PSQL} -h '${BASE_HOST}' -p ${PGSQL_PORT} \
-U ${BASE_USER} ${PGSQL_BASE})
# dump project database
dump: pgsql_dump ;
ifeq (${DB_TYPE},NONE)
pgsql_dump:
@echo "project ${PROJECT} hasn't database"; exit 1
else
ifeq (${DB_TYPE},SINGLE)
pgsql_dump: pgsql_create
else
pgsql_dump: check_project
endif
@echo "dumping ${BASE_HOST}:${PGSQL_PORT}/${PGSQL_BASE} => ${PROJ_VAR}/${PROJECT}/${PGSQL_BASE}.sql"
@export PGPASSWORD=${BASE_PASSWD} && ${PGDUMP} -Ox -h '${BASE_HOST}' -p ${PGSQL_PORT} \
-U ${BASE_USER} ${PGSQL_BASE} > ${PROJ_VAR}/${PROJECT}/${PGSQL_BASE}.sql
@echo $@ done
endif
# dump project database (gzip)
dumpz: pgsql_dumpz ;
ifeq (${DB_TYPE},NONE)
pgsql_dumpz:
@echo "project ${PROJECT} hasn't database"; exit 1
else
ifeq (${DB_TYPE},SINGLE)
pgsql_dumpz: pgsql_create
else
pgsql_dumpz: check_project
endif
@echo "dumping ${BASE_HOST}:${PGSQL_PORT}/${PGSQL_BASE} => ${PROJ_VAR}/${PROJECT}/${PGSQL_BASE}.sql.gz"
@export PGPASSWORD=${BASE_PASSWD} && ${PGDUMP} -Ox -h '${BASE_HOST}' -p ${PGSQL_PORT} \
-U ${BASE_USER} ${PGSQL_BASE} | gzip > ${PROJ_VAR}/${PROJECT}/${PGSQL_BASE}.sql.gz
@echo $@ done
endif
########################
# internal targets
# (not for direct usage)
########################
mason_clean:
@mv -f ${PROJ_VAR}/${PROJECT}/mason \
${PROJ_VAR}/${PROJECT}/mason.`date +%Y-%m-%d.%H:%M:%S` \
&& mkdir ${PROJ_VAR}/${PROJECT}/mason;
@echo $@ done
#################
# check_* targets
#################
# it's required
check_user: check_owner ;
# if user is installation owner?
check_owner:
@if [ `whoami` != ${OWNER} ]; then \
echo "ERROR: please run as OWNER: ${OWNER}"; \
echo "HINT: use 'sudo -u ${OWNER} -H bash' or 'sudo -i -u ${OWNER}'"; \
exit 1; \
fi;
# check if core installed
check_core_installed: check_user
@if [ $$((`ls -1A ${CORE_USR}/ | wc -l`)) -eq 0 ]; then \
echo "ERROR: core not installed"; \
echo "HINT: use 'make core_install' or 'make cin'"; \
exit 1; \
fi;
# check for existing project (see include near line ~30)
check_project: check_user
@if [ -z "${PROJECT}" ]; then \
echo "ERROR: project not defined"; \
echo "HINT: use 'make cmd PROJECT=xxx' or edit ${ROOT_DIR}/config.mk"; \
exit 1; \
fi;
# check if project installed
check_project_installed: check_project
@if [ \! -d ${PROJ_USR}/${PROJECT} ]; then \
echo "ERROR: project '${PROJECT}' not installed"; \
echo "HINT: use 'make project_install' or 'make pin'"; \
exit 1; \
fi;
@if [ $$((`ls -1A ${PROJ_USR}/${PROJECT} | wc -l`)) -eq 0 ]; then \
echo "ERROR: project '${PROJECT}' not installed"; \
echo "HINT: use 'make project_install' or 'make pin'"; \
exit 1; \
fi;
# check if plugins installed
check_plugins_installed: check_project_installed
@for P in ${PLUGINS}; do \
if [ \! -d ${PLUG_USR}/$${P} ]; then \
echo "ERROR: plugin '$${P}' not installed"; \
echo "HINT: use 'make plugins_install' or 'make plin'"; \
exit 1; \
fi; \
done;
# check if configs installed
check_conf_installed: check_project_installed
@if [ \! -d ${PROJ_USR}/${PROJECT}/conf ]; then \
echo "ERROR: configs for project '${PROJECT}' not installed"; \
echo "HINT: use 'make project_conf' or 'make conf'"; \
exit 1; \
fi;
##########################
# port_* & ports_* targets
##########################
# single port sub-commands
port_%: check_user
ifdef PORT
@cd ${PORTSDIR}/all/${PORT} \
&& ${MAKE} -s $* PREFIX=${LOCAL} PORTSWRK=${PORTSWRK}
ifndef DRY_RUN
@echo $@ done
endif
else
@echo "ERROR: no PORT defined"; \
echo "HINT: use 'make cmd PORT=name'"; \
exit 1;
endif
# multiple ports sub-commands
ports_%: check_user
@cd ${PORTSDIR} \
&& ${MAKE} -s $* PREFIX=${LOCAL} PORTSWRK=${PORTSWRK}
@echo $@ done
########
# macros
########
define is_alive
if [ \! -f ${1} ]; then \
ALIVE='NO'; \
else \
if kill -0 `head -n 1 ${1}` 2>/dev/null; then \
ALIVE='YES'; \
else \
rm -f ${1}; \
ALIVE='NO'; \
fi; \
fi
endef
define wait_stop
TRYMAX=`test -z "${3}" && echo 10 || echo ${3}`; \
TRYCUR=1; \
STOPPED='NO'; \
echo -n "Waiting for ${2} stopped, tries: $${TRYCUR}"; \
${call is_alive,${1}}; \
while [ "$${ALIVE}" = "YES" -a $$(($${TRYCUR})) -lt $$(($${TRYMAX})) ]; do \
sleep 1; \
TRYCUR=$$(($${TRYCUR}+1)); \
echo -n " $${TRYCUR}"; \
${call is_alive,${1}}; \
done; \
echo ""; \
if [ "$${ALIVE}" = "NO" ]; then \
STOPPED='YES'; \
fi
endef
ifeq (${USE_MTT},YES)
define rewrite
$(foreach R, ${REWRITE}, MTT_${R}="${${R}}") \
${CORE_SRC}/services/mttbfr > ${PROJ_TMP}/${PROJECT}/mtt.conf && \
${CORE_SRC}/services/mttcomp < ${1} | \
${LOCAL}/bin/mtt -b ${PROJ_TMP}/${PROJECT}/mtt.conf - ${2} \
&& echo "created ${2} (mtt)"
endef
else
define rewrite
$(foreach R, ${REWRITE}, ${R}="${${R}}") \
perl -pe 's/@([A-Z_]+)@/$$ENV{$$1}/ge' < ${1} > ${2} \
&& echo "created ${2} (rewrite)"
endef
endif
define rewrite_skel
NAME=${NAME} \
LOCAL=@LOCAL@ \
CORE_USR=@CORE_USR@ \
PROJ_USR=@PROJ_USR@ \
PROJECT_VAR=@PROJECT_VAR@ \
perl -pe 's/@([A-Z_]+)@/$$ENV{$$1}/ge' < ${1} > ${2} \
&& echo "created ${2}"
endef
# rewrites values
PREFIX = ${LOCAL}
ROOT_LOG = ${ROOT_DIR}/var/log
PGSQL_REDIRECT = ${shell perl -e 'print lc("${PGSQL_LOGGING}") eq "yes" && "on" || "off"'}
ifdef PROJECT
PROJECT_USR = ${PROJ_USR}/${PROJECT}
PROJECT_TMP = ${PROJ_TMP}/${PROJECT}
PROJECT_VAR = ${PROJ_VAR}/${PROJECT}
PROJECT_LOG = ${PROJ_VAR}/${PROJECT}/log
PROJECT_RUN = ${PROJ_VAR}/${PROJECT}/run
endif
# rewrites definitions
REWRITE += \
AUTH_COOKIE \
AUTH_MEMCACHED_BUSY_LOCK \
AUTH_MEMCACHED_ENABLE \
AUTH_MEMCACHED_SERVERS \
BASE_HOST \
BASE_PASSWD \
BASE_USER \
BINARY \
CASCADE \
COMP_CACHE_ENABLED \
COMP_TIMINGS_DISABLE \
CONF \
CONTENIDO_VERSION \
CONVERT \
CORE_COMP \
CORE_SRC \
CORE_VERSION \
CORE_USR \
CRONOLOG_ENABLE \
CRONOLOG_FORMAT \
CROSSLINKS \
DB_TYPE \
DEBUG_FORMAT \
DEBUG_MIN_LEVEL \
DEBUG_MAX_LEVEL \
DEBUG_STACK_TRACE \
DEBUG \
DEBUG_CORE \
DEBUG_SQL \
DEBUG_WORKTIME \
DEFAULT_ESCAPE_FLAGS \
DEFAULT_HANDLER \
DEVELOPMENT \
ERROR_MODE \
FILES \
HOSTNAME \
HTTPD_DOCS \
HTTPD_ELOG_LEVEL \
HTTPD_PORT \
HTTPD_SERVER \
IMAGES \
LISTEN_BACK_LOG \
LOCAL \
LOCALE \
LOGGER \
MASON_CACHE_ENABLED \
MASON_COMP \
MASON_MEMCACHED_BACKEND \
MASON_MEMCACHED_DEBUG \
MASON_MEMCACHED_ENABLED \
MASON_MEMCACHED_NAMESPACE \
MASON_MEMCACHED_SERVERS \
MASTER_BASE_HOST \
MASTER_BASE_NAME \
MASTER_BASE_PASSWD \
MASTER_BASE_PORT \
MASTER_BASE_USER \
MAX_CLIENTS \
MAX_PROCESS_SIZE \
MAX_REQUESTS_PER_CHILD \
MAX_SPARE_SERVERS \
MEMCACHED_BACKEND \
MEMCACHED_DELAYED \
MEMCACHED_ENABLE \
MEMCACHED_ENABLE_COMPRESS \
MEMCACHED_SELECT_TIMEOUT \
MEMCACHED_SERVERS \
MEMCACHED_SET_MODE \
MIN_SPARE_SERVERS \
MODULES \
MULTIDOMAIN \
OPTIONS_EXPIRE \
PERL_LEVEL \
PERL_LIB \
PERSISTENT_CONN \
PGSQL_BASE \
PGSQL_CLIENT_ENCODING \
PGSQL_PORT \
PGSQL_REAL_PREPARE \
PGSQL_REDIRECT \
PGSQL_CLIENT_ENCODING \
PGSQL_ENCODE_DATA \
PGSQL_DECODE_DATA \
PGSQL_ENABLE_UTF \
PLUG_SRC \
PLUGINS \
PLUGIN_COMP \
PREAMBLE_HANDLER \
PREAMBLE_HANDLER_PATH \
PREFIX \
PRELOADS \
PREVIEW \
PROFILING_DBI \
PROJECT \
PROJECT_HOME \
PROJECT_LC \
PROJECT_NAME \
PROJECT_LOG \
PROJECT_RUN \
PROJECT_TMP \
PROJECT_USR \
PROJECT_VAR \
PROJECT_VERSION \
PROJ_SRC \
PROJ_USR \
ROOT_LOG \
READONLY \
RSYSLOG_ENABLE \
RSYSLOG_HOST \
SERVER_ADMIN \
SESSIONS \
SPARE_REAPER_DELAY \
SPARE_REAPER_DELAY_FAKEMOD \
START_SERVERS \
STATIC_SOURCE_ENABLE \
STATIC_SOURCE_TOUCH_FILE \
STORE_METHOD \
#TODO: ElTexto compatibility only
REWRITE += \
COMMENTS_ON_PAGE \
ELTEXTO_VERSION \
MEMCACHED_EXPIRE \
SYNC_WITH_GROUPS \
TEXTS_ON_PAGE \
TEXT_IDS_IN_CACHE \
#TODO: Rate compatibility only
REWRITE += \
RATE_CLASSES \
RATE_COOKIE \
#TODO: Search plugin compatibility only
REWRITE += \
SEARCH_SERVER \
#TODO: Util Proxy image
REWRITE += \
PROXY_IMAGE_LOCATION \
PROXY_IMAGE_SECRET \