|
1 | 1 | #!/usr/bin/env python3
|
2 | 2 | # -*- coding: utf-8 -*-
|
3 | 3 | import asyncio
|
| 4 | +import subprocess |
4 | 5 |
|
5 | 6 | from dataclasses import dataclass
|
6 |
| -from typing import Annotated |
| 7 | +from typing import Annotated, Literal |
7 | 8 |
|
8 | 9 | import cappa
|
9 | 10 | import granian
|
@@ -49,6 +50,34 @@ def run(host: str, port: int, reload: bool, workers: int | None) -> None:
|
49 | 50 | ).serve()
|
50 | 51 |
|
51 | 52 |
|
| 53 | +def run_celery_worker(log_level: Literal['info', 'debug']) -> None: |
| 54 | + try: |
| 55 | + subprocess.run(['celery', '-A', 'backend.app.task.celery', 'worker', '-l', f'{log_level}', '-P', 'gevent']) |
| 56 | + except KeyboardInterrupt: |
| 57 | + pass |
| 58 | + |
| 59 | + |
| 60 | +def run_celery_beat(log_level: Literal['info', 'debug']) -> None: |
| 61 | + try: |
| 62 | + subprocess.run(['celery', '-A', 'backend.app.task.celery', 'beat', '-l', f'{log_level}']) |
| 63 | + except KeyboardInterrupt: |
| 64 | + pass |
| 65 | + |
| 66 | + |
| 67 | +def run_celery_flower(port: int, basic_auth: str) -> None: |
| 68 | + try: |
| 69 | + subprocess.run([ |
| 70 | + 'celery', |
| 71 | + '-A', |
| 72 | + 'backend.app.task.celery', |
| 73 | + 'flower', |
| 74 | + f'--port={port}', |
| 75 | + f'--basic-auth={basic_auth}', |
| 76 | + ]) |
| 77 | + except KeyboardInterrupt: |
| 78 | + pass |
| 79 | + |
| 80 | + |
52 | 81 | async def install_plugin(
|
53 | 82 | path: str, repo_url: str, no_sql: bool, db_type: DataBaseType, pk_type: PrimaryKeyType
|
54 | 83 | ) -> None:
|
@@ -89,7 +118,7 @@ async def execute_sql_scripts(sql_scripts: str) -> None:
|
89 | 118 | console.print(Text('SQL 脚本已执行完成', style='bold green'))
|
90 | 119 |
|
91 | 120 |
|
92 |
| -@cappa.command(help='运行服务') |
| 121 | +@cappa.command(help='运行 API 服务') |
93 | 122 | @dataclass
|
94 | 123 | class Run:
|
95 | 124 | host: Annotated[
|
@@ -118,6 +147,49 @@ def __call__(self):
|
118 | 147 | run(host=self.host, port=self.port, reload=self.no_reload, workers=self.workers)
|
119 | 148 |
|
120 | 149 |
|
| 150 | +@cappa.command(help='从当前主机启动 Celery worker 服务') |
| 151 | +@dataclass |
| 152 | +class Worker: |
| 153 | + log_level: Annotated[ |
| 154 | + Literal['info', 'debug'], |
| 155 | + cappa.Arg(long=True, short='-l', default='info', help='日志输出级别'), |
| 156 | + ] |
| 157 | + |
| 158 | + def __call__(self): |
| 159 | + run_celery_worker(log_level=self.log_level) |
| 160 | + |
| 161 | + |
| 162 | +@cappa.command(help='从当前主机启动 Celery beat 服务') |
| 163 | +@dataclass |
| 164 | +class Beat: |
| 165 | + log_level: Annotated[ |
| 166 | + Literal['info', 'debug'], |
| 167 | + cappa.Arg(long=True, short='-l', default='info', help='日志输出级别'), |
| 168 | + ] |
| 169 | + |
| 170 | + def __call__(self): |
| 171 | + run_celery_beat(log_level=self.log_level) |
| 172 | + |
| 173 | + |
| 174 | +@cappa.command(help='从当前主机启动 Celery flower 服务') |
| 175 | +@dataclass |
| 176 | +class Flower: |
| 177 | + port: Annotated[int, cappa.Arg(long=True, default=8555, help='提供服务的主机端口号')] |
| 178 | + basic_auth: Annotated[str, cappa.Arg(long=True, default='admin:123456', help='页面登录的用户名和密码')] |
| 179 | + |
| 180 | + def __call__(self): |
| 181 | + run_celery_flower(port=self.port, basic_auth=self.basic_auth) |
| 182 | + |
| 183 | + |
| 184 | +@cappa.command(help='运行 Celery 服务') |
| 185 | +@dataclass |
| 186 | +class Celery: |
| 187 | + subcmd: cappa.Subcommands[Worker | Beat | Flower | None] = None |
| 188 | + |
| 189 | + def __call__(self): |
| 190 | + console.print('\n更多信息,尝试 "[cyan]--help[/]"') |
| 191 | + |
| 192 | + |
121 | 193 | @cappa.command(help='新增插件')
|
122 | 194 | @dataclass
|
123 | 195 | class Add:
|
@@ -151,13 +223,13 @@ async def __call__(self):
|
151 | 223 | class FbaCli:
|
152 | 224 | version: Annotated[
|
153 | 225 | bool,
|
154 |
| - cappa.Arg(short='-V', long=True, default=False, help='打印当前版本号'), |
| 226 | + cappa.Arg(short='-V', long=True, default=False, show_default=False, help='打印当前版本号'), |
155 | 227 | ]
|
156 | 228 | sql: Annotated[
|
157 | 229 | str,
|
158 |
| - cappa.Arg(long=True, default='', help='在事务中执行 SQL 脚本'), |
| 230 | + cappa.Arg(value_name='PATH', long=True, default='', show_default=False, help='在事务中执行 SQL 脚本'), |
159 | 231 | ]
|
160 |
| - subcmd: cappa.Subcommands[Run | Add | None] = None |
| 232 | + subcmd: cappa.Subcommands[Run | Celery | Add | None] = None |
161 | 233 |
|
162 | 234 | async def __call__(self):
|
163 | 235 | if self.version:
|
|
0 commit comments