diff options
18 files changed, 495 insertions, 407 deletions
diff --git a/rpkid/portal-gui/apache/rpki.conf.in b/rpkid/portal-gui/apache/rpki.conf.in index 9318549a..5670f8d3 100644 --- a/rpkid/portal-gui/apache/rpki.conf.in +++ b/rpkid/portal-gui/apache/rpki.conf.in @@ -28,5 +28,6 @@ Allow from all # for use with Django 1.2 #Alias /media/ /var/www/html/media/ +#Alias /site_media/ /var/www/html/media/ # vim:ft=apache diff --git a/rpkid/rpki/gui/app/forms.py b/rpkid/rpki/gui/app/forms.py index aad9185d..ecac5e0a 100644 --- a/rpkid/rpki/gui/app/forms.py +++ b/rpkid/rpki/gui/app/forms.py @@ -215,8 +215,9 @@ def ImportChildForm(parent_conf, *args, **kwargs): def ImportParentForm(conf, *args, **kwargs): class wrapped(forms.Form): - handle = forms.CharField(max_length=30, help_text="Parent's RPKI handle") - xml = forms.FileField(help_text="XML response from parent", required=False) + handle = forms.CharField(max_length=30, help_text="Parent's RPKI handle", required=True) + xml = forms.FileField(help_text="XML response from parent", required=True, + widget=forms.FileInput(attrs={'class': 'xlarge'})) def clean_handle(self): if conf.parents.filter(handle=self.cleaned_data['handle']): diff --git a/rpkid/rpki/gui/app/templates/base.html b/rpkid/rpki/gui/app/templates/base.html index d6c859f2..abfa948a 100644 --- a/rpkid/rpki/gui/app/templates/base.html +++ b/rpkid/rpki/gui/app/templates/base.html @@ -1,36 +1,50 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" + "http://www.w3.org/TR/html4/strict.dtd"> <html> -<head> - <title>{% block title %}RPKI{% endblock %}</title> - {% block head %}{% endblock %} - <style type="text/css"> - #header { background-color: #00ccff; border-style: solid; border-width: thin; padding-left:2em } - #sidebar { background-color: #dddddd; border-style: none solid solid; border-width: thin; float:left; min-width:9em } - #content { float:left; margin-left:1em } - ul.compact {list-style:none inside; margin-left:1em; padding-left:0} - table { border: solid 1px; border-collapse: collapse } - th { border: solid 1px; padding: 1em } - td { border: solid 1px; text-align: center; padding-left: 1em; padding-right: 1em } - {% block css %}{% endblock %} - </style> -</head> -<body> - <div id="header"> - {% if user.is_authenticated %} - <span style="float: right; font-size: 80%;">Logged in as {{ user }} | - {% if user.is_staff %}<a href="/admin/">admin</a> |{% endif %} - <a href="{% url django.contrib.auth.views.logout %}">Log Out</a></span> - {% else %} - <span style="float: right; font-size: 80%;"><a href="{% url django.contrib.auth.views.login %}">Log In</a></span> - {% endif %} - <h1>RPKI Portal GUI</h1> - </div> + <head> + <meta name='Content-Type' content='text/html; charset=UTF-8'> + <title>{% block title %}RPKI{% endblock %}</title> + {% block head %}{% endblock %} + <link rel="stylesheet" href="/site_media/css/bootstrap.min.css"> + <style type="text/css"> + body { padding-top: 50px; } + {% block css %}{% endblock %} + </style> + </head> + <body> + <!-- TOP BAR --> + <div class="topbar"> + <div class="topbar-inner"> + <div class="container"> + <a class="brand" href="#">rpki.net</a> - <div id='sidebar'> - {% block sidebar %}{% endblock %} - </div> + <ul class='nav'> + {% if user.is_staff %} + <li><a href="/admin/">Admin</a></li> + {% endif %} + </ul> - <div id="content"> - {% block content %}{% endblock %} - </div> -</body> + {% if user.is_authenticated %} + <ul class='nav secondary-nav'> + <li><p>Logged in as {{ user }}</li> + <li><a href="{% url django.contrib.auth.views.logout %}">Log Out</a></li> + </ul> + {% endif %} + + </div> + </div> + </div><!-- topbar --> + + <!-- MAIN CONTENT --> + <div class="container-fluid"> + <div class='content'> + {% block content %}{% endblock %} + </div><!-- /content --> + + <div class="sidebar"> + {% block sidebar %}{% endblock %} + </div><!-- /sidebar --> + </div><!-- /container-fluid --> + + </body> </html> diff --git a/rpkid/rpki/gui/app/templates/registration/login.html b/rpkid/rpki/gui/app/templates/registration/login.html index f99e9a25..27ad21cf 100644 --- a/rpkid/rpki/gui/app/templates/registration/login.html +++ b/rpkid/rpki/gui/app/templates/registration/login.html @@ -3,24 +3,33 @@ {% block content %} {% if form.errors %} -<p>Your username and password didn't match. Please try again.</p> +<div class='alert-message error'> + <p>Your username and password didn't match. Please try again.</p> +</div> {% endif %} -<form method="post" action="{% url django.contrib.auth.views.login %}">{% csrf_token %} -<table> -<tr> - <td>{{ form.username.label_tag }}</td> - <td>{{ form.username }}</td> -</tr> -<tr> - <td>{{ form.password.label_tag }}</td> - <td>{{ form.password }}</td> -</tr> -</table> - -<input type="submit" value="login" /> -<input type="hidden" name="next" value="{{ next }}" /> +<form method="post" action="{% url django.contrib.auth.views.login %}"> + {% csrf_token %} + + <div class="clearfix"> + {{ form.username.label_tag }} + <div class="input"> + {{ form.username }} + </div> + </div> + + <div class="clearfix"> + {{ form.password.label_tag }} + <div class="input"> + {{ form.password }} + </div> + </div> + + <div class="actions"> + <input type="submit" value="Login" class="btn primary" /> + </div> + + <input type="hidden" name="next" value="{{ next }}" /> </form> {% endblock %} - diff --git a/rpkid/rpki/gui/app/templates/rpkigui/asn_view.html b/rpkid/rpki/gui/app/templates/rpkigui/asn_view.html index 204a6677..e6666a2c 100644 --- a/rpkid/rpki/gui/app/templates/rpkigui/asn_view.html +++ b/rpkid/rpki/gui/app/templates/rpkigui/asn_view.html @@ -1,47 +1,69 @@ -{% extends "base.html" %} +{% extends "rpkigui/app_base.html" %} -{% block css %} -table { border-collapse: collapse } -th { border: solid 1px; padding: 1em } -td { border: solid 1px; text-align: center; padding-left: 1em; padding-right: 1em } -{% endblock %} +{% block content %} -{% block sidebar %} -<ul class='compact'> - <li> <a href="{{asn.get_absolute_url}}/allocate">give to child</a></li> +<!-- +<ul class='breadcrumb'> + <li><a href="{% url rpki.gui.app.views.dashboard %}">{{ request.session.handle }}</a> <span class='divider'>/</span></li> + <li>AS <span class='divider'>/</span></li> + <li class='active'> {{ asn }}</li> </ul> -{% endblock %} +--> -{% block content %} +<div class='page-header'> + <h1>AS View</h1> +</div> -<p id='breadcrumb'> -<a href="{% url rpki.gui.app.views.dashboard %}">{{ request.session.handle }}</a> > AS View > {{ asn }} -</p> +<div class='row'> + <div class='span2'> + ASN + </div> + <div class='span11 offset2'> + {{ asn }} + </div> +</div> -<h1>AS View</h1> +{% if asn.parent %} +<div class='row'> + <div class='span2'> + Suballocated from + </div> + <div class='span11 offset2'> + <a href="{{ asn.parent.get_absolute_url }}">{{ asn.parent }}</a> + </div> +</div> +{% endif %} -<table> - <tr> <td>ASN:</td><td>{{ asn }}</td> </tr> - {% if asn.parent %} - <tr> - <td>Suballocated from:</td> - <td><a href="{{ asn.parent.get_absolute_url }}">{{ asn.parent }}</a></td> - </tr> - {% endif %} - <tr> - <td>Received from:</td> - <td> +<div class='row'> + <div class='span2'> + Received from + </div> + <div class='span11 offset2'> {% for p in parent %} <a href="{{ p.get_absolute_url }}">{{ p.handle }}</a> {% endfor %} - </td> - </tr> - <tr><td>Validity:</td><td>{{ asn.from_cert.all.0.not_before }} - {{ asn.from_cert.all.0.not_after }} </td></tr> + </div> +</div> - {% if asn.allocated %} - <tr><td>Allocated:</td><td><a href="{{asn.allocated.get_absolute_url}}">{{asn.allocated.handle}}</a></td></tr> - {% endif %} -</table> +<div class='row'> + <div class='span2'> + Validity + </div> + <div class='span11 offset2'> + {{ asn.from_cert.all.0.not_before }} - {{ asn.from_cert.all.0.not_after }} + </div> +</div> + +{% if asn.allocated %} +<div class='row'> + <div class='span2'> + Allocated + </div> + <div class='span11 offset2'> + <a href="{{asn.allocated.get_absolute_url}}">{{asn.allocated.handle}}</a> + </div> +</div> +{% endif %} {% if asn.children.count %} <h2>Suballocations</h2> @@ -84,10 +106,21 @@ td { border: solid 1px; text-align: center; padding-left: 1em; padding-right: 1e {% if form %} <h2>Edit</h2> -<form method="POST" action="{{ request.get_full_path }}">{% csrf_token %} - {{ form.as_p }} - <input type="submit"> +<form method="POST" action="{{ request.get_full_path }}"> + {% csrf_token %} + {% include "rpkigui/bootstrap_form.html" %} + <div class='actions'> + <input class='btn primary' value='Save' type="submit"> + <a class='btn' href='{{ asn.get_absolute_url }}'>Cancel</a> + </div> </form> +{% else %} + +<div class='actions'> + <a class='btn' href="{{asn.get_absolute_url}}/allocate" title="give this ASN to a child">Allocate</a> +</div> {% endif %} {% endblock %} + +<!-- vim: set sw=2: --> diff --git a/rpkid/rpki/gui/app/templates/rpkigui/child_view.html b/rpkid/rpki/gui/app/templates/rpkigui/child_view.html index 474798ce..2e4570da 100644 --- a/rpkid/rpki/gui/app/templates/rpkigui/child_view.html +++ b/rpkid/rpki/gui/app/templates/rpkigui/child_view.html @@ -1,21 +1,17 @@ -{% extends "base.html" %} - -{% block sidebar %} -<ul class='compact'> - <li><a href="{{ child.get_absolute_url }}/edit">edit</a></li> - <li><a href="{{ child.get_absolute_url }}/export" title="download XML response file to return to child">export child response</a></li> - <li><a href="{{ child.get_absolute_url }}/export_repo" title="download XML response to publication client request">export repo response</a></li> - <li><a href="{{ child.get_absolute_url }}/delete" title="remove this handle as a RPKI child">delete</a></li> - <li><a href="{{ child.get_absolute_url }}/destroy" title="completely remove a locally hosted resource handle and gui account">destroy</a></li> -</ul> -{% endblock %} +{% extends "rpkigui/app_base.html" %} {% block content %} -<p id='breadcrumb'> -<a href="{% url rpki.gui.app.views.dashboard %}">{{ request.session.handle.handle }}</a> > {{ child.handle }} -</p> +<!-- +<ul class='breadcrumb'> + <li><a href="{% url rpki.gui.app.views.dashboard %}">{{ request.session.handle.handle }}</a> <span class='divider'>/</span></li> + <li>Children <span class='divider'>/</span></li> + <li class='active'>{{ child.handle }}</li> +</ul> +--> -<h1>Child View</h1> +<div class='page-header'> + <h1>Child View</h1> +</div> <table> <tr> @@ -50,11 +46,23 @@ <p style='font-style:italic'>none</p> {% endif %} +<hr> + {% if form %} <form method='POST' action='{{ request.get_full_path }}'> {% csrf_token %} <input type='submit'/> </form> +{% else %} + +<div class='actions'> + <a class='btn' href="{{ child.get_absolute_url }}/edit">Edit</a> + <a class='btn' href="{{ child.get_absolute_url }}/export" title="download XML response file to return to child">Export child response</a></li> + <a class='btn' href="{{ child.get_absolute_url }}/export_repo" title="download XML response to publication client request">Export repo response</a></li> + <a class='btn danger' href="{{ child.get_absolute_url }}/delete" title="remove this handle as a RPKI child">Delete</a></li> + <a class='btn danger' href="{{ child.get_absolute_url }}/destroy" title="completely remove a locally hosted resource handle and gui account">Destroy</a></li> +</div> + {% endif %} {% endblock %} diff --git a/rpkid/rpki/gui/app/templates/rpkigui/dashboard.html b/rpkid/rpki/gui/app/templates/rpkigui/dashboard.html index e21eb4eb..497b9be2 100644 --- a/rpkid/rpki/gui/app/templates/rpkigui/dashboard.html +++ b/rpkid/rpki/gui/app/templates/rpkigui/dashboard.html @@ -1,193 +1,108 @@ {% extends "base.html" %} -{% block css %} -table { border-collapse: collapse } -th { border: solid 1px; padding: 1em } -td { border: solid 1px; text-align: center; padding-left: 1em; padding-right: 1em } -h2 { text-align:center; background-color:#dddddd } -{% endblock %} - {% block sidebar %} -<ul class='compact'> - <li><a href="#parents">parents</a></li> - <li><a href="#children">children</a></li> - <li><a href="#roas">roas</a></li> - <li><a href="#ghostbusters">ghostbusters</a></li> - <li><a href="#unallocated">unallocated</a></li> +<p><strong>{{ request.session.handle }}</strong> + +<ul class='unstyled'> + <li><a href="#">dashboard</a></li> + <li><a href="{% url rpki.gui.app.views.parent_list %}">parents</a></li> + <li><a href="{% url rpki.gui.app.views.child_list %}">children</a></li> + <li><a href="{% url rpki.gui.app.views.roa_request_list %}">roas</a></li> + <li><a href="{% url rpki.gui.app.views.ghostbusters_list %}">ghostbusters</a></li> </ul> -<ul class='compact'> +<ul class='unstyled'> <li><a href="{% url rpki.gui.app.views.conf_export %}" title="download XML identity to send to parent">export identity</a></li> <li><a href="{% url rpki.gui.app.views.update_bpki %}" title="renew all BPKI certificates">update bpki</a></li> <li><a href="{% url rpki.gui.app.views.conf_list %}" title="select a different resource handle to manage">select identity</a></li> </ul> -<ul class='compact'> +{% if user.is_staff %} +<ul class='unstyled'> <li><a href="{% url rpki.gui.app.views.child_wizard %}" title="create a new locally hosted resource handle">create child wizard</a></li> </ul> +{% endif %} -<ul class='compact'> - <li><a href="{% url rpki.gui.app.views.import_parent %}" title="upload XML response from remote parent">import parent</a></li> +<ul class='unstyled'> <li><a href="{% url rpki.gui.app.views.import_repository %}" title="upload XML response from remote repository">import repository</a></li> -</ul> - -<ul class='compact'> - <li><a href="{% url rpki.gui.app.views.import_child %}" title="import a new child's identity.xml file">import child</a></li> <li><a href="{% url rpki.gui.app.views.import_pubclient %}" title="import XML request from a publication client">import pubclient</a></li> </ul> -<ul class='compact'> +<ul class='unstyled'> <li><a href="{% url rpki.gui.app.views.refresh %}">refresh</a></li> </ul> {% endblock %} {% block content %} -<p id='breadcrumb'>{{ request.session.handle }} > Dashboard</p> - -<h1>Dashboard</h1> - -<div class='separator'> -<a name='parents'><h2>Parents</h2></a> - -{% if request.session.handle.parents.all %} -<ul> -{% for parent in request.session.handle.parents.all %} -<li><a href="{{ parent.get_absolute_url }}">{{ parent.handle }}</a> -<p> -<table> -<tr><th>Accepted Resource</th><th>Not Before</th><th>Not After</th></tr> -{% for cert in parent.resources.all %} - -{% for asn in cert.asn.all %} -<tr><td style='text-align:left'><a href="{{ asn.get_absolute_url }}">{{ asn }}</a></td> -<td>{{cert.not_before}}</td> -<td>{{cert.not_after}}</td> -</tr> -{% endfor %} - -{% for address in cert.address_range.all %} -<tr> - <td style='text-align: left'><a href="{{ address.get_absolute_url }}">{{ address }}</a></td> - <td>{{cert.not_before}}</td> - <td>{{cert.not_after}}</td> -</tr> -{% endfor %} - -{% endfor %} <!--certs--> +<!-- +<ul class='breadcrumb'> + <li><a href='{% url rpki.gui.app.views.dashboard %}'>{{ request.session.handle }}</a><span class="divider">/</span></li> + <li class='active'>Dashboard</li> +</ul> +--> + +<div class='page-header'> + <h1>Dashboard</h1> +</div> + +<!-- OVERVIEW ############################################################## --> + +<h2>Resources</h2> + +<table class='condensed-table zebra-striped'> + <tr> + <th>Resource</th> + <th>Valid Until</th> + <th>Parent</th> + </tr> + + {% for object in asn_list %} + <tr> + <td><a href="{{ object.get_absolute_url }}">{{ object }}</a></td> + <td>{{ object.from_cert.all.0.not_after }}</td> + <td><a href="{{ object.from_cert.all.0.parent.get_absolute_url }}">{{ object.from_cert.all.0.parent.handle }}</a></th> + </tr> + {% endfor %} + + {% for object in address_list %} + <tr> + <td><a href="{{ object.get_absolute_url }}">{{ object }}</a></td> + <td>{{ object.from_cert.all.0.not_after }}</td> + <td><a href="{{ object.from_cert.all.0.parent.get_absolute_url }}">{{ object.from_cert.all.0.parent.handle }}</a></th> + </tr> + {% endfor %} </table> -{% endfor %} -</ul> -{% else %} -<p style='font-style:italic'>none</p> -{% endif %} +<!-- UNALLOCATED ##############################################################--> +<div> + <h2>Unallocated Resources</h2> + <p>The following resources have not been allocated to a child, or appear in a ROA. -</div><!--parents--> - -<div class='separator'> - <a name='children'><h2>Children</h2></a> - -{% if request.session.handle.children.all %} -<ul> -{% for child in request.session.handle.children.all %} -<li><a href="{% url rpki.gui.app.views.child_view child.handle %}">{{ child.handle }}</a>, valid until {{ child.valid_until }} -{% if child.address_range.count or child.asn.count %} -<p>Delegated resources: -<ul> -{% for asn in child.asn.all %} -<li><a href="{{ asn.get_absolute_url }}">{{ asn }}</a></li> -{% endfor %} -{% for address in child.address_range.all %} -<li><a href="{{ address.get_absolute_url}}">{{ address }}</a></li> -{% endfor %} -</ul> -{% endif %} -</li> -{% endfor %} -</ul> -<!-- -<a href="/myrpki/import/child">[add]</a> ---> -{% else %} -<p style='font-style:italic'>none</p> -{% endif %} + {% if asns or ars %} -<p> -Export resources delegated to children (csv): <a href="{% url rpki.gui.app.views.download_asns request.session.handle %}" title="ASs delegated to children">asns</a> | -<a href="{% url rpki.gui.app.views.download_prefixes request.session.handle %}" title="prefixes delegated to children">prefixes</a> + {% if asns %} + <ul> + {% for asn in asns %} + <li>{{ asn.as_ul|safe }} + {% endfor %} <!-- ASNs --> + </ul> + {% endif %} -</div> + {% if ars %} + <ul> + {% for addr in ars %} + <li>{{ addr.as_ul|safe }} + {% endfor %} <!-- addrs --> + </ul> + {% endif %} -<div class='separator'> <!-- ROAs --> - <a name='roas'><h2>ROA Requests</h2></a> - - {% if request.session.handle.roas.all %} - <table> - <tr> <th>Prefix</th> <th>ASN</th> </tr> - - {% for roa in request.session.handle.roas.all %} - <tr> - <td style='text-align: left'> - <ul style='list-style-position: outside'> - {% for req in roa.from_roa_request.all %} - <li><a href="{{ req.prefix.get_absolute_url }}">{{ req.as_roa_prefix }}</a> - {% endfor %} - </ul> - </td> - <td>{{ roa.asn }}</td> - </tr> - {% endfor %} - </table> {% else %} <p style='font-style:italic'>none</p> {% endif %} - <p><a href="{% url rpki.gui.app.views.download_roas request.session.handle %}">export (csv)</a> -</div><!-- roas --> - -<div class='separator'><!-- ghostbusters --> -<a name='ghostbusters'><h2>Ghostbuster Requests</h2></a> - {% if request.session.handle.ghostbusters.all %} - <ul> - {% for gbr in request.session.handle.ghostbusters.all %} - <li><a href="{{ gbr.get_absolute_url }}">{{ gbr.full_name }}</a> | - <a href="{{ gbr.get_absolute_url }}/edit">edit</a> | - <a href="{{ gbr.get_absolute_url }}/delete">delete</a> - </li> - {% endfor %} - {% else %} -<p style='font-style:italic'>none</p> - {% endif %} -</ul> -<p><a href='{% url rpki.gui.app.views.ghostbuster_create %}'>add</a></p> -</div> - -<div class='separator'> -<a name='unallocated'><h2>Unallocated Resources</h2></a> - {% if asns or ars %} - - {% if asns %} - <ul> - {% for asn in asns %} - <li>{{ asn.as_ul|safe }} - {% endfor %} <!-- ASNs --> - </ul> - {% endif %} - - {% if ars %} - <ul> - {% for addr in ars %} - <li>{{ addr.as_ul|safe }} - {% endfor %} <!-- addrs --> - </ul> - {% endif %} - - {% else %} -<p style='font-style:italic'>none</p> - {% endif %} - - </ul> </div> {% endblock %} + +<!-- vim: set sw=2: --> diff --git a/rpkid/rpki/gui/app/templates/rpkigui/ghostbuster_detail.html b/rpkid/rpki/gui/app/templates/rpkigui/ghostbuster_detail.html index 4a9ed73a..fe3e3829 100644 --- a/rpkid/rpki/gui/app/templates/rpkigui/ghostbuster_detail.html +++ b/rpkid/rpki/gui/app/templates/rpkigui/ghostbuster_detail.html @@ -1,69 +1,73 @@ -{% extends "base.html" %} - -{% block css %} -td { padding-right: 1em } -td.label { font-weight:bold } -{% endblock %} - -{% block sidebar %} -<ul class='compact'> - <li><a href='{{ object.get_absolute_url }}/edit'>edit</a></li> - <li><a href='{{ object.get_absolute_url }}/delete'>delete</a></li> -</ul> -{% endblock %} +{% extends "rpkigui/app_base.html" %} {% block content %} -<p id='breadcrumb'><a href="{% url rpki.gui.app.views.dashboard %}">{{ request.session.handle }}</a> > <a href="{% url rpki.gui.app.views.ghostbusters_list %}">Ghostbuster Request</a> > {{ object.full_name }}</p> +<!-- +<ul class='breadcrumb'> + <li><a href="{% url rpki.gui.app.views.dashboard %}">{{ request.session.handle }}</a> <span class='divider'>/</span></li> + <li><a href="{% url rpki.gui.app.views.ghostbusters_list %}">Ghostbusters</a> <span class='divider'>/</span> </li> + <li class='active'>{{ object.full_name }}</li> +</ul> +--> -<h1>Ghostbuster View</h1> +<div class='page-header'> + <h1>Ghostbuster View</h1> +</div> -<table> - <tr><td class='label'>Full Name</td><td>{{ object.full_name }}</td></tr> +<table class='zebra-striped'> + <tr><td >Full Name</td><td>{{ object.full_name }}</td></tr> {% if object.honorific_prefix %} - <tr><td class='label'>Honorific Prefix</td><td>{{ object.honorific_prefix }}</td></tr> + <tr><td >Honorific Prefix</td><td>{{ object.honorific_prefix }}</td></tr> {% endif %} {% if object.organization %} - <tr><td class='label'>Organization</td><td>{{ object.organization }}</td></tr> + <tr><td >Organization</td><td>{{ object.organization }}</td></tr> {% endif %} {% if object.telephone %} - <tr><td class='label'>Telephone</td><td>{{ object.telephone }}</td></tr> + <tr><td >Telephone</td><td>{{ object.telephone }}</td></tr> {% endif %} {% if object.email_address %} - <tr><td class='label'>Email</td><td>{{ object.email_address }}</td></tr> + <tr><td >Email</td><td>{{ object.email_address }}</td></tr> {% endif %} {% if object.box %} - <tr><td class='label'>P.O. Box</td><td>{{ object.box }}</td></tr> + <tr><td >P.O. Box</td><td>{{ object.box }}</td></tr> {% endif %} {% if object.extended %} - <tr><td class='label'>Extended Address</td><td>{{ object.extended }}</td></tr> + <tr><td >Extended Address</td><td>{{ object.extended }}</td></tr> {% endif %} {% if object.street %} - <tr><td class='label'>Street Address</td><td>{{ object.street }}</td></tr> + <tr><td >Street Address</td><td>{{ object.street }}</td></tr> {% endif %} {% if object.city %} - <tr><td class='label'>City</td><td>{{ object.city }}</td></tr> + <tr><td >City</td><td>{{ object.city }}</td></tr> {% endif %} {% if object.region %} - <tr><td class='label'>Region</td><td>{{ object.region }}</td></tr> + <tr><td >Region</td><td>{{ object.region }}</td></tr> {% endif %} {% if object.code %} - <tr><td class='label'>Postal Code</td><td>{{ object.code }}</td></tr> + <tr><td >Postal Code</td><td>{{ object.code }}</td></tr> {% endif %} {% if object.country %} - <tr><td class='label'>Country</td><td>{{ object.country }}</td></tr> + <tr><td >Country</td><td>{{ object.country }}</td></tr> {% endif %} </table> + +<div class='actions'> + <a class='btn' href='{{ object.get_absolute_url }}/edit'>Edit</a> + <a class='btn danger' href='{{ object.get_absolute_url }}/delete'>Delete</a> +</div> + {% block extra %}{% endblock %} {% endblock %} + +<!-- vim: set sw=2: --> diff --git a/rpkid/rpki/gui/app/templates/rpkigui/ghostbuster_form.html b/rpkid/rpki/gui/app/templates/rpkigui/ghostbuster_form.html index 0d77d796..18eb288f 100644 --- a/rpkid/rpki/gui/app/templates/rpkigui/ghostbuster_form.html +++ b/rpkid/rpki/gui/app/templates/rpkigui/ghostbuster_form.html @@ -2,17 +2,26 @@ {% block content %} -<p id='breadcrumb'><a href="{% url rpki.gui.app.views.dashboard %}">{{request.session.handle}}</a> > <a href="{% url rpki.gui.app.views.ghostbusters_list %}">Ghostbusters</a> > Edit</p> +<ul class='breadcrumb'> + <li><a href="{% url rpki.gui.app.views.dashboard %}">{{request.session.handle}}</a> <span class='divider'>/</span></li> + <li> <a href="{% url rpki.gui.app.views.ghostbusters_list %}">Ghostbusters</a> <span class='divider'>/</span></li> + <li class='active'>Edit</li> +</ul> -<h1>Edit Ghostbuster Request</h1> +<div class='page-header'> + <h1>Edit Ghostbuster Request</h1> +</div> <form action='{{ request.get_full_path }}' method='POST'> - {% csrf_token %} - <table> -{{ form.as_table }} + {% csrf_token %} + + {# include code to render form using Twitter Bootstrap CSS Framework #} + {% include "rpkigui/bootstrap_form.html" %} + + <div class='actions'> + <input class='btn primary' type='submit' value='Save'> + <a class='btn' href="{{ object.get_absolute_url }}">Cancel</a> + </div> -</table> -<p></p><!-- add vertical space --> - <input type='submit' value='Save' /> </form> {% endblock %} diff --git a/rpkid/rpki/gui/app/templates/rpkigui/ghostbuster_list.html b/rpkid/rpki/gui/app/templates/rpkigui/ghostbuster_list.html index 6890782d..0280fca5 100644 --- a/rpkid/rpki/gui/app/templates/rpkigui/ghostbuster_list.html +++ b/rpkid/rpki/gui/app/templates/rpkigui/ghostbuster_list.html @@ -1,23 +1,13 @@ -{% extends "base.html" %} +{% extends "rpkigui/object_list.html" %} -{% block sidebar %} -<ul class='compact'> - <li><a href='{% url rpki.gui.app.views.ghostbuster_create %}'>add</a></li> -</ul> -{% endblock %} +{% block object_detail %} +<li><a href="{{ object.get_absolute_url }}">{{ object.full_name }}</a></li> +{% endblock object_detail %} -{% block content %} -<p id='breadcrumb'><a href="{% url rpki.gui.app.views.dashboard %}">{{ request.session.handle }}</a> > Ghostbusters</p> +{% block actions %} +<div class='actions'> + <a class='btn' href='{% url rpki.gui.app.views.ghostbuster_create %}' title='Create a new Ghostbuster Request'>Create</a> +</div> +{% endblock actions %} -<h1>Ghostbuster Requests</h1> - -{% if object_list %} -<ul> - {% for obj in object_list %} - <li><a href="{{ obj.get_absolute_url }}">{{ obj.full_name }}</a> | <a href="{{obj.get_absolute_url}}/edit">edit</a> | <a href="{{obj.get_absolute_url}}/delete">delete</a></li> - {% endfor %} -</ul> -{% else %} -<p style='font-style:italic'>none</p> -{% endif %} -{% endblock %} +<!-- vim: set sw=2: --> diff --git a/rpkid/rpki/gui/app/templates/rpkigui/import_child_form.html b/rpkid/rpki/gui/app/templates/rpkigui/import_child_form.html index acd6bf61..be0c87d9 100644 --- a/rpkid/rpki/gui/app/templates/rpkigui/import_child_form.html +++ b/rpkid/rpki/gui/app/templates/rpkigui/import_child_form.html @@ -1,13 +1,20 @@ -{% extends "base.html" %} +{% extends "rpkigui/app_base.html" %} {% block content %} +<div class='page-header'> + <h1>Import Child</h1> +</div> + <form enctype="multipart/form-data" method="POST" action="{{ request.get_full_path }}"> - {% csrf_token %} - <table> -{{ form.as_table }} -</table> -<input type="submit" value="Import"> + {% csrf_token %} + {% include "rpkigui/bootstrap_form.html" %} + <div class='actions'> + <input class='btn primary' type="submit" value="Import"> + <a class='btn' href="{% url rpki.gui.app.views.child_list %}">Cancel</a> + </div> </form> {% endblock %} + +<!-- vim: set sw=2: --> diff --git a/rpkid/rpki/gui/app/templates/rpkigui/import_parent_form.html b/rpkid/rpki/gui/app/templates/rpkigui/import_parent_form.html index acd6bf61..1b90ee6c 100644 --- a/rpkid/rpki/gui/app/templates/rpkigui/import_parent_form.html +++ b/rpkid/rpki/gui/app/templates/rpkigui/import_parent_form.html @@ -1,13 +1,20 @@ -{% extends "base.html" %} +{% extends "rpkigui/app_base.html" %} {% block content %} +<div class='page-header'> + <h1>Import Parent</h1> +</div> + <form enctype="multipart/form-data" method="POST" action="{{ request.get_full_path }}"> - {% csrf_token %} - <table> -{{ form.as_table }} -</table> -<input type="submit" value="Import"> + {% csrf_token %} + {% include "rpkigui/bootstrap_form.html" %} + <div class='actions'> + <input class='btn primary' type="submit" value="Import"> + <a class='btn' href="{% url rpki.gui.app.views.parent_list %}">Cancel</a> + </div> </form> -{% endblock %} +{% endblock content %} + +<!-- vim: set sw=2: --> diff --git a/rpkid/rpki/gui/app/templates/rpkigui/parent_view.html b/rpkid/rpki/gui/app/templates/rpkigui/parent_view.html index a57bd888..1a8721d1 100644 --- a/rpkid/rpki/gui/app/templates/rpkigui/parent_view.html +++ b/rpkid/rpki/gui/app/templates/rpkigui/parent_view.html @@ -1,38 +1,68 @@ -{% extends "base.html" %} +{% extends "rpkigui/app_base.html" %} -{% block sidebar %} -<ul class='compact'> - <li><a href="{{ parent.get_absolute_url }}/delete">delete</a></li> +{% block content %} + +<!-- +<ul class='breadcrumb'> + <li><a href='{% url rpki.gui.app.views.dashboard %}'>{{ request.session.handle }}</a><span class='divider'>/</span></li> + <li>Parents <span class='divider'>/</span></li> + <li class='active'>{{ parent.handle }}</li> </ul> -{% endblock %} +--> -{% block content %} -<p id='breadcrumb'> -<a href="{% url rpki.gui.app.views.dashboard %}">{{ request.session.handle.handle }}</a> > Parent View > {{ parent.handle }} -</p> +<div class='page-header'> + <h1>Parent: {{ parent.handle }}</h1> +</div> -<h1>Parent View</h1> +<div class='row'> -<p>Parent: {{ parent.handle }} + <div class='span8'> + <h2>Delegated Addresses</h2> + <ul> + {% for c in parent.resources.all %} + {% for a in c.address_range.all %} + <li><a href="{{ a.get_absolute_url }}">{{ a }}</a></li> + {% endfor %} + {% endfor %} + </ul> + </div> -<h2>Delegated Addresses</h2> -<ul> -{% for c in parent.resources.all %} -{% for a in c.address_range.all %} -<li><a href="{{ a.get_absolute_url }}">{{ a }}</a> -{% endfor %} -{% endfor %} -</ul> + <div class='span8'> + <h2>Delegated ASNs</h2> + <ul> + {% for c in parent.resources.all %} + {% for a in c.asn.all %} + <li><a href="{{ a.get_absolute_url }}">{{ a }}</a></li> + {% endfor %} + {% endfor %} + </ul> + </div> -<h2>Delegated ASNs</h2> -<ul> -{% for c in parent.resources.all %} -{% for a in c.asn.all %} -<li><a href="{{ a.get_absolute_url }}">{{ a }}</a> -{% endfor %} -{% endfor %} -</ul> +</div><!-- /row --> -{% block form %}{% endblock %} +{% if form %} + +<div class='alert-message warning'> + <P>Please confirm the following action. +</div> + +<form method="POST" action="{{ request.get_full_path }}"> + {% csrf_token %} + {% include "rpkigui/bootstrap_form.html" %} + <div class='actions'> + <input class='btn danger' type="submit" value="{{ submit_label }}"> + <a class='btn' href="{{ parent.get_absolute_url}}">Cancel</a> + </div> +</form> + +{% else %} + +<div class='actions'> + <a class='btn danger' href="{{ parent.get_absolute_url }}/delete" title="Delete this parent">Delete</a> +</div> + +{% endif %} {% endblock %} + +<!-- vim: set sw=2: --> diff --git a/rpkid/rpki/gui/app/templates/rpkigui/prefix_view.html b/rpkid/rpki/gui/app/templates/rpkigui/prefix_view.html index 6679eff9..0a4ce3e3 100644 --- a/rpkid/rpki/gui/app/templates/rpkigui/prefix_view.html +++ b/rpkid/rpki/gui/app/templates/rpkigui/prefix_view.html @@ -1,50 +1,40 @@ -{% extends "base.html" %} - -{% block sidebar %} -<ul class='compact'> -{% if not addr.allocated %} -<li><a href="{{addr.get_absolute_url}}/split">split</a></li> -{% endif %} -{% if not addr.roa_requests.all %} -<li><a href="{{addr.get_absolute_url}}/allocate">give to child</a></li> -{% endif %} -{% if addr.is_prefix and not addr.allocated %} -<li><a href="{{ addr.get_absolute_url }}/roa">roa</a></li> -{% endif %} -{% if not addr.allocated and addr.parent %} -<li><a href="{{ addr.get_absolute_url }}/delete">delete</a></li> -{% endif %} -</ul> -{% endblock %} +{% extends "rpkigui/app_base.html" %} {% block content %} -<p id='breadcrumb'> -<a href="{% url rpki.gui.app.views.dashboard %}">{{ request.session.handle }}</a> > Prefix View > {{ addr }} -</p> +<!-- +<ul class='breadcrumb'> + <li><a href="{% url rpki.gui.app.views.dashboard %}">{{ request.session.handle }}</a> <span class='divider'>/</span></li> + <li>Prefixes <span class='divider'>/</span></li> + <li class='active'>{{ addr }}</li> +</ul> +--> + +<div class='page-header'> <h1>Prefix View</h1> +</div> <table> <tr> <td>Range:</td><td>{{ addr }}</td> </tr> {% if addr.parent %} <tr> - <td>Suballocated from:</td> + <td>Suballocated from</td> <td><a href="{{ addr.parent.get_absolute_url }}">{{ addr.parent }}</a></td> </tr> {% endif %} <tr> - <td>Received from:</td> + <td>Received from</td> <td> {% for p in parent %} <a href="{{ p.get_absolute_url }}">{{ p.handle }}</a> {% endfor %} </td> </tr> - <tr><td>Validity:</td><td>{{ addr.from_cert.all.0.not_before }} - {{ addr.from_cert.all.0.not_after }} </td></tr> + <tr><td>Validity</td><td>{{ addr.from_cert.all.0.not_before }} - {{ addr.from_cert.all.0.not_after }} </td></tr> {% if addr.allocated %} <tr> - <td>Allocated:</td> + <td>Allocated</td> <td><a href="{{addr.allocated.get_absolute_url}}">{{ addr.allocated.handle }}</a></td> </tr> {% endif %} @@ -61,14 +51,14 @@ {% if addr.roa_requests.count %} <h2>ROA requests</h2> -<table> +<table class='zebra-striped'> <tr><th>ASN</th><th>Max Length</th></tr> {% for r in addr.roa_requests.all %} <tr> <td>{{ r.roa.asn }}</td> <td>{{ r.max_length }}</td> - <td><a href="{{ r.get_absolute_url }}/delete">delete</a></td> + <td><a class='btn danger' href="{{ r.get_absolute_url }}/delete">delete</a></td> </tr> {% endfor %} </table> @@ -84,13 +74,36 @@ {% endif %} {% if form %} -<div style='background-color: #dddddd'> + <h2>{{ form_title }}</h2> -<form method="POST" action="{{ request.get_full_path }}">{% csrf_token %} - {{ form.as_p }} - <input type="submit"> +<form method="POST" action="{{ request.get_full_path }}"> + {% csrf_token %} + {% include "rpkigui/bootstrap_form.html" %} + <div class='actions'> + <input class='btn primary' type="submit" value="{{ submit_value }}"> + <a class='btn' href="{{ addr.get_absolute_url }}">Cancel</a> + </div> </form> -</div> + +{% else %} + +<div class='actions'> + {% if not addr.allocated %} + <a class='btn' href="{{addr.get_absolute_url}}/split" title="Divide this prefix into a smaller block">Split</a> + {% endif %} + {% if not addr.roa_requests.all %} + <a class='btn' href="{{addr.get_absolute_url}}/allocate" title="Give prefix to child">Allocate</a> + {% endif %} + {% if addr.is_prefix and not addr.allocated %} + <a class='btn' href="{{ addr.get_absolute_url }}/roa" title="Create a ROA request for this prefix">Issue ROA</a> + {% endif %} + {% if not addr.allocated and addr.parent %} + <a class='btn danger' href="{{ addr.get_absolute_url }}/delete" title="Delete this prefix">Delete</a> + {% endif %} +</div><!-- actions --> + {% endif %} <!-- form --> {% endblock %} + +<!-- vim: set sw=2: --> diff --git a/rpkid/rpki/gui/app/templates/rpkigui/roa_request_confirm_delete.html b/rpkid/rpki/gui/app/templates/rpkigui/roa_request_confirm_delete.html index 7d5187d3..27854f6b 100644 --- a/rpkid/rpki/gui/app/templates/rpkigui/roa_request_confirm_delete.html +++ b/rpkid/rpki/gui/app/templates/rpkigui/roa_request_confirm_delete.html @@ -2,9 +2,15 @@ {% block content %} -<p id='breadcrumb'><a href="{% url rpki.gui.app.views.dashboard %}">{{request.session.handle}}</a> > <a href="{{ object.prefix.get_absolute_url }}">{{ object.prefix }}</a> > Delete ROA Request</p> +<ul class='breadcrumb'> + <li><a href="{% url rpki.gui.app.views.dashboard %}">{{request.session.handle}}</a> <span class='divider'>/</span></li> + <li><a href="{{ object.prefix.get_absolute_url }}">{{ object.prefix }}</a> <span class='divider'>/</span></li> + <li class='active'>Delete ROA Request</li> +</ul> +<div class='page-header'> <h1>Delete ROA Request</h1> +</div> <p>Please confirm that you would like to delete the following ROA request:</p> @@ -17,8 +23,11 @@ <p></p><!--add some space--> <form method='POST' action='{{ request.get_full_path }}'> -{% csrf_token %} -<input type='submit' value='Delete'/> + {% csrf_token %} + <div class='actions'> + <input class='btn danger' type='submit' value='Delete'/> + <a class='btn' href="{{ object.prefix.get_absolute_url }}">Cancel</a> + </div> </form> {% endblock %} diff --git a/rpkid/rpki/gui/app/urls.py b/rpkid/rpki/gui/app/urls.py index ae9352b1..d428b031 100644 --- a/rpkid/rpki/gui/app/urls.py +++ b/rpkid/rpki/gui/app/urls.py @@ -23,8 +23,10 @@ urlpatterns = patterns('', (r'^conf/export$', views.conf_export), (r'^conf/list$', views.conf_list), (r'^conf/select$', views.conf_select), + (r'^parent/$', views.parent_list), (r'^parent/(?P<parent_handle>[^/]+)$', views.parent_view), (r'^parent/(?P<parent_handle>[^/]+)/delete$', views.parent_delete), + (r'^child/$', views.child_list), (r'^child/(?P<child_handle>[^/]+)$', views.child_view), (r'^child/(?P<child_handle>[^/]+)/delete$', views.child_delete), (r'^child/(?P<child_handle>[^/]+)/edit$', views.child_edit), @@ -45,6 +47,7 @@ urlpatterns = patterns('', (r'^gbr/(?P<pk>\d+)/delete$', views.ghostbuster_delete), (r'^refresh$', views.refresh), (r'^roa/(?P<pk>\d+)$', views.roa_view), + (r'^roareq/$', views.roa_request_list), (r'^roareq/(?P<pk>\d+)$', views.roa_request_view), (r'^roareq/(?P<pk>\d+)/delete$', views.roa_request_delete_view), (r'^demo/down/asns/(?P<self_handle>[^/]+)$', views.download_asns), diff --git a/rpkid/rpki/gui/app/views.py b/rpkid/rpki/gui/app/views.py index 0fb34525..014a13a3 100644 --- a/rpkid/rpki/gui/app/views.py +++ b/rpkid/rpki/gui/app/views.py @@ -88,24 +88,17 @@ def render(template, context, request): def dashboard(request, template_name='rpkigui/dashboard.html'): '''The user's dashboard.''' handle = request.session[ 'handle' ] - # ... pick out data for the dashboard and return it - # my parents - # the resources that my parents have given me - # the resources that I have accepted from my parents - # my children - # the resources that I have given my children - # my roas - - # get list of ASNs used in my ROAs - roa_asns = [r.asn for r in handle.roas.all()] + asns=[] - for a in models.Asn.objects.filter(from_cert__parent__in=handle.parents.all()): + asn_list = models.Asn.objects.filter(from_cert__parent__in=handle.parents.all()) + for a in asn_list: f = AllocationTree.AllocationTreeAS(a) if f.unallocated(): asns.append(f) prefixes = [] - for p in models.AddressRange.objects.filter(from_cert__parent__in=handle.parents.all()): + address_list = models.AddressRange.objects.filter(from_cert__parent__in=handle.parents.all()) + for p in address_list: f = AllocationTree.AllocationTreeIP.from_prefix(p) if f.unallocated(): prefixes.append(f) @@ -113,7 +106,12 @@ def dashboard(request, template_name='rpkigui/dashboard.html'): asns.sort(key=lambda x: x.range.min) prefixes.sort(key=lambda x: x.range.min) - return render(template_name, { 'conf': handle, 'asns': asns, 'ars': prefixes }, request) + return render(template_name, { + 'conf': handle, + 'asns': asns, + 'ars': prefixes, + 'asn_list': asn_list, + 'address_list': address_list }, request) @login_required def conf_list(request): @@ -160,10 +158,28 @@ def conf_export(request): return serve_xml(glue.read_identity(handle.handle), 'identity') @handle_required +def parent_list(request): + """List view for parent objects.""" + conf = request.session['handle'] + + return object_list(request, queryset=conf.parents.all(), template_name='rpkigui/parent_list.html', + extra_context = { 'page_title': 'Parents' }) + +@handle_required +def child_list(request): + """List view for child objects.""" + conf = request.session['handle'] + + return object_list(request, queryset=conf.children.all(), + template_name = 'rpkigui/child_list.html', + extra_context = { 'page_title': 'Children' }) + +@handle_required def parent_view(request, parent_handle): """Detail view for a particular parent.""" handle = request.session['handle'] parent = get_object_or_404(handle.parents, handle__exact=parent_handle) + return render('rpkigui/parent_view.html', { 'parent': parent }, request) def get_parents_or_404(handle, obj): @@ -219,6 +235,7 @@ class PrefixView(object): form = None form_title = None + submit_value = 'Submit' def __init__(self, request, pk, form_class=None): self.handle = request.session['handle'] @@ -243,7 +260,8 @@ class PrefixView(object): return render('rpkigui/prefix_view.html', { 'addr': self.obj, 'parent': self.parent_set, 'unallocated': u, 'form': self.form, - 'form_title': self.form_title if self.form_title else 'Edit' }, + 'form_title': self.form_title if self.form_title else 'Edit', + 'submit_value': self.submit_value }, self.request) def handle_get(self): @@ -277,6 +295,7 @@ class PrefixSplitView(PrefixView): '''Class for handling the prefix split form.''' form_title = 'Split' + submit_value = 'Split' def form_valid(self): r = misc.parse_resource_range(self.form.cleaned_data['prefix']) @@ -292,6 +311,7 @@ class PrefixAllocateView(PrefixView): '''Class to handle the allocation to child form.''' form_title = 'Give to Child' + submit_label = 'Allocate' def handle_get(self): self.form = forms.PrefixAllocateForm( @@ -344,6 +364,7 @@ class PrefixRoaView(PrefixView): '''Class for handling the ROA creation form.''' form_title = 'Issue ROA' + submit_value = 'Create' def form_valid(self): asns = asnset(self.form.cleaned_data['asns']) @@ -572,13 +593,23 @@ def roa_view(request, pk): return @handle_required +def roa_request_list(request): + conf = request.session['handle'] + + return object_list(request, queryset=models.RoaRequest.objects.filter(roa__in=conf.roas.all()), + template_name='rpkigui/roa_request_list.html', + extra_context = { 'page_title': 'ROA Requests' }) + +@handle_required def ghostbusters_list(request): """ Display a list of all ghostbuster requests for the current Conf. """ conf = request.session['handle'] - return object_list(request, queryset=conf.ghostbusters.all(), template_name='rpkigui/ghostbuster_list.html') + return object_list(request, queryset=conf.ghostbusters.all(), + template_name='rpkigui/ghostbuster_list.html', + extra_context = { 'page_title': 'Ghostbusters' }) @handle_required def ghostbuster_view(request, pk): @@ -623,7 +654,7 @@ def _ghostbuster_edit(request, obj=None): return http.HttpResponseRedirect(obj.get_absolute_url()) else: form = form_class(instance=obj) - return render('rpkigui/ghostbuster_form.html', { 'form': form }, request) + return render('rpkigui/ghostbuster_form.html', { 'form': form, 'object': obj }, request) @handle_required def ghostbuster_edit(request, pk): @@ -841,7 +872,7 @@ def parent_delete(request, parent_handle): else: form = forms.GenericConfirmationForm() - return render('rpkigui/parent_form.html', { 'form': form , + return render('rpkigui/parent_view.html', { 'form': form , 'parent': parent, 'submit_label': 'Delete' }, request) @login_required diff --git a/rpkid/rpki/gui/urls.py b/rpkid/rpki/gui/urls.py index 70ea4056..93fc9373 100644 --- a/rpkid/rpki/gui/urls.py +++ b/rpkid/rpki/gui/urls.py @@ -37,4 +37,8 @@ urlpatterns = patterns('', (r'^accounts/login/$', 'django.contrib.auth.views.login'), (r'^accounts/logout/$', 'django.contrib.auth.views.logout', { 'next_page': '/rpki/' }), + + # !!!REMOVE THIS BEFORE COMMITTING!!! + (r'^site_media/(?P<path>.*)$', 'django.views.static.serve', + {'document_root': '/var/www/html/media'}), ) |