Additional drive_dir/input_dir updates
Some checks failed
Build and test GAM / build (false, build, 1, Build Intel Ubuntu Jammy, ubuntu-22.04) (push) Has been cancelled
Build and test GAM / build (false, build, 10, Build x86_64 macOS 15, macos-15-intel) (push) Has been cancelled
Build and test GAM / build (false, build, 11, Build Arm MacOS 26, macos-26) (push) Has been cancelled
Build and test GAM / build (false, build, 12, Build Intel Windows, windows-2025) (push) Has been cancelled
Build and test GAM / build (false, build, 13, Build Arm Windows, windows-11-arm) (push) Has been cancelled
Build and test GAM / build (false, build, 2, Build Intel Ubuntu Noble, ubuntu-24.04) (push) Has been cancelled
Build and test GAM / build (false, build, 3, Build Arm Ubuntu Noble, ubuntu-24.04-arm) (push) Has been cancelled
Build and test GAM / build (false, build, 4, Build Arm Ubuntu Jammy, ubuntu-22.04-arm) (push) Has been cancelled
Build and test GAM / build (false, build, 5, Build Intel StaticX Legacy, ubuntu-22.04, yes) (push) Has been cancelled
Build and test GAM / build (false, build, 6, Build Arm StaticX Legacy, ubuntu-22.04-arm, yes) (push) Has been cancelled
Build and test GAM / build (false, build, 8, Build Arm MacOS 14, macos-14) (push) Has been cancelled
Build and test GAM / build (false, build, 9, Build Arm MacOS 15, macos-15) (push) Has been cancelled
Build and test GAM / build (false, test, 14, Test Python 3.10, ubuntu-24.04, 3.10) (push) Has been cancelled
Build and test GAM / build (false, test, 15, Test Python 3.11, ubuntu-24.04, 3.11) (push) Has been cancelled
Build and test GAM / build (false, test, 16, Test Python 3.12, ubuntu-24.04, 3.12) (push) Has been cancelled
Build and test GAM / build (false, test, 17, Test Python 3.15-dev, ubuntu-24.04, 3.15-dev) (push) Has been cancelled
Build and test GAM / build (true, test, 18, Test Python 3.14 freethread, ubuntu-24.04, 3.14) (push) Has been cancelled
CodeQL / Analyze (python) (push) Has been cancelled
Check for Google Root CA Updates / check-certs (push) Has been cancelled
Build and test GAM / merge (push) Has been cancelled
Build and test GAM / publish (push) Has been cancelled

This commit is contained in:
Ross Scroggs
2025-12-14 20:22:15 -08:00
parent df75bb9623
commit 1628a42569
2 changed files with 32 additions and 34 deletions

View File

@@ -18,7 +18,7 @@ noreminders|(reminder email|popup <Number>)+
7.30.00 7.30.00
Added `input_dir` directory variable to `gam.cfg` that is used to select a directory for reading files with non-absolute file names. Added `input_dir` directory variable to `gam.cfg` that is used to select a directory for reading files with non-absolute file names.
The default is an empty string that matches the current behavior where these files are read from the current working directory. The default is '.' that matches the current behavior where these files are read from the current working directory.
This will be most useful in multiple domain situations where each domain will have distinct `drive_dir` and `input_dir` values. This will be most useful in multiple domain situations where each domain will have distinct `drive_dir` and `input_dir` values.
Added support for the new resource calendar setting `autoAcceptInvitations`. Added support for the new resource calendar setting `autoAcceptInvitations`.

View File

@@ -23142,15 +23142,17 @@ def _processPeopleContactPhotos(users, function):
sources = [PEOPLE_READ_SOURCES_CHOICE_MAP['domaincontact']] sources = [PEOPLE_READ_SOURCES_CHOICE_MAP['domaincontact']]
entityList, resourceNameLists, contactQuery, queriedContacts = _getPeopleContactEntityList(entityType, 1) entityList, resourceNameLists, contactQuery, queriedContacts = _getPeopleContactEntityList(entityType, 1)
if function in {'updateContactPhoto', 'getContactPhoto'}: if function in {'updateContactPhoto', 'getContactPhoto'}:
targetFolder = os.getcwd() sourceFolder = targetFolder = os.getcwd()
filenamePattern = '#contactid#.jpg' filenamePattern = '#contactid#.jpg'
while Cmd.ArgumentsRemaining(): while Cmd.ArgumentsRemaining():
myarg = getArgument() myarg = getArgument()
if myarg == 'drivedir': if myarg == 'drivedir':
targetFolder = GC.Values[GC.DRIVE_DIR] targetFolder = GC.Values[GC.DRIVE_DIR]
elif myarg in {'sourcefolder', 'targetfolder'}: elif myarg == 'sourcefolder':
targetFolder = os.path.expanduser(getString(Cmd.OB_FILE_PATH)) sourceFolder = setFilePath(getString(Cmd.OB_FILE_PATH), GC.INPUT_DIR)
if function == 'GetContactPhoto' and not os.path.isdir(targetFolder): elif myarg == 'targetfolder':
targetFolder = setFilePath(getString(Cmd.OB_FILE_PATH), GC.DRIVE_DIR)
if not os.path.isdir(targetFolder):
os.makedirs(targetFolder) os.makedirs(targetFolder)
elif myarg == 'filename': elif myarg == 'filename':
filenamePattern = getString(Cmd.OB_FILE_NAME_PATTERN) filenamePattern = getString(Cmd.OB_FILE_NAME_PATTERN)
@@ -23211,8 +23213,8 @@ def _processPeopleContactPhotos(users, function):
if function == 'updateContactPhoto': if function == 'updateContactPhoto':
if subForContactId or subForEmail: if subForContactId or subForEmail:
filename = _makeFilenameFromPattern(resourceName) filename = _makeFilenameFromPattern(resourceName)
filename = os.path.join(targetFolder, filename) filename = os.path.join(sourceFolder, filename)
with open(os.path.expanduser(filename), 'rb') as f: with open(filename, 'rb') as f:
image_data = f.read() image_data = f.read()
callGAPI(people.people(), function, callGAPI(people.people(), function,
throwReasons=[GAPI.NOT_FOUND, GAPI.INVALID_ARGUMENT, GAPI.INTERNAL_ERROR]+GAPI.PEOPLE_ACCESS_THROW_REASONS, throwReasons=[GAPI.NOT_FOUND, GAPI.INVALID_ARGUMENT, GAPI.INTERNAL_ERROR]+GAPI.PEOPLE_ACCESS_THROW_REASONS,
@@ -24349,7 +24351,7 @@ def infoCrOSDevices(entityList):
Cmd.Backup() Cmd.Backup()
downloadfile = formatLocalTime(getTimeOrDeltaFromNow()) downloadfile = formatLocalTime(getTimeOrDeltaFromNow())
elif myarg == 'targetfolder': elif myarg == 'targetfolder':
targetFolder = os.path.expanduser(getString(Cmd.OB_FILE_PATH)) targetFolder = setFilePath(getString(Cmd.OB_FILE_PATH), GC.DRIVE_DIR)
if not os.path.isdir(targetFolder): if not os.path.isdir(targetFolder):
os.makedirs(targetFolder) os.makedirs(targetFolder)
elif myarg == 'showdvrsfp': elif myarg == 'showdvrsfp':
@@ -24637,7 +24639,7 @@ def getCrOSDeviceFiles(entityList):
if myarg == 'select': if myarg == 'select':
deviceFilesEntity = getDeviceFilesEntity() deviceFilesEntity = getDeviceFilesEntity()
elif myarg == 'targetfolder': elif myarg == 'targetfolder':
targetFolder = os.path.expanduser(getString(Cmd.OB_FILE_PATH)) targetFolder = setFilePath(getString(Cmd.OB_FILE_PATH), GC.DRIVE_DIR)
if not os.path.isdir(targetFolder): if not os.path.isdir(targetFolder):
os.makedirs(targetFolder) os.makedirs(targetFolder)
else: else:
@@ -26609,7 +26611,7 @@ def createChatEmoji(users):
if myarg == 'drivedir': if myarg == 'drivedir':
sourceFolder = GC.Values[GC.DRIVE_DIR] sourceFolder = GC.Values[GC.DRIVE_DIR]
elif myarg == 'sourcefolder': elif myarg == 'sourcefolder':
sourceFolder = os.path.expanduser(getString(Cmd.OB_FILE_PATH)) sourceFolder = setFilePath(getString(Cmd.OB_FILE_PATH), GC.INPUT_DIR)
if not os.path.isdir(sourceFolder): if not os.path.isdir(sourceFolder):
entityDoesNotExistExit(Ent.DIRECTORY, sourceFolder) entityDoesNotExistExit(Ent.DIRECTORY, sourceFolder)
elif myarg == 'filename': elif myarg == 'filename':
@@ -26623,10 +26625,7 @@ def createChatEmoji(users):
if not chat: if not chat:
continue continue
user, userName, _ = splitEmailAddressOrUID(user) user, userName, _ = splitEmailAddressOrUID(user)
filename = _substituteForUser(filenamePattern, user, userName) filename = os.path.join(sourceFolder, _substituteForUser(filenamePattern, user, userName))
if sourceFolder is not None:
filename = os.path.join(sourceFolder, filename)
filename = os.path.expanduser(filename)
try: try:
with open(filename, 'rb') as f: with open(filename, 'rb') as f:
image_data = f.read() image_data = f.read()
@@ -29809,7 +29808,7 @@ def doCreateChromePolicyImage():
parent = _getCustomersCustomerIdWithC() parent = _getCustomersCustomerIdWithC()
schema = getChoice(CHROME_IMAGE_SCHEMAS_MAP, mapChoice=True) schema = getChoice(CHROME_IMAGE_SCHEMAS_MAP, mapChoice=True)
parameters = {DFA_URL: None} parameters = {DFA_URL: None}
parameters[DFA_LOCALFILEPATH] = os.path.expanduser(getString(Cmd.OB_FILE_NAME)) parameters[DFA_LOCALFILEPATH] = setFilePath(getString(Cmd.OB_FILE_NAME), GC.INPUT_DIR)
try: try:
f = open(parameters[DFA_LOCALFILEPATH], 'rb') f = open(parameters[DFA_LOCALFILEPATH], 'rb')
f.close() f.close()
@@ -41991,7 +41990,7 @@ def doDownloadCloudStorageBucket():
while Cmd.ArgumentsRemaining(): while Cmd.ArgumentsRemaining():
myarg = getArgument() myarg = getArgument()
if myarg == 'targetfolder': if myarg == 'targetfolder':
targetFolder = os.path.expanduser(getString(Cmd.OB_FILE_PATH)) targetFolder = setFilePath(getString(Cmd.OB_FILE_PATH), GC.DRIVE_DIR)
if not os.path.isdir(targetFolder): if not os.path.isdir(targetFolder):
os.makedirs(targetFolder) os.makedirs(targetFolder)
else: else:
@@ -42030,7 +42029,7 @@ def doDownloadCloudStorageFile():
while Cmd.ArgumentsRemaining(): while Cmd.ArgumentsRemaining():
myarg = getArgument() myarg = getArgument()
if myarg == 'targetfolder': if myarg == 'targetfolder':
targetFolder = os.path.expanduser(getString(Cmd.OB_FILE_PATH)) targetFolder = setFilePath(getString(Cmd.OB_FILE_PATH), GC.DRIVE_DIR)
if not os.path.isdir(targetFolder): if not os.path.isdir(targetFolder):
os.makedirs(targetFolder) os.makedirs(targetFolder)
elif myarg == 'overwrite': elif myarg == 'overwrite':
@@ -42860,7 +42859,7 @@ def doDownloadVaultExport():
elif myarg == 'targetname': elif myarg == 'targetname':
targetName = getString(Cmd.OB_FILE_NAME) targetName = getString(Cmd.OB_FILE_NAME)
elif myarg == 'targetfolder': elif myarg == 'targetfolder':
targetFolder = os.path.expanduser(getString(Cmd.OB_FILE_PATH)) targetFolder = setFilePath(getString(Cmd.OB_FILE_PATH), GC.DRIVE_DIR)
if not os.path.isdir(targetFolder): if not os.path.isdir(targetFolder):
os.makedirs(targetFolder) os.makedirs(targetFolder)
elif myarg == 'noverify': elif myarg == 'noverify':
@@ -55752,7 +55751,7 @@ def getDriveFileCopyAttribute(myarg, body, parameters):
def getDriveFileAttribute(myarg, body, parameters, updateCmd): def getDriveFileAttribute(myarg, body, parameters, updateCmd):
if myarg == 'localfile': if myarg == 'localfile':
parameters[DFA_URL] = None parameters[DFA_URL] = None
parameters[DFA_LOCALFILEPATH] = os.path.expanduser(getString(Cmd.OB_FILE_NAME)) parameters[DFA_LOCALFILEPATH] = setFilePath(getString(Cmd.OB_FILE_NAME), GC.INPUT_DIR)
if parameters[DFA_LOCALFILEPATH] != '-': if parameters[DFA_LOCALFILEPATH] != '-':
try: try:
f = open(parameters[DFA_LOCALFILEPATH], 'rb') f = open(parameters[DFA_LOCALFILEPATH], 'rb')
@@ -63702,7 +63701,7 @@ def getDriveFile(users):
invalidChoiceExit(exportFormat, DOCUMENT_FORMATS_MAP, True) invalidChoiceExit(exportFormat, DOCUMENT_FORMATS_MAP, True)
defaultFormats = False defaultFormats = False
elif myarg == 'targetfolder': elif myarg == 'targetfolder':
targetFolderPattern = os.path.expanduser(getString(Cmd.OB_FILE_PATH)) targetFolderPattern = setFilePath(getString(Cmd.OB_FILE_PATH), GC.DRIVE_DIR)
elif myarg == 'targetname': elif myarg == 'targetname':
targetNamePattern = getString(Cmd.OB_FILE_NAME) targetNamePattern = getString(Cmd.OB_FILE_NAME)
targetStdout = targetNamePattern == '-' targetStdout = targetNamePattern == '-'
@@ -63914,7 +63913,7 @@ def getGoogleDocument(users):
if myarg == 'viewmode': if myarg == 'viewmode':
suggestionsViewMode = getChoice(SUGGESTIONS_VIEW_MODE_CHOICE_MAP, mapChoice=True) suggestionsViewMode = getChoice(SUGGESTIONS_VIEW_MODE_CHOICE_MAP, mapChoice=True)
elif myarg == 'targetfolder': elif myarg == 'targetfolder':
targetFolderPattern = os.path.expanduser(getString(Cmd.OB_FILE_PATH)) targetFolderPattern = setFilePath(getString(Cmd.OB_FILE_PATH), GC.DRIVE_DIR)
elif myarg == 'targetname': elif myarg == 'targetname':
targetNamePattern = getString(Cmd.OB_FILE_NAME) targetNamePattern = getString(Cmd.OB_FILE_NAME)
elif myarg == 'donotfollowshortcuts': elif myarg == 'donotfollowshortcuts':
@@ -67696,7 +67695,7 @@ def _getSharedDriveRestrictions(myarg, body):
def _checkSharedDriveRestrictions(body): def _checkSharedDriveRestrictions(body):
if 'restrictions' in body and 'copyRequiresWriterPermission' in body['restrictions'] and 'downloadRestriction' in body['restrictions']: if 'restrictions' in body and 'copyRequiresWriterPermission' in body['restrictions'] and 'downloadRestriction' in body['restrictions']:
usageErrorExit(Msg.ARE_MUTUALLY_EXCLUSIVE.format('copyrequireswriterpermission', 'downloadrestrictedforreaders|downloadrestrictedforwriters')) usageErrorExit(Msg.ARE_MUTUALLY_EXCLUSIVE.format('copyrequireswriterpermission', 'downloadrestrictedforreaders|downloadrestrictedforwriters'))
def _moveSharedDriveToOU(orgUnit, orgUnitId, driveId, user, i, count, ci, returnIdOnly): def _moveSharedDriveToOU(orgUnit, orgUnitId, driveId, user, i, count, ci, returnIdOnly):
action = Act.Get() action = Act.Get()
name = f'orgUnits/-/memberships/shared_drive;{driveId}' name = f'orgUnits/-/memberships/shared_drive;{driveId}'
@@ -70470,7 +70469,7 @@ def updatePhoto(users):
if myarg == 'drivedir': if myarg == 'drivedir':
sourceFolder = GC.Values[GC.DRIVE_DIR] sourceFolder = GC.Values[GC.DRIVE_DIR]
elif myarg == 'sourcefolder': elif myarg == 'sourcefolder':
sourceFolder = os.path.expanduser(getString(Cmd.OB_FILE_PATH)) sourceFolder = setFilePath(getString(Cmd.OB_FILE_PATH), GC.INPUT_DIR)
if not os.path.isdir(sourceFolder): if not os.path.isdir(sourceFolder):
entityDoesNotExistExit(Ent.DIRECTORY, sourceFolder) entityDoesNotExistExit(Ent.DIRECTORY, sourceFolder)
elif myarg == 'filename': elif myarg == 'filename':
@@ -70521,10 +70520,9 @@ def updatePhoto(users):
entityActionFailedWarning([Ent.USER, user, Ent.PHOTO, filename], str(e), i, count) entityActionFailedWarning([Ent.USER, user, Ent.PHOTO, filename], str(e), i, count)
continue continue
else: else:
if sourceFolder is not None: filename = os.path.join(sourceFolder, filename)
filename = os.path.join(sourceFolder, filename)
try: try:
with open(os.path.expanduser(filename), 'rb') as f: with open(filename, 'rb') as f:
image_data = f.read() image_data = f.read()
except (OSError, IOError) as e: except (OSError, IOError) as e:
entityActionFailedWarning([Ent.USER, user, Ent.PHOTO, filename], str(e), i, count) entityActionFailedWarning([Ent.USER, user, Ent.PHOTO, filename], str(e), i, count)
@@ -70571,7 +70569,7 @@ def getPhoto(users, profileMode):
if myarg == 'drivedir': if myarg == 'drivedir':
targetFolder = GC.Values[GC.DRIVE_DIR] targetFolder = GC.Values[GC.DRIVE_DIR]
elif myarg == 'targetfolder': elif myarg == 'targetfolder':
targetFolder = os.path.expanduser(getString(Cmd.OB_FILE_PATH)) targetFolder = setFilePath(getString(Cmd.OB_FILE_PATH), GC.DRIVE_DIR)
if not os.path.isdir(targetFolder): if not os.path.isdir(targetFolder):
os.makedirs(targetFolder) os.makedirs(targetFolder)
elif myarg == 'filename': elif myarg == 'filename':
@@ -72979,7 +72977,7 @@ def exportMessagesThreads(users, entityType):
if _getMessageSelectParameters(myarg, parameters): if _getMessageSelectParameters(myarg, parameters):
pass pass
elif myarg == 'targetfolder': elif myarg == 'targetfolder':
targetFolderPattern = os.path.expanduser(getString(Cmd.OB_FILE_PATH)) targetFolderPattern = setFilePath(getString(Cmd.OB_FILE_PATH), GC.DRIVE_DIR)
elif myarg == 'targetname': elif myarg == 'targetname':
targetNamePattern = getString(Cmd.OB_FILE_NAME) targetNamePattern = getString(Cmd.OB_FILE_NAME)
elif myarg == 'overwrite': elif myarg == 'overwrite':
@@ -74136,7 +74134,7 @@ def printShowMessagesThreads(users, entityType):
elif showMode and myarg == 'saveattachments': elif showMode and myarg == 'saveattachments':
save_attachments = True save_attachments = True
elif showMode and myarg == 'targetfolder': elif showMode and myarg == 'targetfolder':
targetFolderPattern = os.path.expanduser(getString(Cmd.OB_FILE_PATH)) targetFolderPattern = setFilePath(getString(Cmd.OB_FILE_PATH), GC.DRIVE_DIR)
elif showMode and myarg == 'overwrite': elif showMode and myarg == 'overwrite':
overwrite = getBoolean() overwrite = getBoolean()
elif showMode and myarg == 'uploadattachments': elif showMode and myarg == 'uploadattachments':
@@ -76679,8 +76677,8 @@ def printShowCSEIdentities(users):
# [addidentity [<Boolean>]] [kpemail <EmailAddress>] # [addidentity [<Boolean>]] [kpemail <EmailAddress>]
# [showpem] [showkaclsdata] [formatjson|returnidonly] # [showpem] [showkaclsdata] [formatjson|returnidonly]
def createCSEKeyPair(users): def createCSEKeyPair(users):
def _getFolderPath(myarg): def _getFolderPath(myarg, cfgDir):
filepath = os.path.expanduser(getString(Cmd.OB_FILE_PATH)) filepath = setFilePath(getString(Cmd.OB_FILE_PATH), cfgDir)
if not os.path.isdir(filepath): if not os.path.isdir(filepath):
entityDoesNotExistExit(Ent.DIRECTORY, f'{myarg} {filepath}') entityDoesNotExistExit(Ent.DIRECTORY, f'{myarg} {filepath}')
return filepath return filepath
@@ -76694,9 +76692,9 @@ def createCSEKeyPair(users):
while Cmd.ArgumentsRemaining(): while Cmd.ArgumentsRemaining():
myarg = getArgument() myarg = getArgument()
if myarg == 'incertdir': if myarg == 'incertdir':
incertdir = _getFolderPath(myarg) incertdir = _getFolderPath(myarg, GC.GMAIL_CSE_INCERT_DIR)
elif myarg == 'inkeydir': elif myarg == 'inkeydir':
inkeydir = _getFolderPath(myarg) inkeydir = _getFolderPath(myarg, GC.GMAIL_CSE_INKEY_DIR)
elif myarg == 'addidentity': elif myarg == 'addidentity':
addIdentity = getBoolean() addIdentity = getBoolean()
elif myarg == 'kpemail': elif myarg == 'kpemail':
@@ -77539,7 +77537,7 @@ def getNoteAttachments(users):
while Cmd.ArgumentsRemaining(): while Cmd.ArgumentsRemaining():
myarg = getArgument() myarg = getArgument()
if myarg == 'targetfolder': if myarg == 'targetfolder':
targetFolderPattern = os.path.expanduser(getString(Cmd.OB_FILE_PATH)) targetFolderPattern = setFilePath(getString(Cmd.OB_FILE_PATH), GC.DRIVE_DIR)
elif myarg == 'targetname': elif myarg == 'targetname':
targetNamePattern = getString(Cmd.OB_FILE_NAME) targetNamePattern = getString(Cmd.OB_FILE_NAME)
elif myarg == 'overwrite': elif myarg == 'overwrite':