ligbox-ops-platform/projects/finance/deploy/vm123-finance-stack/create-ligbox-catalog-20.sh
Ligbox Spec Hub 9914551639 feat(catalog): 20 pacotes Ligbox/LIG-it no FOSS + OpenPanel
Mapeamento ligit.com.br + ligbox.com.br, benchmark Google/Zoho,
catálogo 20 slugs (mail/site/combo/managed TI), scripts deploy VM123
e tabela FOSS product_id + OpenPanel plan id.
2026-07-01 17:06:56 +00:00

143 lines
5.3 KiB
Bash
Executable file

#!/usr/bin/env bash
# Cria catálogo 20 pacotes Ligbox/LIG-it — FOSS + OpenPanel (VM123)
set -euo pipefail
FOSS_URL="${FOSS_URL:-https://financeiro.ligbox.com.br}"
ADMIN_EMAIL="${FOSS_ADMIN_EMAIL:-admin@ligbox.com.br}"
ADMIN_PASS="${FOSS_ADMIN_PASS:-LbFossAdmin805353}"
CATALOG="${CATALOG:-/tmp/ligbox-catalog-20.csv}"
RESULTS="${RESULTS:-/tmp/ligbox-catalog-20-results.tsv}"
COOKIE_JAR="$(mktemp)"
trap 'rm -f "$COOKIE_JAR"' EXIT
echo -e "slug\tfoss_id\top_plan\tstatus" > "$RESULTS"
foss_login() {
curl -sk -c "$COOKIE_JAR" -b "$COOKIE_JAR" -X POST "${FOSS_URL}/api/guest/staff/login" \
-d "email=${ADMIN_EMAIL}&password=${ADMIN_PASS}" | grep -q '"role":"admin"' || exit 1
curl -sk -c "$COOKIE_JAR" -b "$COOKIE_JAR" "${FOSS_URL}/admin" >/dev/null
CSRF=$(awk '$6=="csrf_token" {print $7}' "$COOKIE_JAR" | tail -1)
}
foss_product_exists() {
local slug="$1"
curl -sk -b "$COOKIE_JAR" -X POST "${FOSS_URL}/api/admin/product/get_list" \
-d "CSRFToken=${CSRF}&per_page=100" | grep -q "\"slug\":\"${slug}\""
}
foss_get_product_id() {
local slug="$1"
curl -sk -b "$COOKIE_JAR" -X POST "${FOSS_URL}/api/admin/product/get_list" \
-d "CSRFToken=${CSRF}&per_page=100" | python3 -c "
import sys,json
d=json.load(sys.stdin)
for i in (d.get('result') or {}).get('list') or []:
if i.get('slug')=='$slug':
print(i.get('id')); break
"
}
ensure_hp() {
local name="$1"
local plans
plans=$(curl -sk -b "$COOKIE_JAR" "${FOSS_URL}/api/admin/servicehosting/hp_get_list?CSRFToken=${CSRF}")
if ! echo "$plans" | grep -q "\"name\":\"${name}\""; then
curl -sk -b "$COOKIE_JAR" -X POST "${FOSS_URL}/api/admin/servicehosting/hp_create" \
-d "CSRFToken=${CSRF}&name=${name}" >/dev/null
fi
echo "$plans" | python3 -c "
import sys,json
d=json.load(sys.stdin)
items=(d.get('result') or {}).get('list') or []
name='$name'
for i in items:
if i.get('name')==name:
print(i.get('id')); break
else:
import urllib.request,os
# refresh
pass
" 2>/dev/null || true
curl -sk -b "$COOKIE_JAR" "${FOSS_URL}/api/admin/servicehosting/hp_get_list?CSRFToken=${CSRF}" | python3 -c "
import sys,json
d=json.load(sys.stdin)
for i in (d.get('result') or {}).get('list') or []:
if i.get('name')=='$name':
print(i.get('id')); break
"
}
create_hosting_product() {
local slug="$1" title="$2"
local hp_id server_id pid
if foss_product_exists "$slug"; then
foss_get_product_id "$slug"
return
fi
hp_id=$(ensure_hp "$slug")
server_id=$(curl -sk -b "$COOKIE_JAR" "${FOSS_URL}/api/admin/servicehosting/server_get_list?CSRFToken=${CSRF}" | python3 -c "
import sys,json
d=json.load(sys.stdin)
items=(d.get('result') or {}).get('list') or []
print(items[0]['id'] if items else '1')
")
pid=$(curl -sk -b "$COOKIE_JAR" -X POST "${FOSS_URL}/api/admin/product/prepare" \
-d "CSRFToken=${CSRF}&title=${title// /+}&type=hosting" | python3 -c "import sys,json; print(json.load(sys.stdin)['result'])")
curl -sk -b "$COOKIE_JAR" -X POST "${FOSS_URL}/api/admin/product/update_config" \
-d "CSRFToken=${CSRF}&id=${pid}&config[server_id]=${server_id}&config[hosting_plan_id]=${hp_id}&config[reseller]=0&config[allow_domain_own]=1&config[allow_domain_register]=0&config[allow_domain_transfer]=0&config[allow_subdomain]=0" >/dev/null
curl -sk -b "$COOKIE_JAR" -X POST "${FOSS_URL}/api/admin/product/update" \
-d "CSRFToken=${CSRF}&id=${pid}&status=enabled&slug=${slug}" >/dev/null
echo "$pid"
}
create_custom_product() {
local slug="$1" title="$2"
local pid
if foss_product_exists "$slug"; then
foss_get_product_id "$slug"
return
fi
pid=$(curl -sk -b "$COOKIE_JAR" -X POST "${FOSS_URL}/api/admin/product/prepare" \
-d "CSRFToken=${CSRF}&title=${title// /+}&type=custom" | python3 -c "import sys,json; print(json.load(sys.stdin)['result'])")
curl -sk -b "$COOKIE_JAR" -X POST "${FOSS_URL}/api/admin/product/update" \
-d "CSRFToken=${CSRF}&id=${pid}&status=enabled&slug=${slug}" >/dev/null
echo "$pid"
}
ensure_op_plan() {
local slug="$1" seats="$2" domains="$3" websites="$4" disk_gb="$5"
if opencli plan-list 2>/dev/null | grep -q "| ${slug} "; then
echo "exists"
return
fi
local emails=$(( seats * 2 )); [[ $emails -lt 10 ]] && emails=10
local disk_mb=$(( disk_gb * 1024 ))
[[ $disk_mb -lt 2048 ]] && disk_mb=2048
if opencli plan-create name"${slug}" description="Ligbox ${slug}" emails="${emails}" ftp=2 \
domains="${domains}" websites="${websites}" disk="${disk_mb}" inodes=500000 databases=2 \
cpu=100 ram=1024g bandwidth=102400 feature_set=default max_email_quota=512G max_hourly_email=500 \
>/dev/null 2>&1; then
echo "created"
else
echo "exists_or_error"
fi
}
foss_login
echo "FOSS login OK"
tail -n +2 "$CATALOG" | while IFS='|' read -r slug title category price seats mail_gb files_gb op_domains op_websites op_disk_gb foss_type; do
[[ -z "$slug" ]] && continue
foss_id=""; op_st="n/a"; st="ok"
if [[ "$foss_type" == "custom" ]]; then
foss_id=$(create_custom_product "$slug" "$title") || st="foss_error"
else
foss_id=$(create_hosting_product "$slug" "$title") || st="foss_error"
op_st=$(ensure_op_plan "$slug" "$seats" "$op_domains" "$op_websites" "$op_disk_gb") || st="op_error"
fi
echo -e "${slug}\t${foss_id}\t${op_st}\t${st}"
echo -e "${slug}\t${foss_id}\t${op_st}\t${st}" >> "$RESULTS"
echo "OK $slug foss=$foss_id op=$op_st"
done
echo "Results: $RESULTS"