Showing posts with label plm. Show all posts
Showing posts with label plm. Show all posts

Saturday, August 08, 2020

Teamcenter 12 in Docker

 High level steps for now. To be updated with more details. 


1. Remove old docker and install the latest stable.

2. Update listener to connect from remote, enable service (systemd)

3. Enable ip forwarding on docker host

4. Increase max size of docker image (i.e. 30G)

5. Create TC network (bridge) for all TC containers.

6. Create Oracle Image (18.3.0-ee), with customer scripts supplied for Teamcenter

Env: ORACLE_SID, ORACLE_PDB, ORACLE_PWD, ORACLE_CHARACTERSET

Volume: map local script directory to /opt/oracle/scripts/startup

Hotname: provide meaningful hostname

Network: tcnetwork

Custom Script: create TC table space, schema, and import corporate dump, update volume definition. 

Note: run custom script after PDB is in READ WRITE status.

7. Create FMS container, publish 4544. Use mapped volume for TC_ROOT/TC_LOGS/TCVOLS

8. Create License container, publish 28000-28001 (use fixed vendor daemon port 28001 in license file)

9. Create TCServer container with web/pool and FSC slave included. Publish 8080 (Tomcat), 8081 (jmx, if needed), 8087 (mux). use mapped TC_ROOT/TC_DATA/TCLOGS/WEBAPPS. If Load Balancer is configured (step #10), then publishing 8080 port is optional. 

Reload FMS preference into database if the new containers don't match the configurations in the corporate schema template (bootstrap URLs, default TV ID, etc.)

TcServer can be created multiple times for scalability purpose (TcServer1, TcServer2, ...)

TcServer container runs a custom script as entry point which updates configuration files on the fly before starting all services, i.e. FSC Slave scripts and configurations as each TCServer needs a unique FSC ID as slave.

Each TcServer provision it will add new FSC instance into FMS Master configuration. Make sure FMS Master (on FMS container) reload configuration on the fly when new TCServer provisioned. 

10. Create nginx container as load balancer, as there can be multiple TcServer containers provisioned. It publish only 80 (and 443 if SSL), and distribute across all the Tomcat in each TcServer containers.

Overall creation of docker containers:

* Oracle 18.3.0-ee Base: 7m

* Oracle runtime creation: 10m

* TC FMS/LIC Base: 6m

* TC Server Base: 5m

* TC runtime (FMS/LIC/WEB-POOLx2): 1m

* TC NGINX LB runtime: 1m


Docker Status:


Teamcenter Active Space (Load Balancer):


Saturday, May 13, 2006

使用Teamcenter Linking与phase-gate进行Engineering与project的集成

composing... canceled.

Teamcenter DMU Howto

DMU (Digital Mock Up),使得Teamcenter Visulization能够对TC Engineering数据库中的3D模型进行数字验证(Mockup),要实现这一功能,就需要配置DIS Adapter(在TCENG2005之前称为IMAN DAK).

配置DIS Adapter 需要事先配置好以下工具:

Teamcenter Engineering 2005
Teamcenter Visulization 2005
Teamcenter Engineering 2005 Web tier (On Weblogic)

配置步骤:

(1) 在web application manager (insweb.bat)中添加新的应用程序,名为"visdis home", 磁盘位置为teamcenter engineering 安装盘的web-tier目录,在"高级选项"中不要生成WARFILE,"解决方案"仅选择"teamcenter visdis file", 然后确定完成创建过程.假设application manager目录为c:\tceng2k5\, 所生成的stage目录为c:\tceng2k5\staging5
(2) 修改weblogic启动脚本startWeblogic.cmd, 添加以下内容:
添加变量定义:
set DAKOPT_1="-DServerHost=http://ugsplm:7001" (改为你自己的主机名与端口)
set DAKOPT_2="-DTcEngAdapter.home=c:/tceng2k5/staging5/webapp_root/TcEngAdapter"
修改启动命令行:
%JAVA_HOME%\bin\java %JAVA_VM% %MEM_ARGS% %JAVA_OPTIONS% %DAKOPT_1% %DAKOPT_2% -Dweblogic.Name ...

(3)重新启动weblogic
(4)测试DIS Adapter
打开IE, 在文件菜单中选择"打开", 在弹出对话框中输入以下地址:
http://host:port/tc/FileAccess
勾选"以文件夹方式打开", 点击确定
此时,如果提示要求输入teamcenter的用户名和密码,则配置成功.
(5) 配置TCEngineering Site Preferences
在infodba的用户选项中搜索并修改以下preferences:
IMAN_DAK_Default_Site_Server = host:port , 如 ugsplm:7001
IMAN_DAK_Server_Suffix = /tc/FileAccess/
IMAN_DAK_Default_Site_Protocol = http://
IMAN_dmu_version = 6 (如果是TcVis 5.x则值为5, TcVis2005则为6)
(6) 在portal (richclient or otw)中测试DMU
在导航器中选择某一个含有DirectModel数据的Item或ItemRevision, 点击Open In DMU 菜单或按钮,如能正确引导TcVis2005并定位到该零组件,则表示配置成功.
同样,在Web TIer中选择含有JT数据的Item 或 ItemRevision, 在菜音中选择Teamcenter visulization,如能成功打开tcvis2005并打开该模型,则表示成功.

关于DIS Adapter 与可视化协同:
我们知道在teamcenter visulization中可以创建visual conference来进行可视化协同,在没有DIS Adapter的情况下,进行协同的所有人必须首先指定一个会议路径,这个路径可以是本地的,也可以网络上的某个文件夹,然后,创建conference之前,每一方必须先通过某种方式获得会议用到的模型的JT文件,然后会议才能正确进行,但是在配置了DIS Adapter之后,该过程可以大大简化,只要在创建好会议之后,将Teamcenter engineering中所用到的零组件在DMU中打开,即可使会议的任何一方都能看到这个模型数据,前提是,你的DIS Adapter服务可以被与会的任何一方都能访问到.
(END)

Teamcenter 2005 Single Sign On Howto

Teamcenter家族中有诸多的应用程序,如Teamcenter Engineering, Teamcenter Enterprise, Teamcenter Project, Teamcenter Community, Teamcenter Requiement等等,每个应用程序都使用自己的用户数据库进行身份验证。
在一个部署了多种Teamcenter应用程序的环境下,如果有一种机制能够实现在多种应用程序间的一次登录(Single Sign-On),那将会减少很多登录的操作。
Teamcenter Security Serveice就是用来实现这一目的。

本例中通过配置Security Service,使用户在TC Engineering 与 TC Project之间实现一次登录,身份验证所使用的用户资源由LDAP提供。

假设用户已经安装配置完成以下工具:
Teamcenter Engineering 2005
Teamcenter Engineering 2005 Web Tier (On Weblogic)
Teamcenter Project 2005
Teamcenter Application Registry
Sun Directory Server 5.2 (LDAP)

配置步骤:
1. 配置Security Service
(1) 从SecurityServices1.3.3.zip中解出WINDOWS文件夹到本地
(2) 将INSTALL_SSO.EXE解到本地,如c:\tceng2k5\sso
(3) 将INSTALL_TCWEB.EXE解到本地,如c:\tceng2k5\sso
(4) 运行insweb.bat
(4.1) 创建名为"Teamcenter Login Service"的应用程序
在创建应用程序对话框中,磁盘位置为刚才解开的c:\tceng2k5\sso, 在"解决方案"中仅添加"Teamcenter Security Services Identity Service Web Application", "高级WEB应用程序选项"中,使之自己构建可部署的文件,名为sso, 确定之后,在"上下文参数"中主要修改以下两个参数:
tcsso.login_service.appid = TCSSOLoginService
tcsso.login_service.sso_service_url = http://ugsplm:7001/id/
(ugsplm处改为你的主机名,假设weblogic端口为7001)
点击确定完成该应用程序的创建(sso.war).
(4.2) 创建名为"Teamcenter Identity Service"的应用程序
磁盘位置同上,解决方案仅添加"Teamcenter Security Services Login Service Web Application",在"上下文参数"中,修改以下与LDAP相关的参数(以下参数的取值完全取决于所用的LDAP服务器的实际情况):
LDAPHost = ugsplm (LDAP 服务器主机名)
LDAPPortNo = 389 (LDAP端口,默认为389,但要注意SUNDS会在配置过程中自动指定该端口,如725x)
QueryDN = DS Manager,如"cn=root"
QueryDNPassword = 该DS Manager的密码
BaseDN = 在什么范转内搜索DS,如"ou=people,o=ugs.com"
UserObjectClass = 验证所需用户的类名,如"intOrgPerson"
UserAttribute = LDAP用户用于验证的属性,如"uid"

修改Applicatin Registry的应用程序注册信息,添加SSO相关的应用程序ID和URL
点击"修改表",在弹出对话框中选定"Application Registry"进行修改,添加已配置的与SSO相关的应用程序,本例中如下:
ID=TCEngineering, URL=http://ugsplm:7001/tc/webclient, LDAPUSER=TcEngineeringUserName
ID=TCSSOLoginService, URL=http://ugsplm:7001/id, LDAPUSER=TCSSOLoginServiceUserName
ID=TCProject, URL=http://ugsplm:8000, LDAPUSER=TCProjectUserName

(4.4) 生成id.war

(5) 在Weblogic中将id.war与sso.war部署为"Web Application Modules"

(6) 配置SUN Directory Server
(5.1) LDAP Fully Qualified Computer Name = ugsplm.ugs.com, 如果该域为虚拟域,请修改hosts文件使之能被正常访问到.
(5.2) 记住配置过程中LDAP的ServerID与Port, 用于前边sso应用程序上下文参数的配置.
(5.3) Directory Server Console Admin, ID=admin, 指定其密码, 用于管理LDAP.
(5.3) Directory Manager, ID: cn=root, 指定密码, 这两个参数将用于前边sso应用程序的配置.
(5.4) 在LDAP schema添加用户属性
在Schema中添加以下属性(这些属性就是在ApplicationRegistry中指定的属性名,用于对每一个LDAP用户来绑定teamcenter应用程序的用户信息):
tcengineeringusername, tcprojectusername, tcssologinserviceusername
(5.5) 在LDAP Schema中创建新的对象类,指定其类名,如ugsplm,并在该类中添加刚刚创建的三个属性.
(5.6) 创建新的与当前域相关的LDAP Suffix, 如"o=ugs.com"
(5.7) 创建新的OU(Organization Unit),相当于部门名称,如名为"people"
(5.8) 在该OU中创建新LDAP用户,如名为"dgh"
(5.9) 在用户属性对话框中,将前面添加的属性类"ugsplm"添加到"object class"中,此时,在用户属性中会显示前面添加的三个属性
(5.10) 为这三个属性指定值,即为该LDAP用户添加tcproject, tcengineering, tcsso的用户名,如:
tcengineeringusername=infodba
tcprojectusername=admin
tcssologinserviceusername=dgh
到此,LDAP的配置基本完成.
(6) 为TCProject配置SSO选项
(6.1) 在TCProject的JDOT工具对话框中,在"configuration"页面中,选中"Enable SSO integration"
(6.2) 在SSO配置对话框中输入以下值:
SSO Service URL=http://ugsplm:7001/id/xmlrpc
SSO Html Login URL=http://ugsplm:7001/sso/weblogic/login_redirect
Application ID=TCProject (该值要与SSO上下文参数中所指定的project appid相同)
然后,点击"test"按钮进行测试,通过后,退出对话框, restart project services
(7) 测试SSO weblogin
在浏览器中访问以下URL: http://host:port/sso/weblogin/home, 在登录对话框中输入前面创建的LDAP用户和密码进行登录,如显示如下信息则表示成功:
"You have successfully logged in to Teamcenter"
(8)在Teamcenter Environment Management中,为tcengineering添加如下组件: Security Service, 其中,
urlToWar = http://host:port/sso
urlToServiceWar = http://host:port/id
AppID = TCEngineering (该值要与SSO上下文参数中所指定的相同)
(8) 测试SSO环境下的Teamcenter Engineering 登录
运行rich client 或 OTW (2/4 Tier), 点击任一应用程序(如导航器), 系统会重定向到SSO登录的WEB页面,此时要求输入LDAP用户信息, 登录成功能,自动返回到portal完成登录过程.(所使用的Tcengineering用户为前面指定的该LDAP用户tcengineeringusername属性的值)
(9) 测试SSO环境下的Teamcenter Project 登录
打开TcProject登录界面(如http://host:port/login.jsp),网页会自动redirect到SSO的登录界面,同样输入LDAP用户信息,即可完成Project登录过程.

(END)

Thursday, October 27, 2005

Perl版的ug_import Mapping文件生成脚本

闲来无事写了一个PERL版本的MAPPING文件生成脚本,供大家参考,其中生成规则部分的正则表达式可能需要根据实际需求来改写。

文件名:map_gen.pl.cmd

@rem = '
        @echo off 
        perl -w %0 %*
        goto EndOfPerl
        @rem ';
# Suppress the "use only once" wanning
@rem = (@rem, "kaka");

####################################################
#       UGMAPPING GENERATOR PERL EDITION           #
#       AUTHOR: Aquino Friday 21th Oct, 2005       #
####################################################
# Version History
# 21-Oct-2005 DongGonghua Ver 1.01 Bug Fixed "top asm"
# $HISTORY$

# Install & Execution instruction:
#
#  1) Copy "map_gen.pl.cmd" to you %IMAN_ROOT%\bin
#  2) Enter IMAN_MENU environments
#  3) Move to your folder contains UG Part files, 
#     execute: map_gen.pl.cmd
#  4) Then you'll find two files generated in the current 
#     folder 
#
# Syntax: map_gen.pl.cmd
#
# Output Files:
#        Mapping File is  : mapping.txt
#        UG_IMPORT Script : import_script.bat
#

# Verbose Switch
#############################################################
$verbose_mode=0;                                            #
$ARGC=@ARGV;                                                #
if ($ARGC>0) {                                              #
    foreach (@ARGV) {                                       #
        if ($_=~/-v/){                                      #
        $verbose_mode=1;                                    #
        print "Generating Mapping & import script ... ";    #
        print "\n======== ENTER VERBOSE MODE =========\n";  #
        }                                                   #
    }                                                       #
}else {                                                     #
    print "\"-v\" switch avaliable for verbose mode\n\n";   #
    print "Generating Mapping & import script ... ";        #
}                                                           #
#############################################################

# sort file list
#############################################################
    @file_list=split "\n", `dir/b *.prt`;                   #
    # UGMASTER                                              #
    foreach (@file_list) {                                  #
        if ($_=~/^\d+.prt/) {                               #
            @sorted_file_list=(@sorted_file_list,$_);       #
        }                                                   #
    }                                                       #
    # UGMASTER                                              #
    foreach (@file_list) {                                  #
        if ($_=~/^\d+_[A-Za-z0-9]+.prt$/) {                 #
            @sorted_file_list=(@sorted_file_list,$_);       #
        }                                                   #
    }                                                       #
    # UGPART                                                #
    foreach (@file_list) {                                  #
        if ($_=~/^\d+_[A-Za-z0-9]+_s_.*.prt$/) {            #
            @sorted_file_list=(@sorted_file_list,$_);       #
        }                                                   #
    }                                                       #
    # UGALTREP                                              #
    foreach (@file_list) {                                  #
        if ($_=~/^\d+_[A-Za-z0-9]+_a_.*.prt$/) {            #
            @sorted_file_list=(@sorted_file_list,$_);       #
        }                                                   #
    }                                                       #
#############################################################


# Get current directory name
#############################################################
chomp($PWD=`cd`);                                           #
if ($PWD=~/^([A-Z]):\\$/) {$PWD="$1_root";}                 #
else {$PWD=~s#^.*\\(.*)$#$1#;}                              #
#############################################################

# Input & Output file descriptor
#############################################################
open IMP_SCR, ">import_script.bat" or die "Failed: $!";     #
open MAPPING, ">mapping.txt" or die "Failed: $!";           #
#############################################################


# Output MAPPING HEADING
print MAPPING "[Defaults]\n";
print MAPPING "\timport_folder=\"$PWD\"\n";
print MAPPING "\tdb_part_no=\$STRIPPED_LEAFNAME\n";
print MAPPING "\texisting_data=\$USE_EXISTING\n";

# Output IMPORT_SCRIPT HEADING
print IMP_SCR "\@echo off\n";
print IMP_SCR "\@if x%1x == xx goto error\n";
print IMP_SCR "\@if x%2x == xx goto error\n";
print IMP_SCR "\@if x%3x == xx goto error\n";

# Main Loop
foreach (@sorted_file_list) {
    chomp $_;

    # Find out top assembly part
    if ($_ =~ /^0.*.prt$/) {
        print IMP_SCR "CALL %UGII_BASE_DIR%\\UGMANAGER             \\ug_import -part=$_ -mapping=mapping.txt             -u=%1 -p=%2 -g=%3\n";
    }

    ## UGMASTER, No pre-defined rev_id
    if ($_=~/^(\d+).prt$/) { 
        print MAPPING "[$_]\n\tdb_part_no=$1\n\t             db_part_name=$1\n\tdb_part_rev=A\n";
        if($_=~/^0.*/) { print MAPPING "\tdb_part_type=             Assembly\n"; }
        else { print MAPPING "\tdb_part_type=Part\n"; }
    } 
    
    ## UGMASTER, with pre-defined rev_id
    elsif ($_=~/^(\d+)_([A-Za-z0-9]+).prt$/) {
        print MAPPING "[$_]\n\tdb_part_no=$1\n\t             db_part_name=$1\n\tdb_part_rev=$2\n";
        if($_=~/^0.*/) { print MAPPING "\tdb_part_type=             Assembly\n"; }
        else { print MAPPING "\tdb_part_type=Part\n"; }
    }
    
    ## UGPART
    elsif ($_=~/^(\d+)_([A-Za-z0-9]+)_s_(.*).prt$/) {
        print MAPPING "[$_]\n\tdb_part_no=$1\n\t             db_part_rev=$2\n\tdb_model_type=spec\n\t             db_model_name=$3\n";
        print IMP_SCR "CALL %UGII_BASE_DIR%\\UGMANAGER             \\ug_import -part=$_ -mapping=mapping.txt             -u=%1 -p=%2 -g=%3\n";
    }
    
    ## UGALTREP
    elsif ($_=~/^(\d+)_([A-Za-z0-9]+)_a_(.*).prt$/) {
        print MAPPING "[$_]\n\tdb_part_no=$1\n\t             db_part_rev=$2\n\tdb_model_type=alt\n\t             db_model_name=$3\n";
        print IMP_SCR "CALL %UGII_BASE_DIR%\\UGMANAGER             \\ug_import -part=$_ -mapping=mapping.txt             -u=%1 -p=%2 -g=%3\n";
    }

}

# Output IMPORT_SCRIPT TRAILING
print IMP_SCR "goto end\n";
print IMP_SCR ":error\n";
print IMP_SCR "echo Syntax err:%0 username passwd grp\n";
print IMP_SCR ":end\n";

# Close input & output files
#############################################################
close MAPPING;                                              #
close IMP_SCR;                                              #
#############################################################

# VERBOSE MODE
#############################################################
if ($verbose_mode) {                                        #
                                                            # 
open MAPPING, "<mapping.txt" or die "Failed: $!";           #
open IMP_SCR, "<import_script.bat" or die "Failed: $!";     #
                                                            #
print "\n================ MAPPING.TXT ==============\n";    #
foreach (<MAPPING>) {                                       #
    print ;                                                 #
}                                                           #
print "\n============ END OF MAPPING.TXT ===========\n";    #
print "\n============ IMPORT_SCRIPT.BAT ============\n";    #
foreach (<IMP_SCR>) {                                       #
    print ;                                                 #
}                                                           #
print "\n========= END OF IMPORT_SCRIPT.BAT ========\n";    #
                                                            #
close MAPPING;                                              #
close IMP_SCR;                                              #
}                                                           #
#############################################################

print "Done !\n";



__END__
:EndOfPerl


Tuesday, October 11, 2005

当Part Family 遇到 in-CLASS

Teamcenter Engineering 9.1 中的in-CLASS模块对零件族的管理做了强化,通过零件族的模板来生成零件族成员,并自动交由in-CLASS管理,这里做了一个实例演示。



Saturday, July 23, 2005

对“谈Teamcenter系统的批量安装” 的一点补遗

上一篇文章谈了Teamcenter Engineering系统的批量安装,经过进一步的尝试,发现一点疏漏的地方,现作文补充。

在前 面讲述的安装过程中,我们的IMAN_BASE与LSE_ROOT是通过复制的方式进行分发的,之后自动调用Teamcenter Visulation的无人值守安装,但实际操作过程中发现还缺少一些Portal的注册表项,这些注册表项会影响到NX Manager的正常运行,因此可以使用以下两种方案进行补救:


(1)将HKCR/CLSID/中与Portal ,NX Manager相关的注册表分支导出(大概有6个),再导入到批量安装的客户端中;
(2)或者我们在安装过程中对于PORTAL不采取复制分发的方式,而且采用无人值守的方式,这里我们需要编写一份Portal_LSE_setup.ini文件,内容如下:
[Startup]
AppName=Teamcenter Engineering Portal LSE
FreeDiskSpace=481
EnableLangDlg=N
[ISUPDATE]
UpdateURL=http://

[ClientParameters]
IMAN_PORTAL_ROOT=c:\UGS\LSE0910
IMAN_PORTAL_MENU=Teamcenter Engineering Portal LSE

[OrbixParameters]
PORTAL_ORBIX_PORT=1572
PORTAL_ORBIX_HOST=LocalHost
PORTAL_ORBIX_DOMAIN=

[HelpParameters]
PORTAL_HELP_SERVER=LocalHost
PORTAL_HELP_PATH=imanhelp/help

[ServerParameters]
IMAN_ROOT=c:\UGS\Tceng0910
IMAN_DATA=c:\UGS\Tceng0910\imandata
PSVR_NAME=sid_name
PSVR_MARKER=sid_name_PortalServer
PSVR_DB_ENCODING=EUC_CN

按照需要,对上述文件中的各项进行修改使其统一,然后将其copy 到%TEMP%文件夹中,再招执行PORTAL的安装程序。

整个过程可以使用一完整脚本来完成,思路如下:
(2.1)将每台客户端的%TEMP%文件夹进行统一,如指定为c:\temp;
(2.2)编写脚本
@echo off
xcopy c:\UGS\Portal_LSE_setup.ini \\192.168.1.100\c$\temp\ /y
xcopy c:\UGS\Portal_LSE_setup.ini \\192.168.1.101\c$\temp\ /y
xcopy c:\UGS\Portal_LSE_setup.ini \\192.168.1.102\c$\temp\ /y
xcopy c:\UGS\Portal_LSE_setup.ini \\192.168.1.103\c$\temp\ /y
...

(2.3)最后在客户端执行的配置脚本中调用Portal的安装程序即可。


通过以上两种方式,可以变通的解决PORTAL安装的问题。

另外,对于分发配置的客户端系统有时会出现对卷没有写权限的问题,可以通过以下办法解决:

echo imanfs 1527/tcp >> %WINDIR%\system32\drivers\etc\services

The End.

Monday, July 18, 2005

谈Teamcenter系统的批量安装

装系统真是一件体力活。

曾经有过几次安装大量系统的经历,对于安装规模在200台左右的系统,要是一台一台启动setup来安装,肯定会死人的,因此一定要想别的办法才行。

我们的Teamcenter Engineering系统大致分为以下四部分(以Ver 9.1为例):
(1)LSE0910
(2)Tceng0910
(3)TCVIS0910
(4)UGNX
以 上四部分中的1,2两项目实际上是可以进行复制安装的,第三项也可以复制,但对它后续配置太麻烦,有很多注册表项和库文件,因此不作为复制的部分,对于 UGNX,由于其安装之后大概有1~2GB, 如果将安装之后的文件进行复制分发,所需要的时间远大于重新安装的时间,综合考量,也不作为复制部分。因此我们主要对复LSE0910与 TCENG0910两部分内容。

下面举个例子:



某客户有200台客户端,所有客户端均在域环境中,并作如下安装规划:
(1)LSE安装路径为c:\UGS\LSE0910;
(2)TCENG安装路径为c:\UGS\TCENG0910;
(3)TCVIS的安装路径为c:\UGS\TCVIS0910;
(4)UGNX使用现有的安装,路径不确定,已经正常工作;

针对这样一个CASE,我们采用域管理员进行批量分发和配置。首先我们需要安装一台母机,然后将安装好的母机分发到每台客户端,最后使用域管理员对所有客户端逐一进行配置。

思路确定之后,安装步骤如下:

一、域管理员登录,安装母机,打好所有补丁,按要求更改配置文件并测试;
二、域管理员登录母机,使用如下脚本将LSE0910与TCENG0910分发到所有客户端(分发之前注意磁盘空间是否足够):

cd /d c:\
echo D > D
call xcopy c:\UGS\LSE0910 \\192.168.1.100\c$\UGS\LSE0910 /s /e < D >> 192.168.1.100.log
call xcopy c:\UGS\Tceng0910 \\192.168.1.100\c$\UGS\Tceng0910 /s /e
< D >> 192.168.1.100.log
call xcopy c:\UGS\LSE0910 \\192.168.1.101\c$\UGS\LSE0910 /s /e
< D >> 192.168.1.101.log
call xcopy c:\UGS\Tceng0910 \\192.168.1.101\c$\UGS\Tceng0910 /s /e
< D >> 192.168.1.101.log
call xcopy c:\UGS\LSE0910 \\192.168.1.102\c$\UGS\LSE0910 /s /e
< D >> 192.168.1.102.log
call xcopy c:\UGS\Tceng0910 \\192.168.1.102\c$\UGS\Tceng0910 /s /e
< D >> 192.168.1.102.log
... ...
del D

以上脚本会完成客户端LSE与TCENG的分发工作,日志记录在以IP地址为名称的LOG文件中。

三、对LSE进行后续配置的脚本:
对于复制分发的系统,我们需要对LSE0910目录中的某几个文件进行修改,需要使用当前客户的主机名对母机的机器名进行替换,并且需要根据当前UGNX的安装情况,自动更改UGMANAGER的配置文件,我们建立如下脚本来实现。
在以下脚本中,我们仍然使用到了前面文章中提供的GNU_TOOLS,将其放置于服务器的共享位置,并使它在母机的路径中即可。完整脚本如下:

脚本名称:do_it.sh
=====================

#!/usr/bin/bash

####################################################
# TCENG0912 BATCH INSTALLATION SCRIPT #
# AUTHOR: gonghua.dong@ugs.com.cn #
# Version 1.00 xxxxxxxxxxxxxxxxxxxxxxxx #
####################################################
#
# Version History
# 18-Jul-2005 DongGonghua Ver 1.00
# $HISTORY$

# Install & Execution instruction:
#
# 1) Copy "util" to some place such as "c:\util"
# 2) Reset PATH Env as this: set PATH=c:\util;%PATH%
# 3) goto the folder contains installed folders such as c:\ugs
# 4) Execute: bash do_it.sh

#
# Syntax: bash do_it.sh
#

# Environments
ORACLE_SID=the_sid_name
SERVER_NAME=the_server_name
TEMPLATE_NAME=the_template_name
CURRENT_HOSTNAME=$(echo $COMPUTERNAME tr 'A-Z' 'a-z')
UGROOT=$(echo ${UGII_BASE_DIR}
| sed -e 's/\\/\\\\/g' |sed -e 's/\ /\\\ /g' |sed -e 's/^\(.*\)$/\"\1\"/g')



# Start
# Check if the Target_Folders are existed.
ls -ld LSE0910 Tceng0910 > /dev/null 2>&1

if [ ${?} -eq 0 ] ; then
cat LSE0910/client_specific.properties |sed -e "s/$TEMPLATE_NAME/$CURRENT_HOSTNAME/g"
> LSE0910/client_specific.properties.new
cat LSE0910/site_specific.properties |sed -e "s/$TEMPLATE_NAME/$CURRENT_HOSTNAME/g"
> LSE0910/site_specific.properties.new
cat LSE0910/orbix/config/common.cfg |sed -e "s/$TEMPLATE_NAME/$CURRENT_HOSTNAME/g"
> LSE0910/orbix/config/common.cfg.new
cat LSE0910/orbix/config/orbixnames3.cfg |sed -e "s/$TEMPLATE_NAME/$CURRENT_HOSTNAME/g"
> LSE0910/orbix/config/orbixnames3.cfg.new
#cat LSE0910/orbix/config/Repositories/ImpRep/
${ORACLE_SID}_PortalServer.imp
#|sed -e "s/
$TEMPLATE_NAME/$CURRENT_HOSTNAME/g" > #LSE0910/orbix/config/Repositories/ImpRep/
${ORACLE_SID}_PortalServer.imp.new

cat LSE0910/start_ugmanager.bat |sed -e "s/^set\ UGII_BASE_DIR=.*/set\ UGII_BASE_DIR=${UGROOT}/g" > LSE0910/start_ugmanager.bat.new

rm -f LSE0910/client_specific.properties > /dev/null 2>&1
rm -f LSE0910/site_specific.properties > /dev/null 2>&1
rm -f LSE0910/orbix/config/common.cfg > /dev/null 2>&1
rm -f LSE0910/orbix/config/orbixnames3.cfg > /dev/null 2>&1
#rm -f LSE0910/orbix/config/Repositories/ImpRep/
${ORACLE_SID}_PortalServer.imp > /dev/null 2>&1

rm -f LSE0910/start_ugmanager.bat > /dev/null 2>&1

mv LSE0910/client_specific.properties.new LSE0910/client_specific.properties
> /dev/null 2>&1

mv LSE0910/site_specific.properties.new LSE0910/site_specific.properties
> /dev/null 2>&1

mv LSE0910/orbix/config/common.cfg.new LSE0910/orbix/config/common.cfg
> /dev/null 2>&1

mv LSE0910/orbix/config/orbixnames3.cfg.new LSE0910/orbix/config/orbixnames3.cfg
> /dev/null 2>&1

#mv LSE0910/orbix/config/Repositories/ImpRep/
${ORACLE_SID}_PortalServer.imp.new
#LSE0910/orbix/config/Repositories/ImpRep/
${ORACLE_SID}_PortalServer.imp > /dev/null 2>&1

mv LSE0910/start_ugmanager.bat.new LSE0910/start_ugmanager.bat
> /dev/null 2>&1


# done in "go.bat"
# echo -e "192.168.1.1\the_server_name"
>> ${WINDIR}/system32/drivers/etc/hosts



else
echo
echo Target Folders are not correct.
echo "LSE0910", "TCENG0910" must exist in the current folder.
echo Enter the target folder first, such "c:\ugs"
echo
fi

# The End Of The Script


四、如何处理TCVIS的安装(PV)
在 安装规划的时候, 我们定义的TCVIS的安装路径为c:\UGS\TCVIS0910,实际上当我们在配置脚本的后边调用TCVIS的安装程序的时候,用户可能干预 TCVIS的安装路径,因此,我们必须对路径作一个限定,使TCVIS必须正确地安装到c:\UGS\TCVIS0910中。
在TCVIS 的安装 盘中有这样一个文件PLMVis_sample.ini。在这个文件中定义了它的默认安装路径“destpath=C:\ Program Files\EDS\PortalVisualization\9_1”,我们将它改成“destpath=C:\UGS\TCVIS0910”,并把该 文件更名为PLMVis.ini。这样,当我们再次调用TCVIS的安装程序的时候,它会使用该路径自动完成安装。

五、完整配置脚本 (MS-DOS Batch)
当安装的整体思路与技术细节都确定了之后,我们写下这样一个脚本,供大家参考:

脚本名称:go.bat
================

@echo off

Rem To be sure I login as DOMAIN_NAME/Administrator
if not x%username% == xAdministratorx goto error1
if not x%userdomain% == xDOMAIN_NAMEx goto error1

Rem To be sure every client can find the server with its hostname
echo 192.168.1.1 the_server_name >>
%WINDIR%\system32\drivers\etc\hosts


if not exist \\the_server_name\c$ goto error1

Rem Check if the GNU_TOOLS is OK
if not exist \\the_server_name\c$\gnu_util goto error2

Rem the gnu_util is already placed in \\the_server_name\c$\gnu_util, so
set PATH=\\the_server_name\c$\gnu_util;%PATH%

Rem Execute the script to replace hostname
bash do_it.sh

Rem Install PV and PV_Patch automatically
call \\the_server_name\c$\SETUPs\ TcEng912_wnti\ TcEngPV0912_winsetup.exe
call \\the_server_name\c$\SETUPs\9.1.2.8\ iman0910portal_viewerPortalVisulizationV9125_5104_50314_win.exe

goto end

:error1
echo Do you login as "HHM/Administrator" ? pls check that.
goto end

:error2
echo CYG UTILITIES not found, pls check that.
goto end

:end

Tuesday, June 28, 2005

谈ug_import脚本的自动生成

ug_import是我们经常会用到的一个工具,它用于将UG文件批量地导入到IMAN系统中,很多客户往往会有很多UG文件,将这些文件导入到IMAN 里之前,我们必须要知道每一个UG文件导进去之后所使用的ITEM ID, ITEM名称, ITEM版本以及ITEM类型等信息,这就是mapping文件(映射文件),因此,我们通常要作的工作就是根据某个文件夹中成百上千个UG文件编写一份 mapping文件,如果让我们一行一行的敲出来,那八成是要死人的,所以我们需要借助工具来使它自动生成。
这里介绍一下如何使用免费的GNU工具来生成UG的mapping文件。


这里所说的GNU工具,其实是一个完整的UNIX环境,它可以运行于WIN32平台。我们没有必要将整个环境都搬到我们的WINDOWS里来,我们只要将我们需要用到的有限的几个工具拆下来就可以了,一般只要2-3MB的空间即可,主要包括如下几个命令:

bash : 所编写的脚本的解析器
awk : 强大的脚本语言工具
sed : 模式过滤工具
sort : 排序工具
ls : 生成目录列表工具
tee : Dual Output工具

除了以上工具之外,还有几个执行它们需要的库文件。

对于这些工具的安装,我们需要做以下两件事:
(1)将含有这些工具的目录(如gnu_tools)放到某个位置,如c:\gnu_tools;
(2)将该目录加到PATH环境变量中,如 set PATH=c:\gnu_tools;%PATH%
就这么简单。

有了这些工具之后,我们只要稍稍具备一些UNIX脚本知识,就可以使用它们来编写SHELL脚本了,在你试过之后,你会觉得整个过程是那么的perfect。

还有一个问题,如果根据目录中的所有UG文件能够“自动地”生成导入脚本,我们必须根据UG文件名能够转换成导入之后的ITEM ID,ITEM名称以及ITEM类型等属性值,如果UG文件名五花八门,那么一份文件名与ITEM信息的对照表可能是必须的。

下面举个简单的例子。

假设目录c:\ug_files下有如下一些UG文件:

0123456.prt
2020395.prt
2023952.prt
2023952_a_dtes.prt
2039652.prt
4012362.prt
4012362_s_asdf.prt
8023425.prt
8023425_a_tsef.prt
9023425_s_keis.prt
9023862.prt
9023862_s_ssss.prt

处理规则:
文件名含有"_s_"的为UGPART文件,含有"_a_"的为UGALTREP,其余为UGMASTER。
对于UG文件名以0开头的,认为是顶层装配,赋予ITEM类型为Product;
对于UG文件名以1-3开头的,认为是部件,赋予ITEM类型为Assembly;
对于UG文件名以4-9开头的,认为是零件,赋予ITEM类型为Part;

针对以上UG文件,编写如下脚本(主要使用AWK工具):


#!/usr/bin/bash

PWD=`pwd | awk -F/ '{print $NF}'`

ls *.prt | awk -v THE_PWD=$PWD '

BEGIN{
print "[Defaults]"
print "\timport_folder=" "\"" THE_PWD "\""
print "\tdb_part_no=$STRIPPED_LEAFNAME"
print "\texisting_data=$USE_EXISTING"
printf("@echo off\n")>"import_script.bat"
printf("@if x%%1x == xx goto error\n")>>"import_script.bat"
printf("@if x%%2x == xx goto error\n")>>"import_script.bat"
printf("@if x%%3x == xx goto error\n")>>"import_script.bat"

}

{
if ( $0 ~ /_s_/ ) {

# UGPART dataset
print "[" $0 "]"
print "\tdb_part_no=" "\"" gensub("(.*)_s_.*","\\1",$0) "\""
# db_part_name are same with db_part_no
print "\tdb_part_name=" "\"" gensub("(.*)_s_.*","\\1",$0) "\""
if ( $0 ~ /^[0]/ )
{
print "\tdb_part_type=Product"
}
else if ( $0 ~ /^[123]/ )
{
print "\tdb_part_type=Assembly"
}
else if ( $0 ~ /^[456789]/ )
{
print "\tdb_part_type=Part"
}
else
{
i dont know how to deal with it.
}
print "\tdb_part_rev=01"
print "\tdb_model_type=spec"
print "\tdb_model_name=" "\"" gensub(".*_s_(.*).prt","\\1",$0) "\""

# Generate all_in_one script
printf("%%UGII_BASE_DIR%%\\UGMANAGER\\ug_import -part=%s -mapping=mapping.txt -u=%%1 -p=%%2 -g=%%3\n",$0)>>"import_script.bat"

}
else if ( $0 ~ /_a_/ ) {

# UGALTREP dataset
print "[" $0 "]"
print "\tdb_part_no=" "\"" gensub("(.*)_s_.*","\\1",$0) "\""
# db_part_name are same with db_part_no
print "\tdb_part_name=" "\"" gensub("(.*)_s_.*","\\1",$0) "\""
if ( $0 ~ /^[0]/ )
{
print "\tdb_part_type=Product"
}
else if ( $0 ~ /^[123]/ )
{
print "\tdb_part_type=Assembly"
}
else if ( $0 ~ /^[456789]/ )
{
print "\tdb_part_type=Part"
}
else
{
i dont know how to deal with it.
}
print "\tdb_part_rev=01"
print "\tdb_model_type=alt"
print "\tdb_model_name=" "\"" gensub(".*_s_(.*).prt","\\1",$0) "\""

# Generate all_in_one script
printf("%%
UGII_BASE_DIR%%\\UGMANAGER\\ug_import -part=%s -mapping=mapping.txt -u=%%1 -p=%%2 -g=%%3\n",$0)>>"import_script.bat"

}

else {
# UGMASTER datasets
print "[" $0 "]"
print "\tdb_part_no=" "\"" gensub("(.*).prt","\\1",$0) "\""
print "\tdb_part_rev=01"
print "\tdb_part_name=" "\"" gensub("(.*).prt","\\1",$0) "\""
if ( $0 ~ /^[0]/ )
{
print "\tdb_part_type=Product"

# Generate all_in_one script
printf("%%UGII_BASE_DIR%%\\UGMANAGER\\ug_import -part=%s -mapping=mapping.txt -u=%%1 -p=%%2 -g=%%3\n",$0)>>"import_script.bat"

}
else if ( $0 ~ /^[123]/ )
{
print "\tdb_part_type=Assembly"
}
else if ( $0 ~ /^[456789]/ )
{
print "\tdb_part_type=Part"
}
else
{
# i dont know how to deal with it.
}

}

}

END {

# all_in_one script
printf("goto end\n")>>"import_script.bat"
printf(":error\n")>>"import_script.bat"
printf("echo Syntax error : %%0 username password group\n")>>"import_script.bat"
printf(":end\n")>>"import_script.bat"

}

' | tee mapping.txt

假设以上脚本名称为 "do_it.sh",编写完成后,将该脚本文件放置于与gnu_tools相同的目录中(目的是使它也在PATH中),然后,我们需要到UG文件所在目录中执行以下命令:
c:\ug_files>
bash do_it.sh

命 令执行过程中,会在标准输出(屏幕)上输出mapping文件的具体内 容,同时生成一个mapping.txt文件和import_script.bat文件,在import_script.bat文件中,同时包含了 ugmaster, ugpart,ugaltrep文件的导入脚本。

生成的导入脚本是酱紫的:
MAPPING.txt
===================
[Defaults]
import_folder="文件夹名"
db_part_no=$STRIPPED_LEAFNAME
existing_data=$USE_EXISTING
[0123456.prt]
db_part_no="0123456"
db_part_rev=01
db_part_name="0123456"
db_part_type=Product
[2020395.prt]
db_part_no="2020395"
db_part_rev=01
db_part_name="2020395"
db_part_type=Assembly
[2023952.prt]
db_part_no="2023952"
db_part_rev=01
db_part_name="2023952"
db_part_type=Assembly
[2023952_a_dtes.prt]
db_part_no="2023952"
db_part_rev=01
db_model_type=alt
db_model_name="
dtes"
[2039652.prt]
db_part_no="2039652"
db_part_rev=01
db_part_name="2039652"
db_part_type=Assembly
[4012362.prt]
db_part_no="4012362"
db_part_rev=01
db_part_name="4012362"
db_part_type=Part
[4012362_s_asdf.prt]
db_part_no="4012362"
db_part_rev=01
db_model_type=spec
db_model_name="asdf"
......

import_script.bat
======================
@echo off
@if x%1x == xx goto error
@if x%2x == xx goto error
@if x%3x == xx goto error

CALL %UGII_BASE_DIR%\UGMANAGER\ug_import -part=0123456.prt -mapping=mapping.txt -u=%1 -p=%2 -g=%3
CALL %UGII_BASE_DIR%\UGMANAGER\ug_import -part=2023952_a_dtes.prt -mapping=mapping.txt -u=%1 -p=%2 -g=%3
CALL %UGII_BASE_DIR%\UGMANAGER\ug_import -part=8023425_a_tsef.prt -mapping=mapping.txt -u=%1 -p=%2 -g=%3
CALL %UGII_BASE_DIR%\UGMANAGER\ug_import -part=9023425_s_keis.prt -mapping=mapping.txt -u=%1 -p=%2 -g=%3
CALL %UGII_BASE_DIR%\UGMANAGER\ug_import -part=4012362_s_asdf.prt -mapping=mapping.txt -u=%1 -p=%2 -g=%3
CALL %PATH_TO_UG%\UGMANAGER\ug_import -part=9023862_s_ssss.prt -mapping=mapping.txt -u=%1 -p=%2 -g=%3
goto end
:error
echo Syntax error : %0 username password group
:end

然后,只要对生成的import_script.bat稍做修改(主要是ug_import的路径),就可以在IMAN_SHELL的环境下执行导入了。

在上面的例子中,我们为了简化处理过程,做了如下假设:
所有的UGPART文件与UGALTREP文件,都有相应的UGMASTER存在!

这 样的假设实际上是非常重要的,如果我们不能保证以上条件,我们就要额外写些代码来处理UG文件,以保证满足上述条件,同时,如果满足上述条件,我们可以 确保在生成的导入脚本import_script.bat中,导入的顺序是按照 “先UGMASTER,再UGALTREP,最后UGPART”的顺序排列的,而这种导入顺序也是我们所需要的,否则就会出错。



更多信息,refer to ug_import help document & gnu manpages


Thursday, June 02, 2005

Teamcenter瘦身运动:合并ORACLE实例

经常参加Teamcenter项目实施的朋友,你是不是遇到跟我一样的烦恼呢?

ORACLE实例多达十几个


磁盘空量占据10+ Gigabytes


一般我们所参与的每个项目,至少都会有一个oracle实例,那么我们是不是有必要为每个项目数据都建一个独立的实例呢?答案是否定的。



实 际上,对于我们实施方来说,每个项目我们只需要一点点示例数据就够用了,如果为了这一点点数据建创建一个几百兆甚至上G的数据库实例,那我们的硬盘就装 不了多少东西了。 为了使我们的Teamcenters能够瘦下来,可以通过合并数据库的方式,将所有的项目所需要的数据都存放于同一个数据库实例中,然后使用不同的数据库 用户 加以区分。

此方法不仅仅适用于Teamcenter Engineering的所有版本, 甚至所有需要oracle数据库支持的应用都可以采用此方法,比如Teamcenter Enterprise, Teamcenter Project 等等。

下面介绍具体的操作方法:

(为描述方便,我们把那些“在数据上独立,但以共享方式使用ORACLE实例”的情形称为“数据实例”)

1. 假设我们的oracle已经安装完毕并正常工作 (oracle 9i / oracle 10g),然后使用warehouse模板创建一个空实例,实例名为 my_sid, 假设system帐号密码为system;

2. 使用数据库导出工具exp将数据库导出,导出前注意服务器端与客户端的字符集要保持一致,命令如下:
c:\exp system/system@my_sid file=c:\my_sid.dmp log=my_sid.log full=y grants=y

3. 为所需要的应用规划数据库。假设使用该数据库同时作为Tceng811, Tceng912, Tceng2005, TcProj6的数据库,接下来确定每个应用所使用的数据库帐号,暂定如下:

Tceng811 : tceng811
Tceng912: tceng912
Tceng2005: tceng2k5
TcProj6: tcprj6

以上用户的时候的创建可以以INFODBA帐户为基础。

4. 使用数据库导入工具,为每个应用创建独立的用户空间、

c:\imp system/system@my_sid file=c:\my_sid.dmp log=my_sid.log fromuser=system touser=tceng811 commit=y ignore=y
c:\imp system/system@my_sid file=c:\my_sid.dmp log=my_sid.log fromuser=system touser=tceng912 commit=y ignore=y
c:\imp system/system@my_sid file=c:\my_sid.dmp log=my_sid.log fromuser=system touser=tceng2k5 commit=y ignore=y
c:\imp system/system@my_sid file=c:\my_sid.dmp log=my_sid.log fromuser=system touser=tcprj6 commit=y ignore=y

5. 为方便记忆,可以将所有用户的密码统一为"infodba",这样加密后的connect string 均为 "tbwiabd"。

6. 接下来,就根据不同应用的需要,创建相应的schema,如安装tceng811时,在configure or new db步骤时,选择用户tceng811进行操作, 安装tceng912时, 则使用tceng912用户, 当配置TcProj6.0的数据库时,使用tcprj6这个用户, 千万不要选错了

7. 接下来就是如何处理PORTAL端连接的问题,包括两个部分的内容,分别要处理 start_my_sid_PortalServer.bat文件与my_sid_PortalServer.imp文件。

我们在配置第一个“数据实例” 的时候,生成了start_my_sid_PortalServer.bat 与 my_sid_PortalServer.imp,如果按传统方法配置后面的“数据实例”就会出问题,因为这两个文件只有一份, 要想处理多个“数据实例”登录的问题,必须将其分开,方法如下:

假设我们现在有两个客户数据,一是aaa, 另一个是bbb,我们需要将以上两个文件复制为以下两份:
start_my_sid_PortalServer_aaa.bat
start_my_sid_PortalServer_bbb.bat
my_sid_PortalServer_aaa.imp
my_sid_PortalServer_bbb.imp
修改前两个文件中iman_data 的路径,再修改后两个文中的IMP文件名,使其与“数据实例”相对应。

8. 将%IPR%下的client_specific.properties复制为client_specific_aaa.properties与 client_specific_bbb.properties,修改文件中的"ServerName ServerMarker", 使其与“数据实例”相对应。

9. 将portal.bat 复制为portal_aaa.bat, portal_bbb.bat, 用于处理有独立的客户化包的问题和数据库的选择问题,然后按如下进行修改:

在portal_aaa.bat的"set IDR=%IPR%"之后添加以下内容:
xcopy %IPR%\client_specific_aaa.properties %IPR%\client_specific.properties /y >NUL 2>&1
在portal_bbb.bat的"set IDR=%IPR%"之后添加以下内容:
xcopy %IPR%\client_specific_bbb.properties %IPR%\client_specific.properties /y >NUL 2>&1

之后,我们就可以分别使用portal_aaa.bat与portal_bbb.bat进入不同的“数据实例”了。

10. 差不多了, 哪个不怕死的有空就试试吧~

( Many thanks to Dr. Frank Feng sharing this solution to me ! )

Tuesday, May 17, 2005

Oracle 9i iSQL*Plus DBA Access

默认情况下,9i中的iSQL*Plus DBA是无法登录的,可以使用如下方法创建一个Apache的授权用户:

%ORACLE_HOME%\Apache\Apache\bin>htpasswd %ORACLE_HOME%/sqlplus/admin/iplusdba.pw admin

“网络终断导致本地iman server停止”解决办法

目前很多自适应的网卡都会因网络线的断开而无法使用网络,甚至不能ping 自己,这程功能被称作“媒体探测”(Media Sense),如果正在使用本机上的IMAN,那就会使Orbixd服务中断

我们可以通过修改注册表来关闭网络适配器的媒体探测特性,具体方法如下:

在HKLM \System\CurrentControlSet\Services\Tcpip\Parameters下,有一个名为 DisableDHCPMediaSense,类型为DWORD的的键(如果没有就手动创建一个),当它值为1时,就关闭了媒体探测的特性,当值为0时就 是开启该功能。

修改后,当你拔下网线,系统虽然还是显示网线没有连接,但绑定在网卡上的IP仍然是有效.大家可以试试.