Skip to content

Instantly share code, notes, and snippets.

@hansen-m hansen-m/BESArchiver.py Secret
Created Sep 25, 2014

Embed
What would you like to do?
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

This comment has been minimized.

Copy link

commented Oct 29, 2015

@jgstew

This comment has been minimized.

Copy link

commented Oct 29, 2015

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.