이 문서는 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
해당 구문을 넣을 시 메일을 한번 보내고 작업스케줄러에서 사용 안함으로 변경된다.