Hide keyboard shortcuts

Hot-keys on this page

r m x p   toggle line displays

j k   next/prev highlighted chunk

0   (zero) top of page

1   (one) first highlighted chunk

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

# 

# Copyright 2015 Peter Sprygada <psprygada@ansible.com> 

# 

# This file is part of Ansible 

# 

# Ansible is free software: you can redistribute it and/or modify 

# it under the terms of the GNU General Public License as published by 

# the Free Software Foundation, either version 3 of the License, or 

# (at your option) any later version. 

# 

# Ansible is distributed in the hope that it will be useful, 

# but WITHOUT ANY WARRANTY; without even the implied warranty of 

# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 

# GNU General Public License for more details. 

# 

# You should have received a copy of the GNU General Public License 

# along with Ansible. If not, see <http://www.gnu.org/licenses/>. 

# 

from __future__ import (absolute_import, division, print_function) 

__metaclass__ = type 

 

import os 

import re 

import time 

import glob 

 

from ansible.plugins.action.nxos import ActionModule as _ActionModule 

from ansible.module_utils._text import to_text 

from ansible.module_utils.six.moves.urllib.parse import urlsplit 

from ansible.utils.vars import merge_hash 

 

 

PRIVATE_KEYS_RE = re.compile('__.+__') 

 

 

class ActionModule(_ActionModule): 

 

def run(self, tmp=None, task_vars=None): 

 

40 ↛ 41line 40 didn't jump to line 41, because the condition on line 40 was never true if self._task.args.get('src'): 

try: 

self._handle_template() 

except ValueError as exc: 

return dict(failed=True, msg=str(exc)) 

 

result = super(ActionModule, self).run(tmp, task_vars) 

del tmp # tmp no longer has any effect 

 

if self._task.args.get('backup') and result.get('__backup__'): 

# User requested backup and no error occurred in module. 

# NOTE: If there is a parameter error, _backup key may not be in results. 

filepath = self._write_backup(task_vars['inventory_hostname'], 

result['__backup__']) 

 

result['backup_path'] = filepath 

 

# strip out any keys that have two leading and two trailing 

# underscore characters 

for key in list(result.keys()): 

if PRIVATE_KEYS_RE.match(key): 

del result[key] 

 

return result 

 

def _get_working_path(self): 

cwd = self._loader.get_basedir() 

67 ↛ 69line 67 didn't jump to line 69, because the condition on line 67 was never false if self._task._role is not None: 

cwd = self._task._role._role_path 

return cwd 

 

def _write_backup(self, host, contents): 

backup_path = self._get_working_path() + '/backup' 

73 ↛ 74line 73 didn't jump to line 74, because the condition on line 73 was never true if not os.path.exists(backup_path): 

os.mkdir(backup_path) 

75 ↛ 76line 75 didn't jump to line 76, because the loop on line 75 never started for fn in glob.glob('%s/%s*' % (backup_path, host)): 

os.remove(fn) 

tstamp = time.strftime("%Y-%m-%d@%H:%M:%S", time.localtime(time.time())) 

filename = '%s/%s_config.%s' % (backup_path, host, tstamp) 

open(filename, 'w').write(contents) 

return filename 

 

def _handle_template(self): 

src = self._task.args.get('src') 

working_path = self._get_working_path() 

 

if os.path.isabs(src) or urlsplit('src').scheme: 

source = src 

else: 

source = self._loader.path_dwim_relative(working_path, 'templates', src) 

if not source: 

source = self._loader.path_dwim_relative(working_path, src) 

 

if not os.path.exists(source): 

raise ValueError('path specified in src not found') 

 

try: 

with open(source, 'r') as f: 

template_data = to_text(f.read()) 

except IOError: 

return dict(failed=True, msg='unable to load src file') 

 

# Create a template search path in the following order: 

# [working_path, self_role_path, dependent_role_paths, dirname(source)] 

searchpath = [working_path] 

if self._task._role is not None: 

searchpath.append(self._task._role._role_path) 

if hasattr(self._task, "_block:"): 

dep_chain = self._task._block.get_dep_chain() 

if dep_chain is not None: 

for role in dep_chain: 

searchpath.append(role._role_path) 

searchpath.append(os.path.dirname(source)) 

self._templar.environment.loader.searchpath = searchpath 

self._task.args['src'] = self._templar.template(template_data)