265 lines
10 KiB
Python
Executable File
265 lines
10 KiB
Python
Executable File
#/*
|
|
# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
|
# * contributor license agreements. See the NOTICE file distributed with
|
|
# * this work for additional information regarding copyright ownership.
|
|
# * The OpenAirInterface Software Alliance licenses this file to You under
|
|
# * the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
|
# * except in compliance with the License.
|
|
# * You may obtain a copy of the License at
|
|
# *
|
|
# * http://www.openairinterface.org/?page_id=698
|
|
# *
|
|
# * Unless required by applicable law or agreed to in writing, software
|
|
# * distributed under the License is distributed on an "AS IS" BASIS,
|
|
# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
# * See the License for the specific language governing permissions and
|
|
# * limitations under the License.
|
|
# *-------------------------------------------------------------------------------
|
|
# * For more information about the OpenAirInterface (OAI) Software Alliance:
|
|
# * contact@openairinterface.org
|
|
# */
|
|
|
|
# \file openair.py
|
|
# \brief class that define the oaisim class and its attributes
|
|
# \author Navid Nikaein
|
|
# \date 2013
|
|
# \version 0.1
|
|
# @ingroup _test
|
|
|
|
import pexpect
|
|
import pxssh
|
|
import time
|
|
import os
|
|
import array
|
|
import shutil
|
|
import subprocess
|
|
import sys
|
|
import traceback
|
|
import time
|
|
# import call
|
|
|
|
from core import *
|
|
|
|
SHELL = '/bin/bash'
|
|
|
|
class openair(core):
|
|
def __init__(self, hostname, address):
|
|
self.error = '% '
|
|
self.hostname = hostname
|
|
self.address = address
|
|
self.localhost = None
|
|
core.__init__(self)
|
|
|
|
@property
|
|
def localhost(self):
|
|
if self.localhost :
|
|
return self.localhost
|
|
elif self.hostname in ['localhost', '127.0.0.7', '::1'] :
|
|
self.localhost = self.hostname
|
|
return self.localhost
|
|
|
|
@localhost.setter
|
|
def localhost(self,localhost):
|
|
self.localhost = localhost
|
|
|
|
def shcmd(self,cmd,sudo=False):
|
|
|
|
if sudo:
|
|
cmd = "sudo %s" % command
|
|
|
|
proc = subprocess.Popen(command, shell=True,
|
|
stdout = subprocess.PIPE,
|
|
stderr = subprocess.PIPE)
|
|
|
|
stdout, stderr = proc.communicate()
|
|
return (stdout, stderr)
|
|
|
|
def connect(self, username, password, prompt='PEXPECT_OAI'):
|
|
max_retries=10
|
|
i=0
|
|
while i <= max_retries:
|
|
self.prompt1 = prompt
|
|
self.prompt2 = prompt
|
|
self.password = ''
|
|
i=i+1
|
|
# WE do not store the password when sending commands for secuirity reasons. The password might be accidentally logged in such cases.
|
|
#The password is used only to make ssh connections. In case user wants to run programs with sudo, then he/she needs to add following line in /etc/sudoers
|
|
# your_user_name ALL=(ALL:ALL) NOPASSWD: ALL
|
|
try:
|
|
if not username:
|
|
username = root
|
|
if not password:
|
|
password = username
|
|
self.oai = pxssh.pxssh()
|
|
self.oai.login(self.address,username,password)
|
|
self.oai.sendline('PS1='+self.prompt1)
|
|
self.oai.PROMPT='PEXPECT_OAI'
|
|
# need to look for twice the string of the prompt
|
|
self.oai.prompt()
|
|
self.oai.prompt()
|
|
# self.oai.sendline('uptime')
|
|
# self.oai.prompt()
|
|
# print self.oai.before
|
|
break
|
|
except Exception, e:
|
|
error=''
|
|
error = error + ' In function: ' + sys._getframe().f_code.co_name + ': *** Caught exception: ' + str(e.__class__) + " : " + str( e)
|
|
error = error + 'address = "'+ self.address +' username = ' + username
|
|
error = error + traceback.format_exc()
|
|
print error
|
|
print "Retrying again in 1 seconds"
|
|
time.sleep(1)
|
|
if i==max_retries:
|
|
print "Fatal Error: Terminating the program now..."
|
|
sys.exit(1)
|
|
|
|
def connect2(self, username, password, prompt='$'):
|
|
self.prompt1 = prompt
|
|
self.prompt2 = prompt
|
|
self.password = password
|
|
while 1:
|
|
try:
|
|
if not username:
|
|
username = root
|
|
if not password:
|
|
password = username
|
|
|
|
self.oai = pexpect.spawn('ssh -o "UserKnownHostsFile=/dev/null" -o "StrictHostKeyChecking=no" -o "ConnectionAttempts=1" ' \
|
|
+ username + '@' + self.address)
|
|
|
|
index = self.oai.expect([re.escape(self.prompt1), re.escape(self.prompt2), pexpect.TIMEOUT], timeout=40)
|
|
if index == 0 :
|
|
return 'Ok'
|
|
else :
|
|
index = self.oai.expect(['password:', pexpect.TIMEOUT], timeout=40)
|
|
if index == 0 :
|
|
self.oai.sendline(password)
|
|
index = self.oai.expect([re.escape(self.prompt1), re.escape(self.prompt2), pexpect.TIMEOUT], timeout=10)
|
|
if index != 0:
|
|
print 'ERROR! could not login with SSH.'
|
|
print 'Expected ' + self.prompt1 + ', received >>>>' + self.oai.before + '<<<<'
|
|
sys.exit(1)
|
|
return 'Ok'
|
|
|
|
except Exception, e:
|
|
error=''
|
|
error = error + ' In function: ' + sys._getframe().f_code.co_name + ': *** Caught exception: ' + str(e.__class__) + " : " + str( e)
|
|
error = error + traceback.format_exc()
|
|
print error
|
|
sys.exit(1)
|
|
|
|
def connect_localshell(self, prompt='$'):
|
|
self.prompt1 = prompt
|
|
self.prompt2 = prompt
|
|
|
|
while 1:
|
|
try:
|
|
# start a shell and use the current environment
|
|
self.oai = pexpect.spawn('bash --norc --noprofile')
|
|
|
|
index = self.oai.expect([re.escape(self.prompt1), re.escape(self.prompt2), pexpect.TIMEOUT], timeout=40)
|
|
if index == 0 :
|
|
return 'Ok'
|
|
else :
|
|
sys.exit(1)
|
|
|
|
except Exception, e:
|
|
error=''
|
|
error = error + ' In function: ' + sys._getframe().f_code.co_name + ': *** Caught exception: ' + str(e.__class__) + " : " + str( e)
|
|
error = error + traceback.format_exc()
|
|
print error
|
|
sys.exit(1)
|
|
|
|
def disconnect(self):
|
|
# print 'disconnecting the ssh connection to ' + self.address + '\n'
|
|
self.oai.send('exit')
|
|
# self.cancel()
|
|
|
|
def kill(self, user, pw):
|
|
try:
|
|
if user == 'root' :
|
|
os.system('pkill oaisim oaisim_nos1')
|
|
os.system('pkill cc1')
|
|
time.sleep(1)
|
|
os.system('pkill oaisim oaisim_nos1')
|
|
else :
|
|
os.system('echo '+pw+' | sudo -S pkill oaisim oaisim_nos1')
|
|
os.system('echo '+pw+' | sudo -S pkill cc1')
|
|
time.sleep(1)
|
|
os.system('echo '+pw+' | sudo -S pkill oaisim oaisim_nos1')
|
|
except Exception, e:
|
|
error=''
|
|
error = error + ' In function: ' + sys._getframe().f_code.co_name + ': *** Caught exception: ' + str(e.__class__) + " : " + str( e)
|
|
error = error + traceback.format_exc()
|
|
print error
|
|
#sys.exit(1)
|
|
|
|
def rm_driver(self,oai,user, pw):
|
|
try:
|
|
if user == 'root' :
|
|
#oai.send_nowait('rmmod nasmesh;')
|
|
os.system('rmmod nasmesh;')
|
|
else :
|
|
oai.send_nowait('echo '+pw+ ' | sudo -S rmmod nasmesh;')
|
|
#os.system('echo '+pw+ ' | sudo -S rmmod nasmesh;')
|
|
except Exception, e:
|
|
error=''
|
|
error = error + ' In function: ' + sys._getframe().f_code.co_name + ': *** Caught exception: ' + str(e.__class__) + " : " + str( e)
|
|
error = error + traceback.format_exc()
|
|
print error
|
|
#sys.exit(1)
|
|
|
|
def driver(self,oai,user,pw):
|
|
#pwd = oai.send_recv('pwd')
|
|
oai.send('cd $OPENAIR_TARGETS;')
|
|
oai.send('cd SIMU/USER;')
|
|
try:
|
|
if user == 'root' :
|
|
oai.send_nowait('insmod ./nasmesh.ko;')
|
|
else :
|
|
oai.send('echo '+pw+ ' | sudo -S insmod ./nasmesh.ko;')
|
|
|
|
except Exception, e:
|
|
error=''
|
|
error = error + ' In function: ' + sys._getframe().f_code.co_name + ': *** Caught exception: ' + str(e.__class__) + " : " + str( e)
|
|
error = error + traceback.format_exc()
|
|
print error
|
|
#sys.exit(1)
|
|
|
|
def cleandir (self, logdir,debug) :
|
|
|
|
for filename in os.listdir(logdir):
|
|
filepath = os.path.join(logdir, filename)
|
|
if debug == 2 :
|
|
print 'logdir is ' + logdir
|
|
print 'filepath is ' + filepath
|
|
try:
|
|
shutil.rmtree(filepath)
|
|
except Exception, e:
|
|
error=''
|
|
error = error + ' In function: ' + sys._getframe().f_code.co_name + ': *** Caught exception: ' + str(e.__class__) + " : " + str( e)
|
|
error = error + traceback.format_exc()
|
|
print error
|
|
#sys.exit(1)
|
|
#print 'Could not remove the filepath'+ filepath + ' with error ' + OSError
|
|
|
|
def create_dir(self,dirname,debug) :
|
|
if not os.path.exists(dirname) :
|
|
try:
|
|
os.makedirs(dirname,0755)
|
|
except OSError:
|
|
# There was an error on creation, so make sure we know about it
|
|
raise
|
|
def cpu_freq(self):
|
|
freq=0
|
|
proc = subprocess.Popen(["cat","/proc/cpuinfo"],
|
|
stdout=subprocess.PIPE)
|
|
out, err = proc.communicate()
|
|
|
|
for line in out.split("\n"):
|
|
if "cpu MHz" in line:
|
|
freq = float(line.split(":")[1])
|
|
break
|
|
|
|
return freq
|