├── log └── .keep ├── app ├── mailers │ └── .keep ├── models │ ├── .keep │ ├── concerns │ │ └── .keep │ ├── command.rb │ ├── http_request.rb │ ├── honeypot.rb │ ├── login_count.rb │ └── login.rb ├── assets │ ├── images │ │ └── .keep │ ├── stylesheets │ │ ├── logins.scss │ │ ├── api │ │ │ ├── logins.scss │ │ │ ├── commands.scss │ │ │ └── http_request.scss │ │ ├── http_request.scss │ │ ├── modern-business.css │ │ ├── application.css.scss │ │ └── 1st_load_framework.css.scss │ └── javascripts │ │ ├── api │ │ ├── logins.coffee │ │ ├── commands.coffee │ │ └── http_request.coffee │ │ ├── logins.coffee │ │ ├── http_request.coffee │ │ └── application.js ├── controllers │ ├── concerns │ │ └── .keep │ ├── application_controller.rb │ ├── api │ │ ├── commands_controller.rb │ │ ├── logins_controller.rb │ │ └── http_requests_controller.rb │ ├── http_requests_controller.rb │ ├── home_controller.rb │ └── logins_controller.rb ├── helpers │ ├── logins_helper.rb │ ├── api │ │ ├── commands_helper.rb │ │ ├── logins_helper.rb │ │ └── http_request_helper.rb │ ├── application_helper.rb │ └── http_request_helper.rb └── views │ ├── commands │ └── _list.html.slim │ ├── api │ └── http_request │ │ └── create.html.slim │ ├── layouts │ ├── _navigation_links.html.slim │ ├── _footer.html.erb │ ├── _messages.html.slim │ ├── _navigation.html.slim │ └── application.html.slim │ ├── honeypots │ └── _list.html.slim │ ├── logins │ ├── index.html.slim │ ├── _latest_sessions.html.slim │ ├── _list.html.slim │ └── _latest.html.slim │ ├── http_requests │ ├── index.html.slim │ ├── _latest.html.slim │ ├── _list.html.slim │ └── show.html.slim │ ├── login_counter │ └── _top.html.slim │ ├── home │ └── index.html.slim │ └── pages │ ├── full-width.html.erb │ ├── sidebar.html.erb │ ├── 404.html.erb │ ├── pricing.html.erb │ ├── portfolio-item.html.erb │ ├── contact.html.erb │ ├── blog-home-2.html.erb │ ├── portfolio-4-col.html.erb │ ├── portfolio-2-col.html.erb │ ├── portfolio-1-col.html.erb │ ├── portfolio-3-col.html.erb │ ├── blog-home-1.html.erb │ ├── blog-post.html.erb │ ├── about.html.erb │ ├── faq.html.erb │ └── services.html.erb ├── lib ├── assets │ └── .keep ├── tasks │ └── .keep └── templates │ └── slim │ └── scaffold │ └── _form.html.slim ├── public ├── favicon.ico ├── humans.txt ├── 500.html ├── 422.html └── 404.html ├── test ├── helpers │ └── .keep ├── mailers │ └── .keep ├── models │ ├── .keep │ ├── login_test.rb │ ├── command_test.rb │ ├── honeypot_test.rb │ ├── login_count_test.rb │ └── http_request_test.rb ├── controllers │ ├── .keep │ ├── api │ │ ├── logins_controller_test.rb │ │ ├── commands_controller_test.rb │ │ └── http_request_controller_test.rb │ ├── logins_controller_test.rb │ └── http_request_controller_test.rb ├── fixtures │ ├── .keep │ ├── login_counts.yml │ ├── commands.yml │ ├── honeypots.yml │ ├── http_requests.yml │ └── logins.yml ├── integration │ └── .keep └── test_helper.rb ├── .ruby-gemset ├── .ruby-version ├── tmp └── pids │ └── server.pid ├── .bundle └── config ├── vendor └── assets │ ├── javascripts │ └── .keep │ └── stylesheets │ └── .keep ├── .gitignore ├── GeoIP.dat ├── bin ├── bundle ├── rake ├── rails ├── spring └── setup ├── config ├── boot.rb ├── initializers │ ├── cookies_serializer.rb │ ├── session_store.rb │ ├── mime_types.rb │ ├── filter_parameter_logging.rb │ ├── backtrace_silencers.rb │ ├── assets.rb │ ├── wrap_parameters.rb │ ├── inflections.rb │ ├── simple_form_bootstrap.rb │ └── simple_form.rb ├── environment.rb ├── routes.rb ├── locales │ ├── en.yml │ └── simple_form.en.yml ├── secrets.yml ├── application.rb ├── deploy.rb ├── deploy │ ├── production.rb │ └── staging.rb ├── environments │ ├── development.rb │ ├── test.rb │ └── production.rb └── database.yml ├── db ├── migrate │ ├── 20160502024147_add_index_commands.rb │ ├── 20160514022534_add_response_to_http_requests.rb │ ├── 20160501154728_create_commands.rb │ ├── 20160501231739_add_geo_to_logins.rb │ ├── 20160501172103_create_login_counts.rb │ ├── 20160503020704_create_honeypots.rb │ ├── 20160505025835_create_http_requests.rb │ └── 20160501154727_create_logins.rb ├── seeds.rb └── schema.rb ├── config.ru ├── Rakefile ├── Capfile ├── Gemfile ├── README.md ├── README └── Gemfile.lock /log/.keep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /app/mailers/.keep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /app/models/.keep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /lib/assets/.keep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /lib/tasks/.keep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /public/favicon.ico: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /test/helpers/.keep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /test/mailers/.keep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /test/models/.keep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /.ruby-gemset: -------------------------------------------------------------------------------- 1 | sshpot 2 | -------------------------------------------------------------------------------- /.ruby-version: -------------------------------------------------------------------------------- 1 | 2.3.0 2 | -------------------------------------------------------------------------------- /app/assets/images/.keep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /test/controllers/.keep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /test/fixtures/.keep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /test/integration/.keep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /tmp/pids/server.pid: -------------------------------------------------------------------------------- 1 | 882 -------------------------------------------------------------------------------- /.bundle/config: -------------------------------------------------------------------------------- 1 | --- {} 2 | -------------------------------------------------------------------------------- /app/models/concerns/.keep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /app/controllers/concerns/.keep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /vendor/assets/javascripts/.keep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /vendor/assets/stylesheets/.keep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | sshd_honey_web 2 | gin-bin 3 | tmp 4 | log 5 | -------------------------------------------------------------------------------- /app/helpers/logins_helper.rb: -------------------------------------------------------------------------------- 1 | module LoginsHelper 2 | end 3 | -------------------------------------------------------------------------------- /app/helpers/api/commands_helper.rb: -------------------------------------------------------------------------------- 1 | module Api::CommandsHelper 2 | end 3 | -------------------------------------------------------------------------------- /app/helpers/api/logins_helper.rb: -------------------------------------------------------------------------------- 1 | module Api::LoginsHelper 2 | end 3 | -------------------------------------------------------------------------------- /app/helpers/application_helper.rb: -------------------------------------------------------------------------------- 1 | module ApplicationHelper 2 | end 3 | -------------------------------------------------------------------------------- /app/helpers/http_request_helper.rb: -------------------------------------------------------------------------------- 1 | module HttpRequestHelper 2 | end 3 | -------------------------------------------------------------------------------- /GeoIP.dat: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joshrendek/sshpot-com/HEAD/GeoIP.dat -------------------------------------------------------------------------------- /app/helpers/api/http_request_helper.rb: -------------------------------------------------------------------------------- 1 | module Api::HttpRequestHelper 2 | end 3 | -------------------------------------------------------------------------------- /app/views/commands/_list.html.slim: -------------------------------------------------------------------------------- 1 | pre 2 | = commands.where.not(command: '').pluck(:command).join("\n") 3 | -------------------------------------------------------------------------------- /app/views/api/http_request/create.html.slim: -------------------------------------------------------------------------------- 1 | h1 Api::HttpRequest#create 2 | p Find me in app/views/api/http_request/create.html.slim 3 | -------------------------------------------------------------------------------- /app/views/layouts/_navigation_links.html.slim: -------------------------------------------------------------------------------- 1 | li 2 | = link_to 'Logins', logins_path 3 | li 4 | = link_to 'Proxy Requests', http_requests_path 5 | -------------------------------------------------------------------------------- /bin/bundle: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env ruby 2 | ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../Gemfile', __FILE__) 3 | load Gem.bin_path('bundler', 'bundle') 4 | -------------------------------------------------------------------------------- /config/boot.rb: -------------------------------------------------------------------------------- 1 | ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../Gemfile', __FILE__) 2 | 3 | require 'bundler/setup' # Set up gems listed in the Gemfile. 4 | -------------------------------------------------------------------------------- /db/migrate/20160502024147_add_index_commands.rb: -------------------------------------------------------------------------------- 1 | class AddIndexCommands < ActiveRecord::Migration 2 | def change 3 | add_index :commands, :command 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /test/models/login_test.rb: -------------------------------------------------------------------------------- 1 | require 'test_helper' 2 | 3 | class LoginTest < ActiveSupport::TestCase 4 | # test "the truth" do 5 | # assert true 6 | # end 7 | end 8 | -------------------------------------------------------------------------------- /config.ru: -------------------------------------------------------------------------------- 1 | # This file is used by Rack-based servers to start the application. 2 | 3 | require ::File.expand_path('../config/environment', __FILE__) 4 | run Rails.application 5 | -------------------------------------------------------------------------------- /test/models/command_test.rb: -------------------------------------------------------------------------------- 1 | require 'test_helper' 2 | 3 | class CommandTest < ActiveSupport::TestCase 4 | # test "the truth" do 5 | # assert true 6 | # end 7 | end 8 | -------------------------------------------------------------------------------- /test/models/honeypot_test.rb: -------------------------------------------------------------------------------- 1 | require 'test_helper' 2 | 3 | class HoneypotTest < ActiveSupport::TestCase 4 | # test "the truth" do 5 | # assert true 6 | # end 7 | end 8 | -------------------------------------------------------------------------------- /config/initializers/cookies_serializer.rb: -------------------------------------------------------------------------------- 1 | # Be sure to restart your server when you modify this file. 2 | 3 | Rails.application.config.action_dispatch.cookies_serializer = :json 4 | -------------------------------------------------------------------------------- /test/models/login_count_test.rb: -------------------------------------------------------------------------------- 1 | require 'test_helper' 2 | 3 | class LoginCountTest < ActiveSupport::TestCase 4 | # test "the truth" do 5 | # assert true 6 | # end 7 | end 8 | -------------------------------------------------------------------------------- /config/initializers/session_store.rb: -------------------------------------------------------------------------------- 1 | # Be sure to restart your server when you modify this file. 2 | 3 | Rails.application.config.session_store :cookie_store, key: '_sshpot_session' 4 | -------------------------------------------------------------------------------- /test/models/http_request_test.rb: -------------------------------------------------------------------------------- 1 | require 'test_helper' 2 | 3 | class HttpRequestTest < ActiveSupport::TestCase 4 | # test "the truth" do 5 | # assert true 6 | # end 7 | end 8 | -------------------------------------------------------------------------------- /config/environment.rb: -------------------------------------------------------------------------------- 1 | # Load the Rails application. 2 | require File.expand_path('../application', __FILE__) 3 | 4 | # Initialize the Rails application. 5 | Rails.application.initialize! 6 | -------------------------------------------------------------------------------- /app/models/command.rb: -------------------------------------------------------------------------------- 1 | class Command < ActiveRecord::Base 2 | belongs_to :login, foreign_key: 'guid', primary_key: 'guid' 3 | 4 | def self.latest 5 | order(id: :desc).limit(25) 6 | end 7 | end 8 | -------------------------------------------------------------------------------- /config/initializers/mime_types.rb: -------------------------------------------------------------------------------- 1 | # Be sure to restart your server when you modify this file. 2 | 3 | # Add new mime types for use in respond_to blocks: 4 | # Mime::Type.register "text/richtext", :rtf 5 | -------------------------------------------------------------------------------- /db/migrate/20160514022534_add_response_to_http_requests.rb: -------------------------------------------------------------------------------- 1 | class AddResponseToHttpRequests < ActiveRecord::Migration 2 | def change 3 | add_column :http_requests, :response, :string 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /test/controllers/api/logins_controller_test.rb: -------------------------------------------------------------------------------- 1 | require 'test_helper' 2 | 3 | class Api::LoginsControllerTest < ActionController::TestCase 4 | # test "the truth" do 5 | # assert true 6 | # end 7 | end 8 | -------------------------------------------------------------------------------- /test/fixtures/login_counts.yml: -------------------------------------------------------------------------------- 1 | # Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html 2 | 3 | one: 4 | ip: 5 | count: 1 6 | 7 | two: 8 | ip: 9 | count: 1 10 | -------------------------------------------------------------------------------- /test/controllers/api/commands_controller_test.rb: -------------------------------------------------------------------------------- 1 | require 'test_helper' 2 | 3 | class Api::CommandsControllerTest < ActionController::TestCase 4 | # test "the truth" do 5 | # assert true 6 | # end 7 | end 8 | -------------------------------------------------------------------------------- /app/assets/stylesheets/logins.scss: -------------------------------------------------------------------------------- 1 | // Place all the styles related to the logins controller here. 2 | // They will automatically be included in application.css. 3 | // You can use Sass (SCSS) here: http://sass-lang.com/ 4 | -------------------------------------------------------------------------------- /app/assets/stylesheets/api/logins.scss: -------------------------------------------------------------------------------- 1 | // Place all the styles related to the Api::Logins controller here. 2 | // They will automatically be included in application.css. 3 | // You can use Sass (SCSS) here: http://sass-lang.com/ 4 | -------------------------------------------------------------------------------- /app/assets/stylesheets/api/commands.scss: -------------------------------------------------------------------------------- 1 | // Place all the styles related to the Api::Commands controller here. 2 | // They will automatically be included in application.css. 3 | // You can use Sass (SCSS) here: http://sass-lang.com/ 4 | -------------------------------------------------------------------------------- /app/assets/stylesheets/http_request.scss: -------------------------------------------------------------------------------- 1 | // Place all the styles related to the HttpRequest controller here. 2 | // They will automatically be included in application.css. 3 | // You can use Sass (SCSS) here: http://sass-lang.com/ 4 | -------------------------------------------------------------------------------- /app/assets/stylesheets/api/http_request.scss: -------------------------------------------------------------------------------- 1 | // Place all the styles related to the Api::HttpRequest controller here. 2 | // They will automatically be included in application.css. 3 | // You can use Sass (SCSS) here: http://sass-lang.com/ 4 | -------------------------------------------------------------------------------- /test/controllers/logins_controller_test.rb: -------------------------------------------------------------------------------- 1 | require 'test_helper' 2 | 3 | class LoginsControllerTest < ActionController::TestCase 4 | test "should get index" do 5 | get :index 6 | assert_response :success 7 | end 8 | 9 | end 10 | -------------------------------------------------------------------------------- /config/initializers/filter_parameter_logging.rb: -------------------------------------------------------------------------------- 1 | # Be sure to restart your server when you modify this file. 2 | 3 | # Configure sensitive parameters which will be filtered from the log file. 4 | Rails.application.config.filter_parameters += [:password] 5 | -------------------------------------------------------------------------------- /app/assets/javascripts/api/logins.coffee: -------------------------------------------------------------------------------- 1 | # Place all the behaviors and hooks related to the matching controller here. 2 | # All this logic will automatically be available in application.js. 3 | # You can use CoffeeScript in this file: http://coffeescript.org/ 4 | -------------------------------------------------------------------------------- /app/assets/javascripts/logins.coffee: -------------------------------------------------------------------------------- 1 | # Place all the behaviors and hooks related to the matching controller here. 2 | # All this logic will automatically be available in application.js. 3 | # You can use CoffeeScript in this file: http://coffeescript.org/ 4 | -------------------------------------------------------------------------------- /app/assets/javascripts/api/commands.coffee: -------------------------------------------------------------------------------- 1 | # Place all the behaviors and hooks related to the matching controller here. 2 | # All this logic will automatically be available in application.js. 3 | # You can use CoffeeScript in this file: http://coffeescript.org/ 4 | -------------------------------------------------------------------------------- /app/assets/javascripts/http_request.coffee: -------------------------------------------------------------------------------- 1 | # Place all the behaviors and hooks related to the matching controller here. 2 | # All this logic will automatically be available in application.js. 3 | # You can use CoffeeScript in this file: http://coffeescript.org/ 4 | -------------------------------------------------------------------------------- /app/controllers/application_controller.rb: -------------------------------------------------------------------------------- 1 | class ApplicationController < ActionController::Base 2 | # Prevent CSRF attacks by raising an exception. 3 | # For APIs, you may want to use :null_session instead. 4 | protect_from_forgery with: :exception 5 | end 6 | -------------------------------------------------------------------------------- /bin/rake: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env ruby 2 | begin 3 | load File.expand_path('../spring', __FILE__) 4 | rescue LoadError => e 5 | raise unless e.message.include?('spring') 6 | end 7 | require_relative '../config/boot' 8 | require 'rake' 9 | Rake.application.run 10 | -------------------------------------------------------------------------------- /app/assets/javascripts/api/http_request.coffee: -------------------------------------------------------------------------------- 1 | # Place all the behaviors and hooks related to the matching controller here. 2 | # All this logic will automatically be available in application.js. 3 | # You can use CoffeeScript in this file: http://coffeescript.org/ 4 | -------------------------------------------------------------------------------- /test/controllers/api/http_request_controller_test.rb: -------------------------------------------------------------------------------- 1 | require 'test_helper' 2 | 3 | class Api::HttpRequestControllerTest < ActionController::TestCase 4 | test "should get create" do 5 | get :create 6 | assert_response :success 7 | end 8 | 9 | end 10 | -------------------------------------------------------------------------------- /Rakefile: -------------------------------------------------------------------------------- 1 | # Add your own tasks in files placed in lib/tasks ending in .rake, 2 | # for example lib/tasks/capistrano.rake, and they will automatically be available to Rake. 3 | 4 | require File.expand_path('../config/application', __FILE__) 5 | 6 | Rails.application.load_tasks 7 | -------------------------------------------------------------------------------- /test/fixtures/commands.yml: -------------------------------------------------------------------------------- 1 | # Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html 2 | 3 | one: 4 | command: MyText 5 | guid: MyString 6 | login_id: 7 | 8 | two: 9 | command: MyText 10 | guid: MyString 11 | login_id: 12 | -------------------------------------------------------------------------------- /app/controllers/api/commands_controller.rb: -------------------------------------------------------------------------------- 1 | class Api::CommandsController < ApplicationController 2 | skip_before_action :verify_authenticity_token 3 | def create 4 | body = Oj.load(request.body.read) 5 | Command.create(body) 6 | render json: {status: :ok}, status: :ok 7 | end 8 | end 9 | -------------------------------------------------------------------------------- /db/migrate/20160501154728_create_commands.rb: -------------------------------------------------------------------------------- 1 | class CreateCommands < ActiveRecord::Migration 2 | def change 3 | create_table :commands do |t| 4 | t.text :command 5 | t.string :guid 6 | 7 | t.timestamps null: false 8 | end 9 | add_index :commands, :guid 10 | end 11 | end 12 | -------------------------------------------------------------------------------- /db/migrate/20160501231739_add_geo_to_logins.rb: -------------------------------------------------------------------------------- 1 | class AddGeoToLogins < ActiveRecord::Migration 2 | def change 3 | add_column :logins, :country_name, :string 4 | add_index :logins, :country_name 5 | add_column :logins, :country_code, :string 6 | add_index :logins, :country_code 7 | end 8 | end 9 | -------------------------------------------------------------------------------- /test/fixtures/honeypots.yml: -------------------------------------------------------------------------------- 1 | # Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html 2 | 3 | one: 4 | ip: 5 | guid: MyString 6 | logins: 1 7 | country_name: MyString 8 | 9 | two: 10 | ip: 11 | guid: MyString 12 | logins: 1 13 | country_name: MyString 14 | -------------------------------------------------------------------------------- /bin/rails: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env ruby 2 | begin 3 | load File.expand_path('../spring', __FILE__) 4 | rescue LoadError => e 5 | raise unless e.message.include?('spring') 6 | end 7 | APP_PATH = File.expand_path('../../config/application', __FILE__) 8 | require_relative '../config/boot' 9 | require 'rails/commands' 10 | -------------------------------------------------------------------------------- /app/views/honeypots/_list.html.slim: -------------------------------------------------------------------------------- 1 | table.table.table-striped.table-condensed 2 | thead 3 | th Location 4 | th IP 5 | th Logins 6 | tbody 7 | - honeypots.each do |hp| 8 | tr 9 | td = hp.country_name 10 | td = "x.x.x.#{hp.ip.to_s.split('.')[-1]}" 11 | td = hp.logins 12 | -------------------------------------------------------------------------------- /app/views/layouts/_footer.html.erb: -------------------------------------------------------------------------------- 1 | 2 |
3 |
4 | 11 |
12 | 13 | -------------------------------------------------------------------------------- /app/views/logins/index.html.slim: -------------------------------------------------------------------------------- 1 | h2 SSH Logins 2 | center 3 | = paginate @logins, theme: 'twitter-bootstrap-3', pagination_class: "pagination-small pagination-centered" 4 | = render 'list', logins: @logins 5 | center 6 | = paginate @logins, theme: 'twitter-bootstrap-3', pagination_class: "pagination-small pagination-centered" 7 | -------------------------------------------------------------------------------- /db/migrate/20160501172103_create_login_counts.rb: -------------------------------------------------------------------------------- 1 | class CreateLoginCounts < ActiveRecord::Migration 2 | def change 3 | create_table :login_counts do |t| 4 | t.inet :ip 5 | t.integer :count, default: 0 6 | 7 | t.timestamps null: false 8 | end 9 | add_index :login_counts, :ip 10 | end 11 | end 12 | -------------------------------------------------------------------------------- /db/migrate/20160503020704_create_honeypots.rb: -------------------------------------------------------------------------------- 1 | class CreateHoneypots < ActiveRecord::Migration 2 | def change 3 | create_table :honeypots do |t| 4 | t.inet :ip 5 | t.string :guid 6 | t.integer :logins 7 | t.string :country_name 8 | 9 | t.timestamps null: false 10 | end 11 | end 12 | end 13 | -------------------------------------------------------------------------------- /app/views/http_requests/index.html.slim: -------------------------------------------------------------------------------- 1 | h2 Proxy Requests 2 | center 3 | = paginate @requests, theme: 'twitter-bootstrap-3', pagination_class: "pagination-small pagination-centered" 4 | = render 'list', requests: @requests 5 | center 6 | = paginate @requests, theme: 'twitter-bootstrap-3', pagination_class: "pagination-small pagination-centered" 7 | -------------------------------------------------------------------------------- /app/controllers/http_requests_controller.rb: -------------------------------------------------------------------------------- 1 | class HttpRequestsController < ApplicationController 2 | def index 3 | @requests = HttpRequest.order(id: :desc) 4 | @requests = @requests.page(params[:page]) 5 | end 6 | 7 | def show 8 | @request = HttpRequest.find(params[:id]) 9 | @login = @request.try(:login) 10 | end 11 | end 12 | -------------------------------------------------------------------------------- /lib/templates/slim/scaffold/_form.html.slim: -------------------------------------------------------------------------------- 1 | = simple_form_for(@<%= singular_table_name %>) do |f| 2 | = f.error_notification 3 | 4 | .form-inputs 5 | <%- attributes.each do |attribute| -%> 6 | = f.<%= attribute.reference? ? :association : :input %> :<%= attribute.name %> 7 | <%- end -%> 8 | 9 | .form-actions 10 | = f.button :submit 11 | -------------------------------------------------------------------------------- /app/views/layouts/_messages.html.slim: -------------------------------------------------------------------------------- 1 | / Rails flash messages styled for Bootstrap 3.0 2 | - flash.each do |name, msg| 3 | - if msg.is_a?(String) 4 | div class="alert alert-#{name.to_s == 'notice' ? 'success' : 'danger'}" 5 | button.close[type="button" data-dismiss="alert" aria-hidden="true"] × 6 | = content_tag :div, msg, :id => "flash_#{name}" 7 | -------------------------------------------------------------------------------- /test/controllers/http_request_controller_test.rb: -------------------------------------------------------------------------------- 1 | require 'test_helper' 2 | 3 | class HttpRequestControllerTest < ActionController::TestCase 4 | test "should get index" do 5 | get :index 6 | assert_response :success 7 | end 8 | 9 | test "should get show" do 10 | get :show 11 | assert_response :success 12 | end 13 | 14 | end 15 | -------------------------------------------------------------------------------- /app/controllers/home_controller.rb: -------------------------------------------------------------------------------- 1 | class HomeController < ApplicationController 2 | def logins_by_day 3 | render json: Login.group_by_day(:created_at, range: 1.month.ago..Time.now, format: '%m/%d').count 4 | end 5 | 6 | def logins_by_country 7 | render json: Login.group(:country_name).where(created_at: 1.month.ago..Time.now).count 8 | end 9 | end 10 | -------------------------------------------------------------------------------- /db/seeds.rb: -------------------------------------------------------------------------------- 1 | # This file should contain all the record creation needed to seed the database with its default values. 2 | # The data can then be loaded with the rake db:seed (or created alongside the db with db:setup). 3 | # 4 | # Examples: 5 | # 6 | # cities = City.create([{ name: 'Chicago' }, { name: 'Copenhagen' }]) 7 | # Mayor.create(name: 'Emanuel', city: cities.first) 8 | -------------------------------------------------------------------------------- /test/test_helper.rb: -------------------------------------------------------------------------------- 1 | ENV['RAILS_ENV'] ||= 'test' 2 | require File.expand_path('../../config/environment', __FILE__) 3 | require 'rails/test_help' 4 | 5 | class ActiveSupport::TestCase 6 | # Setup all fixtures in test/fixtures/*.yml for all tests in alphabetical order. 7 | fixtures :all 8 | 9 | # Add more helper methods to be used by all tests here... 10 | end 11 | -------------------------------------------------------------------------------- /app/assets/stylesheets/modern-business.css: -------------------------------------------------------------------------------- 1 | /* Global Styles */ 2 | 3 | html, 4 | body { 5 | height: 100%; 6 | } 7 | 8 | body { 9 | padding-top: 50px; /* Required padding for .navbar-fixed-top. Remove if using .navbar-static-top. Change if height of navigation changes. */ 10 | } 11 | 12 | .img-portfolio { 13 | margin-bottom: 30px; 14 | } 15 | 16 | .img-hover:hover { 17 | opacity: 0.8; 18 | } 19 | -------------------------------------------------------------------------------- /app/views/login_counter/_top.html.slim: -------------------------------------------------------------------------------- 1 | table.table.table-striped.table-condensed 2 | thead 3 | th IP 4 | th Sessions 5 | th Commands 6 | tbody 7 | - cache('login_counter_top', expires_in: 1.hour) do 8 | - logins.each do |login| 9 | tr 10 | td = link_to login.ip, logins_path(ip: login.ip) 11 | td = login.sessions.count 12 | td = login.commands.count 13 | -------------------------------------------------------------------------------- /app/models/http_request.rb: -------------------------------------------------------------------------------- 1 | class HttpRequest < ActiveRecord::Base 2 | belongs_to :login, foreign_key: 'guid', primary_key: 'guid' 3 | def self.latest(n=25) 4 | order(id: :desc).limit(n) 5 | end 6 | 7 | def filtered_response 8 | ips = Honeypot.pluck(:ip).map(&:to_s) 9 | resp = response 10 | ips.each do |ip| 11 | resp.gsub!(ip, '*.*.*.*') 12 | end 13 | resp 14 | end 15 | end 16 | -------------------------------------------------------------------------------- /app/models/honeypot.rb: -------------------------------------------------------------------------------- 1 | class Honeypot < ActiveRecord::Base 2 | before_create :set_guid 3 | before_create :set_country 4 | 5 | def self.top(n=10) 6 | order(logins: :desc).limit(n) 7 | end 8 | 9 | def set_country 10 | c = GeoIP.new("#{Rails.root}/GeoIP.dat").country(ip) 11 | self.country_name = c.country_name 12 | end 13 | 14 | def set_guid 15 | self.guid = SecureRandom.uuid 16 | end 17 | end 18 | -------------------------------------------------------------------------------- /app/views/home/index.html.slim: -------------------------------------------------------------------------------- 1 | .container 2 | .row 3 | .col-lg-6 4 | h3 Logins by Day 5 | = column_chart logins_by_day_home_index_path, library: { backgroundColor: '#000000', vAxis: { gridlines: { color: '#212121' } } } 6 | .col-lg-6 7 | h3 Logins By Country (past month) 8 | = geo_chart logins_by_country_home_index_path, library: { backgroundColor: '#000000' } 9 | 10 | = render 'logins/latest' 11 | -------------------------------------------------------------------------------- /test/fixtures/http_requests.yml: -------------------------------------------------------------------------------- 1 | # Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html 2 | 3 | one: 4 | headers: MyString 5 | url: MyString 6 | hostname: MyString 7 | formdata: MyString 8 | method: MyString 9 | guid: MyString 10 | 11 | two: 12 | headers: MyString 13 | url: MyString 14 | hostname: MyString 15 | formdata: MyString 16 | method: MyString 17 | guid: MyString 18 | -------------------------------------------------------------------------------- /config/routes.rb: -------------------------------------------------------------------------------- 1 | Rails.application.routes.draw do 2 | resources :http_requests 3 | resources :logins 4 | 5 | resources :home do 6 | collection do 7 | get :logins_by_day, format: :json 8 | get :logins_by_country, format: :json 9 | end 10 | end 11 | 12 | namespace :api do 13 | resources :commands 14 | resources :logins 15 | resources :http_requests 16 | end 17 | root to: 'home#index' 18 | end 19 | -------------------------------------------------------------------------------- /app/models/login_count.rb: -------------------------------------------------------------------------------- 1 | class LoginCount < ActiveRecord::Base 2 | 3 | def self.top 4 | order(count: :desc).limit(10) 5 | end 6 | 7 | def sessions 8 | Login.where(remote_addr: ip) 9 | end 10 | 11 | def commands 12 | Command.where(guid: Login.where(remote_addr: ip).pluck(:guid)) 13 | end 14 | 15 | def self.inc(ip) 16 | a = find_or_create_by(ip: ip) 17 | a.increment(:count, 1) 18 | a.save 19 | end 20 | end 21 | -------------------------------------------------------------------------------- /public/humans.txt: -------------------------------------------------------------------------------- 1 | /* the humans responsible & colophon */ 2 | /* humanstxt.org */ 3 | 4 | 5 | /* TEAM */ 6 | : 7 | Site: 8 | Twitter: 9 | Location: 10 | 11 | /* THANKS */ 12 | Daniel Kehoe (@rails_apps) for the RailsApps project 13 | 14 | /* SITE */ 15 | Standards: HTML5, CSS3 16 | Components: jQuery 17 | Software: Ruby on Rails 18 | 19 | /* GENERATED BY */ 20 | Rails Composer: http://railscomposer.com/ 21 | -------------------------------------------------------------------------------- /app/controllers/logins_controller.rb: -------------------------------------------------------------------------------- 1 | class LoginsController < ApplicationController 2 | def index 3 | @logins = Login.order(id: :desc) 4 | @logins = @logins.where(remote_addr: params[:ip]) if params[:ip].present? 5 | @logins = @logins.where(username: params[:username]) if params[:username].present? 6 | @logins = @logins.where(version: params[:client]) if params[:client].present? 7 | @logins = @logins.page(params[:page]) 8 | end 9 | end 10 | -------------------------------------------------------------------------------- /config/initializers/backtrace_silencers.rb: -------------------------------------------------------------------------------- 1 | # Be sure to restart your server when you modify this file. 2 | 3 | # You can add backtrace silencers for libraries that you're using but don't wish to see in your backtraces. 4 | # Rails.backtrace_cleaner.add_silencer { |line| line =~ /my_noisy_library/ } 5 | 6 | # You can also remove all the silencers if you're trying to debug a problem that might stem from framework code. 7 | # Rails.backtrace_cleaner.remove_silencers! 8 | -------------------------------------------------------------------------------- /app/views/http_requests/_latest.html.slim: -------------------------------------------------------------------------------- 1 | table.table.table-striped.table-condensed 2 | thead 3 | th 4 | th Username 5 | th IP 6 | th URL 7 | th Date 8 | tbody 9 | - requests.each do |req| 10 | tr 11 | td = link_to 'view', req 12 | td = link_to req.login.try(:username), logins_path(username: req.login.try(:username)) 13 | td = link_to req.login.try(:remote_addr), logins_path(ip: req.login.try(:remote_addr)) 14 | td = req.url 15 | td = req.created_at.strftime("%Y/%m/%d %H:%M") 16 | -------------------------------------------------------------------------------- /config/initializers/assets.rb: -------------------------------------------------------------------------------- 1 | # Be sure to restart your server when you modify this file. 2 | 3 | # Version of your assets, change this if you want to expire all your assets. 4 | Rails.application.config.assets.version = '1.0' 5 | # Add additional assets to the asset load path 6 | # Rails.application.config.assets.paths << Emoji.images_path 7 | 8 | # Precompile additional assets. 9 | # application.js, application.css, and all non-JS/CSS in app/assets folder are already added. 10 | # Rails.application.config.assets.precompile += %w( search.js ) 11 | -------------------------------------------------------------------------------- /app/views/layouts/_navigation.html.slim: -------------------------------------------------------------------------------- 1 | / navigation styled for Bootstrap 3.0 2 | nav.navbar.navbar-inverse.navbar-fixed-top 3 | .container 4 | .navbar-header 5 | button.navbar-toggle[type="button" data-toggle="collapse" data-target=".navbar-collapse"] 6 | span.sr-only Toggle navigation 7 | span.icon-bar 8 | span.icon-bar 9 | span.icon-bar 10 | = link_to 'SSH Pot', root_path, class: 'navbar-brand' 11 | .collapse.navbar-collapse 12 | ul.nav.navbar-nav 13 | == render 'layouts/navigation_links' 14 | -------------------------------------------------------------------------------- /app/views/logins/_latest_sessions.html.slim: -------------------------------------------------------------------------------- 1 | table.table.table-striped.table-condensed 2 | thead 3 | th Username 4 | th IP 5 | th Date 6 | tbody 7 | - logins.each do |login| 8 | tr 9 | td = link_to login.username, logins_path(username: login.username) 10 | td = link_to login.remote_addr, logins_path(ip: login.remote_addr) 11 | td = login.created_at.strftime("%Y/%m/%d %H:%M") 12 | tr(id="commands-#{login.id}") 13 | td(colspan=3) 14 | = render 'commands/list', commands: login.commands 15 | -------------------------------------------------------------------------------- /bin/spring: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env ruby 2 | 3 | # This file loads spring without using Bundler, in order to be fast. 4 | # It gets overwritten when you run the `spring binstub` command. 5 | 6 | unless defined?(Spring) 7 | require 'rubygems' 8 | require 'bundler' 9 | 10 | if (match = Bundler.default_lockfile.read.match(/^GEM$.*?^ (?: )*spring \((.*?)\)$.*?^$/m)) 11 | Gem.paths = { 'GEM_PATH' => [Bundler.bundle_path.to_s, *Gem.path].uniq.join(Gem.path_separator) } 12 | gem 'spring', match[1] 13 | require 'spring/binstub' 14 | end 15 | end 16 | -------------------------------------------------------------------------------- /app/controllers/api/logins_controller.rb: -------------------------------------------------------------------------------- 1 | class Api::LoginsController < ApplicationController 2 | skip_before_action :verify_authenticity_token 3 | def create 4 | body = Oj.load(request.body.read) 5 | ip = request.env['HTTP_X_FORWARDED_FOR'] || request.remote_ip 6 | if ip.include?(',') 7 | ip = ip.split(', ')[0] 8 | end 9 | honeypot = Honeypot.find_or_create_by(ip: ip) 10 | honeypot.increment!(:logins, 1) 11 | Login.create(body) 12 | LoginCount.inc(body['remote_addr']) 13 | render json: {status: :ok}, status: :ok 14 | end 15 | end 16 | -------------------------------------------------------------------------------- /test/fixtures/logins.yml: -------------------------------------------------------------------------------- 1 | # Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html 2 | 3 | one: 4 | remote_addr: 5 | remote_port: 6 | username: MyString 7 | password: MyString 8 | guid: MyString 9 | version: MyString 10 | public_key: MyString 11 | key_type: MyString 12 | login_type: MyString 13 | 14 | two: 15 | remote_addr: 16 | remote_port: 17 | username: MyString 18 | password: MyString 19 | guid: MyString 20 | version: MyString 21 | public_key: MyString 22 | key_type: MyString 23 | login_type: MyString 24 | -------------------------------------------------------------------------------- /config/initializers/wrap_parameters.rb: -------------------------------------------------------------------------------- 1 | # Be sure to restart your server when you modify this file. 2 | 3 | # This file contains settings for ActionController::ParamsWrapper which 4 | # is enabled by default. 5 | 6 | # Enable parameter wrapping for JSON. You can disable this by setting :format to an empty array. 7 | ActiveSupport.on_load(:action_controller) do 8 | wrap_parameters format: [:json] if respond_to?(:wrap_parameters) 9 | end 10 | 11 | # To enable root element in JSON for ActiveRecord objects. 12 | # ActiveSupport.on_load(:active_record) do 13 | # self.include_root_in_json = true 14 | # end 15 | -------------------------------------------------------------------------------- /db/migrate/20160505025835_create_http_requests.rb: -------------------------------------------------------------------------------- 1 | class CreateHttpRequests < ActiveRecord::Migration 2 | def change 3 | create_table :http_requests do |t| 4 | t.string :headers, array: true, default: [] 5 | t.string :url 6 | t.string :hostname 7 | t.string :formdata, array: true, default: [] 8 | t.string :method 9 | t.string :guid 10 | 11 | t.timestamps null: false 12 | end 13 | add_index :http_requests, :url 14 | add_index :http_requests, :hostname 15 | add_index :http_requests, :method 16 | add_index :http_requests, :guid 17 | end 18 | end 19 | -------------------------------------------------------------------------------- /app/views/http_requests/_list.html.slim: -------------------------------------------------------------------------------- 1 | table.table.table-striped.table-condensed 2 | thead 3 | th 4 | th Username 5 | th IP 6 | th URL 7 | th Method 8 | th Country 9 | th Date 10 | tbody 11 | - requests.each do |request| 12 | tr 13 | td = link_to 'View', request 14 | td = link_to request.try(:login).try(:username), logins_path(username: request.try(:login).try(:username)) 15 | td = request.try(:login).try(:remote_addr) 16 | td = request.url 17 | td = request.method 18 | td = request.try(:login).try(:country_name) 19 | td = request.created_at.strftime("%Y/%m/%d %H:%M") 20 | -------------------------------------------------------------------------------- /app/models/login.rb: -------------------------------------------------------------------------------- 1 | class Login < ActiveRecord::Base 2 | paginates_per 25 3 | has_many :commands, foreign_key: 'guid', primary_key: 'guid' 4 | has_many :http_requests, foreign_key: 'guid', primary_key: 'guid' 5 | 6 | before_create :geolocate 7 | 8 | def geolocate 9 | c = GeoIP.new("#{Rails.root}/GeoIP.dat").country(remote_addr) 10 | self.country_code = c.country_code2 11 | self.country_name = c.country_name 12 | end 13 | 14 | def self.latest 15 | order('id desc').limit(25) 16 | end 17 | 18 | def self.latest_sessions 19 | joins(:commands).group('logins.id').having('count(commands.id) > 0').order(id: :desc).limit(25) 20 | end 21 | end 22 | -------------------------------------------------------------------------------- /app/controllers/api/http_requests_controller.rb: -------------------------------------------------------------------------------- 1 | class Api::HttpRequestsController < ApplicationController 2 | skip_before_action :verify_authenticity_token 3 | def create 4 | body = Oj.load(request.body.read) 5 | render json: {status: :ok}, status: :ok and return if body.nil? 6 | headers = body['headers'].map{|x| x.flatten.join(": ") } 7 | formdata = body['form_data'].map{|x| { x[0] => x[1][0] } } 8 | HttpRequest.create(url: body['url'], response: body['response'].gsub("\u0000", ""), 9 | hostname: body['hostname'], headers: headers, 10 | formdata: formdata, method: body['method'], guid: body['guid']) 11 | render json: {status: :ok}, status: :ok 12 | end 13 | end 14 | -------------------------------------------------------------------------------- /config/initializers/inflections.rb: -------------------------------------------------------------------------------- 1 | # Be sure to restart your server when you modify this file. 2 | 3 | # Add new inflection rules using the following format. Inflections 4 | # are locale specific, and you may define rules for as many different 5 | # locales as you wish. All of these examples are active by default: 6 | # ActiveSupport::Inflector.inflections(:en) do |inflect| 7 | # inflect.plural /^(ox)$/i, '\1en' 8 | # inflect.singular /^(ox)en/i, '\1' 9 | # inflect.irregular 'person', 'people' 10 | # inflect.uncountable %w( fish sheep ) 11 | # end 12 | 13 | # These inflection rules are supported but not enabled by default: 14 | # ActiveSupport::Inflector.inflections(:en) do |inflect| 15 | # inflect.acronym 'RESTful' 16 | # end 17 | -------------------------------------------------------------------------------- /db/migrate/20160501154727_create_logins.rb: -------------------------------------------------------------------------------- 1 | class CreateLogins < ActiveRecord::Migration 2 | def change 3 | create_table :logins do |t| 4 | t.inet :remote_addr 5 | t.integer :remote_port 6 | t.string :username 7 | t.string :password 8 | t.string :guid 9 | t.string :version 10 | t.string :public_key 11 | t.string :key_type 12 | t.string :login_type 13 | 14 | t.timestamps null: false 15 | end 16 | add_index :logins, :remote_addr 17 | add_index :logins, :username 18 | add_index :logins, :password 19 | add_index :logins, :guid 20 | add_index :logins, :version 21 | add_index :logins, :key_type 22 | add_index :logins, :login_type 23 | end 24 | end 25 | -------------------------------------------------------------------------------- /config/locales/en.yml: -------------------------------------------------------------------------------- 1 | # Files in the config/locales directory are used for internationalization 2 | # and are automatically loaded by Rails. If you want to use locales other 3 | # than English, add the necessary files in this directory. 4 | # 5 | # To use the locales, use `I18n.t`: 6 | # 7 | # I18n.t 'hello' 8 | # 9 | # In views, this is aliased to just `t`: 10 | # 11 | # <%= t('hello') %> 12 | # 13 | # To use a different locale, set it with `I18n.locale`: 14 | # 15 | # I18n.locale = :es 16 | # 17 | # This would use the information in config/locales/es.yml. 18 | # 19 | # To learn more, please read the Rails Internationalization guide 20 | # available at http://guides.rubyonrails.org/i18n.html. 21 | 22 | en: 23 | hello: "Hello world" 24 | -------------------------------------------------------------------------------- /app/assets/javascripts/application.js: -------------------------------------------------------------------------------- 1 | // This is a manifest file that'll be compiled into application.js, which will include all the files 2 | // listed below. 3 | // 4 | // Any JavaScript/Coffee file within this directory, lib/assets/javascripts, vendor/assets/javascripts, 5 | // or vendor/assets/javascripts of plugins, if any, can be referenced here using a relative path. 6 | // 7 | // It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the 8 | // compiled file. 9 | // 10 | // Read Sprockets README (https://github.com/sstephenson/sprockets#sprockets-directives) for details 11 | // about supported directives. 12 | // 13 | //= require jquery 14 | //= require jquery_ujs 15 | //= require bootstrap-sprockets 16 | //= require_tree . 17 | -------------------------------------------------------------------------------- /app/assets/stylesheets/application.css.scss: -------------------------------------------------------------------------------- 1 | /* 2 | * This is a manifest file that'll be compiled into application.css, which will include all the files 3 | * listed below. 4 | * 5 | * Any CSS and SCSS file within this directory, lib/assets/stylesheets, vendor/assets/stylesheets, 6 | * or vendor/assets/stylesheets of plugins, if any, can be referenced here using a relative path. 7 | * 8 | * You're free to add application-wide styles to this file and they'll appear at the bottom of the 9 | * compiled file so the styles you add here take precedence over styles defined in any styles 10 | * defined in the other CSS/SCSS files in this directory. It is generally better to create a new 11 | * file per style scope. 12 | * 13 | *= require_tree . 14 | *= require_self 15 | */ 16 | 17 | @import url(https://fonts.googleapis.com/css?family=Press+Start+2P); 18 | -------------------------------------------------------------------------------- /app/views/logins/_list.html.slim: -------------------------------------------------------------------------------- 1 | table.table.table-striped.table-condensed 2 | thead 3 | th Username 4 | th Password 5 | th Commands 6 | th Type 7 | th IP 8 | th Country 9 | th Client Version 10 | th Date 11 | tbody 12 | - logins.each do |login| 13 | tr 14 | td = link_to login.username, logins_path(username: login.username) 15 | td = login.password 16 | td = login.commands.count 17 | td 18 | - if login.login_type == 'key' 19 | i.glyphicon.glyphicon-lock(alt='Key') 20 | - else 21 | i.glyphicon.glyphicon-user(alt='Login') 22 | td = link_to login.remote_addr, logins_path(ip: login.remote_addr) 23 | td = login.country_name 24 | td = link_to login.version, logins_path(client: login.version) 25 | td = login.created_at.strftime("%Y/%m/%d %H:%M") 26 | -------------------------------------------------------------------------------- /bin/setup: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env ruby 2 | require 'pathname' 3 | 4 | # path to your application root. 5 | APP_ROOT = Pathname.new File.expand_path('../../', __FILE__) 6 | 7 | Dir.chdir APP_ROOT do 8 | # This script is a starting point to setup your application. 9 | # Add necessary setup steps to this file: 10 | 11 | puts "== Installing dependencies ==" 12 | system "gem install bundler --conservative" 13 | system "bundle check || bundle install" 14 | 15 | # puts "\n== Copying sample files ==" 16 | # unless File.exist?("config/database.yml") 17 | # system "cp config/database.yml.sample config/database.yml" 18 | # end 19 | 20 | puts "\n== Preparing database ==" 21 | system "bin/rake db:setup" 22 | 23 | puts "\n== Removing old logs and tempfiles ==" 24 | system "rm -f log/*" 25 | system "rm -rf tmp/cache" 26 | 27 | puts "\n== Restarting application server ==" 28 | system "touch tmp/restart.txt" 29 | end 30 | -------------------------------------------------------------------------------- /Capfile: -------------------------------------------------------------------------------- 1 | # Load DSL and Setup Up Stages 2 | require 'capistrano/setup' 3 | 4 | # Includes default deployment tasks 5 | require 'capistrano/deploy' 6 | 7 | # Includes tasks from other gems included in your Gemfile 8 | # 9 | # For documentation on these, see for example: 10 | # 11 | # https://github.com/capistrano/rvm 12 | # https://github.com/capistrano/rbenv 13 | # https://github.com/capistrano/chruby 14 | # https://github.com/capistrano/bundler 15 | # https://github.com/capistrano/rails/tree/master/assets 16 | # https://github.com/capistrano/rails/tree/master/migrations 17 | # 18 | # require 'capistrano/rvm' 19 | # require 'capistrano/rbenv' 20 | # require 'capistrano/chruby' 21 | require 'capistrano/puma' 22 | require 'capistrano/bundler' 23 | require 'capistrano/rails/assets' 24 | require 'capistrano/rails/migrations' 25 | 26 | # Loads custom tasks from `lib/capistrano/tasks' if you have any defined. 27 | Dir.glob('lib/capistrano/tasks/*.cap').each { |r| import r } 28 | -------------------------------------------------------------------------------- /config/locales/simple_form.en.yml: -------------------------------------------------------------------------------- 1 | en: 2 | simple_form: 3 | "yes": 'Yes' 4 | "no": 'No' 5 | required: 6 | text: 'required' 7 | mark: '*' 8 | # You can uncomment the line below if you need to overwrite the whole required html. 9 | # When using html, text and mark won't be used. 10 | # html: '*' 11 | error_notification: 12 | default_message: "Please review the problems below:" 13 | # Examples 14 | # labels: 15 | # defaults: 16 | # password: 'Password' 17 | # user: 18 | # new: 19 | # email: 'E-mail to sign in.' 20 | # edit: 21 | # email: 'E-mail.' 22 | # hints: 23 | # defaults: 24 | # username: 'User name to sign in.' 25 | # password: 'No special characters, please.' 26 | # include_blanks: 27 | # defaults: 28 | # age: 'Rather not say' 29 | # prompts: 30 | # defaults: 31 | # age: 'Select your age' 32 | -------------------------------------------------------------------------------- /Gemfile: -------------------------------------------------------------------------------- 1 | source 'https://rubygems.org' 2 | gem 'rails', '4.2.6' 3 | gem 'sass-rails', '~> 5.0' 4 | gem 'uglifier', '>= 1.3.0' 5 | gem 'coffee-rails', '~> 4.1.0' 6 | gem 'jquery-rails' 7 | gem 'jbuilder', '~> 2.0' 8 | gem 'groupdate' 9 | gem 'chartkick' 10 | gem 'geoip' 11 | gem 'kaminari' 12 | gem 'bootstrap-kaminari-views' 13 | gem 'oj' 14 | gem 'dalli' 15 | 16 | group :development, :test do 17 | gem 'byebug' 18 | end 19 | group :development do 20 | gem 'web-console', '~> 2.0' 21 | gem 'spring' 22 | end 23 | gem 'bootstrap-sass' 24 | gem 'pg' 25 | gem 'puma' 26 | gem 'simple_form' 27 | gem 'slim-rails' 28 | group :development do 29 | gem 'capistrano' 30 | gem 'capistrano3-puma' 31 | gem 'capistrano-bundler', '~> 1.1.2' 32 | gem 'capistrano-rails', '~> 1.1.3' 33 | gem 'better_errors' 34 | gem 'binding_of_caller', platforms: [:mri_21] 35 | gem 'quiet_assets' 36 | gem 'rails_layout' 37 | end 38 | group :development, :test do 39 | gem 'pry-rails' 40 | gem 'pry-rescue' 41 | gem 'rubocop' 42 | end 43 | -------------------------------------------------------------------------------- /app/views/pages/full-width.html.erb: -------------------------------------------------------------------------------- 1 | 2 |
3 | 4 | 5 |
6 |
7 |

Full Width Page 8 | Subheading 9 |

10 | 15 |
16 |
17 | 18 | 19 | 20 |
21 |
22 |

Most of Start Bootstrap's unstyled templates can be directly integrated into the Modern Business template. You can view all of our unstyled templates on our website at http://startbootstrap.com/template-categories/unstyled.

23 |
24 |
25 | 26 | 27 |
28 | 29 | -------------------------------------------------------------------------------- /config/secrets.yml: -------------------------------------------------------------------------------- 1 | # Be sure to restart your server when you modify this file. 2 | 3 | # Your secret key is used for verifying the integrity of signed cookies. 4 | # If you change this key, all old signed cookies will become invalid! 5 | 6 | # Make sure the secret is at least 30 characters and all random, 7 | # no regular words or you'll be exposed to dictionary attacks. 8 | # You can use `rake secret` to generate a secure secret key. 9 | 10 | # Make sure the secrets in this file are kept private 11 | # if you're sharing your code publicly. 12 | 13 | development: 14 | domain_name: example.com 15 | secret_key_base: 026da5abc4f5aedce0c939d5d55677cfd1520ae265c625ad6188759e9e0b599535c7dc530c4869149d69d53e2aaa8314512582b7183ccc15ec9081dedb32aa1e 16 | 17 | test: 18 | secret_key_base: 9f2849c062aa61bd0def236c03d2b0d0c2560901eefdc6757fd61eb9bf2a447708f0e2826acd41d6c93ca150c2781f4debdbad3bf6efce0128875fcdabc862f2 19 | 20 | # Do not keep production secrets in the repository, 21 | # instead read values from the environment. 22 | production: 23 | domain_name: <%= ENV["DOMAIN_NAME"] %> 24 | secret_key_base: <%= ENV["SECRET_KEY_BASE"] %> 25 | -------------------------------------------------------------------------------- /app/views/layouts/application.html.slim: -------------------------------------------------------------------------------- 1 | doctype html 2 | html 3 | head 4 | meta[name="viewport" content="width=device-width, initial-scale=1.0"] 5 | title 6 | = content_for?(:title) ? yield(:title) : 'Sshpot' 7 | meta name="description" content="#{content_for?(:description) ? yield(:description) : 'Sshpot'}" 8 | == stylesheet_link_tag "application", :media => 'all' 9 | == javascript_include_tag "https://www.google.com/jsapi", "chartkick" 10 | == javascript_include_tag 'application' 11 | == csrf_meta_tags 12 | javascript: 13 | | (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){ 14 | | (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o), 15 | | m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m) 16 | | })(window,document,'script','//www.google-analytics.com/analytics.js','ga'); 17 | 18 | | ga('create', 'UA-3754808-30', 'auto'); 19 | | ga('send', 'pageview'); 20 | 21 | body 22 | header 23 | == render 'layouts/navigation' 24 | main[role="main"] 25 | == render 'layouts/messages' 26 | == yield 27 | -------------------------------------------------------------------------------- /app/views/logins/_latest.html.slim: -------------------------------------------------------------------------------- 1 | .container 2 | .row 3 | .col-lg-6 4 | h3 Top 10 Attackers 5 | = render 'login_counter/top', logins: LoginCount.top 6 | h3 Latest 25 Logins 7 | = render 'logins/list', logins: Login.latest 8 | .col-lg-6 9 | h3 Network Stats 10 | .row 11 | .col-lg-3 12 | .alert.alert-primary.text-center 13 | h3 = number_with_delimiter Honeypot.count 14 | div honeypots 15 | .col-lg-3 16 | .alert.alert-primary.text-center 17 | h3 = number_with_delimiter LoginCount.count 18 | div unique attackers 19 | .col-lg-3 20 | .alert.alert-primary.text-center 21 | h3 = number_with_delimiter Login.count 22 | div logins 23 | .col-lg-3 24 | .alert.alert-primary.text-center 25 | h3 = number_with_delimiter HttpRequest.count 26 | div proxied requests 27 | h3 Last 25 Proxy Requests 28 | = render 'http_requests/latest', requests: HttpRequest.latest 29 | h3 Last 25 Sessions 30 | = render 'logins/latest_sessions', logins: Login.latest_sessions 31 | -------------------------------------------------------------------------------- /config/application.rb: -------------------------------------------------------------------------------- 1 | require File.expand_path('../boot', __FILE__) 2 | 3 | require 'rails/all' 4 | 5 | # Require the gems listed in Gemfile, including any gems 6 | # you've limited to :test, :development, or :production. 7 | Bundler.require(*Rails.groups) 8 | 9 | module Sshpot 10 | class Application < Rails::Application 11 | # Settings in config/environments/* take precedence over those specified here. 12 | # Application configuration should go into files in config/initializers 13 | # -- all .rb files in that directory are automatically loaded. 14 | 15 | # Set Time.zone default to the specified zone and make Active Record auto-convert to this zone. 16 | # Run "rake -D time" for a list of tasks for finding time zone names. Default is UTC. 17 | # config.time_zone = 'Central Time (US & Canada)' 18 | 19 | # The default locale is :en and all translations from config/locales/*.rb,yml are auto loaded. 20 | # config.i18n.load_path += Dir[Rails.root.join('my', 'locales', '*.{rb,yml}').to_s] 21 | # config.i18n.default_locale = :de 22 | 23 | # Do not swallow errors in after_commit/after_rollback callbacks. 24 | config.active_record.raise_in_transactional_callbacks = true 25 | end 26 | end 27 | -------------------------------------------------------------------------------- /config/deploy.rb: -------------------------------------------------------------------------------- 1 | set :application, 'sshpot' 2 | set :repo_url, 'git@github.com:joshrendek/sshpot-com.git' 3 | set :ssh_options, { :forward_agent => true } 4 | 5 | # ask :branch, proc { `git rev-parse --abbrev-ref HEAD`.chomp } 6 | 7 | set :deploy_to, '/home/app' 8 | # set :scm, :git 9 | 10 | # set :format, :pretty 11 | # set :log_level, :debug 12 | # set :pty, true 13 | 14 | set :linked_files, %w{config/database.yml config/secrets.yml} 15 | set :linked_dirs, %w{bin log tmp/pids tmp/cache tmp/sockets vendor/bundle public/system} 16 | 17 | # set :default_env, { path: "/opt/ruby/bin:$PATH" } 18 | set :keep_releases, 2 19 | 20 | namespace :deploy do 21 | 22 | desc 'Restart application' 23 | task :restart do 24 | on roles(:app), in: :sequence, wait: 5 do 25 | # Your restart mechanism here, for example: 26 | # execute :touch, release_path.join('tmp/restart.txt') 27 | end 28 | end 29 | 30 | after :restart, :clear_cache do 31 | on roles(:web), in: :groups, limit: 3, wait: 10 do 32 | # Here we can do anything such as: 33 | # within release_path do 34 | # execute :rake, 'cache:clear' 35 | # end 36 | end 37 | end 38 | 39 | after :finishing, 'deploy:cleanup' 40 | 41 | end 42 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | Sshpot 2 | ================ 3 | 4 | This application was generated with the [rails_apps_composer](https://github.com/RailsApps/rails_apps_composer) gem 5 | provided by the [RailsApps Project](http://railsapps.github.io/). 6 | 7 | Rails Composer is supported by developers who purchase our RailsApps tutorials. 8 | 9 | Problems? Issues? 10 | ----------- 11 | 12 | Need help? Ask on Stack Overflow with the tag 'railsapps.' 13 | 14 | Your application contains diagnostics in the README file. Please provide a copy of the README file when reporting any issues. 15 | 16 | If the application doesn't work as expected, please [report an issue](https://github.com/RailsApps/rails_apps_composer/issues) 17 | and include the diagnostics. 18 | 19 | Ruby on Rails 20 | ------------- 21 | 22 | This application requires: 23 | 24 | - Ruby 2.1.2 25 | - Rails 4.2.6 26 | 27 | Learn more about [Installing Rails](http://railsapps.github.io/installing-rails.html). 28 | 29 | Getting Started 30 | --------------- 31 | 32 | Documentation and Support 33 | ------------------------- 34 | 35 | Issues 36 | ------------- 37 | 38 | Similar Projects 39 | ---------------- 40 | 41 | Contributing 42 | ------------ 43 | 44 | Credits 45 | ------- 46 | 47 | License 48 | ------- 49 | -------------------------------------------------------------------------------- /app/views/http_requests/show.html.slim: -------------------------------------------------------------------------------- 1 | h2 Proxy Request Viewer 2 | .row 3 | .col-lg-4 4 | h4 Session Details 5 | table.table.table-striped.table-condensed 6 | tr 7 | td Username 8 | td = @login.try(:username) 9 | tr 10 | td Password 11 | td = @login.try(:password) 12 | tr 13 | td IP 14 | td = @login.try(:remote_addr) 15 | tr 16 | td Country 17 | td = @login.try(:country_name) 18 | tr 19 | td Client Version 20 | td = @login.try(:client_version) 21 | 22 | .col-lg-8 23 | h4 Request Details 24 | .row 25 | .col-lg-6 26 | h5 Headers 27 | table.table.table-striped.table-condensed 28 | - @request.headers.each do |header| 29 | - x = header.split(":").map(&:strip) 30 | tr 31 | td = x[0] 32 | td = x[1] 33 | .col-lg-6 34 | h5 Form Data 35 | table.table.table-striped.table-condensed 36 | - formdata = HttpRequest.last.formdata 37 | - formdata.each do |fd| 38 | tr 39 | td 40 | pre = fd 41 | 42 | .row 43 | .col-lg-12 44 | h4 Proxied Response 45 | pre = @request.filtered_response 46 | -------------------------------------------------------------------------------- /config/deploy/production.rb: -------------------------------------------------------------------------------- 1 | set :stage, :production 2 | 3 | # Simple Role Syntax 4 | # ================== 5 | # Supports bulk-adding hosts to roles, the primary 6 | # server in each group is considered to be the first 7 | # unless any hosts have the primary property set. 8 | role :app, %w{app@192.168.1.187} 9 | role :web, %w{app@192.168.1.187} 10 | role :db, %w{app@192.168.1.187} 11 | 12 | # Extended Server Syntax 13 | # ====================== 14 | # This can be used to drop a more detailed server 15 | # definition into the server list. The second argument 16 | # something that quacks like a hash can be used to set 17 | # extended properties on the server. 18 | server '192.168.1.187', user: 'app', roles: %w{web app} 19 | 20 | # you can set custom ssh options 21 | # it's possible to pass any option but you need to keep in mind that net/ssh understand limited list of options 22 | # you can see them in [net/ssh documentation](http://net-ssh.github.io/net-ssh/classes/Net/SSH.html#method-c-start) 23 | # set it globally 24 | # set :ssh_options, { 25 | # keys: %w(/home/rlisowski/.ssh/id_rsa), 26 | # forward_agent: false, 27 | # auth_methods: %w(password) 28 | # } 29 | # and/or per server 30 | # server 'example.com', 31 | # user: 'user_name', 32 | # roles: %w{web app}, 33 | # ssh_options: { 34 | # user: 'user_name', # overrides user setting above 35 | # keys: %w(/home/user_name/.ssh/id_rsa), 36 | # forward_agent: false, 37 | # auth_methods: %w(publickey password) 38 | # # password: 'please use keys' 39 | # } 40 | # setting per server overrides global ssh_options 41 | 42 | # fetch(:default_env).merge!(rails_env: :production) 43 | -------------------------------------------------------------------------------- /config/deploy/staging.rb: -------------------------------------------------------------------------------- 1 | set :stage, :staging 2 | 3 | # Simple Role Syntax 4 | # ================== 5 | # Supports bulk-adding hosts to roles, the primary 6 | # server in each group is considered to be the first 7 | # unless any hosts have the primary property set. 8 | role :app, %w{deploy@example.com} 9 | role :web, %w{deploy@example.com} 10 | role :db, %w{deploy@example.com} 11 | 12 | # Extended Server Syntax 13 | # ====================== 14 | # This can be used to drop a more detailed server 15 | # definition into the server list. The second argument 16 | # something that quacks like a hash can be used to set 17 | # extended properties on the server. 18 | server 'example.com', user: 'deploy', roles: %w{web app}, my_property: :my_value 19 | 20 | # you can set custom ssh options 21 | # it's possible to pass any option but you need to keep in mind that net/ssh understand limited list of options 22 | # you can see them in [net/ssh documentation](http://net-ssh.github.io/net-ssh/classes/Net/SSH.html#method-c-start) 23 | # set it globally 24 | # set :ssh_options, { 25 | # keys: %w(/home/rlisowski/.ssh/id_rsa), 26 | # forward_agent: false, 27 | # auth_methods: %w(password) 28 | # } 29 | # and/or per server 30 | # server 'example.com', 31 | # user: 'user_name', 32 | # roles: %w{web app}, 33 | # ssh_options: { 34 | # user: 'user_name', # overrides user setting above 35 | # keys: %w(/home/user_name/.ssh/id_rsa), 36 | # forward_agent: false, 37 | # auth_methods: %w(publickey password) 38 | # # password: 'please use keys' 39 | # } 40 | # setting per server overrides global ssh_options 41 | 42 | # fetch(:default_env).merge!(rails_env: :staging) 43 | -------------------------------------------------------------------------------- /public/500.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | We're sorry, but something went wrong (500) 5 | 6 | 55 | 56 | 57 | 58 | 59 |
60 |
61 |

We're sorry, but something went wrong.

62 |
63 |

If you are the application owner check the logs for more information.

64 |
65 | 66 | 67 | -------------------------------------------------------------------------------- /config/environments/development.rb: -------------------------------------------------------------------------------- 1 | Rails.application.configure do 2 | # Settings specified here will take precedence over those in config/application.rb. 3 | 4 | # In the development environment your application's code is reloaded on 5 | # every request. This slows down response time but is perfect for development 6 | # since you don't have to restart the web server when you make code changes. 7 | config.cache_classes = false 8 | 9 | # Do not eager load code on boot. 10 | config.eager_load = false 11 | 12 | # Show full error reports and disable caching. 13 | config.consider_all_requests_local = true 14 | config.action_controller.perform_caching = false 15 | 16 | # Don't care if the mailer can't send. 17 | config.action_mailer.raise_delivery_errors = false 18 | 19 | # Print deprecation notices to the Rails logger. 20 | config.active_support.deprecation = :log 21 | 22 | # Raise an error on page load if there are pending migrations. 23 | config.active_record.migration_error = :page_load 24 | 25 | # Debug mode disables concatenation and preprocessing of assets. 26 | # This option may cause significant delays in view rendering with a large 27 | # number of complex assets. 28 | config.assets.debug = true 29 | 30 | # Asset digests allow you to set far-future HTTP expiration dates on all assets, 31 | # yet still be able to expire them through the digest params. 32 | config.assets.digest = true 33 | 34 | # Adds additional error checking when serving assets at runtime. 35 | # Checks for improperly declared sprockets dependencies. 36 | # Raises helpful error messages. 37 | config.assets.raise_runtime_errors = true 38 | 39 | # Raises error for missing translations 40 | # config.action_view.raise_on_missing_translations = true 41 | end 42 | -------------------------------------------------------------------------------- /public/422.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | The change you wanted was rejected (422) 5 | 6 | 55 | 56 | 57 | 58 | 59 |
60 |
61 |

The change you wanted was rejected.

62 |

Maybe you tried to change something you didn't have access to.

63 |
64 |

If you are the application owner check the logs for more information.

65 |
66 | 67 | 68 | -------------------------------------------------------------------------------- /public/404.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | The page you were looking for doesn't exist (404) 5 | 6 | 55 | 56 | 57 | 58 | 59 |
60 |
61 |

The page you were looking for doesn't exist.

62 |

You may have mistyped the address or the page may have moved.

63 |
64 |

If you are the application owner check the logs for more information.

65 |
66 | 67 | 68 | -------------------------------------------------------------------------------- /config/database.yml: -------------------------------------------------------------------------------- 1 | # PostgreSQL. Versions 8.2 and up are supported. 2 | # 3 | # Install the pg driver: 4 | # gem install pg 5 | # On Mac OS X with macports: 6 | # gem install pg -- --with-pg-config=/opt/local/lib/postgresql84/bin/pg_config 7 | # On Windows: 8 | # gem install pg 9 | # Choose the win32 build. 10 | # Install PostgreSQL and put its /bin directory on your path. 11 | # 12 | # Configure Using Gemfile 13 | # gem 'pg' 14 | # 15 | development: 16 | adapter: postgresql 17 | host: localhost 18 | encoding: unicode 19 | database: sshpot_development 20 | pool: 5 21 | username: aether 22 | password: 23 | template: template0 24 | 25 | # Connect on a TCP socket. Omitted by default since the client uses a 26 | # domain socket that doesn't need configuration. Windows does not have 27 | # domain sockets, so uncomment these lines. 28 | #host: localhost 29 | #port: 5432 30 | 31 | # Schema search path. The server defaults to $user,public 32 | #schema_search_path: myapp,sharedapp,public 33 | 34 | # Minimum log levels, in increasing order: 35 | # debug5, debug4, debug3, debug2, debug1, 36 | # log, notice, warning, error, fatal, and panic 37 | # The server defaults to notice. 38 | #min_messages: warning 39 | 40 | # Warning: The database defined as "test" will be erased and 41 | # re-generated from your development database when you run "rake". 42 | # Do not set this db to the same as development or production. 43 | test: 44 | adapter: postgresql 45 | host: localhost 46 | encoding: unicode 47 | database: sshpot_test 48 | pool: 5 49 | username: aether 50 | password: 51 | template: template0 52 | 53 | production: 54 | adapter: postgresql 55 | host: localhost 56 | encoding: unicode 57 | database: sshpot_production 58 | pool: 5 59 | username: aether 60 | password: 61 | template: template0 62 | -------------------------------------------------------------------------------- /config/environments/test.rb: -------------------------------------------------------------------------------- 1 | Rails.application.configure do 2 | # Settings specified here will take precedence over those in config/application.rb. 3 | 4 | # The test environment is used exclusively to run your application's 5 | # test suite. You never need to work with it otherwise. Remember that 6 | # your test database is "scratch space" for the test suite and is wiped 7 | # and recreated between test runs. Don't rely on the data there! 8 | config.cache_classes = true 9 | 10 | # Do not eager load code on boot. This avoids loading your whole application 11 | # just for the purpose of running a single test. If you are using a tool that 12 | # preloads Rails for running tests, you may have to set it to true. 13 | config.eager_load = false 14 | 15 | # Configure static file server for tests with Cache-Control for performance. 16 | config.serve_static_files = true 17 | config.static_cache_control = 'public, max-age=3600' 18 | 19 | # Show full error reports and disable caching. 20 | config.consider_all_requests_local = true 21 | config.action_controller.perform_caching = false 22 | 23 | # Raise exceptions instead of rendering exception templates. 24 | config.action_dispatch.show_exceptions = false 25 | 26 | # Disable request forgery protection in test environment. 27 | config.action_controller.allow_forgery_protection = false 28 | 29 | # Tell Action Mailer not to deliver emails to the real world. 30 | # The :test delivery method accumulates sent emails in the 31 | # ActionMailer::Base.deliveries array. 32 | config.action_mailer.delivery_method = :test 33 | 34 | # Randomize the order test cases are executed. 35 | config.active_support.test_order = :random 36 | 37 | # Print deprecation notices to the stderr. 38 | config.active_support.deprecation = :stderr 39 | 40 | # Raises error for missing translations 41 | # config.action_view.raise_on_missing_translations = true 42 | end 43 | -------------------------------------------------------------------------------- /app/assets/stylesheets/1st_load_framework.css.scss: -------------------------------------------------------------------------------- 1 | // import the CSS framework 2 | 3 | $body-bg: #000 !important; 4 | $text-color: #fff; 5 | $link-color: #75bcfc; 6 | $panel-bg: #252525; 7 | $panel-inner-border: #111 !default; 8 | $panel-default-border: $panel-inner-border; 9 | $panel-default-text: #fff; 10 | $panel-default-heading-bg: #212121; 11 | $table-border-color: $panel-inner-border; 12 | $table-bg-accent: #191919; 13 | $pre-bg: #000; 14 | $pre-color: green; 15 | $pre-border-color: #111; 16 | $pagination-bg: #111; 17 | $pagination-border: #212121; 18 | 19 | 20 | hide { 21 | display: none; 22 | visibility: hidden; 23 | } 24 | 25 | .navbar-brand { 26 | font-family: 'Press Start 2P', cursive !important; 27 | } 28 | 29 | pre { 30 | max-height: 250px; 31 | scroll: auto; 32 | overflow: overflow-y; 33 | } 34 | 35 | table thead th { 36 | background-color: $panel-default-heading-bg; 37 | } 38 | 39 | @import "bootstrap-sprockets"; 40 | @import "bootstrap"; 41 | 42 | // make all images responsive by default 43 | img { 44 | @extend .img-responsive; 45 | margin: 0 auto; 46 | } 47 | // override for the 'Home' navigation link 48 | .navbar-brand { 49 | font-size: inherit; 50 | } 51 | 52 | // THESE ARE EXAMPLES YOU CAN MODIFY 53 | // create your own classes 54 | // to make views framework-neutral 55 | .column { 56 | @extend .col-md-6; 57 | @extend .text-center; 58 | } 59 | .form { 60 | @extend .col-md-6; 61 | } 62 | .form-centered { 63 | @extend .col-md-6; 64 | @extend .text-center; 65 | } 66 | .submit { 67 | @extend .btn; 68 | @extend .btn-primary; 69 | @extend .btn-lg; 70 | } 71 | // apply styles to HTML elements 72 | // to make views framework-neutral 73 | main { 74 | @extend .container-fluid; 75 | padding-bottom: 80px; 76 | width: 100%; 77 | margin-top: 51px; // accommodate the navbar 78 | } 79 | section { 80 | @extend .row; 81 | margin-top: 20px; 82 | } 83 | 84 | .container { 85 | width: 100% !important; 86 | } 87 | -------------------------------------------------------------------------------- /README: -------------------------------------------------------------------------------- 1 | Sshpot 2 | ================ 3 | 4 | Rails Composer is supported by developers who purchase our RailsApps tutorials. 5 | Need help? Ask on Stack Overflow with the tag 'railsapps.' 6 | Problems? Submit an issue: https://github.com/RailsApps/rails_apps_composer/issues 7 | Your application contains diagnostics in this README file. 8 | Please provide a copy of this README file when reporting any issues. 9 | 10 | 11 | option Build a starter application? 12 | choose Enter your selection: [none] 13 | option Get on the mailing list for Rails Composer news? 14 | choose Enter your selection: [none] 15 | option Web server for development? 16 | choose Enter your selection: [puma] 17 | option Web server for production? 18 | choose Enter your selection: [puma] 19 | option Database used in development? 20 | choose Enter your selection: [postgresql] 21 | option Template engine? 22 | choose Enter your selection: [slim] 23 | option Test framework? 24 | choose Enter your selection: [none] 25 | option Continuous testing? 26 | choose Enter your selection: [] 27 | option Front-end framework? 28 | choose Enter your selection: [bootstrap3] 29 | option Add support for sending email? 30 | choose Enter your selection: [none] 31 | option Authentication? 32 | choose Enter your selection: [none] 33 | option Devise modules? 34 | choose Enter your selection: [] 35 | option OmniAuth provider? 36 | choose Enter your selection: [] 37 | option Authorization? 38 | choose Enter your selection: [none] 39 | option Use a form builder gem? 40 | choose Enter your selection: [simple_form] 41 | option Add pages? 42 | choose Enter your selection: [home] 43 | option Set a locale? 44 | choose Enter your selection: [none] 45 | option Install page-view analytics? 46 | choose Enter your selection: [none] 47 | option Add a deployment mechanism? 48 | choose Enter your selection: [none] 49 | option Set a robots.txt file to ban spiders? 50 | choose Enter your selection: [true] 51 | option Create a GitHub repository? (y/n) 52 | choose Enter your selection: [] 53 | option Add gem and file for environment variables? 54 | choose Enter your selection: [] 55 | option Reduce assets logger noise during development? 56 | choose Enter your selection: [true] 57 | option Improve error reporting with 'better_errors' during development? 58 | choose Enter your selection: [true] 59 | option Use 'pry' as console replacement during development and test? 60 | choose Enter your selection: [true] 61 | option Use or create a project-specific rvm gemset? 62 | choose Enter your selection: [true] 63 | -------------------------------------------------------------------------------- /app/views/pages/sidebar.html.erb: -------------------------------------------------------------------------------- 1 | 2 |
3 | 4 | 5 |
6 |
7 |

Sidebar Page 8 | Subheading 9 |

10 | 15 |
16 |
17 | 18 | 19 | 20 |
21 | 22 |
23 |
24 | <%= link_to 'Home', root_path, class: 'list-group-item' %> 25 | <%= link_to 'About', page_path('about'), class: 'list-group-item' %> 26 | <%= link_to 'Services', page_path('services'), class: 'list-group-item' %> 27 | <%= link_to 'Contact', page_path('contact'), class: 'list-group-item' %> 28 | <%= link_to '1 Column Portfolio', page_path('portfolio-1-col'), class: 'list-group-item' %> 29 | <%= link_to '2 Column Portfolio', page_path('portfolio-2-col'), class: 'list-group-item' %> 30 | <%= link_to '3 Column Portfolio', page_path('portfolio-3-col'), class: 'list-group-item' %> 31 | <%= link_to '4 Column Portfolio', page_path('portfolio-4-col'), class: 'list-group-item' %> 32 | <%= link_to 'Single Portfolio Item', page_path('portfolio-item'), class: 'list-group-item' %> 33 | <%= link_to 'Blog Home 1', page_path('blog-home-1'), class: 'list-group-item' %> 34 | <%= link_to 'Blog Home 2', page_path('blog-home-2'), class: 'list-group-item' %> 35 | <%= link_to 'Blog Post', page_path('blog-post'), class: 'list-group-item' %> 36 | <%= link_to 'Full Width Page', page_path('full-width'), class: 'list-group-item' %> 37 | <%= link_to 'Sidebar Page', page_path('sidebar'), class: 'list-group-item' %> 38 | <%= link_to 'FAQ', page_path('faq'), class: 'list-group-item' %> 39 | <%= link_to '404', page_path('404'), class: 'list-group-item' %> 40 | <%= link_to 'Pricing Table', page_path('pricing'), class: 'list-group-item' %> 41 |
42 |
43 | 44 |
45 |

Section Heading

46 |

Lorem ipsum dolor sit amet, consectetur adipisicing elit. Soluta, et temporibus, facere perferendis veniam beatae non debitis, numquam blanditiis necessitatibus vel mollitia dolorum laudantium, voluptate dolores iure maxime ducimus fugit.

47 |
48 |
49 | 50 | 51 |
52 | 53 | -------------------------------------------------------------------------------- /config/environments/production.rb: -------------------------------------------------------------------------------- 1 | Rails.application.configure do 2 | # Settings specified here will take precedence over those in config/application.rb. 3 | 4 | # Code is not reloaded between requests. 5 | config.cache_classes = true 6 | 7 | # Eager load code on boot. This eager loads most of Rails and 8 | # your application in memory, allowing both threaded web servers 9 | # and those relying on copy on write to perform better. 10 | # Rake tasks automatically ignore this option for performance. 11 | config.eager_load = true 12 | 13 | # Full error reports are disabled and caching is turned on. 14 | config.consider_all_requests_local = false 15 | config.action_controller.perform_caching = true 16 | 17 | # Enable Rack::Cache to put a simple HTTP cache in front of your application 18 | # Add `rack-cache` to your Gemfile before enabling this. 19 | # For large-scale production use, consider using a caching reverse proxy like 20 | # NGINX, varnish or squid. 21 | # config.action_dispatch.rack_cache = true 22 | 23 | # Disable serving static files from the `/public` folder by default since 24 | # Apache or NGINX already handles this. 25 | config.serve_static_files = ENV['RAILS_SERVE_STATIC_FILES'].present? 26 | 27 | # Compress JavaScripts and CSS. 28 | config.assets.js_compressor = :uglifier 29 | # config.assets.css_compressor = :sass 30 | 31 | # Do not fallback to assets pipeline if a precompiled asset is missed. 32 | config.assets.compile = true 33 | 34 | # Asset digests allow you to set far-future HTTP expiration dates on all assets, 35 | # yet still be able to expire them through the digest params. 36 | config.assets.digest = true 37 | 38 | # `config.assets.precompile` and `config.assets.version` have moved to config/initializers/assets.rb 39 | 40 | # Specifies the header that your server uses for sending files. 41 | # config.action_dispatch.x_sendfile_header = 'X-Sendfile' # for Apache 42 | # config.action_dispatch.x_sendfile_header = 'X-Accel-Redirect' # for NGINX 43 | 44 | # Force all access to the app over SSL, use Strict-Transport-Security, and use secure cookies. 45 | # config.force_ssl = true 46 | 47 | # Use the lowest log level to ensure availability of diagnostic information 48 | # when problems arise. 49 | config.log_level = :debug 50 | 51 | # Prepend all log lines with the following tags. 52 | # config.log_tags = [ :subdomain, :uuid ] 53 | 54 | # Use a different logger for distributed setups. 55 | # config.logger = ActiveSupport::TaggedLogging.new(SyslogLogger.new) 56 | 57 | # Use a different cache store in production. 58 | config.cache_store = :mem_cache_store 59 | 60 | # Enable serving of images, stylesheets, and JavaScripts from an asset server. 61 | # config.action_controller.asset_host = 'http://assets.example.com' 62 | 63 | # Ignore bad email addresses and do not raise email delivery errors. 64 | # Set this to true and configure the email server for immediate delivery to raise delivery errors. 65 | # config.action_mailer.raise_delivery_errors = false 66 | 67 | # Enable locale fallbacks for I18n (makes lookups for any locale fall back to 68 | # the I18n.default_locale when a translation cannot be found). 69 | config.i18n.fallbacks = true 70 | 71 | # Send deprecation notices to registered listeners. 72 | config.active_support.deprecation = :notify 73 | 74 | # Use default logging formatter so that PID and timestamp are not suppressed. 75 | config.log_formatter = ::Logger::Formatter.new 76 | 77 | # Do not dump schema after migrations. 78 | config.active_record.dump_schema_after_migration = false 79 | end 80 | -------------------------------------------------------------------------------- /app/views/pages/404.html.erb: -------------------------------------------------------------------------------- 1 | 2 |
3 | 4 | 5 |
6 |
7 |

404 8 | Page Not Found 9 |

10 | 15 |
16 |
17 | 18 | 19 |
20 | 21 |
22 |
23 |

404 24 |

25 |

The page you're looking for could not be found. Here are some helpful links to get you back on track:

26 |
    27 |
  • 28 | <%= link_to 'Home', root_path %> 29 |
  • 30 |
  • 31 | <%= link_to 'About', page_path('about') %> 32 |
  • 33 |
  • 34 | <%= link_to 'Services', page_path('services') %> 35 |
  • 36 |
  • 37 | <%= link_to 'Contact', page_path('contact') %> 38 |
  • 39 |
  • 40 | Portfolio 41 |
      42 |
    • 43 | <%= link_to '1 Column Portfolio', page_path('portfolio-1-col') %> 44 |
    • 45 |
    • 46 | <%= link_to '2 Column Portfolio', page_path('portfolio-2-col') %> 47 |
    • 48 |
    • 49 | <%= link_to '3 Column Portfolio', page_path('portfolio-3-col') %> 50 |
    • 51 |
    • 52 | <%= link_to '4 Column Portfolio', page_path('portfolio-4-col') %> 53 |
    • 54 |
    55 |
  • 56 |
  • 57 | Blog 58 |
      59 |
    • 60 | <%= link_to 'Blog Home 1', page_path('blog-home-1') %> 61 |
    • 62 |
    • 63 | <%= link_to 'Blog Home 2', page_path('blog-home-2') %> 64 |
    • 65 |
    • 66 | <%= link_to 'Blog Post', page_path('blog-post') %> 67 |
    • 68 |
    69 |
  • 70 |
  • 71 | Other Pages 72 |
      73 |
    • 74 | <%= link_to 'Full Width Page', page_path('full-width') %> 75 |
    • 76 |
    • 77 | <%= link_to 'Sidebar Page', page_path('sidebar') %> 78 |
    • 79 |
    • 80 | <%= link_to 'FAQ', page_path('faq') %> 81 |
    • 82 |
    • 83 | <%= link_to '404', page_path('404') %> 84 |
    • 85 |
    • 86 | <%= link_to 'Pricing Table', page_path('pricing') %> 87 |
    • 88 |
    89 |
  • 90 |
91 |
92 |
93 | 94 |
95 | 96 |
97 | 98 | 99 | -------------------------------------------------------------------------------- /db/schema.rb: -------------------------------------------------------------------------------- 1 | # encoding: UTF-8 2 | # This file is auto-generated from the current state of the database. Instead 3 | # of editing this file, please use the migrations feature of Active Record to 4 | # incrementally modify your database, and then regenerate this schema definition. 5 | # 6 | # Note that this schema.rb definition is the authoritative source for your 7 | # database schema. If you need to create the application database on another 8 | # system, you should be using db:schema:load, not running all the migrations 9 | # from scratch. The latter is a flawed and unsustainable approach (the more migrations 10 | # you'll amass, the slower it'll run and the greater likelihood for issues). 11 | # 12 | # It's strongly recommended that you check this file into your version control system. 13 | 14 | ActiveRecord::Schema.define(version: 20160514022534) do 15 | 16 | # These are extensions that must be enabled in order to support this database 17 | enable_extension "plpgsql" 18 | 19 | create_table "commands", force: :cascade do |t| 20 | t.text "command" 21 | t.string "guid" 22 | t.datetime "created_at", null: false 23 | t.datetime "updated_at", null: false 24 | end 25 | 26 | add_index "commands", ["command"], name: "index_commands_on_command", using: :btree 27 | add_index "commands", ["guid"], name: "index_commands_on_guid", using: :btree 28 | 29 | create_table "honeypots", force: :cascade do |t| 30 | t.inet "ip" 31 | t.string "guid" 32 | t.integer "logins" 33 | t.string "country_name" 34 | t.datetime "created_at", null: false 35 | t.datetime "updated_at", null: false 36 | end 37 | 38 | create_table "http_requests", force: :cascade do |t| 39 | t.string "headers", default: [], array: true 40 | t.string "url" 41 | t.string "hostname" 42 | t.string "formdata", default: [], array: true 43 | t.string "method" 44 | t.string "guid" 45 | t.datetime "created_at", null: false 46 | t.datetime "updated_at", null: false 47 | t.string "response" 48 | end 49 | 50 | add_index "http_requests", ["guid"], name: "index_http_requests_on_guid", using: :btree 51 | add_index "http_requests", ["hostname"], name: "index_http_requests_on_hostname", using: :btree 52 | add_index "http_requests", ["method"], name: "index_http_requests_on_method", using: :btree 53 | add_index "http_requests", ["url"], name: "index_http_requests_on_url", using: :btree 54 | 55 | create_table "login_counts", force: :cascade do |t| 56 | t.inet "ip" 57 | t.integer "count", default: 0 58 | t.datetime "created_at", null: false 59 | t.datetime "updated_at", null: false 60 | end 61 | 62 | add_index "login_counts", ["ip"], name: "index_login_counts_on_ip", using: :btree 63 | 64 | create_table "logins", force: :cascade do |t| 65 | t.inet "remote_addr" 66 | t.integer "remote_port" 67 | t.string "username" 68 | t.string "password" 69 | t.string "guid" 70 | t.string "version" 71 | t.string "public_key" 72 | t.string "key_type" 73 | t.string "login_type" 74 | t.datetime "created_at", null: false 75 | t.datetime "updated_at", null: false 76 | t.string "country_name" 77 | t.string "country_code" 78 | end 79 | 80 | add_index "logins", ["country_code"], name: "index_logins_on_country_code", using: :btree 81 | add_index "logins", ["country_name"], name: "index_logins_on_country_name", using: :btree 82 | add_index "logins", ["guid"], name: "index_logins_on_guid", using: :btree 83 | add_index "logins", ["key_type"], name: "index_logins_on_key_type", using: :btree 84 | add_index "logins", ["login_type"], name: "index_logins_on_login_type", using: :btree 85 | add_index "logins", ["password"], name: "index_logins_on_password", using: :btree 86 | add_index "logins", ["remote_addr"], name: "index_logins_on_remote_addr", using: :btree 87 | add_index "logins", ["username"], name: "index_logins_on_username", using: :btree 88 | add_index "logins", ["version"], name: "index_logins_on_version", using: :btree 89 | 90 | end 91 | -------------------------------------------------------------------------------- /app/views/pages/pricing.html.erb: -------------------------------------------------------------------------------- 1 | 2 |
3 | 4 | 5 |
6 |
7 |

Pricing Table 8 | Subheading 9 |

10 | 15 |
16 |
17 | 18 | 19 | 20 |
21 |
22 |
23 |
24 |

Basic

25 |
26 |
27 | $1999 28 | per month 29 |
30 |
    31 |
  • 1 User
  • 32 |
  • 5 Projects
  • 33 |
  • Unlimited Email Accounts
  • 34 |
  • 10GB Disk Space
  • 35 |
  • 100GB Monthly Bandwidth
  • 36 |
  • Sign Up! 37 |
  • 38 |
39 |
40 |
41 |
42 |
43 |
44 |

Plus Best Value

45 |
46 |
47 | $3999 48 | per month 49 |
50 |
    51 |
  • 10 User
  • 52 |
  • 500 Projects
  • 53 |
  • Unlimited Email Accounts
  • 54 |
  • 1000GB Disk Space
  • 55 |
  • 10000GB Monthly Bandwidth
  • 56 |
  • Sign Up! 57 |
  • 58 |
59 |
60 |
61 |
62 |
63 |
64 |

Ultra

65 |
66 |
67 | $15999 68 | per month 69 |
70 |
    71 |
  • Unlimted Users
  • 72 |
  • Unlimited Projects
  • 73 |
  • Unlimited Email Accounts
  • 74 |
  • 10000GB Disk Space
  • 75 |
  • Unlimited Monthly Bandwidth
  • 76 |
  • Sign Up! 77 |
  • 78 |
79 |
80 |
81 |
82 | 83 | 84 |
85 | 86 | -------------------------------------------------------------------------------- /app/views/pages/portfolio-item.html.erb: -------------------------------------------------------------------------------- 1 | 2 |
3 | 4 | 5 |
6 |
7 |

Portfolio Item 8 | Subheading 9 |

10 | 15 |
16 |
17 | 18 | 19 | 20 |
21 | 22 |
23 | 52 |
53 | 54 |
55 |

Project Description

56 |

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam viverra euismod odio, gravida pellentesque urna varius vitae. Sed dui lorem, adipiscing in adipiscing et, interdum nec metus. Mauris ultricies, justo eu convallis placerat, felis enim.

57 |

Project Details

58 |
    59 |
  • Lorem Ipsum
  • 60 |
  • Dolor Sit Amet
  • 61 |
  • Consectetur
  • 62 |
  • Adipiscing Elit
  • 63 |
64 |
65 | 66 |
67 | 68 | 69 | 70 |
71 | 72 |
73 | 74 |
75 | 76 |
77 | 78 | 79 | 80 |
81 | 82 |
83 | 84 | 85 | 86 |
87 | 88 |
89 | 90 | 91 | 92 |
93 | 94 |
95 | 96 | 97 | 98 |
99 | 100 |
101 | 102 | 103 |
104 | 105 | -------------------------------------------------------------------------------- /app/views/pages/contact.html.erb: -------------------------------------------------------------------------------- 1 | 2 |
3 | 4 | 5 |
6 |
7 |

Contact 8 | Subheading 9 |

10 | 15 |
16 |
17 | 18 | 19 | 20 |
21 | 22 |
23 | 24 | 25 |
26 | 27 |
28 |

Contact Details

29 |

30 | 3481 Melrose Place
Beverly Hills, CA 90210
31 |

32 |

33 | P: (123) 456-7890

34 |

35 | E: name@example.com 36 |

37 |

38 | H: Monday - Friday: 9:00 AM to 5:00 PM

39 |
    40 |
  • 41 | 42 |
  • 43 |
  • 44 | 45 |
  • 46 |
  • 47 | 48 |
  • 49 |
  • 50 | 51 |
  • 52 |
53 |
54 |
55 | 56 | 57 | 58 |
59 |
60 |

Send us a Message

61 |
62 |
63 |
64 | 65 | 66 |

67 |
68 |
69 |
70 |
71 | 72 | 73 |
74 |
75 |
76 |
77 | 78 | 79 |
80 |
81 |
82 |
83 | 84 | 85 |
86 |
87 |
88 | 89 | 90 |
91 |
92 | 93 |
94 | 95 | 96 |
97 | 98 | -------------------------------------------------------------------------------- /app/views/pages/blog-home-2.html.erb: -------------------------------------------------------------------------------- 1 | 2 |
3 | 4 |
5 |
6 |

Blog Home Two 7 | Subheading 8 |

9 | 14 |
15 |
16 | 17 | 18 | 19 |
20 |
21 |

22 |

23 |

June 17, 2014

24 |
25 |
26 | <%= link_to page_path('blog-post') do %> 27 | 28 | <% end %> 29 |
30 |
31 |

32 | <%= link_to 'Blog Post Title', page_path('blog-post') %> 33 |

34 |

by Start Bootstrap 35 |

36 |

Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.

37 | <%= link_to page_path('blog-post') do %> 38 | Read More 39 | <% end %> 40 |
41 |
42 | 43 | 44 |
45 | 46 | 47 |
48 |
49 |

50 |

51 |

June 17, 2014

52 |
53 |
54 | <%= link_to page_path('blog-post') do %> 55 | 56 | <% end %> 57 |
58 |
59 |

<%= link_to 'Blog Post Title', page_path('blog-post') %> 60 |

61 |

by Start Bootstrap 62 |

63 |

Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.

64 | <%= link_to page_path('blog-post') do %> 65 | Read More 66 | <% end %> 67 |
68 |
69 | 70 | 71 |
72 | 73 | 74 |
75 |
76 |

77 |

78 |

June 17, 2014

79 |
80 |
81 | <%= link_to page_path('blog-post') do %> 82 | 83 | <% end %> 84 |
85 |
86 |

<%= link_to 'Blog Post Title', page_path('blog-post') %> 87 |

88 |

by Start Bootstrap 89 |

90 |

Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.

91 | <%= link_to page_path('blog-post') do %> 92 | Read More 93 | <% end %> 94 |
95 |
96 | 97 | 98 |
99 | 100 | 101 |
102 | 108 |
109 | 110 | 111 | 112 | -------------------------------------------------------------------------------- /app/views/pages/portfolio-4-col.html.erb: -------------------------------------------------------------------------------- 1 | 2 |
3 | 4 | 5 |
6 |
7 |

Four Column Portfolio 8 | Subheading 9 |

10 | 15 |
16 |
17 | 18 | 19 | 20 |
21 |
22 | <%= link_to page_path('portfolio-item') do %> 23 | 24 | <% end %> 25 |
26 |
27 | <%= link_to page_path('portfolio-item') do %> 28 | 29 | <% end %> 30 |
31 |
32 | <%= link_to page_path('portfolio-item') do %> 33 | 34 | <% end %> 35 |
36 |
37 | <%= link_to page_path('portfolio-item') do %> 38 | 39 | <% end %> 40 |
41 |
42 | 43 | 44 | 45 |
46 |
47 | <%= link_to page_path('portfolio-item') do %> 48 | 49 | <% end %> 50 |
51 |
52 | <%= link_to page_path('portfolio-item') do %> 53 | 54 | <% end %> 55 |
56 |
57 | <%= link_to page_path('portfolio-item') do %> 58 | 59 | <% end %> 60 |
61 |
62 | <%= link_to page_path('portfolio-item') do %> 63 | 64 | <% end %> 65 |
66 |
67 | 68 | 69 | 70 |
71 |
72 | <%= link_to page_path('portfolio-item') do %> 73 | 74 | <% end %> 75 |
76 |
77 | <%= link_to page_path('portfolio-item') do %> 78 | 79 | <% end %> 80 |
81 |
82 | <%= link_to page_path('portfolio-item') do %> 83 | 84 | <% end %> 85 |
86 |
87 | <%= link_to page_path('portfolio-item') do %> 88 | 89 | <% end %> 90 |
91 |
92 | 93 | 94 |
95 | 96 | 97 |
98 |
99 |
    100 |
  • 101 | « 102 |
  • 103 |
  • 104 | 1 105 |
  • 106 |
  • 107 | 2 108 |
  • 109 |
  • 110 | 3 111 |
  • 112 |
  • 113 | 4 114 |
  • 115 |
  • 116 | 5 117 |
  • 118 |
  • 119 | » 120 |
  • 121 |
122 |
123 |
124 | 125 | 126 |
127 | 128 | -------------------------------------------------------------------------------- /app/views/pages/portfolio-2-col.html.erb: -------------------------------------------------------------------------------- 1 | 2 |
3 | 4 | 5 |
6 |
7 |

Two Column Portfolio 8 | Subheading 9 |

10 | 15 |
16 |
17 | 18 | 19 | 20 |
21 |
22 | <%= link_to page_path('portfolio-item') do %> 23 | 24 | <% end %> 25 |

26 | <%= link_to 'Project', page_path('portfolio-item') %> 27 |

28 |

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam viverra euismod odio, gravida pellentesque urna varius vitae.

29 |
30 |
31 | <%= link_to page_path('portfolio-item') do %> 32 | 33 | <% end %> 34 |

35 | <%= link_to 'Project', page_path('portfolio-item') %> 36 |

37 |

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam viverra euismod odio, gravida pellentesque urna varius vitae.

38 |
39 |
40 | 41 | 42 | 43 |
44 |
45 | <%= link_to page_path('portfolio-item') do %> 46 | 47 | <% end %> 48 |

49 | <%= link_to 'Project', page_path('portfolio-item') %> 50 |

51 |

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam viverra euismod odio, gravida pellentesque urna varius vitae.

52 |
53 |
54 | <%= link_to page_path('portfolio-item') do %> 55 | 56 | <% end %> 57 |

58 | <%= link_to 'Project', page_path('portfolio-item') %> 59 |

60 |

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam viverra euismod odio, gravida pellentesque urna varius vitae.

61 |
62 |
63 | 64 | 65 | 66 |
67 |
68 | <%= link_to page_path('portfolio-item') do %> 69 | 70 | <% end %> 71 |

72 | <%= link_to 'Project', page_path('portfolio-item') %> 73 |

74 |

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam viverra euismod odio, gravida pellentesque urna varius vitae.

75 |
76 |
77 | <%= link_to page_path('portfolio-item') do %> 78 | 79 | <% end %> 80 |

81 | <%= link_to 'Project', page_path('portfolio-item') %> 82 |

83 |

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam viverra euismod odio, gravida pellentesque urna varius vitae.

84 |
85 |
86 | 87 | 88 |
89 | 90 | 91 |
92 |
93 |
    94 |
  • 95 | « 96 |
  • 97 |
  • 98 | 1 99 |
  • 100 |
  • 101 | 2 102 |
  • 103 |
  • 104 | 3 105 |
  • 106 |
  • 107 | 4 108 |
  • 109 |
  • 110 | 5 111 |
  • 112 |
  • 113 | » 114 |
  • 115 |
116 |
117 |
118 | 119 | 120 |
121 | 122 | -------------------------------------------------------------------------------- /app/views/pages/portfolio-1-col.html.erb: -------------------------------------------------------------------------------- 1 | 2 |
3 | 4 | 5 |
6 |
7 |

One Column Portfolio 8 | Subheading 9 |

10 | 15 |
16 |
17 | 18 | 19 | 20 |
21 |
22 | <%= link_to page_path('portfolio-item') do %> 23 | 24 | <% end %> 25 |
26 |
27 |

Project One

28 |

Subheading

29 |

Lorem ipsum dolor sit amet, consectetur adipisicing elit. Laudantium veniam exercitationem expedita laborum at voluptate. Labore, voluptates totam at aut nemo deserunt rem magni pariatur quos perspiciatis atque eveniet unde.

30 | <%= link_to 'View Project', page_path('portfolio-item'), class: 'btn btn-primary' %> 31 |
32 |
33 | 34 | 35 |
36 | 37 | 38 |
39 |
40 | <%= link_to page_path('portfolio-item') do %> 41 | 42 | <% end %> 43 |
44 |
45 |

Project Two

46 |

Subheading

47 |

Lorem ipsum dolor sit amet, consectetur adipisicing elit. Ut, odit velit cumque vero doloremque repellendus distinctio maiores rem expedita a nam vitae modi quidem similique ducimus! Velit, esse totam tempore.

48 | <%= link_to 'View Project', page_path('portfolio-item'), class: 'btn btn-primary' %> 49 |
50 |
51 | 52 | 53 |
54 | 55 | 56 |
57 |
58 | <%= link_to page_path('portfolio-item') do %> 59 | 60 | <% end %> 61 |
62 |
63 |

Project Three

64 |

Subheading

65 |

Lorem ipsum dolor sit amet, consectetur adipisicing elit. Omnis, temporibus, dolores, at, praesentium ut unde repudiandae voluptatum sit ab debitis suscipit fugiat natus velit excepturi amet commodi deleniti alias possimus!

66 | <%= link_to 'View Project', page_path('portfolio-item'), class: 'btn btn-primary' %> 67 |
68 |
69 | 70 | 71 |
72 | 73 | 74 |
75 | 76 |
77 | <%= link_to page_path('portfolio-item') do %> 78 | 79 | <% end %> 80 |
81 |
82 |

Project Four

83 |

Subheading

84 |

Lorem ipsum dolor sit amet, consectetur adipisicing elit. Explicabo, quidem, consectetur, officia rem officiis illum aliquam perspiciatis aspernatur quod modi hic nemo qui soluta aut eius fugit quam in suscipit?

85 | <%= link_to 'View Project', page_path('portfolio-item'), class: 'btn btn-primary' %> 86 |
87 |
88 | 89 | 90 |
91 | 92 | 93 |
94 |
95 | 96 | 97 | 98 |
99 |
100 |

Project Five

101 |

Subheading

102 |

Lorem ipsum dolor sit amet, consectetur adipisicing elit. Aliquid, quo, minima, inventore voluptatum saepe quos nostrum provident ex quisquam hic odio repellendus atque porro distinctio quae id laboriosam facilis dolorum.

103 | View Project 104 |
105 |
106 | 107 | 108 |
109 | 110 | 111 |
112 |
113 |
    114 |
  • 115 | « 116 |
  • 117 |
  • 118 | 1 119 |
  • 120 |
  • 121 | 2 122 |
  • 123 |
  • 124 | 3 125 |
  • 126 |
  • 127 | 4 128 |
  • 129 |
  • 130 | 5 131 |
  • 132 |
  • 133 | » 134 |
  • 135 |
136 |
137 |
138 | 139 | 140 |
141 | 142 | -------------------------------------------------------------------------------- /config/initializers/simple_form_bootstrap.rb: -------------------------------------------------------------------------------- 1 | # Use this setup block to configure all options available in SimpleForm. 2 | SimpleForm.setup do |config| 3 | config.error_notification_class = 'alert alert-danger' 4 | config.button_class = 'btn btn-default' 5 | config.boolean_label_class = nil 6 | 7 | config.wrappers :vertical_form, tag: 'div', class: 'form-group', error_class: 'has-error' do |b| 8 | b.use :html5 9 | b.use :placeholder 10 | b.optional :maxlength 11 | b.optional :pattern 12 | b.optional :min_max 13 | b.optional :readonly 14 | b.use :label, class: 'control-label' 15 | 16 | b.use :input, class: 'form-control' 17 | b.use :error, wrap_with: { tag: 'span', class: 'help-block' } 18 | b.use :hint, wrap_with: { tag: 'p', class: 'help-block' } 19 | end 20 | 21 | config.wrappers :vertical_file_input, tag: 'div', class: 'form-group', error_class: 'has-error' do |b| 22 | b.use :html5 23 | b.use :placeholder 24 | b.optional :maxlength 25 | b.optional :readonly 26 | b.use :label, class: 'control-label' 27 | 28 | b.use :input 29 | b.use :error, wrap_with: { tag: 'span', class: 'help-block' } 30 | b.use :hint, wrap_with: { tag: 'p', class: 'help-block' } 31 | end 32 | 33 | config.wrappers :vertical_boolean, tag: 'div', class: 'form-group', error_class: 'has-error' do |b| 34 | b.use :html5 35 | b.optional :readonly 36 | 37 | b.wrapper tag: 'div', class: 'checkbox' do |ba| 38 | ba.use :label_input 39 | end 40 | 41 | b.use :error, wrap_with: { tag: 'span', class: 'help-block' } 42 | b.use :hint, wrap_with: { tag: 'p', class: 'help-block' } 43 | end 44 | 45 | config.wrappers :vertical_radio_and_checkboxes, tag: 'div', class: 'form-group', error_class: 'has-error' do |b| 46 | b.use :html5 47 | b.optional :readonly 48 | b.use :label, class: 'control-label' 49 | b.use :input 50 | b.use :error, wrap_with: { tag: 'span', class: 'help-block' } 51 | b.use :hint, wrap_with: { tag: 'p', class: 'help-block' } 52 | end 53 | 54 | config.wrappers :horizontal_form, tag: 'div', class: 'form-group', error_class: 'has-error' do |b| 55 | b.use :html5 56 | b.use :placeholder 57 | b.optional :maxlength 58 | b.optional :pattern 59 | b.optional :min_max 60 | b.optional :readonly 61 | b.use :label, class: 'col-sm-3 control-label' 62 | 63 | b.wrapper tag: 'div', class: 'col-sm-9' do |ba| 64 | ba.use :input, class: 'form-control' 65 | ba.use :error, wrap_with: { tag: 'span', class: 'help-block' } 66 | ba.use :hint, wrap_with: { tag: 'p', class: 'help-block' } 67 | end 68 | end 69 | 70 | config.wrappers :horizontal_file_input, tag: 'div', class: 'form-group', error_class: 'has-error' do |b| 71 | b.use :html5 72 | b.use :placeholder 73 | b.optional :maxlength 74 | b.optional :readonly 75 | b.use :label, class: 'col-sm-3 control-label' 76 | 77 | b.wrapper tag: 'div', class: 'col-sm-9' do |ba| 78 | ba.use :input 79 | ba.use :error, wrap_with: { tag: 'span', class: 'help-block' } 80 | ba.use :hint, wrap_with: { tag: 'p', class: 'help-block' } 81 | end 82 | end 83 | 84 | config.wrappers :horizontal_boolean, tag: 'div', class: 'form-group', error_class: 'has-error' do |b| 85 | b.use :html5 86 | b.optional :readonly 87 | 88 | b.wrapper tag: 'div', class: 'col-sm-offset-3 col-sm-9' do |wr| 89 | wr.wrapper tag: 'div', class: 'checkbox' do |ba| 90 | ba.use :label_input 91 | end 92 | 93 | wr.use :error, wrap_with: { tag: 'span', class: 'help-block' } 94 | wr.use :hint, wrap_with: { tag: 'p', class: 'help-block' } 95 | end 96 | end 97 | 98 | config.wrappers :horizontal_radio_and_checkboxes, tag: 'div', class: 'form-group', error_class: 'has-error' do |b| 99 | b.use :html5 100 | b.optional :readonly 101 | 102 | b.use :label, class: 'col-sm-3 control-label' 103 | 104 | b.wrapper tag: 'div', class: 'col-sm-9' do |ba| 105 | ba.use :input 106 | ba.use :error, wrap_with: { tag: 'span', class: 'help-block' } 107 | ba.use :hint, wrap_with: { tag: 'p', class: 'help-block' } 108 | end 109 | end 110 | 111 | config.wrappers :inline_form, tag: 'div', class: 'form-group', error_class: 'has-error' do |b| 112 | b.use :html5 113 | b.use :placeholder 114 | b.optional :maxlength 115 | b.optional :pattern 116 | b.optional :min_max 117 | b.optional :readonly 118 | b.use :label, class: 'sr-only' 119 | 120 | b.use :input, class: 'form-control' 121 | b.use :error, wrap_with: { tag: 'span', class: 'help-block' } 122 | b.use :hint, wrap_with: { tag: 'p', class: 'help-block' } 123 | end 124 | 125 | config.wrappers :multi_select, tag: 'div', class: 'form-group', error_class: 'has-error' do |b| 126 | b.use :html5 127 | b.optional :readonly 128 | b.use :label, class: 'control-label' 129 | b.wrapper tag: 'div', class: 'form-inline' do |ba| 130 | ba.use :input, class: 'form-control' 131 | ba.use :error, wrap_with: { tag: 'span', class: 'help-block' } 132 | ba.use :hint, wrap_with: { tag: 'p', class: 'help-block' } 133 | end 134 | end 135 | # Wrappers for forms and inputs using the Bootstrap toolkit. 136 | # Check the Bootstrap docs (http://getbootstrap.com) 137 | # to learn about the different styles for forms and inputs, 138 | # buttons and other elements. 139 | config.default_wrapper = :vertical_form 140 | config.wrapper_mappings = { 141 | check_boxes: :vertical_radio_and_checkboxes, 142 | radio_buttons: :vertical_radio_and_checkboxes, 143 | file: :vertical_file_input, 144 | boolean: :vertical_boolean, 145 | datetime: :multi_select, 146 | date: :multi_select, 147 | time: :multi_select 148 | } 149 | end 150 | -------------------------------------------------------------------------------- /app/views/pages/portfolio-3-col.html.erb: -------------------------------------------------------------------------------- 1 | 2 |
3 | 4 | 5 |
6 |
7 |

Three Column Portfolio 8 | Subheading 9 |

10 | 15 |
16 |
17 | 18 | 19 | 20 |
21 |
22 | <%= link_to page_path('portfolio-item') do %> 23 | 24 | <% end %> 25 |

26 | <%= link_to 'Project Name', page_path('portfolio-item') %> 27 |

28 |

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam viverra euismod odio, gravida pellentesque urna varius vitae.

29 |
30 |
31 | <%= link_to page_path('portfolio-item') do %> 32 | 33 | <% end %> 34 |

35 | <%= link_to 'Project Name', page_path('portfolio-item') %> 36 |

37 |

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam viverra euismod odio, gravida pellentesque urna varius vitae.

38 |
39 |
40 | <%= link_to page_path('portfolio-item') do %> 41 | 42 | <% end %> 43 |

44 | <%= link_to 'Project Name', page_path('portfolio-item') %> 45 |

46 |

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam viverra euismod odio, gravida pellentesque urna varius vitae.

47 |
48 |
49 | 50 | 51 | 52 |
53 |
54 | <%= link_to page_path('portfolio-item') do %> 55 | 56 | <% end %> 57 |

58 | <%= link_to 'Project Name', page_path('portfolio-item') %> 59 |

60 |

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam viverra euismod odio, gravida pellentesque urna varius vitae.

61 |
62 |
63 | <%= link_to page_path('portfolio-item') do %> 64 | 65 | <% end %> 66 |

67 | <%= link_to 'Project Name', page_path('portfolio-item') %> 68 |

69 |

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam viverra euismod odio, gravida pellentesque urna varius vitae.

70 |
71 |
72 | <%= link_to page_path('portfolio-item') do %> 73 | 74 | <% end %> 75 |

76 | <%= link_to 'Project Name', page_path('portfolio-item') %> 77 |

78 |

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam viverra euismod odio, gravida pellentesque urna varius vitae.

79 |
80 |
81 | 82 | 83 |
84 |
85 | <%= link_to page_path('portfolio-item') do %> 86 | 87 | <% end %> 88 |

89 | <%= link_to 'Project Name', page_path('portfolio-item') %> 90 |

91 |

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam viverra euismod odio, gravida pellentesque urna varius vitae.

92 |
93 |
94 | <%= link_to page_path('portfolio-item') do %> 95 | 96 | <% end %> 97 |

98 | <%= link_to 'Project Name', page_path('portfolio-item') %> 99 |

100 |

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam viverra euismod odio, gravida pellentesque urna varius vitae.

101 |
102 |
103 | <%= link_to page_path('portfolio-item') do %> 104 | 105 | <% end %> 106 |

107 | <%= link_to 'Project Name', page_path('portfolio-item') %> 108 |

109 |

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam viverra euismod odio, gravida pellentesque urna varius vitae.

110 |
111 |
112 | 113 | 114 |
115 | 116 | 117 |
118 |
119 |
    120 |
  • 121 | « 122 |
  • 123 |
  • 124 | 1 125 |
  • 126 |
  • 127 | 2 128 |
  • 129 |
  • 130 | 3 131 |
  • 132 |
  • 133 | 4 134 |
  • 135 |
  • 136 | 5 137 |
  • 138 |
  • 139 | » 140 |
  • 141 |
142 |
143 |
144 | 145 | 146 |
147 | 148 | -------------------------------------------------------------------------------- /app/views/pages/blog-home-1.html.erb: -------------------------------------------------------------------------------- 1 | 2 |
3 | 4 | 5 |
6 |
7 |

Blog Home One 8 | Subheading 9 |

10 | 15 |
16 |
17 | 18 | 19 |
20 | 21 | 22 |
23 | 24 | 25 |

26 | Blog Post Title 27 |

28 |

29 | by <%= link_to 'Start Bootstrap', root_path %> 30 |

31 |

Posted on August 28, 2013 at 10:00 PM

32 |
33 | <%= link_to page_path('blog-post') do %> 34 | 35 | <% end %> 36 |
37 |

Lorem ipsum dolor sit amet, consectetur adipisicing elit. Dolore, veritatis, tempora, necessitatibus inventore nisi quam quia repellat ut tempore laborum possimus eum dicta id animi corrupti debitis ipsum officiis rerum.

38 | <%= link_to page_path('blog-post'), class: 'btn btn-primary' do %> 39 | Read More 40 | <% end %> 41 |
42 | 43 | 44 |

45 | Blog Post Title 46 |

47 |

48 | by <%= link_to 'Start Bootstrap', root_path %> 49 |

50 |

Posted on August 28, 2013 at 10:45 PM

51 |
52 | <%= link_to page_path('blog-post') do %> 53 | 54 | <% end %> 55 |
56 |

Lorem ipsum dolor sit amet, consectetur adipisicing elit. Quibusdam, quasi, fugiat, asperiores harum voluptatum tenetur a possimus nesciunt quod accusamus saepe tempora ipsam distinctio minima dolorum perferendis labore impedit voluptates!

57 | <%= link_to page_path('blog-post'), class: 'btn btn-primary' do %> 58 | Read More 59 | <% end %> 60 | 61 |
62 | 63 | 64 |

65 | Blog Post Title 66 |

67 |

68 | by <%= link_to 'Start Bootstrap', root_path %> 69 |

70 |

Posted on August 28, 2013 at 10:45 PM

71 |
72 | <%= link_to page_path('blog-post') do %> 73 | 74 | <% end %> 75 |
76 |

Lorem ipsum dolor sit amet, consectetur adipisicing elit. Cupiditate, voluptates, voluptas dolore ipsam cumque quam veniam accusantium laudantium adipisci architecto itaque dicta aperiam maiores provident id incidunt autem. Magni, ratione.

77 | <%= link_to page_path('blog-post'), class: 'btn btn-primary' do %> 78 | Read More 79 | <% end %> 80 | 81 |
82 | 83 | 84 | 92 | 93 |
94 | 95 | 96 |
97 | 98 | 99 |
100 |

Blog Search

101 |
102 | 103 | 104 | 105 | 106 |
107 | 108 |
109 | 110 | 111 |
112 |

Blog Categories

113 |
114 |
115 | 125 |
126 | 127 |
128 | 138 |
139 | 140 |
141 | 142 |
143 | 144 | 145 |
146 |

Side Widget Well

147 |

Lorem ipsum dolor sit amet, consectetur adipisicing elit. Inventore, perspiciatis adipisci accusamus laudantium odit aliquam repellat tempore quos aspernatur vero.

148 |
149 | 150 |
151 | 152 |
153 | 154 | 155 |
156 | 157 | -------------------------------------------------------------------------------- /config/initializers/simple_form.rb: -------------------------------------------------------------------------------- 1 | # Use this setup block to configure all options available in SimpleForm. 2 | SimpleForm.setup do |config| 3 | # Wrappers are used by the form builder to generate a 4 | # complete input. You can remove any component from the 5 | # wrapper, change the order or even add your own to the 6 | # stack. The options given below are used to wrap the 7 | # whole input. 8 | config.wrappers :default, class: :input, 9 | hint_class: :field_with_hint, error_class: :field_with_errors do |b| 10 | ## Extensions enabled by default 11 | # Any of these extensions can be disabled for a 12 | # given input by passing: `f.input EXTENSION_NAME => false`. 13 | # You can make any of these extensions optional by 14 | # renaming `b.use` to `b.optional`. 15 | 16 | # Determines whether to use HTML5 (:email, :url, ...) 17 | # and required attributes 18 | b.use :html5 19 | 20 | # Calculates placeholders automatically from I18n 21 | # You can also pass a string as f.input placeholder: "Placeholder" 22 | b.use :placeholder 23 | 24 | ## Optional extensions 25 | # They are disabled unless you pass `f.input EXTENSION_NAME => true` 26 | # to the input. If so, they will retrieve the values from the model 27 | # if any exists. If you want to enable any of those 28 | # extensions by default, you can change `b.optional` to `b.use`. 29 | 30 | # Calculates maxlength from length validations for string inputs 31 | b.optional :maxlength 32 | 33 | # Calculates pattern from format validations for string inputs 34 | b.optional :pattern 35 | 36 | # Calculates min and max from length validations for numeric inputs 37 | b.optional :min_max 38 | 39 | # Calculates readonly automatically from readonly attributes 40 | b.optional :readonly 41 | 42 | ## Inputs 43 | b.use :label_input 44 | b.use :hint, wrap_with: { tag: :span, class: :hint } 45 | b.use :error, wrap_with: { tag: :span, class: :error } 46 | 47 | ## full_messages_for 48 | # If you want to display the full error message for the attribute, you can 49 | # use the component :full_error, like: 50 | # 51 | # b.use :full_error, wrap_with: { tag: :span, class: :error } 52 | end 53 | 54 | # The default wrapper to be used by the FormBuilder. 55 | config.default_wrapper = :default 56 | 57 | # Define the way to render check boxes / radio buttons with labels. 58 | # Defaults to :nested for bootstrap config. 59 | # inline: input + label 60 | # nested: label > input 61 | config.boolean_style = :nested 62 | 63 | # Default class for buttons 64 | config.button_class = 'btn' 65 | 66 | # Method used to tidy up errors. Specify any Rails Array method. 67 | # :first lists the first message for each field. 68 | # Use :to_sentence to list all errors for each field. 69 | # config.error_method = :first 70 | 71 | # Default tag used for error notification helper. 72 | config.error_notification_tag = :div 73 | 74 | # CSS class to add for error notification helper. 75 | config.error_notification_class = 'error_notification' 76 | 77 | # ID to add for error notification helper. 78 | # config.error_notification_id = nil 79 | 80 | # Series of attempts to detect a default label method for collection. 81 | # config.collection_label_methods = [ :to_label, :name, :title, :to_s ] 82 | 83 | # Series of attempts to detect a default value method for collection. 84 | # config.collection_value_methods = [ :id, :to_s ] 85 | 86 | # You can wrap a collection of radio/check boxes in a pre-defined tag, defaulting to none. 87 | # config.collection_wrapper_tag = nil 88 | 89 | # You can define the class to use on all collection wrappers. Defaulting to none. 90 | # config.collection_wrapper_class = nil 91 | 92 | # You can wrap each item in a collection of radio/check boxes with a tag, 93 | # defaulting to :span. 94 | # config.item_wrapper_tag = :span 95 | 96 | # You can define a class to use in all item wrappers. Defaulting to none. 97 | # config.item_wrapper_class = nil 98 | 99 | # How the label text should be generated altogether with the required text. 100 | # config.label_text = lambda { |label, required, explicit_label| "#{required} #{label}" } 101 | 102 | # You can define the class to use on all labels. Default is nil. 103 | # config.label_class = nil 104 | 105 | # You can define the default class to be used on forms. Can be overriden 106 | # with `html: { :class }`. Defaulting to none. 107 | # config.default_form_class = nil 108 | 109 | # You can define which elements should obtain additional classes 110 | # config.generate_additional_classes_for = [:wrapper, :label, :input] 111 | 112 | # Whether attributes are required by default (or not). Default is true. 113 | # config.required_by_default = true 114 | 115 | # Tell browsers whether to use the native HTML5 validations (novalidate form option). 116 | # These validations are enabled in SimpleForm's internal config but disabled by default 117 | # in this configuration, which is recommended due to some quirks from different browsers. 118 | # To stop SimpleForm from generating the novalidate option, enabling the HTML5 validations, 119 | # change this configuration to true. 120 | config.browser_validations = false 121 | 122 | # Collection of methods to detect if a file type was given. 123 | # config.file_methods = [ :mounted_as, :file?, :public_filename ] 124 | 125 | # Custom mappings for input types. This should be a hash containing a regexp 126 | # to match as key, and the input type that will be used when the field name 127 | # matches the regexp as value. 128 | # config.input_mappings = { /count/ => :integer } 129 | 130 | # Custom wrappers for input types. This should be a hash containing an input 131 | # type as key and the wrapper that will be used for all inputs with specified type. 132 | # config.wrapper_mappings = { string: :prepend } 133 | 134 | # Namespaces where SimpleForm should look for custom input classes that 135 | # override default inputs. 136 | # config.custom_inputs_namespaces << "CustomInputs" 137 | 138 | # Default priority for time_zone inputs. 139 | # config.time_zone_priority = nil 140 | 141 | # Default priority for country inputs. 142 | # config.country_priority = nil 143 | 144 | # When false, do not use translations for labels. 145 | # config.translate_labels = true 146 | 147 | # Automatically discover new inputs in Rails' autoload path. 148 | # config.inputs_discovery = true 149 | 150 | # Cache SimpleForm inputs discovery 151 | # config.cache_discovery = !Rails.env.development? 152 | 153 | # Default class for inputs 154 | # config.input_class = nil 155 | 156 | # Define the default class of the input wrapper of the boolean input. 157 | config.boolean_label_class = 'checkbox' 158 | 159 | # Defines if the default input wrapper class should be included in radio 160 | # collection wrappers. 161 | # config.include_default_input_wrapper_class = true 162 | 163 | # Defines which i18n scope will be used in Simple Form. 164 | # config.i18n_scope = 'simple_form' 165 | end 166 | -------------------------------------------------------------------------------- /Gemfile.lock: -------------------------------------------------------------------------------- 1 | GEM 2 | remote: https://rubygems.org/ 3 | specs: 4 | actionmailer (4.2.6) 5 | actionpack (= 4.2.6) 6 | actionview (= 4.2.6) 7 | activejob (= 4.2.6) 8 | mail (~> 2.5, >= 2.5.4) 9 | rails-dom-testing (~> 1.0, >= 1.0.5) 10 | actionpack (4.2.6) 11 | actionview (= 4.2.6) 12 | activesupport (= 4.2.6) 13 | rack (~> 1.6) 14 | rack-test (~> 0.6.2) 15 | rails-dom-testing (~> 1.0, >= 1.0.5) 16 | rails-html-sanitizer (~> 1.0, >= 1.0.2) 17 | actionview (4.2.6) 18 | activesupport (= 4.2.6) 19 | builder (~> 3.1) 20 | erubis (~> 2.7.0) 21 | rails-dom-testing (~> 1.0, >= 1.0.5) 22 | rails-html-sanitizer (~> 1.0, >= 1.0.2) 23 | activejob (4.2.6) 24 | activesupport (= 4.2.6) 25 | globalid (>= 0.3.0) 26 | activemodel (4.2.6) 27 | activesupport (= 4.2.6) 28 | builder (~> 3.1) 29 | activerecord (4.2.6) 30 | activemodel (= 4.2.6) 31 | activesupport (= 4.2.6) 32 | arel (~> 6.0) 33 | activesupport (4.2.6) 34 | i18n (~> 0.7) 35 | json (~> 1.7, >= 1.7.7) 36 | minitest (~> 5.1) 37 | thread_safe (~> 0.3, >= 0.3.4) 38 | tzinfo (~> 1.1) 39 | airbrussh (1.0.1) 40 | sshkit (>= 1.6.1, != 1.7.0) 41 | arel (6.0.3) 42 | ast (2.2.0) 43 | autoprefixer-rails (6.3.6) 44 | execjs 45 | better_errors (2.1.1) 46 | coderay (>= 1.0.0) 47 | erubis (>= 2.6.6) 48 | rack (>= 0.9.0) 49 | binding_of_caller (0.7.2) 50 | debug_inspector (>= 0.0.1) 51 | bootstrap-kaminari-views (0.0.5) 52 | kaminari (>= 0.13) 53 | rails (>= 3.1) 54 | bootstrap-sass (3.3.6) 55 | autoprefixer-rails (>= 5.2.1) 56 | sass (>= 3.3.4) 57 | builder (3.2.2) 58 | byebug (8.2.5) 59 | capistrano (3.5.0) 60 | airbrussh (>= 1.0.0) 61 | capistrano-harrow 62 | i18n 63 | rake (>= 10.0.0) 64 | sshkit (>= 1.9.0) 65 | capistrano-bundler (1.1.2) 66 | capistrano (~> 3.0) 67 | sshkit (~> 1.2) 68 | capistrano-harrow (0.4.0) 69 | capistrano-rails (1.1.6) 70 | capistrano (~> 3.1) 71 | capistrano-bundler (~> 1.1) 72 | capistrano3-puma (1.2.1) 73 | capistrano (~> 3.0) 74 | puma (>= 2.6) 75 | chartkick (1.4.2) 76 | coderay (1.1.1) 77 | coffee-rails (4.1.1) 78 | coffee-script (>= 2.2.0) 79 | railties (>= 4.0.0, < 5.1.x) 80 | coffee-script (2.4.1) 81 | coffee-script-source 82 | execjs 83 | coffee-script-source (1.10.0) 84 | concurrent-ruby (1.0.1) 85 | dalli (2.7.6) 86 | debug_inspector (0.0.2) 87 | erubis (2.7.0) 88 | execjs (2.6.0) 89 | geoip (1.6.1) 90 | globalid (0.3.6) 91 | activesupport (>= 4.1.0) 92 | groupdate (2.5.3) 93 | activesupport (>= 3) 94 | i18n (0.7.0) 95 | interception (0.5) 96 | jbuilder (2.4.1) 97 | activesupport (>= 3.0.0, < 5.1) 98 | multi_json (~> 1.2) 99 | jquery-rails (4.1.1) 100 | rails-dom-testing (>= 1, < 3) 101 | railties (>= 4.2.0) 102 | thor (>= 0.14, < 2.0) 103 | json (1.8.3) 104 | kaminari (0.16.3) 105 | actionpack (>= 3.0.0) 106 | activesupport (>= 3.0.0) 107 | loofah (2.0.3) 108 | nokogiri (>= 1.5.9) 109 | mail (2.6.4) 110 | mime-types (>= 1.16, < 4) 111 | method_source (0.8.2) 112 | mime-types (3.0) 113 | mime-types-data (~> 3.2015) 114 | mime-types-data (3.2016.0221) 115 | mini_portile2 (2.0.0) 116 | minitest (5.8.4) 117 | multi_json (1.11.3) 118 | net-scp (1.2.1) 119 | net-ssh (>= 2.6.5) 120 | net-ssh (3.1.1) 121 | nokogiri (1.6.7.2) 122 | mini_portile2 (~> 2.0.0.rc2) 123 | oj (2.17.3) 124 | parser (2.3.1.0) 125 | ast (~> 2.2) 126 | pg (0.18.4) 127 | powerpack (0.1.1) 128 | pry (0.10.3) 129 | coderay (~> 1.1.0) 130 | method_source (~> 0.8.1) 131 | slop (~> 3.4) 132 | pry-rails (0.3.4) 133 | pry (>= 0.9.10) 134 | pry-rescue (1.4.2) 135 | interception (>= 0.5) 136 | pry 137 | puma (3.4.0) 138 | quiet_assets (1.1.0) 139 | railties (>= 3.1, < 5.0) 140 | rack (1.6.4) 141 | rack-test (0.6.3) 142 | rack (>= 1.0) 143 | rails (4.2.6) 144 | actionmailer (= 4.2.6) 145 | actionpack (= 4.2.6) 146 | actionview (= 4.2.6) 147 | activejob (= 4.2.6) 148 | activemodel (= 4.2.6) 149 | activerecord (= 4.2.6) 150 | activesupport (= 4.2.6) 151 | bundler (>= 1.3.0, < 2.0) 152 | railties (= 4.2.6) 153 | sprockets-rails 154 | rails-deprecated_sanitizer (1.0.3) 155 | activesupport (>= 4.2.0.alpha) 156 | rails-dom-testing (1.0.7) 157 | activesupport (>= 4.2.0.beta, < 5.0) 158 | nokogiri (~> 1.6.0) 159 | rails-deprecated_sanitizer (>= 1.0.1) 160 | rails-html-sanitizer (1.0.3) 161 | loofah (~> 2.0) 162 | rails_layout (1.0.29) 163 | railties (4.2.6) 164 | actionpack (= 4.2.6) 165 | activesupport (= 4.2.6) 166 | rake (>= 0.8.7) 167 | thor (>= 0.18.1, < 2.0) 168 | rainbow (2.1.0) 169 | rake (11.1.2) 170 | rubocop (0.39.0) 171 | parser (>= 2.3.0.7, < 3.0) 172 | powerpack (~> 0.1) 173 | rainbow (>= 1.99.1, < 3.0) 174 | ruby-progressbar (~> 1.7) 175 | unicode-display_width (~> 1.0, >= 1.0.1) 176 | ruby-progressbar (1.8.0) 177 | sass (3.4.22) 178 | sass-rails (5.0.4) 179 | railties (>= 4.0.0, < 5.0) 180 | sass (~> 3.1) 181 | sprockets (>= 2.8, < 4.0) 182 | sprockets-rails (>= 2.0, < 4.0) 183 | tilt (>= 1.1, < 3) 184 | simple_form (3.2.1) 185 | actionpack (> 4, < 5.1) 186 | activemodel (> 4, < 5.1) 187 | slim (3.0.6) 188 | temple (~> 0.7.3) 189 | tilt (>= 1.3.3, < 2.1) 190 | slim-rails (3.0.1) 191 | actionmailer (>= 3.1, < 5.0) 192 | actionpack (>= 3.1, < 5.0) 193 | activesupport (>= 3.1, < 5.0) 194 | railties (>= 3.1, < 5.0) 195 | slim (~> 3.0) 196 | slop (3.6.0) 197 | spring (1.7.1) 198 | sprockets (3.6.0) 199 | concurrent-ruby (~> 1.0) 200 | rack (> 1, < 3) 201 | sprockets-rails (3.0.4) 202 | actionpack (>= 4.0) 203 | activesupport (>= 4.0) 204 | sprockets (>= 3.0.0) 205 | sshkit (1.10.0) 206 | net-scp (>= 1.1.2) 207 | net-ssh (>= 2.8.0) 208 | temple (0.7.6) 209 | thor (0.19.1) 210 | thread_safe (0.3.5) 211 | tilt (2.0.2) 212 | tzinfo (1.2.2) 213 | thread_safe (~> 0.1) 214 | uglifier (3.0.0) 215 | execjs (>= 0.3.0, < 3) 216 | unicode-display_width (1.0.3) 217 | web-console (2.3.0) 218 | activemodel (>= 4.0) 219 | binding_of_caller (>= 0.7.2) 220 | railties (>= 4.0) 221 | sprockets-rails (>= 2.0, < 4.0) 222 | 223 | PLATFORMS 224 | ruby 225 | 226 | DEPENDENCIES 227 | better_errors 228 | binding_of_caller 229 | bootstrap-kaminari-views 230 | bootstrap-sass 231 | byebug 232 | capistrano 233 | capistrano-bundler (~> 1.1.2) 234 | capistrano-rails (~> 1.1.3) 235 | capistrano3-puma 236 | chartkick 237 | coffee-rails (~> 4.1.0) 238 | dalli 239 | geoip 240 | groupdate 241 | jbuilder (~> 2.0) 242 | jquery-rails 243 | kaminari 244 | oj 245 | pg 246 | pry-rails 247 | pry-rescue 248 | puma 249 | quiet_assets 250 | rails (= 4.2.6) 251 | rails_layout 252 | rubocop 253 | sass-rails (~> 5.0) 254 | simple_form 255 | slim-rails 256 | spring 257 | uglifier (>= 1.3.0) 258 | web-console (~> 2.0) 259 | 260 | BUNDLED WITH 261 | 1.12.1 262 | -------------------------------------------------------------------------------- /app/views/pages/blog-post.html.erb: -------------------------------------------------------------------------------- 1 | 2 |
3 | 4 | 5 |
6 |
7 |

Blog Post 8 | by Start Bootstrap 9 | 10 |

11 | 16 |
17 |
18 | 19 | 20 | 21 |
22 | 23 | 24 |
25 | 26 | 27 | 28 |
29 | 30 | 31 |

Posted on August 24, 2013 at 9:00 PM

32 | 33 |
34 | 35 | 36 | 37 | 38 |
39 | 40 | 41 |

Lorem ipsum dolor sit amet, consectetur adipisicing elit. Ducimus, vero, obcaecati, aut, error quam sapiente nemo saepe quibusdam sit excepturi nam quia corporis eligendi eos magni recusandae laborum minus inventore?

42 |

Lorem ipsum dolor sit amet, consectetur adipisicing elit. Ut, tenetur natus doloremque laborum quos iste ipsum rerum obcaecati impedit odit illo dolorum ab tempora nihil dicta earum fugiat. Temporibus, voluptatibus.

43 |

Lorem ipsum dolor sit amet, consectetur adipisicing elit. Eos, doloribus, dolorem iusto blanditiis unde eius illum consequuntur neque dicta incidunt ullam ea hic porro optio ratione repellat perspiciatis. Enim, iure!

44 |

Lorem ipsum dolor sit amet, consectetur adipisicing elit. Error, nostrum, aliquid, animi, ut quas placeat totam sunt tempora commodi nihil ullam alias modi dicta saepe minima ab quo voluptatem obcaecati?

45 |

Lorem ipsum dolor sit amet, consectetur adipisicing elit. Harum, dolor quis. Sunt, ut, explicabo, aliquam tenetur ratione tempore quidem voluptates cupiditate voluptas illo saepe quaerat numquam recusandae? Qui, necessitatibus, est!

46 | 47 |
48 | 49 | 50 | 51 | 52 |
53 |

Leave a Comment:

54 |
55 |
56 | 57 |
58 | 59 |
60 |
61 | 62 |
63 | 64 | 65 | 66 | 67 |
68 | 69 | 70 | 71 |
72 |

Start Bootstrap 73 | August 25, 2014 at 9:30 PM 74 |

75 | Cras sit amet nibh libero, in gravida nulla. Nulla vel metus scelerisque ante sollicitudin commodo. Cras purus odio, vestibulum in vulputate at, tempus viverra turpis. Fusce condimentum nunc ac nisi vulputate fringilla. Donec lacinia congue felis in faucibus. 76 |
77 |
78 | 79 | 80 |
81 | 82 | 83 | 84 |
85 |

Start Bootstrap 86 | August 25, 2014 at 9:30 PM 87 |

88 | Cras sit amet nibh libero, in gravida nulla. Nulla vel metus scelerisque ante sollicitudin commodo. Cras purus odio, vestibulum in vulputate at, tempus viverra turpis. Fusce condimentum nunc ac nisi vulputate fringilla. Donec lacinia congue felis in faucibus. 89 | 90 |
91 | 92 | 93 | 94 |
95 |

Nested Start Bootstrap 96 | August 25, 2014 at 9:30 PM 97 |

98 | Cras sit amet nibh libero, in gravida nulla. Nulla vel metus scelerisque ante sollicitudin commodo. Cras purus odio, vestibulum in vulputate at, tempus viverra turpis. Fusce condimentum nunc ac nisi vulputate fringilla. Donec lacinia congue felis in faucibus. 99 |
100 |
101 | 102 |
103 |
104 | 105 |
106 | 107 | 108 |
109 | 110 | 111 |
112 |

Blog Search

113 |
114 | 115 | 116 | 117 | 118 |
119 | 120 |
121 | 122 | 123 |
124 |

Blog Categories

125 |
126 |
127 | 137 |
138 |
139 | 149 |
150 |
151 | 152 |
153 | 154 | 155 |
156 |

Side Widget Well

157 |

Lorem ipsum dolor sit amet, consectetur adipisicing elit. Inventore, perspiciatis adipisci accusamus laudantium odit aliquam repellat tempore quos aspernatur vero.

158 |
159 | 160 |
161 | 162 |
163 | 164 | 165 |
166 | 167 | -------------------------------------------------------------------------------- /app/views/pages/about.html.erb: -------------------------------------------------------------------------------- 1 | 2 |
3 | 4 | 5 |
6 |
7 |

About 8 | Subheading 9 |

10 | 15 |
16 |
17 | 18 | 19 | 20 |
21 |
22 | 23 |
24 |
25 |

About Modern Business

26 |

Lorem ipsum dolor sit amet, consectetur adipisicing elit. Sed voluptate nihil eum consectetur similique? Consectetur, quod, incidunt, harum nisi dolores delectus reprehenderit voluptatem perferendis dicta dolorem non blanditiis ex fugiat.

27 |

Lorem ipsum dolor sit amet, consectetur adipisicing elit. Saepe, magni, aperiam vitae illum voluptatum aut sequi impedit non velit ab ea pariatur sint quidem corporis eveniet. Odit, temporibus reprehenderit dolorum!

28 |

Lorem ipsum dolor sit amet, consectetur adipisicing elit. Et, consequuntur, modi mollitia corporis ipsa voluptate corrupti eum ratione ex ea praesentium quibusdam? Aut, in eum facere corrupti necessitatibus perspiciatis quis?

29 |
30 |
31 | 32 | 33 | 34 |
35 |
36 | 37 |
38 |
39 |
40 | 41 |
42 |

John Smith
43 | Job Title 44 |

45 |

Lorem ipsum dolor sit amet, consectetur adipisicing elit. Iste saepe et quisquam nesciunt maxime.

46 |
    47 |
  • 48 |
  • 49 |
  • 50 |
  • 51 |
  • 52 |
  • 53 |
54 |
55 |
56 |
57 |
58 |
59 | 60 |
61 |

John Smith
62 | Job Title 63 |

64 |

Lorem ipsum dolor sit amet, consectetur adipisicing elit. Iste saepe et quisquam nesciunt maxime.

65 |
    66 |
  • 67 |
  • 68 |
  • 69 |
  • 70 |
  • 71 |
  • 72 |
73 |
74 |
75 |
76 |
77 |
78 | 79 |
80 |

John Smith
81 | Job Title 82 |

83 |

Lorem ipsum dolor sit amet, consectetur adipisicing elit. Iste saepe et quisquam nesciunt maxime.

84 |
    85 |
  • 86 |
  • 87 |
  • 88 |
  • 89 |
  • 90 |
  • 91 |
92 |
93 |
94 |
95 |
96 |
97 | 98 |
99 |

John Smith
100 | Job Title 101 |

102 |

Lorem ipsum dolor sit amet, consectetur adipisicing elit. Iste saepe et quisquam nesciunt maxime.

103 |
    104 |
  • 105 |
  • 106 |
  • 107 |
  • 108 |
  • 109 |
  • 110 |
111 |
112 |
113 |
114 |
115 |
116 | 117 |
118 |

John Smith
119 | Job Title 120 |

121 |

Lorem ipsum dolor sit amet, consectetur adipisicing elit. Iste saepe et quisquam nesciunt maxime.

122 |
    123 |
  • 124 |
  • 125 |
  • 126 |
  • 127 |
  • 128 |
  • 129 |
130 |
131 |
132 |
133 |
134 |
135 | 136 |
137 |

John Smith
138 | Job Title 139 |

140 |

Lorem ipsum dolor sit amet, consectetur adipisicing elit. Iste saepe et quisquam nesciunt maxime.

141 |
    142 |
  • 143 |
  • 144 |
  • 145 |
  • 146 |
  • 147 |
  • 148 |
149 |
150 |
151 |
152 |
153 | 154 | 155 | 156 |
157 |
158 | 159 |
160 |
161 | 162 |
163 |
164 | 165 |
166 |
167 | 168 |
169 |
170 | 171 |
172 |
173 | 174 |
175 |
176 | 177 |
178 |
179 | 180 | 181 |
182 | 183 | -------------------------------------------------------------------------------- /app/views/pages/faq.html.erb: -------------------------------------------------------------------------------- 1 | 2 |
3 | 4 | 5 |
6 |
7 |

FAQ 8 | Subheading 9 |

10 | 15 |
16 |
17 | 18 | 19 | 20 |
21 |
22 |
23 |
24 | 29 |
30 |
31 | Anim pariatur cliche reprehenderit, enim eiusmod high life accusamus terry richardson ad squid. 3 wolf moon officia aute, non cupidatat skateboard dolor brunch. Food truck quinoa nesciunt laborum eiusmod. Brunch 3 wolf moon tempor, sunt aliqua put a bird on it squid single-origin coffee nulla assumenda shoreditch et. Nihil anim keffiyeh helvetica, craft beer labore wes anderson cred nesciunt sapiente ea proident. Ad vegan excepteur butcher vice lomo. Leggings occaecat craft beer farm-to-table, raw denim aesthetic synth nesciunt you probably haven't heard of them accusamus labore sustainable VHS. 32 |
33 |
34 |
35 | 36 |
37 | 42 |
43 |
44 | Anim pariatur cliche reprehenderit, enim eiusmod high life accusamus terry richardson ad squid. 3 wolf moon officia aute, non cupidatat skateboard dolor brunch. Food truck quinoa nesciunt laborum eiusmod. Brunch 3 wolf moon tempor, sunt aliqua put a bird on it squid single-origin coffee nulla assumenda shoreditch et. Nihil anim keffiyeh helvetica, craft beer labore wes anderson cred nesciunt sapiente ea proident. Ad vegan excepteur butcher vice lomo. Leggings occaecat craft beer farm-to-table, raw denim aesthetic synth nesciunt you probably haven't heard of them accusamus labore sustainable VHS. 45 |
46 |
47 |
48 | 49 |
50 | 55 |
56 |
57 | Anim pariatur cliche reprehenderit, enim eiusmod high life accusamus terry richardson ad squid. 3 wolf moon officia aute, non cupidatat skateboard dolor brunch. Food truck quinoa nesciunt laborum eiusmod. Brunch 3 wolf moon tempor, sunt aliqua put a bird on it squid single-origin coffee nulla assumenda shoreditch et. Nihil anim keffiyeh helvetica, craft beer labore wes anderson cred nesciunt sapiente ea proident. Ad vegan excepteur butcher vice lomo. Leggings occaecat craft beer farm-to-table, raw denim aesthetic synth nesciunt you probably haven't heard of them accusamus labore sustainable VHS. 58 |
59 |
60 |
61 | 62 |
63 | 68 |
69 |
70 | Anim pariatur cliche reprehenderit, enim eiusmod high life accusamus terry richardson ad squid. 3 wolf moon officia aute, non cupidatat skateboard dolor brunch. Food truck quinoa nesciunt laborum eiusmod. Brunch 3 wolf moon tempor, sunt aliqua put a bird on it squid single-origin coffee nulla assumenda shoreditch et. Nihil anim keffiyeh helvetica, craft beer labore wes anderson cred nesciunt sapiente ea proident. Ad vegan excepteur butcher vice lomo. Leggings occaecat craft beer farm-to-table, raw denim aesthetic synth nesciunt you probably haven't heard of them accusamus labore sustainable VHS. 71 |
72 |
73 |
74 | 75 |
76 | 81 |
82 |
83 | Anim pariatur cliche reprehenderit, enim eiusmod high life accusamus terry richardson ad squid. 3 wolf moon officia aute, non cupidatat skateboard dolor brunch. Food truck quinoa nesciunt laborum eiusmod. Brunch 3 wolf moon tempor, sunt aliqua put a bird on it squid single-origin coffee nulla assumenda shoreditch et. Nihil anim keffiyeh helvetica, craft beer labore wes anderson cred nesciunt sapiente ea proident. Ad vegan excepteur butcher vice lomo. Leggings occaecat craft beer farm-to-table, raw denim aesthetic synth nesciunt you probably haven't heard of them accusamus labore sustainable VHS. 84 |
85 |
86 |
87 | 88 |
89 | 94 |
95 |
96 | Anim pariatur cliche reprehenderit, enim eiusmod high life accusamus terry richardson ad squid. 3 wolf moon officia aute, non cupidatat skateboard dolor brunch. Food truck quinoa nesciunt laborum eiusmod. Brunch 3 wolf moon tempor, sunt aliqua put a bird on it squid single-origin coffee nulla assumenda shoreditch et. Nihil anim keffiyeh helvetica, craft beer labore wes anderson cred nesciunt sapiente ea proident. Ad vegan excepteur butcher vice lomo. Leggings occaecat craft beer farm-to-table, raw denim aesthetic synth nesciunt you probably haven't heard of them accusamus labore sustainable VHS. 97 |
98 |
99 |
100 | 101 |
102 | 107 |
108 |
109 | Anim pariatur cliche reprehenderit, enim eiusmod high life accusamus terry richardson ad squid. 3 wolf moon officia aute, non cupidatat skateboard dolor brunch. Food truck quinoa nesciunt laborum eiusmod. Brunch 3 wolf moon tempor, sunt aliqua put a bird on it squid single-origin coffee nulla assumenda shoreditch et. Nihil anim keffiyeh helvetica, craft beer labore wes anderson cred nesciunt sapiente ea proident. Ad vegan excepteur butcher vice lomo. Leggings occaecat craft beer farm-to-table, raw denim aesthetic synth nesciunt you probably haven't heard of them accusamus labore sustainable VHS. 110 |
111 |
112 |
113 | 114 |
115 | 120 |
121 |
122 | Anim pariatur cliche reprehenderit, enim eiusmod high life accusamus terry richardson ad squid. 3 wolf moon officia aute, non cupidatat skateboard dolor brunch. Food truck quinoa nesciunt laborum eiusmod. Brunch 3 wolf moon tempor, sunt aliqua put a bird on it squid single-origin coffee nulla assumenda shoreditch et. Nihil anim keffiyeh helvetica, craft beer labore wes anderson cred nesciunt sapiente ea proident. Ad vegan excepteur butcher vice lomo. Leggings occaecat craft beer farm-to-table, raw denim aesthetic synth nesciunt you probably haven't heard of them accusamus labore sustainable VHS. 123 |
124 |
125 |
126 | 127 |
128 | 133 |
134 |
135 | Anim pariatur cliche reprehenderit, enim eiusmod high life accusamus terry richardson ad squid. 3 wolf moon officia aute, non cupidatat skateboard dolor brunch. Food truck quinoa nesciunt laborum eiusmod. Brunch 3 wolf moon tempor, sunt aliqua put a bird on it squid single-origin coffee nulla assumenda shoreditch et. Nihil anim keffiyeh helvetica, craft beer labore wes anderson cred nesciunt sapiente ea proident. Ad vegan excepteur butcher vice lomo. Leggings occaecat craft beer farm-to-table, raw denim aesthetic synth nesciunt you probably haven't heard of them accusamus labore sustainable VHS. 136 |
137 |
138 |
139 | 140 |
141 | 142 |
143 | 144 |
145 | 146 | 147 |
148 | 149 | -------------------------------------------------------------------------------- /app/views/pages/services.html.erb: -------------------------------------------------------------------------------- 1 | 2 |
3 | 4 | 5 |
6 |
7 |

Services 8 | Subheading 9 |

10 | 15 |
16 |
17 | 18 | 19 | 20 |
21 |
22 | 23 |
24 |
25 | 26 | 27 | 28 | 29 |
30 |
31 | 32 |
33 |
34 |
35 |
36 | 37 | 38 | 39 | 40 |
41 |
42 |

Service One

43 |

Lorem ipsum dolor sit amet, consectetur adipisicing elit.

44 | Learn More 45 |
46 |
47 |
48 |
49 |
50 |
51 | 52 | 53 | 54 | 55 |
56 |
57 |

Service Two

58 |

Lorem ipsum dolor sit amet, consectetur adipisicing elit.

59 | Learn More 60 |
61 |
62 |
63 |
64 |
65 |
66 | 67 | 68 | 69 | 70 |
71 |
72 |

Service Three

73 |

Lorem ipsum dolor sit amet, consectetur adipisicing elit.

74 | Learn More 75 |
76 |
77 |
78 |
79 |
80 |
81 | 82 | 83 | 84 | 85 |
86 |
87 |

Service Four

88 |

Lorem ipsum dolor sit amet, consectetur adipisicing elit.

89 | Learn More 90 |
91 |
92 |
93 |
94 | 95 | 96 |
97 |
98 | 99 |
100 |
101 | 102 | 112 | 113 |
114 |
115 |

Service One

116 |

Lorem ipsum dolor sit amet, consectetur adipisicing elit. Quae repudiandae fugiat illo cupiditate excepturi esse officiis consectetur, laudantium qui voluptatem. Ad necessitatibus velit, accusantium expedita debitis impedit rerum totam id. Lorem ipsum dolor sit amet, consectetur adipisicing elit. Natus quibusdam recusandae illum, nesciunt, architecto, saepe facere, voluptas eum incidunt dolores magni itaque autem neque velit in. At quia quaerat asperiores.

117 |

Lorem ipsum dolor sit amet, consectetur adipisicing elit. Quae repudiandae fugiat illo cupiditate excepturi esse officiis consectetur, laudantium qui voluptatem. Ad necessitatibus velit, accusantium expedita debitis impedit rerum totam id. Lorem ipsum dolor sit amet, consectetur adipisicing elit. Natus quibusdam recusandae illum, nesciunt, architecto, saepe facere, voluptas eum incidunt dolores magni itaque autem neque velit in. At quia quaerat asperiores.

118 |
119 |
120 |

Service Two

121 |

Lorem ipsum dolor sit amet, consectetur adipisicing elit. Quae repudiandae fugiat illo cupiditate excepturi esse officiis consectetur, laudantium qui voluptatem. Ad necessitatibus velit, accusantium expedita debitis impedit rerum totam id. Lorem ipsum dolor sit amet, consectetur adipisicing elit. Natus quibusdam recusandae illum, nesciunt, architecto, saepe facere, voluptas eum incidunt dolores magni itaque autem neque velit in. At quia quaerat asperiores.

122 |

Lorem ipsum dolor sit amet, consectetur adipisicing elit. Quae repudiandae fugiat illo cupiditate excepturi esse officiis consectetur, laudantium qui voluptatem. Ad necessitatibus velit, accusantium expedita debitis impedit rerum totam id. Lorem ipsum dolor sit amet, consectetur adipisicing elit. Natus quibusdam recusandae illum, nesciunt, architecto, saepe facere, voluptas eum incidunt dolores magni itaque autem neque velit in. At quia quaerat asperiores.

123 |
124 |
125 |

Service Three

126 |

Lorem ipsum dolor sit amet, consectetur adipisicing elit. Quae repudiandae fugiat illo cupiditate excepturi esse officiis consectetur, laudantium qui voluptatem. Ad necessitatibus velit, accusantium expedita debitis impedit rerum totam id. Lorem ipsum dolor sit amet, consectetur adipisicing elit. Natus quibusdam recusandae illum, nesciunt, architecto, saepe facere, voluptas eum incidunt dolores magni itaque autem neque velit in. At quia quaerat asperiores.

127 |

Lorem ipsum dolor sit amet, consectetur adipisicing elit. Quae repudiandae fugiat illo cupiditate excepturi esse officiis consectetur, laudantium qui voluptatem. Ad necessitatibus velit, accusantium expedita debitis impedit rerum totam id. Lorem ipsum dolor sit amet, consectetur adipisicing elit. Natus quibusdam recusandae illum, nesciunt, architecto, saepe facere, voluptas eum incidunt dolores magni itaque autem neque velit in. At quia quaerat asperiores.

128 |
129 |
130 |

Service Four

131 |

Lorem ipsum dolor sit amet, consectetur adipisicing elit. Quae repudiandae fugiat illo cupiditate excepturi esse officiis consectetur, laudantium qui voluptatem. Ad necessitatibus velit, accusantium expedita debitis impedit rerum totam id. Lorem ipsum dolor sit amet, consectetur adipisicing elit. Natus quibusdam recusandae illum, nesciunt, architecto, saepe facere, voluptas eum incidunt dolores magni itaque autem neque velit in. At quia quaerat asperiores.

132 |

Lorem ipsum dolor sit amet, consectetur adipisicing elit. Quae repudiandae fugiat illo cupiditate excepturi esse officiis consectetur, laudantium qui voluptatem. Ad necessitatibus velit, accusantium expedita debitis impedit rerum totam id. Lorem ipsum dolor sit amet, consectetur adipisicing elit. Natus quibusdam recusandae illum, nesciunt, architecto, saepe facere, voluptas eum incidunt dolores magni itaque autem neque velit in. At quia quaerat asperiores.

133 |
134 |
135 | 136 |
137 |
138 | 139 | 140 | 141 |
142 |
143 | 144 |
145 |
146 |
147 |
148 | 149 | 150 | 151 | 152 |
153 |
154 |

Service One

155 |

Lorem ipsum dolor sit amet, consectetur adipisicing elit. Illo itaque ipsum sit harum.

156 |
157 |
158 |
159 |
160 | 161 | 162 | 163 | 164 |
165 |
166 |

Service Two

167 |

Lorem ipsum dolor sit amet, consectetur adipisicing elit. Illo itaque ipsum sit harum.

168 |
169 |
170 |
171 |
172 | 173 | 174 | 175 | 176 |
177 |
178 |

Service Three

179 |

Lorem ipsum dolor sit amet, consectetur adipisicing elit. Illo itaque ipsum sit harum.

180 |
181 |
182 |
183 |
184 |
185 |
186 | 187 | 188 | 189 | 190 |
191 |
192 |

Service Four

193 |

Lorem ipsum dolor sit amet, consectetur adipisicing elit. Illo itaque ipsum sit harum.

194 |
195 |
196 |
197 |
198 | 199 | 200 | 201 | 202 |
203 |
204 |

Service Five

205 |

Lorem ipsum dolor sit amet, consectetur adipisicing elit. Illo itaque ipsum sit harum.

206 |
207 |
208 |
209 |
210 | 211 | 212 | 213 | 214 |
215 |
216 |

Service Six

217 |

Lorem ipsum dolor sit amet, consectetur adipisicing elit. Illo itaque ipsum sit harum.

218 |
219 |
220 |
221 |
222 |
223 |
224 | 225 | 226 | 227 | 228 |
229 |
230 |

Service Seven

231 |

Lorem ipsum dolor sit amet, consectetur adipisicing elit. Illo itaque ipsum sit harum.

232 |
233 |
234 |
235 |
236 | 237 | 238 | 239 | 240 |
241 |
242 |

Service Eight

243 |

Lorem ipsum dolor sit amet, consectetur adipisicing elit. Illo itaque ipsum sit harum.

244 |
245 |
246 |
247 |
248 | 249 | 250 | 251 | 252 |
253 |
254 |

Service Nine

255 |

Lorem ipsum dolor sit amet, consectetur adipisicing elit. Illo itaque ipsum sit harum.

256 |
257 |
258 |
259 |
260 | 261 | 262 |
263 | 264 | --------------------------------------------------------------------------------