concen 0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/app/controllers/concen/application_controller.rb +25 -0
- data/app/controllers/concen/grid_files_controller.rb +75 -0
- data/app/controllers/concen/pages_controller.rb +95 -0
- data/app/controllers/concen/performances_controller.rb +35 -0
- data/app/controllers/concen/sessions_controller.rb +30 -0
- data/app/controllers/concen/statuses_controller.rb +63 -0
- data/app/controllers/concen/traffics_controller.rb +43 -0
- data/app/controllers/concen/users_controller.rb +118 -0
- data/app/controllers/concen/visits_controller.rb +38 -0
- data/app/helpers/concen/application_helper.rb +10 -0
- data/app/helpers/concen/pages_helper.rb +5 -0
- data/app/helpers/concen/visits_helper.rb +4 -0
- data/app/models/concen/grid_file.rb +67 -0
- data/app/models/concen/page.rb +342 -0
- data/app/models/concen/response.rb +45 -0
- data/app/models/concen/user.rb +88 -0
- data/app/models/concen/visit/page.rb +100 -0
- data/app/models/concen/visit/referral.rb +45 -0
- data/app/stylesheets/application.sass +445 -0
- data/app/stylesheets/config.rb +9 -0
- data/app/stylesheets/ie.sass +4 -0
- data/app/stylesheets/non_ios.sass +16 -0
- data/app/stylesheets/partials/_base.sass +92 -0
- data/app/stylesheets/partials/_fileuploader.sass +75 -0
- data/app/stylesheets/partials/_flot.sass +8 -0
- data/app/stylesheets/partials/_form.sass +74 -0
- data/app/stylesheets/partials/_mixins.sass +8 -0
- data/app/stylesheets/partials/_variables.sass +17 -0
- data/app/stylesheets/print.sass +4 -0
- data/app/views/concen/grid_files/_form.html.haml +15 -0
- data/app/views/concen/grid_files/edit.html.haml +9 -0
- data/app/views/concen/pages/_file_list.haml +7 -0
- data/app/views/concen/pages/_files.haml +24 -0
- data/app/views/concen/pages/_form.html.haml +18 -0
- data/app/views/concen/pages/_nested_list.html.haml +15 -0
- data/app/views/concen/pages/edit.html.haml +15 -0
- data/app/views/concen/pages/index.html.haml +9 -0
- data/app/views/concen/pages/new.html.haml +9 -0
- data/app/views/concen/performances/_runtimes.html.haml +5 -0
- data/app/views/concen/performances/show.html.haml +30 -0
- data/app/views/concen/sessions/new.html.haml +12 -0
- data/app/views/concen/statuses/_server.html.haml +19 -0
- data/app/views/concen/statuses/show.html.haml +18 -0
- data/app/views/concen/traffics/_pages.html.haml +5 -0
- data/app/views/concen/traffics/_referrals.html.haml +9 -0
- data/app/views/concen/traffics/show.html.haml +30 -0
- data/app/views/concen/users/_form.html.haml +29 -0
- data/app/views/concen/users/_password_reset.html.haml +0 -0
- data/app/views/concen/users/_settings.html.haml +15 -0
- data/app/views/concen/users/edit.html.haml +9 -0
- data/app/views/concen/users/index.html.haml +32 -0
- data/app/views/concen/users/new.html.haml +4 -0
- data/app/views/concen/users/new_invite.html.haml +15 -0
- data/app/views/concen/users/new_reset_password.html.haml +15 -0
- data/app/views/concen/visits/visit_recorder_js.erb +13 -0
- data/app/views/layouts/concen/_additional_header_links.haml +0 -0
- data/app/views/layouts/concen/_header.html.haml +18 -0
- data/app/views/layouts/concen/_iphone.html.haml +6 -0
- data/app/views/layouts/concen/application.html.haml +48 -0
- data/app/views/layouts/concen/maintenance.html.haml +0 -0
- data/config/routes.rb +64 -0
- data/lib/concen.rb +11 -0
- data/lib/concen/engine.rb +14 -0
- data/lib/concen/railties/page.rake +12 -0
- data/lib/concen/railties/setup.rake +23 -0
- data/lib/concen/version.rb +3 -0
- metadata +246 -0
@@ -0,0 +1,9 @@
|
|
1
|
+
- content_for :head_javascripts do
|
2
|
+
= javascript_include_tag "/concen/javascripts/ace/ace.js"
|
3
|
+
= javascript_include_tag "/concen/javascripts/fileuploader.js"
|
4
|
+
= javascript_include_tag "/concen/javascripts/page.js"
|
5
|
+
|
6
|
+
#content
|
7
|
+
%h1 New Page
|
8
|
+
.clearfix
|
9
|
+
= render "form"
|
@@ -0,0 +1,30 @@
|
|
1
|
+
- content_for :head_javascripts do
|
2
|
+
/[if lte IE 8]
|
3
|
+
= javascript_include_tag "/concen/javascripts/excanvas.js"
|
4
|
+
= javascript_include_tag "/concen/javascripts/jquery.flot.js"
|
5
|
+
= javascript_include_tag "/concen/javascripts/jquery.flot.stack.js"
|
6
|
+
= javascript_include_tag "/concen/javascripts/jquery.flot.resize.js"
|
7
|
+
= javascript_include_tag "/concen/javascripts/performance.js"
|
8
|
+
|
9
|
+
#content
|
10
|
+
.panels
|
11
|
+
.panel.wide
|
12
|
+
.border
|
13
|
+
%h3 Responses in Past Hour
|
14
|
+
.graph
|
15
|
+
#recent-responses{:style => "width: 100%; height: 200px;"}
|
16
|
+
|
17
|
+
.panels
|
18
|
+
.panel.total-runtime
|
19
|
+
.border
|
20
|
+
%h3 Average Total Runtime
|
21
|
+
%ul
|
22
|
+
.panel.view-runtime
|
23
|
+
.border
|
24
|
+
%h3 Average View Runtime
|
25
|
+
%ul
|
26
|
+
.panel.mongodb-runtime.edge
|
27
|
+
.border
|
28
|
+
%h3 Average MongoDB Runtime
|
29
|
+
%ul
|
30
|
+
.clear
|
@@ -0,0 +1,12 @@
|
|
1
|
+
#content
|
2
|
+
%h1 Sign In
|
3
|
+
= form_tag concen_sessions_path do
|
4
|
+
.field
|
5
|
+
= label_tag :username
|
6
|
+
= text_field_tag :username, params[:username]
|
7
|
+
.field
|
8
|
+
= label_tag :password
|
9
|
+
= password_field_tag :password, params[:password]
|
10
|
+
.actions
|
11
|
+
= submit_tag "Sign In"
|
12
|
+
= link_to "Reset Password", new_reset_password_concen_users_path
|
@@ -0,0 +1,19 @@
|
|
1
|
+
%ul
|
2
|
+
%li
|
3
|
+
%p Uptime
|
4
|
+
%p.right= @server_stats[:uptime] if @server_stats
|
5
|
+
%li
|
6
|
+
%p Processor
|
7
|
+
%p.right= "#{@server_stats[:processor][:user]}% user, #{@server_stats[:processor][:sys]}% sys, #{@server_stats[:processor][:idle]}% idle" if @server_stats[:processor].present?
|
8
|
+
%li
|
9
|
+
%p Memory
|
10
|
+
%p.right= "#{@server_stats[:memory][:used]} MB used, #{@server_stats[:memory][:free]} MB free" if @server_stats[:memory].present?
|
11
|
+
%li
|
12
|
+
%p MongoDB Data Size
|
13
|
+
%p.right= number_to_human_size(@mongodb_stats["dataSize"])
|
14
|
+
%li
|
15
|
+
%p MongoDB Index Size
|
16
|
+
%p.right= number_to_human_size(@mongodb_stats["indexSize"])
|
17
|
+
%li
|
18
|
+
%p MongoDB GridFS Size
|
19
|
+
%p.right= number_to_human_size(@mongodb_grid_fs_stats)
|
@@ -0,0 +1,18 @@
|
|
1
|
+
- content_for :head_javascripts do
|
2
|
+
= javascript_include_tag "/concen/javascripts/status.js"
|
3
|
+
|
4
|
+
#content
|
5
|
+
.panels
|
6
|
+
.panel.pages
|
7
|
+
.border
|
8
|
+
%h3 Pages
|
9
|
+
%p.big-number
|
10
|
+
.panel.users
|
11
|
+
.border
|
12
|
+
%h3 Users
|
13
|
+
%p.big-number
|
14
|
+
.panel.server.edge
|
15
|
+
.border
|
16
|
+
%h3 Server
|
17
|
+
%ul
|
18
|
+
.clear
|
@@ -0,0 +1,30 @@
|
|
1
|
+
- content_for :head_javascripts do
|
2
|
+
/[if lte IE 8]
|
3
|
+
= javascript_include_tag "/concen/javascripts/excanvas.js"
|
4
|
+
= javascript_include_tag "/concen/javascripts/jquery.flot.js"
|
5
|
+
= javascript_include_tag "/concen/javascripts/jquery.flot.stack.js"
|
6
|
+
= javascript_include_tag "/concen/javascripts/jquery.flot.resize.js"
|
7
|
+
= javascript_include_tag "/concen/javascripts/traffic.js"
|
8
|
+
|
9
|
+
#content
|
10
|
+
.panels
|
11
|
+
.panel.wide
|
12
|
+
.border
|
13
|
+
%h3 Visits in Past 24 Hours
|
14
|
+
.graph
|
15
|
+
#recent-visits{:style => "width: 100%; height: 200px;"}
|
16
|
+
|
17
|
+
.panels
|
18
|
+
.panel.visits-1-hour
|
19
|
+
.border
|
20
|
+
%h3 Visits in Past Hour
|
21
|
+
%p.big-number
|
22
|
+
.panel.pages
|
23
|
+
.border
|
24
|
+
%h3 Pages
|
25
|
+
%ul
|
26
|
+
.panel.referrals.edge
|
27
|
+
.border
|
28
|
+
%h3 Referrals
|
29
|
+
%ul
|
30
|
+
.clear
|
@@ -0,0 +1,29 @@
|
|
1
|
+
= form_for @user do |f|
|
2
|
+
- if @user.errors.any?
|
3
|
+
#errorExplanation
|
4
|
+
%h3= "#{pluralize(@user.errors.count, "error")} prohibited this parent from being saved:"
|
5
|
+
%ul
|
6
|
+
- @user.errors.full_messages.each do |msg|
|
7
|
+
%li= msg
|
8
|
+
- if @user.invitation_token
|
9
|
+
= f.hidden_field :invitation_token
|
10
|
+
.field
|
11
|
+
= f.label :full_name
|
12
|
+
= f.text_field :full_name
|
13
|
+
.field
|
14
|
+
= f.label :username
|
15
|
+
= f.text_field :username
|
16
|
+
.field
|
17
|
+
= f.label :email
|
18
|
+
= f.text_field :email
|
19
|
+
.field
|
20
|
+
= f.label :password
|
21
|
+
= f.password_field :password
|
22
|
+
.field
|
23
|
+
= f.label :password_confirmation
|
24
|
+
= f.password_field :password_confirmation
|
25
|
+
.actions
|
26
|
+
= f.submit "Save"
|
27
|
+
- if @user.persisted?
|
28
|
+
= link_to "Delete", concen_page_path(@user), :method => :delete
|
29
|
+
= link_to "Cancel", concen_pages_path
|
File without changes
|
@@ -0,0 +1,15 @@
|
|
1
|
+
= form_for @user do |f|
|
2
|
+
- if @user.errors.any?
|
3
|
+
#errorExplanation
|
4
|
+
%h3= "#{pluralize(@user.errors.count, "error")} prohibited this parent from being saved:"
|
5
|
+
%ul
|
6
|
+
- @user.errors.full_messages.each do |msg|
|
7
|
+
%li= msg
|
8
|
+
.field
|
9
|
+
= f.label :current_password, "Current Password"
|
10
|
+
= f.password_field :current_password
|
11
|
+
.field
|
12
|
+
= f.label :password, "New Password"
|
13
|
+
= f.password_field :password
|
14
|
+
.actions
|
15
|
+
= f.submit "Update"
|
@@ -0,0 +1,9 @@
|
|
1
|
+
#content
|
2
|
+
%h1 Edit User Settings
|
3
|
+
.clearfix
|
4
|
+
- if params.try(:[], :invitation_token) || params.try(:[], :concen_user).try(:[], :invitation_token)
|
5
|
+
= render "form"
|
6
|
+
- elsif params.try(:[], :password_reset_token) || params.try(:[], :concen_user).try(:[], :password_reset_token)
|
7
|
+
= render "password_reset"
|
8
|
+
- else
|
9
|
+
= render "settings"
|
@@ -0,0 +1,32 @@
|
|
1
|
+
- content_for :head_javascripts do
|
2
|
+
= javascript_include_tag "/concen/javascripts/user.js"
|
3
|
+
|
4
|
+
#content
|
5
|
+
%h1
|
6
|
+
= one_line do
|
7
|
+
%span Users
|
8
|
+
= link_to "Invite New User", new_invite_concen_users_path, :class => "link-button"
|
9
|
+
.border
|
10
|
+
%table.users
|
11
|
+
%thead
|
12
|
+
%tr
|
13
|
+
%th Username
|
14
|
+
%th Full Name
|
15
|
+
%th Email
|
16
|
+
%th Sign Up On
|
17
|
+
%th Pages
|
18
|
+
%th Full Control
|
19
|
+
- if current_concen_user.full_control
|
20
|
+
%th Actions
|
21
|
+
%tbody
|
22
|
+
- for user in @users
|
23
|
+
%tr
|
24
|
+
%td= user.username
|
25
|
+
%td= user.full_name
|
26
|
+
%td= user.email
|
27
|
+
%td= user.created_at.strftime("%d %B %Y")
|
28
|
+
%td= Concen::Page.where(:authors.in => [user.username, user.full_name, user.email]).count
|
29
|
+
%td= check_box_tag "full_control", 1, user.full_control, "data-path" => toggle_attribute_concen_user_path(user), :disabled => user == current_concen_user || !current_concen_user.full_control
|
30
|
+
- if current_concen_user.full_control
|
31
|
+
%td
|
32
|
+
= link_to "Delete", concen_user_path(user), :method => :delete, :confirm => "Are you sure?"
|
@@ -0,0 +1,15 @@
|
|
1
|
+
#content
|
2
|
+
%h1 Send Invitation
|
3
|
+
.clearfix
|
4
|
+
= form_for @user, :url => invite_concen_users_path do |f|
|
5
|
+
- if @user.errors.any?
|
6
|
+
#errorExplanation
|
7
|
+
%h3= "#{pluralize(@user.errors.count, "error")} prohibited this parent from being saved:"
|
8
|
+
%ul
|
9
|
+
- @user.errors.full_messages.each do |msg|
|
10
|
+
%li= msg
|
11
|
+
.field
|
12
|
+
= f.label :email
|
13
|
+
= f.text_field :email
|
14
|
+
.actions
|
15
|
+
= f.submit "Invite"
|
@@ -0,0 +1,15 @@
|
|
1
|
+
#content
|
2
|
+
%h1 Reset Password
|
3
|
+
.clearfix
|
4
|
+
= form_for @user, :url => reset_password_concen_users_path do |f|
|
5
|
+
- if @user.errors.any?
|
6
|
+
#errorExplanation
|
7
|
+
%h3= "#{pluralize(@user.errors.count, "error")} prohibited this parent from being saved:"
|
8
|
+
%ul
|
9
|
+
- @user.errors.full_messages.each do |msg|
|
10
|
+
%li= msg
|
11
|
+
.field
|
12
|
+
= f.label :email
|
13
|
+
= f.text_field :email
|
14
|
+
.actions
|
15
|
+
= f.submit "Send"
|
@@ -0,0 +1,13 @@
|
|
1
|
+
VisitRecorder = {};
|
2
|
+
VisitRecorder.record = function(data) {
|
3
|
+
var date = new Date();
|
4
|
+
data.u = document.location.href;
|
5
|
+
// data.w = screen.width
|
6
|
+
// data.h = screen.height
|
7
|
+
data.t = document.title
|
8
|
+
data.n = date.getTime();
|
9
|
+
if(document.referrer && document.referrer != "") {
|
10
|
+
data.r = document.referrer;
|
11
|
+
}
|
12
|
+
$("body").append("<img class='visit-recorder' src='<%= record_visit_path %>?" + jQuery.param(data) + "' style='display:none;' />");
|
13
|
+
};
|
File without changes
|
@@ -0,0 +1,18 @@
|
|
1
|
+
%header
|
2
|
+
%h1
|
3
|
+
%a{:href => "/"}
|
4
|
+
%span.engine-name Concen
|
5
|
+
%span.application-name= Concen.application_name
|
6
|
+
%nav
|
7
|
+
%ul
|
8
|
+
- if current_concen_user
|
9
|
+
%li= link_to "Status", concen_status_path
|
10
|
+
%li= link_to "Traffic", concen_traffic_path
|
11
|
+
%li= link_to "Performance", concen_performance_path
|
12
|
+
%li= link_to "Pages", concen_pages_path
|
13
|
+
%li= link_to "Users", concen_users_path
|
14
|
+
= render "layouts/concen/additional_header_links"
|
15
|
+
%li= link_to "Settings", edit_concen_user_path(current_concen_user)
|
16
|
+
%li= link_to "Sign Out", concen_signout_path
|
17
|
+
- else
|
18
|
+
%li= link_to "Sign In", concen_signin_path
|
@@ -0,0 +1,48 @@
|
|
1
|
+
!!! 5
|
2
|
+
%html.no-js{:lang => "en"}
|
3
|
+
%head
|
4
|
+
%meta{:charset => "utf-8"}
|
5
|
+
%title= "#{@page_title + ' - ' if @page_title}Concen - #{Concen.application_name}"
|
6
|
+
%meta{:name => "description", :content => "Web application to control and monitor a website."}
|
7
|
+
%meta{:name => "author", :content => "Steve Randy Tantra"}
|
8
|
+
%meta{:name => "copyright", :content => "Copyright © 2011 by Steve Randy Tantra"}
|
9
|
+
%meta{:name => "DC.title", :content => "#{@page_title + ' - ' if @page_title}Control Center - #{Concen.application_name}"}
|
10
|
+
%meta{:name => "DC.subject", :content => "Control, Monitor, Center, Web Application"}
|
11
|
+
%meta{:name => "DC.creator", :content => "Steve Randy Tantra"}
|
12
|
+
%meta{:name => "viewport", :content => "width = 1024"}
|
13
|
+
%meta{"http-equiv" => "X-UA-Compatible", :content => "IE=edge"}
|
14
|
+
= csrf_meta_tag
|
15
|
+
= stylesheet_link_tag "/concen/stylesheets/application.css"
|
16
|
+
= stylesheet_link_tag "/concen/stylesheets/jquery.ui.resizable.css"
|
17
|
+
- if content_for?(:head_stylesheets)
|
18
|
+
= yield :head_stylesheets
|
19
|
+
/[if lt IE 8]
|
20
|
+
= stylesheet_link_tag "/concen/stylesheets/ie.css"
|
21
|
+
%script{:type => "text/javascript", :src => "http://use.typekit.com/#{Concen.typekit_id}.js"}
|
22
|
+
%script{:type => "text/javascript"} try{Typekit.load();}catch(e){}
|
23
|
+
- if Rails.env == "production"
|
24
|
+
= javascript_include_tag "//cdnjs.cloudflare.com/ajax/libs/modernizr/2.0.6/modernizr.min.js"
|
25
|
+
= javascript_include_tag "//cdnjs.cloudflare.com/ajax/libs/jquery/1.6.2/jquery.min.js"
|
26
|
+
- else
|
27
|
+
= javascript_include_tag "/concen/javascripts/modernizr.js", "/concen/javascripts/jquery.js"
|
28
|
+
= javascript_include_tag "/concen/javascripts/jquery-ui/jquery.ui.core.js"
|
29
|
+
= javascript_include_tag "/concen/javascripts/jquery-ui/jquery.ui.widget.js"
|
30
|
+
= javascript_include_tag "/concen/javascripts/jquery-ui/jquery.ui.mouse.js"
|
31
|
+
= javascript_include_tag "/concen/javascripts/jquery-ui/jquery.ui.position.js"
|
32
|
+
= javascript_include_tag "/concen/javascripts/jquery-ui/jquery.ui.sortable.js"
|
33
|
+
= javascript_include_tag "/concen/javascripts/jquery-ui/jquery.ui.resizable.js"
|
34
|
+
= javascript_include_tag "/concen/javascripts/jquery-ui/jquery.ui.draggable.js"
|
35
|
+
= javascript_include_tag "/concen/javascripts/jquery-ui/jquery.ui.droppable.js"
|
36
|
+
= javascript_include_tag "/concen/javascripts/jquery.ui.nestedSortable.js"
|
37
|
+
= javascript_include_tag "/concen/javascripts/jquery_ujs.js"
|
38
|
+
- if content_for?(:head_javascripts)
|
39
|
+
= yield :head_javascripts
|
40
|
+
- if content_for?(:head)
|
41
|
+
= yield :head
|
42
|
+
%body.concen
|
43
|
+
= render "layouts/concen/header"
|
44
|
+
= yield
|
45
|
+
%footer.clearfix
|
46
|
+
%p
|
47
|
+
%span Created by
|
48
|
+
= link_to "Steve Randy Tantra", "http://steverandytantra.com/"
|
File without changes
|
data/config/routes.rb
ADDED
@@ -0,0 +1,64 @@
|
|
1
|
+
require "rack/gridfs"
|
2
|
+
|
3
|
+
# Use Rails.application.routes.prepend on Rails 3.1.
|
4
|
+
Rails.application.routes.draw do
|
5
|
+
match "/visits/record.gif" => "concen/visits#record", :as => "record_visit"
|
6
|
+
match "/visits/js" => "concen/visits#visit_recorder_js", :as => "visit_recorder_js"
|
7
|
+
mount Rack::GridFS::Endpoint.new(:db => Mongoid.database, :lookup => :path, :expires => 315360000), :at => "gridfs"
|
8
|
+
|
9
|
+
scope :constraints => {:subdomain => "concen"}, :module => "concen", :as => "concen" do
|
10
|
+
get "signout" => "sessions#destroy", :as => "signout"
|
11
|
+
get "signin" => "sessions#new", :as => "signin"
|
12
|
+
get "signup" => "users#new", :as => "signup"
|
13
|
+
|
14
|
+
resources :users do
|
15
|
+
collection do
|
16
|
+
get :new_invite
|
17
|
+
post :invite
|
18
|
+
get :new_reset_password
|
19
|
+
post :reset_password
|
20
|
+
end
|
21
|
+
member do
|
22
|
+
put :toggle_attribute
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
resources :sessions
|
27
|
+
|
28
|
+
resource :status do
|
29
|
+
member do
|
30
|
+
get :server
|
31
|
+
get :counts
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
resource :traffic do
|
36
|
+
member do
|
37
|
+
get :visits_counts
|
38
|
+
get :pages
|
39
|
+
get :referrals
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
resource :performance do
|
44
|
+
member do
|
45
|
+
get :responses
|
46
|
+
get :runtimes
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
resources :pages do
|
51
|
+
collection do
|
52
|
+
put :sort
|
53
|
+
end
|
54
|
+
|
55
|
+
resources :grid_files do
|
56
|
+
collection do
|
57
|
+
post :upload
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
root :to => "statuses#show"
|
63
|
+
end
|
64
|
+
end
|