From: Polin Wei

在Table的作業中, 常會有將所有筆數全選( Select All Rows)的需求, 在 ADF 的 Table 要實現這樣的效果卻有點難(好難搞的 ADF....) , Google 一下查到一些高手的作法, 整理如下.

前置作業:

1. 使用 Table: USERS 來作示範

CREATE TABLE "USERS"(
      "USERNAME" VARCHAR2(15 BYTE) NOT NULL  PRIMARY KEY ENABLE ,
    "NAME"     VARCHAR2(255 BYTE) NOT NULL ENABLE,
    "PASSWORD" VARCHAR2(15 BYTE) NOT NULL ENABLE
  )

 

2. 建立一個 JavaBean: UsersTableBean

package com.wei.bean;

import com.wei.utils.ADFUtils;

import java.util.ArrayList;

import javax.faces.event.ValueChangeEvent;

import oracle.adf.model.binding.DCIteratorBinding;
import oracle.adf.view.rich.component.rich.data.RichTable;

import oracle.adf.view.rich.context.AdfFacesContext;
import oracle.adf.view.rich.render.ClientEvent;

import oracle.jbo.Row;
import oracle.jbo.RowSetIterator;

import org.apache.myfaces.trinidad.model.CollectionModel;
import org.apache.myfaces.trinidad.model.RowKeySet;
import org.apache.myfaces.trinidad.model.RowKeySetImpl;

public class UsersTableBean {
    private RowKeySet selectedRows;
    private RichTable table;
    private static final String ITERATOR_NAME = "UsersVO1Iterator";

    public UsersTableBean() {
        super();
    }


    public void setSelectedRows(RowKeySet selectedRows) {
        this.selectedRows = selectedRows;
    }

    public RowKeySet getSelectedRows() {
        if (selectedRows == null) {
            selectedRows = new RowKeySetImpl();
            CollectionModel collectionModel =
                (CollectionModel)getTable().getValue();
            selectedRows.setCollectionModel(collectionModel);
        }

        return selectedRows;
    }

    public void setTable(RichTable table) {
        this.table = table;
    }

    public RichTable getTable() {
        return table;
    }

    public void rowSelected(ClientEvent clientEvent) {
        refreshSelectedRows();
        AdfFacesContext.getCurrentInstance().addPartialTarget(getTable());

    }

    public void selectAll(ValueChangeEvent valueChangeEvent) {
        DCIteratorBinding it = ADFUtils.findIterator(ITERATOR_NAME);
        RowSetIterator rit = it.getRowSetIterator();
        rit.reset();
        if (valueChangeEvent.getNewValue() != null) {
            Boolean selectAll =
                Boolean.parseBoolean(valueChangeEvent.getNewValue().toString());
            if (rit.first() != null) {
                Row r = rit.first();
                r.setAttribute("Selected", selectAll);
            }
            while (rit.hasNext()) {
                Row r = rit.next();
                if (r != null) {
                    r.setAttribute("Selected", selectAll);
                }
            }
        }

        refreshSelectedRows();
        it.executeQuery();
    }

    private void refreshSelectedRows() {
        getSelectedRows().clear();

        DCIteratorBinding it = ADFUtils.findIterator(ITERATOR_NAME);
        RowSetIterator rit = it.getRowSetIterator();
        rit.reset();

        if (rit.first() != null) {
            Row r = rit.first();
            if (r.getAttribute("Selected") != null) {
                makeRowSelected(r);
            }
        }
        while (rit.hasNext()) {
            Row r = rit.next();
            if (r.getAttribute("Selected") != null) {
                makeRowSelected(r);
            }
        }

    }

    private void makeRowSelected(Row r) {
        Boolean selected = (Boolean)r.getAttribute("Selected");
        if (selected) {
            ArrayList keyList = new ArrayList();
            keyList.add(r.getKey());
            getSelectedRows().add(keyList);
        }
    }

}

 

Step 01:

建立的 EO (Entity Objects): USERSEO 自行加入一個暫時記錄資料(transient attribute)的欄位 Selected , Type: Boolean, 因不需回寫 Table, 所以將屬性 Persistent 拿掉

TableCheckboxSelect_EO.png  

 

Step 02: 建立一個檔案 tableCheckBoxSelect.jspx , 將 UserVO1 拖拉進來,並選轉換為ADF Table 物件


 TableCheckboxSelect_tableProperty.png  
 

Section Attribute Value
Common Id t1
  rowSelection multiple
Behavior partialTriggers selectAll
Advanced binding #{viewScope.UsersTableBean.table}
  selectedRowKeys #{viewScope.UsersTableBean.selectedRows}

 

Step 03: 再將 Selected 欄位 Convert To CheckBox

TableCheckboxSelect_ConvertToCheckbox.png  

在作 Convert 時, 可以挑選要 Binding 的資料來源, 原則上不需變動

TableCheckboxSelect_ConvertToCheckbox_Binding.png

最後確認時, 是告知轉換成 Checkbox 時, 這兩個欄位屬性: MaximumLength、Columns會被移除

TableCheckboxSelect_ConvertToCheckbox_Confirm.png  

在 Headline 加入 SelectBooleanCheckbox 元件

TableCheckboxSelect_HeadlineAddCheckbox.png  

 

Section Attribute Value
Common Id selectAll
  Width 30
Behavior autoSubmit true
  valueChangeListener #{viewScope.UsersTableBean.selectAll}

 

這是方法之一, 但第一次選擇時 Table 裡的每一個ROW 的 checkBox 卻沒有被打勾, 這未解決......

 

 參考:

http://www.gebs.ro/blog/oracle/oracle-adf-row-selection-using-checkboxes/

http://www.oracle.com/technetwork/developer-tools/adf/learnmore/34-extra-arguments-to-javascript-169176.pdf

http://docs.oracle.com/cd/E16764_01/web.1111/b31973/af_event.htm

http://docs.oracle.com/cd/B14099_19/web.1012/b14022/overview-summary.html

http://jdevadf.oracle.com

 Section 5.3.1, "How to Return the Original Source of the Event.

文章標籤

MIS 發表在 痞客邦 留言(0) 人氣()

環境:

ADF version: 11.1.1.6.0
Oracle EBS version: R12.2.3

程式的目的在於取得 EBS 登入時的使用者相關資訊。整個程式架構如下圖:

ADF_Integrate_EBS_01.png  

 

 

ADF 的程式面:

Step 01: 在 ViewController 依序建立 Java Class:ConnectionProvider、EBizUtil、EBSWrapperFilter、以及存取使用者資訊的 Java Bean: UserInfo

資料的

ConnectionProvider.java

package com.oracle.view;

import java.sql.Connection;
import java.sql.SQLException;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource;

public class ConnectionProvider {
    private static DataSource ebsDS = null;
    static{
        try {
            Context ctx = new InitialContext();
            ebsDS = (DataSource) ctx.lookup("jdbc/TEST32");
            
            // your datasource jndi name as defined during configuration
            if (ctx != null)
                ctx.close();
            
        } catch (Exception e) {
            // TODO: Add catch code
            //ne.printStackTrace(); //ideally you should log it
            throw new RuntimeException(e);
            // means jndi setup is not correct or doesn't exist
        }
    }
    
    private ConnectionProvider() {
        super();
    }
    

   public static Connection getConnection() throws SQLException{
        if (ebsDS == null)
            throw new IllegalStateException("AppsDatasource is not properly initialized or available");
        return ebsDS.getConnection();
    }
 
    
}

PS: 在 EBS 環境中是以 jdbc 的模式取得資料庫連線,可以進入 weblogic 的 Services-> Data Sources 查看,如:EBSDataSource 的 JNDI: jdbc/TEST32 ,並可以得知要佈署到那一個主機上:oacore_cluster1

ADF_Integrate_EBS_06.png  

 

EBizUtil.java

package com.oracle.view;

import java.sql.Connection;
import java.sql.SQLException;
import java.util.logging.Level;
import java.util.logging.Logger;
import oracle.apps.fnd.ext.common.EBiz;


public class EBizUtil {
    public EBizUtil() {
        super();
    }
    private static final Logger logger = Logger.getLogger(EBizUtil.class.getName());
    private static EBiz INSTANCE = null;
    static {
        Connection connection = null;
        try {
            connection = ConnectionProvider.getConnection();
            // DO NOT hard code applServerID for a real application
            // Get applServerID as CONTEXT-PARAM from web.xml or elsewhere
            INSTANCE = new EBiz(connection, "F1CB87199593E5F4E0431F030A0AD0AB31310251131793525291714692481335");
        } catch (SQLException e) {
            logger.log(Level.SEVERE, "SQLException while creating EBiz instance -->", e);
            throw new RuntimeException(e);
        } catch (Exception e) {
            logger.log(Level.SEVERE, "Exception while creating EBiz instance -->", e);
            throw new RuntimeException(e);
        } finally {
            if (connection != null) {
                try {
                    connection.close();
                } catch (SQLException e) {
                    throw new RuntimeException(e);
                }
            }
        }
    }

    public static EBiz getEBizInstance() {
        return INSTANCE;
    }    
    
}

PS: APPL_SERVER_ID 可以到 EBS APP Server 路徑下的 $INST_TOP/appl/fnd/12.0.0/secure/TEST32.dbc 取得
Server ID :
APPL_SERVER_ID=F1CB87199593E5F4E0431F030A0AD0AB31310251131793525291714692481335

EBSWrapperFilter.java

package com.oracle.view;

import java.io.IOException;
import java.sql.SQLException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import oracle.apps.fnd.ext.common.AppsRequestWrapper;
import oracle.apps.fnd.ext.common.AppsRequestWrapper.WrapperException;

public class EBSWrapperFilter implements Filter {
    public EBSWrapperFilter() {
        super();
    }


    private static final Logger logger = Logger.getLogger(EBSWrapperFilter.class.getName());
    
    public void init(FilterConfig filterConfig) {
        logger.info("Filter initialized ");
    }

    public void doFilter(ServletRequest request, ServletResponse response,  FilterChain chain) throws IOException,ServletException {
        AppsRequestWrapper wrapper = null;
        logger.info("-current URI =" + ((HttpServletRequest)request).getRequestURI());

        try {
            
            wrapper = new AppsRequestWrapper((HttpServletRequest)request, (HttpServletResponse)response, ConnectionProvider.getConnection(), EBizUtil.getEBizInstance());
            
        } catch (WrapperException e2) {
            logger.log(Level.SEVERE, "WrapperException error encountered ", e2);
            throw new ServletException(e2);
        } catch (SQLException e2) {
            logger.log(Level.SEVERE, "SQLException error encountered ", e2);
            throw new ServletException(e2);
        }
        try {
            logger.info("Created AppsRequestWrapper object." + " Continuing the filter chain.");
            chain.doFilter(wrapper, response);
            logger.info("- the filter chain ends");
        } finally {
            //AppsRequestWrapper caches a connection internally.
            //AppsRequestWrapper.getConnection()--returns this connection this connection can be used in doGet()/doPost() service layer
            //whenever our application requires a connection in order to service the current request.
            //When AppsRequestWrapper instance is in use, this connection should not be closed by other code.
            //At this point, we are done using AppsRequestWrapper instance so, as good practice, we are going to close (release) this connection now.
            if (wrapper != null) {
                try {
                    logger.info("- releasing the connection attached to the" + " current AppsRequestWrapper instance ");
                    wrapper.getConnection().close();
                } catch (SQLException e3) {
                    logger.log(Level.WARNING, "SQLException error while closing connection--", e3);
                    throw new ServletException(e3);
                }
            }
            wrapper = null;
        }
    }

    public void destroy() {
        logger.info("Filter destroyed ");
    }
}

 

UserInfo.java

package com.oracle.bean;

import java.util.Map;
import javax.faces.context.FacesContext;
import javax.faces.event.PhaseEvent;
import oracle.apps.fnd.ext.common.AppsRequestWrapper;
import oracle.apps.fnd.ext.common.Session;

public class UserInfo {
    private String user;
    private String userInfo;

    public UserInfo() {
        super();
    }


    public void setUser(String user) {
        this.user = user;
    }

    public String getUser() {
        return user;
    }


    public void beforePhase(PhaseEvent phaseEvent) {
        // Add event code here...
        AppsRequestWrapper wrappedRequest =
            (AppsRequestWrapper)FacesContext.getCurrentInstance().getExternalContext().getRequest();

        Session session = wrappedRequest.getAppsSession();

        setUser(session.getUserName());

        Map columns = session.getInfo();
        StringBuffer temp = new StringBuffer();
        temp.append("<table>");
        for (Object key : columns.keySet()) {
            temp.append("<tr>");
            temp.append("<td>");
            temp.append(key);
            temp.append("</td>");
            temp.append("<td>");
            temp.append(columns.get(key));
            temp.append("</td>");
            temp.append("</tr>");
        }
        temp.append("</table>");

        setUserInfo(temp.toString());

    }

    public void setUserInfo(String userInfo) {
        this.userInfo = userInfo;
    }

    public String getUserInfo() {
        return userInfo;
    }
}

 

Step 02:在 adfc-config.xml 建立 view: userInfo.jspx 及 設定 Managed Beans

userInfo.jspx

版面:PageGroupLayout :layout = vertical
      OutPutText:value="Hello #{pageFlowScope.userInfoBean.user}!!"
          inlineStyle="font-size:medium; color:Red;"
      Separator
       OutPutText:value="#User Info:<br>#{pageFlowScope.userInfoBean.userInfo}"
           escape="false"
                  inlineStyle="font-size:medium;"

  ADF_Integrate_EBS_03.png

 

Managed BeansuserInfoBean

  ADF_Integrate_EBS_02.png

 

Step 03: 設定 userInfo.jspx 的 beforePhase

ADF_Integrate_EBS_04.png  

這是在 UserInfo.java 的一段程式

    public void beforePhase(PhaseEvent phaseEvent) {
        // Add event code here...
        AppsRequestWrapper wrappedRequest =
            (AppsRequestWrapper)FacesContext.getCurrentInstance().getExternalContext().getRequest();

        Session session = wrappedRequest.getAppsSession();

        setUser(session.getUserName());

        Map columns = session.getInfo();
        StringBuffer temp = new StringBuffer();
        temp.append("<table>");
        for (Object key : columns.keySet()) {
            temp.append("<tr>");
            temp.append("<td>");
            temp.append(key);
            temp.append("</td>");
            temp.append("<td>");
            temp.append(columns.get(key));
            temp.append("</td>");
            temp.append("</tr>");
        }
        temp.append("</table>");

        setUserInfo(temp.toString());

    }

 

Step 04 : web.xml 中設定 Filters

ADF_Integrate_EBS_05.png  

 

Oracle EBS 上的設定:

Step 01: 設定 Function : Menu: Responsibiliey:

Function: WEI_ADFLAB_USERINFO

Function WEI_ADFLAB_USERINFO
Properties-Type External ADF Application
WebHTML-HTML Call GWY.jsp?targetPage=faces/userInfo
   

 ADF_Integrate_EBS_07.png  

ADF_Integrate_EBS_08.png

 

Menu:WEI_LAB_MENU

ADF_Integrate_EBS_09.png  

 

Responsibility: WEI Labs

ADF_Integrate_EBS_10.png  
  

Step 02: Responsibility: Functional Administrator 上的設定

a. Core Services → Profiles → Code: FND_EXTERNAL_ADF_URL → Go

b. 然後點選External ADF Application URL 後按 Define Profile Values

ADF_Integrate_EBS_11.png  

 

a. 點選Define Profile Values → Responsibility
b. 選擇 Responsibility & Value
c. Value:  客製程式在 weblogic 的路徑,如: http://lnxap104:7214/LAB_EBS-ViewController-context-root/ ,最後要加 /
d. 按 Update

ADF_Integrate_EBS_12.png  

一個Responsibility只能綁定一個程式的root,所以如果有多個功能,可能要放在同一包應用程式裡面。也有其它使用者在問此問題,但現在並沒有進一步的解法。例如: Oracle論壇,其他使用者提問的 >> 問題
 

Step 03: 清除 Caching Framework & Testing

ADF_Integrate_EBS_12-1.png

ADF_Integrate_EBS_13.png  

 

 

 

 

文章標籤

MIS 發表在 痞客邦 留言(1) 人氣()

這一篇文章主要是在記錄利用 JDeveloper 去部署 (Deploy) ADF 的程式到 Weblogic Server 上。

 

在 Weblogic 建立測試運作的 Server:

 Step01: 登入 weblogic 管理頁面 ( Administration Console )

一般來說預設的 port 是 7001,例:http://lnxap104:7014/console,登入後,要先 Lock & Edit ,Weblogic 主機的維護同時間只能一個人進入操作。

create_server_01.png

 

Step 02: 輸入

*Server Name : AP 要佈署的主機

Server Listen Address :DNS 能解析到的 Host Name

*Server Listen Port: 監聽的 port

create_server_02.png

 

Step 03: 建立新主機的相關資訊,按下 Finish 就建立好了

 

create_server_03.png

Step 04: 進入新建立的主機 TEST_Server 作設定

create_server_04.png

在 Machine 欄位,將此 TEST_Server 選入要放在那一台主機 HOST 上

create_server_05.png

Step 05: 啟動建好的 AP Server

create_server_06.png

記得下面的資訊:

右上角是目前 weblogic 連接的域名 ( Domain ):EBS_domain_TEST32

create_server_07.png

點選 Machines -> lnxap104 後選 Monitoring 可以得知 HOST 上安裝 Weblogic 的版本

create_server_08.png

最後記得要將這些改變保留( Activate Changes)

create_server_08_1.png

PS: JDeveloper Deploy 要連接的主機是 AdminServer(admin),要記得它的 Listen Port:7014

 

用 JDeveloper Deploy ADF 程式在 Weblogic 運作的測試 Server:TEST_Server

 

Step 01: 加入 Weblogic

create_server_09.png create_server_10.png

要選對主機的型態,上面已得知Weblogic 的版本是 10.3

create_server_11.png

輸入 Weblogic 的管理帳號/密碼,帳號預設應是 weblogic

create_server_12.png

這裡要輸入的 port 是要連接主機 AdminServer(admin),它的 Listen Port:7014

create_server_13.png

可以按 Test Connection 測試一下

create_server_14.png

 

Step 02: JDeveloper 開發工具上的環境設定

create_server_15.png

選擇 Application -> APplication Properties 的 Deployment 頁次,將 Auto Generate and Synchronize weblogic-jdbc.xml ... 選項取消

create_server_16.png

Step 03: Deploy ADF to weblogic Server:

create_server_17.png

create_server_18.png

 

選擇剛建立好的連結

create_server_19.png

 

選擇要佈署的主機

create_server_20.png

create_server_21.png

 

從 Deployment - log 視窗可看佈署是否成功

create_server_22.png

 

若是手動佈署的話,要記得作 Servicing all requests

create_server_23.png

 

 

create_server_24.png

 

 

若您撰寫的程式有需要其它的 JAR 檔,請依下列步驟加到 AP Server:TEST_Server 中

Step 01: 選擇要加入的 JAR 檔

create_server_25.png

Step 02: 加入到 AP Server: TEST_Server 主機裡

create_server_26.png

 

 

測試時,記得在網址最後要加入 /faces/程式名

create_server_27.png  

文章標籤

MIS 發表在 痞客邦 留言(0) 人氣()

JSF Expression Language 搭配 JSF 標籤來使用,是用來存取資料物件的一個簡易語言。JSF EL是以#開始,將變數或運算式放置在 { 與 } 之間,例如:#{someBeanName}


變數名稱可以是faces-config.xml中定義的名稱,如果是Bean的話,可以透過使用 '.' 運算子來存取它的屬性,例如:

...
<f:view>
          <h:outputText value="#{userBean.name}"/>
</f:view>
...

 

在JSF標籤的屬性上," 與 " (或'與')之間如果含有EL,則會加以運算,您也可以這麼使用它:

...
<f:view>
            名稱, 年齡:<h:outputText value="#{userBean.name}, #{userBean.age}"/>
</f:view>
...

一個執行的結果可能是這樣顯示的: 名稱, 年齡:Justin, 29

 

EL的變數名也可以程式執行過程中所宣告的名稱,或是JSF EL預設的隱含物件,例如下面的程式使用param隱含物件來取得使用者輸入的參數:

<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %>
<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %>
<%@page contentType="text/html; charset=utf-8"%>
    
<html>
    <head>
        <title></title>
    </head>
    <body>
        <f:view>
                  <b> 您好, <h:outputText value="#{param.name}"/> </b>
        </f:view>
    </body>
</html>

 

param是JSF EL預設的隱含物件變數,它代表request所有參數的集合,實際是一個java.util.Map型態物件,JSF所提供的隱含物件,大致上對應於 JSP 隱含物件,不過JSF隱含物件移除了pageScope與pageContext,而增加了facesContext與view,它們分別對應於 javax.faces.context.FacesContext與javax.faces.component.UIViewRoot。
對於Map型態物件,我們可以使用 '.' 運算子指定key值來取出對應的value,也可以使用 [ 與 ] 來指定,例如:

...
<f:view>
          <b> 您好, <h:outputText value="#{param['name']}"/> </b>
</f:view>
...
 

在 [ 與 ] 之間,也可以放置其它的變數值,例如:


...
 <f:view>
            <h:outputText value="#{someBean.someMap[user.name]}"/>
 </f:view>
...

 

如果變數是List型態或陣列的話,則可以在 [] 中指定索引,例如:

....
<f:view>
           <h:outputText value="#{someBean.someList[0]}"/>
           <h:outputText value="#{someBean.someArray[1]}"/>
           <h:outputText value="#{someBean.someListOrArray[user.age]}"/>  
</f:view>
....

 

您也可以指定字面常數,對於true、false、字串、數字,JSF EL會嘗試進行轉換,例如:

....
<h:outputText value="#{true}"/>
....
<h:outputText value="#{'This is a test'}"/>
....

 

如果要輸出字串,必須以單引號 ' 或雙引數 " 括住,如此才不會被認為是變數名稱。在宣告變數名稱時,要留意不可與JSF的保留字或關鍵字同名,例如不可取以下這些名稱:
 true false null div mod and or not eq ne lt gt le ge instanceof empty

 

使用EL,您可以直接實行一些算術運算、邏輯運算與關係運算,其使用就如同在一般常見的程式語言中之運算。

算術運算子有:加法 (+), 減法 (-), 乘法 (*), 除法 (/ or div) 與餘除 (% or mod) 。下面是算術運算的一些例子:

運算式

結果

#{1}

1

#{1 + 2}

3

#{1.2 + 2.3}

3.5

#{1.2E4 + 1.4}

12001.4

#{-4 - 2}

-6

#{21 * 2}

42

#{3/4}

0.75

#{3 div 4}

0.75,除法

#{3/0}

Infinity

#{10%4}

2

#{10 mod 4}

2,也是餘除

#{(1==2) ? 3 : 4}

4

 

如同在Java語法一樣 ( expression ? result1 : result2)是個三元運算,expression為true顯示result1,false顯示result2。

邏輯運算有:and(或&&)、or(或!!)、not(或!)。一些例子為:

運算式

結果

#{true and false}

false

#{true or false}

true

#{not true}

false

 

關係運算有:小於Less-than (< or lt)、大於Greater-than (> or gt)、小於或等於Less-than-or-equal (<= or le)、大於或等於Greater-than-or-equal (>= or ge)、等於Equal (== or eq)、不等於Not Equal (!= or ne),由英文名稱可以得到lt、gt等運算子之縮寫詞,以下是Tomcat的一些例子:

運算式

結果

#{1 < 2}

true

#{1 lt 2}

true

#{1 > (4/2)}

false

#{1 > (4/2)}

false

#{4.0 >= 3}

true

#{4.0 ge 3}

true

#{4 <= 3}

false

#{4 le 3}

false

#{100.0 == 100}

true

#{100.0 eq 100}

true

#{(10*10) != 100}

false

#{(10*10) ne 100}

false

 

 

左邊是運算子的使用方式,右邊的是運算結果,關係運算也可以用來比較字元或字串,按字典順序來決定比較結果,例如:

運算式

結果

#{'a' < 'b'}

true

#{'hip' > 'hit'}

false

#{'4' > 3}

true

 

EL運算子的執行優先順序與Java運算子對應,如果有疑慮的話,也可以使用括號()來自行決定先後順序。

 

資料來源:http://openhome.cc/Gossip/JSF/JSFExpressionLanguage.htm

文章標籤

MIS 發表在 痞客邦 留言(0) 人氣()

相關套件及安裝順序如下:

1. Apache:httpd-2.2.25-win32-x86-openssl-0.9.8y
2. Microsoft .NET Framework 4 (獨立安裝程式) : dotNetFx40_Full_x86_x64.exe
3. Microsoft Visual C++ 2010 SP1 可轉散發套件 (x86) :vcredist_x86.exe
4. MySQL:MySQL Installer 5.6.16: mysql-installer-community-5.6.16.0.msi
5. PHP VC9 x86 Thread Safe (2014-Mar-06 00:29:49):php-5.4.26-Win32-VC9-x86.zip

 

Setup 01: 安裝 Apache:httpd-2.2.25-win32-x86-openssl-0.9.8y 最簡單,都下一步就可以順利安裝完成,只有預設安裝路徑建議修改為 C:\AppServ\Apache2.2,完成後輸入 http://localhost 應該有下面的畫面

 apache2.2-openssl-installok.png  

接下來安裝 MySQL 之前,需先裝好 Microsoft .NET Framework 4 (獨立安裝程式) : dotNetFx40_Full_x86_x64.exe、以及Microsoft Visual C++ 2010 SP1 可轉散發套件 (x86) :vcredist_x86.exe,又因為 MySQL 被 Oracle 併購了,所以需先申請一個 Oracle 的帳號才能下載,真是麻煩....

Setup 02: 開始安裝 MySQL,選擇 Install MySQL Products

  mysql_welcome.png  

Setup 03: 可以勾選 Skip the check for updates

mysql_online_check.png

 

Setup 04: 預設存放 MySQL 的路徑設在 C:\AppServ\MySQL\ ;資料庫檔案放在:C:\AppServ\MySQL\MySQL Server 5.6\

mysql_type.png

Setup 05: Workbench CE & Connector 會由線上下載後再安裝

mysql_installing.png 

Setup 06: 安裝完後,作初始設定

MySql-configure-1.png  

MySql-configure-2.png MySql-configure-3.png MySql-configure-4.png MySql-configure-overview.png

Setup 07: 作完初始設定後,就可以用 MySQL Workbench 來管理 MySQL

mysql_workbench.png  

 

Setup 08: 安裝 PHP

a) 將 PHP VC9 x86 Thread Safe (2014-Mar-06 00:29:49):php-5.4.26-Win32-VC9-x86.zip 解壓並放在 C:\AppServ\php5,並將目錄下的 php.ini-production 更名為 php.ini ,

b) 修改 php.ini 的內容如下:(參考:http://www.php.net/manual/de/install.windows.manual.php)

; Directory in which the loadable extensions (modules) reside.
extension_dir = "C:/AppServ/php5/ext"

; Windows Extensions
; 啟動幾個常用的 DLL

extension=php_curl.dll
extension=php_gd2.dll
extension=php_ldap.dll
extension=php_mbstring.dll
extension=php_exif.dll      ; Must be after mbstring as it depends on it
extension=php_mysql.dll
extension=php_mysqli.dll

session.save_path = "C:/AppServ/php_session_temp"

 

 Setup 09: 修改 C:\AppServ\Apache2.2\conf\httpd.conf (參考:http://www.php.net/manual/de/install.windows.apache2.php)

在LoadModule系列最後加上一行: (改成實際PHP安裝路徑)
PHPIniDir "C:/AppServ/php5/"
LoadModule php5_module "C:/AppServ/php5/php5apache2_2.dll"

在<IfModule mime_module>區塊中加上一行:
AddHandler application/x-httpd-php .php

在<IfModule dir_module>區塊中修改DirectoryIndex此行:
DirectoryIndex index.php index.html index.htm

 

Setup 10: 測試 PHP

在Apache設定的DocumentRoot中新增一個php檔案(預設路徑: C:\AppServ\Apache2.2\htdocs)
例如: phpinfo.php, 內容為: (可用phpinfo()函式)

在瀏覽器中測試 (需重新啟動Apache或重開機)
http://127.0.0.1/phpinfo.php

 apache_php_test_ok.png  

 

 

 

參考:

http://blog.roodo.com/esabear/archives/15069653.html

http://shaurong.blogspot.tw/2013/10/apache-php-mysql-on-win7.html

 

MIS 發表在 痞客邦 留言(3) 人氣()

環境:

JBoss: 7.1.1.Final 下載地址: http://www.jboss.org/jbossas/downloads

JDK  下載地址:http://www.oracle.com/technetwork/java/javase/downloads/index.html

Windows 8 x64bit

Oracle Linux 6.5 x64bit

 

一、安裝 JBoss 7.x

1) 將 jboss-as-7.1.1.Final.zip 解壓到 C:\AppServ\jboss-as-7.1.1.Final ( Linux:jboss-as-7.1.1.Final.tar.gz 解壓到 \opt\jboss-as-7.1.1.Final )

2) 安裝 jdk-7u45 後,複制到 D:\Progs\jdk1.7.0_45_x64

3) 修改 C:\AppServ\jboss-as-7.1.1.Final\bin\standalone.bat

Windows:
set JAVA_HOME="D:\Progs\jdk1.7.0_45_x64"

4) 啟動JBoss。

在 Windows 平台執行 D:\programs\jboss-as-7.1.1.Final\bin\standalone.bat 完成啟動。

在 Linux 平台執行 /opt/jboss-as-7.1.1.Final/bin/standalone.sh 完成啟動

5) 停止 JBoss

Windows / Linux 平台:在Server的命令列控制台,只要按下 Ctrl + C 就能夠乾淨的停止這個Server。

 

二、增加管理使用者

訪問該Web伺服器時,提示新增用戶。可在服務端執行add-user.bat / add-user.sh 來添加管理員用戶。

Windows: C:\AppServ\jboss-as-7.1.1.Final\bin\add-user.bat
Linux: /opt/jboss-as-7.1.1.Final/bin/add-user.sh
What type of user do you wish to add?
 a) Management User (mgmt-users.properties)
 b) Application User (application-users.properties)
(a):

選擇 a) 按 Enter

Enter the details of the new user to add.
Realm (ManagementRealm) :              // 直接按 Enter ,使用預計值
Username :                                       // 填寫管理員用戶名
Password :
Re-enter Password :

添加管理員後,訪問 http://127.0.0.1:9990/console 

 

三、外面的使用者流覽設定:

如:http://192.168.3.50:8080/  是無法訪問的。因為部署完後,預設只能本機端訪問(即:只有 http://127.0.0.1/localhost 能訪問),如果想讓其他人也可以訪問你的網頁,需要修改JBoss的設定檔,即修改 standalone.xml,增加本機Web位址的內容。

1) 打開  standalone.xml

Window: C:\AppServ\jboss-as-7.1.1.Final\standalone\configuration\standalone.xml
Linux: /opt/jboss-as-7.1.1.Final/standalone/configuration/standalone.xml

2) 修改如下,即可讓外部電腦流覽,但只有主機可以管理

 
        <interface name="management">
            <inet-address value="${jboss.bind.address.management:127.0.0.1}"/>
        </interface>
        <interface name="public">
             <any-address/>
        </interface>

重新啟動JBoss,即可讓外面的使用者流覽。

 

參考:

http://www.cnblogs.com/xw-cnblogs/articles/2439969.html

http://wenku.baidu.com/view/b92437c9a1c7aa00b52acb67.html

 

MIS 發表在 痞客邦 留言(0) 人氣()

在 Oracle 的開發工具 JDeveloper 11g/12c 中除了支援 SVN Server ( Subversion ) 外,也支援 git ,但測試了 git 目前在繁體中文的 Windows 平台上支援並不好,不過摸了幾天,還是記錄一下配置心得。

環境:

1. git server 1.7.x on Oracle Linux 6.5

2. gitweb 1.7 on apache 2.x

3. git clinet on windows 8 downloadGit-1.8.5.2-preview20131230.exe

 一、安裝 git server

git_package.png  

# rpm -qa | grep git
gitweb-1.7.1-3.el6_4.1.noarch
git-1.7.1-3.el6_4.1.x86_64

二、設定 git repository:project.git 在 /opt/git_root 目錄下

# pwd
/opt/git_root
# mkdir project.git
# cd project.git/
# git init --bare
Initialized empty Git repository in /opt/git_root/project.git/

註:可以修改 /opt/git_root/project.git/description 來說明此專案目的

# vi description
git Version Control Project

三、設定 repository:project.git 權限給 AD 的 Domain Users 有權限存放資料,參考:AD Account Login Linux Server (oracle linux 與 Windows AD 帳號認證整合)

# ls -al
total 40
drwxr-xr-x. 7 root root 4096 Jan 21 12:05 .
drwxr-xr-x. 3 root root 4096 Jan 21 11:35 ..
drwxr-xr-x. 2 root root 4096 Jan 21 11:35 branches
-rw-r--r--. 1 root root  150 Jan 21 12:04 config
-rw-r--r--. 1 root root   73 Jan 21 11:35 description
-rw-r--r--. 1 root root   23 Jan 21 11:35 HEAD
drwxr-xr-x. 2 root root 4096 Jan 21 11:35 hooks
drwxr-xr-x. 2 root root 4096 Jan 21 11:35 info
drwxr-xr-x. 7 root root 4096 Jan 21 11:49 objects
drwxr-xr-x. 4 root root 4096 Jan 21 11:35 refs

# chown -R root."WEI\Domain Users" refs/
# chown -R root."WEI\Domain Users" objects/
# chmod 775 -R refs/
# chmod 775 -R objects/

四、設定 gitweb:gitweb 預設安裝到了/var/www/git 下,其設定檔在 /etc/gitweb.conf ,另外,httpd 的設定檔為 /etc/httpd/conf.d/git.conf。

1) 修改 /etc/gitweb.conf

# vi /etc/gitweb.conf
our $projectroot = "/var/www/git";

2) 修改 /etc/httpd/conf.d/git.conf

# vi /etc/httpd/conf.d/git.conf
Alias /git /var/www/git
<Directory /var/www/git>
        Allow from all
        AllowOverride all
        Order allow,deny
        Options +ExecCGI
        AddHandler cgi-script .cgi
        DirectoryIndex gitweb.cgi
        SetEnv GITWEB_CONFIG /etc/gitweb.conf
        Dav On
        RewriteEngine Off
</Directory>

3) 重啟 apache server
# service httpd restart

4) 將 Git repository in /opt/git_root/project.git 連結到 /var/www/git 下

# ln -s /opt/git_root/project.git /var/www/git

5) 在 windows 平台用流覽器查看

gitweb_viewProject.png  
 六、測試

1) 在 windows 平台上安裝 Git-1.8.5.2-preview20131230.exe ,並將目錄 C:\Program Files (x86)\Git\cmd 加入 Windows 環境變數的 PATH  中

2) 在 windows 平台上將 Linux 主機上 git repository:project.git  clone 到 D:\git_repo 目錄下,並設定 D:\git_repo\project.git 資料夾為 UTF-8 編碼

D:\git_repo>git clone polin.wei@oradb12clinux:/opt/git_root/project.git
Cloning into 'project'...
polin.wei@oradb12clinux's password:
warning: You appear to have cloned an empty repository.
Checking connectivity... done.

設定 D:\git_repo 目錄編碼為 utf-8:
    在 D:\git_repo\project.git 資料夾上,以滑鼠右鍵點選 Git Gui。
    按「Edit」,再點選「Option」。
    將 Global (All Repositories) 的「Default File Contents Encoding」改變為「utf-8」後,按「Save」。

3) 建立一份文字檔 readme.txt,內容為 "這是第一份文件"

D:\git_repo>cd project
D:\git_repo\project>notepad readme.txt
D:\git_repo\project>type readme.txt
這是第一份文件

4) commint 文件內容

D:\git_repo\project>git commit (這說明應該是:git 測試,但它變成了 git 晴)

git_vim_windows_commit.png  
[master (root-commit) 9ccc88e] git 晴
 1 file changed, 1 insertion(+)
 create mode 100644 readme.txt

Warning: Your console font probably doesn't support Unicode. If you experience s
trange characters in the output, consider switching to a TrueType font such as L
ucida Console!

5) 將文件上載到 git server on linux

D:\git_repo\project>git push origin master
polin.wei@oradb12clinux's password:
Counting objects: 3, done.
Writing objects: 100% (3/3), 232 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To polin.wei@oradb12clinux:/opt/git_root/project.git
 * [new branch]      master -> master

6) 使用 git gui 工具上傳,操作順序為:
  a. Rescan 查看有沒有文件被修改
  b. Stage Changed 設定文件內容為已被修改
  c. Commit 文件內容確認
  d. Push 到 Linux 主機上 git repository:project.git

git_gui_modify.png  

7) 再一次在 windows 平台用流覽器查看

gitweb_view_summary.png  

 

參考:

http://git-scm.com/book/en/Git-on-the-Server-Setting-Up-the-Server

http://blog.xuite.net/yctseng/notes/35220134-gitweb

http://phpbb-tw.net/phpbb/viewtopic.php?t=53959

http://www.linuxso.com/linuxrumen/40000.html

http://www.linuxso.com/linuxrumen/40005.html

MIS 發表在 痞客邦 留言(0) 人氣()

程式碼的版本控制除了之前介紹的 CVS Server in Linux & Jdeveloper OAF in Window 開發環境的整合設定 ,還有功能較為強大的 SVN Server ( Subversion ),相信這兩個程式版本控制服務應該可以符合大部份開發人員對於版本控制的要求了。若是想架設在 Windows 平台的話,可以參考 Apache/2.0.59 (Win32) 與 SVN/1.4.3 的安裝 & Apache/2.0.59 (Win32) 與 SVN/1.4.3 對 AD 的認證  。

環境:

Oracle Linux:Oracle Linux Release 6 Update 5 for x86_64 (64 Bit)
    host: oradb12clinux
    ip: 192.168.3.50

SVN Server ( Subversion ):subversion-svn2cl-1.6.11-9.el6_4.noarch

Apache Server:1.6.11-9:httpd-2.2.15-26.0.1.el6.x86_64

認證套件:mod_dav_svn-1.6.11-9.el6_4.x86_64

Windows AD:Windows Server 2003    host: adserver.wei.com
    ip: 192.168.2.1

 Windows Client :TortoiseSVN

一、安裝相關套件

 svn_package  

# rpm -qa | grep httpd
httpd-tools-2.2.15-26.0.1.el6.x86_64
httpd-2.2.15-26.0.1.el6.x86_64
httpd-manual-2.2.15-26.0.1.el6.noarch

# rpm -qa | grep svn
mod_dav_svn-1.6.11-9.el6_4.x86_64
git-svn-1.7.1-3.el6_4.1.noarch
ltrace-0.5-23.45svn.el6.x86_64
subversion-svn2cl-1.6.11-9.el6_4.noarch

二、建立 SVN Server ( Subversion ) 的 repository 與權限設定

1) 執行 # svnadmin create /opt/svn_root/ebs_source , 這是為了要建立 SVN Server 的 repository

# svnadmin create /opt/svn_root/ebs_source
# ls -al ebs_source/
total 32
drwxr-xr-x. 6 root root 4096 Jan 17 11:08 .
drwxr-xr-x. 3 root root 4096 Jan 17 11:08 ..
drwxr-xr-x. 2 root root 4096 Jan 17 11:08 conf
drwxr-sr-x. 6 root root 4096 Jan 17 11:08 db
-r--r--r--. 1 root root    2 Jan 17 11:08 format
drwxr-xr-x. 2 root root 4096 Jan 17 11:08 hooks
drwxr-xr-x. 2 root root 4096 Jan 17 11:08 locks
-rw-r--r--. 1 root root  229 Jan 17 11:08 README.txt

 

2) 執行 htpasswd 建立檔案型認證檔:passwd ,新增使用者 polinwei & u01
# htpasswd -c /opt/svn_root/ebs_source/conf/passwd polinwei ==> passwd 檔案不在時, htpasswd 參數要下 -c
New password:
Re-type new password:
Adding password for user polinwei

# htpasswd /opt/svn_root/ebs_source/conf/passwd u01 ==> passwd 檔案己存在時, htpasswd 參數不要下 -c
New password:
Re-type new password:
Adding password for user u01

# cat /opt/svn_root/ebs_source/conf/passwd
polinwei:rOocF4eiWllRQ
u01:VHkwsuykRzVlM

3) 維護 Repository:ebs_source 的存取權限

# vi /opt/svn_root/ebs_source/conf/authz
[groups]
admins = polinwei
users  = u01
oracle_ebs_group = polinwei

[ebs_source:/] ==> 這就是 repository 的根目錄
* = r
@admins = rw
@oracle_ebs_group = rw
@users = r

#可以對每個 repository 下的目錄再作權限管理

[ebs_source:/wei]
@oracle_ebs_group = rw

[ebs_source:/test]
@admins = rw
@users = r

 4) svnserve.conf 設定檔原則上是可以不需修改,使用預設值即可

 

二、設定 apache 對 SVN Server ( Subversion ) 的存取權限

1)  編輯 Apache 的 httpd.conf

因檔案 /etc/httpd/conf/httpd.conf 中有  Include conf.d/*.conf 

# vi /etc/httpd/conf/httpd.conf
#
# Load config files from the config directory "/etc/httpd/conf.d".
#
Include conf.d/*.conf

所以只要編輯  /etc/httpd/conf.d/subversion.conf

# vi /etc/httpd/conf.d/subversion.conf

LoadModule dav_svn_module     modules/mod_dav_svn.so
LoadModule authz_svn_module   modules/mod_authz_svn.so

# 對 SVN Respository : ebs_source 作設定
<Location /ebs_source>
   DAV svn
   SVNPath /opt/svn_root/ebs_source
   AuthType Basic
   AuthName "Subversion repository"
   AuthzSVNAccessFile /opt/svn_root/ebs_source/conf/authz
   AuthUserFile /opt/svn_root/ebs_source/conf/passwd
   Require valid-user
</Location>

2) 變更 SVN Respository : ebs_source 實體目錄權限

# chown -R apache.apache ebs_source
# chcon -R -t httpd_sys_content_t ebs_source

3) 重啟 Apache 服務,與測試;網址應為 http://oradb12clinux/ebs_source/

# service httpd restart


svn_jdeveloper_client.png  

三、SVN Server ( Subversion ) 的存取權限與 Windows AD 帳號/密碼作整合

1) 將檔案型:認證密碼檔 passwd 前加 #,並設定對 Windows AD 以 LDAP 加 SSL 作認證

# vi /etc/httpd/conf.d/subversion.conf

<Location /ebs_source>
   DAV svn
   SVNPath /opt/svn_root/ebs_source
   AuthType Basic
   AuthName "Subversion repository"
   AuthzSVNAccessFile /opt/svn_root/ebs_source/conf/authz
#   AuthUserFile /opt/svn_root/ebs_source/conf/passwd
   Require valid-user

   SSLRequireSSL
   AuthzLDAPAuthoritative Off
   AuthLDAPURL ldap://adserver.wei.com:389/o=wei?cn?sub
   AuthBasicProvider ldap
</Location>

2) 維護 Repository:ebs_source 的存取權限

# vi /opt/svn_root/ebs_source/conf/authz
[groups]
admins = polinwei
users  = u01
oracle_ebs_group = polinwei,polin.wei

[ebs_source:/] ==> 這就是 repository 的根目錄
* = r
@admins = rw
@oracle_ebs_group = rw

#可以對每個 repository 下的目錄再作權限管理,注意:若目錄下權限群組名:oracle_ebs_group 沒定對時,會造成所有人沒有權限進入repository 的根目錄

[ebs_source:/wei]
@oracle_ebs_group = rw

[ebs_source:/test]
@admins = rw
@users = r

 

3) 重啟 Apache 服務,與測試;注意網址變為 https (port:443 SSL協定) https://oradb12clinux/ebs_source/ ;認證則為 windows AD 裡的帳號/密碼

# service httpd restart

 svn_ad_user_auth.png  

 

 

文章標籤

MIS 發表在 痞客邦 留言(0) 人氣()

為了在Windows主機間達到資源共享的目的,微軟發展出 SMB(Server Message Block)通訊協定,利用其網路芳鄰共享檔案系統及印表機等資源;而Samba在Linux主機上實現SMB通訊協定的系統,達成Windows與 Linux主機的資源共享,再搭配 Winbind 模組解決 Samba 中統一登入問題。因為 Linux Server 愈來愈多,為了可以達到統一單一帳號來達到管理,因此; 接下來我們要利用 samba、winbind 來整合 AD 帳號,這樣我們就可以在 AD 管理帳號就可以了。

環境:

Windows Server 2003 AD Server: ADSERVER.WEI.COM (192.168.2.1)

Oracle Linux R6.5 for x86_64 (64 Bit) :cvs.wei.com (192.168.2.69)

一、Linux 相關套件安裝與設定

1) 在安裝 Linux 主機時,可以選取相關的套件

samba_krb5_package.png samba_winbind_package.png  

2) 檢查/驗證一下相關的套件是否有裝

[root@cvs ~]# rpm -qa | grep samba
samba-common-3.6.9-164.el6.x86_64
samba-client-3.6.9-164.el6.x86_64
samba4-libs-4.0.0-58.el6.rc4.x86_64
samba-winbind-3.6.9-164.el6.x86_64
samba-3.6.9-164.el6.x86_64
samba-winbind-clients-3.6.9-164.el6.x86_64


[root@cvs ~]# rpm -qa | grep winbind
samba-winbind-3.6.9-164.el6.x86_64
samba-winbind-clients-3.6.9-164.el6.x86_64


[root@cvs ~]# rpm -qa | grep krb5
krb5-workstation-1.10.3-10.el6_4.6.x86_64
krb5-server-1.10.3-10.el6_4.6.x86_64
pam_krb5-2.3.11-9.el6.x86_64
krb5-libs-1.10.3-10.el6_4.6.x86_64

3) 使用 UI 工具來作設定

winbind_auth.png

 

winbind_auth_adv.png  

設定好後 Apply,然後記得要在 Identity & Authentication 按下 Join Domain,在 AD 的 Computers 中應該可以看到此 Linux : cvs 主機

winbind_join_domain.png winbind_join_domain_win.png  

 

4) 啟動 Samba & Winbind Services

winbind_smb_enable_service.png  

5) 最後使用 AD Domain User 來作登入測試,應該就可以成功了。

winbind_domainUser_login.png  

6) 若有目錄要給 AD Domain Users 群組可以使用, 可以用指令 # chown -R root:"WEI\Domain Users" /opt/cvs_root/ 來賦予.

Oracle Linux 在使用 samba、winbind 來整合 AD 帳號的 UI 畫面已經整合的非常好,/etc/samba/smb.conf & /etc/krb5.conf 都不需去多作編輯:只有 /var/kerberos/krb5kdc/kdc.conf 檔案內容中的 EXAMPLE.COM 要改成您的 AD 網域(如:WEI.COM),以及將 master_key_type 前的 # 去除即可。相關檔案如下:

[root@cvs samba]# cat /etc/samba/smb.conf
#======================= Global Settings =====================================

[global]
#--authconfig--start-line--

# Generated by authconfig on 2014/01/15 15:41:06
# DO NOT EDIT THIS SECTION (delimited by --start-line--/--end-line--)
# Any modification may be deleted or altered by authconfig in future

   workgroup = WEI
   password server = ADSERVER.WEI.COM
   realm = WEI.COM
   security = ads
   idmap config * : range = 16777216-33554431
   template shell = /bin/bash
   winbind use default domain = false
   winbind offline logon = true

#--authconfig--end-line--

 

[root@cvs samba]# cat /etc/krb5.conf
[logging]
 default = FILE:/var/log/krb5libs.log
 kdc = FILE:/var/log/krb5kdc.log
 admin_server = FILE:/var/log/kadmind.log

[libdefaults]
 default_realm = WEI.COM
 dns_lookup_realm = false
 dns_lookup_kdc = false
 ticket_lifetime = 24h
 renew_lifetime = 7d
 forwardable = true

[realms]
 EXAMPLE.COM = {
  kdc = kerberos.example.com
  admin_server = kerberos.example.com
 }

 WEI.COM = {
  kdc = ADSERVER.WEI.COM
 }

[domain_realm]
 .example.com = EXAMPLE.COM
 example.com = EXAMPLE.COM

 

# vi /var/kerberos/krb5kdc/kdc.conf
[kdcdefaults]
 kdc_ports = 88
 kdc_tcp_ports = 88

[realms]
 WEI.COM = {
  master_key_type = aes256-cts
  acl_file = /var/kerberos/krb5kdc/kadm5.acl
  dict_file = /usr/share/dict/words
  admin_keytab = /var/kerberos/krb5kdc/kadm5.keytab
  supported_enctypes = aes256-cts:normal aes128-cts:normal des3-hmac-sha1:normal arcfour-hmac:normal des-hmac-sha1:normal des-cbc-md5:normal des-cbc-crc:normal
 }

 

二、Samba 3.x 伺服器設定說明

設定Samba最基礎的項目就是指定工作群組名稱(workgroup)及網域名稱,編輯 Samba設定檔smb.conf,以下設定都在該檔案內[global]標籤下同一段落完成。
/etc/samba/smb.conf

workgroup = WEI
realm = WEI.COM

 

避免分享資源時出現亂碼,分別設定Windows、Linux的字集。

display charset = Big5
dos charset = CP950

 

使用AD網域認證必須修改Samba的安全層級,並指定認證主機及增加Windows網路相關設定。

security = ads
password server = ADSERVER.WEI.COM
wins server = ADSERVER.WEI.COM
encrypt passwords = yes

 

Linux預設的使用者家目錄為/home/使用者名稱,針對AD網域使用者 必須另行設定其家目錄位置,主要參數為:%D代表網域名稱、%U代表使用者名稱。以下設定目的為讓網域使用者的家目錄集中在/home/網域名稱/目錄下 並以使用者帳號命名,同時讓使用者帳號自動套用網域名稱及不允許使用者離線登入。

template homedir = /home/%D/%U
winbind use default domain = false
winbind offline logon = true

 

設定AD網域使用者帳號對應到Linux使用者帳號及群組的範圍。

idmap config * : range = 16777216-33554431

 

預設Winbind快取時間為300秒,使用指令# getent passwd或# getent group時,會將NT/AD網域的使用者與群組一併列出。當使用者、群組數量太多,Winbind會無法正常傳回資料,開啟此功能可以避免這個狀況。

winbind enum users = yes
winbind enum groups = yes
winbind cache time = 300

 

若允許AD網域使用者以終端機方式登入系統,可指定AD帳號的Shell。

template shell = /bin/bash

 

視需要開啟對NT ACLs(Access Control List) 的支援。

nt acl support = yes

 

三、整合Windows AD網域帳號資訊說明

當系統查詢使用者帳號與群組時,預設由檔案尋找(/etc/passwd、/etc/group),為了使其搜尋不到相關資訊時,轉而使用Winbind向AD網域查詢,必須設定認證來源和順序。
/etc/nsswitch.conf

passwd: files winbind
shadow: files winbind
group: files winbind

 

設定本機 UID 與 GID 發放範圍,避免 AD 帳號與 Linux 本機帳號衝突,限制本機分配給新使用者的uid、gid不要超過9999。
/etc/login.defs

UID_MIN 500
UID_MAX 9999
GID_MIN 500
GID_MAX 9999
CREATE_HOME yes

 

四、Linux Server加入AD網域

在將主機加入網域之前,需先確認AD主機及Linux主機時間不得相差超過5分鐘,建議設定同一網路校時服務(Network Time Protocol),並設定DNS或host使Linux主機得知AD網域伺服器的IP位址,任修改其中一種能查詢到網域即可。
/etc/resolv.conf

Nameserver 192.168.2.1

/etc/hosts

192.168.2.1        adserver.wei.com

 

由於Windows Server 2003的AD是採用Kerberos的認證機制,因此必須設定Kerberos相關設定檔以便和AD溝通。
/etc/krb5.conf

[logging]
 default = FILE:/var/log/krb5libs.log
 kdc = FILE:/var/log/krb5kdc.log
 admin_server = FILE:/var/log/kadmind.log

[libdefaults]
 default_realm = WEI.COM
 dns_lookup_realm = false
 dns_lookup_kdc = false
 ticket_lifetime = 24h
 renew_lifetime = 7d
 forwardable = true

 WEI.COM = {
  kdc = ADSERVER.WEI.COM
 }

/var/kerberos/krb5kdc/kdc.conf

[kdcdefaults]
 kdc_ports = 88
 kdc_tcp_ports = 88

[realms]
 WEI.COM = {
  master_key_type = aes256-cts
  acl_file = /var/kerberos/krb5kdc/kadm5.acl
  dict_file = /usr/share/dict/words
  admin_keytab = /var/kerberos/krb5kdc/kadm5.keytab
  supported_enctypes = aes256-cts:normal aes128-cts:normal des3-hmac-sha1:normal arcfour-hmac:normal des-hmac-sha1:normal des-cbc-md5:normal des-cbc-crc:normal
 }

 

完成以上設定後重新啟動Samba及Winbind並加入設開機啟動。

# service smb restart
# service winbind restart
# chkconfig smb on
# chkconfig winbind on

 

文字模式下指令加入wei.com 網域,aduser為AD網域之使用者,只需一般權限即可。

# net ads join -U aduser
aduser's password:

 

設定與AD伺服器溝通時的使用者(經測試是不需要作此動作的)。

# wbinfo --set-auth-user=aduser
Password:

 

一般Windows使用者在加入網域後存取不會有太大的問題,但Linux Clients使用者需要向Kerberos要求憑證(ticket)。可下指定測試取得Kerberos核發的憑證,取得後使用者不需要再輸入帳號密碼 存取資源,注意網域名稱要大寫,若密碼正確會跳回命令提示字元。

# kinit 網域帳號@WEI.COM

 

取得Kerberos核發的憑證後,可以看Kerberos核發的Kicket狀態。

# klist

 

測試讀取AD帳號資訊和取得系統帳號資訊。

# wbinfo -u | -g 取得網域帳號 | 群組
# getent passwd

 

參考文件:

http://michaeljoking.myip.org/modules/tad_book3/page.php?tbdsn=18

http://blog.yam.com/gavint/article/2590383

文章標籤

MIS 發表在 痞客邦 留言(0) 人氣()

整合環境:

JDeveloper OAF in Windows 8:
Patch 17888411 for Oracle EBS R12.2.3
PC IP: 192.168.3.116

CVS Server in Oracle Linux:
R6.4 Kernel: 2.6.39-400.17.eluek.x86_64
Server IP: 192.168.3.50
HostName: oradb12clinux

一、安裝CVS

一般 Oracle Linux 已經內含 CVS 的套件[ cvs-1.11.xx(x86_64) & cvs-inetd-1.11.x(noarch) ],在安裝時記得勾選即可,若忘記勾選,等系統安裝完再從光碟安裝也可以。

csv_install  
  

1.先查看是否安裝 cvs,一般安裝在 /usr/bin/cvs

# which cvs
/usr/bin/cvs

# rpm -qa | grep cvs
cvs-1.11.23-15.el6.x86_64
cvs-inetd-1.11.23-16.el6.noarch

二、建立 Users and Groups

1. 建立cvs user group,便於管理cvs User
#groupadd cvs

2. 建立cvsroot User,屬於 cvs 群組,根目錄為/opt/cvs,不允許 login
# useradd -M -g cvs -s /sbin/nologin cvs <- 建立 cvs 的帳戶, 不建立 User Home: /home/cvs

3. 若需要建立 anonymous 帳號
# useradd -M -s /sbin/nologin anonymous

4. 將系統內其他會使用到 cvs 的 User 加入到 cvs 的 Group 中
# vi /etc/group
cvs:x:501:polinwei,anonymous,cvs

三、設定環境變數
# vi /etc/profile.d/cvs.sh 
export CVSROOT=/opt/cvs_root
export CVS_RSH=ssh (為了在 Windows 平台上的 JDeveloper 連入, 使用 SSH 連結較安全)

立即生效此環境變數
1) 重新登入
2) # export CVSROOT=/opt/cvs_root

四、建立目錄,改變/opt/cvs_root 的目錄屬性
# mkdir /opt/cvs_root
# chmod 775 /opt/cvs_root

五、初始化 Repository
# cvs init ( 或 # cvs -d /opt/cvs_root init ) <- 此指令會呼叫 $CVSROOT 環境變數,並在目錄 /opt/cvs_root 下建立目錄 CVSROOT
# chown -R root:cvs /opt/cvs_root
 
若是沒有指定 $CVSROOT 環境變數則使用下列參數
# cvs -d :localhost:/opt/cvs_root init

因為用 local 的模式在用 cvs,所以不用登入(login)
-d 是指定 CVSROOT 路徑,如果沒設環境變數就要使用此參數
init 代表要初始化 /opt/cvs 這個目錄

六、設定 xinetd
1) 在 /etc/xinetd.d/ 內已有 cvs 的設定檔
# vi /etc/xinetd.d/cvs
service cvspserver
{
        disable = no
        port                    = 2401
        socket_type       = stream
        protocol              = tcp
        wait                    = no
        user                    = root
        passenv              = PATH
        server                 = /usr/bin/cvs
        env                     = HOME=/opt/cvs_root
        server_args        = -f --allow-root=/opt/cvs_root pserver
        bind                    = 192.168.3.50
}
紅色的部份要注意,env 參數必須跟你所放置 CVS 目錄的位置一樣,server_args為登入時會用到的目錄名,bind 的 IP 改成您 Linux Server 的 IP。

2) 重新啟動 xinetd 並啟動 CVS Server
# service xinetd restart
# chkconfig cvs on

3) 檢查cvspserver服務是否已經啟動
# netstat -l |grep cvspserver

其結果如下:
tcp   0  0 oradb12clinux:cvspserver  *:*    LISTEN 

七、登入
若要使用其它使用者的話,指令: cvs -d :pserver:user_name@ip_address:/opt/cvs login

# cvs -d :pserver:polinwei@localhost:/opt/cvs_root login
Logging in to :pserver:cvs@localhost:2401/opt/cvs
CVS password:
cvs [login aborted]: connect to [localhost]:2401 failed: Connection refused

# cvs -d:pserver:polinwei@oradb12clinux:/opt/cvs_root login
Logging in to :pserver:polinwei@oradb12clinux:2401/opt/cvs_root
CVS password:
[root@oradb12clinux CVSROOT]#
若正確則會直接回到 # 提示符號,表示 CVS Server 已正常運作

八、Windows Client 程式端 JDeveloper 的設定

1) 設定CVS連結

01_cvs_conn02_cvs_ssh

注意: Repository Path 是設定 Linux 主機端上的目錄,為 /opt/cvs_root

03_cvs_root04_cvs_test  

 

2) 將 oracle 的 workplace 當作 CVS 的 module 滙入 (import) 及 匯出 (Checkout)

cvs_import_01.png

cvs_import_02.png

cvs_import_03.png

CVS 的匯入其實是將整個目錄下的資料 import 進來

cvs_import_04.png

選擇那些檔案不要匯入

cvs_import_05.png

滙入完後是否執行 checkout

cvs_import_06.png

cvs_import_07.png

輸入Linux主機上此帳號的密碼

cvs_import_08.png  

因在 import 後有執行 Checkout,發現在 JDevloper 上的 程式架構都亂七八糟了。沒關係,先將這些都移除

cvs_checkout_remove.png  
  

3) 將 CVS 的 Module: toolbox 滙出至 %JDEV_USER_HOME% 目錄下

 cvs_checkout_01.png

cvs_checkout_02.png  

將這些再從 JDeveloper 中再移除一次, 將檔仍會留在 %JDEV_USER_HOME%/toolbox 目錄下

cvs_checkout_remove.png

從目錄 %JDEV_USER_HOME%/toolbox 再將 toolbox.jws 加入

cvs_checkout_03.png

就可以看到已有 CVS 程式序號控制了.

cvs_checkout_04.png  

可以發現為何 test_fwktutorial.jsp 沒有序號控制呢? 那是因為這些共用程式是放在 %JDEV_USER_HOME%/myhtml 下的.


A. 額外進階設定:pserver (Password Server) 帳號/密碼設定

1) 為避免其它人經由 cvs 來 try password,建議可以 cvs 帳號和系統帳號分開。
# vi /opt/cvs/CVSROOT/passwd <- 該檔原本並不存在
格式為:帳號:密碼:系統帳號
ex: jdev_user:xxxxxx:usercvs

a. jdev_user 為登入 cvs 的帳號,/etc/passwd 內不需要有這個帳號
b. xxxxxx 為登入的密碼,經由 md5 編碼過,由此密碼可以建立 /opt/cvs/passwdgen.pl 來產生,如果需要密碼為:123456,則敲入# /opt/cvs/CVSROOT/passwdgen.pl "123456" ,回傳即可得到加密密碼,用其替換 passwd 檔中的 xxxxxx
c. cvs 登入後對應到 /etc/passwd 內這個帳號的權限

/opt/cvs/passwdgen.pl 檔案建立:

# su - cvs
> vi /opt/cvs/passwdgen.pl
#!/usr/bin/perl
srand (time());
my $randletter = "(int (rand (26)) + (int (rand (1) + .5) % 2 ? 65 : 97))";
my $salt = sprintf ("%c%c", eval $randletter, eval $randletter);
my $plaintext = shift;
my $crypttext = crypt ($plaintext, $salt);
print "${crypttext}\n";

改變權限及owner
#chmod 755 passwdgen.pl
#chown cvs:cvs passwdgen.pl

2) 編輯 /opt/cvs/CVSROOT/config
將 #SystemAuth=no 前的注解拿掉,該行的意思是登入的帳號不在 cvs 的 passwd 裡時,是否要對應到系統帳號。

設定 CVS 執行時所需的 lock 的目錄:LockDir=/opt/cvs_root/lock,並建立及改變此目錄權限
# pwd
/opt/cvs_root
# mkdir lock
# chmod -R 775 lock
# chown -R root:cvs lock
# service xinetd restart

3) 增加 anonymous 登入
新增 anonymous:md5密碼:nobody 至 /opt/cvs/CVSROOT/passwd 中
表示 anonymous 登入的權限是 nobody
若新增此行則 /cvs 需修改權限
#chmod o+rx /cvs

4) 設定 anonymous 權限為唯讀
# vi /opt/cvs/CVSROOT/readers
anonymous <- 新增 anonymous,該檔列表內所有帳號都只有唯讀權限,格式為一行一個帳號。

B. 指令模式
 cvs -d "CVSROOT" command
 若有用環境變數指定 CVSROOT,則可省略 -d "CVSROOT" 的參數
 CVSROOT 通常為 ":pserver:user_name@ip_address:cvs_path" 的格式,如:# export CVSROOT=:pserver:jdev_user@localhost:/opt/cvs

 cvs -d "CVSROOT" login:登入
 cvs -d "CVSROOT" import profile:將 profile 這個專案新增到 server 上
 cvs -d "CVSROOT" checkout profile:將 server 上 profile 專案整個抓下來
 cvs -d "CVSROOT" logout:登出
 cvs status <project>:列出該 project 內每個檔案的記錄
 cvs history <project>:列出該 project 內每個檔案的修改歷史記錄
 cvs annotate <pooject>:列出該 project 內每個檔案最後一次修改的記錄 

參考:

http://hsinichi.pixnet.net/blog/post/4524770-cvs-server-for-linux-%E5%AE%89%E8%A3%9D%E6%AD%A5%E9%A9%9F

http://blog.yam.com/gavint/article/2590383

http://forums.gentoo.org/viewtopic-t-55659-start-0.html

http://www.chedong.com/tech/cvs_card.html

http://www.crazysquirrel.com/computing/debian/servers/cvs.jspx

文章標籤

MIS 發表在 痞客邦 留言(0) 人氣()