public function execute()

in local/o365/classes/task/usersync.php [86:248]


    public function execute() {
        if (utils::is_configured() !== true) {
            $this->mtrace('Microsoft 365 not configured');

            return false;
        }

        if (main::is_enabled() !== true) {
            $this->mtrace('Azure AD cron sync disabled. Nothing to do.');

            return true;
        }
        $this->mtrace('Starting sync');
        raise_memory_limit(MEMORY_HUGE);

        $usersync = new main();

        // Do not time out when syncing users.
        @set_time_limit(0);

        if (main::sync_option_enabled('nodelta') === true) {
            $skiptoken = $this->get_token('skiptokenfull');
            if (!empty($skiptoken)) {
                $this->mtrace('Using skiptoken (full)');
            } else {
                $this->mtrace('No skiptoken (full) stored.');
            }

            $this->mtrace('Forcing full sync.');
            $this->mtrace('Contacting Azure AD...');
            $users = [];
            try {
                $continue = true;
                while ($continue) {
                    [$returnedusers, $skiptoken] = $usersync->get_users('default', $skiptoken);
                    $users = array_merge($users, $returnedusers);
                    $continue = (!empty($skiptoken));
                }
            } catch (\Exception $e) {
                $this->mtrace('Error in full usersync: ' . $e->getMessage());
                utils::debug($e->getMessage(), 'usersync task', $e);
                $this->mtrace('Resetting skip and delta tokens.');
                $skiptoken = null;
            }
            $this->mtrace('Got response from Azure AD');

            // Store skiptoken.
            if (!empty($skiptoken)) {
                $this->mtrace('Storing skiptoken (full)');
            } else {
                $this->mtrace('Clearing skiptoken (full) (none received)');
            }
            $this->store_token('skiptokenfull', $skiptoken);
        } else {
            $skiptoken = $this->get_token('skiptokendelta');
            if (!empty($skiptoken)) {
                $this->mtrace('Using skiptoken (delta)');
            } else {
                $this->mtrace('No skiptoken (delta) stored.');
            }

            $deltatoken = $this->get_token('deltatoken');
            if (!empty($deltatoken)) {
                $this->mtrace('Using deltatoken.');
            } else {
                $this->mtrace('No deltatoken stored.');
            }

            $this->mtrace('Using delta sync.');
            $this->mtrace('Contacting Azure AD...');
            $users = [];
            try {
                $continue = true;
                while ($continue) {
                    [$returnedusers, $skiptoken, $deltatoken] = $usersync->get_users_delta('default', $skiptoken, $deltatoken);
                    $users = array_merge($users, $returnedusers);
                    $continue = (empty($deltatoken) && !empty($skiptoken));
                }
            } catch (\Exception $e) {
                $this->mtrace('Error in delta usersync: ' . $e->getMessage());
                utils::debug($e->getMessage(), 'usersync task', $e);
                $this->mtrace('Resetting skip and delta tokens.');
                $skiptoken = null;
                $deltatoken = null;
            }

            $this->mtrace('Got response from Azure AD');

            // Store deltatoken.
            if (!empty($deltatoken)) {
                $this->mtrace('Storing deltatoken');
            } else {
                $this->mtrace('Clearing deltatoken (none received)');
            }
            $this->store_token('deltatoken', $deltatoken);

            // Store skiptoken.
            if (!empty($skiptoken)) {
                $this->mtrace('Storing skiptoken (delta)');
            } else {
                $this->mtrace('Clearing skiptoken (delta) (none received)');
            }
            $this->store_token('skiptokendelta', $skiptoken);
        }

        if (!empty($users)) {
            $this->mtrace(count($users) . ' users received. Syncing...');
            $this->sync_users($usersync, $users);
        } else {
            $this->mtrace('No users received to sync.');
        }

        if (main::sync_option_enabled('suspend') || main::sync_option_enabled('reenable')) {
            $lastruntime = get_config('local_o365', 'task_usersync_lastdelete');
            $rundelete = true;
            if ($lastruntime === false) {
                $lastruntime = strtotime('today midnight');
                set_config('task_usersync_lastdelete', $lastruntime, 'local_o365');
            } else {
                if ($lastruntime + 24 * 60 * 60 > time()) {
                    $rundelete = false;
                    $this->mtrace('Suspend/delete users feature disabled because it was run less than 1 day ago.');
                } else {
                    set_config('task_usersync_lastdelete', time(), 'local_o365');
                }
            }
            if ($rundelete) {
                $this->mtrace('Start suspend/delete users feature...');
                if (main::sync_option_enabled('nodelta') !== true) {
                    // Make sure $users contains all aad users - if delta sync was used, do a full sync.
                    $skiptoken = '';
                    $users = [];

                    try {
                        $continue = true;
                        while ($continue) {
                            [$returnedusers, $skiptoken] = $usersync->get_users('default', $skiptoken);
                            $users = array_merge($users, $returnedusers);
                            $continue = (!empty($skiptoken));
                        }
                    } catch (\Exception $e) {
                        $this->mtrace('Error in full usersync: ' . $e->getMessage());
                        utils::debug($e->getMessage(), 'usersync task', $e);
                        $this->mtrace('Resetting skip and delta tokens.');
                        $skiptoken = null;
                    }
                }

                if (main::sync_option_enabled('suspend')) {
                    $this->mtrace('Suspending deleted users...');
                    $usersync->suspend_users($users, main::sync_option_enabled('delete'));
                }
                if (main::sync_option_enabled('reenable')) {
                    $this->mtrace('Re-enabling suspended users...');
                    $usersync->reenable_suspsend_users($users, main::sync_option_enabled('disabledsync'));
                }
            }
        }

        $this->mtrace('Sync process finished.');

        return true;
    }