All posts

IT/System

> csvde -f D:\AD\%date%.csv

WEB 서버에서 CGI 역할을 추가하는 도중 다음과 같은 오류가 발생했다.

확인해 보니, localhost IP가 정상적으로 리스닝 되어 있지 않을 경우 발생한다.

 

1) IP 수신 대기 목록을 먼저 조회한다.

> netsh http show iplisten

  IP 수신 대기 목록에 있는 IP 주소:
  -------------------------------------------


2) 수신 대기 목록이 이미 있는 경우, 삭제를 한다.

> netsh http show iplisten

  IP 수신 대기 목록에 있는 IP 주소:
  -------------------------------------------

    127.0.0.1
    
> netsh http delete iplisten 127.0.0.1

3) listening ip를 추가 한다.

> netsh http add iplisten 127.0.0.1

4) 추가 되었는지 확인하고, 역할을 다시 설치한다.

> netsh http show iplisten

  IP 수신 대기 목록에 있는 IP 주소:
  -------------------------------------------

    127.0.0.1
    

 

AWS S3 파일 이관이 몇 주 이상 소요될 경우,
파일 변경, 증가분에 대한 동기화가 필요하다.


파일 동기화로 진행해도 되지만,
S3는 S3에 업로드된 시점으로 수정된 날짜가 변경되어서 동기화 작업이 비효율 적이다.

또한, 서비스가 완전히 이전되기 전까지 주기적으로 동기화를 진행해 줘야 한다.

그래서 변경이나 추가된 파일만 복사할 수 있도록 파이썬을 통해 스크립트를 작성했다.

 

기화를 진행하는 서버에서 boto3 설치 오류를 해결하지 못해 테스트하지 못하고, aws cli로 진행하였다.

import os
import subprocess
import datetime

# 초기 설정
work_path = "G:\\s3sync"
sync_path = "G:\\"
s3_path = "s3://ABC/"

date = datetime.datetime.now().strftime("%Y%m%d_%H%M%S")
ymd = datetime.datetime.now() - datetime.timedelta(days=7)
ymd = ymd.strftime("%Y-%m-%d")

file_name=work_path+"\\sync_file_"+"_list_"+date+".txt"

# 동기화 대상(수정된 목록) 조회
os.system('forfiles /P %s /D %s /S /C "cmd /c echo @isdir @path" | findstr FALSE > %s' % (sync_path,ymd,file_name))

# S3 경로 변환
text_file = open("%s" % (file_name), "r")
sync_list = text_file.read().splitlines()
text_file.close()

# S3 파일 업로드
for file_path in sync_list:
    file_path_local=file_path.replace('"','').replace("\\","/").replace("FALSE ","")
    file_path_s3=file_path_local.replace("G:/",s3_path)
    os.system('aws s3 cp %s %s >> %s\\upload_%s.log' %(file_path_local,file_path_s3,work_path,date))

여러 개 도메인에 대해 ACM 인증서를 일괄적으로 생성 요청하고,

인증 레코드를 추가하는 명령어를 생성하는 파이썬 스크립트이다.

 

AWS 이전 중인 서버 중 호스팅 서버가 포함되어있어 작성했고,

도메인도 자체 DNS 서버에서 관리 중이어서 인증 레코드를 추가하는 명령어도 작성했다.

 

ACM 생성 시, 일반 도메인과 멀티 도메인을 구분하여 생성하도록 작성하였다.

(acm_domain_list는 일반, acm_domain_list_multi는 멀티 도메인)

 

ACM은 S3의 boto3와 같은 라이브러리가 없어서 aws cli를 이용한다.

 

! 실행하기 전에 acm 생성 권한이 있는지 확인한다.

import os
import subprocess

# 작업 경로.
work_dir="D:\\Python\\acm\\"

# DNS 서버 IP.
dns_server="127.0.0.1"

# 도메인 목록 파일 지정.
domain_list_1=work_dir+"acm_domain_list"
domain_list_2=work_dir+"acm_domain_list_multi"


# 도메인 입력.
domain_file = open("%s" % (domain_list_1), "r")
domain_list = domain_file.read().splitlines()
domain_file.close()
# 멀티 도메인 입력.
domain_file2 = open("%s" % (domain_list_2), "r")
domain_list2 = domain_file2.read().splitlines()
domain_file2.close()


# ACM 생성.
arn_path=work_dir+'arn_list.txt'

# ACM이 이미 생성된 경우, 바로 DNS 인증 레코드 생성.
if os.path.isfile(arn_path):
    pass
else:
    arn_list_tmp = ''
    
    for domain in domain_list:
        arn_tmp = os.popen('aws acm request-certificate --domain-name %s --validation-method DNS --tag Key=Name,Value=%s | findstr CertificateArn' % (domain,domain)).read()
        arn_tmp = arn_tmp.replace('"','').replace(" ","").replace("CertificateArn:","")
        arn_list_tmp+=arn_tmp
        
    for domain in domain_list2:
        arn_tmp = os.popen('aws acm request-certificate --domain-name %s --validation-method DNS --tag Key=Name,Value=%s --subject-alternative-names *.%s | findstr CertificateArn' % (domain,domain,domain)).read()
        arn_tmp = arn_tmp.replace('"','').replace(" ","").replace("CertificateArn:","")
        arn_list_tmp+=arn_tmp
        
    arn_file = open(arn_path,'w')
    arn_file.write(arn_list_tmp)
    arn_file.close()


# DNS 인증 레코드 생성(for IIS).
add_record=''

arn_file = open(arn_path, "r")
arn_list = arn_file.read().splitlines()

for arn_tmp in arn_list:
    auth_domain_tmp = os.popen('aws acm describe-certificate --certificate-arn %s --output text | findstr DNS' % (arn_tmp)).read().split()
    auth_domain = auth_domain_tmp[1]

    auth_record_tmp = os.popen('aws acm describe-certificate --certificate-arn %s --output text | findstr RESOURCERECORD' % (arn_tmp)).read().split('\n')
    auth_record = auth_record_tmp[0]
    
    domain_tmp = '.'+auth_domain+'.'
    auth_record = auth_record.replace('RESOURCERECORD','').replace(domain_tmp,'').replace("\n","").replace("\t"," ")

    add_record+='dnscmd %s /recordadd %s %s\n' % (dns_server,auth_domain,auth_record)

add_record_file = open(work_dir+'add_record.txt','w')
add_record_file.write(add_record)
add_record_file.close()

 

ACM 삭제 및 DNS 삭제 레코드

더보기
# # ACM 삭제.
# arn_file = open(arn_path, 'r')
# arn_list = arn_file.read().splitlines()
# arn_file.close()
# for arn in arn_list:
#     os.system('aws acm delete-certificate --certificate-arn %s' % (arn))


# # DNS 인증 레코드 삭제
# arn_file = open(work_dir+"add_record.txt", 'r')
# arn_list = arn_file.read().replace("recordadd","recorddelete")
# arn_file.close()
# arn_file = open(work_dir+"delete_record.txt", 'w')
# arn_file.write(arn_list)
# arn_file.close()

Connect only.

EXEC sp_configure 'how advanced options',1
RECONFIGURE
EXEC sp_configure 'xp_cmdshell',1
RECONFIGURE

EXEC XP_CMDSHELL 'net use Z: \\10.0.0.1\m$ password /user:administrator'
EXEC XP_CMDSHELL 'dir Z:'

 

Connect 및 Disconnect

-- 고급 옵션 활성
EXEC sp_configure 'how advanced options',1
RECONFIGURE

-- xp_cmdshell 활성
EXEC sp_configure 'xp_cmdshell',1
RECONFIGURE


-- 네트워크 드라이브 연결
EXEC XP_CMDSHELL 'net use Z: \\192.168.10.211\m$ (snflelql!23) /user:administrator'

-- 연결 확인
EXEC XP_CMDSHELL 'dir Z:' 

-- 네트워크 드라이브 연결 종료
EXEC XP_CMDSHELL 'net use /delete Z:'


-- xp_cmdshell 비활성
EXEC sp_configure 'xp_cmdshell',0

-- 고급 옵션 비활성
EXEC sp_configure 'how advanced options',0
RECONFIGURE