From c6aeab6bfafb48427c5e6ca032dfe564138b7209 Mon Sep 17 00:00:00 2001 From: Brandon Marlowe Date: Tue, 26 Dec 2023 13:42:21 -0500 Subject: [PATCH] Fix/self upgrade check (#153) * Update README.md [ci skip] * added check for mmpm being docker image in upgrade subcmd * updated changelog --- CHANGELOG.md | 1 + mmpm/api/endpoints/ep_mmpm.py | 5 ++++- mmpm/subcommands/_sub_cmd_ui.py | 6 ++++++ mmpm/subcommands/_sub_cmd_upgrade.py | 8 +++++++- mmpm/utils.py | 2 +- ui/bun.lockb | Bin 439164 -> 439164 bytes 6 files changed, 19 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 293acf20..9cd0c226 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -307,3 +307,4 @@ - added guard on determining host IP address in `mmpm.constants.paths` - added import guard for Python3.8 when using `importlib.resources` in `mmpm.ui` +- added check for MMPM being a docker image when self upgrading diff --git a/mmpm/api/endpoints/ep_mmpm.py b/mmpm/api/endpoints/ep_mmpm.py index 5ce9efcb..716ff6ca 100644 --- a/mmpm/api/endpoints/ep_mmpm.py +++ b/mmpm/api/endpoints/ep_mmpm.py @@ -5,6 +5,7 @@ import mmpm.utils from mmpm.api.constants import http from mmpm.api.endpoints.endpoint import Endpoint +from mmpm.env import MMPMEnv from mmpm.log.factory import MMPMLogFactory logger = MMPMLogFactory.get_logger(__name__) @@ -18,7 +19,7 @@ class Mmpm(Endpoint): def __init__(self): self.name = "mmpm" self.blueprint = Blueprint(self.name, __name__, url_prefix=f"/api/{self.name}") - self.handler = None + self.env = MMPMEnv() @self.blueprint.route("/version", methods=[http.GET]) def version() -> Response: @@ -44,6 +45,8 @@ def upgrade() -> Response: Returns: Response: A Flask Response object indicating success or failure of the upgrade operation. """ + if self.env.MMPM_IS_DOCKER_IMAGE: + self.failure("MMPM is a Docker image. MMPM must be upgraded using the Docker CLI.") if mmpm.utils.upgrade(): return self.success("Upgrade MMPM") diff --git a/mmpm/subcommands/_sub_cmd_ui.py b/mmpm/subcommands/_sub_cmd_ui.py index c8abca25..f3f99cd7 100644 --- a/mmpm/subcommands/_sub_cmd_ui.py +++ b/mmpm/subcommands/_sub_cmd_ui.py @@ -5,6 +5,7 @@ from time import sleep from mmpm.constants import urls +from mmpm.env import MMPMEnv from mmpm.log.factory import MMPMLogFactory from mmpm.magicmirror.database import MagicMirrorDatabase from mmpm.subcommands.sub_cmd import SubCmd @@ -31,6 +32,7 @@ def __init__(self, app_name): self.usage = f"{self.app_name} {self.name} [--url] [--status] " self.database = MagicMirrorDatabase() self.ui = MMPMui() + self.env = MMPMEnv() def register(self, subparser): self.parser = subparser.add_parser(self.name, usage=self.usage, help=self.help) @@ -112,6 +114,10 @@ def exec(self, args, extra): if not self.database.is_initialized(): self.database.load() + if self.env.MMPM_IS_DOCKER_IMAGE: + logger.error("MMPM is a Docker image. Unable to interact with MMPM UI from CLI.") + return + if extra: logger.error(f"Extra arguments are not accepted. See '{self.app_name} {self.name} --help'") return diff --git a/mmpm/subcommands/_sub_cmd_upgrade.py b/mmpm/subcommands/_sub_cmd_upgrade.py index 99087bef..67047676 100644 --- a/mmpm/subcommands/_sub_cmd_upgrade.py +++ b/mmpm/subcommands/_sub_cmd_upgrade.py @@ -3,7 +3,9 @@ import json from typing import List +from mmpm import utils from mmpm.constants import paths +from mmpm.env import MMPMEnv from mmpm.log.factory import MMPMLogFactory from mmpm.magicmirror.database import MagicMirrorDatabase from mmpm.magicmirror.magicmirror import MagicMirror @@ -29,6 +31,7 @@ def __init__(self, app_name): self.usage = f"{self.app_name} {self.name} [--yes]" self.database = MagicMirrorDatabase() self.magicmirror = MagicMirror() + self.env = MMPMEnv() def register(self, subparser): self.parser = subparser.add_parser(self.name, usage=self.usage, help=self.help) @@ -76,7 +79,10 @@ def exec(self, args, extra): upgradable["MagicMirror"] = upgradable["MagicMirror"] and self.magicmirror.upgrade() if upgradable["mmpm"]: - print("Run 'pip install --upgrade --no-cache-dir mmpm' to install the latest version of MMPM. Run 'mmpm update' after upgrading.") + if self.env.MMPM_IS_DOCKER_IMAGE: + logger.warning("Cannot perform self-upgrade because MMPM is a Docker image. Stop MMPM and run `docker pull karsten13/mmpm:latest`") + else: + upgradable["mmpm"] = utils.upgrade() with open(paths.MMPM_AVAILABLE_UPGRADES_FILE, mode="w", encoding="utf-8") as upgrade_file: json.dump(upgradable, upgrade_file) diff --git a/mmpm/utils.py b/mmpm/utils.py index c15a2ec4..9d93b3d0 100644 --- a/mmpm/utils.py +++ b/mmpm/utils.py @@ -184,7 +184,7 @@ def upgrade() -> bool: """ error_code, stdout, stderr = run_cmd( - ["python3", "-m", "pip", "install", "--upgrade", "--no-cache-dir", "mmpm"], + ["python3", "-m", "pip", "install", "--upgrade", "mmpm"], message="Upgrading MMPM", ) diff --git a/ui/bun.lockb b/ui/bun.lockb index cb51a40deaa6fa9fe8c21b503e1791ac59b3e196..e19a5fe5450681d684129ea96d9dde954db8c96f 100755 GIT binary patch delta 14350 zcmeHNU1%It6h50-W74e6DBBp<3Vo=tl{6%cHX;d>k_0Ife?TD!C7bLton-%*-K6zF z&K8Qr7kw!4zF1J~V;@41_NA5}Vtw+-2TKtGLi?bUAc82tdd}S0oy}x-vy+{l2wj+a zCtvQp-#y>`J$LTL{lv!oMCoGW>$cQCcx)OfzqLr))$$)@cxvc!-bW10vVA6Lz=6J6 z*MQjKW&5YiWB~P4Xruq<4Xs$zHRDJJfC^CJEM8#fb%Bk_i*l{$$FY?TOAPR@3M`p` z17j5yl13&;@k$J!(^8=|481PUWqIhCB`%3AUUU34BO%Lg=ouq<24F_d4$Kz_XdOeZ z3v^i?dS;1BVvCpc_d(XCD}x@lXVb(M@3VC}((*$kvHYhJr$-eB29;iMa8QXq4tBi; zs>pXxYZW`FrgZ{G5>;H|94nloVSw|6T=rEOFppjV*hABQgx=qL4PYO=mob9;!Y~Mu z1{_Jb?E7f3=$=$wAeptoEXjCb%wA;!#HM^B7FWBJe(XH~&_g|DHmz4Cp8zrRgqWA( zb7%G0vlL&M0O+!ILr#p-X@#_&Eds!WhQ z2~=d`lCwD@OY!Nq?at~q#=L*L17cWJo)&{DDX@zIm1<_rjvExSs~~R0sG;1nwbzN! z*>`xa&rdr&vRBHf%_pq0LL&P2DZOfTj(F*JlJ>IfMhJC+6pBw!LzV;e5I1t3dQwrN z#-?G$3l3*;V$17FueDR*-HP*3MY@Ly&-YN_yCcAYK36E_4DHSWKsQ;%md>SfGi=?r zG*6WMOP??df}{Zl%69b0x(37+F9s)d&B|Z^ZCsPs;*~CcX!55qu%2F91@wQ2)h4!h z5Air}MtmTtJ21?Z@5dLEFfU+rKu3$Eo zCz)v;{n*}zAVK}(2E}y3RpO>-4Wst=wm_HV zp=Xx3B(`|X{@4$U{2NN$wdBLu|3D^7L4@Y3I>Ro2{jE%Y`8!K9Dv13rl6&>xR{+mY zulbbX=P2I(M9@4cl>YpgbkbZvtGir4*!w;bi`#ulf)7emJ~xSrjXouY_f7)rwN@!| zFCj{gTa5Ei8Kx^;o!5zRk1r;36awhkly-h#{;>H8#{t&F#L7#w6P!;jkS`1{e$DoV z1H|6*hgc*>l;=h2I5o;{4CJUda9s|mAHI=8ikl%I49&3|0j zl6o_-#fvu5;Q99a}HJ-}medhnE<06g8uu86dhwluofWtVBh0gmycR-@?)$F4m7J zqX&&#I=x6&_-_AZpWit#@z#jaAN=-54y6d~ZJbW#PBHF?g=E3p#ByAA9_wJ(Y(k&X zp{ya-dR{N;6hY=M`{2-bjMp~bNg8l4f3OyBuFSiY@8({rAmXD+|8!Q_BwGAuJUzEMkinLu&VO zvrGM*^7ENQoF0y=E9gB&{C<+~SZsKiq_^I!lkHCxRPp<9x)`v|2M_<(K%FhfyJFY7 zBjyDO5gR9))N!)Ob)eo|ksocoOhn|xm95t@>ohT8kb=;SO^`9a*+qnx-jeM-4GeJVP2_{qrW;enxnp-ZbvQF@-Z Kxw_PTYxF;aYVFnl delta 2313 zcmcgtOHUI~6u#5B!>dKd*eWF=5?UxBXoEysY?uXNJ0Os z-D;AUFnF)_*t`qoz3}a$UyeC4GS2nttCiKI6+*~|8AAN^H-doQ4K(*v>2>`k-gBM` zayxC4OnJwsz$Z9^d=mVwzF1sZ z%Vi1q%@fmO=A_YJqId&fRy^l93=E%!J=--4&#IpQPCqa3Qk&C=Jj(<8J#!!i0XKi~ zL=Kqly}=W4as5zJSZ>Jnh?Q8YJCdmmw|wLb5T1(iqQ#?T(H!H1kw!+2k$^^Lji$w7 z^SjDwBXWSfzbQp{Ph3(cpMg{Q=A&VbRdb7LTqI=m`EvI4<)`a>@M7SjJZj6V2nq+R z8fzJVz&cOloE!IKi&ZX7c(Sp+I|i|&y|2i#U{{(n@;eH06=bv9uw&j{HFQ|GJyW*w z@N&nPe_fMPV#Uv2cddn+PpnTd$!lIn^5)smV9MEUl9T+ZO&c5aKh$D}$8)W6qthZ|6LZJsH%0%!e zNQ6(f6LTI(yZRXd4vnQLHlpx>`KI^Uu8*+$pJ(^RLPp+N$k4}Qojx3Pvay|~{HJVf J=Q}>7jsVK2ugU-b