Commit 594d37b
Changed files (18)
app
controllers
views
api
dispositions
config
lib
app/controllers/agents/files_controller.rb
@@ -1,28 +0,0 @@
-module Agents
- class FilesController < ApplicationController
- before_action :load_agent
- before_action do
- request.format = :json
- end
-
- def index
- end
-
- def show
- @fingerprint = params[:id]
- @file = Disposition.find_by(fingerprint: params[:id])
- message = {
- agent_id: params[:id],
- type: :lookup,
- data: params[:data]
- }
- Publisher.publish("events.scanned.#{@agent.id}", message)
- end
-
- private
-
- def load_agent
- @agent = Agent.find(params[:agent_id])
- end
- end
-end
app/controllers/api/agents/events_controller.rb
@@ -0,0 +1,19 @@
+module Api
+ module Agents
+ class EventsController < ApplicationController
+ def create
+ @agent = Agent.find(params[:agent_id])
+ message = event_params.merge({agent_id: @agent.id})
+ routing_key = "events.#{event_params[:type]}.#{@agent.id}"
+ Publisher.publish(routing_key, message)
+ render nothing: true
+ end
+
+ private
+
+ def event_params
+ params[:event]
+ end
+ end
+ end
+end
app/controllers/api/agents/files_controller.rb
@@ -0,0 +1,21 @@
+module Api
+ module Agents
+ class FilesController < ApplicationController
+ before_action do
+ request.format = :json
+ end
+
+ def show
+ @agent = Agent.find(params[:agent_id])
+ @fingerprint = params[:id]
+ @file = Disposition.find_by(fingerprint: params[:id])
+ message = {
+ agent_id: params[:id],
+ type: :lookup,
+ data: params[:data]
+ }
+ Publisher.publish("events.scanned.#{@agent.id}", message)
+ end
+ end
+ end
+end
app/controllers/api/agents_controller.rb
@@ -0,0 +1,15 @@
+module Api
+ class AgentsController < ApplicationController
+ #before_action do
+ #request.format = :json
+ #end
+
+ def create
+ @agent = Agent.create!(agent_params)
+ end
+
+ def agent_params
+ params.require(:agent).permit(:hostname)
+ end
+ end
+end
app/controllers/agents_controller.rb
@@ -1,74 +1,48 @@
class AgentsController < ApplicationController
- before_action :set_agent, only: [:show, :edit, :update, :destroy]
-
- # GET /agents
- # GET /agents.json
def index
@agents = Agent.all
end
- # GET /agents/1
- # GET /agents/1.json
def show
+ @agent = Agent.find(params[:id])
end
- # GET /agents/new
def new
@agent = Agent.new
end
- # GET /agents/1/edit
def edit
+ @agent = Agent.find(params[:id])
end
- # POST /agents
- # POST /agents.json
def create
@agent = Agent.new(agent_params)
- respond_to do |format|
- if @agent.save
- format.html { redirect_to @agent, notice: 'Agent was successfully created.' }
- format.json { render :show, status: :created, location: @agent }
- else
- format.html { render :new }
- format.json { render json: @agent.errors, status: :unprocessable_entity }
- end
+ if @agent.save
+ redirect_to @agent, notice: 'Agent was successfully created.'
+ else
+ render :new
end
end
- # PATCH/PUT /agents/1
- # PATCH/PUT /agents/1.json
def update
- respond_to do |format|
- if @agent.update(agent_params)
- format.html { redirect_to @agent, notice: 'Agent was successfully updated.' }
- format.json { render :show, status: :ok, location: @agent }
- else
- format.html { render :edit }
- format.json { render json: @agent.errors, status: :unprocessable_entity }
- end
+ @agent = Agent.find(params[:id])
+ if @agent.update(agent_params)
+ redirect_to @agent, notice: 'Agent was successfully updated.'
+ else
+ render :edit
end
end
- # DELETE /agents/1
- # DELETE /agents/1.json
def destroy
+ @agent = Agent.find(params[:id])
@agent.destroy
- respond_to do |format|
- format.html { redirect_to agents_url, notice: 'Agent was successfully destroyed.' }
- format.json { head :no_content }
- end
+ redirect_to agents_url, notice: 'Agent was successfully destroyed.'
end
private
- # Use callbacks to share common setup or constraints between actions.
- def set_agent
- @agent = Agent.find(params[:id])
- end
- # Never trust parameters from the scary internet, only allow the white list through.
- def agent_params
- params.require(:agent).permit(:hostname)
- end
+ def agent_params
+ params.require(:agent).permit(:hostname)
+ end
end
app/controllers/dispositions_controller.rb
@@ -1,68 +1,46 @@
class DispositionsController < ApplicationController
before_action :set_disposition, only: [:show, :edit, :update, :destroy]
- # GET /dispositions
- # GET /dispositions.json
def index
@dispositions = Disposition.all
end
- # GET /dispositions/1
- # GET /dispositions/1.json
def show
end
- # GET /dispositions/new
def new
@disposition = Disposition.new
@states = Disposition.states
end
- # GET /dispositions/1/edit
def edit
@states = Disposition.states
end
- # POST /dispositions
- # POST /dispositions.json
def create
fingerprint = disposition_params[:fingerprint]
Publisher.publish("commands.poke.#{fingerprint}", disposition_params)
- respond_to do |format|
- format.html { redirect_to dispositions_path, notice: 'Disposition was successfully created.' }
- format.json { head :no_content }
- end
+ redirect_to dispositions_path, notice: 'Disposition was successfully created.'
end
- # PATCH/PUT /dispositions/1
- # PATCH/PUT /dispositions/1.json
def update
Publisher.publish("poke", disposition_params)
- respond_to do |format|
- format.html { redirect_to dispositions_path, notice: 'Disposition was successfully updated.' }
- format.json { head :no_content }
- end
+ redirect_to dispositions_path, notice: 'Disposition was successfully updated.'
end
- # DELETE /dispositions/1
- # DELETE /dispositions/1.json
def destroy
@disposition.destroy
- respond_to do |format|
- format.html { redirect_to dispositions_url, notice: 'Disposition was successfully destroyed.' }
- format.json { head :no_content }
- end
+ redirect_to dispositions_url, notice: 'Disposition was successfully destroyed.'
end
private
- # Use callbacks to share common setup or constraints between actions.
- def set_disposition
- @disposition = Disposition.find_by(fingerprint: params[:id])
- end
- # Never trust parameters from the scary internet, only allow the white list through.
- def disposition_params
- params.require(:disposition).permit(:fingerprint, :state)
- end
+ def set_disposition
+ @disposition = Disposition.find_by(fingerprint: params[:id])
+ end
+
+ def disposition_params
+ params.require(:disposition).permit(:fingerprint, :state)
+ end
end
app/models/agent.rb
@@ -1,3 +1,3 @@
class Agent < ActiveRecord::Base
- has_many :events
+ has_many :events, dependent: :destroy
end
app/models/event.rb
@@ -1,3 +1,4 @@
class Event < ActiveRecord::Base
belongs_to :agent
+ validates_presence_of :agent
end
app/views/agents/files/index.json.jbuilder → app/views/api/agents/files/index.json.jbuilder
File renamed without changes
app/views/agents/files/show.json.jbuilder → app/views/api/agents/files/show.json.jbuilder
File renamed without changes
app/views/agents/show.json.jbuilder → app/views/api/agents/create.json.jbuilder
File renamed without changes
app/views/agents/index.json.jbuilder → app/views/api/agents/index.json.jbuilder
File renamed without changes
app/views/dispositions/index.json.jbuilder
@@ -1,4 +0,0 @@
-json.array!(@dispositions) do |disposition|
- json.extract! disposition, :fingerprint, :state
- json.url disposition_url(disposition, format: :json)
-end
app/views/dispositions/show.json.jbuilder
@@ -1,1 +0,0 @@
-json.extract! @disposition, :fingerprint, :state
config/routes.rb
@@ -4,6 +4,13 @@ Rails.application.routes.draw do
resources :files, only: [:index, :show], controller: 'agents/files'
end
+ namespace :api do
+ resources :agents, only: [:create] do
+ resources :events, only: [:create], controller: 'agents/events'
+ resources :files, only: [:show], controller: 'agents/files'
+ end
+ end
+
resources :dispositions
root 'agents#index'
end
db/migrate/20150204042612_add_agent_id_to_events.rb
@@ -1,5 +1,6 @@
class AddAgentIdToEvents < ActiveRecord::Migration
def change
- add_reference :events, :agent, index: true
+ add_column :events, :agent_id, :uuid, null: false
+ add_index :events, :agent_id
end
end
db/schema.rb
@@ -30,12 +30,14 @@ ActiveRecord::Schema.define(version: 20150207194524) do
t.datetime "updated_at", null: false
end
+ add_index "dispositions", ["fingerprint"], name: "index_dispositions_on_fingerprint", unique: true, using: :btree
+
create_table "events", id: :uuid, default: "uuid_generate_v4()", force: :cascade do |t|
t.string "type"
t.json "data"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
- t.integer "agent_id"
+ t.uuid "agent_id", null: false
end
add_index "events", ["agent_id"], name: "index_events_on_agent_id", using: :btree
lib/fake_agent.rb
@@ -10,8 +10,7 @@ class FakeAgent
end
def register
- url = "#{endpoint}/agents.json"
- response = Typhoeus.post(url, body: { agent: { hostname: Socket.gethostname } })
+ response = Typhoeus.post(registration_url, body: { agent: { hostname: Socket.gethostname } })
json = JSON.parse(response.body)
@id = json["id"]
end
@@ -113,10 +112,14 @@ class FakeAgent
end
def file_query_url(fingerprint)
- "#{endpoint}/agents/#{id}/files/#{fingerprint}"
+ "#{endpoint}/api/agents/#{id}/files/#{fingerprint}"
end
def event_url
- "#{endpoint}/agents/#{id}/events/"
+ "#{endpoint}/api/agents/#{id}/events/"
+ end
+
+ def registration_url
+ "#{endpoint}/api/agents"
end
end