@ -25,6 +25,7 @@
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
# USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
# USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#
#
import os
import time
import time
from ansible . module_utils . network_common import to_list
from ansible . module_utils . network_common import to_list
@ -74,6 +75,24 @@ def run_commands(module, commands):
responses . append ( out )
responses . append ( out )
return responses
return responses
def send_config ( module , commands ) :
multiline = False
for command in to_list ( commands ) :
if command == ' end ' :
pass
if command . startswith ( ' banner ' ) or multiline :
multiline = True
command = module . jsonify ( { ' command ' : command , ' sendonly ' : True } )
elif command == ' EOF ' and multiline :
multiline = False
rc , out , err = module . exec_command ( command )
if rc != 0 :
return ( rc , out , err )
return ( rc , ' ok ' , ' ' )
def configure ( module , commands ) :
def configure ( module , commands ) :
""" Sends configuration commands to the remote device
""" Sends configuration commands to the remote device
"""
"""
@ -84,14 +103,12 @@ def configure(module, commands):
if rc != 0 :
if rc != 0 :
module . fail_json ( msg = ' unable to enter configuration mode ' , output = err )
module . fail_json ( msg = ' unable to enter configuration mode ' , output = err )
for cmd in to_list ( commands ) :
rc , out , err = send_config ( module , commands )
if cmd == ' end ' :
if rc != 0 :
continue
module . fail_json ( msg = err )
rc , out , err = module . exec_command ( cmd )
if rc != 0 :
module . fail_json ( msg = err )
module . exec_command ( ' end ' )
module . exec_command ( ' end ' )
return { }
def load_config ( module , commands , commit = False , replace = False ) :
def load_config ( module , commands , commit = False , replace = False ) :
""" Loads the config commands onto the remote device
""" Loads the config commands onto the remote device
@ -99,8 +116,14 @@ def load_config(module, commands, commit=False, replace=False):
if not check_authorization ( module ) :
if not check_authorization ( module ) :
module . fail_json ( msg = ' configuration operations require privilege escalation ' )
module . fail_json ( msg = ' configuration operations require privilege escalation ' )
if not supports_sessions ( module ) :
use_session = os . getenv ( ' ANSIBLE_EOS_USE_SESSIONS ' , True )
return configure ( commands )
try :
use_session = int ( use_session )
except ValueError :
pass
if not all ( ( bool ( use_session ) , supports_sessions ( module ) ) ) :
return configure ( module , commands )
session = ' ansible_ %s ' % int ( time . time ( ) )
session = ' ansible_ %s ' % int ( time . time ( ) )
@ -113,24 +136,16 @@ def load_config(module, commands, commit=False, replace=False):
if replace :
if replace :
module . exec_command ( ' rollback clean-config ' , check_rc = True )
module . exec_command ( ' rollback clean-config ' , check_rc = True )
failed = False
rc , out , err = send_config ( module , commands )
for command in to_list ( commands ) :
if rc != 0 :
if command == ' end ' :
module . exec_command ( ' abort ' )
pass
module . fail_json ( msg = err , commands = commands )
rc , out , err = module . exec_command ( command )
if rc != 0 :
failed = True
break
rc , out , err = module . exec_command ( ' show session-config diffs ' )
rc , out , err = module . exec_command ( ' show session-config diffs ' )
if rc == 0 :
if rc == 0 :
result [ ' diff ' ] = out
result [ ' diff ' ] = out . strip ( )
if failed :
if commit :
module . exec_command ( ' abort ' )
module . fail_json ( msg = err , commands = commands )
elif commit :
module . exec_command ( ' commit ' )
module . exec_command ( ' commit ' )
else :
else :
module . exec_command ( ' abort ' )
module . exec_command ( ' abort ' )