Skip to content

Commit 369b02c

Browse files
author
tkrah
committed
Add Foreman Katello Support
1 parent bb3593a commit 369b02c

File tree

1 file changed

+60
-31
lines changed

1 file changed

+60
-31
lines changed

bin/backup_foreman

Lines changed: 60 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -8,14 +8,16 @@ import getopt
88
import os
99

1010
import yaml
11-
from foreman import *
11+
from foreman.foreman import *
1212

1313

1414
class ForemanBackup:
15-
def __init__(self, hostname, port, username, password):
15+
def __init__(self, hostname, port, username, password, katello_support=False, backup_dir='.'):
1616
self.foreman = Foreman(hostname, port, username, password)
17+
self.backup_dir = backup_dir
18+
self.katello_support = katello_support
1719

18-
def backup(self, backup_dir, resource, resource_function):
20+
def backup(self, resource, resource_function):
1921
"""Backup Foreman resource as YAML file into a directory.
2022
2123
A new directory named <resource> will be created inside <backup_dir>. Each
@@ -27,19 +29,26 @@ class ForemanBackup:
2729
resource (str): Name of the resource to backup (e.g. 'architectures')
2830
resource_function (def): Name of function to call to get a dict of resources
2931
"""
30-
backup_dir = os.path.join(backup_dir, resource)
32+
backup_dir = os.path.join(self.backup_dir, resource)
3133

3234
resources = resource_function()
33-
print('Backing up %s %s' % (str(len(resources)), resource))
35+
print('Backing up {0} {1}'.format(str(len(resources)), resource))
3436

3537
if not os.path.exists(backup_dir):
3638
os.makedirs(backup_dir)
3739

3840
for resource_item in resources:
41+
item = None
3942
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
4352

4453
if item:
4554
if 'title' in item:
@@ -50,66 +59,83 @@ class ForemanBackup:
5059
file_name = item.get('name')
5160
else:
5261
print('Can\'t backup {0}'.format(item))
62+
continue
5363
backup_file = os.path.join(backup_dir, file_name.replace('/', '_') + '.yaml')
5464
with open(backup_file, 'w') as backup_file:
5565
yaml.safe_dump(item, backup_file, default_flow_style=False)
5666

5767
def run(self):
58-
backup_root = '.'
68+
self.backup_foreman()
69+
if self.katello_support:
70+
self.backup_katello()
5971

60-
self.backup(backup_dir=backup_root, resource='architectures',
72+
def backup_foreman(self):
73+
74+
self.backup(resource='architectures',
6175
resource_function=self.foreman.get_architectures)
62-
self.backup(backup_dir=backup_root, resource='common_parameters',
76+
self.backup(resource='common_parameters',
6377
resource_function=self.foreman.get_common_parameters)
64-
self.backup(backup_dir=backup_root, resource='compute_resources',
78+
self.backup(resource='compute_resources',
6579
resource_function=self.foreman.get_compute_resources)
66-
self.backup(backup_dir=backup_root, resource='compute_profiles',
80+
self.backup(resource='compute_profiles',
6781
resource_function=self.foreman.get_compute_profiles)
68-
self.backup(backup_dir=backup_root, resource='config_templates',
82+
self.backup(resource='config_templates',
6983
resource_function=self.foreman.get_config_templates)
70-
self.backup(backup_dir=backup_root, resource='domains',
84+
self.backup(resource='domains',
7185
resource_function=self.foreman.get_domains)
72-
self.backup(backup_dir=backup_root, resource='environments',
86+
self.backup(resource='environments',
7387
resource_function=self.foreman.get_environments)
74-
self.backup(backup_dir=backup_root, resource='hosts',
88+
self.backup(resource='hosts',
7589
resource_function=self.foreman.get_hosts)
76-
self.backup(backup_dir=backup_root, resource='hostgroups',
90+
self.backup(resource='hostgroups',
7791
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',
8193
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',
8595
resource_function=self.foreman.get_operatingsystems)
86-
self.backup(backup_dir=backup_root, resource='smart_proxies',
96+
self.backup(resource='smart_proxies',
8797
resource_function=self.foreman.get_smart_proxies)
88-
self.backup(backup_dir=backup_root, resource='subnets',
98+
self.backup(resource='subnets',
8999
resource_function=self.foreman.get_subnets)
90-
self.backup(backup_dir=backup_root, resource='users',
100+
self.backup(resource='users',
91101
resource_function=self.foreman.get_users)
92102

93103

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+
94111
def show_help():
95112
"""Print on screen how to use this script.
96113
"""
97114
print('foreman.py -f <foreman_host> -p <port> -u <username> -s <secret>')
98115

99116

117+
def string2bool(s):
118+
"""
119+
120+
:rtype : bool
121+
"""
122+
return str(s).lower() in ['true', 'yes', '1', 'enable']
123+
124+
100125
def main(argv):
101126
""" Main
102127
103128
Backup Foreman resources
104129
"""
105130
foreman_host = os.environ.get('FOREMAN_HOST', '127.0.0.1')
106131
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'))
109135

110136
try:
111137
opts, args = getopt.getopt(argv,
112-
"f:hu:p:s:",
138+
"f:hu:p:s:k",
113139
["foreman=", "username=", "port=", "secret="])
114140
except getopt.GetoptError:
115141
show_help()
@@ -120,6 +146,8 @@ def main(argv):
120146
elif opt == '-h':
121147
show_help()
122148
sys.exit()
149+
elif opt == '-k':
150+
katello_support = True
123151
elif opt in ('-u', '--username'):
124152
foreman_username = arg
125153
elif opt in ('-p', '--port'):
@@ -128,7 +156,8 @@ def main(argv):
128156
foreman_password = arg
129157

130158
backup = ForemanBackup(foreman_host, foreman_port,
131-
foreman_username, foreman_password)
159+
foreman_user, foreman_pass,
160+
katello_support)
132161
backup.run()
133162

134163

0 commit comments

Comments
 (0)