2
0

do_ci.ps1 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562
  1. # Copyright The OpenTelemetry Authors
  2. # SPDX-License-Identifier: Apache-2.0
  3. $ErrorActionPreference = "Stop";
  4. trap { $host.SetShouldExit(1) }
  5. $action = $args[0]
  6. $nproc = (Get-ComputerInfo).CsNumberOfLogicalProcessors
  7. $SRC_DIR = (Get-Item -Path ".\").FullName
  8. # Workaround https://github.com/bazelbuild/bazel/issues/18683
  9. $BAZEL_STARTUP_OPTIONS = "--output_base=C:\O"
  10. $BAZEL_OPTIONS = "--copt=-DENABLE_ASYNC_EXPORT --compilation_mode=dbg"
  11. $BAZEL_TEST_OPTIONS = "$BAZEL_OPTIONS --test_output=errors"
  12. if (!(test-path build)) {
  13. mkdir build
  14. }
  15. $BUILD_DIR = Join-Path "$SRC_DIR" "build"
  16. if (!(test-path install_test)) {
  17. mkdir install_test
  18. }
  19. $INSTALL_TEST_DIR = Join-Path "$SRC_DIR" "install_test"
  20. if (!(test-path plugin)) {
  21. mkdir plugin
  22. }
  23. $PLUGIN_DIR = Join-Path "$SRC_DIR" "plugin"
  24. $VCPKG_DIR = Join-Path "$SRC_DIR" "tools/vcpkg"
  25. $Env:CTEST_OUTPUT_ON_FAILURE = "1"
  26. switch ($action) {
  27. "bazel.build" {
  28. bazel $BAZEL_STARTUP_OPTIONS build $BAZEL_OPTIONS --action_env=VCPKG_DIR=$VCPKG_DIR --deleted_packages=opentracing-shim -- //...
  29. $exit = $LASTEXITCODE
  30. if ($exit -ne 0) {
  31. exit $exit
  32. }
  33. }
  34. "cmake.test" {
  35. cd "$BUILD_DIR"
  36. cmake $SRC_DIR `
  37. -DVCPKG_TARGET_TRIPLET=x64-windows `
  38. "-DCMAKE_TOOLCHAIN_FILE=$VCPKG_DIR/scripts/buildsystems/vcpkg.cmake"
  39. $exit = $LASTEXITCODE
  40. if ($exit -ne 0) {
  41. exit $exit
  42. }
  43. cmake --build . -j $nproc
  44. $exit = $LASTEXITCODE
  45. if ($exit -ne 0) {
  46. exit $exit
  47. }
  48. ctest -C Debug
  49. $exit = $LASTEXITCODE
  50. if ($exit -ne 0) {
  51. exit $exit
  52. }
  53. }
  54. "cmake.dll.test" {
  55. cd "$BUILD_DIR"
  56. cmake $SRC_DIR `
  57. -DVCPKG_TARGET_TRIPLET=x64-windows `
  58. -DOPENTELEMETRY_BUILD_DLL=1 `
  59. "-DCMAKE_TOOLCHAIN_FILE=$VCPKG_DIR/scripts/buildsystems/vcpkg.cmake"
  60. $exit = $LASTEXITCODE
  61. if ($exit -ne 0) {
  62. exit $exit
  63. }
  64. cmake --build . -j $nproc
  65. $exit = $LASTEXITCODE
  66. if ($exit -ne 0) {
  67. exit $exit
  68. }
  69. ctest -C Debug
  70. $exit = $LASTEXITCODE
  71. if ($exit -ne 0) {
  72. exit $exit
  73. }
  74. $env:PATH = "$BUILD_DIR\ext\src\dll\Debug;$env:PATH"
  75. examples\simple\Debug\example_simple.exe
  76. $exit = $LASTEXITCODE
  77. if ($exit -ne 0) {
  78. exit $exit
  79. }
  80. examples\metrics_simple\Debug\metrics_ostream_example.exe
  81. $exit = $LASTEXITCODE
  82. if ($exit -ne 0) {
  83. exit $exit
  84. }
  85. examples\logs_simple\Debug\example_logs_simple.exe
  86. $exit = $LASTEXITCODE
  87. if ($exit -ne 0) {
  88. exit $exit
  89. }
  90. }
  91. "cmake.dll.cxx20.test" {
  92. cd "$BUILD_DIR"
  93. cmake $SRC_DIR `
  94. -DCMAKE_CXX_STANDARD=20 `
  95. -DVCPKG_TARGET_TRIPLET=x64-windows `
  96. -DOPENTELEMETRY_BUILD_DLL=1 `
  97. "-DCMAKE_TOOLCHAIN_FILE=$VCPKG_DIR/scripts/buildsystems/vcpkg.cmake"
  98. $exit = $LASTEXITCODE
  99. if ($exit -ne 0) {
  100. exit $exit
  101. }
  102. cmake --build . -j $nproc
  103. $exit = $LASTEXITCODE
  104. if ($exit -ne 0) {
  105. exit $exit
  106. }
  107. ctest -C Debug
  108. $exit = $LASTEXITCODE
  109. if ($exit -ne 0) {
  110. exit $exit
  111. }
  112. $env:PATH = "$BUILD_DIR\ext\src\dll\Debug;$env:PATH"
  113. examples\simple\Debug\example_simple.exe
  114. $exit = $LASTEXITCODE
  115. if ($exit -ne 0) {
  116. exit $exit
  117. }
  118. examples\metrics_simple\Debug\metrics_ostream_example.exe
  119. $exit = $LASTEXITCODE
  120. if ($exit -ne 0) {
  121. exit $exit
  122. }
  123. examples\logs_simple\Debug\example_logs_simple.exe
  124. $exit = $LASTEXITCODE
  125. if ($exit -ne 0) {
  126. exit $exit
  127. }
  128. }
  129. "cmake.maintainer.test" {
  130. cd "$BUILD_DIR"
  131. cmake $SRC_DIR `
  132. -DWITH_OTLP_GRPC=ON `
  133. -DWITH_OTLP_HTTP=ON `
  134. -DWITH_OTLP_RETRY_PREVIEW=ON `
  135. -DOTELCPP_MAINTAINER_MODE=ON `
  136. -DWITH_NO_DEPRECATED_CODE=ON `
  137. -DVCPKG_TARGET_TRIPLET=x64-windows `
  138. "-DCMAKE_TOOLCHAIN_FILE=$VCPKG_DIR/scripts/buildsystems/vcpkg.cmake"
  139. $exit = $LASTEXITCODE
  140. if ($exit -ne 0) {
  141. exit $exit
  142. }
  143. cmake --build . -j $nproc
  144. $exit = $LASTEXITCODE
  145. if ($exit -ne 0) {
  146. exit $exit
  147. }
  148. ctest -C Debug
  149. $exit = $LASTEXITCODE
  150. if ($exit -ne 0) {
  151. exit $exit
  152. }
  153. }
  154. "cmake.maintainer.cxx20.stl.test" {
  155. cd "$BUILD_DIR"
  156. cmake $SRC_DIR `
  157. -DWITH_STL=CXX20 `
  158. -DCMAKE_CXX_STANDARD=20 `
  159. -DWITH_OTLP_GRPC=ON `
  160. -DWITH_OTLP_HTTP=ON `
  161. -DWITH_OTLP_RETRY_PREVIEW=ON `
  162. -DOTELCPP_MAINTAINER_MODE=ON `
  163. -DWITH_NO_DEPRECATED_CODE=ON `
  164. -DVCPKG_TARGET_TRIPLET=x64-windows `
  165. "-DCMAKE_TOOLCHAIN_FILE=$VCPKG_DIR/scripts/buildsystems/vcpkg.cmake"
  166. $exit = $LASTEXITCODE
  167. if ($exit -ne 0) {
  168. exit $exit
  169. }
  170. cmake --build . -j $nproc
  171. $exit = $LASTEXITCODE
  172. if ($exit -ne 0) {
  173. exit $exit
  174. }
  175. ctest -C Debug
  176. $exit = $LASTEXITCODE
  177. if ($exit -ne 0) {
  178. exit $exit
  179. }
  180. }
  181. "cmake.maintainer.abiv2.test" {
  182. cd "$BUILD_DIR"
  183. cmake $SRC_DIR `
  184. -DWITH_OTLP_GRPC=ON `
  185. -DWITH_OTLP_HTTP=ON `
  186. -DWITH_OTLP_RETRY_PREVIEW=ON `
  187. -DOTELCPP_MAINTAINER_MODE=ON `
  188. -DWITH_NO_DEPRECATED_CODE=ON `
  189. -DWITH_ABI_VERSION_1=OFF `
  190. -DWITH_ABI_VERSION_2=ON `
  191. -DVCPKG_TARGET_TRIPLET=x64-windows `
  192. "-DCMAKE_TOOLCHAIN_FILE=$VCPKG_DIR/scripts/buildsystems/vcpkg.cmake"
  193. $exit = $LASTEXITCODE
  194. if ($exit -ne 0) {
  195. exit $exit
  196. }
  197. cmake --build . -j $nproc
  198. $exit = $LASTEXITCODE
  199. if ($exit -ne 0) {
  200. exit $exit
  201. }
  202. ctest -C Debug
  203. $exit = $LASTEXITCODE
  204. if ($exit -ne 0) {
  205. exit $exit
  206. }
  207. }
  208. "cmake.with_async_export.test" {
  209. cd "$BUILD_DIR"
  210. cmake $SRC_DIR `
  211. -DVCPKG_TARGET_TRIPLET=x64-windows `
  212. -DWITH_ASYNC_EXPORT_PREVIEW=ON `
  213. "-DCMAKE_TOOLCHAIN_FILE=$VCPKG_DIR/scripts/buildsystems/vcpkg.cmake"
  214. $exit = $LASTEXITCODE
  215. if ($exit -ne 0) {
  216. exit $exit
  217. }
  218. cmake --build . -j $nproc
  219. $exit = $LASTEXITCODE
  220. if ($exit -ne 0) {
  221. exit $exit
  222. }
  223. ctest -C Debug
  224. $exit = $LASTEXITCODE
  225. if ($exit -ne 0) {
  226. exit $exit
  227. }
  228. }
  229. "cmake.exporter.otprotocol.test" {
  230. cd "$BUILD_DIR"
  231. cmake $SRC_DIR `
  232. -DVCPKG_TARGET_TRIPLET=x64-windows `
  233. -DWITH_OTLP_GRPC=ON `
  234. -DWITH_OTLP_HTTP=ON `
  235. -DWITH_OTLP_RETRY_PREVIEW=ON `
  236. -DWITH_OTPROTCOL=ON `
  237. "-DCMAKE_TOOLCHAIN_FILE=$VCPKG_DIR/scripts/buildsystems/vcpkg.cmake"
  238. $exit = $LASTEXITCODE
  239. if ($exit -ne 0) {
  240. exit $exit
  241. }
  242. cmake --build . -j $nproc
  243. $exit = $LASTEXITCODE
  244. if ($exit -ne 0) {
  245. exit $exit
  246. }
  247. ctest -C Debug
  248. $exit = $LASTEXITCODE
  249. if ($exit -ne 0) {
  250. exit $exit
  251. }
  252. }
  253. "cmake.exporter.otprotocol.dll.test" {
  254. cd "$BUILD_DIR"
  255. cmake $SRC_DIR `
  256. -DVCPKG_TARGET_TRIPLET=x64-windows `
  257. -DOPENTELEMETRY_BUILD_DLL=1 `
  258. -DWITH_OTPROTCOL=ON `
  259. "-DCMAKE_TOOLCHAIN_FILE=$VCPKG_DIR/scripts/buildsystems/vcpkg.cmake"
  260. $exit = $LASTEXITCODE
  261. if ($exit -ne 0) {
  262. exit $exit
  263. }
  264. cmake --build . -j $nproc
  265. $exit = $LASTEXITCODE
  266. if ($exit -ne 0) {
  267. exit $exit
  268. }
  269. ctest -C Debug
  270. $exit = $LASTEXITCODE
  271. if ($exit -ne 0) {
  272. exit $exit
  273. }
  274. }
  275. "cmake.exporter.otprotocol.with_async_export.test" {
  276. cd "$BUILD_DIR"
  277. cmake $SRC_DIR `
  278. -DVCPKG_TARGET_TRIPLET=x64-windows `
  279. -DWITH_ASYNC_EXPORT_PREVIEW=ON `
  280. -DWITH_OTPROTCOL=ON `
  281. "-DCMAKE_TOOLCHAIN_FILE=$VCPKG_DIR/scripts/buildsystems/vcpkg.cmake"
  282. $exit = $LASTEXITCODE
  283. if ($exit -ne 0) {
  284. exit $exit
  285. }
  286. cmake --build . -j $nproc
  287. $exit = $LASTEXITCODE
  288. if ($exit -ne 0) {
  289. exit $exit
  290. }
  291. ctest -C Debug
  292. $exit = $LASTEXITCODE
  293. if ($exit -ne 0) {
  294. exit $exit
  295. }
  296. }
  297. "cmake.build_example_plugin" {
  298. cd "$BUILD_DIR"
  299. cmake $SRC_DIR `
  300. -DVCPKG_TARGET_TRIPLET=x64-windows `
  301. -DWITH_ASYNC_EXPORT_PREVIEW=ON `
  302. "-DCMAKE_TOOLCHAIN_FILE=$VCPKG_DIR/scripts/buildsystems/vcpkg.cmake"
  303. $exit = $LASTEXITCODE
  304. if ($exit -ne 0) {
  305. exit $exit
  306. }
  307. cmake --build . -j $nproc
  308. $exit = $LASTEXITCODE
  309. if ($exit -ne 0) {
  310. exit $exit
  311. }
  312. cp examples/plugin/plugin/Debug/example_plugin.dll ${PLUGIN_DIR}
  313. }
  314. "cmake.test_example_plugin" {
  315. cd "$BUILD_DIR"
  316. cmake $SRC_DIR `
  317. -DVCPKG_TARGET_TRIPLET=x64-windows `
  318. -DWITH_ASYNC_EXPORT_PREVIEW=ON `
  319. "-DCMAKE_TOOLCHAIN_FILE=$VCPKG_DIR/scripts/buildsystems/vcpkg.cmake"
  320. $exit = $LASTEXITCODE
  321. if ($exit -ne 0) {
  322. exit $exit
  323. }
  324. cmake --build . -j $nproc
  325. $exit = $LASTEXITCODE
  326. if ($exit -ne 0) {
  327. exit $exit
  328. }
  329. cp examples/plugin/plugin/Debug/example_plugin.dll ${PLUGIN_DIR}
  330. $config = New-TemporaryFile
  331. examples/plugin/load/Debug/load_plugin_example.exe ${PLUGIN_DIR}/example_plugin.dll $config
  332. $exit = $LASTEXITCODE
  333. if ($exit -ne 0) {
  334. exit $exit
  335. }
  336. }
  337. "cmake.install.test" {
  338. Remove-Item -Recurse -Force "$BUILD_DIR\*"
  339. Remove-Item -Recurse -Force "$INSTALL_TEST_DIR\*"
  340. cd "$BUILD_DIR"
  341. if (Test-Path Env:\CXX_STANDARD) {
  342. $CXX_STANDARD = [int](Get-Item Env:\CXX_STANDARD).Value
  343. } else {
  344. $CXX_STANDARD = 14
  345. }
  346. if (-not $CXX_STANDARD) {
  347. $CXX_STANDARD = 14
  348. }
  349. Write-Host "Using CXX_STANDARD: $CXX_STANDARD"
  350. $CMAKE_OPTIONS = @(
  351. "-DCMAKE_CXX_STANDARD=$CXX_STANDARD",
  352. "-DCMAKE_CXX_STANDARD_REQUIRED=ON",
  353. "-DCMAKE_CXX_EXTENSIONS=OFF",
  354. "-DVCPKG_TARGET_TRIPLET=x64-windows",
  355. "-DCMAKE_TOOLCHAIN_FILE=$VCPKG_DIR/scripts/buildsystems/vcpkg.cmake"
  356. )
  357. cmake $SRC_DIR `
  358. $CMAKE_OPTIONS `
  359. "-DCMAKE_INSTALL_PREFIX=$INSTALL_TEST_DIR" `
  360. -DWITH_ABI_VERSION_1=OFF `
  361. -DWITH_ABI_VERSION_2=ON `
  362. -DWITH_THREAD_INSTRUMENTATION_PREVIEW=ON `
  363. -DWITH_METRICS_EXEMPLAR_PREVIEW=ON `
  364. -DWITH_ASYNC_EXPORT_PREVIEW=ON `
  365. -DWITH_OTLP_GRPC_SSL_MTLS_PREVIEW=ON `
  366. -DWITH_OTLP_RETRY_PREVIEW=ON `
  367. -DWITH_OTLP_GRPC=ON `
  368. -DWITH_OTLP_HTTP=ON `
  369. -DWITH_OTLP_FILE=ON `
  370. -DWITH_OTLP_HTTP_COMPRESSION=ON `
  371. -DWITH_HTTP_CLIENT_CURL=ON `
  372. -DWITH_PROMETHEUS=ON `
  373. -DWITH_ZIPKIN=ON `
  374. -DWITH_ELASTICSEARCH=ON `
  375. -DWITH_ETW=ON `
  376. -DWITH_EXAMPLES=ON `
  377. -DWITH_EXAMPLES_HTTP=ON `
  378. -DBUILD_W3CTRACECONTEXT_TEST=ON `
  379. -DOPENTELEMETRY_INSTALL=ON
  380. $exit = $LASTEXITCODE
  381. if ($exit -ne 0) {
  382. exit $exit
  383. }
  384. cmake --build . -j $nproc
  385. $exit = $LASTEXITCODE
  386. if ($exit -ne 0) {
  387. exit $exit
  388. }
  389. ctest -C Debug
  390. $exit = $LASTEXITCODE
  391. if ($exit -ne 0) {
  392. exit $exit
  393. }
  394. cmake --build . --target install
  395. $exit = $LASTEXITCODE
  396. if ($exit -ne 0) {
  397. exit $exit
  398. }
  399. $env:PATH = "$INSTALL_TEST_DIR\bin;$env:PATH"
  400. $CMAKE_OPTIONS_STRING = $CMAKE_OPTIONS -join " "
  401. $EXPECTED_COMPONENTS = @(
  402. "api",
  403. "sdk",
  404. "ext_common",
  405. "ext_http_curl",
  406. "exporters_in_memory",
  407. "exporters_ostream",
  408. "exporters_otlp_common",
  409. "exporters_otlp_file",
  410. "exporters_otlp_grpc",
  411. "exporters_otlp_http",
  412. "exporters_prometheus",
  413. "exporters_elasticsearch",
  414. "exporters_zipkin",
  415. "exporters_etw"
  416. )
  417. $EXPECTED_COMPONENTS_STRING = $EXPECTED_COMPONENTS -join ";"
  418. mkdir "$BUILD_DIR\install_test"
  419. cd "$BUILD_DIR\install_test"
  420. cmake $CMAKE_OPTIONS `
  421. "-DCMAKE_PREFIX_PATH=$INSTALL_TEST_DIR" `
  422. "-DINSTALL_TEST_CMAKE_OPTIONS=$CMAKE_OPTIONS_STRING" `
  423. "-DINSTALL_TEST_COMPONENTS=$EXPECTED_COMPONENTS_STRING" `
  424. -S "$SRC_DIR\install\test\cmake"
  425. $exit = $LASTEXITCODE
  426. if ($exit -ne 0) {
  427. exit $exit
  428. }
  429. ctest -C Debug --output-on-failure
  430. $exit = $LASTEXITCODE
  431. if ($exit -ne 0) {
  432. exit $exit
  433. }
  434. exit 0
  435. }
  436. "cmake.dll.install.test" {
  437. cd "$BUILD_DIR"
  438. Remove-Item -Recurse -Force "$BUILD_DIR\*"
  439. Remove-Item -Recurse -Force "$INSTALL_TEST_DIR\*"
  440. $CMAKE_OPTIONS = @(
  441. "-DCMAKE_CXX_STANDARD=17",
  442. "-DVCPKG_TARGET_TRIPLET=x64-windows",
  443. "-DCMAKE_TOOLCHAIN_FILE=$VCPKG_DIR/scripts/buildsystems/vcpkg.cmake"
  444. )
  445. cmake $SRC_DIR `
  446. $CMAKE_OPTIONS `
  447. "-DCMAKE_INSTALL_PREFIX=$INSTALL_TEST_DIR" `
  448. -DOPENTELEMETRY_BUILD_DLL=1 `
  449. -DWITH_ABI_VERSION_1=ON `
  450. -DWITH_ABI_VERSION_2=OFF `
  451. -DWITH_THREAD_INSTRUMENTATION_PREVIEW=ON `
  452. -DWITH_METRICS_EXEMPLAR_PREVIEW=ON `
  453. -DWITH_ASYNC_EXPORT_PREVIEW=ON `
  454. -DWITH_ETW=ON `
  455. -DOPENTELEMETRY_INSTALL=ON `
  456. -DWITH_OTLP_GRPC_SSL_MTLS_PREVIEW=OFF `
  457. -DWITH_OTLP_RETRY_PREVIEW=OFF `
  458. -DWITH_OTLP_GRPC=OFF `
  459. -DWITH_OTLP_HTTP=OFF `
  460. -DWITH_OTLP_FILE=OFF `
  461. -DWITH_OTLP_HTTP_COMPRESSION=OFF `
  462. -DWITH_HTTP_CLIENT_CURL=OFF `
  463. -DWITH_PROMETHEUS=OFF `
  464. -DWITH_ZIPKIN=OFF `
  465. -DWITH_ELASTICSEARCH=OFF `
  466. -DWITH_EXAMPLES=OFF `
  467. $exit = $LASTEXITCODE
  468. if ($exit -ne 0) {
  469. exit $exit
  470. }
  471. cmake --build . -j $nproc
  472. $exit = $LASTEXITCODE
  473. if ($exit -ne 0) {
  474. exit $exit
  475. }
  476. ctest -C Debug
  477. $exit = $LASTEXITCODE
  478. if ($exit -ne 0) {
  479. exit $exit
  480. }
  481. cmake --build . --target install
  482. $exit = $LASTEXITCODE
  483. if ($exit -ne 0) {
  484. exit $exit
  485. }
  486. $env:PATH = "$INSTALL_TEST_DIR\bin;$env:PATH"
  487. echo "$env:PATH"
  488. $CMAKE_OPTIONS_STRING = $CMAKE_OPTIONS -join " "
  489. $EXPECTED_COMPONENTS = @(
  490. "api",
  491. "sdk",
  492. "ext_common",
  493. "exporters_in_memory",
  494. "exporters_ostream",
  495. "exporters_etw",
  496. "ext_dll"
  497. )
  498. $EXPECTED_COMPONENTS_STRING = $EXPECTED_COMPONENTS -join ";"
  499. mkdir "$BUILD_DIR\install_test"
  500. cd "$BUILD_DIR\install_test"
  501. cmake $CMAKE_OPTIONS `
  502. "-DCMAKE_PREFIX_PATH=$INSTALL_TEST_DIR" `
  503. "-DINSTALL_TEST_CMAKE_OPTIONS=$CMAKE_OPTIONS_STRING" `
  504. "-DINSTALL_TEST_COMPONENTS=$EXPECTED_COMPONENTS_STRING" `
  505. -S "$SRC_DIR\install\test\cmake"
  506. $exit = $LASTEXITCODE
  507. if ($exit -ne 0) {
  508. exit $exit
  509. }
  510. ctest -C Debug --output-on-failure
  511. $exit = $LASTEXITCODE
  512. if ($exit -ne 0) {
  513. exit $exit
  514. }
  515. exit 0
  516. }
  517. default {
  518. echo "unknown action: $action"
  519. exit 1
  520. }
  521. }