diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index e3855a4..57f72aa 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -20,7 +20,7 @@ Todos los parches deben enviarse a github como [pull requests](https://github.co ## Flujo de trabajo -Primero y antes que nada debe de checar los iusses para empezar a trabajar. Si lo que usted desea es empezar a colaborar desde ahora como lo dice aqui arriba puede empezar a atender el [rastreador de problemas](https://github.com/Kedap/apmpkg/issues) tomando como prioridad a los que contiene la etqueta de [buscando ayuda](https://github.com/Kedap/apmpkg/labels/buscando%20ayuda). Pero esto haciendo un nuevo fork a partir del ultimo commit de la rama develop y NO desde master. El fork que has creado debe tener como nombre el titulo o numero del issue que estas atendiendo a si mismo debes de modificar la [caja de descripcion](#caja-de-descripcion) colocando los datos correspondientes. Una ves que hayas terminado puedes hacer el pull requests pero a la rama develop en donde un tester debe de aceptar dicha mejora, si tu contribuyes a algo beneficioso es muy probable que sea aceptada +Primero y antes que nada debe de checar los iusses para empezar a trabajar. Si lo que usted desea es empezar a colaborar desde ahora como lo dice aqui arriba puede empezar a atender el [rastreador de problemas](https://github.com/Kedap/apmpkg/issues) tomando como prioridad a los que contiene la etqueta de [buscando ayuda](https://github.com/Kedap/apmpkg/labels/buscando%20ayuda). Pero esto haciendo un nuevo fork a partir del ultimo commit de la rama develop y NO desde master. De manera no obligatorio **pero se recomienda modificar la [caja de descripcion](#caja-de-descripcion)** colocando los datos correspondientes. Una ves que hayas terminado puedes hacer el pull requests pero a la rama develop en donde un tester debe de aceptar dicha mejora, si tu contribuyes a algo beneficioso es muy probable que sea aceptada ## Caja de descripcion diff --git a/Cargo.lock b/Cargo.lock index 3185684..a9430e4 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -14,13 +14,14 @@ checksum = "23ac7c30002a5accbf7e8987d0632fa6de155b7c3d39d0067317a391e00a2ef6" [[package]] name = "apmpkg" -version = "1.1.1" +version = "1.2.0" dependencies = [ "clap", "colored", "flate2", - "nix", + "nix 0.20.0", "pbr", + "psutil", "read_input", "reqwest", "sha2", @@ -91,6 +92,12 @@ version = "1.0.67" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e3c69b077ad434294d3ce9f1f6143a2a4b89a8a2d54ef813d85003a4fd1137fd" +[[package]] +name = "cfg-if" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822" + [[package]] name = "cfg-if" version = "1.0.0" @@ -152,7 +159,7 @@ version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "81156fece84ab6a9f2afdb109ce3ae577e42b1228441eded99bd77f627953b1a" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", ] [[package]] @@ -161,7 +168,7 @@ version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dca26ee1f8d361640700bde38b2c37d8c22b3ce2d360e1fc1c74ea4b0aa7d775" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", "crossbeam-utils", ] @@ -172,10 +179,41 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e7e9d99fa91428effe99c5c6d4634cdeba32b8cf784fc428a2a687f61a952c49" dependencies = [ "autocfg", - "cfg-if", + "cfg-if 1.0.0", "lazy_static", ] +[[package]] +name = "darwin-libproc" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fb90051930c9a0f09e585762152048e23ac74d20c10590ef7cf01c0343c3046" +dependencies = [ + "darwin-libproc-sys", + "libc", + "memchr", +] + +[[package]] +name = "darwin-libproc-sys" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57cebb5bde66eecdd30ddc4b9cd208238b15db4982ccc72db59d699ea10867c1" +dependencies = [ + "libc", +] + +[[package]] +name = "derive_more" +version = "0.99.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5cc7b9cef1e351660e5443924e4f43ab25fbbed3e9a5f052df3677deb4d6b320" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "digest" version = "0.9.0" @@ -191,7 +229,7 @@ version = "0.8.28" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "80df024fbc5ac80f87dfef0d9f5209a252f2a497f7f42944cff24d8253cac065" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", ] [[package]] @@ -200,7 +238,7 @@ version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1d34cfa13a63ae058bfa601fe9e313bbdb3746427c1459185464ce0fcf62e1e8" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", "libc", "redox_syscall", "winapi", @@ -212,7 +250,7 @@ version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cd3aec53de10fe96d7d8c565eb17f2c687bb5518a2ec453b5b1252964526abe0" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", "crc32fast", "libc", "miniz_oxide", @@ -304,11 +342,17 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c9495705279e7140bf035dde1f6e750c162df8b625267cd52cc44e0b156732c8" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", "libc", "wasi", ] +[[package]] +name = "glob" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b919933a397b79c37e33b77bb2aa3dc8eb6e165ad809e58ff75bc7db2e34574" + [[package]] name = "h2" version = "0.3.1" @@ -440,7 +484,7 @@ version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "61124eeebbd69b8190558df225adf7e4caafce0d743919e5d6b19652314ec5ec" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", ] [[package]] @@ -491,7 +535,16 @@ version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "51b9bbe6c47d51fc3e1a9b945965946b4c44142ab8792c50835a980d362c2710" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", +] + +[[package]] +name = "mach" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b823e83b2affd8f40a9ee8c29dbc56404c1e34cd2710921f2801e2cf29527afa" +dependencies = [ + "libc", ] [[package]] @@ -563,6 +616,19 @@ dependencies = [ "tempfile", ] +[[package]] +name = "nix" +version = "0.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50e4785f2c3b7589a0d0c1dd60285e1188adac4006e8abd6dd578e1567027363" +dependencies = [ + "bitflags 1.2.1", + "cc", + "cfg-if 0.1.10", + "libc", + "void", +] + [[package]] name = "nix" version = "0.20.0" @@ -571,7 +637,7 @@ checksum = "fa9b4819da1bc61c0ea48b63b7bc8604064dd43013e7cc325df098d49cd7c18a" dependencies = [ "bitflags 1.2.1", "cc", - "cfg-if", + "cfg-if 1.0.0", "libc", ] @@ -613,7 +679,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a61075b62a23fef5a29815de7536d940aa35ce96d18ce0cc5076272db678a577" dependencies = [ "bitflags 1.2.1", - "cfg-if", + "cfg-if 1.0.0", "foreign-types", "libc", "once_cell", @@ -656,7 +722,7 @@ version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fa7a782938e745763fe6907fc6ba86946d72f49fe7e21de074e08128a99fb018" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", "instant", "libc", "redox_syscall", @@ -720,6 +786,12 @@ version = "0.3.19" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3831453b3449ceb48b6d9c7ad7c96d5ea673e9b470a1dc578c2ce6521230884c" +[[package]] +name = "platforms" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "feb3b2b1033b8a60b4da6ee470325f887758c95d5320f52f9ce0df055a55940e" + [[package]] name = "ppv-lite86" version = "0.2.10" @@ -735,6 +807,25 @@ dependencies = [ "unicode-xid", ] +[[package]] +name = "psutil" +version = "3.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e780a52bf9358cb8257cac630b130dc603901f7488f8eef13e2d512cead10739" +dependencies = [ + "cfg-if 0.1.10", + "darwin-libproc", + "derive_more", + "glob", + "mach", + "nix 0.17.0", + "num_cpus", + "once_cell", + "platforms", + "thiserror", + "unescape", +] + [[package]] name = "quote" version = "1.0.9" @@ -924,7 +1015,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fa827a14b29ab7f44778d14a88d3cb76e949c45083f7dbfa507d0cb699dc12de" dependencies = [ "block-buffer", - "cfg-if", + "cfg-if 1.0.0", "cpuid-bool", "digest", "opaque-debug", @@ -957,7 +1048,7 @@ version = "0.3.19" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "122e570113d28d773067fab24266b66753f6ea915758651696b6e35e49f88d6e" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", "libc", "winapi", ] @@ -996,7 +1087,7 @@ version = "3.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dac1c663cfc93810f88aed9b8941d48cabf856a1b111c29a40439018d870eb22" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", "libc", "rand", "redox_syscall", @@ -1013,6 +1104,26 @@ dependencies = [ "unicode-width", ] +[[package]] +name = "thiserror" +version = "1.0.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa6f76457f59514c7eeb4e59d891395fab0b2fd1d40723ae737d64153392e9c6" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a36768c0fbf1bb15eca10defa29526bda730a2376c2ab4393ccfa16fb1a318d" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "time" version = "0.1.43" @@ -1114,7 +1225,7 @@ version = "0.1.25" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "01ebdc2bb4498ab1ab5f5b73c5803825e60199229ccba0698170e3be0e7f959f" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", "pin-project-lite", "tracing-core", ] @@ -1140,6 +1251,12 @@ version = "1.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "879f6906492a7cd215bfa4cf595b600146ccfac0c79bcbd1f3000162af5e8b06" +[[package]] +name = "unescape" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccb97dac3243214f8d8507998906ca3e2e0b900bf9bf4870477f125b82e68f6e" + [[package]] name = "unicode-bidi" version = "0.3.4" @@ -1200,6 +1317,12 @@ version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5fecdca9a5291cc2b8dcf7dc02453fee791a280f3743cb0905f8822ae463b3fe" +[[package]] +name = "void" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d" + [[package]] name = "want" version = "0.3.0" @@ -1222,7 +1345,7 @@ version = "0.2.71" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7ee1280240b7c461d6a0071313e08f34a60b0365f14260362e5a2b17d1d31aa7" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", "serde", "serde_json", "wasm-bindgen-macro", @@ -1249,7 +1372,7 @@ version = "0.4.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8e67a5806118af01f0d9045915676b22aaebecf4178ae7021bc171dab0b897ab" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", "js-sys", "wasm-bindgen", "web-sys", diff --git a/Cargo.toml b/Cargo.toml index 1f87c3c..755a56a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "apmpkg" -version = "1.1.1" +version = "1.2.0" authors = ["kedap "] edition = "2018" description = "Un administrador de paquetes universal para linux como modelo: PKGBUILD" @@ -23,4 +23,5 @@ pbr = "1.0.4" tar = "0.4" flate2 = "1.0" sha2 = "0.9.3" -nix = "0.20.0" \ No newline at end of file +nix = "0.20.0" +psutil = "3.2.0" \ No newline at end of file diff --git a/README.md b/README.md index db23c5d..f5d96c4 100644 --- a/README.md +++ b/README.md @@ -1,22 +1,20 @@ # ApmPKG -[![version](https://img.shields.io/github/v/release/kedap/apmpkg)](https://github.com/Kedap/apmpkg/releases/) [![Build Status](https://travis-ci.com/Kedap/apmpkg.svg?branch=main)](https://travis-ci.com/Kedap/apmpkg) [![Paquete arch](https://img.shields.io/aur/version/apmpkg)](https://aur.archlinux.org/packages/apmpkg) +[![version](https://img.shields.io/github/v/release/kedap/apmpkg)](https://github.com/Kedap/apmpkg/releases/) [![Build Status](https://travis-ci.com/Kedap/apmpkg.svg?branch=main)](https://travis-ci.com/Kedap/apmpkg) [![Paquete arch](https://img.shields.io/aur/version/apmpkg)](https://aur.archlinux.org/packages/apmpkg) [![AUR develop](https://img.shields.io/aur/version/apmpkg-git-dev)](https://aur.archlinux.org/packages/apmpkg-git-dev) A Package Manager as a model: PKGBUILD -![Logo](img/logo.png) +

+ +

# NOTICIAS -- Se ha liberado la versión: v1.1.1 Para todos!!! -- Se Arreglo el error al verificar si un archivo es .adi o .abc +- Se ha liberado la versión: v1.2 Para todos!!! - Creacion de los binarios para todas las distribuciones disponibles - Se a subido ApmPKG esta en [AUR](https://aur.archlinux.org/packages/apmpkg/) -- Modificacion al verificar en `cmd_depends` de los archivos .abc -- Ahora ya se pueden utilizar la funcion check y verificar que esta se creo correctamente -- Al crear los archivos binarios con archivos .adi, no se comprimian los directorios, ¡Ahora si! -- Aregamos soporte para apk y yum! -- Agregamos el hecho que se puedan tener fuentes locales en archivos .adi para no tener la necesidad de descargarlos -- Hemos cambiado curl por wget para descargar fuentes en archivos abc -- Ahora ya se puede utilizar la funcion de no extract -- Implementamos un comando para generar un prototipo de archivos .adi o .abc +- Agregamos `abi_dependencias` y `dependencias_adi` para dependencias que no esten en repositorios nativos, [mas informacion aqui](doc/creando_paquetes.md/#dependencias-adi) +- Agregamos informacion para arquitectura del cual esta hecho el paquete, [mas informacion aqui](doc/creando_paquetes.md/#paquete) +- Colocamos la leyenda `actualizando paquete...` cuando ya se tiene una instalacion previa del paquete a instalar +- Manuales en Ingles y Español, ahora hemos creado paginas para `man` en ambos idiomas! + * * * Un gestor de paquetes que desea ser una poderosa herramienta universal para linux con el fin de la cracion e instalacion de paquetes. ![Captura](img/captura_prin.png) @@ -45,7 +43,7 @@ De igual manera se pueden crear binarios para una instalacion offline [binarios] Aunque sea algo dificl o raro, de igual manera podemos instalar apmpkg con el mismo apmpkg, aun porque creemos que la distribucion de paquetes es importante tratamos de poner a disposicion y de crear binarios nativos para cada distribucion en donde son soportados los gestores de paquetes, pero primero debes de tener las depencias, entre ellos: - pip3/pip2 - bundle -- curl +- wget - fakeroot - git - rsync @@ -60,6 +58,8 @@ Para ello puedes dirijirte a la seccion de [lanzamientos](https://github.com/Ked - Resolucion de dependencias con los gestores de paquetes antes mencionados, trabajaremos para que la lista sea mas extensa - Descargar y/o compilar desde una url, ejemplo: `apmpkg instalar -u https://foo.com/bar` - Extenciones propios de nuestra herramienta, *.adi, .abc y .abi.tar.gz* cada una tiene una funcion especial, [mas informacion aqui](doc/modos_de_instalacion.md) +- Crear un prototipo para un generar un archivo .adi o .abc, con el comando: `apmpkg crear adi foo` en el caso de crear un archivo .abc se debe de ejecutar lo siguiente: `apmpkg crear abc foo` +- Construir tus binarios, Con la llegada de la version 1.2 se puede construir binarios sin la necesidad de instalarlos, solo debes de ejecutar: `apmpkg construir foo.adi` o si es un paquete .abc: `apmpkg construir foo.abc` ## Contribuir Si tienes una buena idea o quieres contribuir con este proyecto puedes empezar por [aqui](https://github.com/Kedap/apmpkg/issues) y [leer esto](CONTRIBUTING.md) diff --git a/doc/creando_paquetes.md b/doc/creando_paquetes.md index a108c03..3abe463 100644 --- a/doc/creando_paquetes.md +++ b/doc/creando_paquetes.md @@ -4,10 +4,11 @@ En esta guia aprenderas todo lo que se debe de saber al crear paquetes para ApmP Tabla de contenidos 1. [Contruyendo con un Archivo de Descarga e Instalacion: ADI](#adi) 1. [Datos del paquete](#paquete) - 2. [Gemas de ruby](#gem) - 3. [Pip2 / pip3](#pip) - 4. [descarga](#descarga) - 5. [instalacion](#instalacion) + 2. [Dependencias externas](#dependencias-adi) + 3. [Gemas de ruby](#gem) + 4. [Pip2 / pip3](#pip) + 5. [descarga](#descarga) + 6. [instalacion](#instalacion) 2. [Compilando e instalando desde un Archivo de Bash y Compilando](#abc) 1. [Errores con abc](#complicaciones-abc) 3. [Generar un archivo facilmente](#comando-de-creacion) @@ -31,8 +32,13 @@ pagina = "https://foo.com/" licensia = "GPL-V3" dependencias = ["ruby", "metasploit"] #cmd_depen = ["ruby" , "msfconsole"] +#abi_dependencias = ["metasploit"] +#arch = "x86_64" conflicto = "/opt/foo/" +#[dependencias_adi] +#metasploit = "https://foo/bar/alterntiva/metasploit.abi.tar.gz" + [gem] gemfile = true @@ -76,12 +82,25 @@ licensia = "GPL-V3" dependencias = ["ruby", "metasploit"] #cmd_depen = ["ruby" , "msfconsole"] conflicto = "/opt/foo/" +#abi_dependencias = ["metasploit"] ``` Un poco mas facil, ¿no? Apartir de aqui vemos cosas basicas como el nombre y la version que son strings, nada muy importante que descatar, pero vemos algo en rama. La variable **rama** es un string que se utiliza para diferenciar entre que es el paquete, si es una version beta, si es de la rama git o de desarrollo o si es una version estable. Vamos a lo siguiente que es **descrip**, y **licensia**. Estos son strings donde uno se coloca una pequeña descripcion del paquete y la licensia para espeficar que tipo de licensia de paquete es. **dependencias** y **cmd-depen**: dependencias es un array donde se colocan el nombre de los paquetes a los cuales se deben instalar, y cmd_depen es algo muy curioso, ya que para verificar que las dependencias estan instaladas se ejecuta un comando; es decir que si la dependencia es python despues de ejecutar el comando de instalacion se ejecuta `python`y si se obtiene una salida de 127 se da por hecho que esta instalado la dependencia, mas sin embargo existen paquetes que se ejecutan de diferente manera como es el ejemplo de `openssh` que se ejecuta con `ssh`o en este caso `metasploit` que se ejecuta con `msfconsole` es por ello que se creo este array. Mas sin embargo no es necesario SI TODAS las dependencias se ejecutan con el mismo nombre con el que se instala, como es el caso de `ruby` conflicto: Este string debe de contener un path, si dicho path o archivo existe no se podra instalar, es por decir que evita que un paquete se instale cuando ya esta instalado con otro gestor de paquetes +**abi_dependencias** Es un array en donde se colocan las depedencias que **en el caso** de no encontrarse y/o resolverse con gestores de paquetes nativos, estas dependencias se instalaran de manera externa por ApmPKG, vease mas informacion en [dependencias_adi](#dependencias-adi) +**arch** Es una variable string que debe de colocarse en el caso de que dicho paquete sea compatible unicamente para dicha arquitectura, en el caso de que sea disponible para todas las arquitecturas esta variable no debe de colocarse, ya que si dicha variable no se coloca se da por hecho que el paquete esta construido para cualquier arquitectura + +## Dependencias adi + +Esta seccion se integro con la version 1.2.0, la funcion de esta seccion es la de otorgar las fuentes de dependencias que no se han podido resolver con los gestores de paquetes nativos, ya sea porque no se encuentran en el repositorio o porque estos se encuentran rotos y/o por alguna otra razon... + +```toml +metasploit = "https://foo/bar/alterntiva/metasploit.abi.tar.gz" +``` + +Tenemos una simple linea, las variables de esta seccion llevaran por nombre la depedencia que en el caso de no cumplirse va a ser instalada mediante esta opcion, en este caso la dependencia **metasploit**, el valor de dicha variable va a hacer un string que contengan la ruta de donde descargar dicho paquete en formato .abi.tar.gz para que este sea instalado por apmpkg ## Gem Esta seccion se creo para contener informacion referente a gemas que depende el paquete, claro gemas de ruby y que seran instalado con `bundle` o `gem` Esta seccion empieza con `[gem]`, esta seccion no es obligatoria, solo se coloca si el proyecto depende de gemas, si el caso es si, aqui un ejemplo: diff --git a/doc/instalacion.md b/doc/instalacion.md index 9bd66ea..eee41e3 100644 --- a/doc/instalacion.md +++ b/doc/instalacion.md @@ -36,6 +36,26 @@ Pacman...<. el gestor de paquetes de archlinux, de igual manera se puede instala `wget https://github.com/Kedap/apmpkg/releases/download/1.1.1/apmpkg-1.1.1-1-x86_64.pkg.tar.zst; pacman -U apmpkg-1.1.1-1-x86_64.pkg.tar.zst` +O de mejor manera puedes tener las ultimas version con el repositorio [krep0](https://krep0.bitbucket.io/archlinux/), si no lo tienes en tu pacman.conf, deberas de realizar lo siguiente: +Colocar las siguientes lineas en `/etc/pacman.conf`: +```toml +[krep0] +SigLevel = Optional TrustAll +Server = https://$repo.bitbucket.io/archlinux/$arch +``` +Y actualizar con `pacman -Syu` + +Una vez que ya tengas krep0 en tu pacman.conf deberas de ejecutar lo siguiente para instalar apmpkg: + +```sh +pacman -S apmpkg +``` + +En el caso de que quieras instalar la version en desarrollo (no recomendado) deberas ejecutar: +```sh +pacman -S apmpkg-git-dev +``` + ## Zypper Zypper es el gestor de paquetes de OpenSUSE y para que ApmPKG sea instalado solo falta ejecutar lo siguiente: @@ -93,7 +113,7 @@ $ cargo build --release Para instalar los manuales solo ejecute: ``` # mkdir -p /usr/local/share/man/man1 -# cp apmpkg.1 /usr/local/share/man/man1 +# cp man/* /usr/local/share/man/man1 ``` ## Ejecucion `apmpkg --help` diff --git a/ejemplos/bee-for-cerberus.adi b/ejemplos/bee-for-cerberus.adi new file mode 100644 index 0000000..af6c69c --- /dev/null +++ b/ejemplos/bee-for-cerberus.adi @@ -0,0 +1,36 @@ +[paquete] + +nombre = "beef-cerberus" +version = "4.0" +rama = "estable" +descrip = "Herramienta para automatizar BeEF fuera de LAN!" +pagina = "https://github.com/tony23x/beef-for-cerberus" +licensia = "Desconocida" +dependencias = ["curl", "wget", "php", "openssh", "net-tools", "python3", "unzip", "ngrok"] +cmd_depen = ["curl", "wget", "php", "ssh", "iptunnel", "python3", "unzip", "ngrok"] +abi_dependencias = ["ngrok"] +conflicto = "/usr/bin/cerberus.py" + +[dependencias_adi] +ngrok = "https://krep0.bitbucket.io/apmpkg/ngrok-2.3.40.abi.tar.gz" + +[pip] + +version = 3 +requirements = true +file = "requirements.txt" + +[descarga] + +#git = "https://github.com/tony23x/beef-for-cerberus.git" +#Para testeo +git = "https://github.com/kedap/beef-for-cerberus.git" +carpeta = "beef-for-cerberus" +sha256sum = "SALTAR" + +[instalacion] + +opt_src = true +files = ["beef-cerberus.sh"] +ruta = ["/usr/bin/beef-cerberus"] +mensaje = "Ejecuta 'beef-cerberus' para iniciar :)" \ No newline at end of file diff --git a/ejemplos/git_python.adi b/ejemplos/git_python.adi deleted file mode 100644 index d4dbbe8..0000000 --- a/ejemplos/git_python.adi +++ /dev/null @@ -1,29 +0,0 @@ -[paquete] - -nombre = "PhishingSpammer" -version = "beta" -rama = "git" -descrip = "PhisingSpammer is an automated bot that spam phising sites just by a few clicks!" -pagina = "https://github.com/tony23x/beef-for-cerberus" -licensia = "" -dependencias = ["python3"] -conflicto = "/opt/PhishingSpammer" - -[pip] - -version = 3 -requirements = false -packages = ["requests", "pytest-shutil", "objdict"] - -[descarga] - -git = "https://github.com/v3lip/PhishingSpammer" -carpeta = "PhishingSpammer" -sha256sum = "SALTAR" - -[instalacion] - -opt_src = true -files = ["spammer.py", "settings-generator.py"] -ruta = ["/usr/bin/phispammer", "/usr/bin/settings-generator-phi.py"] -mensaje = "Para abrir, ejecuta: phispammer" \ No newline at end of file diff --git a/img/captura_prin.png b/img/captura_prin.png index b97d44b..f738a7c 100644 Binary files a/img/captura_prin.png and b/img/captura_prin.png differ diff --git a/man/apmpkg-en.1 b/man/apmpkg-en.1 new file mode 100644 index 0000000..02a9e18 --- /dev/null +++ b/man/apmpkg-en.1 @@ -0,0 +1,50 @@ +.\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.48.3. +.TH APMPKG "1" "June 2021" "apmpkg 1.2" "User Commands" +.SH NAME +apmpkg \- manual page for apmpkg 1.2 +.SH DESCRIPTION +ApmPKG v1.2 +Kedap. +A Package Manager as a model: PKGBUILD +.SS "USAGE:" +.IP +apmpkg [OPTIONS] [SUBCOMMAND] +.SS "FLAGS:" +.TP +\fB\-h\fR, \fB\-\-help\fR +Prints help information +.TP +\fB\-V\fR, \fB\-\-version\fR +Prints version information +.SS "OPTIONS:" +.TP +\fB\-d\fR, \fB\-\-Instalar_dependencia\fR +Install the specified dependency +.SS "SUBCOMMANDS:" +.TP +construir +build a binary from a file adi or abc +.TP +crear +Create a protype for files .adi o .abc +.TP +help +Prints this message or the help of the given subcommand(s) +.TP +instalar +Install/Update a package +.TP +remover +Uninstall a package +.SH "SEE ALSO" +The full documentation for +.B apmpkg +is maintained as a Texinfo manual. If the +.B info +and +.B apmpkg +programs are properly installed at your site, the command +.IP +.B info apmpkg +.PP +should give you access to the complete manual. diff --git a/apmpkg.1 b/man/apmpkg.1 similarity index 70% rename from apmpkg.1 rename to man/apmpkg.1 index 9f8102a..9d00795 100644 --- a/apmpkg.1 +++ b/man/apmpkg.1 @@ -1,35 +1,35 @@ .\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.48.3. -.TH APMPKG "1" "May 2021" "apmpkg 1.1" "User Commands" +.TH APMPKG "1" "June 2021" "apmpkg 1.2" "User Commands" .SH NAME -apmpkg \- manual page for apmpkg 1.1 -.SH DESCRIPTION -ApmPKG v1.1 +apmpkg \- pagina del manual para apmpkg 1.2 +.SH DESCRIPTION +ApmPKG v1.2 Kedap. Un administrador de paquetes universal para linux como modelo PKGBUILD .SS "USAGE:" .IP -apmpkg [FLAGS] [OPTIONS] [SUBCOMMAND] +apmpkg [OPTIONS] [SUBCOMMAND] .SS "FLAGS:" .TP \fB\-h\fR, \fB\-\-help\fR -Prints help information +Imprime esta ayuda .TP \fB\-V\fR, \fB\-\-version\fR -Prints version information -.TP -\fB\-v\fR -Mostrar la salida (modo verbose) +Imprime la version .SS "OPTIONS:" .TP \fB\-d\fR, \fB\-\-Instalar_dependencia\fR Instala la dependencia especificada .SS "SUBCOMMANDS:" .TP +construir +Crea un binario apartir de un archivo adi o abc +.TP crear Crea un prototipo para archivo .adi o .abc .TP help -Prints this message or the help of the given subcommand(s) +Imprime esta ayuda o imprime la ayuda para los subcomandos .TP instalar Instala/actualiza un paquete diff --git a/src/archivos.rs b/src/archivos.rs index 6e7454c..a14cf49 100644 --- a/src/archivos.rs +++ b/src/archivos.rs @@ -503,6 +503,34 @@ pub fn binario_completo(toml_file: &str) -> bool { conservar_src_dir } +pub fn dependencias_adi(file_toml: &str) -> Vec { + let tomy: Value = + toml::from_str(file_toml).expect("Al parecer no escribiste bien el archivo ADI"); + let adi = tomy.as_table().unwrap(); + let paquete = adi["paquete"].as_table().unwrap(); + if paquete.contains_key("abi_dependencias") { + let abi_depend_arr = paquete["abi_dependencias"] + .as_array() + .expect("La variable abi_dependencias debe de ser un array!"); + let abi_depend_table = adi["dependencias_adi"] + .as_table() + .expect("Debe de colocar la tabla de dependencias_adi!"); + + let mut salida = Vec::new(); + for i in 0..abi_depend_arr.len() { + salida.push( + abi_depend_table[&abi_depend_arr[i].as_str().unwrap().to_string()] + .as_str() + .unwrap() + .to_string(), + ); + } + salida + } else { + Vec::new() + } +} + pub fn es_abi(path: &str) -> bool { let comando_file = Command::new("file") .arg("-i") diff --git a/src/cli.yml b/src/cli.yml index 9863b56..6dde594 100644 --- a/src/cli.yml +++ b/src/cli.yml @@ -1,12 +1,8 @@ name: ApmPKG -version: "v1.1.1" +version: "v1.2.0" author: Kedap. about: Un administrador de paquetes universal para linux como modelo PKGBUILD args: - - verbose: - short: v - multiple: true - help: Mostrar la salida (modo verbose) - instalard: short: di long: Instalar_dependencia @@ -50,4 +46,10 @@ subcommands: index: 1 - nombre: help: "Nombre del paquete" - index: 2 \ No newline at end of file + index: 2 + - construir: + about: Crea un binario apartir de un archivo adi o abc + args: + - paquete: + help: Ruta del archivo adi o abc a construir el binario + index: 1 \ No newline at end of file diff --git a/src/core_funcions.rs b/src/core_funcions.rs index 41a083f..6c16d60 100644 --- a/src/core_funcions.rs +++ b/src/core_funcions.rs @@ -2,9 +2,10 @@ //uses use { - crate::estructuras::{AdiPaquete, Argumentos, PackageManager}, + crate::estructuras::{AdiPaquete, Argumentos, Banderas, PackageManager, SubComandos}, clap::{load_yaml, App}, colored::*, + psutil, read_input::prelude::*, std::{any::type_name, process::Command}, toml::Value, @@ -28,102 +29,70 @@ pub fn leer_argumentos() -> Argumentos { let yaml = load_yaml!("cli.yml"); let matches = App::from_yaml(yaml).get_matches(); - // Structura de los argumentos Argumentos { - verbose: matches.is_present("verbose"), - - instalar: if let Some(matches) = matches.subcommand_matches("instalar") { + subcomand: if let Some(matches) = matches.subcommand_matches("instalar") { if matches.is_present("paquete") { - matches.value_of("paquete").unwrap().to_string() + SubComandos::Instalar(matches.value_of("paquete").unwrap().to_string()) + } else if matches.is_present("url") { + SubComandos::InstalarUrl(matches.value_of("url").unwrap().to_string()) } else { - String::new() + SubComandos::Ninguno } - } else { - String::new() - }, - - confirmar: if let Some(matches) = matches.subcommand_matches("instalar") { - matches.is_present("confirmar") - } else { - false - }, - - instalar_bin: if let Some(matches) = matches.subcommand_matches("instalar") { - matches.is_present("binario") - } else { - false - }, - - instalar_url: if let Some(matches) = matches.subcommand_matches("instalar") { - if matches.is_present("url") { - matches.value_of("url").unwrap().to_string() + } else if let Some(matches) = matches.subcommand_matches("remover") { + if matches.is_present("paquete") { + SubComandos::Remover(matches.value_of("paquete").unwrap().to_string()) } else { - String::new() + SubComandos::Ninguno } - } else { - String::new() - }, - - dinstal: if let Some(matches) = matches.subcommand_matches("remover") { + } else if matches.is_present("instalard") { + SubComandos::InstalarDependencia(matches.value_of("instalard").unwrap().to_string()) + } else if let Some(matches) = matches.subcommand_matches("crear") { + if matches.is_present("tipo") && matches.is_present("nombre") { + SubComandos::Crear { + tipo: matches.value_of("tipo").unwrap().to_string(), + nombre: matches.value_of("nombre").unwrap().to_string(), + } + } else { + SubComandos::Ninguno + } + } else if let Some(matches) = matches.subcommand_matches("construir") { if matches.is_present("paquete") { - matches.value_of("paquete").unwrap().to_string() + SubComandos::Construir(matches.value_of("paquete").unwrap().to_string()) } else { - String::new() + SubComandos::Ninguno } } else { - String::new() - }, - - dinstal_confi: if let Some(matches) = matches.subcommand_matches("remover") { - matches.is_present("confirmar") - } else { - false + SubComandos::Ninguno }, - instalar_depen: if matches.is_present("instalard") { - matches.value_of("instalard").unwrap().to_string() - } else { - String::new() - }, - - crear_tipo: if let Some(matches) = matches.subcommand_matches("crear") { - if matches.is_present("tipo") { - matches.value_of("tipo").unwrap().to_string() + flags: if let Some(matches) = matches.subcommand_matches("instalar") { + if matches.is_present("confirmar") { + if matches.is_present("binario") { + Banderas::ConfirmarConBinarios + } else { + Banderas::ConfirmarInstalacion + } + } else if matches.is_present("binario") { + if matches.is_present("confirmar") { + Banderas::ConfirmarConBinarios + } else { + Banderas::InstalacionConBinarios + } } else { - String::new() + Banderas::Ninguno } - } else { - String::new() - }, - - crear_nombre: if let Some(matches) = matches.subcommand_matches("crear") { - if matches.is_present("nombre") { - matches.value_of("nombre").unwrap().to_string() + } else if let Some(matches) = matches.subcommand_matches("remover") { + if matches.is_present("confirmar") { + Banderas::ConfirmacionRemove } else { - String::new() + Banderas::Ninguno } } else { - String::new() + Banderas::Ninguno }, } } -pub fn check_args(input: Argumentos) -> String { - if !input.instalar.is_empty() { - "instalar".to_string() - } else if !input.instalar_url.is_empty() { - "instalar_url".to_string() - } else if !input.dinstal.is_empty() { - "remover".to_string() - } else if !input.instalar_depen.is_empty() { - "instalar_depen".to_string() - } else if !input.crear_tipo.is_empty() && !input.crear_nombre.is_empty() { - "crear".to_string() - } else { - "nope".to_string() - } -} - pub fn print_metapkg(pkg: AdiPaquete) { println!( " @@ -212,7 +181,7 @@ fn instalar_paquete(gestor: PackageManager, paquete: &str) -> bool { comando_instalacion.status.to_string() == "exit code: 0" } -pub fn install_depen(file_toml: &str) { +pub fn install_depen(file_toml: &str) -> bool { println!("Administrando dependencias..."); let catalogo = [ "apt", "pacman", "dnf", "snap", "flatpak", "zypper", "yum", "apk", @@ -283,9 +252,12 @@ pub fn install_depen(file_toml: &str) { if ready { println!("Se han resolvido las dependencias de manera correcta"); - break; + return true; } else { contador += 1; + if contador >= manpack.len() { + return false; + } } } } @@ -406,6 +378,18 @@ pub fn binario_abc(path: &str) { let _result = child.wait().unwrap(); } +pub fn verificar_arch(file_toml: &str) -> bool { + let tomy: Value = + toml::from_str(file_toml).expect("Al parcer no escribiste bien el archivo .ADI"); + let paquete = tomy["paquete"].as_table().unwrap(); + if paquete.contains_key("arch") { + let archi = psutil::host::info().architecture().as_str().to_string(); + *paquete["arch"].as_str().unwrap() == archi + } else { + true + } +} + /* Puede ayudar en casos de un programador que apenas se adentra en rust Un ejemplo: yo*/ pub fn type_of(_: T) -> &'static str { diff --git a/src/estructuras.rs b/src/estructuras.rs index 9c75b40..f2ffde9 100644 --- a/src/estructuras.rs +++ b/src/estructuras.rs @@ -1,18 +1,32 @@ // Estructuras use toml::Value; +//Enumeracion de subcomandos + +#[derive(Debug, Clone)] +pub enum SubComandos { + Instalar(String), + InstalarUrl(String), + Remover(String), + InstalarDependencia(String), + Crear { tipo: String, nombre: String }, + Construir(String), + Ninguno, +} + +#[derive(Debug, Clone)] +pub enum Banderas { + ConfirmarInstalacion, + InstalacionConBinarios, + ConfirmarConBinarios, + ConfirmacionRemove, + Ninguno, +} + #[derive(Clone, Debug)] pub struct Argumentos { - pub verbose: bool, - pub instalar: String, - pub confirmar: bool, - pub instalar_bin: bool, - pub instalar_url: String, - pub dinstal: String, - pub dinstal_confi: bool, - pub instalar_depen: String, - pub crear_tipo: String, - pub crear_nombre: String, + pub subcomand: SubComandos, + pub flags: Banderas, } // ADI TOML archivo diff --git a/src/iiabc/core_fn.sh b/src/iiabc/core_fn.sh index 3dfd15f..5248420 100644 --- a/src/iiabc/core_fn.sh +++ b/src/iiabc/core_fn.sh @@ -2,7 +2,7 @@ #Variables de cajon NOMBRE='iiabc' -VERSION='1.0-beta' +VERSION='1.2' TRUE=1 FALSE=0 ROJO='\033[91m' diff --git a/src/main.rs b/src/main.rs index 523d941..170257b 100644 --- a/src/main.rs +++ b/src/main.rs @@ -10,13 +10,21 @@ //use y modulos use { - apmpkg::{archivos, core_funcions, metodos_de_instalacion}, + apmpkg::{archivos, core_funcions, estructuras::*, metodos_de_instalacion}, colored::*, nix::unistd::Uid, std::process, }; -fn instalar(name: &str, no_user: bool, bin: bool) { +fn instalar(name: &str, flags: Banderas) { + let no_user = matches!( + flags, + Banderas::ConfirmarInstalacion | Banderas::ConfirmarConBinarios + ); + let bin = matches!( + flags, + Banderas::InstalacionConBinarios | Banderas::ConfirmarConBinarios + ); println!("{}", "Iniciando instalacion!".green()); let abi = archivos::es_abi(name); if abi { @@ -40,12 +48,18 @@ fn instalar(name: &str, no_user: bool, bin: bool) { ); process::exit(0x0100); } - metodos_de_instalacion::instalar_adi(name, no_user, bin); + let paquetes_externos = metodos_de_instalacion::instalar_adi(name, no_user, bin); + if !paquetes_externos.is_empty() { + for paquete in &paquetes_externos { + instalar_url(paquete, Banderas::ConfirmarInstalacion); + } + instalar(name, flags); + } } } } -fn instalar_url(name: &str, user: bool, bin_bool: bool) { +fn instalar_url(name: &str, flags: Banderas) { println!("Descargando desde la direccion {}", name); let f = archivos::download(name, "file.pmpf"); match f { @@ -58,11 +72,12 @@ fn instalar_url(name: &str, user: bool, bin_bool: bool) { process::exit(0x0100); } } - instalar("file.pmpf", user, bin_bool); + instalar("file.pmpf", flags); archivos::remove_df("file.pmpf"); } -fn dinstalar(name: &str, no_user: bool) { +fn dinstalar(name: &str, flags: Banderas) { + let no_user = matches!(flags, Banderas::ConfirmacionRemove); println!("Desinstalando el paquete {}", name); if !Uid::effective().is_root() { println!( @@ -152,31 +167,34 @@ fn crear_protipo(tipo: &str, nombre: &str) { } } +fn constuir(path: &str) { + let abc = archivos::es_abc(path); + if abc { + let mut child = std::process::Command::new("bash") + .arg("/etc/apmpkg/iiabc/iiabc.sh") + .arg("-b") + .arg(path) + .spawn() + .expect("Algo fallo al intentar ejecutar iiabc"); + let _result = child.wait().unwrap(); + } else { + metodos_de_instalacion::binario_adi(path); + } +} + fn main() { core_funcions::print_banner(); let info_arg = core_funcions::leer_argumentos(); + let flags = info_arg.flags; - // verbose? - if info_arg.verbose { - println!("{}", "Modo verbose: Activado".blue()); - } - - // Separador: - let argu = core_funcions::check_args(info_arg.clone()); - match &argu[..] { - "instalar" => instalar( - &info_arg.instalar, - info_arg.confirmar, - info_arg.instalar_bin, - ), - "instalar_url" => instalar_url( - &info_arg.instalar_url, - info_arg.confirmar, - info_arg.instalar_bin, - ), - "remover" => dinstalar(&info_arg.dinstal, info_arg.dinstal_confi), - "instalar_depen" => instalar_depen(&info_arg.instalar_depen), - "crear" => crear_protipo(&info_arg.crear_tipo, &info_arg.crear_nombre), + //Modificado para no utilizar core_funciones::checkargs + match info_arg.subcomand { + SubComandos::Instalar(path) => instalar(&path, flags), + SubComandos::InstalarUrl(url) => instalar_url(&url, flags), + SubComandos::Remover(path) => dinstalar(&path, flags), + SubComandos::InstalarDependencia(dependencia) => instalar_depen(&dependencia), + SubComandos::Crear { tipo, nombre } => crear_protipo(&tipo, &nombre), + SubComandos::Construir(path) => constuir(&path), _ => { println!("{}", "Intenta con: apmpkg -h o apmpkg --help".green()); process::exit(0x0100); diff --git a/src/metodos_de_instalacion.rs b/src/metodos_de_instalacion.rs index a900881..8c69249 100644 --- a/src/metodos_de_instalacion.rs +++ b/src/metodos_de_instalacion.rs @@ -10,7 +10,7 @@ use { }; // Instalacion apartir de un archivo .adi -pub fn instalar_adi(name: &str, no_user: bool, bin: bool) { +pub fn instalar_adi(name: &str, no_user: bool, bin: bool) -> Vec { println!( "Iniciando instalacion/creacion del paquete desde el archivo: {}", name @@ -20,6 +20,14 @@ pub fn instalar_adi(name: &str, no_user: bool, bin: bool) { core_funcions::clear(); core_funcions::print_banner(); core_funcions::print_metapkg(meta.clone()); + let mut instalacion_adi = meta.nombre.clone(); + instalacion_adi.push_str(".adi"); + let actualizacion = Path::new("/etc/apmpkg/paquetes") + .join(instalacion_adi) + .is_file(); + if actualizacion { + println!("{}{}...", "Actualizando el paquete ".yellow(), meta.nombre); + } if no_user { println!("{}", "Omitiendo la confirmacion...".yellow()); } else { @@ -93,11 +101,27 @@ pub fn instalar_adi(name: &str, no_user: bool, bin: bool) { println!("No existe el conflicto"); } + println!("Verificando requisitos..."); + let arch = core_funcions::verificar_arch(&toml); + if arch { + println!("Requisitos cumplidos"); + } else { + println!( + "{}", + "Error: Al parecer no cuentas con la arquitectura requerida".red() + ); + process::exit(0x0100); + } + let ya_install = core_funcions::local_depen(&toml); if ya_install { println!("Yeah, ya tienes las dependencias instaladas!!!!"); } else { - core_funcions::install_depen(&toml); + let dependencias_instaladas = core_funcions::install_depen(&toml); + if !dependencias_instaladas { + println!("Descargando dependencias externas..."); + return archivos::dependencias_adi(&toml); + } } pb.inc(); @@ -218,6 +242,135 @@ pub fn instalar_adi(name: &str, no_user: bool, bin: bool) { pb.inc(); pb.finish_print("Se realizo con exito la instalacion!"); core_funcions::msg_end(&toml); + Vec::new() +} + +pub fn binario_adi(path: &str) { + println!("Creando binario desde el archivo {}...", path); + let toml = archivos::read_fs(path); + let meta = archivos::read_adi(&toml); + core_funcions::clear(); + core_funcions::print_banner(); + println!("Iniciando la construccion del paquete {}...", meta.nombre); + + //Progress bar + let contador_bar = 6; + let mut pb = ProgressBar::new(contador_bar); + pb.format("(->.)"); + pb.inc(); + thread::sleep(Duration::from_secs(1)); + + //Directorios + let mut dird = String::new(); + dird.push_str(&meta.nombre); + dird.push_str(".d/"); + let pkgd = Path::new(&dird); + if pkgd.exists() { + let borrar = core_funcions::quess( + "Al parecer el directorio de trabajo ya esta creado, quiere borrarlo?", + ); + if borrar { + println!("Borrando el directorio..."); + archivos::remove_dd(pkgd.to_str().unwrap()); + } else { + println!("No se puede continuar a menos que se elimine dicho directorio"); + process::exit(0x0100); + } + } + + //Descarga de las fuentes + let directorio = archivos::new_dir(&pkgd.to_str().unwrap()); + match directorio { + Ok(_a) => println!("La creacion del directorio a sido correcto"), + Err(e) => { + println!("{} {}", "Ocurrio un error al crear el directorio:".red(), e); + process::exit(0x0100); + } + } + pb.inc(); + println!("{}", "Iniciando la descarga de las fuentes...".green()); + let mut acd_file = String::new(); + acd_file.push_str(&meta.nombre); + acd_file.push('-'); + acd_file.push_str(&meta.version); + acd_file.push_str(".acd.tar"); + //if... + let existe_local = archivos::source_es_local(&toml); + let gito = archivos::source_git_q(&toml); + if gito { + let des = archivos::read_adi_down(&toml, gito); + let git_path = pkgd.join(&des.src); + let source_git = archivos::read_git(&toml); + archivos::git_clone(&source_git, &git_path.to_str().unwrap()); + } else if existe_local { + let path_local = archivos::leer_fuente_local(&toml); + archivos::copy_dd(&path_local, &pkgd.join(&acd_file).to_str().unwrap()) + } else { + let des = archivos::read_adi_down(&toml, gito); + let f = archivos::download(&des.url, &pkgd.join(&acd_file).to_str().unwrap()); + match f { + Ok(_f) => println!("Correcto"), + Err(_e) => { + println!( + "{}", + "Ocurrio un error al hacer la peticion, intenta de nuevo".red() + ); + process::exit(0x0100); + } + } + println!("Se termino la descarga"); + } + + //Integridad + pb.inc(); + let git_o_local: bool; + if gito || existe_local { + git_o_local = true; + } else { + git_o_local = false; + } + let des = archivos::read_adi_down(&toml, git_o_local); + println!("Verificando la integridad del archivo..."); + if des.sha256sum == "SALTAR" { + println!("{}", "Se ha saltado la verificacion!!!".red()); + } else { + let suma = archivos::hash_sum(&pkgd.join(&acd_file).to_str().unwrap(), &des.sha256sum); + if suma { + println!("{}", "Verificacion correcta".green()); + } else { + println!("{}", "La verificacion no coinside, vuelve intentar".red()); + process::exit(0x0100); + } + } + + //extraer fuentes + pb.inc(); + if !gito { + println!("Extrayendo el tarball"); + let taa = archivos::e_tar( + &pkgd.join(&acd_file).to_str().unwrap(), + &pkgd.to_str().unwrap(), + ); + match taa { + Ok(_taa) => println!("El tarball se descomprimio con exito"), + Err(_e) => { + println!("{}", "Ocurrio un error al descomprimir el tarball".red()); + process::exit(0x0100); + } + } + } + + //Empaquetamiento + pb.inc(); + archivos::copy_dd(path, &pkgd.join("apkg.adi").to_str().unwrap()); + let mut nombre_bin = String::new(); + nombre_bin.push_str(&meta.nombre); + nombre_bin.push('-'); + nombre_bin.push_str(&meta.version); + archivos::crate_bin(&pkgd.to_str().unwrap(), &nombre_bin, &toml); + println!("Limpiando..."); + archivos::remove_dd(&pkgd.to_str().unwrap()); + pb.inc(); } // Instalacion apartir de un archivo .abi.tar