oxidized 0.20.0 → 0.28.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (222) hide show
  1. checksums.yaml +5 -5
  2. data/.codeclimate.yml +4 -0
  3. data/.github/PULL_REQUEST_TEMPLATE.md +12 -0
  4. data/.github/no-response.yml +13 -0
  5. data/.github/workflows/publishdocker.yml +13 -0
  6. data/.gitignore +4 -0
  7. data/.rubocop.yml +73 -0
  8. data/.rubocop_todo.yml +120 -0
  9. data/.travis.yml +6 -1
  10. data/CHANGELOG.md +693 -243
  11. data/Dockerfile +27 -19
  12. data/LICENSE +201 -0
  13. data/README.md +234 -913
  14. data/Rakefile +48 -7
  15. data/TODO.md +29 -23
  16. data/bin/console +1 -1
  17. data/bin/oxidized +6 -5
  18. data/docs/Configuration.md +313 -0
  19. data/docs/Creating-Models.md +140 -0
  20. data/docs/Hooks.md +274 -0
  21. data/docs/Model-Notes/AireOS.md +11 -0
  22. data/docs/Model-Notes/ArbOS.md +11 -0
  23. data/docs/Model-Notes/Comware.md +13 -0
  24. data/docs/Model-Notes/Cumulus.md +40 -0
  25. data/docs/Model-Notes/EOS.md +12 -0
  26. data/docs/Model-Notes/IOS.md +29 -0
  27. data/docs/Model-Notes/JunOS.md +33 -0
  28. data/docs/Model-Notes/LinuxGeneric.md +24 -0
  29. data/docs/Model-Notes/Netgear.md +87 -0
  30. data/docs/Model-Notes/Nokia.md +9 -0
  31. data/docs/Model-Notes/README.md +24 -0
  32. data/docs/Model-Notes/SmartAX-Huawei.md +35 -0
  33. data/docs/Model-Notes/VRP-Huawei.md +34 -0
  34. data/docs/Model-Notes/Viptela.md +12 -0
  35. data/docs/Model-Notes/XGS4600-Zyxel.md +36 -0
  36. data/docs/Outputs.md +190 -0
  37. data/docs/Ruby-API.md +199 -0
  38. data/docs/Sources.md +171 -0
  39. data/docs/Supported-OS-Types.md +227 -0
  40. data/docs/Troubleshooting.md +66 -0
  41. data/extra/nagios_check_failing_nodes.rb +9 -2
  42. data/extra/oxidized-report-git-commits +21 -40
  43. data/extra/oxidized-ubuntu.haproxy +45 -0
  44. data/extra/oxidized.logrotate +7 -0
  45. data/extra/oxidized.service +13 -0
  46. data/extra/rest_client.rb +7 -10
  47. data/extra/syslog.rb +47 -42
  48. data/lib/oxidized/cli.rb +41 -31
  49. data/lib/oxidized/config/vars.rb +9 -14
  50. data/lib/oxidized/config.rb +20 -13
  51. data/lib/oxidized/core.rb +8 -10
  52. data/lib/oxidized/hook/awssns.rb +6 -7
  53. data/lib/oxidized/hook/ciscosparkdiff.rb +43 -0
  54. data/lib/oxidized/hook/exec.rb +19 -24
  55. data/lib/oxidized/hook/githubrepo.rb +17 -17
  56. data/lib/oxidized/hook/noophook.rb +1 -1
  57. data/lib/oxidized/hook/slackdiff.rb +32 -19
  58. data/lib/oxidized/hook/xmppdiff.rb +59 -0
  59. data/lib/oxidized/hook.rb +63 -64
  60. data/lib/oxidized/input/cli.rb +22 -12
  61. data/lib/oxidized/input/exec.rb +28 -0
  62. data/lib/oxidized/input/ftp.rb +16 -15
  63. data/lib/oxidized/input/http.rb +72 -0
  64. data/lib/oxidized/input/input.rb +6 -6
  65. data/lib/oxidized/input/ssh.rb +64 -56
  66. data/lib/oxidized/input/telnet.rb +59 -102
  67. data/lib/oxidized/input/tftp.rb +9 -10
  68. data/lib/oxidized/jobs.rb +9 -10
  69. data/lib/oxidized/manager.rb +42 -44
  70. data/lib/oxidized/model/acos.rb +19 -20
  71. data/lib/oxidized/model/acsw.rb +62 -0
  72. data/lib/oxidized/model/adtran.rb +26 -0
  73. data/lib/oxidized/model/aen.rb +19 -0
  74. data/lib/oxidized/model/aireos.rb +9 -10
  75. data/lib/oxidized/model/airfiber.rb +22 -0
  76. data/lib/oxidized/model/alteonos.rb +58 -0
  77. data/lib/oxidized/model/alvarion.rb +0 -4
  78. data/lib/oxidized/model/aos.rb +11 -5
  79. data/lib/oxidized/model/aos7.rb +6 -7
  80. data/lib/oxidized/model/aosw.rb +30 -27
  81. data/lib/oxidized/model/apc_aos.rb +2 -5
  82. data/lib/oxidized/model/arbos.rb +26 -0
  83. data/lib/oxidized/model/aricentiss.rb +49 -0
  84. data/lib/oxidized/model/asa.rb +61 -22
  85. data/lib/oxidized/model/asyncos.rb +46 -0
  86. data/lib/oxidized/model/audiocodes.rb +28 -0
  87. data/lib/oxidized/model/audiocodesmp.rb +28 -0
  88. data/lib/oxidized/model/awplus.rb +84 -0
  89. data/lib/oxidized/model/axos.rb +16 -0
  90. data/lib/oxidized/model/boss.rb +77 -0
  91. data/lib/oxidized/model/br6910.rb +42 -45
  92. data/lib/oxidized/model/c4cmts.rb +6 -10
  93. data/lib/oxidized/model/cambium.rb +23 -0
  94. data/lib/oxidized/model/casa.rb +1 -1
  95. data/lib/oxidized/model/catos.rb +1 -3
  96. data/lib/oxidized/model/cisconga.rb +1 -3
  97. data/lib/oxidized/model/ciscosma.rb +42 -0
  98. data/lib/oxidized/model/ciscosmb.rb +30 -10
  99. data/lib/oxidized/model/ciscovpn3k.rb +11 -0
  100. data/lib/oxidized/model/cnos.rb +33 -0
  101. data/lib/oxidized/model/comnetms.rb +43 -0
  102. data/lib/oxidized/model/comtrol.rb +41 -0
  103. data/lib/oxidized/model/comware.rb +28 -16
  104. data/lib/oxidized/model/coriant8600.rb +3 -5
  105. data/lib/oxidized/model/coriantgroove.rb +26 -0
  106. data/lib/oxidized/model/corianttmos.rb +1 -3
  107. data/lib/oxidized/model/cumulus.rb +60 -49
  108. data/lib/oxidized/model/datacom.rb +1 -4
  109. data/lib/oxidized/model/dcnos.rb +46 -0
  110. data/lib/oxidized/model/dellx.rb +76 -0
  111. data/lib/oxidized/model/dlink.rb +5 -4
  112. data/lib/oxidized/model/dnos.rb +11 -5
  113. data/lib/oxidized/model/eciapollo.rb +34 -0
  114. data/lib/oxidized/model/edgecos.rb +49 -0
  115. data/lib/oxidized/model/edgeos.rb +12 -5
  116. data/lib/oxidized/model/edgeswitch.rb +2 -4
  117. data/lib/oxidized/model/enterasys.rb +28 -0
  118. data/lib/oxidized/model/eos.rb +8 -8
  119. data/lib/oxidized/model/fabricos.rb +4 -6
  120. data/lib/oxidized/model/fastiron.rb +66 -0
  121. data/lib/oxidized/model/fiberdriver.rb +2 -2
  122. data/lib/oxidized/model/firebrick.rb +31 -0
  123. data/lib/oxidized/model/firelinuxos.rb +41 -0
  124. data/lib/oxidized/model/firewareos.rb +3 -6
  125. data/lib/oxidized/model/fortios.rb +31 -19
  126. data/lib/oxidized/model/ftos.rb +8 -5
  127. data/lib/oxidized/model/fujitsupy.rb +5 -7
  128. data/lib/oxidized/model/gaiaos.rb +7 -11
  129. data/lib/oxidized/model/gcombnps.rb +84 -0
  130. data/lib/oxidized/model/grandstream.rb +9 -0
  131. data/lib/oxidized/model/hatteras.rb +9 -6
  132. data/lib/oxidized/model/hirschmann.rb +39 -0
  133. data/lib/oxidized/model/hpebladesystem.rb +20 -18
  134. data/lib/oxidized/model/hpemsa.rb +10 -0
  135. data/lib/oxidized/model/hpmsm.rb +84 -0
  136. data/lib/oxidized/model/ibos.rb +55 -0
  137. data/lib/oxidized/model/icotera.rb +27 -0
  138. data/lib/oxidized/model/ios.rb +63 -70
  139. data/lib/oxidized/model/iosxe.rb +5 -0
  140. data/lib/oxidized/model/iosxr.rb +2 -3
  141. data/lib/oxidized/model/ipos.rb +10 -6
  142. data/lib/oxidized/model/ironware.rb +20 -19
  143. data/lib/oxidized/model/isam.rb +5 -6
  144. data/lib/oxidized/model/junos.rb +9 -11
  145. data/lib/oxidized/model/linuxgeneric.rb +74 -0
  146. data/lib/oxidized/model/masteros.rb +3 -6
  147. data/lib/oxidized/model/mlnxos.rb +9 -10
  148. data/lib/oxidized/model/model.rb +72 -46
  149. data/lib/oxidized/model/mtrlrfs.rb +1 -4
  150. data/lib/oxidized/model/ndms.rb +23 -0
  151. data/lib/oxidized/model/netgear.rb +35 -15
  152. data/lib/oxidized/model/netonix.rb +2 -2
  153. data/lib/oxidized/model/netscaler.rb +6 -3
  154. data/lib/oxidized/model/nos.rb +5 -7
  155. data/lib/oxidized/model/nsxconfig.rb +22 -0
  156. data/lib/oxidized/model/nsxfirewall.rb +22 -0
  157. data/lib/oxidized/model/nxos.rb +13 -3
  158. data/lib/oxidized/model/oneos.rb +15 -9
  159. data/lib/oxidized/model/openbsd.rb +63 -0
  160. data/lib/oxidized/model/opengear.rb +3 -5
  161. data/lib/oxidized/model/openwrt.rb +78 -0
  162. data/lib/oxidized/model/opnsense.rb +19 -0
  163. data/lib/oxidized/model/os10.rb +46 -0
  164. data/lib/oxidized/model/outputs.rb +5 -7
  165. data/lib/oxidized/model/panos.rb +11 -12
  166. data/lib/oxidized/model/pfsense.rb +11 -6
  167. data/lib/oxidized/model/planet.rb +14 -17
  168. data/lib/oxidized/model/powerconnect.rb +24 -19
  169. data/lib/oxidized/model/procurve.rb +43 -11
  170. data/lib/oxidized/model/purityos.rb +12 -0
  171. data/lib/oxidized/model/qtech.rb +41 -0
  172. data/lib/oxidized/model/quantaos.rb +4 -6
  173. data/lib/oxidized/model/raisecom.rb +19 -0
  174. data/lib/oxidized/model/routeros.rb +26 -8
  175. data/lib/oxidized/model/saos.rb +1 -2
  176. data/lib/oxidized/model/screenos.rb +8 -11
  177. data/lib/oxidized/model/sgos.rb +45 -0
  178. data/lib/oxidized/model/siklu.rb +1 -3
  179. data/lib/oxidized/model/slxos.rb +59 -0
  180. data/lib/oxidized/model/smartax.rb +25 -0
  181. data/lib/oxidized/model/sonicos.rb +51 -0
  182. data/lib/oxidized/model/speedtouch.rb +34 -0
  183. data/lib/oxidized/model/sros.rb +96 -0
  184. data/lib/oxidized/model/stoneos.rb +32 -0
  185. data/lib/oxidized/model/supermicro.rb +6 -41
  186. data/lib/oxidized/model/tdre.rb +30 -0
  187. data/lib/oxidized/model/telco.rb +24 -0
  188. data/lib/oxidized/model/timos.rb +6 -114
  189. data/lib/oxidized/model/tmos.rb +6 -3
  190. data/lib/oxidized/model/tplink.rb +11 -11
  191. data/lib/oxidized/model/trango.rb +21 -42
  192. data/lib/oxidized/model/ucs.rb +30 -0
  193. data/lib/oxidized/model/viptela.rb +29 -0
  194. data/lib/oxidized/model/voltaire.rb +9 -12
  195. data/lib/oxidized/model/voss.rb +17 -6
  196. data/lib/oxidized/model/vrp.rb +11 -6
  197. data/lib/oxidized/model/vyatta.rb +8 -6
  198. data/lib/oxidized/model/weos.rb +20 -0
  199. data/lib/oxidized/model/xos.rb +20 -8
  200. data/lib/oxidized/model/zhoneolt.rb +2 -2
  201. data/lib/oxidized/model/zynos.rb +1 -3
  202. data/lib/oxidized/model/zynoscli.rb +36 -0
  203. data/lib/oxidized/model/zynosgs.rb +38 -0
  204. data/lib/oxidized/node/stats.rb +33 -8
  205. data/lib/oxidized/node.rb +86 -95
  206. data/lib/oxidized/nodes.rb +48 -44
  207. data/lib/oxidized/output/file.rb +32 -37
  208. data/lib/oxidized/output/git.rb +138 -153
  209. data/lib/oxidized/output/gitcrypt.rb +228 -242
  210. data/lib/oxidized/output/http.rb +35 -34
  211. data/lib/oxidized/output/output.rb +2 -3
  212. data/lib/oxidized/source/csv.rb +50 -44
  213. data/lib/oxidized/source/http.rb +58 -58
  214. data/lib/oxidized/source/source.rb +9 -10
  215. data/lib/oxidized/source/sql.rb +47 -45
  216. data/lib/oxidized/string.rb +18 -14
  217. data/lib/oxidized/version.rb +17 -1
  218. data/lib/oxidized/worker.rb +72 -33
  219. data/oxidized.gemspec +20 -19
  220. metadata +180 -36
  221. data/.ruby-version +0 -1
  222. data/Gemfile.lock +0 -44
@@ -1,206 +1,191 @@
1
1
  module Oxidized
2
- class Git < Output
3
- class GitError < OxidizedError; end
4
- begin
5
- require 'rugged'
6
- rescue LoadError
7
- raise OxidizedError, 'rugged not found: sudo gem install rugged'
8
- end
9
-
10
- attr_reader :commitref
2
+ class Git < Output
3
+ class GitError < OxidizedError; end
4
+ begin
5
+ require 'rugged'
6
+ rescue LoadError
7
+ raise OxidizedError, 'rugged not found: sudo gem install rugged'
8
+ end
11
9
 
12
- def initialize
13
- @cfg = Oxidized.config.output.git
14
- end
10
+ attr_reader :commitref
15
11
 
16
- def setup
17
- if @cfg.empty?
18
- Oxidized.asetus.user.output.git.user = 'Oxidized'
19
- Oxidized.asetus.user.output.git.email = 'o@example.com'
20
- Oxidized.asetus.user.output.git.repo = File.join(Config::Root, 'oxidized.git')
21
- Oxidized.asetus.save :user
22
- raise NoConfig, 'no output git config, edit ~/.config/oxidized/config'
12
+ def initialize
13
+ @cfg = Oxidized.config.output.git
23
14
  end
24
15
 
25
- if @cfg.repo.respond_to?(:each)
26
- @cfg.repo.each do |group, repo|
27
- @cfg.repo["#{group}="] = File.expand_path repo
16
+ def setup
17
+ if @cfg.empty?
18
+ Oxidized.asetus.user.output.git.user = 'Oxidized'
19
+ Oxidized.asetus.user.output.git.email = 'o@example.com'
20
+ Oxidized.asetus.user.output.git.repo = File.join(Config::Root, 'oxidized.git')
21
+ Oxidized.asetus.save :user
22
+ raise NoConfig, 'no output git config, edit ~/.config/oxidized/config'
28
23
  end
29
- else
30
- @cfg.repo = File.expand_path @cfg.repo
31
- end
32
- end
33
24
 
34
- def store file, outputs, opt={}
35
- @msg = opt[:msg]
36
- @user = (opt[:user] or @cfg.user)
37
- @email = (opt[:email] or @cfg.email)
38
- @opt = opt
39
- @commitref = nil
40
- repo = @cfg.repo
41
-
42
- outputs.types.each do |type|
43
- type_cfg = ''
44
- type_repo = File.join(File.dirname(repo), type + '.git')
45
- outputs.type(type).each do |output|
46
- (type_cfg << output; next) if not output.name
47
- type_file = file + '--' + output.name
48
- if @cfg.type_as_directory?
49
- type_file = type + '/' + type_file
50
- type_repo = repo
25
+ if @cfg.repo.respond_to?(:each)
26
+ @cfg.repo.each do |group, repo|
27
+ @cfg.repo["#{group}="] = File.expand_path repo
51
28
  end
52
- update type_repo, type_file, output
29
+ else
30
+ @cfg.repo = File.expand_path @cfg.repo
53
31
  end
54
- update type_repo, file, type_cfg
55
32
  end
56
33
 
57
- update repo, file, outputs.to_cfg
58
- end
34
+ def store(file, outputs, opt = {})
35
+ @msg = opt[:msg]
36
+ @user = (opt[:user] || @cfg.user)
37
+ @email = (opt[:email] || @cfg.email)
38
+ @opt = opt
39
+ @commitref = nil
40
+ repo = @cfg.repo
41
+
42
+ outputs.types.each do |type|
43
+ type_cfg = ''
44
+ type_repo = File.join(File.dirname(repo), type + '.git')
45
+ outputs.type(type).each do |output|
46
+ (type_cfg << output; next) unless output.name # rubocop:disable Style/Semicolon
47
+ type_file = file + '--' + output.name
48
+ if @cfg.type_as_directory?
49
+ type_file = type + '/' + type_file
50
+ type_repo = repo
51
+ end
52
+ update type_repo, type_file, output
53
+ end
54
+ update type_repo, file, type_cfg
55
+ end
59
56
 
57
+ update repo, file, outputs.to_cfg
58
+ end
60
59
 
61
- def fetch node, group
62
- begin
60
+ def fetch(node, group)
63
61
  repo, path = yield_repo_and_path(node, group)
64
62
  repo = Rugged::Repository.new repo
65
63
  index = repo.index
66
64
  index.read_tree repo.head.target.tree unless repo.empty?
67
65
  repo.read(index.get(path)[:oid]).data
68
- rescue
66
+ rescue StandardError
69
67
  'node not found'
70
68
  end
71
- end
72
69
 
73
70
  # give a hash of all oid revision for the given node, and the date of the commit
74
- def version node, group
75
- begin
76
- repo, path = yield_repo_and_path(node, group)
71
+ def version(node, group)
72
+ repo, path = yield_repo_and_path(node, group)
77
73
 
78
- repo = Rugged::Repository.new repo
79
- walker = Rugged::Walker.new(repo)
80
- walker.sorting(Rugged::SORT_DATE)
81
- walker.push(repo.head.target)
82
- i = -1
83
- tab = []
84
- walker.each do |commit|
85
- if commit.diff(paths: [path]).size > 0
86
- hash = {}
87
- hash[:date] = commit.time.to_s
88
- hash[:oid] = commit.oid
89
- hash[:author] = commit.author
90
- hash[:message] = commit.message
91
- tab[i += 1] = hash
92
- end
93
- end
94
- walker.reset
95
- tab
96
- rescue
97
- 'node not found'
74
+ repo = Rugged::Repository.new repo
75
+ walker = Rugged::Walker.new(repo)
76
+ walker.sorting(Rugged::SORT_DATE)
77
+ walker.push(repo.head.target.oid)
78
+ i = -1
79
+ tab = []
80
+ walker.each do |commit|
81
+ next if commit.diff(paths: [path]).size.zero?
82
+
83
+ hash = {}
84
+ hash[:date] = commit.time.to_s
85
+ hash[:oid] = commit.oid
86
+ hash[:author] = commit.author
87
+ hash[:message] = commit.message
88
+ tab[i += 1] = hash
98
89
  end
90
+ walker.reset
91
+ tab
92
+ rescue StandardError
93
+ 'node not found'
99
94
  end
100
95
 
101
- #give the blob of a specific revision
102
- def get_version node, group, oid
103
- begin
104
- repo, path = yield_repo_and_path(node, group)
105
- repo = Rugged::Repository.new repo
106
- repo.blob_at(oid,path).content
107
- rescue
108
- 'version not found'
109
- end
96
+ # give the blob of a specific revision
97
+ def get_version(node, group, oid)
98
+ repo, path = yield_repo_and_path(node, group)
99
+ repo = Rugged::Repository.new repo
100
+ repo.blob_at(oid, path).content
101
+ rescue StandardError
102
+ 'version not found'
110
103
  end
111
104
 
112
- #give a hash with the patch of a diff between 2 revision and the stats (added and deleted lines)
113
- def get_diff node, group, oid1, oid2
114
- begin
115
- diff_commits = nil
116
- repo, _ = yield_repo_and_path(node, group)
117
- repo = Rugged::Repository.new repo
118
- commit = repo.lookup(oid1)
119
-
120
- if oid2
121
- commit_old = repo.lookup(oid2)
122
- diff = repo.diff(commit_old, commit)
123
- diff.each do |patch|
124
- if /#{node.name}\s+/.match(patch.to_s.lines.first)
125
- diff_commits = {:patch => patch.to_s, :stat => patch.stat}
126
- break
127
- end
105
+ # give a hash with the patch of a diff between 2 revision and the stats (added and deleted lines)
106
+ def get_diff(node, group, oid1, oid2)
107
+ diff_commits = nil
108
+ repo, = yield_repo_and_path(node, group)
109
+ repo = Rugged::Repository.new repo
110
+ commit = repo.lookup(oid1)
111
+
112
+ if oid2
113
+ commit_old = repo.lookup(oid2)
114
+ diff = repo.diff(commit_old, commit)
115
+ diff.each do |patch|
116
+ if /#{node.name}\s+/ =~ patch.to_s.lines.first
117
+ diff_commits = { patch: patch.to_s, stat: patch.stat }
118
+ break
128
119
  end
129
- else
130
- stat = commit.parents[0].diff(commit).stat
131
- stat = [stat[1],stat[2]]
132
- patch = commit.parents[0].diff(commit).patch
133
- diff_commits = {:patch => patch, :stat => stat}
134
120
  end
135
-
136
- diff_commits
137
- rescue
138
- 'no diffs'
121
+ else
122
+ stat = commit.parents[0].diff(commit).stat
123
+ stat = [stat[1], stat[2]]
124
+ patch = commit.parents[0].diff(commit).patch
125
+ diff_commits = { patch: patch, stat: stat }
139
126
  end
127
+
128
+ diff_commits
129
+ rescue StandardError
130
+ 'no diffs'
140
131
  end
141
132
 
142
- private
133
+ private
143
134
 
144
- def yield_repo_and_path(node, group)
145
- repo, path = node.repo, node.name
135
+ def yield_repo_and_path(node, group)
136
+ repo, path = node.repo, node.name
146
137
 
147
- if group and @cfg.single_repo?
148
- path = "#{group}/#{node.name}"
149
- end
138
+ path = "#{group}/#{node.name}" if group && @cfg.single_repo?
150
139
 
151
- [repo, path]
152
- end
140
+ [repo, path]
141
+ end
153
142
 
154
- def update repo, file, data
155
- return if data.empty?
143
+ def update(repo, file, data)
144
+ return if data.empty?
156
145
 
157
- if @opt[:group]
158
- if @cfg.single_repo?
159
- file = File.join @opt[:group], file
160
- else
161
- repo = if repo.is_a?(::String)
162
- File.join File.dirname(repo), @opt[:group] + '.git'
163
- else
164
- repo[@opt[:group]]
165
- end
146
+ if @opt[:group]
147
+ if @cfg.single_repo?
148
+ file = File.join @opt[:group], file
149
+ else
150
+ repo = if repo.is_a?(::String)
151
+ File.join File.dirname(repo), @opt[:group] + '.git'
152
+ else
153
+ repo[@opt[:group]]
154
+ end
155
+ end
166
156
  end
167
- end
168
157
 
169
- begin
170
- repo = Rugged::Repository.new repo
171
- update_repo repo, file, data, @msg, @user, @email
172
- rescue Rugged::OSError, Rugged::RepositoryError => open_error
173
158
  begin
174
- Rugged::Repository.init_at repo, :bare
175
- rescue => create_error
176
- raise GitError, "first '#{open_error.message}' was raised while opening git repo, then '#{create_error.message}' was while trying to create git repo"
159
+ repo = Rugged::Repository.new repo
160
+ update_repo repo, file, data
161
+ rescue Rugged::OSError, Rugged::RepositoryError => open_error
162
+ begin
163
+ Rugged::Repository.init_at repo, :bare
164
+ rescue StandardError => create_error
165
+ raise GitError, "first '#{open_error.message}' was raised while opening git repo, then '#{create_error.message}' was while trying to create git repo"
166
+ end
167
+ retry
177
168
  end
178
- retry
179
169
  end
180
- end
181
170
 
182
- def update_repo repo, file, data, msg, user, email
183
- oid = repo.write data, :blob
184
- index = repo.index
185
- index.read_tree repo.head.target.tree unless repo.empty?
171
+ def update_repo(repo, file, data)
172
+ oid_old = repo.blob_at(repo.head.target_id, file) rescue nil
173
+ return false if oid_old && (oid_old.content.b == data.b)
186
174
 
187
- tree_old = index.write_tree repo
188
- index.add :path=>file, :oid=>oid, :mode=>0100644
189
- tree_new = index.write_tree repo
175
+ oid = repo.write data, :blob
176
+ index = repo.index
177
+ index.add path: file, oid: oid, mode: 0o100644
190
178
 
191
- if tree_old != tree_new
192
- repo.config['user.name'] = user
193
- repo.config['user.email'] = email
179
+ repo.config['user.name'] = @user
180
+ repo.config['user.email'] = @email
194
181
  @commitref = Rugged::Commit.create(repo,
195
- :tree => index.write_tree(repo),
196
- :message => msg,
197
- :parents => repo.empty? ? [] : [repo.head.target].compact,
198
- :update_ref => 'HEAD',
199
- )
182
+ tree: index.write_tree(repo),
183
+ message: @msg,
184
+ parents: repo.empty? ? [] : [repo.head.target].compact,
185
+ update_ref: 'HEAD')
200
186
 
201
187
  index.write
202
188
  true
203
189
  end
204
190
  end
205
191
  end
206
- end