Newer
Older
Import / projects / LGN-IP3870 / t / orig / dnloader.py

#
# 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)