Loading presentation...

Present Remotely

Send the link below via email or IM

Copy

Present to your audience

Start remote presentation

  • Invited audience members will follow you as you navigate and present
  • People invited to a presentation do not need a Prezi account
  • This link expires 10 minutes after you close the presentation
  • A maximum of 30 users can follow your presentation
  • Learn more about this feature in our knowledge base article

Do you really want to delete this prezi?

Neither you, nor the coeditors you shared it with will be able to recover it again.

DeleteCancel

Make your likes visible on Facebook?

Connect your Facebook account to Prezi and let your likes appear on your timeline.
You can change this under Settings & Account at any time.

No, thanks

private 안되기 때문에 이름을 지으면 안됨!

No description
by

SICHIL CHOI

on 21 May 2013

Comments (0)

Please log in to add your comment.

Report abuse

Transcript of private 안되기 때문에 이름을 지으면 안됨!

DeviceConnector
extends NDT_SubP devConnRequest_Class( info:String ):void{
var data:XML = XML( info );
new ConnInfoManager_CIM().setDevConnInfo( data as XML, this.Loader );
} ConnInfoManager_CIM setDevConnInfo 3. createWorkerTable 호출 1. worker_param 입력 2. collector 생성 data as XML 값 형태
ex)
<menuitem
label="PUTTY" id="CIM1_0" managerID="CIM" mng_num="344" svc_type="TELNET_TEST" conn_type="TELNET" conn_port="23" terminal="PUTTY" menu_type="dev_con" terminal_type="Window"
/> : ConnectDataWorkerParam
loader , conn_info , ndc 정보 : ICIM_ConnectDataCollector
접속 방식에 따라 각자 필요로 하는 dataWorker 들의 목록 Revision
2012-09-24 이승만 - 초안 작성 장비접속 로직의 이해 장비접속 꼬치구이집 장비접속을 요청한다.
어떤 프로토콜의 장비접속인지 확인한다.
각 프로토콜별 필요한 절차를 확인한다.
각 절차에 맞는 동작을 하여, 필요한 정보들을 세팅한다.
장비에 접속한다. 꼬치구이 집으로 간다.
주문을 한다.
재료를 손질한다.
손님이 원하는대로 꼬치를 만들어준다.
맛있게 구워먹는다. 개념의 이해 ( 실전편 ) 꼬치구이 집으로 간다.
주문을 한다.
재료를 손질한다.
손님이 원하는대로 꼬치를 만들어준다.
맛있게 구워먹는다. 개념의 이해 LoadSSGServerInfo 장비접속시 확인할 부분들 => [ 꼬치의 재료들 ] LoadSVCType LoadConsoleInform DevconHTTP DevConExternal CheckInform 장비접속의 종류 => [ 꼬치의 종류 ] 장비접속 Console HTTP
HTTPS SFTP Bypass External Internal Final 각각의 단계를 진행하면서,
필요한 데이터들을 보드에 세팅한다.
보드에 세팅한 데이터는 다음단계에 영향을 준다.
최종단계에 다다랐을 때,
최종단계에서는 보드의 내용을 확인하여
최종적으로 실행할 모양을 결정한다. 단계 8 단계 6 단계 5 단계 4 단계 3 단계 2 단계 7 데이터를 저장하는 보드 단계 1 Internal 블랙보드 패턴이란 ? 장비접속 완료 => [ 꼬치를 맛있게 먹는다. ] LoadSSGServerInfo LoadSVCType LoadSVCType LoadSSGServerInfo LoadSVCType LoadConsoleInform DevconHTTP DevConExternal CheckInform 장비접속 실행 => [ 꼬치를 석쇄에 굽는다. ] 장비접속 Console HTTP SFTP Bypass External Internal : collecotor 에 등록된 "cim_datatype 값" 들이
가리키는 "dataWorker 클래스" 들 배열에 push 4. next 호출 CIM_ConnectDataCollectorFactory createCollector 호출 접속 타입별 collector 의 종류
CIM_ConnectDataCollector_BYPASS.as
CIM_ConnectDataCollector_Console.as
CIM_ConnectDataCollector_DirectConnect.as
CIM_ConnectDataCollector_External.as
CIM_ConnectDataCollector_FTP.as
CIM_ConnectDataCollector_HTTP_SWG.as
CIM_ConnectDataCollector_HTTP.as
CIM_ConnectDataCollector_Internal.as
CIM_ConnectDatacollector_NOINFO.as
CIM_ConnectDataCollector_SFTP.as extends CIM_ConnectDatacollector_NOINFO
implements ICIM_ConnectDataCollector package com.netand.Namvi.menusystem.menumanager.cim.connectdatacollector.collector
{

internal class CIM_ConnectDataCollector_External extends CIM_ConnectDatacollector_NOINFO
{
private var lanManager:ILanguageManager = null;
public function CIM_ConnectDataCollector_External(info:XML, lanManager:ILanguageManager )
{
super(info);
this.lanManager = lanManager;
}

override public function isrequired(type:int):Boolean
{
switch( type ){
case CIM_DATATYPE.DEVICE_INFO:
case CIM_DATATYPE.SVC_TYPE_INFO:
case CIM_DATATYPE.TERMINAL_LIST: // 터미널을 가져오려면 터미널 리스트를 로드해야 한다.
case CIM_DATATYPE.DEFAULT_TERM_SET: // 터미널 셋팅
case CIM_DATATYPE.PROTOCOL_ENCRYPT_INFO: // 프로토콜 암호화 여부
case CIM_DATATYPE.SESSION_TIMEOUT_INFO: // 세션 타임 아웃
case CIM_DATATYPE.AUTOLOGIN_INFO: // 로그인 계정 정보 받기
case CIM_DATATYPE.AUTH_KEY_INFO: // 인증키 관련 정보 셋팅
case CIM_DATATYPE.DEVCON_EXTERNAL: // 외부터미널 장비 접속
return true;
default: return false;
}
}
/***********************************************************
* Device Connect Requester 생성
**********************************************************/
override public function createDeviceRequester():ConnectDevice_Requester{
return new ConnectDevice_Requester( lanManager );
}

}
} public function setDevConnInfo( conn_info:XML, loader:ILoader ):void{

if( conn_info == null ) return;

worker_param.loader = loader;
worker_param.conn_info = conn_info;
worker_param.ndc = loader.getInform( InformObject_ID.NDC );

dbVer = new DBVersion( loader ); //추가 되었네.^^;;

//trace("=== setDevConnInfo : " + conn_info.toXMLString() );

/** Collector 생성 **/
collector = CIM_ConnectDataCollectorFactory.createCollector( conn_info, loader );

/** Worker Table 생성 **/
createWorkerTable();

/** 다음 상태 진행 **/
next();
} 콜렉터가 모여 있는 폴더 경로 /HIWare4/MenuSystem/com/netand/Namvi/menusystem/menumanager/cim/connectdatacollector/collector 2-1 private function pushWorker( work_type:Array, workclass:Class ):void{
var push_ok:Boolean = false;
if( work_type.length == 0 ) push_ok = true;
else{
// collector에서 처리 할 데이터인지 필터링 한다.
for each( var type:Number in work_type ){
if( collector.isrequired( type ) ){
// 하나라도 일치하는게 나오면 추가 한다.
push_ok = true;
break;
}
}
}

if( push_ok )
worker_table.push( workclass );
} private function createWorkerTable():void{
worker_table = new Array();

// 정보 체크
pushWorker( [], ConnectDataWorker_CheckInform );

// 장비 정보 로드
pushWorker( [CIM_DATATYPE.DEVICE_INFO],
ConnectDataWorker_LoadDeviceInfo );
// 터미널 리스트 로드......
// SVC 정보 로딩......
// 콘솔 정보 로딩 ......
// SSG 정보 로딩......
// 클라이언트 키 로그인용 정보 셋팅......
// 프로토콜 암호화 정보 로드
// 세션 타임아웃 정보 로드
// 인증 정보 로드 ( 사용자에게만 해당 되는 이야기 )
// 망지정 SITE 정보 로드
// 자동로그인용 계정 정보 로드 -- 팝업 창 암호 입력!
// STG 3.1.19이하일 때 클래스 생성
else{
// STG 3.1.19버전부터 SU정책이 적용된 클래스를 사용한다.
// 장비 접속 진행
// 내부 터미널
// 외부 터미널
// HTTP 접속
// AUTH 관련 정리 ( 사용자에게만 해당 되는 이야기 ) private function next():void{
if( worker_table.length > 0 ){
var current_job:IConnectDataWorker = IConnectDataWorker( new (worker_table.shift()) );
current_job.setParam( worker_param );
current_job.run( collector, next, error );
}else{
// 작업 끝~!
// 정리 시작 ~!
}
} 3-1 4 - 1 재귀호출 CheckInform CheckInform CheckInform CheckInform CheckInform KVM 접속 시도시 워커가 모여 있는 경로
/HIWare4/MenuSystem/com/netand/Namvi/menusystem/menumanager/cim/connectdatacollector/dataworker KVM / 콘솔 뷰 STGCommonSrc/com/netand/Namvi/SubProcess/STG/Setting/DevKind/ConsoleView.mxml Consoleview extends NDT_view onInit_Search(){

// 장비 그룹 리스트
reqDevGroupList();

// 서버 리스트
reqServerInfo();

// 멀티 서비스 리스트
reqMultiService();

// 접속 프로토콜 리스트
reqProtocolList();

// 접속 템플릿 리스트
reqTPTList();
} param.type = "GROUP";
n3service.request( "GET_DEVICE_DATA" , getDevGroupResult, param );

입력 코드 dg_Data.addItem({pgrp_num:node.@pgrp_num.toString(), data:node.grp_num.toString(), label:node.@grp_nm.toString()});
실제 값 dg_Data.addItem( <group grp_num="19" grp_nm="0.공용장비" pgrp_num="0"/> ); \com\netand\Namvi\menusystem\menumanager\cim\connectdatacollector\ConnInfoManager_CIM.as 경로 : STGCommonSrc/com/netand/Namvi/SubProcess/STG/Device/DevConn/DeviceConnector.as STGCommonSrc/com/netand/Namvi/dataservice/v3/N3DataServices/Get_Device_Data.as Get_Device_Data implements IN3DataService, INDCRequester param.type = "SERVER_INFO";
n3service.request( "GET_CODE_DATA" , getServerInfoResult, param.copy() );

입력 코드 : act_Data.addItem({label:_languageManager.getValue("type.select"), data:""});
실제 값 act_Data.addItem({label:"", data:"선택")
입력 코드 sid_Data.addItem({ label:node.@server_id.toString() });
실제 값 sid_Data.addItem({ label:"STG_01" }); var multi_qry:String = "SELECT MNG_NUM, SVC_TYPE " +" FROM STG_DEV_CONINFO ";
ndc.Select(multi_qry, this, "multi");

입력 코드 multi_Data.addItem({mng_num:ret.getCol(0), svc_type:ret.getCol(1)});
실제 값 multi_Data.addItem( {mng_num: 1, svc_type: "WINTERM" );
데이터 980개 정도 나옴 protocol_Data = new ArrayCollection([
{label:"TELNET"},
{label:"SSH"}
]);

박힌 코드 var selectTPTList:String = " SELECT TPT_NM FROM NAD_TPT10 ORDER BY upper(TPT_NM) ";
ndc.Select(selectTPTList, this, "TPT");

TPT_Data.addItem({label:ret.getCol(0), data:ret.getCol(0)});
TPT_Data.addItem( {label:3COM, data:3COM} ); param.type = "GROUP"; STGCommonSrc/com/netand/Namvi/dataservice/v3/N3DataServices/Get_Code_Data.as Get_Code_Data implements IN3DataService, INDCRequester param.type = "SERVER_INFO"; 접속 로직 흐름도 Console / KVM 시작 화면 구성 KVM / 콘솔 등록 팝업 위치 STGCommonSrc\com\netand\Namvi\SubProcess\STG\Setting\DevKind\ConsoleRegistPopup.mxml ConsoleRegistPopup Console / KVM 데이터 추가버튼 onAdd() {

devData.addItem( )

} ConsoleRegist.mxml ( 1 ) 각각의 장비 알기!! 등록하는 장비에 따라 다른 캔버스를 출력 private function onAddData():void{
if( devRegistViewStack.selectedChild is KVMRegist ){
KVMRegist(devRegistViewStack.selectedChild).onAdd();
}
else{
ConsoleRegist(devRegistViewStack.selectedChild).onAdd();
}
} ( 0 ) /**
* Data Collector에서 필요로 하는 자료 여부 결정
*/
public final class CIM_DATATYPE
{
public static const DEVICE_INFO:int = 0; // 장비 정보
public static const TERMINAL_LIST:int = 1; // 터미널 리스트 (외부/내부)
public static const INTERNAL_TERM_SET:int = 2; // Internal 속성 터미널 셋팅
public static const DEFAULT_TERM_SET:int = 3; // 기본 터미널 셋팅
public static const SSG_INFO:int = 4; // SSG 캡춰 여부 ( 서버 정보 까지 )
public static const CONSOLE_DEVICE_INFO:int = 5; // Console 장비 정보
public static const SVC_TYPE_INFO:int = 6; // SVC_TYPE 정보
public static const LOGININFO:int = 7; // SCC에 로그인한 정보 (Client_key, User_id 등... )

public static const AUTOLOGIN_INFO:int = 8; // 자동로그인 정보
public static const PROTOCOL_ENCRYPT_INFO:int = 9; // 프로토콜 암호화 정보 로드
public static const SESSION_TIMEOUT_INFO:int = 10; // 세션 타임아웃 정보

public static const AUTH_KEY_INFO:int = 11; // 인증키 시스템 정보 처리
public static const SITE_INFO:int = 12; // 망지정 SITE 정보

// 장비 접속 관련
public static const DEVCON_INTERNAL:int = 1000; // 내부 터미널 접속 요청
public static const DEVCON_EXTERNAL:int = 1001; // 외부 터미널 접속 요청
public static const DEVCON_HTTP:int = 1002; // HTTP 연결 요청

} " WINTERM "
" BYPASS "
" RDP4 "
" BYPASS_INFI " 자체 프로그램 외부 프로그램 중간 단계에서 패킷 분석 등을 할수없거나 필요로 하지 않는 접속
EX) RDP 자체 암호화 : 동영상 등 캡쳐로 확인은 하지만 따로 분석은 않습니다. FTP STGClient를 통한 FTP 접속일 경우 암호화된 FTP "WINTERM"
"BYPASS"
"RDP4"
"BYPASS_INFI" "FTP"
"FTP_PASV"
"FTP_ACTV"
"STGClient" 호출된 setDevConnInfo( data as XML, this.Loader ); 웹에서 파일 전송시 사용하는 프로토콜 호스트로 들어가는 통로 File Transper protocol
파일전송을 위하 프로토콜, TCP 위에 올라간다. 용어 정리 :
프로토콜 : 네트워크 상의 장치들이 정보를 교환하는 방식에 대한 규칙 RDP [remote desktop protocol]란,
마이크로소프트(Microsoft Corporation)의 윈도우즈 NT 운영체제가 실행되고 있는 시스템이 마이크로소프트사의 윈도우즈 CE 운영체제 시스템과 통신하기 위한 프로토콜.

약 20kbps의 좁은 대역폭에서도 동작하는 프로토콜이다. 마이크로소프트가 자사 시스템간의 통신 프로토콜을 제공하는 반면 시트릭스 시스템스 같은 업체는 다른 시스템과의 연결성도 제공하고 있다. 시트릭스 시스템스에서 개발한 ICA(independent computing architecture)는 마이크로소프트의 윈도우즈 NT 서버와 통신하기 위한 프로토콜이다. 워커 가운데 "장비 접속 진행 클래스"가
해당 collector 가 가진
"requester extends ConnectDevice_Requester" 변수 를
1. 생성하고
2. 클래스 내 변수에 데이터를 넣어주고
3. 접속을 진행 ( start 함수 호출) 위 requester 의 start() 함수 실행
- center.request_deviceConnect 실행 ..

이거 실행하면 requestOK 함수 호출 된다.

requestOK 함수에서 ConnectIformXML 실행을 통해 xml 값 리턴 받고

이를 인자로 RUN 함수 실행 <root>
<ver major="1" minor="0" lower="0" product="ACS"/>
<ver major="3" minor="1" lower="2" product="COMMON"/>
<ver major="1" minor="0" lower="0" product="CRYPTO"/>
<ver major="3" minor="0" lower="0" product="NMS"/>
<ver major="3" minor="1" lower="16" product="STG"/>
</root> package com.netand.Namvi.menusystem.menumanager.cim.connectdatacollector.collector
{
import com.netand.Namvi.Information.InformObject.InformObject_ID;
import com.netand.Namvi.Information.Language.ILanguageManager;
import com.netand.Namvi.Information.MOM.IMOMInform;
import com.netand.Namvi.Loader.ILoader;


/**
* Collecter를 생성하는 팩토리 클래스
*/
public final class CIM_ConnectDataCollectorFactory
{

public static function createCollector( info:XML, loader:ILoader ):ICIM_ConnectDataCollector{

var lanManager:ILanguageManager = loader.getInform( InformObject_ID.LANGUAGE )
var mom:IMOMInform = loader.getInform( InformObject_ID.MOM );

if( info.@req_type.toString() == "direct" ){
return new CIM_ConnectDataCollector_DirectConnect( info, lanManager );
}else if( info.@conn_type.toString() == "SFTP" ){
// SFTP 처리
return new CIM_ConnectDataCollector_SFTP( info, lanManager );
}else if( info.@conn_type.toString() == "CONSOLE" ){
// 콘솔 접속 ( KVM 까지 처리 )
return new CIM_ConnectDataCollector_Console( info, lanManager );
}else if( info.@conn_type.toString() == "HTTP" ||
info.@conn_type.toString() == "HTTPS" ){
if( mom.isPermit( 'device_devURLSetting' )){
//SWG를 사용 하기 위해서 BYPASS를 타야해서 HTTP_SWG로 따로 만듬.
return new CIM_ConnectDataCollector_HTTP_SWG( info, lanManager );
}
// HTTP, HTTPS
return new CIM_ConnectDataCollector_HTTP( info );
}else if( info.@conn_type.toString() == "WINTERM" ||
info.@conn_type.toString() == "BYPASS" ||
info.@conn_type.toString() == "RDP4" ||
info.@conn_type.toString() == "BYPASS_INFI" ){

// BYPASS
return new CIM_ConnectDataCollector_BYPASS( info, lanManager );

}else if( (info.@conn_type.toString() == "FTP"||
info.@conn_type.toString() == "FTP_PASV"||
info.@conn_type.toString() == "FTP_ACTV") &&
info.@terminal_type.toString() == "STGClient") {

// STGClient를 통한 FTP 접속일 경우
return new CIM_ConnectDataCollector_FTP( info );

}else if( info.@terminal_type.toString() == "Internal" ) {

// 내부 터미널만 사용해야 할 경우
return new CIM_ConnectDataCollector_Internal( info );

}else{
// 나머지는 무조건 외부터미널 처리
return new CIM_ConnectDataCollector_External( info, lanManager );
}
}
}
} Setting.mxml // 클릭 이벤트를 통해 "콘솔/ kvm 정책 설정" 요청
private function loadResult( result:Boolean, msg:String ):void{
if( !result ){
MyAlert.error("[Language Resource Error] " + msg );
return;
}

switch(param){
/** 임시로 콘솔 페이지를 띄우기 위한것이다. 4.0.0 에서는 탭으로 구분하여 통합할것임
* 이것은 어디까지나 임시이다. 빨리 지워주자. **/
case "devConsoleConfig":
view = new DevConsoleView();
LanguagePathFactory.LanguagePathSet( this, "devKindConfig" );
break;
}


뷰 생성
public function addView( ):void{
createWindow( view , WindowType.NORMAL_WINDOW );
view.addEventListener( WindowEvent.WINDOW_CLOSE , onWindowClose );
} 클래스 SettingLanguagePathFactory.as
메서드1 LanguagePathSet{
case "devKindConfig" :
lanJOB.push( lan_path.getPath( lan_path.SETTING_DEV_MANAGE ));
lanJOB.push( lan_path.getPath( lan_path.SEARCH_CONDITION ));
lanJOB.push( lan_path.getPath( lan_path.SETTING_ACCOUNT_PROTOCOL ));
break;

// 리소스 로드
languageManager.loadFile_JOB( lanJOB, loadResult );
}


메서드2 loadResult{
setting_view.addView();
} (1) (2) (3) (4) DevConsoleView.mxml ( NDT_View)

1. function onAdd()


2. function createConsoleView() 1. 화면 사이즈 설정
2. Loader 가져옴
3. NDC 받아옴 1. this.addchild( new ConsoleView.mxml )
2. ConsoleView 에 loader 입력
3. ConsoleView 에 sub_p 입력
4. ConsoleView 에 oncreationComplete 호출 (5) function onCreationComplete(){
1. 데이터 담을 그릇(arrayCollection 들 ) 초기화
2. onInit_Search() 호출을 통해 itemEditor에 쓰일 데이터 가져옴
3. refresh()호출 하여 grid 데이터 갱신 한다.
} (6) (7) //상위그리드 1행의 상세 데이터를 하단부 그리드에 넣어주는 작업
private function onItemClick( event:ListEvent ):void{



} 1. 아이템 클릭 2. 상세 정보 가져옴 (8) refresh(){
startFilterFunction() // 장비 정보 불러오기 시작
} (9) startFilterFunction(){
1. searchObj 데이터 입력 // 검색 조건입력 grp, kind.colum, data ... 다 " " 인데??
2. getDevInfo 호출 // 장비 정보 불러오기 진짜 시작
} consoleDetailGrid.dataProvider = port_Data;
KVMDetailGrid.dataProvider = kvm_Data
devGrid 데이터 = dev_Data (10)
getDevInfo(){
1. 하단 Grid 의 DataProvider 인자 초기화
2. 데이터 변수들 초기화 / 상위 그리드 data 초기화
3. 페이징 초기화
4. 그리드 데이터 조작 변수 초기화(복사본들 초기화
5. 상위 dataGrid에 넣을 데이터 DB 요청 dev_Data.
} (11)
getConsoleListResult(){
1. db 가져온 데이터 dev_data.addItem 해주기
dev_data는 상위 dataGrid의 dataProvider 전달 인자
2. 페이징 처리
3. 데이터 복사해두기
4. 검색 결과 정리
} (12)

위에서 최초 상위 그리드의 데이터를 뿌려진 상태의 후처리
상위그리드 1행의 상세 데이터를 하단부 그리드에 넣어주는 작업

searchResult(){
if( 1행 데이터 == 콘솔)

else if(1행 데이터 == kvm)
} 코드 중복 if ( Console 클릭 )
consoleDetailbox 키우고
kvmDetailBox 줄이고 안보이게
selectPortInfo( devGrid.selectedItem.mng_num);

esle if( kvm 클릭 )
consoleDetailbox 줄이고 안보이게
kvmDetailBox 키운다.
selectKVMInfo(devGrid.selectedItem.mng_num); 코드 중복 상위 데이터 그리드 아이템 클릭시 발생하는
하위 데이터 그리드 갱신 작업 [ 상위 데이터 그리드 채워주고 상위 데이터 그리드 첫번째 행 데이터의 상세 데이터 하단부 데이터 그리드에 채워주는 작업 ] 정책설정메뉴에서 클릭 이벤트 발생 : 화면 요청 시작 랭귀지 팩토리에서 언어 설정 완료 후 view 요청 ... NDT_View 요청 실제 화면 셋팅 //itemEditor 에 쓰일 데이터 호출 1. Console / KVM 첫 화면 출력
2. "상위 데이터 그리드" 아이템 클릭
3. 조회 버튼 클릭
4. 장비 등록 버튼 클릭
5. 삭제 버튼 클릭 //콘솔 상세 정보 불러오기 _ 포트정보
selectPortInfo(){
1. 하위 데이터 그리드 정보 초기화
2. 콘솔 포트 정보 DB 요청
} //select 해온 데이터 하위 데이터 그리드의 dataProvider 의 인자로 전달
getConsolePortResult(){} // KVM 상세 정보 요청
selectKVMInfo(){
1. 하위 데이터 그리드 정보 초기화
2. KVM 연결 정보 DB 요청
} //select 해온 데이터 하위 데이터 그리드의 dataProvider 의 인자로 전달
getResult(){} "하위 데이터 그리드" 값 넣어주는 작업
( 중복 코드 )
1. onItemClick 함수
2. searchResult 함수 A start / B 요거 클릭
= refresh() 호출 조회 버튼 : refresh() 요청 해야 할 것
--- 접속 로직 분석
--- KVM 장비 추가 / 콘솔 장비 추가
--- 첫 화면 요청
--- 아이템 하나 클릭
--- DB 부분 로직 구성 확인
--- 삭제버튼 --- 장비 추가에도 버튼이 쫌 있네!!
--- 저장버튼

3. 아이템 에디터들
6. 데이터 검색 부분
7. 페이징
4. 하위 데이터 그리드...
== 장비별로 다.. 따로 있네
8. 하위 데이터 그리드 : "설정" 버튼
== 장비 별로 다... 따로 있네
9. 상단 커스텀 버튼! // 장비 추가를 위한 팝업 창 호출 KVM / 콘솔 등록 팝업 위치 STGCommonSrc\com\netand\Namvi\SubProcess\STG\Setting\DevKind\ConsoleRegistPopup.mxml ConsoleRegistPopup Console / KVM 추가 팝업 시작 구성 ConsoleRegist.mxml // 장비 추가를 위한 팝업 창 호출 //KVM 장비등록, CONSOLE 장비 등록에 따라
//각각에 대한 페이지를 따로 출력함.
viewStackChange(){
1. ViewStack 정보 갱신
2. 해당 viewStack 의 InIt(로더, sup) 호출
3. 해당 viewStack 의 데이터 초기화 clean()호출
4. 팝업창 이름 변경
} //준비 작업
init(){
1. 로더 , sub_p 입력
2. crypto 입력
3. NDC 입력
4. 시퀀스 매니저를 통해 DB서 마지막 시퀀스 정보 가져옴
5. 장비 그룹 목록 요청 [ itemEditor에 쓰일 장비 그룹 데이터 요청 ]
6. 서버 정보 요청 [ itemEditor에 쓰일 서버 정보 요청 ]
7. 멀티 서비스 리스트 정보 요청 [ itemEditor 에 쓰일 용도 ]
} KVMRegist.mxml 시작 페이지 로딩시에 쓰이는 것과 같은 코드들
역시나 itemEditor 의 dataProvider 값! // viewStack 변경 시 마다 데이터 그리드 내용 초기화 해준다.
cleanData():void{
devData.removeAll();
} //viewStack 변경 시 마다 데이터 그리드 초기화 해준다.
cleanData():void{
kvmdevData.removeAll();
} 복사해서 쓴 코드들 이대로 좋은가?
하나를 고칠 때 딴거 영향 안줘서 좋은건가?
그래도 복사해서 쓴것의 상위가 수정 되면 하위는 개별 적으로 다 고쳐야 하잖아. 이런 것에 자유로우려면 ..?? //준비 작업
init(){
1. 로더 , sub_p 입력
2. crypto 입력
3. NDC 입력
4. 시퀀스 매니저를 통해 DB서 마지막 시퀀스 정보 가져옴
5. 장비 그룹 목록 요청 [ itemEditor에 쓰일 장비 그룹 데이터 요청 ]
6. 서버 정보 요청 [ itemEditor에 쓰일 서버 정보 요청 ]
7. protocol_data 입력 : telnet/ssh arrayCollection 에 등록
} 시작 페이지 로딩시에 쓰이는 것과 같은 코드들
역시나 itemEditor 의 dataProvider 값! 콤보박스 클릭시 stack 변경 /*
* 새로운 로 추가
* 장비 그룹 데이터 와 포트 프로토콜 데이터의
* 각 0번을 가져와 데이터 그리드에 추가
*/ devData 는 바인딩 되어 있다. KVM / 콘솔 등록 팝업 위치 STGCommonSrc\com\netand\Namvi\SubProcess\STG\Setting\DevKind\ConsoleRegistPopup.mxml ConsoleRegistPopup Console / KVM 데이터 추가버튼 ConsoleRegist.mxml KVMRegist.mxml private function saveValidation():void{
1. 데이터 확인
2. DB등록된 장비와 중복 검사 전에
'저장 요청'된 장비명 중복 먼저 체크
3. DB 데이터 장비명 중복 확인 요청


} select 처리 부분
public function select_Data(ret:IDBResult, id:String):void{

if (id == "Duplication"){
//장비 명 중복확인을 위해 데이터 받아옴

}else if(id == "conInfo"){
//멀티 서비스에 mng_nu/conn type 값 추가
}

}else if(id == "seq_mng_num"){

}
} /** 셀렉트 후 */

public function select_End(id:String):void{
if(id == "Duplication" ) {
1. DB 데이터와 입력된 데이터 중복 확인
2. setSequenceData() 호출
}

else if(id == "seq_mng_num" ){
++cntSync;
if(cntSync == devData.length){
onSaveData();
}else {
setSquenceData();
//등록 요청 데이터 2개 이상일 때
//반복 하여 sequenceData 호출 아님 패스!
}
}

else if(id == "conInfo"){
if(cntTypeCnt == devData.length){

//검색해 온 mng_num, conn_type값
//STG_DEV_CONINFO 테이블에 데이터를 넣는 작업을 실행
saveDevConInfo();
}
}
} ( 2 ) (3) (4)
private function selectDevConInfo():void{




} ( 5_0 ) (6) public function query_End (id:String, valid:Boolean):void{

if(id == "insertDev"){
// 추가된 장비의 멀티서비스 적용_을 위한 처리..
selectDevConInfo()
}

else if(id == "insertDevInfo"){
if(valid){
MyAlert.info(languageManager.getValue("dev_manage.msg.dev_regist_success"));

// 부모창 리프레쉬
ConsoleView(openner).refresh();

// 글로벌 이벤트를 발생 - 장비 트리 리프레쉬한다
eventCenter.dispatchEvent( NamviEvent.DEVTREE_REFRESH );

// 팝업창을 닫는다.
ConsoleRegistPopup(registOpenner).removePop();
}

else{
MyAlert.error(languageManager.getValue("dev_manage.msg.dev_regist_fail"));
return;
}
}
} (7) (9) (8) /**
* 새로 추가한 장비의 접속 프로토콜은 STG_DEV_CONINFO테이블에도 저장되어야 한다.
* (장비번호와 접속 프로토콜 데이터가 필요한데, 장비번호가 새로운 장비가 INSERT된 후 가져올 수 있어서
* 새로운 장비의 INSERT 쿼리가 끝난 후 장비번호를 가져와 STG_DEV_CONINFO테이블에 데이터를 넣는 작업을 수행한다.)
*/ /* INSERT 문 처리
* 새로 추가한 장비를 저장하고, 장비의 포트를 자동 생성한다.
* 포트수 내에서 정해진 시작포트와 마지막 포트를 확인한 뒤,
* 지정된 프로토콜로 생성된다. ( 상태는 장비가 연결되지 않았으므로 defalut 0 으로 저장됨. )
*/ (10) 저장 하기 버튼 클릭 private function onSave():void{
if(KVM){
KVMRegist(devRegistViewStack.selectedChild).onSave();
}
else{
ConsoleRegist(devRegistViewStack.selectedChild).onSave();
}
} ( 0 ) //암호화 적용(Select)
ndc.Select( "SELECT " + crypto.Decode( "NAD_DEV10", "DEV_NM" ) + //DEV_NM
" FROM NAD_DEV10 " +
"WHERE " +
crypto.Decode( "NAD_DEV10", "DEV_NM" ) + " IN ("+devList+")",this, "Duplication"); multi_data.addItem({mng_num:ret.getCol(0), conn_type:ret.getCol(1)}); // 장비 추가를 위한 팝업 창 호출 이 함수가 하는 일
1. 장비 그룹 데이터 가져오기
2. 포트 프로토콜 데이터 가져오기
1,2 번 데이터
init() 에서 요청해 놓았던 itemRender용 데이터 가운데 0번 가져온다.
3. 나머지값은 CONSOLE 또는 ""

암튼 아래와 같이 가라 데이터로 로 하나를 생성한다. cnt:count++, dev_nm:"", dev_ip:"", dev_kind:"CONSOLE", dev_grp:dg_data[0].label, server_id:sid_data[0].label, acct_conn:"CONSOLE", port_protocol:"TELNET", port_cnt:"", port_start:"", port_end:"", dev_grpNum:dg_data[0].data, model:"" onAdd() {

devData.addItem( )

} ( 1 ) /*
* 새로운 로 추가
* 장비 그룹 데이터 와 포트 프로토콜 데이터의
* 각 0번을 가져와 데이터 그리드에 추가
*/ devData 는 바인딩 되어 있다. 이 함수가 하는 일
1. 장비 그룹 데이터 가져오기
2. 연결 장비 설정 데이터 가져오기
1,2 번 데이터
init() 에서 요청해 놓았던 itemRender용 데이터 가운데 0번 가져온다.
3. 나머지값은 CONSOLE 또는 ""

암튼 아래와 같이 가라 데이터로 로 하나를 생성한다. { cnt:count++, dev_nm:"", dev_ip:"",
grp_nm:dg_data[0].label,
server_id:sid_data[0].label,
model:"", dev_grpNum:dg_data[0].data, port:"", kvm_num:"", kvm_grp_nm:"", kvm_dev_nm:"", kvm_dev_ip:"", kvm_dev_kind:"", kvm_multi_svc:""} KVMRegist.mxml 서버선택은 사용자가 지정 못하고 초기에 stg01 들어가서 이걸로 항시 초기 셋팅됨 : 사용자 수정 기능 없음 추가 버튼 클릭 빈 값들 채우고 "저장" 클릭 문제점 발견... 미리미리 path 지정 안해놓으면 깨알같이 써놓은 부분 못 찾게 된다. ㅡㅜㅡ
멀티 서비스 = 장비가 관리하는 서비스가 980개..?? C D E F onSave(){
if( 로에 데이터 없다. ) 경고 !
esle( addHandler() 호출 )
} ( 1 ) addHandler ==> saveValidation 호출
뭐가 암호화 되어 있다는 것이지??? onSaveData(){


} setSequenceData(){
1. sequence 데이터 받아와 변수에 입력
2. select_End("seq_mng_num");
} select selectEND ( 5_1 ) ( 5_1+?+1 ) ( 5_1+? ) ( 5_2 or 1+?+2 ) private function saveValidation():void{
1. 데이터 확인
2. DB등록된 장비와 중복 검사 전에
저장 요청된 장비명이 중복 먼저 체크
3. DB 데이터 장비명 중복 확인 요청


} select 처리 부분
public function select_Data(ret:IDBResult, id:String):void{

if (id == "Duplication"){
//장비 명 중복확인을 위해 데이터 받아옴

}else if(id == "conInfo"){
//멀티 서비스에 mng_nu/conn type 값 추가
}

}else if(id == "seq_mng_num"){

}
} /** 셀렉트 후 */

public function select_End(id:String):void{
if(id == "Duplication" ) {
1. DB 데이터와 입력된 데이터 중복 확인
2. setSequenceData() 호출
}

else if(id == "seq_mng_num" ){
++cntSync;
if(cntSync == devData.length){
onSaveData();
}else {
setSquenceData();
//등록 요청 데이터 2개 이상일 때
//반복 하여 sequenceData 호출 아님 패스!
}
}

else if(id == "conInfo"){
if(cntTypeCnt == devData.length){
//검색해 온 mng_num, conn_type값
//STG_DEV_CONINFO 테이블에 데이터를 넣는 작업을 실행

saveDevConInfo();
}
}
} ( 2 ) (3) (4)
private function selectDevConInfo():void{

} ( 5_0 ) (6) public function query_End (id:String, valid:Boolean):void{

if(id == "insertDev"){
// 추가된 장비의 멀티서비스 적용_을 위한 처리..
selectDevConInfo()
}

else if(id == "insertDevInfo"){
if(valid){
MyAlert.info(languageManager.getValue("dev_manage.msg.dev_regist_success"));

// 부모창 리프레쉬
ConsoleView(openner).refresh();

// 글로벌 이벤트를 발생 - 장비 트리 리프레쉬한다
eventCenter.dispatchEvent( NamviEvent.DEVTREE_REFRESH );

// 팝업창을 닫는다.
ConsoleRegistPopup(registOpenner).removePop();
}

else{
MyAlert.error(languageManager.getValue("dev_manage.msg.dev_regist_fail"));
return;
}
}
} (7) (9) (8) /**
* 새로 추가한 장비의 접속 프로토콜은 STG_DEV_CONINFO테이블에도 저장되어야 한다.
* (장비번호와 접속 프로토콜 데이터가 필요한데, 장비번호가 새로운 장비가 INSERT된 후 가져올 수 있어서
* 새로운 장비의 INSERT 쿼리가 끝난 후 장비번호를 가져와 STG_DEV_CONINFO테이블에 데이터를 넣는 작업을 수행한다.)
*/ /* INSERT 문 처리
* DB에서 장비번호를 가져온 후
* 그 장비번호로 DB에 장비를 저장한다.
/ (10) //암호화 적용(Select)
ndc.Select( "SELECT " + crypto.Decode( "NAD_DEV10", "DEV_NM" ) + //DEV_NM
" FROM NAD_DEV10 " +
"WHERE " + crypto.Decode( "NAD_DEV10", "DEV_NM" ) + " IN ("+devList+")",this, "Duplication"); multi_data.addItem({mng_num:ret.getCol(0), conn_type:ret.getCol(1)}); onSave(){
if( 로에 데이터 없다. ) 경고 !
esle( addHandler() 호출 )
} ( 1 ) addHandler ==> saveValidation()호출
뭐가 암호화 되어 있다는 것이지??? onSaveData(){


} setSequenceData(){
1. sequence 데이터 받아와 변수에 입력
2. select_End("seq_mng_num");
} select selectEND ( 5_1 ) ( 5_1+?+1 ) ( 5_1+? ) ( 5_2 or 1+?+2 ) Console나 KVM 이나 함수 요청 순서는 같다.
다만 프로토콜 요청 부분과 같이 각각에서 필요한 데이터가 조금씩 차이를 보인다( 쿼리나 UI코드가 다르다.) console/KVM 2개의 캔버스로 구성된 스택임 접속 클릭 worker_table (배열) 에 push한 클래스 하나씩 꺼내서 실행( run 함수 호출)
이 작업을 통해 장비 해당 클래스의 인스턴스를 생성하고
장비 접속에 필요한 데이터 값을 셋팅하게 된다.
============
run 안에 requester 있으면 그거 호출! ConsoleView.mxml private function consoleRegist():void{ if( ! bOpenPop() ){ return; }

consolReg = new ConsoleRegistPopup(); consolReg.popInit( this );
subP.createWindow( consolReg, WindowType.POPUP_WINDOW );} 팩토리 상세 보기 !! // 내부 터미널 // 외부 터미널 // HTTP 접속 끝. 파란색 = 클래스 빨간색 = 함수 쿼리 요청 부분 쿼리 : select A.grp_num, A.grp_nm, A.pgrp_num from nad_grp10 a, (SELECT column_value as grp_num
FROM TABLE (devauth.user_devgrp ('zenspace', 99)))b WHERE a.grp_num = b.grp_num ORDER BY A.GRP_NM 쿼리 SELECT A.SERVER_ID, A.SERVER_IP, A.NAC_PORT, DECODE(A.NAC_STATUS, 0, 'Dead', 1, 'Active', 2, 'Standby'), DECODE(A.SERVER_STATUS, 0, 'Dead', 1, 'Alive'), A.PRIORITY, A.SERVER_DESC, A.NETWORK_AREA
FROM NAD_SVR_LIST A WHERE A.USAGE = 1 ORDER BY A.SERVER_ID param.type = "CONSOLE_DEVICE_INFO"
param.page = page;
param.fetchSize = fetchSize;
if( null != searchObj ){
param.grp_num = searchObj.group;
param.kind = searchObj.kind;
param.column = searchObj.column;
param.searchCondition = searchObj.data;
}
n3service.request( "GET_DEVICE_DATA" , getConsoleListResult, param );

dev_Data.addItem({mng_num:node.@mng_num.toString(), dev_nm:node.@dev_nm.toString(),
dev_ip:node.@dev_ip.toString(), dev_model:node.@model.toString(),
dev_kind:node.@dev_kind.toString(), grp_num:node.@grp_num.toString(),
grp_nm:node.@grp_nm.toString(), server_id:node.@server_id.toString(),
port_cnt:node.@port_cnt.toString(), port_use:node.@port_use.toString(),
def_acct:node.@acct_nm.toString(), auto_login:node.@auto_login.toString(),
tpt_nm:node.@tpt_nm.toString(), tot_cnt:node.@tot_cnt.toString() }); 쿼리
SELECT * FROM (SELECT T.*, FLOOR((ROWNUM - 1) / 20 + 1 ) PAGE FROM (SELECT A.MNG_NUM, CRT.decrypt(A.DEV_NM, 'NAD_DEV10.DEV_NM') as DEV_NM, CRT.decrypt(A.DEV_IP, 'NAD_DEV10.DEV_IP') as DEV_IP, CRT.decrypt(A.MODEL, 'NAD_DEV10.MODEL') as MODEL, CRT.decrypt(A.DEV_KIND, 'NAD_DEV10.DEV_KIND') AS DEV_KIND, A.GRP_NUM, B.GRP_NM, A.SERVER_ID, C.PORT_CNT, COUNT(C.PORT) as CNT, D.ACCT_NM, C.AUTO_LOGIN, A.TPT_NM, COUNT (*) OVER () AS tot_cnt FROM NAD_DEV10 A, NAD_GRP10 B, NAD_DEV_CONSOLE C, NAD_ACCT_LIST D, (SELECT column_value as mng_num FROM TABLE (devauth.user_dev ('zenspace', 99)))E WHERE A.grp_num = B.grp_num AND A.MNG_NUM = C.MNG_NUM (+) AND A.MNG_NUM = E.MNG_NUM AND ( CRT.decrypt(A.DEV_KIND, 'NAD_DEV10.DEV_KIND') = 'CONSOLE' OR CRT.decrypt(A.DEV_KIND, 'NAD_DEV10.DEV_KIND') = 'KVM') AND A.DEF_ACCT = D.ACCT_NM (+) GROUP BY A.MNG_NUM, A.DEV_NM, A.DEV_IP, A.MODEL, C.PORT_CNT, D.ACCT_NM, A.GRP_NUM, B.GRP_NM, A.SERVER_ID, A.DEV_KIND, C.AUTO_LOGIN, A.TPT_NM ORDER BY A.MNG_NUM) T) WHERE PAGE = 1 {실제 데이터 예)
auto_login "1"
def_acct "" dev_ip "192.168.0.51" dev_kind "CONSOLE" dev_model "기타" dev_nm "CentOS_test" grp_nm "연구팀" grp_num "4" mng_num "41" port_cnt "1" port_use "1" server_id "STG_01" tot_cnt "14" tpt_nm ""
} db db db param.type = "CONSOLE_PORT";
param.mng_num = mng_num;n3service.request( "GET_DEVICE_DATA" , getConsolePortResult, param ); db 쿼리
SELECT PORT_IDX, A.STATUS, PROTOCOL, PORT, CON_NUM, FN_CONNECT_BY_PATH ('nad_grp10', b.grp_num) hie, CRT.decrypt(B.DEV_NM, 'NAD_DEV10.DEV_NM') as DEV_NM, CRT.decrypt(B.DEV_IP, 'NAD_DEV10.DEV_IP') as DEV_IP, A.MNG_NUM, A.PORT_CNT, (SELECT COUNT (port.status) FROM nad_dev_console port WHERE a.mng_num = port.mng_num AND port.status = 1) conn_port_cnt, DECODE(A.status, 0, 'N/A', 1, 'Connected') status_label, (SELECT CRT.decrypt(MODEL, 'NAD_DEV10.MODEL') as MODEL FROM nad_dev10 WHERE a.con_num = mng_num ) MODEL

FROM NAD_DEV_CONSOLE A, NAD_DEV10 B WHERE A.MNG_NUM = '41' AND A.CON_NUM = B.MNG_NUM(+) ORDER BY PORT_IDX

실제 데이터 예)
<data port_idx="1" status="1" protocol="TELNET" port="7001" con_num="244" grp_nm="1.연구소 / 연구팀" dev_nm="192.168.0.203_2" dev_ip="192.168.0.203" mng_num="41" port_cnt="1" conn_port_cnt="1" status_label="Connected" model="기타"/> param.type = "KVM_LIST"; param.mng_num = mng_num; n3service.request( "GET_DEVICE_DATA" , getResult, param ); db 쿼리
SELECT CON_NUM, CRT.decrypt(B.DEV_NM, 'NAD_DEV10.DEV_NM') AS DEV_NM, CRT.decrypt(B.DEV_IP, 'NAD_DEV10.DEV_IP') AS DEV_IP, A.PROTOCOL, A.PORT, C.GRP_NM, CRT.decrypt(B.DEV_KIND, 'NAD_DEV10.DEV_KIND') AS DEV_KIND, A.MNG_NUM, B.CONN_TYPE

FROM NAD_DEV_CONSOLE A, NAD_DEV10 B, NAD_GRP10 C WHERE A.MNG_NUM = '47' AND A.CON_NUM = B.MNG_NUM(+) AND B.GRP_NUM = C.GRP_NUM(+)

실제 데이터 예)
<
device con_num={ret.getCol(0)} dev_nm={ret.getCol(1)} dev_ip={ret.getCol(2)} protocol={ret.getCol(3)}
port={ret.getCol(4)} grp_nm={ret.getCol(5)}
dev_kind={ret.getCol(6)} mng_num={ret.getCol(7)}
conn_type={ret.getCol(8)}
/>; db db 달라 var ndc:INDCCenter = loader.getInform(InformObject_ID.NDC);

// 이전 데이터를 저장한다. 이유 : 장비명, 장비IP, 장비종류가 같은 데이터가 여러개 등록되었을 경우 각각마다 SELECT를 날리면 STG_DEV_CONINFO테이블에 중복데이터가 들어감.

var prevData:Object = new Object(); prevData.dev_nm = ""; // 장비명
prevData.dev_ip = ""; // 장비
IP prevData.dev_kind = ""; // 장비종류

cntTypeCnt = 0;

for each(var i:Object in devData){

if (prevData.dev_nm == i.dev_nm && prevData.dev_ip == i.dev_ip && prevData.dev_kind == i.dev_kind){
return;
} else{
prevData.dev_nm = i.dev_nm;
prevData.dev_ip = i.dev_ip; prevData.dev_kind = i.dev_kind;

//암호화 적용(Select) 유보
ndc.Select("SELECT MNG_NUM, CONN_TYPE " +
"FROM NAD_DEV10 " +
"WHERE " + crypto.Decode( "NAD_DEV10", "DEV_NM" ) + " ='" + i.dev_nm + //DEV_NM "' AND " + crypto.Decode( "NAD_DEV10", "DEV_IP" ) + " ='" + i.dev_ip + //DEV_IP "' AND " + crypto.Decode( "NAD_DEV10", "DEV_KIND" ) + " ='" + i.dev_kind + "'" //DEV_KIND , this, "conInfo");
}
} db db db db
private function saveDevConInfo():void{
var ndc:INDCCenter = loader.getInform(InformObject_ID.NDC);
var queryJob:NDCDBJob_DML = new NDCDBJob_DML(this, ndc, "insertDevInfo");
for each(var i:Object in multi_data)
{ queryJob.addDML("INSERT INTO STG_DEV_CONINFO (MNG_NUM, SVC_TYPE)
VALUES(" + i.mng_num + ", '" + i.conn_type + "');"
);
}
ndc.addJob(queryJob);
} 실제 쿼리
INSERT INTO STG_DEV_CONINFO (MNG_NUM, SVC_TYPE) VALUES(381, 'TELNET'); db db private function onSaveData():void{
var ndc:INDCCenter = loader.getInform(InformObject_ID.NDC);
var queryJob:NDCDBJob_DML = new NDCDBJob_DML(this, ndc, "insertDev");
var cnt:Number = 0;
var mng_num:String = "";
for each(var i:Object in devData){

mng_num = seq_mng_num.getItemAt(cnt).mng_num; //DB에서 가져온 장비번호를 순서대로 가져온다.
//trace("mng_num: "+mng_num);

if(i.dev_ip != "" && i.dev_nm != ""){
var qry:String = "INSERT INTO NAD_DEV10 ( MNG_NUM, DEV_NM, DEV_IP, GRP_NUM, SERVER_ID, DEV_KIND, CONN_TYPE, MODEL, VENDOR, READ_COMMUNITY ) " +
"VALUES ( " + mng_num + ", " +
crypto.Encode( "NAD_DEV10", "DEV_NM", i.dev_nm, false ) + ", " + //DEV_NM
crypto.Encode( "NAD_DEV10", "DEV_IP", i.dev_ip, false ) + ", " + //DEV_IP
i.dev_grpNum + ", '" + i.server_id + "', " +
crypto.Encode( "NAD_DEV10", "DEV_KIND", i.dev_kind, false ) + ", " + //DEV_KIND
"'" + i.port_protocol + "', " + //PORT PROTOCOL TYPE
crypto.Encode( "NAD_DEV10", "MODEL", i.model, false ) + ", " +
crypto.Encode( "NAD_DEV10", "VENDOR", "ETC", false ) + ", " + // VENDOR
crypto.Encode( "NAD_DEV10", "READ_COMMUNITY", "public", false ) + ");"; // READ_COMMUNITY

//암호화 적용(Insert)
queryJob.addDML( qry ); //

//trace("Here~~!!"+ qry);

}
if(i.port_cnt != 0 ){
var port_idx:Number = 1;
var s_port:Number = i.port_start;
var port_cnt:Number = i.port_cnt;
//var e_port:Number = i.port_end;
//var p_cnt:Number = (e_port - s_port)+1;
var e_port:Number = (s_port + port_cnt)-1;
var qry2:String = "";
//if( p_cnt != 0 ){
for(s_port; s_port<=e_port ;s_port++){
qry2 = "INSERT INTO NAD_DEV_CONSOLE ( MNG_NUM, PORT_IDX, PROTOCOL, PORT, STATUS, PORT_CNT ) " +
"VALUES ( " + mng_num + ", " + //mng_num
port_idx++ + ", " + //port_idx
"'" + i.port_protocol + "', " + //port_protocol
"'" + s_port + "', " + //port
"'0', " + //status
"'" + i.port_cnt + "' );"; //port_cnt
queryJob.addDML( qry2 ); //

//trace("Here~~!!"+ qry2);
}
//}
}
++cnt;
}

ndc.addJob(queryJob);
} 실제 요청된 쿼리
INSERT INTO NAD_DEV10 (
MNG_NUM, DEV_NM, DEV_IP, GRP_NUM, SERVER_ID, DEV_KIND, CONN_TYPE, MODEL, VENDOR, READ_COMMUNITY ) VALUES ( 382, CRT.encrypt( 'KillMe' , 'NAD_DEV10.DEV_NM') , CRT.encrypt( '192.168.255.255' , 'NAD_DEV10.DEV_IP') , 19, 'STG_01', CRT.encrypt( 'CONSOLE' , 'NAD_DEV10.DEV_KIND') , 'TELNET', CRT.encrypt( 'IronMan' , 'NAD_DEV10.MODEL') , CRT.encrypt( 'ETC' , 'NAD_DEV10.VENDOR') , CRT.encrypt( 'public' , 'NAD_DEV10.READ_COMMUNITY')
); [ onSaveData() 상세 ] db 선택된 장비의 삭제 여부를 확인한다.
private function deleteData():void{
1. 삭제 요청 된 데이터 존재 확인
2. 삭제 데이터 존재 할 때 deleteOK() 호출
} 요거 클릭
= deleteData() consoleBox > devGrid consoleDetailBox > consoleDetailGrid KVMDetailBox > KVMDetailGrid * 선택된 장비를 삭제한다.
** (DELETE_DATA변수에 임시로 저장해 놓고, 그리드에서 해당 장비를 제거한다)
private function DeleteOK(event:CloseEvent):void{
1. 선택된 장비 정보를 DELETE_DATA로 옮겨 놓는다.
2. 선택된 장비를 "데이터 GRID"에서 제거한다.
3. UPDATE_DATA 에 있을 수도 있단다 확인하고 지워준다.
4. delete 처리
} public function query_End(id:String, valid:Boolean):void{
if (id == "DeleteData"){
1. 장비 트리 리프레시 : 글로벌 이벤트
2. 페이지 초기화 : refresh() 호출
}
if(id == "saveData"){
1. 장비 트리 리프레시 : 글로벌 이벤트
2. 페이지 초기화 : refresh() 호출
}
} 삭


분 jobelement.addDML( "DELETE FROM NAD_DEV10 WHERE MNG_NUM = "+ d.mng_num ); // 장비 테이블
jobelement.addDML( "DELETE FROM NAD_DEV_CONSOLE WHERE MNG_NUM = "+ d.mng_num ); // 콘솔 포트 테이블
jobelement.addDML( "DELETE FROM STG_CMD_AUTH10 WHERE MNG_NUM = "+ d.mng_num ); // 명령어 권한 테이블(사용자)
jobelement.addDML( "DELETE FROM STG_CMD_AUTH20 WHERE MNG_NUM = "+ d.mng_num ); // 명령어 권한 테이블 (그룹)
jobelement.addDML( "DELETE FROM STG_DEV_AUTH10 WHERE MNG_NUM = "+ d.mng_num ); // 장비 권한 테이블 (사용자)
jobelement.addDML( "DELETE FROM STG_DEV_AUTH20 WHERE MNG_NUM = "+ d.mng_num ); // 장비 권한 테이블 (그룹)
jobelement.addDML( "DELETE FROM STG_DIRECT_CON WHERE MNG_NUM = "+ d.mng_num ); // 다이렉트 연결 테이블
jobelement.addDML( "DELETE FROM STG_DEV_CONINFO WHERE MNG_NUM = "+ d.mng_num ); // 멀티서비스 테이블 db 1) 2) 3) private function onSaveData():void{

var ndc:INDCCenter = loader.getInform(InformObject_ID.NDC);
var queryJob:NDCDBJob_DML = new NDCDBJob_DML(this, ndc, "insertDev");
var cnt:Number = 0;
var qry2:String ="";
var set_multi:Number = 0;
var mng_num:String = "";

for each(var i:Object in kvmdevData){
mng_num = seq_mng_num.getItemAt(cnt).mng_num; //DB에서 가져온 장비번호를 순서대로 가져온다.
if(i.dev_ip != "" && i.dev_nm != ""){
var qry:String = " INSERT INTO NAD_DEV10 ( MNG_NUM, DEV_NM, DEV_IP, GRP_NUM, SERVER_ID, DEV_KIND, CONN_TYPE, MODEL,
VENDOR, READ_COMMUNITY ) " + "VALUES ( " + mng_num +", "
+ crypto.Encode( "NAD_DEV10", "DEV_NM", i.dev_nm, false ) + ", " + //DEV_NM
crypto.Encode( "NAD_DEV10", "DEV_IP", i.dev_ip, false ) + ", " + //DEV_IP
"'" + i.dev_grpNum + "', '" + i.server_id + "', " +
crypto.Encode( "NAD_DEV10", "DEV_KIND", "KVM", false ) + ", " + //DEV_KIND
"'TELNET', " + //PORT PROTOCOL TYPE
crypto.Encode( "NAD_DEV10", "MODEL", i.model, false ) + ", " + //MODEL
crypto.Encode( "NAD_DEV10", "VENDOR", "ETC", false ) + ", " + //VENDOR
crypto.Encode( "NAD_DEV10", "READ_COMMUNITY", "public", false ) + ");"; //READ_COMMUNITY
//암호화 적용(Insert)
queryJob.addDML( qry ); //VENDOR
}

// 연결 장비가 설정되지 않았다면,
if(i.kvm_num == ""){
qry2 = " INSERT INTO NAD_DEV_CONSOLE (MNG_NUM, PORT_IDX, PROTOCOL, PORT, STATUS, PORT_CNT)" +
" VALUES (" + mng_num + ", 1, 'BYPASS', '" + i.port +"' , 0, 1 );"; //0으로 고정시킨다. (임시방편임)
queryJob.addDML( qry2 ); //VENDOR
}
// 연결 장비가 설정 되었다면,
else if(i.kvm_num != ""){
set_multi = 0;

//장비에 이미 등록된 멀티 서비스는 추가하지 않도록.
for each(var set_data:Object in multi_Data){
if(set_data.mng_num == i.kvm_num && set_data.svc_type == i.kvm_multi_svc){
set_multi = 1;
}
}

qry2 = " INSERT INTO NAD_DEV_CONSOLE (MNG_NUM, CON_NUM, PORT_IDX, PROTOCOL, PORT, STATUS, PORT_CNT )" +
" VALUES (" + mng_num + ", " + i.kvm_num +", 1, 'BYPASS', '" + i.port +"', 1, 1 );";

queryJob.addDML( qry2 ); //VENDOR

if( set_multi == 0) {
var multi_svc_qry:String = " INSERT INTO STG_DEV_CONINFO " +
" (MNG_NUM, SVC_TYPE) " +
" VALUES(" + i.kvm_num + ", '" + i.kvm_multi_svc + "');";
queryJob.addDML(multi_svc_qry);
}
}

++cnt;
}

ndc.addJob(queryJob); onSaveData상세 * 장비 정보의 수정 여부를 확인한다.
public function saveData():void{
saveOK() 함수 호출 ;
} * 수정된 데이터를 DB에 저장한다.* DELETE_DATA, UPDATE_DATA, INSERT_DATA(PORT), DELETEPORT_DATA 순으로 처리한다.
private function saveOK(event:CloseEvent):void{
1. if UPDATE_DATA 처리 해야한다면 // 암호화 적용(Update)
//dev10 UPDATE 처리
//DEV_CONSOLE UPDATE 처리
2. if 포트 수정 플래그 1이면 : INSERT_DATA 있다면 처리
ㄱ. 이미 등록된 멀티 서비스는 추가하지 않도록 확인
ㄴ. 기존 정보 삭제
ㄷ. if 새로운 내용이 존재한다면
ㄹ.
3. DELETEPORT_DATA 있다면 처리
4. UPDATEKVM_DATA 있다면 처리
} "UPDATE NAD_DEV10 SET " +
"DEV_NM = " + crypto.Encode( "NAD_DEV10", "DEV_NM", j.dev_nm, false ) + ", " + //DEV_NM
"DEV_IP = " + crypto.Encode( "NAD_DEV10", "DEV_IP", j.dev_ip, false ) + ", " + //DEV_IP "MODEL = " + crypto.Encode( "NAD_DEV10", "MODEL", j.dev_model, false ) + ", " + //MODEL"DEV_KIND = " + crypto.Encode( "NAD_DEV10", "DEV_KIND", j.dev_kind, false ) + ", " + //DEV_KIND"GRP_NUM = " + j.grp_num + ", " + "SERVER_ID = '" + j.server_id + "', " + "DEF_ACCT = '" + j.def_acct + "', " + "TPT_NM = '" + j.tpt_nm + "' " + "WHERE MNG_NUM = " + j.mng_num) " UPDATE NAD_DEV_CONSOLE SET " + " AUTO_LOGIN = '" + j.auto_login + "' " + // " 컬럼명 = '" + j.컬럼명 + "' " + " WHERE MNG_NUM = " + j.mng_num); qry = "DELETE FROM NAD_DEV_CONSOLE WHERE PORT_IDX = "+ k.port_index +" AND MNG_NUM = " +k.mng_num;jobelement.addDML( qry ); //새로운 내용을 모두 다시 저장한다. qry2 = "INSERT INTO NAD_DEV_CONSOLE " + " (MNG_NUM, PORT_IDX, STATUS, PROTOCOL, PORT, CON_NUM, PORT_CNT) " + " VALUES('"+ k.mng_num + "', '" + k.port_index + "', '" + k.status + "', '" + k.acct_protocol + "', " + "'" + k.acct_port + "', '" + k.con_num + "', '" + k.port_cnt + "' )";jobelement.addDML(qry2); if( connect == 1 && set_multi == 0) {
var multi_qry:String = " INSERT INTO STG_DEV_CONINFO " + " (MNG_NUM, SVC_TYPE) " +
" VALUES(" + k.con_num + ", '" + k.multi_svc + "')";
jobelement.addDML(multi_qry);
} jobelement.addDML( "DELETE FROM NAD_DEV_CONSOLE WHERE PORT_IDX = "+ l.port_index +" AND MNG_NUM = " +k.mng_num ); // 콘솔 포트 테이블 무슨 말인지 알 수가 없다.
끝내고 물어보자 누구한테?? 우선 끝내기나 하자. db 1. 장비에 이미 등록된 멀티 서비스는 추가하지 않도록 처리
2. //dev_console UPDATE 처리
jobelement.addDML( "UPDATE NAD_DEV_CONSOLE SET" +
" CON_NUM = '" + m.con_num + "', " +
" STATUS = " + m.status + ", " +
" PORT = " + m.kvm_port + ", " +
" PROTOCOL = '" + m.con_protocol +"' "+" WHERE MNG_NUM = " + m.mng_num);
3. if( connect == 1 && set_multi == 0)
{var multi_kvm_qry:String =
" INSERT INTO STG_DEV_CONINFO " +
" (MNG_NUM, SVC_TYPE) " + " VALUES(" + m.con_num + ", '" + m.multi_svc + "'
)";
jobelement.addDML(multi_kvm_qry);
} 추


분 1) 2) Ndt View 팝업창 생성
subP.createWindow (ㅁ , popup window 타입 ) public class WindowType
{
public static const MAX_SIZE_WINDOW:String = "maxSizeWindow";
public static const NORMAL_WINDOW:String = "normalWindow";
public static const GADGET_WINDOW:String = "gadgetWindow";
public static const SEARCH_WINDOW:String = "searchWindow";
public static const MSN_WINDOW:String = "msnWindow";
public static const POPUP_WINDOW:String = "popupWindow";
public static const SIDE_WINDOW:String = "sideWindow";
public static const TOP_WINDOW:String = "topWindow";
public static const NAVI_WINDOW:String = "naviWindow";

} removeWindow 가 있는데 그냥 null 하고 막았어.. 이런... NDT_SubP.as

destroy()

1. onDestroy 를 override 해서
NDT_View 를 null 해주고 있다.
2. onDestroy 다음에 호출되는 removeAllWindow() 는
NDT_VIew 의 Destory 를 호출하여 내부 정리를 요청한다.

3. 근데 1번에서 ndt_view null 로 해줘서 2번 이벤트가 발생하지 않는다.... 이래도 제대로 지워지는가???
========================
4. sub_P 의 WindowEvent.WINDOW_CLOSE를 dispactch 해주는 NDT_view 의 destory() 함수에 있다.

5.
sub_p destroy() 함수는 모든 ndt_view 를 destroy 호출하는 함수를 요청하고
이렇게 들어간 ndt_view 에서는 sub_p에게 자신을 죽여달라는 요청을 또 해...
이미 destory 했는데 또 해 달라고 하네


6. 그럼 view 는 언제 null 해야 되냐??
WindowEvent.WINDOW_CLOSE 를 받았을 때 null 해주고 이벤트까지 없애버리는게 좋을 것 같다. CIM_DevContextBuilder.as
Full transcript