def main(args): print 'connecting to the Controller...' controller = soloutils.connect_controller(await=True) controller_version = soloutils.controller_versions(controller)['version'] if LooseVersion('1.2.0') > LooseVersion(controller_version): print 'error: expecting version to be >= 1.2.0' print 'your Controller version: {}'.format(controller_version) print 'please flash your Controller with a newer version to run this command.' print '' print ' solo update solo latest' print ' solo update controller latest' sys.exit(1) print '' if args['--password']: print 'connecting to encrypted wifi network.' credentials = 'ssid="{ssid}"\npsk="{password}"'.format( ssid=args['--name'], password=args['--password']) else: print 'connecting to wifi network with NO password.' credentials = 'ssid="{ssid}"\nkey_mgmt=NONE'.format( ssid=args['--name']) print '(your computer may disconnect from Solo\'s network.)' controller = soloutils.connect_controller(await=True) code = soloutils.command_blind(controller, SCRIPT.format(credentials=credentials)) time.sleep(8) controller.close() print '' print 'please manually reconnect to Solo\'s network once it becomes available.' print 'it may take up to 30s to a reconnect to succeed.' controller = soloutils.connect_controller(await=True, silent=True) print '' code = soloutils.command_stream(controller, 'cat /log/setupwifi.log') controller.close() try: drone = soloutils.connect_solo(await=False) print '(resetting Solo\'s DNS...', sys.stdout.flush() soloutils.command(drone, 'ifdown wlan0; ifdown -a; ifup -a; ifup wlan0') time.sleep(4) drone.close() print ' done.)' except: pass sys.exit(code)
def main(args): print 'connecting to the Controller...' controller = soloutils.connect_controller(await=True) controller_version = soloutils.controller_versions(controller)['version'] if LooseVersion('1.2.0') > LooseVersion(controller_version): print 'error: expecting version to be >= 1.2.0' print 'your Controller version: {}'.format(controller_version) print 'please flash your Controller with a newer version to run this command.' print '' print ' solo update solo latest' print ' solo update controller latest' sys.exit(1) print '' if args['--password']: print 'connecting to encrypted wifi network.' credentials = 'ssid="{ssid}"\npsk="{password}"'.format(ssid=args['--name'], password=args['--password']) else: print 'connecting to wifi network with NO password.' credentials = 'ssid="{ssid}"\nkey_mgmt=NONE'.format(ssid=args['--name']) print '(your computer may disconnect from Solo\'s network.)' controller = soloutils.connect_controller(await=True) code = soloutils.command_blind(controller, SCRIPT.format(credentials=credentials)) time.sleep(8) controller.close() print '' print 'please manually reconnect to Solo\'s network once it becomes available.' print 'it may take up to 30s to a reconnect to succeed.' controller = soloutils.connect_controller(await=True, silent=True) print '' code = soloutils.command_stream(controller, 'cat /log/setupwifi.log') controller.close() try: drone = soloutils.connect_solo(await=False) print '(resetting Solo\'s DNS...', sys.stdout.flush() soloutils.command(drone, 'ifdown wlan0; ifdown -a; ifup -a; ifup wlan0') time.sleep(4) drone.close() print ' done.)' except: pass sys.exit(code)
def solo_versions(solo): code, solo_str, stderr = soloutils.command(solo, 'cat /VERSION') version, ref = solo_str.strip().split() return { "version": version, "ref": ref, }
def controller_versions(controller): code, controller_str, stderr = soloutils.command(controller, 'cat /VERSION') version, ref = controller_str.strip().split() return { "version": version, "ref": ref, }
def push(solo, scp, force): if not force: code, stdout, stderr = soloutils.command( solo, 'md5sum /tmp/solo-script.tar.gz') md5sum = next(iter((stdout or '').split()), None) localmd5sum = hashlib.md5(open(SCRIPT_FILENAME, 'rb').read()).hexdigest() if code == 0 and md5sum == localmd5sum: print 'script bundle already up to date.' return 0 print 'uploading script bundle...' scp.put(SCRIPT_FILENAME, '/tmp') return soloutils.command_stream( solo, ''' set -e rm -rf /log/solo-script || true mkdir /log/solo-script cd /log/solo-script tar -xvf /tmp/solo-script.tar.gz virtualenv --clear env || virtualenv env cp -rf /usr/lib/python2.7/site-packages/greenlet* env/lib/python2.7/site-packages/ || true source ./env/bin/activate pip install --no-index -U ./wheelhouse/* ''')
def solo_versions__monkey_patch(solo): code, solo_str, stderr = soloutils.command(solo, 'cat /VERSION') # ^ Same as comment above ^ version, ref, _name, _ = solo_str.strip().split('\n') return { "version": version, "ref": ref, }
def pixhawk_versions(solo): code, pixhawk_str, stderr = soloutils.command(solo, 'cat /PIX_VERSION') version, apm_ref, px4firmware_ref, px4nuttx_ref = pixhawk_str.strip().split() return { "version": version, "apm_ref": apm_ref, "px4firmware_ref": px4firmware_ref, "px4nuttx_ref": px4nuttx_ref, }
def pixhawk_versions(solo): code, pixhawk_str, stderr = soloutils.command(solo, 'cat /PIX_VERSION') version, apm_ref, px4firmware_ref, px4nuttx_ref = pixhawk_str.strip( ).split() return { "version": version, "apm_ref": apm_ref, "px4firmware_ref": px4firmware_ref, "px4nuttx_ref": px4nuttx_ref, }
def controller_versions__monkey_patch(controller): code, controller_str, stderr = soloutils.command(controller, 'cat /VERSION') # Have to add two unpacking variables and split on newline, # as the `/VERSION` file now contains 4 lines instead of one line with 2 tokens separated by a space version, ref, _name, _ = controller_str.strip().split('\n') return { "version": version, "ref": ref, }
def main(args): rsa = os.path.join(expanduser('~'), '.ssh/id_rsa.pub') dsa = os.path.join(expanduser('~'), '.ssh/id_dsa.pub') if not (os.path.isfile(rsa) or os.path.isfile(dsa)): print 'no $HOME/.ssh/id_rsa.pub or $HOME/.ssh/id_dsa.pub file found.' print 'run ssh-keygen and try again.' sys.exit(1) if os.path.isfile(rsa): key = open(rsa).read() else: key = open(dsa).read() controller = soloutils.connect_controller(await=True) solo = soloutils.connect_solo(await=True) soloutils.command(solo, 'test -d .ssh || mkdir -m 0700 .ssh ; echo $\'' + key + '\' >> ~/.ssh/authorized_keys') soloutils.command(controller, 'test -d .ssh || mkdir -m 0700 .ssh ; echo $\'' + key + '\' >> ~/.ssh/authorized_keys') print 'provisioned.'
def gimbal_versions(solo): code, gimbal_str, stderr = soloutils.command(solo, 'cat /AXON_VERSION') try: version, = gimbal_str.strip().split() return { "version": version, "connected": True, } except: return { "connected": False, }
def main(args): os.makedirs('./drone') os.makedirs('./controller') print 'connecting to Solo...' solo = soloutils.connect_solo(await=True) code, stdout, stderr = soloutils.command(solo, 'ls -p /log | grep -v /') files = stdout.strip().split() os.chdir('./drone') scp = SCPClient(solo.get_transport()) count = 0 for item in files: print 'file {} of {}...'.format(count, len(files)) scp.get('/log/' + item) count += 1 os.chdir('..') solo.close() print 'connecting to Controller...' controller = soloutils.connect_controller(await=True) code, stdout, stderr = soloutils.command(controller, 'ls -p /log | grep -v /') files = stdout.strip().split() os.chdir('./controller') scp = SCPClient(controller.get_transport()) count = 0 for item in files: print 'file {} of {}...'.format(count, len(files)) scp.get('/log/' + item) count += 1 os.chdir('..') controller.close() print 'logs download complete.'
def main(args): print 'connecting to Solo...' solo = soloutils.connect_solo(await=True) code, stdout, stderr = soloutils.command(solo, 'ls -p /log | grep -v /') files = stdout.strip().split() scp = SCPClient(solo.get_transport()) count = 0 for item in files: print 'file {} of {}...'.format(count, len(files)) scp.get('/log/' + item) count += 1 print 'complete.'
def main(args): rsa = os.path.join(expanduser('~'), '.ssh/id_rsa.pub') dsa = os.path.join(expanduser('~'), '.ssh/id_dsa.pub') if not (os.path.isfile(rsa) or os.path.isfile(dsa)): print 'no $HOME/.ssh/id_rsa.pub or $HOME/.ssh/id_dsa.pub file found.' print 'run ssh-keygen and try again.' sys.exit(1) if os.path.isfile(rsa): key = open(rsa).read() else: key = open(dsa).read() controller = soloutils.connect_controller(await=True) solo = soloutils.connect_solo(await=True) soloutils.command( solo, 'test -d .ssh || mkdir -m 0700 .ssh ; echo $\'' + key + '\' >> ~/.ssh/authorized_keys') soloutils.command( controller, 'test -d .ssh || mkdir -m 0700 .ssh ; echo $\'' + key + '\' >> ~/.ssh/authorized_keys') print 'provisioned.'
def run(solo, scp): code, stdout, stderr = soloutils.command(solo, 'pip --version') if code != 0: print 'installing pip... ', scp.put(os.path.join(os.path.dirname(__file__), 'lib/ez_setup.py'), '/tmp') scp.put( os.path.join(os.path.dirname(__file__), 'lib/setuptools-18.7.1.zip'), '/tmp') code, stdout, stderr = soloutils.command( solo, 'cd /tmp; python ez_setup.py --to-dir=/tmp') if code: print '' print 'Error in installing pip:' print stdout print stderr return 1 print 'done.' code, stdout, stderr = soloutils.command(solo, 'python -c "import wheel"') if code != 0: print 'installing wheel... ', scp.put( os.path.join(os.path.dirname(__file__), 'lib/wheel-0.26.0.tar.gz'), '/tmp') code, stdout, stderr = soloutils.command( solo, 'pip install /tmp/wheel-0.26.0.tar.gz') if code: print '' print 'Error in installing wheel:' print stdout print stderr return 1 print 'done.' code, stdout, stderr = soloutils.command(solo, 'virtualenv --version') if code != 0: print 'installing virtualenv... ', scp.put( os.path.join(os.path.dirname(__file__), 'lib/virtualenv-13.1.2.tar.gz'), '/tmp') code, stdout, stderr = soloutils.command( solo, 'pip install /tmp/virtualenv-13.1.2.tar.gz') if code: print '' print 'Error in installing virtualenv:' print stdout print stderr return 1 print 'done.' return 0
def push(solo, scp, force): if not force: code, stdout, stderr = soloutils.command(solo, 'md5sum /tmp/solo-script.tar.gz') md5sum = next(iter((stdout or '').split()), None) localmd5sum = hashlib.md5(open(SCRIPT_FILENAME, 'rb').read()).hexdigest() if code == 0 and md5sum == localmd5sum: print 'script bundle already up to date.' return 0 print 'uploading script bundle...' scp.put(SCRIPT_FILENAME, '/tmp') return soloutils.command_stream(solo, ''' set -e rm -rf /log/solo-script || true mkdir /log/solo-script cd /log/solo-script tar -xvf /tmp/solo-script.tar.gz virtualenv --clear env || virtualenv env cp -rf /usr/lib/python2.7/site-packages/greenlet* env/lib/python2.7/site-packages/ || true source ./env/bin/activate pip install --no-index -U ./wheelhouse/* ''')
def run(solo, scp): code, stdout, stderr = soloutils.command(solo, 'pip --version') if code != 0: print 'installing pip... ', scp.put(os.path.join(os.path.dirname(__file__), 'lib/ez_setup.py'), '/tmp') scp.put(os.path.join(os.path.dirname(__file__), 'lib/setuptools-18.7.1.zip'), '/tmp') code, stdout, stderr = soloutils.command(solo, 'cd /tmp; python ez_setup.py --to-dir=/tmp') if code: print '' print 'Error in installing pip:' print stdout print stderr return 1 print 'done.' code, stdout, stderr = soloutils.command(solo, 'python -c "import wheel"') if code != 0: print 'installing wheel... ', scp.put(os.path.join(os.path.dirname(__file__), 'lib/wheel-0.26.0.tar.gz'), '/tmp') code, stdout, stderr = soloutils.command(solo, 'pip install /tmp/wheel-0.26.0.tar.gz') if code: print '' print 'Error in installing wheel:' print stdout print stderr return 1 print 'done.' code, stdout, stderr = soloutils.command(solo, 'virtualenv --version') if code != 0: print 'installing virtualenv... ', scp.put(os.path.join(os.path.dirname(__file__), 'lib/virtualenv-13.1.2.tar.gz'), '/tmp') code, stdout, stderr = soloutils.command(solo, 'pip install /tmp/virtualenv-13.1.2.tar.gz') if code: print '' print 'Error in installing virtualenv:' print stdout print stderr return 1 print 'done.' return 0
def gimbal_versions(solo): code, gimbal_str, stderr = soloutils.command(solo, 'cat /AXON_VERSION') version, = gimbal_str.strip().split() return { "version": version, }