Page MenuHomeGRNET

No OneTemporary

File Metadata

Created
Sat, Mar 21, 1:53 PM
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