본문 바로가기
프로젝트/토이 프로젝트(개인)

[ONLY JAVA-CMD] 자바로 재택근무환경으로 자동전환 프로그램만들기 / 자바로 인터넷옵션변경 / 자바 Command환경

by 으노으뇨 2023. 6. 16.
728x90
반응형
SMALL

안녕하세요! 

요 몇개월간 포스팅을 못했네요 ㅠㅠ 신규 프로젝트와 학기의 시작으로 한동안 포스팅을 할 엄두를 못내고있다가

학기가 마무리되고 계절학기 사이 시간이 2~3일 남아서 간단한 프로그램을 만들어보았습니다.


프로그램명 : 재택근무환경 자동셋팅 프로그램

요구사항

현재 IT기업에서 근무하고 있는 A씨는 매주 1~2회 재택근무를 실시한다.

기업내부 폐쇄망에서 진행하는터라 원격에서 기업내부 전산을 이용하려면 인터넷옵션을 변경해야한다.

매번 IP와 DNS 설정을 수동으로 진행하고, 재택근무 종료후 출근할땐 또 수동으로 Key-In으로 진행해야한다.

주 2회 재택시 총 4번 셋팅을 해야하며, 입력중 오타라도 나는경우 발견을 못한다면 해결시 많은 시간을 할애해야한다.

이에따라 자동적으로 재택근무환경을 셋팅해주는 프로그램의 수요가 조금씩 생기기시작하여 개발자가 이를 개발해결해주기로한다.


순서도

시작->DHCP환경체크-여부에따른 IP셋팅 -> DNS 셋팅 -> 재택환경으로 셋팅되면 익스플로어 브라우저를, 아니라면 성공메세지만 출력


간단한 프로그램 설계

환경은 자바에서 셋팅되게한다. 그리고 인터넷옵션을 변경하는것이다보니 관리자 권한으로 실행되게설정한다.

현재 시스템이 더 커질 일은 거의없으니 고정적인 상수를 사용하며 오류, 결과값은 jfram으로 출력하게한다.


관리자 권한 셋팅

자바로 cmd를 실행하다보면 그리고 설정을 변경하다보면 관리자권한이 없어서 cmd 명령어를 실행을 못하는 경우가 있다.

이때 원래같으면 관리자권한으로 cmd를 열어 실행하지만 테스트단계에서 이를 실행시키 위해서는

이클립스 또는 실행하는 IDE를 관리자 권한으로 실행시키는 것이다. 

참조 : https://uno-kim.tistory.com/388

 

[eclipse, sts]자바 소스 실행을 관리자 권한으로 실행하게하기

이클립스 단에서 자바소스를 이용해서 cmd 명령어를 실행하면 관리자 권한이 아니라고 오류를 뱉던가 또는 실행이 되지 않는 경우가 있습니다. 적용방법 본인이 사용하는 IDE가 저장되어있는 폴

uno-kim.tistory.com

프로그램 소스 상세

Command 명령어 상수부

enum RemoteWork {
	//DHCP 상태를 얻어오는 커맨드라인
	CHECK_DHCP("netsh interface ip show address \"Wi-Fi\" "),
	//자동 IP 할당을 시키는 커맨드라인
	SET_AUTO_IP_SETUP("netsh interface ip set address \"Wi-Fi\" dhcp "),
	//자동 DNS 할당 시키는 커맨드라인
	SET_AUTO_DNS_SETUP("netsh interface ip set dns \"Wi-Fi\" dhcp "),
	//유저의 기존 IP 정보로 셋팅하는 커맨드라인
	SET_USER_IP_SETUP("netsh interface ip set address \"Wi-Fi\" static "),
	//유저의 기존 기본 DNS 정보로 셋팅하는 커맨드라인
	SET_USER_DNS_PRIMARY_SETUP("netsh interface ip set dns \"Wi-Fi\" static "),
	//유저의 기존 보조 DNS 정보로 셋팅하는 커맨드라인
	SET_USER_DNS_SECONDARY_SETUP("netsh interface ip add dns \"Wi-Fi\" "),
	//재택근무를 위한 로그인 페이지로 이동하는 커맨드라인
	OPEN_IEXPLORE("start iexplore https://naver.com");

	private final String cmd;

	RemoteWork(String cmd) {
		this.cmd = cmd;
	}

	public String get() {
		return this.cmd;
	}
}
유저 기존정보 저장된 DB구현
class UserDB {
	private Map<String, Map<String, String>> allUserEnvironmentSetup = new HashedMap<>();
	private Map<String, String> userEnvironmentSetup = new HashedMap<>();;

	UserDB(String userName) {
		Map<String, String> sampleUserDB = new HashedMap<String, String>();
		sampleUserDB.put("IP_ADDRESS", "192.111.111.10 255.255.255.0 192.111.111.10");
		sampleUserDB.put("PRIMARY_DNS_ADDRESS", "199.111.111.10");
		sampleUserDB.put("SECONDARY_DNS_ADDRESS", "198.111.111.10");
		/**
		 * @desc 실제 DB처럼 유저들의 환경정보가 들어있는 DB를 구현한것임
		 */
		this.allUserEnvironmentSetup.put("김은호", sampleUserDB);
		this.allUserEnvironmentSetup.put("홍길동", sampleUserDB);
		this.allUserEnvironmentSetup.put("이순신", sampleUserDB);
		/**
		 * @desc 가져온 유저정보인 유저이름으로 유저정보에 해당하는 환경정보를 가져오고 셋팅한다. 대략 DTO셋팅하는것임
		 */
		this.userEnvironmentSetup = this.allUserEnvironmentSetup.get("userName");
	}

	public String getEnvironmentSetupData(String col) {
		return this.userEnvironmentSetup.get(col);
	}
}

원래 소스에 하드코딩되어있으면 안되지만 간단한 테스팅을 위해 하드코딩으로 하였다.

DB처럼 맵<맵> 객체에 사람들 유저 정보가 들어가게된다. (Table구현)

그리고 select 할때 Pk값을 where절 맨앞에 넣는것 같은 기능을 하는 소스다.

this.userEnvironmentSetup = this.allUserEnvironmentSetup.get("userName");

UserDB 를 선언할때 해당 유저정보를 가져온다. 만약 없는 유저정보면 해당유저가 없다고 출력이 되어야하나, 그렇게 까지 폭넓게는 개발하지않겠다... 기능우선개발..

public String getEnvironmentSetupData(String col) { return this.userEnvironmentSetup.get(col); }

위 메서드는 where  추가조건을 나타내는 것이다. select * from UserDB where userNm = "김은호"  and 뒤에 붙는 추가조건절이다.

실 구현 소스
	static ProcessBuilder processBuilder = new ProcessBuilder();

	public static void main(String[] args) throws IOException, InterruptedException {
		processBuilder.command("cmd.exe", "/c");
		showMessage("::: message ::: 재택근무환경 자동셋팅 프로그램 is running...");
		if (checkDHCPMode(RemoteWork.CHECK_DHCP.get())) {
			showMessage("::: message ::: DHCP 설정이 YES로 설정되어있습니다...  재택환경으로 셋팅을 시작하겠습니다.");
			if (excuteCommandLine(RemoteWork.SET_AUTO_IP_SETUP.get())) {
				showMessage("::: message ::: 자동 IP 할당으로 셋팅완료...");
				if (excuteCommandLine(RemoteWork.SET_AUTO_DNS_SETUP.get())) {
					showMessage("::: message ::: 자동 DNS 할당으로 셋팅완료...");
					if (excuteCommandLine(RemoteWork.OPEN_IEXPLORE.get())) {
						showMessage("::: message ::: 재택근무환경이 성공적으로 셋팅되었습니다.");
					} else {
						showMessage("::: ERROR ::: 익스플로어 실행에서 문제가 발생했습니다.");
					}
				} else {
					showMessage("::: ERROR ::: DNS 주소 자동할당중 설정중 오류가 발생했습니다.");
				}
			} else {
				showMessage("::: ERROR ::: IP 주소 자동할당중 설정중 오류가 발생했습니다.");
			}
		} else {
			UserDB userDB = new UserDB("김은호");
			String cmdLine = "";
			showMessage("::: message ::: DHCP 설정이 No로 설정되어있습니다...  출근환경으로 셋팅을 시작하겠습니다.");
			if (excuteCommandLine(RemoteWork.SET_USER_IP_SETUP.get() + userDB.getEnvironmentSetupData("IP_ADDRESS"))) {
				showMessage("::: message ::: 유저의 기존 IP 값으로 셋팅완료...");
				cmdLine = RemoteWork.SET_USER_DNS_PRIMARY_SETUP.get()
						+ userDB.getEnvironmentSetupData("PRIMARY_DNS_ADDRESS");
				if (excuteCommandLine(cmdLine)) {
					showMessage("::: message ::: 유저의 기존 기본 DNS 값으로 셋팅완료...");
					cmdLine = RemoteWork.SET_USER_DNS_SECONDARY_SETUP.get()
							+ userDB.getEnvironmentSetupData("SECONDARY_DNS_ADDRESS");
					if (excuteCommandLine(cmdLine)) {
						showMessage("::: message ::: 유저의 기존 보조 DNS 값으로 셋팅완료...");
						showMessage("::: message ::: 기존 환경설정으로 복구완료했습니다.\n" + "::: IP ::: "
								+ userDB.getEnvironmentSetupData("IP_ADDRESS") + " \n기본 DNS : "
								+ userDB.getEnvironmentSetupData("PRIMARY_DNS_ADDRESS") + "\n::: 보조 DNS ::: "
								+ userDB.getEnvironmentSetupData("SECONDARY_DNS_ADDRESS"));
					} else {
						showMessage("::: ERROR ::: 보조 DNS 설정시 오류가 발생했습니다.");
					}
				} else {
					showMessage("::: ERROR ::: 기본설정 DNS 설정시 오류가 발생했습니다.");
				}
			} else {
				showMessage("::: ERROR ::: IP 설정시 오류가 발생했습니다.");
			}
		}
	}

소스가 많이 길어보이지만 메세지 떄문에 길어보이는것이다.

맨위 내가 그린 순서도와 동일하게 작성했다.

각 기능을 담당하는 함수부

메세지를 최종 출력하는 함수

static void showMessage(final String message) {
	System.err.println(message);
}

커맨드라인을 실행하고 커맨드라인리스트를 삭제하는 함수

static private Process startCommandLine(String cmdLine) throws IOException {
	processBuilder.command().add(cmdLine);
	Process process = processBuilder.start();
	processBuilder.command().remove(processBuilder.command().size() - 1);
	return process;
}

파라미터로 커맨드라인을 프로레스빌드객체의 커맨드리스트에 추가하고

실행한뒤, 해당 실행한 커맨드만 삭제하는 함수이며 실행된 결과인 process 를 리턴한다.

결과를 버퍼드리더로 리턴해주는 함수

static private BufferedReader result(String cmdLine) throws IOException {
	return new BufferedReader(new InputStreamReader(startCommandLine(cmdLine).getInputStream()));
}

커맨드라인을 실행한 결과를 버퍼드리더로 리턴한다.

실행결과리턴하는 함수

static private int isSuccesExcuceCommandLine(String cmdLine) throws IOException, InterruptedException {
	return startCommandLine(cmdLine).waitFor();
}

명령어 실행결과에 대해서 값을 리턴해준다. 정상처리 되면 0, 그게아니라면 다른 숫자가 리턴된다.

커맨드라인실행 함수

static private boolean excuteCommandLine(String cmdLine) throws IOException, InterruptedException {
	if (isSuccesExcuceCommandLine(cmdLine) == 0) {
		return true;
	}
	return false;
}

커맨드라인 실행결과로 0이 나오면 성공으로 true, 실패면 false를 리턴한다.

DHCP 설정 체크하는 함수

static private boolean checkDHCPMode(String cmdLine) throws IOException {
	BufferedReader reader = result(cmdLine);
	String line;
	while ((line = reader.readLine()) != null) {
		if (line.contains("Yes")) {
			return false;
		}
	}
	return true;
}

현재 PC의 DHCP 설정을 체크하여 DHCP 설정이 켜져있으면 결과값중 "Yes"가 있다.

해당 결과값에 Yes가 있는 조건을 걸어 커맨드라인의 결과에서 찾은뒤 

Yes가 포함되어있는 문자열이 발견된다면 false를 리턴한다.

true 리턴 : 현재 192.111.111.10 으로 셋팅되어있다. -> 자동으로 IP 주소받기로 변경하는 알고리즘실행

false 리턴 : 현재 자동으로 IP 주소 받기로 셋팅되어있다. -> 192.111.111.10 으로 셋팅하는 알고리즘 실행


실제 구동 모습

설정이 모두 변경이 잘됩니다.


간단하게 자바로만 프로그래밍을 하였지만, 이상없이 동작했습니다.

조금더 손봐서 DB연결, GUI또는 사용자가 좀더 명확하게 알수있고 현재 프로그래스가 얼마나 되었는지

중간에 멈춘게 아닌지 등 인지시키는 기능만 더추가하면 완벽한 프로그램이 될것같지만

예산이 적어서 여기까지 진행됩니다. ㅎㅎㅎ

농담이고 이 기능을 바탕으로 더 무궁무진한 프로그래밍을 할 수 있는것을 알아보았습니다.

이상입니다. 

감사합니다.

728x90
반응형
LIST

댓글