Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.

187 lignes
4.8 KiB

  1. // Copyright 2017 Prometheus Team
  2. // Licensed under the Apache License, Version 2.0 (the "License");
  3. // you may not use this file except in compliance with the License.
  4. // You may obtain a copy of the License at
  5. //
  6. // http://www.apache.org/licenses/LICENSE-2.0
  7. //
  8. // Unless required by applicable law or agreed to in writing, software
  9. // distributed under the License is distributed on an "AS IS" BASIS,
  10. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  11. // See the License for the specific language governing permissions and
  12. // limitations under the License.
  13. package procfs
  14. import (
  15. "bufio"
  16. "fmt"
  17. "os"
  18. "strconv"
  19. "strings"
  20. )
  21. // XfrmStat models the contents of /proc/net/xfrm_stat.
  22. type XfrmStat struct {
  23. // All errors which are not matched by other
  24. XfrmInError int
  25. // No buffer is left
  26. XfrmInBufferError int
  27. // Header Error
  28. XfrmInHdrError int
  29. // No state found
  30. // i.e. either inbound SPI, address, or IPSEC protocol at SA is wrong
  31. XfrmInNoStates int
  32. // Transformation protocol specific error
  33. // e.g. SA Key is wrong
  34. XfrmInStateProtoError int
  35. // Transformation mode specific error
  36. XfrmInStateModeError int
  37. // Sequence error
  38. // e.g. sequence number is out of window
  39. XfrmInStateSeqError int
  40. // State is expired
  41. XfrmInStateExpired int
  42. // State has mismatch option
  43. // e.g. UDP encapsulation type is mismatched
  44. XfrmInStateMismatch int
  45. // State is invalid
  46. XfrmInStateInvalid int
  47. // No matching template for states
  48. // e.g. Inbound SAs are correct but SP rule is wrong
  49. XfrmInTmplMismatch int
  50. // No policy is found for states
  51. // e.g. Inbound SAs are correct but no SP is found
  52. XfrmInNoPols int
  53. // Policy discards
  54. XfrmInPolBlock int
  55. // Policy error
  56. XfrmInPolError int
  57. // All errors which are not matched by others
  58. XfrmOutError int
  59. // Bundle generation error
  60. XfrmOutBundleGenError int
  61. // Bundle check error
  62. XfrmOutBundleCheckError int
  63. // No state was found
  64. XfrmOutNoStates int
  65. // Transformation protocol specific error
  66. XfrmOutStateProtoError int
  67. // Transportation mode specific error
  68. XfrmOutStateModeError int
  69. // Sequence error
  70. // i.e sequence number overflow
  71. XfrmOutStateSeqError int
  72. // State is expired
  73. XfrmOutStateExpired int
  74. // Policy discads
  75. XfrmOutPolBlock int
  76. // Policy is dead
  77. XfrmOutPolDead int
  78. // Policy Error
  79. XfrmOutPolError int
  80. XfrmFwdHdrError int
  81. XfrmOutStateInvalid int
  82. XfrmAcquireError int
  83. }
  84. // NewXfrmStat reads the xfrm_stat statistics.
  85. func NewXfrmStat() (XfrmStat, error) {
  86. fs, err := NewFS(DefaultMountPoint)
  87. if err != nil {
  88. return XfrmStat{}, err
  89. }
  90. return fs.NewXfrmStat()
  91. }
  92. // NewXfrmStat reads the xfrm_stat statistics from the 'proc' filesystem.
  93. func (fs FS) NewXfrmStat() (XfrmStat, error) {
  94. file, err := os.Open(fs.proc.Path("net/xfrm_stat"))
  95. if err != nil {
  96. return XfrmStat{}, err
  97. }
  98. defer file.Close()
  99. var (
  100. x = XfrmStat{}
  101. s = bufio.NewScanner(file)
  102. )
  103. for s.Scan() {
  104. fields := strings.Fields(s.Text())
  105. if len(fields) != 2 {
  106. return XfrmStat{}, fmt.Errorf("couldn't parse %q line %q", file.Name(), s.Text())
  107. }
  108. name := fields[0]
  109. value, err := strconv.Atoi(fields[1])
  110. if err != nil {
  111. return XfrmStat{}, err
  112. }
  113. switch name {
  114. case "XfrmInError":
  115. x.XfrmInError = value
  116. case "XfrmInBufferError":
  117. x.XfrmInBufferError = value
  118. case "XfrmInHdrError":
  119. x.XfrmInHdrError = value
  120. case "XfrmInNoStates":
  121. x.XfrmInNoStates = value
  122. case "XfrmInStateProtoError":
  123. x.XfrmInStateProtoError = value
  124. case "XfrmInStateModeError":
  125. x.XfrmInStateModeError = value
  126. case "XfrmInStateSeqError":
  127. x.XfrmInStateSeqError = value
  128. case "XfrmInStateExpired":
  129. x.XfrmInStateExpired = value
  130. case "XfrmInStateInvalid":
  131. x.XfrmInStateInvalid = value
  132. case "XfrmInTmplMismatch":
  133. x.XfrmInTmplMismatch = value
  134. case "XfrmInNoPols":
  135. x.XfrmInNoPols = value
  136. case "XfrmInPolBlock":
  137. x.XfrmInPolBlock = value
  138. case "XfrmInPolError":
  139. x.XfrmInPolError = value
  140. case "XfrmOutError":
  141. x.XfrmOutError = value
  142. case "XfrmInStateMismatch":
  143. x.XfrmInStateMismatch = value
  144. case "XfrmOutBundleGenError":
  145. x.XfrmOutBundleGenError = value
  146. case "XfrmOutBundleCheckError":
  147. x.XfrmOutBundleCheckError = value
  148. case "XfrmOutNoStates":
  149. x.XfrmOutNoStates = value
  150. case "XfrmOutStateProtoError":
  151. x.XfrmOutStateProtoError = value
  152. case "XfrmOutStateModeError":
  153. x.XfrmOutStateModeError = value
  154. case "XfrmOutStateSeqError":
  155. x.XfrmOutStateSeqError = value
  156. case "XfrmOutStateExpired":
  157. x.XfrmOutStateExpired = value
  158. case "XfrmOutPolBlock":
  159. x.XfrmOutPolBlock = value
  160. case "XfrmOutPolDead":
  161. x.XfrmOutPolDead = value
  162. case "XfrmOutPolError":
  163. x.XfrmOutPolError = value
  164. case "XfrmFwdHdrError":
  165. x.XfrmFwdHdrError = value
  166. case "XfrmOutStateInvalid":
  167. x.XfrmOutStateInvalid = value
  168. case "XfrmAcquireError":
  169. x.XfrmAcquireError = value
  170. }
  171. }
  172. return x, s.Err()
  173. }