當報表開發好之後,我們會先在源環境將其歸檔(打包),在歸檔時會根據需要選擇是否保留權限及時間戳。
然後將生成的.catalog文件取消歸檔(部署)到目標環境。在部署的時候我們可以選擇“是否替換"目標環境已有的項目,以及如何處理ACL(權限)
其中各項的含義在此不在贅述。
下面我們只談一種特定的情況,什麼情況呢?
假設在源環境/shared目錄下有一個新的子目錄叫 "Sales",裏面存放了和Sales相關的分析。當開發完成之後,我們會對Sales這個目錄進行歸檔(weblogic帳號),在歸檔的時候
只選擇“保留時間戳”,不保留權限,然後生成Sales.catalog。
之後我們將Sales.catalog部署到目標環境的/shared目錄之下,部署時ACL選項爲“保留”。
目標環境/shared目錄的授權情況爲BIAdministrator可以完全控制,BIConsumer爲只讀。
部署完成之後,/shared/Sales目錄及其子項的權限爲:BIAdministrator可以完全控制,BIConsumer爲只讀。
雖然,我們在歸檔的時候選擇的是不保留權限,同時部署的時候ACL爲保留。但是仍然會導致Sales目錄繼承/shared目錄的權限。
道理也很簡單,正因爲catalog目錄中沒有權限信息,在部署的時候雖然ACL爲保留,但是如果部署完之後不分配權限,Sales目錄將沒有任何人能看到。
另外,爲什麼將/shared目錄設置爲BIAdministrator可以完全控制,BIConsumer只讀呢?原因也很簡單,主要是爲了授權的方便。因爲所有的人都需要訪問/shared目錄。
上面的操作完成之後,假設我們需要Sales目錄只能被BIAdministrator完全控制,Sales_Manager角色訪問。我們得刪除 BIConsumer的訪問權限並添加Sales_Manager角色的訪問權限。如果授權人員忘記刪除BIConsumer角色的權限就會導致權限泄露,所有人員都能看到Sales報表!!!
人是靠不住的,有沒有辦法讓程序來自動完成這一系列操作?
當然有,可以使用runcat.sh來完成上述操作。
主要使用到其兩個子命令unarchive和setItemPermissions
unarchive用於部署catalog
setItemPermissions用於設置catalog的權限 (注:11g不支持該命令)
大家可以執行./runcat.sh -help來獲取所有的子命令,以及執行./runcat.sh -cmd 子命令 -help來獲取特定子命令的幫助
runcat.sh位於:$DOMAIN_HOME/bitools/bin/ 目錄之下
下面直接給出一個編寫好的shell腳本,大家可以直接拿去使用
deployCatalog.sh
#!/bin/sh
# BIEE 12c Catalog Deploy Util
# Author: lianjialuo
# Version: 1.0
# Issuse Date:20170526
DOMAIN_HOME=/home/biee02/oracle/Middleware/Oracle_Home/user_projects/domains/bi
OBIPS_URL=http://bjkjy-bi-devbiee01.bjkjy:8303/analytics-ws/saw.dll
CATALOG_FILE=""
TARGET_FULL_PATH=""
ACCOUNT_LIST="BIConsumer;;BIAuthor"
ACCOUNT_TYPE="approle;;approle"
LOGIN_FILE=user.txt
print_usage()
{
echo "Usage: $0 -f <catalog file to be deployed> -t <target full path>"
echo " -f: Specify the catalog file to be deployed. e.g. : sample.catalog "
echo " -t: Specify the target full path. If the the catalog should be deployed under /shared folder,"
echo " and after being deployed you get sample sub folder.the full path should be: /shared/sample "
echo
echo " please note: the catalog file name may not be same as target sub folder"
echo " using double quotes if the full path name contains space"
}
if [ $# = 0 ] ; then
print_usage $0
exit 1
fi
while getopts "f:t:" opt;
do
case $opt in
f) tempValue=${OPTARG}
if ! [ -f "$tempValue" ]
then
echo "$tempValue doesn't exists !"
print_usage $0
exit 1
else
CATALOG_FILE=$tempValue
fi
;;
t) tempValue="${OPTARG}"
if [ "$tempValue" = "/shared" ] || [ "$tempValue" = "/shared/" ] ;
then
echo "target location can't be /shared !"
print_usage $0
exit 1
fi
TARGET_FULL_PATH=$tempValue
;;
?) print_usage $0
exit 1;;
esac
done
DATE_N=`date "+%Y-%m-%dT%H:%M:%S"`
log_file=$0_$DATE_N
mkfifo info.fifo
mkfifo error.fifo
#創建管道文件
cat info.fifo | tee -a $log_file.log &
exec 1>info.fifo
#把執行過程輸出到info文件中
cat error.fifo | tee -a $log_file.log &
exec 2>error.fifo
echo "***************************************************"
echo "* BIEE 12c Catalog Deploy Util *"
echo "* OBIPS URL : $OBIPS_URL *"
echo "* Target Full Path : $TARGET_FULL_PATH*"
echo "* Roles need to be removed : $ACCOUNT_LIST *"
echo "***************************************************"
echo ************Begin to deploy Catalog*******************
$DOMAIN_HOME/bitools/bin/runcat.sh -cmd unarchive -inputFile $CATALOG_FILE -folder "$(dirname "${TARGET_FULL_PATH%*}")" -acl preserveOnlyGroups -overwrite old -online $OBIPS_URL -credentials $LOGIN_FILE
echo ************Deloyment finished************************
echo ************Begin to remove roles*********************
$DOMAIN_HOME/bitools/bin/runcat.sh -cmd setItemPermissions -setOption removeMentioned -accountName $ACCOUNT_LIST -accountType $ACCOUNT_TYPE -item "$TARGET_FULL_PATH" -recursive true -online $OBIPS_URL -credentials $LOGIN_FILE
echo ************Roles are removed*******************
unlink info.fifo
unlink error.fifo
使用方法,將deployCatalog.sh上傳到$DOMAIN_HOME/bitools/bin/之下 (可以是服務器端,也可以是BI Client,需要注意的是12.2.1.2.0的客戶端BI Client有問題,必須使用64位jdk以及使用一下啓動bat文件才能使用)
然後修改如下配置
DOMAIN_HOME=/home/biee02/oracle/Middleware/Oracle_Home/user_projects/domains/bi #將其設置爲你的DOMAIN_HOME
OBIPS_URL=http://bjkjy-bi-devbiee01.bjkjy:8303/analytics/saw.dll #將其設置爲你的BIEE環境URL
CATALOG_FILE=""
TARGET_FULL_PATH=""
ACCOUNT_LIST="BIConsumer;;BIAuthor" #需要移除的角色列表,注意用;;分隔
ACCOUNT_TYPE="approle;;approle" #和上面角色列表一一對應,標明類型
LOGIN_FILE=user.txt #需要在deployCatalog.sh同級目錄下創建user.txt用於存放biee管理員帳號信息(例如weblogic)
user.txt內容如下:
login=weblogic
pwd=admin123
設置完之後,通用如下語法調用
./deployCatalog.sh -f 需要部署的catalog文件 -t 目標全路徑
例如:
./deployCatalog.sh -f Sales.catalog -t "/shared/Sales"
需要注意的是 目標全路徑,注意是全路徑!你是將Sales.catalog部署到/shared目錄之下,之後會得到/shared/Sales目錄,所以這裏需要寫/shard/Sales全路徑。
另外,catalog文件的名稱不一定等於歸檔前的文件夾名稱(你可以自定義文件名稱),所以目標全路徑不一定以歸檔文件名結尾。
如果目標全路徑中包含空格,請用雙引號將全路徑引起來。
至此,我們就用一個sh腳本完成了部署及刪除BIConsumer角色的工作。大大減少了權限泄露的風險。