Windows LPC Upload for non-admins (#20208)
Co-authored-by: Victor Mateus Oliveira <rhapsodyv@gmail.com> Co-authored-by: Scott Lahteine <github@thinkyhead.com>
This commit is contained in:
		@@ -23,63 +23,50 @@ def print_error(e):
 | 
			
		||||
		  %(e, env.get('PIOENV')))
 | 
			
		||||
 | 
			
		||||
try:
 | 
			
		||||
	#
 | 
			
		||||
	# Find a disk for upload
 | 
			
		||||
	#
 | 
			
		||||
	upload_disk = 'Disk not found'
 | 
			
		||||
	target_file_found = False
 | 
			
		||||
	target_drive_found = False
 | 
			
		||||
	if current_OS == 'Windows':
 | 
			
		||||
		#
 | 
			
		||||
		# platformio.ini will accept this for a Windows upload port designation: 'upload_port = L:'
 | 
			
		||||
		#   Windows - doesn't care about the disk's name, only cares about the drive letter
 | 
			
		||||
		#
 | 
			
		||||
 | 
			
		||||
		#
 | 
			
		||||
		# get all drives on this computer
 | 
			
		||||
		#
 | 
			
		||||
		import subprocess
 | 
			
		||||
		# typical result (string): 'Drives: C:\ D:\ E:\ F:\ G:\ H:\ I:\ J:\ K:\ L:\ M:\ Y:\ Z:\'
 | 
			
		||||
		driveStr = str(subprocess.check_output("fsutil fsinfo drives"))
 | 
			
		||||
		# typical result (string): 'C:\ D:\ E:\ F:\ G:\ H:\ I:\ J:\ K:\ L:\ M:\ Y:\ Z:\'
 | 
			
		||||
		# driveStr = driveStr.strip().lstrip('Drives: ') <- Doesn't work in other Languages as English. In German is "Drives:" = "Laufwerke:"
 | 
			
		||||
		FirstFound = driveStr.find(':',0,-1)         # Find the first ":" and
 | 
			
		||||
		driveStr = driveStr[FirstFound + 1 : -1]     # truncate to the rest
 | 
			
		||||
		# typical result (array of stings): ['C:\\', 'D:\\', 'E:\\', 'F:\\',
 | 
			
		||||
		# 'G:\\', 'H:\\', 'I:\\', 'J:\\', 'K:\\', 'L:\\', 'M:\\', 'Y:\\', 'Z:\\']
 | 
			
		||||
		drives = driveStr.split()
 | 
			
		||||
		from ctypes import windll
 | 
			
		||||
		import string
 | 
			
		||||
 | 
			
		||||
		# getting list of drives
 | 
			
		||||
		# https://stackoverflow.com/questions/827371/is-there-a-way-to-list-all-the-available-drive-letters-in-python
 | 
			
		||||
		drives = []
 | 
			
		||||
		bitmask = windll.kernel32.GetLogicalDrives()
 | 
			
		||||
		for letter in string.ascii_uppercase:
 | 
			
		||||
			if bitmask & 1:
 | 
			
		||||
				drives.append(letter)
 | 
			
		||||
			bitmask >>= 1
 | 
			
		||||
 | 
			
		||||
		upload_disk = 'Disk not found'
 | 
			
		||||
		target_file_found = False
 | 
			
		||||
		target_drive_found = False
 | 
			
		||||
		for drive in drives:
 | 
			
		||||
			final_drive_name = drive.strip().rstrip('\\')   # typical result (string): 'C:'
 | 
			
		||||
			final_drive_name = drive + ':\\'
 | 
			
		||||
			# print ('disc check: {}'.format(final_drive_name))
 | 
			
		||||
			try:
 | 
			
		||||
				volume_info = str(subprocess.check_output('cmd /C dir ' + final_drive_name, stderr=subprocess.STDOUT))
 | 
			
		||||
			except Exception as e:
 | 
			
		||||
				print ('error:{}'.format(e))
 | 
			
		||||
				continue
 | 
			
		||||
			else:
 | 
			
		||||
				if target_drive in volume_info and target_file_found == False:  # set upload if not found target file yet
 | 
			
		||||
				if target_drive in volume_info and not target_file_found:  # set upload if not found target file yet
 | 
			
		||||
					target_drive_found = True
 | 
			
		||||
					upload_disk = final_drive_name
 | 
			
		||||
				if target_filename in volume_info:
 | 
			
		||||
					if target_file_found == False:
 | 
			
		||||
					if not target_file_found:
 | 
			
		||||
						upload_disk = final_drive_name
 | 
			
		||||
					target_file_found = True
 | 
			
		||||
 | 
			
		||||
		#
 | 
			
		||||
		# set upload_port to drive if found
 | 
			
		||||
		#
 | 
			
		||||
 | 
			
		||||
		if target_file_found == True or target_drive_found == True:
 | 
			
		||||
			env.Replace(
 | 
			
		||||
				UPLOAD_PORT=upload_disk
 | 
			
		||||
			)
 | 
			
		||||
			print('upload disk: ', upload_disk)
 | 
			
		||||
		else:
 | 
			
		||||
			print_error('Autodetect Error')
 | 
			
		||||
 | 
			
		||||
	elif current_OS == 'Linux':
 | 
			
		||||
		#
 | 
			
		||||
		# platformio.ini will accept this for a Linux upload port designation: 'upload_port = /media/media_name/drive'
 | 
			
		||||
		#
 | 
			
		||||
		upload_disk = 'Disk not found'
 | 
			
		||||
		target_file_found = False
 | 
			
		||||
		target_drive_found = False
 | 
			
		||||
		drives = os.listdir(os.path.join(os.sep, 'media', getpass.getuser()))
 | 
			
		||||
		if target_drive in drives:  # If target drive is found, use it.
 | 
			
		||||
			target_drive_found = True
 | 
			
		||||
@@ -101,22 +88,15 @@ try:
 | 
			
		||||
 | 
			
		||||
		if target_file_found or target_drive_found:
 | 
			
		||||
			env.Replace(
 | 
			
		||||
				UPLOAD_FLAGS="-P$UPLOAD_PORT",
 | 
			
		||||
				UPLOAD_PORT=upload_disk
 | 
			
		||||
				UPLOAD_FLAGS="-P$UPLOAD_PORT"
 | 
			
		||||
			)
 | 
			
		||||
			print('upload disk: ', upload_disk)
 | 
			
		||||
		else:
 | 
			
		||||
			print_error('Autodetect Error')
 | 
			
		||||
 | 
			
		||||
	elif current_OS == 'Darwin':  # MAC
 | 
			
		||||
		#
 | 
			
		||||
		# platformio.ini will accept this for a OSX upload port designation: 'upload_port = /media/media_name/drive'
 | 
			
		||||
		#
 | 
			
		||||
		upload_disk = 'Disk not found'
 | 
			
		||||
		drives = os.listdir('/Volumes')  # human readable names
 | 
			
		||||
		target_file_found = False
 | 
			
		||||
		target_drive_found = False
 | 
			
		||||
		if target_drive in drives and target_file_found == False:  # set upload if not found target file yet
 | 
			
		||||
		if target_drive in drives and not target_file_found:  # set upload if not found target file yet
 | 
			
		||||
			target_drive_found = True
 | 
			
		||||
			upload_disk = '/Volumes/' + target_drive + '/'
 | 
			
		||||
		for drive in drives:
 | 
			
		||||
@@ -126,20 +106,18 @@ try:
 | 
			
		||||
				continue
 | 
			
		||||
			else:
 | 
			
		||||
				if target_filename in filenames:
 | 
			
		||||
					if target_file_found == False:
 | 
			
		||||
					if not target_file_found:
 | 
			
		||||
						upload_disk = '/Volumes/' + drive + '/'
 | 
			
		||||
					target_file_found = True
 | 
			
		||||
		#
 | 
			
		||||
		# set upload_port to drive if found
 | 
			
		||||
		#
 | 
			
		||||
 | 
			
		||||
		if target_file_found == True or target_drive_found == True:
 | 
			
		||||
			env.Replace(
 | 
			
		||||
				UPLOAD_PORT=upload_disk
 | 
			
		||||
			)
 | 
			
		||||
			print('\nupload disk: ', upload_disk, '\n')
 | 
			
		||||
		else:
 | 
			
		||||
			print_error('Autodetect Error')
 | 
			
		||||
	#
 | 
			
		||||
	# Set upload_port to drive if found
 | 
			
		||||
	#
 | 
			
		||||
	if target_file_found or target_drive_found:
 | 
			
		||||
		env.Replace(UPLOAD_PORT=upload_disk)
 | 
			
		||||
		print('\nUpload disk: ', upload_disk, '\n')
 | 
			
		||||
	else:
 | 
			
		||||
		print_error('Autodetect Error')
 | 
			
		||||
 | 
			
		||||
except Exception as e:
 | 
			
		||||
	print_error(str(e))
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user