code: async def auto_add(self, device, recursive=None, automount=True):
          
          device, created = await self._find_device_losetup(device)
          if created and recursive is False:
              return device
          if device.is_luks_cleartext and self.udisks.version_info >= (2, 7, 0):
              await sleep(1.5)    # temporary workaround for #153, unreliable
          success = True
          if not self.is_automount(device, automount):
              pass
          elif device.is_filesystem:
              if not device.is_mounted:
                  success = await self.mount(device)
          elif device.is_crypto:
              if self._prompt and not device.is_unlocked:
                  success = await self.unlock(device)
              if success and recursive:
                  await self.udisks._sync()
                  device = self.udisks[device.object_path]
                  success = await self.auto_add(
                      device.luks_cleartext_holder,
                      recursive=True)
          elif recursive and device.is_partition_table:
              tasks = [
                  self.auto_add(dev, recursive=True)
                  for dev in self.get_all_handleable()
                  if dev.is_partition and dev.partition_slave == device
              ]
              results = await gather(*tasks)
              success = all(results)
          else:
              self._log.debug(_('not adding {0}: unhandled device', device))
          return success
docs: Automatically attempt to mount or unlock a device, but be quiet if the
          device is not supported.
  
          :param device: device object, block device path or mount path
          :param bool recursive: recursively mount and unlock child devices
          :returns: whether all attempted operations succeeded