파이썬

시놀로지 VMM 사용자를 위한 소스코드~

귀신이보인다 2021. 1. 24. 21:17
728x90
반응형
#-*- coding: utf-8 -*-
import sys
try:
	reload(sys)
	sys.setdefaultencoding('utf-8')
except:
	pass
import re
import os, json

try:
	import requests
except ImportError:
	os.system('pip install requests')
	import requests
try:
	import argparse
except ImportError:
	os.system('pip install argparse')
	import argparse	
try:
	from bs4 import BeautifulSoup as bs
except ImportError:
	os.system('pip install BeautifulSoup4')
	from bs4 import BeautifulSoup as bs
try:
	import telepot
except ImportError:
	os.system('pip install telepot')
	import telepot
	
def start(url,id,passwd,mode,name,telgm,telgm_alim,telgm_token,telgm_botid):
	with requests.Session() as s:
		#시놀로지의 SID 먼저 받아온다.
		main = url + '/webapi/auth.cgi?api=SYNO.API.Auth&method=login&version=3&account=' + id +'&passwd=' + passwd + '&format=sid&session=dsm_info'
		request_headers = {'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; WOW64) \ AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.75 \ Safari/537.36'}
		text = s.get(main, headers=request_headers)#.content
		html = text.text
		jsonObject = json.loads(html)
		jsonArray = jsonObject.get("data").get("sid")
		jsontf = jsonObject.get("success")
		data = url + '/webapi/entry.cgi?_sid=' + jsonArray + '&api=SYNO.Virtualization.API.Guest.Action&method=' + mode + '&version=1&guest_name=' + name
		#print(data)
		text = s.get(data, headers=request_headers).content
		#html = text.text
		jsonObject = json.loads(text)
		jsontf = jsonObject.get("success")
		#print(jsontf)
		if jsontf == True:
			msg = '{} 의 {} 실행결과는 성공하였습니다.'.format(name,mode,jsontf)
			print(msg)
		else:
			msg = '{} 의 {} 실행결과는 실패하였습니다.'.format(name,mode,jsontf)
			print(msg)
		if telgm == '0' :
			bot = telepot.Bot(token = telgm_token)
			if telgm_alim == '0' :
				bot.sendMessage(chat_id = telgm_botid, text=msg, disable_notification=True)
			else:
				bot.sendMessage(chat_id = telgm_botid, text=msg, disable_notification=False)
	#	else:
		#	print(msg)		
		#print(text)

def main():
	parser = argparse.ArgumentParser(prog='시놀로지 VMM ON/OFF Beta', description='시놀로지 VMM ON/OFF Beta',epilog="도움말 확인하세요.")	
	parser.add_argument('--url', required=True, type=str, help='Url')
	parser.add_argument('--id', required=True, type=str, help='시놀로지ID')
	parser.add_argument('--passwd', required=True, type=str, help='시놀로지PASSWD')
	parser.add_argument('--mode', required=True, default='poweron', type=str, choices=['poweron','poweroff'])
	parser.add_argument('--name', required=True, type=str, help='가상머신 이름')
	parser.add_argument('--telgm', required=False, type=str,default='1', help='텔레그램사용',choices=['0','1'])
	parser.add_argument('--telgm_alim', required=False, type=str, default='1', help='텔레그램알림',choices=['0','1'])
	parser.add_argument('--telgm_token', required=False, type=str, help='텔레그램토큰')
	parser.add_argument('--telgm_botid', required=False, type=str, help='텔레그램아이디')
	args = parser.parse_args()
	url = args.url
	mode = args.mode
	name = args.name
	id = args.id
	passwd = args.passwd
	telgm = args.telgm
	telgm_alim = args.telgm_alim
	telgm_token = args.telgm_token
	telgm_botid = args.telgm_botid
	start(url,id,passwd,mode,name,telgm,telgm_alim,telgm_token,telgm_botid)

if __name__=="__main__":
	main()	        

 

사용방법은 

python vmm.py --id test --passwd 1234 --url http://127.0.0.1 --mode poweroff --name win98 

위의 명령은 win98 이라는 가상머신을 끄는 명령줄입니다.

 

python vmm.py --id test --passwd 1234 --url http://127.0.0.1 --mode poweron --name win98

위의 명령은 win98 이라는 가상머신을 켜는 명령줄입니다.

 

소스코드가 지저분 해보이긴 합니다.

순서가 시놀로지의 API 문서대로 SID 라는것을 받아와서 해당 SID 를 입력하여 가상 머신을 끄고 켜고 합니다.

중간에 가상머신의 이름을 찾는것도 있지만 필요성이 없어서요 ㅎㅎㅎ

 

아참 모든 소스 코드는 인자값이 대부분 비슷합니다.

이유는 위의 소스코드로 기본으로 만들기 때문입니다.

첫 모듈 불러오는부분과 def main() 부분부터 끝 라인까지는 위의 소스를 토대로 만들어요.

이상입니다.~

728x90
반응형