자체 공급업체를 MFT에 추가

13907 단어
InterSystems IRISManaged File Transfer(MFT) 기능은 타사 파일 전송 서비스를 InterSystems IRIS 제품에 직접 포함시킬 수 있습니다.현재 DropBox, Box 및 Kiteworks 클라우드 하드 드라이브를 사용할 수 있습니다.
본고에서 나는 어떻게 더 많은 클라우드 저장 플랫폼을 추가하는지 설명하고 싶다.
다음은 우리가 토론하고자 하는 내용입니다.
  • MFT

  • 참조: Dropbox
  • 연결
  • 상호 운용성
  • 직접 액세스

  • 필요한 인터페이스
  • 연결
  • 논리
  • 설치
  • FT


    MFT는 양방향 파일 전송을 제공하여 클라우드 저장소에서 파일을 다운로드하거나 업로드할 수 있습니다.
    MFT에 대한 설명을 보려면this video on Learning.InterSystems.com

    참조: Dropbox


    자체 MFT 어댑터를 작성하기 전에 기존 MFT 어댑터를 실행합니다.Dropbox를 선택했습니다.

    기본 액세스 권한


    우선 Dropbox 액세스를 구성해야 합니다.
  • 신규 등록 Dropbox account.
  • 새로 만들기Dropbox App.
  • 당신을 기억하세요: App KeyApp Secret
  • 리디렉션 URL 설정: http://localhost:57772/csp/sys/oauth2/OAuth2.Response.cls
  • 새 SSL 구성 만들기(없는 경우)
  • 다음 위치에 새 MFT 구성을 만듭니다. http://localhost:57772/csp/sys/sec/%25CSP.UI.Portal.MFT.Connection.zen?isNew=1
  • "SSL 사용"로고를 삭제합니다. (웹 서버가 https를 통해 사용할 수 없는 경우)
  • 이메일 주소 필드는 Dropbox 이메일 주소와 일치해야 합니다.
  • 단추를 눌러(MFT 연결 목록 페이지에서) 응용 프로그램에 권한을 부여합니다.
  • 모든 것이 정상적이면 새 MFT 연결 상태를 승인해야 합니다.
  • 상호 운용성


    이제 새로운 연결을 사용하도록 상호 운용성 제품을 구성해야 합니다.
    Dropbox에서 로컬 디렉토리로 파일을 수신하려면 다음과 같이 하십시오.
  • 서비스 생성 Get Access Token
  • MFT 접속 이름: Dropbox
  • MFT 소스 폴더: 파일을 다운로드하는 Dropbox 폴더의 경로 EnsLib.MFT.Service.Passthrough
  • 대상 구성 이름: 파일을 보낼 BP 또는 BO(예: /inbox/
  • 만들기EnsLib.File.PassthroughOperation 작업.
  • 파일 경로: Dropbox에서 파일을 다운로드하는 로컬 디렉토리의 경로 EnsLib.File.PassthroughOperation
  • 문자 세트: 바이너리
  • 파일 이름:%f
  • 그게 다야.프로덕션을 시작하면 Dropbox 폴더에 지정된 파일이 로컬 디렉토리로 다운로드됩니다.
    파일을 Dropbox에 업로드하려면 이 절차를 반대로 수행해야 합니다.
  • 서비스 생성 C:\\temp\in\
  • MFT 접속 이름: Dropbox
  • 기본 MFT 폴더: 파일이 업로드되는 Dropbox 폴더의 경로 EnsLib.MFT.Operation.Passthrough
  • 만들기/sent/ 작업.
  • 파일 경로: 파일에서 Dropbox의 로컬 디렉토리로 업로드되는 경로 EnsLib.File.PassthroughService
  • 대상 구성 이름: 예제 C:\\temp\out\ 에서 파일을 , 의 BP 또는 BO로 보내기
  • 문자 세트: 바이너리
  • 그러면 EnsLib.MFT.Operation.Passthrough 폴더에 있는 파일이 C:\\temp\out\ Dropbox 폴더로 업로드됩니다.
    보다 포괄적인 지침은 MFT First look 을 참조하십시오.

    직접 액세스


    상호 운용성 B/B는 직접 액세스할 수 있는 패키지입니다.자신의 어댑터를 작성할 때, 예상대로 작동하는지 확인하기 위해 직접 접근을 사용하는 것이 가장 좋다.다음은 파일 정보를 얻는 예시 방법이다
    ClassMethod dropboxInfo(file = "/1.txt")
    {
        // Establishing Dropbox connection
        set mftConnectionName = "Dropbox"
        set mftConnection = ##class(%MFT.API).GetConnection(mftConnectionName, .sc)
        write:$$$ISERR(sc) $System.Status.GetErrorText(sc)
    
        // Getting information about file
        // Some other methods: GetFileInfo GetFolderInfo CreateFolder DeleteFile GetUser ShareFolder UnshareFolder DownloadStream UploadFile
        set sc = $classmethod($$$EnsCoreMFTAPIClass,"GetFileInfo", mftConnection, file, .itemInfo)
        write:$$$ISERR(sc) $System.Status.GetErrorText(sc)
    
        // Displaying information about file
        #dim itemInfo As %MFT.ItemInfo
        zw itemInfo
    }
    
    --

    MFT 커넥터


    MFT 제공 프로그램은 두 부분으로 구성되어 있습니다.자신의 공급자를 만들려면 그것을 실현해야 합니다.

    기술 API(연결)


    연결은 요청과 분석 결과를 보내는 것을 책임진다.확장해야 합니다/sent/.
  • 서비스 API 루트의 DefaultURL
  • 을 반환합니다.
  • OAuth 클라이언트를 만드는 CreateClient
  • 애플리케이션의 RevokeToken
  • 로그아웃
    다른 방법은 필요에 따라 다시 적재할 수 있는데, 이 세 가지 방법은 필수적이다.또한 저는 Yandex를 위해 다음과 같은 세 가지 방법을 만들었습니다.
  • MakeRequest - 일반 API 요청 실행
  • MakeDownloadRequest - 파일 다운로드
  • MakeUploadRequest - 파일 업로드
  • 이러한 메서드의 구조는 대상 API 구조에 전적으로 의존합니다.내 예에서 대부분의 요청은 비슷하다. 파일을 다운로드하고 업로드하려면 서로 다른 요청이 필요하기 때문에 나는 최종적으로 세 가지 방법을 선택했다.

    논리 API


    API를 사용하고 연결을 사용해서 요청을 실행합니다. API는 확장%SYS.MFT.Connection.Base하고 %MFT.API 패키지에 주재해야 합니다. (잠시 후에 이 수요를 어떻게 해결하는지 토론할 것입니다.)재부팅해야 하는 방법은 다음과 같은 네 가지로 나눌 수 있습니다.
    메시지
    생성/제거
    공유
    부하
    GetFileInfo GetFolderInfo GetFolderContents
    CreateFolder DeleteFolder DeleteFile
    ShareFolder UnshareFolder UnshareFolderAll
    UploadStream 다운로드 스트림
    이런 방법들은 말하지 않아도 알 것 같다.그러나 이 방법의 목적이 명확하지 않은 것 같으면 댓글로 물어보세요.%MFT에도 문서가 있습니다.API 클래스.나는 왼쪽에서 오른쪽으로 이 방법을 실현하는 것을 건의합니다. 당신도 공유 방법을 뛰어넘을 수 있습니다.이것은 우리에게 반드시 실현해야 할 8가지 방법을 가져다 주었다.
    또한 클라우드 하드 드라이브 공급업체에 사용자 관리(팀 등)가 있는 경우 다음을 통해 관리할 수 있습니다.
  • GetUser
  • GetUserById
  • GetUserList
  • CreateUser
  • 사용자 삭제
  • DeleteUserById
  • 양덱스로서디스크는 사용자 관리가 없어서, 나는 이 방법들을 뛰어넘었다. (그것들은 여전히 실현되어야 하지만, 실제로는 비어 있다.)
    마지막으로, GetRequestId 메서드를 사용하여 경로를 ID로 변환해야 합니다. 그렇지 않으면 경로를 되돌려야 합니다.
    모든 공급자에게 동일한 방법 외에도 어댑터 작성을 시작할 수 있는 코드 세그먼트가 있습니다.
    /// Get the form of id for a file or folder that is most efficient for subsequent calls.
    /// GetRequestId will return either an id of the form "id:<id>" or a full path depending on which is more efficient.
    /// This method is included to allow the id for future requests to be saved in the most efficient form.
    ClassMethod GetRequestId(connection As %SYS.MFT.Connection.Base, itemInfo As %MFT.ItemInfo) As %String
    {
        Quit itemInfo.GetPath()
    }
    
    /// Retrieve the %MFT.UserInfo for current user
    ClassMethod GetUser(connection As %SYS.MFT.Connection.Base, username As %String, Output userInfo As %MFT.UserInfo) As %Status
    {
        Set userInfo = ##class(%MFT.UserInfo).%New()
        Set userInfo.Username = connection.Username
        Quit sc
    }
    
    /// Retrieve the %MFT.UserInfo specified by the service defined Userid.
    /// If the user does not exist, then $$$OK is returned as status and userInfo is returned as "".
    ClassMethod GetUserById(connection As %SYS.MFT.Connection.Base, userid As %String, Output userInfo As %MFT.UserInfo) As %Status
    {
        Quit ..GetUser(connection, userid, .userInfo)
    }
    
    /// Return the list of all currently defined users for this team or enterprise.
    ClassMethod GetUserList(connection As %SYS.MFT.Connection.Base, Output userList As %MFT.UserList) As %Status
    {
        Set sc = $$$OK
        Set userList = ##class(%MFT.UserList).%New()
        Set sc = ..GetUser(connection, "", .userInfo)
        Quit:$$$ISERR(sc) sc
    
        Do userList.Users.Insert(userInfo)
    
        Quit sc
    }
    
    /// Create a new user.
    /// Unable to do it in Yandex
    ClassMethod CreateUser(connection As %SYS.MFT.Connection.Base, userInfo As %MFT.UserInfo) As %Status
    {
        Quit $$$ERROR($$$MFTBadConnection)
    }
    
    /// Delete new user.
    /// Unable to do it in Yandex
    ClassMethod DeleteUser(connection As %SYS.MFT.Connection.Base, username As %String) As %Status
    {
        Quit $$$ERROR($$$MFTBadConnection)
    }
    
    /// Delete the user that is specified by the id.
    ClassMethod DeleteUserById(connection As %SYS.MFT.Connection.Base, userid As %String) As %Status
    {
        Quit $$$ERROR($$$MFTBadConnection)
    }
    
    /// Unshare a folder from everyone, user is ignored
    ClassMethod UnshareFolder(connection As %SYS.MFT.Connection.Base, path As %String, user As %String) As %Status
    {
        Quit ..UnshareFolderAll(connection, path)
    }
    
    /// MountFolder is a Dropbox specific method to mount a shared folder that was shared by a different user.
    /// MountFolder is treated as a NOP for all other services.
    ClassMethod MountFolder(connection As %SYS.MFT.Connection.Box, folderName As %String) As %Status
    {
        // A NOP if not Dropbox
        Quit $$$OK
    }
    
    /// UnmountFolder is a Dropbox specific method to unmount a shared folder that was shared by a different user.
    /// UnmountFolder is treated as a NOP for all other services.
    ClassMethod UnmountFolder(connection As %SYS.MFT.Connection.Box, folderName As %String) As %Status
    {
        // A NOP if not Dropbox
        Quit $$$OK
    }
    
    /// Update the specified remote file with the contents of the specified local file.
    /// filePath must be a file path.  An id may not be specified.
    /// If replace is true, then an existing file of the same name will be replaced.
    /// The default is to return an error if a replacement is attempted.
    ClassMethod UploadFile(connection As %SYS.MFT.Connection.Base, localFilePath As %String, filePath As %String, replace As %Boolean = 0, Output itemInfo As %MFT.ItemInfo) As %Status
    {
        Set stream=##class(%FileBinaryStream).%New()
        Set stream.Filename=localFilePath
        Quit ..UploadStream(.connection,stream,filePath,replace,.itemInfo)
    }
    
    /// Download the specified remote file and store at the location given by localFilePath.
    /// filePath may be a file path.
    ClassMethod DownloadFile(connection As %SYS.MFT.Connection.Base, filePath As %String, localFilePath As %String) As %Status
    {
        Set stream=##class(%FileBinaryStream).%New()
        Set stream.Filename=localFilePath
        Quit ..DownloadStream(.connection,filePath,stream)
    }
    

    기타 데이터


    다른 범주는 다음과 같은 정보를 전송하는 데 사용됩니다.
  • %MFT는 파일이나 폴더에 대한 상세한 설명입니다. 이 설명이 필요합니다.
  • 기타 카테고리는%MFT입니다.사용자 정보와%MFT의 사용자 정보입니다.폴더 컨텐트/% MFT여러 항목이나 사용자를 나열하는 UserList
  • 이 클래스들은% 클래스이지만, 호출된 이름 공간에 데이터를 저장합니다.그것들은 데이터를 ^ MFT에 저장합니다.*전 세계.

    설치


    API가%MFT 패키지에 있어야 하기 때문에, 전용 데이터베이스에서 대상 네임스페이스(또는%SYS)에 코드를 매핑하는 데 매핑을 사용합니다.이렇게 하면 시스템 간 IRIS를 안전하게 업데이트할 수 있으며, 우리의 업무는 덮어쓰지 않을 것이다.흥미로운 것은 이 예에서 우리는 클래스를 목표 이름 공간에 불러오기만 하면 된다는 것이다.
    우선, 우리는 우리의 코드를 다운로드해야 한다. 이렇게 해야 한다.
  • 호환성을 지원하는 모든 네임스페이스에 다운로드하여 가져오기Installer
  • 실행: %MFT.ItemInfo
  • 다음을 수행합니다.
  • 데이터베이스 생성write $System.Status.GetErrorText(##class(MFT.Installer).Install())
  • MFTLIB 패키지의 매핑을 %MFT.Addons 데이터베이스
  • 에서 %SYS.MFT.Connection.Addons 네임스페이스에 추가
  • GitHub에서 나머지 코드를 다운로드하여% 및 비% 클래스를 올바르게 가져옵니다
  • 이제 Yandex 애플리케이션을 구성해야 합니다.
  • Yandex에 등록합니다.
  • Create Yandex App
  • 검사%SYS
  • 리디렉션 URI 설정: MFTLIB(https, UseSSL=1의 경우 개발의 경우 Веб-сервисы
  • 로 설정할 수 있습니다.
  • 디스크 액세스 제공http://Host:Port/csp/sys/oauth2/OAuth2.Response.cls
  • 획득http://localhost:57772/csp/sys/oauth2/OAuth2.Response.cls, Яндекс.Диск REST API
  • 실행: ID
  • 로그인 - Yandex 이메일
  • 호스트, 포트 - 콜백과 동일
  • UseSSL - SSL을 사용하여 콜백?서버는 https
  • 를 지원해야 합니다
  • 열기Pass
  • 에 따라 write $System.Status.GetErrorText(##class(MFT.Yandex).Install(Login, ID, Pass, Host, Port, UseSSL)) 인증을 완료합니다.
  • 만약 모든 것이 순조롭다면 이 상태는 권한을 부여받을 것이다.
  • 실행: http://Host:Port/csp/sys/sec/%25CSP.UI.Portal.MFT.ConnectionList.zen
  • Get Access Tokenwrite $System.Status.GetErrorText(##class(MFT.Yandex).ConfigureProduction(yandexSource, fileDestination, fileSource, yandexDestination))-Yandex.파일을 다운로드할 디스크 폴더는 로컬 대상 폴더에 저장됩니다.
  • yandexSourcefileDestination - 파일을 Yandex의 로컬 폴더에 업로드합니다.디스크
  • 중요: Yandex.디스크 폴더 이름은 fileSource 로 끝나야 합니다(즉, 디스크 루트의 yandexDestination/
  • 개방생산out을 시작하고 생산을 시작한다.
  • /out/에 파일을 추가하여 작동 방식을 확인합니다.
  • Dropbox와 달리 다음과 같이 서비스가 자동으로 생성됩니다.
    ClassMethod Install(username As %String, clientId As %String, clientSecret As %String, host As %String = "localhost", port As %Integer = {$get(^%SYS("WebServer","Port"), 57772)}, useSSL As %Boolean = {$$$NO})
    {
        New $Namespace
        Set $Namespace = "%SYS"
    
         Do:'##class(Security.SSLConfigs).Exists(..#SSLConfig) ##class(Security.SSLConfigs).Create(..#SSLConfig)
    
        Set sys = ##class(%SYS.MFT.Connection.Addons.Yandex).%New()
        Set sys.Name = "Yandex"
        Set sys.Service = "Addons.Yandex"
        Set sys.ApplicationName = "Yandex"
        Set sys.SSLConfiguration = ..#SSLConfig
        Set sys.Username = username
        Set sys.URL = ..#URL
    
        $$$QuitOnError(##class(%SYS.MFT.Connection.Addons.Yandex).CreateClient(sys.Name, ..#SSLConfig, clientId, clientSecret, ,host, port,,useSSL))
    
        Quit sys.%Save()
    }
    
    참고 서비스 값: MFT.Production.서비스 이름이 yandexSource에 추가되면 논리 API 클래스의 이름이 생성됩니다.패키지를 직접 수정할 수 없기 때문에 하위 패키지를 추가할 수 있습니다.

    결론


    MFT는 필요한 클라우드 공급업체를 지원하기 위해 쉽게 확장할 수 있는 유용한 기술입니다.

    링크

  • Repository
  • Yandex.Disk REST API reference
  • MFT First look
  • 좋은 웹페이지 즐겨찾기