kanrisuru 0.13.0 → 0.16.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (282) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +23 -0
  3. data/README.md +5 -5
  4. data/kanrisuru.gemspec +7 -3
  5. data/lib/kanrisuru/command.rb +15 -1
  6. data/lib/kanrisuru/core/apt/commands/autoclean.rb +13 -0
  7. data/lib/kanrisuru/core/apt/commands/autoremove.rb +15 -0
  8. data/lib/kanrisuru/core/apt/commands/clean.rb +13 -0
  9. data/lib/kanrisuru/core/apt/commands/full_upgrade.rb +14 -0
  10. data/lib/kanrisuru/core/apt/commands/install.rb +22 -0
  11. data/lib/kanrisuru/core/apt/commands/list.rb +21 -0
  12. data/lib/kanrisuru/core/apt/commands/purge.rb +18 -0
  13. data/lib/kanrisuru/core/apt/commands/remove.rb +18 -0
  14. data/lib/kanrisuru/core/apt/commands/search.rb +18 -0
  15. data/lib/kanrisuru/core/apt/commands/show.rb +21 -0
  16. data/lib/kanrisuru/core/apt/commands/update.rb +14 -0
  17. data/lib/kanrisuru/core/apt/commands/upgrade.rb +14 -0
  18. data/lib/kanrisuru/core/apt/commands.rb +14 -0
  19. data/lib/kanrisuru/core/apt/parser.rb +6 -0
  20. data/lib/kanrisuru/core/apt/parsers/base.rb +51 -0
  21. data/lib/kanrisuru/core/apt/parsers/list.rb +28 -0
  22. data/lib/kanrisuru/core/apt/parsers/search.rb +32 -0
  23. data/lib/kanrisuru/core/apt/parsers/show.rb +90 -0
  24. data/lib/kanrisuru/core/apt/types.rb +36 -0
  25. data/lib/kanrisuru/core/apt.rb +4 -284
  26. data/lib/kanrisuru/core/archive/commands/tar.rb +126 -0
  27. data/lib/kanrisuru/core/archive/commands.rb +3 -0
  28. data/lib/kanrisuru/core/archive/types.rb +9 -0
  29. data/lib/kanrisuru/core/archive.rb +3 -121
  30. data/lib/kanrisuru/core/disk/commands/blkid.rb +35 -0
  31. data/lib/kanrisuru/core/disk/commands/df.rb +26 -0
  32. data/lib/kanrisuru/core/disk/commands/du.rb +24 -0
  33. data/lib/kanrisuru/core/disk/commands/lsblk.rb +49 -0
  34. data/lib/kanrisuru/core/disk/commands.rb +6 -0
  35. data/lib/kanrisuru/core/disk/constants.rb +9 -0
  36. data/lib/kanrisuru/core/disk/parser.rb +7 -0
  37. data/lib/kanrisuru/core/disk/parsers/blkid.rb +72 -0
  38. data/lib/kanrisuru/core/disk/parsers/df.rb +33 -0
  39. data/lib/kanrisuru/core/disk/parsers/du.rb +25 -0
  40. data/lib/kanrisuru/core/disk/parsers/lsblk.rb +96 -0
  41. data/lib/kanrisuru/core/disk/parsers/lsblk_version.rb +21 -0
  42. data/lib/kanrisuru/core/disk/types.rb +21 -0
  43. data/lib/kanrisuru/core/disk.rb +6 -290
  44. data/lib/kanrisuru/core/dmi/commands/dmi.rb +42 -0
  45. data/lib/kanrisuru/core/dmi/commands.rb +3 -0
  46. data/lib/kanrisuru/core/dmi/parser.rb +3 -0
  47. data/lib/kanrisuru/core/dmi/parsers/dmi.rb +149 -0
  48. data/lib/kanrisuru/core/dmi/types.rb +361 -0
  49. data/lib/kanrisuru/core/dmi.rb +4 -522
  50. data/lib/kanrisuru/core/file/commands/chmod.rb +29 -0
  51. data/lib/kanrisuru/core/file/commands/chown.rb +35 -0
  52. data/lib/kanrisuru/core/file/commands/copy.rb +54 -0
  53. data/lib/kanrisuru/core/file/commands/link.rb +25 -0
  54. data/lib/kanrisuru/core/file/commands/mkdir.rb +42 -0
  55. data/lib/kanrisuru/core/file/commands/move.rb +48 -0
  56. data/lib/kanrisuru/core/file/commands/rm.rb +41 -0
  57. data/lib/kanrisuru/core/file/commands/symlink.rb +46 -0
  58. data/lib/kanrisuru/core/file/commands/touch.rb +34 -0
  59. data/lib/kanrisuru/core/file/commands/unlink.rb +13 -0
  60. data/lib/kanrisuru/core/file/commands/wc.rb +16 -0
  61. data/lib/kanrisuru/core/file/commands.rb +29 -0
  62. data/lib/kanrisuru/core/file/parser.rb +3 -0
  63. data/lib/kanrisuru/core/file/parsers/wc.rb +16 -0
  64. data/lib/kanrisuru/core/file/types.rb +9 -0
  65. data/lib/kanrisuru/core/file.rb +4 -312
  66. data/lib/kanrisuru/core/find/commands/find.rb +97 -0
  67. data/lib/kanrisuru/core/find/commands.rb +3 -0
  68. data/lib/kanrisuru/core/find/constants.rb +9 -0
  69. data/lib/kanrisuru/core/find/parser.rb +3 -0
  70. data/lib/kanrisuru/core/find/parsers/find.rb +18 -0
  71. data/lib/kanrisuru/core/find/types.rb +9 -0
  72. data/lib/kanrisuru/core/find.rb +5 -97
  73. data/lib/kanrisuru/core/group/commands/create_group.rb +21 -0
  74. data/lib/kanrisuru/core/group/commands/delete_group.rb +16 -0
  75. data/lib/kanrisuru/core/group/commands/get_gid.rb +17 -0
  76. data/lib/kanrisuru/core/group/commands/get_group.rb +29 -0
  77. data/lib/kanrisuru/core/group/commands/is_group.rb +14 -0
  78. data/lib/kanrisuru/core/group/commands/update_group.rb +23 -0
  79. data/lib/kanrisuru/core/group/commands.rb +8 -0
  80. data/lib/kanrisuru/core/group/parser.rb +4 -0
  81. data/lib/kanrisuru/core/group/parsers/gid.rb +15 -0
  82. data/lib/kanrisuru/core/group/parsers/group.rb +15 -0
  83. data/lib/kanrisuru/core/group/types.rb +10 -0
  84. data/lib/kanrisuru/core/group.rb +4 -81
  85. data/lib/kanrisuru/core/ip/commands/address.rb +86 -0
  86. data/lib/kanrisuru/core/ip/commands/address_label.rb +54 -0
  87. data/lib/kanrisuru/core/ip/commands/link.rb +116 -0
  88. data/lib/kanrisuru/core/ip/commands/link_set_opts.rb +61 -0
  89. data/lib/kanrisuru/core/ip/commands/link_type_opts.rb +313 -0
  90. data/lib/kanrisuru/core/ip/commands/maddress.rb +42 -0
  91. data/lib/kanrisuru/core/ip/commands/neighbour.rb +72 -0
  92. data/lib/kanrisuru/core/ip/commands/route.rb +152 -0
  93. data/lib/kanrisuru/core/ip/commands/rule.rb +57 -0
  94. data/lib/kanrisuru/core/ip/commands.rb +26 -0
  95. data/lib/kanrisuru/core/ip/constants.rb +25 -0
  96. data/lib/kanrisuru/core/ip/parser.rb +11 -0
  97. data/lib/kanrisuru/core/ip/parsers/address.rb +104 -0
  98. data/lib/kanrisuru/core/ip/parsers/address_label.rb +27 -0
  99. data/lib/kanrisuru/core/ip/parsers/base.rb +166 -0
  100. data/lib/kanrisuru/core/ip/parsers/link.rb +86 -0
  101. data/lib/kanrisuru/core/ip/parsers/maddress.rb +85 -0
  102. data/lib/kanrisuru/core/ip/parsers/neighbour.rb +89 -0
  103. data/lib/kanrisuru/core/ip/parsers/route.rb +76 -0
  104. data/lib/kanrisuru/core/ip/parsers/rule.rb +60 -0
  105. data/lib/kanrisuru/core/ip/parsers/version.rb +15 -0
  106. data/lib/kanrisuru/core/ip/types.rb +46 -0
  107. data/lib/kanrisuru/core/ip.rb +15 -1002
  108. data/lib/kanrisuru/core/mount/commands/mount.rb +65 -0
  109. data/lib/kanrisuru/core/mount/commands/umount.rb +35 -0
  110. data/lib/kanrisuru/core/mount/commands.rb +49 -0
  111. data/lib/kanrisuru/core/mount.rb +2 -125
  112. data/lib/kanrisuru/core/path/commands/ls.rb +26 -0
  113. data/lib/kanrisuru/core/path/commands/pwd.rb +16 -0
  114. data/lib/kanrisuru/core/path/commands/readlink.rb +22 -0
  115. data/lib/kanrisuru/core/path/commands/realpath.rb +18 -0
  116. data/lib/kanrisuru/core/path/commands/which.rb +19 -0
  117. data/lib/kanrisuru/core/path/commands/whoami.rb +16 -0
  118. data/lib/kanrisuru/core/path/commands.rb +8 -0
  119. data/lib/kanrisuru/core/path/parser.rb +4 -0
  120. data/lib/kanrisuru/core/path/parsers/ls.rb +53 -0
  121. data/lib/kanrisuru/core/path/parsers/which.rb +18 -0
  122. data/lib/kanrisuru/core/path/types.rb +12 -0
  123. data/lib/kanrisuru/core/path.rb +4 -121
  124. data/lib/kanrisuru/core/socket/commands/ss.rb +44 -0
  125. data/lib/kanrisuru/core/socket/commands.rb +3 -0
  126. data/lib/kanrisuru/core/socket/constants.rb +29 -0
  127. data/lib/kanrisuru/core/socket/parser.rb +3 -0
  128. data/lib/kanrisuru/core/socket/parsers/ss.rb +109 -0
  129. data/lib/kanrisuru/core/socket/types.rb +18 -0
  130. data/lib/kanrisuru/core/socket.rb +5 -164
  131. data/lib/kanrisuru/core/stat/commands/stat.rb +62 -0
  132. data/lib/kanrisuru/core/stat/commands.rb +3 -0
  133. data/lib/kanrisuru/core/stat/parser.rb +3 -0
  134. data/lib/kanrisuru/core/stat/parsers/stat.rb +34 -0
  135. data/lib/kanrisuru/core/stat/types.rb +14 -0
  136. data/lib/kanrisuru/core/stat.rb +4 -81
  137. data/lib/kanrisuru/core/stream/commands/cat.rb +25 -0
  138. data/lib/kanrisuru/core/stream/commands/echo.rb +20 -0
  139. data/lib/kanrisuru/core/stream/commands/head.rb +18 -0
  140. data/lib/kanrisuru/core/stream/commands/read_file_chunk.rb +21 -0
  141. data/lib/kanrisuru/core/stream/commands/sed.rb +23 -0
  142. data/lib/kanrisuru/core/stream/commands/tail.rb +18 -0
  143. data/lib/kanrisuru/core/stream/commands.rb +27 -0
  144. data/lib/kanrisuru/core/stream/parser.rb +4 -0
  145. data/lib/kanrisuru/core/stream/parsers/echo.rb +17 -0
  146. data/lib/kanrisuru/core/stream/parsers/sed.rb +17 -0
  147. data/lib/kanrisuru/core/stream.rb +3 -104
  148. data/lib/kanrisuru/core/system/commands/cpu_info.rb +32 -0
  149. data/lib/kanrisuru/core/system/commands/free.rb +25 -0
  150. data/lib/kanrisuru/core/system/commands/kernel_statistics.rb +21 -0
  151. data/lib/kanrisuru/core/system/commands/kill.rb +22 -0
  152. data/lib/kanrisuru/core/system/commands/last.rb +31 -0
  153. data/lib/kanrisuru/core/system/commands/load_average.rb +16 -0
  154. data/lib/kanrisuru/core/system/commands/load_env.rb +16 -0
  155. data/lib/kanrisuru/core/system/commands/lscpu.rb +17 -0
  156. data/lib/kanrisuru/core/system/commands/lsof.rb +16 -0
  157. data/lib/kanrisuru/core/system/commands/poweroff.rb +42 -0
  158. data/lib/kanrisuru/core/system/commands/ps.rb +35 -0
  159. data/lib/kanrisuru/core/system/commands/reboot.rb +42 -0
  160. data/lib/kanrisuru/core/system/commands/uptime.rb +18 -0
  161. data/lib/kanrisuru/core/system/commands/w.rb +24 -0
  162. data/lib/kanrisuru/core/system/commands.rb +34 -0
  163. data/lib/kanrisuru/core/system/parser.rb +11 -0
  164. data/lib/kanrisuru/core/system/parsers/kernel_statistics.rb +56 -0
  165. data/lib/kanrisuru/core/system/parsers/last.rb +64 -0
  166. data/lib/kanrisuru/core/system/parsers/load_average.rb +15 -0
  167. data/lib/kanrisuru/core/system/parsers/load_env.rb +24 -0
  168. data/lib/kanrisuru/core/system/parsers/lscpu.rb +90 -0
  169. data/lib/kanrisuru/core/system/parsers/lsof.rb +62 -0
  170. data/lib/kanrisuru/core/system/parsers/ps.rb +71 -0
  171. data/lib/kanrisuru/core/system/parsers/uptime.rb +38 -0
  172. data/lib/kanrisuru/core/system/parsers/w.rb +30 -0
  173. data/lib/kanrisuru/core/system/types.rb +108 -0
  174. data/lib/kanrisuru/core/system.rb +4 -687
  175. data/lib/kanrisuru/core/transfer/commands/download.rb +26 -0
  176. data/lib/kanrisuru/core/transfer/commands/upload.rb +23 -0
  177. data/lib/kanrisuru/core/transfer/commands/wget.rb +168 -0
  178. data/lib/kanrisuru/core/transfer/commands.rb +5 -0
  179. data/lib/kanrisuru/core/transfer/constants.rb +10 -0
  180. data/lib/kanrisuru/core/transfer.rb +3 -199
  181. data/lib/kanrisuru/core/user/commands/create_user.rb +49 -0
  182. data/lib/kanrisuru/core/user/commands/delete_user.rb +20 -0
  183. data/lib/kanrisuru/core/user/commands/get_uid.rb +15 -0
  184. data/lib/kanrisuru/core/user/commands/get_user.rb +48 -0
  185. data/lib/kanrisuru/core/user/commands/is_user.rb +14 -0
  186. data/lib/kanrisuru/core/user/commands/update_user.rb +54 -0
  187. data/lib/kanrisuru/core/user/commands.rb +8 -0
  188. data/lib/kanrisuru/core/user/parser.rb +4 -0
  189. data/lib/kanrisuru/core/user/parsers/getent.rb +17 -0
  190. data/lib/kanrisuru/core/user/parsers/groups.rb +17 -0
  191. data/lib/kanrisuru/core/user/types.rb +11 -0
  192. data/lib/kanrisuru/core/user.rb +4 -182
  193. data/lib/kanrisuru/core/yum/commands/autoremove.rb +14 -0
  194. data/lib/kanrisuru/core/yum/commands/clean.rb +23 -0
  195. data/lib/kanrisuru/core/yum/commands/erase.rb +20 -0
  196. data/lib/kanrisuru/core/yum/commands/info.rb +21 -0
  197. data/lib/kanrisuru/core/yum/commands/install.rb +18 -0
  198. data/lib/kanrisuru/core/yum/commands/list.rb +30 -0
  199. data/lib/kanrisuru/core/yum/commands/localinstall.rb +22 -0
  200. data/lib/kanrisuru/core/yum/commands/remove.rb +20 -0
  201. data/lib/kanrisuru/core/yum/commands/repolist.rb +20 -0
  202. data/lib/kanrisuru/core/yum/commands/search.rb +21 -0
  203. data/lib/kanrisuru/core/yum/commands/update.rb +14 -0
  204. data/lib/kanrisuru/core/yum/commands/upgrade.rb +14 -0
  205. data/lib/kanrisuru/core/yum/commands.rb +39 -0
  206. data/lib/kanrisuru/core/yum/parser.rb +7 -0
  207. data/lib/kanrisuru/core/yum/parsers/base.rb +31 -0
  208. data/lib/kanrisuru/core/yum/parsers/info.rb +69 -0
  209. data/lib/kanrisuru/core/yum/parsers/list.rb +24 -0
  210. data/lib/kanrisuru/core/yum/parsers/repolist.rb +60 -0
  211. data/lib/kanrisuru/core/yum/parsers/search.rb +30 -0
  212. data/lib/kanrisuru/core/yum/types.rb +41 -0
  213. data/lib/kanrisuru/core/yum.rb +4 -347
  214. data/lib/kanrisuru/core/zypper/commands/add_lock.rb +22 -0
  215. data/lib/kanrisuru/core/zypper/commands/add_repo.rb +38 -0
  216. data/lib/kanrisuru/core/zypper/commands/add_service.rb +26 -0
  217. data/lib/kanrisuru/core/zypper/commands/clean_cache.rb +22 -0
  218. data/lib/kanrisuru/core/zypper/commands/clean_locks.rb +17 -0
  219. data/lib/kanrisuru/core/zypper/commands/dist_upgrade.rb +25 -0
  220. data/lib/kanrisuru/core/zypper/commands/info.rb +25 -0
  221. data/lib/kanrisuru/core/zypper/commands/install.rb +39 -0
  222. data/lib/kanrisuru/core/zypper/commands/install_new_recommends.rb +23 -0
  223. data/lib/kanrisuru/core/zypper/commands/list_locks.rb +22 -0
  224. data/lib/kanrisuru/core/zypper/commands/list_patches.rb +34 -0
  225. data/lib/kanrisuru/core/zypper/commands/list_repos.rb +21 -0
  226. data/lib/kanrisuru/core/zypper/commands/list_services.rb +21 -0
  227. data/lib/kanrisuru/core/zypper/commands/list_updates.rb +30 -0
  228. data/lib/kanrisuru/core/zypper/commands/modify_repo.rb +48 -0
  229. data/lib/kanrisuru/core/zypper/commands/modify_service.rb +40 -0
  230. data/lib/kanrisuru/core/zypper/commands/patch.rb +40 -0
  231. data/lib/kanrisuru/core/zypper/commands/patch_check.rb +29 -0
  232. data/lib/kanrisuru/core/zypper/commands/purge_kernels.rb +18 -0
  233. data/lib/kanrisuru/core/zypper/commands/refresh_repos.rb +24 -0
  234. data/lib/kanrisuru/core/zypper/commands/refresh_services.rb +21 -0
  235. data/lib/kanrisuru/core/zypper/commands/remove.rb +26 -0
  236. data/lib/kanrisuru/core/zypper/commands/remove_lock.rb +22 -0
  237. data/lib/kanrisuru/core/zypper/commands/remove_repo.rb +32 -0
  238. data/lib/kanrisuru/core/zypper/commands/remove_service.rb +21 -0
  239. data/lib/kanrisuru/core/zypper/commands/rename_repo.rb +20 -0
  240. data/lib/kanrisuru/core/zypper/commands/search.rb +52 -0
  241. data/lib/kanrisuru/core/zypper/commands/source_install.rb +22 -0
  242. data/lib/kanrisuru/core/zypper/commands/update.rb +27 -0
  243. data/lib/kanrisuru/core/zypper/commands/verify.rb +23 -0
  244. data/lib/kanrisuru/core/zypper/commands.rb +109 -0
  245. data/lib/kanrisuru/core/zypper/constants.rb +19 -0
  246. data/lib/kanrisuru/core/zypper/parser.rb +11 -0
  247. data/lib/kanrisuru/core/zypper/parsers/base.rb +18 -0
  248. data/lib/kanrisuru/core/zypper/parsers/info.rb +77 -0
  249. data/lib/kanrisuru/core/zypper/parsers/list_locks.rb +36 -0
  250. data/lib/kanrisuru/core/zypper/parsers/list_patches.rb +40 -0
  251. data/lib/kanrisuru/core/zypper/parsers/list_repos.rb +37 -0
  252. data/lib/kanrisuru/core/zypper/parsers/list_services.rb +36 -0
  253. data/lib/kanrisuru/core/zypper/parsers/list_updates.rb +32 -0
  254. data/lib/kanrisuru/core/zypper/parsers/patch_check.rb +34 -0
  255. data/lib/kanrisuru/core/zypper/parsers/search.rb +37 -0
  256. data/lib/kanrisuru/core/zypper/types.rb +88 -0
  257. data/lib/kanrisuru/core/zypper.rb +5 -998
  258. data/lib/kanrisuru/os_package.rb +2 -0
  259. data/lib/kanrisuru/result.rb +15 -0
  260. data/lib/kanrisuru/version.rb +1 -1
  261. data/spec/functional/core/archive_spec.rb +1 -1
  262. data/spec/functional/core/disk_spec.rb +77 -0
  263. data/spec/functional/core/dmi_spec.rb +78 -0
  264. data/spec/functional/core/file_spec.rb +284 -0
  265. data/spec/functional/core/group_spec.rb +62 -0
  266. data/spec/functional/core/ip/ip_address_label_spec.rb +81 -0
  267. data/spec/functional/core/ip/ip_address_spec.rb +95 -0
  268. data/spec/functional/core/ip/ip_link_spec.rb +814 -0
  269. data/spec/functional/core/ip/ip_maddress_spec.rb +78 -0
  270. data/spec/functional/core/ip/ip_neighbour_spec.rb +119 -0
  271. data/spec/functional/core/ip/ip_route_spec.rb +174 -0
  272. data/spec/functional/core/ip/ip_rule_spec.rb +75 -0
  273. data/spec/functional/core/ip/ip_spec.rb +27 -0
  274. data/spec/functional/core/system_spec.rb +135 -0
  275. data/spec/functional/core/user_spec.rb +97 -0
  276. data/spec/functional/result_spec.rb +91 -44
  277. data/spec/helper/stub_network.rb +6 -2
  278. data/spec/support/shared_examples/integration/core/transfer.rb +1 -1
  279. data/spec/unit/command_spec.rb +2 -0
  280. data/spec/unit/core/ip_spec.rb +12 -0
  281. data/spec/unit/util_spec.rb +16 -0
  282. metadata +253 -4
@@ -0,0 +1,152 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Kanrisuru
4
+ module Core
5
+ module IP
6
+ def ip_route(action, opts)
7
+ case action
8
+ when 'show', 'list'
9
+ version = ip_version.to_i
10
+ command = ip_route_show(opts, version)
11
+ when 'flush'
12
+ command = ip_route_flush(opts)
13
+ when 'add', 'change', 'append', 'del', 'delete', 'replace'
14
+ command = ip_route_modify(action, opts)
15
+ when 'get'
16
+ command = ip_route_get(opts)
17
+ end
18
+
19
+ execute_shell(command)
20
+
21
+ Kanrisuru::Result.new(command) do |cmd|
22
+ Parser::Route.parse(cmd, action, version)
23
+ end
24
+ end
25
+
26
+ def ip_route_show(opts, version)
27
+ command = Kanrisuru::Command.new('ip')
28
+ command.append_flag('-json') if version >= IPROUTE2_JSON_VERSION
29
+ command.append_arg('-family', opts[:family])
30
+ command << 'route show'
31
+
32
+ ip_route_common_opts(command, opts)
33
+
34
+ command
35
+ end
36
+
37
+ def ip_route_modify(action, opts)
38
+ command = Kanrisuru::Command.new('ip route')
39
+ command << action
40
+
41
+ command.append_arg('to', opts[:to])
42
+ command.append_arg('tos', opts[:tos])
43
+ command.append_arg('dsfield', opts[:dsfield])
44
+ command.append_arg('metric', opts[:metric])
45
+ command.append_arg('preference', opts[:preference])
46
+ command.append_arg('table', opts[:table])
47
+ command.append_arg('vrf', opts[:vrf])
48
+ command.append_arg('dev', opts[:dev])
49
+ command.append_arg('via', opts[:via])
50
+ command.append_arg('src', opts[:src])
51
+ command.append_arg('realm', opts[:realm])
52
+
53
+ if Kanrisuru::Util.present?(opts[:mtu])
54
+ if Kanrisuru::Util.present?(opts[:mtu_lock])
55
+ command.append_arg('mtu lock', opts[:mtu])
56
+ else
57
+ command.append_arg('mtu', opts[:mtu])
58
+ end
59
+ end
60
+
61
+ command.append_arg('window', opts[:window])
62
+ command.append_arg('rtt', opts[:rtt])
63
+ command.append_arg('rttvar', opts[:rttvar])
64
+ command.append_arg('rto_min', opts[:rto_min])
65
+ command.append_arg('ssthresh', opts[:ssthresh])
66
+ command.append_arg('cwnd', opts[:cwnd])
67
+ command.append_arg('initcwnd', opts[:initcwnd])
68
+ command.append_arg('initrwnd', opts[:initrwnd])
69
+ command.append_arg('features', opts[:features])
70
+ command.append_arg('quickack', opts[:quickack])
71
+ command.append_arg('fastopen_no_cookie', opts[:fastopen_no_cookie])
72
+
73
+ if Kanrisuru::Util.present?(opts[:congctl])
74
+ if Kanrisuru::Util.present?(opts[:congctl_lock])
75
+ command.append_arg('congctl lock', opts[:congctl])
76
+ else
77
+ command.append_arg('congctl', opts[:congctl])
78
+ end
79
+ end
80
+
81
+ command.append_arg('advmss', opts[:advmss])
82
+ command.append_arg('reordering', opts[:reordering])
83
+
84
+ if Kanrisuru::Util.present?(opts[:next_hop])
85
+ next_hop = opts[:next_hop]
86
+
87
+ command << 'next_hop'
88
+ command.append_arg('via', next_hop[:via])
89
+ command.append_arg('dev', next_hop[:dev])
90
+ command.append_arg('weight', next_hop[:weight])
91
+ end
92
+
93
+ command.append_arg('scope', opts[:scope])
94
+ command.append_arg('protocol', opts[:protocol])
95
+ command.append_flag('onlink', opts[:onlink])
96
+ command.append_arg('pref', opts[:pref])
97
+ command.append_arg('nhid', opts[:nhid])
98
+ command
99
+ end
100
+
101
+ def ip_route_flush(opts)
102
+ command = Kanrisuru::Command.new('ip')
103
+ command.append_arg('-family', opts[:family])
104
+ command << 'route flush'
105
+
106
+ ip_route_common_opts(command, opts)
107
+
108
+ command
109
+ end
110
+
111
+ def ip_route_get(opts)
112
+ command = Kanrisuru::Command.new('ip route get')
113
+
114
+ command.append_flag('fibmatch', opts[:fibmatch])
115
+ command.append_arg('to', opts[:to])
116
+ command.append_arg('from', opts[:from])
117
+ command.append_arg('tos', opts[:tos])
118
+ command.append_arg('dsfield', opts[:dsfield])
119
+ command.append_arg('iif', opts[:iif])
120
+ command.append_arg('oif', opts[:oif])
121
+ command.append_arg('mark', opts[:mark])
122
+ command.append_arg('vrf', opts[:vrf])
123
+ command.append_arg('ipproto', opts[:ipproto])
124
+ command.append_arg('sport', opts[:sport])
125
+ command.append_arg('dport', opts[:dport])
126
+
127
+ command.append_flag('connected', opts[:connected])
128
+ command
129
+ end
130
+
131
+ def ip_route_common_opts(command, opts)
132
+ command.append_arg('to', opts[:to])
133
+ command.append_arg('dev', opts[:dev])
134
+ command.append_arg('protocol', opts[:protocol])
135
+ command.append_arg('type', opts[:type])
136
+ command.append_arg('table', opts[:table])
137
+ command.append_arg('tos', opts[:tos])
138
+ command.append_arg('dsfield', opts[:dsfield])
139
+ command.append_arg('via', opts[:via])
140
+ command.append_arg('vrf', opts[:vrf])
141
+ command.append_arg('src', opts[:src])
142
+
143
+ command.append_arg('realm', opts[:realm])
144
+ command.append_arg('realms', opts[:realms])
145
+ command.append_arg('scope', opts[:scope])
146
+
147
+ command.append_flag('cloned', opts[:cloned])
148
+ command.append_flag('cached', opts[:cached])
149
+ end
150
+ end
151
+ end
152
+ end
@@ -0,0 +1,57 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Kanrisuru
4
+ module Core
5
+ module IP
6
+ def ip_rule(action, opts)
7
+ case action
8
+ when 'show', 'list'
9
+ version = ip_version.to_i
10
+ command = ip_rule_show(opts, version)
11
+ when 'flush'
12
+ command = ip_rule_flush(opts)
13
+ when 'add', 'delete', 'del'
14
+ command = ip_rule_modify(action, opts)
15
+ end
16
+
17
+ execute_shell(command)
18
+
19
+ Kanrisuru::Result.new(command) do |cmd|
20
+ Parser::Rule.parse(cmd, action, version)
21
+ end
22
+ end
23
+
24
+ def ip_rule_modify(action, opts)
25
+ command = Kanrisuru::Command.new('ip rule')
26
+ command << action
27
+
28
+ command.append_arg('type', opts[:type])
29
+ command.append_arg('from', opts[:from])
30
+ command.append_arg('to', opts[:to])
31
+ command.append_arg('iif', opts[:iif])
32
+ command.append_arg('tos', opts[:tos])
33
+ command.append_arg('dsfield', opts[:dsfield])
34
+ command.append_arg('fwmark', opts[:fwmark])
35
+ command.append_arg('priority', opts[:priority])
36
+ command.append_arg('table', opts[:table])
37
+ command.append_arg('realms', opts[:realms])
38
+ command.append_arg('nat', opts[:nat])
39
+ command
40
+ end
41
+
42
+ def ip_rule_flush(opts)
43
+ command = Kanrisuru::Command.new('ip rule flush')
44
+ command.append_arg('protocol', opts[:protocol])
45
+ command
46
+ end
47
+
48
+ def ip_rule_show(_opts, version)
49
+ command = Kanrisuru::Command.new('ip')
50
+ command.append_flag('-json') if version >= IPROUTE2_JSON_VERSION
51
+
52
+ command << 'rule show'
53
+ command
54
+ end
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'commands/address'
4
+ require_relative 'commands/address_label'
5
+ require_relative 'commands/link_type_opts'
6
+ require_relative 'commands/link_set_opts'
7
+ require_relative 'commands/link'
8
+ require_relative 'commands/maddress'
9
+ require_relative 'commands/neighbour'
10
+ require_relative 'commands/route'
11
+ require_relative 'commands/rule'
12
+
13
+ module Kanrisuru
14
+ module Core
15
+ module IP
16
+ def ip_version
17
+ command = Kanrisuru::Command.new('ip -V')
18
+ execute_shell(command)
19
+
20
+ Kanrisuru::Result.new(command) do |cmd|
21
+ Parser::Version.parse(cmd)
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Kanrisuru
4
+ module Core
5
+ module IP
6
+ IPROUTE2_JSON_VERSION = 180_129
7
+
8
+ IP_ROUTE_TYPES = %w[
9
+ unicast unreachable blackhole prohibit local
10
+ broadcast throw nat via anycast multicast
11
+ ].freeze
12
+
13
+ IP_FAMILIES = %w[inet inet6 link].freeze
14
+ IP_SCOPES = %w[global site link host].freeze
15
+ IP_LINK_TYPES = %w[
16
+ vlan veth vcan vxcan dummy ifb macvlan macvtap
17
+ bridge bond team ipoib ip6tnl ipip sit vxlan
18
+ gre gretap erspan ip6gre ip6gretap ip6erspan
19
+ vti nlmon team_slave bond_slave bridge_slave
20
+ ipvlan ipvtap geneve vrf macsec netdevsim rmnet
21
+ xfrm bareudp hsr
22
+ ].freeze
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'parsers/base'
4
+ require_relative 'parsers/version'
5
+ require_relative 'parsers/address'
6
+ require_relative 'parsers/address_label'
7
+ require_relative 'parsers/link'
8
+ require_relative 'parsers/maddress'
9
+ require_relative 'parsers/neighbour'
10
+ require_relative 'parsers/route'
11
+ require_relative 'parsers/rule'
@@ -0,0 +1,104 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Kanrisuru
4
+ module Core
5
+ module IP
6
+ module Parser
7
+ class Address < Base
8
+ class << self
9
+ def parse(command, action, version)
10
+ return unless %w[show list].include?(action)
11
+
12
+ if version >= Kanrisuru::Core::IP::IPROUTE2_JSON_VERSION
13
+ begin
14
+ ip_address_result_json(command.to_json)
15
+ rescue JSON::ParserError
16
+ ip_address_result_parse(command.to_a)
17
+ end
18
+ else
19
+ ip_address_result_parse(command.to_a)
20
+ end
21
+ end
22
+
23
+ def ip_address_result_parse(lines)
24
+ rows = []
25
+ current_row = nil
26
+
27
+ lines.each.with_index do |line, index|
28
+ case line
29
+ when /^\d+:\s/
30
+ rows << current_row unless current_row.nil?
31
+
32
+ current_row = Kanrisuru::Core::IP::IPAddressProperty.new
33
+ current_row.address_info = []
34
+
35
+ parse_ip_row(current_row, line)
36
+ when /^link/
37
+ parse_link(current_row, line)
38
+ when /^inet/
39
+ parse_address_info(current_row, line)
40
+ when /^valid_lft/
41
+ parse_valid(current_row, line)
42
+ when /^RX:/
43
+ parse_rx(current_row, lines[index + 1])
44
+ when /^TX:/
45
+ parse_tx(current_row, lines[index + 1])
46
+ end
47
+ end
48
+
49
+ rows << current_row
50
+ rows
51
+ end
52
+
53
+ def ip_address_result_json(rows)
54
+ result = []
55
+ rows.each do |row|
56
+ next if row['ifindex'].instance_of?(NilClass)
57
+
58
+ new_row = Kanrisuru::Core::IP::IPAddressProperty.new(
59
+ row['ifindex'], row['ifname'], row['flags'], row['mtu'], row['qdisc'],
60
+ row['operstate'], row['group'], row['txqlen'], row['link_type'], row['address'], []
61
+ )
62
+
63
+ if row.key?('stats64')
64
+ rx = row['stats64']['rx']
65
+ tx = row['stats64']['tx']
66
+
67
+ new_row[:stats] = Kanrisuru::Core::IP::IPStats.new(
68
+ Kanrisuru::Core::IP::IPStatRX.new(
69
+ rx['bytes'], rx['packets'], rx['errors'],
70
+ rx['dropped'], rx['over_errors'], rx['multicast']
71
+ ),
72
+ Kanrisuru::Core::IP::IPStatTX.new(
73
+ tx['bytes'], tx['packets'], tx['errors'],
74
+ tx['dropped'], tx['carrier_errors'], tx['collisions']
75
+ )
76
+ )
77
+ end
78
+
79
+ addr_info = row['addr_info'] || []
80
+
81
+ new_row[:address_info] = addr_info.map do |address|
82
+ dynamic = address['dynamic'] == true || address['dynamic'] == 'true'
83
+
84
+ Kanrisuru::Core::IP::IPAddressInfo.new(
85
+ address['family'],
86
+ IPAddr.new(address['local']),
87
+ address['broadcast'],
88
+ address['scope'],
89
+ dynamic,
90
+ address['valid_life_time'], address['preferred_life_time']
91
+ )
92
+ end
93
+
94
+ result << new_row
95
+ end
96
+
97
+ result
98
+ end
99
+ end
100
+ end
101
+ end
102
+ end
103
+ end
104
+ end
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Kanrisuru
4
+ module Core
5
+ module IP
6
+ module Parser
7
+ class AddressLabel < Base
8
+ class << self
9
+ def parse(command, action, version)
10
+ if %w[show list].include?(action)
11
+ if version >= Kanrisuru::Core::IP::IPROUTE2_JSON_VERSION
12
+ begin
13
+ ip_address_label_result_json(command.to_json)
14
+ rescue JSON::ParserError
15
+ ip_address_label_result_parse(command.to_a)
16
+ end
17
+ else
18
+ ip_address_label_result_parse(command.to_a)
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,166 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Kanrisuru
4
+ module Core
5
+ module IP
6
+ module Parser
7
+ class Base
8
+ class << self
9
+ def ip_address_label_result_json(rows)
10
+ result = []
11
+
12
+ rows.each do |row|
13
+ new_row = Kanrisuru::Core::IP::IPAddressLabel.new(
14
+ row['address'], row['prefixlen'], row['label']
15
+ )
16
+
17
+ result << new_row
18
+ end
19
+
20
+ result
21
+ end
22
+
23
+ def ip_address_label_result_parse(lines)
24
+ lines.map do |line|
25
+ _, addr, _, label = line.split(/\s/)
26
+ address, prefix_length = addr.split(%r{/})
27
+
28
+ Kanrisuru::Core::IP::IPAddressLabel.new(address, prefix_length.to_i, label)
29
+ end
30
+ end
31
+
32
+ def parse_alias(row, line)
33
+ _, alias_string = line.split('alias')
34
+ row.alias = alias_string
35
+ end
36
+
37
+ def parse_ip_maddr_name(row, line)
38
+ index = line.match(/^\d+/).to_s.to_i
39
+ _, name = line.split(/^\d+:\s/)
40
+
41
+ row.index = index
42
+ row.name = name
43
+ row.maddr = []
44
+ end
45
+
46
+ def parse_ip_row(row, line)
47
+ index = line.match(/^\d+/).to_s.to_i
48
+ _, string = line.split(/^\d+:\s/)
49
+ name = string.match(/^\w+/).to_s
50
+ _, string = string.split(/^\w+:\s/)
51
+ _, flags, string = string.split(/(<.+>)\s/)
52
+
53
+ flags = flags.gsub(/<?>?/, '')
54
+ flags = flags.split(',')
55
+
56
+ row.index = index
57
+ row.name = name
58
+ row.flags = flags
59
+
60
+ values = string.split(/\s/)
61
+ values.each.with_index do |_, i|
62
+ case values[i]
63
+ when 'mtu'
64
+ row.mtu = values[i + 1].to_i
65
+ when 'qdisc'
66
+ row.qdisc = values[i + 1]
67
+ when 'state'
68
+ row.state = values[i + 1]
69
+ when 'group'
70
+ row.group = values[i + 1]
71
+ when 'qlen'
72
+ row.qlen = values[i + 1].to_i
73
+ when 'mode'
74
+ row.link_mode = values[i + 1]
75
+ end
76
+ end
77
+ end
78
+
79
+ def parse_link(row, line)
80
+ _, string = line.split(%r{^link/})
81
+ link_type, mac_address = string.split
82
+
83
+ row.link_type = link_type
84
+ row.mac_address = mac_address
85
+ end
86
+
87
+ def parse_address_info(row, line)
88
+ values = line.split
89
+ address_info = Kanrisuru::Core::IP::IPAddressInfo.new
90
+
91
+ values.each.with_index do |_, index|
92
+ case values[index]
93
+ when 'inet', 'inet6'
94
+ address_info.family = values[index]
95
+ address_info.ip = IPAddr.new(values[index + 1].split('/')[0])
96
+ when 'brd'
97
+ address_info.broadcast = values[index + 1]
98
+ when 'scope'
99
+ address_info.scope = values[index + 1]
100
+ when 'dynamic'
101
+ address_info.dynamic = true
102
+ end
103
+ end
104
+
105
+ row.address_info << address_info
106
+ end
107
+
108
+ def parse_valid(row, line)
109
+ values = line.split
110
+
111
+ values.each.with_index do |_, index|
112
+ case values[index]
113
+ when 'valid_lft'
114
+ row.address_info.last.valid_life_time = values[index + 1]
115
+ when 'preferred_lft'
116
+ row.address_info.last.preferred_life_time = values[index + 1]
117
+ end
118
+ end
119
+ end
120
+
121
+ def parse_rx(row, line)
122
+ values = line.split
123
+
124
+ bytes = values[0].to_i
125
+ packets = values[1].to_i
126
+ errors = values[2].to_i
127
+ dropped = values[3].to_i
128
+ over_errors = values[4].to_i
129
+ multicast = values[5].to_i
130
+
131
+ row.stats = Kanrisuru::Core::IP::IPStats.new
132
+ row.stats.rx = Kanrisuru::Core::IP::IPStatRX.new(
133
+ bytes,
134
+ packets,
135
+ errors,
136
+ dropped,
137
+ over_errors,
138
+ multicast
139
+ )
140
+ end
141
+
142
+ def parse_tx(row, line)
143
+ values = line.split
144
+
145
+ bytes = values[0].to_i
146
+ packets = values[1].to_i
147
+ errors = values[2].to_i
148
+ dropped = values[3].to_i
149
+ carrier_errors = values[4].to_i
150
+ collisions = values[5].to_i
151
+
152
+ row.stats.tx = Kanrisuru::Core::IP::IPStatTX.new(
153
+ bytes,
154
+ packets,
155
+ errors,
156
+ dropped,
157
+ carrier_errors,
158
+ collisions
159
+ )
160
+ end
161
+ end
162
+ end
163
+ end
164
+ end
165
+ end
166
+ end
@@ -0,0 +1,86 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Kanrisuru
4
+ module Core
5
+ module IP
6
+ module Parser
7
+ class Link < Base
8
+ class << self
9
+ def parse(command, action, version)
10
+ return unless %w[show list].include?(action)
11
+
12
+ if version >= Kanrisuru::Core::IP::IPROUTE2_JSON_VERSION
13
+ begin
14
+ ip_link_result_json(command.to_json)
15
+ rescue JSON::ParserError
16
+ ip_link_result_parse(command.to_a)
17
+ end
18
+ else
19
+ ip_link_result_parse(command.to_a)
20
+ end
21
+ end
22
+
23
+ def ip_link_result_parse(lines)
24
+ rows = []
25
+ current_row = nil
26
+
27
+ lines.each.with_index do |line, index|
28
+ case line
29
+ when /^\d+:\s/
30
+ rows << current_row unless current_row.nil?
31
+
32
+ current_row = Kanrisuru::Core::IP::IPLinkProperty.new
33
+ parse_ip_row(current_row, line)
34
+ when /^link/
35
+ parse_link(current_row, line)
36
+ when /^alias/
37
+ parse_alias(current_row, line)
38
+ when /^RX:/
39
+ parse_rx(current_row, lines[index + 1])
40
+ when /^TX:/
41
+ parse_tx(current_row, lines[index + 1])
42
+ end
43
+ end
44
+
45
+ rows << current_row
46
+ rows
47
+ end
48
+
49
+ def ip_link_result_json(rows)
50
+ result = []
51
+ rows.each do |row|
52
+ next if row['ifindex'].instance_of?(NilClass)
53
+
54
+ new_row = Kanrisuru::Core::IP::IPLinkProperty.new(
55
+ row['ifindex'], row['ifname'], row['flags'], row['mtu'], row['qdisc'],
56
+ row['operstate'], row['group'], row['txqlen'], row['linkmode'],
57
+ row['link_type'], row['address'], row['ifalias'], nil
58
+ )
59
+
60
+ if row.key?('stats64')
61
+ rx = row['stats64']['rx']
62
+ tx = row['stats64']['tx']
63
+
64
+ new_row[:stats] = Kanrisuru::Core::IP::IPStats.new(
65
+ Kanrisuru::Core::IP::IPStatRX.new(
66
+ rx['bytes'], rx['packets'], rx['errors'],
67
+ rx['dropped'], rx['over_errors'], rx['multicast']
68
+ ),
69
+ Kanrisuru::Core::IP::IPStatTX.new(
70
+ tx['bytes'], tx['packets'], tx['errors'],
71
+ tx['dropped'], tx['carrier_errors'], tx['collisions']
72
+ )
73
+ )
74
+ end
75
+
76
+ result << new_row
77
+ end
78
+
79
+ result
80
+ end
81
+ end
82
+ end
83
+ end
84
+ end
85
+ end
86
+ end