连接Zimbra的OpenLDAP

首先修改LDAP admin的密码,登录服务器,重设LDAP服务器密码为zimbra

su - zimbra

zmldappasswd -r zimbra

使 用User DN uid=admin,ou=people,dc=<MYDOMAIN>,dc=<COM>和上面重设的密码登录LDAP,注意替 换MYDOMAIN,COM为 zimbra安装时的domain。如我这里使用uid=admin,ou=people,dc=zimbra-test,dc=com

Zimbra安装配置

准备

安装环境:RHEL 5.4 X86_64

关闭防火墙:[root@zimbra-test ~]# service iptables stop

运行ntsysv,设定iptables不自动启动

关闭SELINUX:[root@zimbra-test ~]# setenforce0

修改/etc/sysconfig/selinux,设定SELINUX=disabled

确定安装服务器的IP地址,本例中使用10.182.0.37

关闭sendmail服务:[root@zimbra-test ~]# service sendmail stop

[root@zimbra-test ~]# chkconfig sendmail off

设定host

zimbra的安装需要配置正确的FQDN,即需要在host文件中加入当前服务器的IP与域名,形如

10.182.0.37 mail.zimbra-test.com mail

安装配置DNS解析

这一步骤不是必须的,如果你的安装环境中存在DNS服务器,且该DNS的MX记录未被占用或可以更改,那么请修改你的DNS服务器MX记录,然后跳过此步骤;

如果你需要进行zimbra的测试安装,或需要保持原有邮件系统的正常运行,待指定时间进行系统切换,那么请完成此步骤。

确定服务器是否安装了named,确定如下包已安装

[root@zimbra-test ~]# rpm -qa | grep bind

bind-9.3.6-4.P1.el5

ypbind-1.19-12.el5

bind-libs-9.3.6-4.P1.el5

bind-chroot-9.3.6-4.P1.el5

bind-utils-9.3.6-4.P1.el5

配置文件[root@zimbra-test ~]# vi /var/named/chroot/etc/named.conf

options {

directory “/var/named”;

dump-file “/var/named/data/cache_dump.db”;

statistics-file “/var/named/data/named_stats.txt”;

};

include “/etc/rndc.key”;

zone “zimbra-test.com.cn” {

type master;

file “db.mail.zimbra-test.com.cn”;

};

配置文件[root@zimbra-test ~]# vi /var/named/chroot/var/named/db.mail.zimbra-test.com.cn

;

; Addresses and other host information.

;

$TTL 3D

@ IN SOA zimbra-test.com. admin.zimbra-test.com. (

10118 ; Serial

43200 ; Refresh

3600 ; Retry

3600000 ; Expire

2592000 ) ; Minimum

; Define the nameservers and the mail servers

IN NS @

IN MX 10 zimbra-test.com.

@ IN A 10.182.0.37

mail IN CNAME @

pop3 IN CNAME @

smtp IN CNAME @

配置文件[root@zimbra-test ~]# vi /etc/resolv.conf

加入nameserver 10.182.0.37至最顶部sharch zimbra-test语句之下,以指定当前服务器使用本机作为最优先搜索的DNS。

启动named服务

[root@zimbra-test ~]# service named start

配置named自启动

[root@zimbra-test ~]# chkconfig named on

测试域名解析

[root@zimbra-test ~]# nslookup zimbra-test.com

若出现类似如下内容则说明工作正常

Server: 10.182.0.37

Address: 10.182.0.37#53

Name: zimbra-test.com

Address: 10.182.0.37

安装Zimbra

解压下载的Zimbra安装包,运行install.sh,一路选择Y即可

到最后一步出现菜单

Main menu

1) Common Configuration:

2) zimbra-ldap: Enabled

3) zimbra-store: Enabled

+Create Admin User: yes

+Admin user to create: admin@mail.rookie.com

* +Admin Password UNSET

+Enable automated spam training: yes

+Spam training user: spam.o1irkbvbks@mail.rookie.com

+Non-spam(Ham) training user: ham.1zaab3n5vd@mail.rookie.com

+Global Documents Account: wiki@mail.rookie.com

+SMTP host: mail.rookie.com

+Web server HTTP port: 80

+Web server HTTPS port: 443

+Web server mode: http

+IMAP server port: 143

+IMAP server SSL port: 993

+POP server port: 110

+POP server SSL port: 995

+Use spell check server: yes

+Spell server URL: http://zimbra-test.com:7780/aspell.php

+Configure for use with mail proxy: FALSE

+Configure for use with web proxy: FALSE

4) zimbra-mta: Enabled

5) zimbra-snmp: Enabled

6) zimbra-logger: Enabled

7) zimbra-spell: Enabled

8) Default Class of Service Configuration:

r) Start servers after configuration yes

s) Save config to file

x) Expand menu

q) Quit

Address unconfigured (**) items (? - help)

需要注意修改Admin Password,修改完成后保存退出即可。

Zimbra安装过程中做了什么

由之前的安装步骤可见,Zimbra的安装相对简单。

事实上在Zimbra的安装过程中,安装程序为我们配置了

为操作系统创建Zimbra用户

为Zimbra服务配置随操作系统自动启动

MYSQL数据库

OpenLDAP轻量级目录访问服务

Apache

拼写检查服务

IM服务

……

上述组件按照默认方式是部署在同一台服务器上的,依据不同部署环境的需求,可以将不同组件安装在不同服务器上。

Zimbra启动/停止

注意首先切换到zimbra用户下

[zimbra@zimbra-test ~]# zmcontrol start

[zimbra@zimbra-test ~]# zmcontrol stop

测试

登录地址 http://zimbra-test.com

管理后台 https://zimbra-test.com:7071

设置Weblogic应用的Session Timeout

对于部署目标为Weblogic的web应用来说,有两处用于设置session timeout

  • web.xml 单位为分钟
    <session-config>

<session-timeout>60</session-timeout>

</session-config>

  • weblogic.xml 单位为秒
    <session-descriptor>

<session-param>

<param-name>TimeoutSecs</param-name>

<param-value>3600</param-value>

</session-param>

</session-descriptor>

如果两处均设置了值,则web.xml会覆盖weblogic.xml中的设置。

需要注意的是,在WebLogic Console中看到的应用的Session Timeout为weblogic.xml中配置的值。

编写WebCenter启动/停止脚本

OS Ver. RHEL 5.5
WebCenter Ver. 11.1.1.3.0

本文目标为编写WebCenter相关产品(Weblogic Admin Server,Weblogic Managed Server,UCM,Apache)的统一启动脚本。

在<webcenter_domain_home>/servers/AdminServer/security及<webcenter_domain_home>/servers/WLS_Spaces/security下分别创建boot.properties文件,文件内容为
username=<admin user name>
password=<admin user password>
boot.properties文件将用于启动服务器时的用户名/密码验证。
不必担心boot.properties文件明文存储的问题,当对应Managed Server成功启动一次后,该文件将自动改为密文存储。

启动脚本为

#!/bin/bash

middleware_base=/u01/Oracle/Middleware
domain_home=$middleware_base/user_projects/domains/owc_domain
domain_log=$domain_home/logs
wc_home=$middleware_base/Oracle_WC1
ucm_apache_home=/u01/apache2

date_now=$(date +%Y%m%d%H%M%S)

if [ -e $domain_home/app_started.lck ]; then
echo “Server already started”
exit
fi

echo “——— Start Weblogic AdminServer … ———“
$domain_home/bin/startWebLogic.sh &> $domainlog/AdminServer$date_now.log &
echo “Server will ready after servel minutes …”
echo “————————————————–”
echo

echo “———— Start WebCenter Server … ———-“
$domain_home/bin/startManagedWebLogic.sh WLS_Spaces &> $domain_log/WLSSpaces$date_now.log &
echo “Server will ready after servel minutes …”
echo “————————————————–”
echo

echo “—————— Start UCM ———————“
$wc_home/ucm/etc/idcserver_start
$wc_home/ucm/admin/etc/idcadmin_start
$ucm_apache_home/bin/apachectl start
echo “————————————————–”

white lock file

touch $domain_home/app_started.lck

echo “WebCenter Application Start Successfully”

停止脚本为

#!/bin/bash

middleware_base=/u01/Oracle/Middleware
domain_home=$middleware_base/user_projects/domains/owc_domain
wc_home=$middleware_base/Oracle_WC1
ucm_apache_home=/u01/apache2

date_now=$(date +%Y%m%d%H%M%S)

export userID=weblogic
export password=weblogic1

echo “———— Stop WebCenter Server … ————“
$domain_home/bin/stopManagedWebLogic.sh WLS_Spaces
echo “—————————————————“
echo

echo “———– Stop Weblogic AdminServer … ———“
$domain_home/bin/stopWebLogic.sh
echo “—————————————————“
echo

echo “——————– Stop UCM ———————“
$ucm_apache_home/bin/apachectl stop
$wc_home/ucm/etc/idcserver_stop
$wc_home/ucm/admin/etc/idcadmin_stop
echo “—————————————————“

remove lock file

rm $domain_home/app_started.lck
echo “WebCenter Application Stop Successfully”

当注意正确设置启动/停止脚本头部的各环境变量。当启动完成后,会在domain_home文件夹下写入服务器启动锁文件app_started.lck以防止多次启动服务器;停止完成后会删除该lck文件。

为 Carousel 控件添加自动播放及播放控制

JDeveloper Ver. 11.1.1.3.0

从11.1.1.2.0版本开始,ADF Faces中添加了 Carousel 这一展示控件。该控件可以方便的用于展示图片和视频,但相比当前网页设计的元素,缺乏了自动滚动的功能。

本文将通过对ADF Faces控件的简单组合,为 Carousel 增加自动滚动及滚动控制功能。效果如下图

Model层使用JavaBeanDataControl,不再赘述。

效果实现目标为:

  1. 实现平滑无刷新的自动滚动
  2. 当鼠标移动至项目上时,停止自动滚动,离开时启动自动滚动
  3. 滚动至结尾时自动返回头部
  4. 提供播放控制panel,提供play, stop, previous, next四种功能
  5. 保留动画效果
    基于以上目标,实现方式为

  6. 使用poll控件定时执行Next动作实现滚动

  7. 使用JavaScript的方式而非PPR以达到平滑滚动、播放控制panel及保留动画效果的目的
  8. 在执行Next动作时同时将当前界置顶项同步至Binding中itemsIterator的CurrentRow
  9. 重写Carousel控件的carouselSpinListener,将当前选择项同步至Binding中itemsIterator的CurrentRow
  10. 为Carousel控件及CarouselItem控件增加clientListener,用于调用自动滚动启动/停止的JavaScript方法
    源代码下载

v1.1 Update
修正该功能在taskflow中使用时由于region嵌套导致component id 改变,找不到component进而js无法执行的错误。

源代码下载

 

在 Backing Bean 中 set model 层对象 currentRow

JDev Ver. 11.1.1.3.0

问题场景:
使用Carousel控件,希望在 backing bean 中的CarouselSpinListener方法中设置Carousel控件binding的Iterator对象的CurrentRow,进而达到改变Model层对象CurrentRow的目的。且不希望使用AM端暴露client方法的实现方式。

问题分析:
以前遇到需要设置AM中VO实例的currentRow时,总是在AM中创建一个client方法,接受参数进行对应VO的currentRow设置。其实当DataControl中的对象binding到client端生成XXIterator(实例继承于JUIteratorBinding)后,在Iterator对象上已存在两个方法 setCurrentRowWithKey(String) 及 setCurrentRowWithKeyValue(String) 。如图
这两个方法在使用上的问题为:它们均只接受一个String类型变量。

通过查看adfm.jar中的源代码,发现JUIteratorBinding上的这两个方法均调用至DCBeanDataControl类中的同名方法。同时在DCBeanDataControl中还有一个未暴露的setCurrentRowWithKey(DCIteratorBinding iter, Key key) 方法可供调用。首先尝试调用DCBeanDataControl中的setCurrentRowWithKey方法,代码片段代码如下:

public void carouseSpin(CarouselSpinEvent carouselSpinEvent) {
FacesContext fc = FacesContext.getCurrentInstance();
Application app = fc.getApplication();
JUIteratorBinding obj = (JUIteratorBinding)app.evaluateExpressionGet(fc, “#{bindings.itemsIterator}”, Object.class);
this.carousel.setRowKey(carouselSpinEvent.getNewItemKey());

Key currentRowKey = (Key)((List)carouselSpinEvent.getNewItemKey()).get(0);
DCDataControl dc = obj.getDataControl();
dc.setCurrentRowWithKey(obj, currentRowKey);
}

经测试该方法可行,但由代码可见,该方法将DataControl对象取到了backing bean中使用,破坏了DataControl - DataBinding - View这种结构。

通过查看JUIteratorBinding类中setCurrentRowWitheKey及setCurrentRowWithKeyValue两个方法的源代码,对两个方法作出如下总结:
setCurrentRowWithKeyValue(String) 当对应Iterator的model层对象声明为单主键时,该方法可用于设置Iterator当前行。传入参数为对应主键值。
setCurrentRowWithKey(String) 当对应Iterator的model层对象声明为单主键多主键时,需要将主键Key对象编码后以String传入。

代码片段:

public void carouseSpin(CarouselSpinEvent carouselSpinEvent) {
FacesContext fc = FacesContext.getCurrentInstance();
Application app = fc.getApplication();
JUIteratorBinding obj = (JUIteratorBinding)app.evaluateExpressionGet(fc, “#{bindings.itemsIterator}”, Object.class);
this.carousel.setRowKey(carouselSpinEvent.getNewItemKey());

Key currentRowKey = (Key)((List)carouselSpinEvent.getNewItemKey()).get(0);
obj.setCurrentRowWithKey(RepConversion.bArray2String(currentRowKey.toByteArray(true)));
}

配置UCM使用WebLogic Embedded LDAP进行用户验证

WebCenter Ver. 11.1.1.3.0
UCM Ver. 10.1.5.1
OS Ver. RHEL 5.4

两种方式进行配置
JPS Provider方式
ldapuser Provider方式

首先需要重设WebLogic Embedded LDAP身份证明密码,详见探索WebLogic Embedded LDAP

JPS Provider方式:

  1. 停止正在运行的idcserver,具体操作详见Getting Started With Content Server
  2. 修改<UCM_HOME>/config/jps-config.xml,增加serviceInstance形如
    <serviceInstance name=”idstore.wc_domain” provider=”idstore.ldap.provider”>
    <property name=”subscriber.name” value=”ou=myrealm,dc=wc_domain”/>
    <property name=”idstore.type” value=”WLS_OVD”/>
    <property name=”security.principal.key” value=”ldap.credential”/>
    <property name=”security.principal.alias” value=”JPS”/>
    <property name=”ldap.url” value=”ldap://localhost:7001”/>
    <extendedProperty>
    <name>user.search.bases</name>
    <values>
    <value>ou=people,ou=myrealm,dc=wc_domain</value>
    </values>
    </extendedProperty>
    <extendedProperty>
    <name>group.search.bases</name>
    <values>
    <value>ou=groups,ou=myrealm,dc=wc_domain</value>
    </values>
    </extendedProperty>
    <property name=”username.attr” value=”cn”/>
    <property name=”user.login.attr” value=”cn”/>
    <property name=”groupname.attr” value=”cn”/>
    </serviceInstance>
    注意标为粗体的部分,其中subscriber.name属性用于指定WebLogic中所使用安全域,idstore.type用 于指定所用LDAP的类型,包括ACTIVE_DIRECTORY, COREID, CUSTOM, EDIRECTORY, IPLANET, OID, OPEN_LDAP, OVD, WLS_OVD, XML。由于本例目的为使用WebLogic Embedded LDAP,故Type配置为WLS_OVD。其他属性见文档探索WebLogic Embedded LDAP
  3. 在jps-config.xml的jpsContext下增加serviceInstanceRef形如
    <jpsContext name=”default”>
    <serviceInstanceRef ref=”idstore.wc_domain”/>
    保存退出
  4. 运行<UCM_HOME>/custom/FusionLibraries/tools/run_credtool.sh,根据提示设定各属性
    [input] Alias: [JPS]
    [input] Key: [ldap.credential]
    [input] User Name:
    cn=Admin
    [input] Password:
    password
    [input] JPS Config:
    [WC_ORACLE_HOME/ucm/custom/FusionLibraries/tools/../../../config/jps-config.xml]
    []内提示的值为默认值,按Enter跳过即可。需要注意User Name及Password处需要输入Embedded LDAP的用户名及密码,关于用户名和密码详见文档探索WebLogic Embedded LDAP。
  5. 启动idcserver,具体操作详见Getting Started With Content Server
  6. 登入UCM,选择Administration > Providers,如果配置过ldapuser类型的provider,首先将其失效。确认JpsUserProvider的状态为good,即可判定为配成功

ldapuser Provider方式

  1. 登入UCM,选择Administration >Providers,创建ldapuser类型Provider。
  2. 填写相应字段,需要注意的字段如下
  • Source Path:<$MW_HOME 对应的路径名>
  • LDAP Server:<WebLogic服务器地址>
  • LDAP Suffix:ou=people,ou=myrealm,dc=<weblogic domain name> (详见探索WebLogic Embedded LDAP)
  • LDAP Port:<WebLogic Server 监听地址>
  • LDAP Attribute MAP:cn:dFullName,mail:dEmail,title:dUserType (非必须,详见探索WebLogic Embedded LDAP)
  • LDAP Admin DN:cn=Admin (详见探索WebLogic Embedded LDAP)
  • LDAP Admin Password: (详见探索WebLogic Embedded LDAP)
  1. 新增Role Prefix,设定ou=groups,ou=myrealm,dc=wc_domain[1],其意义见探索WebLogic Embedded LDAP
  2. 重启idcserver,进入Administration > Providers,查看状态是否为good

已知问题

使用LDAP方式配置,LDAP中的组没有映射为UCM中的Role