#
# shchun : urllib interface...
# from web download a file....
#
#import runtime
#remind!! saving wget return value....
#remind!! monitoring local file size...
import threading, time, urllib, os
from roxiadebug import *
import config
class Dnloader:
def __init__(self, wget_cmd, localfilename=None, filesize=0, dofork=True, finish_cb=None):
print 'class Dnloader totfilesize', filesize
self.wget_cmd = wget_cmd
self.localfilename = localfilename
self.totfilesize = filesize
self.curfilesize = 0
self.finish_cb = finish_cb
self.finish_cb_called = False
self.retval = 0
self.dofork = dofork
# init progress report, periodic call of progress_cb, 1 sec
#runtime.evas.timeout_add(1000, self.progress_cb)
# forking
if self.dofork:
self.pid = os.fork()
if self.pid == 0: # child
self.wget_cmd = self.wget_cmd.strip()
cmds = self.wget_cmd.split(' ')
index = cmds.index("USERAGENT")
cmds[index] = "--user-agent=\"LG-Sandwich v%s\""%self.get_version()
if config.provision_debug :
print 'cmds=', cmds
os.execlp('/usr/local/bin/wget2', *cmds)
return True
elif self.pid < 0:
print '**** FORK ERROR ***'
return False
print 'DNLOADER cpid=', self.pid
else:
os.system(self.wget_cmd)
#print 'BEFORE waitpid'
#ret = os.waitpid(0, os.WNOHANG)
#print 'AFTER waitpid'
def get_version(self):
fp = file("/usr/local/lgvp/var/product_model.info")
version = fp.readline().split("#")[2].strip()
fp.close()
return version
def get_progress(self):
if not self.dofork:
if self.finish_cb:
self.finish_cb(0)
self.finish_cb_called = True
return 100
try:
#print 'get_progress 1'
if self.finish_cb_called:
print 'self.finish_cb_called = True'
return 100
procstat = self.get_proc_status()
print 'procstat =', procstat
if procstat == 'Z' or procstat == 'E':
wpid, ret = os.waitpid(0, os.WNOHANG)
print 'os wait pid 1'
print 'keck ret =', ret
print 'wpid ret = ', wpid
print 'self.pid = ', self.pid
ret = ret /256
#ret=int(hex(ret)[-2:]) # get lower bit
#print '>>>>>>>>>GET_PROC_STATUS', wpid, ret
#debugLogC( 'GET_PROC_STATUS wpid(%d), ret(%d), proc_stat(%s)'%(wpid, ret, procstat) )
# refer -- os.waitpid(self.vdciapp_pid, 0)
if self.finish_cb:
print 'ret =',ret
self.finish_cb(ret)
self.finish_cb_called = True
return 100
#print 'get_progress 2'
if self.localfilename == None:
return 0
#print 'get_progress 3'
try:
self.curfilesize = os.path.getsize(self.localfilename)
except:
print 'dnloader.py : the file is not exists yet', self.localfilename
self.curfilesize = 0
percent = self.curfilesize*100/self.totfilesize
print 'get_progress curfilesize totalfilesize percent', self.curfilesize, self.totfilesize, percent
return percent
except:
debugLogC('EXCEPT: dnloader.py')
# if file is not exists yet.
print 'the file is not exists yet', self.localfilename
return 0
def get_proc_status(self):
try:
strs = open('/proc/%d/stat'%self.pid).read().split(' ')
#print 'GET PROC_STATUS', strs
return strs[2]
except:
print 'exception : get_proc_status', self.pid # the process finished or file name error
return 'E'
if __name__ == '__main__':
global finflag, finflag2
finflag = 0
finflag2 = 0
#f_cmd = 'wget2 ftp://mdown:manual@222.114.39.54/MiscImage-1.0.0.tar'
f_cmd = 'wget2 ftp://sd@150.150.141.165/MiscImage-1.0.0.tar'
#f_name = 'MiscImage-1.0.0.tar'
f_name = '/tmp/down_file'
def fin_cb(ret):
global finflag
print 'fin_cb*** ret=', ret
finflag = 1
#os._exit(1)
dloader = Dnloader(f_cmd, f_name, filesize=13496992, finish_cb=fin_cb)
while finflag == 0:
proc_st = dloader.get_proc_status()
print 'main loop ', proc_st , dloader.get_progress()
if proc_st == '0':
os._exit(1)
time.sleep(1)
def fin_cb2(ret):
global finflag2
print 'fin_cb*** ret=', ret
finflag2 = 1
#os._exit(1)
cmd= 'update-helper copy /tmp/down_file'
updater = BgForkExec(cmd, finish_cb=fin_cb2)
while finflag2 == 0:
proc_st = updater.get_proc_status()
print 'main loop ', proc_st , updater.get_progress()
if proc_st == '0':
os._exit(1)
time.sleep(1)