block.sh 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268
  1. #!/bin/sh
  2. # Copyright 2010 Vertical Communications
  3. # This is free software, licensed under the GNU General Public License v2.
  4. # See /LICENSE for more information.
  5. #
  6. . /etc/functions.sh
  7. reset_block_cb() {
  8. mount_cb() {
  9. dmc_mount_cfg="$1"
  10. shift # skip optional param
  11. dmc_target="$2"
  12. dmc_mount_device="$3"
  13. dmc_fstype="$4"
  14. dmc_options="$5"
  15. dmc_enabled="$6"
  16. dmc_enabled_fsck="$7"
  17. dmc_uuid="$8"
  18. dmc_label="$9"
  19. shift
  20. dmc_is_rootfs="$9"
  21. return 0
  22. }
  23. swap_cb() {
  24. dsc_swap_cfg="$1"
  25. shift # skip optional param
  26. dsc_swap_device="$2"
  27. dsc_enabled="$3"
  28. dsc_uuid="$4"
  29. dsc_label="$5"
  30. return 0
  31. }
  32. }
  33. reset_block_cb
  34. reset_dev_section_cb() {
  35. mount_dev_section_cb() {
  36. dmds_mount_cfg="$1"
  37. dmds_mount_target="$2"
  38. dmds_mount_device="$3"
  39. dmds_mount_fstype="$4"
  40. dmds_mount_options="$5"
  41. dmds_mount_enabled="$6"
  42. dmds_mount_enabled_fsck="$7"
  43. dmds_mount_uuid="$8"
  44. dmds_mount_label="$9"
  45. shift
  46. dmds_is_rootfs="$9"
  47. return 0
  48. }
  49. swap_dev_section_cb() {
  50. dsds_swap_cfg="$1"
  51. dsds_swap_device="$2"
  52. dsds_swap_enabled="$3"
  53. dsds_swap_uuid="$4"
  54. dsds_swap_label="$5"
  55. return 0
  56. }
  57. }
  58. reset_dev_section_cb
  59. config_get_mount() {
  60. local gm_cfg="$1"
  61. local gm_param="$2"
  62. local gm_target
  63. local gm_device
  64. local gm_fstype
  65. local gm_options
  66. local gm_enabled
  67. local gm_enabled_fsck
  68. local gm_uuid
  69. local gm_label
  70. local gm_is_rootfs
  71. config_get gm_target "$1" target
  72. config_get gm_device "$1" device
  73. config_get gm_fstype "$1" fstype 'auto'
  74. config_get gm_options "$1" options 'rw'
  75. config_get_bool gm_enabled "$1" enabled 1
  76. config_get_bool gm_enabled_fsck "$1" enabled_fsck 0
  77. config_get gm_uuid "$1" uuid
  78. config_get gm_label "$1" label
  79. config_get_bool gm_is_rootfs "$1" is_rootfs 0
  80. mount_cb "$gm_cfg" "$gm_param" "$gm_target" "$gm_device" "$gm_fstype" "$gm_options" "$gm_enabled" "$gm_enabled_fsck" "$gm_uuid" "$gm_label" "$gm_is_rootfs"
  81. }
  82. config_get_swap() {
  83. local gs_cfg="$1"
  84. local gs_param="$2"
  85. local gs_device
  86. local gs_enabled
  87. local gs_uuid
  88. local gs_label
  89. config_get gs_device "$1" device
  90. config_get_bool gs_enabled "$1" enabled 1
  91. config_get gs_uuid "$1" uuid
  92. config_get gs_label "$1" label
  93. swap_cb "$gs_cfg" "$gs_param" "$gs_device" "$gs_enabled" "$gs_uuid" "$gs_label"
  94. }
  95. config_get_automount() {
  96. config_load fstab
  97. config_get_bool from_fstab "automount" from_fstab 1
  98. config_get_bool anon_mount "automount" anon_mount 1
  99. config_get_bool anon_fsck "automount" anon_fsck 0
  100. }
  101. config_get_autoswap() {
  102. config_load fstab
  103. config_get_bool from_fstab "autoswap" from_fstab 1
  104. config_get_bool anon_swap "autoswap" anon_swap 0
  105. }
  106. config_create_swap_fstab_entry() {
  107. local device="$1"
  108. local enabled="$2"
  109. [ -n "$device" ] || return 0
  110. local fstabnew
  111. mkdir -p /var/lock
  112. lock -w /var/lock/fstab.lck && {
  113. lock /var/lock/fstab.lck
  114. fstabnew="$(mktemp -t '.fstab.XXXXXXXX')"
  115. cat /tmp/fstab | grep -E -v "^$device[[:blank:]]" >>"$fstabnew"
  116. [ "$enabled" -eq 1 ] && echo "$device none swap sw 0 0" >> "$fstabnew"
  117. cat "$fstabnew" >/tmp/fstab
  118. rm -f $fstabnew
  119. lock -u /var/lock/fstab.lck
  120. }
  121. }
  122. config_create_mount_fstab_entry() {
  123. local device="$1"
  124. local target="$2"
  125. local fstype="$3"
  126. local options="$4"
  127. local enabled="$5"
  128. options="${options:-rw}"
  129. [ "$enabled" -eq 0 ] && options="noauto,$options"
  130. [ -n "$target" ] || return 0
  131. [ -n "$device" ] || return 0
  132. local fstabnew
  133. mkdir -p /var/lock
  134. lock -w /var/lock/fstab.lck && {
  135. lock /var/lock/fstab.lck
  136. fstabnew="$(mktemp -t '.fstab.XXXXXXXX')"
  137. cat /tmp/fstab | grep -E -v "^$device[[:blank:]]" | grep -v "$target" >>"$fstabnew"
  138. echo "$device $target $fstype $options 0 0" >>"$fstabnew"
  139. cat "$fstabnew" >/tmp/fstab
  140. rm -f $fstabnew
  141. lock -u /var/lock/fstab.lck
  142. }
  143. }
  144. libmount_find_token() {
  145. local token="$1"
  146. local value="$2"
  147. local device
  148. device="$(blkid | grep "$token=\"$value\"" | cut -f1 -d:)"
  149. echo "$device"
  150. }
  151. libmount_find_device_by_id() {
  152. local uuid="$1"
  153. local label="$2"
  154. local device="$3"
  155. local cfg_device="$4"
  156. local found_device
  157. if [ -n "$uuid" ]; then
  158. found_device="$(libmount_find_token "UUID" "$uuid")"
  159. elif [ -n "$label" ]; then
  160. found_device="$(libmount_find_token "LABEL" "$label")"
  161. elif [ "$device" = "$cfg_device" ]; then
  162. found_device="$device"
  163. elif [ -z "$device" ] && [ -e "$cfg_device" ]; then
  164. found_device="$cfg_device"
  165. fi
  166. [ -n "$device" ] && [ "$device" != "$found_device" ] && {
  167. found_device=""
  168. }
  169. echo "$found_device"
  170. }
  171. config_get_mount_section_by_device() {
  172. local msbd_device="$1"
  173. local msbd_mount_cfg=
  174. local msbd_target=
  175. local msbd_mount_device=
  176. local msbd_fstype=
  177. local msbd_options=
  178. local msbd_enabled=
  179. local msbd_enabled_fsck=
  180. local msbd_uuid=
  181. local msbd_label=
  182. local msbd_is_rootfs
  183. local msbd_blkid_fstype_match=
  184. mount_cb() {
  185. local mc_cfg="$1"
  186. local mc_device="$2"
  187. shift
  188. local mc_target="$2"
  189. local mc_cfgdevice="$3"
  190. local mc_fstype="$4"
  191. local mc_uuid="$8"
  192. local mc_label="$9"
  193. shift
  194. local mc_is_rootfs="$9"
  195. local mc_found_device=""
  196. mc_found_device="$(libmount_find_device_by_id "$mc_uuid" "$mc_label" "$mc_device" "$mc_cfgdevice")"
  197. if [ -n "$mc_found_device" ]; then
  198. msbd_mount_cfg="$mc_cfg"
  199. msbd_target="$mc_target"
  200. msbd_mount_device="$mc_found_device"
  201. msbd_fstype="$mc_fstype"
  202. msbd_options="$4"
  203. msbd_enabled="$5"
  204. msbd_enabled_fsck="$6"
  205. msbd_uuid="$7"
  206. msbd_label="$8"
  207. msbd_is_rootfs="$9"
  208. fi
  209. return 0
  210. }
  211. config_foreach config_get_mount mount "$msbd_device"
  212. [ -n "$msbd_mount_device" ] && config_create_mount_fstab_entry "$msbd_mount_device" "$msbd_target" "$msbd_fstype" "$msbd_options" "$msbd_enabled"
  213. mount_dev_section_cb "$msbd_mount_cfg" "$msbd_target" "$msbd_mount_device" "$msbd_fstype" "$msbd_options" "$msbd_enabled" "$msbd_enabled_fsck" "$msbd_uuid" "$msbd_label" "$msbd_is_rootfs"
  214. reset_block_cb
  215. }
  216. config_get_swap_section_by_device() {
  217. local ssbd_device="$1"
  218. local ssbd_swap_cfg=
  219. local ssbd_swap_device=
  220. local ssbd_enabled=
  221. local ssbd_uuid=
  222. local ssbd_label=
  223. swap_cb() {
  224. local sc_cfg="$1"
  225. local sc_device="$2"
  226. local sc_uuid="$5"
  227. local sc_label="$6"
  228. local sc_cfgdevice="$3"
  229. local sc_found_device
  230. sc_found_device="$(libmount_find_device_by_id "$sc_uuid" "$sc_label" "$sc_device" "$sc_cfgdevice")"
  231. if [ -n "$sc_found_device" ]; then
  232. ssbd_swap_cfg="$sc_cfg"
  233. ssbd_swap_device="$sc_found_device"
  234. ssbd_enabled="$4"
  235. ssbd_uuid="$5"
  236. ssbd_label="$6"
  237. fi
  238. return 0
  239. }
  240. config_foreach config_get_swap swap "$ssbd_device"
  241. [ -n "$ssbd_swap_device" ] && config_create_swap_fstab_entry "$ssbd_swap_device" "$ssbd_enabled"
  242. swap_dev_section_cb "$ssbd_swap_cfg" "$ssbd_swap_device" "$ssbd_enabled" "$ssbd_uuid" "$ssbd_label"
  243. reset_block_cb
  244. }