Skip to content

Instantly share code, notes, and snippets.

@hansen-m
Created September 25, 2014 16:01
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save hansen-m/58667f370047af92f634 to your computer and use it in GitHub Desktop.
Save hansen-m/58667f370047af92f634 to your computer and use it in GitHub Desktop.
BES Archiver Utility (Example for using python-besapi), will create a full BES file console export at the current working directory.
#!/usr/bin/env python
#
# Copyright 2014 The Pennsylvania State University.
#
"""
BESArchiver.py
Created by Matt Hansen (mah60@psu.edu) on 2014-05-27.
Easily export content using the BES (BigFix) REST API
"""
import os
import string
import besapi
from ConfigParser import SafeConfigParser
"""
# Example file contents of besapi.conf
# Place at /etc/besapi.conf, ~/besapi.conf or ./besapi.conf
[besapi]
BES_ROOT_SERVER = https://your.bes.rootserver.org:52311
BES_USER_NAME = YOUR_USERNAME_HERE
BES_PASSWORD = YOUR_PASSWORD_HERE
[besarchiver]
VERBOSE = False
"""
# Sanitize Text
def sani_txt(*args):
""" Clean arbitrary text for safe file system usage."""
valid_chars = "-_.() %s%s" % (string.ascii_letters, string.digits)
sani_args = []
for arg in args:
sani_args.append(''.join(c for c in
str(arg).replace('/', '-')
if c in valid_chars))
return tuple(sani_args)
# Read Config File
CONFPARSER = SafeConfigParser({'VERBOSE': 'True'})
CONFPARSER.read(['/etc/besapi.conf',
os.path.expanduser('~/besapi.conf'),
'besapi.conf'])
BES_ROOT_SERVER = CONFPARSER.get('besapi', 'BES_ROOT_SERVER')
BES_USER_NAME = CONFPARSER.get('besapi', 'BES_USER_NAME')
BES_PASSWORD = CONFPARSER.get('besapi', 'BES_PASSWORD')
if 'besarchiver' in CONFPARSER.sections():
VERBOSE = CONFPARSER.getboolean('besarchiver', 'VERBOSE')
else:
VERBOSE = True
# Create API Connection
B = besapi.BESConnection(BES_USER_NAME, BES_PASSWORD, BES_ROOT_SERVER)
# Iterate Over All Sites
for site in B.get('sites').besobj.iterchildren():
resource = site.attrib['Resource'].replace('http://', 'https://')
# Iterate Over All Site Content
content = B.get(resource + '/content')
if content.request.status_code == 200:
print "Archiving %d items from %s..." % (
content().countchildren(), site.Name)
for task in content().iterchildren():
if VERBOSE:
print "{%s} (%s) [%s] %s - %s " % (
site.Name,
task.tag,
task.ID,
task.Name.text.encode("ascii", "ignore"),
task.attrib['LastModified'])
# Get Specific Content
content = B.get(task.attrib['Resource'].replace(
'http://', 'https://'))
# Write Content to Disk
if content:
if not os.path.exists("%s/%s" % sani_txt(site.Name, task.tag)):
os.makedirs("%s/%s" % sani_txt(site.Name, task.tag))
with open("%s/%s/%s - %s.bes" %
sani_txt(site.Name,
task.tag,
task.ID,
task.Name.text.encode("ascii", "ignore"))
, "wb") as bes_file:
bes_file.write(content.text.encode('utf-8'))
@jgstew
Copy link

jgstew commented Mar 22, 2022

This functionality has been moved into BESAPI wrapper itself: https://github.com/jgstew/besapi/blob/master/src/besapi/besapi.py#L642-L656

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment