Subir archivos a cPanel con Golang

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.

cpanel manage api tokens
Manage API Tokens en cPanel

Luego damos al botón Create y nos aparecerá una ventana.

crear api token en cpanel
Lista de tokens

Ponemos el nombre, la creamos y después lo copiamos, en un lugar seguro por favor.

guardar api token en cpanel
Guardar token

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:

  1. 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.
  2. filePath es la dirección de tu máquina local
  3. En endpoint está port, que suele ser 2083, pero hay que estar seguros.
  4. 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.
  5. <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
Subir archivos a cPanel con Golang
Output de 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.

subir archivos a cpanel

Así es como se verá nuestro espacio de administración de archivos.

arbol de directorios

Puedes consultar más puedes ir a este link para más información.

Gracias por leer.


Posted

in

, , ,

by