From 227e1d07ddf75e6757d6569e4b1028d233488057 Mon Sep 17 00:00:00 2001
From: CVL-GitHub <jupiter.hu@monash.edu>
Date: Fri, 4 Sep 2015 08:43:55 +1000
Subject: [PATCH] refactoring

---
 roles/karaage3.1.17/tasks/karaage.yml         | 10 +++
 roles/karaage3.1.17/templates/index.html.j2   |  4 +
 .../templates/karaage3-wsgi.conf.j2           |  3 +-
 roles/karaage3.1.17/templates/kg-idps.j2      | 74 +++++++++++++++++++
 4 files changed, 90 insertions(+), 1 deletion(-)
 create mode 100644 roles/karaage3.1.17/templates/index.html.j2
 create mode 100644 roles/karaage3.1.17/templates/kg-idps.j2

diff --git a/roles/karaage3.1.17/tasks/karaage.yml b/roles/karaage3.1.17/tasks/karaage.yml
index e406942b..8cf4f63d 100644
--- a/roles/karaage3.1.17/tasks/karaage.yml
+++ b/roles/karaage3.1.17/tasks/karaage.yml
@@ -95,6 +95,13 @@
   template: src=karaage3-wsgi.conf.j2 dest=/etc/apache2/conf-available/karaage3-wsgi.conf
   sudo: true
 
+- name: install karaage3-wsgi.conf
+  template: src=index.html.j2 dest=/var/www/index.html
+  sudo: true
+
+- name: install karaage3-wsgi.conf
+  template: src=kg-idps.j2 dest=/usr/bin/kg-idps
+  sudo: true
 -
  name: "enabling Karaage configuration"
  shell: a2enconf karaage3-wsgi
@@ -152,4 +159,7 @@
  sudo: true
  when: ansible_os_family == "RedHat"
 
+- name: "Start cron job for creating idps"
+  cron: name=idps job=/usr/bin/kg-idps user=root day=*/1 state=present
+  sudo: true
 
diff --git a/roles/karaage3.1.17/templates/index.html.j2 b/roles/karaage3.1.17/templates/index.html.j2
new file mode 100644
index 00000000..750ce998
--- /dev/null
+++ b/roles/karaage3.1.17/templates/index.html.j2
@@ -0,0 +1,4 @@
+<html><body><h3>HPC identity management</h3>
+<p>To log in via AAF authentication, connect to URL: https://{{ ansible_fqdn }}/aafbootstrap</p>
+<p>To log in without AAF authentication, connect to URL: https://{{ ansible_fqdn }}/users</p>
+</body></html>
diff --git a/roles/karaage3.1.17/templates/karaage3-wsgi.conf.j2 b/roles/karaage3.1.17/templates/karaage3-wsgi.conf.j2
index 9ce8c092..813a86f4 100644
--- a/roles/karaage3.1.17/templates/karaage3-wsgi.conf.j2
+++ b/roles/karaage3.1.17/templates/karaage3-wsgi.conf.j2
@@ -12,6 +12,7 @@ WSGIScriptAlias /karaage /etc/karaage3/karaage.wsgi
 # support old URLs.
 Redirect permanent /kgadmin /karaage
 Redirect permanent /users /karaage
+Redirect permanent /aafbootstrap /karaage/aafbootstrap
 
 Alias /kgstatic "/var/lib/karaage3/static"
 <Location "/kgstatic">
@@ -29,7 +30,7 @@ Alias /kgfiles "/var/cache/karaage3/files"
     </IfVersion>
 </Location>
 
-<Location /karaage>
+<Location /karaage/aafbootstrap>
 AuthType Shibboleth
 ShibRequireSession On
 ShibUseHeaders On
diff --git a/roles/karaage3.1.17/templates/kg-idps.j2 b/roles/karaage3.1.17/templates/kg-idps.j2
new file mode 100644
index 00000000..e1144a51
--- /dev/null
+++ b/roles/karaage3.1.17/templates/kg-idps.j2
@@ -0,0 +1,74 @@
+import os
+import django
+os.environ['DJANGO_SETTINGS_MODULE'] = "karaage.conf.settings"
+
+def get_idps_from_metadata():
+    import xml.etree.ElementTree as ET
+    tree = ET.parse('/var/cache/shibboleth/metadata.aaf.xml')
+    root=tree.getroot()
+    idps=[]
+    for entity in root.findall("{urn:oasis:names:tc:SAML:2.0:metadata}EntityDescriptor"):
+        idp=False
+        # %s"%entity.attrib['entityID']
+        for idp in entity.findall('{urn:oasis:names:tc:SAML:2.0:metadata}IDPSSODescriptor'):
+            idp=True
+        if idp:
+            for o in entity.findall('{urn:oasis:names:tc:SAML:2.0:metadata}Organization'):
+                for c in o.findall('{urn:oasis:names:tc:SAML:2.0:metadata}OrganizationDisplayName'):
+                    idps.append({'entityID':entity.attrib['entityID'],'name':c.text})
+        
+    return idps
+
+def get_next_idp_group():
+    from karaage.people.models import Group
+    i=-1
+    available=False
+    nextgroup=None
+    groupname='idpgroup{idx}'
+    while not available:
+        i=i+1
+        try:
+            group =Group.objects.get(name=groupname.format(idx=i))
+        except Group.DoesNotExist:
+            available=True
+            nextgroup=groupname.format(idx=i)
+    return nextgroup
+
+
+def get_or_create_idp(entityID,name):
+    print "get_or_create %s"%name
+    from karaage.institutes.forms import InstituteForm
+    from karaage.institutes.models import Institute
+    from karaage.people.models import Group
+    try:
+        Institute.objects.get(saml_entityid=entityID)
+        return
+    except Institute.DoesNotExist:
+        print "does not exists, creating"
+        groupname=get_next_idp_group()
+        group, _ =Group.objects.get_or_create(name=groupname)
+        institute=Institute(name=name,group=group,saml_entityid=entityID,is_active=True)
+        institute.save()
+#
+#        d={}
+#        d['name']=name
+#        d['group_id']=group
+#        d['saml_entityid']=entityID
+#        d['is_active']=True
+#        form=InstituteForm(d)
+#        if form.is_valid():
+#            print "tying to save"
+#            form.save()
+#        else:
+#            print "form not valid"
+#            print dir(form)
+#            #print "not actually saving my form"
+
+django.setup()
+idps = get_idps_from_metadata()
+for idp in idps:
+    try:
+        get_or_create_idp(entityID=idp['entityID'],name=idp['name'])
+    except:
+        pass
+
-- 
GitLab