Fix issue with empty xml resulting in parse errors.

Improve version information.
This commit is contained in:
Mark Nellemann 2020-09-10 08:35:03 +02:00
parent c1c894d64e
commit c5bde9c2f6
6 changed files with 65 additions and 12 deletions

View file

@ -17,7 +17,7 @@ pipelines:
- gradle - gradle
name: Build and Release name: Build and Release
script: script:
- ./gradlew clean build shadowJar startShadowScripts buildRpm buildDeb - ./gradlew clean versionTxt build shadowJar startShadowScripts buildRpm buildDeb
- shopt -s nullglob ; for file in ${BITBUCKET_CLONE_DIR}/build/libs/*-all.jar ; do curl -X POST --user "${BB_AUTH_STRING}" "https://api.bitbucket.org/2.0/repositories/${BITBUCKET_REPO_OWNER}/${BITBUCKET_REPO_SLUG}/downloads" --form files=@"${file}" ; done - shopt -s nullglob ; for file in ${BITBUCKET_CLONE_DIR}/build/libs/*-all.jar ; do curl -X POST --user "${BB_AUTH_STRING}" "https://api.bitbucket.org/2.0/repositories/${BITBUCKET_REPO_OWNER}/${BITBUCKET_REPO_SLUG}/downloads" --form files=@"${file}" ; done
- shopt -s nullglob ; for file in ${BITBUCKET_CLONE_DIR}/build/distributions/*.rpm ; do curl -X POST --user "${BB_AUTH_STRING}" "https://api.bitbucket.org/2.0/repositories/${BITBUCKET_REPO_OWNER}/${BITBUCKET_REPO_SLUG}/downloads" --form files=@"${file}" ; done - shopt -s nullglob ; for file in ${BITBUCKET_CLONE_DIR}/build/distributions/*.rpm ; do curl -X POST --user "${BB_AUTH_STRING}" "https://api.bitbucket.org/2.0/repositories/${BITBUCKET_REPO_OWNER}/${BITBUCKET_REPO_SLUG}/downloads" --form files=@"${file}" ; done
- shopt -s nullglob ; for file in ${BITBUCKET_CLONE_DIR}/build/distributions/*.deb ; do curl -X POST --user "${BB_AUTH_STRING}" "https://api.bitbucket.org/2.0/repositories/${BITBUCKET_REPO_OWNER}/${BITBUCKET_REPO_SLUG}/downloads" --form files=@"${file}" ; done - shopt -s nullglob ; for file in ${BITBUCKET_CLONE_DIR}/build/distributions/*.deb ; do curl -X POST --user "${BB_AUTH_STRING}" "https://api.bitbucket.org/2.0/repositories/${BITBUCKET_REPO_OWNER}/${BITBUCKET_REPO_SLUG}/downloads" --form files=@"${file}" ; done

View file

@ -9,6 +9,7 @@ plugins {
id 'jacoco' id 'jacoco'
id "com.github.johnrengelman.shadow" version "6.0.0" id "com.github.johnrengelman.shadow" version "6.0.0"
id "net.nemerosa.versioning" version "2.14.0"
id "nebula.ospackage" version "8.4.1" id "nebula.ospackage" version "8.4.1"
} }
@ -97,3 +98,23 @@ jacocoTestCoverageVerification {
} }
} }
check.dependsOn jacocoTestCoverageVerification check.dependsOn jacocoTestCoverageVerification
processResources.dependsOn.add("versionFile")
versionFile {
// Path to the file to be written
file = new File(project.buildDir, 'resources/main/version.properties')
}
jar {
manifest {
attributes(
'Built-By' : System.properties['user.name'],
'Build-Timestamp': new Date().format("yyyy-MM-dd'T'HH:mm:ss.SSSZ").toString(),
'Build-Revision' : versioning.info.commit,
'Created-By' : "Gradle ${gradle.gradleVersion}",
'Build-Jdk' : "${System.properties['java.version']} (${System.properties['java.vendor']} ${System.properties['java.vm.version']})",
'Build-OS' : "${System.properties['os.name']} ${System.properties['os.arch']} ${System.properties['os.version']}"
)
}
}

View file

@ -1,2 +1,3 @@
id = hmci
group = biz.nellemann.hmci group = biz.nellemann.hmci
version = 1.0.8 version = 1.0.8

View file

@ -160,20 +160,33 @@ class App implements Runnable {
} }
static String getVersion() {
URL url = getClass().getResource("/version.properties");
if (url == null) {
return "No version.txt file found in the classpath."
}
Properties properties = new Properties();
properties.load(url.openStream());
return properties.getProperty("VERSION_GRADLE") + "-" + properties.getProperty("VERSION_BUILD")
}
static void main(String... args) { static void main(String... args) {
def cli = new CliBuilder(name: "hmci") def cli = new CliBuilder(name: "hmci")
cli.h(longOpt: 'help', 'display usage') cli.h(longOpt: 'help', usageHelp: true, 'display usage information')
cli.v(longOpt: 'version', 'display version') cli.v(longOpt: 'version', versionHelp: true, 'display version information')
cli.c(longOpt: 'config', args: 1, required: true, defaultValue: '/etc/hmci.groovy', 'configuration file') cli.c(longOpt: 'config', args: 1, required: true, paramLabel: "FILE", defaultValue: '/etc/hmci.groovy', 'configuration file')
OptionAccessor options = cli.parse(args) OptionAccessor options = cli.parse(args)
if (options.h) cli.usage() if (options.h) {
cli.usage()
return
}
if(options.v) { if(options.v) {
// TODO - how to display correct version or build number ? println("Version " + getVersion())
println("See https://bitbucket.org/mnellemann/hmci for more information.") return
System.exit(0)
} }
ConfigObject configuration ConfigObject configuration
@ -194,7 +207,6 @@ class App implements Runnable {
} }
new App(configuration) new App(configuration)
System.exit(0);
} }

View file

@ -44,6 +44,7 @@ class HmcClient {
private final String password private final String password
private final Boolean unsafe private final Boolean unsafe
protected Integer responseErrors = 0
protected String authToken protected String authToken
private final OkHttpClient client private final OkHttpClient client
@ -151,6 +152,7 @@ class HmcClient {
// Do not try to parse empty response // Do not try to parse empty response
if(responseBody.empty || responseBody.size() < 1) { if(responseBody.empty || responseBody.size() < 1) {
responseErrors++
return managedSystemsMap return managedSystemsMap
} }
@ -191,6 +193,7 @@ class HmcClient {
// Do not try to parse empty response // Do not try to parse empty response
if(responseBody.empty || responseBody.size() < 1) { if(responseBody.empty || responseBody.size() < 1) {
responseErrors++
return partitionMap return partitionMap
} }
@ -227,9 +230,14 @@ class HmcClient {
URL url = new URL(String.format("%s/rest/api/pcm/ManagedSystem/%s/ProcessedMetrics?NoOfSamples=1", baseUrl, system.id)) URL url = new URL(String.format("%s/rest/api/pcm/ManagedSystem/%s/ProcessedMetrics?NoOfSamples=1", baseUrl, system.id))
Response response = getResponse(url) Response response = getResponse(url)
String responseBody = response.body.string() String responseBody = response.body.string()
String jsonBody String jsonBody
// Do not try to parse empty response
if(responseBody.empty || responseBody.size() < 1) {
responseErrors++
return jsonBody
}
// Parse XML and fetch JSON link // Parse XML and fetch JSON link
def feed = new XmlSlurper().parseText(responseBody) def feed = new XmlSlurper().parseText(responseBody)
feed?.entry?.each { entry -> feed?.entry?.each { entry ->
@ -255,10 +263,14 @@ class HmcClient {
URL url = new URL(String.format("%s/rest/api/pcm/ManagedSystem/%s/LogicalPartition/%s/ProcessedMetrics?NoOfSamples=1", baseUrl, partition.system.id, partition.id)) URL url = new URL(String.format("%s/rest/api/pcm/ManagedSystem/%s/LogicalPartition/%s/ProcessedMetrics?NoOfSamples=1", baseUrl, partition.system.id, partition.id))
Response response = getResponse(url) Response response = getResponse(url)
String responseBody = response.body.string() String responseBody = response.body.string()
//log.debug(responseBody)
String jsonBody String jsonBody
// Do not try to parse empty response
if(responseBody.empty || responseBody.size() < 1) {
responseErrors++
return jsonBody
}
// Parse XML and fetch JSON link // Parse XML and fetch JSON link
def feed = new XmlSlurper().parseText(responseBody) def feed = new XmlSlurper().parseText(responseBody)
feed?.entry?.each { entry -> feed?.entry?.each { entry ->
@ -295,6 +307,12 @@ class HmcClient {
*/ */
private Response getResponse(URL url, Integer retry = 0) { private Response getResponse(URL url, Integer retry = 0) {
if(responseErrors > 2) {
responseErrors = 0
login(true)
return getResponse(url, retry++)
}
Request request = new Request.Builder() Request request = new Request.Builder()
.url(url) .url(url)
.addHeader("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8") .addHeader("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8")

1
src/main/resources/.gitignore vendored Normal file
View file

@ -0,0 +1 @@
version.properties