@@ -8,14 +8,16 @@ import getopt
8
8
import os
9
9
10
10
import yaml
11
- from foreman import *
11
+ from foreman . foreman import *
12
12
13
13
14
14
class ForemanBackup :
15
- def __init__ (self , hostname , port , username , password ):
15
+ def __init__ (self , hostname , port , username , password , katello_support = False , backup_dir = '.' ):
16
16
self .foreman = Foreman (hostname , port , username , password )
17
+ self .backup_dir = backup_dir
18
+ self .katello_support = katello_support
17
19
18
- def backup (self , backup_dir , resource , resource_function ):
20
+ def backup (self , resource , resource_function ):
19
21
"""Backup Foreman resource as YAML file into a directory.
20
22
21
23
A new directory named <resource> will be created inside <backup_dir>. Each
@@ -27,19 +29,26 @@ class ForemanBackup:
27
29
resource (str): Name of the resource to backup (e.g. 'architectures')
28
30
resource_function (def): Name of function to call to get a dict of resources
29
31
"""
30
- backup_dir = os .path .join (backup_dir , resource )
32
+ backup_dir = os .path .join (self . backup_dir , resource )
31
33
32
34
resources = resource_function ()
33
- print ('Backing up %s %s' % (str (len (resources )), resource ))
35
+ print ('Backing up {0} {1}' . format (str (len (resources )), resource ))
34
36
35
37
if not os .path .exists (backup_dir ):
36
38
os .makedirs (backup_dir )
37
39
38
40
for resource_item in resources :
41
+ item = None
39
42
if 'id' in resource_item :
40
- item = self .foreman .get_resource (resource_type = resource , resource_id = resource_item .get ('id' ))
41
- else :
42
- item = None
43
+ resource_id = resource_item .get ('id' )
44
+ try :
45
+ item = self .foreman .get_resource (resource_type = resource , resource_id = resource_id )
46
+ except ForemanError as e :
47
+ # There seems to be a bug in Foreman 1.7.3 whereas the API reports 404
48
+ # while executing a get request on organizations/:id
49
+ # API: http://theforeman.org/api/apidoc/v2/organizations/show.html
50
+ if e .status_code == 404 :
51
+ item = resource_item
43
52
44
53
if item :
45
54
if 'title' in item :
@@ -50,66 +59,83 @@ class ForemanBackup:
50
59
file_name = item .get ('name' )
51
60
else :
52
61
print ('Can\' t backup {0}' .format (item ))
62
+ continue
53
63
backup_file = os .path .join (backup_dir , file_name .replace ('/' , '_' ) + '.yaml' )
54
64
with open (backup_file , 'w' ) as backup_file :
55
65
yaml .safe_dump (item , backup_file , default_flow_style = False )
56
66
57
67
def run (self ):
58
- backup_root = '.'
68
+ self .backup_foreman ()
69
+ if self .katello_support :
70
+ self .backup_katello ()
59
71
60
- self .backup (backup_dir = backup_root , resource = 'architectures' ,
72
+ def backup_foreman (self ):
73
+
74
+ self .backup (resource = 'architectures' ,
61
75
resource_function = self .foreman .get_architectures )
62
- self .backup (backup_dir = backup_root , resource = 'common_parameters' ,
76
+ self .backup (resource = 'common_parameters' ,
63
77
resource_function = self .foreman .get_common_parameters )
64
- self .backup (backup_dir = backup_root , resource = 'compute_resources' ,
78
+ self .backup (resource = 'compute_resources' ,
65
79
resource_function = self .foreman .get_compute_resources )
66
- self .backup (backup_dir = backup_root , resource = 'compute_profiles' ,
80
+ self .backup (resource = 'compute_profiles' ,
67
81
resource_function = self .foreman .get_compute_profiles )
68
- self .backup (backup_dir = backup_root , resource = 'config_templates' ,
82
+ self .backup (resource = 'config_templates' ,
69
83
resource_function = self .foreman .get_config_templates )
70
- self .backup (backup_dir = backup_root , resource = 'domains' ,
84
+ self .backup (resource = 'domains' ,
71
85
resource_function = self .foreman .get_domains )
72
- self .backup (backup_dir = backup_root , resource = 'environments' ,
86
+ self .backup (resource = 'environments' ,
73
87
resource_function = self .foreman .get_environments )
74
- self .backup (backup_dir = backup_root , resource = 'hosts' ,
88
+ self .backup (resource = 'hosts' ,
75
89
resource_function = self .foreman .get_hosts )
76
- self .backup (backup_dir = backup_root , resource = 'hostgroups' ,
90
+ self .backup (resource = 'hostgroups' ,
77
91
resource_function = self .foreman .get_hostgroups )
78
- self .backup (backup_dir = backup_root , resource = 'locations' ,
79
- resource_function = self .foreman .get_locations )
80
- self .backup (backup_dir = backup_root , resource = 'media' ,
92
+ self .backup (resource = 'media' ,
81
93
resource_function = self .foreman .get_media )
82
- # self.backup(backup_dir=backup_root, resource='organizations',
83
- # resource_function=self.foreman.get_organizations)
84
- self .backup (backup_dir = backup_root , resource = 'operatingsystems' ,
94
+ self .backup (resource = 'operatingsystems' ,
85
95
resource_function = self .foreman .get_operatingsystems )
86
- self .backup (backup_dir = backup_root , resource = 'smart_proxies' ,
96
+ self .backup (resource = 'smart_proxies' ,
87
97
resource_function = self .foreman .get_smart_proxies )
88
- self .backup (backup_dir = backup_root , resource = 'subnets' ,
98
+ self .backup (resource = 'subnets' ,
89
99
resource_function = self .foreman .get_subnets )
90
- self .backup (backup_dir = backup_root , resource = 'users' ,
100
+ self .backup (resource = 'users' ,
91
101
resource_function = self .foreman .get_users )
92
102
93
103
104
+ def backup_katello (self ):
105
+ self .backup (resource = 'locations' ,
106
+ resource_function = self .foreman .get_locations )
107
+ self .backup (resource = 'organizations' ,
108
+ resource_function = self .foreman .get_organizations )
109
+
110
+
94
111
def show_help ():
95
112
"""Print on screen how to use this script.
96
113
"""
97
114
print ('foreman.py -f <foreman_host> -p <port> -u <username> -s <secret>' )
98
115
99
116
117
+ def string2bool (s ):
118
+ """
119
+
120
+ :rtype : bool
121
+ """
122
+ return str (s ).lower () in ['true' , 'yes' , '1' , 'enable' ]
123
+
124
+
100
125
def main (argv ):
101
126
""" Main
102
127
103
128
Backup Foreman resources
104
129
"""
105
130
foreman_host = os .environ .get ('FOREMAN_HOST' , '127.0.0.1' )
106
131
foreman_port = os .environ .get ('FOREMAN_PORT' , '443' )
107
- foreman_username = os .environ .get ('FOREMAN_USER' , 'foreman' )
108
- foreman_password = os .environ .get ('FOREMAN_PASS' , 'changme' )
132
+ foreman_user = os .environ .get ('FOREMAN_USER' , 'foreman' )
133
+ foreman_pass = os .environ .get ('FOREMAN_PASS' , 'changme' )
134
+ katello_support = string2bool (os .environ .get ('FOREMAN_KATELLO_SUPPORT' , 'False' ))
109
135
110
136
try :
111
137
opts , args = getopt .getopt (argv ,
112
- "f:hu:p:s:" ,
138
+ "f:hu:p:s:k " ,
113
139
["foreman=" , "username=" , "port=" , "secret=" ])
114
140
except getopt .GetoptError :
115
141
show_help ()
@@ -120,6 +146,8 @@ def main(argv):
120
146
elif opt == '-h' :
121
147
show_help ()
122
148
sys .exit ()
149
+ elif opt == '-k' :
150
+ katello_support = True
123
151
elif opt in ('-u' , '--username' ):
124
152
foreman_username = arg
125
153
elif opt in ('-p' , '--port' ):
@@ -128,7 +156,8 @@ def main(argv):
128
156
foreman_password = arg
129
157
130
158
backup = ForemanBackup (foreman_host , foreman_port ,
131
- foreman_username , foreman_password )
159
+ foreman_user , foreman_pass ,
160
+ katello_support )
132
161
backup .run ()
133
162
134
163
0 commit comments