Page Menu
Home
GRNET
Search
Configure Global Search
Log In
Files
F1615006
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Flag For Later
Subscribers
None
File Metadata
Details
File Info
Storage
Attached
Created
Sat, Mar 21, 1:53 PM
Size
8 KB
Mime Type
text/x-diff
Expires
Mon, Mar 23, 1:53 PM (1 d, 5 h)
Engine
blob
Format
Raw Data
Handle
351739
Attached To
rARCHIVING archiving
View Options
diff --git a/app/controllers/hosts_controller.rb b/app/controllers/hosts_controller.rb
index 4917eec..ac74a94 100644
--- a/app/controllers/hosts_controller.rb
+++ b/app/controllers/hosts_controller.rb
@@ -1,126 +1,171 @@
class HostsController < ApplicationController
before_action :require_logged_in
before_action :fetch_host, only: [:show, :edit, :update, :destroy, :submit_config,
:revoke, :disable]
before_action :fetch_hosts_of_user, only: [:new, :edit, :create]
# GET /hosts/new
def new
@host = Host.new
@host.port = 9102
end
# POST /hosts
def create
@host = Host.new(fetch_params)
set_host_type
@host.verified = !@host.institutional?
if user_can_add_this_host? && @host.save
flash[:success] = 'Host created successfully'
current_user.hosts << @host
UserMailer.notify_admin(current_user, @host.fqdn).deliver
redirect_to host_path @host
else
flash[:error] = 'Host was not created'
render :new
end
end
# GET /hosts/1
def show
@schedules = @host.job_templates.map(&:schedule)
@filesets = @host.job_templates.map(&:fileset)
end
# GET /hosts/1/edit
def edit; end
# PATCH /hosts/1
def update
updates = fetch_params.slice(:port, :password)
if updates.present? && @host.update_attributes(updates)
@host.recalculate if @host.bacula_ready?
flash[:success] = 'Host updated successfully. You must update your file deamon accordingly.'
redirect_to host_path @host
else
render :edit
end
end
# DELETE /hosts/1
def destroy
if @host.destroy
flash[:success] = 'Host destroyed successfully'
else
flash[:error] = 'Host not destroyed'
end
redirect_to root_path
end
# POST /hosts/1/disable
def disable
if @host.disable_jobs_and_update
flash[:success] = 'Client disabled'
else
flash[:error] = 'Something went wrong, try again later'
end
redirect_to host_path(@host)
end
# POST /hosts/1/submit_config
def submit_config
if @host.dispatch_to_bacula
flash[:success] = 'Host configuration sent to Bacula successfully'
else
flash[:error] = 'Something went wrong, try again later'
end
redirect_to host_path(@host)
end
# DELETE /hosts/1/revoke
def revoke
if @host.remove_from_bacula
flash[:success] = 'Host configuration removed from Bacula successfully'
else
flash[:error] = 'Something went wrong, try again later'
end
redirect_to root_path
end
+ # GET /hosts/fetch_vima_hosts
+ def fetch_vima_hosts
+ if params[:code].blank?
+ return redirect_to client.auth_code.authorize_url(:redirect_uri => redirect_uri,
+ scope: 'read')
+ end
+
+ access_token = client.auth_code.get_token(
+ params['code'],
+ { :redirect_uri => redirect_uri },
+ { :mode => :query, :param_name => "access_token", :header_format => "" }
+ )
+
+ vms = access_token.get(
+ 'https://vima.grnet.gr/instances/list?tag=vima:service:archiving',
+ { mode: :query, param_name: 'access_token' }
+ ).parsed.deep_symbolize_keys[:response][:instances]
+
+ session[:vms] = vms.first(50)
+ Host.where(fqdn: vms).each do |host|
+ host.users << current_user unless host.users.include?(current_user)
+ end
+
+ redirect_to new_host_path
+ end
+
private
+ def client
+ OAuth2::Client.new(
+ Rails.application.secrets.oauth2_vima_client_id,
+ Rails.application.secrets.oauth2_vima_secret,
+ site: 'https://vima.grnet.gr',
+ token_url: "/o/token",
+ authorize_url: "/o/authorize",
+ :ssl => {:ca_path => "/etc/ssl/certs"}
+ )
+ end
+
+ def redirect_uri
+ uri = URI.parse(request.url)
+ uri.scheme = 'https' unless Rails.env.development?
+ uri.path = '/hosts/fetch_vima_hosts'
+ uri.query = nil
+ uri.to_s
+ end
+
def fetch_hosts_of_user
return if not current_user.needs_host_list?
@hosts_of_user = session[:vms] - current_user.hosts.pluck(:fqdn)
end
def fetch_host
@host = current_user.hosts.includes(job_templates: [:fileset, :schedule]).find(params[:id])
end
def fetch_params
params.require(:host).permit(:fqdn, :port, :password)
end
def user_can_add_this_host?
!current_user.needs_host_list? || @hosts_of_user.include?(@host.fqdn)
end
def set_host_type
@host.origin = if current_user.vima?
:vima
elsif current_user.okeanos?
:okeanos
else
:institutional
end
end
end
diff --git a/app/views/hosts/_form.html.erb b/app/views/hosts/_form.html.erb
index 061bbfc..802b609 100644
--- a/app/views/hosts/_form.html.erb
+++ b/app/views/hosts/_form.html.erb
@@ -1,21 +1,30 @@
<%= bootstrap_form_for(@host, layout: :horizontal,
label_col: 'col-xs-3', control_col: 'col-xs-8') do |f| %>
<div>
<% if current_user.needs_host_list? %>
<%= f.select :fqdn, options_for_select(@hosts_of_user, @host.fqdn), {},
disabled: @host.persisted? %>
<% else %>
<%= f.text_field :fqdn, disabled: @host.persisted? %>
<% end %>
<%= f.password_field :password %>
<%= f.number_field :port, min: 1 %>
</div>
<div class="form-group">
- <div class="col-xs-offset-3 col-xs-8">
+ <div class="col-xs-offset-3 col-xs-2">
<%= f.submit class: 'btn btn-success' %>
</div>
+ <% if current_user.vima? %>
+ <div class="col-xs-offset-3 col-xs-2">
+ <%= link_to fetch_vima_hosts_path, role: :button, class: 'btn btn-default' do %>
+ <label class="glyphicon glyphicon-refresh text-primary"></label>
+ Fetch Hosts
+ <% end %>
+ </div>
+ <% end %>
</div>
+
<% end %>
diff --git a/app/views/hosts/new.html.erb b/app/views/hosts/new.html.erb
index 2e41c5f..bcd7bbd 100644
--- a/app/views/hosts/new.html.erb
+++ b/app/views/hosts/new.html.erb
@@ -1,7 +1,13 @@
-<h1>New Host</h1>
-
-<div class="container graybox">
- <%= render 'form' %>
+<div class="row">
+ <div class="col-xs-4">
+ <div class="panel panel-default">
+ <div class="panel-heading">
+ <h3>New Host</h3>
+ </div>
+ <br />
+ <%= render 'form' %>
+ </div>
+ </div>
</div>
<%= link_to 'Back', clients_path %>
diff --git a/config/routes.rb b/config/routes.rb
index 2238249..89647b7 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -1,99 +1,103 @@
Rails.application.routes.draw do
root 'application#index'
post 'grnet' => 'application#grnet'
get 'institutional' => 'application#institutional'
match 'vima', to: 'application#vima', :via => [:get, :post]
get 'logout' => 'application#logout'
resources :clients, only: [:index, :show] do
member do
get :jobs
get :logs
get :stats
post :stats
get :users
get :restore
post :run_restore
post :restore_selected
delete :remove_user
end
collection do
post :index
end
end
resources :clients, only: [], param: :client_id do
member do
get :tree
end
end
resources :invitations, only: [:create]
get '/invitations/:host_id/:verification_code/accept' => 'invitations#accept',
as: :accept_invitation
resources :hosts, only: [:new, :create, :show, :edit, :update, :destroy] do
member do
post :submit_config
post :disable
delete :revoke
end
+ collection do
+ get :fetch_vima_hosts, to: 'hosts#fetch_vima_hosts', as: :fetch_vima
+ end
+
resources :jobs, only: [:new, :create, :show, :edit, :update, :destroy] do
member do
patch :toggle_enable
post :backup_now
end
end
resources :filesets, only: [:show, :new, :create, :edit, :update, :destroy]
resources :schedules, only: [:show, :new, :edit, :create, :update, :destroy]
end
namespace :admin do
match '/', to: 'base#index', via: [:get, :post]
get '/login' => 'base#login', as: :login
resources :settings, only: [:index, :new, :create, :edit, :update] do
member do
delete :reset
end
end
resources :clients, only: [:index, :show] do
member do
get :jobs
get :logs
get :stats
post :stats
get :configuration
post :disable
post :block
post :unblock
delete :revoke
end
end
resources :hosts, only: [:show] do
collection do
get :unverified
end
member do
post :verify
end
end
resources :users, only: [:index, :new, :create, :show, :edit, :update] do
member do
patch :ban
patch :unban
end
end
resources :pools, only: [:index, :new, :create, :show, :edit, :update]
end
end
Event Timeline
Log In to Comment