From 848a734c6f59f58d295e9bab6aa8c01bcaa2103f Mon Sep 17 00:00:00 2001 From: gutosie Date: Tue, 7 Jan 2020 11:10:32 +0200 Subject: [PATCH] Add files via upload --- NeoBoot/__init__.py | 25 + NeoBoot/__init__.pyo | Bin 0 -> 1165 bytes NeoBoot/error.mvi | Bin 0 -> 104931 bytes NeoBoot/ex_init.py | 6 + NeoBoot/extract.py | 1183 +++++++++++++++++++++++++++++++ NeoBoot/neoinstal.mvi | Bin 0 -> 37500 bytes NeoBoot/neologo.mvi | Bin 0 -> 42848 bytes NeoBoot/neowait.mvi | Bin 0 -> 33830 bytes NeoBoot/plugin.py | 1559 +++++++++++++++++++++++++++++++++++++++++ NeoBoot/run.py | 165 +++++ 10 files changed, 2938 insertions(+) create mode 100644 NeoBoot/__init__.py create mode 100644 NeoBoot/__init__.pyo create mode 100644 NeoBoot/error.mvi create mode 100644 NeoBoot/ex_init.py create mode 100644 NeoBoot/extract.py create mode 100644 NeoBoot/neoinstal.mvi create mode 100644 NeoBoot/neologo.mvi create mode 100644 NeoBoot/neowait.mvi create mode 100644 NeoBoot/plugin.py create mode 100644 NeoBoot/run.py 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/__init__.pyo b/NeoBoot/__init__.pyo new file mode 100644 index 0000000000000000000000000000000000000000..369244a03a8ebc6430298694e7f57c572dfe50a5 GIT binary patch literal 1165 zcmb_b&2G~`5T3R3)1(Q60urDea`dT|;J~G-C}|0mst`H!VpK(Lyh=A+?^fAKRZx2> zkI7r`05G$5+5;SG?T%+>#yj79GY)@u+hY6I=?tnTp!Wyb?gxpSmH-V<2uKA8J_n!! zC_+d>C~A<_pr}JyFMT2C2BZ!D9qCO-n~+n`2ILgfg1iAg0n#?)O|NW%Y{MOZkOCGR zf8Z=3Ori}+ul~>z3DS^{Iy3WCHkVPzmZv0^(ph~aKPfFuR!HoUZ8G>WKAet^PliXM z2|l^E9Pf{YC;P+05jM#-lJ=vu=w6e4c#YCHWsQp~bFA$w)6$c|>Fcxyv>gisSO`W< z)bwuwZpakCB4lcI3Hy)?!_QcQMIEpKl#bA23+@75%;6-e(LE!@T>Hw_*xVbke5*j5 z_MOE3y68UIe$*y+LK|?C#9ZQWMF{}_u+Enz&6QeO<8=x_d5xZiGi7o<FtS>q6j)V(NJhZKULdF@Mmkr?x7+XYd@WSnp7O&hg*6J*lM$L=tZG8D1&#j5e zOfLQp*VCyo3a8T@3grSz?vKdUqLbs!gXoE_Xo(qPV`w35-;npDlno&YhfURpXM&o*7nRdcf%Suxa8}=yykak5vVAmiUL-#KOg?VueC4!9qN;dH zbb^;6;*rMZBnGy)v_=|qJL`s(qwtKJU#-<{=Rhsx4DC`$_t3?JF(*9pzA|4-(%~cj x8wp?Srzy+xL8kRtHoJHz?9m#_UED2fzS44!0XeR;C$_~a(GZQG)og7v#b3O@{VxCj literal 0 HcmV?d00001 diff --git a/NeoBoot/error.mvi b/NeoBoot/error.mvi new file mode 100644 index 0000000000000000000000000000000000000000..9410f038942eeef111ae2901bacc994259b3c433 GIT binary patch literal 104931 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 e|IY9Fi`VRbVW9iR1^k=c<$vdO> %s/ImageBoot/%s/etc/fstab' % (media, target)) + + + + + namefile = media + '/ImageBoot/' + target + '/etc/fstab' + namefile2 = namefile + '.tmp' + out = open(namefile2, 'w') + f = open(namefile, 'r') + for line in f.readlines(): + + if line.find('/dev/mmcblk0p1') != -1: + line = '#' + line + elif line.find('/dev/mmcblk0p2') != -1: + line = '#' + line + elif line.find('/dev/mmcblk0p3') != -1: + line = '#' + line + elif line.find('/dev/mmcblk0p4') != -1: + line = '#' + line + elif line.find('/dev/mmcblk0p5') != -1: + line = '#' + line + elif line.find('/dev/mmcblk0p6') != -1: + line = '#' + line + elif line.find('/dev/mmcblk0p7') != -1: + line = '#' + line + elif line.find('/dev/mmcblk0p8') != -1: + line = '#' + line + elif line.find('/dev/mmcblk0p9') != -1: + line = '#' + line + elif line.find('/dev/root') != -1: + line = '#' + line + elif line.find('/dev/mtdblock1') != -1: + line = '#' + line + elif line.find('/dev/mtdblock2') != -1: + line = '#' + line + elif line.find('/dev/mtdblock3') != -1: + line = '#' + line + elif line.find('/dev/mtdblock4') != -1: + line = '#' + line + elif line.find('/dev/mtdblock5') != -1: + line = '#' + line + elif line.find('/dev/mtdblock6') != -1: + line = '#' + line + elif line.find('/dev/mtdblock7') != -1: + line = '#' + line + elif line.find('/dev/mtdblock8') != -1: + line = '#' + line + elif line.find('/dev/mtdblock9') != -1: + line = '#' + line + elif line.find('/dev/root') != -1: + line = '#' + line + out.write(line) + + f.close() + out.close() + os.rename(namefile2, namefile) + + tpmd = media + '/ImageBoot/' + target + '/etc/init.d/tpmd' + if os.path.exists(tpmd): + os.system('rm ' + tpmd) + + fname = media + '/ImageBoot/' + target + '/usr/lib/enigma2/python/Components/config.py' + if os.path.exists(fname): + fname2 = fname + '.tmp' + out = open(fname2, 'w') + f = open(fname, 'r') + for line in f.readlines(): + if line.find('if file(""/proc/stb/info/vumodel")') != -1: + line = '#' + line + out.write(line) + + f.close() + out.close() + os.rename(fname2, fname) + + + targetfile = media + '/ImageBoot/' + target + '/etc/vsftpd.conf' + if os.path.exists(targetfile): + targetfile2 = targetfile + '.tmp' + out = open(targetfile2, 'w') + f = open(targetfile, 'r') + for line in f.readlines(): + if not line.startswith('nopriv_user'): + out.write(line) + + f.close() + out.close() + os.rename(targetfile2, targetfile) + + + mypath = media + '/ImageBoot/' + target + '/usr/lib/opkg/info/' + cmd = 'mkdir -p %s/ImageBoot/%s/var/lib/opkg/info > /dev/null 2>&1' % (media, target) + rc = os.system(cmd) + if not os.path.exists(mypath): + mypath = media + '/ImageBoot/' + target + '/var/lib/opkg/info/' + for fn in os.listdir(mypath): + if fn.find('kernel-image') != -1 and fn.find('postinst') != -1: + filename = mypath + fn + filename2 = filename + '.tmp' + out = open(filename2, 'w') + f = open(filename, 'r') + for line in f.readlines(): + if line.find('/boot') != -1: + line = line.replace('/boot', '/boot > /dev/null 2>\\&1; exit 0') + out.write(line) + + if f.close(): + out.close() + os.rename(filename2, filename) + cmd = 'chmod -R 0755 %s' % filename + rc = os.system(cmd) + if fn.find('-bootlogo.postinst') != -1: + filename = mypath + fn + filename2 = filename + '.tmp' + out = open(filename2, 'w') + f = open(filename, 'r') + for line in f.readlines(): + if line.find('/boot') != -1: + line = line.replace('/boot', '/boot > /dev/null 2>\\&1; exit 0') + out.write(line) + + f.close() + out.close() + os.rename(filename2, filename) + cmd = 'chmod -R 0755 %s' % filename + rc = os.system(cmd) + if fn.find('-bootlogo.postrm') != -1: + filename = mypath + fn + filename2 = filename + '.tmp' + out = open(filename2, 'w') + f = open(filename, 'r') + for line in f.readlines(): + if line.find('/boot') != -1: + line = line.replace('/boot', '/boot > /dev/null 2>\\&1; exit 0') + out.write(line) + + f.close() + out.close() + os.rename(filename2, filename) + cmd = 'chmod -R 0755 %s' % filename + rc = os.system(cmd) + if fn.find('-bootlogo.preinst') != -1: + filename = mypath + fn + filename2 = filename + '.tmp' + out = open(filename2, 'w') + f = open(filename, 'r') + for line in f.readlines(): + if line.find('/boot') != -1: + line = line.replace('/boot', '/boot > /dev/null 2>\\&1; exit 0') + out.write(line) + + f.close() + out.close() + os.rename(filename2, filename) + cmd = 'chmod -R 0755 %s' % filename + rc = os.system(cmd) + if fn.find('-bootlogo.prerm') != -1: + filename = mypath + fn + filename2 = filename + '.tmp' + out = open(filename2, 'w') + f = open(filename, 'r') + for line in f.readlines(): + if line.find('/boot') != -1: + line = line.replace('/boot', '/boot > /dev/null 2>\\&1; exit 0') + out.write(line) + + f.close() + out.close() + os.rename(filename2, filename) + cmd = 'chmod -R 0755 %s' % filename + rc = os.system(cmd) + + os.system('mkdir -p ' + media_target + '/media/hdd' + dev_null) + os.system('mkdir -p ' + media_target + '/media/usb' + dev_null) + + os.system('mkdir -p ' + media_target + '/var/lib/opkg/info/' + dev_null) + os.system('touch ' + getNeoLocation() + 'ImageBoot/.data; echo "Data instalacji image" > ' + getNeoLocation() + 'ImageBoot/.data; echo " "; date > ' + getNeoLocation() + 'ImageBoot/.data') + os.system('mv -f ' + getNeoLocation() + 'ImageBoot/.data ' + getNeoLocation() + 'ImageBoot/%s/.data' % target) + cmd = 'touch /tmp/.init_reboot' + rc = os.system(cmd) + out = open(mediahome + '.neonextboot', 'w') + out.write(target) + out.close() + os.system('cp ' + getNeoLocation() + 'ImageBoot/.neonextboot ' + getNeoLocation() + 'ImageBoot/%s/.multinfo' % target) + out = open(mediahome + '.neonextboot', 'w') + out.write('Flash') + out.close() + os.system('echo "Zako\xc5\x84czono instalacj\xc4\x99 nowego systemu. EXIT "') + os.system('echo "End of installation:"; date +%T') + if '.tar.xz' not in source and not os.path.exists('' + getNeoLocation() + '/ImageBoot/%s/etc/issue' % target): + os.system('echo ""; echo "Nie zainstalowano systemu ! Powodem b\xc5\x82\xc4\x99du instalacji mo\xc5\xbce by\xc4\x87 \xc5\xbale spakowany plik image w zip lub nie jest to sytem dla Twojego modelu ."') + os.system('echo "Instalowany system może sieę nie uruchomić poprawnie! Sprawdż poprawność kataogow w instalwoanym image!!!"') + os.system('rm -r ' + getNeoLocation() + '/ImageBoot/%s' % target ) + + if os.path.exists('' + getNeoLocation() + 'ubi'): + os.system('rm -rf ' + getNeoLocation() + 'ubi') + if os.path.exists('' + getNeoLocation() + 'image_cache/'): + os.system('rm ' + getNeoLocation() + 'image_cache') + if os.path.exists('' + getNeoLocation() + 'ImageBoot/.without_copying'): + os.system('rm ' + getNeoLocation() + 'ImageBoot/.without_copying') + rc = os.system('sync') + rc = RemoveUnpackDirs() + if os.path.exists('/tmp/init4'): + os.system('rm -f /tmp/init4; init 3') + + +def RemoveUnpackDirs(): + os.chdir(media + '/ImagesUpload') + if os.path.exists('' + getNeoLocation() + 'ImagesUpload/vuplus'): + rc = os.system('rm -r ' + getNeoLocation() + 'ImagesUpload/vuplus') + elif os.path.exists('' + getNeoLocation() + 'ImagesUpload/sf4008'): + rc = os.system('rm -r ' + getNeoLocation() + 'ImagesUpload/sf4008') + elif os.path.exists('' + getNeoLocation() + 'ImagesUpload/octagon/sf8008'): + rc = os.system('mv ' + getNeoLocation() + 'ImagesUpload/usb_update.bin ' + getNeoLocation() + 'ImagesUpload/octagon; rm -r ' + getNeoLocation() + 'ImagesUpload/octagon') + elif os.path.exists('' + getNeoLocation() + 'ImagesUpload/hd60'): + rc = os.system('mv ' + getNeoLocation() + 'ImagesUpload/bootargs.bin ' + getNeoLocation() + 'ImagesUpload/hd60; mv ' + getNeoLocation() + 'ImagesUpload/fastboot.bin ' + getNeoLocation() + 'ImagesUpload/hd60; rm -r ' + getNeoLocation() + 'ImagesUpload/hd60') + elif os.path.exists('' + getNeoLocation() + 'ImagesUpload/osmio4k'): + rc = os.system('rm -r ' + getNeoLocation() + 'ImagesUpload/osmio4k') + elif os.path.exists('' + getNeoLocation() + 'ImagesUpload/dm900'): + rc = os.system('rm -r ' + getNeoLocation() + 'ImagesUpload/dm900') + elif os.path.exists('' + getNeoLocation() + 'ImagesUpload/hd51'): + rc = os.system('rm -r ' + getNeoLocation() + 'ImagesUpload/hd51') + elif os.path.exists('' + getNeoLocation() + 'ImagesUpload/gigablue'): + rc = os.system('rm -r ' + getNeoLocation() + 'ImagesUpload/gigablue') + elif os.path.exists('' + getNeoLocation() + 'ImagesUpload/miraclebox'): + rc = os.system('rm -r ' + getNeoLocation() + 'ImagesUpload/miraclebox') + elif os.path.exists('' + getNeoLocation() + 'ImagesUpload/e4hd'): + rc = os.system('rm -r ' + getNeoLocation() + 'ImagesUpload/e4hd') + elif os.path.exists('' + getNeoLocation() + 'ImagesUpload/update'): + rc = os.system('rm -r ' + getNeoLocation() + 'ImagesUpload/update') + elif os.path.exists('' + getNeoLocation() + 'ImagesUpload/rootfs.tar.xz'): + rc = os.system('rm -r ' + getNeoLocation() + 'ImagesUpload/rootfs.tar.xz') + elif os.path.exists('' + getNeoLocation() + 'ImagesUpload/*.nfi'): + rc = os.system('rm -r ' + getNeoLocation() + 'ImagesUpload/*.nfi') + elif os.path.exists('' + getNeoLocation() + 'ImagesUpload/zgemma'): + rc = os.system('rm -r ' + getNeoLocation() + 'ImagesUpload/zgemma') + elif os.path.exists('' + getNeoLocation() + 'ImagesUpload/h7'): + rc = os.system('mv ' + getNeoLocation() + 'ImagesUpload/bootargs.bin ' + getNeoLocation() + 'ImagesUpload/h7; mv ' + getNeoLocation() + 'ImagesUpload/fastboot.bin ' + getNeoLocation() + 'ImagesUpload/h7') + rc = os.system('rm -r ' + getNeoLocation() + 'ImagesUpload/h7') + elif os.path.exists('' + getNeoLocation() + 'ImagesUpload/h9'): + rc = os.system('mv ' + getNeoLocation() + 'ImagesUpload/bootargs.bin ' + getNeoLocation() + 'ImagesUpload/h9; mv ' + getNeoLocation() + 'ImagesUpload/fastboot.bin ' + getNeoLocation() + 'ImagesUpload/h9') + rc = os.system('rm -r ' + getNeoLocation() + 'ImagesUpload/h9') + elif os.path.exists('' + getNeoLocation() + 'ImagesUpload/uclan'): + rc = os.system('mv ' + getNeoLocation() + 'ImagesUpload/usb_update.bin ' + getNeoLocation() + 'ImagesUpload/uclan') + rc = os.system('rm -r ' + getNeoLocation() + 'ImagesUpload/uclan') + elif os.path.exists('' + getNeoLocation() + 'ImagesUpload/formuler1'): + rc = os.system('rm -r ' + getNeoLocation() + 'ImagesUpload/formuler1') + elif os.path.exists('' + getNeoLocation() + 'ImagesUpload/formuler3'): + rc = os.system('rm -r ' + getNeoLocation() + 'ImagesUpload/formuler3') + elif os.path.exists('' + getNeoLocation() + 'ImagesUpload/formuler4turbo'): + rc = os.system('rm -r ' + getNeoLocation() + 'ImagesUpload/formuler4turbo') + elif os.path.exists('' + getNeoLocation() + 'ImagesUpload/et*'): + rc = os.system('rm -r ' + getNeoLocation() + 'ImagesUpload/et*') + elif os.path.exists('' + getNeoLocation() + 'ImagesUpload/xpeedl*'): + rc = os.system('rm -r ' + getNeoLocation() + 'ImagesUpload/xpeedl*') + elif os.path.exists('' + getNeoLocation() + 'ImagesUpload/osmini'): + rc = os.system('rm -r ' + getNeoLocation() + 'ImagesUpload/osmini') + elif os.path.exists('' + getNeoLocation() + 'ImagesUpload/xp1000 '): + rc = os.system('rm -r ' + getNeoLocation() + 'ImagesUpload/xp1000 ') + elif os.path.exists('' + getNeoLocation() + 'ImagesUpload/dinobot '): + rc = os.system('rm -r ' + getNeoLocation() + 'ImagesUpload/dinobot ') + + os.system('echo "Remove Unpack Dirs..."') + + +def NEOBootExtract(source, target, ZipDelete, BlackHole): + os.system('echo "Start of installation:"; date +%T') + RemoveUnpackDirs() + + if os.path.exists('' + getNeoLocation() + 'ImageBoot/.without_copying'): + os.system('rm ' + getNeoLocation() + 'ImageBoot/.without_copying') + if os.path.exists('' + getNeoLocation() + 'image_cache'): + os.system('rm -rf ' + getNeoLocation() + 'image_cache') + + sourcefile = media + '/ImagesUpload/%s.zip' % source + sourcefile2 = media + '/ImagesUpload/%s.nfi' % source + + os.system('echo "This may take a few minutes to complete...."') + + #Instalacja *.nfi + if os.path.exists(sourcefile2) is True: + if sourcefile2.endswith('.nfi'): + os.system('echo "Instalacja systemu skapowanego w plik nfi..."') + to = '' + getNeoLocation() + 'ImageBoot/' + target + cmd = 'mkdir %s > /dev/null 2<&1' % to + rc = os.system(cmd) + to = '' + getNeoLocation() + 'ImageBoot/' + target + cmd = 'chmod -R 0777 %s' % to + rc = os.system(cmd) + cmd = '/usr/lib/enigma2/python/Plugins/Extensions/NeoBoot/bin/nfidump ' + sourcefile2 + ' ' + getNeoLocation() + 'ImageBoot/' + target + rc = os.system(cmd) + if ZipDelete == 'True': + rc = os.system('rm -rf ' + sourcefile2) + else: + os.system('echo "NeoBoot keep the file: %s for reinstallation."' % sourcefile2) + #Instalacja *.zip + elif os.path.exists(sourcefile) is True: + os.system('unzip ' + sourcefile) + if ZipDelete == 'True': + os.system('rm -rf ' + sourcefile) + os.system('echo "Rozpakowywanie pliku instalacyjnego..."') + + #Instalacja MIPS + if getCPUtype() == 'MIPS': + if os.path.exists('' + getNeoLocation() + 'ubi') is False: + rc = os.system('mkdir ' + getNeoLocation() + 'ubi') + to = '' + getNeoLocation() + 'ImageBoot/' + target + cmd = 'mkdir %s > /dev/null 2<&1' % to + rc = os.system(cmd) + to = '' + getNeoLocation() + 'ImageBoot/' + target + cmd = 'chmod -R 0777 %s' % to + rc = os.system(cmd) + rootfname = 'rootfs.bin' + brand = '' + #NANDSIM + if os.path.exists('/lib/modules/%s/kernel/drivers/mtd/nand/nandsim.ko' % getKernelVersion()): + for i in range(0, 20): + mtdfile = '/dev/mtd' + str(i) + if os.path.exists(mtdfile) is False: + break + + mtd = str(i) + os.chdir(media + '/ImagesUpload') + #zgemma + if os.path.exists('' + getNeoLocation() + 'ImagesUpload/zgemma'): + os.chdir('zgemma') + brand = 'zgemma' + rootfname = 'rootfs.bin' + if os.path.exists('' + getNeoLocation() + 'ImagesUpload/zgemma/sh1'): + os.chdir('sh1') + if os.path.exists('' + getNeoLocation() + 'ImagesUpload/zgemma/sh2'): + os.chdir('sh2') + if os.path.exists('' + getNeoLocation() + 'ImagesUpload/zgemma/h2'): + os.chdir('h2') + if os.path.exists('' + getNeoLocation() + 'ImagesUpload/zgemma/h3'): + os.chdir('h3') + if os.path.exists('' + getNeoLocation() + 'ImagesUpload/zgemma/h5'): + os.chdir('h5') + if os.path.exists('' + getNeoLocation() + 'ImagesUpload/zgemma/h7'): + os.chdir('h7') + + #miraclebox + if os.path.exists('' + getNeoLocation() + 'ImagesUpload/miraclebox'): + os.chdir('miraclebox') + brand = 'miraclebox' + rootfname = 'rootfs.bin' + if os.path.exists('' + getNeoLocation() + 'ImagesUpload/miraclebox/mini'): + os.chdir('mini') + if os.path.exists('' + getNeoLocation() + 'ImagesUpload/miraclebox/miniplus'): + os.chdir('miniplus') + if os.path.exists('' + getNeoLocation() + 'ImagesUpload/miraclebox/minihybrid'): + os.chdir('minihybrid') + if os.path.exists('' + getNeoLocation() + 'ImagesUpload/miraclebox/twin'): + os.chdir('twin') + if os.path.exists('' + getNeoLocation() + 'ImagesUpload/miraclebox/ultra'): + os.chdir('ultra') + if os.path.exists('' + getNeoLocation() + 'ImagesUpload/miraclebox/micro'): + os.chdir('micro') + if os.path.exists('' + getNeoLocation() + 'ImagesUpload/miraclebox/twinplus'): + os.chdir('twinplus') + #atemio + if os.path.exists('' + getNeoLocation() + 'ImagesUpload/atemio'): + os.chdir('atemio') + if os.path.exists('' + getNeoLocation() + 'ImagesUpload/atemio/5x00'): + os.chdir('5x00') + if os.path.exists('' + getNeoLocation() + 'ImagesUpload/atemio/6000'): + os.chdir('6000') + if os.path.exists('' + getNeoLocation() + 'ImagesUpload/atemio/6100'): + os.chdir('6100') + if os.path.exists('' + getNeoLocation() + 'ImagesUpload/atemio/6200'): + os.chdir('6200') + if os.path.exists('' + getNeoLocation() + 'ImagesUpload/atemio/8x00'): + os.chdir('8x00') + if os.path.exists('' + getNeoLocation() + 'ImagesUpload/atemio/8x00'): + os.chdir('8x00') + #Xtrend + if os.path.exists('' + getNeoLocation() + 'ImagesUpload/et10000'): + os.chdir('et10000') + brand = 'et10000' + if os.path.exists('' + getNeoLocation() + 'ImagesUpload/et9x00'): + os.chdir('et9x00') + brand = 'et9x00' + if os.path.exists('' + getNeoLocation() + 'ImagesUpload/et8500'): + os.chdir('et8500') + brand = 'et8500' + if os.path.exists('' + getNeoLocation() + 'ImagesUpload/et8000'): + os.chdir('et8000') + brand = 'et8000' + if os.path.exists('' + getNeoLocation() + 'ImagesUpload/et7x00'): + os.chdir('et7x00') + brand = 'et7x00' + if os.path.exists('' + getNeoLocation() + 'ImagesUpload/et6x00'): + os.chdir('et6x00') + brand = 'et6x00' + if os.path.exists('' + getNeoLocation() + 'ImagesUpload/et5x00'): + os.chdir('et5x00') + brand = 'et5x00' + if os.path.exists('' + getNeoLocation() + 'ImagesUpload/et4x00'): + os.chdir('et4x00') + brand = 'et4x00' + #formuler + if os.path.exists('' + getNeoLocation() + 'ImagesUpload/formuler1'): + os.chdir('formuler1') + brand = 'formuler1' + if os.path.exists('' + getNeoLocation() + 'ImagesUpload/formuler2'): + os.chdir('formuler2') + brand = 'formuler2' + if os.path.exists('' + getNeoLocation() + 'ImagesUpload/formuler3'): + os.chdir('formuler3') + brand = 'formuler3' + if os.path.exists('' + getNeoLocation() + 'ImagesUpload/formuler4turbo'): + os.chdir('formuler4turbo') + brand = 'formuler4turbo' + #inne + if os.path.exists('' + getNeoLocation() + 'ImagesUpload/sf3038'): + os.chdir('sf3038') + if os.path.exists('' + getNeoLocation() + 'ImagesUpload/xpeedlx'): + os.chdir('xpeedlx') + brand = 'xpeedlx' + if os.path.exists('' + getNeoLocation() + 'ImagesUpload/xpeedlx3'): + os.chdir('xpeedlx3') + brand = 'xpeedlx3' + if os.path.exists('' + getNeoLocation() + 'ImagesUpload/xp1000'): + os.chdir('xp1000') + brand = 'xp1000' + #VuPlus + if os.path.exists('' + getNeoLocation() + 'ImagesUpload/vuplus'): + os.chdir('vuplus') + brand = 'vuplus' + rootfname = 'root_cfe_auto.jffs2' + if os.path.exists('' + getNeoLocation() + 'ImagesUpload/vuplus/uno'): + os.chdir('uno') + if os.path.exists('' + getNeoLocation() + 'ImagesUpload/vuplus/duo'): + os.chdir('duo') + if os.path.exists('' + getNeoLocation() + 'ImagesUpload/vuplus/ultimo'): + os.chdir('ultimo') + if os.path.exists('' + getNeoLocation() + 'ImagesUpload/vuplus/solo'): + os.chdir('solo') + if os.path.exists('' + getNeoLocation() + 'ImagesUpload/vuplus/duo2'): + os.chdir('duo2') + rootfname = 'root_cfe_auto.bin' + if os.path.exists('' + getNeoLocation() + 'ImagesUpload/vuplus/solo2'): + os.chdir('solo2') + rootfname = 'root_cfe_auto.bin' + if os.path.exists('' + getNeoLocation() + 'ImagesUpload/vuplus/solose'): + os.chdir('solose') + rootfname = 'root_cfe_auto.bin' + if os.path.exists('' + getNeoLocation() + 'ImagesUpload/vuplus/zero'): + os.chdir('zero') + rootfname = 'root_cfe_auto.bin' + + #osmini + if os.path.exists('' + getNeoLocation() + 'ImagesUpload/osmini'): + os.chdir('osmini') + brand = 'osmini' + + + #Instalacja image nandsim + os.system('echo "Instalacja - nandsim w toku..."') + rc = os.system('insmod /lib/modules/%s/kernel/drivers/mtd/nand/nandsim.ko cache_file=' + getNeoLocation() + 'image_cache first_id_byte=0x20 second_id_byte=0xaa third_id_byte=0x00 fourth_id_byte=0x15;sleep 5' % getKernelVersion()) + cmd = 'dd if=%s of=/dev/mtdblock%s bs=2048' % (rootfname, mtd) + rc = os.system(cmd) + cmd = 'ubiattach /dev/ubi_ctrl -m %s -O 2048' % mtd + rc = os.system(cmd) + rc = os.system('mount -t ubifs ubi1_0 ' + getNeoLocation() + 'ubi') + os.chdir('/home/root') + cmd = 'cp -r ' + getNeoLocation() + 'ubi/* ' + getNeoLocation() + 'ImageBoot/' + target + rc = os.system(cmd) + rc = os.system('umount ' + getNeoLocation() + 'ubi') + cmd = 'ubidetach -m %s' % mtd + rc = os.system(cmd) + rc = os.system('rmmod nandsim') + rc = os.system('rm ' + getNeoLocation() + 'image_cache') + + if '.tar.xz' not in source and not os.path.exists('%s/ImageBoot/%s/etc/issue' % (media, target)): + rc = os.system('sync') + os.system("echo 3 > /proc/sys/vm/drop_caches") + + os.system('echo ""; echo "Nie zainstalowano systemu ! Powodem b\xc5\x82\xc4\x99du instalacji mo\xc5\xbce by\xc4\x87 kernel-module-nandsim."') + os.system('echo "By uzyc innego narzedzia do rozpakowania image, ponow instalacje image jeszcze raz po restarcie tunera."') + os.system('echo "RESTART ZA 15 sekund..."') + + rc = os.system('rm -rf /lib/modules/%s/kernel/drivers/mtd/nand/nandsim.ko ' % getKernelVersion()) + + os.system('rm -r %s/ImageBoot/%s' % (media, target)) + os.system('sleep 5; sync; init 4; sleep 5; init 3 ') + + #UBI_READER + elif os.path.exists('/usr/lib/enigma2/python/Plugins/Extensions/NeoBoot/ubi_reader/ubi_extract_files.py'): + if os.path.exists('' + getNeoLocation() + 'ImagesUpload/venton-hdx'): + os.chdir('venton-hdx') + if os.path.exists('' + getNeoLocation() + 'ImagesUpload/hde'): + os.chdir('hde') + if os.path.exists('' + getNeoLocation() + 'ImagesUpload/hdx'): + os.chdir('hdx') + if os.path.exists('' + getNeoLocation() + 'ImagesUpload/hdp'): + os.chdir('hdp') + if os.path.exists('' + getNeoLocation() + 'ImagesUpload/miraclebox'): + os.chdir('miraclebox') + if os.path.exists('' + getNeoLocation() + 'ImagesUpload/miraclebox/mini'): + os.chdir('mini') + if os.path.exists('' + getNeoLocation() + 'ImagesUpload/miraclebox/miniplus'): + os.chdir('miniplus') + if os.path.exists('' + getNeoLocation() + 'ImagesUpload/miraclebox/minihybrid'): + os.chdir('minihybrid') + if os.path.exists('' + getNeoLocation() + 'ImagesUpload/miraclebox/twin'): + os.chdir('twin') + if os.path.exists('' + getNeoLocation() + 'ImagesUpload/miraclebox/ultra'): + os.chdir('ultra') + if os.path.exists('' + getNeoLocation() + 'ImagesUpload/miraclebox/micro'): + os.chdir('micro') + if os.path.exists('' + getNeoLocation() + 'ImagesUpload/miraclebox/microv2'): + os.chdir('microv2') + if os.path.exists('' + getNeoLocation() + 'ImagesUpload/miraclebox/twinplus'): + os.chdir('twinplus') + if os.path.exists('' + getNeoLocation() + 'ImagesUpload/miraclebox/mini4k'): + os.chdir('mini4k') + if os.path.exists('' + getNeoLocation() + 'ImagesUpload/miraclebox/ultra4k'): + os.chdir('ultra4k') + if os.path.exists('' + getNeoLocation() + 'ImagesUpload/atemio'): + os.chdir('atemio') + if os.path.exists('' + getNeoLocation() + 'ImagesUpload/atemio/5x00'): + os.chdir('5x00') + if os.path.exists('' + getNeoLocation() + 'ImagesUpload/atemio/6000'): + os.chdir('6000') + if os.path.exists('' + getNeoLocation() + 'ImagesUpload/atemio/6100'): + os.chdir('6100') + if os.path.exists('' + getNeoLocation() + 'ImagesUpload/atemio/6200'): + os.chdir('6200') + if os.path.exists('' + getNeoLocation() + 'ImagesUpload/atemio/8x00'): + os.chdir('8x00') + if os.path.exists('' + getNeoLocation() + 'ImagesUpload/xpeedlx'): + os.chdir('xpeedlx') + if os.path.exists('' + getNeoLocation() + 'ImagesUpload/xpeedlx3'): + os.chdir('xpeedlx3') + if os.path.exists('' + getNeoLocation() + 'ImagesUpload/bwidowx'): + os.chdir('bwidowx') + if os.path.exists('' + getNeoLocation() + 'ImagesUpload/bwidowx2'): + os.chdir('bwidowx2') + if os.path.exists('' + getNeoLocation() + 'ImagesUpload/beyonwiz'): + os.chdir('beyonwiz') + if os.path.exists('' + getNeoLocation() + 'ImagesUpload/beyonwiz/hdx'): + os.chdir('hdx') + if os.path.exists('' + getNeoLocation() + 'ImagesUpload/beyonwiz/hdp'): + os.chdir('hdp') + if os.path.exists('' + getNeoLocation() + 'ImagesUpload/beyonwiz/hde2'): + os.chdir('hde2') + if os.path.exists('' + getNeoLocation() + 'ImagesUpload/vuplus'): + os.chdir('vuplus') + if os.path.exists('' + getNeoLocation() + 'ImagesUpload/vuplus/duo'): + os.chdir('duo') + os.system('mv root_cfe_auto.jffs2 rootfs.bin') + if os.path.exists('' + getNeoLocation() + 'ImagesUpload/vuplus/solo'): + os.chdir('solo') + os.system('mv -f root_cfe_auto.jffs2 rootfs.bin') + if os.path.exists('' + getNeoLocation() + 'ImagesUpload/vuplus/solose'): + os.chdir('solose') + os.system('mv -f root_cfe_auto.jffs2 rootfs.bin') + if os.path.exists('' + getNeoLocation() + 'ImagesUpload/vuplus/ultimo'): + os.chdir('ultimo') + os.system('mv -f root_cfe_auto.jffs2 rootfs.bin') + if os.path.exists('' + getNeoLocation() + 'ImagesUpload/vuplus/uno'): + os.chdir('uno') + os.system('mv -f root_cfe_auto.jffs2 rootfs.bin') + if os.path.exists('' + getNeoLocation() + 'ImagesUpload/vuplus/solo2'): + os.chdir('solo2') + os.system('mv -f root_cfe_auto.bin rootfs.bin') + if os.path.exists('' + getNeoLocation() + 'ImagesUpload/vuplus/duo2'): + os.chdir('duo2') + os.system('mv -f root_cfe_auto.bin rootfs.bin') + if os.path.exists('' + getNeoLocation() + 'ImagesUpload/vuplus/zero'): + os.chdir('zero') + os.system('mv -f root_cfe_auto.bin rootfs.bin') + if os.path.exists('' + getNeoLocation() + 'ImagesUpload/vuplus/solo4k'): + os.chdir('solo4k') + if os.path.exists('' + getNeoLocation() + 'ImagesUpload/vuplus/uno4k'): + os.chdir('uno4k') + if os.path.exists('' + getNeoLocation() + 'ImagesUpload/vuplus/ultimo4k'): + os.chdir('ultimo4k') + if os.path.exists('' + getNeoLocation() + 'ImagesUpload/vuplus/duo4k'): + os.chdir('duo4k') + if os.path.exists('' + getNeoLocation() + 'ImagesUpload/vuplus/zero4k'): + os.chdir('zero4k') + if os.path.exists('' + getNeoLocation() + 'ImagesUpload/vuplus/uno4kse'): + os.chdir('uno4kse') + if os.path.exists('' + getNeoLocation() + 'ImagesUpload/et10000'): + os.chdir('et10000') + if os.path.exists('' + getNeoLocation() + 'ImagesUpload/et9x00'): + os.chdir('et9x00') + if os.path.exists('' + getNeoLocation() + 'ImagesUpload/et8500'): + os.chdir('et8500') + if os.path.exists('' + getNeoLocation() + 'ImagesUpload/et8000'): + os.chdir('et8000') + if os.path.exists('' + getNeoLocation() + 'ImagesUpload/et7x00'): + os.chdir('et7x00') + if os.path.exists('' + getNeoLocation() + 'ImagesUpload/et6x00'): + os.chdir('et6x00') + if os.path.exists('' + getNeoLocation() + 'ImagesUpload/et5x00'): + os.chdir('et5x00') + if os.path.exists('' + getNeoLocation() + 'ImagesUpload/et4x00'): + os.chdir('et4x00') + if os.path.exists('' + getNeoLocation() + 'ImagesUpload/sf8'): + os.chdir('sf') + if os.path.exists('' + getNeoLocation() + 'ImagesUpload/sf98'): + os.chdir('sf98') + if os.path.exists('' + getNeoLocation() + 'ImagesUpload/sf108'): + os.chdir('sf108') + if os.path.exists('' + getNeoLocation() + 'ImagesUpload/sf128'): + os.chdir('sf128') + if os.path.exists('' + getNeoLocation() + 'ImagesUpload/sf138'): + os.chdir('sf138') + if os.path.exists('' + getNeoLocation() + 'ImagesUpload/sf208'): + os.chdir('sf208') + if os.path.exists('' + getNeoLocation() + 'ImagesUpload/sf228'): + os.chdir('sf228') + if os.path.exists('' + getNeoLocation() + 'ImagesUpload/sf3038'): + os.chdir('sf3038') + if os.path.exists('' + getNeoLocation() + 'ImagesUpload/sf4008'): + os.chdir('sf4008') + if os.path.exists('' + getNeoLocation() + 'ImagesUpload/octagon/sf8008'): + os.chdir('sf8008') + if os.path.exists('' + getNeoLocation() + 'ImagesUpload/gigablue'): + os.chdir('gigablue') + if os.path.exists('' + getNeoLocation() + 'ImagesUpload/gigablue/quad'): + os.chdir('quad') + if os.path.exists('' + getNeoLocation() + 'ImagesUpload/hd2400'): + os.chdir('hd2400') + if os.path.exists('' + getNeoLocation() + 'ImagesUpload/hd51'): + os.chdir('hd51') + if os.path.exists('' + getNeoLocation() + 'ImagesUpload/zgemma'): + os.chdir('zgemma') + if os.path.exists('' + getNeoLocation() + 'ImagesUpload/zgemma/h3'): + os.chdir('h3') + if os.path.exists('' + getNeoLocation() + 'ImagesUpload/zgemma/h5'): + os.chdir('h5') + if os.path.exists('' + getNeoLocation() + 'ImagesUpload/zgemma/h7'): + os.chdir('h7') + if os.path.exists('' + getNeoLocation() + 'ImagesUpload/dm900'): + os.chdir('dm900') + #osmini + if os.path.exists('' + getNeoLocation() + 'ImagesUpload/osmini'): + os.chdir('osmini') + #xp1000 + if os.path.exists('' + getNeoLocation() + 'ImagesUpload/xp1000'): + os.chdir('xp1000') + + #Instalacja image ubi_reader + os.system('echo "Instalacja - ubi_reader w toku..."') + if os.path.exists('' + getNeoLocation() + 'ImagesUpload/vuplus/root_cfe_auto.*'): + os.system('mv -f root_cfe_auto.* rootfs.bin') + cmd = 'chmod 777 /usr/lib/enigma2/python/Plugins/Extensions/NeoBoot/ubi_reader/ubi_extract_files.py' + rc = os.system(cmd) + cmd = 'python /usr/lib/enigma2/python/Plugins/Extensions/NeoBoot/ubi_reader/ubi_extract_files.py rootfs.bin -o' + getNeoLocation() + 'ubi' + rc = os.system(cmd) + os.chdir('/home/root') + os.system('mv ' + getNeoLocation() + 'ubi/rootfs/* ' + getNeoLocation() + 'ImageBoot/%s/' % target) + cmd = 'chmod -R +x ' + getNeoLocation() + 'ImageBoot/' + target + rc = os.system(cmd) + + else: + os.system('echo "NeoBoot wykrył błąd !!! Prawdopodobnie brak ubi_reader lub nandsim."') + +#ARM + elif getCPUtype() == 'ARMv7': + os.chdir('' + getNeoLocation() + 'ImagesUpload') + if os.path.exists('' + getNeoLocation() + 'ImagesUpload/h9/rootfs.ubi'): + os.chdir('h9') + os.system('mv -f rootfs.ubi rootfs.bin') + os.system('echo "Instalacja - ubi_reader w toku..."') + print '[NeoBoot] Extracting UBIFS image and moving extracted image to our target' + cmd = 'chmod 777 /usr/lib/enigma2/python/Plugins/Extensions/NeoBoot/ubi_reader/ubi_extract_files.py' + rc = os.system(cmd) + cmd = 'python /usr/lib/enigma2/python/Plugins/Extensions/NeoBoot/ubi_reader/ubi_extract_files.py rootfs.bin -o ' + getNeoLocation() + 'ubi' + rc = os.system(cmd) + os.chdir('/home/root') + cmd = 'cp -r -p ' + getNeoLocation() + 'ubi/rootfs/* ' + getNeoLocation() + 'ImageBoot/' + target + rc = os.system(cmd) + cmd = 'chmod -R +x ' + getNeoLocation() + 'ImageBoot/' + target + rc = os.system(cmd) + cmd = 'rm -rf ' + getNeoLocation() + 'ubi' + rc = os.system(cmd) + + elif os.path.exists('' + getNeoLocation() + 'ImagesUpload/sf4008'): + os.system('echo "Instalacja systemu Octagon SF4008."') + cmd = 'chmod 777 ' + getNeoLocation() + 'ImagesUpload/sf4008/rootfs.tar.bz2; tar -jxvf ' + getNeoLocation() + 'ImagesUpload/sf4008/rootfs.tar.bz2 -C ' + getNeoLocation() + 'ImageBoot/' + target + ' > /dev/null 2>&1' + rc = os.system(cmd) + elif os.path.exists('' + getNeoLocation() + 'ImagesUpload/octagon/sf8008'): + os.system('echo "Instalacja systemu Octagon SF8008."') + cmd = 'chmod 777 ' + getNeoLocation() + 'ImagesUpload/octagon/sf8008/rootfs.tar.bz2; tar -jxvf ' + getNeoLocation() + 'ImagesUpload/octagon/sf8008/rootfs.tar.bz2 -C ' + getNeoLocation() + 'ImageBoot/' + target + ' > /dev/null 2>&1' + rc = os.system(cmd) + elif os.path.exists('' + getNeoLocation() + 'ImagesUpload/osmio4k'): + os.system('echo "Instalacja systemu EDISION osmio4k"') + cmd = 'chmod 777 ' + getNeoLocation() + 'ImagesUpload/osmio4k/rootfs.tar.bz2; tar -jxvf ' + getNeoLocation() + 'ImagesUpload/osmio4k/rootfs.tar.bz2 -C ' + getNeoLocation() + 'ImageBoot/' + target + ' > /dev/null 2>&1' + rc = os.system(cmd) + elif os.path.exists('' + getNeoLocation() + 'ImagesUpload/dm900'): + os.system('echo "Instalacja systemu Dreambox DM900."') + cmd = 'chmod 777 ' + getNeoLocation() + 'ImagesUpload/dm900/rootfs.tar.bz2; tar -jxvf ' + getNeoLocation() + 'ImagesUpload/dm900/rootfs.tar.bz2 -C ' + getNeoLocation() + 'ImageBoot/' + target + ' > /dev/null 2>&1' + rc = os.system(cmd) + elif os.path.exists('' + getNeoLocation() + 'ImagesUpload/%s.tar.xz' % source): + os.system('echo "Instalacja systemu spakowanego w plik tar.xz w toku..."') + os.system('cp -r ' + getNeoLocation() + 'ImagesUpload/%s.tar.xz ' + getNeoLocation() + 'ImagesUpload/rootfs.tar.xz' % source) + cmd = 'chmod 777 ' + getNeoLocation() + 'ImagesUpload/rootfs.tar.xz; tar -jJxvf ' + getNeoLocation() + 'ImagesUpload/rootfs.tar.xz -C ' + getNeoLocation() + 'ImageBoot/' + target + ' > /dev/null 2>&1' + rc = os.system(cmd) + elif os.path.exists('' + getNeoLocation() + 'ImagesUpload/hd51/rootfs.tar.bz2'): + os.system('echo "Instalacja systemu HD51 "') + cmd = 'chmod 777 ' + getNeoLocation() + 'ImagesUpload/hd51/rootfs.tar.bz2; tar -jxvf ' + getNeoLocation() + 'ImagesUpload/hd51/rootfs.tar.bz2 -C ' + getNeoLocation() + 'ImageBoot/' + target + ' > /dev/null 2>&1' + rc = os.system(cmd) + elif os.path.exists('' + getNeoLocation() + 'ImagesUpload/hd60'): + os.system('echo "Instalacja systemu AX HD60 4K"') + cmd = 'chmod 777 ' + getNeoLocation() + 'ImagesUpload/hd60/rootfs.tar.bz2; tar -jxvf ' + getNeoLocation() + 'ImagesUpload/hd60/rootfs.tar.bz2 -C ' + getNeoLocation() + 'ImageBoot/' + target + ' > /dev/null 2>&1' + rc = os.system(cmd) + elif os.path.exists('' + getNeoLocation() + 'ImagesUpload/gigablue/quad4k'): + os.system('echo "Instalacja systemu GigaBlue quad4k"') + cmd = 'chmod 777 ' + getNeoLocation() + 'ImagesUpload/gigablue/quad4k/rootfs.tar.bz2; tar -jxvf ' + getNeoLocation() + 'ImagesUpload/gigablue/quad4k/rootfs.tar.bz2 -C ' + getNeoLocation() + 'ImageBoot/' + target + ' > /dev/null 2>&1' + rc = os.system(cmd) + elif os.path.exists('' + getNeoLocation() + 'ImagesUpload/gigablue/ue4k'): + os.system('echo "Instalacja systemu GigaBlue ue4k."') + cmd = 'chmod 777 ' + getNeoLocation() + 'ImagesUpload/gigablue/ue4k/rootfs.tar.bz2; tar -jxvf ' + getNeoLocation() + 'ImagesUpload/gigablue/ue4k/rootfs.tar.bz2 -C ' + getNeoLocation() + 'ImageBoot/' + target + ' > /dev/null 2>&1' + rc = os.system(cmd) + elif os.path.exists('' + getNeoLocation() + 'ImagesUpload/vuplus/solo4k'): + os.system('echo "Instalacja systemu VuPlus Solo4K."') + cmd = 'chmod 777 ' + getNeoLocation() + 'ImagesUpload/vuplus/solo4k/rootfs.tar.bz2; tar -jxvf ' + getNeoLocation() + 'ImagesUpload/vuplus/solo4k/rootfs.tar.bz2 -C ' + getNeoLocation() + 'ImageBoot/' + target + ' > /dev/null 2>&1' + rc = os.system(cmd) + elif os.path.exists('' + getNeoLocation() + 'ImagesUpload/vuplus/uno4k'): + os.system('echo "Instalacja systemu dla modelu VuPlus Uno4K."') + cmd = 'chmod 777 ' + getNeoLocation() + 'ImagesUpload/vuplus/uno4k/rootfs.tar.bz2; tar -jxvf ' + getNeoLocation() + 'ImagesUpload/vuplus/uno4k/rootfs.tar.bz2 -C ' + getNeoLocation() + 'ImageBoot/' + target + ' > /dev/null 2>&1' + rc = os.system(cmd) + elif os.path.exists('' + getNeoLocation() + 'ImagesUpload/vuplus/uno4kse'): + os.system('echo "Instalacja systemu VuPlus Uno4kse."') + cmd = 'chmod 777 ' + getNeoLocation() + 'ImagesUpload/vuplus/uno4kse/rootfs.tar.bz2; tar -jxvf ' + getNeoLocation() + 'ImagesUpload/vuplus/uno4kse/rootfs.tar.bz2 -C ' + getNeoLocation() + 'ImageBoot/' + target + ' > /dev/null 2>&1' + rc = os.system(cmd) + elif os.path.exists('' + getNeoLocation() + 'ImagesUpload/vuplus/zero4k'): + os.system('echo "Instalacja systemu VuPlus zero4K."') + cmd = 'chmod 777 ' + getNeoLocation() + 'ImagesUpload/vuplus/zero4k/rootfs.tar.bz2; tar -jxvf ' + getNeoLocation() + 'ImagesUpload/vuplus/zero4k/rootfs.tar.bz2 -C ' + getNeoLocation() + 'ImageBoot/' + target + ' > /dev/null 2>&1' + rc = os.system(cmd) + elif os.path.exists('' + getNeoLocation() + 'ImagesUpload/vuplus/ultimo4k'): + os.system('echo "Instalacja systemu VuPlus Ultimo4K."') + cmd = 'chmod 777 ' + getNeoLocation() + 'ImagesUpload/vuplus/ultimo4k/rootfs.tar.bz2; tar -jxvf ' + getNeoLocation() + 'ImagesUpload/vuplus/ultimo4k/rootfs.tar.bz2 -C ' + getNeoLocation() + 'ImageBoot/' + target + ' > /dev/null 2>&1' + rc = os.system(cmd) + elif os.path.exists('' + getNeoLocation() + 'ImagesUpload/vuplus/duo4k'): + os.system('echo "Instalacja systemu VuPlus Duo4k."') + cmd = 'chmod 777 ' + getNeoLocation() + 'ImagesUpload/vuplus/duo4k/rootfs.tar.bz2; tar -jxvf ' + getNeoLocation() + 'ImagesUpload/vuplus/duo4k/rootfs.tar.bz2 -C ' + getNeoLocation() + 'ImageBoot/' + target + ' > /dev/null 2>&1' + rc = os.system(cmd) + elif os.path.exists('' + getNeoLocation() + 'ImagesUpload/update/revo4k'): + os.system('echo "Instalacja systemu Revo4k."') + cmd = 'chmod 777 ' + getNeoLocation() + 'ImagesUpload/update/revo4k/rootfs.tar.bz2; tar -jxvf ' + getNeoLocation() + 'ImagesUpload/update/revo4k/rootfs.tar.bz2 -C ' + getNeoLocation() + 'ImageBoot/' + target + ' > /dev/null 2>&1' + rc = os.system(cmd) + elif os.path.exists('' + getNeoLocation() + 'ImagesUpload/update/galaxy4k'): + os.system('echo "Instalacja systemu Galaxy4k."') + cmd = 'chmod 777 ' + getNeoLocation() + 'ImagesUpload/update/galaxy4k/rootfs.tar.bz2; tar -jxvf ' + getNeoLocation() + 'ImagesUpload/update/galaxy4k/rootfs.tar.bz2 -C ' + getNeoLocation() + 'ImageBoot/' + target + ' > /dev/null 2>&1' + rc = os.system(cmd) + elif os.path.exists('' + getNeoLocation() + 'ImagesUpload/zgemma/h7/rootfs.tar.bz2'): + os.system('echo "Instalacja systemu Zgemma H7."') + cmd = 'chmod 777 ' + getNeoLocation() + 'ImagesUpload/zgemma/h7/rootfs.tar.bz2; tar -jxf ' + getNeoLocation() + 'ImagesUpload/zgemma/h7/rootfs.tar.bz2 -C ' + getNeoLocation() + 'ImageBoot/' + target + ' > /dev/null 2>&1' + rc = os.system(cmd) + elif os.path.exists('' + getNeoLocation() + 'ImagesUpload/zgemma/h9/rootfs.tar.bz2'): + os.system('echo "Instalacja systemu Zgemma H9S ."') + cmd = 'chmod 777 ' + getNeoLocation() + 'ImagesUpload/zgemma/h9/rootfs.tar.bz2; tar -jxf ' + getNeoLocation() + 'ImagesUpload/zgemma/h9/rootfs.tar.bz2 -C ' + getNeoLocation() + 'ImageBoot/' + target + ' > /dev/null 2>&1' + rc = os.system(cmd) + elif os.path.exists('' + getNeoLocation() + 'ImagesUpload/miraclebox/mini4k'): + os.system('echo "Instalacja systemu Miraclebox mini4k."') + cmd = 'chmod 777 ' + getNeoLocation() + 'ImagesUpload/miraclebox/mini4k/rootfs.tar.bz2; tar -jxvf ' + getNeoLocation() + 'ImagesUpload/miraclebox/mini4k/rootfs.tar.bz2 -C ' + getNeoLocation() + 'ImageBoot/' + target + ' > /dev/null 2>&1' + rc = os.system(cmd) + elif os.path.exists('' + getNeoLocation() + 'ImagesUpload/miraclebox/ultra4k'): + os.system('echo "Instalacja systemu Miraclebox ultra4k."') + cmd = 'chmod 777 ' + getNeoLocation() + 'ImagesUpload/miraclebox/ultra4k/rootfs.tar.bz2; tar -jxvf ' + getNeoLocation() + 'ImagesUpload/miraclebox/ultra4k/rootfs.tar.bz2 -C ' + getNeoLocation() + 'ImageBoot/' + target + ' > /dev/null 2>&1' + rc = os.system(cmd) + elif os.path.exists('' + getNeoLocation() + 'ImagesUpload/e4hd'): + os.system('echo "Instalacja systemu Axas E4HD 4K Ultra w toku..."') + cmd = 'chmod 777 ' + getNeoLocation() + 'ImagesUpload/e4hd/rootfs.tar.bz2; tar -jxvf ' + getNeoLocation() + 'ImagesUpload/e4hd/rootfs.tar.bz2 -C ' + getNeoLocation() + 'ImageBoot/' + target + ' > /dev/null 2>&1' + rc = os.system(cmd) + elif os.path.exists('' + getNeoLocation() + 'ImagesUpload/update/lunix3-4k'): + os.system('echo "Instalacja systemu Qviart lunix3-4k w toku..."') + cmd = 'chmod 777 ' + getNeoLocation() + 'ImagesUpload/update/lunix3-4k; tar -jxvf ' + getNeoLocation() + 'ImagesUpload/update/lunix3-4k/rootfs.tar.bz2 -C ' + getNeoLocation() + 'ImageBoot/' + target + ' > /dev/null 2>&1' + rc = os.system(cmd) + elif os.path.exists('' + getNeoLocation() + 'ImagesUpload/dinobot/u5'): + os.system('echo "Instalacja systemu dinobot w toku..."') + cmd = 'chmod 777 ' + getNeoLocation() + 'ImagesUpload/dinobot/u5; tar -jxvf ' + getNeoLocation() + 'ImagesUpload/dinobot/u5/rootfs.tar.bz2 -C ' + getNeoLocation() + 'ImageBoot/' + target + ' > /dev/null 2>&1' + rc = os.system(cmd) + elif os.path.exists('' + getNeoLocation() + 'ImagesUpload/uclan/ustym4kpro'): + os.system('echo "Instalacja systemu ustym4kpro w toku..."') + cmd = 'chmod 777 ' + getNeoLocation() + 'ImagesUpload/uclan/ustym4kpro; tar -jxvf ' + getNeoLocation() + 'ImagesUpload/uclan/ustym4kpro/rootfs.tar.bz2 -C ' + getNeoLocation() + 'ImageBoot/' + target + ' > /dev/null 2>&1' + rc = os.system(cmd) + + else: + os.system('echo "NeoBoot wykrył dłąd!!! Prawdopodobnie brak pliku instalacyjnego."') + + + if BlackHole == 'True': + if 'BlackHole' in source and os.path.exists('%s/ImageBoot/%s/usr/lib/enigma2/python/Blackhole' % (media, target)): + ver = source.replace('BlackHole-', '') + try: + text = ver.split('-')[0] + except: + text = '' + + cmd = 'mkdir ' + getNeoLocation() + 'ImageBoot/%s/boot/blackhole' % target + rc = os.system(cmd) + cmd = 'cp -f /usr/lib/enigma2/python/Plugins/Extensions/NeoBoot/bin/version ' + getNeoLocation() + 'ImageBoot/%s/boot/blackhole' % target + rc = os.system(cmd) + cmd = 'mv ' + getNeoLocation() + 'ImageBoot/%s/usr/lib/enigma2/python/Blackhole/BhUtils.pyo ' + getNeoLocation() + 'ImageBoot/%s/usr/lib/enigma2/python/Blackhole/BhUtils.pyo.org' % (target, target) + rc = os.system(cmd) + cmd = 'cp -rf /usr/lib/enigma2/python/Plugins/Extensions/NeoBoot/bin/utilsbh ' + getNeoLocation() + 'ImageBoot/%s/usr/lib/enigma2/python/Blackhole/BhUtils.py' % target + rc = os.system(cmd) + localfile = '' + getNeoLocation() + 'ImageBoot/%s/boot/blackhole/version' % target + temp_file = open(localfile, 'w') + temp_file.write(text) + temp_file.close() + cmd = 'mv ' + getNeoLocation() + 'ImageBoot/%s/usr/bin/enigma2 ' + getNeoLocation() + 'ImageBoot/%s/usr/bin/enigma2-or' % (target, target) + rc = os.system(cmd) + fail = '' + getNeoLocation() + 'ImageBoot/%s/usr/bin/enigma2-or' % target + f = open(fail, 'r') + content = f.read() + f.close() + localfile2 = '' + getNeoLocation() + 'ImageBoot/%s/usr/bin/enigma2' % target + temp_file2 = open(localfile2, 'w') + temp_file2.write(content.replace('/proc/blackhole/version', '/boot/blackhole/version')) + temp_file2.close() + cmd = 'chmod -R 0755 %s' % localfile2 + rc = os.system(cmd) + cmd = 'rm -r ' + getNeoLocation() + 'ImageBoot/%s/usr/bin/enigma2-or' % target + rc = os.system(cmd) + + return 0 +#END diff --git a/NeoBoot/neoinstal.mvi b/NeoBoot/neoinstal.mvi new file mode 100644 index 0000000000000000000000000000000000000000..fc4e3534f9e6aeb852a65a9e42ec8ad858f23db8 GIT binary patch literal 37500 zcmeFZdsvk9x<7nBhnaae&NG0Bg3JShf~i4if(gts$f<)thgFs)qqU3GS_)F&Fe?!5EPB>b2& zXHIHr%AC9LW6qqEl$3i@)6-K^?@hV)-qh6ejEwa3%*@;eAAAge`bXIPKmmSG|A?U| zDvS;%_;n+2AmV4h&$l0|mPZ%*9-so;>8JN)N35JvczQ$R*2#00ZMc%XHDX!g@8A6Y z(*^M@75)2C{ZH7YzNKP*U#kBpOU3@aRR2?!O7Z(r{ZCmcG43Q<@qs7(Rgw} z2USS-i>#!GTb{t!ehbU#r%wFjcp_b*HKN+It=P)^IBy+Qbhdp7n>cn~?(@mD;nzl{ zSok|rs8wW#+xn_Y+T{_$8w#l^fg(&2EsCBbgO?ZGUP%MqhDjPucr(8HegvcMPP&$o1P~X}v6}$TljdTCQ7JF(2+>>p9&&%2P%i+c+`Aub{6t zyXc$G3Qr%7{M*sWWhRq+GVn5pPeN)PmJ4SzH8mzUrTUjG;mZE%FQ zowu@=Ap~OCBqf{ZfR|u744$valxr4%m5Lx4@Gl%3dicn~J%99jYHQz@Fhiz6%Y`_U zbwVIa*$AtKow4Oh1zw-Yn;t!t8OE7LIQ^JK0DD zvJkjY+TrPZZp;xRO(gR}e2e#t7b@W5CVa7)^<}kEB-{;;4+zyn)!^6?x1=&ZAhR@p z6}Zn^@)h*?lXNbf+%^xMX=9eK>eH}>)9xB-E={k~=c~ZNh(YPQCDq%IJ{s$RNmkhX z;OLz+uY}2&Ar><0uz1HC53GVnPbsTzaV(-iWzT7$^R}nZgb7I?OmA}_)f`A4p!(m@ zw=sj}K-&KWC}@G2t!IsIP%@}?*1q#brp{(0 ziUK3uMkm@@8urY5QcIL38aGcW%n#=Z2I4!QJOALS;wK|uoWcxb22*3+NFyRL%~K4^cqfGrwrWHjl=qG!}I zzv*Rpd)kC=*EHEf!iwK*qihvYC8fW}S+`T^H+M3m2KNs;cKQ{JU#z5x zI&!I;A*dc37){Z@#Fj0bcAq!&#Gu)_iB6ZBW6u#)XOV+43KfNvN*<3tUj?s}hG*aK z$eNbzuyOh8EkWHB1c-jX(-2nM%nWC)nThq~VA1-XMb$)f*I8y%mcHD>iJBgc+=7!dfyZSmNf3s3G^wJ&?izxV3f&3JOsSHFMr zU%|_Ne?cT{wSNDHt=7|Ew^@aXT)}%VH2{m#0qWq_PF?N#Ar2Nn`?i5Zy3(R`*P7KH z*7MF+<&iwyT+Hi5tVht8%e=F+bJ^WxwUtMx8%@<-GWW_Mt)Oze<~`Opl2Cm!{Qadt z*B(^lGlejH^*VvOchr=&s%5HN!W1(}4}l%e_=}L(*G?#LD%ltjraxs{o(*fj$y3!< zb}|f6U9I&s8L}n0Wt&$Pf?9sFA2M$CMmu)H_s5G4Fjkfjm4~E;j*i!+Nx>eQL!EB* zpAYj&m};}>SPJZhZnL|~UJ7{1W2eTtOPgPqy7=q*!8tq6z^hiKsCwJIZ1pWjgOY67 zG+7KCy*aFN5BM2Fdvl6@CLv@t7(8Iw3tZhWyxa>b2EaiT*srz@z#J$OHm7-7q|k(B zbIx3ze#phDzk?W9)-OD|n@X^KT;?asDcu^mod`Uc(zw)k$K$iAm|(;cotyj$`g2x* zmMpZJSn+*hU zqP*a$DTTCHOD^lu{I%(5DG$v&0+ns&5a~AVS~F69;e_nW3>kITR!Yp}d6BalQh2%V z{MCeSMub2kV-%S-MHqDCQ&m(xov-riU=urJGJ&LNTH+wLUb)=BQOz@{^UYnahTnj4 zyX{Q%;2{1AB5Y|dUpJyTdm_qG;Ho`8VkwuRX;n9^>Le+MCki=zJKXSQkK<~T4|^T( zwnHVT64a`CgX=e2i499?6LBei=JrC7|_ER zgL-pV!fowZ-Tb%6tyX$l+SnMIIEv6>RA(tsT6pDLV~{KUC0|oFhGhGSRN_!kn?=>- z4@;iUyd|;@KfOHhd}H?LnM*eYGIf@CPiX6>og4Q}Zez7xtdmi21U{s8ZfwC0Lp7YC z4ls>^A!H*7Z-;3U&VEt_AI@30_1d`m8D*=d)fP3_dNR!S_J1CR^!S&3psRU`?dc)8 zHi?Jtsp>ONj9$O~@WdWYm4HYa zsxC!0N-^@P~$zcy9T2aN{WNE3w^i05v)NmMsk*!ea0!{dFo zMxne1yDX>u0Q;F&Zcf^k?Ir16nFNTTM{=u;OzU3;o><?cJRe110hBjMjVdc=TATb}pRi|mWPU7W>J@6T2wSD3N+dVZzY5<_NSN7x#);+w6%H;4Z> z-4d`_`2UAyk)r+Z_*W0IHqRg5{nMw0+4ADwtma`*EH^_q#S9pjeuOzuUpj^RqBi%P z{d$~MU4~e%%al-`0XE!sKak+#rgHOa@A~9qS0`NYW{-7;kT|NFF=oiqI$&iB_GpKsbr$W~|H? z+2a|hI(V|ZmUZ~IX>8pKjNs}zzfGk-rwkz@oZF^Jf}c=c6Ew=hKHo^C%%oFpmIH>YpcbM?!LRrLPROFbz^IApA(mSQ+=BjbK!^+Z}PFkgEIj2oaei)_c(|7(=AY zYOhx|$1!4{_munazS$QJ`Mt$H9{I*yN5hBD-@bsvU&0IcgYN>~0S}}NJGOxIsvBuW zq^a*215Z_Xk177`0@kYt2_WVX0bi)%3+M+o40dB{e);3R+J_86t(*~w$UeQ}6}Jx{ zTOw4+NlbNLgH|u8%ISQ+(psA=-7n8|zqJeEW?tLcBTclZ&XEKb^5HpRc3J~$=V6Mc znPUow-`9S{Ox|{B1}g+OkEnx?`U($!bmhSdb6Omle`u%xZ*E7wUtRCdLu_I{tQx%a zYnaA%oR=?sR`@j%)J4AK`RL1K|6HjzUS780Jd{X!{`2ktSR+u05)+J!c+*->Kp6BP ze3yS%XI(ER@wRgTP)|2s+Ik+Ix72JV4* zsap&wMja$6KC0Pv-vxIWUa7g-yb~sE+k^6pvn%ey-~aH>?_S%m=-lTwH~gD=#U*SCBXv|-EAo7B~<$qCN{&P9Ce z6Q_PJdH+?(OTv;C@E=N=(a&v8mLH63xIhK!461H(a#yp;MJ2nMRbz%^_pVFE&@sBm zyYs%HFA8H=qu}AExt)S+oF6wE^%CO-)?s1Du5pPrE(8aYzYx9|BMX=$?3)YS z`39~kn3-FIP4$DvGDjdqE~R-6 zrc{McizsIdF~&eX<L*hI|3;si^PhfMygBxY?1^)79U zB-};6y6cp28kt|#cLuUf7*YCCLM5$tAHQ^u!HJqXhHfYP`NQs z?bJxQ)Uqf_fI2T89=XfS@{!{WHGFyxRC~GTYshQeShJuWnpG8XOjX&e+U%AYCTevN1Spjg)yr7obX{z z%il9&>4`3yXByrZVd1e+R{eKY-HPG_yvS+mdPYqZ@eNDQ!EP%4%oB}t-||Fv6|Ch3 z4mK(_!P@loL~G$0coM5|3N=_NimGDK?GRn{bd9J$S%YhaU=vYiSp-@}Ky@#ygl^vS z(S=QrGG6LJ2DF(M=z6CAelTXk%PZSdokj!IM54-@U=pOtbi7kWBo^)aY_q=UUHF?x z-s51WKoY#%4=t2~7BXe66DlcVtV!z{_ba#tf3~w!l2D;_^XU@mmdJU=@se%6>Uh;d zRBzXkD45kvS((;ux>&Uw5#J2Nsof%Ti&j7sUI!&Du<%5iV%bM$S^PEk!~GofFA{@_ zV5-SY+iEiDVr9l2K%5)Si4k1g^*Cy$!uVIXynf@#1fkr?xP7u%2}cFP8EW%xP73T- zSs3z^&aCrD0nI9>Ob&ZLEG3B}qfpF2A?*7^U|RcQi3uUWXIo&0lM|!xD)>PJ zXS;4M!7EW_r3$eHj!6nfusGQQ(_m_>$-pXsZAD5WQ9JkQK@GD;bhVcikAsacxA&awiqpp?jyI z^Th(;ykvk7l&GS}bQT_F)o@5cK15n{Tzpq5w%!7>P;p-}UNwCzaPiSJzPSPK~H{gHC5MbBq+| zbyRx`iauQ%3sI$HikpO$ORUJ5!x%|ZM$&W;#|mmM#JensV`P%2>C{-wg0WqKC6PBB+Ijo$fuRO`O2X}@T*9Y3$XBqpzlDmU@248r zq%gKWhUI6n_D)tFUTIxG)#uSx11&A|=I6=T*v*@n8|lP6U=75zhad`qq{)yRTkf46 z`5sL0kWkQTT9}JflKQf2McI;aDnu2m_gbr{jP%S+@S*(Nut-!`F0JMvt9i^w`~`nA zGb~2K3|M(9&UCQ#S<~k(a_`m4;>;0UIjE%sHqi<7xl>JziWRMJmru@5WYr&{=*X%+ zU?C5WMC@ouUEO;pGK*}^ji)0!s#}ft8&!_5nuK?RN=ge`sA%aeD(Ghx{=%X{a6hMA z#K9)4C-6))Jdy>4+2i!Yu}z42S{xNy?BD-)lpS_&e8V(f3EF z2s&SM^WwNsRQ8LW0>WlUGjtw`V=5$-76Ql=k__t-c)63eo#DlNs;{9R>yaZzCjMV1 zKgh!oDuId+6xH>#RrI9DJ)r{}$%R85jayU3Xt zJ_<3h7B0+E)JGokvvszYnc1099DLe74HBpW)8u@`3ftLw#^j*l2OWsw;fU|-2Gn(5 zs4J*3cqJ7Og(EN>H9abdHZa3gXrRvLdF(v0o<_3l)Eil-;t) z9PgGwO%;;z<_N)J(kq3?W{Ad~E(VyHA&MD3PPA?^Wh4hyqDKMs)S^9Xan{6vENt!e zLvt4LXcv?Z*&fC1en(F}^^e%MezvG?Am1W-R&9oSPP=%Bh3WRbp}f{M`UjYZ&9Got z_i(gBon{Vjmm>$cPnxi4Lb;_7dD(LX?}yflLp4evNc7iRIyl=%0_ONc<}67Ic_^H7 z_;UsQaiS$5&LknMxMVfjhwBPtTmWKcQNMYh0q!Dxrl;RmeT&j>kk5-S@sp!I`t5Se~)tXOoRb!8Np zdIm&yQQZONbgUteS^|S|pBLuo`oYz{C37SMiYZZHtfKVUW4ustpn-;&7F8#Wl{MVm z7y{}JYU0q=mYVxyWT3>q(vs&!n2?;)!k72(hCjD)6f-0S9x*3-4Rfe-H;aYJ3oI10 zJxG62JWZ~mc21MOTIY43c#k9nCXxALSW8(^jiS+r4yJnPe5KFcTYO=hXdxbEv5*1J z3}iyN7oQ{pSN_jEe?PP>0Q(0OuXJ@T5-KJlDg4fU%78>yJ|h1cos6qKa493J$tA_i_b&ziRss+x+Y_Owo8+9M$eUcFEt2g4#9l zwGoF!c}aS6yq{WQdENc zQ-`Ls!aDf=KJ9hR7?GoCS1cEU)69_`^F*&9ipKNykdH!D^3)O@aZ`Fdaw!yF-#fJY zkJ`>BC-%Te6oYjwnW|7CHX(V;}8*t7L79wA5OeqwUAXt`K@+pgU*itlV zDPbB+NhlDDLvIXHJoZLmpKDpy4X{JFKRmD;zN)7tVwX&XeqKLktB?K0y9u)2 zLHkk?4ar!?cf(gT|N0z}({6(E9*>MAolYLJs0Ye-IUg-|_?$XDhnJ(Y1+T(*Kk{D1 zUJ@;5)=CLs;OgMP*5#z0Xk_}9C;w#c*k%w)H}ZaU0|>h9%1`ev`m)wjX;Gchm>GNK z#_lJCDmaMMjeRX8@FhPX9A3aRy7(K@&QpQBsd`VYwc4w9FaycXP*V$>ZmQmP)C^(G zs*$nIP0)|D79q(PTE?tTVlEN|nh0fuLitXL6DWd}-Q7!~$vnFWg{IB0K7K-f**TCGALTQMUy-oSgT{tOD>}k?|@In8_tW7 z8Uq{LB#|(E?2>-!KH&B9y*aT}Y>fgDkPw9Q1MYSO6wT-WCnZrugT2rLS-um4#|q_k zc)-op2YHigvOoh#xZh#bC^p(ynHE%*i7t|=qgB^UdTFbdR8lr0YyV{s&nB(NA_DMfLtDE1;&C zv#74pDhHao>Tg+fGpqiZg-2L~`-S~kkZdpL}?cTWW|7Un-c44T#LOms8H>ZL7|7hb#6Q55~IcR~Yr@aP_ zHQj!~n3aV}#)=o@HLt0SDX>!Yaq z9b4Z>9elbJ+aj;1Rqzx?9S3chr;O5i&bL@pU(dISE|HapKcEHtem=cQ#IB1*<{~)X zj{UX$lY7|2fmnr@AzPWZt|20ODUMI8r>p|K^WeeY4BHeE?#a?Ly*-Q`@#%!Va(Pmi{zsr(gmXetO91yuJKadNEUx$yuW~ z^bVJB`V*L|u!u@BiA*jx%%soj-y3WPG)W@1Ko4~vPjxvpkcw;<8u3^;u`J)s8iQcA ztGo%>S7o-lL}2oTGNVv#Iw7bb0K06hEKfaxhp1u?JogY1ikFAjJQvRu48`#h9vQYi zaC|Ou7{qW!GQr{3B`O?2(iGX#A{V@v!i<*U&MDV_T*u+T*EuXg6`8P~RLi;_inhZ% zSRo6jsjWj#A?^=s-k^+#%MazOaAZ~JzeMm-^uF@yBPD{u`S#e2`ds;1%rC{l zo*!zu^aY7>yJ+<-60#c86ecszG^-IxRZ@sgCFMsQVC$s1>M5k(@9B$u1r6W3JZB4s z_&A=eiGq8Ie(LA6SmL&Gu!qwYqK=-=h$>N?Yx^-J#?;V(UWrlkM3d+vRA2ihcx4zh z{p@i(P!rwcF|Mwgv-=7fXAI#?0~fI%;-8sRick?DFcFj>pvOW)k7hFov?;Xtm>al7 z!)#jhwMEr#5<~FFCyv8>SehfdJr$+a05ajomcE;KZtop0Ev;>d{gR)3F64t^Gvla| z9U=p)g9IR?%_#WgQQz-IK_;M*^A6lmW=ZsH4(E(Kti55F=zSzPm!~s%U=N`%S=h@v3a=ey$~gjhJ9+=ET)-jaG&G&|oO$c8_i zSSr2djYGurVtiwad|;})^WC0K>NVThakx@fqcp1ZcElWg{Z!xK$Z>eqPmFY4t~{|`0pTd5SSGqL;$fKRk!HeYnAMUm9GMrv zrxV_Q@rM0WH;s5MU)jG+;N_bRrQi>fYuCRB=bNP9Z*^^q!{4m+py1qX4R~f9Bi}yIxKVW-%vt|IT%xyWB zM_{FpHRHF@aTCHSbATuE2O1)9TS5#Xc^2-+z>Tw;*XypwiA*sS0b3Rcc$O2pk!;!O z>zR6t4Q0rCDscg7&4J9~MFQ;*=ze-2K`6`Xz#~hQFs%owO_n6)le;F9`S8RyWYTCG zbHn6NWs0iHr6H5&%=*F+jD#K44T8um1GSBQ7~=Ig-{-ZS?W$4jH?oof{7gsm+Y_kP zGvKT$3+;*1!0a9jf*Av6=2PF!jT*|sjU|9F6V`g!f?JS<^&^_A>+};RqpH|G*qllw zih&S@U<0#H1^q0{x(%!Kx4ag_)6b7LjGf*$*ZkU-qVkF9)8B0R&6fN7M9+US%|uYv z4*UBf$b8_8Bgc(SoMo%m$Lr>0yu;0CSCuJIf^JBMe_4{G99NNYe zT(&o{U@T$sMaGK0ljs&iPkgx;ocL`SOn!;e9)N;teT3;}HpQX8_JAlVqoqj})pxY& z$4ys=Qc{X4lgQYTP%2j*FDUl^Ca~wh^(D#Xld~t!6_i3SCJ#^|z_ge5xbb25rVDiN zOm8m=A9t~~-VvQiPj*u_OiO&@X%m=SYCWrdmsP*-Du$t|nV+DvBt}<_KkI$DeM^&f z6sCVp^K4G-*|ax1URD=9%Tc+U_FYb!*Us<^q3ab6MVU#A^i(Xw6Z+}C!acue1nSob zO;cZIBCamp{<&ZtCw@}2Orp@Rzk{q^?qd&2QNobuzUu1wsgO&x#lh+d!s8|W^okoC zJR%WjtI~aeZc!4wNgj35b;a562v-v@A3kX}8Hh9`ImN-g0!oqtdgdgno+a-`g0#< z&Ktbxz2VEJ@(aBEN>oFIecr8}13bp-P_0*;q3W3sED3D_Wu)t=6sE2osnkIS(`xg$ z2iwqakekCcQTaMlK>D~(Kboy`y?HZt z|GI+ZxxeMU-*ofVj>F!C_k2_M%Ihy;86=@Z5Bo?ST)Twr*cTmKr%drd{u;HH){Y_b zO73fhNkd3`F>q8-gDSL8VWh6uh{_s9B55v+#Jb%?i_-UF)=Id{ZbbJp9F4ixMchc8 zx6>jQEhC=o3*ZM8m463vCvk0uC;Vx~rPwH7m)FkZg|<-FuI zS>x`}!9Gt{N-my?a@uvA_CpwTL*v$4BW%5&j^vwJG~1RODJ! zqUza|?+v;WuZGco>xQllgir4*TXBPe7znYbF4K@egO2E8UFCRKLUO>$izU?T-Q#%} zqb*N6?hASy-xP*2kUgPzjVg()^Q<6f9=L9uU4qUtn)NHO3|#Ojdww40jgP6Bv>1-M zxDS?PQ1iW64M=5n^FGaB zpA6aX6o-Hi#qpcRTI9UVBcO443Ub|>FtSxO!d8#z&cr@)zH{c%h3>gV-*2vX`s@(Z zK2^3MMYDZ}xaU{g8yMC~TNQyYH`+YIgSyFjufCs|=H0_lA(+|1E}1JJ_D7UaOxKH^ zJg4GW)4}h(_>QLDHI#GW$^B3EX6eY|h=B#(X79i*TS6_Ib=XP*^Wbq#izc1z3M-%Ge6v#EGuKliFTCQ!giK-K;fe zg|7?;NYO60EKWgL=HI^Wg2@ebY>u7VZvXqJK0gJI_4T7XZu7}vN8veei<@G(KOo@m zsegY`GX$+gwcs-dVtNT?(z>C7dZeAJ8=9HB>oQeTc=5$AzyC@U z9{=l72>9S7NFHO8g1xwumWfW;FvETR098HO!IKB6wyC5h##B8NVmsAD7@DINQB^ci z5>;z)TYy1@(wD5SyzZwR${GzzcmM?JnZ=r{m z1aLy97>jAYTXbaC`3-x1^x9?#L9#8DvujsU33PdjEO$>Mf67JWG+oZ?8XUu3gV8(O zO*7oh9J3e$65M4e+5&f3kX?nq#6k=X62^9bYNOg?)R`tAqNKa7|U&&Ah^W9a8C zw@E5v6>`UDoXMJ-e9D80$`{ud3Ut2$i#K7uauHfbXt_}=gYQoe!+kHNX zu2-hxwkc?PKrU8UgXFqa=Tvz|2X8xln4}f885PGDvg)-6)6_d*;qdA)T=cMkB!N0B zJF`3Kw)_!w;f7W30^yp>zRyIAn5i1XUmj=5~t5+E8XGaAVQ)^GV8qQV;~~ z8bz84L8#MoxeMBm@D)-kLZGW}a2^Jt^Rt~7OD^Twm*w+P6m87_%bb1bGfF^YUyR2y zZ)`G~b5qHrpSOz__&ik^H{7S!_5 z(H5+j5%7J8dfKmkpls3U<(V6Y;ln3y;t6;eo*v+|SQ7rFok@rAvM<6g8Po|!a!z+> z%p46tp5yLv<-@FTV0!Vw2z%-)uf`Y_)}u9=?mb@A&DhBOa&e|StsRpx)wZ7;xO?l! zeKN1AaG*D{!)siRjnT@}R_r?>Q{BxJU=I?|(e|0TDt$pkRcD@A8@)U%H^$ULHS^&l z`tgAdL{#{qlHI79!k;ZLNK-EenhbW-x>R%D6h6sFtOkJ_T+osYB{vvDKMA;pva8;t=*`Ep5ygzajhu9;1$3ZK7 zNeJ{->@}!d=~h(+LEA*z_^54vziN*os0l?hQI%1O(Hc}ddN~r6Jvz!34UMfdja{bT zu4Y!DKU$UwkH9osRhitwXS4N+5gx_MsfTEI)&j9azs4`*mXVbU`k6m2)LgY>4YpXB zPZDAw{xhBvgVMIfHhd3$WU>hYDDW4<@x=bY9p>;uYt3s)SrvJpIELIoC%Tij<2V5l z4ocm^fT{oj5oY-Wj{q#&a(@Q&-w%C`Skt}|$?ViafXI18bic}wc$IolS5cX44wV%{ zk1|$>=7}CuhnwuC1BhR2k8^OM1%atDNmOJ^*VZU|v8{Q;;3H<$uoO~zytQzS1|mch zk!xq6?sp$#3VgbgPye1WG6I`e+JnY+(~-j=+0NLFsD$0thBUTIN7~ms0}~qBP-I%& z*PDZ~@`;-Jy(5_9s#kcuoyACROWC?xu*P4QY(L)&cZlfq+*oo80@)E*+SkbBM`6A- z&fSO;5POAKFxBH0J5-6OIDwWhP{BA@B)ml7Aj+m=%iqkjZ~@&-jV{mejVP5SZShU5 z#F&2A`2N))XYSnldUTQBt~CeUH69Ij{TWpRG1P^iYqdmm$D3-V%DYzkn&Ct|Zp*>; zak?RbvEhzsHBx#k?RYTHq30)tT2#MUxS)V;jITi>8WDJe+o-M@Mp9;E4a6PNYx7LS z{+Zu$1;d5_Pr4VXV4&eG-x*ytz`@5H?6Rs0Xu*yHGcEWq-)i`S~afPzMlP*V9R&2c0HK`N81uD1;oLY$pb5m^;_Ql-ly+ z82PAT1y$^Xp>dS1l21N02O*~K60(AylXYOf)Q;h|E+S9HQYqly1r?pEk|`WBu@z^* zFF#`r^?JkS|2ACsdqC?y8P)*guR;HTzy5E8x2Rh*k6Squ`g)B-X+?AqC~5F-T5Un? z>Mn2AEA~owe?kh(4VfwyUhKeumURf!ofP(1D=o1mbl|nifCbeBze=N049=}w6}5(Q z1fr8X^U<|0a7(vv!iRpg>sV#mH1N?E#N11Wzr-0pBL$ct2qv4pPQ}R0-AOT~pVpfs zKfM%StE_+-tR5re!(lkN)k7_sih(I>bvG?3rqF;2*c6QzZ8C?t@u+yJWZ5yzR6|*( zk!Q;C8iw$6eTCF;bR37hcKY%!rm7f3!pBnR0>@M+q;}qZX1OG~lEkqUUJJ}6v#jP( ztHP*G3CnhsKK~P{;W#g}bGPa1(26>VK_7RS_?nCv>{z7U$ds8|Q#D}+-x`$6BLs1# zf$2a&Z*{#$Zx<99oV{RA$1NaAM^LTK{q^OIk~-YXr;~kEvN87eZMM34_OkOebCeJRtGzjo}@VYLC%;T?({G>eL~4q~D;> zTeshp8e;1a72;0nlmuToF&C2qt6Lb1{YW{`uQC!vW^snhXMke?NSR)d5t!!&q%aeN z!`v~*YhgkJyg)iAL4eLA-6pfBvLPT77svwZP!i=Sw^m%W;YbJx+}*ahC+@-;eje4e zVz^Co_0x}}2&D&@%Sd(|0%g|pg@XFt38R?edJL*}_}w@pY@pcXu#L>%1q^gN$!j2r zKE3c9QeG(Iw0{{!8K4Dg1sJ^MSc;?9nQ;Cz!=1AE1SYS%pSD9MHOBI`PUy2=rPQ8{ z3;QrxY=Y=o2y7Ckkh>AI#XBt#EV@L3nk^V8dJn(!!Ymo{v1B?n|7mRAEjCGm1PWy` z+tne~8d&78?>G`lf_7G)Egycj@lk1N(FYh=#xldPumbxqs)0Mf{#q5rjSltt*z{eH zwErO_zVYr-dZGuS$R8@C*X8J+Gm}3<(sdi5xZxRzt`WyTvDASEMtX(!auo`CM%wfW zccmV=7+3=on&YJhs9TekX#~YH6ZZS?S3=4l^ zQO;NIWg!hkg}mIsYc7q`N)&baxE#3(H}6IWu6mn1CBPZpb}8LnZ~)=aAtMf9etM&a z)Bc^)lH0UsE(b!5w%{c!G;Wx6rITuHr_5m*lFCb&+wg^Y*}MUK ztt)FpRP+@`(1}_O-IO5=9^{a*v4TeDV|pYI(;%q(H=T07Zf}1m;^r$$j-C7{ckSV^ zq9z)iKFD@cxM0uxFrA}% zAki!Yi6Mt!w&wFp|>Ydcc0gk`n*lPv{C8M-R4RP94 zn9sL$K@Ek~H?|pdlo_r~VJCjN(vB~=hVG>jT_m7IQsNA&RVh|db&sdlwHh%YW&r=0VYc4P#EBqAt|}vk>DUyeBcErRFfI>^PZNZrY|B@Y7!3BTXmxkvA<`LPD*G z8!+{09=)7()IsmYg&!wrv5?BPVsgD-l;)|J;MhtwQb=oS1S9vua%o8Xbo8?#uT`4x7Tj6_eqnHB19or_5 z`Z$s+koTOBC(AerQEmu8lD;dSwyL5Xek~3^DT3w#=v>wfu~-J5m$7iFJqRDAKpd-t zp!3e@+Vf3ErG(Nwue@F=C`D}L3Ws^b8dP9_U@;Vbr4Z`cXjK~p;@GPfg37yN$h{iw z;ssw$=KR-au&5=BFG4$_>ARaF*b!|*MJKVb!SrrE z4M#h3fl!U~!5Y<)fU(%pH6T|XU|Nfnw&rsGr^xc*ieuj;X!O_oCj9(b!$w$FNCW19 z)B6Ujn_yetSZ{VuK@^?K1WZ`mYb7e8ZZa@!>G$I7rNq2awf%NlvwKq(EQ+@X)VZlT zKOIc=!>A~l@ob(GW{0ghHOPyYQn3ppNFwQa`f$>eW$)!L%`S&|7#G{fUewtA>@ z$*c{tUu;`I5x^F3V+mgh`y5qx!x4Q4ro-w+y?&-nDD<;NTp&bYR1iM|=%K6HXh8`< z`eSLnII{ZfpIisK{z65{iVY2CnP%n(oE|{QNrQJGv6QHizjDjd#*#l~eNti8ZL8*B z1(_8K$(@FX&3$c*BZI0@9?Pt{`e?^MkUwU0uO~s>!D0~=4+&4B7sKcXsB!v3RFYlZ zts+-4%3_!TXGH&w6|oB5(3p<%IP!NXBGlFbZK0;0Z6Cn|Q-ZLr!Dt>6FqkluRcuK< z+X+8)f`q==CLF5pxYnT8AZYYm@6gTju`jJG7T9*Q`h<$tDkMJ=aNL3knR`$PXxHe! zr#|fv9%zZi8McpZIYhdjC2H^m_N7Uvy4?>wkJcPo4$%QOPdhfj%^@NN=8LS}wnS4t z>`=tv%qdjSn5>X%1)nnZ8QwL)iFhCmGhbl8esPgdQ6$lAO36Z-ifWXi+9dgaFVm(X zL1wjk@i&O)oT$_{@?tU7)j}0BZCMznjDac!RXsizqo8uq0y*1*xv>Mhh#|u7c?$Im z9P*ehp@-o^2x$nYn^nE;svjH}=YbweTooq%7(!}~h2<>j|=k>`>7;UdU%~CbKOTbh57UoC2o0pGk zq-31MjzF2mf(DG-FuH9X(jYf4rNBcFKL$_b$g&A>4w5^J%{C0)9EnZtktG~Z_lb>I z&{yg3_8cQKI&jK#AcyZ~Gas^TTg6~^(V-^aPPZ|le{-UD@z)*$Oo9oRolx(=F5uH# z@6!2|5S4)OCnRW6fEYpM^lX)wTNUzb&p^)ins$Pd@%~NmZT0?5S%23&p0!dCSj4cO z;S_~08HjrASyAT4V2UH4j=;NsO=bkZDc;iWMV1KOCE|9 z)y*@!8jF|r_aYdXKH(IK=-i~4d$rL?X_e=Llukc z;$gSXKRJa*xRKJkAKf;Hl1j%SR;mIFAl(w9LR;+iJur!+`C_2NubEZmq5>e$#rMgH zjWOg;IH>soT)7}iDt+2*LD*+5YcGw#ojQ7=6MrDeH~#9tT#l!br~k}TxI^b`%f=pE z@SQXPYsZ7oPVXp}BG+7^4IFi}If7ce0T3cx@C8{R5OA|jqSZIZB%I2#sC)621SdK- zWrw!JLNNv*sT1`iM;5c?y+1t9!U+~Ky+eHmwsX{z6Wb{XZ^m$R_vI8+XzH2msEa3` zuZqi!!K8rg%;#e}ktQTMXaUc#QuHSiOzTrL5SC9=b*=A3ahK^7j4LRTMGCWuVqk?B zRo;k%eh5c^yl9o=uu>3aYF9c$x1C^O-&0V-O2IgJhT)?Gm5kCkD(5~&Ko&EgEdzcT z`|BK7wzy9#m$B+f9EQ0am1ySu1QmvGWq8?*@5m(i-cf5kK{-6OGP(KHS6f!xFhDqj zBJp{O)8<1PrXA$!zVzeE6Kw^{R>o?${j2zGan=R$C&s-Nm=S)libe;_T!I<@R8MmP zi-9DYV>=Qc)0$xjlhe$AmN{Uabw1v2!Vjj%wz~fNppDVneziRU#(sl;zX~y!;O{NC z8f?-p!mQK~CEL>WaJFu$kSqjaz~T$!u2_q@g@)<0>Sr=+>Gj|F6cs%{A3UJ+}( zdvmQ5OcExMwbH=`Pf~c&g z&4PKDn1>weJzDL>@}_iKT6vu{7^bA(x{#2I>$f}`f##;LizPzE!NGQ_SnwV|{%U-K z7SVpN7%?*7OFI@S8vcsGOLSqxA`EDw9S~@UW26Z%3s#~Xg4VV%!p|ChQKFx3bx6mBQ;P^wZOoQYUPH+ax90};rJ=AsD|0y}^w*0bZO%{> zCp-Z)P}#i|JE0%yYZxxTn*?n_+pwsS5fzv5-8Z=*wa#REdw;?9q$;Sud~Dyvjn@O< z!`BDoHCEhn)y3=uQw53}D#sQ|mTNFWjwj9W7w-z}>9)RNcFI2=wcdVI^k50Br0lKT zXiAtKMIO$=Lv5lHm5O|YLrp>8+e5OPD;LzLE>}rG5{8e9F!5-7O-`4>FfC8DINpGp zSBB4V(H1`xE_JMZnC%Z02^<`Us!g2sMNa!1S8yg1R<|Ddzu*m>>3R_d!Q*R?LVumS+gEQT>Nm#Kf+2#o zY#i3~%^D#>;2)3^ZO|%pMsL)LfvU2W@*d;UeqkY#rxkpTCa2j;!RN?&h;Yb zWLocXX>8VA-h$$X;G1zC$90a5$rhN1dRQ!ACDxB3JXzuKH7DYWSX+vf$(^FV6oOgP zOvpikxCqX=voxZ*%Aszm&{kjS4ZD+0^!hUk3vpV9O2X_no*QeR?RdVj!2YMb>uYh4 zCV3ngu*aL;bg@5oa~Lm8{6(3ZkA^YM6(fV?sRt>678RBGsv}i84YrihlaV-mkyS!n zsL|;AEi<2ZY&_`)>qt8XXW;2kU+13XySIV5)%zkG_l-mA>h_SysJ$-!>8LX{W8TDb zPx-Rmi@wNz;ic7UN+D^qbI(Jdk}!s1(Zb*Kn6 z$OEV&??zcvz+?c4mLanI_>+5^Om_LbUw%wJtUYfu-~IK&23RlW|1r0tPS`MFB!LdD z$zdMHvvK?XhcET4%!o5>@6|cg0qZqmGP3B~iPUq2Ki7OAWu@3gG|gZ4i=>JF5RH?)ZBY^?!5b z{#QHqRm30w05H@7dzR6%3wW$6?1773?qVVDKYt7Id#D1bC~w|SDhgF36@@C6ib9o0 zMWITiqEKa0QK)jMC{%@16sl4x3RNW)g{qc{LiLi0Le)q`p=za~P<2vKsCua=RBx#$ zR3E7*RD)C$s!=Km)g%>#YL<#ZwMa#wTBV{;ZBkLFzEV-BcBv>-hg1}*Qz{D8bpt94 BBuW4P literal 0 HcmV?d00001 diff --git a/NeoBoot/neologo.mvi b/NeoBoot/neologo.mvi new file mode 100644 index 0000000000000000000000000000000000000000..773c5cdeaa532cfec46cbea291d04bc0d8e83e71 GIT binary patch literal 42848 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
Ix5I4i#*X^wYL!)I6kYoi`2{`4vX^AJfe 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 O&ix*##>(69n*RpEVaDeG literal 0 HcmV?d00001 diff --git a/NeoBoot/neowait.mvi b/NeoBoot/neowait.mvi new file mode 100644 index 0000000000000000000000000000000000000000..dc4d38c9154de73f1b7c8832e8df7cc5f5c434b5 GIT binary patch literal 33830 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�pZ@%BZ!7!kwLh~xNz;$T2}U3(+E|5qD(I;xWI&8Q(-*s!~46N+oJ9c zLTnL*yFPC*2oee@koR@7=B}O$JN)&5@S`)A2pUpROTrA82t}~$0mMfMqr59aPYS#od_|4=-2H#k zoMK6{EPv~c@REWCQgH#|U^7E}#X$aOgZFPj)u|S4Tba{nY=3_|HO;`1IGam^xl0W> z?)EM#lJS0nY|;_fg~h|$-2P=wBTE-%!Al+*rj0;|AeeQEYu2q2D0oF0ACAJ_!$bo! zoNfa{a!1qjhxjzuajluiS}rQhh&F>?Q!H7!?_V&-(m+ZMVk5?Ft|YwY2Cj(1M}y=u zsX7Hx^6b(7tC2f_-csoNaP5yOC}Iej(X8<}K^v(~Pb74l9{2RwWG?k1_x^e=d;e;# zd>D=`x?m++Hl=!dN%x7%3MQZ_mZ3h8NhK zP4HBx8VeO-F(#DCY^f@({U-7uz&Ck&XP*(bh}qJHk$4&I_ETJgsXgT|ILiK5KolDl zzn~{z-ai^xxZ;2haZS_u?qX-#*pxaVm-=hqOHJUX#ji+>yut<@6i{mL;RDd)9zlkl z=UB7laAoP%Q)+GJF3SuWjI`>QhlDX|PXa;9a97ED;i45jIE8%c!D-};!Wmj~&oLZ{ zgTG(x%u0x7KHgbvdXch~&@veV&p7yd`* zJ9lLXmvMW4J2WTX+^O?w%oeu|M-m#hoMgr&-27!kb3c?7vK-I}Hh&az^^~TznKNhy z36bcYAe_V&$L_oJAO0_z9RHgh$^ZDD$72&B@Q-dnTpGHo?Oe0i_O$eiXE#h468T|U z>PY;vE(NLRP7KhNutHscaMN6^W6mZKq167cFAJIKTb^wYHPpkV{2LdcQlZFB=2%a$ z+MLQ~+)|<3ip_-nvyh6lSISJ>P`QlD2cZgt-P%Xu;uFoy(OLUt^$}ftMs$l_j(cW=BAdBiE!r^6Sg- zp0}#aA|HVgiI%!(z~76nsJ+ahIlniqf@Q8Amc(6n5^hvCy1?Rq=d(s&Qq+zp!9dxh zzDTuaGt2_*P*l}snho~n0)+1yyBYW#UNRYMfV_Ca2q)7l+F2MS9Eaq<=$wIGC2-Mz z<>j~l>C!2Xxr*U&kCE~1R|*$13yO&IIwScqZWgPFDfE(FQgKU~MXNq?8WkOaeoxHy zsM3_;Lc&IAYg72G5?we)(#;{*R3a5VfP43KveQ)t_*0YO!Lh8C%RAu1-49@4X4Gsx z@Du?NQY+CGEmcM$T@;$Fe?JOotwd<0{6PB7qA01aR6EcdEw%7L3?1hvxVSl^h*Qik zD!Tt>%ZP*tQEmuQH@DE5J2X2krn0o$`i@7pgFt)WUQcm9l(te8dz#{$&6ZpJ>FYsg zqiU)R_ysrw2diC}%@wQ1vBc~e6Ba|2X_EdLu9a5`iI>hAwN4gjotzIc=DF(c8RMys zu<=ods4K=?qJE%=urFpbGwn3IeAT7I&+GOrtk@G-xM1Dxxl07tn`rsAYDTanoAp&6 z!khQXj@Q^C$UI!b9urQCIYKxhO8Z2@`WVd7zs#movMHBY?Q|lZSQBO?&f73wwN=i6 z1@W~j1F+;sjV4MPElo6^4HX7*D^u_usrZ>xTt}=Cw-2mQaZ?RmSReZDeWkSOJiId8 zNiJd_+5^Grvt*9j7~+u9m9%--=~eJ=p4MT$#yiieu?D=(&gXqgJtpsLOQDw-jEnpR zXd})KR@k5~eTmTcQ&+=8-tW_h*1rWOTr+_0SsOEcNW$v1w;Ju1%5*&0%@GNf^1=wI zBNzm{YE5w-&-Hz`vpJ*O4I!1OQ%J&xYKn91>q=D(6vHz-ZFbPw`*fXO!Jv8^A+@q( z;2vzvNbD5SlrF8%kwT@+awe9VH*1L2VrTEJKL~CNRBO3X^ZS4c*2d1!kB3+X;7;*x zt(1W$LBWld*F!p)C0SRqZN&k7=X}7O#Ws(2qw`XJwmHSR)pMDZeqWSXf3K4C)Um{3 z7E5XDiL|8Xf~q_<;k;s*wmCaOs*6C_1Z$4K#KT8R+nOutFPUX17&8^t2(Q7ZQ4#DQ zIoZppDV@R*%6YzH_u#de?=qch^2@C|rSxc6$xZ9g9p~s>a&_+q-1LCMZG-)Vm+m9v!w|pyp*=spK{C5wy_=YK!Dol0z7fz6h z;DZ3^-vRv8Lqo$j;77*|Ps5_T8Zlu_f4Xds0;N|c-M`VS%>er%Pf%9e!sc60T( zxVK~KA_TG0E9{~XV$h@^8dlS)Z-zka!t}A3;pSoSf6oI&lY8M)?ph~9DE2Xy3! z5kf0j+f5a8|9t@&*9TMJi+Kef8etjk40Vj<49tVQEb;3pmbUs}=UmdBE-{8Gj0w*A z;~)|hW@qPai#P$E7WTLIXLF@(WUY?(W_kCo2%po9Rb_f$`oAp2H2isp)>P2&oHWQiCz-KP#qy+0VN!YYA7B;Q zz3rXy>%1S0#+UMwLwXqDZjX}ln?fGKJ8l*1BBW-HUQ85nrDpr^y`^ycq*RE<=wgTM?2^W zcQ=^u6vL*-vHGJd$;~Q}-&Av$5d!TZx4DSZCvsGtusXdwpfcy%kzsfdPFB*9Ol0!S z?XAQWo5Af3MF;c;a|+t6vV40Rez0yTZyTBAsgjUixpWEMk#vgiGwJ24e@`Zvh(UPj zJiP1iSjoa?rN^$T+c;00PUh-Y@&P^Y7~Seua6ggC=SV9rv&svJQ;s645IT2p;)-k0c&S4P>@=(* zbG8lR!-Wqb-hOG&%}1kHPFmy~;rIzs^FLe;Sddl7$v3ftVT=^L5&bEul-DF*^@5^| zu3_d(<5_-=v^F74^x?-Soj>&TW&iVecnl_R>2oa~Yde>V8kFEc$s;>y!5y3x=}xaY zJEYVMMdvkCMJ^f0CKg@6D*>|foLf~|OgvuA5-+Rif6^^7(;hP0$K^&ojB&~D4c)8|&GOrB+-y9{il!@?(+4Wn|@Uf{~|aP2MnG;(go8a5o)e;_vg=fE+@yC;zRM?)IeP!P6?1 z!9`|~16s4AQFa8^1p`9L;bW>|#!CioS7SC(1&qKz?eO?M4;H?$mDB;% z;O-tGHv;&m|8x}m`0cM*Su|x2gZXEh%X^?& zecCFkwy`L2QC$QiO>*aNx8pHlENP+~mL)yV$?_i(&BP|~7dcG3F$M4WgOwFFI$&uk zmNpOo%6)F-13iS`O_vXLY(LZ~G<~-<=qag=s#p=Z#J2IgjcDaahFC@9lA_G&w~DA0 zp^Rvt)|BFtNcM9ToBC{7NRggb)7L?8l%{LU0O3Q5s;w6DZ=cWEH`Gi_r`cRu)k>?H zLFZ9i%&0=%TcvcAJQTkU?yz#o(sseA% ztAX1GhH$5n$0=9sDMK?N=Vq?OW=|#@BWmk=)G!WPs@~~e40Kvkoh)^xaDreyI_C75 zBF;FIuEu=Tn^o`w_%qkG-e^96!jKvTyQ*TeetjELeTe7$TwC{AKI6w1C$UKj@vALG zhH-AeEW8~{S%$}n^lx~dVncF2S4qMaw{D+nx8tUHxlv;@sxFhO{EW;P<0{6e>Nghj z*B@=s85uVUF%~I|1;YvNpXawYk|88vP)GKbi-_g%bnNbCOI3-KZOK)9gnJrp2Ju{z zw+H!oP#M8*^MIVk64bGmg%09434u1aG?Iy_JfG2gHZT}v>pc;rtw@O_hW$xa7EP#E z9@L*%=cM5uSkb=QHo23hgc=ihW@gw&cxdwm!DCk{IyVg}=Xh`#ntvX1UH$cm?P6de zaXcw6SW}R;~y8y;I<7#>*Uear||}ipC*0w2BX{E57ug> zV8h!8d%q>nyes2|2R`4GHG=)9;Hu`j-Mty`VvoZ!OMBHO*>*%{SLuR_Q;lZ_C*?0_ zzc783<=MVwLed4+Uv$2CQUXdJDSC z$+%I4sy0x)3EfjWj4|#L*YTjppcq1vI&&is_8D+_;y6hs2DY<{7!^kSo9Xv40lL`)m#3eS4k_SaR8jNiAM7Vs98C@Z=3v z^f0g(8+IaBnoZhd=4ro+iUWQ2>Q}>V-|K<3nUFN(-02VctgqA))Hcre*lUX|)JRpM zUR0%*R55PvpjCU$daE@_CjzG}J$eYwO&x@aSK@|cmW~i32n|-Dp{4Df8Wc3U)`#v(SxR8a zbY9Je783;xTbiQWO+G~XcX-*J0X>f9oX?~ArzBzR>|&7N7d#2upIzp+W1~^d(J|%< zWl$>BRgRDk7wqyn9rUe3^ zJXszz#HQ1Taj;x&g((8fS(i%PBB(nA)k}ok$D>6EsA?BUm=FE}p3Y*;7=8*w(!>v2 z4juS*-w!0r#ZI>C!3T_P0mtf}I)$5hp6shwJp#!zrz%*8i<`CurzvcsIh0R~irb?u zKMi>5^b>xL{WcUJObjg2zN z!SDcMqN7DwlCaU0F;d=>)6$B2=T>scDf@G`lf|hX^cVzeh_b%;fu=Y5`4z__>wj*7 z@w~Fpqy!}jK@*{nW8w31Mmup;eLvnlB2{6w_r#J%c3@LwJ-7I%w|~NUq=Cd>2F_vv zVX3~Z3x!08`7)f`-a9=*Oz_&4#_V$1Z#$z{5-R^#yf!{DQWzwpHG`xay6AmKpq=U|t!}Bmue+p03 z28sI~QK!Z!r_(!y1n|b^508=55`IpPdv>f(T6`d;)bqyk&RA@xaKs0A>l5Cd0|E*b zWY}0ULMTi!sm?y=?_JLD!5mn5>`MvUpkEfBMp;*m=Uc z9SfOCGM=ndn0yV`?T8CGAJ&Fxm}5N0)#V>C1>p?*3opx&(Qy`AfiqVog_h?j4U(_N zQg6BAr;P0&3`npx%RU@cxq*yxwa*>=D?ttD358>JH~Nu*yncpDXdP34C+;uDVvU0{ zBSgS;Y~&Qe*F9K#S2U?x*04lZ`>@TXFc+pth7E5vSFA|;$F@&D`f=Ap^D^a)I)1RG zkaz6vUQ*4}41bHmc8~SnX6ux06vRM$&~Ml=9b~xJ-HtNid~23QlhbwnQrq~R%*Z!w zdv44^Z^49lTEA(hKJi6hMJ-%}w-48i{30-J)9 zCy%nm1cmN7cz+F0fS`tNq#7n8H}gq3r(QahBRttjNYm z2I@*Gu!2cuqLC`20ncL>;U}Lbe0J8zsCJI}np&s2EfQ^OjsP8TSW}+g*H1K7AGut9*ATrXjo!Jg;%4vNmR z7ySkO=15~U?W}6@b}hLDEOze(QJiN@Gw$u1#+dKaQ85ezc=wr@(rZH(>~IrG;ZYjDy>J%GnDPqw#_m08kT!&Yo`C_pZ*w3b_V z+-P?~hfhiU1H{WVqC^@N_2F~MyIQH%3|IteY=OVhKS7l7hGFn3H87MLtJjpPWGH21 ze9+7h7;DUyC){l1DI3js6A)l-iNXkP$7}Zio)^YlY47S9fqz$X!=X>9F<5GScy~?moPlu#U^qA4Ufa0>{u(!#U-TK?1&Jq z|>Q@Y37}7tm(tdaVCKrI-Rk-w^+9?X+gq2u=ubv zU@xFD{@N-c1iLwy;wBcfk}w%P(aI0w$(x9MHBwYa>VKVTARJ$%tn0_c)E;k|BN4hF z++o1NNEqLE zYSO;~EfgK@&<1)93^6l+J1+_R(XBIYf;USU?^1eR`E9%leVU(tsjCtbxAzYNmT?NMsMg57V_$`R<} zU`Bfx8u1Ai_Up<(EF;RYE&F(XlJPde7?jAy)X8~Y6jF-Dp(mpt(K)*#`|GK_XS5A< z@s&^bDpzB5FA_lNc+x7Pa|(0{qd1lX+|)**lwgot>FUAKmcPeX?!1UZ#H!$ z>|!Sy=+#@jZnrUr>3Z}0ymbxN(}}ahKxq*f?iRhokbcW!aL|O?62-WL=k#antc|xF z)fomI_tt$k^EVK8;X)(Ua}k0VAz65piCVJ)^S*V9JAWi#vOc-s8xod`<_0nUHrsLk zy6Y*H024lQyt7Vr#RJ=FkU|@oaSb~yPdcKCw?k57H_jDG^!zAX;rW>Mps;v_wxtrU zo=o)7OB?W3w6~28-UhZREk%8nJs#iLE?>?y4n@#LhaGeMc+36dcI~EGZfYI!hr7bJ6V?tE&=Z7X-h5* zH1g#`(2PQk*u=8>1+J=dXso-@m|p%-vD#EqI0tl@P-Ib#xbVOZQidUQXruie@=Y-p z%8cb5RYFalL4yT*e@p{$2#zhrR`gJJ>I+jZ-wOS>K9-VDs*9C%3N`3yc&{5uak<_A zH*VbM^p~!hN8d?qWXA9<{0?$qnV0^kZy~3{+B*1;uC4#?zQmtu{EVen|Nir_6>s&8 z%uXqr_vF~O{-@ujZ`|7}=5P7`!h8IMV(3C1Ht7ENSAPEAIH?Fj75WIOhvl-~n1>Xq zgio*99`IvXI5?)%;C6!k_TDJtlisJ+pK zXTbQU5oKN*OI@aUl?0l@ZII)pYks2GS{c=$!j_ep-YtaiQc>zGHukt25VF_iH0(=@s`a`TzX!bjJ&?zm5e94`=hf zcJ$$2uqG@{b$(k?1H`tD+pErezBNnh*W)vT^A*QIa->9fyPJ_pdvD;kgu|nPIsi94 zD0KUpK)7`M(}qPNb`|6$r6+QVa4!t==|x$8Zm4`_iO;0^KsZa_kWlTwQF=idjFm~sBWGxJPf+%=lb$*uRqx)J2dgv>~)*E zZl1q&t7-Ve^qG@a4));70WC|7dCvM=QiHQAq1Z>O=o6z+5tLVWJVQwL zkI}p%{KpkDD^{1{z|U9|f|1|s`KE_O>HdOs7n66xQ!qJmkfV?77}fbN!mmV;=|QA9o;Sa`hffs$3d@&rv{!1sKm?Fa$bjnId!Dw7g$)Hr`|i82Z-TGxU}bk8BFw-mu2<0UviClj zaAGECVa1g}7EL{UX*>!h6&)_*zn;-HDnWC|CN(z>4#}RU4$jH(m6zoN7N8rd$Y^U-yKB(M@?<@`& zfaSwoC%0u2PdkQT-TiNC?gf(K9BKKv@~so+tX%QArIjDamABhBicn4*jx3j6SlL0= za1@^4gnmk_nzOD6e38miBjW50J$~&?G;`SQtV(~~dFMIg*IgCQieu$xfA=a#u+$3r zaxF)4=~(>66Mc2?p;~HI^NFluprtvJGwSwE%H3N%*0E*s;e{M*2xmF{lhr|ptdNHrXi8gN8+RiyN7K4#u| z`2M7TD_Jv~yaT^l*5JW-q^0d6Pa&+a-{vQ?hsc<^7nbjSzmj)V(u=W!ZliqQ&x4?! z41Omq(z}kRbs~173{Rh11G!(l9Qm{&J^64o3P1VfFisSDNUaN$cp4LySAbppT0t-- z(0nRsrS12$(gRq`aEm;2T)$IDX(cd?U%7|#g@bh5;D7xIGwGZMc(y~=U$*z6M0}Cz z#LS|_gn6k~VKl;ai2UnIVOWPR#g{E@98renYIb`h^L;`7IVXC;9#zusxxKP7<@B;KV0W`*W=qngs^mtO(|SswBISso!2mv!ycrGXW1U>5r=AMS)d4dKHUh+_$LRJ=mEG;OFS>jKTw#&d&T&)fR#tQYZJHwW@V z;SjLW$um}JJ`01pB&mM2zUq^3e4~5uygNUA5&M;KiRK6)CA;wPLP?U5Qy4Y&s-_T^ zA;678q=rx`>?fGiNwiWeh$5Eaw&`(fI>B_b#r2*G+n10C0m3>L9J~W7A7JZwB_AlQ ziV#ek^h{(G7XdGCJ@co3hJBBeqh_b35UjbRO2P(g&Y2PvwxRE%12cbkydeMN$4&Ef zzh3XK&2d+zlH9YN+*Bg|S&5~@XQktJAh@)N_JhzQe2?gUp8xwyO7cu^x*Qj@$`Gs|8W_5cD7MKMsife4qJv) zk1!eRfNzqBx~)@mvXwHlX!9G_4b*);077tx0+;no$j^=66yRw+RTg?*vpN?BpBf7< z{1*HvQ!^NSa>ByZ*swXAFRItWT?lbD6dsoNU=)$7=nW$9SSLi9%IW?b(7vg2d2;iq zbuAq`7|V5r_lLm>2?EH1VdG+X!WH0#VH(5_!>dEM`r?Le$SL9*RAv{k7+ZDt3N{Az zNXFNCDJ{jVJ(Md;=c$r7rfh9I^~6j~_Sx4mqJIDT)zP+6*(f4;KF$ydX3NTKbF@(N zHb))Ji!KeGu=0i22;twRxYZv}3$!|Kgn!hJe%%@=w0D8QVfCuEDagR1C}?Lks**zX z-!q5?hv$0OtdEVGs|i{}~BSMpf~u z6!4pWvI%@3pws|9XHiIrBs5;E(q~KBXkL-um_0IO?!~Wi)1<%g%iA~K1?H$om#s~i zl`$Okz%|;=7P_5@e}w}Z7oI)BnEUzgUq56tyRgQ<>LJHLY~#J$XuK1j%&PIy9oHry zFwMC?v3lv=33a&YDu+j{|CiHyi01dx-}CCh!!lO(f4=l->*lto^EVw?x9Bot^Zv&r0XUm|bndklJI zBd8u0s3IOg^{_w{`3S0q1*)h=P(3VAML&Y-VS#GGBd8u0s2+O+)x!c+%p<5C7N}w$ rLG`deHSrNt4+~V29zpf6KsEUhR1XVOQyxL}us}8S5mXNgRQ3M{-X-y) literal 0 HcmV?d00001 diff --git a/NeoBoot/plugin.py b/NeoBoot/plugin.py new file mode 100644 index 0000000..cdba888 --- /dev/null +++ b/NeoBoot/plugin.py @@ -0,0 +1,1559 @@ +#!/usr/bin/python +# -*- coding: utf-8 -*- +####################### _(-_-)_ gutosie _(-_-)_ ####################### + +#neoboot modules +from __init__ import _ +from Plugins.Extensions.NeoBoot.files.stbbranding import getLabelDisck, getINSTALLNeo, getNeoLocation, getNeoMount, getNeoMount2, getFSTAB, getFSTAB2, getKernelVersionString, getKernelImageVersion, getCPUtype, getCPUSoC, getImageNeoBoot, getBoxVuModel, getBoxHostName, getTunerModel +from Plugins.Extensions.NeoBoot.files import Harddisk +from Components.About import about +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 poinformować 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 = '1.00' +UPDATEVERSION = '1.01' + +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 + + +#def Log(param = '') + + +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('%sImageBoot/.version' % getNeoLocation(), '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('%sImageBoot/.neonextboot' % getNeoLocation(), '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('%sImageBoot' % getNeoLocation() ): + dirfile = '%sImageBoot/ ' % getNeoLocation() + 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('%sImageBoot/.version' % getNeoLocation(), '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%sImagesUpload 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 %sImageBoot/.Flash; rm -R %sImageBoot/.neonextboot; rm -R %sImageBoot/.version' + cmd2 = 'rm -R /sbin/neoinit*' + cmd3 = 'ln -sfn /sbin/init.sysvinit /sbin/init' + cmd4 = '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,]) + self.close() + + +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 += "'" + os.system(" 'mount | sed '/sd/!d' | cut -d" " -f1,2,3,4,5' ") + 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: + check = False + if check == False: + message = _('The directory %s is not a EXT2, EXT3, EXT4 or NFS partition.\nMake sure you select a valid partition type.') + message += _('Do you want install NeoBoot ?\n') + ybox = self.session.openWithCallback(self.install, MessageBox, message, MessageBox.TYPE_YESNO) + ybox.setTitle(_('Install Manager')) + 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: + check = False + if check == False: + message = _('The directory %s is not a EXT2, EXT3, EXT4 or NFS partition.\nMake sure you select a valid partition type.') + message += _('Do you want install NeoBoot ?\n') + ybox = self.session.openWithCallback(self.install, MessageBox, message, MessageBox.TYPE_YESNO) + ybox.setTitle(_('Install Manager')) + 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: + + check = False + if check == False: + message = _('The directory %s is not a EXT2, EXT3, EXT4 or NFS partition.\nMake sure you select a valid partition type.') + message += _('Do you want install NeoBoot ?\n') + ybox = self.session.openWithCallback(self.install, MessageBox, message, MessageBox.TYPE_YESNO) + ybox.setTitle(_('Install Manager')) + 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 getFSTAB2() != 'OKinstall': + #self.session.open(MessageBox, _('NeoBot - First use the Device Manager and mount the drives correctly !!!'), 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 getFSTAB2() != 'OKinstall': + #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() +################# Next Install ################# + + def install2(self, yesno): + print 'yesno:', yesno + if yesno: + self.first_installationNeoBoot() + else: + self.myclose2(_('NeoBoot has not been installed ! :(' )) + + def first_installationNeoBoot(self): + self.mysel = self['config'].getCurrent() + system('cd /usr/lib/enigma2/python/Plugins/Extensions/NeoBoot/; chmod 0755 ./bin/neoini*; chmod 0755 ./ex_init.py; chmod 0755 ./target/*.sh; chmod 0755 ./files/NeoBoot.sh; chmod 0755 ./files/S50fat.sh; cp -rf /usr/lib/enigma2/python/Plugins/Extensions/NeoBoot/bin/neoini* /sbin cd;') + cmd1 = 'mkdir ' + self.mysel + 'ImageBoot;mkdir ' + self.mysel + 'ImagesUpload' + system(cmd1) + cmd2 = 'mkdir ' + self.mysel + 'ImageBoot;mkdir ' + self.mysel + 'ImagesUpload/.kernel' + system(cmd2) + + if os.path.isfile('/usr/lib/enigma2/python/Plugins/Extensions/NeoBoot/.location'): + os.system('rm -f /usr/lib/enigma2/python/Plugins/Extensions/NeoBoot/.location' ) + + 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') + + if getFSTAB() != 'OKinstall': + os.system('blkid -c /dev/null ' + mntdev + ' > /usr/lib/enigma2/python/Plugins/Extensions/NeoBoot/bin/install') + if getFSTAB() != 'OKinstall': + os.system('blkid -c /dev/null /dev/sd* > /usr/lib/enigma2/python/Plugins/Extensions/NeoBoot/bin/install') + if getFSTAB() != 'OKinstall': + os.system('blkid -c /dev/null /dev/sd* > /usr/lib/enigma2/python/Plugins/Extensions/NeoBoot/bin/install') + f2 = open('/usr/lib/enigma2/python/Plugins/Extensions/NeoBoot/bin/install', 'r') + for line2 in f2.readlines(): + if line2.find(self.mysel): + mntdev2 = line2.split(' ')[0][0:-1] + f2.close() + os.system(' echo ' + mntdev2 + ' > /usr/lib/enigma2/python/Plugins/Extensions/NeoBoot/bin/install') + + out = open('/usr/lib/enigma2/python/Plugins/Extensions/NeoBoot/.location', 'w') + out.write(self.mysel) + out.close() + + os.system('sleep 2') + + if os.path.isfile('%sImageBoot/.neonextboot' % getNeoLocation()): + os.system('rm -f /etc/neoimage; rm -f /etc/imageboot; rm -f %sImageBoot/.neonextboot; rm -f %sImageBoot/.version; rm -f %sImageBoot/.Flash; ' % (getNeoLocation(), getNeoLocation(), getNeoLocation()) ) + if os.path.isfile('%sImagesUpload/.kernel/zImage*.ipk or %sImagesUpload/.kernel/zImage*.bin' % ( getNeoLocation(),getNeoLocation()) ): + os.system('rm -f %sImagesUpload/.kernel/zImage*.ipk; rm -f %sImagesUpload/.kernel/zImage*.bin' % ( getNeoLocation(),getNeoLocation()) ) + + if fileExists('/etc/issue.net'): + try: + lines = open('/etc/hostname', 'r').readlines() + imagename = lines[0][:-1] + image = imagename + open('%sImageBoot/.Flash' % getNeoLocation(), 'w').write(image) + except: + False + + out1 = open('%sImageBoot/.version' % getNeoLocation(), 'w') + out1.write(PLUGINVERSION) + out1.close() + + out2 = open('%sImageBoot/.neonextboot' % getNeoLocation(), 'w') + out2.write('Flash ') + out2.close() + + out3 = open('/usr/lib/enigma2/python/Plugins/Extensions/NeoBoot/.neo_info', 'w') + out3.write('Kernel\n') + out3.write('Kernel-Version: ' + about.getKernelVersionString() + '\n') + out3.write('NeoBoot\n') + out3.write('NeoBoot-Version: ' + PLUGINVERSION + '\n') + out3.close() + +# os.system('echo "mount -a" >> /etc/init.d/mdev') + + + system('opkg update; chmod 755 /usr/lib/enigma2/python/Plugins/Extensions/NeoBoot/bin/install; blkid -c /dev/null /dev/sd* > /usr/lib/enigma2/python/Plugins/Extensions/NeoBoot/bin/installblkid; chmod 755 /usr/lib/enigma2/python/Plugins/Extensions/NeoBoot/bin/installblkid ') + + 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 lzo') != 0: + os.system('opkg install lzo') + if os.system('opkg list-installed | grep python-setuptools') != 0: + os.system('opkg install python-setuptools') + if os.system('opkg list-installed | grep util-linux-sfdisk') != 0: + os.system('opkg install util-linux-sfdisk') + + + # ARM - OctagonSF4008 - DM900 - Zgemma h7S - Octagon sf 8008 - AX HD60 4K #gbquad4k arm , #osmio4k arm, #Zgemma h9 arm, #Zgemma h7S arm , #Octagon SF4008 + if getBoxHostName() == 'ustym4kpro' or getTunerModel() == 'ustym4kpro' or getCPUSoC() == 'bcm7251' or getBoxHostName() == 'sf4008' or getCPUSoC() == 'bcm7251s' or getBoxHostName() == 'h7' or getCPUSoC() == 'bcm7252s' or getBoxHostName() == 'gbquad4k' or getBoxHostName == 'osmio4k' or getBoxHostName() == 'zgemmah9s' or getBoxHostName() == 'ax60' or getBoxHostName() == 'sf8008' or getCPUSoC() == 'bcm7251' 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; mv /usr/lib/enigma2/python/Plugins/Extensions/NeoBoot/target/arm_run.py /usr/lib/enigma2/python/Plugins/Extensions/NeoBoot/run.py; cd') + + + #VUPLUS ARM + elif getCPUtype() == 'ARMv7' and getBoxHostName() != 'ustym4kpro': + if 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; cp -Rf /usr/lib/enigma2/python/Plugins/Extensions/NeoBoot/bin/neoinitarmvu /sbin/neoinitarmvu; mv /usr/lib/enigma2/python/Plugins/Extensions/NeoBoot/target/duo4k_run.py /usr/lib/enigma2/python/Plugins/Extensions/NeoBoot/run.py; cd') + os.system('chmod 755 /sbin/neoinitarm; chmod 755 /sbin/neoinitarmvu') + os.system('dd if=/dev/mmcblk0p6 of=%sImagesUpload/.kernel/flash-kernel-%s.bin' % (getNeoLocation(), getBoxHostName())) + os.system('mv /usr/lib/enigma2/python/Plugins/Extensions/NeoBoot/target/vuDuo4Kmmcblk0p6.sh /usr/lib/enigma2/python/Plugins/Extensions/NeoBoot/files/kernel.sh; cd') + + 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; 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('dd if=/dev/mmcblk0p4 of=%sImagesUpload/.kernel/flash-kernel-%s.bin' % (getNeoLocation(), getBoxHostName())) + os.system('mv /usr/lib/enigma2/python/Plugins/Extensions/NeoBoot/target/vuUno4Kmmcblk0p6.sh /usr/lib/enigma2/python/Plugins/Extensions/NeoBoot/files/kernel.sh; mv /usr/lib/enigma2/python/Plugins/Extensions/NeoBoot/target/zero4k_run.py /usr/lib/enigma2/python/Plugins/Extensions/NeoBoot/run.py; cd') + + #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; cd') + os.system('chmod 755 /sbin/neoinitarm; chmod 755 /sbin/neoinitarm') + os.system('python /usr/lib/enigma2/python/Plugins/Extensions/NeoBoot/target/findkerneldevice.py; dd if=/dev/kernel of=%sImagesUpload/.kernel/flash-kernel-%s.bin' % (getNeoLocation(), getBoxHostName()) ) + os.system('mv /usr/lib/enigma2/python/Plugins/Extensions/NeoBoot/target/h7s_kernel.sh /usr/lib/enigma2/python/Plugins/Extensions/NeoBoot/files/kernel.sh;mv /usr/lib/enigma2/python/Plugins/Extensions/NeoBoot/target/h7s_run.py /usr/lib/enigma2/python/Plugins/Extensions/NeoBoot/run.py; cd') + + elif getCPUSoC() or getBoxHostName() == ['7444s', + '7252s', + '7376', + 'vuultimo4k', + 'vuuno4k', + 'vusolo4k', + '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; 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('dd if=/dev/mmcblk0p1 of=%sImagesUpload/.kernel/flash-kernel-%s.bin' % (getNeoLocation(), getBoxHostName()) ) + os.system('mv /usr/lib/enigma2/python/Plugins/Extensions/NeoBoot/target/vu_mmcblk0p1.sh /usr/lib/enigma2/python/Plugins/Extensions/NeoBoot/files/kernel.sh;mv /usr/lib/enigma2/python/Plugins/Extensions/NeoBoot/target/vu4k_run.py /usr/lib/enigma2/python/Plugins/Extensions/NeoBoot/run.py; cd') + + # MIPS + elif getCPUtype() == 'MIPS': + if getCPUSoC() or getBoxHostName() or getTunerModel() == ['7335', + '7413', + '7325', + '7356', + 'bcm7356', + '7429', + '7424', + '7241', + '7405', + '7405(with 3D)', + '7362', + 'bcm7362', + 'BCM7362', + 'bcm7358', + 'bcm7424', + 'bm750', + 'vuduo', + 'vusolo', + 'vuuno', + 'vuultimo', + 'vusolo2', + 'vuduo2', + 'vusolose', + 'vuzero', + 'mbmini', + 'mbultra', + 'osmini', + 'h3', + 'ini-1000sv', + 'ini-8000sv']: + #vuplus stb mtd1 + if getBoxHostName() == 'bm750' or getBoxHostName() == 'vuduo' or getBoxHostName() == 'vusolo' or getBoxHostName() == 'vuuno' or getBoxHostName() == 'vuultimo': + if fileExists ('/usr/sbin/nanddump'): + os.system('cd ' + getNeoLocation() + 'ImagesUpload/.kernel/; /usr/sbin/nanddump /dev/mtd1 > vmlinux.gz; mv ./vmlinux.gz ./' + getBoxHostName() + '.vmlinux.gz' ) + elif not fileExists ('/usr/sbin/nanddump'): + os.system('cd ' + getNeoLocation() + 'ImagesUpload/.kernel/; /usr/lib/enigma2/python/Plugins/Extensions/NeoBoot/bin/nanddump_mips /dev/mtd1 > vmlinux.gz; mv ./vmlinux.gz ./' + getBoxHostName() + '.vmlinux.gz' ) + os.system('cd /usr/lib/enigma2/python/Plugins/Extensions/NeoBoot/; rm ./bin/neobm; rm ./bin/fontforneoboot.ttf; rm ./bin/libpngneo; mv /usr/lib/enigma2/python/Plugins/Extensions/NeoBoot/target/vu_dev_mtd1.sh /usr/lib/enigma2/python/Plugins/Extensions/NeoBoot/files/kernel.sh;mv /usr/lib/enigma2/python/Plugins/Extensions/NeoBoot/target/vu_mtd1_run.py /usr/lib/enigma2/python/Plugins/Extensions/NeoBoot/run.py; cd') + + + #vuplus stb mtd2 + elif getBoxHostName() == 'vusolo2' or getBoxHostName() == 'vuduo2' or getBoxHostName() == 'vusolose' or getBoxHostName() == 'vuzero': + if fileExists ('/usr/sbin/nanddump'): + os.system('cd ' + getNeoLocation() + 'ImagesUpload/.kernel/; /usr/sbin/nanddump /dev/mtd2 > vmlinux.gz; mv ./vmlinux.gz ./' + getBoxHostName() + '.vmlinux.gz' ) + elif not fileExists ('/usr/sbin/nanddump'): + os.system('cd ' + getNeoLocation() + 'ImagesUpload/.kernel/; /usr/lib/enigma2/python/Plugins/Extensions/NeoBoot/bin/nanddump_mips /dev/mtd2 > vmlinux.gz; mv ./vmlinux.gz ./' + getBoxHostName() + '.vmlinux.gz' ) + os.system('cd /usr/lib/enigma2/python/Plugins/Extensions/NeoBoot/; rm ./bin/neobm; rm ./bin/fontforneoboot.ttf; rm ./bin/libpngneo; mv /usr/lib/enigma2/python/Plugins/Extensions/NeoBoot/target/vu_dev_mtd2.sh /usr/lib/enigma2/python/Plugins/Extensions/NeoBoot/files/kernel.sh;mv /usr/lib/enigma2/python/Plugins/Extensions/NeoBoot/target/vu_mtd2_run.py /usr/lib/enigma2/python/Plugins/Extensions/NeoBoot/run.py; cd') + + # mbultra + elif getCPUSoC() == 'bcm7424' or getBoxHostName == 'mbultra' or getTunerModel() == 'ini-8000sv': + 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/') + os.system('cd /usr/lib/enigma2/python/Plugins/Extensions/NeoBoot/; rm ./bin/neobm; rm ./bin/fontforneoboot.ttf; rm ./bin/libpngneo; mv /usr/lib/enigma2/python/Plugins/Extensions/NeoBoot/target/vu_dev_mtd2.sh /usr/lib/enigma2/python/Plugins/Extensions/NeoBoot/files/kernel.sh; mv /usr/lib/enigma2/python/Plugins/Extensions/NeoBoot/target/vu_mtd2_run.py /usr/lib/enigma2/python/Plugins/Extensions/NeoBoot/run.py; cd') + + #inne stb + elif 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; cp -f ./bin/neoinitmipsvu /sbin/neoinitmipsvu; chmod 0755 /sbin/neoinit*; chmod 0755 ./bin/neobm; chmod 0755 /usr/lib/libpngneo; cd; chmod 0755 /sbin/neoinitmips; ln -sf /media/neoboot/ImageBoot/.neonextboot /etc/neoimage; mv /usr/lib/enigma2/python/Plugins/Extensions/NeoBoot/target/mips_run.py /usr/lib/enigma2/python/Plugins/Extensions/NeoBoot/run.py; cd') + + + 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; 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 ') + + if fileExists('/home/root/vmlinux.gz'): + os.system('mv -f /home/root/vmlinux.gz %sImagesUpload/.kernel/%s.vmlinux.gz' % (getNeoLocation(), getBoxHostName()) ) + + if getCPUtype() == 'ARMv7': + os.system('cd /usr/lib/enigma2/python/Plugins/Extensions/NeoBoot/; mv ./bin/fbcleararm ./bin/fbclear; rm -f ./bin/fbclearmips; mv ./ubi_reader_arm ./ubi_reader; rm -r ./ubi_reader_mips; rm ./bin/neoinitmips; rm ./bin/neoinitmipsvu; rm -r ./bin/nanddump_mips; rm ./bin/nfidump; rm ./bin/neobm; rm ./bin/fontforneoboot.ttf; rm ./bin/libpngneo; cd') + elif getCPUtype() == 'MIPS': + os.system('cd /usr/lib/enigma2/python/Plugins/Extensions/NeoBoot/; mv ./bin/fbclearmips ./bin/fbclear; rm -f ./bin/fbcleararm; mv ./ubi_reader_mips ./ubi_reader; rm -r ./ubi_reader_arm; rm -f /bin/neoinitarm; rm -f /bin/neoinitarmvu; rm -r ./bin/nanddump_arm') + + os.system(' ln -sfn ' + getNeoLocation() + 'ImageBoot/.neonextboot /etc/neoimage; chmod 644 ' + getNeoLocation() + 'ImagesUpload/.kernel/*; ln -sfn ' + getNeoLocation() + 'ImageBoot /etc/imageboot; rm -r /usr/lib/enigma2/python/Plugins/Extensions/NeoBoot/target; chmod 0755 /usr/lib/enigma2/python/Plugins/Extensions/NeoBoot/files/kernel.sh ') + + os.system('/usr/lib/enigma2/python/Plugins/Extensions/NeoBoot/files/neo_location; sleep 2; chmod 0755 /usr/lib/enigma2/python/Plugins/Extensions/NeoBoot/files/neom') + + if os.path.isfile('/usr/lib/enigma2/python/Plugins/Extensions/NeoBoot/.location'): + if getLabelDisck() != 'LABEL=': + cmd = "echo -e '\n\n%s '" % _('NeoBoot has been installed succesfully !') + cmd1 = "echo -e '\n\n%s '" % _('NeoBoot wykrył że dyski nie mają nadanej nazwy Label.\n') + elif getLabelDisck() == 'LABEL=': + cmd = "echo -e '\n\n%s '" % _('NeoBoot has been installed succesfully !') + cmd1 = "echo -e '\n\n%s '" % _('NeoBoot wykrył że dyski mają nadane nazwy Label.\n') + else: + self.myclose2(_('NeoBoot has not been installed ! :(' )) + + + self.session.open(Console, _('NeoBoot Install....'), [cmd, cmd1]) + self.close() + + if fileExists('/media/usb/ImageBoot/') and fileExists('/media/hdd/ImageBoot/'): + self.messagebox = self.session.open(MessageBox, _('[NeoBoot] \nError, you have neoboot installed on usb and hdd, \nUninstall one directories from one drive !!!\n'), MessageBox.TYPE_INFO, 8) + self.close() + else: + self.close() + + + 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 not fileExists('/usr/lib/enigma2/python/Plugins/Extensions/NeoBoot/files/mountpoint.sh'): + os.system('touch /usr/lib/enigma2/python/Plugins/Extensions/NeoBoot/files/mountpoint.sh; echo "#!/bin/sh\n#DESCRIPTION=This script by gutosie\n" >> /usr/lib/enigma2/python/Plugins/Extensions/NeoBoot/files/mountpoint.sh; chmod 0755 /usr/lib/enigma2/python/Plugins/Extensions/NeoBoot/files/mountpoint.sh') + if getNeoMount() == 'hdd_install_/dev/sda1': + os.system('echo "umount /media/hdd\nmkdir -p /media/hdd\n/bin/mount /dev/sda1 /media/hdd" >> /usr/lib/enigma2/python/Plugins/Extensions/NeoBoot/files/mountpoint.sh') + elif getNeoMount() == 'hdd_install_/dev/sdb1': + os.system('echo "umount /media/hdd\nmkdir -p /media/hdd\n/bin/mount /dev/sdb1 /media/hdd" >> /usr/lib/enigma2/python/Plugins/Extensions/NeoBoot/files/mountpoint.sh') + elif getNeoMount() == 'hdd_install_/dev/sda2': + os.system('echo "umount /media/hdd\nmkdir -p /media/hdd\n/bin/mount /dev/sda2 /media/hdd" >> /usr/lib/enigma2/python/Plugins/Extensions/NeoBoot/files/mountpoint.sh') + elif getNeoMount() == 'hdd_install_/dev/sdb2': + os.system('echo "umount /media/hdd\nmkdir -p /media/hdd\n/bin/mount /dev/sdb2 /media/hdd" >> /usr/lib/enigma2/python/Plugins/Extensions/NeoBoot/files/mountpoint.sh') + + if getNeoMount2() == 'usb_install_/dev/sdb1': + os.system('echo "umount /media/usb\nmkdir -p /media/usb\n/bin/mount /dev/sdb1 /media/usb" >> /usr/lib/enigma2/python/Plugins/Extensions/NeoBoot/files/mountpoint.sh') + elif getNeoMount2() == 'usb_install_/dev/sda1': + os.system('echo "umount /media/usb\nmkdir -p /media/usb\n/bin/mount /dev/sda1 /media/usb" >> /usr/lib/enigma2/python/Plugins/Extensions/NeoBoot/files/mountpoint.sh') + elif getNeoMount2() == 'usb_install_/dev/sdb2': + os.system('echo "umount /media/usb\nmkdir -p /media/usb\n/bin/mount /dev/sdb2 /media/usb" >> /usr/lib/enigma2/python/Plugins/Extensions/NeoBoot/files/mountpoint.sh') + elif getNeoMount2() == 'usb_install_/dev/sdc1': + os.system('echo "umount /media/usb\nmkdir -p /media/usb\n/bin/mount /dev/sdc1 /media/usb" >> /usr/lib/enigma2/python/Plugins/Extensions/NeoBoot/files/mountpoint.sh') + elif getNeoMount2() == 'usb_install_/dev/sdd1': + os.system('echo "umount /media/usb\nmkdir -p /media/usb\n/bin/mount /dev/sdd1 /media/usb" >> /usr/lib/enigma2/python/Plugins/Extensions/NeoBoot/files/mountpoint.sh') + elif getNeoMount2() == 'usb_install_/dev/sde1': + os.system('echo "umount /media/usb\nmkdir -p /media/usb\n/bin/mount /dev/sde1 /media/usb" >> /usr/lib/enigma2/python/Plugins/Extensions/NeoBoot/files/mountpoint.sh') + elif getNeoMount2() == 'usb_install_/dev/sdf1': + os.system('echo "umount /media/usb\nmkdir -p /media/usb\n/bin/mount /dev/sdf1 /media/usb" >> /usr/lib/enigma2/python/Plugins/Extensions/NeoBoot/files/mountpoint.sh') + + if not fileExists('/usr/lib/enigma2/python/Plugins/Extensions/NeoBoot/files/neo.sh'): + if getINSTALLNeo() == '/dev/sda1': + out = open('/usr/lib/enigma2/python/Plugins/Extensions/NeoBoot/files/neo.sh', 'w') + out.write('#!/bin/sh\n#DESCRIPTION=This script by gutosie\n\n/bin/mount /dev/sda1 ' + getNeoLocation() + ' \n') + out.close() + elif getINSTALLNeo() == '/dev/sdb1': + out = open('/usr/lib/enigma2/python/Plugins/Extensions/NeoBoot/files/neo.sh', 'w') + out.write('#!/bin/sh\n#DESCRIPTION=This script by gutosie\n\n/bin/mount /dev/sdb1 ' + getNeoLocation() + ' \n') + out.close() + elif getINSTALLNeo() == '/dev/sda2': + out = open('/usr/lib/enigma2/python/Plugins/Extensions/NeoBoot/files/neo.sh', 'w') + out.write('#!/bin/sh\n#DESCRIPTION=This script by gutosie\n\n/bin/mount /dev/sda2 ' + getNeoLocation() + ' \n') + out.close() + elif getINSTALLNeo() == '/dev/sdb2': + out = open('/usr/lib/enigma2/python/Plugins/Extensions/NeoBoot/files/neo.sh', 'w') + out.write('#!/bin/sh\n#DESCRIPTION=This script by gutosie\n\n/bin/mount /dev/sdb2 ' + getNeoLocation() + ' \n') + out.close() + elif getINSTALLNeo() == '/dev/sdc1': + out = open('/usr/lib/enigma2/python/Plugins/Extensions/NeoBoot/files/neo.sh', 'w') + out.write('#!/bin/sh\n#DESCRIPTION=This script by gutosie\n\n/bin/mount /dev/sdc1 ' + getNeoLocation() + ' \n') + out.close() + elif getINSTALLNeo() == '/dev/sdd1': + out = open('/usr/lib/enigma2/python/Plugins/Extensions/NeoBoot/files/neo.sh', 'w') + out.write('#!/bin/sh\n#DESCRIPTION=This script by gutosie\n\n/bin/mount /dev/sdd1 ' + getNeoLocation() + ' \n') + out.close() + elif getINSTALLNeo() == '/dev/sde1': + out = open('/usr/lib/enigma2/python/Plugins/Extensions/NeoBoot/files/neo.sh', 'w') + out.write('#!/bin/sh\n#DESCRIPTION=This script by gutosie\n\n/bin/mount /dev/sde1 ' + getNeoLocation() + ' \n') + out.close() + elif getINSTALLNeo() == '/dev/sdf1': + out = open('/usr/lib/enigma2/python/Plugins/Extensions/NeoBoot/files/neo.sh', 'w') + out.write('#!/bin/sh\n#DESCRIPTION=This script by gutosie\n\n/bin/mount /dev/sdf1 ' + getNeoLocation() + ' \n') + out.close() + system('chmod 755 /usr/lib/enigma2/python/Plugins/Extensions/NeoBoot/files/neo.sh') + + if not fileExists('/usr/lib/enigma2/python/Plugins/Extensions/NeoBoot/files/neom'): + os.system('/usr/lib/enigma2/python/Plugins/Extensions/NeoBoot/files/neo_location; chmod 0755 /usr/lib/enigma2/python/Plugins/Extensions/NeoBoot/files/neom') + + + if fileExists('/tmp/.init_reboot'): + system('rm /tmp/.init_reboot') + + if fileExists('/.multinfo'): + if not fileExists('/.control_ok'): + if fileExists('/.control_boot_new_image'): + os.system('rm -f /.control_boot_new_image; echo "Image uruchomione OK\nNie kasuj tego pliku. \n\nImage started OK\nDo not delete this file." > /.control_ok ') + if not fileExists('/.control_boot_new_image'): + os.system('echo "Image uruchomione OK\nNie kasuj tego pliku. \n\nImage started OK\nDo not delete this file." > /.control_ok') + #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 os.path.exists('/proc/stb/info/boxtype'): + if getBoxHostName() == 'zgemmah9s': + os.system('mkdir -p /media/mmc; mount /dev/mmcblk0p7 /media/mmc') + + if getBoxHostName == 'sf8008': + os.system('mkdir -p /media/mmc; mount /dev/mmcblk0p13 /media/mmc') + + if getBoxHostName == 'ax60': + os.system('mkdir -p /media/mmc; mount /dev/mmcblk0p21 /media/mmc') + + if getBoxHostName() == 'ustym4kpro' or getTunerModel() == 'ustym4kpro': + os.system('mkdir -p /media/mmc; mount /dev/mmcblk0p13 /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() == 'uno4kse' or getBoxVuModel() == 'uno4k' or getBoxVuModel() == 'ultimo4k' or getBoxVuModel() == 'solo4k': + os.system('mkdir -p /media/mmc; mount /dev/mmcblk0p4 /media/mmc') + + if getBoxVuModel() == 'zero4k': + 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') + + if getCPUSoC() == 'bcm7252s' or getBoxHostName() == 'gbquad4k': + os.system('mkdir -p /media/mmc; mount /dev/mmcblk0p5 /media/mmc') + + #if getBoxHostName == 'osmio4k': + #os.system('mkdir -p /media/mmc; mount /dev/mmcblk0p5 /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(_('Reinstall NeoBoot')) + 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.ReinstallNeoBoot, + '3': self.ReinstallKernel, + 'back': self.close_exit}) + if not fileExists('/etc/name'): + os.system('touch /etc/name') + self.onShow.append(self.updateList) + + def chackkernel(self): + + message = _('NeoBoot wykryl niezgodnos kernela w flash, \nZainstalowac kernel dla flash image ? ?') + ybox = self.session.openWithCallback(self.updatekernel, MessageBox, message, MessageBox.TYPE_YESNO) + ybox.setTitle(_('Updating ... ')) + 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 ReinstallNeoBoot(self): + + INSTALLbox = self.session.openWithCallback(self.reinstallboot, MessageBox, _('Wybierz Tak, by przeinstalować neoboota.\n NEOBOOT.'), MessageBox.TYPE_YESNO) + INSTALLbox.setTitle(_('Zainstalować ponownie neoboota ?')) + + def reinstallboot(self, answer): + + if answer is True: + try: + cmd = "echo -e '\n\n%s '" % _('NEOBOOT - Please reinstall NeoBoot....\nPlease wait, done...\nrestart systemu...') + cmd1 = 'cd /usr/lib/enigma2/python/Plugins/Extensions/NeoBoot/; rm ./.location; rm ./files/mountpoint.sh; rm ./files/neom; rm ./files/neo.sh; sleep 5; killall -9 enigma2 ' + except: + False + self.session.open(Console, _('NeoBoot ARM....'), [cmd, cmd1]) + self.close() + else: + try: + self.session.open(MessageBox, _('Rezygnacja.'), MessageBox.TYPE_INFO, 4) + self.close() + except: + False + + def close_exit(self): + + system('touch /tmp/.init_reboot') + if not fileExists('/.multinfo'): + out = open('%sImageBoot/.neonextboot' % getNeoLocation(), 'w' ) + out.write('Flash') + out.close() + self.close() + + if fileExists('/.multinfo'): + with open('%sImageBoot/.neonextboot' % getNeoLocation(), 'r' ) as f: + imagefile = f.readline().strip() + f.close() + out = open('%sImageBoot/.neonextboot'% getNeoLocation(), 'w' ) + out.write(imagefile) + out.close() + + else: + system('touch /tmp/.init_reboot') + out = open('%sImageBoot/.neonextboot' % getNeoLocation() , '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): + self.messagebox = self.session.open(MessageBox, _('Updated unnecessary, you have the latest version. Please try again later.'), MessageBox.TYPE_INFO, 8) + self.close() + + +##/////NA CZAS TESTU UPDATE ZATRZYMANE\\\\\#################################### + def STOPneoboot_update(self): + + if fileExists('/.multinfo'): + mess = _('Downloading available only from the image Flash.') + self.session.open(MessageBox, mess, MessageBox.TYPE_INFO) + else: + out = open('%sImageBoot/.neonextboot', 'w' % getNeoLocation()) + 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/neoboot2/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/neoboot2/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/neoboot2/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/neoboot2/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 ./neoboot2-master/NeoBoot /usr/lib/enigma2/python/Plugins/Extensions; rm -rf /tmp/neoboot2-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('') + + 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('%sImagesUpload' % getNeoLocation() ) + 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 %sImagesUpload directory is EMPTY !!!\nPlease upload the image files in .ZIP or .NFI formats to install. ' % getNeoLocation() ) + 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) + linesdevice = open('/usr/lib/enigma2/python/Plugins/Extensions/NeoBoot/.location', 'r').readlines() + deviceneo = linesdevice[0][0:-1] + device = deviceneo + 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') + + 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 + 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('%sImageBoot/.neonextboot', 'r' % getNeoLocation()) + 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('%sImageBoot/.Flash', 'w' % getNeoLocation()).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('%sImageBoot/.Flash', 'w' % getNeoLocation()).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('%sImageBoot/.Flash', 'w' % getNeoLocation()).write(image) + except: + False + + elif fileExists('%sImageBoot/.Flash' % getNeoLocation()): + f = open('%sImageBoot/.Flash', 'r' % getNeoLocation()) + 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('%sImageBoot/.neonextboot' % getNeoLocation() , 'r' ) + mypath3 = f2.readline().strip() + f2.close() + self['label6'].setText(mypath3) + mypath = ('%sImageBoot' % getNeoLocation()) + 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('%sImagesUpload/.kernel/used_flash_kernel' % getNeoLocation() )) + 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('%sImageBoot/.neonextboot' % getNeoLocation(), '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('%sImageBoot/.neonextboot' % getNeoLocation(), '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 %sImageBoot/' % getNeoLocation() + 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'): + if getCPUSoC() or getBoxHostName() or getTunerModel() == ['zgemmah9s', + 'osmio4k', + 'bcm7252s', + 'gbquad4k', + 'ax60', + 'sf8008', + 'bcm7251', + 'sf4008', + 'bcm7251s', + '7241', + 'h7', + 'dm900', + 'BCM97252SSFF', + '7444s', + '7252s', + '7376', + '72604', + '7278', + '7335', + '7413', + '7325', + '7356', + 'bcm7356', + '7429', + '7424', + '7362', + 'bcm7362', + 'BCM7362', + 'bcm7358', + '7405', + '7405(with 3D)', + 'bcm7424', + 'vuultimo', + 'mbmini', + 'osmini', + 'mbultra', + 'ustym4kpro' + '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('%sImageBoot/.without_copying' % getNeoLocation() ): + system('rm %sImageBoot/.without_copying' % getNeoLocation() ) + + if not os.path.exists('%sImagesUpload' % getNeoLocation()): + system('mkdir %sImagesUpload' % getNeoLocation()) + myimages = listdir('%sImagesUpload' % getNeoLocation()) + 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: + from Plugins.Extensions.NeoBoot.unpack import InstallImage + self.session.open(InstallImage) + else: + self.ImageSystem() + + def ImageSystem(self): + if fileExists('%sImageBoot/.neonextboot' % getNeoLocation()): + self.messagebox = self.session.open(MessageBox, _('[NeoBoot] The %sImagesUpload directory is EMPTY !!!\nPlease upload the image files in .ZIP or .NFI formats to install.\n' % getNeoLocation() ), 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('' + getNeoLocation() + '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() + + +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 main(session, **kwargs): + + if not fileExists('/usr/lib/enigma2/python/Plugins/Extensions/NeoBoot/files/neo.sh'): + pass + else: + if not fileExists('%sImageBoot/.version' % getNeoLocation()): + os.system('mkdir -p %s; sync; chmod 0755 /usr/lib/enigma2/python/Plugins/Extensions/NeoBoot/files/neo.sh; /usr/lib/enigma2/python/Plugins/Extensions/NeoBoot/files/neo.sh -i' % getNeoLocation()) + + version = 0 + if fileExists('%sImageBoot/.version' % getNeoLocation()): + f = open('%sImageBoot/.version' % getNeoLocation()) + version = float(f.read()) + f.close() + if fileExists('%sImageBoot/.neonextboot' % getNeoLocation()): + f2 = open('%sImageBoot/.neonextboot' % getNeoLocation(), '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 menu(menuid, **kwargs): + if menuid == 'mainmenu': + return [(_('NeoBOOT'), + main, + 'neo_boot', + 1)] + return [] + +from Plugins.Plugin import PluginDescriptor + +def Plugins(**kwargs): + return [PluginDescriptor(name='NeoBootUstym ', description='NeoBoot', where=PluginDescriptor.WHERE_MENU, fnc=menu), PluginDescriptor(name='NeoBoot', description=_('Installing multiple images'), icon='neo.png', where=PluginDescriptor.WHERE_PLUGINMENU, fnc=main)] + +####################### _(-_-)_ gutosie _(-_-)_ ####################### \ No newline at end of file diff --git a/NeoBoot/run.py b/NeoBoot/run.py new file mode 100644 index 0000000..f084cc9 --- /dev/null +++ b/NeoBoot/run.py @@ -0,0 +1,165 @@ +#!/usr/bin/python +# -*- coding: utf-8 -*- +#echo "Flash " >> '+ getImageNeoBoot() + 'ImagesUpload/.kernel/used_flash_kernel; + +from __init__ import _ +from Plugins.Extensions.NeoBoot.files.stbbranding import getNeoLocation, 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': + if not fileExists('%sImageBoot/%s/.control_ok' % ( getNeoLocation(), getImageNeoBoot())): + 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: + os.system('rm -rf %sImageBoot/%s/usr/bin/enigma2_pre_start.sh' % ( getNeoLocation(), getImageNeoBoot())) + self.StartImageInNeoBoot() + else: + os.system('rm -rf %sImageBoot/%s/usr/bin/enigma2_pre_start.sh' % ( getNeoLocation(), getImageNeoBoot())) + self.StartImageInNeoBoot() + + def StartImageInNeoBoot(self): + if getImageNeoBoot() != 'Flash': + if fileExists('%sImageBoot/%s/.control_ok' % ( getNeoLocation(), getImageNeoBoot())): + system('touch /tmp/.control_ok ') + else: + system('touch %sImageBoot/%s/.control_boot_new_image ' % ( getNeoLocation(), getImageNeoBoot() )) + + system('chmod 755 /usr/lib/enigma2/python/Plugins/Extensions/NeoBoot/files/kernel.sh; /usr/lib/enigma2/python/Plugins/Extensions/NeoBoot/files/neo_location') + 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;') + +#################_____ARM____########################## + + #VUPLUS ARM ultimo4k, solo4k, uno4k, uno4kse - mmcblk0p1.sh + if getCPUtype() == 'ARMv7' and getCPUSoC() or getBoxHostName() == ['7444s', + '7376', + '7252s', + 'vuultimo4k' + 'vusolo4k', + 'vuuno4k', + 'vuuno4kse'] : + if not fileExists('%sImagesUpload/.kernel/flash-kernel-%s.bin' % (getNeoLocation(), getBoxHostName()) ): + self.myclose2(_('\n\n\nError - w lokalizacji %sImagesUpload/.kernel/ \nnie odnaleziono pliku kernela flash-kernel-%s.bin ' % getNeoLocation(), getBoxHostName() )) + else: + if getImageNeoBoot() == 'Flash': + if fileExists('/.multinfo'): + cmd = "echo -e '\n\n%s '" % _('...............NEOBOOT - REBOOT...............\nPlease wait, in a moment the decoder will be restarted...') + cmd1 = 'cd /media/mmc; ln -sf "init.sysvinit" "/media/mmc/sbin/init"; /usr/lib/enigma2/python/Plugins/Extensions/NeoBoot/files/kernel.sh ' + + elif not fileExists('/.multinfo'): + cmd = "echo -e '\n\n%s '" % _('...............NEOBOOT - REBOOT...............\nPlease wait, in a moment the decoder will be restarted...') + cmd1 = 'sleep 5; ln -sf "init.sysvinit" "/sbin/init"; reboot -dfhi' + + elif getImageNeoBoot() != 'Flash': + if not fileExists('/.multinfo'): + if not fileExists('%sImageBoot/%s/boot/zImage.%s' % ( getNeoLocation(), getImageNeoBoot(), getBoxHostName())): + cmd = "echo -e '\n\n%s '" % _('...............NEOBOOT - REBOOT...............\nPlease wait, in a moment the decoder will be restarted...') + cmd1 = 'sleep 5; ln -sfn /sbin/neoinitarm /sbin/init; /etc/init.d/reboot' + + elif fileExists('%sImageBoot/%s/boot/zImage.%s' % ( getNeoLocation(), getImageNeoBoot(), getBoxHostName())): + cmd = "echo -e '\n\n%s '" % _('...............NEOBOOT - REBOOT...............\nPlease wait, in a moment the decoder will be restarted...') + cmd1 = 'ln -sfn /sbin/neoinitarmvu /sbin/init; /usr/lib/enigma2/python/Plugins/Extensions/NeoBoot/files/kernel.sh ' + + elif fileExists('/.multinfo'): + if not fileExists('%sImageBoot/%s/boot/zImage.%s' % ( getNeoLocation(), getImageNeoBoot(), getBoxHostName())): + cmd = "echo -e '\n\n%s '" % _('...............NEOBOOT - REBOOT...............\nPlease wait, in a moment the decoder will be restarted...') + cmd1 = 'dd if=' + getNeoLocation() + 'ImagesUpload/.kernel/flash-kernel-' + getBoxHostName() + '.bin of=/dev/mmcblk0p1; cd /media/mmc; ln -sf "neoinitarm" "/media/mmc/sbin/init" ; sleep 2; reboot -dfhi ' + + elif fileExists('%sImageBoot/%s/boot/zImage.%s' % ( getNeoLocation(), getImageNeoBoot(), getBoxHostName())): + cmd = "echo -e '\n\n%s '" % _('...............NEOBOOT - REBOOT...............\nPlease wait, in a moment the decoder will be restarted...') + cmd1 = 'cd /media/mmc; ln -sf "neoinitarmvu" "/media/mmc/sbin/init"; /usr/lib/enigma2/python/Plugins/Extensions/NeoBoot/files/kernel.sh ' + + self.session.open(Console, _('NeoBoot ARM VU+....'), [cmd, cmd1]) + self.close() + + + else: + os.system('echo "Flash " >> ' + getNeoLocation() + '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() + + def myclose2(self, message): + self.session.open(MessageBox, message, MessageBox.TYPE_INFO) + self.close()