여러가지 / / 2023. 7. 22. 14:31

java에 mac의 알림(osascript)을 실행

java를 사용하여 mac에서 알림(osascript)을 보내는 방법을 알아보자.

사용 시나리오

우선 회사에서 한달에 한번 윈도우 비밀번호를 변경을 하는 상황이 있는데 나는 맥을 사용하기 때문에 윈도우 비밀번호 변경 알림을 받지 못해서 계정이 막히는 경우가 가끔 발생한다. 그래서 윈도우 비밀번호 변경을 맥에서 알 수 있도록 프로그램을 만들게 되었다.

  1. LDAP을 연계하여 마지막 비밀번호 변경일자 확인

  2. 마지막 비밀번호 변경일이 25일 경과되었으면 crontab을 사용하여 매일 아침에 알려주도록 설정

  3. 비밀번호 알림을 받고 비밀번호 변경

하지만 맥에서 알림을 보낼려고 java에서 JOptionPane.showMessageDialog를 사용하였더너 java로 실행은 잘되지만 crontab에서는 실행이 되지 않았다.

그래서 알림을 보내는 다른 방법을 찾아봤더니 osascript라는 것이 있었다.

osascript란

OSA(Open Scripting Architecture) 스크립트는 스크립트 규격 중 하나다. 다양한 언어에서 OSA 규격을 준수할 수 있다. 대표적으로 Javascript와 애플 AppleScript 등이 있다.

다만 현재로썬 사용하는 곳이 주로 macOS에 한정되어 있어서 AppleScript를 위한 규격이라 해도 틀린 말은 아닐 것 같다.

예제

앱 시작

osascript -e 'tell app "Safari" to activate'

앱 종료

osascript -e 'quit app "safari.app"'

휴지통 비우기

osascript -e 'tell application "Finder" to empty trash'

출처: https://seorenn.github.io/note/osascript.html

적용 방법

  1. LDAP에서 마지막 비밀번호 정보 가져오기
public class PasswordChangeNotifier {

    public static void main(String[] args) throws NamingException {
    // LDAP정보 조회

      // notifyDaySince는 25일
      // lastPasswordChangedSince는 LDAP에서 가져온 마지막 비밀번호 변경 시간
      if (notifyDaySince <= lastPasswordChangedSince) {
            NotifyUtil.execOsaScript("비밀번호", "[" + userId + "] 마지막 윈도우 비밀번호 변경일이 " + lastPasswordChangedSince + "일 지났습니다. 비밀번호를 변경해 주세요.");
        }
    }
}

위의 LDAP정보 조회기능은 아래 링크를 통해 각자 환경에 맞는 로직으로 사용하면 된다.

[java로 active directory에서 사용자 정보 조회]

  1. 25일이 경과되었을 때 알림 보내기
public class NotifyUtil {

    public static void execOsaScript(String title, String message) {
        ProcessBuilder builder = new ProcessBuilder();
        builder.command("/usr/bin/osascript", "-e", "display notification \"" + message + "\" with title \"" + title + "\" sound name \"Funk\"");
        try {
            Process process = builder.start();
            process.waitFor(3, TimeUnit.SECONDS);
            process.destroy();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
    }
}
  1. jar로 실행되게 maven-jar-plugin으로 설정
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jar-plugin</artifactId>
    <version>3.0.2</version>
    <configuration>
        <archive>
            <manifest>
                <mainClass>notifier.PasswordChangeNotifier</mainClass>
                <addClasspath>true</addClasspath>
                <addExtensions>true</addExtensions>
            </manifest>
        </archive>
    </configuration>
</plugin>
  1. crontab에 등록

crontab으로 매일 오전 7시에 실행되게 설정해놓았다.

$ crontab -e 
0 7 * * 1-5 java -jar /경로/passwordchange-notifier-1.0.jar

[osascript 실행되는 알림 화면]

반응형
  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유