From cf1d462d0900dea12ca5896afb15625e45bf8804 Mon Sep 17 00:00:00 2001 From: gutosie Date: Mon, 11 Feb 2019 20:40:01 +0200 Subject: [PATCH] neoboot2 --- NeoBoot/.info | 40 ++ NeoBoot/__init__.py | 25 + NeoBoot/neo.png | Bin 0 -> 5430 bytes NeoBoot/neologo.mvi | Bin 0 -> 42848 bytes NeoBoot/plugin.py | 1492 +++++++++++++++++++++++++++++++++++++++++++ NeoBoot/run.py | 399 ++++++++++++ NeoBoot/unpack.py | 313 +++++++++ 7 files changed, 2269 insertions(+) create mode 100644 NeoBoot/.info create mode 100644 NeoBoot/__init__.py create mode 100644 NeoBoot/neo.png create mode 100644 NeoBoot/neologo.mvi create mode 100644 NeoBoot/plugin.py create mode 100644 NeoBoot/run.py create mode 100644 NeoBoot/unpack.py diff --git a/NeoBoot/.info b/NeoBoot/.info new file mode 100644 index 0000000..8ec50ee --- /dev/null +++ b/NeoBoot/.info @@ -0,0 +1,40 @@ +#!/bin/sh +#Wspierane tunery satelitarne: +#Machine BCM - getCPUSoC(): + +#cat /proc/stb/info/chipset: +Ultimo4k : 7444s +Solo4k : 7376 +Zero 4K : 72604 +Duo4k : 7278 #BCM7278 +Uno 4K : 7252s +Uno4kSE : 7252s +Ultimo : 7405(with 3D) +Uno : 7405(with 3D) +Duo : 7335 +Duo2 : 7424 +Zero : 7362 +Solo : 7325 +Solose : 7241 +Solose-v2 : 7241 +Solo2 : 7356 + +Formuler F1 : bcm7356 +Formuler F3 : 7362 + +Miraclebox MBmini : bcm7358 +Miraclebox Micro : bcm7362 +Miraclebox Ultra : bcm7424 + +Octagon Sf8008 : 3798mv200 +Octagon SF4008 : bcm7251 + +Zgemma h7S : bcm7251s +Zgemma H9S : + +AX HD60 4K : hi3798mv200 root@ax60:~# cat /etc/hostname : ax60 + +OSmini : BCM7362 + +atemio6000 : bcm7362 + diff --git a/NeoBoot/__init__.py b/NeoBoot/__init__.py new file mode 100644 index 0000000..05c47ff --- /dev/null +++ b/NeoBoot/__init__.py @@ -0,0 +1,25 @@ +# -*- coding: utf-8 -*- + +from Components.Language import language +from Tools.Directories import resolveFilename, SCOPE_PLUGINS, SCOPE_LANGUAGE +import os, gettext +PluginLanguageDomain = 'NeoBoot' +PluginLanguagePath = 'Extensions/NeoBoot/locale' + +def localeInit(): + lang = language.getLanguage()[:2] + os.environ['LANGUAGE'] = lang + print '[NeoBoot] set language to ', lang + gettext.bindtextdomain(PluginLanguageDomain, resolveFilename(SCOPE_PLUGINS, PluginLanguagePath)) + + +def _(txt): + t = gettext.dgettext(PluginLanguageDomain, txt) + if t == txt: + #print '[NeoBoot] fallback to default translation for', txt + t = gettext.dgettext('enigma2', txt) + return t + + +localeInit() +language.addCallback(localeInit) diff --git a/NeoBoot/neo.png b/NeoBoot/neo.png new file mode 100644 index 0000000000000000000000000000000000000000..7d924c23416572d35c51b8db26d4df8601c767ef GIT binary patch literal 5430 zcmV-670K#}P)WJ2mL}Xuq9mH@&B}5n51mnoH}P?iI}-zn83)Y-L?Wmlpe?U% zy1QulMZc=+(N%R$o%7v4s;X^Ta13iM-q7r|YE_+eYJdCN-~RUF+k1ZkAdyH&P6M=X zI4tkK|9(yjITDGmY15|DLRK_Qqq)AGZ9_w}-h4Bc34zb&qiw|sT5rCYuP2iP0s-1q zte~KvfVMmCpup|sOR9=Ebm)*=v0?>62&DX&bwyFIZF~4zRaGp@I^kJURh81x($ku@ zh{xkwgb-K$xrkEAt>Uh`?m8_o0f-3`CY(01Qe0fj(VK1}5D4&xni`IN;~NBnL3}FHtZ+O=n#uwq#j{r&yC8VV8X>||3}84DX5c{LPbQ&}0CDk>Q4>SF8k z>1>}jkGajwJks9ItDz7tmzEOk?xwo6mAB^3<;_{MNOyE#c6Rb+Z7tj9&0|VyD?jV) zWz)EEY$`3~m5K@m1_sbHO{2KDn3CdRTz)^HK!D%Y)Udj+kbn98@44>63%NTU$9U^4 zw)gb#*yPE4@Az@9=<8$iM<21(!+ zt+%L8CiyQHTtG=l38JyFQLb9G>debnQIx$!MMZPYG+_~s$8Qrt{N_v&^?JQRTeoiA zZ_YHgJv}{A+p}lS8JF*uzx-viUAuOjal(m20bS%(_&|7QU8B;R^z?>B;_+OC-&o?zOZ_5@6LLn9m3^0E7Z02p* z!q1zUcs?3s!J$JGPnp7(nwm)Y{aM0px0|JXeb}1DgGY`aTUuD!*N3rrGndBWlmdZ3 zfN!_8@#582b89+{r@Na!Y~6}He3*MeAyzM5%zbTb)Le8CZ%&xN_{o#GudR)rELgxj z<>d&E2PG2W(s&$ijmN5NMhE?$NlT->a5|05U?rN$^LHud3>>9~nKj z(KK?u72Iw&Znv8X+vdoPHxgdDly|GE2^t1}&~^U3pa8!RR9Y4-ix%-mMPWiFL#1W$ zUR@p6Boe$^SxM`XCES)s;MFuH0y|4fX}RSVzA`jKscqBn#V@k=3tynjFjx?a(Yky& z-yR&~3+XgRZn}wmwY5x<5|5_w)l`ZjH{QsHb#*9~#h%()T5rCYg~=oyO`}FicF&l> zk;RLdnM(1;>S`7z5==4-T5q|97yA3DvMdfRSinTv#^rKlLx7PCM+*y~yPKX;0eC!xvaFG9+PLuTev7%9kMsc}Zgnd3z@4wHT3l{K|p&^uboXy*}(^*`M77VgA z6e9B4Yj}e}CYUCLMMWguc!SNM5Lz(E@#12B{_eXdy}iuNWVk6Bg8AUwrpnhDuBEcsyB2A3S(au2``G%d)5shZ&zvqYA;ZRaKy>OzrAI7lQp|Wn3K& zQ(_nZs3W$_`f=k(d%dW!7?(sM)EEXsio!cyFRevIICPyk9UaU_B#=2=TL|{JTzn7; zp*x)zhC%tj0GGsK_-&guhl3r3g`^4#(KL-rCW9W0a!DjYRVG712>#^r(Oy)9)9FM} z6w>K5%UWA8Z5vexcKH3YmX!^Mxog+1MI1hSSl)Z@y<@^?J^uLPX!$KY7C=#ytd$-s z3=1I;04*&olCc3l69A{1KmAJqDdkq+H$I>5SrLguWOH*f9UUEKtyl{S3z<1{CaS7l z`MKq5KMz>Aa3Pv$nrF3iN2ixG(=_Ss?jBnVk0}WohB0OsHVh*x;jXT(u_NJ;Im-V; zzxSzm?EeTi9~J$-7+(`Y;BYujNC4yy%p(&5`R7v|u=DtuZ6g2+khuf=$qwiv4&)yv z7Az}!k^-#UyOH>#$46C%8UL&afZ>eC#GxVn_uRRNOopf5ew$wx7V@XblhM6iQmGUx zKKzhpFS-cDvXHrK1VF5_ldFy&=h}Fjhi1+sSX&FKiWP~l@6}hi!{b2}g4buw%4RBZ zxW>Q$Pc}5LJ{UyUHviPy%ca*}kE65{q$J+h$j^7|;DulifUiZPeEZ^yDV#C|DFkL; zAG?0{J64vIP-xq{I&U6iGGNj zmW{Qw(q6MhKIQkzIhB?2k_i*!!Rl&hKlq^hNiZlMDk_rp_rEWjrcRX?PnaNQRaVL; z3JayZW{qr~JzHK@Q6ZzZ-!3mHFP9&LLehHR0XcvCc=^*nKsL>vFV8>!d^uyr4B61o zAcwcKt*SKXI?3(Z$@KQ}-DS&2{pwec$#C53#pUr3cQ`=TdFH(Hhyu6v^l;}JZ}5Zi za)i^#>dsF3i;Gbdg@1Otx%a>ULi6V{{<-HEbh|-Oc&Usi_G=_D>C%cD`Y1Iy;jLE1KG8uuiVB!WSN5d6aJ=Jw`hDzCYQ_)9Nw_m(XT z1_H#oyCD{%$M5G~{C;+X!#Mr^Pi|@3wn+#BV{00!s&YV4 zps9)FM~>ijIuTAM^O8vpwze{@tBVrT9M(G_1m2+`WH?OH;b6!x;P`P??cB*xkB3ED zw{rKgW!$)92Ub%P4wnlxSC9elXEM;wkX`0*~i{UOU<@%u^zUX!n*}NH?P8^zs$1u1p z76Ye~mB}Q_qEUX*)y498^LS|dc!sub=dpzgdAzxqzYT}k7K`DYJegl^+=%UPaO=PT z*fxt33GNyg;QC||5((b(`S{MZZK#UEyB-e@gu^`2+R7_)=VCTCvUK7^ZkafdbW;;A z&Y#c!Y-wRtYb)|70?>6Ghr@xx;mArkpVKnp zac(_!3|mSLdpzu_s34V0a(hPy>nbZzGZ~h&w_{0}^<_C2bU1jqvXYExQav!hrHKSi zDQR{%*bxX|`~ApFhNVZ3V%hdEZojJX$3TE&&M4XOIP(Sum}VFlza3HB#bOTuYd8mI6RasHDEOi1 z?d{zogqYLb-cCb9!?|TS3!t{PmWqlBq?CI_S67z=ShsH7xs^GKV9Amt*{H)bO@J|z zm>w&Tm+LtJj}-xrmEz$!4L%2Fmw@wE7tZE3_^}9ixoY`*?dbH*scOX|^TYqyF#68Z zspc~Bf1~Tef6ly4Ra-t?+NZ)9T^|0lIh^jgo@(4-0q4_MQc9#{G1V||S{C^-!H}ZR zs_WRfa`m~0rs6Oy?>k7^oGRporcK(}pV{@p1irjTuDZ`5^+5jF3EOol4c3PDN;`c;*frXfbu(({E8 zr)5!Tn#?dw&d+2hkrGu(VnT3KRryHMIHcN$2JdAZ?o(!=T_KHT}`Nj1*){QD|{GQAY6c2?6Id*tTsZm?jT;y_`R7 z8bvc_BAia-&=7rZzs*x0eZ)Gim#fohzExJnxC<`8J!J~1rY71y{E+9vVRq;`Kk|5( zTw6&s%g81BS0(Er=Ri%69PX7CW18nnpQKjVCSd9D1%9wcNm8iiWspe*S4j!bhuMg9* z2>AWnFliEnwY3N!*3iJ#H{axkfdCPQ1CMF)y}?1Qx%_g1GiM?#i@}2j>1kW^ZksU!_oPYK@i^_bg`uy{$zU(r3-hP`@u0_A7vJ%gZO4w7&>v)W{ue80b+uPtAW;&gK4 z#TQwbNRVJ%_-;)N_q_Zv znyNxq7xL&)?2;0kIRR&cAfhPH(}O4|pmOF+e%IE9yHt@9k@o|+LI3FU@mErE&2N9p!)`bJuY3ie>)4h>#x%42Fu9%>q@-U;WIT?v zZQg$44OW(xqQqj^1@rkR8yezyO~V@svHa*!eti5m|FnKR-uik1J|BI>d1c!#W zyT6~R>C+(^CB1hqKR5#KZ+SV=FzDI1kzW)Qp?kfkIX`OKHW|Y}v29E#5jmx^rOfvG0Gh+`iN=P}L6$gh z;D7|UCY`NbEb_MaS;4Dnwr?+gi_zyJe&7K2w6(F{??*EXt{52L z_Gpx+OopF@!(4F9HE3RM-W*{W z#>aFs8Azwe^!L-dYZs3d6tKOt6rpKYhCy8*Vc9s*0L#Ham$1KlRj8pMDM=eJ=a6`;l|E z+y0|--Des1)6Sxw73a^z|E%ZOGmZaQ$2jFV_#B)aaLOR-9Gs;BKBvLwH255x)8KRP z|C@kCOH0f3z(#j)~41tQR!&`x*j^hUIu*6Br}b-WZI zZ&Fme0(NHVR7cX*-8#GNh`mXxl7*#}PPJg$skEYrl~$}Mky`?}tnUdu=ePHF&hPA* zeSY8fJ7<62p;RG(xU$y!KF|O5ECBLu1=D?7)+1>)K@`))^i2G?@y6LVXWx2j_RTln zoQ)rI=FG{<%bjy8e$1JZo0~g7ub?0=Z+`Cl`FVK-MMVV##l>ZJ-E|)Tc|Z0JAb=m_ z{S-n-EE7lZ>sH`F!oLCko_wxB@!TDHf`t1EPQO-?uwu^g)0+}^Oq;WG)5Ve<2}@i5 z&x8LvosiI_V*dYish$abOJ~5;!>@6=524sC`5GmzTLqC){CKP0IB0z&KUkFiNj)cO zIHON+-p%Rua5@VIB?_at7zV3&cp{T@Hx>qEl{25_b3*)c{y%lqy42^-yEZHNOeUAJ z8;YS%knSQ~C%QOE)2z5tEHC*K#mkv=Rha^uB=sU~Wt0X-@xOT%R`YT)ul(rz*qxWR zsd>}Ocda?xL)de*E}lSSyT)UM2*O^K`SfL+O$Ca5nm&La5***sB`mF;7ws< zIb94ZXEQK`-ZI8zU4_+J%iusMC+ZZ%@wP}cCRI@07!V`oaaq?ni)RdLibheK-9_+Y z@Tt?yM~^;z__^7$U%vX+J07pP``DU`CG&sUd}l)T$17jMuip4PVQI_h*W!;z>mQ4l zJ8jNmA6C4#bkoN_*MpruM3_E~{B+0cJAOI+RK%f8iILN8>3#Q($uEAjaMqnSMubYo zAO0!flMN@!AIaYJapd8PU3op4-|V;wi8jp{dLsvS!`k-*V+1j?UlhZmyTn|F5FbtK+z zkvA%wsTjsizc&5zId4u|vHaIN-dxeM{PebS_PojCn)6Q2!=a;E@bc8h)L7#l`|y=N zWdFZY;c$bp|G)+f3k#K%rv1xLH{X>rZO-z~Hl3~iDy)LoZpAbG?N_G;TAnW1p56Q4 zsg8no@R7e)i%XhbD|uMxS&_N0?DT7M|84!Q_~rkqGVU9Ew_WpNJ3DA)orMrt`;nWJ zQMF9f&4tPS;qG*rnPO?&m6;Bua&yb;-m;zV_Lp4Qxz|M&{^_f|mvYWIos!k4OzVB!T=gvBX_)0hBFR_eC) z>5T&w@8qkOs3hT;~K!X(M;e&s1n}^MKZx*?V659<*6_~rgO9Y8L1dn zblBqk-FL#$qCNd4jq8Pe!{T=jzH}f3q!gu7WU?xqSxu$}#S~Z1xuU8Pc*C?}F!P22 z9$p)T4aKnVj34^9g4v~!Bc(W4(0xnqI|o#@Z?+1h|J=mCOPpTd|C`%(3 zQmbp3oWS^Uk$FL$Ha^;&ru3-n`^c%!WL79-zo0Q54`+{to4ITq=NN)Hki$7fRxE}X z8$Y9ohWmWB(0Q23Bxr1vLof|DXyruCeu3l(1(HzEOA=T&Ct1hk2q{@#)6o=co(_3% zGdvXVrdb~8W-p{y{WF&}dSxK1r=q1up+!peLZ#~0zb_0Aoc)~9oLu9UR26EGhRfCo zP%ZP>ZKIFaPPzSQEZkNSoo-mn!vp;sWBKt!RSPawsDF_uKWF*KVre|7LpE2mzc>T7Bb50+i3 z?hdQ}q3JhzNmsWup0{g+*N13?oV11~=`bLW2M)eo53vhcn6BaaI?GeMWr(*7kgAql z?HNJUw%D7F9dta%8;aq6KG_f5gdPesQ4V(yL>jt0_F{z=!zxi_>AnLR%;9j;#N1Sg zlU@keBczCeGO9B=T_r?hhH|`cw;yiv*>c8}TDgww_+k+!OyvyykOi6JsgS2wtPyNG z&so_~nrH#e>0*toDT+PCvYWBAq<|^S^5*(N_BvtRG|8qpZ__v#O|K0yY+!)Q8cyP5 zb!xt{lQUd$ReqQxP_dp@hKi}WZ^L#SBY z%~F*D+u>C?qMdci(_d8nWD_|?WSgW}L0bj4Ap{~OayG+b!8ktoJji&)3#8dxm46M5 zSG+;}vHldAo1*ksix%0IaMks(vlk}2n46_UxCOGksWfzA5;z*pD|kY@q`6n`=o
Ix5I4i#*X^wYL!)I6kYoi`2{`4vX^AJfe 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 O&ix*##>(69n*RpEVaDeG literal 0 HcmV?d00001 diff --git a/NeoBoot/plugin.py b/NeoBoot/plugin.py new file mode 100644 index 0000000..c483660 --- /dev/null +++ b/NeoBoot/plugin.py @@ -0,0 +1,1492 @@ +#!/usr/bin/python +# -*- coding: utf-8 -*- + +from __init__ import _ +from Plugins.Extensions.NeoBoot.files import Harddisk +from Plugins.Extensions.NeoBoot.files.stbbranding import getKernelVersionString, getKernelImageVersion, getCPUtype, getCPUSoC, getImageNeoBoot, getBoxVuModel, getBoxHostName, getTunerModel +from enigma import getDesktop +from enigma import eTimer +from Screens.Screen import Screen +from Screens.Console import Console +from Screens.MessageBox import MessageBox +from Screens.ChoiceBox import ChoiceBox +from Screens.VirtualKeyBoard import VirtualKeyBoard +from Screens.Standby import TryQuitMainloop +from Components.About import about +from Components.Sources.List import List +from Components.Button import Button +from Components.ActionMap import ActionMap, NumberActionMap +from Components.GUIComponent import * +from Components.MenuList import MenuList +from Components.Input import Input +from Components.Label import Label +from Components.ProgressBar import ProgressBar +from Components.ScrollLabel import ScrollLabel +from Components.Pixmap import Pixmap, MultiPixmap +from Components.config import * +from Components.ConfigList import ConfigListScreen +from Tools.LoadPixmap import LoadPixmap +from Tools.Directories import fileExists, pathExists, createDir, resolveFilename, SCOPE_PLUGINS +from os import system, listdir, mkdir, chdir, getcwd, rename as os_rename, remove as os_remove, popen +from os.path import dirname, isdir, isdir as os_isdir +import os +import time +# Copyright (c) , gutosie license +# +# Redystrybucja wersji programu i dokonywania modyfikacji JEST DOZWOLONE, pod warunkiem zachowania niniejszej informacji o prawach autorskich. +# Autor NIE ponosi JAKIEJKOLWIEK odpowiedzialności za skutki użtkowania tego programu oraz za wykorzystanie zawartych tu informacji. +# Modyfikacje przeprowadzasz na wlasne ryzyko!!! +# O wszelkich zmianach prosze poinformowac na http://all-forum.cba.pl w temacie pod nazwa -#[NEOBOOT]#- + +# This text/program is free document/software. Redistribution and use in +# source and binary forms, with or without modification, ARE PERMITTED provided +# save this copyright notice. This document/program is distributed WITHOUT any +# warranty, use at YOUR own risk. + +PLUGINVERSION = '7.00 ' +UPDATEVERSION = '7.15' + +class MyUpgrade(Screen): + screenwidth = getDesktop(0).size().width() + if screenwidth and screenwidth == 1920: + skin = """ + + + \ + {"template": [MultiContentEntryText(pos = (90, 1), size = (920, 66), flags = RT_HALIGN_LEFT|RT_VALIGN_CENTER, text = 0), + MultiContentEntryPixmapAlphaTest(pos = (8, 4), size = (66, 66), png = 1), + ], + "fonts": [gFont("Regular", 40)], + "itemHeight": 66 + } + + + + + """ + else: + skin = """ + + + + {"template": [MultiContentEntryText(pos = (90, 1), size = (920, 66), flags = RT_HALIGN_LEFT|RT_VALIGN_CENTER, text = 0), + MultiContentEntryPixmapAlphaTest(pos = (8, 4), size = (66, 66), png = 1), + ], + "fonts": [gFont("Regular", 40)], + "itemHeight": 66 + } + + + + + """ + __module__ = __name__ + + def __init__(self, session): + Screen.__init__(self, session) + self.list = [] + self['list'] = List(self.list) + self.wybierz() + self['actions'] = ActionMap(['WizardActions', 'ColorActions'], {'ok': self.KeyOk, + 'back': self.changever}) + + def changever(self): + ImageChoose = self.session.open(NeoBootImageChoose) + if fileExists('/usr/lib/enigma2/python/Plugins/Extensions/NeoBoot/.location'): + out = open('/media/neoboot/ImageBoot/.version', 'w') + out.write(PLUGINVERSION) + out.close() + self.close() + else: + self.close(self.session.open(MessageBox, _('No file location NeoBot, do re-install the plugin.'), MessageBox.TYPE_INFO, 10)) + self.close() + return ImageChoose + + def wybierz(self): + self.list = [] + mypath = '/usr/lib/enigma2/python/Plugins/Extensions/NeoBoot' + if not fileExists(mypath + 'icons'): + mypixmap = '/usr/lib/enigma2/python/Plugins/Extensions/NeoBoot/images/ok.png' + png = LoadPixmap(mypixmap) + res = (_('Update neoboot in all images ?'), png, 0) + self.list.append(res) + self['list'].list = self.list + + def KeyOk(self): + self.sel = self['list'].getCurrent() + if self.sel: + self.sel = self.sel[2] + if self.sel == 0 and self.session.open(MyUpgrade2): + pass + self.close() + + +class MyUpgrade2(Screen): + screenwidth = getDesktop(0).size().width() + if screenwidth and screenwidth == 1920: + skin = '' + else: + skin = '' + + def __init__(self, session): + Screen.__init__(self, session) + self['lab1'] = Label(_('NeoBoot: Upgrading in progress\nPlease wait...')) + self.activityTimer = eTimer() + self.activityTimer.timeout.get().append(self.updateInfo) + self.onShow.append(self.startShow) + + def startShow(self): + self.activityTimer.start(10) + + def updateInfo(self): + self.activityTimer.stop() + f2 = open('/media/neoboot/ImageBoot/.neonextboot', 'r') + mypath2 = f2.readline().strip() + f2.close() + if fileExists('/.multinfo'): + self.myClose(_('Sorry, NeoBoot can installed or upgraded only when booted from Flash.')) + self.close() + elif mypath2 != 'Flash': + self.myClose(_('Sorry, NeoBoot can installed or upgraded only when booted from Flash.')) + self.close() + else: + for fn in listdir('/media/neoboot/ImageBoot'): + dirfile = '/media/neoboot/ImageBoot/' + fn + if isdir(dirfile): + target = dirfile + '/usr/lib/enigma2/python/Plugins/Extensions/NeoBoot' + cmd = 'rm -r ' + target + ' > /dev/null 2>&1' + system(cmd) + cmd = 'cp -r /usr/lib/enigma2/python/Plugins/Extensions/NeoBoot ' + target + system(cmd) + + out = open('/media/neoboot/ImageBoot/.version', 'w') + out.write(PLUGINVERSION) + out.close() + self.myClose(_('NeoBoot successfully updated. You can restart the plugin now.\nHave fun !!!')) + + + def myClose(self, message): + ImageChoose = self.session.open(NeoBootImageChoose) + self.session.open(MessageBox, message, MessageBox.TYPE_INFO) + self.close(ImageChoose) + + +class MyHelp(Screen): + screenwidth = getDesktop(0).size().width() + if screenwidth and screenwidth == 1920: + skin = """ + + + """ + else: + skin = """ + + """ + __module__ = __name__ + + def __init__(self, session): + Screen.__init__(self, session) + self['lab1'] = ScrollLabel('') + self['actions'] = ActionMap(['WizardActions', 'ColorActions', 'DirectionActions'], {'back': self.close, + 'ok': self.close, + 'up': self['lab1'].pageUp, + 'left': self['lab1'].pageUp, + 'down': self['lab1'].pageDown, + 'right': self['lab1'].pageDown}) + self['lab1'].hide() + self.updatetext() + + def updatetext(self): + message = _('NeoBoot Ver. ' + PLUGINVERSION + ' Enigma2\n\nDuring the entire installation process does not restart the receiver !!!\n\n') + message += _('NeoBoot Ver. updates ' + UPDATEVERSION + ' \n\n') + message = _('For proper operation NeoBota type device is required USB stick or HDD, formatted on your system files Linux ext3 or ext4..\n\n') + message += _('1. If you do not have a media formatted with the ext3 or ext4 is open to the Device Manager , select the drive and format it.\n\n') + message += _('2. Go to the device manager and install correctly hdd and usb ...\n\n') + message += _('3. Install NeoBota on the selected device.\n\n') + message += _('4. Install the needed packages...\n\n') + message += _('5. For proper installation XenoBota receiver must be connected to the Internet.\n\n') + message += _('6. In the event of a problem with the installation cancel and inform the author of the plug of a problem.\n\n') + message += _('Have fun !!!') + self['lab1'].show() + self['lab1'].setText(message) + + +class Opis(Screen): + screenwidth = getDesktop(0).size().width() + if screenwidth and screenwidth == 1920: + skin = """ + + + + + + + + + """ + else: + skin = """ + + + + + + + + + """ + __module__ = __name__ + + def __init__(self, session): + Screen.__init__(self, session) + self['key_red'] = Label(_('Remove NeoBoot of STB')) + self['lab1'] = ScrollLabel('') + self['actions'] = ActionMap(['WizardActions', 'ColorActions', 'DirectionActions'], {'back': self.close, + 'red': self.delete, + 'ok': self.close, + 'up': self['lab1'].pageUp, + 'left': self['lab1'].pageUp, + 'down': self['lab1'].pageDown, + 'right': self['lab1'].pageDown}) + self['lab1'].hide() + self.updatetext() + + def updatetext(self): + message = _('NeoBoot Ver. ' + PLUGINVERSION + '\n\n') + message += _('NeoBoot Ver. updates ' + UPDATEVERSION + '\n\n') + message += _('1. Requirements: For proper operation of the device NeoBota are required USB stick or HDD.\n\n') + message += _('2. NeoBot is fully automated\n\n') + message += _('3. To install a new image in MultiBocie should be sent by FTP software file compressed in ZIP or NIF to the folder: \n/media/neoboot/ImagesUpload and remote control plugin NeoBoot use the green button \n\n') + message += _('4. For proper installation and operation of additional image multiboot, use only the image intended for your receiver. !!!\n\n') + message += _('5. By installing the multiboot images of a different type than for your model STB DOING THIS AT YOUR OWN RISK !!!\n\n') + message += _('6. The installed to multiboot images, it is not indicated update to a newer version.\n\n') + message += _('The authors plug NeoBot not liable for damage a receiver, NeoBoota incorrect use or installation of unauthorized additions or images.!!!\n\n') + message += _('Have fun !!!') + message += _('\nCompletely uninstall NeoBota: \nIf you think NeoBot not you need it, you can uninstall it.\nTo uninstall now press the red button on the remote control.\n\n') + self['lab1'].show() + self['lab1'].setText(message) + + def delete(self): + message = _('Are you sure you want to completely remove NeoBoota of your image?\n\nIf you choose so all directories NeoBoota will be removed.\nA restore the original image settings Flash.') + ybox = self.session.openWithCallback(self.mbdelete, MessageBox, message, MessageBox.TYPE_YESNO) + ybox.setTitle(_('Removed successfully.')) + + def mbdelete(self, answer): + if answer is True: + cmd = "echo -e '\n\n%s '" % _('Recovering setting....\n') + cmd1 = 'rm -R /usr/lib/enigma2/python/Plugins/Extensions/NeoBoot; rm -R /media/neoboot/ImageBoot/.Flash; rm -R /media/neoboot/ImageBoot/.neonextboot; rm -R /media/neoboot/ImageBoot/.version' + cmd2 = 'rm -R /sbin/neoinit*' + cmd3 = 'ln -sfn /sbin/init.sysvinit /sbin/init' + cmd4 = 'cp -rf /etc/fstab.org /etc/fstab; rm /etc/fstab.org ' + cmd5 = 'cp -rf /etc/init.d/volatile-media.sh.org /etc/init.d/volatile-media.sh; rm /etc/init.d/volatile-media.sh.org ' + cmd6 = 'opkg install volatile-media; sleep 2; killall -9 enigma2' + self.session.open(Console, _('NeoBot was removed !!! \nThe changes will be visible only after complete restart of the receiver.'), [cmd, + cmd1, + cmd2, + cmd3, + cmd4, + cmd5, + cmd6]) + self.close() + +class Montowanie(Screen): + skin = """ + + + {"template": [MultiContentEntryText(pos = (50, 1), size = (520, 36), flags = RT_HALIGN_LEFT|RT_VALIGN_CENTER, text = 0), + MultiContentEntryPixmapAlphaTest(pos = (4, 2), size = (36, 36), png = 1), + ], + "fonts": [gFont("Regular", 22)], + "itemHeight": 36 + } + + + """ + __module__ = __name__ + + def __init__(self, session): + Screen.__init__(self, session) + self.list = [] + self['list'] = List(self.list) + self.downList() + self['actions'] = ActionMap(['WizardActions', 'ColorActions'], {'ok': self.KeyOk, + 'back': self.close}) + + def downList(self): + self.list = [] + mypixmap = '/usr/lib/enigma2/python/Plugins/Extensions/NeoBoot/images/ok.png' + png = LoadPixmap(mypixmap) + res = (_('Start the device manager ?'), png, 0) + self.list.append(res) + self['list'].list = self.list + + def KeyOk(self): + self.sel = self['list'].getCurrent() + if self.sel: + self.sel = self.sel[2] + if self.sel == 0: + if fileExists('/usr/lib/enigma2/python/Plugins/SystemPlugins/DeviceManager*/devicemanager.cfg'): + system('rm -f /usr/lib/enigma2/python/Plugins/SystemPlugins/DeviceManager*/devicemanager.cfg; touch /usr/lib/enigma2/python/Plugins/SystemPlugins/DeviceManager*/devicemanager.cfg') + if fileExists('/etc/devicemanager.cfg'): + system(' rm -f /etc/devicemanager.cfg; touch /etc/devicemanager.cfg ') + cmd = '/media/neoboot/ImageBoot/Backup_NeoBoot.sh ' + os.system('opkg install util-linux-sfdisk') + from Plugins.Extensions.NeoBoot.files.devices import ManagerDevice + self.session.open(ManagerDevice) + else: + self.session.open(MessageBox, _('The operation has been canceled or meoboot is not running in stb VuPlus'), MessageBox.TYPE_INFO, 7) + + +class NeoBootInstallation(Screen): + screenwidth = getDesktop(0).size().width() + if screenwidth and screenwidth == 1920: + skin = """ + + + + + + + + + + + + + + + + """ + else: + skin = """ + + + \n + + + \n + \n + \n + \n + \n + \n + \n + \n + """ + + def __init__(self, session): + Screen.__init__(self, session) + self.list = [] + self['config'] = MenuList(self.list) + self['key_red'] = Label(_('Instruction')) + self['key_green'] = Label(_('Installation')) + self['key_yellow'] = Label(_('Info disc')) + self['key_blue'] = Label(_('Device Manager')) + self['label1'] = Label(_('Welcome to NeoBoot %s Plugin installation.') % PLUGINVERSION) + self['label3'] = Label(_('WARNING !!! First, mount the device.')) + self['label2'] = Label(_('Here is the list of mounted devices in Your STB\nPlease choose a device where You would like to install NeoBoot')) + self['actions'] = ActionMap(['WizardActions', 'ColorActions', 'DirectionActions'], {'red': self.Instrukcja, + 'green': self.install, + 'yellow': self.datadrive, + 'blue': self.devices, + 'back': self.close}) + self.updateList() + + def Instrukcja(self): + self.session.open(MyHelp) + + def datadrive(self): + try: + message = "echo -e '\n" + message += _('NeoBot checks the connected media.\nWAIT ...\n\nDISCS:') + message += "'" + cmd = '/sbin/blkid' + system(cmd) + print '[MULTI-BOOT]: ', cmd + self.session.open(Console, _(' NeoBot - Available media:'), [message, cmd]) + except: + pass + + def updateList(self): + if fileExists('/proc/mounts'): + with open('/proc/mounts', 'r') as f: + for line in f.readlines(): + if line.startswith('/dev/sd') and line.find('/media/neoboot') == -1 and (line.find('ext4') != -1 or line.find('ext3') != -1): + try: self.list.append(line.split(' ')[1] + '/') + except Exception: pass # nie powinno sie zdarzyc, ale w razie czego + if len(self.list) == 0: + self['label2'].setText(_('Sorry it seems that there are not Linux formatted devices mounted on your STB. To install NeoBoot you need a Linux formatted part1 device. Click on the blue button to open Devices Panel')) + self['config'].setList(self.list) + + def checkReadWriteDir(self, configele): + from Plugins.Extensions.NeoBoot.files import Harddisk + import os.path + import Plugins.Extensions.NeoBoot.files.Harddisk + supported_filesystems = frozenset(('ext4', 'ext3', 'ext2', 'ntfs', 'nfs', )) + candidates = [] + mounts = Harddisk.getProcMounts() + for partition in Harddisk.harddiskmanager.getMountedPartitions(False, mounts): + if partition.filesystem(mounts) in supported_filesystems: + candidates.append((partition.description, partition.mountpoint)) + + if candidates: + locations = [] + for validdevice in candidates: + locations.append(validdevice[1]) + + if Harddisk.findMountPoint(os.path.realpath(configele)) + '/' in locations or Harddisk.findMountPoint(os.path.realpath(configele)) in locations: + if fileExists(configele, 'w'): + return True + else: + dir = configele + self.session.open(MessageBox, _('The directory %s is not writable.\nMake sure you select a writable directory instead.') % dir, type=MessageBox.TYPE_ERROR) + return False + else: + dir = configele + self.session.open(MessageBox, _('The directory %s is not a EXT2, EXT3, EXT4 or NFS partition.\nMake sure you select a valid partition type.') % dir, type=MessageBox.TYPE_ERROR) + return False + else: + dir = configele + self.session.open(MessageBox, _('The directory %s is not a EXT2, EXT3, EXT4 or NFS partition.\nMake sure you select a valid partition type.') % dir, type=MessageBox.TYPE_ERROR) + return False + + def devices(self): + check = False + if check == False: + message = _('After selecting OK start Mounting Manager, option Mount - green\n') + message += _('Do you want to run the manager to mount the drives correctly ?\n') + ybox = self.session.openWithCallback(self.device2, MessageBox, message, MessageBox.TYPE_YESNO) + ybox.setTitle(_('Device Manager')) + + def device2(self, yesno): + if yesno: + if fileExists('/usr/lib/enigma2/python/Plugins/SystemPlugins/DeviceManager*/devicemanager.cfg'): + system('rm -f /usr/lib/enigma2/python/Plugins/SystemPlugins/DeviceManager*/devicemanager.cfg; touch /usr/lib/enigma2/python/Plugins/SystemPlugins/DeviceManager*/devicemanager.cfg') + if fileExists('/etc/devicemanager.cfg'): + system(' rm -f /etc/devicemanager.cfg; touch /etc/devicemanager.cfg ') + from Plugins.Extensions.NeoBoot.files.devices import ManagerDevice + self.session.open(ManagerDevice) + else: + self.close() + + def install(self): + if not os.path.isfile('/etc/fstab.org'): + self.session.open(MessageBox, _('NeoBot - First use the Device Manager and mount the drives correctly !!!'), MessageBox.TYPE_INFO, 7) + self.close() + if fileExists('/.multinfo'): + self.session.open(MessageBox, _('Sorry, NeoBoot can installed or upgraded only when booted from Flash.'), MessageBox.TYPE_INFO, 7) + self.close() + else: + self.first_installation() + + def first_installation(self): + check = False + if fileExists('/proc/mounts'): + with open('/proc/mounts', 'r') as f: + for line in f.readlines(): + if line.startswith('/dev/sd') and line.find('/media/neoboot') == -1 and (line.find('ext4') != -1 or line.find('ext3') != -1): + check = True + break + + if check == False: + self.session.open(MessageBox, _('Sorry, there is not any connected devices in your STB.\nPlease connect HDD or USB to install NeoBoot!'), MessageBox.TYPE_INFO) + else: + if not fileExists('/usr/lib/enigma2/python/Plugins/Extensions/NeoBoot/files/fstab'): + self.session.open(MessageBox, _('Device Manager encountered an error, disk drives not installed correctly !!!'), MessageBox.TYPE_INFO) + self.close() + self.mysel = self['config'].getCurrent() + if self.checkReadWriteDir(self.mysel): + message = _('Do You really want to install NeoBoot in:\n ') + self.mysel + '?' + ybox = self.session.openWithCallback(self.install2, MessageBox, message, MessageBox.TYPE_YESNO) + ybox.setTitle(_('Install Confirmation')) + else: + self.close() + + def install2(self, yesno): + if yesno: + system('cd /usr/lib/enigma2/python/Plugins/Extensions/NeoBoot/; chmod 0755 ./bin/neoini*; chmod 0755 ./ex_init.py; chmod 0755 ./files/targetimage.sh; chmod 0755 ./files/NeoBoot.sh; chmod 0755 ./files/S50fat.sh; cd;') + cmd = 'mkdir /media/neoboot;mount ' + self.mysel + ' /media/neoboot' + system(cmd) + cmd2 = 'mkdir ' + self.mysel + 'ImageBoot;mkdir ' + self.mysel + 'ImagesUpload' + system(cmd2) + cmd3 = 'mkdir ' + self.mysel + 'ImageBoot;mkdir ' + self.mysel + 'ImagesUpload/.kernel' + system(cmd3) + + if fileExists('/proc/mounts'): + fileExists('/proc/mounts') + f = open('/proc/mounts', 'r') + for line in f.readlines(): + if line.find(self.mysel): + mntdev = line.split(' ')[0] + + f.close() + mntid = os.system('blkid -s UUID -o value ' + mntdev + '>/usr/lib/enigma2/python/Plugins/Extensions/NeoBoot/bin/install') + os.system('blkid -s UUID -o value ' + mntdev + '>/usr/lib/enigma2/python/Plugins/Extensions/NeoBoot/bin/install') + + fstabuuid = os.popen('blkid -s UUID -o value ' + mntdev).read() + fstabuuidwrite = 'UUID=' + fstabuuid.strip() + ' /media/neoboot auto defaults\t 1 1' + fileHandle = open('/etc/fstab', 'a') + fileHandle.write(fstabuuidwrite) + fileHandle.close() + os.system('blkid -c /dev/null /dev/sd* > /tmp/blkidlist') + os.system('blkid -c /dev/null ' + mntdev + ' > /usr/lib/enigma2/python/Plugins/Extensions/NeoBoot/bin/install2') + system('chmod 755 /usr/lib/enigma2/python/Plugins/Extensions/NeoBoot/bin/install; chmod 755 /usr/lib/enigma2/python/Plugins/Extensions/NeoBoot/bin/install2') + + + #if not fileExists('/usr/lib/enigma2/python/Plugins/PLi'): + #os.system('mv /etc/init.d/volatile-media.sh /etc/init.d/volatile-media.sh.org') + + #if os.path.isfile('/etc/init.d/volatile-media.sh'): + #os.system('mv /etc/init.d/volatile-media.sh /etc/init.d/volatile-media.sh.org') + + if os.path.isfile('/media/neoboot/ImageBoot/.neonextboot'): + os.system('rm -f /media/neoboot/ImageBoot/.neonextboot; rm -f /media/neoboot/ImageBoot/.version; rm -f /media/neoboot/ImageBoot/.Flash; rm -f /media/neoboot/ImagesUpload/.kernel/zImage*.ipk; rm -f /media/neoboot/ImagesUpload/.kernel/zImage*.bin') + + out1 = open('/usr/lib/enigma2/python/Plugins/Extensions/NeoBoot/.location', 'w') + out1.write(self.mysel) + out1.close() + out2 = open('/media/neoboot/ImageBoot/.neonextboot', 'w') + out2.write('Flash ') + out2.close() + + if fileExists('/etc/issue.net'): + try: + lines = open('/etc/hostname', 'r').readlines() + imagename = lines[0][:-1] + image = imagename + open('/media/neoboot/ImageBoot/.Flash', 'w').write(image) + except: + False + + out = open('/media/neoboot/ImageBoot/.version', 'w') + out.write(PLUGINVERSION) + out.close() + + self.installpakiet() + + else: + self.session.open(MessageBox, _('Installation aborted !'), MessageBox.TYPE_INFO) + + def installpakiet(self): + check = False + if check == False: + self.mysel = self['config'].getCurrent() + if fileExists('/proc/stb/info'): #vumodel'): ogranicza tylko dla vu+ + message = _('\n ... q(-_-)p ...\nNeoBot to function properly need additional packages.\nSelect Yes and wait ...\nProces installation may take a few moments ...\nInstall ?') + ybox = self.session.openWithCallback(self.pakiet2, MessageBox, message, MessageBox.TYPE_YESNO) + ybox.setTitle(_('Installing packages ...')) + else: + self.session.open(MessageBox, _('Installation operation canceled. This is not a vuplus box !!!'), MessageBox.TYPE_INFO, 10) + + def pakiet2(self, yesno): + if yesno: + try: + system('opkg update;opkg configure;sleep 3') + + if os.system('opkg list-installed | grep python-subprocess') != 0: + os.system('opkg install python-subprocess') + if os.system('opkg list-installed | grep python-argparse') != 0: + os.system('opkg install python-argparse') + if os.system('opkg list-installed | grep curl') != 0: + os.system('opkg install curl') + if os.system('opkg list-installed | grep packagegroup-base-nfs') != 0: + os.system('opkg install packagegroup-base-nfs') + if os.system('opkg list-installed | grep ofgwrite') != 0: + os.system('opkg install ofgwrite') + if os.system('opkg list-installed | grep bzip2') != 0: + os.system('opkg install bzip2') + if os.system('opkg list-installed | grep mtd-utils') != 0: + os.system('opkg install mtd-utils') + if os.system('opkg list-installed | grep mtd-utils-ubifs') != 0: + os.system('opkg install mtd-utils-ubifs') + if os.system('opkg list-installed | grep mtd-utils-jffs2') != 0: + os.system('opkg install mtd-utils-jffs2') + if os.system('opkg list-installed | grep kernel-module-nandsim') != 0: + os.system('opkg install kernel-module-nandsim') + if os.system('opkg list-installed | grep packagegroup-base-nfs') != 0: + os.system('opkg install packagegroup-base-nfs') + if os.system('opkg list-installed | grep lzo') != 0: + os.system('opkg install lzo') + if os.system('opkg list-installed | grep python-setuptools') != 0: + os.system('opkg install python-setuptools') + + cmd = 'opkg install --force-maintainer --force-reinstall --force-overwrite --force-downgrade kernel-image' + system(cmd) + os.system('opkg configure update-modules; sleep 3') + + #VUPLUS ARM + if getCPUSoC() == '7444s' or getCPUSoC() == '7252s' or getCPUSoC() == '7376' or getBoxHostName() == 'vuultimo4k' or getBoxHostName() == 'vuuno4k' or getBoxHostName() == 'vusolo4k' or getBoxHostName() == 'vuuno4kse' : + os.system('cd /usr/lib/enigma2/python/Plugins/Extensions/NeoBoot/' ) + os.system('cp -Rf /usr/lib/enigma2/python/Plugins/Extensions/NeoBoot/bin/neoinitarm /sbin/neoinitarm') + os.system('cp -Rf /usr/lib/enigma2/python/Plugins/Extensions/NeoBoot/bin/neoinitarmvu /sbin/neoinitarmvu; cd') + os.system('chmod 755 /sbin/neoinitarm; chmod 755 /sbin/neoinitarmvu') + os.system('opkg download kernel-image') + os.system('mv /home/root/*.ipk /media/neoboot/ImagesUpload/.kernel/zImage.%s.ipk' % getBoxVuModel()) + os.system('dd if=/dev/mmcblk0p1 of=/media/neoboot/ImagesUpload/.kernel/flash-kernel-%s.bin' % getBoxVuModel()) + + elif getCPUSoC() == '72604' or getBoxHostName() == 'vuzero4k': + os.system('cd /usr/lib/enigma2/python/Plugins/Extensions/NeoBoot/' ) + os.system('cp -Rf /usr/lib/enigma2/python/Plugins/Extensions/NeoBoot/bin/neoinitarm /sbin/neoinitarm') + os.system('cp -Rf /usr/lib/enigma2/python/Plugins/Extensions/NeoBoot/bin/neoinitarmvu /sbin/neoinitarmvu; cd') + os.system('chmod 755 /sbin/neoinitarm; chmod 755 /sbin/neoinitarmvu') + os.system('opkg download kernel-image') + os.system('mv /home/root/*.ipk /media/neoboot/ImagesUpload/.kernel/zImage.%s.ipk' % getBoxVuModel()) + os.system('dd if=/dev/mmcblk0p4 of=/media/neoboot/ImagesUpload/.kernel/flash-kernel-%s.bin' % getBoxVuModel()) + + elif getCPUSoC() == '7278' or getBoxHostName() == 'vuduo4k': + os.system('cd /usr/lib/enigma2/python/Plugins/Extensions/NeoBoot/' ) + os.system('cp -Rf /usr/lib/enigma2/python/Plugins/Extensions/NeoBoot/bin/neoinitarm /sbin/neoinitarm') + os.system('cp -Rf /usr/lib/enigma2/python/Plugins/Extensions/NeoBoot/bin/neoinitarmvu /sbin/neoinitarmvu; cd') + os.system('chmod 755 /sbin/neoinitarm; chmod 755 /sbin/neoinitarmvu') + os.system('opkg download kernel-image') + os.system('mv /home/root/*.ipk /media/neoboot/ImagesUpload/.kernel/zImage.%s.ipk' % getBoxVuModel()) + os.system('dd if=/dev/mmcblk0p6 of=/media/neoboot/ImagesUpload/.kernel/flash-kernel-%s.bin' % getBoxVuModel()) + + + #Octagon SF4008 + elif getCPUSoC() == 'bcm7251' or getBoxHostName() == 'sf4008': + os.system('cd /usr/lib/enigma2/python/Plugins/Extensions/NeoBoot/' ) + os.system('cp -Rf /usr/lib/enigma2/python/Plugins/Extensions/NeoBoot/bin/neoinitarm /sbin/neoinitarm') + os.system('cp -Rf /usr/lib/enigma2/python/Plugins/Extensions/NeoBoot/bin/neoinitarmvu /sbin/neoinitarm; cd') + os.system('chmod 755 /sbin/neoinitarm; chmod 755 /sbin/neoinitarm') + os.system('opkg download kernel-image') + os.system('mv /home/root/*.ipk /media/neoboot/ImagesUpload/.kernel/zImage.%s.ipk' % getBoxHostName()) + os.system('dd if=/dev/mmcblk0p3 of=/media/neoboot/ImagesUpload/.kernel/flash-kernel-%s.bin' % getBoxHostName()) + + #Zgemma h7S arm + elif getCPUSoC() == 'bcm7251s' or getBoxHostName() == 'h7': + os.system('cd /usr/lib/enigma2/python/Plugins/Extensions/NeoBoot/' ) + os.system('cp -Rf /usr/lib/enigma2/python/Plugins/Extensions/NeoBoot/bin/neoinitarm /sbin/neoinitarm') + os.system('cp -Rf /usr/lib/enigma2/python/Plugins/Extensions/NeoBoot/bin/neoinitarmvu /sbin/neoinitarm; cd') + os.system('chmod 755 /sbin/neoinitarm; chmod 755 /sbin/neoinitarm') + os.system('opkg download kernel-image') + os.system('mv /home/root/*.ipk /media/neoboot/ImagesUpload/.kernel/zImage.%s.ipk' % getBoxHostName()) + os.system('dd if=/dev/kernel of=/media/neoboot/ImagesUpload/.kernel/flash-kernel-%s.bin' % getBoxHostName()) + + #VUPLUS MIPS + elif getCPUSoC() == '7335' or getCPUSoC() == '7413' or getCPUSoC() == '7325' or getCPUSoC() == '7356' or getCPUSoC() == 'bcm7356' or getCPUSoC() == '7429' or getCPUSoC() == '7424' or getCPUSoC() == '7241' or getCPUSoC() == '7405' or getCPUSoC() == '7405(with 3D)' or getCPUSoC() == '7362' or getCPUSoC() == 'bcm7362' or getCPUSoC() == 'BCM7362' or getCPUSoC() == 'bcm7358' or getCPUSoC() == 'bcm7424' or getBoxHostName() == 'bm750' or getBoxHostName() == 'vuduo' or getBoxHostName() == 'vusolo' or getBoxHostName() == 'vuuno' or getBoxHostName() == 'vuultimo' or getBoxHostName() == 'vuultimo' or getBoxHostName() == 'vusolo2' or getBoxHostName() == 'vuduo2' or getBoxHostName() == 'vusolose' or getBoxHostName() == 'vuzero' or getBoxHostName() == 'mbmini' or getBoxHostName() == 'mbultra' or getBoxHostName() == 'osmini' or getBoxHostName() == 'h3': + if not fileExists('/usr/lib/enigma2/python/Tools/HardwareInfoVu.pyo'): + os.system('ln -sfn /usr/lib/enigma2/python/Tools/HardwareInfo.pyo /usr/lib/enigma2/python/Tools/HardwareInfoVu.pyo') + if not fileExists('/usr/lib/enigma2/python/Tools/DreamboxHardware.pyo'): + os.system('ln -sfn /usr/lib/enigma2/python/Tools/StbHardware.pyo /usr/lib/enigma2/python/Tools/DreamboxHardware.pyo') + if not fileExists('/usr/lib/enigma2/python/Tools/DreamboxInfoHandler.pyo'): + os.system('ln -sfn /usr/lib/enigma2/python/Components/PackageInfo.pyo /usr/lib/enigma2/python/Tools/DreamboxInfoHandler.pyo') + + os.system('cp -Rf /usr/lib/enigma2/python/Plugins/Extensions/NeoBoot/bin/neoinitmips /sbin/neoinitmips; cp -Rf /usr/lib/enigma2/python/Plugins/Extensions/NeoBoot/bin/neoinitmipsvu /sbin/neoinitmipsvu') + os.system('chmod 755 /usr/lib/enigma2/python/Plugins/Extensions/NeoBoot/bin/nfidump; chmod 0755 /usr/lib/enigma2/python/Plugins/Extensions/NeoBoot/bin/nanddump_mips; rm -r /usr/lib/enigma2/python/Plugins/Extensions/NeoBoot/bin/neoinitar*; cd') + os.system('chmod 755 /sbin/neoinitmips; chmod 0755 /sbin/neoinitmipsvu') + + if getCPUSoC() == 'bcm7358' or getCPUSoC() == 'bcm7362' or getCPUSoC() == 'BCM7362' or getCPUSoC() == 'bcm7356' or getCPUSoC() == 'bcm7241' or getCPUSoC() == 'bcm7362' or getBoxHostName() == 'mbmini' or getBoxHostName() == 'osmini' or getTunerModel() == 'ini-1000sv' or getTunerModel() == 'h3': + os.system('cd /usr/lib/enigma2/python/Plugins/Extensions/NeoBoot/; mv ./bin/fontforneoboot.ttf /usr/share/fonts; mv ./bin/libpngneo /usr/lib; cp -f ./bin/neoinitmips /sbin/neoinitmips; chmod 0755 ./bin/neobm; chmod 0755 /usr/lib/libpngneo; cd; chmod 0755 /sbin/neoinitmips; ln -sf /media/neoboot/ImageBoot/.neonextboot /etc/neoimage') + + elif getBoxHostName() == 'bm750' or getBoxHostName() == 'vuduo' or getBoxHostName() == 'vusolo' or getBoxHostName() == 'vuuno' or getBoxHostName() == 'vuultimo': + #os.system('cd /media/neoboot/ImagesUpload/.kernel/; /usr/lib/enigma2/python/Plugins/Extensions/NeoBoot/bin/nanddump_mips /dev/mtd1 -f > vmlinux.gz; mv /home/root/vmlinux.gz /media/neoboot/ImagesUpload/.kernel/') + if fileExists ('/usr/sbin/nanddump'): + os.system('cd; cd /media/neoboot/ImagesUpload/.kernel; /usr/sbin/nanddump /dev/mtd0 -o > vmlinux.gz; mv /home/root/vmlinux.gz /media/neoboot/ImagesUpload/.kernel/') + elif not fileExists ('/usr/sbin/nanddump'): + os.system('cd /media/neoboot/ImagesUpload/.kernel/; /usr/lib/enigma2/python/Plugins/Extensions/NeoBoot/bin/nanddump_mips /dev/mtd0 -f > vmlinux.gz; mv /home/root/vmlinux.gz /media/neoboot/ImagesUpload/.kernel/') + os.system('cd /usr/lib/enigma2/python/Plugins/Extensions/NeoBoot/; rm ./bin/neobm; rm ./neologo.mvi; rm ./bin/fontforneoboot.ttf; rm ./bin/libpngneo; cd') + + elif getBoxHostName() == 'vusolo2' or getBoxHostName() == 'vuduo2' or getBoxHostName() == 'vusolose' or getBoxHostName() == 'vuzero': + #os.system('cd /media/neoboot/ImagesUpload/.kernel/; /usr/lib/enigma2/python/Plugins/Extensions/NeoBoot/bin/nanddump_mips /dev/mtd2 -f > vmlinux.gz; mv /home/root/vmlinux.gz /media/neoboot/ImagesUpload/.kernel/') + if fileExists ('/usr/sbin/nanddump'): + os.system('cd; cd /media/neoboot/ImagesUpload/.kernel; /usr/sbin/nanddump /dev/mtd2 -o > vmlinux.gz; mv /home/root/vmlinux.gz /media/neoboot/ImagesUpload/.kernel/') + elif not fileExists ('/usr/sbin/nanddump'): + os.system('cd /media/neoboot/ImagesUpload/.kernel/; /usr/lib/enigma2/python/Plugins/Extensions/NeoBoot/bin/nanddump_mips /dev/mtd2 -f > vmlinux.gz; mv /home/root/vmlinux.gz /media/neoboot/ImagesUpload/.kernel/') + os.system('cd /usr/lib/enigma2/python/Plugins/Extensions/NeoBoot/; rm ./bin/neobm; rm ./neologo.mvi; rm ./bin/fontforneoboot.ttf; rm ./bin/libpngneo; cd') + + if fileExists('/tmp/plik.tar.gz'): + cmd = 'mkdir -p ' + self.mysel + 'ImagesUpload/.egami' #private non-public use patch + system(cmd) + os.system('/bin/tar -xzvf /tmp/plik.tar.gz -C /;rm -fr /tmp/*.tar.gz') + os.system('opkg download kernel-image; sleep 2; mv /home/root/*.ipk /media/neoboot/ImagesUpload/.kernel/zImage.%s.ipk' % getBoxVuModel()) + + #OctagonSF4008 - DM900 - Zgemma h7S - Octagon sf 8008 - AX HD60 4K + elif getCPUSoC() == 'hi3798mv200' or getBoxHostName() == 'ax60' or getCPUSoC() == '3798mv200' or getBoxHostName() == 'sf8008' or getCPUSoC() == 'bcm7251' or getCPUSoC() == 'bcm7251s' or getBoxHostName() == 'h7' or getCPUSoC() == 'BCM97252SSFF' or getBoxHostName() == 'dm900': + os.system('cp -f /usr/lib/enigma2/python/Plugins/Extensions/NeoBoot/bin/neoinitarm /sbin/neoinitarm; chmod 0755 /sbin/neoinitarm; ln -sfn /sbin/neoinitarm /sbin/init') + + else: + self.messagebox = self.session.open(MessageBox, _('Canceled ... NeoBoot will not work properly !!! NeoBoot works only on VuPlus box, Ultimo4k, Solo4k, Uno4k !!!'), MessageBox.TYPE_INFO, 20) + + + + os.system('touch /usr/lib/enigma2/python/Plugins/Extensions/NeoBoot/files/neobootup.sh') + cel = open('/usr/lib/enigma2/python/Plugins/Extensions/NeoBoot/files/neobootup.sh', 'w') + cel.write('#!/bin/sh\n#DESCRIPTION=This script by gutosie\n\ntouch /tmp/.init_reboot\n\nif [ -f /etc/init.d/neobootmount.sh ] ; then\n sync; rm -f /etc/init.d/neobootmount.sh; \nfi \n') + cel.close() + os.system('chmod 755 /usr/lib/enigma2/python/Plugins/Extensions/NeoBoot/files/neobootup.sh; ln -s /usr/lib/enigma2/python/Plugins/Extensions/NeoBoot/files/neobootup.sh /etc/rcS.d/S50neo; touch /etc/name') + cel = open('/etc/name', 'w') + cel.write('gutosie') + cel.close() + + cmd = 'opkg install --force-maintainer --force-reinstall --force-overwrite --force-downgrade kernel-image' + system(cmd) + + #MiracleBoxUltra + if getBoxHostName() == 'mbultra': + os.system('opkg download kernel-image; sleep 2; mv /home/root/*.ipk /media/neoboot/ImagesUpload/.kernel/zImage.%s.ipk' % getBoxHostName()) + if not fileExists ('/media/neoboot/ImagesUpload/.kernel/zImage.%s.ipk' % getBoxHostName()): + os.system('opkg download kernel-image; sleep 2; mv /home/root/*.ipk /media/neoboot/ImagesUpload/.kernel/zImage.%s.ipk' % getBoxHostName()) + #os.system('cd /media/neoboot/ImagesUpload/.kernel/; /usr/lib/enigma2/python/Plugins/Extensions/NeoBoot/bin/nanddump_mips /dev/mtd2 -f > vmlinux.gz') + if fileExists ('/usr/sbin/nanddump'): + os.system('cd; cd /media/neoboot/ImagesUpload/.kernel; /usr/sbin/nanddump /dev/mtd2 -o > vmlinux.gz; mv /home/root/vmlinux.gz /media/neoboot/ImagesUpload/.kernel/') + elif not fileExists ('/usr/sbin/nanddump'): + os.system('cd /media/neoboot/ImagesUpload/.kernel/; /usr/lib/enigma2/python/Plugins/Extensions/NeoBoot/bin/nanddump_mips /dev/mtd2 -f > vmlinux.gz; mv /home/root/vmlinux.gz /media/neoboot/ImagesUpload/.kernel/') + os.system('rm /usr/lib/enigma2/python/Plugins/Extensions/NeoBoot/bin/neoinitmipsvu') + os.system('rm /sbin/neoinitmipsvu') + + #Edision OS MINI + if getCPUSoC() == 'BCM7362' or getBoxHostName() == 'osmini': + os.system('opkg download kernel-image; sleep 2; mv /home/root/*.ipk /media/neoboot/ImagesUpload/.kernel/zImage.%s.ipk' % getBoxHostName()) + if not fileExists ('/media/neoboot/ImagesUpload/.kernel/zImage.%s.ipk' % getBoxHostName()): + os.system('opkg download kernel-image; sleep 2; mv /home/root/*.ipk /media/neoboot/ImagesUpload/.kernel/zImage.%s.ipk' % getBoxHostName()) + os.system('opkg download kernel-image; sleep 2; mv /home/root/*.ipk /media/neoboot/ImagesUpload/.kernel/zImage.%s.ipk' % getBoxHostName()) + if fileExists ('/usr/sbin/nanddump'): + os.system('cd; cd /media/neoboot/ImagesUpload/.kernel; /usr/sbin/nanddump /dev/mtd0 -o > vmlinux.gz; mv /home/root/vmlinux.gz /media/neoboot/ImagesUpload/.kernel/') + elif not fileExists ('/usr/sbin/nanddump'): + os.system('cd /media/neoboot/ImagesUpload/.kernel/; /usr/lib/enigma2/python/Plugins/Extensions/NeoBoot/bin/nanddump_mips /dev/mtd0 -f > vmlinux.gz; mv /home/root/vmlinux.gz /media/neoboot/ImagesUpload/.kernel/') + #os.system('cp -rf /etc/fstab.org /etc/fstab; rm /etc/fstab.org') + #os.system('cp -rf /etc/init.d/volatile-media.sh.org /etc/init.d/volatile-media.sh; rm /etc/init.d/volatile-media.sh.org') + os.system('opkg install volatile-media') + os.system('rm /usr/lib/enigma2/python/Plugins/Extensions/NeoBoot/bin/neoinitmipsvu') + os.system('rm /sbin/neoinitmipsvu') + + if fileExists("/home/root/vmlinux.gz"): + os.system('mv -f /home/root/vmlinux.gz /media/neoboot/ImagesUpload/.kernel') + os.system('opkg configure update-modules') + + if getCPUtype() == 'ARMv7': + os.system('cd /usr/lib/enigma2/python/Plugins/Extensions/NeoBoot/; rm ./bin/neoinitmip*; rm -r ./bin/nanddump; rm ./bin/nfidump; rm ./bin/neobm; rm ./neologo.mvi; rm ./bin/fontforneoboot.ttf; rm ./bin/libpngneo; cd') + elif getCPUtype() == 'MIPS': + os.system('rm /usr/lib/enigma2/python/Plugins/Extensions/NeoBoot/bin/neoinitar*; rm /usr/lib/enigma2/python/Plugins/Extensions/NeoBoot/bin/rebootbot') + + os.system('chmod 644 /media/neoboot/ImagesUpload/.kernel/*') + os.system('chmod 755 /usr/lib/enigma2/python/Plugins/Extensions/NeoBoot/target/*') + + if fileExists("/proc/stb/info/vumodel") and not fileExists("/proc/stb/info/boxtype"): + if fileExists('/media/neoboot/ImagesUpload/.kernel/zImage.%s.ipk' % ( getBoxVuModel()) ): + self.myclose2(_('NeoBoot has been installed succesfully !' )) + elif not fileExists('/media/neoboot/ImagesUpload/.kernel/zImage.%s.ipk' % ( getBoxVuModel()) ): + self.myclose2(_('Error - nie odnaleziono pliku kernela zImage.%s.ipk ' % ( getBoxVuModel()) )) + + #Ultra + if getCPUSoC() == 'bcm7424' or getBoxHostName == 'mbultra' or getTunerModel() == 'ini-8000sv': + if fileExists('/media/neoboot/ImagesUpload/.kernel/zImage.%s.ipk' % ( getBoxHostName()) ): + self.myclose2(_('NeoBoot has been installed succesfully !' )) + elif not fileExists('/media/neoboot/ImagesUpload/.kernel/zImage.%s.ipk' % ( getBoxHostName()) ): + self.myclose2(_('Error - nie odnaleziono pliku kernela zImage.%s.ipk ' % ( getBoxHostName()) )) + + else: + self.myclose2(_('NeoBoot has been installed succesfully !' )) + + #Edision OS MINI + if getCPUSoC() == 'BCM7362' or getBoxHostName == 'osmini': + if fileExists('/media/neoboot/ImagesUpload/.kernel/zImage.%s.ipk' % ( getBoxHostName()) ): + self.myclose2(_('NeoBoot has been installed succesfully !' )) + elif not fileExists('/media/neoboot/ImagesUpload/.kernel/zImage.%s.ipk' % ( getBoxHostName()) ): + self.myclose2(_('Error - nie odnaleziono pliku kernela zImage.%s.ipk ' % ( getBoxHostName()) )) + + else: + self.myclose2(_('NeoBoot has been installed succesfully !' )) + + except: + pass + else: + self.messagebox = self.session.open(MessageBox, _('Cancelled ... NeoBot will not work correctly !!!'), MessageBox.TYPE_INFO, 6) + + def myclose2(self, message): + self.session.open(MessageBox, message, MessageBox.TYPE_INFO) + self.close() + +class NeoBootImageChoose(Screen): + screenwidth = getDesktop(0).size().width() + if screenwidth and screenwidth == 1920: + + skin = """ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + """ + else: + skin = """ + \n\t\t\t\t\t\t\t + \n\t\t\t\t\t\t\t + \n\t\t\t\t\t\t\t + \n\t\t\t\t\t\t\t + \n\t\t\t\t\t\t\t + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Format:%A %e %B %Y + +\t\t\t""" + + + def __init__(self, session): + Screen.__init__(self, session) + if fileExists('/tmp/.init_reboot'): + system('rm /tmp/.init_reboot') + + if fileExists('/.multinfo'): + if fileExists('/.control_boot_new_image'): + os.system('rm -f /.control_boot_new_image; touch /.control_ok ') + if not fileExists('/.control_boot_new_image'): + os.system('touch /.control_ok ') + + if fileExists('/.multinfo') and getCPUtype() == 'ARMv7': + if os.path.exists('/proc/stb/info/boxtype'): + if getCPUSoC() == 'bcm7251' or getBoxHostName == 'sf4008': + os.system('mkdir -p /media/mmc; mount /dev/mmcblk0p4 /media/mmc') + + if fileExists('/.multinfo') and getCPUtype() == 'ARMv7': + if os.path.exists('/proc/stb/info/boxtype'): + if getCPUSoC() == 'bcm7251s' or getBoxHostName() == 'h7': + os.system('mkdir -p /media/mmc; mount /dev/mmcblk0p3 /media/mmc') + + if getCPUSoC() == 'bcm7251s' or getBoxHostName == 'h7': + os.system('mkdir -p /media/mmc; mount /dev/mmcblk0p3 /media/mmc') + + if getCPUSoC() == '3798mv200' or getBoxHostName == 'sf8008': + os.system('mkdir -p /media/mmc; mount /dev/mmcblk0p13 /media/mmc') + + if getCPUSoC() == 'hi3798mv200' or getBoxHostName == 'ax60': + os.system('mkdir -p /media/mmc; mount /dev/mmcblk0p21 /media/mmc') + + if os.path.exists('/proc/stb/info/model'): + if getTunerModel() == 'dm900' or getCPUSoC() == 'BCM97252SSFF': + os.system('mkdir -p /media/mmc; mount /dev/mmcblk0p2 /media/mmc') + + if getBoxVuModel() == 'uno4k' or getBoxVuModel() == 'uno4kse' or getBoxVuModel() == 'ultimo4k' or getBoxVuModel() == 'solo4k': + os.system('mkdir -p /media/mmc; mount /dev/mmcblk0p4 /media/mmc') + + if getBoxVuModel() == 'vu_mmcblk0p4': + os.system('mkdir -p /media/mmc; mount /dev/mmcblk0p7 /media/mmc') + + if getBoxVuModel() == 'duo4k': + os.system('mkdir -p /media/mmc; mount /dev/mmcblk0p9 /media/mmc') + + + self.list = [] + self.setTitle(' NeoBoot %s - Menu' % PLUGINVERSION + ' ' + 'Ver. update: %s' % UPDATEVERSION) + self['device_icon'] = Pixmap() + self['progreso'] = ProgressBar() + self['linea'] = ProgressBar() + self['config'] = MenuList(self.list) + self['key_red'] = Label(_('Boot Image')) + self['key_green'] = Label(_('Installation')) + self['key_yellow'] = Label(_('Remove Image ')) + self['key_blue'] = Label(_('Info')) + self['key_menu'] = Label(_('More options')) + self['key_1'] = Label(_('Update NeoBot')) + self['key_2'] = Label(_('Start Flash Image')) + self['key_3'] = Label(_('Install Kernel')) + self['label1'] = Label(_('Please choose an image to boot')) + self['label2'] = Label(_('NeoBoot is running from:')) + self['label3'] = Label('') + self['label4'] = Label(_('NeoBoot is running image:')) + self['label5'] = Label('') + self['label6'] = Label('') + self['label7'] = Label('') + self['label8'] = Label(_('Number of images installed:')) + self['label19'] = Label('') + self['label9'] = Label('') + self['label10'] = Label('') + self['label11'] = Label('') + self['label12'] = Label('') + self['label13'] = Label(_('Version update: ')) + self['label14'] = Label(_('NeoBoot version: ')) + self['label15'] = Label(_('Memory disc:')) + self['actions'] = ActionMap(['WizardActions', + 'ColorActions', + 'MenuActions', + 'NumberActionMap', + 'SetupActions', + 'number'], {'ok': self.boot, + 'red': self.boot, + 'green': self.ImageInstall, + 'yellow': self.remove, + 'blue': self.pomoc, + 'ok': self.boot, + 'menu': self.mytools, + '1': self.neoboot_update, + '2': self.ImageFlash, + '3': self.ReinstallKernel, + 'back': self.close_exit}) + if not fileExists('/etc/name'): + os.system('touch /etc/name') + self.onShow.append(self.updateList) + + + def pomoc(self): + if fileExists('/.multinfo'): + mess = _('Information available only when running Flash.') + self.session.open(MessageBox, mess, MessageBox.TYPE_INFO) + else: + self.session.open(Opis) + + def ImageFlash(self): + if not fileExists('/.multinfo'): + self.session.open(MessageBox, _('Sorry, Opcja dostepna tylko z poziomu image uruchomionego w neoboocie.'), MessageBox.TYPE_INFO, 7) + self.close() + else: + cmd = _("echo -e 'Restart in progress...\n'") + cmd1='opkg install --force-reinstall --force-overwrite --force-downgrade /media/neoboot/ImagesUpload/.kernel/*.ipk' + cmd2 = 'mount -a ;ln -sf "init.sysvinit" "/sbin/init" ; echo "Flash " > /media/neoboot/ImageBoot/.neonextboot ;sleep 2; reboot -f' + self.session.openWithCallback(self.up, Console, _('NeoBoot: Deleting Image'), [cmd, cmd1, cmd2]) + + + def deviceneoboot(self): + self.session.open(Montowanie) + + def close_exit(self): + if fileExists("/proc/stb/info/vumodel") and not fileExists("/proc/stb/info/boxtype"): + if not fileExists('/media/neoboot/ImagesUpload/.kernel/zImage.%s.ipk' % ( getBoxVuModel()) ): + mess = _('Error - nie odnaleziono pliku kernela zImage-ipk ') + self.session.open(MessageBox, mess, MessageBox.TYPE_INFO) + + if fileExists('/.multinfo'): + with open('/media/neoboot/ImageBoot/.neonextboot', 'r') as f: + imagefile = f.readline().strip() + f.close() + out = open('/media/neoboot/ImageBoot/.neonextboot', 'w') + out.write(imagefile) + out.close() + else: + system('touch /tmp/.init_reboot') + out = open('/media/neoboot/ImageBoot/.neonextboot', 'w') + out.write('Flash') + out.close() + self.close() + + def ReinstallKernel(self): + from Plugins.Extensions.NeoBoot.files.tools import ReinstallKernel + self.session.open(ReinstallKernel) + + def neoboot_update(self): + if fileExists('/.multinfo'): + mess = _('Downloading available only from the image Flash.') + self.session.open(MessageBox, mess, MessageBox.TYPE_INFO) + else: + out = open('/media/neoboot/ImageBoot/.neonextboot', 'w') + out.write('Flash') + out.close() + message = _('\n\n\n') + message += _('WARNING !: The update brings with it the risk of errors.\n') + message += _('Before upgrading it is recommended that you make a backup NeoBoot.\n') + message += _('Do you want to run the update now ?\n') + message += _('\n') + ybox = self.session.openWithCallback(self.chackupdate2, MessageBox, message, MessageBox.TYPE_YESNO) + ybox.setTitle(_('The download neoboot update.')) + + def chackupdate2(self, yesno): + if yesno: + self.chackupdate3() + else: + self.session.open(MessageBox, _('Canceled update.'), MessageBox.TYPE_INFO, 7) + + def chackupdate3(self): + os.system('cd /usr/lib/enigma2/python/Plugins/Extensions/NeoBoot;curl -O --ftp-ssl https://raw.githubusercontent.com/gutosie/neoboot/master/ver.txt;sleep 3;cd /') + if not fileExists('/usr/lib/enigma2/python/Plugins/Extensions/NeoBoot/ver.txt'): + os.system('cd /usr/lib/enigma2/python/Plugins/Extensions/NeoBoot;fullwget --no-check-certificate https://raw.githubusercontent.com/gutosie/neoboot/master/ver.txt; sleep 3;cd /') + if not fileExists('/usr/lib/enigma2/python/Plugins/Extensions/NeoBoot/ver.txt'): + self.session.open(MessageBox, _('Unfortunately, at the moment not found an update, try again later.'), MessageBox.TYPE_INFO, 8) + else: + mypath = '' + version = open('/usr/lib/enigma2/python/Plugins/Extensions/NeoBoot/ver.txt', 'r') + mypath = float(version.read().strip()) + version.close() + if float(UPDATEVERSION) != mypath: + message = _('NeoBoot has detected update.\nDo you want to update NeoBoota now ?') + ybox = self.session.openWithCallback(self.aktualizacjamboot, MessageBox, message, MessageBox.TYPE_YESNO) + ybox.setTitle(_('Updating ... ')) + elif fileExists('/usr/lib/enigma2/python/Plugins/Extensions/NeoBoot/ver.txt'): + os.system('rm /usr/lib/enigma2/python/Plugins/Extensions/NeoBoot/ver.txt') + self.session.open(MessageBox, _('Updated unnecessary, you have the latest version. Please try again later.'), MessageBox.TYPE_INFO) + + def aktualizacjamboot(self, yesno): + if yesno: + if fileExists('/tmp/*.zip'): + os.system('rm /tmp/*.zip') + os.system('cd /tmp; curl -O --ftp-ssl https://codeload.github.com/gutosie/neoboot/zip/master; mv /tmp/master /tmp/neoboot.zip; cd /') + if not fileExists('/tmp/neoboot.zip'): + os.system('cd /tmp;fullwget --no-check-certificate https://codeload.github.com/gutosie/neoboot/zip/master; mv /tmp/master /tmp/neoboot.zip; sleep 3;cd ') + if not fileExists('/tmp/neoboot.zip'): + self.session.open(MessageBox, _('Unfortunately, at the moment not found an update, try again later.'), MessageBox.TYPE_INFO, 8) + else: + os.system('cd /tmp/; unzip -qn ./neoboot.zip; rm -f ./neoboot.zip; cp -rf ./neoboot-master/NeoBoot /usr/lib/enigma2/python/Plugins/Extensions; rm -rf /tmp/neoboot-master; rm /usr/lib/enigma2/python/Plugins/Extensions/NeoBoot/ver.txt; cd /usr/lib/enigma2/python/Plugins/Extensions/NeoBoot/; chmod 0755 ./bin/neoini*; chmod 0755 ./ex_init.py; chmod 0755 ./target/*; chmod 0755 ./files/NeoBoot.sh; chmod 0755 ./files/S50fat.sh; cd') + if getCPUtype() == 'MIPS': + os.system('cd /usr/lib/enigma2/python/Plugins/Extensions/NeoBoot/; cp -rf ./bin/neoinitmipsvu /sbin; chmod 755 /sbin/neoinitmipsvu; cp -rf ./bin/neoinitmips /sbin; chmod 755 /sbin/neoinitmips; cd') + elif getCPUtype() == 'ARMv7': + os.system('cd /usr/lib/enigma2/python/Plugins/Extensions/NeoBoot/; chmod 755 ./files/neobootup.sh; chmod 0755 ./bin/rebootbot; cp -rf ./bin/neoinitarm /sbin; cp -rf ./bin/neoinitarmvu /sbin; chmod 755 /sbin/neoinitarm; chmod 755 /sbin/neoinitarmvu; cd') + + restartbox = self.session.openWithCallback(self.restartGUI, MessageBox, _('Completed update NeoBoot. You need to restart the E2 !!!\nRestart now ?'), MessageBox.TYPE_YESNO) + restartbox.setTitle(_('Restart GUI now ?')) + + else: + os.system('rm -f /usr/lib/enigma2/python/Plugins/Extensions/NeoBoot/ver.txt') + self.session.open(MessageBox, _('The update has been canceled.'), MessageBox.TYPE_INFO, 8) + + def restartGUI(self, answer): + if answer is True: + self.session.open(TryQuitMainloop, 3) + else: + self.close() + + def installMedia(self): + images = False + myimages = os.listdir('/media/neoboot/ImagesUpload') + print myimages + for fil in myimages: + if fil.endswith('.zip'): + images = True + break + if fil.endswith('.tar.xz'): + images = True + break + if fil.endswith('.nfi'): + images = True + break + else: + images = False + + if images == True: + self.ImageInstall() + else: + mess = _('[NeoBoot] The /media/neoboot/ImagesUpload directory is EMPTY !!!\nPlease upload the image files in .ZIP or .NFI formats to install.') + self.session.open(MessageBox, mess, MessageBox.TYPE_INFO) + + def MBBackup(self): + from Plugins.Extensions.NeoBoot.files.tools import MBBackup + self.session.open(MBBackup) + + def MBRestore(self): + from Plugins.Extensions.NeoBoot.files.tools import MBRestore + self.session.open(MBRestore) + + def updateList(self): + if not fileExists('/usr/lib/enigma2/python/Plugins/Extensions/NeoBoot/.location'): + self.session.open(NeoBootInstallation) + else: + self.updateListOK() + + def updateListOK(self): + self.list = [] + pluginpath = '/usr/lib/enigma2/python/Plugins/Extensions/NeoBoot' + f = open(pluginpath + '/.location', 'r') + mypath = f.readline().strip() + f.close() + icon = 'dev_usb.png' + if 'card' in mypath or 'sd' in mypath: + icon = 'dev_sd.png' + elif 'ntfs' in mypath: + icon = 'dev_sd.png' + elif 'hdd' in mypath: + icon = 'dev_hdd.png' + elif 'cf' in mypath: + icon = 'dev_cf.png' + icon = pluginpath + '/images/' + icon + png = LoadPixmap(icon) + self['device_icon'].instance.setPixmap(png) + device = '/media/neoboot' + ustot = usfree = usperc = '' + rc = system('df > /tmp/memoryinfo.tmp') + if fileExists('/tmp/memoryinfo.tmp'): + f = open('/tmp/memoryinfo.tmp', 'r') + for line in f.readlines(): + line = line.replace('part1', ' ') + parts = line.strip().split() + totsp = len(parts) - 1 + if parts[totsp] == device: + if totsp == 5: + ustot = parts[1] + usfree = parts[3] + usperc = parts[4] + else: + ustot = 'N/A ' + usfree = parts[2] + usperc = parts[3] + break + + f.close() + os.remove('/tmp/memoryinfo.tmp') + if not fileExists('/usr/lib/enigma2/python/Plugins/Extensions/PowerboardCenter/PBDeviceManager.pyo'): + perc = int(usperc[0:-1]) + self['progreso'].setValue(perc) + green = '#00389416' + red = '#00ff2525' + yellow = '#00ffe875' + orange = '#00ff7f50' + if perc < 30: + color = green + elif perc < 60: + color = yellow + elif perc < 80: + color = orange + else: + color = red + elif fileExists('/usr/lib/enigma2/python/Plugins/Extensions/PowerboardCenter/PBDeviceManager.pyo'): + perc2 = usperc[0:-1] + self['progreso'].setValue(perc2) + green = '#00389416' + red = '#00ff2525' + yellow = '#00ffe875' + orange = '#00ff7f50' + if perc2 < 30: + color = green + elif perc2 < 60: + color = yellow + elif perc2 < 80: + color = orange + else: + color = red + try: + from skin import parseColor + self['label13'].instance.setForegroundColor(parseColor(color)) + self['label14'].instance.setForegroundColor(parseColor(color)) + self['label15'].instance.setForegroundColor(parseColor(color)) + self['progreso'].instance.setForegroundColor(parseColor(color)) + except: + pass + + self.availablespace = usfree[0:-3] + strview = _('Used: ') + usperc + _(' \n Available: ') + usfree[0:-3] + ' MB' + self['label3'].setText(strview) + try: + f2 = open('/media/neoboot/ImageBoot/.neonextboot', 'r') + mypath2 = f2.readline().strip() + f2.close() + except: + mypath2 = 'Flash' + + if mypath2 == 'Flash': + image = getImageNeoBoot() + if not fileExists('/.multinfo'): + if fileExists('/etc/issue.net'): + try: + obraz = open('/etc/issue.net', 'r').readlines() + imagetype = obraz[0][:-3] + image = imagetype + open('/media/neoboot/ImageBoot/.Flash', 'w').write(image) + except: + False + if fileExists('/.multinfo'): + if fileExists('/media/mmc/etc/issue.net'): + try: + obraz = open('/media/mmc/etc/issue.net', 'r').readlines() + imagetype = obraz[0][:-3] + image = imagetype + open('/media/neoboot/ImageBoot/.Flash', 'w').write(image) + except: + False + elif fileExists('/etc/issue.net'): + try: + obraz = open('/etc/issue.net', 'r').readlines() + imagetype = obraz[0][:-1] + lines = open('/etc/hostname', 'r').readlines() + boxtype = lines[0][:-1] + image = imagetype[0:-2] + ' ' + boxtype + open('/media/neoboot/ImageBoot/.Flash', 'w').write(image) + except: + False + + elif fileExists('/media/neoboot/ImageBoot/.Flash'): + f = open('/media/neoboot/ImageBoot/.Flash', 'r') + image = f.readline().strip() + f.close() + image = ' [' + image + ']' + self.list.append('Flash' + image) + self['label5'].setText(mypath) + if fileExists('/.multinfo'): + f2 = open('/.multinfo', 'r') + mypath3 = f2.readline().strip() + f2.close() + self['label6'].setText(mypath3) + else: + f2 = open('/media/neoboot/ImageBoot/.neonextboot', 'r') + mypath3 = f2.readline().strip() + f2.close() + self['label6'].setText(mypath3) + mypath = '/media/neoboot/ImageBoot' + myimages = listdir(mypath) + for fil in myimages: + if os.path.isdir(os.path.join(mypath, fil)): + self.list.append(fil) + + self['label7'].setText(str(len(self.list) - 1)) + self['config'].setList(self.list) + KERNELVERSION = getKernelImageVersion() + strview = PLUGINVERSION + ' ' + 'Kernel %s' % KERNELVERSION + self['label9'].setText(strview) + self['label19'].setText(readline('/media/neoboot/ImagesUpload/.kernel/used_flash_kernel')) + strview = UPDATEVERSION + self['label10'].setText(strview) + + def mytools(self): + from Plugins.Extensions.NeoBoot.files.tools import MBTools + self.session.open(MBTools) + + def remove(self): + self.mysel = self['config'].getCurrent() + if 'Flash' in self.mysel: + self.mysel = 'Flash' + if self.mysel: + f = open('/media/neoboot/ImageBoot/.neonextboot', 'r') + mypath = f.readline().strip() + f.close() + try: + if fileExists('/.multinfo'): + self.session.open(MessageBox, _('Sorry you can delete only from the image Flash.'), MessageBox.TYPE_INFO, 5) + elif self.mysel == 'Flash': + self.session.open(MessageBox, _('Sorry you cannot delete Flash image'), MessageBox.TYPE_INFO, 5) + elif mypath == self.mysel: + self.session.open(MessageBox, _('Sorry you cannot delete the image currently booted from.'), MessageBox.TYPE_INFO, 5) + else: + out = open('/media/neoboot/ImageBoot/.neonextboot', 'w') + out.write('Flash') + out.close() + message = _('Delete the selected image - ') + self.mysel + _('\nDelete ?') + ybox = self.session.openWithCallback(self.remove2, MessageBox, message, MessageBox.TYPE_YESNO) + ybox.setTitle(_('Delete Confirmation')) + except: + print 'no image to remove' + + else: + self.mysel + + def up(self): + self.list = [] + self['config'].setList(self.list) + self.updateList() + + def up2(self): + try: + self.list = [] + self['config'].setList(self.list) + self.updateList() + except: + print ' ' + + def remove2(self, yesno): + if yesno: + cmd = _("echo -e 'Deleting in progress...\n'") + cmd1 = 'rm -r /media/neoboot/ImageBoot/' + self.mysel + self.session.openWithCallback(self.up, Console, _('NeoBoot: Deleting Image'), [cmd, cmd1]) + else: + self.session.open(MessageBox, _('Removing canceled!'), MessageBox.TYPE_INFO) + + def ImageInstall(self): + if not fileExists('/.multinfo'): + KERNEL_VERSION = getKernelVersionString() + if getCPUSoC() == 'hi3798mv200' or getBoxHostName == 'ax60' or getCPUSoC() == '3798mv200' or getBoxHostName() == 'sf8008' or getCPUSoC() == 'bcm7251' or getBoxHostName() == 'sf4008' or getCPUSoC() == 'bcm7251s' or getCPUSoC() == '7241' or getBoxHostName() == 'h7' or getBoxHostName() == 'dm900' or getCPUSoC() == 'BCM97252SSFF' or getCPUSoC() == '7444s' or getCPUSoC() == '7252s' or getCPUSoC() == '7376' or getCPUSoC() == '72604' or getCPUSoC() == '7278' or getCPUSoC() == '7335' or getCPUSoC() == '7413' or getCPUSoC() == '7325' or getCPUSoC() == '7356' or getCPUSoC() == 'bcm7356' or getCPUSoC() == '7429' or getCPUSoC() == '7424' or getCPUSoC() == '7362' or getCPUSoC() == 'bcm7362' or getCPUSoC() == 'BCM7362' or getCPUSoC() == 'bcm7358' or getCPUSoC() == '7405' or getCPUSoC() == '7405(with 3D)' or getCPUSoC() == 'bcm7424' or getBoxHostName() == 'vuultimo' or getBoxHostName() == 'mbmini' or getBoxHostName() == 'osmini' or getBoxHostName() == 'mbultra' or getBoxHostName() == 'h3': + self.extractImage() + else: + self.messagebox = self.session.open(MessageBox, _('Nie wykryto odpowiedniego STB do instalacji !!!!'), MessageBox.TYPE_INFO, 8) + self.close() + else: + self.messagebox = self.session.open(MessageBox, _('Instalacja tylko z poziomu systemu flash.'), MessageBox.TYPE_INFO, 8) + self.close() + + def extractImage(self): + images = False + if fileExists('/media/neoboot/ImageBoot/.without_copying'): + system('rm /media/neoboot/ImageBoot/.without_copying') + + if not os.path.exists('/media/neoboot/ImagesUpload'): + system('mkdir /media/neoboot/ImagesUpload') + myimages = listdir('/media/neoboot/ImagesUpload') + print myimages + for fil in myimages: + if fil.endswith('.zip'): + images = True + break + if fil.endswith('.tar.xz'): + images = True + break + if fil.endswith('.nfi'): + images = True + break + else: + images = False + + if images == True: + #self.session.openWithCallback(self.up2, InstalacjaImage) + from Plugins.Extensions.NeoBoot.unpack import InstallImage + self.session.open(InstallImage) + else: + self.ImageSystem() + + def ImageSystem(self): + if fileExists('/media/neoboot/ImageBoot/.neonextboot'): + self.messagebox = self.session.open(MessageBox, _('[NeoBoot] The /media/neoboot/ImagesUpload directory is EMPTY !!!\nPlease upload the image files in .ZIP or .NFI formats to install.\n'), MessageBox.TYPE_INFO, 8) + self.close() + else: + self.close() + + def boot(self): + self.mysel = self['config'].getCurrent() + if 'Flash' in self.mysel: + self.mysel = 'Flash' + if self.mysel: + out = open('/media/neoboot/ImageBoot/.neonextboot', 'w') + out.write(self.mysel) + out.close() + from Plugins.Extensions.NeoBoot.run import StartImage + self.session.open(StartImage) + + def myClose(self, message): + self.session.open(MessageBox, message, MessageBox.TYPE_INFO) + self.close() + +####################### _(-_-)_ gutosie _(-_-)_ ####################### +####################### _(-_-)_ gutosie _(-_-)_ ####################### + +def readline(filename, iferror = ''): + if iferror[:3] == 'or:': + data = iferror[3:] + else: + data = iferror + try: + if os.path.exists(filename): + with open(filename) as f: + data = f.readline().strip() + f.close() + except Exception: + PrintException() + return data + +def checkimage(): + mycheck = False + if fileExists('/proc/stb/info'): #vumodel'): ogranicza tylko dla vu+ + mycheck = True + else: + mycheck = False + return mycheck + + +def checkversion(session): + version = 0 + if fileExists('/media/neoboot/ImageBoot/.version'): + f = open('/media/neoboot/ImageBoot/.version') + version = float(f.read()) + f.close() + if fileExists('/media/neoboot/ImageBoot/.neonextboot'): + f2 = open('/media/neoboot/ImageBoot/.neonextboot', 'r') + mypath2 = f2.readline().strip() + f2.close() + if mypath2 != 'Flash' or mypath2 == 'Flash' and checkimage(): + if float(PLUGINVERSION) != version: + session.open(MyUpgrade) + else: + session.open(NeoBootImageChoose) + else: + session.open(MessageBox, _('Sorry: Wrong image in flash found. You have to install in flash Vu+ or Octagon-sf4008 Image !!!'), MessageBox.TYPE_INFO, 10) + else: + session.open(NeoBootInstallation) + +def main(session, **kwargs): + try: + doMount=True + with open('/usr/lib/enigma2/python/Plugins/Extensions/NeoBoot/.location', 'r') as f: + mypath = f.readline().strip() + if not os.path.exists('/media/neoboot'): + system('mkdir /media/neoboot') + with open('/proc/mounts', 'r') as f: + for line in f.readlines(): + if line.find('/media/neoboot') != -1: + doMount=False + break + if doMount: + cmd = 'mount ' + mypath + ' /media/neoboot' + system(cmd) + except Exception: + pass + + checkversion(session) + +def menu(menuid, **kwargs): + if menuid == 'mainmenu': + return [(_('NEOBOOT'), + main, + 'neo_boot', + 1)] + return [] + +from Plugins.Plugin import PluginDescriptor + +def Plugins(**kwargs): + return [PluginDescriptor(name='NeoBoot ', description='NeoBoot', where=PluginDescriptor.WHERE_MENU, fnc=menu), PluginDescriptor(name='NeoBoot', description=_('Installing multiple images'), icon='neo.png', where=PluginDescriptor.WHERE_PLUGINMENU, fnc=main)] diff --git a/NeoBoot/run.py b/NeoBoot/run.py new file mode 100644 index 0000000..b60eeed --- /dev/null +++ b/NeoBoot/run.py @@ -0,0 +1,399 @@ +#!/usr/bin/python +# -*- coding: utf-8 -*- + +from __init__ import _ +from Plugins.Extensions.NeoBoot.files import Harddisk +from Plugins.Extensions.NeoBoot.files.stbbranding import getKernelVersionString, getKernelImageVersion, getCPUtype, getCPUSoC, getImageNeoBoot, getBoxVuModel, getBoxHostName, getTunerModel +from enigma import getDesktop +from enigma import eTimer +from Screens.Screen import Screen +from Screens.Console import Console +from Screens.MessageBox import MessageBox +from Screens.ChoiceBox import ChoiceBox +from Screens.VirtualKeyBoard import VirtualKeyBoard +from Screens.Standby import TryQuitMainloop +from Components.About import about +from Components.Sources.List import List +from Components.Button import Button +from Components.ActionMap import ActionMap, NumberActionMap +from Components.GUIComponent import * +from Components.MenuList import MenuList +from Components.Input import Input +from Components.Label import Label +from Components.ProgressBar import ProgressBar +from Components.ScrollLabel import ScrollLabel +from Components.Pixmap import Pixmap, MultiPixmap +from Components.config import * +from Components.ConfigList import ConfigListScreen +from Tools.LoadPixmap import LoadPixmap +from Tools.Directories import fileExists, pathExists, createDir, resolveFilename, SCOPE_PLUGINS +from os import system, listdir, mkdir, chdir, getcwd, rename as os_rename, remove as os_remove, popen +from os.path import dirname, isdir, isdir as os_isdir +import os +import time + + +class StartImage(Screen): + screenwidth = getDesktop(0).size().width() + if screenwidth and screenwidth == 1920: + skin = """ + \n\t\t\t + \n\t\t\t\t + \n \t\t{"template": [ + \n \t\t\tMultiContentEntryText(pos = (90, 1), size = (920, 66), flags = RT_HALIGN_LEFT|RT_VALIGN_CENTER, text = 0), + \n \t\t\tMultiContentEntryPixmapAlphaTest(pos = (8, 4), size = (66, 66), png = 1), + \n \t\t\t], + \n \t\t\t"fonts": [gFont("Regular", 40)],\n \t\t\t"itemHeight": 66\n \t\t} + \n \t\t\n\t\t + \n + \n\t\t + \n\t\t """ + else: + skin = """ + \n\t\t\t + + \n\t\t\t\t + \n \t\t{"template": [ + \n \t\t\tMultiContentEntryText(pos = (180, 0), size = (520, 36), flags = RT_HALIGN_LEFT|RT_VALIGN_CENTER, text = 0), + \n \t\t\tMultiContentEntryPixmapAlphaTest(pos = (4, 2), size = (36, 36), png = 1), + \n \t\t\t],\n \t\t\t"fonts": [gFont("Regular", 22)], + \n \t\t\t"itemHeight": 35\n \t\t}\n \t\t + \n\t\t\n + + \n\t\t """ + + __module__ = __name__ + def __init__(self, session): + Screen.__init__(self, session) + self.list = [] + self['list'] = List(self.list) + self.select() + self['actions'] = ActionMap(['WizardActions', 'ColorActions'], {'ok': self.KeyOk, + 'back': self.close}) + self['label1'] = Label(_('Start the chosen system now ?')) + self['label2'] = Label(_('Select OK to run the image.')) + + def select(self): + self.list = [] + mypath = '/usr/lib/enigma2/python/Plugins/Extensions/NeoBoot' + if not fileExists(mypath + 'icons'): + mypixmap = '/usr/lib/enigma2/python/Plugins/Extensions/NeoBoot/images/ok.png' + png = LoadPixmap(mypixmap) + res = (_('OK Start image...'), png, 0) + self.list.append(res) + self['list'].list = self.list + +################################# + def KeyOk(self): + if getImageNeoBoot() != 'Flash': + cmd = _("echo -e '[NeoBoot] Uwaga!!! po poprawnym starcie wybranego oprogramowania w neoboot,\nnalezy uruchomic NEOBOOTA by potwierdzic prawidlowy start image.\n\nNacisnij OK lub exit na pilocie by kontynuowac...\n\n\n'") + self.session.openWithCallback(self.StartImageInNeoBoot, Console, _('NeoBoot: Start image...'), [cmd]) + else: + self.StartImageInNeoBoot() + + def StartImageInNeoBoot(self): + if fileExists('/media/neoboot/ImageBoot/%s/.control_ok ' % ( getImageNeoBoot())): + system('touch /tmp/.control_ok ') + elif not fileExists('/media/neoboot/ImageBoot/%s/.control_ok ' % ( getImageNeoBoot())): + system('touch /media/neoboot/ImageBoot/%s//.control_boot_new_image ' % ( getImageNeoBoot())) + +#################################### + system('sync; echo 3 > /proc/sys/vm/drop_caches; chmod 755 /usr/lib/enigma2/python/Plugins/Extensions/NeoBoot/target/*') + self.sel = self['list'].getCurrent() + if self.sel: + self.sel = self.sel[2] + if self.sel == 0: + if fileExists('/media/mmc/etc/init.d/neobootmount.sh'): + os.system('rm -f /media/mmc/etc/init.d/neobootmount.sh;') + + #DM900; Zgemma h7S; AX HD60 4K + if getCPUSoC() == 'hi3798mv200' or getBoxHostName == 'ax60' or getCPUSoC() == '3798mv200' or getBoxHostName() == 'sf8008' or getCPUSoC() == 'bcm7251s' or getBoxHostName() == 'h7' or getCPUSoC() == 'BCM97252SSFF' or getBoxHostName() == 'dm900': + if getImageNeoBoot() == 'Flash': + if fileExists('/.multinfo'): + os.system('cd /media/mmc; ln -sfn /sbin/init.sysvinit /media/mmc/sbin/init; reboot -d -f -h -i') + elif not fileExists('/.multinfo'): + os.system('ln -sfn /sbin/init.sysvinit /sbin/init; reboot -d -f -h -i') + elif getImageNeoBoot() != 'Flash': + os.system('ln -sfn /sbin/neoinitarm /sbin/init; reboot -d -f -h -i') + else: + os.system('echo "Flash " >> /media/neoboot/ImageBoot/.neonextboot') + self.messagebox = self.session.open(MessageBox, _('Wygląda na to że multiboot nie wspiera tego modelu STB !!! '), MessageBox.TYPE_INFO, 8) + self.close() + + #MiracleBox, ET8500, Formuler F1, Formuler F3, Atemio6000 - MIPS # test - ultra, osmini + elif getCPUtype() != 'ARMv7' and getCPUSoC() == 'bcm7358' or getCPUSoC() == 'bcm7362' or getCPUSoC() == 'bcm7356' or getCPUSoC() == 'bcm7241' or getCPUSoC() == 'bcm7362' or getBoxHostName() == 'mbmini' or getBoxHostName() == 'h3' or getTunerModel() == 'ini-1000sv': #or getBoxHostName == 'mbultra' or getCPUSoC() == 'BCM7362' or getBoxHostName() == 'osmini' + if getImageNeoBoot() == 'Flash': + self.session.open(TryQuitMainloop, 2) + elif getImageNeoBoot() != 'Flash': + cmd='ln -sfn /sbin/neoinitmips /sbin/init; reboot -d -f -h -i' + self.session.open(Console, _('NeoBoot ....'), [cmd]) + else: + os.system('echo "Flash " >> /media/neoboot/ImageBoot/.neonextboot') + self.messagebox = self.session.open(MessageBox, _('Wygląda na to że multiboot nie wspiera tego modelu STB !!! '), MessageBox.TYPE_INFO, 8) + self.close() + + + + #MiracleBox Ultra - MIPS #Test + elif getCPUtype() != 'ARMv7' and getCPUSoC() == 'bcm7424' or getTunerModel() == 'ini-8000sv': + + if getImageNeoBoot() == 'Flash': + if fileExists('/.multinfo'): + cmd2='/usr/lib/enigma2/python/Plugins/Extensions/NeoBoot/target/mbultra_dev_mtd2.sh' + self.session.open(Console, _('NeoBoot MiracleBox Ultra...'), [cmd2]) + elif not fileExists('/.multinfo'): + self.session.open(TryQuitMainloop, 2) + + elif getImageNeoBoot() != 'Flash': + if not fileExists('/.multinfo'): + if not fileExists('/media/neoboot/ImageBoot/%s/boot/%s.vmlinux.gz ' % ( getImageNeoBoot(), getBoxHostName())): + cmd2='ln -sfn /sbin/neoinitmips /sbin/init; reboot -d -f -h -i' + self.session.open(Console, _('NeoBoot MiracleBox Ultra Rebooting....'), [cmd2]) + elif fileExists('/media/neoboot/ImageBoot/%s/boot/%s.vmlinux.gz' % ( getImageNeoBoot(), getBoxHostName())): + cmd2='ln -sfn /sbin/neoinitmips /sbin/init; /usr/lib/enigma2/python/Plugins/Extensions/NeoBoot/target/mbultra_dev_mtd2.sh' + self.session.open(Console, _('NeoBoot MiracleBox Ultra....'), [cmd2]) + + elif fileExists('/.multinfo'): + if not fileExists('/media/neoboot/ImageBoot/%s/boot/%s.vmlinux.gz' % ( getImageNeoBoot(), getBoxHostName())): + cmd2='ln -sfn /sbin/init.sysvinit /sbin/init; opkg install --force-reinstall --force-overwrite --force-downgrade /media/neoboot/ImagesUpload/.kernel/zImage.%s.ipk; reboot -d -f -h -i' % getBoxHostName() + self.session.open(Console, _('NeoBoot MiracleBox Ultra Rebooting....'), [cmd2]) + elif fileExists('/media/neoboot/ImageBoot/%s/boot/%s.vmlinux.gz' % ( getImageNeoBoot(), getBoxHostName())): + cmd2='ln -sfn /sbin/init.sysvinit /sbin/init; /usr/lib/enigma2/python/Plugins/Extensions/NeoBoot/target/mbultra_dev_mtd2.sh' + self.session.open(Console, _('NeoBoot MiracleBox Ultra....'), [cmd2]) + + else: + os.system('echo "Flash " >> /media/neoboot/ImageBoot/.neonextboot') + self.messagebox = self.session.open(MessageBox, _('Wygląda na to że model STB nie jest wpierany przez multiboota!!! '), MessageBox.TYPE_INFO, 8) + self.close() + + + #Edision OS MINI - MIPS #Test + elif getCPUtype() != 'ARMv7' and getCPUSoC() == 'BCM7362' or getBoxHostName() == 'osmini': + if getImageNeoBoot() == 'Flash': + if fileExists('/.multinfo'): + cmd2='/usr/lib/enigma2/python/Plugins/Extensions/NeoBoot/target/osmini_dev_mtd0.sh' + self.session.open(Console, _('NeoBoot Arm....'), [cmd2]) + elif not fileExists('/.multinfo'): + self.session.open(TryQuitMainloop, 2) + elif getImageNeoBoot() != 'Flash': + if not fileExists('/.multinfo'): + if not fileExists('/media/neoboot/ImageBoot/%s/boot/%s.vmlinux.gz' % ( getImageNeoBoot(), getBoxHostName())): + cmd2='ln -sfn /sbin/neoinitmips /sbin/init; reboot -d -f -h -i' + self.session.open(Console, _('NeoBoot Arm....'), [cmd2]) + elif fileExists('/media/neoboot/ImageBoot/%s/boot/%s.vmlinux.gz' % ( getImageNeoBoot(), getBoxHostName())): + cmd2='ln -sfn /sbin/neoinitmips /sbin/init; /usr/lib/enigma2/python/Plugins/Extensions/NeoBoot/target/osmini_dev_mtd0.sh' + self.session.open(Console, _('NeoBoot Arm....'), [cmd2]) + elif fileExists('/.multinfo'): + if not fileExists('/media/neoboot/ImageBoot/%s/boot/%s.vmlinux.gz' % ( getImageNeoBoot(), getBoxHostName())): + cmd2='opkg install --force-reinstall --force-overwrite --force-downgrade /media/neoboot/ImagesUpload/.kernel/zImage.%s.ipk; reboot -d -f -h -i' % getBoxHostName() + self.session.open(Console, _('NeoBoot Arm....'), [cmd2]) + elif fileExists('/media/neoboot/ImageBoot/%s/boot/%s.vmlinux.gz' % ( getImageNeoBoot(), getBoxHostName())): + cmd2='/usr/lib/enigma2/python/Plugins/Extensions/NeoBoot/target/osmini_dev_mtd0.sh' + self.session.open(Console, _('NeoBoot Arm....'), [cmd2]) + else: + os.system('echo "Flash " >> /media/neoboot/ImageBoot/.neonextboot') + self.messagebox = self.session.open(MessageBox, _('Wygląda na to że model STB nie jest wpierany przez multiboota!!! '), MessageBox.TYPE_INFO, 8) + self.close() + + #Octagon SF4008 ARM + elif getCPUSoC() == 'bcm7251' or getBoxHostName() == 'sf4008' : + if getImageNeoBoot() == 'Flash': + if fileExists('/.multinfo'): + cmd1='/usr/lib/enigma2/python/Plugins/Extensions/NeoBoot/target/sf4008_mmcblk0p3.sh' + self.session.open(Console, _('NeoBoot Octagon SF4008 ARM ...'), [cmd1]) + elif not fileExists('/.multinfo'): + self.session.open(TryQuitMainloop, 2) + elif getImageNeoBoot() != 'Flash': + if not fileExists('/.multinfo'): + if not fileExists('/media/neoboot/ImageBoot/%s/boot/zImage.%s' % ( getImageNeoBoot(), getBoxHostName())): + cmd1='ln -sfn /sbin/neoinitarm /sbin/init; reboot -d -f -h -i' + self.session.open(Console, _('NeoBoot Octagon SF4008 ARM ....'), [cmd1]) + elif fileExists('/media/neoboot/ImageBoot/%s/boot/zImage.%s' % ( getImageNeoBoot(), getBoxHostName())): + cmd1='ln -sfn /sbin/neoinitarm /sbin/init; /usr/lib/enigma2/python/Plugins/Extensions/NeoBoot/target/sf4008_mmcblk0p3.sh' + self.session.open(Console, _('NeoBoot Octagon SF4008 ARM ....'), [cmd1]) + elif fileExists('/.multinfo'): + if not fileExists('/media/neoboot/ImageBoot/%s/boot/zImage.%s' % ( getImageNeoBoot(), getBoxHostName())): + cmd1='cd /media/mmc; ln -sf /sbin/init.sysvinit /media/mmc/sbin/init; opkg install --force-maintainer --force-reinstall --force-overwrite --force-downgrade /media/neoboot/ImagesUpload/.kernel/zImage.%s.ipk; reboot -d -f -h -i' % getBoxHostName() + self.session.open(Console, _('NeoBoot Octagon SF4008 ARM ....'), [cmd1]) + elif fileExists('/media/neoboot/ImageBoot/%s/boot/zImage.%s' % ( getImageNeoBoot(), getBoxHostName())): + cmd1='cd /media/mmc; ln -sfn /sbin/init.sysvinit /media/mmc/sbin/init; /usr/lib/enigma2/python/Plugins/Extensions/NeoBoot/target/sf4008_mmcblk0p3.sh' + self.session.open(Console, _('NeoBoot Octagon SF4008 ARM ....'), [cmd1]) + else: + os.system('echo "Flash " >> /media/neoboot/ImageBoot/.neonextboot') + self.messagebox = self.session.open(MessageBox, _('Wygląda na to że Twój model STB nie jest wpierany!!! '), MessageBox.TYPE_INFO, 8) + self.close() + + #Zgemma h7S ARM + elif getCPUSoC() == 'bcm7251s' or getBoxHostName() == 'h7' : + if getImageNeoBoot() == 'Flash': + if fileExists('/.multinfo'): + cmd1='/usr/lib/enigma2/python/Plugins/Extensions/NeoBoot/target/h7s_mmcblk0p2.sh' + self.session.open(Console, _('NeoBoot Zgemma h7S ARM ...'), [cmd1]) + elif not fileExists('/.multinfo'): + self.session.open(TryQuitMainloop, 2) + elif getImageNeoBoot() != 'Flash': + if not fileExists('/.multinfo'): + if not fileExists('/media/neoboot/ImageBoot/%s/boot/zImage.%s' % ( getImageNeoBoot(), getBoxHostName())): + cmd1='ln -sfn /sbin/neoinitarm /sbin/init; reboot -d -f -h -i' + self.session.open(Console, _('NeoBoot Zgemma h7S ARM ....'), [cmd1]) + elif fileExists('/media/neoboot/ImageBoot/%s/boot/zImage.%s' % ( getImageNeoBoot(), getBoxHostName())): + cmd1='ln -sfn /sbin/neoinitarm /sbin/init; /usr/lib/enigma2/python/Plugins/Extensions/NeoBoot/target/h7s_mmcblk0p2.sh' + self.session.open(Console, _('NeoBoot Zgemma h7S ARM ....'), [cmd1]) + elif fileExists('/.multinfo'): + if not fileExists('/media/neoboot/ImageBoot/%s/boot/zImage.%s' % ( getImageNeoBoot(), getBoxHostName())): + cmd1='cd /media/mmc; ln -sf /sbin/neoinitarm /media/mmc/sbin/init; opkg install --force-maintainer --force-reinstall --force-overwrite --force-downgrade /media/neoboot/ImagesUpload/.kernel/zImage.%s.ipk; reboot -d -f -h -i' % getBoxHostName() + self.session.open(Console, _('NeoBoot Zgemma h7S ARM ....'), [cmd1]) + elif fileExists('/media/neoboot/ImageBoot/%s/boot/zImage.%s' % ( getImageNeoBoot(), getBoxHostName())): + cmd1='cd /media/mmc; ln -sfn /sbin/neoinitarm /media/mmc/sbin/init; /usr/lib/enigma2/python/Plugins/Extensions/NeoBoot/target/h7s_mmcblk0p2.sh' + self.session.open(Console, _('NeoBoot Zgemma h7S ARM ....'), [cmd1]) + else: + os.system('echo "Flash " >> /media/neoboot/ImageBoot/.neonextboot') + self.messagebox = self.session.open(MessageBox, _('Wygląda na to że Twój model STB nie jest wpierany!!! '), MessageBox.TYPE_INFO, 8) + self.close() + + #VUPLUS ARM - vu_mmcblk0p1.sh + elif getCPUSoC() == '7444s' or getBoxHostName() == 'vuultimo4k' or getCPUSoC() == '7376' or getBoxHostName() == 'vusolo4k' or getCPUSoC() == '7252s' or getBoxHostName() == 'vuuno4kse': + if getImageNeoBoot() == 'Flash': + if fileExists('/.multinfo'): + cmd1='/usr/lib/enigma2/python/Plugins/Extensions/NeoBoot/target/vu_mmcblk0p1.sh' + self.session.open(Console, _('NeoBoot Arm....'), [cmd1]) + elif not fileExists('/.multinfo'): + self.session.open(TryQuitMainloop, 2) + elif getImageNeoBoot() != 'Flash': + if not fileExists('/.multinfo'): + if not fileExists('/media/neoboot/ImageBoot/%s/boot/zImage.%s' % ( getImageNeoBoot(), getBoxVuModel())): + cmd1='ln -sfn /sbin/neoinitarm /sbin/init; reboot -d -f -h -i' + self.session.open(Console, _('NeoBoot Arm....'), [cmd1]) + elif fileExists('/media/neoboot/ImageBoot/%s/boot/zImage.%s' % ( getImageNeoBoot(), getBoxVuModel())): + cmd1='ln -sfn /sbin/neoinitarmvu /sbin/init; /usr/lib/enigma2/python/Plugins/Extensions/NeoBoot/target/vu_mmcblk0p1.sh' + self.session.open(Console, _('NeoBoot Arm....'), [cmd1]) + elif fileExists('/.multinfo'): + if not fileExists('/media/neoboot/ImageBoot/%s/boot/zImage.%s' % ( getImageNeoBoot(), getBoxVuModel())): + cmd1='cd /media/mmc; ln -sf /sbin/neoinitarm /media/mmc/sbin/init; opkg install --force-maintainer --force-reinstall --force-overwrite --force-downgrade /media/neoboot/ImagesUpload/.kernel/zImage.%s.ipk; reboot -d -f -h -i' % getBoxVuModel() + self.session.open(Console, _('NeoBoot Arm....'), [cmd1]) + elif fileExists('/media/neoboot/ImageBoot/%s/boot/zImage.%s' % ( getImageNeoBoot(), getBoxVuModel())): + cmd1='cd /media/mmc; ln -sfn /sbin/neoinitarmvu /media/mmc/sbin/init; /usr/lib/enigma2/python/Plugins/Extensions/NeoBoot/target/vu_mmcblk0p1.sh' + self.session.open(Console, _('NeoBoot Arm....'), [cmd1]) + else: + os.system('echo "Flash " >> /media/neoboot/ImageBoot/.neonextboot') + self.messagebox = self.session.open(MessageBox, _('Wygląda na to że Twój model STB nie jest wpierany!!! '), MessageBox.TYPE_INFO, 8) + self.close() + + #VUPLUS ARM - vu_mmcblk0p4.sh + elif getCPUSoC() == '72604' or getBoxHostName() == 'vuzero4k': + if getImageNeoBoot() == 'Flash': + if fileExists('/.multinfo'): + cmd1='/usr/lib/enigma2/python/Plugins/Extensions/NeoBoot/target/vu_mmcblk0p4.sh' + self.session.open(Console, _('NeoBoot Arm....'), [cmd1]) + elif not fileExists('/.multinfo'): + self.session.open(TryQuitMainloop, 2) + elif getImageNeoBoot() != 'Flash': + if not fileExists('/.multinfo'): + if not fileExists('/media/neoboot/ImageBoot/%s/boot/zImage.%s' % ( getImageNeoBoot(), getBoxVuModel())): + cmd1='ln -sfn /sbin/neoinitarm /sbin/init; reboot -d -f -h -i' + self.session.open(Console, _('NeoBoot Arm....'), [cmd1]) + elif fileExists('/media/neoboot/ImageBoot/%s/boot/zImage.%s' % ( getImageNeoBoot(), getBoxVuModel())): + cmd1='ln -sfn /sbin/neoinitarmvu /sbin/init; /usr/lib/enigma2/python/Plugins/Extensions/NeoBoot/target/vu_mmcblk0p4.sh' + self.session.open(Console, _('NeoBoot Arm....'), [cmd1]) + elif fileExists('/.multinfo'): + if not fileExists('/media/neoboot/ImageBoot/%s/boot/zImage.%s' % ( getImageNeoBoot(), getBoxVuModel())): + cmd1='cd /media/mmc; ln -sf /sbin/neoinitarm /media/mmc/sbin/init; opkg install --force-maintainer --force-reinstall --force-overwrite --force-downgrade /media/neoboot/ImagesUpload/.kernel/zImage.%s.ipk; reboot -d -f -h -i' % getBoxVuModel() + self.session.open(Console, _('NeoBoot Arm....'), [cmd1]) + elif fileExists('/media/neoboot/ImageBoot/%s/boot/zImage.%s' % ( getImageNeoBoot(), getBoxVuModel())): + cmd1='cd /media/mmc; ln -sfn /sbin/neoinitarmvu /media/mmc/sbin/init; /usr/lib/enigma2/python/Plugins/Extensions/NeoBoot/target/vu_mmcblk0p4.sh' + self.session.open(Console, _('NeoBoot Arm....'), [cmd1]) + else: + os.system('echo "Flash " >> /media/neoboot/ImageBoot/.neonextboot') + self.messagebox = self.session.open(MessageBox, _('Wygląda na to że Twój model STB nie jest wpierany!!! '), MessageBox.TYPE_INFO, 8) + self.close() + + #VUPLUS ARM - Duo4k.sh + elif getCPUSoC() == '7278' or getBoxHostName() == 'vuduo4k': + if getImageNeoBoot() == 'Flash': + if fileExists('/.multinfo'): + cmd1='/usr/lib/enigma2/python/Plugins/Extensions/NeoBoot/target/vu_mmcblk0p6.sh' + self.session.open(Console, _('NeoBoot Arm....'), [cmd1]) + elif not fileExists('/.multinfo'): + self.session.open(TryQuitMainloop, 2) + elif getImageNeoBoot() != 'Flash': + if not fileExists('/.multinfo'): + if not fileExists('/media/neoboot/ImageBoot/%s/boot/zImage.%s' % ( getImageNeoBoot(), getBoxVuModel())): + cmd1='ln -sfn /sbin/neoinitarm /sbin/init; reboot -d -f -h -i' + self.session.open(Console, _('NeoBoot Arm....'), [cmd1]) + elif fileExists('/media/neoboot/ImageBoot/%s/boot/zImage.%s' % ( getImageNeoBoot(), getBoxVuModel())): + cmd1='ln -sfn /sbin/neoinitarmvu /sbin/init; /usr/lib/enigma2/python/Plugins/Extensions/NeoBoot/target/vu_mmcblk0p6.sh' + self.session.open(Console, _('NeoBoot Arm....'), [cmd1]) + elif fileExists('/.multinfo'): + if not fileExists('/media/neoboot/ImageBoot/%s/boot/zImage.%s' % ( getImageNeoBoot(), getBoxVuModel())): + cmd1='cd /media/mmc; ln -sf /sbin/neoinitarm /media/mmc/sbin/init; opkg install --force-maintainer --force-reinstall --force-overwrite --force-downgrade /media/neoboot/ImagesUpload/.kernel/zImage.%s.ipk; reboot -d -f -h -i' % getBoxVuModel() + self.session.open(Console, _('NeoBoot Arm....'), [cmd1]) + elif fileExists('/media/neoboot/ImageBoot/%s/boot/zImage.%s' % ( getImageNeoBoot(), getBoxVuModel())): + cmd1='cd /media/mmc; ln -sfn /sbin/neoinitarmvu /media/mmc/sbin/init; /usr/lib/enigma2/python/Plugins/Extensions/NeoBoot/target/vu_mmcblk0p6.sh' + self.session.open(Console, _('NeoBoot Arm....'), [cmd1]) + else: + os.system('echo "Flash " >> /media/neoboot/ImageBoot/.neonextboot') + self.messagebox = self.session.open(MessageBox, _('Wygląda na to że Twój model STB nie jest wpierany!!! '), MessageBox.TYPE_INFO, 8) + self.close() + + #VUPLUS MIPS mtd2 + elif getCPUSoC() == '7356' or getCPUSoC() == '7429' or getCPUSoC() == '7424' or getCPUSoC() == '7241' or getCPUSoC() == '7362' or getBoxHostName() == 'vusolo2' or getBoxHostName() == 'vusolose' or getBoxHostName() == 'vuduo2' or getBoxHostName() == 'vuzero': + if getImageNeoBoot() == 'Flash': + if fileExists('/.multinfo'): + cmd2='/usr/lib/enigma2/python/Plugins/Extensions/NeoBoot/target/vu_dev_mtd2.sh' + self.session.open(Console, _('NeoBoot MIPS...'), [cmd2]) + elif not fileExists('/.multinfo'): + self.session.open(TryQuitMainloop, 2) + elif getImageNeoBoot() != 'Flash': + if not fileExists('/.multinfo'): + if not fileExists('/media/neoboot/ImageBoot/%s/boot/%s.vmlinux.gz' % ( getImageNeoBoot(), getBoxVuModel())): + cmd2='ln -sfn /sbin/neoinitmips /sbin/init; reboot -d -f -h -i' + self.session.open(Console, _('NeoBoot Arm....'), [cmd2]) + elif fileExists('/media/neoboot/ImageBoot/%s/boot/%s.vmlinux.gz' % ( getImageNeoBoot(), getBoxVuModel())): + cmd2='ln -sfn /sbin/neoinitmipsvu /sbin/init; /usr/lib/enigma2/python/Plugins/Extensions/NeoBoot/target/vu_dev_mtd2.sh' + self.session.open(Console, _('NeoBoot Arm....'), [cmd2]) + elif fileExists('/.multinfo'): + if not fileExists('/media/neoboot/ImageBoot/%s/boot/%s.vmlinux.gz' % ( getImageNeoBoot(), getBoxVuModel())): + cmd2='opkg install --force-reinstall --force-overwrite --force-downgrade /media/neoboot/ImagesUpload/.kernel/zImage.%s.ipk; reboot -d -f -h -i' % getBoxVuModel() + self.session.open(Console, _('NeoBoot Arm....'), [cmd2]) + elif fileExists('/media/neoboot/ImageBoot/%s/boot/%s.vmlinux.gz' % ( getImageNeoBoot(), getBoxVuModel())): + cmd2='/usr/lib/enigma2/python/Plugins/Extensions/NeoBoot/target/vu_dev_mtd2.sh' + self.session.open(Console, _('NeoBoot Arm....'), [cmd2]) + else: + os.system('echo "Flash " >> /media/neoboot/ImageBoot/.neonextboot') + self.messagebox = self.session.open(MessageBox, _('Wygląda na to że model STB nie jest wpierany przez multiboota!!! '), MessageBox.TYPE_INFO, 8) + self.close() + + + #VUPLUS MIPS mtd1 + elif getCPUSoC() == '7335' or getCPUSoC() == '7325' or getCPUSoC() == '7405' or getCPUSoC() == '7405(with 3D)' or getBoxHostName() == 'vuultimo' or getBoxHostName() == 'bm750' or getBoxHostName() == 'duo' or getBoxHostName() == 'vuuno' or getBoxHostName() == 'vusolo' or getBoxHostName() == 'vuduo': + if getImageNeoBoot() == 'Flash': + if fileExists('/.multinfo'): + cmd2='/usr/lib/enigma2/python/Plugins/Extensions/NeoBoot/target/vu_dev_mtd1.sh' + self.session.open(Console, _('NeoBoot MIPS...'), [cmd2]) + elif not fileExists('/.multinfo'): + self.session.open(TryQuitMainloop, 2) + elif getImageNeoBoot() != 'Flash': + if not fileExists('/.multinfo'): + if not fileExists('/media/neoboot/ImageBoot/%s/boot/%s.vmlinux.gz' % ( getImageNeoBoot(), getBoxVuModel())): + cmd2='ln -sfn /sbin/neoinitmips /sbin/init; reboot -d -f -h -i' + self.session.open(Console, _('NeoBoot Arm....'), [cmd2]) + elif fileExists('/media/neoboot/ImageBoot/%s/boot/%s.vmlinux.gz' % ( getImageNeoBoot(), getBoxVuModel())): + cmd2='ln -sfn /sbin/neoinitmipsvu /sbin/init; /usr/lib/enigma2/python/Plugins/Extensions/NeoBoot/target/vu_dev_mtd1.sh' + self.session.open(Console, _('NeoBoot Arm....'), [cmd2]) + elif fileExists('/.multinfo'): + if not fileExists('/media/neoboot/ImageBoot/%s/boot/%s.vmlinux.gz' % ( getImageNeoBoot(), getBoxVuModel())): + cmd2='opkg install --force-reinstall --force-overwrite --force-downgrade /media/neoboot/ImagesUpload/.kernel/zImage.%s.ipk; reboot -d -f -h -i' % getBoxVuModel() + self.session.open(Console, _('NeoBoot Arm....'), [cmd2]) + elif fileExists('/media/neoboot/ImageBoot/%s/boot/%s.vmlinux.gz' % ( getImageNeoBoot(), getBoxVuModel())): + cmd2='/usr/lib/enigma2/python/Plugins/Extensions/NeoBoot/target/vu_dev_mtd1.sh' + self.session.open(Console, _('NeoBoot Arm....'), [cmd2]) + else: + os.system('echo "Flash " >> /media/neoboot/ImageBoot/.neonextboot') + self.messagebox = self.session.open(MessageBox, _('Wygląda na to że model STB nie jest wpierany przez multiboota!!! '), MessageBox.TYPE_INFO, 8) + self.close() + + else: + os.system('echo "Flash " >> /media/neoboot/ImageBoot/.neonextboot') + self.messagebox = self.session.open(MessageBox, _('Wygląda na to że model STB nie jest wpierany przez NEOBOOT !!! '), MessageBox.TYPE_INFO, 8) + self.close() + diff --git a/NeoBoot/unpack.py b/NeoBoot/unpack.py new file mode 100644 index 0000000..cf4f97b --- /dev/null +++ b/NeoBoot/unpack.py @@ -0,0 +1,313 @@ +#!/usr/bin/python +# -*- coding: utf-8 -*- + +from __init__ import _ +from Plugins.Extensions.NeoBoot.files import Harddisk +from Plugins.Extensions.NeoBoot.files.stbbranding import getKernelVersionString, getKernelImageVersion, getCPUtype, getCPUSoC, getImageNeoBoot, getBoxVuModel, getBoxHostName, getTunerModel +from enigma import getDesktop +from enigma import eTimer +from Screens.Screen import Screen +from Screens.Console import Console +from Screens.MessageBox import MessageBox +from Screens.ChoiceBox import ChoiceBox +from Screens.VirtualKeyBoard import VirtualKeyBoard +from Screens.Standby import TryQuitMainloop +from Components.About import about +from Components.Sources.List import List +from Components.Button import Button +from Components.ActionMap import ActionMap, NumberActionMap +from Components.GUIComponent import * +from Components.MenuList import MenuList +from Components.Input import Input +from Components.Label import Label +from Components.ProgressBar import ProgressBar +from Components.ScrollLabel import ScrollLabel +from Components.Pixmap import Pixmap, MultiPixmap +from Components.config import * +from Components.ConfigList import ConfigListScreen +from Tools.LoadPixmap import LoadPixmap +from Tools.Directories import fileExists, pathExists, createDir, resolveFilename, SCOPE_PLUGINS +from os import system, listdir, mkdir, chdir, getcwd, rename as os_rename, remove as os_remove, popen +from os.path import dirname, isdir, isdir as os_isdir +import os +import time + +class InstallImage(Screen, ConfigListScreen): + screenwidth = getDesktop(0).size().width() + if screenwidth and screenwidth == 1920: + skin = """ + + + + + + + + + + + + + \ + """ + else: + skin = """ + + + + + + + + + + + + + + """ + + def __init__(self, session): + Screen.__init__(self, session) + fn = 'NewImage' + sourcelist = [] + for fn in os.listdir('/media/neoboot/ImagesUpload'): + if fn.find('.zip') != -1: + fn = fn.replace('.zip', '') + sourcelist.append((fn, fn)) + continue + if fn.find('.tar.xz') != -1: + fn = fn.replace('.tar.xz', '') + sourcelist.append((fn, fn)) + continue + if fn.find('.nfi') != -1: + fn = fn.replace('.nfi', '') + sourcelist.append((fn, fn)) + continue + if len(sourcelist) == 0: + sourcelist = [('None', 'None')] + self.source = ConfigSelection(choices=sourcelist) + self.target = ConfigText(fixed_size=False) + self.CopyFiles = ConfigYesNo(default=False) + self.CopyKernel = ConfigYesNo(default=True) + self.TvList = ConfigYesNo(default=True) + self.Montowanie = ConfigYesNo(default=True) + self.LanWlan = ConfigYesNo(default=True) + self.Sterowniki = ConfigYesNo(default=False) + self.InstallSettings = ConfigYesNo(default=False) + self.ZipDelete = ConfigYesNo(default=False) + self.RepairFTP = ConfigYesNo(default=False) + self.SoftCam = ConfigYesNo(default=False) + self.MediaPortal = ConfigYesNo(default=False) + self.BlackHole = ConfigYesNo(default=False) + self.target.value = '' + self.curselimage = '' + + try: + if self.curselimage != self.source.value: + self.target.value = self.source.value[:-13] + self.curselimage = self.source.value + except: + pass + + self.createSetup() + ConfigListScreen.__init__(self, self.list, session=session) + self.source.addNotifier(self.typeChange) + self['actions'] = ActionMap(['OkCancelActions', + 'ColorActions', + 'CiSelectionActions', + 'VirtualKeyboardActions'], {'cancel': self.cancel, + 'red': self.cancel, + 'green': self.imageInstall, + 'yellow': self.HelpInstall, + 'blue': self.openKeyboard}, -2) + self['key_green'] = Label(_('Install')) + self['key_red'] = Label(_('Cancel')) + self['key_yellow'] = Label(_('Help')) + self['key_blue'] = Label(_('Keyboard')) + self['HelpWindow'] = Pixmap() + self['HelpWindow'].hide() + + def createSetup(self): + self.list = [] + self.list.append(getConfigListEntry(_('Source Image file'), self.source)) + self.list.append(getConfigListEntry(_('Image Name'), self.target)) + self.list.append(getConfigListEntry(_('Do not copy files from Flash to the installed image ?'), self.CopyFiles )) + self.list.append(getConfigListEntry(_('Copy the kernel of the installed system (recommended only for Vu+) ?'), self.CopyKernel )) + self.list.append(getConfigListEntry(_('Copy the channel list ?'), self.TvList)) + self.list.append(getConfigListEntry(_('Copy mounting disks ? (Recommended)'), self.Montowanie)) + self.list.append(getConfigListEntry(_('Copy network settings LAN-WLAN ?'), self.LanWlan)) + self.list.append(getConfigListEntry(_('Copy the drivers ? (Recommended only other image.)'), self.Sterowniki)) + self.list.append(getConfigListEntry(_('Copy Settings to the new Image'), self.InstallSettings)) + self.list.append(getConfigListEntry(_('Delete Image zip after Install ?'), self.ZipDelete)) + self.list.append(getConfigListEntry(_('Repair FTP ? (Recommended only other image if it does not work.)'), self.RepairFTP)) + self.list.append(getConfigListEntry(_('Copy config SoftCam ?'), self.SoftCam)) + self.list.append(getConfigListEntry(_('Copy MediaPortal ?'), self.MediaPortal)) + self.list.append(getConfigListEntry(_('Path BlackHole ? (Not recommended for VuPlus)'), self.BlackHole)) + + def HelpInstall(self): + if fileExists('/.multinfo'): + mess = _('Information available only when running Flash.') + self.session.open(MessageBox, mess, MessageBox.TYPE_INFO) + else: + self.session.open(HelpInstall) + + + + def typeChange(self, value): + self.createSetup() + self['config'].l.setList(self.list) + if self.curselimage != self.source.value: + self.target.value = self.source.value[:-13] + self.curselimage = self.source.value + + def openKeyboard(self): + sel = self['config'].getCurrent() + if sel: + if sel == self.target: + if self['config'].getCurrent()[1].help_window.instance is not None: + self['config'].getCurrent()[1].help_window.hide() + self.vkvar = sel[0] + if self.vkvar == _('Image Name'): + self.session.openWithCallback(self.VirtualKeyBoardCallback, VirtualKeyBoard, title=self['config'].getCurrent()[0], text=self['config'].getCurrent()[1].value) + return + + def VirtualKeyBoardCallback(self, callback = None): + if callback is not None and len(callback): + self['config'].getCurrent()[1].setValue(callback) + self['config'].invalidate(self['config'].getCurrent()) + return + + def imageInstall(self): + if self.check_free_space(): + pluginpath = '/usr/lib/enigma2/python/Plugins/Extensions/NeoBoot' + myerror = '' + source = self.source.value.replace(' ', '') + target = self.target.value.replace(' ', '') + for fn in os.listdir('/media/neoboot/ImageBoot'): + if fn == target: + myerror = _('Sorry, an Image with the name ') + target + _(' is already installed.\n Please try another name.') + continue + + if source == 'None': + myerror = _('You have to select one Image to install.\nPlease, upload your zip file in the folder: /media/neoboot/ImagesUpload and select the image to install.') + if target == '': + myerror = _('You have to provide a name for the new Image.') + if target == 'Flash': + myerror = _('Sorry this name is reserved. Choose another name for the new Image.') + if len(target) > 35: + myerror = _('Sorry the name of the new Image is too long.') + if myerror: + myerror + self.session.open(MessageBox, myerror, MessageBox.TYPE_INFO) + else: + myerror + message = "echo -e '" + message += _('NeoBot started installing new image.\n') + message += _('The installation process may take a few minutes.\n') + message += _('Please: DO NOT reboot your STB and turn off the power.\n') + message += _('Please, wait...\n') + message += "'" + cmd1 = 'python ' + pluginpath + '/ex_init.py' + cmd = '%s %s %s %s %s %s %s %s %s %s %s %s %s %s %s ' % (cmd1, + source, + target.replace(' ', '.'), + str(self.CopyFiles.value), + str(self.CopyKernel.value), + str(self.TvList.value), + str(self.Montowanie.value), + str(self.LanWlan.value), + str(self.Sterowniki.value), + str(self.InstallSettings.value), + str(self.ZipDelete.value), + str(self.RepairFTP.value), + str(self.SoftCam.value), + str(self.MediaPortal.value), + str(self.BlackHole.value)) + print '[NEO-BOOT]: ', cmd + self.session.open(Console, _('NEOBoot: Install new image'), [message, cmd]) + + + def check_free_space(self): + if Freespace('/media/neoboot/ImagesUpload') < 500000: + self.session.open(MessageBox, _('Not enough free space on /media/neoboot/ !!\nYou need at least 500Mb free space.\n\nExit plugin.'), type=MessageBox.TYPE_ERROR) + return False + return True + + def cancel(self): + self.close() + +class HelpInstall(Screen): + screenwidth = getDesktop(0).size().width() + if screenwidth and screenwidth == 1920: + skin = """ + + + """ + else: + skin = """ + + """ + __module__ = __name__ + + def __init__(self, session): + Screen.__init__(self, session) + self['lab1'] = ScrollLabel('') + self['actions'] = ActionMap(['WizardActions', 'ColorActions', 'DirectionActions'], {'back': self.close, + 'ok': self.close, + 'up': self['lab1'].pageUp, + 'left': self['lab1'].pageUp, + 'down': self['lab1'].pageDown, + 'right': self['lab1'].pageDown}) + self['lab1'].hide() + self.updatetext() + + def updatetext(self): + + message = _('Source Image file') + message += _(' -Wybierz kursorem pilota oprogramowanie do zainstalowania (w lewo lub prawo).\n\n') + + message += _('Image Name') + message += _(' -Zmień nazwę image - aby zmienić naciśnij na pilocie niebieski.\n\n') + + message += _('Do not copy files from Flash to the installed image ?') + message += _(' - po zaznaczeniu tej opcji nie zostanie nic skopiowane z image flash do instalowanego image w neoboot. \n\n') + + message += _('Copy the kernel of the installed system (recommended only for Vu+) ?') + message += _(' - po zaznaczeniu tej opcji zostanie skopiowany plik jądra (kernel) instalowanego image do neoboota, zalecane tylko dla STB vuplus \n\n') + + message += _('Copy the channel list ?') + message += _(' - opcja kopiuje listę kanałów z flasha do instalowanego image w neoboocie.\n\n') + + message += _('Copy mounting disks ? (Recommended)') + message += _(' - opcja przenosi do instalowanego image w neoboot ustawienia montowania podłaczonych urządzeń do tunera.\n\n') + + message += _('Copy network settings LAN-WLAN ?') + message += _(' - opcja przenosi pliki z zawartymi ustawieniami dla sieci lan i wlan. \n\n ') + + message += _('Copy the drivers ? (Recommended only other image.)') + message += _(' - opcja przenosi z flasza sterowniki do instalowanego image w neoboocie, zalecane tylko w przypadku jeśli instalujemy image od innego model niż posiadamy.\n\n') + + message += _('Copy Settings to the new Image') + message += _(' - opcja kopiuje ustawienia oprogramowania z flasza do instalowanego systemu w neoboocie.\n\n') + + message += _('Delete Image zip after Install ?') + message += _(' - po instalacji, opcja kasuje plik zip image z katalogu ImagesUpload. \n\n') + + message += _('Repair FTP ? (Recommended only other image if it does not work.)') + message += _(' - opcja w niektórych przypadkach naprawia w instalowanym image polączenie FTP (ang. File Transfer Protocol) \n\n') + + message += _('Copy config SoftCam ?') + message += _(' - opcja kopiuje configi oscama i cccam (openpli -domyślnie)\n\n') + + message += _('Path BlackHole ? (Not recommended for VuPlus)') + message += _(' - opcja przeznaczona dla image blackhole, pomaga uruchomić BH w neoboot \n\n') + + self['lab1'].show() + self['lab1'].setText(message) + +def Freespace(dev): + statdev = os.statvfs(dev) + space = statdev.f_bavail * statdev.f_frsize / 1024 + print '[NeoBoot] Free space on %s = %i kilobytes' % (dev, space) + return space \ No newline at end of file