kanrisuru 0.13.0 → 0.14.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (252) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +4 -0
  3. data/lib/kanrisuru/core/apt/commands/autoclean.rb +13 -0
  4. data/lib/kanrisuru/core/apt/commands/autoremove.rb +15 -0
  5. data/lib/kanrisuru/core/apt/commands/clean.rb +13 -0
  6. data/lib/kanrisuru/core/apt/commands/full_upgrade.rb +14 -0
  7. data/lib/kanrisuru/core/apt/commands/install.rb +22 -0
  8. data/lib/kanrisuru/core/apt/commands/list.rb +21 -0
  9. data/lib/kanrisuru/core/apt/commands/purge.rb +18 -0
  10. data/lib/kanrisuru/core/apt/commands/remove.rb +18 -0
  11. data/lib/kanrisuru/core/apt/commands/search.rb +18 -0
  12. data/lib/kanrisuru/core/apt/commands/show.rb +21 -0
  13. data/lib/kanrisuru/core/apt/commands/update.rb +14 -0
  14. data/lib/kanrisuru/core/apt/commands/upgrade.rb +14 -0
  15. data/lib/kanrisuru/core/apt/commands.rb +14 -0
  16. data/lib/kanrisuru/core/apt/parser.rb +6 -0
  17. data/lib/kanrisuru/core/apt/parsers/base.rb +51 -0
  18. data/lib/kanrisuru/core/apt/parsers/list.rb +28 -0
  19. data/lib/kanrisuru/core/apt/parsers/search.rb +32 -0
  20. data/lib/kanrisuru/core/apt/parsers/show.rb +90 -0
  21. data/lib/kanrisuru/core/apt/types.rb +36 -0
  22. data/lib/kanrisuru/core/apt.rb +4 -284
  23. data/lib/kanrisuru/core/archive/commands/tar.rb +126 -0
  24. data/lib/kanrisuru/core/archive/commands.rb +3 -0
  25. data/lib/kanrisuru/core/archive/types.rb +9 -0
  26. data/lib/kanrisuru/core/archive.rb +3 -121
  27. data/lib/kanrisuru/core/disk/commands/blkid.rb +35 -0
  28. data/lib/kanrisuru/core/disk/commands/df.rb +26 -0
  29. data/lib/kanrisuru/core/disk/commands/du.rb +24 -0
  30. data/lib/kanrisuru/core/disk/commands/lsblk.rb +54 -0
  31. data/lib/kanrisuru/core/disk/commands.rb +6 -0
  32. data/lib/kanrisuru/core/disk/parser.rb +6 -0
  33. data/lib/kanrisuru/core/disk/parsers/blkid.rb +72 -0
  34. data/lib/kanrisuru/core/disk/parsers/df.rb +33 -0
  35. data/lib/kanrisuru/core/disk/parsers/du.rb +25 -0
  36. data/lib/kanrisuru/core/disk/parsers/lsblk.rb +96 -0
  37. data/lib/kanrisuru/core/disk/types.rb +21 -0
  38. data/lib/kanrisuru/core/disk.rb +5 -290
  39. data/lib/kanrisuru/core/dmi/commands/dmi.rb +42 -0
  40. data/lib/kanrisuru/core/dmi/commands.rb +3 -0
  41. data/lib/kanrisuru/core/dmi/parser.rb +3 -0
  42. data/lib/kanrisuru/core/dmi/parsers/dmi.rb +149 -0
  43. data/lib/kanrisuru/core/dmi/types.rb +361 -0
  44. data/lib/kanrisuru/core/dmi.rb +4 -522
  45. data/lib/kanrisuru/core/file/commands/chmod.rb +29 -0
  46. data/lib/kanrisuru/core/file/commands/chown.rb +35 -0
  47. data/lib/kanrisuru/core/file/commands/copy.rb +56 -0
  48. data/lib/kanrisuru/core/file/commands/link.rb +25 -0
  49. data/lib/kanrisuru/core/file/commands/mkdir.rb +37 -0
  50. data/lib/kanrisuru/core/file/commands/move.rb +48 -0
  51. data/lib/kanrisuru/core/file/commands/rm.rb +38 -0
  52. data/lib/kanrisuru/core/file/commands/symlink.rb +46 -0
  53. data/lib/kanrisuru/core/file/commands/touch.rb +33 -0
  54. data/lib/kanrisuru/core/file/commands/unlink.rb +13 -0
  55. data/lib/kanrisuru/core/file/commands/wc.rb +16 -0
  56. data/lib/kanrisuru/core/file/commands.rb +29 -0
  57. data/lib/kanrisuru/core/file/parser.rb +3 -0
  58. data/lib/kanrisuru/core/file/parsers/wc.rb +16 -0
  59. data/lib/kanrisuru/core/file/types.rb +9 -0
  60. data/lib/kanrisuru/core/file.rb +4 -312
  61. data/lib/kanrisuru/core/find/commands/find.rb +97 -0
  62. data/lib/kanrisuru/core/find/commands.rb +3 -0
  63. data/lib/kanrisuru/core/find/constants.rb +9 -0
  64. data/lib/kanrisuru/core/find/parser.rb +3 -0
  65. data/lib/kanrisuru/core/find/parsers/find.rb +18 -0
  66. data/lib/kanrisuru/core/find/types.rb +9 -0
  67. data/lib/kanrisuru/core/find.rb +5 -97
  68. data/lib/kanrisuru/core/group/commands/create_group.rb +21 -0
  69. data/lib/kanrisuru/core/group/commands/delete_group.rb +16 -0
  70. data/lib/kanrisuru/core/group/commands/get_gid.rb +17 -0
  71. data/lib/kanrisuru/core/group/commands/get_group.rb +29 -0
  72. data/lib/kanrisuru/core/group/commands/is_group.rb +14 -0
  73. data/lib/kanrisuru/core/group/commands/update_group.rb +23 -0
  74. data/lib/kanrisuru/core/group/commands.rb +8 -0
  75. data/lib/kanrisuru/core/group/parser.rb +4 -0
  76. data/lib/kanrisuru/core/group/parsers/gid.rb +15 -0
  77. data/lib/kanrisuru/core/group/parsers/group.rb +15 -0
  78. data/lib/kanrisuru/core/group/types.rb +10 -0
  79. data/lib/kanrisuru/core/group.rb +4 -81
  80. data/lib/kanrisuru/core/ip/commands/address.rb +69 -0
  81. data/lib/kanrisuru/core/ip/commands/address_label.rb +38 -0
  82. data/lib/kanrisuru/core/ip/commands/link.rb +74 -0
  83. data/lib/kanrisuru/core/ip/commands/maddress.rb +33 -0
  84. data/lib/kanrisuru/core/ip/commands/neighbour.rb +55 -0
  85. data/lib/kanrisuru/core/ip/commands/route.rb +115 -0
  86. data/lib/kanrisuru/core/ip/commands/rule.rb +42 -0
  87. data/lib/kanrisuru/core/ip/commands.rb +24 -0
  88. data/lib/kanrisuru/core/ip/constants.rb +13 -0
  89. data/lib/kanrisuru/core/ip/parser.rb +10 -0
  90. data/lib/kanrisuru/core/ip/parsers/address.rb +104 -0
  91. data/lib/kanrisuru/core/ip/parsers/address_label.rb +27 -0
  92. data/lib/kanrisuru/core/ip/parsers/base.rb +166 -0
  93. data/lib/kanrisuru/core/ip/parsers/link.rb +86 -0
  94. data/lib/kanrisuru/core/ip/parsers/maddress.rb +85 -0
  95. data/lib/kanrisuru/core/ip/parsers/neighbour.rb +89 -0
  96. data/lib/kanrisuru/core/ip/parsers/route.rb +76 -0
  97. data/lib/kanrisuru/core/ip/parsers/rule.rb +60 -0
  98. data/lib/kanrisuru/core/ip/types.rb +46 -0
  99. data/lib/kanrisuru/core/ip.rb +5 -995
  100. data/lib/kanrisuru/core/mount/commands/mount.rb +65 -0
  101. data/lib/kanrisuru/core/mount/commands/umount.rb +35 -0
  102. data/lib/kanrisuru/core/mount/commands.rb +49 -0
  103. data/lib/kanrisuru/core/mount.rb +2 -125
  104. data/lib/kanrisuru/core/path/commands/ls.rb +26 -0
  105. data/lib/kanrisuru/core/path/commands/pwd.rb +16 -0
  106. data/lib/kanrisuru/core/path/commands/readlink.rb +22 -0
  107. data/lib/kanrisuru/core/path/commands/realpath.rb +18 -0
  108. data/lib/kanrisuru/core/path/commands/which.rb +19 -0
  109. data/lib/kanrisuru/core/path/commands/whoami.rb +16 -0
  110. data/lib/kanrisuru/core/path/commands.rb +8 -0
  111. data/lib/kanrisuru/core/path/parser.rb +4 -0
  112. data/lib/kanrisuru/core/path/parsers/ls.rb +53 -0
  113. data/lib/kanrisuru/core/path/parsers/which.rb +18 -0
  114. data/lib/kanrisuru/core/path/types.rb +12 -0
  115. data/lib/kanrisuru/core/path.rb +4 -121
  116. data/lib/kanrisuru/core/socket/commands/ss.rb +44 -0
  117. data/lib/kanrisuru/core/socket/commands.rb +3 -0
  118. data/lib/kanrisuru/core/socket/constants.rb +29 -0
  119. data/lib/kanrisuru/core/socket/parser.rb +3 -0
  120. data/lib/kanrisuru/core/socket/parsers/ss.rb +109 -0
  121. data/lib/kanrisuru/core/socket/types.rb +18 -0
  122. data/lib/kanrisuru/core/socket.rb +5 -164
  123. data/lib/kanrisuru/core/stat/commands/stat.rb +62 -0
  124. data/lib/kanrisuru/core/stat/commands.rb +3 -0
  125. data/lib/kanrisuru/core/stat/parser.rb +3 -0
  126. data/lib/kanrisuru/core/stat/parsers/stat.rb +34 -0
  127. data/lib/kanrisuru/core/stat/types.rb +14 -0
  128. data/lib/kanrisuru/core/stat.rb +4 -81
  129. data/lib/kanrisuru/core/stream/commands/cat.rb +25 -0
  130. data/lib/kanrisuru/core/stream/commands/echo.rb +20 -0
  131. data/lib/kanrisuru/core/stream/commands/head.rb +18 -0
  132. data/lib/kanrisuru/core/stream/commands/read_file_chunk.rb +21 -0
  133. data/lib/kanrisuru/core/stream/commands/sed.rb +23 -0
  134. data/lib/kanrisuru/core/stream/commands/tail.rb +18 -0
  135. data/lib/kanrisuru/core/stream/commands.rb +27 -0
  136. data/lib/kanrisuru/core/stream/parser.rb +4 -0
  137. data/lib/kanrisuru/core/stream/parsers/echo.rb +17 -0
  138. data/lib/kanrisuru/core/stream/parsers/sed.rb +17 -0
  139. data/lib/kanrisuru/core/stream.rb +3 -104
  140. data/lib/kanrisuru/core/system/commands/cpu_info.rb +32 -0
  141. data/lib/kanrisuru/core/system/commands/free.rb +25 -0
  142. data/lib/kanrisuru/core/system/commands/kernel_statistics.rb +21 -0
  143. data/lib/kanrisuru/core/system/commands/kill.rb +22 -0
  144. data/lib/kanrisuru/core/system/commands/last.rb +31 -0
  145. data/lib/kanrisuru/core/system/commands/load_average.rb +16 -0
  146. data/lib/kanrisuru/core/system/commands/load_env.rb +16 -0
  147. data/lib/kanrisuru/core/system/commands/lscpu.rb +17 -0
  148. data/lib/kanrisuru/core/system/commands/lsof.rb +16 -0
  149. data/lib/kanrisuru/core/system/commands/poweroff.rb +42 -0
  150. data/lib/kanrisuru/core/system/commands/ps.rb +35 -0
  151. data/lib/kanrisuru/core/system/commands/reboot.rb +42 -0
  152. data/lib/kanrisuru/core/system/commands/uptime.rb +18 -0
  153. data/lib/kanrisuru/core/system/commands/w.rb +24 -0
  154. data/lib/kanrisuru/core/system/commands.rb +34 -0
  155. data/lib/kanrisuru/core/system/parser.rb +11 -0
  156. data/lib/kanrisuru/core/system/parsers/kernel_statistics.rb +56 -0
  157. data/lib/kanrisuru/core/system/parsers/last.rb +64 -0
  158. data/lib/kanrisuru/core/system/parsers/load_average.rb +15 -0
  159. data/lib/kanrisuru/core/system/parsers/load_env.rb +24 -0
  160. data/lib/kanrisuru/core/system/parsers/lscpu.rb +90 -0
  161. data/lib/kanrisuru/core/system/parsers/lsof.rb +62 -0
  162. data/lib/kanrisuru/core/system/parsers/ps.rb +71 -0
  163. data/lib/kanrisuru/core/system/parsers/uptime.rb +38 -0
  164. data/lib/kanrisuru/core/system/parsers/w.rb +30 -0
  165. data/lib/kanrisuru/core/system/types.rb +108 -0
  166. data/lib/kanrisuru/core/system.rb +4 -687
  167. data/lib/kanrisuru/core/transfer/commands/download.rb +26 -0
  168. data/lib/kanrisuru/core/transfer/commands/upload.rb +23 -0
  169. data/lib/kanrisuru/core/transfer/commands/wget.rb +168 -0
  170. data/lib/kanrisuru/core/transfer/commands.rb +5 -0
  171. data/lib/kanrisuru/core/transfer/constants.rb +10 -0
  172. data/lib/kanrisuru/core/transfer.rb +3 -199
  173. data/lib/kanrisuru/core/user/commands/create_user.rb +57 -0
  174. data/lib/kanrisuru/core/user/commands/delete_user.rb +20 -0
  175. data/lib/kanrisuru/core/user/commands/get_uid.rb +15 -0
  176. data/lib/kanrisuru/core/user/commands/get_user.rb +48 -0
  177. data/lib/kanrisuru/core/user/commands/is_user.rb +14 -0
  178. data/lib/kanrisuru/core/user/commands/update_user.rb +63 -0
  179. data/lib/kanrisuru/core/user/commands.rb +8 -0
  180. data/lib/kanrisuru/core/user/parser.rb +4 -0
  181. data/lib/kanrisuru/core/user/parsers/getent.rb +17 -0
  182. data/lib/kanrisuru/core/user/parsers/groups.rb +17 -0
  183. data/lib/kanrisuru/core/user/types.rb +11 -0
  184. data/lib/kanrisuru/core/user.rb +4 -182
  185. data/lib/kanrisuru/core/yum/commands/autoremove.rb +14 -0
  186. data/lib/kanrisuru/core/yum/commands/clean.rb +23 -0
  187. data/lib/kanrisuru/core/yum/commands/erase.rb +20 -0
  188. data/lib/kanrisuru/core/yum/commands/info.rb +21 -0
  189. data/lib/kanrisuru/core/yum/commands/install.rb +18 -0
  190. data/lib/kanrisuru/core/yum/commands/list.rb +30 -0
  191. data/lib/kanrisuru/core/yum/commands/localinstall.rb +22 -0
  192. data/lib/kanrisuru/core/yum/commands/remove.rb +20 -0
  193. data/lib/kanrisuru/core/yum/commands/repolist.rb +20 -0
  194. data/lib/kanrisuru/core/yum/commands/search.rb +21 -0
  195. data/lib/kanrisuru/core/yum/commands/update.rb +14 -0
  196. data/lib/kanrisuru/core/yum/commands/upgrade.rb +14 -0
  197. data/lib/kanrisuru/core/yum/commands.rb +39 -0
  198. data/lib/kanrisuru/core/yum/parser.rb +7 -0
  199. data/lib/kanrisuru/core/yum/parsers/base.rb +31 -0
  200. data/lib/kanrisuru/core/yum/parsers/info.rb +69 -0
  201. data/lib/kanrisuru/core/yum/parsers/list.rb +24 -0
  202. data/lib/kanrisuru/core/yum/parsers/repolist.rb +60 -0
  203. data/lib/kanrisuru/core/yum/parsers/search.rb +30 -0
  204. data/lib/kanrisuru/core/yum/types.rb +41 -0
  205. data/lib/kanrisuru/core/yum.rb +4 -347
  206. data/lib/kanrisuru/core/zypper/commands/add_lock.rb +22 -0
  207. data/lib/kanrisuru/core/zypper/commands/add_repo.rb +38 -0
  208. data/lib/kanrisuru/core/zypper/commands/add_service.rb +26 -0
  209. data/lib/kanrisuru/core/zypper/commands/clean_cache.rb +22 -0
  210. data/lib/kanrisuru/core/zypper/commands/clean_locks.rb +17 -0
  211. data/lib/kanrisuru/core/zypper/commands/dist_upgrade.rb +25 -0
  212. data/lib/kanrisuru/core/zypper/commands/info.rb +25 -0
  213. data/lib/kanrisuru/core/zypper/commands/install.rb +39 -0
  214. data/lib/kanrisuru/core/zypper/commands/install_new_recommends.rb +23 -0
  215. data/lib/kanrisuru/core/zypper/commands/list_locks.rb +22 -0
  216. data/lib/kanrisuru/core/zypper/commands/list_patches.rb +34 -0
  217. data/lib/kanrisuru/core/zypper/commands/list_repos.rb +21 -0
  218. data/lib/kanrisuru/core/zypper/commands/list_services.rb +21 -0
  219. data/lib/kanrisuru/core/zypper/commands/list_updates.rb +30 -0
  220. data/lib/kanrisuru/core/zypper/commands/modify_repo.rb +48 -0
  221. data/lib/kanrisuru/core/zypper/commands/modify_service.rb +40 -0
  222. data/lib/kanrisuru/core/zypper/commands/patch.rb +40 -0
  223. data/lib/kanrisuru/core/zypper/commands/patch_check.rb +29 -0
  224. data/lib/kanrisuru/core/zypper/commands/purge_kernels.rb +18 -0
  225. data/lib/kanrisuru/core/zypper/commands/refresh_repos.rb +24 -0
  226. data/lib/kanrisuru/core/zypper/commands/refresh_services.rb +21 -0
  227. data/lib/kanrisuru/core/zypper/commands/remove.rb +26 -0
  228. data/lib/kanrisuru/core/zypper/commands/remove_lock.rb +22 -0
  229. data/lib/kanrisuru/core/zypper/commands/remove_repo.rb +32 -0
  230. data/lib/kanrisuru/core/zypper/commands/remove_service.rb +21 -0
  231. data/lib/kanrisuru/core/zypper/commands/rename_repo.rb +20 -0
  232. data/lib/kanrisuru/core/zypper/commands/search.rb +52 -0
  233. data/lib/kanrisuru/core/zypper/commands/source_install.rb +22 -0
  234. data/lib/kanrisuru/core/zypper/commands/update.rb +27 -0
  235. data/lib/kanrisuru/core/zypper/commands/verify.rb +23 -0
  236. data/lib/kanrisuru/core/zypper/commands.rb +109 -0
  237. data/lib/kanrisuru/core/zypper/constants.rb +19 -0
  238. data/lib/kanrisuru/core/zypper/parser.rb +11 -0
  239. data/lib/kanrisuru/core/zypper/parsers/base.rb +18 -0
  240. data/lib/kanrisuru/core/zypper/parsers/info.rb +77 -0
  241. data/lib/kanrisuru/core/zypper/parsers/list_locks.rb +36 -0
  242. data/lib/kanrisuru/core/zypper/parsers/list_patches.rb +40 -0
  243. data/lib/kanrisuru/core/zypper/parsers/list_repos.rb +37 -0
  244. data/lib/kanrisuru/core/zypper/parsers/list_services.rb +36 -0
  245. data/lib/kanrisuru/core/zypper/parsers/list_updates.rb +32 -0
  246. data/lib/kanrisuru/core/zypper/parsers/patch_check.rb +34 -0
  247. data/lib/kanrisuru/core/zypper/parsers/search.rb +37 -0
  248. data/lib/kanrisuru/core/zypper/types.rb +88 -0
  249. data/lib/kanrisuru/core/zypper.rb +5 -998
  250. data/lib/kanrisuru/version.rb +1 -1
  251. data/spec/unit/util_spec.rb +16 -0
  252. metadata +231 -2
@@ -0,0 +1,74 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Kanrisuru
4
+ module Core
5
+ module IP
6
+ def ip_link(action, opts)
7
+ command = nil
8
+
9
+ case action
10
+ when 'show', 'list'
11
+ version = ip_version
12
+
13
+ command = Kanrisuru::Command.new('ip')
14
+ command.append_flag('-json') if version >= IPROUTE2_JSON_VERSION
15
+ command.append_flag('-s', opts[:stats])
16
+ command.append_arg('-family', opts[:family])
17
+ command << 'link show'
18
+
19
+ command.append_arg('dev', opts[:dev])
20
+ command.append_arg('group', opts[:group])
21
+ command.append_arg('master', opts[:master])
22
+ command.append_arg('type', opts[:type])
23
+ command.append_arg('vrf', opts[:vrf])
24
+
25
+ command.append_flag('up', opts[:up])
26
+ when 'set'
27
+ command = Kanrisuru::Command.new('ip link set')
28
+
29
+ raise ArgumentError, 'no device defined' unless opts[:dev]
30
+
31
+ command.append_arg('dev', opts[:dev])
32
+
33
+ case opts[:direction]
34
+ when 'up'
35
+ command.append_flag('up')
36
+ when 'down'
37
+ command.append_flag('down')
38
+ end
39
+
40
+ command.append_arg('arp', opts[:arp])
41
+ command.append_arg('multicast', opts[:multicast])
42
+ command.append_arg('dynamic', opts[:dynamic])
43
+ command.append_arg('name', opts[:name])
44
+ command.append_arg('txqueuelen', opts[:txqueuelen])
45
+ command.append_arg('txqlen', opts[:txqlen])
46
+ command.append_arg('mtu', opts[:mtu])
47
+ command.append_arg('address', opts[:address])
48
+ command.append_arg('broadcast', opts[:broadcast])
49
+ command.append_arg('brd', opts[:brd])
50
+ command.append_arg('peer', opts[:peer])
51
+ command.append_arg('netns', opts[:netns])
52
+
53
+ if Kanrisuru::Util.present?(opts[:vf])
54
+ command.append_arg('vf', opts[:vf])
55
+ command.append_arg('mac', opts[:mac])
56
+
57
+ if Kanrisuru::Util.present?(opts[:vlan])
58
+ command.append_arg('vlan', opts[:vlan])
59
+ command.append_arg('qos', opts[:qos])
60
+ end
61
+
62
+ command.append_arg('rate', opts[:rate])
63
+ end
64
+ end
65
+
66
+ execute_shell(command)
67
+
68
+ Kanrisuru::Result.new(command) do |cmd|
69
+ Parser::Link.parse(cmd, action, version)
70
+ end
71
+ end
72
+ end
73
+ end
74
+ end
@@ -0,0 +1,33 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Kanrisuru
4
+ module Core
5
+ module IP
6
+ def ip_maddress(action, opts)
7
+ case action
8
+ when 'show', 'list'
9
+ command = Kanrisuru::Command.new('ip')
10
+
11
+ version = ip_version
12
+ command.append_flag('-json') if version >= IPROUTE2_JSON_VERSION
13
+ command.append_arg('-family', opts[:family])
14
+ command << 'maddress show'
15
+
16
+ command.append_arg('dev', opts[:dev])
17
+ when 'add', 'delete', 'del'
18
+ command = Kanrisuru::Command.new('ip maddress')
19
+ command << action
20
+
21
+ command.append_arg('address', opts[:lladdress])
22
+ command.append_arg('dev', opts[:dev])
23
+ end
24
+
25
+ execute_shell(command)
26
+
27
+ Kanrisuru::Result.new(command) do |cmd|
28
+ Parser::Maddress.parse(cmd, action, version)
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,55 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Kanrisuru
4
+ module Core
5
+ module IP
6
+ def ip_neighbour(action, opts)
7
+ case action
8
+ when 'add', 'change', 'replace', 'del', 'delete'
9
+ command = Kanrisuru::Command.new('ip neighbour')
10
+ command << action
11
+
12
+ command.append_arg('to', opts[:to])
13
+ command.append_arg('dev', opts[:dev])
14
+
15
+ if action != 'del' && action != 'delete'
16
+ command.append_arg('lladdr', opts[:lladdr])
17
+ command.append_arg('nud', opts[:nud])
18
+ end
19
+
20
+ command.append_flag('permanent', opts[:permanent])
21
+ command.append_flag('noarp', opts[:noarp])
22
+ command.append_flag('reachable', opts[:reachable])
23
+ command.append_flag('stale', opts[:stale])
24
+ when 'show', 'list'
25
+ version = ip_version
26
+
27
+ command = Kanrisuru::Command.new('ip')
28
+ command.append_flag('-json') if version >= Kanrisuru::Core::IP::IPROUTE2_JSON_VERSION
29
+ command.append_flag('-s', opts[:stats])
30
+
31
+ command << 'neighbour show'
32
+
33
+ command.append_arg('to', opts[:to])
34
+ command.append_arg('dev', opts[:dev])
35
+ command.append_arg('nud', opts[:nud])
36
+
37
+ command.append_flag('unused', opts[:unused])
38
+ when 'flush'
39
+ command = Kanrisuru::Command.new('ip neighbour flush')
40
+ command.append_arg('to', opts[:to])
41
+ command.append_arg('dev', opts[:dev])
42
+ command.append_arg('nud', opts[:nud])
43
+
44
+ command.append_flag('unused', opts[:unused])
45
+ end
46
+
47
+ execute_shell(command)
48
+
49
+ Kanrisuru::Result.new(command) do |cmd|
50
+ Parser::Neighbour.parse(cmd, action, version)
51
+ end
52
+ end
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,115 @@
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
10
+
11
+ command = Kanrisuru::Command.new('ip')
12
+ command.append_flag('-json') if version >= IPROUTE2_JSON_VERSION
13
+ command.append_arg('-family', opts[:family])
14
+ command << 'route show'
15
+
16
+ command.append_arg('to', opts[:to])
17
+ command.append_arg('dev', opts[:dev])
18
+ command.append_arg('proto', opts[:proto])
19
+ command.append_arg('type', opts[:type])
20
+ command.append_arg('via', opts[:via])
21
+ command.append_arg('src', opts[:src])
22
+ command.append_arg('realms', opts[:realms])
23
+ when 'flush'
24
+ command = Kanrisuru::Command.new('ip')
25
+ command.append_arg('-family', opts[:family])
26
+ command << 'route flush'
27
+
28
+ command.append_arg('to', opts[:to])
29
+ command.append_arg('dev', opts[:dev])
30
+ command.append_arg('proto', opts[:proto])
31
+ command.append_arg('type', opts[:type])
32
+ command.append_arg('via', opts[:via])
33
+ command.append_arg('src', opts[:src])
34
+ command.append_arg('realm', opts[:realm])
35
+ command.append_arg('realms', opts[:realm])
36
+ when 'add', 'change', 'append', 'del', 'delete'
37
+ command = Kanrisuru::Command.new('ip route')
38
+ command << action
39
+
40
+ command.append_arg('to', opts[:to])
41
+ command.append_arg('tos', opts[:tos])
42
+ command.append_arg('dsfield', opts[:dsfield])
43
+ command.append_arg('metric', opts[:metric])
44
+ command.append_arg('preference', opts[:preference])
45
+ command.append_arg('table', opts[:table])
46
+ command.append_arg('vrf', opts[:vrf])
47
+ command.append_arg('dev', opts[:dev])
48
+ command.append_arg('via', opts[:via])
49
+ command.append_arg('src', opts[:src])
50
+ command.append_arg('realm', opts[:realm])
51
+
52
+ command.append_arg('mtu', opts[:mtu])
53
+ command.append_arg('window', opts[:window])
54
+ command.append_arg('rtt', opts[:rtt])
55
+ command.append_arg('rttvar', opts[:rttvar])
56
+ command.append_arg('rto_min', opts[:rto_min])
57
+ command.append_arg('ssthresh', opts[:ssthresh])
58
+ command.append_arg('cwnd', opts[:cwnd])
59
+ command.append_arg('initcwnd', opts[:initcwnd])
60
+ command.append_arg('initrwnd', opts[:initrwnd])
61
+ command.append_arg('features', opts[:features])
62
+ command.append_arg('quickack', opts[:quickack])
63
+ command.append_arg('fastopen_no_cookie', opts[:fastopen_no_cookie])
64
+
65
+ if Kanrisuru::Util.present?(opts[:congctl])
66
+ if Kanrisuru::Util.present?(opts[:congctl_lock])
67
+ command.append_arg('congctl', opts[:congctl])
68
+ else
69
+ command.append_arg('congctl lock', opts[:congctl])
70
+ end
71
+ end
72
+
73
+ command.append_arg('advmss', opts[:advmss])
74
+ command.append_arg('reordering', opts[:reordering])
75
+
76
+ if Kanrisuru::Util.present?(opts[:next_hop])
77
+ next_hop = opts[:next_hop]
78
+
79
+ command << 'next_hop'
80
+ command.append_arg('via', next_hop[:via])
81
+ command.append_arg('dev', next_hop[:dev])
82
+ command.append_arg('weight', next_hop[:weight])
83
+ end
84
+
85
+ command.append_arg('scope', opts[:scope])
86
+ command.append_arg('protocol', opts[:protocol])
87
+ command.append_flag('onlink', opts[:onlink])
88
+ command.append_arg('pref', opts[:pref])
89
+ when 'get'
90
+ command = Kanrisuru::Command.new('ip route get')
91
+
92
+ command.append_arg('to', opts[:to])
93
+ command.append_arg('from', opts[:from])
94
+ command.append_arg('tos', opts[:tos])
95
+ command.append_arg('dsfield', opts[:dsfield])
96
+ command.append_arg('iif', opts[:iif])
97
+ command.append_arg('oif', opts[:oif])
98
+ command.append_arg('mark', opts[:mark])
99
+ command.append_arg('vrf', opts[:vrf])
100
+ command.append_arg('ipproto', opts[:ipproto])
101
+ command.append_arg('sport', opts[:sport])
102
+ command.append_arg('dport', opts[:dport])
103
+
104
+ command.append_flag('connected', opts[:connected])
105
+ end
106
+
107
+ execute_shell(command)
108
+
109
+ Kanrisuru::Result.new(command) do |cmd|
110
+ Parser::Route.parse(cmd, action, version)
111
+ end
112
+ end
113
+ end
114
+ end
115
+ end
@@ -0,0 +1,42 @@
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
10
+
11
+ command = Kanrisuru::Command.new('ip')
12
+ command.append_flag('-json') if version >= IPROUTE2_JSON_VERSION
13
+
14
+ command << 'rule show'
15
+ when 'flush'
16
+ command = Kanrisuru::Command.new('ip rule flush')
17
+ when 'add', 'delete'
18
+ command = Kanrisuru::Command.new('ip rule')
19
+ command << action
20
+
21
+ command.append_arg('type', opts[:type])
22
+ command.append_arg('from', opts[:from])
23
+ command.append_arg('to', opts[:to])
24
+ command.append_arg('iif', opts[:iif])
25
+ command.append_arg('tos', opts[:tos])
26
+ command.append_arg('dsfield', opts[:dsfield])
27
+ command.append_arg('fwmark', opts[:fwmark])
28
+ command.append_arg('priority', opts[:priority])
29
+ command.append_arg('table', opts[:table])
30
+ command.append_arg('realms', opts[:realms])
31
+ command.append_arg('nat', opts[:nat])
32
+ end
33
+
34
+ execute_shell(command)
35
+
36
+ Kanrisuru::Result.new(command) do |cmd|
37
+ Parser::Rule.parse(cmd, action, version)
38
+ end
39
+ end
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,24 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'commands/address'
4
+ require_relative 'commands/address_label'
5
+ require_relative 'commands/link'
6
+ require_relative 'commands/maddress'
7
+ require_relative 'commands/neighbour'
8
+ require_relative 'commands/route'
9
+ require_relative 'commands/rule'
10
+
11
+ module Kanrisuru
12
+ module Core
13
+ module IP
14
+ def ip_version
15
+ command = Kanrisuru::Command.new('ip -V')
16
+ execute_shell(command)
17
+
18
+ raise 'ip command not found' if command.failure?
19
+
20
+ command.to_s.split('ip utility, iproute2-ss')[1].to_i
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Kanrisuru
4
+ module Core
5
+ module IP
6
+ IPROUTE2_JSON_VERSION = 180_129
7
+ IP_ROUTE_TYPES = %w[
8
+ unicast unreachable blackhole prohibit local
9
+ broadcast throw nat via anycast multicast
10
+ ].freeze
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'parsers/base'
4
+ require_relative 'parsers/address'
5
+ require_relative 'parsers/address_label'
6
+ require_relative 'parsers/link'
7
+ require_relative 'parsers/maddress'
8
+ require_relative 'parsers/neighbour'
9
+ require_relative 'parsers/route'
10
+ 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