페이지 트리

이 문서는 SonarQube Script를 통해 알람메일 보내기 가이드를 공유하기 위해 작성되었다.


도구명Sonarqube
버전9.5
비고Sonarqube 6.1 이상 가능




Sonarqube LOC 임계값 설정 시 메일 안 보내지는 이유



Script 설정하기

리눅스

vi mailsend.sh

  • alertday: 만료날짜 이전에 받고 싶은 날 입력
  • baseurl: Sonarqube 주소
  • admin: admin 계정의 ID, password: 해당 계정의 password, email: 받고 싶은 이메일 주소 입력
  • 25줄 MSG1: LOC 임계값 이상 시 받고 싶은 메시지 입력
  • 28줄 MSG2: 만료날짜 경고 시 받고 싶은 메시지 입력
특정 사용자만 추가시
#!/bin/bash
#변수
alertday=60
baseurl=http://localhost
admin=admin
password=
email=
MSG1=""
MSG2=""
MSG3="\n\n\n해당 메일은 Sonarqube 서버 내 Crontab을 이용하여 보내고 있습니다."
CURLS=`curl -u $admin:$password ${baseurl}/api/editions/show_license`
MAX=`echo $CURLS | json_reformat | grep -w maxLoc | awk '{print $2}' | cut -d ',' -f 1`
THRESHOLD=`echo $CURLS | json_reformat | grep -w remainingLocThreshold | awk '{print $2}'`
LOC=`echo $CURLS | json_reformat | grep -w loc | awk '{print $2}' | cut -d ',' -f 1`
EXPIRE=`echo $CURLS | json_reformat | grep -w 'expiresAt' | awk '{print $2}' | cut -d '"' -f 2`
DATE=$(date '+%Y-%m-%d')
#초로 변환
EXPIRESEC=`date -d $EXPIRE "+%s"`
DATESEC=`date -d $DATE "+%s"`
#계산
RESULT=`echo "${MAX} - ${THRESHOLD} - ${LOC}" | bc`
EXPIREDAY=`echo "($EXPIRESEC - $DATESEC) / 86400" | bc`
#메시지주기
if (( ${RESULT} <= 0 )) ; then
        MSG1="코드값이 임계점에 달했습니다. LOC: ${LOC}\n"
fi
if (( ${EXPIREDAY} <= ${alertday} )) ; then
        MSG2="라이선스 만료날짜가 얼마 남지 않았습니다. 만료날짜: ${EXPIRE}"
fi
MESSAGE=`echo -e ${MSG1}${MSG2}${MSG3}`
#임계값이나 만료날짜 설정 값 이하라면 메일 보내기
if (( ${RESULT} <= 0 )) || (( ${EXPIREDAY} <= ${alertday} )) ; then
        curl -X POST -u $admin:$password "${baseurl}/api/emails/send" -H "Content-Type: application/x-www-form-urlencoded" -d message="${MESSAGE}" -d subject="Sonarqube 라이선스 알람" -d to="${email}"
        #Crontab 설정 시 한번만 보내고 삭제, 계속 받고자 하면 해당 부분 필요없음
		SCRIPT=`echo $0 | cut -d '/' -f 2`
        crontab -l | grep -v "${SCRIPT}" > crontab.txt
        crontab crontab.txt
 fi


sonar-administrator 그룹들 메일 보내기

  • 그룹 변경 시 34줄 그룹 변경
특정 그룹에 속한 사용자들 대상
#!/bin/bash
#변수
alertday=60
baseurl=http://localhost
admin=
password=
MSG1=""
MSG2=""
MSG3="\n\n\n해당 메일은 Sonarqube 서버 내 Crontab을 이용하여 보내고 있습니다."
CURLS=`curl -u $admin:$password ${baseurl}/api/editions/show_license`
MAX=`echo $CURLS | json_reformat | grep -w maxLoc | awk '{print $2}' | cut -d ',' -f 1`
THRESHOLD=`echo $CURLS | json_reformat | grep -w remainingLocThreshold | awk '{print $2}'`
LOC=`echo $CURLS | json_reformat | grep -w loc | awk '{print $2}' | cut -d ',' -f 1`
EXPIRE=`echo $CURLS | json_reformat | grep -w 'expiresAt' | awk '{print $2}' | cut -d '"' -f 2`
DATE=$(date '+%Y-%m-%d')
#초로 변환
EXPIRESEC=`date -d $EXPIRE "+%s"`
DATESEC=`date -d $DATE "+%s"`
#계산
RESULT=`echo "${MAX} - ${THRESHOLD} - ${LOC}" | bc`
EXPIREDAY=`echo "($EXPIRESEC - $DATESEC) / 86400" | bc`
#메시지주기
if (( ${RESULT} <= 0 )) ; then
        MSG1="코드값이 임계점에 달했습니다. LOC: ${LOC}\n"
fi
if (( ${EXPIREDAY} <= ${alertday} )) ; then
        MSG2="라이선스 만료날짜가 얼마 남지 않았습니다. 만료날짜: ${EXPIRE}"
fi
MESSAGE=`echo -e ${MSG1}${MSG2}${MSG3}`
#임계값이나 만료날짜 설정 값 이하라면 메일 보내기
if (( ${RESULT} <= 0 )) || (( ${EXPIREDAY} <= ${alertday} ))
then
		#그룹명 기반으로 유저 이메일 검색, 그룹이 많을 경우 아래 curl로 이메일이 제대로 표출되는지 확인 필요(grep -B 숫자)로 조정 가능)
        for EMAIL in `curl -u $admin:$password ${baseurl}/api/users/search | json_reformat | grep -B 4 "sonar-administrators" | grep -w 'email' | awk '!x[$0]++' | awk '{print $2}' | cut -d '"' -f 2`
        do
                curl -X POST -u $admin:$password "${baseurl}/api/emails/send" -H "Content-Type: application/x-www-form-urlencoded" -d message="${MESSAGE}" -d subject="Sonarqube 라이선스 알람" -d to="${EMAIL}"
        done
         #Crontab 설정 시 한번만 보내고 삭제, 계속 받고자 하면 해당 부분 필요없음
		SCRIPT=`echo $0 | cut -d '/' -f 2`
        crontab -l | grep -v "${SCRIPT}" > crontab.txt
        crontab crontab.txt 
fi


  • 권한 부여
chmod 755 mailsend.sh

Crontab으로 시간 설정

crontab -e

# 분, 시, 일, 월, 요일 요일 설정 리눅스마다 다름
0 9 * * 1-5 $script_location/mailsend.sh


윈도우

Powershell 사용

  • alertday: 만료날짜 이전에 받고 싶은 날 입력
  • baseurl: Sonarqube 주소
  • admin: admin 계정의 ID, password: 해당 계정의 password, email: 받고 싶은 이메일 주소 입력
  • 31줄 MSG1: LOC 임계값 이상 시 받고 싶은 메시지 입력
  • 34줄 MSG2: 만료날짜 경고 시 받고 싶은 메시지 입력
특정 사용자만 추가시
#변수
$alertday=60
$baseurl="http://localhost"
$admin=""
$password=""
$MSG1=""
$MSG2=""
$MSG3="`n`n`n해당 메일은 Sonarqube 서버 내 작업스케쥴러를 이용하여 보내고 있습니다."
$email = ""
#Access 토큰 생성
function Get-BasicAuthCreds {
    param([string]$Username,[string]$Password)
    $AuthString = "{0}:{1}" -f $Username,$Password
    $AuthBytes  = [System.Text.Encoding]::Ascii.GetBytes($AuthString)
    return [Convert]::ToBase64String($AuthBytes)
}
$BasicCreds = Get-BasicAuthCreds -Username $admin -Password $password;
$CURLS=(Invoke-WebRequest -Uri "${baseurl}/api/editions/show_license" -Method Get -Headers @{"Authorization"="Basic $BasicCreds"}).Content | ConvertFrom-Json

$MAX=$CURLS.maxLoc
$THRESHOLD=$CURLS.remainingLocThreshold
$LOC=$CURLS.loc
$EXPIRE=$CURLS.expiresAt
$DATE=(Get-Date).Tostring("yyyy-MM-dd")
#계산
$RESULT= ${MAX} - ${THRESHOLD} - ${LOC}
$EXPIREDAY = (New-TimeSpan -Start $DATE -End $EXPIRE).Days

#메시지주기
if(${RESULT} -le 0 ){
        $MSG1="코드값이 임계점에 달했습니다. LOC: ${LOC}`n"
}
if(${EXPIREDAY} -le ${alertday}){
        $MSG2="라이선스 만료날짜가 얼마 남지 않았습니다. 만료날짜: ${EXPIRE}"
}
$MESSAGE="${MSG1}${MSG2}${MSG3}"
#임계값이나 만료날짜 설정 값 이하라면 메일 보내기 
if ((${RESULT} -le 0) -or (${EXPIREDAY} -le ${alertday})){
	$body = @{message="${MESSAGE}" 
    	subject="Sonarqube 라이선스 알람" 
    	to="${email}"
	}
	Invoke-WebRequest -Uri "${baseurl}/api/emails/send" -Method POST -Headers @{"Authorization"="Basic $BasicCreds"} -ContentType "application/x-www-form-urlencoded" -Body $body
}


sonar-administrator 그룹들 메일 보내기

  • 받고자 하는 그룹 변경시 : 44줄 부분 변경
특정 그룹에 속한 사용자들 대상
#변수
$alertday=60
$baseurl="http://localhost"
$admin=""
$password=""
$MSG1=""
$MSG2=""
$MSG3="`n`n`n해당 메일은 Sonarqube 서버 내 작업스케쥴러를 이용하여 보내고 있습니다."
$email = @()
#Access 토큰 생성
function Get-BasicAuthCreds {
    param([string]$Username,[string]$Password)
    $AuthString = "{0}:{1}" -f $Username,$Password
    $AuthBytes  = [System.Text.Encoding]::Ascii.GetBytes($AuthString)
    return [Convert]::ToBase64String($AuthBytes)
}
$BasicCreds = Get-BasicAuthCreds -Username $admin -Password $password;
$CURLS=(Invoke-WebRequest -Uri "${baseurl}/api/editions/show_license" -Method Get -Headers @{"Authorization"="Basic $BasicCreds"}).Content | ConvertFrom-Json

$MAX=$CURLS.maxLoc
$THRESHOLD=$CURLS.remainingLocThreshold
$LOC=$CURLS.loc
$EXPIRE=$CURLS.expiresAt
$DATE=(Get-Date).Tostring("yyyy-MM-dd")
#계산
$RESULT= ${MAX} - ${THRESHOLD} - ${LOC}
$EXPIREDAY = (New-TimeSpan -Start $DATE -End $EXPIRE).Days

#메시지주기
if(${RESULT} -le 0 ){
        $MSG1="코드값이 임계점에 달했습니다. LOC: ${LOC}`n"
}
if(${EXPIREDAY} -le ${alertday}){
        $MSG2="라이선스 만료날짜가 얼마 남지 않았습니다. 만료날짜: ${EXPIRE}"
}
$MESSAGE="${MSG1}${MSG2}${MSG3}"
#임계값이나 만료날짜 설정 값 이하라면 메일 보내기
if ((${RESULT} -le 0) -or (${EXPIREDAY} -le ${alertday})){
    #유저 찾기
    $Users= (Invoke-WebRequest -Uri "${baseurl}/api/users/search" -Method Get -Headers @{"Authorization"="Basic $BasicCreds"}).Content | ConvertFrom-Json
    #관리자 그룹만 찾기
    $Users.users | ForEach-Object{
        if($_.groups.Contains("sonar-administrators")){
            $email +=$_.email
        }
    }
    #관리자 그룹 메일 보내기
    $email | sort | unique | ForEach-Object{
        $body = @{message="${MESSAGE}" 
        subject="Sonarqube 라이선스 알람" 
        to="${_}"
        }
        Invoke-WebRequest -Uri "${baseurl}/api/emails/send" -Method POST -Headers @{"Authorization"="Basic $BasicCreds"} -ContentType "application/x-www-form-urlencoded" -Body $body
    }

}


작업스케줄러 등록

작업스케줄러 → 작업 만들기 → 일반

  • 사용자 로그온 여부에 상관없이 실행 체크
  • 가장 높은 수준의 권한으로 실행 체크


트리거 → 새로 만들기 선택: 주기 설정


동작 → 새로 만들기 선택


C:\Windows\System32\WindowsPowerShell\v1.0\ 경로의 Powershell.exe 선택


인수 추가(옵션) 칸에 -ExecutionPolicy Unrestricted -File "해당 파일"


확인 → 패스워드 입력


메일 보내고 난 후 작업스케줄러 중지 방법

해당 Powershell Script 문 메일 보내는 if문(단일메일: 44줄, 그룹메일: 56줄) 안에

($TaskScheduler = New-Object -ComObject Schedule.Service).Connect("localhost")
$TaskScheduler.GetFolder('\').GetTask("작업스케쥴러등록이름").Enabled = $false

해당 구문을 넣을 시 메일을 한번 보내고 작업스케줄러에서 사용 안함으로 변경된다.





참조

Sonarqube Docs-License

Sonarqube Web Api

  • 레이블 없음