1
1
require 'open-uri'
2
2
require 'json'
3
3
require 'tmpdir'
4
+ require 'rbconfig'
4
5
5
6
module Fluent
6
7
module Plugin
7
8
module FluentPackage
8
9
class UpdateChecker
9
10
DEFAULT_PACKAGE_CONFIG_PATH = "/opt/fluent/share/config"
11
+
10
12
def initialize ( options = { } )
11
13
@logger = options [ :logger ]
12
14
@options = options
@@ -20,6 +22,15 @@ def initialize(options={})
20
22
rescue LoadError
21
23
@logger . error "Failed to load #{ ENV [ "FLUENT_PACKAGE_CONFIG" ] || DEFAULT_PACKAGE_CONFIG_PATH } "
22
24
end
25
+ @host_os = RbConfig ::CONFIG [ 'host_os' ]
26
+ end
27
+
28
+ def windows?
29
+ !!( @host_os =~ /mswin|mingw/ )
30
+ end
31
+
32
+ def linux?
33
+ !!( @host_os =~ /linux/ )
23
34
end
24
35
25
36
def tags_cached?
@@ -65,6 +76,89 @@ def major_lts_update?(base_version, target_version)
65
76
[ base_version . segments [ 1 ] , target_version . segments [ 1 ] ] == [ 0 , 0 ]
66
77
end
67
78
79
+ def parse_os_release ( key )
80
+ File . open ( "/etc/os-release" ) . readlines . each do |line |
81
+ if line . start_with? ( key )
82
+ line . chomp =~ /^#{ key } =(.+)$/
83
+ return $1
84
+ end
85
+ end
86
+ nil
87
+ end
88
+
89
+ def package_url ( prefix , distribution , version )
90
+ major = version . segments . first
91
+ channel = @options [ :lts ] ? "lts/#{ major } " : major
92
+ case distribution
93
+ when "debian" , "ubuntu"
94
+ release = parse_os_release ( "VERSION_CODENAME" )
95
+ "#{ prefix } /#{ channel } /#{ distribution } /#{ release } /pool/contrib/f/fluent-package/fluent-package_#{ version } -1_amd64.deb"
96
+ when "redhat/8"
97
+ "#{ prefix } /#{ channel } /#{ distribution } /x86_64/fluent-package_#{ version } -1.el8.x86_64.rpm"
98
+ when "redhat/9"
99
+ "#{ prefix } /#{ channel } /#{ distribution } /x86_64/fluent-package_#{ version } -1.el9.x86_64.rpm"
100
+ when "amazon/2023"
101
+ "#{ prefix } /#{ channel } /#{ distribution } /x86_64/fluent-package_#{ version } -1.amzn2023.x86_64.rpm"
102
+ when "amazon/2"
103
+ "#{ prefix } /#{ channel } /#{ distribution } /x86_64/fluent-package_#{ version } -1.amzn2.x86_64.rpm"
104
+ when "windows"
105
+ "#{ prefix } /#{ channel } /#{ distribution } /fluent-package-#{ version } -x64.msi"
106
+ end
107
+ end
108
+
109
+ def generate_remote_package_url ( url_prefix , target_version )
110
+ if linux?
111
+ os_release_id = parse_os_release ( "ID" )
112
+ case os_release_id
113
+ when "debian"
114
+ url = package_url ( url_prefix , "debian" , target_version )
115
+ @logger . debug ( "Check existence of #{ url } " )
116
+ url
117
+ when "ubuntu"
118
+ package_url ( url_prefix , "ubuntu" , target_version )
119
+ when "rocky" , "almalinux" , "amzn"
120
+ cpe = parse_os_release ( "CPE_NAME" )
121
+ case cpe
122
+ when /rocky:8/ , /almalinux:8/
123
+ package_url ( url_prefix , "redhat/8" , target_version )
124
+ when /rocky:9/ , /almalinux:9/
125
+ package_url ( url_prefix , "redhat/9" , target_version )
126
+ when /amazon_linux:2023/ , /amazon_linux:2/
127
+ version = parse_os_release ( "VERSION" )
128
+ case version
129
+ when "2023"
130
+ package_url ( url_prefix , "amazon/2023" , target_version )
131
+ when "2"
132
+ package_url ( url_prefix , "amazon/2" , target_version )
133
+ end
134
+ end
135
+ end
136
+ elsif windows?
137
+ package_url ( url_prefix , "windows" , target_version )
138
+ end
139
+ end
140
+
141
+ def check_remote_packages ( target_version )
142
+ @options [ :repository_sites ] . each do |url_prefix |
143
+ yield generate_remote_package_url ( url_prefix , target_version )
144
+ end
145
+ end
146
+
147
+ def check_package_released? ( target_version )
148
+ major = target_version . segments . first
149
+ check_remote_packages ( target_version ) do |url |
150
+ begin
151
+ URI . open ( url )
152
+ return true
153
+ rescue => e
154
+ # package is not available
155
+ @logger . debug ( "#{ url } is inaccessible" , error : e )
156
+ end
157
+ end
158
+ # assume package is not available by default
159
+ false
160
+ end
161
+
68
162
def check_update_versions
69
163
current_version = Gem ::Version . new ( "#{ PACKAGE_VERSION } " )
70
164
fetch_tags do |releases |
@@ -75,16 +169,16 @@ def check_update_versions
75
169
if target_version > current_version
76
170
major = current_version . segments . first
77
171
if same_lts_series? ( current_version , target_version )
78
- @newer_lts_versions << version
172
+ @newer_lts_versions << version if check_package_released? ( target_version )
79
173
elsif version . start_with? ( "v#{ major } " )
80
- @newer_versions << version
174
+ @newer_versions << version if check_package_released? ( target_version )
81
175
else
82
176
# major upgrade standard/LTS version
83
177
if major_lts_update? ( current_version , target_version )
84
178
# LTS
85
- @major_lts_updates << version
179
+ @major_lts_updates << version if check_package_released? ( target_version )
86
180
else
87
- @major_updates << version
181
+ @major_updates << version if check_package_released? ( target_version )
88
182
end
89
183
end
90
184
end
0 commit comments