Files
JiboAutoMod/__pycache__/jibo_updater.cpython-313.pyc

207 lines
31 KiB
Plaintext
Raw Normal View History

<EFBFBD>
LR<4C>i<EFBFBD>S<00><01>2<00>SrSSKJr SSKrSSKrSSKrSSKrSSKrSSKrSSK r SSK
r
SSK r SSK r SSKr SSKr SSKrSSKJr SSKJr SSKJrJr SSKr\"\5R4R75r\S- r\S- r\S - rS
r "S S 5r!S1S jr"S2Sjr#S2Sjr$S2Sjr%S2Sjr&S3S4Sjjr'\"SS9"SS55r(S5S6Sjjr)\RT"S5r+S7Sjr,S8Sjr-S9Sjr.S1Sjr/SS.S:Sjjr0SS.S;S jjr1S<S!jr2S=S"jr3S>S#jr4S?S$jr5S@S%jr6SAS&jr7SBSCS'jjr8SDS(jr9SESS).SFS*jjjr:SGS+jr;SHS,jr<\=S-:Xa\>"\<"55eg!\?a \@"S.5 \>"S/5e\AarB\&"\C"\B55 \>"S05eSrBCBff=f)Ia<49>Jibo OS Updater
Downloads the latest JiboOs release from the configured Gitea instance,
extracts it, then uploads the contents of the release "build" folder into
Jibo's root filesystem over SFTP.
High-level flow:
1) Check latest release
2) Download + extract archive
3) SSH into Jibo (root / password)
4) Remount / as read-write
5) SFTP upload build/ contents into /
6) Optionally switch /var/jibo/mode.json back to "normal"
This tool assumes your Jibo is already modded and reachable via SSH.
<EFBFBD>)<01> annotationsN)<01> dataclass)<01>Path)<02>Iterable<6C>Optional<61> jibo_work<72>updateszupdate_state.jsonzChttps://kevinblog.sytes.net/Code/api/v1/repos/Kevin/JiboOs/releasesc<01>0<00>\rSrSrSrSrSrSrSrSr Sr
S r g
) <0B>Colors<72>1zzzzzzz<31>N) <0C>__name__<5F>
__module__<EFBFBD> __qualname__<5F>__firstlineno__<5F>RED<45>GREEN<45>YELLOW<4F>BLUE<55>CYAN<41>RESET<45>BOLD<4C>__static_attributes__r <00><00>jibo_updater.pyr r 1s%<00><00>
<14>C<EFBFBD> <16>E<EFBFBD> <17>F<EFBFBD> <15>D<EFBFBD> <15>D<EFBFBD> <15>E<EFBFBD> <14>Drr c<01><><00>[RR5(d@[[5H,nUR S5(aM[ [US5 M. gg)N<>_<>)<07>sys<79>stdout<75>isatty<74>dirr <00>
startswith<EFBFBD>setattr)<01>attrs r<00>_no_color_if_not_ttyr&;sF<00><00> <0E>:<3A>:<3A> <1C> <1C> <1E> <1E><17><06>K<EFBFBD>D<EFBFBD><13><EFBFBD><EFBFBD>s<EFBFBD>#<23>#<23><18> <13>F<EFBFBD>D<EFBFBD>"<22> %<25> <20> rc<01>`<00>[[RSU[R35 g)Nu )<04>printr rr<00><01>msgs r<00>
print_infor+Cs!<00><00> <09>V<EFBFBD>[<5B>[<5B>M<EFBFBD><14>c<EFBFBD>U<EFBFBD>6<EFBFBD><<3C><<3C>.<2E>
1<EFBFBD>2rc<01>`<00>[[RSU[R35 g)Nu✓ )r(r rrr)s r<00> print_successr-Gs!<00><00> <09>V<EFBFBD>\<5C>\<5C>N<EFBFBD>$<24>s<EFBFBD>e<EFBFBD>F<EFBFBD>L<EFBFBD>L<EFBFBD>><3E>
2<EFBFBD>3rc<01>`<00>[[RSU[R35 g)Nu⚠ )r(r rrr)s r<00> print_warningr/Ks!<00><00> <09>V<EFBFBD>]<5D>]<5D>O<EFBFBD>4<EFBFBD><03>u<EFBFBD>V<EFBFBD>\<5C>\<5C>N<EFBFBD>
3<EFBFBD>4rc<01>`<00>[[RSU[R35 g)Nu✗ )r(r rrr)s r<00> print_errorr1Os!<00><00> <09>V<EFBFBD>Z<EFBFBD>Z<EFBFBD>L<EFBFBD><04>S<EFBFBD>E<EFBFBD>&<26>,<2C>,<2C><1E>
0<EFBFBD>1rFc<01><><00>U(aSOSn[USUS35R5R5nU(dU$US;agUS;ag[S5 MQ) Nz[Y/n]z[y/N]T<> ><00>y<>yes><00>n<>noFzPlease answer y or n.)<04>input<75>strip<69>lowerr()<04>question<6F>default<6C>suffix<69>anss r<00> prompt_yes_nor?Ssc<00><00><1F>W<EFBFBD>W<EFBFBD>F<EFBFBD>
<0E><13>x<EFBFBD>j<EFBFBD><01>&<26><18><11>+<2B>,<2C>2<>2<>4<>:<3A>:<3A><<3C><03><12><1A>N<EFBFBD> <0E>,<2C> <1E><17> <0E>+<2B> <1D><18> <0A>%<25>&<26> rT)<01>frozenc<01>H<00>\rSrSr%S\S'S\S'S\S'S\S'S\S'S rg
) <0B>Release<73>`<00>str<74>tag_name<6D>name<6D>bool<6F>
prerelease<EFBFBD> tarball_url<72> zipball_urlr N)rrrr<00>__annotations__rr rrrBrB`s<00><00><11>M<EFBFBD>
<0A>I<EFBFBD><14><14><14><14><14>rrBc<01><00>[RRUSSS.S9n[RRX!S9nUR 5nSSS5 [
R "WRSSS95$!,(df  N2=f) Nzapplication/jsonzJiboUpdater/1.0)<02>Acceptz
User-Agent)<01>headers<72><01>timeout<75>utf-8<>replace<63><01>errors)<08>urllib<69>request<73>Request<73>urlopen<65>read<61>json<6F>loads<64>decode)<05>urlrP<00>req<65>resp<73>datas r<00> http_get_jsonraisw<00><00>
<10>.<2E>.<2E>
<20>
<20> <0B>(<28>+<2B>
<EFBFBD> !<21> <06>C<EFBFBD>
<10><1E><1E> <1F> <1F><03> <1F> 5<><14><13>y<EFBFBD>y<EFBFBD>{<7B><04>
6<EFBFBD> <0F>:<3A>:<3A>d<EFBFBD>k<EFBFBD>k<EFBFBD>'<27>)<29>k<EFBFBD><<3C> =<3D>=<3D>
6<EFBFBD> 5<>s <00>A<<03><
B
z ^v?(\d+)(?:\.(\d+))?(?:\.(\d+))?c<01>2<00>[RUR55nU(dg[UR S5=(d S5n[UR S5=(d S5n[UR S5=(d S5nX#U4$)N)rrr<00>r<00><00>)<05> _VERSION_RE<52>matchr9<00>int<6E>group)<05>tag<61>m<>major<6F>minor<6F>patchs r<00>_version_tupleroysk<00><00><13><19><19>#<23>)<29>)<29>+<2B>&<26>A<EFBFBD> <0C><18> <0F><01><07><07><01>
<EFBFBD><0F>a<EFBFBD> <20>E<EFBFBD> <0F><01><07><07><01>
<EFBFBD><0F>a<EFBFBD> <20>E<EFBFBD> <0F><01><07><07><01>
<EFBFBD><0F>a<EFBFBD> <20>E<EFBFBD> <11>%<25> <20> rc<01>V<00>[U5n[U[5(aU(d[SU35e/nUH<>n[U[5(dM[ UR SS55nU(a U(dMEUR[[UR SS55[UR SS55U[UR SS55[UR SS55S 95 M<> U(d [S
5eURS S S 9 US$)Nz&Unexpected releases API response from rHFrErrFrIrJ<00>rErFrHrIrJz.No releases found (after prerelease filtering)c<01>,<00>[UR5$)N)rorE)<01>rs r<00><lambda><3E>$get_latest_release.<locals>.<lambda><3E>s <00><00><0E>q<EFBFBD>z<EFBFBD>z<EFBFBD> :rT<><02>key<65>reverser) ra<00>
isinstance<EFBFBD>list<73> RuntimeError<6F>dictrG<00>get<65>appendrBrD<00>sort)<06> releases_api<70>allow_prerelease<73>raw<61>releases<65>itemrHs r<00>get_latest_releaser<65><00>s<><00><00>
<17> <0C>
%<25>C<EFBFBD> <15>c<EFBFBD>4<EFBFBD> <20> <20><03><1A>C<>L<EFBFBD>><3E>R<>S<>S<> <20>H<EFBFBD><13><04><19>$<24><04>%<25>%<25> <14><19>$<24>(<28>(<28><<3C><15>7<>8<>
<EFBFBD> <15>.<2E> <14><10><0F><0F> <13><1C>T<EFBFBD>X<EFBFBD>X<EFBFBD>j<EFBFBD>"<22>5<>6<><18><14><18><18>&<26>"<22>-<2D>.<2E>%<25><1F><04><08><08><1D><02> ;<3B><<3C><1F><04><08><08><1D><02> ;<3B><<3C>  <0E>
<EFBFBD> <14> <14><1A>K<>L<>L<> <0A>M<EFBFBD>M<EFBFBD>:<3A>D<EFBFBD>M<EFBFBD>I<> <13>A<EFBFBD>;<3B>rc<01><><00>U(dU$[RRU5n[RRU5nURUR:XaURUR:XaU$[RR URURUR URURUR45$)z<>Force downloads to use the same scheme/host as the API base.
Some Gitea instances can be configured with a different ROOT_URL than the
externally reachable hostname, which can leak into tarball_url/zipball_url.
)
rU<00>parse<73>urlparse<73>scheme<6D>netloc<6F>
urlunparse<EFBFBD>path<74>params<6D>query<72>fragment)<04> download_url<72>base_url<72>base<73>dls r<00>normalize_download_urlr<6C><00>s<><00><00> <18><1B><1B> <11><<3C><<3C> <20> <20><18> *<2A>D<EFBFBD> <0F><1C><1C> <1E> <1E>|<7C> ,<2C>B<EFBFBD>
<EFBFBD>y<EFBFBD>y<EFBFBD>D<EFBFBD>K<EFBFBD>K<EFBFBD><1F>B<EFBFBD>I<EFBFBD>I<EFBFBD><14><1B><1B>$<<3C><1B><1B> <12><<3C><<3C> "<22> "<22> <0A><1B><1B>d<EFBFBD>k<EFBFBD>k<EFBFBD>2<EFBFBD>7<EFBFBD>7<EFBFBD>B<EFBFBD>I<EFBFBD>I<EFBFBD>r<EFBFBD>x<EFBFBD>x<EFBFBD><12><1B><1B>M<> <06>rc<01>T<00>[RSSS9 [RSSS9 g)NT<4E><02>parents<74>exist_ok)<03>WORK_DIR<49>mkdir<69> UPDATES_DIRr rr<00> _ensure_dirsr<73><00>s%<00><00> <0C>N<EFBFBD>N<EFBFBD>4<EFBFBD>$<24>N<EFBFBD>/<2F><0F><15><15>d<EFBFBD>T<EFBFBD><15>2r<00><01>forcec <01>^<00>URRSSS9 UR5(aU(d[SU35 g[SU35 UR UR
S-5nSn[ SS5GH<>nUR5(aURSS9 [RRUS S
9nURRS 5nU(a UR5(a [U5OSnS n S n
[US5n UR!U
5n U (dO<>U R#U 5 U [%U 5- n U(aXU S-U- n [&R(R#SU S- SSUS- SSU SS35 [&R(R+5 M<>SSS5 SSS5 W(a[&R(R#S5 UR-U5 [/SU35 g UR5(aURSS9 [9SU35e!,(df  N<>=f!,(df  N<>=f![0a>nUnSU-n[3SUSUSUS35 [4R6"U5 SnAGM'SnAff=f)NTr<54>zUsing cached download: z Downloading: z.partrc<00>)<01>
missing_ok<EFBFBD><EFBFBD>rOzContent-Lengthri<00>wbgY@z g<00><>.Az.1fzMB / zMB (z%)<29>
zDownloaded to rdzDownload attempt z /3 failed: z. Retrying in zs...z"Download failed after 3 attempts: )<1D>parentr<74><00>existsr+<00> with_suffixr=<00>range<67>unlinkrUrVrXrNr}<00>isdigitrh<00>openrY<00>write<74>lenrr <00>flushrRr-<00> Exceptionr/<00>time<6D>sleepr{)r]<00>destr<74><00>tmp<6D>last_err<72>attemptr_<00>total<61> total_int<6E>
downloaded<EFBFBD>
chunk_size<EFBFBD>f<>chunk<6E>pct<63>e<>waits r<00> _downloadr<64><00>sT<00><00><08>K<EFBFBD>K<EFBFBD><15><15>d<EFBFBD>T<EFBFBD><15>2<> <0B>{<7B>{<7B>}<7D>}<7D>U<EFBFBD><12>,<2C>T<EFBFBD>F<EFBFBD>3<>4<><0E><0E><1D>s<EFBFBD>e<EFBFBD>$<24>%<25>
<0E>
<1A>
<1A>4<EFBFBD>;<3B>;<3B><17>0<>
1<EFBFBD>C<EFBFBD>(,<2C>H<EFBFBD><18><11>A<EFBFBD>;<3B><07>! <1D><12>z<EFBFBD>z<EFBFBD>|<7C>|<7C><13>
<EFBFBD>
<EFBFBD>d<EFBFBD>
<EFBFBD>+<2B><17><1E><1E>'<27>'<27><03>S<EFBFBD>'<27>9<>T<EFBFBD><1C> <0C> <0C>(<28>(<28>)9<>:<3A><05>*/<2F>E<EFBFBD>M<EFBFBD>M<EFBFBD>O<EFBFBD>O<EFBFBD>C<EFBFBD><05>J<EFBFBD><14> <09><1E>
<EFBFBD>'<27>
<EFBFBD><19>#<23>t<EFBFBD>_<EFBFBD><01><1E> $<24> <09> <09>*<2A> 5<><05>$<24>!<21><19><07><07><05><0E>"<22>c<EFBFBD>%<25>j<EFBFBD>0<>
<EFBFBD>$<24>",<2C>u<EFBFBD>"4<>y<EFBFBD>"@<40>C<EFBFBD><1F>J<EFBFBD>J<EFBFBD>,<2C>,<2C>"&<26>z<EFBFBD>#<23>~<7E>c<EFBFBD>&:<3A>%<25> <09>#<23> <0A>c<EFBFBD>?R<>RV<52>WZ<57>[^<5E>V_<56>_a<5F> b<><1E> <20>J<EFBFBD>J<EFBFBD>,<2C>,<2C>.<2E><1F>%<25> :<3A>&<19><13>
<EFBFBD>
<EFBFBD> <20> <20><14>&<26> <0F>K<EFBFBD>K<EFBFBD><04> <1D> <19>N<EFBFBD>4<EFBFBD>&<26>1<> 2<> <12>9<1F>H <0B>z<EFBFBD>z<EFBFBD>|<7C>|<7C> <0B>
<EFBFBD>
<EFBFBD>d<EFBFBD>
<EFBFBD>#<23>
<16>;<3B>H<EFBFBD>:<3A>F<>
G<EFBFBD>G<>9%<25>_<EFBFBD><5F> :<3A>9<><39>2<19> <1D><18>H<EFBFBD><14>g<EFBFBD>:<3A>D<EFBFBD> <19>-<2D>g<EFBFBD>Y<EFBFBD>k<EFBFBD>!<21><13>N<EFBFBD>SW<53>RX<52>X\<5C>]<5D> ^<5E> <10>J<EFBFBD>J<EFBFBD>t<EFBFBD> <1C> <1C><>  <1D>sL<00>AI$<02>AI<05>BI<07>7I<05>?A I$<02>
I <0B> I<05>
I! <09>I$<02>$
J,<05>.2J'<05>'J,c<01><><00>UR5(aU(a[R"U5 UR5(a[SU35 U$UR SSS9 [SUR
S35 SSjnUR SSSS /:XdURS
:Xa|[R"US 5nUR5H6nXR
- nU"X5(aM [S UR
35e URU5 SSS5 O<>URS :Xa{[R"U5nUR5H6nXR - nU"X5(aM [SUR 35e URU5 SSS5 O[SU35e[#SU35 U$!,(df  N=f!,(df  N/=f)NzUsing cached extraction: Tr<54>z Extracting <20> ...c<01><><00>UR5RUR55 g![a gf=f)NTF)<03>resolve<76> relative_tor<6F>)r<><00>targets r<00>
_is_within<EFBFBD>_extract.<locals>._is_within<69>s7<00><00> <19> <12>N<EFBFBD>N<EFBFBD> <1C> (<28> (<28><14><1C><1C><1E> 8<><17><><18> <19><18> <19>s <00>-0<00>
=<03>=<03><><EFBFBD><EFBFBD><EFBFBD>z.tarz.gzz.tgzzr:gzzUnsafe path in tar archive: z.zipzUnsafe path in zip archive: zUnsupported archive type: z Extracted to )r<>rr<>r<00>returnrG)r<><00>shutil<69>rmtreer+r<>rF<00>suffixesr=<00>tarfiler<65><00>
getmembersr{<00>
extractall<EFBFBD>zipfile<6C>ZipFile<6C>infolist<73>filenamer-)<08>archive<76> extract_dirr<72>r<><00>tf<74>member<65> member_path<74>zfs r<00>_extractr<74><00>s<><00><00><12><19><19><1B><1B><05><0E> <0A> <0A>k<EFBFBD>"<22><12><19><19><1B><1B><12>.<2E>{<7B>m<EFBFBD><<3C>=<3D><1A><1A><0F><15><15>d<EFBFBD>T<EFBFBD><15>2<><0E><1B>W<EFBFBD>\<5C>\<5C>N<EFBFBD>$<24>/<2F>0<><19><0F><17><17><02><03><1C><16><15><0F>/<2F>7<EFBFBD>><3E>><3E>V<EFBFBD>3K<33> <14>\<5C>\<5C>'<27>6<EFBFBD> *<2A>b<EFBFBD><1C>-<2D>-<2D>/<2F><06>)<29>K<EFBFBD>K<EFBFBD>7<> <0B>!<21>+<2B>;<3B>;<3B>&<26>)E<>f<EFBFBD>k<EFBFBD>k<EFBFBD>]<5D>'S<>T<>T<>*<2A> <0F>M<EFBFBD>M<EFBFBD>+<2B> &<26> +<2B> *<2A>
<11><1E><1E>6<EFBFBD> !<21> <14>_<EFBFBD>_<EFBFBD>W<EFBFBD> %<25><12><1C>+<2B>+<2B>-<2D><06>)<29>O<EFBFBD>O<EFBFBD>;<3B> <0B>!<21>+<2B>;<3B>;<3B>&<26>)E<>f<EFBFBD>o<EFBFBD>o<EFBFBD>EV<45>'W<>X<>X<>(<28> <0F>M<EFBFBD>M<EFBFBD>+<2B> &<26> &<26> %<25><1B>7<><07>y<EFBFBD>A<>B<>B<><11>M<EFBFBD>+<2B><1D>/<2F>0<> <16><16>#+<2B> *<2A><>&<26> %<25>s$<00>-G<03>3+G<03> -G!<03>>+G!<03>
G<07>!
G/c#<01>r# <00>URS5HnUR5(dMUv<00> M g7f)N<>build)<02>rglob<6F>is_dir)<02>rootr<74>s r<00>_iter_build_candidatesr<73>s(<00><00><00><14>
<EFBFBD>
<EFBFBD>7<EFBFBD>#<23><04> <0F>;<3B>;<3B>=<3D>=<3D><16>J<EFBFBD>$<24>s<00>(7<01> 7c<01><><00>SnSH"up#X- R5(dMX- nM$ URVs1sHoDR5iM nn[SU55(aUS- nU$s snf)Nr))<02>etc<74>)<02>optr<74>)<02>varrd)<02>usrrd)<02>librc)<02>binrcc3<01>j# <00>UH)n[R"SU[RS9v<00> M+ g7f)zv\d+(?:\.\d+)*)<01>flagsN)<03>re<72> fullmatch<63>
IGNORECASE)<02>.0<EFBFBD>ps r<00> <genexpr><3E>#_score_build_dir.<locals>.<genexpr>$s"<00><00><00>
R<EFBFBD>E<EFBFBD>q<EFBFBD>2<EFBFBD><<3C><<3C>)<29>1<EFBFBD>B<EFBFBD>M<EFBFBD>M<EFBFBD> B<>E<EFBFBD>s<00>13rd)r<><00>partsr:<00>any)r<><00>scorerF<00>weightr<74>r<>s r<00>_score_build_dirr<72>sn<00><00> <0A>E<EFBFBD>`<60> <0C><04> <10>K<EFBFBD> <1F> <1F> !<21> !<21> <11>O<EFBFBD>E<EFBFBD>a<01>!%<25>
<EFBFBD>
<EFBFBD> +<2B>
<EFBFBD>1<EFBFBD>W<EFBFBD>W<EFBFBD>Y<EFBFBD>
<EFBFBD>E<EFBFBD> +<2B>
<EFBFBD>
R<EFBFBD>E<EFBFBD>
R<EFBFBD>R<>R<> <0A><11>
<EFBFBD><05> <10>L<EFBFBD><4C> ,s<00>A2c<01><><00>U(aLX- R5nUR5(aUR5(d[SU35eU$[ [ U55nU(d [S5eUR [SS9 USn[U5S:Xa[U5S:<3A>a [S5 [SU35 U$) Nz--build-path not found: z{Could not find a 'build' folder in the extracted archive. Use --build-path to point to it (relative to the extracted root).TrvrrczFFound build folders, but none look like a rootfs overlay (no etc/opt).zUsing build folder: ) r<>r<>r<>r{rzr<>rr<>r<>r/r+)<05> extract_root<6F>explicitr<74><00>
candidates<EFBFBD>bests r<00>find_build_dirr<72>)s<><00><00><0F> <19> $<24> -<2D> -<2D> /<2F><01><10>x<EFBFBD>x<EFBFBD>z<EFBFBD>z<EFBFBD><11><18><18><1A><1A><1E>!9<>!<21><13>=<3D>><3E> ><3E><10><08><15>,<2C>\<5C>:<3A>;<3B>J<EFBFBD> <15><1A> P<01>
<EFBFBD>
<EFBFBD>
<0F>O<EFBFBD>O<EFBFBD>(<28>$<24>O<EFBFBD>7<> <15>a<EFBFBD>=<3D>D<EFBFBD><17><04><1D><11>"<22>s<EFBFBD>:<3A><EFBFBD><11>':<3A><15>^<5E>_<><0E>%<25>d<EFBFBD>V<EFBFBD>,<2C>-<2D> <0F>Krc<01><><00>UR5(d0$[R"URS55$![a 0s$f=f)NrQ)r<>rZr[<00> read_textr<74>)r<>s r<00>
load_stater<EFBFBD>AsC<00><00> <0F>;<3B>;<3B>=<3D>=<3D><11> <09><12><13>z<EFBFBD>z<EFBFBD>$<24>.<2E>.<2E><17>1<>2<>2<><32> <14><12><11> <09><12>s<00>$><00> A <03> A c<01><><00>URRSSS9 UR[R"USSS9S-SS9 g)NTr<54>rd)<02>indent<6E> sort_keysr<73>rQ)<01>encoding)r<>r<><00>
write_textrZ<00>dumps)r<><00>states r<00>
save_staterJs<<00><00><08>K<EFBFBD>K<EFBFBD><15><15>d<EFBFBD>T<EFBFBD><15>2<><08>O<EFBFBD>O<EFBFBD>D<EFBFBD>J<EFBFBD>J<EFBFBD>u<EFBFBD>Q<EFBFBD>$<24>?<3F>$<24>F<>QX<51>O<EFBFBD>Yrc <01><><00>[R"5nUR[R"55 UR UUUSSUUUS9 U$)NF)<08>hostname<6D>username<6D>password<72> look_for_keys<79> allow_agentrP<00>banner_timeout<75> auth_timeout)<05>paramiko<6B> SSHClient<6E>set_missing_host_key_policy<63> AutoAddPolicy<63>connect)<05>host<73>userr rP<00>clients r<00> ssh_connectrOsW<00><00> <15> <1F> <1F> !<21>F<EFBFBD>
<EFBFBD>&<26>&<26>x<EFBFBD>'=<3D>'=<3D>'?<3F>@<40>
<EFBFBD>N<EFBFBD>N<EFBFBD><15><15><19><1B><19><17><1E><1C><13> <06> <12>Mrc<01><><00>URXS9up4nUnUR5RSSS9nUR5RSSS9nURR 5n X<>U4$)NrOrQrRrS)<05> exec_commandrYr\<00>channel<65>recv_exit_status)
r<00>commandrP<00>stdinr <00>stderrr<00>out<75>err<72>codes
r<00>ssh_execr#_sq<00><00>"<22>/<2F>/<2F><07>/<2F>I<><19>E<EFBFBD>6<EFBFBD> <0A>A<EFBFBD>
<10>+<2B>+<2B>-<2D>
<1E>
<1E>w<EFBFBD>y<EFBFBD>
<1E>
9<EFBFBD>C<EFBFBD>
<10>+<2B>+<2B>-<2D>
<1E>
<1E>w<EFBFBD>y<EFBFBD>
<1E>
9<EFBFBD>C<EFBFBD> <11>><3E>><3E> *<2A> *<2A> ,<2C>D<EFBFBD> <0F>c<EFBFBD>><3E>rc<01>
<00>URS5Vs/sH o"(dM UPM nnSnUH+n[R"XE5nURU5 M- gs snf![a UR U5 MSf=f)N<>/)<06>split<69> posixpath<74>join<69>stat<61>IOErrorr<72>)<06>sftp<74>
remote_dirr<EFBFBD>r<><00>cur<75>parts r<00>ensure_remote_dirr/hss<00><00>"<22>(<28>(<28><13>-<2D> 3<>-<2D>1<EFBFBD><11>Q<EFBFBD>-<2D>E<EFBFBD> 3<>
<0A>C<EFBFBD><15><04><17>n<EFBFBD>n<EFBFBD>S<EFBFBD>'<27><03> <1C> <10>I<EFBFBD>I<EFBFBD>c<EFBFBD>N<EFBFBD><16><> 4<><34> <17> <1C> <10>J<EFBFBD>J<EFBFBD>s<EFBFBD>O<EFBFBD> <1C>s<00>
A<04>A<04>A#<02>#B<05>B)<01>dry_runc<01><><00>UR5n[URS55n[U5nSnUGH<>nUR U5R 5n[ R"X(5n UR5(aU(aMW[X 5 MdUR5(a<>[R"U5n
U(aUS- nM<>[U[ R"U 55 URU 5 UR!X<>5 US- nUS-S:Xa[)SUSUS35 GMUR+5(dGMU(aUS- nGM+[U[ R"U 55 UR%['U5U 5 UR-5R.S-n UR1X<>5 US- nUS-S:XdGM<>[)SUSUS35 GM<> [3S US
35 g![a GN
f=f!["a/ UR5n UR%['U 5U 5 GN5f=f!["a N<>f=f) N<>*rrc<00><>z Uploaded r%z entries...i<>zUpload complete (z files/links))r<><00>sortedr<64>r<>r<><00>as_posixr'r(r<>r/<00>
is_symlink<EFBFBD>os<6F>readlink<6E>dirname<6D>remover*<00>symlinkr<6B><00>putrDr+<00>is_filer)<00>st_mode<64>chmodr-) r+<00>
local_root<EFBFBD> remote_rootr0<00>pathsr<73><00>sentr<74><00>rel<65> remote_pathr<68><00> real_path<74>modes r<00> upload_treerHts<00><00><1C>#<23>#<23>%<25>J<EFBFBD> <12>:<3A>#<23>#<23>C<EFBFBD>(<28> )<29>E<EFBFBD> <0F><05>J<EFBFBD>E<EFBFBD> <0C>D<EFBFBD> <12><01><0F>m<EFBFBD>m<EFBFBD>J<EFBFBD>'<27>0<>0<>2<><03><1F>n<EFBFBD>n<EFBFBD>[<5B>6<> <0B> <0C>8<EFBFBD>8<EFBFBD>:<3A>:<3A><16><18> <1D>d<EFBFBD> 0<> <14> <0C><<3C><<3C>><3E>><3E><17>[<5B>[<5B><11>^<5E>F<EFBFBD><16><14><01> <09><04><18> <1D>d<EFBFBD>I<EFBFBD>$5<>$5<>k<EFBFBD>$B<> C<>
6<><19><18>K<EFBFBD>K<EFBFBD> <0B>,<2C><15> <0C> <0C>V<EFBFBD>1<>
<11>A<EFBFBD>I<EFBFBD>D<EFBFBD><13>c<EFBFBD>z<EFBFBD>Q<EFBFBD><EFBFBD><1A>Y<EFBFBD>t<EFBFBD>f<EFBFBD>A<EFBFBD>e<EFBFBD>W<EFBFBD>K<EFBFBD>@<40>A<> <14> <0C>9<EFBFBD>9<EFBFBD>;<3B>;<3B><16><14><01> <09><04><18> <1D>d<EFBFBD>I<EFBFBD>$5<>$5<>k<EFBFBD>$B<> C<> <10>H<EFBFBD>H<EFBFBD>S<EFBFBD><11>V<EFBFBD>[<5B> )<29> <15><18>v<EFBFBD>v<EFBFBD>x<EFBFBD>'<27>'<27>%<25>/<2F><04><14>
<EFBFBD>
<EFBFBD>;<3B>-<2D> <11>A<EFBFBD>I<EFBFBD>D<EFBFBD><13>c<EFBFBD>z<EFBFBD>Q<EFBFBD><EFBFBD><1A>Y<EFBFBD>t<EFBFBD>f<EFBFBD>A<EFBFBD>e<EFBFBD>W<EFBFBD>K<EFBFBD>@<40>A<>a<13>d<12>%<25>d<EFBFBD>V<EFBFBD>=<3D>9<>:<3A><>;<1F><19><18><19><><1D> 6<><1D>I<EFBFBD>I<EFBFBD>K<EFBFBD> <09><14><08><08><13>Y<EFBFBD><1E><1B>5<> 6<><36>&<1D> <15><14> <15>sB<00>9H<02>
H<02>!.I<02>
H<05>H<02>H<05>H<02>5I<05>I<05>
I!<05> I!c<01><><00>SnURUS5nUR5RSSS9nSSS5 [
R "W5n[U[5(d [S5eS US
'[
R"US S 9S -nURUS5nURURS55 SSS5 g!,(df  N<>=f![an[ SUSU35eSnAff=f![a" [R"SSW5nXc:XaSnN<>f=f!,(df  g=f)Nz/var/jibo/mode.jsonrsrQrRrSzFailed to read <20>: zmode.json is not a JSON object<63>normalrG)<02>,rJ)<01>
separatorsr<EFBFBD>z("mode"\s*:\s*")([^"]+)(")z
\1normal\3z{"mode": "normal"}
<EFBFBD>w)r<>rYr\r*r{rZr[ryr|<00>
ValueErrorrr<>r<><00>subr<62><00>encode)r+<00>remoter<65><00>contentr<74>r`<00> new_contents r<00>set_mode_json_to_normalrU<00>s<00><00> "<22>F<EFBFBD><<3C> <11>Y<EFBFBD>Y<EFBFBD>v<EFBFBD>s<EFBFBD> #<23>q<EFBFBD><17>f<EFBFBD>f<EFBFBD>h<EFBFBD>o<EFBFBD>o<EFBFBD>g<EFBFBD>i<EFBFBD>o<EFBFBD>@<40>G<EFBFBD>$<24> 1<><13>z<EFBFBD>z<EFBFBD>'<27>"<22><04><19>$<24><04>%<25>%<25><1C>=<3D>><3E> ><3E><1F><04>V<EFBFBD> <0C><1A>j<EFBFBD>j<EFBFBD><14>+<2B>><3E><14>E<> <0B>
<0E><19><19>6<EFBFBD>3<EFBFBD> <1F>1<EFBFBD> <09><07><07> <0B>"<22>"<22>7<EFBFBD>+<2B>,<2C>
<20> <1F>'$<24> #<23><> <12><<3C><1A>_<EFBFBD>V<EFBFBD>H<EFBFBD>B<EFBFBD>q<EFBFBD>c<EFBFBD>:<3A>;<3B>;<3B><><<3C><> <15>1<><18>f<EFBFBD>f<EFBFBD>:<3A>M<EFBFBD>7<EFBFBD>S<> <0B> <16> !<21>0<>K<EFBFBD><4B> 1<><31>
<20> <1F>sQ<00>C<00>C <03>C<00>AD<00>#!D0<03>
C<07>C<00>C<00>
C><03>(C9<03>9C><03>)D-<03>,D-<03>0
D>c <01><00>[5 [R"SS9nURSSSSSS9 URS S
S S 9 URS SSS 9 URS[SS 9 URSSSS9 URSSS9 URSSS9 URS[
[ SS9 URSSSS9 URS SS!S9 URS"SS#S9 URS$SS%S9 URS&SS'S9 URS([S)S*S9 UR5n[5 UR(+n[S+5 UR(Ga.[UR5n[U[ 5(d [#S,5eSnUH<>n[U[$5(dM['UR)S-S.55UR:XdME[+['UR)S-S.55['UR)S/S.55[-UR)S0S155['UR)S2S.55['UR)S3S.55S49n O U(d[#S5UR35eUnO[/URUS69nUR0(aUR2(d [#S75e[5UR65n[U[$5(a%['UR)UR8S.55OS.n[S8UR0S9UR:(aS0OS:S;35 U(a[S<U35 UR<(d"U(aX<>R0:Xa [?S=5 g>UR@(d)[CS?UR8S@3S1SA9(d [SB5 gCUR0SD3n [DSE- U - n
[DSF- UR0- n [GUR2UR5n [IX<>UR<SG9 [QX<>UR<SG9 U RS5Vs/sHo<>RU5(dMUPM nn[WU5SI:XaUS>OU n[YUURZ5n[SJUR\SKUR8SL35 [_UR8UR\UR`URbSM9n[eUSN5unnnSOU;a [SP5 Ok[SQ5 [eUSRSSSM9unnnUS>:wa[gSTUSUURi535 [eUSN5unnnSOU;a [#SV5e[?SW5 URj(a [?SX5 O8[SY5 URm5n[oUUSZS1S[9 URq5 S1nURr(aSnO2URt(aS1nOUR@(aS1nO
[CS\S1SA9nU(aTURj(a [S]5 O7URm5n[wU5 [?S^5 URq5 URj(dC[U[$5(a.UR0XqR8'[yUR6U5 [?S_UR0S;35 URq5 g>![JRLRNan [#SHU 35eSn A ff=fs snf!URq5 f=f!URq5 f=f!URq5 f=f)`Nz3Update a modded Jibo with the latest JiboOs release)<01> descriptionz--ipz--hostrTzJibo IP/hostname)r<><00>required<65>helpz--userr<72>zSSH username (default: root))r<rYz
--password<72>jibozSSH password (default: jibo)z--releases-apizGitea releases API URLz--stable<6C>
store_truezIgnore prereleases)<02>actionrYz--tagz6Install a specific tag (e.g. v3.3.0) instead of latest)rYz --build-pathz5Path to build folder inside extracted tree (relative)z --state-filez#Where to store last applied version)<03>typer<rYz--forcez2Re-download and re-install even if version matchesz--yesuDont prompt for confirmationz --dry-runu3Download/extract + connect, but dont write filesz--return-normalzEAfter update, set /var/jibo/mode.json mode back to normal (no prompt)z--no-return-normalz1After update, do not ask to return to normal modez --ssh-timeout<75>zSSH connect timeout secondszChecking latest release...z Unexpected releases API responserErrFrHFrIrJrqzTag not found in releases: )r<>z,Release JSON missing tag_name or tarball_urlzLatest: z (<28>stable<6C>)zLast applied (from state): zFAlready at latest version (per local state). Use --force to reinstall.rz5This will upload the release build overlay into / on z and overwrite files. Continue?)r<zAborted.rdz.tar.gz<67> downloads<64> extractedr<64>zDownload failed: rczConnecting to <20>@r<>rOzksh -c 'touch /.jibo_rw_test 2>/dev/null && rm /.jibo_rw_test 2>/dev/null && echo WRITABLE || echo READONLY'<27>WRITABLEzRoot FS already writablezRemounting / as read-write...zsh -c 'mount -o remount,rw /'<27><zRemount command returned z
. stderr: z0Failed to remount / as writable (still READONLY)z/ remounted writablezDry-run: skipping uploadz/Starting SFTP upload (this can take a while)...r%)rAr0z@Return Jibo to normal mode (mode.json: int-developer -> normal)?z"Dry-run: skipping mode.json changez%Updated /var/jibo/mode.json to normalzUpdate finished ()=r&<00>argparse<73>ArgumentParser<65> add_argument<6E>DEFAULT_RELEASES_APIr<00>STATE_FILE_DEFAULTrh<00>
parse_argsr<EFBFBD>r_r+rjrar<>ryrzr{r|rDr}rBrGr<>rErIr<><00>
state_filerrHr<>r-r5r?r<>r<>r<>rU<00>error<6F>URLErrorr<72><00>iterdirr<72>r<>r<><00>
build_pathrrr <00> ssh_timeoutr#r/r9r0<00> open_sftprH<00>close<73> return_normal<61>no_return_normalrUr)<18>parser<65>argsr<73>r<><00>chosenr<6E><00>releaser<00>last<73> archive_name<6D> archive_pathr<68>rIr<>r<><00>children<65> search_root<6F> build_dirrr"r r!r+<00> do_returns r<00>mainr<6E><00>s<><00><00><18><1A> <15> $<24> $<24>1f<31> g<>F<EFBFBD>
<EFBFBD><17><17><06><08>v<EFBFBD><04>K]<5D><17>^<5E>
<EFBFBD><17><17><08>&<26>7U<37><17>V<>
<EFBFBD><17><17> <0C>f<EFBFBD>;Y<><17>Z<>
<EFBFBD><17><17>(<28>2F<32>Me<4D><17>f<>
<EFBFBD><17><17>
<EFBFBD><<3C>>R<><17>S<>
<EFBFBD><17><17><07>&^<5E><17>_<>
<EFBFBD><17><17><0E>-d<><17>e<>
<EFBFBD><17><17><0E>T<EFBFBD>;M<>Ty<54><17>z<>
<EFBFBD><17><17> <09>,<2C>=q<><17>r<>
<EFBFBD><17><17><07> <0C>;\<5C><17>]<5D>
<EFBFBD><17><17> <0B>L<EFBFBD>?t<><17>u<>
<EFBFBD><17><17><19><1B> T<><18><06>
 <0B><17><17><1C><1B> @<40><18><06>  <0B><17><17><0F>c<EFBFBD>2<EFBFBD>Da<44><17>b<> <11> <1C> <1C> <1E>D<EFBFBD><10>N<EFBFBD><1F>;<3B>;<3B><EFBFBD><14><0E>+<2B>,<2C> <0B>x<EFBFBD>x<EFBFBD>x<EFBFBD><1B>D<EFBFBD>-<2D>-<2D>.<2E><03><19>#<23>t<EFBFBD>$<24>$<24><1E>A<>B<> B<>$(<28><06><17>D<EFBFBD><1D>d<EFBFBD>D<EFBFBD>)<29>)<29><18><12>4<EFBFBD>8<EFBFBD>8<EFBFBD>J<EFBFBD><02>+<2B>,<2C><04><08><08>8<> <20> <20><14><18><18>*<2A>b<EFBFBD>!9<>:<3A><1C>T<EFBFBD>X<EFBFBD>X<EFBFBD>f<EFBFBD>b<EFBFBD>1<>2<>#<23>D<EFBFBD>H<EFBFBD>H<EFBFBD>\<5C>5<EFBFBD>$A<>B<> #<23>D<EFBFBD>H<EFBFBD>H<EFBFBD>]<5D>B<EFBFBD>$?<3F> @<40> #<23>D<EFBFBD>H<EFBFBD>H<EFBFBD>]<5D>B<EFBFBD>$?<3F> @<40> <12><06><16><18><16><1E>!<<3C>T<EFBFBD>X<EFBFBD>X<EFBFBD>J<EFBFBD>G<>H<> H<><18><07>$<24>T<EFBFBD>%6<>%6<>IY<49>Z<><07> <12> <1B> <1B>7<EFBFBD>#6<>#6<><1A>I<>J<>J<> <16>t<EFBFBD><EFBFBD><EFBFBD> '<27>E<EFBFBD>,6<>u<EFBFBD>d<EFBFBD>,C<>,C<>3<EFBFBD>u<EFBFBD>y<EFBFBD>y<EFBFBD><14><19><19>B<EFBFBD>'<27> (<28><12>D<EFBFBD><0E><18>'<27>*<2A>*<2A>+<2B>2<EFBFBD>g<EFBFBD>>P<>>P<>l<EFBFBD>V^<5E>-_<>_`<60>a<>b<> <0B><12>0<><14><06>7<>8<> <10>J<EFBFBD>J<EFBFBD>D<EFBFBD>T<EFBFBD>-=<3D>-=<3D>%=<3D><15>^<5E>_<><10> <0F>8<EFBFBD>8<EFBFBD><1C>C<>D<EFBFBD>I<EFBFBD>I<EFBFBD>;<3B>Nm<4E> n<><19>
<EFBFBD> <17>z<EFBFBD> "<22><14><1E>&<26>&<26>'<27>w<EFBFBD>/<2F>L<EFBFBD><1E><1B>,<2C>|<7C>;<3B>L<EFBFBD><1D> <0B>+<2B>g<EFBFBD>.><3E>.><3E>><3E>K<EFBFBD>(<28><17>)<<3C>)<<3C>d<EFBFBD>>O<>>O<>P<>K<EFBFBD>4<><11>+<2B>4<EFBFBD>:<3A>:<3A>><3E> <0A>\<5C>d<EFBFBD>j<EFBFBD>j<EFBFBD>9<>'<27>.<2E>.<2E>0<>?<3F>0<>a<EFBFBD>H<EFBFBD>H<EFBFBD>J<EFBFBD><01>0<>H<EFBFBD>?<3F>!$<24>X<EFBFBD><1D>!<21>!3<>(<28>1<EFBFBD>+<2B><1B>K<EFBFBD><1E>{<7B>D<EFBFBD>O<EFBFBD>O<EFBFBD><<3C>I<EFBFBD><0F><1E><04> <09> <09>{<7B>!<21>D<EFBFBD>I<EFBFBD>I<EFBFBD>;<3B>d<EFBFBD>;<3B><<3C> <18><14><19><19>D<EFBFBD>I<EFBFBD>I<EFBFBD>t<EFBFBD>}<7D>}<7D>d<EFBFBD>FV<46>FV<46> W<>F<EFBFBD>7<17>!<21>&<26>+X<02>Y<02><0E><04>c<EFBFBD>3<EFBFBD> <15><13> <1C> <16>1<> 2<> <16>6<> 7<>%<25>f<EFBFBD>.M<>WY<57>Z<>N<EFBFBD>D<EFBFBD>#<23>s<EFBFBD><13>q<EFBFBD>y<EFBFBD><1D> 9<>$<24><16>z<EFBFBD>#<23>)<29>)<29>+<2B><1D>W<>X<>%<25>f<EFBFBD>/\<02>]<02>N<EFBFBD>D<EFBFBD>#<23>s<EFBFBD><19><13>$<24>"<22>#U<>V<>V<> <19>0<> 1<> <0F><<3C><<3C> <19>4<> 5<> <16>H<> I<><19>#<23>#<23>%<25>D<EFBFBD> <1D><1B>D<EFBFBD>)<29><13>e<EFBFBD>L<><14>
<EFBFBD>
<EFBFBD> <0C><19> <09> <0F> <1D> <1D><1C>I<EFBFBD> <11> "<22> "<22><1D>I<EFBFBD> <11>X<EFBFBD>X<EFBFBD><1D>I<EFBFBD>%<25>&h<>rw<72>x<>I<EFBFBD> <14><13>|<7C>|<7C><1A>?<3F>@<40><1D>'<27>'<27>)<29><04>!<21>+<2B>D<EFBFBD>1<>!<21>"I<>J<><18>J<EFBFBD>J<EFBFBD>L<EFBFBD><13>|<7C>|<7C><19>%<25><14>&<26>&<26>#*<2A>#3<>#3<><05>i<EFBFBD>i<EFBFBD> <20><1A>4<EFBFBD>?<3F>?<3F>E<EFBFBD>2<><15>)<29>'<27>*:<3A>*:<3A>);<3B>1<EFBFBD>=<3D>><3E><10> <0F> <0C> <0C><0E><>K <12><<3C><<3C> <20> <20>4<><1A>.<2E>q<EFBFBD>c<EFBFBD>2<>3<>3<><33>4<><34> @<01><><<15>
<EFBFBD>
<EFBFBD> <0C><>*<19>J<EFBFBD>J<EFBFBD>L<EFBFBD><4C> <0F> <0C> <0C><0E>sc<00>*\<00>$]<04>]<04>C]6<00> ] <00>!B ]6<00>.]!<00>A=]6<00>]<03>1\?<03>?]<03> ]<03>]6<00>!]3<03>3]6<00>6^<03>__main__z
Interrupted.<2E><>rc)r<><00>None)r*rDr<>r<>)F)r;rDr<rGr<>rG)<01>)r]rDrPrhr<><00>object)rjrDr<>ztuple[int, int, int])r<>rDr<>rGr<>rB)r<>rDr<>rDr<>rD)r]rDr<>rr<>rGr<>r<>)r<>rr<>rr<>rGr<>r)r<>rr<>zIterable[Path])r<>rr<>rh)r<>rr<>z Optional[str]r<>r)r<>rr<>r|)r<>rrr|r<>r<>)
rrDrrDr rDrPrhr<><00>paramiko.SSHClient)re)rr<>rrDrPrhr<>ztuple[int, str, str])r+<00>paramiko.SFTPClientr,rDr<>r<>)r%)
r+r<>r@rrArDr0rGr<>r<>)r+r<>r<>r<>)r<>rh)D<>__doc__<5F>
__future__rrfrZr7r'r<>r<>rr<>r<><00> urllib.errorrU<00> urllib.parse<73>urllib.requestr<74><00> dataclassesr<00>pathlibr<00>typingrrr<00>__file__r<5F>r<><00>
SCRIPT_DIRr<EFBFBD>r<>rjrir r&r+r-r/r1r?rBra<00>compilerfror<>r<>r<>r<>r<>r<>r<>r<>r<>rrr#r/rHrUr<>r<00>
SystemExit<EFBFBD>KeyboardInterruptr(r<>r<>rDr rr<00><module>r<>s<><00><01><04>"#<23><0F> <0B> <09><10> <09> <0A>
<EFBFBD><0E> <0B><13><13><15><0E>!<21><18>%<25><0F><12>(<28>^<5E> "<22> "<22> *<2A> *<2A> ,<2C>
<EFBFBD> <15> <0B> #<23><08><16><19>"<22> <0B><1D> 3<>3<><12>\<5C><14><15><15>&<26>3<>4<>5<>2<>
'<27> <0B>$<24><17><15><15><18><15>
><3E><11>j<EFBFBD>j<EFBFBD><<3C>=<3D> <0B>!<21><17><<06>.3<>
6;<3B>0H<01>fAF<01>$<17>N<17> <11><10>0<12>Z<01>
<12> <1A> <1C><1B>?;<3B>
<1A> ?;<3B>
<1D>?;<3B><14>?;<3B><15>?;<3B>
<12> ?;<3B> 
<EFBFBD> ?;<3B>D-<2D>4c<17>L <0C>z<EFBFBD><19><1C><18><14><16> <20> <20><1A><> <1D><1E> <0A><1E><1F><18><13>o<EFBFBD><1D> <14><1C><13>C<EFBFBD><01>F<EFBFBD><1B><18><11>m<EFBFBD><1B><><1C>s<00> E <00> F<03>;F<03>F