Guest User

Untitled

a guest
Jan 4th, 2018
150
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.85 KB | None | 0 0
  1. package com.devfactory.rapidproto.jenkins.rss
  2.  
  3. //to use jsoup in gradle add dependency:
  4. // compile 'org.jsoup:jsoup:1.11.2'
  5. import org.jsoup.Jsoup
  6. import org.w3c.dom.Document
  7. import org.w3c.dom.Element
  8. import org.w3c.dom.Node
  9. import org.w3c.dom.NodeList
  10. import java.io.InputStream
  11. import java.net.URL
  12. import java.time.LocalDateTime
  13. import java.time.format.DateTimeFormatter
  14. import java.util.*
  15. import javax.xml.parsers.DocumentBuilderFactory
  16.  
  17. data class Entry(val title: String, val updated: LocalDateTime)
  18.  
  19. fun main(args: Array<String>) {
  20.  
  21. val jenkinsHome = "jenkins_home"
  22. val user = "user_login"
  23. val pass = "user_pass" //the actual user password, not the token
  24.  
  25. println("Connecting to Jenkins...")
  26. val inputStream = inputStream(user, pass, jenkinsHome)
  27.  
  28. println("Getting jobs from home page...")
  29. val parsed = Jsoup.parse(inputStream, Charsets.UTF_8.name(), jenkinsHome)
  30. val jobs = parsed
  31. .select("table#projectstatus")
  32. .select("tr.job-status-")
  33. .eachAttr("id")
  34.  
  35. val latest: MutableList<Entry> = mutableListOf()
  36. for (job in jobs) {
  37. val jobUrl = job.replace("_", "/")
  38. println("Parsing job $jobUrl...")
  39. val entries: MutableList<Entry> = getJobEntries(user, pass, jenkinsHome, jobUrl)
  40. if (entries.size > 0) latest.add(entries.sortedByDescending { it.updated }.first())
  41. }
  42. latest.sortedBy { it.updated }.map { println(it) }
  43. }
  44.  
  45. private fun getJobEntries(user: String, pass: String, jenkinsHome: String,
  46. jobUrl: String): MutableList<Entry> {
  47. val feedStream = inputStream(user, pass, "$jenkinsHome/$jobUrl/rssAll")
  48. val feedXml: Document = DocumentBuilderFactory
  49. .newInstance()
  50. .newDocumentBuilder()
  51. .parse(feedStream).apply {
  52. documentElement.normalize()
  53. }
  54. val entries: MutableList<Entry> = mutableListOf()
  55. val entryNodes: NodeList = feedXml.getElementsByTagName("entry")
  56. for (i in 0..entryNodes.length - 1) {
  57. val entryNode = entryNodes.item(i)
  58. if (entryNode.nodeType == Node.ELEMENT_NODE) {
  59. entries.add(entry(entryNode))
  60. }
  61. }
  62. return entries
  63. }
  64.  
  65. private fun entry(entryNode: Node?): Entry {
  66. val elem = entryNode as Element
  67.  
  68. val titleTag = elem.getElementsByTagName("title").item(0).textContent
  69. val updatedTag = elem.getElementsByTagName("updated").item(0).textContent
  70.  
  71. val title = titleTag.substringBefore("#").substringBefore("»").trim()
  72. val updated = LocalDateTime.parse(updatedTag.dropLast(1),
  73. DateTimeFormatter.ISO_LOCAL_DATE_TIME)
  74. return Entry(title = title, updated = updated)
  75. }
  76.  
  77. private fun inputStream(user: String, pass: String,
  78. url: String): InputStream? {
  79. val auth = "$user:$pass"
  80. val encoded = Base64.getEncoder().encodeToString(auth.toByteArray())
  81.  
  82. return URL(url).openConnection().apply {
  83. setRequestProperty("Authorization", "Basic $encoded")
  84. }.getInputStream()
  85.  
  86. }
Add Comment
Please, Sign In to add comment