155 lines
5.1 KiB
Python
Executable File
155 lines
5.1 KiB
Python
Executable File
#!/usr/local/bin/python3
|
|
import os
|
|
import requests
|
|
import time
|
|
import subprocess
|
|
import logging
|
|
from inotify_simple import INotify, flags
|
|
from systemd import journal
|
|
from utilities import *
|
|
from device_info import *
|
|
from drive_info import *
|
|
from application_info import *
|
|
from bitcoin_info import *
|
|
from lightning_info import *
|
|
|
|
|
|
PREMIUM_PLUS_CONNECT_URL = "https://www.mynodebtc.com/device_api/premium_plus_connect.php"
|
|
|
|
log = logging.getLogger('premium_plus_connect')
|
|
log.addHandler(journal.JournaldLogHandler())
|
|
log.setLevel(logging.INFO)
|
|
set_logger(log)
|
|
|
|
# Helper functions
|
|
def get_premium_plus_device_info():
|
|
info = {}
|
|
settings = get_premium_plus_settings()
|
|
|
|
# Basic Info
|
|
info["serial"] = get_device_serial()
|
|
info["device_type"] = get_device_type()
|
|
info["device_arch"] = get_device_arch()
|
|
info["drive_size"] = get_mynode_drive_size()
|
|
info["data_drive_usage"] = get_data_drive_usage()
|
|
info["os_drive_usage"] = get_os_drive_usage()
|
|
info["temperature"] = get_device_temp()
|
|
info["total_ram"] = get_device_ram()
|
|
info["ram_usage"] = get_ram_usage()
|
|
info["swap_usage"] = get_swap_usage()
|
|
info["uptime"] = get_system_uptime()
|
|
|
|
# App status info
|
|
if settings['sync_status']:
|
|
info["app_info"] = get_all_applications_from_json_cache()
|
|
|
|
return info
|
|
|
|
def get_premium_plus_bitcoin_info():
|
|
info = {}
|
|
settings = get_premium_plus_settings()
|
|
|
|
if settings['sync_bitcoin_and_lightning']:
|
|
log_message("BITCOIN " + str(get_bitcoin_json_cache()))
|
|
info = get_bitcoin_json_cache()
|
|
return info
|
|
|
|
def get_premium_plus_lightning_info():
|
|
info = {}
|
|
settings = get_premium_plus_settings()
|
|
|
|
if settings['sync_bitcoin_and_lightning']:
|
|
log_message("LIGHTNING " + str(get_lightning_json_cache()))
|
|
info = get_lightning_json_cache()
|
|
return info
|
|
|
|
# Update hourly
|
|
def premium_plus_connect():
|
|
|
|
# Check in
|
|
data = {
|
|
"serial": get_device_serial(),
|
|
"version": get_current_version(),
|
|
"token": get_premium_plus_token(),
|
|
"settings": json.dumps(get_premium_plus_settings()),
|
|
"device_info": json.dumps(get_premium_plus_device_info()),
|
|
"bitcoin_info": json.dumps(get_premium_plus_bitcoin_info()),
|
|
"lightning_info": json.dumps(get_premium_plus_lightning_info()),
|
|
"product_key": get_product_key(),
|
|
}
|
|
|
|
# Setup tor proxy
|
|
session = requests.session()
|
|
session.proxies = {}
|
|
session.proxies['http'] = 'socks5h://localhost:9050'
|
|
session.proxies['https'] = 'socks5h://localhost:9050'
|
|
|
|
# Check In
|
|
fail_count = 0
|
|
premium_plus_connect_success = False
|
|
while not premium_plus_connect_success:
|
|
try:
|
|
# Use tor for check in unless there have been tor 5 failures in a row
|
|
r = None
|
|
if (fail_count+1) % 5 == 0:
|
|
r = requests.post(PREMIUM_PLUS_CONNECT_URL, data=data, timeout=20)
|
|
else:
|
|
r = session.post(PREMIUM_PLUS_CONNECT_URL, data=data, timeout=20)
|
|
|
|
if r.status_code == 200:
|
|
set_premium_plus_token_status(r.text)
|
|
if r.text == "OK":
|
|
log_message("Premium+ Connect Success: {}".format(r.text))
|
|
else:
|
|
log_message("Check In Returned Error: {}".format(r.text))
|
|
|
|
os.system("rm -f /tmp/premium_plus_connect_error")
|
|
premium_plus_connect_success = True
|
|
else:
|
|
log_message("Premium+ Connect Failed. Retrying... Code {}".format(r.status_code))
|
|
except Exception as e:
|
|
log_message("Premium+ Connect Failed. Retrying... Exception {}".format(e))
|
|
|
|
update_premium_plus_last_sync_time()
|
|
|
|
if not premium_plus_connect_success:
|
|
# Check in failed, try again in 1 minute
|
|
set_premium_plus_token_status("CONNECTION_ERROR")
|
|
time.sleep(60)
|
|
fail_count = fail_count + 1
|
|
|
|
return True
|
|
|
|
# Run premium plus update consistently
|
|
if __name__ == "__main__":
|
|
update_in_min = 15 # Update every 15 minutes
|
|
update_ms = update_in_min * 60 * 1000
|
|
|
|
while True:
|
|
try:
|
|
# Wait for drive to be mounted
|
|
while not is_mynode_drive_mounted():
|
|
log_message("Checking if drive mounted...")
|
|
time.sleep(10)
|
|
log_message("Drive mounted!")
|
|
|
|
# Wait on token
|
|
log_message("Looking for Premium+ Token...")
|
|
while not os.path.isfile("/home/bitcoin/.mynode/.premium_plus_token"):
|
|
time.sleep(10)
|
|
log_message("Token found!")
|
|
premium_plus_connect()
|
|
|
|
# Watch for updates
|
|
log_message("")
|
|
log_message("Watching for file changes or 1hr...")
|
|
inotify = INotify()
|
|
watch_flags = flags.CREATE | flags.DELETE | flags.MODIFY | flags.DELETE_SELF
|
|
wd = inotify.add_watch('/home/bitcoin/.mynode/', watch_flags)
|
|
for event in inotify.read(timeout=update_ms):
|
|
log_message("File changed: " + str(event))
|
|
log_message("Running connect again")
|
|
except Exception as e:
|
|
log_message("Error: {}".format(e))
|
|
time.sleep(60)
|