#!/usr/bin/env ruby require 'rubygems' require 'camping' require 'camping/db' require 'camping/session' require 'reststop' Camping.goes :Ctd module Ctd include Camping::Session end module Ctd::Models class Device < Base; end class User < Base; end class CreateTheBasics < V 1.0 def self.up create_table :ctd_devices do |t| t.column :channel, :integer, :null => false t.column :state, :boolean, :default => true end create_table :ctd_users do |t| t.column :username, :string t.column :password, :string end User.create :username => 'admin', :password => 'camping' (1..8).each {|n| Device.create :channel => n} end def self.down drop_table :ctd_users drop_table :ctd_devices end end end module Ctd::Controllers class NotFound def get(p) @status = 404 div do h1 'Lo Sentimos' h2 "Todos los circuitos están ocupados" h3 do text("Por favor ") text( a('cuelgue', :href => R(Index))) text( "y deje de marcar #{p}") end end end end class Info < R '/info/(\d+)', '/info/(\w+)/(\d+)', '/info', '/info/(\d+)/(\d+)/(\d+)/([\w-]+)' def get(*args) div do code args.inspect; br; br code @env.inspect; br code "Link: #{R(Info, 1, 2)}" end end end class Index < R '/' def get if @state.user_id.blank? redirect "sessions" else redirect "devices" end end end class Devices < REST 'devices' # get /devices/1 def read(channel) return redirect R(Index) if @state.user_id.blank? begin @device = Device.find channel rescue @device = nil end render :device end # get /devices def list return redirect R(Index) if @state.user_id.blank? @device = nil render :device end end class Sessions < REST 'sessions' # POST /sessions def create @user = User.find :first, :conditions => ['username = ? AND password = ?', input.username, input.password] if @user @login = 'login success !' @state.user_id = @user.id else @login = 'wrong user name or password' end render :login end # DELETE /sessions def delete @state.user_id = nil render :logout end def read(id) redirect R(Index) end # GET /sessions def list render :_login end def read(*args) redirect R(Sessions) end end end Markaby::Builder.set(:indent, 2) module Ctd::Views def layout html do head do title 'Call To Device' link :rel => 'stylesheet', :type => 'text/css', :href => '/styles.css', :media => 'screen' end body do h1.header { a 'Call To Device', :href => R(Index) } div.content do self << yield end end end end def login p { b @login } p { a 'Continue', :href => R(Index) } end def logout p "You have been logged out." p { a 'Continue', :href => R(Index) } end def device if @device p "Usted ha seleccionado el dispositivo #{@device.channel}" else p "Seleccione el dispositivo a administrar" end end # partials def _login form :action => R(Sessions), :method => 'post' do label 'Username', :for => 'username'; br input :name => 'username', :type => 'text'; br label 'Password', :for => 'password'; br input :name => 'password', :type => 'text'; br input :type => 'submit', :name => 'login', :value => 'Login' end end end def Ctd.create Camping::Models::Session.create_schema Ctd::Models.create_schema :assume => (Ctd::Models::Device.table_exists? ? 1.0 : 0.0) end if __FILE__ == $0 require 'webrick/httpserver' require 'camping/webrick' Camping::Models::Base.establish_connection :adapter => "sqlite3", :database => "ctd.db" Ctd.create s = WEBrick::HTTPServer.new :BindAddress => "0.0.0.0", :Port => 3301 s.mount "/", WEBrick::CampingHandler, Ctd # This lets Ctrl+C shut down your server trap(:INT) do s.shutdown end s.start end