Skip to content

Commit 4db6ef6

Browse files
author
root
committed
Move mirroring keys installer into a class
1 parent f6ad438 commit 4db6ef6

File tree

4 files changed

+129
-99
lines changed

4 files changed

+129
-99
lines changed

Diff for: app/views/settings/redmine_git_hosting/_gitolite_config_test.html.haml

+1-1
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@
3636

3737
%tr
3838
%td= l(:label_mirroring_keys_installed)
39-
%td= image_tag (RedmineGitHosting::Config.mirroring_keys_installed?(reset: true) ? 'true.png' : 'exclamation.png')
39+
%td= image_tag (RedmineGitHosting::Config.mirroring_keys_installed? ? 'true.png' : 'exclamation.png')
4040

4141
%tr
4242
%td= l(:label_git_version)

Diff for: lib/redmine_git_hosting/config/gitolite_base.rb

+1
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ module ClassMethods
1616

1717
def check_cache
1818
@gitolite_home_dir = nil
19+
@mirroring_keys_installed = nil
1920
end
2021

2122

Diff for: lib/redmine_git_hosting/config/mirroring.rb

+3-98
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,6 @@
11
module RedmineGitHosting::Config
2-
32
module Mirroring
43

5-
###############################
6-
## ##
7-
## MIRRORS ##
8-
## ##
9-
###############################
10-
11-
GITOLITE_MIRRORING_KEYS_NAME = 'redmine_gitolite_admin_id_rsa_mirroring'
12-
134
class << self
145
def included(receiver)
156
receiver.send(:extend, ClassMethods)
@@ -20,105 +11,19 @@ def included(receiver)
2011
module ClassMethods
2112

2213
def mirroring_public_key
23-
begin
24-
format_mirror_key(gitolite_ssh_public_key_content)
25-
rescue => e
26-
logger.error("Error while loading mirroring public key : #{e.output}")
27-
nil
28-
end
14+
RedmineGitHosting::MirrorKeysInstaller.mirroring_public_key(gitolite_ssh_public_key)
2915
end
3016

3117

32-
@mirroring_keys_installed = false
33-
34-
def mirroring_keys_installed?(opts = {})
35-
@mirroring_keys_installed = false if opts.has_key?(:reset) && opts[:reset] == true
36-
37-
if !@mirroring_keys_installed
38-
logger.info('Installing Redmine Gitolite mirroring SSH keys ...')
39-
40-
if install_private_key && install_public_key && install_mirroring_script
41-
logger.info('Done !')
42-
@mirroring_keys_installed = true
43-
else
44-
@mirroring_keys_installed = false
45-
end
46-
end
47-
48-
return @mirroring_keys_installed
18+
def mirroring_keys_installed?
19+
@mirroring_keys_installed ||= RedmineGitHosting::MirrorKeysInstaller.new(gitolite_home_dir, gitolite_ssh_public_key, gitolite_ssh_private_key).installed?
4920
end
5021

5122

5223
def gitolite_mirroring_script
5324
File.join(gitolite_home_dir, '.ssh', 'run_gitolite_admin_ssh')
5425
end
5526

56-
57-
private
58-
59-
60-
def gitolite_ssh_public_key_content
61-
File.read(gitolite_ssh_public_key)
62-
rescue => e
63-
nil
64-
end
65-
66-
67-
def gitolite_ssh_private_key_content
68-
File.read(gitolite_ssh_private_key)
69-
rescue => e
70-
nil
71-
end
72-
73-
74-
def gitolite_ssh_private_key_dest_path
75-
File.join(gitolite_home_dir, '.ssh', GITOLITE_MIRRORING_KEYS_NAME)
76-
end
77-
78-
79-
def gitolite_ssh_public_key_dest_path
80-
File.join(gitolite_home_dir, '.ssh', "#{GITOLITE_MIRRORING_KEYS_NAME}.pub")
81-
end
82-
83-
84-
def install_private_key
85-
RedmineGitHosting::Commands.sudo_install_file(gitolite_ssh_private_key_content, gitolite_ssh_private_key_dest_path, '600')
86-
rescue RedmineGitHosting::Error::GitoliteCommandException => e
87-
logger.error("Failed to install Redmine Git Hosting mirroring SSH private key : #{e.output}")
88-
false
89-
end
90-
91-
92-
def install_public_key
93-
RedmineGitHosting::Commands.sudo_install_file(gitolite_ssh_public_key_content, gitolite_ssh_public_key_dest_path, '644')
94-
rescue RedmineGitHosting::Error::GitoliteCommandException => e
95-
logger.error("Failed to install Redmine Git Hosting mirroring SSH public key : #{e.output}")
96-
false
97-
end
98-
99-
100-
def install_mirroring_script
101-
RedmineGitHosting::Commands.sudo_install_file(mirroring_script_content, gitolite_mirroring_script, '700')
102-
rescue RedmineGitHosting::Error::GitoliteCommandException => e
103-
logger.error("Failed to install Redmine Git Hosting mirroring script : #{e.output}")
104-
false
105-
end
106-
107-
108-
def mirroring_script_content
109-
[
110-
'#!/bin/sh', "\n",
111-
'exec', 'ssh', '-T', '-o', 'BatchMode=yes', '-o', 'StrictHostKeyChecking=no', '-i', gitolite_ssh_private_key_dest_path, '"$@"',
112-
"\n"
113-
].join(' ')
114-
end
115-
116-
117-
def format_mirror_key(key)
118-
key = key.chomp.strip
119-
key.split(/[\t ]+/)[0].to_s + ' ' + key.split(/[\t ]+/)[1].to_s
120-
end
121-
12227
end
12328

12429
end

Diff for: lib/redmine_git_hosting/mirror_keys_installer.rb

+124
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,124 @@
1+
module RedmineGitHosting
2+
class MirrorKeysInstaller
3+
4+
attr_reader :gitolite_home_dir
5+
attr_reader :gitolite_ssh_public_key
6+
attr_reader :gitolite_ssh_private_key
7+
8+
GITOLITE_MIRRORING_KEYS_NAME = 'redmine_gitolite_admin_id_rsa_mirroring'
9+
10+
11+
def initialize(gitolite_home_dir, gitolite_ssh_public_key, gitolite_ssh_private_key)
12+
@gitolite_home_dir = gitolite_home_dir
13+
@gitolite_ssh_public_key = gitolite_ssh_public_key
14+
@gitolite_ssh_private_key = gitolite_ssh_private_key
15+
end
16+
17+
18+
class << self
19+
20+
def mirroring_public_key(gitolite_ssh_public_key)
21+
begin
22+
format_mirror_key(File.read(gitolite_ssh_public_key))
23+
rescue => e
24+
RedmineGitHosting.logger.error("Error while loading mirroring public key : #{e.output}")
25+
nil
26+
end
27+
end
28+
29+
30+
def format_mirror_key(key)
31+
key = key.chomp.strip
32+
key.split(/[\t ]+/)[0].to_s + ' ' + key.split(/[\t ]+/)[1].to_s
33+
end
34+
35+
end
36+
37+
38+
def installed?
39+
installable? && install!
40+
end
41+
42+
43+
def installable?
44+
return false if gitolite_home_dir.nil?
45+
return false if gitolite_ssh_public_key_content.nil?
46+
return false if gitolite_ssh_private_key_content.nil?
47+
return true
48+
end
49+
50+
51+
def install!
52+
logger.info('Installing Redmine Gitolite mirroring SSH keys ...')
53+
installed = install_public_key && install_private_key && install_mirroring_script
54+
logger.info('Done!')
55+
installed
56+
end
57+
58+
59+
def install_public_key
60+
RedmineGitHosting::Commands.sudo_install_file(gitolite_ssh_public_key_content, gitolite_ssh_public_key_dest_path, '644')
61+
rescue RedmineGitHosting::Error::GitoliteCommandException => e
62+
logger.error("Failed to install Redmine Git Hosting mirroring SSH public key : #{e.output}")
63+
false
64+
end
65+
66+
67+
def install_private_key
68+
RedmineGitHosting::Commands.sudo_install_file(gitolite_ssh_private_key_content, gitolite_ssh_private_key_dest_path, '600')
69+
rescue RedmineGitHosting::Error::GitoliteCommandException => e
70+
logger.error("Failed to install Redmine Git Hosting mirroring SSH private key : #{e.output}")
71+
false
72+
end
73+
74+
75+
def install_mirroring_script
76+
RedmineGitHosting::Commands.sudo_install_file(mirroring_script_content, RedmineGitHosting::Config.gitolite_mirroring_script, '700')
77+
rescue RedmineGitHosting::Error::GitoliteCommandException => e
78+
logger.error("Failed to install Redmine Git Hosting mirroring script : #{e.output}")
79+
false
80+
end
81+
82+
83+
private
84+
85+
86+
def logger
87+
RedmineGitHosting.logger
88+
end
89+
90+
91+
def mirroring_script_content
92+
[
93+
'#!/bin/sh', "\n",
94+
'exec', 'ssh', '-T', '-o', 'BatchMode=yes', '-o', 'StrictHostKeyChecking=no', '-i', gitolite_ssh_private_key_dest_path, '"$@"',
95+
"\n"
96+
].join(' ')
97+
end
98+
99+
100+
def gitolite_ssh_public_key_content
101+
File.read(gitolite_ssh_public_key)
102+
rescue => e
103+
nil
104+
end
105+
106+
107+
def gitolite_ssh_private_key_content
108+
File.read(gitolite_ssh_private_key)
109+
rescue => e
110+
nil
111+
end
112+
113+
114+
def gitolite_ssh_public_key_dest_path
115+
File.join(gitolite_home_dir, '.ssh', "#{GITOLITE_MIRRORING_KEYS_NAME}.pub")
116+
end
117+
118+
119+
def gitolite_ssh_private_key_dest_path
120+
File.join(gitolite_home_dir, '.ssh', GITOLITE_MIRRORING_KEYS_NAME)
121+
end
122+
123+
end
124+
end

0 commit comments

Comments
 (0)