Advertisement
Guest User

Untitled

a guest
Mar 3rd, 2018
480
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 14.59 KB | None | 0 0
  1. # -*- coding: utf-8 -*-
  2.  
  3. import socket
  4. import json
  5. import smtplib
  6. import time
  7. import statistics
  8. import os
  9. import logging
  10. import uptime
  11. import sys
  12. import json
  13. import psutil
  14. import selenium
  15. from selenium import webdriver
  16. from selenium.webdriver.common.keys import Keys
  17.  
  18. ###################################################CONFIG##############################################################
  19.  
  20. # email
  21. email_user = ''
  22. email_password = ''
  23. recipient = ['']
  24.  
  25. # magtifun
  26. magtifun_id = ''
  27. magtifun_passwd = ''
  28.  
  29. # miner
  30. miner_ip = '127.0.0.1'
  31. miner_port = 3333
  32. miner_password = 'password'
  33. process_name = 'EthDcrMiner64.exe'
  34. pools = ['eth-eu1.nanopool.org', 'eth-eu2.nanopool.org', 'eth-us-east1.nanopool.org', 'eth-us-west1.nanopool.org',
  35. 'eth-asia1.nanopool.org']
  36. pool_port = 9999
  37. miner_path = 'C:\Users\Master\Desktop\claymore\EthDcrMiner64.exe'
  38. epool = 'eth-eu1.nanopool.org:9999'
  39. ewal = 'wallet/worker_name/mail'
  40. epsw = 'x'
  41. #dcoin = 'sia'
  42. #dpool = 'stratum+tcp://sia-eu1.nanopool.org:7777'
  43. #dwal = 'wallet/worker1/mail@gmail.com'
  44. #dpsw = 'x'
  45. mode = '1'
  46. ftime = '10'
  47. #mpsw = 'password'
  48.  
  49. # limits
  50. hashrate_limit = 40000 #h/s
  51. fan_speed_limit = 65 #percent
  52. gpu_temp_limit = 65 #Celsius
  53. uptime_limit = 240 #seconds
  54. cards_limit = 3
  55.  
  56. # logging
  57. log_name = 'ethmon.log'
  58.  
  59. #######################################################################################################################
  60.  
  61. def get_data(ip, port, password, logger):
  62. sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  63. server_address = (ip, port)
  64. try:
  65. sock.connect(server_address)
  66. except Exception as e:
  67. logger.info('Miner socket ' + str(ip) + ':' + str(port) + ' is closed')
  68. return []
  69. request = '{\"id\":0,\"jsonrpc\":\"2.0\",\"method\":\"miner_getstat1\",\"psw\":\"' + password + '\"}'
  70. request = request.encode()
  71. try:
  72. sock.sendall(request)
  73. except Exception as e:
  74. logger('Sending data was aborted')
  75. return []
  76. try:
  77. data = sock.recv(512)
  78. except Exception as e:
  79. logger('Recieveing data was aborted')
  80. return []
  81. message = json.loads(data)
  82. sock.close()
  83. return message
  84.  
  85.  
  86. def check_connection(address, port):
  87. s = socket.socket()
  88. try:
  89. s.connect((address, port))
  90. return True
  91. except Exception as e:
  92. return False
  93. finally:
  94. s.close()
  95.  
  96.  
  97. def get_pid(procces):
  98. pids = []
  99. for pid in psutil.pids():
  100. p = psutil.Process(pid)
  101. if p.name() == procces:
  102. pids.append(p.pid)
  103. return pids
  104.  
  105.  
  106. def send_email(user, pwd, recipient, subject, body, logger):
  107. gmail_user = user
  108. gmail_pwd = pwd
  109. FROM = user
  110. TO = recipient if type(recipient) is list else [recipient]
  111. SUBJECT = subject
  112. TEXT = body
  113.  
  114. message = """From: %s\nTo: %s\nSubject: %s\n\n%s
  115. """ % (FROM, ", ".join(TO), SUBJECT, TEXT)
  116. try:
  117. server = smtplib.SMTP("smtp.gmail.com", 587)
  118. server.ehlo()
  119. server.starttls()
  120. server.login(gmail_user, gmail_pwd)
  121. server.sendmail(FROM, TO, message)
  122. server.close()
  123. logger.info('Successfully sent the mail')
  124. except:
  125. logger.info('Failed to send mail')
  126.  
  127. def send_email(user, pwd, recipient, subject, body, logger):
  128. try:
  129. server = smtplib.SMTP("smtp.gmail.com", 587)
  130. server.ehlo()
  131. server.starttls()
  132. server.login(gmail_user, gmail_pwd)
  133. server.sendmail(FROM, TO, message)
  134. server.close()
  135. logger.info('Successfully sent the email')
  136. except:
  137. logger.info('Failed to send email')
  138. try:
  139. #driver = webdriver.PhantomJS('C:\phantomjs', service_log_path=os.path.devnull)
  140. driver = webdriver.Chrome('C:\chromedriver', service_log_path=os.path.devnull)
  141. driver.get('http://www.magtifun.ge/index.php?page=2&lang=ge');
  142. driver.accept_untrusted_certs = True
  143. driver.find_element_by_name('user').send_keys(magtifun_id)
  144. driver.find_element_by_name('password').send_keys(magtifun_passwd)
  145. driver.find_element_by_xpath("./html/body/div[1]/center/div[1]/div[2]/div[1]/form/table/tbody/tr/td[2]/input").click();
  146. driver.find_element_by_xpath('.//*[@id="sms_form"]/p[2]/span').click();
  147. time.sleep(3)
  148. driver.find_element_by_xpath('.//*[@id="gurama "]/label/table/tbody/tr/td[1]/input').click();
  149. #driver.find_element_by_xpath('.//*[@id="piro "]/label/table/tbody/tr/td[1]/input').click();
  150. driver.find_element_by_xpath('.//*[@id="me "]/label/table/tbody/tr/td[1]/input').click();
  151. driver.find_element_by_xpath('.//*[@id="tinycontent"]/div[2]/input[2]').click();
  152. driver.find_element_by_name('message_body').send_keys(body)
  153. driver.find_element_by_xpath('//*[@id="sms_form"]/p[6]/input').click();
  154. #time.sleep(5)
  155. #darchenilia = driver.find_element_by_xpath("./html/body/div[1]/center/div[1]/div[2]/div[1]/form/div[2]/span/span").text
  156. #darchenilia = str(darchenilia)
  157. #result = "darcha %s SMS" % darchenilia
  158. driver.quit()
  159. logger.info('Successfully sent the sms')
  160. except:
  161. logger.info('Failed to send sms')
  162.  
  163. def get_avg_hashrate_1m(ip, port, password, logger):
  164. hashrates = []
  165. for i in range(0, 5):
  166. data = get_data(ip, port, password, logger)
  167. try:
  168. hashrate = data['result'][2].split(';')[0]
  169. except Exception as e:
  170. logger.info('Data is empty or invalid')
  171. time.sleep(30)
  172. continue
  173. hashrates.append(float(hashrate))
  174. time.sleep(10)
  175. i += 1
  176. try:
  177. return statistics.mean(hashrates)
  178. except Exception as e:
  179. return 0
  180.  
  181.  
  182. def config_logging():
  183. logger = logging.getLogger(__name__)
  184. logger.setLevel(logging.INFO)
  185. handler = logging.FileHandler(log_name)
  186. handler.setLevel(logging.INFO)
  187. formatter = logging.Formatter('%(asctime)s - %(message)s')
  188. handler.setFormatter(formatter)
  189. logger.addHandler(handler)
  190. consoleHandler = logging.StreamHandler()
  191. consoleHandler.setFormatter(formatter)
  192. logger.addHandler(consoleHandler)
  193. return logger
  194.  
  195.  
  196. def start_miner():
  197. command = 'start cmd.exe /k ' + miner_path + ' -epool ' + epool + ' -ewal ' + ewal + ' -epsw ' + epsw + ' -mode ' + mode + ' -ftime ' + ftime
  198. os.system(command)
  199.  
  200.  
  201. def stop_miner():
  202. os.system("taskkill /f /im EthDcrMiner64.exe")
  203. os.system("taskkill /f /im cmd.exe")
  204.  
  205.  
  206. def main():
  207. invalid_shares_prev = 0
  208. previous_hashrate = hashrate_limit + 1
  209. previous_miner_uptime = 1
  210. sys_uptime = uptime.uptime()
  211. logger = config_logging()
  212. logger.info('Started ethmon')
  213. logger.info('System uptime is ' + str(sys_uptime) + ' seconds')
  214. if sys_uptime < uptime_limit:
  215. logger.info('System was rebooted, sending email')
  216. send_email(email_user, email_password, recipient, 'System was rebooted',
  217. 'Current system uptime is ' + str(sys_uptime) + ' s', logger)
  218. while True:
  219. # check miner process
  220. logger.info('Checking if miner is running...')
  221. pids = get_pid(process_name)
  222. if len(pids) == 0:
  223. logger.info('Miner is not running, sending email')
  224. send_email(email_user, email_password, recipient, 'Miner is not running',
  225. 'Miner is not running. Ethmon will try to start is manually', logger)
  226. logger.info('Starting miner.')
  227. start_miner()
  228. logger.info('Waiting for retry.')
  229. time.sleep(30)
  230. continue
  231. if len(pids) > 1:
  232. logger.info('More than one miner running, sending email')
  233. send_email(email_user, email_password, recipient, 'More than one miner running',
  234. 'Too many miners started, check the system', logger)
  235. logger.info('Stopping miner.')
  236. stop_miner()
  237. logger.info('Starting miner.')
  238. start_miner()
  239. logger.info('Waiting for retry...')
  240. time.sleep(60)
  241. continue
  242. if len(pids) == 1:
  243. logger.info('Miner is running with PID ' + str(pids[0]))
  244.  
  245. # check pool connection
  246. reachable = 0
  247. connection = check_connection(pools[0], pool_port)
  248. logger.info('Connection test result to ' + pools[0] + ' is : ' + str(connection))
  249. if connection is not True:
  250. logger.info('Main server ' + pools[0] + ' is unreachable, trying other...')
  251. for i in range(1, len(pools)):
  252. connection = check_connection(pools[i], pool_port)
  253. logger.info('Connection test result to ' + pools[i] + ' is : ' + str(connection))
  254. if connection is True:
  255. logger.info('Server ' + pools[i] + ' is reachable')
  256. send_email(email_user, email_password, recipient, 'Nanopool main server is unreachable',
  257. 'Nanopool main server is unreachable. Reachable server is ' + pools[
  258. i] + ' Check if miner switched correctly.', logger)
  259. reachable = 1
  260. break
  261. if connection is not True and reachable == 0:
  262. logger.info('Nanopool is unreachable, waiting 60 seconds for recheck...')
  263. time.sleep(60)
  264. continue
  265.  
  266. # getting data from miner using API
  267. data = get_data(miner_ip, miner_port, miner_password, logger)
  268. retries = 0
  269. try:
  270. all = data['result'][6].split(';')
  271. temp = all[::2]
  272. fans = all[1::2]
  273. invalid_shares = int(data['result'][8].split(';')[0])
  274. miner_uptime = data['result'][1]
  275. except Exception as e:
  276. retries += 1
  277. if retries < 3:
  278. logger.info("Data is empty or invalid, waiting 60 seconds for recheck... Attempt # %d" % (retries + 1))
  279. time.sleep(60)
  280. continue
  281. else:
  282. logger.info("Too many unsuccessful attempts, sending email and restarting miner")
  283. send_email(email_user, email_password, recipient, 'Miner is unreachable, restarting',
  284. 'Miner is unrechable via API. Ethmon will try to restart is manually', logger)
  285. stop_miner()
  286. start_miner()
  287. continue
  288.  
  289. # checking number of active cards
  290. cards = len(temp)
  291. logger.info('Number of active cards: ' + str(cards))
  292. if cards < cards_limit:
  293. logger.info('Number of active cards trigger, sending emails')
  294. send_email(email_user, email_password, recipient, 'Number of active cards less than a limit',
  295. 'Number of active cards: %d' % cards, logger)
  296. logger.info('Stopping miner.')
  297. stop_miner()
  298. logger.info('Starting miner.')
  299. start_miner()
  300.  
  301. # checking temp
  302. logger.info('GPU temp: ' + str(temp))
  303. high_temp = 0
  304. for i in range(0, len(temp)):
  305. if int(temp[i]) > gpu_temp_limit:
  306. high_temp += 1
  307. i += 1
  308. if high_temp != 0:
  309. logger.info('GPU high temp trigger, sending emails')
  310. send_email(email_user, email_password, recipient, 'GPU temp is HIGH',
  311. 'Number of GPUs with HIGH temp: %d' % high_temp, logger)
  312.  
  313. # checking fans
  314. logger.info('Fan speed (%): ' + str(fans))
  315. stopped = 0
  316. for i in range(0, len(fans)):
  317. if int(fans[i]) < fan_speed_limit:
  318. stopped += 1
  319. i += 1
  320. if stopped != 0:
  321. logger.info('Fan low speed trigger, sending emails')
  322. send_email(email_password, email_password, recipient, 'Fan speed is LOW',
  323. 'Number of fans with LOW speed: %d' % stopped, logger)
  324.  
  325. # invalid shares
  326. logger.info('Number of ETH invalid shares: ' + str(invalid_shares))
  327. if invalid_shares != invalid_shares_prev:
  328. logger.info('Invalid shares trigger, sending emails')
  329. send_email(email_user, email_password, recipient, 'Number of invalid shares increasing',
  330. 'Number of invalid shares: %s' % invalid_shares, logger)
  331. invalid_shares_prev = invalid_shares
  332. logger.info('Stopping miner.')
  333. stop_miner()
  334. logger.info('Starting miner.')
  335. start_miner()
  336. invalid_shares_prev=0
  337.  
  338. # miner uptime
  339. logger.info('Miner uptime is ' + miner_uptime + ' min')
  340. if int(miner_uptime) < int(previous_miner_uptime):
  341. logger.info('Miner was restarted')
  342. send_email(email_user, email_password, recipient, 'Miner was restarted',
  343. 'Miner uptime is ' + str(miner_uptime) + ' min', logger)
  344. previous_miner_uptime = miner_uptime
  345.  
  346. hashrates = []
  347. i = 0
  348. logger.info('Previous hashrate is %s ' % "{:,.2f}".format(previous_hashrate / 1000) + ' Mh/s')
  349. logger.info('Started calculating hashrate...')
  350. for i in range(0, 5):
  351. hashrates.append(float(get_avg_hashrate_1m(miner_ip, miner_port, miner_password, logger)))
  352. time.sleep(10)
  353. i += 1
  354. current_hashrate = statistics.mean(hashrates)
  355. logger.info('Avg hashrate: ' + str("{:,.2f}".format(current_hashrate / 1000)) + " Mh/s")
  356. if current_hashrate < hashrate_limit:
  357. if previous_hashrate < hashrate_limit:
  358. logger.info('Avg hashrate <' + str(
  359. "{:,}".format(hashrate_limit / 1000)) + ' Mh/s two times in a row, sending emails and reboot!')
  360. send_email(email_user, email_password, recipient,
  361. 'Alarm! Hashrate is less than' + str("{:,}".format(hashrate_limit / 1000)) + ' Mh/s',
  362. 'Current avg hashrate is %s h/s. Rebooting!' % "{:,.2f}".format(
  363. current_hashrate), logger)
  364. os.system("shutdown -r -c \"low hashrate, rebooted by vahter!\"")
  365. logger.info('Avg hashrate <' + str("{:,}".format(hashrate_limit / 1000)) + ' Mh/s, sending emails')
  366. send_email(email_user, email_password, recipient,
  367. 'Warning! Hashrate is less than ' + str("{:,}".format(hashrate_limit / 1000)) + ' Mh/s',
  368. 'Current avg hashrate is %s h/s.' % "{:,.2f}".format(current_hashrate), logger)
  369. previous_hashrate = current_hashrate
  370.  
  371.  
  372. if __name__ == '__main__':
  373. main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement