Page MenuHomeGRNET

No OneTemporary

File Metadata

Created
Sat, May 17, 10:55 PM
diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb
index 1678eaa..8761224 100644
--- a/app/controllers/application_controller.rb
+++ b/app/controllers/application_controller.rb
@@ -1,25 +1,34 @@
class ApplicationController < ActionController::Base
# Prevent CSRF attacks by raising an exception.
# For APIs, you may want to use :null_session instead.
protect_from_forgery with: :exception
attr_writer :breadcrumb
private
+ def group
+ @group ||= domain.group
+ end
+
def domain
@domain ||= domain_scope.find(params[:domain_id] || params[:id])
end
def record
@record ||= record_scope.find(params[:record_id] || params[:id])
end
+
+ def group_scope
+ @group_scope ||= Group.all
+ end
+
def domain_scope
- @domain_scope ||= Domain.all
+ @domain_scope ||= Domain.where(group: group_scope)
end
def record_scope
@record_scope ||= domain.records
end
end
diff --git a/app/controllers/domains_controller.rb b/app/controllers/domains_controller.rb
index 9c1e02d..35be16b 100644
--- a/app/controllers/domains_controller.rb
+++ b/app/controllers/domains_controller.rb
@@ -1,53 +1,60 @@
class DomainsController < ApplicationController
+ before_action :group_scope
+
before_action :domain, only: [:show, :edit, :update, :destroy]
+ before_action :group, only: [:show, :edit, :update, :destroy]
# GET /domains
def index
@domains = domain_scope.all
end
# GET /domains/1
def show
end
# GET /domains/new
def new
@domain = Domain.new
end
# GET /domains/1/edit
def edit
end
# POST /domains
def create
@domain = Domain.new(domain_params)
if @domain.save
redirect_to @domain, notice: "#{@domain.name} was successfully created."
else
render :new
end
end
# PATCH/PUT /domains/1
def update
if @domain.update(domain_params)
redirect_to @domain, notice: "#{@domain.name} was successfully updated."
else
render :edit
end
end
# DELETE /domains/1
def destroy
@domain.destroy
redirect_to domains_url, notice: "#{@domain.name} was successfully destroyed."
end
private
def domain_params
- params.require(:domain).permit(:name, :type)
+ params.require(:domain).tap { |d|
+ # Make sure group id is permitted (belongs to group_scope)
+ d[:group_id] = group_scope.find_by_id(d[:group_id]).try(:id)
+ }.permit(:name, :type, :group_id)
end
+
end
diff --git a/app/helpers/breadcrumb_helper.rb b/app/helpers/breadcrumb_helper.rb
index d871ac8..7a5a683 100644
--- a/app/helpers/breadcrumb_helper.rb
+++ b/app/helpers/breadcrumb_helper.rb
@@ -1,44 +1,47 @@
module BreadcrumbHelper
# Domain
- # Domain / example.com
- # Domain / example.com / ns1.example.com IN A
- # Domain / example.com / new
+ # Domain / group / example.com
+ # Domain / group / example.com / ns1.example.com IN A
+ # Domain / group / example.com / new
def breadcrumbs(leaf)
stack = []
crumbs = []
stack.push leaf if leaf
while crumb = stack.pop # rubocop:disable Lint/AssignmentInCondition
case crumb
when Record
if crumb.persisted?
crumbs.push(
name: "#{crumb.name} IN #{crumb.type}",
link: domain_record_path(crumb.domain_id, crumb))
else
crumbs.push(name: :new)
end
stack.push crumb.domain
when Domain
if crumb.persisted?
crumbs.push(name: crumb.name, link: domain_path(crumb))
else
crumbs.push(name: :new)
end
+ stack.push crumb.group
+ when Group
+ crumbs.push(name: crumb.name)
end
end
crumbs.push(name: 'Domains', link: '/')
crumbs.reverse!
crumbs.each { |c|
# Last element should not be a link
- if c == crumbs.last
+ if c == crumbs.last || c[:link].nil?
yield c[:name]
else
yield link_to(c[:name], c[:link])
end
}
end
end
diff --git a/app/models/domain.rb b/app/models/domain.rb
index 512f582..cec8552 100644
--- a/app/models/domain.rb
+++ b/app/models/domain.rb
@@ -1,73 +1,75 @@
class Domain < ActiveRecord::Base
self.inheritance_column = :nx
def self.domain_types
[
'NATIVE',
'MASTER',
'SLAVE',
]
end
+ belongs_to :group
has_many :records
has_one :soa, class_name: SOA
+ validates :group_id, presence: true
validates :name, uniqueness: true, presence: true
validates :type, presence: true, inclusion: { in: domain_types }
after_create :generate_soa
attr_writer :serial_strategy
def serial_strategy
@serial_strategy ||= WebDNS.settings[:serial_strategy]
end
def reverse?
name.end_with?('.in-addr.arpa') || name.end_with?('.ip6.arpa')
end
# Compute subnet for reverse records
def subnet
return if not reverse?
if name.end_with?('.in-addr.arpa')
subnet_v4
elsif name.end_with?('.ip6.arpa')
subnet_v6
end
end
private
def subnet_v4
# get ip octets (remove .in-addr.arpa)
octets = name.split('.')[0...-2].reverse
return if octets.any? { |_| false }
mask = 8 * octets.size
octets += [0, 0, 0, 0]
ip = IPAddr.new octets[0, 4].join('.')
[ip, mask].join('/')
end
def subnet_v6
nibbles = name.split('.')[0...-2].reverse
return if nibbles.any? { |_| false }
mask = 4 * nibbles.size
nibbles += [0] * 32
ip = IPAddr.new nibbles[0, 32].in_groups_of(4).map(&:join).join(':')
[ip, mask].join('/')
end
# Hooks
def generate_soa
soa_record = SOA.new(domain: self)
soa_record.save
end
end
diff --git a/app/models/group.rb b/app/models/group.rb
new file mode 100644
index 0000000..e01ea69
--- /dev/null
+++ b/app/models/group.rb
@@ -0,0 +1,5 @@
+class Group < ActiveRecord::Base
+ has_many :domains
+
+ validates :name, presence: true, uniqueness: true
+end
diff --git a/app/views/domains/_form.html.erb b/app/views/domains/_form.html.erb
index 3060adf..30a9cfa 100644
--- a/app/views/domains/_form.html.erb
+++ b/app/views/domains/_form.html.erb
@@ -1,5 +1,6 @@
<%= bootstrap_form_for(@domain, layout: :horizontal, label_col: 'col-sm-2', control_col: 'col-sm-4') do |f| %>
<%= f.text_field :name %>
+ <%= f.collection_select :group_id, @group_scope, :id, :name %>
<%= f.select :type, Domain.domain_types %>
<%= f.submit 'Save', class: 'btn btn-primary col-sm-offset-2' %>
<% end %>
diff --git a/app/views/domains/index.html.erb b/app/views/domains/index.html.erb
index 01071a9..fa9426c 100644
--- a/app/views/domains/index.html.erb
+++ b/app/views/domains/index.html.erb
@@ -1,30 +1,31 @@
<table class="table table-striped">
<thead>
- <tr>
- <th>Domain</th>
- <th>Type</th>
- <th colspan="2">Controls</th>
- </tr>
</thead>
<tbody>
- <% @domains.each do |domain| %>
- <tr>
- <td><%= link_to domain.name, domain %></td>
- <td>
- <% if domain.reverse? %>
- <abbr title="Reverse"><span class="glyphicon glyphicon-chevron-left"></span></abbr>
- <% else %>
- <abbr title="Forward"><span class="glyphicon glyphicon-chevron-right"></span></abbr>
- <% end %>
- </td>
- <td><%= link_to 'Edit', edit_domain_path(domain) %></td>
- <td><%= link_to 'Destroy', domain, method: :delete, data: { confirm: 'Are you sure?' } %></td>
- </tr>
+ <% @domains.group_by(&:group).each do |group, domains| %>
+ <tr>
+ <th colspan="2"><%= group.name %></th>
+ <th colspan="2">Controls</th>
+ </tr>
+ <% domains.each do |domain| %>
+ <tr>
+ <td><%= link_to domain.name, domain %></td>
+ <td>
+ <% if domain.reverse? %>
+ <abbr title="Reverse"><span class="glyphicon glyphicon-chevron-left"></span></abbr>
+ <% else %>
+ <abbr title="Forward"><span class="glyphicon glyphicon-chevron-right"></span></abbr>
+ <% end %>
+ </td>
+ <td><%= link_to 'Edit', edit_domain_path(domain) %></td>
+ <td><%= link_to 'Destroy', domain, method: :delete, data: { confirm: 'Are you sure?' } %></td>
+ </tr>
+ <% end %>
<% end %>
</tbody>
</table>
<p>
<%= link_to 'New Domain &raquo;'.html_safe, new_domain_path, class: 'btn btn-lg btn-primary' %>
</p>
diff --git a/app/views/shared/_breadcrumbs.html.erb b/app/views/shared/_breadcrumbs.html.erb
index 690003b..6d1dd00 100644
--- a/app/views/shared/_breadcrumbs.html.erb
+++ b/app/views/shared/_breadcrumbs.html.erb
@@ -1,5 +1,5 @@
<ol class="breadcrumb">
- <% breadcrumbs(@breadcrumb || @record || @domain) do |crumb| %>
+ <% breadcrumbs(@breadcrumb || @record || @domain || @group) do |crumb| %>
<li><%= crumb %></li>
<% end %>
</ol>
diff --git a/db/migrate/20151031184819_create_groups.rb b/db/migrate/20151031184819_create_groups.rb
new file mode 100644
index 0000000..8841b72
--- /dev/null
+++ b/db/migrate/20151031184819_create_groups.rb
@@ -0,0 +1,14 @@
+class CreateGroups < ActiveRecord::Migration
+ def change
+ create_table :groups do |t|
+ t.string :name
+ t.boolean :disabled, default: false
+
+ t.timestamps
+ end
+ add_index :groups, :name, unique: true
+
+ add_column :domains, :group_id, :integer
+ add_index :domains, :group_id
+ end
+end
diff --git a/db/structure.sql b/db/structure.sql
index 5ea5a9b..daf63aa 100644
--- a/db/structure.sql
+++ b/db/structure.sql
@@ -1,180 +1,202 @@
-- MySQL dump 10.15 Distrib 10.0.20-MariaDB, for debian-linux-gnu (x86_64)
--
-- Host: localhost Database: webns
-- ------------------------------------------------------
-- Server version 10.0.20-MariaDB-3
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
--
-- Table structure for table `comments`
--
DROP TABLE IF EXISTS `comments`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `comments` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`domain_id` int(11) NOT NULL,
`name` varchar(255) NOT NULL,
`type` varchar(10) NOT NULL,
`modified_at` int(11) NOT NULL,
`account` varchar(40) NOT NULL,
`comment` mediumtext NOT NULL,
PRIMARY KEY (`id`),
KEY `comments_domain_id_idx` (`domain_id`),
KEY `comments_name_type_idx` (`name`,`type`),
KEY `comments_order_idx` (`domain_id`,`modified_at`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Table structure for table `cryptokeys`
--
DROP TABLE IF EXISTS `cryptokeys`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `cryptokeys` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`domain_id` int(11) NOT NULL,
`flags` int(11) NOT NULL,
`active` tinyint(1) DEFAULT NULL,
`content` text,
PRIMARY KEY (`id`),
KEY `domainidindex` (`domain_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Table structure for table `domainmetadata`
--
DROP TABLE IF EXISTS `domainmetadata`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `domainmetadata` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`domain_id` int(11) NOT NULL,
`kind` varchar(32) DEFAULT NULL,
`content` text,
PRIMARY KEY (`id`),
KEY `domainmetadata_idx` (`domain_id`,`kind`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Table structure for table `domains`
--
DROP TABLE IF EXISTS `domains`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `domains` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) NOT NULL,
`master` varchar(128) DEFAULT NULL,
`last_check` int(11) DEFAULT NULL,
`type` varchar(6) NOT NULL,
`notified_serial` int(11) DEFAULT NULL,
`account` varchar(40) DEFAULT NULL,
+ `group_id` int(11) DEFAULT NULL,
PRIMARY KEY (`id`),
- UNIQUE KEY `name_index` (`name`)
+ UNIQUE KEY `name_index` (`name`),
+ KEY `index_domains_on_group_id` (`group_id`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `groups`
+--
+
+DROP TABLE IF EXISTS `groups`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `groups` (
+ `id` int(11) NOT NULL AUTO_INCREMENT,
+ `name` varchar(255) DEFAULT NULL,
+ `disabled` tinyint(1) DEFAULT '0',
+ `created_at` datetime DEFAULT NULL,
+ `updated_at` datetime DEFAULT NULL,
+ PRIMARY KEY (`id`),
+ UNIQUE KEY `index_groups_on_name` (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Table structure for table `records`
--
DROP TABLE IF EXISTS `records`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `records` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`domain_id` int(11) DEFAULT NULL,
`name` varchar(255) DEFAULT NULL,
`type` varchar(10) DEFAULT NULL,
`content` mediumtext,
`ttl` int(11) DEFAULT NULL,
`prio` int(11) DEFAULT NULL,
`change_date` int(11) DEFAULT NULL,
`disabled` tinyint(1) DEFAULT '0',
`ordername` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL,
`auth` tinyint(1) DEFAULT '1',
PRIMARY KEY (`id`),
KEY `nametype_index` (`name`,`type`),
KEY `domain_id` (`domain_id`),
KEY `recordorder` (`domain_id`,`ordername`),
CONSTRAINT `records_ibfk_1` FOREIGN KEY (`domain_id`) REFERENCES `domains` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Table structure for table `schema_migrations`
--
DROP TABLE IF EXISTS `schema_migrations`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `schema_migrations` (
`version` varchar(255) NOT NULL,
UNIQUE KEY `unique_schema_migrations` (`version`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Table structure for table `supermasters`
--
DROP TABLE IF EXISTS `supermasters`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `supermasters` (
`ip` varchar(64) NOT NULL,
`nameserver` varchar(255) NOT NULL,
`account` varchar(40) NOT NULL,
PRIMARY KEY (`ip`,`nameserver`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Table structure for table `tsigkeys`
--
DROP TABLE IF EXISTS `tsigkeys`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `tsigkeys` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) DEFAULT NULL,
`algorithm` varchar(50) DEFAULT NULL,
`secret` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `namealgoindex` (`name`,`algorithm`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
/*!40101 SET character_set_client = @saved_cs_client */;
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
--- Dump completed on 2015-10-28 11:37:25
+-- Dump completed on 2015-10-31 20:55:16
INSERT INTO schema_migrations (version) VALUES ('20151028123326');
INSERT INTO schema_migrations (version) VALUES ('20151028123327');
+INSERT INTO schema_migrations (version) VALUES ('20151031184819');
+
diff --git a/test/factories/domain.rb b/test/factories/domain.rb
index aa7eba9..e69573d 100644
--- a/test/factories/domain.rb
+++ b/test/factories/domain.rb
@@ -1,22 +1,24 @@
FactoryGirl.define do
sequence(:domain) { |n| "example#{n}.com" }
factory :domain do
+ group
name { generate(:domain) }
serial_strategy Strategies::Date
type 'NATIVE'
end
factory :date_domain, class: Domain do
+ group
name { generate(:domain) }
serial_strategy Strategies::Date
type 'NATIVE'
end
factory :v4_arpa_domain, parent: :domain do
name '2.0.192.in-addr.arpa'
end
factory :v6_arpa_domain, parent: :domain do
name '8.b.d.0.1.0.0.2.ip6.arpa'
end
end
diff --git a/test/factories/group.rb b/test/factories/group.rb
new file mode 100644
index 0000000..cd92dc8
--- /dev/null
+++ b/test/factories/group.rb
@@ -0,0 +1,5 @@
+FactoryGirl.define do
+ factory :group do
+ sequence(:name) { |n| "group-#{n}" }
+ end
+end
diff --git a/test/models/group_test.rb b/test/models/group_test.rb
new file mode 100644
index 0000000..eb3d7a1
--- /dev/null
+++ b/test/models/group_test.rb
@@ -0,0 +1,14 @@
+require 'test_helper'
+
+class GroupTest < ActiveSupport::TestCase
+
+ setup do
+ @group = build(:group)
+ end
+
+ test 'save' do
+ @group.save
+
+ assert_empty @group.errors
+ end
+end

Event Timeline