dist.sh.skel 4.2KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  1. #!/bin/bash
  2. shellfu import isa
  3. shellfu import pretty
  4. shellfu import sfpi
  5. #
  6. # Query on which distribution we are
  7. #
  8. dist() {
  9. #
  10. # Get key $1 of distro info
  11. #
  12. # Usage:
  13. #
  14. # dist KEY
  15. #
  16. # Find plugin supporting the key and use it
  17. #
  18. # Common KEYs are:
  19. #
  20. # * 'id' - small-caps identifier, eg. `debian`,
  21. # * 'name' - human-readable name, eg. `Red Hat Enterprise Linux`,
  22. # * 'ver' - release version, eg. '8.1'
  23. # * 'ver.x' - first part of rel. version, eg. '8'
  24. # * 'ver.y' - second part of rel. version, eg. '1'
  25. # * 'ver.z' - third part of rel. version, eg. '0'
  26. #
  27. # Note that distros don't have to support all parts of version; plugins
  28. # should report empty string if the part is not supported. However,
  29. # since meaning is always distro-specific, you should not query for it
  30. # directly (eg. don't use `ver.z` if you are on Debian.).
  31. #
  32. local key=$1
  33. local plg
  34. test -n "$key" || { mkusage -E KEY; return 2; }
  35. #shellcheck disable=SC2034
  36. SFPI__PREFIX=_distp
  37. for plg in $(sfpi__ls); do
  38. debug -v plg
  39. sfpi__call "$plg" get "$key" \
  40. && return
  41. done
  42. warn "no source for key: $key"
  43. return 3
  44. }
  45. dist__test() {
  46. #
  47. # Test on distro key
  48. #
  49. # dist__test KEY OP VALUE [KEY OP VALUE]..
  50. #
  51. # Known OPs are
  52. #
  53. # * 'eq', 'lt', 'gt', 'le', 'ge' and 'ne' are integer comparison
  54. # operators as known from `test` unix command.
  55. #
  56. # * '==', '!=', are string comparison operators, also known from
  57. # `test` unix command.
  58. #
  59. # * 're' is regular expression matcher, ie. VALUE has to be basic
  60. # regular expression matching whole line,
  61. #
  62. # * 'vge', 'vle`, `vgt` and `vlt` have similar meanings as their
  63. # corresponding integer operators, but work on version numbers
  64. # using 'sort -V' command.
  65. #
  66. while test -n "$1"; do
  67. __dist__test1 "$1" "$2" "$3" || return 1
  68. shift 3 || { mkusage -E "KEY OP VALUE [KEY OP VALUE].."; return 2; }
  69. done
  70. return 0
  71. }
  72. __dist__test1() {
  73. #
  74. # Test on distro key
  75. #
  76. # dist__test1 KEY OP VALUE
  77. #
  78. local key=$1
  79. local Op=$2
  80. local Ref=$3
  81. local Val
  82. test -n "$Op"
  83. Val=$(dist "$key") || return 3
  84. debug -v key Val Op Ref
  85. case $Op in
  86. eq|lt|le|gt|ge|ne) __dist_intcmp ;;
  87. ==) test "$Val" == "$Ref" ;;
  88. !=) test "$Val" != "$Ref" ;;
  89. re) grep -qx "$Ref" <<<"$Val" ;;
  90. veq|vne) __dist_vercmp ;;
  91. vge|vle|vgt|vlt) __dist_vercmp ;;
  92. *) mkusage -w "unsupported OP: $Op" \
  93. -E "KEY OP VALUE [KEY OP VALUE].."
  94. return 2 ;;
  95. esac
  96. }
  97. __dist_intcmp() {
  98. #
  99. # Compare integers $Val and $Ref with $Op
  100. #
  101. isa__int "$Val" || { warn "not an integer: '$Val'"; return 3; }
  102. isa__int "$Ref" || { warn "not an integer: '$Ref'"; return 3; }
  103. test "$Val" -"$Op" "$Ref"
  104. }
  105. __dist_vercmp() {
  106. #
  107. # Compare versions $Val and $Ref with $Op
  108. #
  109. local rv="$Ref"$'\n'"$Val"
  110. local vr="$Val"$'\n'"$Ref"
  111. local rvs
  112. local vrs
  113. local rvs_same=0
  114. local vrs_same=0
  115. rvs=$(sort -V <<<"$rv")
  116. vrs=$(sort -V <<<"$vr")
  117. test "$rvs" == "$rv"; rvs_same=$? # 0: r is ge 1: r is lt
  118. test "$vrs" == "$vr"; vrs_same=$? # 0: v is ge 1: v is lt
  119. case ${Op:1}:$rvs_same:$vrs_same in
  120. # both are same
  121. #
  122. eq:0:0) return 0 ;;
  123. ge:0:0) return 0 ;;
  124. le:0:0) return 0 ;;
  125. gt:0:0) return 1 ;;
  126. lt:0:0) return 1 ;;
  127. ne:0:0) return 1 ;;
  128. # r is ge, v is lt
  129. #
  130. eq:0:1) return 1 ;;
  131. ge:0:1) return 0 ;;
  132. gt:0:1) return 0 ;;
  133. le:0:1) return 0 ;;
  134. lt:0:1) return 1 ;;
  135. ne:0:1) return 0 ;;
  136. # r is lt, v is ge
  137. #
  138. eq:1:0) return 1 ;;
  139. ge:1:0) return 1 ;;
  140. gt:1:0) return 1 ;;
  141. le:1:0) return 1 ;;
  142. lt:1:0) return 0 ;;
  143. ne:1:0) return 0 ;;
  144. esac
  145. #FIXME: these are pretty much surely borken
  146. }
  147. #shellfu module-version=__MKIT_PROJ_VERSION__