import random
from uuid import getnode as get_mac
import ast
-import sys
+import sys, os
import re
MQTT_SERVER = 'mqtt.suanzi.ai'
def get_hostname():
return check_output("/bin/hostname", shell=True).strip();
+def check_ssh_connection(port):
+ command = '/bin/ps aux | /bin/grep -E \'ssh.*' + str(port) + '\' | /bin/grep -v grep | wc -l';
+ output = check_output(command, shell=True)
+ print 'output: ', output
+ if int(output) == 0:
+ return False
+ else:
+ return True
+
+def try_use_rsa():
+ pub = os.getenv('HOME') + "/.ssh/id_rsa.pub"
+ if not os.path.isfile(pub):
+ # generate id_rsa.pub
+ command = 'ssh-keygen -b 2048 -t rsa -f ~/.ssh/id_rsa -P ""'
+ print command
+ print call(command, shell=True)
+ # copy id_rsa.pub
+ command = 'sshpass -p' + PASSWORD + ' ssh-copy-id -o "StrictHostKeyChecking=no" -o "UserKnownHostsFile /dev/null" ' + USER + '@' + SSH_SERVER
+ print command
+ print call(command, shell=True)
+
+
+
def exec_ssh(port):
+ print "#### start establish ssh forwarding connection port, ", port
if port == None:
raise Exception('Port not avaliable')
command = 'sshpass -p' + PASSWORD + ' ssh -o "StrictHostKeyChecking=no" -o "UserKnownHostsFile /dev/null" -o "ServerAliveInterval 60" -o "ServerAliveCountMax 3" -fCR ' + str(port) +':localhost:22 ' + USER + '@' + SSH_SERVER + ' sleep ' + str(ALIVE_TIME)
print command
- return call(shlex.split(command), shell=False)
-
+ ret = call(shlex.split(command), shell=False)
+ if check_ssh_connection(port):
+ return ret
+ else: ## if sshpass fails (sometimes when another process has large CPU usage (100%) , no ssh connection, try another,
+ try_use_rsa()
+ command = 'ssh -o "PasswordAuthentication=no" -o "StrictHostKeyChecking=no" -o "UserKnownHostsFile /dev/null" -o "ServerAliveInterval 60" -o "ServerAliveCountMax 3" -fCR ' + str(port) +':localhost:22 ' + USER + '@' + SSH_SERVER + ' sleep ' + str(ALIVE_TIME)
+ print command
+ ret = call(shlex.split(command), shell=False)
+ return ret
def on_connect(client, userdata, flags, rc):
client.subscribe(userdata['id'])
if payload['command'] == 'ssh':
port = getAvailablePort(SSH_SERVER, PORT_RANGE)
if exec_ssh(port) == 0:
+ print "#### OK, SSH forwarding connection established, port, ", port
response = {'from': userdata['id'], 'type':'response', 'command':payload['command'], 'data':port}
client.publish(payload['from'], str(response))
else: