. ${CONF_DIR}/postgresql

export PGSQL_INIT_SQL_SAMPLE="${RUNTIME_DIR}/pgsql_init.pgsql"
export DIR_RC_SCRIPTS='/etc/init.d'
export PGSQL_RC_SCRIPT="${DIR_RC_SCRIPTS}/${PGSQL_RC_SCRIPT_NAME}"
# SSL cert/key
export PGSQL_SSL_CERT="${SSL_CERT_DIR}/iRedMail_CA_PostgreSQL.pem"
export PGSQL_SSL_KEY="${SSL_KEY_DIR}/iRedMail_PostgreSQL.key"

系统服务的管理(启动与停止)postgresql

从iRedMail 初始化数据库脚本学习PostgreSQL数据库_postgresql


1、init.d 目录中存放的是一系列系统服务的管理(启动与停止)脚本。

2、用service命令可执行init.d目录中相应服务的脚本。

例:执行命令“service resin start”,可启动/etc/init.d/resin脚本

3、/etc/init.d是指向/etc/rc.d/init.d的软连接

从iRedMail 初始化数据库脚本学习PostgreSQL数据库_database_02


这里的postgresql也是用来处理该问题的。

​. ${FUNCTIONS_DIR}/postgresql.sh​​用定义了一些用于处理postgresql相关的函数。backend.sh中的backend_install函数调用postgresql.sh中的pgsql_setup函数。

pgsql_setup()
{
ECHO_INFO "Configure PostgreSQL database server."
check_status_before_run pgsql_initialize # 调用postgresql.sh中的函数
check_status_before_run pgsql_import_vmail_users
check_status_before_run pgsql_cron_backup
write_iredmail_kv "sql_user_${PGSQL_ROOT_USER}" "${PGSQL_ROOT_PASSWD}"
write_iredmail_kv "sql_user_${VMAIL_DB_BIND_USER}" "${VMAIL_DB_BIND_PASSWD}"
write_iredmail_kv "sql_user_${VMAIL_DB_ADMIN_USER}" "${VMAIL_DB_ADMIN_PASSWD}"

echo 'export status_pgsql_setup="DONE"' >> ${STATUS_FILE}
}

pgsql_initialize函数用户初始化PostgreSQL数据库,首先调用initdb初始化数据库,然后备份pg.hba.conf和postgresql.conf文件,将pem和key文件拷贝为PGSQL_SSL_CERT和PGSQL_SSL_KEY。其实就是/etc/ssl/certs/iRedMail.crt和/etc/ssl/private/iRedMail.key拷贝过去。然后为其在pg数据目录下建立软连接server.crt和server.key指向证书和密钥。关闭再打开数据库,重置数据库管理员密码,更新pg_hba.conf将本地连接都设置认证方式为md5。

pgsql_import_vmail_users函数将sample下的postgresql/sql/init_vmail_db.sql、iredmail/iredmail.pgsql、postgresql/sql/add_first_domain_and_user.sql、postgresql/sql/grant_permissions.sql目录下,使用perl对sql文件进行修改,最后执行这些sql。

pgsql_import_vmail_users()
{
ECHO_DEBUG "Generate sample SQL templates."
cp -f ${SAMPLE_DIR}/postgresql/sql/init_vmail_db.sql ${PGSQL_DATA_DIR}/
cp -f ${SAMPLE_DIR}/iredmail/iredmail.pgsql ${PGSQL_DATA_DIR}/iredmail.sql
cp -f ${SAMPLE_DIR}/postgresql/sql/add_first_domain_and_user.sql ${PGSQL_DATA_DIR}/
cp -f ${SAMPLE_DIR}/postgresql/sql/grant_permissions.sql ${PGSQL_DATA_DIR}/

perl -pi -e 's#PH_VMAIL_DB_NAME#$ENV{VMAIL_DB_NAME}#g' ${PGSQL_DATA_DIR}/*.sql
perl -pi -e 's#PH_VMAIL_DB_BIND_USER#$ENV{VMAIL_DB_BIND_USER}#g' ${PGSQL_DATA_DIR}/*.sql
perl -pi -e 's#PH_VMAIL_DB_BIND_PASSWD#$ENV{VMAIL_DB_BIND_PASSWD}#g' ${PGSQL_DATA_DIR}/*.sql
perl -pi -e 's#PH_VMAIL_DB_ADMIN_USER#$ENV{VMAIL_DB_ADMIN_USER}#g' ${PGSQL_DATA_DIR}/*.sql
perl -pi -e 's#PH_VMAIL_DB_ADMIN_PASSWD#$ENV{VMAIL_DB_ADMIN_PASSWD}#g' ${PGSQL_DATA_DIR}/*.sql

perl -pi -e 's#PH_DOMAIN_ADMIN_EMAIL#$ENV{DOMAIN_ADMIN_EMAIL}#g' ${PGSQL_DATA_DIR}/*.sql
perl -pi -e 's#PH_FIRST_DOMAIN#$ENV{FIRST_DOMAIN}#g' ${PGSQL_DATA_DIR}/*.sql
perl -pi -e 's#PH_TRANSPORT#$ENV{TRANSPORT}#g' ${PGSQL_DATA_DIR}/*.sql
perl -pi -e 's#PH_DOMAIN_ADMIN_PASSWD_HASH#$ENV{DOMAIN_ADMIN_PASSWD_HASH}#g' ${PGSQL_DATA_DIR}/*.sql
perl -pi -e 's#PH_DOMAIN_ADMIN_MAILDIR_HASH_PART#$ENV{DOMAIN_ADMIN_MAILDIR_HASH_PART}#g' ${PGSQL_DATA_DIR}/*.sql
perl -pi -e 's#PH_DOMAIN_ADMIN_NAME#$ENV{DOMAIN_ADMIN_NAME}#g' ${PGSQL_DATA_DIR}/*.sql

perl -pi -e 's#^-- \\c#\\c#g' ${PGSQL_DATA_DIR}/iredmail.sql

# Modify default SQL template, set storagebasedirectory, storagenode.
perl -pi -e 's#(.*storagebasedirectory.*DEFAULT..)(.*)#${1}$ENV{STORAGE_BASE_DIR}${2}#' ${PGSQL_DATA_DIR}/iredmail.sql
perl -pi -e 's#(.*storagenode.*DEFAULT..)(.*)#${1}$ENV{STORAGE_NODE}${2}#' ${PGSQL_DATA_DIR}/iredmail.sql

chmod 0755 ${PGSQL_DATA_DIR}/*sql

ECHO_DEBUG "Create roles (${VMAIL_DB_BIND_USER}, ${VMAIL_DB_ADMIN_USER}) and database: ${VMAIL_DB_NAME}."
su - ${SYS_USER_PGSQL} -c "psql -d template1 -f ${PGSQL_DATA_DIR}/init_vmail_db.sql" >> ${INSTALL_LOG} 2>&1

ECHO_DEBUG "Create tables in ${VMAIL_DB_NAME}
export PGPASSFILE="${PGSQL_DOT_PGPASS}"
su - ${SYS_USER_PGSQL} -c "psql -d template1 -f ${PGSQL_DATA_DIR}/iredmail.sql" >> ${INSTALL_LOG} 2>&1

ECHO_DEBUG "Grant permissions."
su - ${SYS_USER_PGSQL} -c "psql -d template1 -f ${PGSQL_DATA_DIR}/grant_permissions.sql" >> ${INSTALL_LOG} 2>&1

ECHO_DEBUG "Add first domain and postmaster@ user."
su - ${SYS_USER_PGSQL} -c "psql -U ${VMAIL_DB_ADMIN_USER} -d template1 -f ${PGSQL_DATA_DIR}/add_first_domain_and_user.sql" >> ${INSTALL_LOG} 2>&1

mv ${PGSQL_DATA_DIR}/*sql ${RUNTIME_DIR}
chmod 0700 ${RUNTIME_DIR}/*sql

cat >> ${TIP_FILE} <<EOF
SQL commands used to initialize database and import mail accounts:
- ${RUNTIME_DIR}/*.sql

EOF

echo 'export status_pgsql_import_vmail_users="DONE"' >> ${STATUS_FILE}
}

perl 命令可以批量替换文件中的一些内容,操作起来非常高效。下面举几个例子:

perl -pi -e “s/aaa/bbb/gi” test.txt
上面的命令把test.txt文件中的字符aaa替换成bbb

perl -pi.bak -e “s/aaa/bbb/gi” test.txt
上面的命令把test.txt文件中的字符aaa替换成bbb,并生成一个test.txt.bak的备份文件

find ./ -name “*.txt” | xargs perl -pi.bak -e “s/aaa/bbb/gi”
上面的命令把当前目录下所有的.txt文件中的字符aaa替换成bbb,并生成相应的.bak的备份文件

注意:如果是报错can‘t do inpalce without backup ,请执行第二种方案,针对window进行验证过。

-p 告诉Perl对后面添加的文件名参数进行遍历,大致和sed中的这段代码效果类似
-i 大致是用来读取文件时进行备份操作。
-e 告诉Perl后面跟上perl语句
-p和-i可以合在一起-pi,-p -e也可以何在一起,但是-i,-e不能合在一起写-ie。

. ${CONF_DIR}/dovecot
. ${CONF_DIR}/postfix
. ${CONF_DIR}/mlmmj
. ${CONF_DIR}/amavisd
. ${CONF_DIR}/iredapd
. ${CONF_DIR}/memcached
. ${CONF_DIR}/sogo
. ${CONF_DIR}/clamav
. ${CONF_DIR}/spamassassin
. ${CONF_DIR}/roundcube
. ${CONF_DIR}/netdata
. ${CONF_DIR}/fail2ban
. ${CONF_DIR}/iredadmin
. ${CONF_DIR}/logwatch