179 lines
		
	
	
		
			4.8 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			179 lines
		
	
	
		
			4.8 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
	
	
	
| #!/usr/bin/python
 | |
| 
 | |
| from __future__ import absolute_import, print_function, unicode_literals
 | |
| 
 | |
| from optparse import OptionParser
 | |
| import os.path
 | |
| import sys
 | |
| import dbus
 | |
| import dbus.service
 | |
| import dbus.mainloop.glib
 | |
| try:
 | |
|   from gi.repository import GObject
 | |
| except ImportError:
 | |
|   import gobject as GObject
 | |
| 
 | |
| BUS_NAME='org.bluez.obex'
 | |
| PATH = '/org/bluez/obex'
 | |
| CLIENT_INTERFACE='org.bluez.obex.Client1'
 | |
| SESSION_INTERFACE='org.bluez.obex.Session1'
 | |
| FILE_TRASNFER_INTERFACE='org.bluez.obex.FileTransfer1'
 | |
| TRANSFER_INTERFACE='org.bluez.obex.Transfer1'
 | |
| 
 | |
| def parse_options():
 | |
| 	parser.add_option("-d", "--device", dest="device",
 | |
| 			help="Device to connect", metavar="DEVICE")
 | |
| 	parser.add_option("-c", "--chdir", dest="new_dir",
 | |
| 			help="Change current directory to DIR", metavar="DIR")
 | |
| 	parser.add_option("-l", "--list", action="store_true", dest="list_dir",
 | |
| 			help="List the current directory")
 | |
| 	parser.add_option("-g", "--get", dest="get_file",
 | |
| 			help="Get FILE", metavar="FILE")
 | |
| 	parser.add_option("-p", "--put", dest="put_file",
 | |
| 			help="Put FILE", metavar="FILE")
 | |
| 	parser.add_option("-y", "--copy", dest="copy_file",
 | |
| 			help="Copy FILE", metavar="FILE")
 | |
| 	parser.add_option("-m", "--move", dest="move_file",
 | |
| 			help="Move FILE", metavar="FILE")
 | |
| 	parser.add_option("-n", "--destname", dest="dest_file",
 | |
| 			help="Destination FILE", metavar="FILE")
 | |
| 	parser.add_option("-r", "--remove", dest="remove_file",
 | |
| 			help="Remove FILE", metavar="FILE")
 | |
| 	parser.add_option("-v", "--verbose", action="store_true",
 | |
| 			dest="verbose")
 | |
| 
 | |
| 	return parser.parse_args()
 | |
| 
 | |
| class FtpClient:
 | |
| 	def __init__(self, session_path, verbose=False):
 | |
| 		self.transferred = 0
 | |
| 		self.transfer_path = None
 | |
| 		self.transfer_size = 0
 | |
| 		self.verbose = verbose
 | |
| 		bus = dbus.SessionBus()
 | |
| 		obj = bus.get_object(BUS_NAME, session_path)
 | |
| 		self.session = dbus.Interface(obj, SESSION_INTERFACE)
 | |
| 		self.ftp = dbus.Interface(obj, FILE_TRASNFER_INTERFACE)
 | |
| 		bus.add_signal_receiver(self.properties_changed,
 | |
| 			dbus_interface="org.freedesktop.DBus.Properties",
 | |
| 			signal_name="PropertiesChanged",
 | |
| 			path_keyword="path")
 | |
| 
 | |
| 	def create_transfer_reply(self, path, properties):
 | |
| 		self.transfer_path = path
 | |
| 		self.transfer_size = properties["Size"]
 | |
| 		if self.verbose:
 | |
| 			print("Transfer created: %s" % path)
 | |
| 
 | |
| 	def generic_reply(self):
 | |
| 		if self.verbose:
 | |
| 			print("Operation succeeded")
 | |
| 
 | |
| 	def error(self, err):
 | |
| 		print(err)
 | |
| 		mainloop.quit()
 | |
| 
 | |
| 	def properties_changed(self, interface, properties, invalidated, path):
 | |
| 		if path != self.transfer_path:
 | |
| 			return
 | |
| 
 | |
| 		if properties['Status'] == 'complete' or \
 | |
| 				properties['Status'] == 'error':
 | |
| 			if self.verbose:
 | |
| 				print("Transfer %s" % properties['Status'])
 | |
| 			mainloop.quit()
 | |
| 			return
 | |
| 
 | |
| 		if properties["Transferred"] == None:
 | |
| 			return
 | |
| 
 | |
| 		speed = (value - self.transferred) / 1000
 | |
| 		print("Transfer progress %d/%d at %d kBps" % (value,
 | |
| 							self.transfer_size,
 | |
| 							speed))
 | |
| 		self.transferred = value
 | |
| 
 | |
| 	def change_folder(self, new_dir):
 | |
| 		for node in new_dir.split("/"):
 | |
| 			self.ftp.ChangeFolder(node)
 | |
| 
 | |
| 	def list_folder(self):
 | |
| 		for i in self.ftp.ListFolder():
 | |
| 			if i["Type"] == "folder":
 | |
| 				print("%s/" % (i["Name"]))
 | |
| 			else:
 | |
| 				print("%s" % (i["Name"]))
 | |
| 
 | |
| 	def put_file(self, filename):
 | |
| 		self.ftp.PutFile(os.path.abspath(filename),
 | |
| 				os.path.basename(filename),
 | |
| 				reply_handler=self.create_transfer_reply,
 | |
| 				error_handler=self.error)
 | |
| 
 | |
| 	def get_file(self, filename):
 | |
| 		self.ftp.GetFile(os.path.abspath(filename),
 | |
| 				os.path.basename(filename),
 | |
| 				reply_handler=self.create_transfer_reply,
 | |
| 				error_handler=self.error)
 | |
| 
 | |
| 	def remove_file(self, filename):
 | |
| 		self.ftp.Delete(filename,
 | |
| 				reply_handler=self.generic_reply,
 | |
| 				error_handler=self.error)
 | |
| 
 | |
| 	def move_file(self, filename, destname):
 | |
| 		self.ftp.MoveFile(filename, destname,
 | |
| 				reply_handler=self.generic_reply,
 | |
| 				error_handler=self.error)
 | |
| 
 | |
| 	def copy_file(self, filename, destname):
 | |
| 		self.ftp.CopyFile(filename, destname,
 | |
| 				reply_handler=self.generic_reply,
 | |
| 				error_handler=self.error)
 | |
| 
 | |
| if  __name__ == '__main__':
 | |
| 
 | |
| 	dbus.mainloop.glib.DBusGMainLoop(set_as_default=True)
 | |
| 
 | |
| 	parser = OptionParser()
 | |
| 
 | |
| 	(options, args) = parse_options()
 | |
| 
 | |
| 	if not options.device:
 | |
| 		parser.print_help()
 | |
| 		sys.exit(0)
 | |
| 
 | |
| 	bus = dbus.SessionBus()
 | |
| 	mainloop = GObject.MainLoop()
 | |
| 
 | |
| 	client = dbus.Interface(bus.get_object(BUS_NAME, PATH,),
 | |
| 							CLIENT_INTERFACE)
 | |
| 
 | |
| 	print("Creating Session")
 | |
| 	path = client.CreateSession(options.device, { "Target": "ftp" })
 | |
| 
 | |
| 	ftp_client = FtpClient(path, options.verbose)
 | |
| 
 | |
| 	if options.new_dir:
 | |
| 		ftp_client.change_folder(options.new_dir)
 | |
| 
 | |
| 	if options.list_dir:
 | |
| 		ftp_client.list_folder()
 | |
| 
 | |
| 	if options.get_file:
 | |
| 		ftp_client.get_file(options.get_file)
 | |
| 
 | |
| 	if options.put_file:
 | |
| 		ftp_client.put_file(options.put_file)
 | |
| 
 | |
| 	if options.move_file:
 | |
| 		ftp_client.move_file(options.move_file, options.dest_file)
 | |
| 
 | |
| 	if options.copy_file:
 | |
| 		ftp_client.copy_file(options.copy_file, options.dest_file)
 | |
| 
 | |
| 	if options.remove_file:
 | |
| 		ftp_client.remove_file(options.remove_file)
 | |
| 
 | |
| 	mainloop.run()
 | 
