Page Menu
Home
GRNET
Search
Configure Global Search
Log In
Files
F324185
bacula_handler.rb
No One
Temporary
Actions
Download 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
Sun, Nov 24, 4:10 PM
Size
4 KB
Mime Type
text/x-ruby
Expires
Tue, Nov 26, 4:10 PM (23 h, 21 m)
Engine
blob
Format
Raw Data
Handle
156086
Attached To
rARCHIVING archiving
bacula_handler.rb
View Options
class
BaculaHandler
require
'net/scp'
attr_accessor
:host
,
:templates
,
:client
,
:jobs
,
:schedules
,
:filesets
# Initializes a BaculaHandler instance.
#
# Sets `host` and `templates` attributes.
# Sets the temporal files that contain the client's configuration
#
# @param host[Host] A the host instance the the bacula handler will act upon
def
initialize
(
host
)
@host
=
host
@templates
=
host
.
job_templates
.
includes
(
:fileset
,
:schedule
)
@client
=
get_client_file
@jobs
=
get_jobs_file
@schedules
=
get_schedules_file
@filesets
=
get_filesets_file
end
# Deploys the host's config to the bacula director by
#
# * uploading the configuration
# * reloadind the bacula director
#
# Updates the host's status accordingly
#
# @return [Boolean] false if something went wrong
def
deploy_config
return
false
unless
send_config
if
reload_bacula
host
.
set_deployed
else
host
.
dispatch
||
host
.
redispatch
end
end
# Removes the host's configuration from the bacula director by
#
# * removing the host's configuration files
# * reloading the bacula director
#
# Updates the host's status accordingly
#
# @return [Boolean] false if something went wrong
def
undeploy_config
return
false
unless
remove_config
host
.
disable
if
reload_bacula
end
# Schedules an immediate backup to the bacula director for the given host and job
#
# @param job_name[String] the job's name
def
backup_now
(
job_name
)
job
=
host
.
job_templates
.
enabled
.
find_by
(
name
:
job_name
)
return
false
unless
job
command
=
"echo
\"
run job=
\\\"
#{
job
.
name_for_config
}
\\\"
yes
\"
|
#{
bconsole
}
"
log
(
command
)
exec_with_timeout
(
command
,
2
)
end
# Schedules an immediate restore to the bacula director for the given host.
#
# @param location[String] the desired restore location
def
restore
(
location
=
"/tmp/bacula-restore"
)
command
=
"echo
\"
restore client=
\\\"
#{
host
.
name
}
\\\"
where=
\\\"
#{
location
}
\\\"
select current all done yes
\"
|
#{
bconsole
}
"
log
(
command
)
exec_with_timeout
(
command
,
2
)
end
private
def
get_client_file
file
=
a_tmpfile
file
.
write
host
.
to_bacula_config_array
.
join
(
"
\n
"
)
file
.
close
file
end
def
get_jobs_file
file
=
a_tmpfile
file
.
write
templates
.
map
(
&
:to_bacula_config_array
)
.
join
(
"
\n
"
)
file
.
close
file
end
def
get_schedules_file
file
=
a_tmpfile
file
.
write
templates
.
map
(
&
:schedule
)
.
uniq
.
map
(
&
:to_bacula_config_array
)
.
join
(
"
\n
"
)
file
.
close
file
end
def
get_filesets_file
file
=
a_tmpfile
file
.
write
templates
.
map
(
&
:fileset
)
.
uniq
.
map
(
&
:to_bacula_config_array
)
.
join
(
"
\n
"
)
file
.
close
file
end
def
send_config
begin
Net
::
SCP
.
upload!
(
ssh_settings
[
:host
]
,
ssh_settings
[
:username
]
,
client
.
path
,
ssh_settings
[
:path
]
+
'clients/'
+
host
.
name
+
'.conf'
,
ssh
:
{
keys
:
[
ssh_settings
[
:key_file
]]
}
)
Net
::
SCP
.
upload!
(
ssh_settings
[
:host
]
,
ssh_settings
[
:username
]
,
jobs
.
path
,
ssh_settings
[
:path
]
+
'jobs/'
+
host
.
name
+
'.conf'
,
ssh
:
{
keys
:
[
ssh_settings
[
:key_file
]]
}
)
Net
::
SCP
.
upload!
(
ssh_settings
[
:host
]
,
ssh_settings
[
:username
]
,
schedules
.
path
,
ssh_settings
[
:path
]
+
'schedules/'
+
host
.
name
+
'.conf'
,
ssh
:
{
keys
:
[
ssh_settings
[
:key_file
]]
}
)
Net
::
SCP
.
upload!
(
ssh_settings
[
:host
]
,
ssh_settings
[
:username
]
,
filesets
.
path
,
ssh_settings
[
:path
]
+
'filesets/'
+
host
.
name
+
'.conf'
,
ssh
:
{
keys
:
[
ssh_settings
[
:key_file
]]
}
)
rescue
return
false
end
true
end
def
remove_config
begin
Net
::
SSH
.
start
(
ssh_settings
[
:host
]
,
ssh_settings
[
:username
]
,
keys
:
ssh_settings
[
:key_file
]
)
do
|
ssh
|
ssh
.
exec!
(
"rm
#{
ssh_settings
[
:path
]
}
*/
#{
host
.
name
}
.conf"
)
end
rescue
return
false
end
true
end
def
reload_bacula
command
=
"echo
\"
reload quit
\"
|
#{
bconsole
}
"
exec_with_timeout
(
command
,
2
)
end
def
exec_with_timeout
(
command
,
sec
)
begin
Timeout
::
timeout
(
sec
)
do
`
#{
command
}
`
end
rescue
return
false
end
true
end
def
bconsole
"bconsole -c
#{
Rails
.
root
}
/config/bconsole.conf"
end
def
ssh_settings
@ssh_settings
||=
YAML
::
load
(
File
.
open
(
"
#{
Rails
.
root
}
/config/ssh.yml"
))
[
Rails
.
env
].
symbolize_keys
end
def
a_tmpfile
file
=
Tempfile
.
new
(
host
.
name
)
file
.
chmod
(
0666
)
file
end
def
log
(
msg
)
Rails
.
logger
.
warn
(
"[BaculaHandler]:
#{
msg
}
"
)
end
end
Event Timeline
Log In to Comment