# DO - Funzioni

{{#include ../../../banners/hacktricks-training.md}}

## Informazioni di base

DigitalOcean Functions, conosciuto anche come "DO Functions", è una piattaforma di computing serverless che ti consente di **eseguire codice senza dover preoccuparti dell'infrastruttura sottostante**. Con DO Functions, puoi scrivere e distribuire il tuo codice come "funzioni" che possono essere **attivate** tramite **API**, **richieste HTTP** (se abilitate) o **cron**. Queste funzioni vengono eseguite in un ambiente completamente gestito, quindi **non devi preoccuparti** di scalabilità, sicurezza o manutenzione.

In DO, per creare una funzione devi prima **creare uno spazio dei nomi** che sarà **un gruppo di funzioni**.\
All'interno dello spazio dei nomi puoi quindi creare una funzione.

### Attivatori

Il modo **per attivare una funzione tramite REST API** (sempre abilitato, è il metodo utilizzato dal cli) è attivando una richiesta con un **token di autenticazione** come:
```bash
curl -X POST "https://faas-lon1-129376a7.doserverless.co/api/v1/namespaces/fn-c100c012-65bf-4040-1230-2183764b7c23/actions/functionname?blocking=true&result=true" \
-H "Content-Type: application/json" \
-H "Authorization: Basic MGU0NTczZGQtNjNiYS00MjZlLWI2YjctODk0N2MyYTA2NGQ4OkhwVEllQ2t4djNZN2x6YjJiRmFGc1FERXBySVlWa1lEbUxtRE1aRTludXA1UUNlU2VpV0ZGNjNqWnVhYVdrTFg="
```
Per vedere come lo strumento cli **`doctl`** ottiene questo token (in modo da poterlo replicare), il **seguente comando mostra l'intera traccia di rete:**
```bash
doctl serverless connect --trace
```
**Quando il trigger HTTP è abilitato**, una funzione web può essere invocata attraverso questi **metodi HTTP GET, POST, PUT, PATCH, DELETE, HEAD e OPTIONS**.

> [!CAUTION]
> Nelle funzioni DO, **le variabili di ambiente non possono essere criptate** (al momento della scrittura di questo documento).\
> Non sono riuscito a trovare alcun modo per leggerle dalla CLI, ma dalla console è semplice.

**Gli URL delle funzioni** sembrano così: `https://<random>.doserverless.co/api/v1/web/<namespace-id>/default/<function-name>`

### Enumerazione
```bash
# Namespace
doctl serverless namespaces list

# Functions (need to connect to a namespace)
doctl serverless connect
doctl serverless functions list
doctl serverless functions invoke <func-name>
doctl serverless functions get <func-name>

# Logs of executions
doctl serverless activations list
doctl serverless activations get <activation-id> # Get all the info about execution
doctl serverless activations logs <activation-id> # get only the logs of execution
doctl serverless activations result <activation-id> # get only the response result of execution

# I couldn't find any way to get the env variables form the CLI
```
> [!CAUTION]
> Non **c'è un endpoint dei metadati** dal sandbox delle Funzioni.

{{#include ../../../banners/hacktricks-training.md}}
