Merge pull request 'authen' (#1) from authen into main

Reviewed-on: https://gitea.msi.stef.lan/stef/rails-base/pulls/1
main
stef 2024-02-11 15:15:14 +01:00
commit 4de8394440
93 changed files with 2605 additions and 103 deletions

View File

@ -213,3 +213,71 @@ bin/rails g scaffold Script name:string stage:string lang:string content:text lo
bin/rails g scaffold Site name:string domain:string gateway:string nameserver:string network:string netmask:string
bin/rails s -b 0.0.0.0
# Add devise
```
root@autogen:/usr/src/autogen# bundle add devise
```
```
Fetching gem metadata from https://rubygems.org/.........
Resolving dependencies...
Fetching gem metadata from https://rubygems.org/.........
Resolving dependencies...
```
```
root@autogen:/usr/src/autogen# rails generate devise:install
```
```
create config/initializers/devise.rb
create config/locales/devise.en.yml
===============================================================================
Depending on your application's configuration some manual setup may be required:
1. Ensure you have defined default url options in your environments files. Here
is an example of default_url_options appropriate for a development environment
in config/environments/development.rb:
config.action_mailer.default_url_options = { host: 'localhost', port: 3000 }
In production, :host should be set to the actual host of your application.
* Required for all applications. *
2. Ensure you have defined root_url to *something* in your config/routes.rb.
For example:
root to: "home#index"
* Not required for API-only Applications *
3. Ensure you have flash messages in app/views/layouts/application.html.erb.
For example:
<p class="notice"><%= notice %></p>
<p class="alert"><%= alert %></p>
* Not required for API-only Applications *
4. You can copy Devise views (for customization) to your app by running:
rails g devise:views
* Not required *
===============================================================================
```
```
root@autogen:/usr/src/autogen# rails generate devise User
```
```
invoke mongoid
create app/models/user.rb
invoke test_unit
create test/models/user_test.rb
create test/fixtures/users.yml
insert app/models/user.rb
insert app/models/user.rb
route devise_for :users
```

View File

@ -68,3 +68,5 @@ gem "mongoid", "~> 8.1"
gem "bulma-rails", "~> 0.9.4"
gem "jquery-rails", "~> 4.6"
gem "devise", "~> 4.9"

View File

@ -78,6 +78,7 @@ GEM
addressable (2.8.6)
public_suffix (>= 2.0.2, < 6.0)
base64 (0.2.0)
bcrypt (3.1.20)
bigdecimal (3.1.6)
bindex (0.8.1)
bootsnap (1.18.3)
@ -104,6 +105,12 @@ GEM
debug (1.9.1)
irb (~> 1.10)
reline (>= 0.3.8)
devise (4.9.3)
bcrypt (~> 3.0)
orm_adapter (~> 0.1)
railties (>= 4.1.0)
responders
warden (~> 1.2.3)
drb (2.2.0)
ruby2_keywords
erubi (1.12.0)
@ -170,6 +177,7 @@ GEM
racc (~> 1.4)
nokogiri (1.16.2-x86_64-linux)
racc (~> 1.4)
orm_adapter (0.5.0)
psych (5.1.2)
stringio
public_suffix (5.0.4)
@ -219,6 +227,9 @@ GEM
regexp_parser (2.9.0)
reline (0.4.2)
io-console (~> 0.5)
responders (3.1.1)
actionpack (>= 5.2)
railties (>= 5.2)
rexml (3.2.6)
ruby2_keywords (0.0.5)
rubyzip (2.3.2)
@ -247,6 +258,8 @@ GEM
railties (>= 6.0.0)
tzinfo (2.0.6)
concurrent-ruby (~> 1.0)
warden (1.2.9)
rack (>= 2.0.9)
web-console (4.2.1)
actionview (>= 6.0.0)
activemodel (>= 6.0.0)
@ -275,6 +288,7 @@ DEPENDENCIES
capybara
cssbundling-rails
debug
devise (~> 4.9)
importmap-rails
jbuilder
jquery-rails (~> 4.6)

View File

@ -0,0 +1,50 @@
function get_ipxe(id){
$.ajax({
method: "GET",
url: "/host/ipxe",
data: { uuid:id}
}).done(function(result) {
$("#script_result").empty().append(result)
});
}
function get_install(id){
$.ajax({
method: "GET",
url: "/host/install",
data: { uuid:id}
}).done(function(result) {
$("#script_result").empty().append(result)
});
}
function get_postinstall(id){
$.ajax({
method: "GET",
url: "/host/postinstall",
data: { uuid:id}
}).done(function(result) {
$("#script_result").empty().append(result)
});
}
$( document ).ready(function() {
$(document).on("click",".getIpxeScript", function(){
var id=$(this).attr('id')
get_ipxe(id)
});
$(document).on("click",".getInstallScript", function(){
var id=$(this).attr('id')
get_install(id)
});
$(document).on("click",".getPostinstallScript", function(){
var id=$(this).attr('id')
get_postinstall(id)
});
});

View File

@ -1,7 +1,53 @@
function get_ipxe(id){
$.ajax({
method: "GET",
url: "/host/ipxe",
data: { uuid:id}
}).done(function(result) {
$("#script_result").empty().append(result)
});
}
function get_install(id){
$.ajax({
method: "GET",
url: "/host/install",
data: { uuid:id}
}).done(function(result) {
$("#script_result").empty().append(result)
});
}
function get_postinstall(id){
$.ajax({
method: "GET",
url: "/host/postinstall",
data: { uuid:id}
}).done(function(result) {
$("#script_result").empty().append(result)
});
}
$( document ).ready(function() {
$('.toggleable').next().hide();
$(document).on("click",".toggleable", function(){
$(this).toggleClass("is-active");
$(this).next().toggle();
});
$(document).on("click",".getIpxeScript", function(){
var id=$(this).attr('id')
get_ipxe(id)
});
$(document).on("click",".getInstallScript", function(){
var id=$(this).attr('id')
get_install(id)
});
$(document).on("click",".getPostinstallScript", function(){
var id=$(this).attr('id')
get_postinstall(id)
});
})

View File

@ -0,0 +1,23 @@
.scrollDiv {
max-height: 80vh;
overflow:auto;
}
table {
/* Not required only for visualizing */
border-collapse: collapse;
width: 100%;
}
table thead tr th {
/* Important */
background-color: white;
position: sticky;
z-index: 100;
top: 0;
}
td {
/* Not required only for visualizing */
padding: 1em;
}

View File

@ -0,0 +1,80 @@
class AccountsController < ApplicationController
before_action :set_account, only: %i[ show edit update destroy ]
before_action :set_pass, only: %i[ update ]
# GET /accounts or /accounts.json
def index
@accounts = Account.all
end
# GET /accounts/1 or /accounts/1.json
def show
end
# GET /accounts/new
def new
@account = Account.new
end
# GET /accounts/1/edit
def edit
end
# POST /accounts or /accounts.json
def create
@account = Account.new(account_params.except(:password))
respond_to do |format|
if @account.save
format.html { redirect_to account_url(@account), notice: "Account was successfully created." }
format.json { render :show, status: :created, location: @account }
else
format.html { render :new, status: :unprocessable_entity }
format.json { render json: @account.errors, status: :unprocessable_entity }
end
end
end
# PATCH/PUT /accounts/1 or /accounts/1.json
def update
respond_to do |format|
logger.debug(account_params)
if @account.update(account_params.except(:password))
format.html { redirect_to account_url(@account), notice: "Account was successfully updated." }
format.json { render :show, status: :ok, location: @account }
else
format.html { render :edit, status: :unprocessable_entity }
format.json { render json: @account.errors, status: :unprocessable_entity }
end
end
end
# DELETE /accounts/1 or /accounts/1.json
def destroy
@account.destroy!
respond_to do |format|
format.html { redirect_to accounts_url, notice: "Account was successfully destroyed." }
format.json { head :no_content }
end
end
private
# Use callbacks to share common setup or constraints between actions.
def set_account
@account = Account.find(params[:id])
end
def set_pass
# [IMPORTANT] Salt must be generated for prodution !
cmdline = "mkpasswd -m sha-512 -S 012345678 #{account_params[:password]}"
@account.encpassword = `#{cmdline}`.strip
account_params.delete(:password)
end
# Only allow a list of trusted parameters through.
def account_params
params.require(:account).permit(:name, :login, :password, :sshpubkey,:encpassword)
end
end

View File

@ -1,2 +1,10 @@
class ApplicationController < ActionController::Base
protect_from_forgery with: :exception
before_action :configure_permitted_parameters, if: :devise_controller?
protected
def configure_permitted_parameters
devise_parameter_sanitizer.permit(:sign_up, keys: %i[first_name last_name address phone date_of_birth gender])
devise_parameter_sanitizer.permit(:account_update, keys: %i[first_name last_name address phone date_of_birth gender])
end
end

View File

@ -0,0 +1,100 @@
class EngineController < ApplicationController
before_action :set_host_by_uuid, only: %i[ generate_boot generate_install generate_postinstall generate_installed generate_metadata ]
def generateglobal
gv=Utils::Globalvar.new
puts gv.Get
end
def generate_boot
if @host
sourceip=request.headers['REMOTE_ADDR']
log=Log.new({source: "#{sourceip}", crit: "info",message: "#{@host.uuid} Request boot script"})
log.save()
@host.mac = params[:mac]
@host.installip = params[:installip]
boot_script = @host.installtemplate.boot.content
template = @host.installtemplate
@site = @host.site
host = @host
@template = @host.installtemplate
if @host.toinstall
@host.update({status: "Computer Booting"})
end
result = render inline: boot_script, layout: false, content_type: 'text/plain'
@host.update({lastbootgenerated: result})
end
end
def generate_install
if @host
sourceip=request.headers['REMOTE_ADDR']
log=Log.new({source: "#{sourceip}", crit: "info",message: "#{@host.uuid} Request Install script"})
log.save()
script = @host.installtemplate.install.content
template = @host.installtemplate
@site = @host.site
host = @host
@template = @host.installtemplate
@host.update({status: "System Install"})
result = render inline: script, layout: false, content_type: 'text/plain'
@host.update({lastinstallgenerated: result})
end
end
def generate_postinstall
if @host
sourceip=request.headers['REMOTE_ADDR']
log=Log.new({source: "#{sourceip}", crit: "info",message: "#{@host.uuid} Request Postinstall script"})
log.save()
@host.update({status: "System Post Install"})
script = @host.installtemplate.postinstall.content
template = @host.installtemplate
@ansible = Account.find_by(name: "ansible")
@site = @host.site
host = @host
@template = @host.installtemplate
result = render inline: script, layout: false, content_type: 'text/plain'
@host.update({lastpostinstallgenerated: result})
end
end
def generate_installed
sourceip=request.headers['REMOTE_ADDR']
log=Log.new({source: "#{sourceip}", crit: "info",message: "#{@host.uuid} Install Finished."})
log.save()
if @host.update({status: "Installation Finish", installed: true, toinstall: false, interface: params[:interface],ip: params[:installip]})
render plain: "ok"
else
render json: @host.errors
end
end
def generate_metadata
@host = Host.find_by(uuid: params[:uuid])
script = Script.find_by({name: "metadata",stage: "config"})
result = render inline: script.content, layout: false, content_type: 'text/plain'
end
private
# Use callbacks to share common setup or constraints between actions.
def set_host_by_uuid
@host = Host.find_by(uuid: params[:uuid])
if ! @host
logger.debug "> NEW HOST DETECTED !!!"
sourceip=request.headers['REMOTE_ADDR']
log=Log.new({source: "#{sourceip}", crit: "warning",message: "New host with uuid #{params[:uuid]} Detected."})
log.save()
@template = Installtemplate.find_by(name:"default")
@site = Site.find_by(name:"default")
@account = Account.find_by(name:"default")
@host = Host.new(hostname: "New host detected",uuid: params["uuid"], installip: params["installip"], installtemplate: @template,site: @site, mac: params["mac"], status: "discover", discover: true,installed: false, toinstall: false,rootaccount: @account, mainaccount: @account)
@host.save!
end
end
# Only allow a list of trusted parameters through.
def host_params
params.require(:host).permit(:uuid, :hostname, :ip, :status, :mac, :discover, :installed, :interface , :installtemplate, :site , :installtemplate_id, :site_id, :rootaccount_id, :mainaccount_id,:toinstall, :installip)
end
end

View File

@ -1,4 +0,0 @@
class HomeController < ApplicationController
def index
end
end

View File

@ -0,0 +1,139 @@
class HostsController < ApplicationController
before_action :authenticate_user!
before_action :set_host, only: %i[ show edit update destroy ]
before_action :set_host_by_uuid, only: %i[ generate_boot generate_install generate_postinstall generate_metadata ]
# GET /hosts or /hosts.json
def index
@hosts = Host.asc(:hostname)
end
# GET /hosts/1 or /hosts/1.json
def show
end
# GET /hosts/new
def new
@host = Host.new
end
# GET /hosts/1/edit
def edit
end
# POST /hosts or /hosts.json
def create
@host = Host.new(host_params)
respond_to do |format|
if @host.save
format.html { redirect_to host_url(@host), notice: "Host was successfully created." }
format.json { render :show, status: :created, location: @host }
else
format.html { render :new, status: :unprocessable_entity }
format.json { render json: @host.errors, status: :unprocessable_entity }
end
end
end
# PATCH/PUT /hosts/1 or /hosts/1.json
def update
puts host_params
respond_to do |format|
log=Log.new({source: "admin", crit: "info",message: "User xxx update #{host_params[:hostname]}"})
log.save()
if @host.update(host_params)
format.html { redirect_to host_url(@host), notice: "Host was successfully updated." }
format.json { render :show, status: :ok, location: @host }
else
format.html { render :edit, status: :unprocessable_entity }
format.json { render json: @host.errors, status: :unprocessable_entity }
end
end
end
# DELETE /hosts/1 or /hosts/1.json
def destroy
@host.destroy!
respond_to do |format|
format.html { redirect_to hosts_url, notice: "Host was successfully destroyed." }
format.json { head :no_content }
end
end
def generate_boot
if @host
@host.mac = params[:mac]
@host.installip = params[:installip]
boot_script = @host.installtemplate.boot.content
template = @host.installtemplate
@site = @host.site
host = @host
@template = @host.installtemplate
result = render inline: boot_script, layout: false, content_type: 'text/plain'
@host.update({lastbootgenerated: result})
end
end
def generate_install
if @host
script = @host.installtemplate.install.content
template = @host.installtemplate
@site = @host.site
host = @host
@template = @host.installtemplate
result = render inline: script, layout: false, content_type: 'text/plain'
@host.update({lastinstallgenerated: result})
end
end
def generate_postinstall
if @host
script = @host.installtemplate.postinstall.content
template = @host.installtemplate
@ansible = Account.find_by(name: "ansible")
@site = @host.site
host = @host
@template = @host.installtemplate
result = render inline: script, layout: false, content_type: 'text/plain'
end
end
def generate_metadata
@host = Host.find_by(uuid: params[:uuid])
script = Script.find_by({name: "metadata",stage: "config"})
result = render inline: script.content, layout: false, content_type: 'text/plain'
end
private
# Use callbacks to share common setup or constraints between actions.
def set_host
logger.debug "#{params}"
@host = Host.find(params[:id])
end
def set_host_by_uuid
@host = Host.find_by(uuid: params[:uuid])
if ! @host
logger.debug "> NEW HOST DETECTED !!!"
sourceip=request.headers['REMOTE_ADDR']
log=Log.new({source: "#{sourceip}", crit: "warning",message: "New host with uuid #{params[:uuid]} Detected."})
log.save()
@template = Installtemplate.find_by(name:"default")
@site = Site.find_by(name:"default")
@account = Account.find_by(name:"default")
@host = Host.new(hostname: "New host detected",uuid: params["uuid"], installip: params["installip"], installtemplate: @template,site: @site, mac: params["mac"], status: "discover", discover: true,installed: false, toinstall: false,rootuser: @account, mainuser: @account)
@host.save!
end
end
# Only allow a list of trusted parameters through.
def host_params
params.require(:host).permit(:uuid, :hostname, :ip, :status, :mac, :discover, :installed, :interface , :installtemplate, :site , :installtemplate_id, :site_id, :rootaccount_id, :mainaccount_id,:toinstall, :installip)
end
end

View File

@ -0,0 +1,71 @@
class InstalltemplatesController < ApplicationController
before_action :authenticate_user!
before_action :set_installtemplate, only: %i[ show edit update destroy ]
# GET /installtemplates or /installtemplates.json
def index
@installtemplates = Installtemplate.asc(:name)
end
# GET /installtemplates/1 or /installtemplates/1.json
def show
end
# GET /installtemplates/new
def new
@installtemplate = Installtemplate.new
end
# GET /installtemplates/1/edit
def edit
end
# POST /installtemplates or /installtemplates.json
def create
@installtemplate = Installtemplate.new(installtemplate_params)
respond_to do |format|
if @installtemplate.save
format.html { redirect_to installtemplate_url(@installtemplate), notice: "Installtemplate was successfully created." }
format.json { render :show, status: :created, location: @installtemplate }
else
format.html { render :new, status: :unprocessable_entity }
format.json { render json: @installtemplate.errors, status: :unprocessable_entity }
end
end
end
# PATCH/PUT /installtemplates/1 or /installtemplates/1.json
def update
respond_to do |format|
if @installtemplate.update(installtemplate_params)
format.html { redirect_to installtemplate_url(@installtemplate), notice: "Installtemplate was successfully updated." }
format.json { render :show, status: :ok, location: @installtemplate }
else
format.html { render :edit, status: :unprocessable_entity }
format.json { render json: @installtemplate.errors, status: :unprocessable_entity }
end
end
end
# DELETE /installtemplates/1 or /installtemplates/1.json
def destroy
@installtemplate.destroy!
respond_to do |format|
format.html { redirect_to installtemplates_url, notice: "Installtemplate was successfully destroyed." }
format.json { head :no_content }
end
end
private
# Use callbacks to share common setup or constraints between actions.
def set_installtemplate
@installtemplate = Installtemplate.find(params[:id])
end
# Only allow a list of trusted parameters through.
def installtemplate_params
params.require(:installtemplate).permit(:name, :ostype, :osversion, :repository, :nfsroot, :kernel, :initrd, :rootfile, :boot_id, :install_id, :postinstall_id, :lang)
end
end

View File

@ -0,0 +1,75 @@
class LogsController < ApplicationController
before_action :authenticate_user!
before_action :set_log, only: %i[ show edit update destroy ]
# GET /logs or /logs.json
def index
@logs = Log.desc(:created_at)
end
# GET /logs/1 or /logs/1.json
def show
end
# GET /logs/new
def new
@log = Log.new
end
# GET /logs/1/edit
def edit
end
# POST /logs or /logs.json
def create
@log = Log.new(log_params)
respond_to do |format|
if @log.save
format.html { redirect_to log_url(@log), notice: "Log was successfully created." }
format.json { render :show, status: :created, location: @log }
else
format.html { render :new, status: :unprocessable_entity }
format.json { render json: @log.errors, status: :unprocessable_entity }
end
end
end
# PATCH/PUT /logs/1 or /logs/1.json
def update
puts log_params
respond_to do |format|
if @log.update(log_params)
format.html { redirect_to log_url(@log), notice: "Log was successfully updated." }
format.json { render :show, status: :ok, location: @log }
else
format.html { render :edit, status: :unprocessable_entity }
format.json { render json: @log.errors, status: :unprocessable_entity }
end
end
end
# DELETE /logs/1 or /logs/1.json
def destroy
@log.destroy!
respond_to do |format|
format.html { redirect_to logs_url, notice: "Log was successfully destroyed." }
format.json { head :no_content }
end
end
private
# Use callbacks to share common setup or constraints between actions.
def set_log
logger.debug "#{params}"
@log = Log.find(params[:id])
end
# Only allow a list of trusted parameters through.
def log_params
params.require(:log).permit(:source, :crit, :message)
end
end

View File

@ -0,0 +1,5 @@
class PagesController < ApplicationController
def index
@hostslist = Host.all
end
end

View File

@ -1,4 +1,6 @@
class ScriptsController < ApplicationController
before_action :authenticate_user!
before_action :set_script, only: %i[ show edit update destroy ]
# GET /scripts or /scripts.json

View File

@ -0,0 +1,73 @@
class SitesController < ApplicationController
before_action :authenticate_user!
before_action :set_site, only: %i[ show edit update destroy ]
# GET /sites or /sites.json
def index
@sites = Site.all
end
# GET /sites/1 or /sites/1.json
def show
end
# GET /sites/new
def new
@site = Site.new
end
# GET /sites/1/edit
def edit
end
# POST /sites or /sites.json
def create
@site = Site.new(site_params)
respond_to do |format|
if @site.save
format.html { redirect_to site_url(@site), notice: "Site was successfully created." }
format.json { render :show, status: :created, location: @site }
else
format.html { render :new, status: :unprocessable_entity }
format.json { render json: @site.errors, status: :unprocessable_entity }
end
end
end
# PATCH/PUT /sites/1 or /sites/1.json
def update
respond_to do |format|
if @site.update(site_params)
format.html { redirect_to site_url(@site), notice: "Site was successfully updated." }
format.json { render :show, status: :ok, location: @site }
else
format.html { render :edit, status: :unprocessable_entity }
format.json { render json: @site.errors, status: :unprocessable_entity }
end
end
end
# DELETE /sites/1 or /sites/1.json
def destroy
@site.destroy!
respond_to do |format|
format.html { redirect_to sites_url, notice: "Site was successfully destroyed." }
format.json { head :no_content }
end
end
private
# Use callbacks to share common setup or constraints between actions.
def set_site
@site = Site.find(params[:id])
end
# Only allow a list of trusted parameters through.
def site_params
params.require(:site).permit(:name, :domain, :gateway, :nameserver, :network, :netmask, :server_ip, :server_port, :fileserver_ip, :fileserver_port,:fileserver_basepath, :timezone, :apiurl, :cfenginehub)
end
end

View File

@ -0,0 +1,10 @@
class Account
include Mongoid::Document
include Mongoid::Timestamps
field :name, type: String
field :login, type: String
field :encpassword, type: String
field :sshpubkey, type: String
has_many :rootref, class_name: "Host", inverse_of: :rootuser
has_many :userref, class_name: "Host", inverse_of: :mainuser
end

View File

@ -0,0 +1,21 @@
class Host
include Mongoid::Document
include Mongoid::Timestamps
field :uuid, type: String
field :hostname, type: String
field :ip, type: String
field :installip, type: String
field :status, type: String
field :mac, type: String
field :discover, type: Mongoid::Boolean
field :installed, type: Mongoid::Boolean
field :toinstall, type: Mongoid::Boolean
field :interface, type: String
field :lastbootgenerated, type: String , default: ''
field :lastinstallgenerated, type: String , default: ''
field :lastpostinstallgenerated, type: String, default: ''
belongs_to :installtemplate , class_name: "Installtemplate", inverse_of: :hostreferences
belongs_to :site , class_name: "Site", inverse_of: :sitereferences
belongs_to :rootaccount , class_name: "Account", inverse_of: :rootref
belongs_to :mainaccount , class_name: "Account", inverse_of: :accountref
end

View File

@ -0,0 +1,18 @@
class Installtemplate
include Mongoid::Document
include Mongoid::Timestamps
field :name, type: String
field :ostype, type: String
field :osversion, type: String
field :repository, type: String
field :nfsroot, type: String
field :kernel, type: String
field :initrd, type: String
field :rootfile, type: String
field :lang, type: String
has_many :hostreferences, class_name: "Host", inverse_of: :installtemplate
belongs_to :boot , class_name: "Script", inverse_of: :bootref
belongs_to :install , class_name: "Script", inverse_of: :installref
belongs_to :postinstall , class_name: "Script", inverse_of: :postsinstallref
end

View File

@ -0,0 +1,8 @@
class Log
include Mongoid::Document
include Mongoid::Timestamps
field :source, type: String
field :crit, type: String
field :message, type: String
end

View File

@ -0,0 +1,21 @@
class Site
include Mongoid::Document
include Mongoid::Timestamps
field :name, type: String
field :domain, type: String
field :gateway, type: String
field :nameserver, type: String
field :network, type: String
field :netmask, type: String
field :server_ip, type: String
field :server_port, type: String
field :fileserver_ip, type: String
field :fileserver_port, type: String
field :fileserver_basepath, type: String
field :timezone, type: String
field :apiurl, type: String
field :description, type: String
field :cfenginehub, type: String
has_many :sitereferences, class_name: "Host", inverse_of: :site
end

View File

@ -0,0 +1,37 @@
class User
include Mongoid::Document
# Include default devise modules. Others available are:
# :confirmable, :lockable, :timeoutable, :trackable and :omniauthable
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :validatable
## Database authenticatable
field :email, type: String, default: ""
field :encrypted_password, type: String, default: ""
## Recoverable
field :reset_password_token, type: String
field :reset_password_sent_at, type: Time
## Rememberable
field :remember_created_at, type: Time
## Trackable
# field :sign_in_count, type: Integer, default: 0
# field :current_sign_in_at, type: Time
# field :last_sign_in_at, type: Time
# field :current_sign_in_ip, type: String
# field :last_sign_in_ip, type: String
## Confirmable
# field :confirmation_token, type: String
# field :confirmed_at, type: Time
# field :confirmation_sent_at, type: Time
# field :unconfirmed_email, type: String # Only if using reconfirmable
## Lockable
# field :failed_attempts, type: Integer, default: 0 # Only if lock strategy is :failed_attempts
# field :unlock_token, type: String # Only if unlock strategy is :email or :both
# field :locked_at, type: Time
include Mongoid::Timestamps
end

View File

@ -0,0 +1,20 @@
<div id="<%= dom_id account %>">
<p>
<strong>Name:</strong>
<%= account.name %>
</p>
<p>
<strong>Login:</strong>
<%= account.login %>
</p>
<p>
<strong>SSH Key:</strong>
<%= account.sshpubkey %>
</p>
</div>

View File

@ -0,0 +1,2 @@
json.extract! account, :id, :name, :login, :sshpubkey, :password, :created_at, :updated_at
json.url account_url(account, format: :json)

View File

@ -0,0 +1,5 @@
<tr>
<td><%= account.name %></td>
<td><%= account.login %></td>
<td> <%= button_to "Edit", edit_account_path(account), method: :get, class: "button is-small is-primary" %></tr>
</tr>

View File

@ -0,0 +1,51 @@
<div class="box">
<%= form_with(model: account) do |form| %>
<% if account.errors.any? %>
<div style="color: red">
<h2><%= pluralize(account.errors.count, "error") %> prohibited this account from being saved:</h2>
<ul>
<% account.errors.each do |error| %>
<li><%= error.full_message %></li>
<% end %>
</ul>
</div>
<% end %>
<div class="field">
<label class="label">Name</label>
<div class="control">
<%= form.text_field :name , { class: "input"} %>
</div>
</div>
<div class="field is-grouped">
<div class="field">
<label class="label">Login</label>
<div class="control">
<%= form.text_field :login , { class: "input"} %>
</div>
</div>
<div class="field">
<label class="label">Password</label>
<div class="control">
<%= form.text_field :password , { class: "input"} %>
</div>
</div>
</div>
<div class="field">
<div>
<label class="label">SSH Public Key</label>
<textarea class="textarea" name="account[sshpubkey]" id="account_sshpubkey" rows="4"><%= account.sshpubkey %></textarea>
</div>
</div>
<div class="control">
<button class="button is-link">Submit</button>
<%= link_to "Return", "/accounts", class: "button is-success" %>
</div>
<% end %>
</div>
<%= button_to "Destroy", @account, method: :delete, class: "button is-danger" %>

View File

@ -0,0 +1,3 @@
<h1 class="title">Editing Account: <%= @account.name %></h1>
<%= render "form", account: @account %>

View File

@ -0,0 +1,23 @@
<p style="color: green"><%= notice %></p>
<h1 class="title">Accounts</h1>
<%= button_to "New Account", new_account_path, method: :get, class: "button is-small is-primary" %></tr>
<div class="box">
<table id="scripts" class="table">
<thead>
<tr>
<th colspan="1">Login</th>
<th colspan="1"></th>
</tr>
</thead>
<tbody>
<% @accounts.each do |account| %>
<%= render :partial => 'account_raw', :locals => { :account => account} %>
<% end %>
</tbody>
</table>
</div>

View File

@ -0,0 +1 @@
json.array! @accounts, partial: "accounts/account", as: :account

View File

@ -0,0 +1,9 @@
<h1>New account</h1>
<%= render "form", account: @account %>
<br>
<div>
<%= link_to "Back to accounts", accounts_path %>
</div>

View File

@ -0,0 +1,10 @@
<p style="color: green"><%= notice %></p>
<%= render @account %>
<div>
<%= link_to "Edit this account", edit_account_path(@account) %> |
<%= link_to "Back to accounts", accounts_path %>
<%= button_to "Destroy", @account, method: :delete %>
</div>

View File

@ -0,0 +1 @@
json.partial! "accounts/account", account: @account

View File

@ -0,0 +1,16 @@
<h2>Resend confirmation instructions</h2>
<%= form_for(resource, as: resource_name, url: confirmation_path(resource_name), html: { method: :post }) do |f| %>
<%= render "devise/shared/error_messages", resource: resource %>
<div class="field">
<%= f.label :email %><br />
<%= f.email_field :email, autofocus: true, autocomplete: "email", value: (resource.pending_reconfirmation? ? resource.unconfirmed_email : resource.email) %>
</div>
<div class="actions">
<%= f.submit "Resend confirmation instructions" %>
</div>
<% end %>
<%= render "devise/shared/links" %>

View File

@ -0,0 +1,5 @@
<p>Welcome <%= @email %>!</p>
<p>You can confirm your account email through the link below:</p>
<p><%= link_to 'Confirm my account', confirmation_url(@resource, confirmation_token: @token) %></p>

View File

@ -0,0 +1,7 @@
<p>Hello <%= @email %>!</p>
<% if @resource.try(:unconfirmed_email?) %>
<p>We're contacting you to notify you that your email is being changed to <%= @resource.unconfirmed_email %>.</p>
<% else %>
<p>We're contacting you to notify you that your email has been changed to <%= @resource.email %>.</p>
<% end %>

View File

@ -0,0 +1,3 @@
<p>Hello <%= @resource.email %>!</p>
<p>We're contacting you to notify you that your password has been changed.</p>

View File

@ -0,0 +1,8 @@
<p>Hello <%= @resource.email %>!</p>
<p>Someone has requested a link to change your password. You can do this through the link below.</p>
<p><%= link_to 'Change my password', edit_password_url(@resource, reset_password_token: @token) %></p>
<p>If you didn't request this, please ignore this email.</p>
<p>Your password won't change until you access the link above and create a new one.</p>

View File

@ -0,0 +1,7 @@
<p>Hello <%= @resource.email %>!</p>
<p>Your account has been locked due to an excessive number of unsuccessful sign in attempts.</p>
<p>Click the link below to unlock your account:</p>
<p><%= link_to 'Unlock my account', unlock_url(@resource, unlock_token: @token) %></p>

View File

@ -0,0 +1,25 @@
<h2>Change your password</h2>
<%= form_for(resource, as: resource_name, url: password_path(resource_name), html: { method: :put }) do |f| %>
<%= render "devise/shared/error_messages", resource: resource %>
<%= f.hidden_field :reset_password_token %>
<div class="field">
<%= f.label :password, "New password" %><br />
<% if @minimum_password_length %>
<em>(<%= @minimum_password_length %> characters minimum)</em><br />
<% end %>
<%= f.password_field :password, autofocus: true, autocomplete: "new-password" %>
</div>
<div class="field">
<%= f.label :password_confirmation, "Confirm new password" %><br />
<%= f.password_field :password_confirmation, autocomplete: "new-password" %>
</div>
<div class="actions">
<%= f.submit "Change my password" %>
</div>
<% end %>
<%= render "devise/shared/links" %>

View File

@ -0,0 +1,16 @@
<h2>Forgot your password?</h2>
<%= form_for(resource, as: resource_name, url: password_path(resource_name), html: { method: :post }) do |f| %>
<%= render "devise/shared/error_messages", resource: resource %>
<div class="field">
<%= f.label :email %><br />
<%= f.email_field :email, autofocus: true, autocomplete: "email" %>
</div>
<div class="actions">
<%= f.submit "Send me reset password instructions" %>
</div>
<% end %>
<%= render "devise/shared/links" %>

View File

@ -0,0 +1,48 @@
<div class="columns is-mobile is-centered">
<div class="column is-half">
<div class="box">
<h1 class="title is-1">Your profil</h1>
<%= form_for(resource, as: resource_name, url: registration_path(resource_name), html: { method: :put }) do |f| %>
<%= render "devise/shared/error_messages", resource: resource %>
<div class="field">
<%= f.label :email %><br />
<%= f.email_field :email, autofocus: true, autocomplete: "email", class: "input is-small" , placeholder: :email %>
</div>
<% if devise_mapping.confirmable? && resource.pending_reconfirmation? %>
<div>Currently waiting confirmation for: <%= resource.unconfirmed_email %></div>
<% end %>
<div class="field">
<%= f.label :password %> <i>(leave blank if you don't want to change it)</i><br />
<%= f.password_field :password, autocomplete: "new-password",class: "input is-small" , placeholder: "New password" %>
<% if @minimum_password_length %>
<br />
<em><%= @minimum_password_length %> characters minimum</em>
<% end %>
</div>
<div class="field">
<%= f.label :password_confirmation %><br />
<%= f.password_field :password_confirmation, autocomplete: "new-password", class: "input is-small" , placeholder: "New password confirmation" %>
</div>
<div class="field">
<%= f.label :current_password %> <i>(we need your current password to confirm your changes)</i><br />
<%= f.password_field :current_password, autocomplete: "current-password", class: "input is-small" , placeholder: "Current password" %>
</div>
<div class="actions">
<%= f.submit "Update",class:"button is-success" %>
</div>
<% end %>
<h3>Cancel my account</h3>
<div>Unhappy? <%= button_to "Cancel my account", registration_path(resource_name), data: { confirm: "Are you sure?", turbo_confirm: "Are you sure?" }, method: :delete , class:"button is-danger"%></div>
<%= link_to "Back", :back %>
</div>
</div>
</div>

View File

@ -0,0 +1,32 @@
<div class="columns is-mobile is-centered">
<div class="column is-half">
<div class="box">
<h1 class="title is-1">Sign up</h1>
<%= form_for(resource, as: resource_name, url: registration_path(resource_name)) do |f| %>
<%= render "devise/shared/error_messages", resource: resource %>
<div class="field">
<%= f.label :email %><br />
<%= f.email_field :email, autofocus: true, autocomplete: "email", class: "input is-small" , placeholder: :email %>
</div>
<div class="field">
<%= f.label :password %>
<% if @minimum_password_length %>
<em>(<%= @minimum_password_length %> characters minimum)</em>
<% end %><br />
<%= f.password_field :password, autocomplete: "new-password", class: "input is-small" , placeholder: "password" %>
</div>
<div class="field">
<%= f.label :password_confirmation %><br />
<%= f.password_field :password_confirmation, autocomplete: "new-password", class: "input is-small" , placeholder: "password confirmation" %>
</div>
<div class="actions">
<%= f.submit "Sign up" , class:"button is-success" %>
</div>
<% end %>
</div>
</div>
</div>

View File

@ -0,0 +1,29 @@
<div class="columns is-mobile is-centered">
<div class="column is-half">
<div class="box">
<h1 class="title is-1">Login</h1>
<%= form_for(resource, as: resource_name, url: session_path(resource_name)) do |f| %>
<div class="field">
<%= f.email_field :email, autofocus: true, autocomplete: "email" , class: "input is-small" , placeholder: :email %>
</div>
<div class="field">
<%= f.password_field :password, autocomplete: "current-password" ,class: "input is-small" , placeholder: :password%>
</div>
<% if devise_mapping.rememberable? %>
<div class="field">
<%= f.check_box :remember_me %>
<%= f.label :remember_me %>
</div>
<% end %>
<div class="actions">
<%= f.submit "Log in" , class:"button is-success" %>
</div>
<% end %>
<%= render "devise/shared/links" %>
</div>
</div>
</div>

View File

@ -0,0 +1,15 @@
<% if resource.errors.any? %>
<div id="error_explanation" data-turbo-cache="false">
<h2>
<%= I18n.t("errors.messages.not_saved",
count: resource.errors.count,
resource: resource.class.model_name.human.downcase)
%>
</h2>
<ul>
<% resource.errors.full_messages.each do |message| %>
<li><%= message %></li>
<% end %>
</ul>
</div>
<% end %>

View File

@ -0,0 +1,25 @@
<%- if controller_name != 'sessions' %>
<%= link_to "Log in", new_session_path(resource_name) %><br />
<% end %>
<%- if devise_mapping.registerable? && controller_name != 'registrations' %>
<%= link_to "Sign up", new_registration_path(resource_name) %><br />
<% end %>
<%- if devise_mapping.recoverable? && controller_name != 'passwords' && controller_name != 'registrations' %>
<%= link_to "Forgot your password?", new_password_path(resource_name) %><br />
<% end %>
<%- if devise_mapping.confirmable? && controller_name != 'confirmations' %>
<%= link_to "Didn't receive confirmation instructions?", new_confirmation_path(resource_name) %><br />
<% end %>
<%- if devise_mapping.lockable? && resource_class.unlock_strategy_enabled?(:email) && controller_name != 'unlocks' %>
<%= link_to "Didn't receive unlock instructions?", new_unlock_path(resource_name) %><br />
<% end %>
<%- if devise_mapping.omniauthable? %>
<%- resource_class.omniauth_providers.each do |provider| %>
<%= button_to "Sign in with #{OmniAuth::Utils.camelize(provider)}", omniauth_authorize_path(resource_name, provider), data: { turbo: false } %><br />
<% end %>
<% end %>

View File

@ -0,0 +1,16 @@
<h2>Resend unlock instructions</h2>
<%= form_for(resource, as: resource_name, url: unlock_path(resource_name), html: { method: :post }) do |f| %>
<%= render "devise/shared/error_messages", resource: resource %>
<div class="field">
<%= f.label :email %><br />
<%= f.email_field :email, autofocus: true, autocomplete: "email" %>
</div>
<div class="actions">
<%= f.submit "Resend unlock instructions" %>
</div>
<% end %>
<%= render "devise/shared/links" %>

View File

@ -0,0 +1,170 @@
<%# _form.html.erb %>
<div class="columns">
<div class="column">
<div class="box">
<%= form_with(model: host) do |form| %>
<% if host.errors.any? %>
<div style="color: red">
<h2><%= pluralize(host.errors.count, "error") %> prohibited this host from being saved:</h2>
<ul>
<% host.errors.each do |error| %>
<li><%= error.full_message %></li>
<% end %>
</ul>
</div>
<% end %>
<div class="field is-horizontal">
<div class="field-label is-small">
<label class="label">UUID</label>
</div>
<div class="field-body">
<div class="field">
<div class="control">
<%= form.text_field :uuid , { class: "input"} %>
</div>
</div>
</div>
</div>
<div class="field is-horizontal">
<div class="field-label is-small">
<label class="label">Hostname</label>
</div>
<div class="field-body">
<div class="field">
<div class="control">
<%= form.text_field :hostname , { class: "input"} %>
</div>
</div>
</div>
</div>
<div class="field is-horizontal">
<div class="field-label is-small">
<label class="label">ip</label>
</div>
<div class="field-body">
<div class="field">
<div class="control">
<%= form.text_field :ip , { class: "input"} %>
</div>
</div>
</div>
</div>
<div class="field is-horizontal">
<div class="field-label is-small">
<label class="label">Installing IP</label>
</div>
<div class="field-body">
<div class="field">
<div class="control">
<%= form.text_field :installip , { class: "input"} %>
</div>
</div>
</div>
</div>
<div class="field is-horizontal">
<div class="field-label is-small">
<label class="label">Status</label>
</div>
<div class="field-body">
<div class="field">
<div class="control">
<%= form.text_field :status , { class: "input"} %>
</div>
</div>
</div>
</div>
<div class="field is-horizontal">
<div class="field-label is-small">
<label class="label">MAC Address</label>
</div>
<div class="field-body">
<div class="field">
<div class="control">
<%= form.text_field :mac , { class: "input"} %>
</div>
</div>
</div>
</div>
<div class="field is-horizontal">
<div class="field-label is-small">
<label class="label">Interface</label>
</div>
<div class="field-body">
<div class="field">
<div class="control">
<%= form.text_field :interface , { class: "input"} %>
</div>
</div>
</div>
</div>
<div class="field is-horizontal">
<div class="field-label is-small">
<label class="label">Template</label>
</div>
<div class="field-body">
<div class="field">
<div class="select">
<%= collection_select(:host, :installtemplate_id, Installtemplate.all, :_id, :name) %>
</div>
</div>
</div>
</div>
<div class="field is-horizontal">
<div class="field-label is-small">
<label class="label">Site</label>
</div>
<div class="field-body">
<div class="field">
<div class="select">
<%= collection_select(:host, :site_id, Site.all, :_id, :name) %>
</div>
</div>
</div>
</div>
<div class="field is-grouped">
<div class="control">
<%= form.label :rootaccount, class: "label is-small" %>
<div class="select is-primary">
<%= form.collection_select :rootaccount_id, Account.all, :id, :name %>
</div>
</div>
<div class="control">
<%= form.label :mainaccount, class: "label is-small" %>
<div class="select is-primary">
<%= form.collection_select :mainaccount_id, Account.all, :id, :name %>
</div>
</div>
<div class="control">
<%= form.label :discover, class: "checkbox" %>
<%= form.check_box :discover %>
</div>
<div class="control">
<%= form.label :installed, class: "checkbox" %>
<%= form.check_box :installed %>
</div>
<div class="control">
<%= form.label :toinstall, class: "checkbox" %>
<%= form.check_box :toinstall %>
</div>
</div>
<div class="control">
<button class="button is-link">Submit</button>
<%= link_to "Return", "/hosts", class: "button is-success" %>
<%= button_to "Destroy", @host, method: :delete, class: "button is-danger is-pulled-right" %>
</div>
<% end %>
</div>
</div>
</div>

View File

@ -0,0 +1,69 @@
<div class="card" id="<%= dom_id host %>">
<header class="card-header">
<p class="card-header-title">
<%= host.hostname %>
</p>
<button class="card-header-icon" aria-label="more options">
<span class="icon">
<i class="fas fa-angle-down" aria-hidden="true"></i>
</span>
</button>
</header>
<div class="card-content">
<div class="content">
<p>
<strong>Ip:</strong>
<%= host.ip %>
</p>
<p>
<strong>Status:</strong>
<%= host.status %>
</p>
<p>
<strong>Mac:</strong>
<%= host.mac %>
</p>
<p>
<strong>Discover:</strong>
<%= host.discover %>
</p>
<p>
<strong>Installed:</strong>
<%= host.installed %>
</p>
<p>
<strong>Interface:</strong>
<%= host.interface %>
</p>
<p>
<strong>Install Template:</strong>
<% if defined?host.installtemplate.name %>
<%= host.installtemplate.name %>
<% else %>
not set
<% end %>
</p>
<p>
<strong>Site:</strong>
<% if defined?host.site.name %>
<%= host.site.name %>
<% else %>
not set
<% end %>
</p>
</div>
</div>
<button class="button">
<%= link_to "Edit this host", edit_host_path(host) %>
</button>
</div>

View File

@ -0,0 +1,2 @@
json.extract! host, :id, :uuid, :hostname, :ip, :status, :mac, :discover, :installed, :interface, :installtemplate, :site, :created_at, :updated_at
json.url host_url(host, format: :json)

View File

@ -0,0 +1,9 @@
<tr>
<td><%= host.hostname %></td>
<td><%= host.status %></td>
<td><%= host.installtemplate.name %></td>
<td><%= button_to "Edit", edit_host_path(host), method: :get, class: "button is-small is-primary" %></td>
<td><button id=<%= host.uuid %> class="getIpxeScript button is-small is-primary">IPXE</button></td>
<td><button id=<%= host.uuid %> class="getInstallScript button is-small is-primary">Install</button></td>
<td><button id=<%= host.uuid %> class="getPostinstallScript button is-small is-primary">Postinstall</button></td>
</tr>

View File

@ -0,0 +1,6 @@
<h1 class="title">Editing Host: <%= @host.hostname %></h1>
<%= render "form", host: @host %>

View File

@ -0,0 +1,27 @@
<h1 class="title">Hosts</h1>
<%= button_to "New Host", new_host_path, method: :get, class: "button is-small is-primary" %></tr>
<div class="container">
<table id="hosts" class="table">
<thead>
<tr>
<th colspan="1">Hostname</th>
<th colspan="1">Status</th>
<th colspan="1">Template</th>
<th colspan="1"></th>
</tr>
</thead>
<tbody>
<% @hosts.each do |host| %>
<%= render :partial => 'hostraw', :locals => { :host => host} %>
<% end %>
</tbody>
</table>
<div id="script_div">
<h2>Render</h2>
<pre style="overflow:scroll; max-height:500px" id="script_result">
</pre>
</div>
</div>

View File

@ -0,0 +1 @@
json.array! @hosts, partial: "hosts/host", as: :host

View File

@ -0,0 +1,9 @@
<h1>New host</h1>
<%= render "form", host: @host %>
<br>
<div>
<%= link_to "Back to hosts", hosts_path %>
</div>

View File

@ -0,0 +1,12 @@
<section>
<p style="color: green"><%= notice %></p>
</section>
<%= render @host %>
<div>
<button class="button">
<%= link_to "Back to hosts", hosts_path %>
</button>
</div>

View File

@ -0,0 +1 @@
json.partial! "hosts/host", host: @host

View File

@ -0,0 +1,112 @@
<div class="box">
<%= form_with(model: installtemplate) do |form| %>
<% if installtemplate.errors.any? %>
<div style="color: red">
<h2><%= pluralize(installtemplate.errors.count, "error") %> prohibited this installtemplate from being saved:</h2>
<ul>
<% installtemplate.errors.each do |error| %>
<li><%= error.full_message %></li>
<% end %>
</ul>
</div>
<% end %>
<div class="field">
<%= form.label :name, class: "label" %>
<div class="control">
<%= form.text_field :name , { class: "input"} %>
</div>
</div>
<div class="field is-grouped">
<div class="field">
<%= form.label :ostype, class: "label" %>
<div class="control">
<%= form.text_field :ostype , { class: "input"} %>
</div>
</div>
<div class="field">
<%= form.label :osversion, class: "label" %>
<div class="control">
<%= form.text_field :osversion , { class: "input"} %>
</div>
</div>
</div>
<div class="field">
<%= form.label :repository, class: "label" %>
<div class="control">
<%= form.text_field :repository , { class: "input"} %>
</div>
</div>
<div class="field">
<%= form.label :nfsroot, class: "label" %>
<div class="control">
<%= form.text_field :nfsroot , { class: "input"} %>
</div>
</div>
<div class="field is-grouped">
<div class="field">
<%= form.label :kernel, class: "label" %>
<div class="control">
<%= form.text_field :kernel , { class: "input"} %>
</div>
</div>
<div class="field">
<%= form.label :initrd, class: "label" %>
<div class="control">
<%= form.text_field :initrd , { class: "input"} %>
</div>
</div>
</div>
<div class="field">
<%= form.label :rootfile, class: "label" %>
<div class="control">
<%= form.text_field :rootfile , { class: "input"} %>
</div>
</div>
<div class="field is-grouped">
<div class="control">
<%= form.label :boot, class: "label" %>
<div class="select is-primary">
<%= form.collection_select :boot_id, Script.where(stage:"boot"), :id, :name %>
</div>
</div>
<div class="control">
<%= form.label :install, class: "label" %>
<div class="select is-primary">
<%= form.collection_select :install_id, Script.where(stage:"install"), :id, :name %>
</div>
</div>
<div class="control">
<%= form.label :postinstall, class: "label" %>
<div class="select is-primary">
<%= form.collection_select :postinstall_id, Script.where(stage:"postinstall"), :id, :name %>
</div>
</div>
</div>
<div class="field">
<%= form.label :lang, class: "label" %>
<div class="control">
<%= form.text_field :lang , { class: "input"} %>
</div>
</div>
<div class="control">
<button class="button is-link">Submit</button>
<%= link_to "Return", "/installtemplates", class: "button is-success" %>
</div>
<% end %>
<%= button_to " Destroy ", @installtemplate, method: :delete, class: "button is-danger" %>

View File

@ -0,0 +1,69 @@
<div id="<%= dom_id installtemplate %>">
<p>
<strong>Name:</strong>
<%= installtemplate.name %>
</p>
<p>
<strong>Ostype:</strong>
<%= installtemplate.ostype %>
</p>
<p>
<strong>Osversion:</strong>
<%= installtemplate.osversion %>
</p>
<p>
<strong>Repository:</strong>
<%= installtemplate.repository %>
</p>
<p>
<strong>Nfsroot:</strong>
<%= installtemplate.nfsroot %>
</p>
<p>
<strong>Kernel:</strong>
<%= installtemplate.kernel %>
</p>
<p>
<strong>Initrd:</strong>
<%= installtemplate.initrd %>
</p>
<p>
<strong>Rootfile:</strong>
<%= installtemplate.rootfile %>
</p>
<p>
<strong>Boot Script</strong>
<% if defined?installtemplate.boot.name %>
<%= installtemplate.boot.name %>
<% else %>
not set
<% end %>
</p>
<p>
<strong>Install</strong>
<% if defined?installtemplate.install.name %>
<%= installtemplate.install.name %>
<% else %>
not set
<% end %>
</p>
<p>
<strong>PostInstall</strong>
<% if defined?installtemplate.boot.name %>
<%= installtemplate.boot.name %>
<% else %>
not set
<% end %>
</p>
</div>

View File

@ -0,0 +1,2 @@
json.extract! installtemplate, :id, :name, :ostype, :osversion, :repository, :nfsroot, :kernel, :initrd, :rootfile, :boot, :install, :postinstall :created_at, :updated_at
json.url installtemplate_url(installtemplate, format: :json)

View File

@ -0,0 +1,4 @@
<tr>
<td><%= installtemplate.name %></td>
<td> <%= button_to "Edit", edit_installtemplate_path(installtemplate), method: :get, class: "button is-small is-primary" %></tr>
</tr>

View File

@ -0,0 +1,10 @@
<h1 class="title">Editing <%= @installtemplate.name %></h1>
<%= render "form", installtemplate: @installtemplate %>
<br>
<div>
<%= link_to "Show", @installtemplate %> |
<%= link_to "Back", installtemplates_path %>
</div>

View File

@ -0,0 +1,21 @@
<p style="color: green"><%= notice %></p>
<h1 class="title">Templates</h1>
<%= button_to "New Template", new_installtemplate_path, method: :get, class: "button is-small is-primary" %></tr>
<div class="box">
<table id="Templates" class="table">
<thead>
<tr>
<th colspan="1">Name</th>
<th colspan="1"></th>
</tr>
</thead>
<tbody>
<% @installtemplates.each do |installtemplate| %>
<%= render :partial => 'templateraw', :locals => { :installtemplate => installtemplate} %>
<% end %>
</tbody>
</table>
</div>

View File

@ -0,0 +1 @@
json.array! @installtemplates, partial: "installtemplates/installtemplate", as: :installtemplate

View File

@ -0,0 +1,9 @@
<h1>New installtemplate</h1>
<%= render "form", installtemplate: @installtemplate %>
<br>
<div>
<%= link_to "Back to installtemplates", installtemplates_path %>
</div>

View File

@ -0,0 +1,10 @@
<p style="color: green"><%= notice %></p>
<%= render @installtemplate %>
<div>
<%= link_to "Edit this installtemplate", edit_installtemplate_path(@installtemplate) %> |
<%= link_to "Back to installtemplates", installtemplates_path %>
<%= button_to "Destroy this installtemplate", @installtemplate, method: :delete %>
</div>

View File

@ -0,0 +1 @@
json.partial! "installtemplates/installtemplate", installtemplate: @installtemplate

View File

@ -1,3 +1,4 @@
<!-- application.html.erb -->
<!DOCTYPE html>
<html>
<head>
@ -14,13 +15,14 @@
<body>
<div class="container is-fluid">
<%= render "partials/top-menu" %>
<div class="columns">
<div class="column is-one-fifth">
<div class="columns is-1">
<div class="column is-one-quarter">
<%= render "partials/left-menu" %>
</div>
<div class="column auto">
<div class="container is-fluid">
</div>
<div class="column">
<p class="notice"><%= notice %></p>
<p class="alert"><%= alert %></p>
<div class="container">
<%= yield %>
</div>
</div>
@ -29,3 +31,5 @@
<%= javascript_include_tag "init" %>
</body>
</html>
<!-- end application.html.erb -->

View File

@ -0,0 +1,6 @@
<tr>
<td><%= log.created_at %></td>
<td><%= log.source %></td>
<td><%= log.crit %></td>
<td><%= log.message %></td>
</tr>

View File

@ -0,0 +1,22 @@
<p style="color: green"><%= notice %></p>
<div class="scrollDiv" >
<table id="logs" class="table">
<thead>
<tr>
<th colspan="1">Date</th>
<th colspan="1">Source</th>
<th colspan="1">Crit</th>
<th colspan="1">Message</th>
<th colspan="1"></th>
</tr>
</thead>
<tbody>
<% @logs.each do |log| %>
<%= render :partial => 'log_raw', :locals => { :log => log} %>
<% end %>
</tbody>
</table>
</div>

View File

@ -0,0 +1 @@
json.array! @logs, partial: "logs/log", as: :log

View File

@ -3,5 +3,5 @@
<div class="notification is-primary">
<h1>Home#index</h1>
</div>
<p>Find me in app/views/home/index.html.erb</p>
<p>Find me in app/views/pages/index.html.erb</p>
</div>

View File

@ -1,40 +1,32 @@
<aside class="menu">
<p class="menu-label">Tutorial</p>
<ul class="menu-list">
<li>
<a class="has-background-info toggleable">
Configurations
</a>
<ul>
<li><a href="/scripts">Scripts</a></li>
<li><a href="/templates">Templates</a></li>
<li><a href="/sites">Templates</a></li>
<li><a href="/accounts">Accounts</a></li>
<aside class="menu">
<ul class="menu-list">
<li>
<a class="has-background-info toggleable">
Configurations
</a>
<ul>
<%= link_to "Scripts" , scripts_path %>
<%= link_to "Templates" , installtemplates_path %>
<%= link_to "Sites" , sites_path %>
<%= link_to "Account" , accounts_path %>
</ul>
</li>
<li>
<% if @hostslist %>
<a class="has-background-info toggleable">
Hosts
</a>
<ul>
<% @hostslist.each do |host| %>
<%= link_to host.hostname , edit_host_path(host) %>
<% end %>
</ul>
</li>
<li>
<a class="has-background-info toggleable">
Hosts
</a>
<ul>
<li><a href="/host1">host1</a></li>
</ul>
</li>
<li><a>Data Structures</a></li>
<li><a>Web Tech</a></li>
<li><a>Machine Learning</a></li>
</ul>
<p class="menu-label">Courses</p>
<ul class="menu-list">
<li><a>Java</a></li>
<li><a>Python</a></li>
<li><a>C++</a></li>
</ul>
<ul class="menu-list">
<li><a>About us</a></li>
<li><a>Careers</a></li>
</ul>
</aside>
</ul>
<% else %>
<%= link_to "Host" , hosts_path %>
<% end %>
</li>
<li><%= link_to "Logs" , logs_path %></li>
</ul>
</aside>

View File

@ -13,7 +13,7 @@
<div id="navbarBasicExample" class="navbar-menu">
<div class="navbar-start">
<a class="navbar-item">
<a href="/", class="navbar-item">
Home
</a>
@ -47,14 +47,17 @@
<div class="navbar-end">
<div class="navbar-item">
<div class="buttons">
<a class="button is-primary">
<strong>Sign up</strong>
</a>
<a class="button is-light">
Log in
</a>
<% if !user_signed_in? %>
<%= link_to "Login", new_user_session_path, class: "button is-light" %>
<% else %>
<%= link_to "Profil", edit_user_registration_path, class: "button is-light" %>
<%= button_to "Logout", destroy_user_session_path, method: :delete, class: "button is-light" %>
<% end %>
</div>
</div>
</div>
</div>
</nav>
</nav>

View File

@ -1,3 +1,4 @@
<div class="box">
<%= form_with(model: script) do |form| %>
<% if script.errors.any? %>
<div style="color: red">
@ -11,37 +12,58 @@
</div>
<% end %>
<div>
<%= form.label :name, style: "display: block" %>
<%= form.text_field :name %>
<div class="field">
<label class="label">Name</label>
<div class="control">
<%= form.text_field :name , { class: "input"} %>
</div>
</div>
<div>
<%= form.label :stage, style: "display: block" %>
<%= form.text_field :stage %>
<div class="field is-grouped">
<div class="field">
<label class="label">Stage</label>
<div class="control">
<%= form.text_field :stage , { class: "input"} %>
</div>
</div>
<div class="field">
<label class="label">Lang</label>
<div class="control">
<%= form.text_field :lang , { class: "input"} %>
</div>
</div>
</div>
<div class="field">
<div>
<label class="label">Content</label>
<textarea class="textarea" name="script[content]" id="script_content" rows="15"><%= script.content %></textarea>
</div>
</div>
<div>
<%= form.label :lang, style: "display: block" %>
<%= form.text_field :lang %>
<div class="control">
<label class="checkbox">
<% if script.lock %>
<input type="checkbox" name="script[lock]", id="script_lock", checked>
<% else %>
<input type="checkbox" name="script[lock]", id="script_lock">
<% end %>
Lock
</label>
</div>
<div class="field">
<div>
<label class="label">Description</label>
<textarea class="textarea" name="script[description]" id="script_description" rows="2"><%= script.description %></textarea>
</div>
</div>
<div>
<%= form.label :content, style: "display: block" %>
<%= form.text_area :content %>
</div>
<div>
<%= form.label :lock, style: "display: block" %>
<%= form.check_box :lock %>
</div>
<div>
<%= form.label :description, style: "display: block" %>
<%= form.text_area :description %>
</div>
<div>
<%= form.submit %>
<div class="control">
<button class="button is-link">Submit</button>
<%= link_to "Return", "/scripts", class: "button is-success" %>
</div>
<% end %>
</div>
<%= button_to "Destroy", @script, method: :delete, class: "button is-danger" %>

View File

@ -0,0 +1,7 @@
<tr>
<td><%= script.name %></td>
<td><%= script.stage %></td>
<td><%= script.lang %></td>
<td> <%= button_to "Edit", edit_script_path(script), method: :get, class: "button is-small is-primary" %>
</tr>

View File

@ -1,10 +1,3 @@
<h1>Editing script</h1>
<h1 class="title">Editing Script: <%= @script.name %></h1>
<%= render "form", script: @script %>
<br>
<div>
<%= link_to "Show this script", @script %> |
<%= link_to "Back to scripts", scripts_path %>
</div>

View File

@ -1,14 +1,23 @@
<p style="color: green"><%= notice %></p>
<h1>Scripts</h1>
<div id="scripts">
<% @scripts.each do |script| %>
<%= render script %>
<p>
<%= link_to "Show this script", script %>
</p>
<% end %>
<h1 class="title">Scripts</h1>
<%= button_to "New Script", new_script_path, method: :get, class: "button is-small is-primary" %></tr>
<div class="box">
<table id="scripts" class="table">
<thead>
<tr>
<th colspan="1">Name</th>
<th colspan="1">Stage</th>
<th colspan="1">Lang</th>
<th colspan="1"></th>
</tr>
</thead>
<tbody>
<% @scripts.each do |script| %>
<%= render :partial => 'script_raw', :locals => { :script => script} %>
<% end %>
</tbody>
</table>
</div>
<%= link_to "New script", new_script_path %>

View File

@ -0,0 +1,117 @@
<%= form_with(model: site) do |form| %>
<div class="field">
<label class="label">Name</label>
<div class="control">
<%= form.text_field :name , { class: "input"} %>
</div>
</div>
<div class="field is-grouped">
<div class="field">
<label class="label">Domain</label>
<div class="control">
<%= form.text_field :domain , { class: "input"} %>
</div>
</div>
<div class="field">
<label class="label">Gateway</label>
<div class="control">
<%= form.text_field :gateway , { class: "input"} %>
</div>
</div>
<div class="field">
<label class="label">Nameserver</label>
<div class="control">
<%= form.text_field :nameserver , { class: "input"} %>
</div>
</div>
</div>
<div class="field is-grouped">
<div class="field">
<label class="label">Network</label>
<div class="control">
<%= form.text_field :network , { class: "input"} %>
</div>
</div>
<div class="field">
<label class="label">Netmask</label>
<div class="control">
<%= form.text_field :netmask , { class: "input"} %>
</div>
</div>
</div>
<div class="field">
<%= form.label :apiurl, class: "label" %>
<div class="control">
<%= form.text_field :apiurl , { class: "input"} %>
</div>
</div>
<div class="field is-grouped">
<div class="field">
<label class="label">Serveur IP</label>
<div class="control">
<%= form.text_field :server_ip , { class: "input"} %>
</div>
</div>
<div class="field">
<label class="label">Serveur Port</label>
<div class="control">
<%= form.text_field :server_port , { class: "input"} %>
</div>
</div>
</div>
<div class="field is-grouped">
<div class="field">
<label class="label">File Server Ip</label>
<div class="control">
<%= form.text_field :fileserver_ip , { class: "input"} %>
</div>
</div>
<div class="field">
<label class="label">File Server Port</label>
<div class="control">
<%= form.text_field :fileserver_port , { class: "input"} %>
</div>
</div>
<div class="field">
<label class="label">File Server Basepath</label>
<div class="control">
<%= form.text_field :fileserver_basepath , { class: "input"} %>
</div>
</div>
</div>
<div class="field">
<%= form.label :cfenginehub, class: "label" %>
<div class="control">
<%= form.text_field :cfenginehub , { class: "input"} %>
</div>
</div>
<% if not @site.cfenginehub.empty? -%>
<%= link_to "Goto cfengine hub", "http://#{@site.cfenginehub}", class: "button is-info", :target => "_blank" %>
<% end -%>
<div class="field">
<%= form.label :timezone, class: "label" %>
<div class="control">
<%= form.text_field :timezone , { class: "input"} %>
</div>
</div>
<div class="control">
<button class="button is-link">Submit In</button>
<%= link_to "Return to Site index", "/sites", class: "button is-success" %>
</div>
<% end %>

View File

@ -0,0 +1,37 @@
<div id="<%= dom_id site %>">
<p>
<strong>Name:</strong>
<%= site.name %>
</p>
<p>
<strong>Domain:</strong>
<%= site.domain %>
</p>
<p>
<strong>Gateway:</strong>
<%= site.gateway %>
</p>
<p>
<strong>Nameserver:</strong>
<%= site.nameserver %>
</p>
<p>
<strong>Network:</strong>
<%= site.network %>
</p>
<p>
<strong>Netmask:</strong>
<%= site.netmask %>
</p>
<p>
<strong>Server:</strong>
<%= site.server_ip %>:<%= site.server_port %>:
</p>
</div>

View File

@ -0,0 +1,2 @@
json.extract! site, :id, :name, :domain, :gateway, :nameserver, :network, :netmask, :created_at, :updated_at
json.url site_url(site, format: :json)

View File

@ -0,0 +1,5 @@
<tr>
<td><%= site.name %></td>
<td><%= site.description %></td>
<td> <%= button_to "Edit", edit_site_path(site), method: :get, class: "button is-small is-primary" %></tr>
</tr>

View File

@ -0,0 +1,24 @@
<%= hidden_field_tag :direction, params[:direction] %>
<%= hidden_field_tag :sort, params[:sort] %>
<table class="table table-striped table-bordered table-condensed sortable">
<thead>
<tr>
<th style="width: 200px;">Nom</th>
<th style="width: 40px;"></th>
</tr>
</thead>
<tbody>
<% @sites.each do |site| %>
<tr>
<td valign="top">
<%= link_to site.name, edit_site_path(site), :remote => true %>
</td>
<td valign="top">
<%= site.description %>
</td>
</tr>
<% end %>
</tbody>
</table>

View File

@ -0,0 +1,4 @@
<h1 class="title">Editing Site: <%= @site.name %></h1>
<%= render "form", site: @site %>

View File

@ -0,0 +1,22 @@
<p style="color: green"><%= notice %></p>
<h1 class="title">Sites</h1>
<%= button_to "New Site", new_site_path, method: :get, class: "button is-small is-primary" %></tr>
<div class="box">
<table id="sites" class="table">
<thead>
<tr>
<th colspan="1">Site Name</th>
<th colspan="1"></th>
</tr>
</thead>
<tbody>
<% @sites.each do |site| %>
<%= render :partial => 'siteraw', :locals => { :site => site} %>
<% end %>
</tbody>
</table>
</div>

View File

@ -0,0 +1 @@
json.array! @sites, partial: "sites/site", as: :site

View File

@ -0,0 +1,9 @@
<h1>New site</h1>
<%= render "form", site: @site %>
<br>
<div>
<%= link_to "Back to sites", sites_path %>
</div>

View File

@ -0,0 +1,10 @@
<p style="color: green"><%= notice %></p>
<%= render @site %>
<div>
<%= link_to "Edit this site", edit_site_path(@site) %> |
<%= link_to "Back to sites", sites_path %>
<%= button_to "Destroy this site", @site, method: :delete %>
</div>

View File

@ -0,0 +1 @@
json.partial! "sites/site", site: @site

View File

@ -0,0 +1,313 @@
# frozen_string_literal: true
# Assuming you have not yet modified this file, each configuration option below
# is set to its default value. Note that some are commented out while others
# are not: uncommented lines are intended to protect your configuration from
# breaking changes in upgrades (i.e., in the event that future versions of
# Devise change the default values for those options).
#
# Use this hook to configure devise mailer, warden hooks and so forth.
# Many of these configuration options can be set straight in your model.
Devise.setup do |config|
# The secret key used by Devise. Devise uses this key to generate
# random tokens. Changing this key will render invalid all existing
# confirmation, reset password and unlock tokens in the database.
# Devise will use the `secret_key_base` as its `secret_key`
# by default. You can change it below and use your own secret key.
# config.secret_key = '212c806ba4eb75fa3cb7e420cd124e050fb18119c5f3c836f10ce76c375da49f3689319c7e68bc22b23474dfb3d8ec4d1b6c214a10b0be2e8e38b0cf96c25e9a'
# ==> Controller configuration
# Configure the parent class to the devise controllers.
# config.parent_controller = 'DeviseController'
# ==> Mailer Configuration
# Configure the e-mail address which will be shown in Devise::Mailer,
# note that it will be overwritten if you use your own mailer class
# with default "from" parameter.
config.mailer_sender = 'please-change-me-at-config-initializers-devise@example.com'
# Configure the class responsible to send e-mails.
# config.mailer = 'Devise::Mailer'
# Configure the parent class responsible to send e-mails.
# config.parent_mailer = 'ActionMailer::Base'
# ==> ORM configuration
# Load and configure the ORM. Supports :active_record (default) and
# :mongoid (bson_ext recommended) by default. Other ORMs may be
# available as additional gems.
require 'devise/orm/mongoid'
# ==> Configuration for any authentication mechanism
# Configure which keys are used when authenticating a user. The default is
# just :email. You can configure it to use [:username, :subdomain], so for
# authenticating a user, both parameters are required. Remember that those
# parameters are used only when authenticating and not when retrieving from
# session. If you need permissions, you should implement that in a before filter.
# You can also supply a hash where the value is a boolean determining whether
# or not authentication should be aborted when the value is not present.
# config.authentication_keys = [:email]
# Configure parameters from the request object used for authentication. Each entry
# given should be a request method and it will automatically be passed to the
# find_for_authentication method and considered in your model lookup. For instance,
# if you set :request_keys to [:subdomain], :subdomain will be used on authentication.
# The same considerations mentioned for authentication_keys also apply to request_keys.
# config.request_keys = []
# Configure which authentication keys should be case-insensitive.
# These keys will be downcased upon creating or modifying a user and when used
# to authenticate or find a user. Default is :email.
config.case_insensitive_keys = [:email]
# Configure which authentication keys should have whitespace stripped.
# These keys will have whitespace before and after removed upon creating or
# modifying a user and when used to authenticate or find a user. Default is :email.
config.strip_whitespace_keys = [:email]
# Tell if authentication through request.params is enabled. True by default.
# It can be set to an array that will enable params authentication only for the
# given strategies, for example, `config.params_authenticatable = [:database]` will
# enable it only for database (email + password) authentication.
# config.params_authenticatable = true
# Tell if authentication through HTTP Auth is enabled. False by default.
# It can be set to an array that will enable http authentication only for the
# given strategies, for example, `config.http_authenticatable = [:database]` will
# enable it only for database authentication.
# For API-only applications to support authentication "out-of-the-box", you will likely want to
# enable this with :database unless you are using a custom strategy.
# The supported strategies are:
# :database = Support basic authentication with authentication key + password
# config.http_authenticatable = false
# If 401 status code should be returned for AJAX requests. True by default.
# config.http_authenticatable_on_xhr = true
# The realm used in Http Basic Authentication. 'Application' by default.
# config.http_authentication_realm = 'Application'
# It will change confirmation, password recovery and other workflows
# to behave the same regardless if the e-mail provided was right or wrong.
# Does not affect registerable.
# config.paranoid = true
# By default Devise will store the user in session. You can skip storage for
# particular strategies by setting this option.
# Notice that if you are skipping storage for all authentication paths, you
# may want to disable generating routes to Devise's sessions controller by
# passing skip: :sessions to `devise_for` in your config/routes.rb
config.skip_session_storage = [:http_auth]
# By default, Devise cleans up the CSRF token on authentication to
# avoid CSRF token fixation attacks. This means that, when using AJAX
# requests for sign in and sign up, you need to get a new CSRF token
# from the server. You can disable this option at your own risk.
# config.clean_up_csrf_token_on_authentication = true
# When false, Devise will not attempt to reload routes on eager load.
# This can reduce the time taken to boot the app but if your application
# requires the Devise mappings to be loaded during boot time the application
# won't boot properly.
# config.reload_routes = true
# ==> Configuration for :database_authenticatable
# For bcrypt, this is the cost for hashing the password and defaults to 12. If
# using other algorithms, it sets how many times you want the password to be hashed.
# The number of stretches used for generating the hashed password are stored
# with the hashed password. This allows you to change the stretches without
# invalidating existing passwords.
#
# Limiting the stretches to just one in testing will increase the performance of
# your test suite dramatically. However, it is STRONGLY RECOMMENDED to not use
# a value less than 10 in other environments. Note that, for bcrypt (the default
# algorithm), the cost increases exponentially with the number of stretches (e.g.
# a value of 20 is already extremely slow: approx. 60 seconds for 1 calculation).
config.stretches = Rails.env.test? ? 1 : 12
# Set up a pepper to generate the hashed password.
# config.pepper = 'd2e516ba23093e6d5ea2c2f4ec15c64e2082116a4f1fb205b793a3b973839ad932092bc2ff9c4ab5554248cdd1ea93342cad4f7f7849f4794197b1441783d304'
# Send a notification to the original email when the user's email is changed.
# config.send_email_changed_notification = false
# Send a notification email when the user's password is changed.
# config.send_password_change_notification = false
# ==> Configuration for :confirmable
# A period that the user is allowed to access the website even without
# confirming their account. For instance, if set to 2.days, the user will be
# able to access the website for two days without confirming their account,
# access will be blocked just in the third day.
# You can also set it to nil, which will allow the user to access the website
# without confirming their account.
# Default is 0.days, meaning the user cannot access the website without
# confirming their account.
# config.allow_unconfirmed_access_for = 2.days
# A period that the user is allowed to confirm their account before their
# token becomes invalid. For example, if set to 3.days, the user can confirm
# their account within 3 days after the mail was sent, but on the fourth day
# their account can't be confirmed with the token any more.
# Default is nil, meaning there is no restriction on how long a user can take
# before confirming their account.
# config.confirm_within = 3.days
# If true, requires any email changes to be confirmed (exactly the same way as
# initial account confirmation) to be applied. Requires additional unconfirmed_email
# db field (see migrations). Until confirmed, new email is stored in
# unconfirmed_email column, and copied to email column on successful confirmation.
config.reconfirmable = true
# Defines which key will be used when confirming an account
# config.confirmation_keys = [:email]
# ==> Configuration for :rememberable
# The time the user will be remembered without asking for credentials again.
# config.remember_for = 2.weeks
# Invalidates all the remember me tokens when the user signs out.
config.expire_all_remember_me_on_sign_out = true
# If true, extends the user's remember period when remembered via cookie.
# config.extend_remember_period = false
# Options to be passed to the created cookie. For instance, you can set
# secure: true in order to force SSL only cookies.
# config.rememberable_options = {}
# ==> Configuration for :validatable
# Range for password length.
config.password_length = 6..128
# Email regex used to validate email formats. It simply asserts that
# one (and only one) @ exists in the given string. This is mainly
# to give user feedback and not to assert the e-mail validity.
config.email_regexp = /\A[^@\s]+@[^@\s]+\z/
# ==> Configuration for :timeoutable
# The time you want to timeout the user session without activity. After this
# time the user will be asked for credentials again. Default is 30 minutes.
# config.timeout_in = 30.minutes
# ==> Configuration for :lockable
# Defines which strategy will be used to lock an account.
# :failed_attempts = Locks an account after a number of failed attempts to sign in.
# :none = No lock strategy. You should handle locking by yourself.
# config.lock_strategy = :failed_attempts
# Defines which key will be used when locking and unlocking an account
# config.unlock_keys = [:email]
# Defines which strategy will be used to unlock an account.
# :email = Sends an unlock link to the user email
# :time = Re-enables login after a certain amount of time (see :unlock_in below)
# :both = Enables both strategies
# :none = No unlock strategy. You should handle unlocking by yourself.
# config.unlock_strategy = :both
# Number of authentication tries before locking an account if lock_strategy
# is failed attempts.
# config.maximum_attempts = 20
# Time interval to unlock the account if :time is enabled as unlock_strategy.
# config.unlock_in = 1.hour
# Warn on the last attempt before the account is locked.
# config.last_attempt_warning = true
# ==> Configuration for :recoverable
#
# Defines which key will be used when recovering the password for an account
# config.reset_password_keys = [:email]
# Time interval you can reset your password with a reset password key.
# Don't put a too small interval or your users won't have the time to
# change their passwords.
config.reset_password_within = 6.hours
# When set to false, does not sign a user in automatically after their password is
# reset. Defaults to true, so a user is signed in automatically after a reset.
# config.sign_in_after_reset_password = true
# ==> Configuration for :encryptable
# Allow you to use another hashing or encryption algorithm besides bcrypt (default).
# You can use :sha1, :sha512 or algorithms from others authentication tools as
# :clearance_sha1, :authlogic_sha512 (then you should set stretches above to 20
# for default behavior) and :restful_authentication_sha1 (then you should set
# stretches to 10, and copy REST_AUTH_SITE_KEY to pepper).
#
# Require the `devise-encryptable` gem when using anything other than bcrypt
# config.encryptor = :sha512
# ==> Scopes configuration
# Turn scoped views on. Before rendering "sessions/new", it will first check for
# "users/sessions/new". It's turned off by default because it's slower if you
# are using only default views.
# config.scoped_views = false
# Configure the default scope given to Warden. By default it's the first
# devise role declared in your routes (usually :user).
# config.default_scope = :user
# Set this configuration to false if you want /users/sign_out to sign out
# only the current scope. By default, Devise signs out all scopes.
# config.sign_out_all_scopes = true
# ==> Navigation configuration
# Lists the formats that should be treated as navigational. Formats like
# :html should redirect to the sign in page when the user does not have
# access, but formats like :xml or :json, should return 401.
#
# If you have any extra navigational formats, like :iphone or :mobile, you
# should add them to the navigational formats lists.
#
# The "*/*" below is required to match Internet Explorer requests.
# config.navigational_formats = ['*/*', :html, :turbo_stream]
# The default HTTP method used to sign out a resource. Default is :delete.
config.sign_out_via = :delete
# ==> OmniAuth
# Add a new OmniAuth provider. Check the wiki for more information on setting
# up on your models and hooks.
# config.omniauth :github, 'APP_ID', 'APP_SECRET', scope: 'user,public_repo'
# ==> Warden configuration
# If you want to use other strategies, that are not supported by Devise, or
# change the failure app, you can configure them inside the config.warden block.
#
# config.warden do |manager|
# manager.intercept_401 = false
# manager.default_strategies(scope: :user).unshift :some_external_strategy
# end
# ==> Mountable engine configurations
# When using Devise inside an engine, let's call it `MyEngine`, and this engine
# is mountable, there are some extra configurations to be taken into account.
# The following options are available, assuming the engine is mounted as:
#
# mount MyEngine, at: '/my_engine'
#
# The router that invoked `devise_for`, in the example above, would be:
# config.router_name = :my_engine
#
# When using OmniAuth, Devise cannot automatically set OmniAuth path,
# so you need to do it manually. For the users scope, it would be:
# config.omniauth_path_prefix = '/my_engine/users/auth'
# ==> Hotwire/Turbo configuration
# When using Devise with Hotwire/Turbo, the http status for error responses
# and some redirects must match the following. The default in Devise for existing
# apps is `200 OK` and `302 Found` respectively, but new apps are generated with
# these new defaults that match Hotwire/Turbo behavior.
# Note: These might become the new default in future versions of Devise.
config.responder.error_status = :unprocessable_entity
config.responder.redirect_status = :see_other
# ==> Configuration for :registerable
# When set to false, does not sign a user in automatically after their password is
# changed. Defaults to true, so a user is signed in automatically after changing a password.
# config.sign_in_after_change_password = true
end

View File

@ -0,0 +1,65 @@
# Additional translations at https://github.com/heartcombo/devise/wiki/I18n
en:
devise:
confirmations:
confirmed: "Your email address has been successfully confirmed."
send_instructions: "You will receive an email with instructions for how to confirm your email address in a few minutes."
send_paranoid_instructions: "If your email address exists in our database, you will receive an email with instructions for how to confirm your email address in a few minutes."
failure:
already_authenticated: "You are already signed in."
inactive: "Your account is not activated yet."
invalid: "Invalid %{authentication_keys} or password."
locked: "Your account is locked."
last_attempt: "You have one more attempt before your account is locked."
not_found_in_database: "Invalid %{authentication_keys} or password."
timeout: "Your session expired. Please sign in again to continue."
unauthenticated: "You need to sign in or sign up before continuing."
unconfirmed: "You have to confirm your email address before continuing."
mailer:
confirmation_instructions:
subject: "Confirmation instructions"
reset_password_instructions:
subject: "Reset password instructions"
unlock_instructions:
subject: "Unlock instructions"
email_changed:
subject: "Email Changed"
password_change:
subject: "Password Changed"
omniauth_callbacks:
failure: "Could not authenticate you from %{kind} because \"%{reason}\"."
success: "Successfully authenticated from %{kind} account."
passwords:
no_token: "You can't access this page without coming from a password reset email. If you do come from a password reset email, please make sure you used the full URL provided."
send_instructions: "You will receive an email with instructions on how to reset your password in a few minutes."
send_paranoid_instructions: "If your email address exists in our database, you will receive a password recovery link at your email address in a few minutes."
updated: "Your password has been changed successfully. You are now signed in."
updated_not_active: "Your password has been changed successfully."
registrations:
destroyed: "Bye! Your account has been successfully cancelled. We hope to see you again soon."
signed_up: "Welcome! You have signed up successfully."
signed_up_but_inactive: "You have signed up successfully. However, we could not sign you in because your account is not yet activated."
signed_up_but_locked: "You have signed up successfully. However, we could not sign you in because your account is locked."
signed_up_but_unconfirmed: "A message with a confirmation link has been sent to your email address. Please follow the link to activate your account."
update_needs_confirmation: "You updated your account successfully, but we need to verify your new email address. Please check your email and follow the confirmation link to confirm your new email address."
updated: "Your account has been updated successfully."
updated_but_not_signed_in: "Your account has been updated successfully, but since your password was changed, you need to sign in again."
sessions:
signed_in: "Signed in successfully."
signed_out: "Signed out successfully."
already_signed_out: "Signed out successfully."
unlocks:
send_instructions: "You will receive an email with instructions for how to unlock your account in a few minutes."
send_paranoid_instructions: "If your account exists, you will receive an email with instructions for how to unlock it in a few minutes."
unlocked: "Your account has been unlocked successfully. Please sign in to continue."
errors:
messages:
already_confirmed: "was already confirmed, please try signing in"
confirmation_period_expired: "needs to be confirmed within %{period}, please request a new one"
expired: "has expired, please request a new one"
not_found: "not found"
not_locked: "was not locked"
not_saved:
one: "1 error prohibited this %{resource} from being saved:"
other: "%{count} errors prohibited this %{resource} from being saved:"

View File

@ -1,6 +1,13 @@
Rails.application.routes.draw do
devise_for :users
resources :scripts
root 'home#index'
resources :sites
resources :accounts
resources :installtemplates
resources :hosts
resources :logs
root 'pages#index'
# Define your application routes per the DSL in https://guides.rubyonrails.org/routing.html
# Reveal health status on /up that returns 200 if the app boots with no exceptions, otherwise 500.
@ -9,4 +16,23 @@ Rails.application.routes.draw do
# Defines the root path route ("/")
# root "posts#index"
# Webui call
get '/host/ipxe', to: "hosts#generate_boot"
get '/host/install', to: "hosts#generate_install"
get '/host/postinstall', to: "hosts#generate_postinstall"
# Machine Call
get '/api/host/ipxe', to: "engine#generate_boot"
get '/api/host/install', to: "engine#generate_install"
get '/api/host/postinstall', to: "engine#generate_postinstall"
get '/api/host/installed', to: "engine#generate_installed", defaults: { format: 'text' }
get '/engine/global', to: "engine#generateglobal", defaults: { format: 'text' }
get '/api/host/cloudinit/:uuid/user-data', to: "engine#generate_install", defaults: { format: 'text' }
get '/api/host/cloudinit/:uuid/meta-data', to: "engine#generate_metadata", defaults: { format: 'text' }
get '/api/host/cloudinit/:uuid/vendor-data', to: "engine#generate_metadata", defaults: { format: 'text' }
end

View File

@ -0,0 +1,11 @@
# Read about fixtures at https://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html
# This model initially had no columns defined. If you add columns to the
# model remove the "{}" from the fixture names and add the columns immediately
# below each fixture, per the syntax in the comments below
#
one: {}
# column: value
#
two: {}
# column: value

View File

@ -0,0 +1,7 @@
require "test_helper"
class UserTest < ActiveSupport::TestCase
# test "the truth" do
# assert true
# end
end