2015-12-13 09:34:12 +00:00
|
|
|
<!DOCTYPE html>
|
|
|
|
<html>
|
2016-04-22 00:37:33 +00:00
|
|
|
<head>
|
|
|
|
{% block head %}
|
|
|
|
<meta charset="utf-8">
|
|
|
|
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
|
|
|
{% block title %}<title>DNS Control Panel</title>{% endblock %}
|
|
|
|
<!-- Get Google Fonts we like -->
|
2018-06-10 13:16:28 +00:00
|
|
|
<link rel="stylesheet" href="//fonts.googleapis.com/css?family=Source+Sans+Pro:300,400,600,700,300italic,400italic,600italic">
|
|
|
|
<link rel="stylesheet" href="//fonts.googleapis.com/css?family=Roboto+Mono:400,300,700">
|
2016-04-22 00:37:33 +00:00
|
|
|
<!-- Tell the browser to be responsive to screen width -->
|
|
|
|
<meta content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" name="viewport">
|
2018-06-10 13:16:28 +00:00
|
|
|
{% assets "css_main" -%}
|
|
|
|
<link rel="stylesheet" href="{{ ASSET_URL }}">
|
|
|
|
{%- endassets %}
|
2016-04-22 00:37:33 +00:00
|
|
|
<!-- HTML5 Shim and Respond.js IE8 support of HTML5 elements and media queries -->
|
|
|
|
<!-- WARNING: Respond.js doesn't work if you view the page via file:// -->
|
|
|
|
<!--[if lt IE 9]>
|
|
|
|
<script src="https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js"></script>
|
|
|
|
<script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
|
|
|
|
<![endif]-->
|
|
|
|
{% endblock %}
|
|
|
|
</head>
|
2016-04-29 21:36:37 +00:00
|
|
|
<body class="hold-transition skin-blue sidebar-mini {% if not fullscreen_layout_setting %}layout-boxed{% endif %}">
|
2016-04-22 00:37:33 +00:00
|
|
|
<div class="wrapper">
|
|
|
|
{% block pageheader %}
|
|
|
|
<header class="main-header">
|
|
|
|
<!-- Logo -->
|
|
|
|
<a href="{{ url_for('index') }}" class="logo">
|
|
|
|
<!-- mini logo for sidebar mini 50x50 pixels -->
|
|
|
|
<span class="logo-mini"><b>PD</b>A</span>
|
|
|
|
<!-- logo for regular state and mobile devices -->
|
|
|
|
<span class="logo-lg"><b>PowerDNS</b>-Admin</span>
|
|
|
|
</a>
|
|
|
|
<!-- Header Navbar: style can be found in header.less -->
|
|
|
|
<nav class="navbar navbar-static-top">
|
|
|
|
<!-- Sidebar toggle button-->
|
2018-06-10 13:16:28 +00:00
|
|
|
<a href="#" class="sidebar-toggle" data-toggle="push-menu" role="button">
|
2016-04-22 00:37:33 +00:00
|
|
|
<span class="sr-only">Toggle navigation</span>
|
|
|
|
</a>
|
|
|
|
|
|
|
|
<div class="navbar-custom-menu">
|
2016-06-18 04:41:01 +00:00
|
|
|
{% if current_user.id is defined %}
|
2016-04-22 00:37:33 +00:00
|
|
|
<ul class="nav navbar-nav">
|
|
|
|
<!-- User Account: style can be found in dropdown.less -->
|
|
|
|
<li class="dropdown user user-menu">
|
|
|
|
<a href="#" class="dropdown-toggle" data-toggle="dropdown">
|
|
|
|
{% if current_user.avatar %}
|
|
|
|
<img src="{{ url_for('user_avatar', filename=current_user.avatar) }}" class="user-image" alt="User Image"/>
|
|
|
|
{% else %}
|
2016-07-13 14:33:21 +00:00
|
|
|
<img src="{{ current_user.email|email_to_gravatar_url(size=80) }}" class="user-image" alt="User Image"/>
|
2016-04-22 00:37:33 +00:00
|
|
|
{% endif %}
|
|
|
|
<span class="hidden-xs">
|
|
|
|
{{ current_user.firstname }}
|
|
|
|
</span>
|
2015-12-13 09:34:12 +00:00
|
|
|
</a>
|
2016-04-22 00:37:33 +00:00
|
|
|
<ul class="dropdown-menu">
|
2016-06-18 04:41:01 +00:00
|
|
|
<li class="user-header">
|
|
|
|
{% if current_user.avatar %}
|
|
|
|
<img src="{{ url_for('user_avatar', filename=current_user.avatar) }}" class="img-circle" alt="User Image"/>
|
|
|
|
{% else %}
|
2016-07-13 14:33:21 +00:00
|
|
|
<img src="{{ current_user.email|email_to_gravatar_url(size=160) }}" class="img-circle" alt="User Image"/>
|
2016-06-18 04:41:01 +00:00
|
|
|
{% endif %}
|
|
|
|
<p>
|
|
|
|
{{ current_user.firstname }} {{ current_user.lastname }}
|
|
|
|
<small>{{ current_user.role.name }}</small>
|
|
|
|
</p>
|
|
|
|
</li>
|
2018-02-28 12:39:05 +00:00
|
|
|
|
2016-04-22 00:37:33 +00:00
|
|
|
<!-- Menu Footer-->
|
|
|
|
<li class="user-footer">
|
|
|
|
<div class="pull-left">
|
2016-05-11 00:11:17 +00:00
|
|
|
<a href="{{ url_for('user_profile') }}" class="btn btn-flat btn-default">My Profile</a>
|
2015-12-13 09:34:12 +00:00
|
|
|
</div>
|
2016-04-22 00:37:33 +00:00
|
|
|
<div class="pull-right">
|
2016-05-11 00:11:17 +00:00
|
|
|
<a href="{{ url_for('logout') }}" class="btn btn-flat btn-default">Log out</a>
|
2016-04-22 00:37:33 +00:00
|
|
|
</div>
|
|
|
|
</li>
|
|
|
|
</ul>
|
|
|
|
</li>
|
|
|
|
</ul>
|
2016-05-15 22:01:57 +00:00
|
|
|
{% endif %}
|
2016-04-22 00:37:33 +00:00
|
|
|
</div>
|
|
|
|
</nav>
|
|
|
|
</header>
|
|
|
|
{% endblock %}
|
|
|
|
<!-- Left side column. contains the logo and sidebar -->
|
|
|
|
<aside class="main-sidebar">
|
|
|
|
<!-- sidebar: style can be found in sidebar.less -->
|
|
|
|
<section class="sidebar">
|
2016-05-15 22:01:57 +00:00
|
|
|
{% if current_user.id is defined %}
|
2016-04-22 00:37:33 +00:00
|
|
|
<div class="user-panel">
|
|
|
|
<div class="pull-left image">
|
|
|
|
{% if current_user.avatar %}
|
|
|
|
<img src="{{ url_for('user_avatar', filename=current_user.avatar) }}" class="img-circle" alt="User Image"/>
|
|
|
|
{% else %}
|
2016-07-13 14:33:21 +00:00
|
|
|
<img src="{{ current_user.email|email_to_gravatar_url(size=100) }}" class="img-circle" alt="User Image"/>
|
2016-04-22 00:37:33 +00:00
|
|
|
{% endif %}
|
2015-12-13 09:34:12 +00:00
|
|
|
</div>
|
2016-04-22 00:37:33 +00:00
|
|
|
<div class="pull-left info">
|
|
|
|
<p>{{ current_user.firstname }} {{ current_user.lastname }}</p>
|
|
|
|
<a href="#"><i class="fa fa-circle text-success"></i> Logged In</a>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
<!-- sidebar menu: : style can be found in sidebar.less -->
|
2018-06-10 13:16:28 +00:00
|
|
|
<ul class="sidebar-menu" data-widget="tree">
|
2016-04-22 00:37:33 +00:00
|
|
|
<li class="header">USER ACTIONS</li>
|
|
|
|
<li><a href="{{ url_for('dashboard') }}"><i class="fa fa-dashboard"></i> <span>Dashboard</span></a></li>
|
|
|
|
{% if current_user.role.name == 'Administrator' %}
|
2016-04-23 02:05:13 +00:00
|
|
|
<li><a href="{{ url_for('domain_add') }}"><i class="fa fa-plus"></i> <span>New Domain</span></a></li>
|
2016-04-22 00:37:33 +00:00
|
|
|
<li class="header">ADMINISTRATION</li>
|
2016-04-29 21:39:51 +00:00
|
|
|
<li><a href="{{ url_for('admin') }}"><i class="fa fa-wrench"></i> <span>Admin Console</span></a></li>
|
2018-01-22 15:22:19 +00:00
|
|
|
<li><a href="{{ url_for('templates') }}"><i class="fa fa-clone"></i> <span>Domain Templates</span></a></li>
|
2016-04-29 21:39:51 +00:00
|
|
|
<li><a href="{{ url_for('admin_manageuser') }}"><i class="fa fa-users"></i> <span>Users</span></a></li>
|
Initial support for Accounts
This adds initial support for accounts a concept meant to signify a customer, a department or any other entity that somehow owns or manages one or more domains.
The purpose is to be able to assign an account to any number of domains, making it easy to track who owns or manages a domain, significantly improving manageability in setups with a large number of domains.
An account consists of a mandatory, unique `name` and optional `description`, `contact` name and `mail` address. The account `name` is stripped of spaces and symbols, and lower cased before getting stored in the database and in PowerDNS, to help ensure some type of predictability and uniqueness in the database.
The term *account* is actually taken from the PowerDNS database, where the `domains.account` column is used to store the account relationship, in in the form of the account `name`.
The link to a domain in PowerDNS-Admin is done through the `domain.account_id` FOREIGN KEY, that is linked to the `account.id` PRIMARY KEY.
(cherry picked from commits 4e95f33dfb0676d1c401a033c28bca3be7d6ec26, da0d596bd019a339549e2c59630a8fdee65d0e22, 7f06e6aaf4fd8011c784f24b7bbbba5f52aef319, 1c624dad8749024033d1d15dd6242ca52b39f135)
2018-06-04 15:10:02 +00:00
|
|
|
<li><a href="{{ url_for('admin_manageaccount') }}"><i class="fa fa-industry"></i> <span>Accounts</span></a></li>
|
2016-04-29 21:39:51 +00:00
|
|
|
<li><a href="{{ url_for('admin_history') }}"><i class="fa fa-calendar"></i> <span>History</span></a></li>
|
|
|
|
<li><a href="{{ url_for('admin_settings') }}"><i class="fa fa-cog"></i> <span>Settings</span></a></li>
|
2016-04-22 00:37:33 +00:00
|
|
|
{% endif %}
|
2016-05-15 22:01:57 +00:00
|
|
|
{% endif %}
|
2016-04-22 00:37:33 +00:00
|
|
|
</section>
|
|
|
|
<!-- /.sidebar -->
|
|
|
|
</aside>
|
2015-12-13 09:34:12 +00:00
|
|
|
|
2016-04-22 00:37:33 +00:00
|
|
|
<!-- Content Wrapper. Contains page content -->
|
|
|
|
<div class="content-wrapper">
|
|
|
|
{% block dashboard_stat %}
|
|
|
|
<!-- Content Header (Page header) -->
|
|
|
|
<section class="content-header">
|
|
|
|
<h1>
|
|
|
|
Dashboard
|
|
|
|
<small>Control panel</small>
|
|
|
|
</h1>
|
|
|
|
<ol class="breadcrumb">
|
|
|
|
<li><a href="{{ url_for('dashboard') }}"><i class="fa fa-dashboard"></i> Home</a></li>
|
|
|
|
<li class="active">Dashboard</li>
|
|
|
|
</ol>
|
|
|
|
</section>
|
2015-12-13 09:34:12 +00:00
|
|
|
{% endblock %}
|
2016-04-22 00:37:33 +00:00
|
|
|
{% block content %}
|
2015-12-13 09:34:12 +00:00
|
|
|
{% endblock %}
|
2016-04-22 00:37:33 +00:00
|
|
|
</div>
|
|
|
|
<!-- /.content-wrapper -->
|
|
|
|
<footer class="main-footer">
|
2018-04-02 07:01:35 +00:00
|
|
|
<strong><a href="https://github.com/ngoduykhanh/PowerDNS-Admin">PowerDNS-Admin</a></strong> - A PowerDNS web interface with advanced features.
|
2016-04-22 00:37:33 +00:00
|
|
|
</footer>
|
|
|
|
</div>
|
|
|
|
<!-- ./wrapper -->
|
2016-07-02 00:45:42 +00:00
|
|
|
<script type="text/javascript">
|
|
|
|
$SCRIPT_ROOT = {{ request.script_root|tojson|safe }};
|
|
|
|
</script>
|
2016-04-22 00:37:33 +00:00
|
|
|
{% block scripts %}
|
2018-06-10 13:16:28 +00:00
|
|
|
{% assets "js_main" -%}
|
|
|
|
<script type="text/javascript" src="{{ ASSET_URL }}"></script>
|
|
|
|
{%- endassets %}
|
2016-04-22 07:06:01 +00:00
|
|
|
{% endblock %}
|
|
|
|
{% block extrascripts %}
|
|
|
|
{% endblock %}
|
2016-04-23 01:45:34 +00:00
|
|
|
{% block defaultmodals %}
|
|
|
|
<div class="modal fade modal-danger" id="modal_error">
|
2016-04-28 04:05:41 +00:00
|
|
|
<div class="modal-dialog">
|
|
|
|
<div class="modal-content">
|
|
|
|
<div class="modal-header">
|
|
|
|
<button type="button" class="close" data-dismiss="modal"
|
|
|
|
aria-label="Close">
|
|
|
|
<span aria-hidden="true">×</span>
|
|
|
|
</button>
|
|
|
|
<h4 class="modal-title">Error</h4>
|
|
|
|
</div>
|
|
|
|
<div class="modal-body">
|
|
|
|
<p></p>
|
|
|
|
</div>
|
|
|
|
<div class="modal-footer">
|
2016-05-11 00:11:17 +00:00
|
|
|
<button type="button" class="btn btn-flat btn-default pull-right"
|
2016-04-28 04:05:41 +00:00
|
|
|
data-dismiss="modal">Close</button>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
<!-- /.modal-content -->
|
|
|
|
</div>
|
|
|
|
<!-- /.modal-dialog -->
|
2016-04-23 01:45:34 +00:00
|
|
|
</div>
|
|
|
|
<!-- /.modal -->
|
|
|
|
<div class="modal fade modal-success" id="modal_success">
|
2016-04-28 04:05:41 +00:00
|
|
|
<div class="modal-dialog">
|
|
|
|
<div class="modal-content">
|
|
|
|
<div class="modal-header">
|
|
|
|
<button type="button" class="close" data-dismiss="modal"
|
|
|
|
aria-label="Close">
|
|
|
|
<span aria-hidden="true">×</span>
|
|
|
|
</button>
|
|
|
|
<h4 class="modal-title">Success</h4>
|
|
|
|
</div>
|
|
|
|
<div class="modal-body">
|
|
|
|
<p></p>
|
|
|
|
</div>
|
|
|
|
<div class="modal-footer">
|
2016-05-11 00:11:17 +00:00
|
|
|
<button type="button" class="btn btn-flat btn-default pull-right"
|
2016-04-28 04:05:41 +00:00
|
|
|
data-dismiss="modal">Close</button>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
<!-- /.modal-content -->
|
|
|
|
</div>
|
|
|
|
<!-- /.modal-dialog -->
|
2016-04-23 01:45:34 +00:00
|
|
|
</div>
|
|
|
|
<!-- /.modal -->
|
|
|
|
{% endblock %}
|
2016-04-22 07:06:01 +00:00
|
|
|
{% block modals %}
|
2016-04-22 00:37:33 +00:00
|
|
|
{% endblock %}
|
|
|
|
</body>
|
2016-04-21 15:20:09 +00:00
|
|
|
</html>
|