Hace un par de semanas estuve trabajando con un proyecto relacionado con respaldos de archivos. Por necesidades del cliente era obligatorio enviar este respaldo a un server de backups gestionado por cPanel. Anteriormente estaban trabajando con cuentas FTP, pero como soy muy flojo, lo más lógico, pensé, era subir archivos a cPanel con Golang, usando alguna API. Todos tienen, ni modo que cPanel no.
En este post veremos cómo hacer el proceso de carga de archivos a cPanel mediante su API, que cPanel recomienda usar UAPI.
Crear API Token
Primero que nada, vamos a crear el token. Tenemos que ir a la siguiente sección: cPanel >> Home >> Security >> Manage API Tokens.
Luego damos al botón Create y nos aparecerá una ventana.
Ponemos el nombre, la creamos y después lo copiamos, en un lugar seguro por favor.
Una ves creado y guardado en un lugar seguro, procedemos a crear el código en Go,
Código en Golang para subir archivos a cPanel
Para este ejemplo, usaremos Go (Golang) y la biblioteca Resty.
RESTY es una biblioteca popular en Golang que facilita el consumo de APIs RESTful usando un cliente HTTP. Te permite realizar solicitudes como GET, POST, o DELETE de una manera muy simple.
Para ello vamos a crear los directorios y archivos necesarios:
# Creamos el directorio
mkdir cpanel-upload && cd cpanel-upload
# Iniciamos el módulo
go mod init cpanel_upload
# Creamos el archivo de entrada
touch main.go
Una vez creados, vamos a descargar Resty para agregarlo a nuestro código:
go get "github.com/go-resty/resty/v2"
El ejemplo es muy simple, así que aquí tienes el código:
package main
import (
"fmt"
"github.com/go-resty/resty/v2"
)
func main() {
apiToken := "XYZXYZXYZXYZXYZXYZXYZXYZXYZXYZXY"
cPanelDomain := "<midominio.com>"
filePath := "/home/<usuario>/<archivo>"
endpoint := fmt.Sprintf("https://%s:<port>/execute/Fileman/upload_files", cPanelDomain)
client := resty.New()
client.SetHeader("Authorization", "cpanel <tu_usuario>:"+apiToken)
resp, err := client.R().
SetFile("file", filePath).
SetFormData(map[string]string{
"dir": "<ruta/al/que/quiero/mover/el/archivo>",
}).
Post(endpoint)
if err != nil {
fmt.Println("Error:", err)
}
fmt.Println(resp.String())
}
Algunas notas:
cPanelDomain
puede ser el dominio al que response la instalación de cPanel o uno temporal que por lo general lucen algo como n12345.server.com.filePath
es la dirección de tu máquina local- En
endpoint
estáport
, que suele ser 2083, pero hay que estar seguros. - en
SetFormData
, dentro del parámetro"dir"
, es obviamente el path del directorio del server. En caso de que el server no tenga el directorio creado, la acción del POST se encargará de crearlo. <tu_usuario>
es el usuario con el que entras a cPanel mediante su página de login normal y corriente.
Ahora ejecutemos:
go run main.go
Para darle esa salida yo uso jq, pero puedes usar esta librería para darle una salida más colorida a tu respuesta.
Debo decir que la API no regresa demasiada información para poder validar ciertas cosas, pero debería ser suficiente con los códigos HTTP e ir viendo lo que te interesa.
File Manager de cPanel
Para ver los archivos, en el dashboard de cPanel, tenemos que ir a cPanel >> Home >> Files >> File Manager.
Así es como se verá nuestro espacio de administración de archivos.
Puedes consultar más puedes ir a este link para más información.
Gracias por leer.