@@ -105,14 +105,15 @@ func Start(sd *lib.Shutdown, cfg Config) (*dataplane.Dataplane, error) {
105
105
return dataplaneClient , nil
106
106
}
107
107
108
- // execAndCapture Launch Help from program path and Find Version
108
+ // getVersion Launch Help from program path and Find Version
109
109
// to capture the output and retrieve version information
110
- func execAndCapture (path string , re * regexp. Regexp ) (string , error ) {
110
+ func getVersion (path string ) (string , error ) {
111
111
cmd := exec .Command (path , "-v" )
112
112
out , err := cmd .CombinedOutput ()
113
113
if err != nil {
114
114
return "" , fmt .Errorf ("Failed executing %s: %s" , path , err .Error ())
115
115
}
116
+ re := regexp .MustCompile ("\\ d+(\\ .\\ d+)+" )
116
117
return string (re .Find (out )), nil
117
118
}
118
119
@@ -121,22 +122,83 @@ func CheckEnvironment(dataplaneapiBin, haproxyBin string) error {
121
122
var err error
122
123
wg := & sync.WaitGroup {}
123
124
wg .Add (2 )
124
- ensureVersion := func (path , rx , version string ) {
125
+ ensureVersion := func (path , minVer string ) {
125
126
defer wg .Done ()
126
- r := regexp .MustCompile (rx )
127
- v , e := execAndCapture (path , r )
127
+ currVer , e := getVersion (path )
128
128
if e != nil {
129
129
err = e
130
- } else if strings .Compare (v , "1.2" ) < 0 {
131
- err = fmt .Errorf ("%s version must be > 1.2, but is: %s" , path , v )
130
+ }
131
+ res , e := compareVersion (currVer , minVer )
132
+ if e != nil {
133
+ err = e
134
+ }
135
+ if res < 0 {
136
+ err = fmt .Errorf ("%s version must be > %s, but is: %s" , path , minVer , currVer )
132
137
}
133
138
}
134
- go ensureVersion (haproxyBin , "^HA-Proxy version ([0-9] \\ .[0-9] \\ .[0-9])" , " 2.0" )
135
- go ensureVersion (dataplaneapiBin , "^HAProxy Data Plane API v([0-9] \\ .[0-9] \\ .[0-9])" , " 1.2" )
139
+ go ensureVersion (haproxyBin , "2.0" )
140
+ go ensureVersion (dataplaneapiBin , "1.2" )
136
141
137
142
wg .Wait ()
138
143
if err != nil {
139
144
return err
140
145
}
141
146
return nil
142
147
}
148
+
149
+ // compareVersion compares two semver versions.
150
+ // If v1 > v2 returns 1, if v1 < v2 returns -1, if equal returns 0.
151
+ // If major versions are not the same, returns -1.
152
+ // If an error occurs, returns -1 and error.
153
+ func compareVersion (v1 , v2 string ) (int , error ) {
154
+ a := strings .Split (v1 , "." )
155
+ b := strings .Split (v2 , "." )
156
+
157
+ if len (a ) < 2 {
158
+ return - 1 , fmt .Errorf ("%s arg is not a version string" , v1 )
159
+ }
160
+ if len (b ) < 2 {
161
+ return - 1 , fmt .Errorf ("%s arg is not a version string" , v2 )
162
+ }
163
+
164
+ if len (a ) != len (b ) {
165
+ switch {
166
+ case len (a ) > len (b ):
167
+ for i := len (b ); len (b ) < len (a ); i ++ {
168
+ b = append (b , " " )
169
+ }
170
+ break
171
+ case len (a ) < len (b ):
172
+ for i := len (a ); len (a ) < len (b ); i ++ {
173
+ a = append (a , " " )
174
+ }
175
+ break
176
+ }
177
+ }
178
+
179
+ var res int
180
+
181
+ for i , s := range a {
182
+ var ai , bi int
183
+ fmt .Sscanf (s , "%d" , & ai )
184
+ fmt .Sscanf (b [i ], "%d" , & bi )
185
+
186
+ if i == 0 {
187
+ //major versions should be the same
188
+ if ai != bi {
189
+ res = - 1
190
+ break
191
+ }
192
+ continue
193
+ }
194
+ if ai > bi {
195
+ res = 1
196
+ break
197
+ }
198
+ if ai < bi {
199
+ res = - 1
200
+ break
201
+ }
202
+ }
203
+ return res , nil
204
+ }
0 commit comments