Initial support for openbmc software update interfaces

Signed-off-by: Andrew Geissler <geissonator@yahoo.com>
diff --git a/openbmc-sfw b/openbmc-sfw
new file mode 100755
index 0000000..16a98f4
--- /dev/null
+++ b/openbmc-sfw
@@ -0,0 +1,96 @@
+#!/bin/env python
+
+import argparse
+import requests
+import json
+
+import urllib3
+import _sysconfigdata
+urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
+
+
+class BMC:
+    def __init__(self, server):
+        self.url = "https://{0}/".format(server)
+        self.session = requests.Session()
+        self.login()
+
+    def login(self):
+        r = self.session.post(self.url + 'login',
+                              json={'data': ['root', '0penBmc']},
+                              verify=False)
+        j = r.json()
+        if j['status'] != 'ok':
+            raise Exception("Failed to login: \n" + r.text)
+
+    def list_sfw(self):
+        r = self.session.get(self.url + 'xyz/openbmc_project/software/',
+                             verify=False)
+        j = r.json()
+        if j['status'] != 'ok':
+            raise Exception("Failed to query entries: \n" + r.text)
+
+        events = j['data']
+
+        return events
+
+    def get_image(self, image):
+        r = self.session.get(self.url + image, verify=False)
+
+        j = r.json()
+        if j['status'] != 'ok':
+            raise Exception("Failed to get event " + image + ": \n" + r.text)
+
+        return j['data']
+
+    def upload_image(self, image):
+        
+        data = open(image,'rb').read()
+        r = self.session.post(self.url + "/upload/image",
+                              data=data,
+                              headers={'Content-Type': 'application/octet-stream'},
+                              verify=False)
+        j = r.json()
+        if j['status'] != 'ok':
+            raise Exception("Failed to get event " + image + ": \n" + r.text)
+
+        return j['data']
+
+
+def do_list_sfw(args):
+    s = BMC(server=args.server)
+    for e in s.list_sfw():
+        info = s.get_image(e)
+        print(e)
+        print json.dumps(info, indent=4)
+        
+def do_view_image(args):
+    s = BMC(server=args.server)
+    print json.dumps(s.get_image(args.image), indent=4)
+
+def do_upload_image(args):
+    s = BMC(server=args.server)
+    s.upload_image(args.image)
+
+parser = argparse.ArgumentParser()
+parser.add_argument('--server', help='hostname or IP of BMC', type=str,
+                    required=True)
+
+subparsers = parser.add_subparsers()
+list_events = subparsers.add_parser('list', help='List all software images on BMC')
+list_events.set_defaults(func=do_list_sfw)
+
+image_view = subparsers.add_parser('view', help='View info of input image')
+image_view.add_argument('image', help='The image to analyze')
+image_view.set_defaults(func=do_view_image)
+
+image_upload = subparsers.add_parser('upload', help='Upload input image')
+image_upload.add_argument('image', help='The image to upload')
+image_upload.set_defaults(func=do_upload_image)
+
+args = parser.parse_args()
+
+if 'func' in args:
+    args.func(args)
+else:
+    parser.print_help()