ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Powershell,WinSCP를 활용한 wowza서버 자동업로드 구성기
    개발 2019. 3. 21. 10:07
    반응형




       개요


    회사에서 VOD서버를 새로 구축해야 하는 입장에 서게 되었다.

    wowza를 보니 스트리밍위주의 기능뿐이었다.

    녹화기능도 있긴한데 시간에 맞춰서 잘라주는 기능은 없었다. 


    와우자개발자문서를 보면서 와우자모듈과 와우자IDE로 java개발 해보려고 했는데 

    머리도 아프고 참고할 자료도 거의 없고 와우자서버에 스트리밍+녹화까지 넣으면 

    접속자들이 많이 몰렸을 때 서버에 무리도 올 것 같기도 하고 해서 다른 방법을 생각해보았다. 


    녹화기능은 이미 잘 개발된 반디캠을 구매해서 활용하고 나머지 부분만 코딩하는 것으로 구성했다.





       작업내용


    1. 반디캠으로 녹화하면 파일의 확장자가 '예약이름 2019-03-21 09-04-01-248.mp4' 이런식으로 형성된다.

    2. '예약이름 2019-03-21 09-04-01-248.mp4' 이 파일이름에서 공백을 제거해주고 뒤쪽의 시간을 제거하여 날짜만 남긴다.

    3. 일정시간이 되면 WinSCP의 업로드 기능을 활용하여 SFTP로 wowza서버로 업로드 하여 VOD를 구성한다.


    참고. 스크립트는 powershell로 작성하였으며 Winscp로 SFTP를 구성하였다.








       작업시작



    1. 반디캠으로 예약녹화하기





    저 버튼을 클릭하면 예약녹화가 가능하다.






    이런식으로 예약녹화 시간을 지정해서 할 수있다.




    2. 녹화시 D:\record 폴더로 저장되도록 해놓았다. 그러면 이런식으로 파일이 생성된다.




    여기서 주목할 것은 파일이름이다.


    파일이름에는 띄어쓰기 즉, 공백이 삽입되어있고 이것은 powershell을 이용해서 이리저리 파일을 옮기고 할때 오류를 발생시키게 해서 아주 귀찮다...


    그래서


    #1. 파일이름에서 공백제거

    dir d:\record\*.mp4 | rename-item -newname{$_.name -replace ' ',''}


    이 코드를 사용해서 파일이름에서 일단 공백을 제거하고



    #2. 파일이름 뒤부터 16개 잘라서 다시 .mp4 붙이기

    dir d:\record\*.mp4 | rename-item -newname {$_.name.substring(0,$_.name.length-16)+".mp4"}  


    이 코드를 사용해서 파일이름을 맨 뒤부터 16개를 잘라 내주었다





    2. 이제 FTP로 업로드를 시켜야 하는데 보안상 21번 포트보다는 22번 포트를 사용하는 SFTP를 이용하여 업로드 시키기로 했다.


    #3. SFTP로 와우자 /usr/local/wowza/contents 업로드

    #winscp기반 업로드이므로 Automation 설치가 필요함 https://winscp.net/eng/downloads.php


    위 사이트에 접속해서 Automation을 다운 받아야 한다 다운받으면 안에 WinSCPnet.dll 파일이 있는데 이걸 코드상에서 위치 지정해주어야 한다.


    공식코드는 아래와 같다. WinSCP사이트에 들어가도 이대로 적혀있다


    try

    {

        # Load WinSCP .NET assembly

        Add-Type -Path $Automation

     

        # Setup session options

        $sessionOptions = New-Object WinSCP.SessionOptions -Property @{

            Protocol = [WinSCP.Protocol]::Sftp

            HostName = $HostName

            UserName = $UserName

            Password = $Password

            SshHostKeyFingerprint = $SshHostKeyFingerprint

        }

     

        $session = New-Object WinSCP.Session

     

        try

        {

            # Connect

            $session.Open($sessionOptions)

     

            # Upload files

            $transferOptions = New-Object WinSCP.TransferOptions

            $transferOptions.TransferMode = [WinSCP.TransferMode]::Binary

     

            $transferResult =

                $session.PutFiles($FileLocation, $ServerLocation, $False, $transferOptions)

     

            # Throw on any error

            $transferResult.Check()

     

            # Print results

            foreach ($transfer in $transferResult.Transfers)

            {

                Write-Host "Upload of $($transfer.FileName) succeeded"

            }

        }

        finally

        {

            # Disconnect, clean up

            $session.Dispose()

        }

     

           #4. 업로드완료된 파일 D:\WowzaSendComplete로 이동

           #미리 폴더를 만들어 놓을 것!

           move-item -path $FileLocation -destination $WowzaSendComplete

           Get-Date

           Write-Host "업로드성공!"

           exit 0


    }

    catch

    {

        Get-Date    

        Write-Host "업로드실패!"

        Write-Host "Error: $($_.Exception.Message)"

     

    }







    3. 위 코드에 보면


         #4. 업로드완료된 파일 D:\WowzaSendComplete로 이동

           #미리 폴더를 만들어 놓을 것!

           move-item -path $FileLocation -destination $WowzaSendComplete


    이 부분은 업로드 완료된 파일을 다른 폴더로 옮겨놓는 역할을 한다. 이중백업의 역할이다.





    4. 혹시 스크립트는 완벽한데



    이 시스템에서 스크립트를 실행할 수 없으므로 C:\Users\jmnote\greet.ps1 파일을 로드할 수 없습니다. 자세한 내용은 "get-hel
    p about_signing"을 참조하십시오.



    이런 메세지가 나온다면



    PS C:\Users\jmnote> Get-ExecutionPolicy
    Restricted
    
    PS C:\Users\jmnote> Set-ExecutionPolicy unrestricted
    
    실행 규칙 변경
    실행 정책은 신뢰하지 않는 스크립트로부터 사용자를 보호해 줍니다. 실행 정책을
    변경하면 about_Execution_Policies 도움말 항목에 설명된 보안 위험에 노출될 수
    있습니다. 실행 정책을 변경하시겠습니까?
    [Y] 예(Y)  [N] 아니요(N)  [S] 일시 중단(S)  [?] 도움말 (기본값은 "Y"임):
    
    PS C:\Users\jmnote> Get-ExecutionPolicy
    Unrestricted



    출처

    https://zetawiki.com/wiki/%ED%8C%8C%EC%9B%8C%EC%89%98_%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8_%ED%8C%8C%EC%9D%BC_%EC%8B%A4%ED%96%89



    이거 그대로 따라해서 입력하면 된다.






    5. 마지막 오류가 발생했을시 오류메세지를 확인하기 위해서 log를 남겨 놓기로 했다


    #에러로그 기록

    start-transcript -path $ErrorLog -append


    이런식으로 하면 스크립트가 실행된 기록이 txt파일로 저장된다.





    6. SFTP로 접속하려면 ssh지문을 입력해야한다. 확인하는 방법은 아래와 같다.


    위 설명대로 따라왔다면 winscp사이트에서 WinSCP-5.13.9-Automation를 다운받았을 것이다.

    압축을 풀면 WinSCP.exe파일이 있는데 그걸 실행해서 업로드하려는 서버에 접속한다.






    아무파일이나 업로드 하면 아래와 같이 창이 뜬다




    여기서 맨밑에 Generate Code를 클릭한다




    .NET assembly code탭에서 PowerShell을 클릭하면 밑에 파란색으로 된부분을 복사해서 아래 코드에 붙여 넣기 하면된다. 




    7. 마지막으로 작업스케줄러에 파워쉘파일을 등록시키면 시간에 맞춰서 알아서 스크립트가 실행된다.





    8. 전체스크립트 및 파일


    #라디오녹화 PowerShell Script #정보입력 $Automation = "WinSCPnet.dll의 위치입력" $HostName = "업로드하려는 SFTP서버" $UserName = "서버아이디" $Password = "서버비밀번호" $SshHostKeyFingerprint = "ssh지문" #폴더에 있는 winscp이용해서 서버 접속후 입력 $FileLocation = "d:\record\*" #로컬에서 업로드하려는 파일위치 $ServerLocation= "/usr/local/WowzaStreamingEngine-4.7.7/content/" #서버의 업로드위치 $ErrorLog ="D:\AutoRecoderLog.txt" #로그가 기록되는 위치 $WowzaSendComplete = "d:\WowzaSendComplete\" #업로드 완료후 이동되는 파일 위치 #에러로그 기록 start-transcript -path $ErrorLog -append #1. 파일이름에서 공백제거

    #.mp4확장자만 파일이름이 변경되도록 했다. 폴더안에 있는 파일 전체 다하려면 .mp4를 지우면 된다. dir d:\record\*.mp4 | rename-item -newname{$_.name -replace ' ',''} #2. 파일이름 뒤부터 16개 잘라서 다시 .mp4 붙이기 dir d:\record\*.mp4 | rename-item -newname {$_.name.substring(0,$_.name.length-16)+".mp4"} #3. SFTP로 와우자 /usr/local/wowza/contents 업로드 #winscp기반 업로드이므로 Automation 설치가 필요함 https://winscp.net/eng/downloads.php #업로드시작 try { # Load WinSCP .NET assembly Add-Type -Path $Automation # Setup session options $sessionOptions = New-Object WinSCP.SessionOptions -Property @{ Protocol = [WinSCP.Protocol]::Sftp HostName = $HostName UserName = $UserName Password = $Password SshHostKeyFingerprint = $SshHostKeyFingerprint } $session = New-Object WinSCP.Session try { # Connect $session.Open($sessionOptions) # Upload files $transferOptions = New-Object WinSCP.TransferOptions $transferOptions.TransferMode = [WinSCP.TransferMode]::Binary $transferResult = $session.PutFiles($FileLocation, $ServerLocation, $False, $transferOptions) # Throw on any error $transferResult.Check() # Print results foreach ($transfer in $transferResult.Transfers) { Write-Host "Upload of $($transfer.FileName) succeeded" } } finally { # Disconnect, clean up $session.Dispose() } #4. 업로드완료된 파일 D:\WowzaSendComplete로 이동 #미리 폴더를 만들어 놓을 것! move-item -path $FileLocation -destination $WowzaSendComplete Get-Date Write-Host "업로드성공!" exit 0 } catch { Get-Date Write-Host "업로드실패!" Write-Host "Error: $($_.Exception.Message)" }



    AutoRecoder.ps1 파일다운받기

    AutoRecoder.zip


    반응형

    댓글

Designed by Tistory.