diff --git a/.gitignore b/.gitignore index 3e8fdf9..1500f5d 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,3 @@ target/ -testdir/test-tar.tar.gz -testdir/test-tar.d/ -testdir/test.adi +testdir/extraer_tar.d +testdir/test_descarga.adi diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 4540c8f..3345dfa 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -16,11 +16,11 @@ Todas las solitudes de nuevas de funciones deben de ser enviadas a [el reatreado ## Reportes de bugs -Todos los parches deben enviarse a github como [pull requests](https://github.com/Kedap/apmpkg/pulls) si usted deseea empezar a contribuir en ApmPKG puede empezar a atender [Buscando ayuda](https://github.com/Kedap/apmpkg/labels/buscando%20ayuda) o [Solicitud de funciones](https://github.com/Kedap/apmpkg/labels/mejora) +Todos los parches deben enviarse a github como [pull requests](https://github.com/Kedap/apmpkg/pulls) si usted deseea empezar a contribuir en ApmPKG puede empezar a atender [Buscando ayuda](https://github.com/Kedap/apmpkg/labels/help%20wanted%20%3Asos%3A), [Solicitud de funciones](https://github.com/Kedap/apmpkg/labels/enhancement%20%20%E2%AD%90%EF%B8%8F) o en [la pagina de contribucion](https://github.com/Kedap/apmpkg/contribute) ## 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. 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 +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 [bug](https://github.com/Kedap/apmpkg/labels/bug%20%3Alady_beetle%3A). 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 b953215..2a4e55e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -16,7 +16,7 @@ checksum = "23ac7c30002a5accbf7e8987d0632fa6de155b7c3d39d0067317a391e00a2ef6" [[package]] name = "apmpkg" -version = "1.4.0" +version = "1.4.1" dependencies = [ "clap", "colored", @@ -79,9 +79,9 @@ dependencies = [ [[package]] name = "bumpalo" -version = "3.6.1" +version = "3.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "63396b8a4b9de3f4fdfb320ab6080762242f66a8ef174c49d8e19b674db4cdbe" +checksum = "9c59e7af012c713f529e7a3ee57ce9b31ddd858d4b512923602f74608b009631" [[package]] name = "bytes" @@ -91,9 +91,9 @@ checksum = "b700ce4376041dcd0a327fd0097c41095743c4c8af8887265942faf1100bd040" [[package]] name = "cc" -version = "1.0.67" +version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3c69b077ad434294d3ce9f1f6143a2a4b89a8a2d54ef813d85003a4fd1137fd" +checksum = "e70cc2f62c6ce1868963827bd677764c62d07c3d9a3e1fb1177ee1a9ab199eb2" [[package]] name = "cfg-if" @@ -151,10 +151,13 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ea221b5284a47e40033bf9b66f35f984ec0ea2931eb03505246cd27a963f981b" [[package]] -name = "cpuid-bool" -version = "0.1.2" +name = "cpufeatures" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8aebca1129a03dc6dc2b127edd729435bbc4a37e1d5f4d7513165089ceb02634" +checksum = "66c99696f6c9dd7f35d486b9d04d7e6e202aa3e8c40d553f2fdf5e7e0c6a71ef" +dependencies = [ + "libc", +] [[package]] name = "crc32fast" @@ -167,9 +170,9 @@ dependencies = [ [[package]] name = "crossbeam-channel" -version = "0.5.0" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dca26ee1f8d361640700bde38b2c37d8c22b3ce2d360e1fc1c74ea4b0aa7d775" +checksum = "06ed27e177f16d65f0f0c22a213e17c696ace5dd64b14258b52f9417ccb52db4" dependencies = [ "cfg-if 1.0.0", "crossbeam-utils", @@ -177,11 +180,10 @@ dependencies = [ [[package]] name = "crossbeam-utils" -version = "0.8.3" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7e9d99fa91428effe99c5c6d4634cdeba32b8cf784fc428a2a687f61a952c49" +checksum = "d82cfc11ce7f2c3faef78d8a684447b40d503d9681acebed6cb728d45940c4db" dependencies = [ - "autocfg", "cfg-if 1.0.0", "lazy_static", ] @@ -208,9 +210,9 @@ dependencies = [ [[package]] name = "derive_more" -version = "0.99.14" +version = "0.99.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5cc7b9cef1e351660e5443924e4f43ab25fbbed3e9a5f052df3677deb4d6b320" +checksum = "40eebddd2156ce1bb37b20bbe5151340a31828b1f2d22ba4141f3531710e38df" dependencies = [ "proc-macro2", "quote", @@ -298,37 +300,38 @@ dependencies = [ [[package]] name = "futures-channel" -version = "0.3.13" +version = "0.3.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c2dd2df839b57db9ab69c2c9d8f3e8c81984781937fe2807dc6dcf3b2ad2939" +checksum = "74ed2411805f6e4e3d9bc904c95d5d423b89b3b25dc0250aa74729de20629ff9" dependencies = [ "futures-core", ] [[package]] name = "futures-core" -version = "0.3.13" +version = "0.3.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15496a72fabf0e62bdc3df11a59a3787429221dd0710ba8ef163d6f7a9112c94" +checksum = "af51b1b4a7fdff033703db39de8802c673eb91855f2e0d47dcf3bf2c0ef01f99" [[package]] name = "futures-sink" -version = "0.3.13" +version = "0.3.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85754d98985841b7d4f5e8e6fbfa4a4ac847916893ec511a2917ccd8525b8bb3" +checksum = "c0f30aaa67363d119812743aa5f33c201a7a66329f97d1a887022971feea4b53" [[package]] name = "futures-task" -version = "0.3.13" +version = "0.3.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa189ef211c15ee602667a6fcfe1c1fd9e07d42250d2156382820fba33c9df80" +checksum = "bbe54a98670017f3be909561f6ad13e810d9a51f3f061b902062ca3da80799f2" [[package]] name = "futures-util" -version = "0.3.13" +version = "0.3.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1812c7ab8aedf8d6f2701a43e1243acdbcc2b36ab26e2ad421eb99ac963d96d1" +checksum = "67eb846bfd58e44a8481a00049e82c43e0ccb5d61f8dc071057cb19249dd4d78" dependencies = [ + "autocfg", "futures-core", "futures-task", "pin-project-lite", @@ -347,9 +350,9 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.2" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9495705279e7140bf035dde1f6e750c162df8b625267cd52cc44e0b156732c8" +checksum = "7fcd999463524c52659517fe2cea98493cfe485d10565e7b0fb07dbba7ad2753" dependencies = [ "cfg-if 1.0.0", "libc", @@ -364,9 +367,9 @@ checksum = "9b919933a397b79c37e33b77bb2aa3dc8eb6e165ad809e58ff75bc7db2e34574" [[package]] name = "h2" -version = "0.3.1" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d832b01df74254fe364568d6ddc294443f61cbec82816b60904303af87efae78" +checksum = "825343c4eef0b63f541f8903f395dc5beb362a979b5799a84062527ef1e37726" dependencies = [ "bytes", "fnv", @@ -383,24 +386,24 @@ dependencies = [ [[package]] name = "hashbrown" -version = "0.9.1" +version = "0.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7afe4a420e3fe79967a00898cc1f4db7c8a49a9333a29f8a4bd76a253d5cd04" +checksum = "ab5ef0d4909ef3724cc8cce6ccc8572c5c817592e9285f5464f8e86f8bd3726e" [[package]] name = "hermit-abi" -version = "0.1.18" +version = "0.1.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "322f4de77956e22ed0e5032c359a0f1273f1f7f0d79bfa3b8ffbc730d7fbcc5c" +checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" dependencies = [ "libc", ] [[package]] name = "http" -version = "0.2.3" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7245cd7449cc792608c3c8a9eaf69bd4eabbabf802713748fd739c98b82f0747" +checksum = "527e8c9ac747e28542699a951517aa9a6945af506cd1f2e1b53a576c17b6cc11" dependencies = [ "bytes", "fnv", @@ -409,31 +412,32 @@ dependencies = [ [[package]] name = "http-body" -version = "0.4.0" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2861bd27ee074e5ee891e8b539837a9430012e249d7f0ca2d795650f579c1994" +checksum = "60daa14be0e0786db0f03a9e57cb404c9d756eed2b6c62b9ea98ec5743ec75a9" dependencies = [ "bytes", "http", + "pin-project-lite", ] [[package]] name = "httparse" -version = "1.3.5" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "615caabe2c3160b313d52ccc905335f4ed5f10881dd63dc5699d47e90be85691" +checksum = "f3a87b616e37e93c22fb19bcd386f02f3af5ea98a25670ad0fce773de23c5e68" [[package]] name = "httpdate" -version = "0.3.2" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "494b4d60369511e7dea41cf646832512a94e542f68bb9c49e54518e0f468eb47" +checksum = "6456b8a6c8f33fee7d958fcd1b60d55b11940a79e63ae87013e6d22e26034440" [[package]] name = "hyper" -version = "0.14.4" +version = "0.14.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8e946c2b1349055e0b72ae281b238baf1a3ea7307c7e9f9d64673bdd9c26ac7" +checksum = "0b61cf2d1aebcf6e6352c97b81dc2244ca29194be1b276f5d8ad5c6330fffb11" dependencies = [ "bytes", "futures-channel", @@ -445,7 +449,7 @@ dependencies = [ "httparse", "httpdate", "itoa", - "pin-project", + "pin-project-lite", "socket2", "tokio", "tower-service", @@ -468,9 +472,9 @@ dependencies = [ [[package]] name = "idna" -version = "0.2.2" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89829a5d69c23d348314a7ac337fe39173b61149a9864deabd260983aed48c21" +checksum = "418a0a6fab821475f634efe3ccc45c013f742efe03d853e8d3355d5cb850ecf8" dependencies = [ "matches", "unicode-bidi", @@ -479,9 +483,9 @@ dependencies = [ [[package]] name = "indexmap" -version = "1.6.2" +version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "824845a0bf897a9042383849b02c1bc219c2383772efcd5c6f9766fa4b81aef3" +checksum = "bc633605454125dec4b66843673f01c7df2b89479b32e0ed634e43a91cff62a5" dependencies = [ "autocfg", "hashbrown", @@ -489,18 +493,18 @@ dependencies = [ [[package]] name = "instant" -version = "0.1.9" +version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61124eeebbd69b8190558df225adf7e4caafce0d743919e5d6b19652314ec5ec" +checksum = "bee0328b1209d157ef001c94dd85b4f8f64139adb0eac2659f4b08382b2f474d" dependencies = [ "cfg-if 1.0.0", ] [[package]] name = "ipnet" -version = "2.3.0" +version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47be2f14c678be2fdcab04ab1171db51b2762ce6f0a8ee87c8dd4a04ed216135" +checksum = "68f2d64f2edebec4ce84ad108148e67e1064789bee435edc5b60ad398714a3a9" [[package]] name = "itoa" @@ -510,9 +514,9 @@ checksum = "dd25036021b0de88a0aff6b850051563c6516d0bf53f8638938edbb9de732736" [[package]] name = "js-sys" -version = "0.3.48" +version = "0.3.51" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc9f84f9b115ce7843d60706df1422a916680bfdfcbdb0447c5614ff9d7e4d78" +checksum = "83bdfbace3a0e81a4253f73b49e960b053e396a11012cbd49b9b74d6a2b67062" dependencies = [ "wasm-bindgen", ] @@ -525,15 +529,15 @@ checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" [[package]] name = "libc" -version = "0.2.89" +version = "0.2.98" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "538c092e5586f4cdd7dd8078c4a79220e3e168880218124dcbce860f0ea938c6" +checksum = "320cfe77175da3a483efed4bc0adc1968ca050b098ce4f2f1c13a56626128790" [[package]] name = "lock_api" -version = "0.4.2" +version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd96ffd135b2fd7b973ac026d28085defbe8983df057ced3eb4f2130b0831312" +checksum = "0382880606dff6d15c9476c416d18690b72742aa7b605bb6dd6ec9030fbf07eb" dependencies = [ "scopeguard", ] @@ -564,9 +568,9 @@ checksum = "7ffc5c5338469d4d3ea17d269fa8ea3512ad247247c30bd2df69e68309ed0a08" [[package]] name = "memchr" -version = "2.3.4" +version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ee1c47aaa256ecabcaea351eae4a9b01ef39ed810004e298d2511ed284b1525" +checksum = "b16bd47d9e329435e309c58469fe0791c2d0d1ba96ec0954152a5ae2b04387dc" [[package]] name = "mime" @@ -586,9 +590,9 @@ dependencies = [ [[package]] name = "mio" -version = "0.7.10" +version = "0.7.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2182a122f3b7f3f5329cb1972cee089ba2459a0a80a56935e6e674f096f8d839" +checksum = "8c2bdb6314ec10835cd3293dd268473a835c02b7b352e788be788b3c6ca6bb16" dependencies = [ "libc", "log", @@ -599,11 +603,10 @@ dependencies = [ [[package]] name = "miow" -version = "0.3.6" +version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a33c1b55807fbed163481b5ba66db4b2fa6cde694a5027be10fb724206c5897" +checksum = "b9f1c5b025cda876f66ef43a113f91ebc9f4ccef34843000e0adf6ebbab84e21" dependencies = [ - "socket2", "winapi", ] @@ -671,9 +674,9 @@ dependencies = [ [[package]] name = "once_cell" -version = "1.7.2" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af8b08b04175473088b46763e51ee54da5f9a164bc162f615b91bc179dbf15a3" +checksum = "692fcb63b64b1758029e0a96ee63e049ce8c5948587f2f7208df04625e5f6b56" [[package]] name = "opaque-debug" @@ -683,9 +686,9 @@ checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" [[package]] name = "openssl" -version = "0.10.33" +version = "0.10.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a61075b62a23fef5a29815de7536d940aa35ce96d18ce0cc5076272db678a577" +checksum = "549430950c79ae24e6d02e0b7404534ecf311d94cc9f861e9e4020187d13d885" dependencies = [ "bitflags 1.2.1", "cfg-if 1.0.0", @@ -697,15 +700,15 @@ dependencies = [ [[package]] name = "openssl-probe" -version = "0.1.2" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77af24da69f9d9341038eba93a073b1fdaaa1b788221b00a69bce9e762cb32de" +checksum = "28988d872ab76095a6e6ac88d99b54fd267702734fd7ffe610ca27f533ddb95a" [[package]] name = "openssl-sys" -version = "0.9.61" +version = "0.9.65" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "313752393519e876837e09e1fa183ddef0be7735868dced3196f4472d536277f" +checksum = "7a7907e3bfa08bb85105209cdfcb6c63d109f8f6c1ed6ca318fff5c1853fbc1d" dependencies = [ "autocfg", "cc", @@ -757,31 +760,11 @@ version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d4fd5641d01c8f18a23da7b6fe29298ff4b55afcccdf78973b24cf3175fee32e" -[[package]] -name = "pin-project" -version = "1.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96fa8ebb90271c4477f144354485b8068bd8f6b78b428b01ba892ca26caf0b63" -dependencies = [ - "pin-project-internal", -] - -[[package]] -name = "pin-project-internal" -version = "1.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "758669ae3558c6f74bd2a18b41f7ac0b5a195aea6639d6a9b5e5d1ad5ba24c0b" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - [[package]] name = "pin-project-lite" -version = "0.2.6" +version = "0.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc0e1f259c92177c30a4c9d177246edd0a3568b25756a977d0632cf8fa37e905" +checksum = "8d31d11c69a6b52a174b42bdc0c30e5e11670f90788b2c471c31c1d17d449443" [[package]] name = "pin-utils" @@ -809,9 +792,9 @@ checksum = "ac74c624d6b2d21f425f752262f42188365d7b8ff1aff74c82e45136510a4857" [[package]] name = "proc-macro2" -version = "1.0.24" +version = "1.0.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e0704ee1a7e00d7bb417d0770ea303c1bccbabf0ef1667dae92b5967f5f8a71" +checksum = "5c7ed8b8c7b886ea3ed7dde405212185f423ab44682667c8c6dd14aa1d9f6612" dependencies = [ "unicode-xid", ] @@ -846,9 +829,9 @@ dependencies = [ [[package]] name = "rand" -version = "0.8.3" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ef9e7e66b4468674bfcb0c81af8b7fa0bb154fa9f28eb840da5c447baeb8d7e" +checksum = "2e7573632e6454cf6b99d7aac4ccca54be06da05aca2ef7423d22d27d4d4bcd8" dependencies = [ "libc", "rand_chacha", @@ -858,9 +841,9 @@ dependencies = [ [[package]] name = "rand_chacha" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e12735cf05c9e10bf21534da50a147b924d555dc7a547c42e6bb2d5b6017ae0d" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" dependencies = [ "ppv-lite86", "rand_core", @@ -868,18 +851,18 @@ dependencies = [ [[package]] name = "rand_core" -version = "0.6.2" +version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34cf66eb183df1c5876e2dcf6b13d57340741e8dc255b48e40a26de954d06ae7" +checksum = "d34f1408f55294453790c48b2f1ebbb1c5b4b7563eb1f418bcfcfdbb06ebb4e7" dependencies = [ "getrandom", ] [[package]] name = "rand_hc" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3190ef7066a446f2e7f42e239d161e905420ccab01eb967c9eb27d21b2322a73" +checksum = "d51e9f596de227fda2ea6c84607f5558e196eeaf43c986b724ba4fb8fdf497e7" dependencies = [ "rand_core", ] @@ -892,9 +875,9 @@ checksum = "b57518cc6538a2eb7dce826e24fa51d0b7cf8e744ee10c7f56259cdec40050e5" [[package]] name = "redox_syscall" -version = "0.2.5" +version = "0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94341e4e44e24f6b591b59e47a8a027df12e008d73fd5672dbea9cc22f4507d9" +checksum = "5ab49abadf3f9e1c4bc499e8845e152ad87d2ad2d30371841171169e9d75feee" dependencies = [ "bitflags 1.2.1", ] @@ -910,9 +893,9 @@ dependencies = [ [[package]] name = "reqwest" -version = "0.11.2" +version = "0.11.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf12057f289428dbf5c591c74bf10392e4a8003f993405a902f20117019022d4" +checksum = "246e9f61b9bb77df069a947682be06e31ac43ea37862e244a69f177694ea6d22" dependencies = [ "base64", "bytes", @@ -967,9 +950,9 @@ checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" [[package]] name = "security-framework" -version = "2.1.2" +version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d493c5f39e02dfb062cd8f33301f90f9b13b650e8c1b1d0fd75c19dd64bff69d" +checksum = "23a2ac85147a3a11d77ecf1bc7166ec0b92febfa4461c37944e180f319ece467" dependencies = [ "bitflags 1.2.1", "core-foundation", @@ -980,9 +963,9 @@ dependencies = [ [[package]] name = "security-framework-sys" -version = "2.1.1" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dee48cdde5ed250b0d3252818f646e174ab414036edb884dde62d80a3ac6082d" +checksum = "7e4effb91b4b8b6fb7732e670b6cee160278ff8e6bf485c7805d9e319d76e284" dependencies = [ "core-foundation-sys", "libc", @@ -990,9 +973,9 @@ dependencies = [ [[package]] name = "serde" -version = "1.0.124" +version = "1.0.126" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd761ff957cb2a45fbb9ab3da6512de9de55872866160b23c25f1a841e99d29f" +checksum = "ec7505abeacaec74ae4778d9d9328fe5a5d04253220a85c4ee022239fc996d03" [[package]] name = "serde_json" @@ -1019,31 +1002,31 @@ dependencies = [ [[package]] name = "sha2" -version = "0.9.3" +version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa827a14b29ab7f44778d14a88d3cb76e949c45083f7dbfa507d0cb699dc12de" +checksum = "b362ae5752fd2137731f9fa25fd4d9058af34666ca1966fb969119cc35719f12" dependencies = [ "block-buffer", "cfg-if 1.0.0", - "cpuid-bool", + "cpufeatures", "digest", "opaque-debug", ] [[package]] name = "signal-hook-registry" -version = "1.3.0" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16f1d0fef1604ba8f7a073c7e701f213e056707210e9020af4528e0101ce11a6" +checksum = "e51e73328dc4ac0c7ccbda3a494dfa03df1de2f46018127f60c693f2648455b0" dependencies = [ "libc", ] [[package]] name = "slab" -version = "0.4.2" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c111b5bd5695e56cffe5129854aa230b39c93a305372fdbb2668ca2394eea9f8" +checksum = "f173ac3d1a7e3b28003f40de0b5ce7fe2710f9b9dc3fc38664cebee46b3b6527" [[package]] name = "smallvec" @@ -1053,11 +1036,10 @@ checksum = "fe0f37c9e8f3c5a4a66ad655a93c74daac4ad00c441533bf5c6e7990bb42604e" [[package]] name = "socket2" -version = "0.3.19" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "122e570113d28d773067fab24266b66753f6ea915758651696b6e35e49f88d6e" +checksum = "9e3dfc207c526015c632472a77be09cf1b6e46866581aecae5cc38fb4235dea2" dependencies = [ - "cfg-if 1.0.0", "libc", "winapi", ] @@ -1070,9 +1052,9 @@ checksum = "b4d15c810519a91cf877e7e36e63fe068815c678181439f2f29e2562147c3694" [[package]] name = "syn" -version = "1.0.64" +version = "1.0.74" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fd9d1e9976102a03c542daa2eff1b43f9d72306342f3f8b3ed5fb8908195d6f" +checksum = "1873d832550d4588c3dbc20f01361ab00bfe741048f71e3fecf145a7cc18b29c" dependencies = [ "proc-macro2", "quote", @@ -1081,9 +1063,9 @@ dependencies = [ [[package]] name = "tar" -version = "0.4.33" +version = "0.4.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0bcfbd6a598361fda270d82469fff3d65089dc33e175c9a131f7b4cd395f228" +checksum = "7d779dc6aeff029314570f666ec83f19df7280bb36ef338442cfa8c604021b80" dependencies = [ "filetime", "libc", @@ -1115,18 +1097,18 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.25" +version = "1.0.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa6f76457f59514c7eeb4e59d891395fab0b2fd1d40723ae737d64153392e9c6" +checksum = "93119e4feac1cbe6c798c34d3a53ea0026b0b1de6a120deef895137c0529bfe2" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.25" +version = "1.0.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a36768c0fbf1bb15eca10defa29526bda730a2376c2ab4393ccfa16fb1a318d" +checksum = "060d69a0afe7796bf42e9e2ff91f5ee691fb15c53d38b4b62a9a53eb23164745" dependencies = [ "proc-macro2", "quote", @@ -1145,9 +1127,9 @@ dependencies = [ [[package]] name = "tinyvec" -version = "1.1.1" +version = "1.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "317cca572a0e89c3ce0ca1f1bdc9369547fe318a683418e42ac8f59d14701023" +checksum = "848a1e1181b9f6753b5e96a092749e29b11d19ede67dfbbd6c7dc7e0f49b5338" dependencies = [ "tinyvec_macros", ] @@ -1160,9 +1142,9 @@ checksum = "cda74da7e1a664f795bb1f8a87ec406fb89a02522cf6e50620d016add6dbbf5c" [[package]] name = "tokio" -version = "1.3.0" +version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d56477f6ed99e10225f38f9f75f872f29b8b8bd8c0b946f63345bb144e9eeda" +checksum = "4b7b349f11a7047e6d1276853e612d152f5e8a352c61917887cc2169e2366b4c" dependencies = [ "autocfg", "bytes", @@ -1180,9 +1162,9 @@ dependencies = [ [[package]] name = "tokio-macros" -version = "1.1.0" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "caf7b11a536f46a809a8a9f0bb4237020f70ecbf115b842360afb127ea2fda57" +checksum = "54473be61f4ebe4efd09cec9bd5d16fa51d70ea0192213d754d2d500457db110" dependencies = [ "proc-macro2", "quote", @@ -1201,9 +1183,9 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.6.4" +version = "0.6.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec31e5cc6b46e653cf57762f36f71d5e6386391d88a72fd6db4508f8f676fb29" +checksum = "1caa0b0c8d94a049db56b5acf8cba99dc0623aab1b26d5b5f5e2d945846b3592" dependencies = [ "bytes", "futures-core", @@ -1230,9 +1212,9 @@ checksum = "360dfd1d6d30e05fda32ace2c8c70e9c0a9da713275777f5a4dbb8a1893930c6" [[package]] name = "tracing" -version = "0.1.25" +version = "0.1.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01ebdc2bb4498ab1ab5f5b73c5803825e60199229ccba0698170e3be0e7f959f" +checksum = "09adeb8c97449311ccd28a427f96fb563e7fd31aabf994189879d9da2394b89d" dependencies = [ "cfg-if 1.0.0", "pin-project-lite", @@ -1241,9 +1223,9 @@ dependencies = [ [[package]] name = "tracing-core" -version = "0.1.17" +version = "0.1.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f50de3927f93d202783f4513cda820ab47ef17f624b03c096e86ef00c67e6b5f" +checksum = "a9ff14f98b1a4b289c6248a023c1c2fa1491062964e9fed67ab29c4e4da4a052" dependencies = [ "lazy_static", ] @@ -1268,18 +1250,18 @@ checksum = "ccb97dac3243214f8d8507998906ca3e2e0b900bf9bf4870477f125b82e68f6e" [[package]] name = "unicode-bidi" -version = "0.3.4" +version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49f2bd0c6468a8230e1db229cff8029217cf623c767ea5d60bfbd42729ea54d5" +checksum = "eeb8be209bb1c96b7c177c7420d26e04eccacb0eeae6b980e35fcb74678107e0" dependencies = [ "matches", ] [[package]] name = "unicode-normalization" -version = "0.1.17" +version = "0.1.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07fbfce1c8a97d547e8b5334978438d9d6ec8c20e38f56d4a4374d181493eaef" +checksum = "d54590932941a9e9266f0832deed84ebe1bf2e4c9e4a3554d393d18f5e854bf9" dependencies = [ "tinyvec", ] @@ -1292,15 +1274,15 @@ checksum = "9337591893a19b88d8d87f2cec1e73fad5cdfd10e5a6f349f498ad6ea2ffb1e3" [[package]] name = "unicode-xid" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7fe0bb3479651439c9112f72b6c505038574c9fbb575ed1bf3b797fa39dd564" +checksum = "8ccb82d61f80a663efe1f787a51b16b5a51e3314d6ac365b08639f52387b33f3" [[package]] name = "url" -version = "2.2.1" +version = "2.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ccd964113622c8e9322cfac19eb1004a07e636c545f325da085d5cdde6f1f8b" +checksum = "a507c383b2d33b5fc35d1861e77e6b383d158b2da5e14fe51b83dfedf6fd578c" dependencies = [ "form_urlencoded", "idna", @@ -1310,9 +1292,9 @@ dependencies = [ [[package]] name = "vcpkg" -version = "0.2.11" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b00bca6106a5e23f3eee943593759b7fcddb00554332e856d990c893966879fb" +checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" [[package]] name = "vec_map" @@ -1350,9 +1332,9 @@ checksum = "fd6fbd9a79829dd1ad0cc20627bf1ed606756a7f77edff7b66b7064f9cb327c6" [[package]] name = "wasm-bindgen" -version = "0.2.71" +version = "0.2.74" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ee1280240b7c461d6a0071313e08f34a60b0365f14260362e5a2b17d1d31aa7" +checksum = "d54ee1d4ed486f78874278e63e4069fc1ab9f6a18ca492076ffb90c5eb2997fd" dependencies = [ "cfg-if 1.0.0", "serde", @@ -1362,9 +1344,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.71" +version = "0.2.74" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b7d8b6942b8bb3a9b0e73fc79b98095a27de6fa247615e59d096754a3bc2aa8" +checksum = "3b33f6a0694ccfea53d94db8b2ed1c3a8a4c86dd936b13b9f0a15ec4a451b900" dependencies = [ "bumpalo", "lazy_static", @@ -1377,9 +1359,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-futures" -version = "0.4.21" +version = "0.4.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e67a5806118af01f0d9045915676b22aaebecf4178ae7021bc171dab0b897ab" +checksum = "5fba7978c679d53ce2d0ac80c8c175840feb849a161664365d1287b41f2e67f1" dependencies = [ "cfg-if 1.0.0", "js-sys", @@ -1389,9 +1371,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.71" +version = "0.2.74" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5ac38da8ef716661f0f36c0d8320b89028efe10c7c0afde65baffb496ce0d3b" +checksum = "088169ca61430fe1e58b8096c24975251700e7b1f6fd91cc9d59b04fb9b18bd4" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -1399,9 +1381,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.71" +version = "0.2.74" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc053ec74d454df287b9374ee8abb36ffd5acb95ba87da3ba5b7d3fe20eb401e" +checksum = "be2241542ff3d9f241f5e2cb6dd09b37efe786df8851c54957683a49f0987a97" dependencies = [ "proc-macro2", "quote", @@ -1412,15 +1394,15 @@ dependencies = [ [[package]] name = "wasm-bindgen-shared" -version = "0.2.71" +version = "0.2.74" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d6f8ec44822dd71f5f221a5847fb34acd9060535c1211b70a05844c0f6383b1" +checksum = "d7cff876b8f18eed75a66cf49b65e7f967cb354a7aa16003fb55dbfd25b44b4f" [[package]] name = "web-sys" -version = "0.3.48" +version = "0.3.51" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec600b26223b2948cedfde2a0aa6756dcf1fef616f43d7b3097aaf53a6c4d92b" +checksum = "e828417b379f3df7111d3a2a9e5753706cae29c41f7c4029ee9fd77f3e09e582" dependencies = [ "js-sys", "wasm-bindgen", diff --git a/Cargo.toml b/Cargo.toml index 6d30063..02502ec 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "apmpkg" -version = "1.4.0" +version = "1.4.1" authors = ["kedap "] edition = "2018" description = "Un administrador de paquetes universal para linux como modelo: PKGBUILD" diff --git a/README.md b/README.md index 0878c07..ebd7f07 100644 --- a/README.md +++ b/README.md @@ -7,15 +7,12 @@ A Package Manager as a model: PKGBUILD

# NOTICIAS -- Se ha liberado la versión: v1.4 Para todos!!! +- Se ha liberado la versión: v1.4.1 Para todos!!! - Creacion de los binarios para todas las distribuciones disponibles - Se a subido ApmPKG esta en [AUR](https://aur.archlinux.org/packages/apmpkg/) -- Ahora ya se puede ejecutar scripts pre-instalacion -- Correccion de pequeños errores -- Se buscan dependencias tambien si estan instaladas por apmpkg -- Agregamos el soporte para Slackpkg -- Se agregaron tests en el codigo -- Se manejan mejor los errores +- Se cambio slackpkg por slapt-get para administrar mejor los paquetes en Slackware +- Arreglo sobre npm para instalar modulos y no dependencias que no sean modulos de js +- Correcciones menores * * * Un gestor de paquetes que desea ser una poderosa herramienta universal para linux con el fin de la cracion e instalacion de paquetes. @@ -35,8 +32,7 @@ Los gestores que son soportado por ApmPKG: - [x] Yum - [x] Apk - [x] Pkg (termux) -- [x] Npm -- [x] Slackpkg +- [x] Slapt-get - [ ] Emerge - [ ] Yay - [ ] Nix @@ -47,6 +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 +- npm - bundle - wget - fakeroot @@ -58,7 +55,7 @@ Para ello puedes dirijirte a la seccion de [lanzamientos](https://github.com/Ked # Caracteristicas ![Esquema](img/esquema.png) -- Creacion de paquetes de para lenguajes de script, un claro ejemplo es python y ruby. Con soporte con pip y bundle [mas info aqui](doc/creando_paquetes.md/#adi) +- Creacion de paquetes de para lenguajes de scripting, un claro ejemplo es python, javascript/typescript y ruby. Con soporte con pip, bundle y npm [mas info aqui](doc/creando_paquetes.md/#adi) - Facilidad de creacion de paquetes sobre el modelo de [PKGBUILD de archlinux](https://wiki.archlinux.org/index.php/PKGBUILD) es decir que tenemos soporte para AUR, aun que tenemos ciertas [limitaciones para decir que tenemos soporte para todos los PKGBUILD's existentes](doc/creando_paquetes.md/#complicaciones-abc) pero de igual manera estamos trabajando en eso - 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` @@ -79,6 +76,14 @@ No, solo para aquellas que tenemos soporte para las dependencias, gestores de pa de igual manera no todas las dependencias se llaman igual en todas las distribuciones que al igual se soluciona al preguntar por algun nombre de dependencias alternativas que se encuentre en sus gestor de paquete de preferencia +**¿Porque no existe un binario para X distribucion si el gestor X esta disponible?** + +Aunque intentemos hacer eso no podemos, generamos los binario de las distribuciones mas utilizadas y aparte cada distribucion tiene sus arquitecturas y maneras de empaquetado, en el caso de que no brindemos dicho binario se recomienda altamente [compilarlo](doc/modos_de_instalacion.md) + +**¿Existe una documentacion en ingles / Is there an English documentation?** + +Esta en nuestro planes agregar una documentacion en ingles. It will soon be available + **¿Porque no implentan X caracteristica?** Por lo mismo, pues no compartes tu idea, estaremos felices de conocer tu idea, puedes apoyar [aqui](https://github.com/Kedap/apmpkg/issues) y/o si quieres mas informacion [aqui](CONTRIBUTING.md) diff --git a/doc/creando_paquetes.md b/doc/creando_paquetes.md index d511ee1..e131e03 100644 --- a/doc/creando_paquetes.md +++ b/doc/creando_paquetes.md @@ -7,8 +7,9 @@ Tabla de contenidos 2. [Dependencias externas](#dependencias-adi) 3. [Gemas de ruby](#gem) 4. [Pip2 / pip3](#pip) - 5. [descarga](#descarga) - 6. [instalacion](#instalacion) + 5. [Npm](#npm) + 6. [descarga](#descarga) + 7. [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) @@ -53,6 +54,11 @@ file = "Gemfile" #packages = ["requests", "pytest-shutil", "objdict"] #file = "requeriments.txt" +#[npm] +#package_json = true / false +#ruta_package_json = "package.json" +#modulos = ["angular", "electron"] + [descarga] url = "https://foo.com/bar.tar.gz" @@ -73,7 +79,7 @@ mensaje = "Para poder ejecutar, prueba con 'foo'!" Mucha informacion, vamos por pasos, ADI tiene la sintaxis de TOML para que sea mas facil crear paquetes, de esta forma vamos a ver cada uno de las lineas: ## Paquete -El inicio de paquete son nada mas ni nama menos que los datos del paquete al cual instalar, se escribe con el incio de `[paquete]`, algo asi: +El inicio de paquete son nada mas ni nada menos que los datos del paquete al cual instalar, se escribe con el incio de `[paquete]`, algo asi: ``` nombre = "foo" version = "1.1" @@ -88,10 +94,15 @@ conflicto = "/opt/foo/" ``` 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 + +**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 @@ -113,7 +124,9 @@ file = "Gemfile" #gemas = ["colorized", "rails"] ``` La variable **gemfile** es un boleano (true/false) que esta se debe de colcar de forma obligatoria, este es para saber si el proyecto tiene un Gemfile para descargar las gemas con este archivo, en el caso de que el proyecto contenga un Gemfile este se debe de poner como true y si no pues como false. + **file** esta variable SOLO se coloca si el gemfile contiene true, ya que aqui en este string se espeficara la ruta del Gemfile, en este caso solo se pone "Gemfile" ya que se encuentra en la carpeta del proyecto + **gemas** este es un array donde se espficica las gemas de las cuales depende, se recomeinda que debe de ser pocas, pocas gemas como crear un Gemfile pero no tantas, esta pensado para proyectos que dependen con 2 o 3 gemas ## Pip @@ -125,10 +138,28 @@ requirements = true # false file = "requeriments.txt" ``` En **version** se debe de contener un numero entero y el numero de la version de python/pip con el cual se va a instalar las dependencias, en el ejemplo podemos ver que se va a instalar con pip3. + En **requirements** es un boleano donde se debe de colocar true si es que el proyecto instala sus dependencias con el archivo requeriments.txt y false si no + En **packages** es un array donde se especifican las dependencias, esta no se debe de poner si es que requeriments esta en false. + Por el contrario **file** es un string donde se especifica la ruta del archivo requeriments.txt para que apartir de aqui se instalan las dependencias con pip +## Npm +En este apartado podemos encontar un espacio para administrar de manera correcta los modulos de npm, en un archivo adi se puede observar asi: +``` +#[npm] +#package_json = true / false +#ruta_package_json = "package.json" +#modulos = ["angular", "electron"] +``` + +En la variable **package_json** es booleano que indica si se instalaran los modulos desde un `package_json` + +En la **ruta_package_json** es un string de la ruta en donde se encuentra el `package_json` dentro del proyecto + +Sobre el array **modulos** en el caso de que package_json sea falso este debera contener los modulos que se deberan de instalar + ## Descarga La seccion de descarga es para ello, donde se especifica los detalles de la descarga, se inicia `[descarga]`en uno de los ejemplos: ``` @@ -139,7 +170,9 @@ carpeta = "foo-bar" sha256sum = "ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" # SALTAR ``` La variable **url** es un string donde se dice el link de descarga del paquete, este debe estar comprimido en `tar.gz`ya que sera extraido con este formato de compresion, mas sin embargo en la versiones git se ha creado la variable **git** que se coloca en lugar de url, al colocar git se va a clonar el repositorio descrito aqui, o en su defecto si tiene una las fuentes en su equipo puede colocar la ruta de esta en la variable **local** + En **carpeta** se coloca el directorio al cual se debe de acceder una vez extraido el tar.gz o clonado el git + En **sha256sums** se debe de colcar las sumas sha256 del archivo a descargar, en el caso de que se utilice una version de git, este se debe de cambiar su valor como: `sha256sums = "SALTAR"`de esta forma se obite la verificacion por sha256 ## Instalacion @@ -153,8 +186,11 @@ post_install = "post_apmpkg.sh" mensaje = "Para poder ejecutar, prueba con 'foo'!" ``` La variable **opt_src** es un boleano que admite true o false si es que se desea que todo el directorio obtenido por git o por la descarga se copia a la carpeta /opt, un ejemplo de esto es el paquete metasploit que se instala en la carpeta opt. + **files** y **ruta** ambos son arrays que contienen ruta de archivos, files selecciona los archivos que se van a instalar y ruta la ruta donde estos van a ser instalados, el primer archivo seleccionado se va a instalar con `install -Dm 755` ya que se da por hecho que el index 0 de ambos array es un binario. + Encontraremos con la variable **post_install** que no es mas un variable string que almacena la ruta del script escrito en bash que se ejecutara una vez instalado el paquete en el caso de dar otra salida que no sea exit code 0, se dara por fallido + En la variable pre_install se encuentra la ruta en donde esta el script de bash, al igual que el script post_install este se dara por fallido si retorna otra salida que no sea 0 ## Abc diff --git a/doc/instalacion.md b/doc/instalacion.md index 95472ef..0e182b6 100644 --- a/doc/instalacion.md +++ b/doc/instalacion.md @@ -99,8 +99,8 @@ Pero si quiere ejecutarlo de manera portable puede hacerlo: Para la instalacion y compilacion de manera manual debera de cumplir con los siguientes requisitos: -- Dependencias para compilar: git cargo pkg-config y openssl, openssl puede variar en diferentes distribuciones, este es necesario para openssl rust, [mas informacion aqui](https://docs.rs/openssl/0.10.33/openssl/index.html#automatic) -- Dependencias de ApmPKG: pip3/pip2, bundle, wget, fakeroot, rsync y git +- Dependencias para compilar: git, cargo, pkg-config , openssl y openssl puede variar en diferentes distribuciones, este es necesario para openssl rust, [mas informacion aqui](https://docs.rs/openssl/0.10.33/openssl/index.html#automatic) +- Dependencias de ApmPKG: pip3/pip2, bundle, wget, fakeroot, rsync, npm y git Para empezar con el proceso de compilacion debera de ejecutar lo siguiente: diff --git a/img/captura_prin.png b/img/captura_prin.png index 7711360..e50fa48 100644 Binary files a/img/captura_prin.png and b/img/captura_prin.png differ diff --git a/img/esquema.png b/img/esquema.png index d6dc056..828c6ec 100644 Binary files a/img/esquema.png and b/img/esquema.png differ diff --git a/man/apmpkg-en.1 b/man/apmpkg-en.1 index 6031285..f9f4886 100644 --- a/man/apmpkg-en.1 +++ b/man/apmpkg-en.1 @@ -1,9 +1,9 @@ .\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.48.3. -.TH APMPKG "1" "June 2021" "apmpkg 1.4" "User Commands" +.TH APMPKG "1" "June 2021" "apmpkg 1.4.1" "User Commands" .SH NAME -apmpkg \- manual page for apmpkg 1.4 +apmpkg \- manual page for apmpkg 1.4.1 .SH DESCRIPTION -ApmPKG v1.4.0 +ApmPKG v1.4.1 Kedap. A Package Manager as model: PKGBUILD .SS "USAGE:" @@ -18,7 +18,7 @@ Prints help information Prints version information .SS "OPTIONS:" .TP -\fB\-d\fR, \fB\-\-Instalar_dependencia\fR +\fB\-d\fR, \fB\-\-instalar_dependencia\fR Install the especified dependency .SS "SUBCOMMANDS:" .TP diff --git a/man/apmpkg.1 b/man/apmpkg.1 index c418359..a5ef39a 100644 --- a/man/apmpkg.1 +++ b/man/apmpkg.1 @@ -1,9 +1,9 @@ .\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.48.3. -.TH APMPKG "1" "June 2021" "apmpkg 1.4" "User Commands" +.TH APMPKG "1" "June 2021" "apmpkg 1.4.1" "User Commands" .SH NAME -apmpkg \- Pagina manual para ApmPKG 1.4 +apmpkg \- Pagina manual para ApmPKG 1.4.1 .SH DESCRIPTION -ApmPKG v1.4.0 +ApmPKG v1.4.1 Kedap. Un administrador de paquetes universal para linux como modelo PKGBUILD .SS "USAGE:" @@ -18,7 +18,7 @@ Imprime este menu de ayuda Imprime informacion de la version .SS "OPTIONS:" .TP -\fB\-d\fR, \fB\-\-Instalar_dependencia\fR +\fB\-d\fR, \fB\-\-instalar_dependencia\fR Instala la dependencia especificada .SS "SUBCOMMANDS:" .TP diff --git a/src/archivos.rs b/src/archivos.rs index 037bb7a..db50f8b 100644 --- a/src/archivos.rs +++ b/src/archivos.rs @@ -1,615 +1,274 @@ -// Manejador de archivos +//Modulo para la manipulacion de archivos -//uses use { - crate::{ - core_funcions, - estructuras::{AdiDescarga, AdiGem, AdiPaquete, AdiPip}, - lang_managers, - }, - colored::*, + crate::estructuras::{Adi, AdiInstalacion, Fuente, GestoresLenguajes, MsgError}, flate2::{read::GzDecoder, write::GzEncoder, Compression}, sha2::{Digest, Sha256}, - std::{fs, fs::File, io, path::Path, process, process::Command}, + std::{fs, fs::File, io, path::Path, process::Command}, tar::Archive, - toml::Value, }; -#[tokio::main] -pub async fn download(url: &str, name: &str) -> Result<(), Box> { - let cuerpo = reqwest::get(url).await?.bytes().await?; - let f = write_f(name, &cuerpo); - match f { - Ok(_f) => println!("Correcto"), - Err(_e) => { - println!( - "{}", - "Ocurrio un error al hacer la peticion, intenta de nuevo".red() - ); - process::exit(0x0100); - } - } - Ok(()) -} - -pub fn read_fs(file: &str) -> String { - println!("Leyendo el archivo {}...", file); - fs::read_to_string(file).expect("Archivo no encontrado!!! ") -} +pub fn es_abi(path: &str) -> bool { + let comando_file = Command::new("file") + .arg("-i") + .arg(path) + .output() + .expect("Ocurrio un error al ejecutar el comando file"); + let comando_salida = String::from_utf8_lossy(&comando_file.stdout); -pub fn write_f(name: &str, file: &[u8]) -> io::Result<()> { - let mut salida = File::create(name).expect("Algo fallo al crear el archivo"); - let mut conte = file; - io::copy(&mut conte, &mut salida)?; - println!("El archivo {} fue creado correctamente", name); - Ok(()) -} + // Tipo de salidas segun los soportados + let mut adi_file = String::new(); + adi_file.push_str(path); + adi_file.push_str(": text/plain; charset=us-ascii\n"); + let mut abi_file = String::new(); + abi_file.push_str(path); + abi_file.push_str(": application/gzip; charset=binary\n"); -pub fn read_adi_down(file: &str, gito: bool) -> AdiDescarga { - let tomy: Value = toml::from_str(file) - .expect("Al parecer no has escrito bien el archivo ADI o no es un archivo ADI"); - let adi = tomy.as_table().unwrap(); - if !adi.contains_key("paquete") - || !adi.contains_key("descarga") - || !adi.contains_key("instalacion") - { - println!("Douh, eso no parece un archivo .adi"); - process::exit(0x0100); - } - if gito { - let source = { - AdiDescarga { - url: String::new(), - src: tomy["descarga"]["carpeta"].as_str().unwrap().to_string(), - sha256sum: tomy["descarga"]["sha256sum"].as_str().unwrap().to_string(), - } - }; - source + if comando_salida == abi_file { + true + } else if comando_salida == adi_file { + false } else { - let source = { - AdiDescarga { - url: tomy["descarga"]["url"].as_str().unwrap().to_string(), - src: tomy["descarga"]["carpeta"].as_str().unwrap().to_string(), - sha256sum: tomy["descarga"]["sha256sum"].as_str().unwrap().to_string(), - } - }; - source + let error = MsgError::new("El archivo no es soportado, prueba con otro"); + error.print_salir(); + false } } -pub fn read_adi(file: &str) -> AdiPaquete { - let tomy: Value = toml::from_str(file) - .expect("Al parecer no has escrito bien el archivo ADI o no es un archivo ADI"); - let adi = tomy.as_table().unwrap(); - if !adi.contains_key("paquete") - || !adi.contains_key("descarga") - || !adi.contains_key("instalacion") - { - println!("Douh, eso no parece un archivo .adi"); - process::exit(0x0100); - } - let mut adi_f = put_adi_pack(tomy); - adi_f.depen = pkg_depen(file); - adi_f + +pub fn es_abc(path: &str) -> bool { + let comando_iiabc = Command::new("bash") + .arg("/etc/apmpkg/iiabc/iiabc.sh") + .arg("-abc") + .arg(path) + .output() + .expect("Exite el archivo /etc/apmpkg/iiabc.sh"); + let comando_salida = String::from_utf8_lossy(&comando_iiabc.stdout); + + // Tipo de salidas segun si es abc + let abc_salida = String::from("true\n"); + comando_salida == abc_salida } -pub fn extern_depen(file: &str, path_src: &str) { - let tomy: Value = toml::from_str(file) - .expect("Al parecer no has escrito bien el archivo ADI o no es un archivo ADI"); - let adi = tomy.as_table().unwrap(); - let null_arr = adi["paquete"]["dependencias"].as_array().unwrap(); - - // Probando con gem/bundle o pip - if adi.contains_key("gem") { - println!("{}", "Se han dectectados gemas de ruby!".yellow()); - let gemm = adi["gem"]["gemfile"] - .as_bool() - .expect("Eso no es un booleano"); - if gemm { - let payload = { - AdiGem { - gemfile: gemm, - file: adi["gem"]["file"].as_str().expect("wtf?").to_string(), - gemas: null_arr.to_vec(), - } - }; - println!("Instalando desde un Gemfile"); - lang_managers::analized_gem(payload, path_src); - } else { - let gemas = adi["gem"]["gemas"] - .as_array() - .expect("Debe de ser un array!"); - let payload = { - AdiGem { - gemfile: false, - file: String::new(), - gemas: gemas.to_vec(), - } - }; - println!("Instalando gemas..."); - lang_managers::analized_gem(payload, path_src); - } - } else if adi.contains_key("pip") { - println!( - "{}", - "Se ha dectectado paquetes python por instalar!".yellow() - ); - let version = adi["pip"]["version"] - .as_integer() - .expect("Eso no es un numero"); - let null_arr = adi["paquete"]["dependencias"].as_array().unwrap(); - - match version { - 2 => println!("Instalando con pip2"), - 3 => println!("Instalando con pip3"), - _ => { - println!("{}", "Douh, esa version no la conosco, beep boop".red()); - process::exit(0x0100); - } +pub fn leer_archivo(ruta: &str) -> String { + match fs::read_to_string(ruta) { + Ok(v) => v, + Err(e) => { + let error = MsgError::new(&e.to_string()); + error.print_salir(); + String::new() } - let archivo = adi["pip"]["requirements"].as_bool().expect("Cuantico?"); - - if archivo { - println!("Instalando desde un archivo requirements.txt"); - let payload = { - AdiPip { - version, - requirements: archivo, - file: adi["pip"]["file"].as_str().expect("?").to_string(), - packages: null_arr.to_vec(), - } - }; - lang_managers::analized_pip(payload, path_src); - } else { - println!("Instalando packages de python"); - let pack = adi["pip"]["packages"] - .as_array() - .expect("Eso no es un array"); - println!("Instalando paquetes de python"); - let payload = { - AdiPip { - version, - requirements: archivo, - file: String::new(), - packages: pack.to_vec(), - } - }; - lang_managers::analized_pip(payload, path_src); - } - } else { - println!( - "{}", - "Al parecer no hay archivos para pip o bundle/gem. Yeah, si nada que hacer aqui" - .green() - ); } } -fn put_adi_pack(adi: Value) -> AdiPaquete { - AdiPaquete { - nombre: adi["paquete"]["nombre"].as_str().unwrap().to_string(), - version: adi["paquete"]["version"].as_str().unwrap().to_string(), - rama: adi["paquete"]["rama"].as_str().unwrap().to_string(), - descrip: adi["paquete"]["descrip"].as_str().unwrap().to_string(), - pagina: adi["paquete"]["pagina"].as_str().unwrap().to_string(), - licensia: adi["paquete"]["licensia"].as_str().unwrap().to_string(), - depen: String::new(), - conflicto: adi["paquete"]["conflicto"].as_str().unwrap().to_string(), - } +pub fn git_clone(repositorio: &str, destino: &str) { + let mut child = Command::new("git") + .arg("clone") + .arg(repositorio) + .arg(destino) + .spawn() + .expect("Algo fallo con git_clone"); + let _result = child.wait().unwrap(); } -pub fn pkg_depen(file: &str) -> String { - let tomy: Value = toml::from_str(file) - .expect("Al parecer no has escrito bien el archivo ADI o no es un archivo ADI"); - let adi = tomy.as_table().unwrap(); - let depen = &adi["paquete"]["dependencias"].as_array().unwrap(); - let mut depen_str = String::new(); - let ultimo = depen.len(); - for i in 0..depen.len() { - depen_str.push_str(&depen[i].as_str().unwrap()); - if i == ultimo { - let _ = String::new(); - } else { - depen_str.push(' '); +#[tokio::main] +pub async fn descarga(url: &str, ruta: &str) -> Result<(), Box> { + let cuerpo = reqwest::get(url).await?.bytes().await?; + let ar = escribir_archivo(ruta, &cuerpo); + match ar { + Ok(_v) => _v, + Err(e) => { + let error = MsgError::new(&e.to_string()); + error.print_salir(); } } - depen_str -} - -pub fn new_dir(name: &str) -> std::io::Result<()> { - fs::create_dir(name)?; Ok(()) } -pub fn e_tar(path: &str, target: &str) -> Result<(), std::io::Error> { - let tar_gz = File::open(path)?; - let tar = GzDecoder::new(tar_gz); - let mut archive = Archive::new(tar); - archive.unpack(target)?; - +pub fn escribir_archivo(nombre: &str, contenido: &[u8]) -> io::Result<()> { + let mut archivo = File::create(nombre).expect("Algo fallo al crear el archivo"); + let mut cont = contenido; + io::copy(&mut cont, &mut archivo)?; Ok(()) } -pub fn move_dd(source: &str, target: &str) { - let mut aa = Command::new("mv") - .arg(source) - .arg(target) - .spawn() - .expect("Cielos, ocurrio un error al mover los archivos"); - let _result = aa.wait().unwrap(); -} - -pub fn copy_dd(source: &str, target: &str) { +pub fn copiar_archivo(desde: &str, destino: &str) { let mut child = Command::new("cp") - .arg(source) - .arg(target) + .arg("-r") + .arg(desde) + .arg(destino) .spawn() - .expect("WTF porque no tienes cp?"); + .expect("Algo fallo con cp"); let _result = child.wait().unwrap(); } -pub fn hash_sum(path: &str, check: &str) -> bool { - let mut file = File::open(path).expect("Ocurrio un error al abrir el archivo"); +pub fn crear_directorio(directorio: &str) -> std::io::Result<()> { + fs::create_dir_all(directorio)?; + Ok(()) +} + +pub fn verificacion_hash(ruta: &str, suma_esperada: &str) -> bool { + let mut archivo = File::open(ruta).expect("Ocurrio un error al abrir el archivo"); let mut suma = Sha256::new(); - io::copy(&mut file, &mut suma).expect("Error al copiar"); - let fhash = format!("{:x}", suma.finalize()); + io::copy(&mut archivo, &mut suma).expect("Error al copiar"); + let fhash = format!("{:x}", &suma.finalize()); - fhash == check + fhash == suma_esperada } -pub fn copy_df(source: &str, target: &str) { - let mut child = Command::new("cp") - .arg("-r") - .arg(source) - .arg(target) - .spawn() - .expect("Algo a fallado al copiar los directorios"); - let _result = child.wait().unwrap(); -} +pub fn extraer_tar(ruta_tar: &str, ruta_destino: &str) -> Result<(), std::io::Error> { + let tar_gz = File::open(ruta_tar)?; + let tar = GzDecoder::new(tar_gz); + let mut archivo = Archive::new(tar); + archivo.unpack(ruta_destino)?; -pub fn install_path(file: &str, root_src: &str) { - let tomy: Value = toml::from_str(file) - .expect("Al parecer no has escrito bien el archivo ADI o no es un archivo ADI"); - let adi = tomy.as_table().unwrap(); + Ok(()) +} - let select = &adi["instalacion"]["files"].as_array().unwrap(); - let insta = &adi["instalacion"]["ruta"].as_array().unwrap(); - println!("Iniciando instalacion"); +pub fn instalar_archivos(adi_instalacion: AdiInstalacion, carpeta_src: &str) { + let fuente = adi_instalacion.fuente; + let destino = adi_instalacion.destino; + let carpeta_fuente = Path::new(carpeta_src); - for i in 0..select.len() { - let mut aak = String::new(); - aak.push_str(root_src); - aak.push_str(&select[i].as_str().unwrap().to_string()); + for i in 0..fuente.len() { + let archivo = carpeta_fuente.join(fuente[i].as_str().unwrap()); if i == 0 { let mut child = Command::new("install") .arg("-Dm") .arg("755") - .arg(aak) - .arg(&insta[i].as_str().unwrap()) + .arg(archivo) + .arg(destino[i].as_str().unwrap()) .spawn() - .expect("Install?"); + .expect("Algo fallo con install"); let _result = child.wait().unwrap(); } else { let mut child = Command::new("rsync") .arg("-a") - .arg(&aak) - .arg(&insta[i].as_str().unwrap().to_string()) + .arg(archivo) + .arg(destino[i].as_str().unwrap()) .spawn() - .expect("Ocurrio un error al instalar paquetes"); + .expect("Ocurrio un error con rsync"); let _result = child.wait().unwrap(); } } -} - -pub fn remove_df(path: &str) { - let mut child = Command::new("rm") - .arg(path) - .spawn() - .expect("Algo raro sucedio ejecutando rm"); - let _result = child.wait().unwrap(); -} - -pub fn remove_ddf(path: &str) { - Command::new("rm") - .arg("-r") - .arg(path) - .output() - .expect("Algo muy raro sucedio con RM -R"); -} - -pub fn dinstall_path(file: &str) { - let tomy: Value = toml::from_str(file) - .expect("Al parecer no has escrito bien el archivo ADI o no es un archivo ADI"); - let adi = tomy.as_table().unwrap(); - let remove = &adi["instalacion"]["ruta"].as_array().unwrap(); - - for i in 0..remove.len() { - remove_ddf(&remove[i].as_str().unwrap().to_string()); + if adi_instalacion.fuente_opt { + copiar_archivo(carpeta_src, "/opt/"); } } -pub fn opt_remove(file: &str) { - let tomy: Value = toml::from_str(file) - .expect("Al parecer no has escrito bien el archivo ADI o no es un archivo ADI"); - let adi = tomy.as_table().unwrap(); - let insta = adi["instalacion"].as_table().unwrap(); - - if insta.contains_key("opt_src") { - let si = insta["opt_src"].as_bool().unwrap(); - if si { - let carpeta = adi["descarga"]["carpeta"].as_str().unwrap().to_string(); - let mut opt_src = String::new(); - opt_src.push_str("/opt/"); - opt_src.push_str(&carpeta); - remove_ddf(&opt_src); - } else { - let _h = true; +pub fn borrar_archivo(ruta: &str) { + let resultado = fs::remove_file(ruta); + match resultado { + Ok(_v) => _v, + Err(e) => { + let error = MsgError::new(&e.to_string()); + error.print_salir(); } } } -pub fn source_git_q(file: &str) -> bool { - let tomy: Value = toml::from_str(file) - .expect("Al parecer no has escrito bien el archivo ADI o no es un archivo ADI"); - let adi = tomy.as_table().unwrap(); - let fuente = &adi["descarga"].as_table().unwrap(); - fuente.contains_key("git") -} - -pub fn source_es_local(file: &str) -> bool { - let tomy: Value = toml::from_str(file) - .expect("Al parecer no has escrito bien el archivo ADI o no es un archivo ADI"); - let adi = tomy.as_table().unwrap(); - let fuente_local = &adi["descarga"].as_table().unwrap(); - fuente_local.contains_key("local") -} - -pub fn leer_fuente_local(file: &str) -> String { - let tomy: Value = toml::from_str(file) - .expect("Al parecer no has escrito bien el archivo ADI o no es un archivo ADI"); - let adi = tomy.as_table().unwrap(); - adi["descarga"]["local"].as_str().unwrap().to_string() -} - -pub fn read_git(file: &str) -> String { - let tomy: Value = toml::from_str(file) - .expect("Al parecer no has escrito bien el archivo ADI o no es un archivo ADI"); - let adi = tomy.as_table().unwrap(); - adi["descarga"]["git"].as_str().unwrap().to_string() -} - -pub fn git_clone(url_git: &str, target: &str) { - let mut child = Command::new("git") - .arg("clone") - .arg(url_git) - .arg(target) - .spawn() - .expect("No tenis git?"); - let _result = child.wait().unwrap(); -} +pub fn existe_adi() -> bool { + let resultado_cat = Command::new("cat") + .arg("install.d/apkg.adi") + .output() + .expect("Ocurrio un error al ejecutar cat"); -pub fn remove_dd(dir: &str) { - fs::remove_dir_all(dir).expect("Ocurrio un error al borrar el archivo"); + resultado_cat.status.to_string() != "exit status: 1" } -pub fn opt_src(file: &str, dir: &str) { - let tomy: Value = toml::from_str(file) - .expect("Al parecer no has escrito bien el archivo ADI o no es un archivo ADI"); - let adi = tomy.as_table().unwrap(); - let insta = adi["instalacion"].as_table().unwrap(); - if insta.contains_key("opt_src") { - let si = insta["opt_src"].as_bool().unwrap(); - if si { - move_dd(dir, "/opt/"); - } else { - let _h = true; - } +pub fn binario_completo(adi: Adi) -> bool { + let conservar: bool; + if let GestoresLenguajes::Ninguno = adi.gestor { + conservar = false; + } else if adi.instalacion.fuente_opt { + conservar = true; + } else if let Fuente::Git(_repositorio) = adi.descarga.fuente { + conservar = true; + } else { + conservar = true; } + + conservar } -// Funcion para crear un binario apartir de un .ADI -pub fn crate_bin(path: &str, nombre: &str, meta_file: &str) { - println!("Iniciando la creacion de un Archivos Binario de Instalacion..."); - let tomy: Value = toml::from_str(meta_file) - .expect("Al parecer no has escrito bien el archivo ADI o no es un archivo ADI"); - let adi = tomy.as_table().unwrap(); - - let conservar_src_dir = binario_completo(meta_file); - let mut noombre = String::new(); - noombre.push_str(nombre); - noombre.push_str(".abi.tar.gz"); - let tar_gz = File::create(noombre).expect("Algo fallo al crear el tar_gz"); +pub fn construir_binario(adi: Adi, ruta: &Path, ruta_adi: &str) { + let binario_completo = binario_completo(adi.clone()); + let mut nombre_binario = adi.paquete.nombre; + nombre_binario.push('-'); + nombre_binario.push_str(&adi.paquete.version); + nombre_binario.push_str(".abi.tar.gz"); + let tar_gz = File::create(nombre_binario).expect("Algo fallo al crear el archivo tar_gz"); let enc = GzEncoder::new(tar_gz, Compression::default()); let mut tar = tar::Builder::new(enc); - if conservar_src_dir { - tar.append_dir_all(".", path).expect("Fallo en dir_all"); + if binario_completo { + tar.append_dir_all(".", ruta) + .expect("Algo fallo al crear el archivo comprimido"); } else { - // Verificando si es que instala con fuentes locales - let fuentes_locales = source_es_local(meta_file); - let des: AdiDescarga; - if fuentes_locales { - des = read_adi_down(meta_file, true); - } else { - des = read_adi_down(meta_file, false); - } - let mut dirc = String::new(); - dirc.push_str(path); - dirc.push_str(&des.src); - dirc.push('/'); - let tmp = &dirc; - let dirpath = Path::new(tmp); - - let archivos = &adi["instalacion"]["files"].as_array().unwrap(); - for i in 0..archivos.len() { - let mut archivo = String::new(); - archivo.push_str(&dirc); - archivo.push_str(&archivos[i].as_str().unwrap().to_string()); - //Arregla el problema de no comprimir carpetas, ejemplo funkin - let dir_archivos = Path::new(&archivo); - let es_directorio: bool = dir_archivos.is_dir(); - if es_directorio { - tar.append_dir_all(dir_archivos, dir_archivos).unwrap(); + let ruta_proyecto = ruta.join(adi.descarga.carpeta.clone()); + let archivos = adi.instalacion.fuente.clone(); + + for archivo in archivos { + if ruta_proyecto.join(archivo.as_str().unwrap()).is_dir() { + tar.append_dir_all( + &ruta_proyecto.join(archivo.as_str().unwrap()), + &ruta_proyecto.join(archivo.as_str().unwrap()), + ) + .expect("Algo fallo al comprimir los archivos"); } else { - tar.append_path(archivo).unwrap(); - } - } - - if core_funcions::post_install_existe(&meta_file) { - //Agregando el script post instalcion - let instalacion = tomy["instalacion"].as_table().unwrap(); - tar.append_path(dirpath.join(instalacion["post_install"].as_str().unwrap())) - .unwrap(); - } - - let out_adi = String::from("apkg.adi"); - let f = write_f(&out_adi, meta_file.as_bytes()); - match f { - Ok(_f) => println!("Es archivo .adi se copio con exito"), - Err(_e) => { - println!( - "{}", - "Ocurrio un error al copiar el archivo .adi al binario".red() - ); - process::exit(0x0100); + tar.append_path(&ruta_proyecto.join(archivo.as_str().unwrap())) + .expect("Algo fallo al comprimir los archivos"); } } - tar.append_path(&out_adi).unwrap(); - - println!("{}", "Limpiando...".yellow()); - remove_df(&out_adi); } - println!("Creacion del binario a sido de manera exitosa!!!"); -} - -pub fn binario_completo(toml_file: &str) -> bool { - let tomy: Value = toml::from_str(toml_file) - .expect("Al parecer no has escrito bien el archivo ADI o no es un archivo ADI"); - let adi = tomy.as_table().unwrap(); - let mut conservar_src_dir = false; - let insta = adi["instalacion"].as_table().unwrap(); - let gito = source_git_q(&toml_file); - - if adi.contains_key("gem") || adi.contains_key("pip") { - conservar_src_dir = true; - } else if insta.contains_key("opt_src") { - let boleano = insta["opt_src"].as_bool().unwrap(); - if boleano { - conservar_src_dir = true; - } else { - conservar_src_dir = false; + copiar_archivo(ruta_adi, "apkg.adi"); + tar.append_path("apkg.adi").unwrap(); + let borrar_archivo = fs::remove_file("apkg.adi"); + match borrar_archivo { + Ok(_v) => _v, + Err(e) => { + let error = MsgError::new(&e.to_string()); + error.print_salir(); } - } else if gito { - conservar_src_dir = true; } - 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() + if !adi.instalacion.pre_instalacion.is_empty() { + tar.append_path( + ruta.join(adi.descarga.carpeta.clone()) + .join(adi.instalacion.pre_instalacion.clone()), + ) + .unwrap(); } -} -pub fn es_abi(path: &str) -> bool { - let comando_file = Command::new("file") - .arg("-i") - .arg(path) - .output() - .expect("Ocurrio un error al ejecutar el comando file"); - let comando_salida = String::from_utf8_lossy(&comando_file.stdout); - - // Tipo de salidas segun los soportados - let mut adi_file = String::new(); - adi_file.push_str(path); - adi_file.push_str(": text/plain; charset=us-ascii\n"); - let mut abi_file = String::new(); - abi_file.push_str(path); - abi_file.push_str(": application/gzip; charset=binary\n"); - - if comando_salida == abi_file { - println!("El archivo es soportado!!!"); - true - } else if comando_salida == adi_file { - println!("El archivo es soportado!!!"); - false - } else { - println!("{}", "El archivo no es soportado, prueba con otro".red()); - process::exit(0x0100); + if !adi.instalacion.post_instalacion.is_empty() { + tar.append_path( + ruta.join(adi.descarga.carpeta.clone()) + .join(adi.instalacion.post_instalacion), + ) + .unwrap(); } } -pub fn es_abc(path: &str) -> bool { - let comando_iiabc = Command::new("bash") - .arg("/etc/apmpkg/iiabc/iiabc.sh") - .arg("-abc") - .arg(path) - .output() - .expect("Exite el archivo /etc/apmpkg/iiabc.sh"); - let comando_salida = String::from_utf8_lossy(&comando_iiabc.stdout); +pub fn remover_archivos(adi: Adi) { + let adi_descarga = adi.descarga.clone(); + let adi_instalacion = adi.instalacion; - // Tipo de salidas segun si es abc - let abc_salida = String::from("true\n"); - comando_salida == abc_salida -} + for archivos in adi_instalacion.destino { + remover_rm(&archivos.as_str().unwrap()); + } -pub fn existe_abc(path: &str) -> bool { - let mut db_path = String::from("/etc/apmpkg/paquetes/"); - db_path.push_str(path); - db_path.push_str(".abc"); - let cat_file = Command::new("cat") - .arg(db_path) - .output() - .expect("Ocurrio algo con cat"); - cat_file.status.to_string() != "exit status: 1" + if adi_instalacion.fuente_opt { + let mut opt_ruta = String::from("/opt/"); + opt_ruta.push_str(&adi_descarga.carpeta); + remover_rm(&opt_ruta); + } } -pub fn existe_adi() -> bool { - let resultado_cat = Command::new("cat") - .arg("install.d/apkg.adi") +pub fn remover_rm(ruta: &str) { + Command::new("rm") + .arg("-rf") + .arg(ruta) .output() - .expect("Ocurrio un error al ejecutar cat"); - - resultado_cat.status.to_string() != "exit status: 1" -} - -pub fn spawn_adi(nombre: &str) { - Command::new("bash") - .arg("/etc/apmpkg/iiabc/iiabc.sh") - .arg("-a") - .arg(nombre) - .spawn() - .expect("Ocurrio un error al crear el archivo adi"); -} - -pub fn spawn_abc(nombre: &str) { - Command::new("bash") - .arg("/etc/apmpkg/iiabc/iiabc.sh") - .arg("-bb") - .arg(nombre) - .spawn() - .expect("Ocurrio un error al crear el archivo .abc"); + .expect("Algo raro sucedio con rm -r"); } diff --git a/src/cli.yml b/src/cli.yml index 236b578..0dc9966 100644 --- a/src/cli.yml +++ b/src/cli.yml @@ -1,11 +1,11 @@ name: ApmPKG -version: "v1.4.0" +version: "v1.4.1" author: Kedap. about: Un administrador de paquetes universal para linux como modelo PKGBUILD args: - - instalard: - short: di - long: Instalar_dependencia + - dependencia: + short: d + long: instalar_dependencia help: Instala la dependencia especificada takes_value: true subcommands: diff --git a/src/core_funcions.rs b/src/core_funcions.rs index 275ac56..b2b3537 100644 --- a/src/core_funcions.rs +++ b/src/core_funcions.rs @@ -1,13 +1,12 @@ -// Archivo con las funciones principales y necesarias +//Archvo con las funciones principales y necesarias //uses use { - crate::estructuras::{AdiPaquete, Argumentos, Banderas, MsgError, PackageManager, SubComandos}, + crate::{archivos, estructuras::*}, clap::{load_yaml, App}, colored::*, - exitcode, psutil, read_input::prelude::*, - std::{any::type_name, path::Path, process, process::Command}, + std::{env, path::Path, process::Command}, toml::Value, }; @@ -44,8 +43,8 @@ pub fn leer_argumentos() -> Argumentos { } else { SubComandos::Ninguno } - } else if matches.is_present("instalard") { - SubComandos::InstalarDependencia(matches.value_of("instalard").unwrap().to_string()) + } else if matches.is_present("dependencia") { + SubComandos::InstalarDependencia(matches.value_of("dependencia").unwrap().to_string()) } else if let Some(matches) = matches.subcommand_matches("crear") { if matches.is_present("tipo") && matches.is_present("nombre") { SubComandos::Crear { @@ -93,43 +92,7 @@ pub fn leer_argumentos() -> Argumentos { } } -impl MsgError { - //Imprimir el error - pub fn print(&self) { - println!("{} {}", "Error:".red(), &self.mensaje); - } - pub fn print_salir(&self) { - println!("{} {}", "Error:".red(), &self.mensaje); - process::exit(exitcode::DATAERR); - } - pub fn nuevo(mensaje: &str) -> MsgError { - MsgError { - mensaje: mensaje.to_string(), - } - } - pub fn salir(&self) { - process::exit(exitcode::DATAERR); - } -} - -pub fn print_metapkg(pkg: AdiPaquete) { - println!( - " - \t\t Paquete: {} - \t\t Rama: {} - \t\t Version actual: {} - \t\t Descripcion: {} - \t\t Dependencias: {} - \n\n", - pkg.nombre, pkg.rama, pkg.version, pkg.descrip, pkg.depen - ); -} - -pub fn clear() { - print!("\x1B[2J"); -} - -pub fn quess(texto: &str) -> bool { +pub fn pregunta(texto: &str) -> bool { let mut aviso = String::from("[?] "); aviso.push_str(texto); aviso.push_str(" [S/n]"); @@ -138,144 +101,287 @@ pub fn quess(texto: &str) -> bool { matches!(&opc[..], "S" | "s") } -pub fn local_depen(file_toml: &str) -> bool { - let tomy: Value = toml::from_str(file_toml) - .expect("Al parecer no has escrito bien el archivo ADI o no es un archivo ADI"); - let adi = tomy.as_table().unwrap(); - let depen_table = adi["paquete"].as_table().expect("Douh, no se un .adi"); - let mut ready = false; +pub fn verificar_arch(datos: AdiPaquete) -> bool { + if datos.arquitectura == "any" { + true + } else { + let arquitectura = psutil::host::info().architecture().as_str().to_string(); + datos.arquitectura == arquitectura + } +} + +pub fn dependencias_instaladas(adi_paquete: AdiPaquete) -> bool { + let mut instalado = false; - if depen_table.contains_key("cmd_depen") { - let depen_arr = &adi["paquete"]["cmd_depen"].as_array().unwrap(); - for i in 0..depen_arr.len() { - let check_depn = Command::new("bash") + if !adi_paquete.cmd_depen.is_empty() { + let dependencia_array = adi_paquete.cmd_depen; + for dependencia in dependencia_array { + let verificar_dependencia = Command::new("bash") .arg("-c") - .arg(depen_arr[i].as_str().unwrap()) + .arg(dependencia.as_str().unwrap()) .output() - .expect("Algo fallo en install depen"); - println!( - "Comprobando que {} este instalado", - depen_arr[i].as_str().unwrap().to_string() - ); - if check_depn.status.to_string() != "exit status: 127" { - ready = true; + .expect("Algo fallo al ejecutar bash"); + //println!("Comprobando que {} este disponible", dependencia); + if verificar_dependencia.status.to_string() != "exit status: 127" { + instalado = true } else { - println!("Al parecer no, porque no lo instalamos"); - ready = false; + //println!("Al parecer no, porque no lo instalamos"); + instalado = false; break; } } } else { - let depen_arr = &adi["paquete"]["dependencias"].as_array().unwrap(); - for i in 0..depen_arr.len() { - let check_depn = Command::new("bash") + let dependencia_array = adi_paquete.dependencias; + for dependencias in dependencia_array { + let verificar_dependencia = Command::new("bash") .arg("-c") - .arg(depen_arr[i].as_str().unwrap()) + .arg(dependencias.as_str().unwrap()) .output() - .expect("Algo fallo en install depen"); - println!( - "Comprobando que {} este instalado", - depen_arr[i].as_str().unwrap().to_string() - ); - if check_depn.status.to_string() != "exit status: 127" { - ready = true; + .expect("Al parecer algo fallo al ejecutar bash"); + //println!("Comprobando que {} este instalado", dependencias); + if verificar_dependencia.status.to_string() != "exit status: 127" { + instalado = true; } else { - //Comprobando que la dependencia este instalado con .adi - let mut dependencia = String::from(depen_arr[i].as_str().unwrap()); - dependencia.push_str(".adi"); + //Comprobando que la dependencia este instalado por apmpkg + let mut dependencia_adi = String::from(dependencias.as_str().unwrap()); + dependencia_adi.push_str(".adi"); let existe_adi = Path::new("/etc/apmpkg/paquetes") - .join(&dependencia) - .is_file(); - - let mut dependencia_abc = String::from(depen_arr[i].as_str().unwrap()); + .join(&dependencia_adi) + .exists(); + let mut dependencia_abc = String::from(dependencias.as_str().unwrap()); dependencia_abc.push_str(".abc"); let existe_abc = Path::new("/etc/apmpkg/paquetes") .join(&dependencia_abc) - .is_file(); - - if existe_adi || existe_abc { - ready = true; + .exists(); + if existe_abc || existe_adi { + instalado = true; } else { - println!("Al parecer no, porque no lo instalamos"); - ready = false; + //println!("Al parecer no, porque no instalamos"); + instalado = false; break; } } } } - ready + + instalado +} + +fn gestor(gestor: String) -> GestorNativo { + match &gestor[..] { + "pkg" => GestorNativo { + nombre: "pkg".to_string(), + buscar: "search".to_string(), + instalacion: "install".to_string(), + confirmacion: "-y".to_string(), + }, + "apt" => GestorNativo { + nombre: "apt".to_string(), + buscar: "search".to_string(), + instalacion: "install".to_string(), + confirmacion: "-y".to_string(), + }, + "pacman" => GestorNativo { + nombre: "pacman".to_string(), + buscar: "-Ss".to_string(), + instalacion: "-S".to_string(), + confirmacion: "--noconfirm".to_string(), + }, + "dnf" => GestorNativo { + nombre: "dnf".to_string(), + buscar: "search".to_string(), + instalacion: "install".to_string(), + confirmacion: "-y".to_string(), + }, + "snap" => GestorNativo { + nombre: "snap".to_string(), + buscar: "find".to_string(), + instalacion: "install".to_string(), + confirmacion: String::new(), + }, + "flatpak" => GestorNativo { + nombre: "flatpak".to_string(), + buscar: "search".to_string(), + instalacion: "install".to_string(), + confirmacion: String::new(), + }, + "zypper" => GestorNativo { + nombre: "zypper".to_string(), + buscar: "search".to_string(), + instalacion: "in".to_string(), + confirmacion: "--non-interactive".to_string(), + }, + "yum" => GestorNativo { + nombre: "yum".to_string(), + buscar: "search".to_string(), + instalacion: "install".to_string(), + confirmacion: "-y".to_string(), + }, + "apk" => GestorNativo { + nombre: "apk".to_string(), + buscar: "search".to_string(), + instalacion: "add".to_string(), + confirmacion: String::new(), + }, + "slapt-get" => GestorNativo { + nombre: "slapt-get".to_string(), + buscar: "--search".to_string(), + instalacion: "--install".to_string(), + confirmacion: String::new(), + }, + _ => GestorNativo { + nombre: "apmpkg".to_string(), + buscar: String::new(), + instalacion: "instalar".to_string(), + confirmacion: "-c".to_string(), + }, + } } -fn instalar_paquete(gestor: PackageManager, paquete: &str) -> bool { +fn instalar_paquete(gestor: GestorNativo, paquete: &str) -> bool { if gestor.confirmacion.is_empty() { - let comando_instalacion = Command::new(gestor.comando) - .arg(gestor.intalacion) + let comando_instalacion = Command::new(gestor.nombre) + .arg(gestor.instalacion) .arg(paquete) .output() - .expect("Ocurrio un error cuando se instalaba las dependencias"); + .expect("Algo fallo al instalar"); comando_instalacion.status.to_string() == "exit status: 0" } else { - let comando_instalacion = Command::new(gestor.comando) - .arg(gestor.intalacion) + let comando_instalacion = Command::new(gestor.nombre) + .arg(gestor.instalacion) .arg(paquete) .arg(gestor.confirmacion) .output() - .expect("Ocurrio un error cuando se instalaba las dependencias"); + .expect("Algo fallo al instalar"); comando_instalacion.status.to_string() == "exit status: 0" } } -pub fn install_depen(file_toml: &str) -> bool { - println!("Administrando dependencias..."); +pub fn instalar_dependencias(adi_paquete: AdiPaquete) -> bool { let catalogo = [ - "pkg", "apt", "pacman", "dnf", "zypper", "yum", "apk", "slackpkg", "snap", "npm", "flatpak", + "pkg", + "apt", + "pacman", + "dnf", + "zypper", + "yum", + "apk", + "slapt-get", + "snap", + "flatpak", ]; - let mut manpack = Vec::new(); + let mut gestores = Vec::new(); + let depen_arr = &adi_paquete.dependencias; - for gestor in &catalogo { + //Selecionando los gestores instalados + for gestor in catalogo { let comando = Command::new("bash") .arg("-c") .arg(gestor) .output() - .expect("Algo fallo en install depen"); + .expect("Algo fallo al ejecutar bash"); if comando.status.to_string() == "exit status: 1" || comando.status.to_string() == "exit status: 0" { - let hi = { - let tmp = gestor; - tmp.to_string() - }; - manpack.push(hi); + gestores.push(gestor); } } - let tomy: Value = toml::from_str(file_toml) - .expect("Al parecer no has escrito bien el archivo ADI o no es un archivo ADI"); - let adi = tomy.as_table().unwrap(); - let depen_arr = &adi["paquete"]["dependencias"].as_array().unwrap(); - - for gestor in &manpack { - println!("Se a dectectado {}", gestor); - } - println!("Procediendo con la descarga e instalacion de dependencias... "); + //Instalacion las dependencias let mut contador = 0; + let mut listo = false; loop { - let mut ready = false; - for i in 0..depen_arr.len() { - let gestor = manager(manpack[contador].to_string()); - let dependencia = depen_arr[i].as_str().unwrap(); + for dependencia in depen_arr { + let gestor = gestor(gestores[contador].to_string()); + let dependencia = dependencia.as_str().unwrap(); let instalacion_completada = instalar_paquete(gestor.clone(), dependencia); // De igual manera como se instala se verifica que la dependencia fue instalada si este da como codigo de salida 0 if instalacion_completada { + //println!( + //"Se termino de instalar el paquete {} de manera correcta!", + //depen_arr[i].as_str().unwrap() + //); + listo = true + } else { + let mut child = Command::new(gestor.nombre.clone()) + .arg(gestor.buscar.clone()) + .arg(dependencia) + .spawn() + .expect("Ocurrio un error al buscar posibles dependencias"); + let _result = child.wait().unwrap(); println!( - "Se termino de instalar el paquete {} de manera correcta!", - depen_arr[i].as_str().unwrap() + "\nQue paquete sastiface la dependencia {}?", + dependencia.green() ); - ready = true + let posible_paquete: String = input().get(); + println!("Instalando el posible paquete {}", posible_paquete); + let instalacion_completada = instalar_paquete(gestor, &posible_paquete); + if instalacion_completada { + listo = true + } else { + listo = false + } + } + } + + if listo { + return listo; + } else { + contador += 1; + if contador == gestores.len() { + return false; + } + } + } +} + +pub fn instalar_dependencia_vector(depen_arr: Vec) -> bool { + let catalogo = [ + "pkg", + "apt", + "pacman", + "dnf", + "zypper", + "yum", + "apk", + "slapt-get", + "snap", + "flatpak", + ]; + let mut gestores = Vec::new(); + + //Selecionando los gestores instalados + for gestor in catalogo { + let comando = Command::new("bash") + .arg("-c") + .arg(gestor) + .output() + .expect("Algo fallo al ejecutar bash"); + if comando.status.to_string() == "exit status: 1" + || comando.status.to_string() == "exit status: 0" + { + gestores.push(gestor); + } + } + + //Instalacion las dependencias + let mut contador = 0; + let mut listo = false; + loop { + for dependencia in depen_arr.clone() { + let gestor = gestor(gestores[contador].to_string()); + let instalacion_completada = instalar_paquete(gestor.clone(), &dependencia); + // De igual manera como se instala se verifica que la dependencia fue instalada si este da como codigo de salida 0 + if instalacion_completada { + //println!( + //"Se termino de instalar el paquete {} de manera correcta!", + //depen_arr[i].as_str().unwrap() + //); + listo = true } else { - let mut child = Command::new(gestor.comando.clone()) + let mut child = Command::new(gestor.nombre.clone()) .arg(gestor.buscar.clone()) - .arg(dependencia) + .arg(dependencia.clone()) .spawn() .expect("Ocurrio un error al buscar posibles dependencias"); let _result = child.wait().unwrap(); @@ -287,239 +393,448 @@ pub fn install_depen(file_toml: &str) -> bool { println!("Instalando el posible paquete {}", posible_paquete); let instalacion_completada = instalar_paquete(gestor, &posible_paquete); if instalacion_completada { - ready = true + listo = true } else { - ready = false + listo = false } } } - if ready { - println!("Se han resolvido las dependencias de manera correcta"); - return true; + if listo { + return listo; } else { contador += 1; - if contador >= manpack.len() { + if contador == gestores.len() { return false; } } } } -fn manager(pack: String) -> PackageManager { - match &pack[..] { - "pkg" => PackageManager { - comando: "pkg".to_string(), - buscar: "search".to_string(), - intalacion: "install".to_string(), - dinstalacion: "uninstall".to_string(), - paquete: String::new(), - confirmacion: "-y".to_string(), - root: false, - }, - "apt" => PackageManager { - comando: "apt".to_string(), - buscar: "search".to_string(), - intalacion: "install".to_string(), - dinstalacion: "uninstall".to_string(), - paquete: String::new(), - confirmacion: "-y".to_string(), - root: true, - }, - "pacman" => PackageManager { - comando: "pacman".to_string(), - buscar: "-Ss".to_string(), - intalacion: "-S".to_string(), - dinstalacion: "-R".to_string(), - paquete: String::new(), - confirmacion: "--noconfirm".to_string(), - root: true, - }, - "dnf" => PackageManager { - comando: "dnf".to_string(), - buscar: "search".to_string(), - intalacion: "install".to_string(), - dinstalacion: "remove".to_string(), - paquete: String::new(), - confirmacion: "-y".to_string(), - root: true, - }, - "snap" => PackageManager { - comando: "snap".to_string(), - buscar: "find".to_string(), - intalacion: "install".to_string(), - dinstalacion: "remove".to_string(), - paquete: String::new(), - confirmacion: String::new(), - root: false, - }, - "flatpak" => PackageManager { - comando: "flatpak".to_string(), - buscar: "search".to_string(), - intalacion: "install".to_string(), - dinstalacion: "uninstall".to_string(), - paquete: String::new(), - confirmacion: String::new(), - root: false, - }, - "zypper" => PackageManager { - comando: "zypper".to_string(), - buscar: "search".to_string(), - intalacion: "in".to_string(), - dinstalacion: "remove".to_string(), - paquete: String::new(), - confirmacion: "--non-interactive".to_string(), - root: true, - }, - "yum" => PackageManager { - comando: "yum".to_string(), - buscar: "search".to_string(), - intalacion: "install".to_string(), - dinstalacion: "remove".to_string(), - paquete: String::new(), - confirmacion: "-y".to_string(), - root: true, - }, - "apk" => PackageManager { - comando: "apk".to_string(), - buscar: "search".to_string(), - intalacion: "add".to_string(), - dinstalacion: "delete".to_string(), - paquete: String::new(), - confirmacion: String::new(), - root: true, - }, - "npm" => PackageManager { - comando: "npm".to_string(), - buscar: "search".to_string(), - intalacion: "install".to_string(), - dinstalacion: "uninstall".to_string(), - paquete: String::new(), - confirmacion: String::new(), - root: true, - }, - "slackpkg" => PackageManager { - comando: "slackpkg".to_string(), - buscar: "search".to_string(), - intalacion: "install".to_string(), - dinstalacion: "remove".to_string(), - paquete: String::new(), - confirmacion: String::new(), - root: true, - }, - _ => PackageManager { - comando: "apmpkg".to_string(), - buscar: String::new(), - intalacion: "instalar".to_string(), - dinstalacion: "dinstal".to_string(), - paquete: String::new(), - confirmacion: "-c".to_string(), - root: true, - }, +pub fn instalar_dependencias_externas(ruta_proyecto: &str, adi_paquete: Adi) { + match adi_paquete.gestor { + GestoresLenguajes::Gem(gem) => { + if gem.gemfile { + let ruta_gemfile = Path::new(ruta_proyecto).join(gem.file); + let mut ruta_gemf = String::from("--gemfile="); + ruta_gemf.push_str(ruta_gemfile.to_str().unwrap()); + let mut child = Command::new("bundle") + .arg("install") + .arg(ruta_gemf) + .spawn() + .expect("No tienes bundler instalado"); + let _result = child.wait().unwrap(); + } else { + for gema in &gem.gemas { + let mut child = Command::new("gem") + .arg("install") + .arg(gema.as_str().unwrap()) + .spawn() + .expect("Ocurrio un error al ejecutar gem install"); + let _result = child.wait().unwrap(); + } + } + } + GestoresLenguajes::Pip(pip) => { + let version = pip.version; + match version { + 2 | 3 => {} + _ => { + let error = MsgError::new("Version de pip no soportada"); + error.print_salir(); + } + } + + if pip.requeriments { + let ruta_requeriments = Path::new(ruta_proyecto).join(pip.file); + if version == 2 { + let mut child = Command::new("pip2") + .arg("install") + .arg("-r") + .arg(ruta_requeriments.to_str().unwrap()) + .spawn() + .expect("Algo fallo al ejecutar pip2"); + let _result = child.wait().unwrap(); + } else { + let mut child = Command::new("pip3") + .arg("install") + .arg("-r") + .arg(ruta_requeriments.to_str().unwrap()) + .spawn() + .expect("Algo fallo al ejecutar pip3"); + let _result = child.wait().unwrap(); + } + } else if version == 2 { + for paquete in pip.paquetes { + let mut child = Command::new("pip2") + .arg("install") + .arg(paquete.as_str().unwrap()) + .spawn() + .expect("Ocurrio un error al ejecutar pip2"); + let _result = child.wait().unwrap(); + } + } else { + for paquete in pip.paquetes { + let mut child = Command::new("pip3") + .arg("install") + .arg(paquete.as_str().unwrap()) + .spawn() + .expect("Ocurrio un error al ejecutar pip3"); + let _result = child.wait().unwrap(); + } + } + } + GestoresLenguajes::Npm(npm) => { + let ruta_actual = match env::current_dir() { + Ok(v) => v, + Err(e) => { + let error = MsgError::new(&e.to_string()); + error.print_salir(); + Path::new(".").to_path_buf() + } + }; + let cambio = env::set_current_dir(ruta_proyecto); + match cambio { + Ok(_v) => _v, + Err(e) => { + let error = MsgError::new(&e.to_string()); + error.print_salir(); + } + } + //Separacion si se instalan dependencias desde package.json + if npm.package_json_bool { + let mut comando_npm = Command::new("npm") + .arg("install") + .spawn() + .expect("Ocurrio un error al ejecutar npm"); + let result = comando_npm.wait().unwrap(); + if result.to_string() != "exit status: 0" { + let error = MsgError::new( + "Algo salio mal al resolver las dependencias de package.json", + ); + error.print_salir(); + } + } else { + for modulo in npm.package { + let mut child = Command::new("npm") + .arg("install") + .arg(modulo.as_str().unwrap()) + .spawn() + .expect("Algo salio mal al resolver las dependcias"); + let result = child.wait().unwrap(); + if result.to_string() != "exit status: 0" { + let error = MsgError::new("Algo salio mal al resolver las dependencias"); + error.print_salir(); + } + } + } + let actual = env::set_current_dir(ruta_actual); + match actual { + Ok(_v) => _v, + Err(e) => { + let error = MsgError::new(&e.to_string()); + error.print_salir() + } + } + } + GestoresLenguajes::Ninguno => {} } } -pub fn msg_end(file: &str) { - let tomy: Value = toml::from_str(file) - .expect("Al parecer no has escrito bien el archivo ADI o no es un archivo ADI"); - let adi = tomy.as_table().unwrap(); - let des = adi["instalacion"].as_table().unwrap(); - if des.contains_key("mensaje") { - println!("{}", des["mensaje"].as_str().unwrap()); +pub fn pre_instalacion(adi_instalacion: AdiInstalacion, ruta_proyecto: &Path) -> bool { + let ruta_actual = match env::current_dir() { + Ok(v) => v, + Err(e) => { + let error = MsgError::new(&e.to_string()); + error.print_salir(); + Path::new(".").to_path_buf() + } + }; + let cambio = env::set_current_dir(ruta_proyecto); + match cambio { + Ok(_v) => _v, + Err(e) => { + let error = MsgError::new(&e.to_string()); + error.print_salir(); + } + } + let mut child = Command::new("bash") + .arg(adi_instalacion.pre_instalacion) + .spawn() + .expect("Algo fallo al ejecutar el script pre-instalacion"); + let result = child.wait().unwrap(); + let actual = env::set_current_dir(ruta_actual); + match actual { + Ok(_v) => _v, + Err(e) => { + let error = MsgError::new(&e.to_string()); + error.print_salir() + } } + result.to_string() == "exit status: 0" } -pub fn remove_abc(path: &str) { +pub fn post_instalacion(adi_instalacion: AdiInstalacion, ruta_proyecto: &Path) -> bool { + let ruta_actual = match env::current_dir() { + Ok(v) => v, + Err(e) => { + let error = MsgError::new(&e.to_string()); + error.print_salir(); + Path::new(".").to_path_buf() + } + }; + let cambio = env::set_current_dir(ruta_proyecto); + match cambio { + Ok(_v) => _v, + Err(e) => { + let error = MsgError::new(&e.to_string()); + error.print_salir(); + } + } let mut child = Command::new("bash") - .arg("/etc/apmpkg/iiabc/iiabc.sh") - .arg("-r") - .arg(path) + .arg(adi_instalacion.pre_instalacion) .spawn() - .expect("Ocurrio un error"); - let _result = child.wait().unwrap(); + .expect("Algo fallo al ejecutar el script pre-instalacion"); + let result = child.wait().unwrap(); + let actual = env::set_current_dir(ruta_actual); + match actual { + Ok(_v) => _v, + Err(e) => { + let error = MsgError::new(&e.to_string()); + error.print_salir() + } + } + result.to_string() == "exit status: 0" } -pub fn binario_abc(path: &str) { +pub fn remover_abc(ruta: &str) { let mut child = Command::new("bash") .arg("/etc/apmpkg/iiabc/iiabc.sh") - .arg("-ib") - .arg(path) + .arg("-r") + .arg(ruta) .spawn() - .expect("Algo fallo al intentar ejecutar iiabc"); + .expect("Ocurrio un erro al remover el paquete"); 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 - } -} +/* + * Inicio de implementacion de funciones para la estructura Adi +*/ -pub fn post_install(file_toml: &str, path: &Path) { - let tomy: Value = - toml::from_str(file_toml).expect("Al parcer no escribiste bien el archivo .ADI"); - let instalacion = tomy["instalacion"].as_table().unwrap(); - if instalacion.contains_key("post_install") { - println!("{}", "Ejecutando scripts de postinstalacion...".green()); - let mut comando = Command::new("bash") - .arg(path.join(instalacion["post_install"].as_str().unwrap())) - .spawn() - .expect("Algo fallo al ejecutar el script de postinstalacion"); - let result = comando.wait().unwrap(); - if result.to_string() != "exit status: 0" { - println!( - "{}", - "Ocurrio un error al ejecutar el script postinstalacion".red() - ); - process::exit(0x0100); +impl Adi { + pub fn nuevo(archivo: &str) -> Adi { + //Leyendo el archivo + let archivo_str: String = archivos::leer_archivo(archivo); + let tomy: Value = match toml::from_str(&archivo_str) { + Ok(v) => v, + Err(e) => { + let error = MsgError::new(&e.to_string()); + error.print_salir(); + Value::String("nada".to_string()) + } + }; + let adi_tomy = tomy.as_table().unwrap(); + if !adi_tomy.contains_key("paquete") + || !adi_tomy.contains_key("descarga") + || !adi_tomy.contains_key("instalacion") + { + let error = MsgError::new("Douh, eso no parece un archivo adi"); + error.print_salir(); } - } -} - -pub fn post_install_existe(file_toml: &str) -> bool { - let tomy: Value = - toml::from_str(file_toml).expect("Al parcer no escribiste bien el archivo .ADI"); - let instalacion = tomy["instalacion"].as_table().unwrap(); - instalacion.contains_key("post_install") -} + let paquete_tabla = adi_tomy["paquete"].as_table().unwrap(); -pub fn pre_install(file_toml: &str, path: &Path) { - let tomy: Value = - toml::from_str(file_toml).expect("Al parcer no escribiste bien el archivo .ADI"); - let instalacion = tomy["instalacion"].as_table().unwrap(); - if instalacion.contains_key("pre_install") { - println!("{}", "Ejecutando scripts de preinstalacion...".green()); - let mut comando = Command::new("bash") - .arg(path.join(instalacion["pre_install"].as_str().unwrap())) - .spawn() - .expect("Algo fallo al ejecutar el script de postinstalacion"); - let result = comando.wait().unwrap(); - if result.to_string() != "exit status: 0" { - println!( - "{}", - "Ocurrio un error al ejecutar el script postinstalacion".red() - ); - process::exit(0x0100); + //Colocando en esctruturas + let adi_paquete = AdiPaquete { + nombre: paquete_tabla["nombre"].as_str().unwrap().to_string(), + version: paquete_tabla["version"].as_str().unwrap().to_string(), + rama: paquete_tabla["rama"].as_str().unwrap().to_string(), + descripcion: paquete_tabla["descrip"].as_str().unwrap().to_string(), + pagina: paquete_tabla["pagina"].as_str().unwrap().to_string(), + licensia: paquete_tabla["licensia"].as_str().unwrap().to_string(), + dependencias: paquete_tabla["dependencias"].as_array().unwrap().to_vec(), + dependencias_string: { + let mut dependencias = String::new(); + for depend in paquete_tabla["dependencias"].as_array().unwrap().to_vec() { + dependencias.push_str(depend.as_str().unwrap()); + dependencias.push(' '); + } + dependencias + }, + cmd_depen: if paquete_tabla.contains_key("cmd_depen") { + paquete_tabla["cmd_depen"].as_array().unwrap().to_vec() + } else { + Vec::new() + }, + abi_dependencias: if paquete_tabla.contains_key("abi_dependencias") { + paquete_tabla["abi_dependencias"] + .as_array() + .unwrap() + .to_vec() + } else { + Vec::new() + }, + arquitectura: if paquete_tabla.contains_key("arch") { + paquete_tabla["arch"].as_str().unwrap().to_string() + } else { + String::from("any") + }, + conflicto: paquete_tabla["conflicto"].as_str().unwrap().to_string(), + }; + let paquete = adi_paquete.clone(); + let dependencias_adi = AbiDependencias { + paquetes: if adi_tomy.contains_key("dependencias_adi") { + let dependencias_tabla = adi_tomy["dependencias_adi"].as_table().unwrap(); + let mut dependencia_array = Vec::new(); + for dependencia in paquete.dependencias.clone() { + if dependencias_tabla.contains_key(&dependencia.to_string()) { + dependencia_array.push(dependencia); + } + } + dependencia_array + } else { + Vec::new() + }, + url: if adi_tomy.contains_key("dependencias_adi") { + let dependencias_tabla = adi_tomy["dependencias_adi"].as_table().unwrap(); + let mut url_array = Vec::new(); + for dependencia in &paquete.dependencias { + if dependencias_tabla.contains_key(&dependencia.to_string()) { + url_array.push( + dependencias_tabla[&dependencia.to_string()] + .as_str() + .unwrap() + .to_string(), + ); + } + } + url_array + } else { + Vec::new() + }, + }; + let descarga_tabla = adi_tomy["descarga"].as_table().unwrap(); + let adi_descarga = AdiDescarga { + fuente: if descarga_tabla.contains_key("url") { + Fuente::Url(descarga_tabla["url"].as_str().unwrap().to_string()) + } else if descarga_tabla.contains_key("local") { + Fuente::Local(descarga_tabla["local"].as_str().unwrap().to_string()) + } else { + Fuente::Git( + descarga_tabla["git"] + .as_str() + .expect("No exxiste ningun repositorio git") + .to_string(), + ) + }, + carpeta: descarga_tabla["carpeta"].as_str().unwrap().to_string(), + sumasha: descarga_tabla["sha256sum"].as_str().unwrap().to_string(), + }; + let instalacion_tabla = adi_tomy["instalacion"].as_table().unwrap(); + let adi_instalacion = AdiInstalacion { + fuente_opt: if instalacion_tabla.contains_key("opt_src") { + instalacion_tabla["opt_src"].as_bool().unwrap() + } else { + false + }, + pre_instalacion: if instalacion_tabla.contains_key("pre_install") { + instalacion_tabla["pre_install"] + .as_str() + .unwrap() + .to_string() + } else { + String::new() + }, + fuente: instalacion_tabla["files"].as_array().unwrap().to_vec(), + destino: instalacion_tabla["ruta"].as_array().unwrap().to_vec(), + post_instalacion: if instalacion_tabla.contains_key("post_install") { + instalacion_tabla["post_install"] + .as_str() + .unwrap() + .to_string() + } else { + String::new() + }, + mensaje: if instalacion_tabla.contains_key("mensaje") { + instalacion_tabla["mensaje"].as_str().unwrap().to_string() + } else { + String::new() + }, + }; + let adi_gestor = if adi_tomy.contains_key("gem") { + let gem_tabla = adi_tomy["gem"].as_table().unwrap(); + let ruby_gem = Gem { + gemfile: gem_tabla["gemfile"].as_bool().unwrap(), + file: if gem_tabla.contains_key("file") { + gem_tabla["file"].as_str().unwrap().to_string() + } else { + String::new() + }, + gemas: if gem_tabla.contains_key("gemas") { + gem_tabla["gemas"].as_array().unwrap().to_vec() + } else { + Vec::new() + }, + }; + GestoresLenguajes::Gem(ruby_gem) + } else if adi_tomy.contains_key("pip") { + let pip_tabla = adi_tomy["pip"].as_table().unwrap(); + let pip_struct = Pip { + version: pip_tabla["version"].as_integer().unwrap(), + requeriments: pip_tabla["requirements"].as_bool().unwrap(), + paquetes: if pip_tabla.contains_key("packages") { + pip_tabla["packages"].as_array().unwrap().to_vec() + } else { + Vec::new() + }, + file: if pip_tabla.contains_key("file") { + pip_tabla["file"].as_str().unwrap().to_string() + } else { + String::new() + }, + }; + GestoresLenguajes::Pip(pip_struct) + } else if adi_tomy.contains_key("npm") { + let npm_tabla = adi_tomy["npm"].as_table().unwrap(); + let npm_estructura = Npm { + package_json_bool: npm_tabla["package_json"].as_bool().unwrap(), + package_json_ruta: if npm_tabla.contains_key("ruta_package_json") { + npm_tabla["ruta_package_json"].as_str().unwrap().to_string() + } else { + String::new() + }, + package: if npm_tabla.contains_key("modulos") { + npm_tabla["modulos"].as_array().unwrap().to_vec() + } else { + Vec::new() + }, + }; + GestoresLenguajes::Npm(npm_estructura) + } else { + GestoresLenguajes::Ninguno + }; + Adi { + paquete: adi_paquete, + abi_dependencias: dependencias_adi, + gestor: adi_gestor, + descarga: adi_descarga, + instalacion: adi_instalacion, } } -} - -pub fn pre_install_existe(file_toml: &str) -> bool { - let tomy: Value = - toml::from_str(file_toml).expect("Al parcer no escribiste bien el archivo .ADI"); - let instalacion = tomy["instalacion"].as_table().unwrap(); - instalacion.contains_key("pre_install") -} -//Funcion para saber el tipo de variable -//ideal para desarrolladores novatos en rust -//como yo -pub fn type_of(_: T) -> &'static str { - type_name::() + pub fn imprimir_metadatos(&self) { + println!( + " + \t\t Paquete: {} + \t\t Rama: {} + \t\t Version actual: {} + \t\t Descripcion: {} + \t\t Dependencias: {} + \n\n", + &self.paquete.nombre, + &self.paquete.rama, + &self.paquete.version, + &self.paquete.descripcion, + &self.paquete.dependencias_string + ); + } } diff --git a/src/estructuras.rs b/src/estructuras.rs index 86c7014..a86a240 100644 --- a/src/estructuras.rs +++ b/src/estructuras.rs @@ -1,8 +1,8 @@ -// Estructuras -use toml::Value; +//Estructuras -//Enumeracion de subcomandos +use {colored::*, exitcode, std::process, toml::Value}; +//Enums #[derive(Debug, Clone)] pub enum SubComandos { Instalar(String), @@ -23,62 +23,129 @@ pub enum Banderas { Ninguno, } +#[derive(Debug, Clone)] +pub enum GestoresLenguajes { + Gem(Gem), + Pip(Pip), + Npm(Npm), + Ninguno, +} + +#[derive(Debug, Clone)] +pub enum Fuente { + Git(String), + Local(String), + Url(String), +} + +//Structs #[derive(Clone, Debug)] pub struct Argumentos { pub subcomand: SubComandos, pub flags: Banderas, } -// ADI TOML archivo -#[derive(Clone, Debug)] -pub struct AdiPaquete { +#[derive(Debug, Clone)] +pub struct MsgError { + pub mensaje: String, +} + +#[derive(Debug, Clone)] +pub struct GestorNativo { pub nombre: String, - pub version: String, - pub rama: String, - pub descrip: String, - pub pagina: String, - pub licensia: String, - pub depen: String, - pub conflicto: String, + pub buscar: String, + pub instalacion: String, + pub confirmacion: String, } -#[derive(Clone, Debug)] -pub struct AdiGem { +//Estructuras para el archivo adi + +#[derive(Debug, Clone)] +pub struct Gem { pub gemfile: bool, pub file: String, pub gemas: Vec, } -#[derive(Clone, Debug)] -pub struct AdiPip { +#[derive(Debug, Clone)] +pub struct Pip { pub version: i64, - pub requirements: bool, + pub requeriments: bool, + pub paquetes: Vec, pub file: String, - pub packages: Vec, } -#[derive(Clone, Debug)] -pub struct AdiDescarga { - pub url: String, - pub src: String, - pub sha256sum: String, +#[derive(Debug, Clone)] +pub struct Npm { + pub package_json_bool: bool, + pub package_json_ruta: String, + pub package: Vec, } -//PACKAGE MANAGERS LINUX +#[derive(Debug, Clone)] +pub struct AdiPaquete { + pub nombre: String, + pub version: String, + pub rama: String, + pub descripcion: String, + pub pagina: String, + pub licensia: String, + pub dependencias: Vec, + pub dependencias_string: String, + pub cmd_depen: Vec, + pub abi_dependencias: Vec, + pub arquitectura: String, + pub conflicto: String, +} -#[derive(Clone, Debug)] -pub struct PackageManager { - pub comando: String, - pub buscar: String, - pub intalacion: String, - pub dinstalacion: String, - pub paquete: String, - pub confirmacion: String, - pub root: bool, +#[derive(Debug, Clone)] +pub struct AdiDescarga { + pub fuente: Fuente, + pub carpeta: String, + pub sumasha: String, } -//Gestionar los mensajes de errores -#[derive(Clone, Debug)] -pub struct MsgError { +#[derive(Debug, Clone)] +pub struct AdiInstalacion { + pub fuente_opt: bool, + pub pre_instalacion: String, + pub fuente: Vec, + pub destino: Vec, + pub post_instalacion: String, pub mensaje: String, } + +#[derive(Debug, Clone)] +pub struct AbiDependencias { + pub paquetes: Vec, + pub url: Vec, +} + +#[derive(Debug, Clone)] +pub struct Adi { + pub paquete: AdiPaquete, + pub abi_dependencias: AbiDependencias, + pub gestor: GestoresLenguajes, + pub descarga: AdiDescarga, + pub instalacion: AdiInstalacion, +} + +//Impl para los mensajes de error +impl MsgError { + pub fn new(mensaje: &str) -> Self { + MsgError { + mensaje: mensaje.to_string(), + } + } + + pub fn salir(&self) { + process::exit(exitcode::DATAERR); + } + pub fn print(&self) { + println!("{} {}", "Error:".red(), &self.mensaje); + } + pub fn print_salir(&self) { + println!("{} {}", "Error:".red(), &self.mensaje); + process::exit(exitcode::DATAERR); + } +} diff --git a/src/iiabc/core_fn.sh b/src/iiabc/core_fn.sh index a1c6c69..1ca7e40 100644 --- a/src/iiabc/core_fn.sh +++ b/src/iiabc/core_fn.sh @@ -2,7 +2,7 @@ #Variables de cajon NOMBRE='iiabc' -VERSION='1.4.0' +VERSION='1.4.1' TRUE=1 FALSE=0 ROJO='\033[91m' @@ -193,6 +193,11 @@ generar_adi(){ echo '##requirements = false'>> $nombre.adi echo '##packages = ["requests"]'>> $nombre.adi echo >> $nombre.adi + echo '#[npm]'>> $nombre.adi + echo '#package_json = true / false'>> $nombre.adi + echo '#ruta_package_json = "package.json"'>> $nombre.adi + echo '#modulos = ["angular", "electron"]'>> $nombre.adi + echo >> $nombre.adi echo '[descarga]'>> $nombre.adi echo >> $nombre.adi echo '#git = "https://git.foo.com/bar.git"'>> $nombre.adi @@ -204,8 +209,11 @@ generar_adi(){ echo >> $nombre.adi echo '[instalacion]'>> $nombre.adi echo >> $nombre.adi + echo '#opt_src = true'>> $nombre.adi + echo 'pre_install = "pre_apmpkg.sh"'>> $nombre.adi echo 'files = ["path/del/binario"]'>> $nombre.adi echo 'ruta = ["/usr/bin/foobar"]'>> $nombre.adi + echo 'post_install = "post_apmpkg.sh"'>> $nombre.adi echo '#mensaje = "Eso es una prototipo!"'>> $nombre.adi } diff --git a/src/iiabc/iiabc.sh b/src/iiabc/iiabc.sh index acd45e3..8dfb3a0 100644 --- a/src/iiabc/iiabc.sh +++ b/src/iiabc/iiabc.sh @@ -5,7 +5,7 @@ ################################################################ # # # Interpretador para la Instalacion con archivos .ABC (IIABC) # -# v1.4.0 # +# v1.4.1 # # # # Autor / Contribudores # # # diff --git a/src/lang_managers.rs b/src/lang_managers.rs deleted file mode 100644 index c677864..0000000 --- a/src/lang_managers.rs +++ /dev/null @@ -1,129 +0,0 @@ -// Manejador como bundle o pip - -//uses -use { - crate::estructuras::{AdiGem, AdiPip}, - colored::*, - std::{process, process::Command}, - toml::Value, -}; - -fn install_bundle(path: &str) -> bool { - let mut gem = String::from("--gemfile="); - gem.push_str(path); - println!("Iniciando instalacion del archivo Gemfile"); - let mut child = Command::new("bundle") - .arg("install") - .arg(gem) - .spawn() - .expect("No tenis el bundle"); - let _result = child.wait().unwrap(); - true -} - -fn install_pip(version: i64, path: &str) -> bool { - if version == 2 { - let mut child = Command::new("pip2") - .arg("install") - .arg("-r") - .arg(path) - .spawn() - .expect("No tenis el pip2?"); - let _result = child.wait().unwrap(); - } else { - let mut child = Command::new("pip3") - .arg("install") - .arg("-r") - .arg(path) - .spawn() - .expect("No tenis el pip3?"); - let _result = child.wait().unwrap(); - } - true -} - -fn install_gem(gemas: Vec) -> bool { - for gema in gemas { - println!("Instalando la gema {}", gema); - let mut child = Command::new("gem") - .arg("install") - .arg(gema.as_str().unwrap()) - .spawn() - .expect("No tenis ruby?"); - let _result = child.wait().unwrap(); - } - true -} - -fn pip_pack(version: i64, packages: Vec) -> bool { - if version == 2 { - let pipa = "pip2"; - for paquete in packages { - println!("Instalando {}", paquete); - let mut child = Command::new(pipa) - .arg("install") - .arg(paquete.as_str().unwrap()) - .spawn() - .expect("No tenis el pip?"); - let _result = child.wait().unwrap(); - } - } else { - let pipa = "pip3"; - for paquete in packages { - println!("Instalando {}", paquete); - let mut child = Command::new(pipa) - .arg("install") - .arg(paquete.as_str().unwrap()) - .spawn() - .expect("No tenis el pip?"); - let _result = child.wait().unwrap(); - } - } - true -} - -pub fn analized_pip(input: AdiPip, path: &str) { - if input.requirements { - let mut pat = String::from(path); - pat.push_str(&input.file); - let confir = install_pip(input.version, &pat); - if confir { - println!("Instalacion de pip terminada con exito!"); - } else { - println!("{}", "Algo salio mal instalando con pip".red()); - process::exit(0x0100); - } - } else { - let conf = pip_pack(input.version, input.packages); - if conf { - println!("Instalacion con pip correcta!"); - } else { - println!("{}", "Algo salio mal instalando con pip".red()); - process::exit(0x0100); - } - } -} - -pub fn analized_gem(input: AdiGem, path: &str) { - if input.gemfile { - let mut paa = String::new(); - paa.push_str(path); - paa.push_str(&input.file); - let conf = install_bundle(&paa); - - if conf { - println!("La instalacion se ha realizado con exito"); - } else { - println!("{}", "Algo salio mal instalando con bundler".red()); - process::exit(0x0100); - } - } else { - let conf = install_gem(input.gemas); - if conf { - println!("Se termino la instalacion de las gemas!!"); - } else { - println!("{}", "Algo salio mal instalando las gemas".red()); - process::exit(0x0100); - } - } -} diff --git a/src/lib.rs b/src/lib.rs index f0a011b..69eefea 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,9 +1,8 @@ pub mod archivos; pub mod core_funcions; pub mod estructuras; -pub mod lang_managers; pub mod metodos_de_instalacion; -//modulo de testeo +//Modulo de testeo #[cfg(test)] pub mod tests; diff --git a/src/main.rs b/src/main.rs index 0dbfdb4..11db3ab 100644 --- a/src/main.rs +++ b/src/main.rs @@ -13,154 +13,137 @@ use { apmpkg::{archivos, core_funcions, estructuras::*, metodos_de_instalacion}, colored::*, nix::unistd::Uid, + pbr::ProgressBar, std::process, }; -fn instalar(name: &str, flags: Banderas) { - let no_user = matches!( - flags, +fn instalar(ruta_archivo: &str, banderas: Banderas) { + //Colocando valores de confirmacion o si se crea un binario + let confirmacion = matches!( + banderas, Banderas::ConfirmarInstalacion | Banderas::ConfirmarConBinarios ); - let bin = matches!( - flags, + let binario = matches!( + banderas, Banderas::InstalacionConBinarios | Banderas::ConfirmarConBinarios ); - println!("{}", "Iniciando instalacion!".green()); - let abi = archivos::es_abi(name); + + let abi = archivos::es_abi(ruta_archivo); + + //Si es abi if abi { if !Uid::effective().is_root() { - let error = MsgError::nuevo("Para instalar un archivo adi necesitas permisos root!"); + let error = MsgError::new("Para instalar un archivo abi necesitas permisos root!"); error.print_salir(); } - metodos_de_instalacion::instalar_abi(name, no_user); + metodos_de_instalacion::instalar_abi(&ruta_archivo, confirmacion); } else { - let abc = archivos::es_abc(name); + //Si es que existe de otra manera que el abc o adi + let abc = archivos::es_abc(ruta_archivo); if abc { - metodos_de_instalacion::instalar_abc(name, bin); + metodos_de_instalacion::instalar_abc(ruta_archivo, binario); } else { if !Uid::effective().is_root() { - let error = - MsgError::nuevo("Para instalar un archivo adi necesitas permisos root!"); + let error = MsgError::new("Para instalar un archivo adi necesitar permisos root"); error.print_salir(); } - 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); - } + metodos_de_instalacion::instalar_adi(ruta_archivo, confirmacion, binario); } } } -fn instalar_url(name: &str, flags: Banderas) { - println!("Descargando desde la direccion {}", name); - let f = archivos::download(name, "file.pmpf"); - match f { - Ok(_f) => println!("La descarga se realizo con exito!"), +fn instalar_url(url: &str, banderas: Banderas) { + let mut barrita = ProgressBar::new(1); + barrita.format("(->.)"); + barrita.message("Descargando... "); + barrita.inc(); + let descarga = archivos::descarga(&url, "file.ada"); + match descarga { + Ok(_v) => barrita.finish_print(" "), Err(e) => { - let msgerror = MsgError::nuevo(&e.to_string()); - msgerror.print_salir(); + let error = MsgError::new(&e.to_string()); + error.print_salir(); } } - instalar("file.pmpf", flags); - archivos::remove_df("file.pmpf"); + instalar("file.ada", banderas); + archivos::borrar_archivo("file.ada"); } -fn dinstalar(name: &str, flags: Banderas) { - let no_user = matches!(flags, Banderas::ConfirmacionRemove); - println!("Desinstalando el paquete {}", name); +pub fn remover(nombre: &str, banderas: Banderas) { + let confirmacion = matches!(banderas, Banderas::ConfirmacionRemove); if !Uid::effective().is_root() { - let error = MsgError::nuevo("Para desintalar un paquete necesitas de permisos root"); - error.print_salir() + let error = MsgError::new("Para remover un paquete necesitas permisos root"); + error.print_salir(); } - let bash_file = archivos::existe_abc(name); - if bash_file { - core_funcions::remove_abc(name); + let mut abc = String::from(nombre); + abc.push_str(".abc"); + if std::path::Path::new("/etc/apmpkg/paquetes") + .join(abc.clone()) + .exists() + { + core_funcions::remover_abc( + std::path::Path::new("/etc/apmpkg/paquetes") + .join(abc) + .to_str() + .unwrap(), + ); } else { - let mut adi_file = String::new(); - adi_file.push_str("/etc/apmpkg/paquetes/"); - adi_file.push_str(name); - adi_file.push_str(".adi"); - let toml = archivos::read_fs(&adi_file); - let meta = archivos::read_adi(&toml); - core_funcions::clear(); - core_funcions::print_banner(); - core_funcions::print_metapkg(meta.clone()); - - if no_user { - println!("{}", "Omitiendo la confirmacion".yellow()); - } else { - let confirm = core_funcions::quess("Deseas seguir con la desinstalacion?"); - if confirm { - println!("Iniciando con el proceso de desinstalacion"); - } else { - println!("{}", "abortando!".red()); - process::exit(0x0100); - } - } - - println!("Removiendo los archivos..."); - archivos::dinstall_path(&toml); - archivos::opt_remove(&toml); - let mut file_db = String::new(); - file_db.push_str("/etc/apmpkg/paquetes/"); - file_db.push_str(&meta.nombre); - file_db.push_str(".adi"); - archivos::remove_df(&file_db); - println!("La desinstalacion se realizo con exito!"); + metodos_de_instalacion::remover_adi(nombre, confirmacion); } } -fn instalar_depen(depen: &str) { +fn instalar_depen(dependencia: &str) { if !Uid::effective().is_root() { - let error = MsgError::nuevo("Para instalar un binario necesitas de permisos root!"); + let error = MsgError::new("Para instalar dependencias necesitas de permisos root!"); + error.print_salir(); + } + let mut dependencia_vector: Vec = Vec::new(); + dependencia_vector[0] = dependencia.to_string(); + if !core_funcions::instalar_dependencia_vector(dependencia_vector) { + let error = + MsgError::new("Al parecer no se puedo resolver la dependencia de manera correcta"); error.print_salir(); } - core_funcions::clear(); - println!("Instalando el paquete {}", depen); - let mut toml_str = String::from( - " - [paquete] - dependencias = ['", - ); - toml_str.push_str(depen); - toml_str.push_str("']"); - core_funcions::install_depen(&toml_str); } -fn crear_protipo(tipo: &str, nombre: &str) { - // El tipo es correcto? +fn crear(tipo: &str, nombre: &str) { if tipo == "adi" || tipo == "abc" { println!("Creando un archivo {} con el nombre de {}...", tipo, nombre); } else { - let error = MsgError::nuevo("Tu archivo no es un formato soportado para crear"); + let error = MsgError::new("Tu archivo no es un formato soportado para crear"); error.print_salir() } if tipo == "adi" { - archivos::spawn_adi(nombre); + std::process::Command::new("bash") + .arg("/etc/apmpkg/iiabc/iiabc.sh") + .arg("-a") + .arg(nombre) + .spawn() + .expect("Ocurrio un error al crear el archivo adi"); println!("La creacion del archivo {}.adi a sido correcta", nombre); } else { - archivos::spawn_abc(nombre); + std::process::Command::new("bash") + .arg("/etc/apmpkg/iiabc/iiabc.sh") + .arg("-bb") + .spawn() + .expect("Algo fallo al crear el archivo .abc"); println!("La creacion del archivo {}.abc a sido correcta", nombre); } } -fn constuir(path: &str) { - let abc = archivos::es_abc(path); - if abc { +fn constuir(ruta: &str) { + if archivos::es_abc(ruta) { let mut child = std::process::Command::new("bash") .arg("/etc/apmpkg/iiabc/iiabc.sh") .arg("-b") - .arg(path) + .arg(ruta) .spawn() .expect("Algo fallo al intentar ejecutar iiabc"); let _result = child.wait().unwrap(); } else { - metodos_de_instalacion::binario_adi(path); + metodos_de_instalacion::construir_binario_adi(ruta); } } @@ -173,9 +156,9 @@ fn main() { match info_arg.subcomand { SubComandos::Instalar(path) => instalar(&path, flags), SubComandos::InstalarUrl(url) => instalar_url(&url, flags), - SubComandos::Remover(path) => dinstalar(&path, flags), + SubComandos::Remover(path) => remover(&path, flags), SubComandos::InstalarDependencia(dependencia) => instalar_depen(&dependencia), - SubComandos::Crear { tipo, nombre } => crear_protipo(&tipo, &nombre), + SubComandos::Crear { tipo, nombre } => crear(&tipo, &nombre), SubComandos::Construir(path) => constuir(&path), _ => { println!("{}", "Intenta con: apmpkg -h o apmpkg --help".green()); diff --git a/src/metodos_de_instalacion.rs b/src/metodos_de_instalacion.rs index f1a73b7..3481272 100644 --- a/src/metodos_de_instalacion.rs +++ b/src/metodos_de_instalacion.rs @@ -1,560 +1,649 @@ -// Todos los metodos por instalacion ya sea por un .adi -// un .abc o un .adi.tar +//Todos los metodos de instalacion // use use { - crate::{archivos, core_funcions, estructuras::MsgError}, + crate::{archivos, core_funcions, estructuras::*}, colored::*, pbr::ProgressBar, - std::{path::Path, process, thread, time::Duration}, + std::path::Path, + std::{fs, process, process::Command}, }; -// Instalacion apartir de un archivo .adi -pub fn instalar_adi(name: &str, no_user: bool, bin: bool) -> Vec { - println!( - "Iniciando instalacion/creacion del paquete desde el archivo: {}", - name - ); - let toml = archivos::read_fs(name); - let meta = archivos::read_adi(&toml); - core_funcions::clear(); - core_funcions::print_banner(); - core_funcions::print_metapkg(meta.clone()); - let mut instalacion_adi = meta.nombre.clone(); +//Instalacion abc +pub fn instalar_abc(ruta: &str, binario: bool) { + println!("Iniciando desde un .abc"); + + if binario { + let mut child = process::Command::new("bash") + .arg("/etc/apmpkg/iiabc/iiabc.sh") + .arg("-b") + .arg(ruta) + .spawn() + .expect("Al parecer no tienes iiabc, algo anda mal"); + let _result = child.wait().unwrap(); + } else { + let mut child = process::Command::new("bash") + .arg("/etc/apmpkg/iiabc/iiabc.sh") + .arg("-i") + .arg(ruta) + .spawn() + .expect("Al parecer no tienes iiabc, algo anda mal"); + let _result = child.wait().unwrap(); + } +} + +pub fn instalar_adi(ruta_archivo: &str, confirmacion: bool, binario: bool) { + let paquete = Adi::nuevo(ruta_archivo); + paquete.imprimir_metadatos(); + + if confirmacion { + println!("{}", "Omitiendo confirmacion...".yellow()); + } else { + let pregunta = core_funcions::pregunta("¿Deseas seguir con la instalacion?"); + if !pregunta { + let error = MsgError::new("¡Abortando instalacion!"); + error.print_salir(); + } + } + + //Comprobando si existe una instalacion + let mut instalacion_adi = paquete.paquete.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 { - let confirm = core_funcions::quess("Deseas seguir con la instalacion?"); - - if confirm { - println!("Iniciando proceso de instalacion"); - } else { - println!("{}", "abortando!".red()); - let mut dirc = String::new(); - dirc.push_str(&meta.nombre); - dirc.push_str(".d"); - dirc.push('/'); - println!("Limpiando..."); - archivos::remove_dd(&dirc); - process::exit(0x0100); - } + println!( + "{}{}", + "Actualizando el paquete ".yellow(), + paquete.paquete.nombre + ); } - // Progres barr - let contador_bar = 9; - let mut pb = ProgressBar::new(contador_bar); + //Barra de progreso + let contador = 13; + let mut pb = ProgressBar::new(contador); pb.format("(->.)"); - pb.inc(); - thread::sleep(Duration::from_secs(1)); + pb.message("Creando directorios "); pb.inc(); - let mut dir = String::new(); - dir.push_str(&meta.nombre); - dir.push_str(".d"); - - let mut dir0 = String::new(); - dir0.push_str(&meta.nombre); - dir0.push_str(".d"); - - let mut dirg = String::new(); - dirg.push_str(&meta.nombre); - dirg.push_str(".d"); - - let mut copy_install = String::new(); - copy_install.push_str(&meta.nombre); - copy_install.push_str(".d/"); - copy_install.push_str("apkg.adi"); - - let exist: bool = Path::new(&dir).exists(); - if exist { - let borrar = core_funcions::quess( - "Al parecer el directorio de trabajo ya esta creado, quiere borrarlo?", + let mut dir_name = paquete.paquete.nombre.clone(); + dir_name.push_str(".d"); + let directorio = Path::new(&dir_name); + if directorio.exists() { + let borrar = core_funcions::pregunta( + "Al parecer el directorio de trabajo ya esta creado, ¿Quieres borrarlo?", ); - if borrar { - println!("Borrando el directorio..."); - archivos::remove_dd(&dir); - } else { - let error = - MsgError::nuevo("No se puede continuar a menos que elimine dicho directorio"); + if !borrar { + let error = MsgError::new("No se puede continuar a menos que elimine dicho directorio"); error.print_salir(); } - } - - let a = archivos::new_dir(&dir); - match a { - Ok(_a) => println!("Creacion del directorio es correcto"), - Err(e) => { - let error = MsgError::nuevo(&e.to_string()); - error.print_salir(); + let borrar_dir = fs::remove_dir_all(directorio); + match borrar_dir { + Ok(_v) => _v, + Err(e) => { + let error = MsgError::new(&e.to_string()); + error.print_salir(); + } } } - println!("Verificando los conflictos"); - let existe_conflicto = Path::new(&meta.conflicto).exists(); - if existe_conflicto { + pb.message("Buscando conflictos "); + pb.inc(); + let existe_conflictos = Path::new(&paquete.paquete.conflicto).exists(); + if existe_conflictos { let mensaje = format!( "No se puede instalar, el archivo {} entra en conflicto", - &meta.conflicto + &paquete.paquete.conflicto ); - let error = MsgError::nuevo(&mensaje); - error.print(); - let mut dirc = String::new(); - dirc.push_str(&meta.nombre); - dirc.push_str(".d"); - dirc.push('/'); - println!("Limpiando..."); - archivos::remove_dd(&dirc); - error.salir(); - } else { - println!("No existe el conflicto"); + let error = MsgError::new(&mensaje); + error.print_salir(); } - println!("Verificando requisitos..."); - let arch = core_funcions::verificar_arch(&toml); - if arch { - println!("Requisitos cumplidos"); - } else { - let error = MsgError::nuevo("Al parecer no cuentas con la arquitectura requerida"); - error.print(); - let mut dirc = String::new(); - dirc.push_str(&meta.nombre); - dirc.push_str(".d"); - dirc.push('/'); - println!("Limpiando..."); - archivos::remove_dd(&dirc); - error.salir(); + pb.message("Verificando arquitectura "); + pb.inc(); + if !core_funcions::verificar_arch(paquete.paquete.clone()) { + let error = MsgError::new("Al parecer no cuentas con la arquitectura requerida"); + error.print_salir(); } - let ya_install = core_funcions::local_depen(&toml); - if ya_install { - println!("Yeah, ya tienes las dependencias instaladas!!!!"); - } else { - let dependencias_instaladas = core_funcions::install_depen(&toml); - if !dependencias_instaladas { - println!("Descargando dependencias externas..."); - return archivos::dependencias_adi(&toml); + pb.message("Resolviendo dependencias "); + pb.inc(); + let dependencias_instaladas = core_funcions::dependencias_instaladas(paquete.paquete.clone()); + if !dependencias_instaladas { + let dependencias_instalar = core_funcions::instalar_dependencias(paquete.paquete.clone()); + if !dependencias_instalar { + //Agregar linea para la dependencias abi + let error = MsgError::new("No se pudieron descargar las dependencias"); + error.print_salir(); } } - pb.inc(); - println!("{}", "iniciando la descarga de las fuentes...".green()); - let mut pack_ver = String::new(); - pack_ver.push_str(&dir); - pack_ver.push('/'); - pack_ver.push_str(&meta.nombre); - pack_ver.push('-'); - pack_ver.push_str(&meta.version); - pack_ver.push_str(".acd.tar"); - let gito = archivos::source_git_q(&toml); - let existe_local = archivos::source_es_local(&toml); - if gito { - let des = archivos::read_adi_down(&toml, gito); - dirg.push('/'); - dirg.push_str(&des.src); - let source_git = archivos::read_git(&toml); - archivos::git_clone(&source_git, &dirg); - } else if existe_local { - let path_local = archivos::leer_fuente_local(&toml); - archivos::copy_dd(&path_local, &pack_ver) - } else { - let des = archivos::read_adi_down(&toml, gito); - let f = archivos::download(&des.url, &pack_ver); - match f { - Ok(_f) => println!("Correcto"), - Err(e) => { - let error = MsgError::nuevo(&e.to_string()); - error.print_salir(); + pb.message("Obteniendo fuentes "); + pb.inc(); + let mut acd = String::from(&paquete.paquete.nombre); + acd.push('-'); + acd.push_str(&paquete.paquete.version); + acd.push_str(".acd.tar"); + let fuentes = paquete.descarga.fuente.clone(); + match fuentes { + Fuente::Git(repositorio) => archivos::git_clone( + &repositorio, + &directorio + .join(paquete.descarga.carpeta.clone()) + .to_str() + .unwrap(), + ), + Fuente::Url(url) => { + let creando = archivos::crear_directorio(&directorio.to_str().unwrap()); + match creando { + Ok(_v) => _v, + Err(e) => { + let error = MsgError::new(&e.to_string()); + error.print_salir(); + } } + let descarga = + archivos::descarga(&url, &directorio.join(acd.clone()).to_str().unwrap()); + match descarga { + Ok(_v) => _v, + Err(e) => { + let error = MsgError::new(&e.to_string()); + error.print_salir(); + } + } + } + Fuente::Local(ruta) => { + let creando = archivos::crear_directorio(&directorio.to_str().unwrap()); + match creando { + Ok(_v) => _v, + Err(e) => { + let error = MsgError::new(&e.to_string()); + error.print_salir(); + } + } + archivos::copiar_archivo(&ruta, &directorio.join(&acd).to_str().unwrap()); } - println!("Se termino la descarga"); } - pb.inc(); - let git_o_local: bool; - if gito || existe_local { - git_o_local = true; - } else { - git_o_local = false; + pb.message("Verificando la integridad del archivo "); + pb.inc(); + if paquete.descarga.sumasha == "SALTAR" { + println!("{}", "¡Se a saltado la verificacion!".yellow()); + } else if !archivos::verificacion_hash( + &directorio.join(acd.clone()).to_str().unwrap(), + &paquete.descarga.sumasha, + ) { + let error = MsgError::new("Las sumas no son coinciden"); + error.print_salir(); } - 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()); + + pb.message("Extrayendo fuentes "); + pb.inc(); + if let Fuente::Git(_repositorio) = paquete.descarga.fuente.clone() { + let _rr = _repositorio; } else { - let suma = archivos::hash_sum(&pack_ver, &des.sha256sum); - if suma { - println!("{}", "Verificacion correcta".green()); - } else { - println!("{}", "La verificacion no coinside, vuelve intentar".red()); - process::exit(0x0100); + let tar = archivos::extraer_tar( + &directorio.join(&acd).to_str().unwrap(), + &directorio.to_str().unwrap(), + ); + match tar { + Ok(_v) => _v, + Err(e) => { + let error = MsgError::new(&e.to_string()); + error.print_salir(); + } } } + + pb.message("Iniciando la instalacion de dependencias del proyecto "); pb.inc(); + let root_proyecto = &directorio.join(&paquete.descarga.carpeta); + core_funcions::instalar_dependencias_externas( + &root_proyecto.to_str().unwrap(), + paquete.clone(), + ); - if !gito { - println!("Extrayendo el tarball"); - let taa = archivos::e_tar(&pack_ver, &dir); - 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); - } + pb.message("Ejecutando scripts pre-instalacion "); + pb.inc(); + if !paquete.instalacion.pre_instalacion.is_empty() { + let pre_instalacion_hecha = core_funcions::pre_instalacion( + paquete.instalacion.clone(), + directorio.join(paquete.descarga.carpeta.clone()).as_path(), + ); + if !pre_instalacion_hecha { + let error = MsgError::new("Ocurrio un error al ejecutar el script post instalacion"); + error.print_salir() } } - pb.inc(); - println!("Iniciando la instalacion de archivos de depenencias del proyecto"); - let mut src_path = dir; - src_path.push('/'); - src_path.push_str(&des.src); - let mut src_path0 = dir0; - src_path0.push('/'); - src_path0.push_str(&des.src); - src_path.push('/'); - src_path0.push('/'); - archivos::extern_depen(&toml, &src_path); - let mut dird = String::new(); - dird.push_str(&meta.nombre); - dird.push_str(".d/"); - let pkgd = Path::new(&dird); + pb.message("Iniciando instalacion "); pb.inc(); + let tmp = directorio.join(paquete.descarga.carpeta.clone()); + let dir = tmp.as_path(); + archivos::instalar_archivos(paquete.instalacion.clone(), &dir.to_str().unwrap()); - println!("Iniciando instalacion"); - core_funcions::pre_install(&toml, &pkgd.join(&des.src)); - archivos::install_path(&toml, &src_path0); - archivos::opt_src(&toml, &src_path); - core_funcions::post_install(&toml, &pkgd.join(&des.src)); + pb.message("Ejecutando scripts post-instalacion "); pb.inc(); + if !paquete.instalacion.post_instalacion.is_empty() { + let post_instalacion_hecha = core_funcions::post_instalacion( + paquete.instalacion.clone(), + directorio.join(paquete.descarga.carpeta.clone()).as_path(), + ); + if !post_instalacion_hecha { + let error = MsgError::new("Ocurrio un error al ejecutar el script post instalacion"); + error.print_salir() + } + } - println!("Borrando y limpiando los archivos de compilacion y fuentes"); - let mut dirc = String::new(); - dirc.push_str(&meta.nombre); - dirc.push_str(".d"); - dirc.push('/'); - // Antes de limpiar... - if bin { - archivos::copy_dd(name, ©_install); - let mut nombre_bin = String::new(); - nombre_bin.push_str(&meta.nombre); - nombre_bin.push('-'); - nombre_bin.push_str(&meta.version); - archivos::crate_bin(&dirc, &nombre_bin, &toml); + pb.message("Ejecutando los ultimos pasos "); + pb.inc(); + let mut nombre_adi = paquete.paquete.nombre.clone(); + nombre_adi.push_str(".adi"); + let tmp_adi = Path::new("/etc/apmpkg/paquetes").join(nombre_adi); + let archivo_adi = tmp_adi.as_path(); + archivos::copiar_archivo(ruta_archivo, &archivo_adi.to_str().unwrap()); + + //Creando el binario + if binario { + pb.message("Creando binario "); + pb.inc(); + archivos::construir_binario(paquete.clone(), directorio, ruta_archivo); + } else { + pb.message("Limpiando "); + pb.inc(); } - println!("Limpiando..."); - archivos::remove_dd(&dirc); - println!("Ejecutando los ultimos disparadores para la instalacion..."); - let mut pack_db = String::new(); - pack_db.push_str("/etc/apmpkg/paquetes/"); - pack_db.push_str(&meta.nombre); - pack_db.push_str(".adi"); - archivos::copy_dd(name, &pack_db); + //Limpiando + let borrar_dir = fs::remove_dir_all(directorio); + match borrar_dir { + Ok(_v) => _v, + Err(e) => { + let error = MsgError::new(&e.to_string()); + error.print_salir(); + } + } - pb.inc(); - pb.finish_print("Se realizo con exito la instalacion!"); - core_funcions::msg_end(&toml); - Vec::new() + pb.finish_print("¡Instalacion completada!"); + if !paquete.instalacion.mensaje.is_empty() { + println!("{}", paquete.instalacion.mensaje); + } } -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()); +pub fn instalar_abi(ruta: &str, confirmacion: bool) { + //Barra de progreso + let contador = 2; + let mut pba = ProgressBar::new(contador); + pba.format("(->.)"); + + pba.message("Desempacando binario "); + pba.inc(); + if Path::new("install.d").exists() { + let borrar = core_funcions::pregunta("El directorio install.d ya existe, ¿Desea borrarlo?"); + if !borrar { + let borrar_error = MsgError::new( + "No borar el directorio puede ocacionar que la instalacion no se realize correctamente", + ); + borrar_error.print(); } else { - let error = - MsgError::nuevo("No se puede continuar a menos que se elimine dicho directorio"); - error.print_salir(); + let borrar_dir = fs::remove_dir_all("install.d"); + match borrar_dir { + Ok(_v) => _v, + Err(e) => { + let error = MsgError::new(&e.to_string()); + error.print_salir(); + } + } } } - - //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"), + let resultado_tar = archivos::extraer_tar(ruta, "install.d/"); + match resultado_tar { + Ok(_v) => _v, Err(e) => { - let error = MsgError::nuevo(&e.to_string()); + let error = MsgError::new(&e.to_string()); error.print_salir(); } } - 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) => { - let error = MsgError::nuevo(&e.to_string()); + + pba.message("Dectectando archivo "); + pba.inc(); + if archivos::existe_adi() { + pba.finish_print(" "); + + //leyendo datos + let adi = Adi::nuevo("install.d/apkg.adi"); + let directorio = Path::new("install.d"); + adi.imprimir_metadatos(); + if confirmacion { + println!("{}", "Omitiendo confirmacion".yellow()); + } else { + let pregunta = core_funcions::pregunta("¿Deseas seguir con la instalacion?"); + if !pregunta { + let error = MsgError::new("Abortano instalacion"); + let borrar_dir = fs::remove_dir_all("install.d"); + match borrar_dir { + Ok(_v) => _v, + Err(e) => { + let error = MsgError::new(&e.to_string()); + error.print_salir(); + } + } error.print_salir(); } } - println!("Se termino la descarga"); - } + //Barra de progreso + let contador = 9; + let mut pb = ProgressBar::new(contador); + pb.format("(->.)"); - //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()); - let mut dirc = String::new(); - dirc.push_str(&meta.nombre); - dirc.push_str(".d"); - dirc.push('/'); - println!("Limpiando..."); - archivos::remove_dd(&dirc); - process::exit(0x0100); + pb.message("Buscando conflictos "); + pb.inc(); + let existe_conflictos = Path::new(&adi.paquete.conflicto).exists(); + if existe_conflictos { + let mensaje = format!( + "No se puede instalar, el archivo {} entra en conflicto", + &adi.paquete.conflicto + ); + let error = MsgError::new(&mensaje); + error.print_salir(); } - } - //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) => { - let error = MsgError::nuevo("Ocurrio un error al extraer el tarball"); + pb.message("Verificando arquitectura "); + pb.inc(); + if !core_funcions::verificar_arch(adi.paquete.clone()) { + let error = MsgError::new("Al parecer no cuentas con la arquitectura requerida"); + error.print_salir(); + } + + pb.message("Resolviendo dependencias "); + pb.inc(); + let dependencias_instaladas = core_funcions::dependencias_instaladas(adi.paquete.clone()); + if !dependencias_instaladas { + let dependencias_instalar = core_funcions::instalar_dependencias(adi.paquete.clone()); + if !dependencias_instalar { + //Agregar linea para la dependencias abi + let error = MsgError::new("No se pudieron descargar las dependencias"); error.print_salir(); } } - } - //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(); -} + pb.message("Iniciando instalacion "); + pb.inc(); + let binario_completo = archivos::binario_completo(adi.clone()); + if binario_completo { + let ruta_archivos = directorio.join(adi.descarga.carpeta.clone()); + + core_funcions::instalar_dependencias_externas( + &ruta_archivos.to_str().unwrap(), + adi.clone(), + ); + + pb.message("Ejecutando scripts pre-instalacion"); + pb.inc(); + if !adi.instalacion.pre_instalacion.is_empty() { + let pre_instalacion_hecha = + core_funcions::pre_instalacion(adi.instalacion.clone(), &ruta_archivos); + if !pre_instalacion_hecha { + let error = MsgError::new("Algo fallo al ejecutar los scripts pre-instalacion"); + error.print_salir(); + } + } -// Instalacion apartir de un archivo .abi.tar -pub fn instalar_abi(path: &str, no_user: bool) { - println!("Iniciando instalacion desde el binario: {}", path); - println!("Desempaquetando el binario...."); - let resultado_e_tar = archivos::e_tar(path, "install.d/"); - match resultado_e_tar { - Ok(_resultado_e_tar) => println!("El tarball se descomprimio con exito"), - Err(_e) => { - println!("{}", "Ocurrio un error al descomprimir el tarball".red()); - process::exit(0x0100); + pb.message("Instalando archivos "); + pb.inc(); + let temporal = ruta_archivos.as_path(); + archivos::instalar_archivos(adi.instalacion.clone(), &temporal.to_str().unwrap()); + + pb.message("Ejecutando scripts post-instalacion"); + pb.inc(); + if !adi.instalacion.post_instalacion.is_empty() { + let post_instalacion_hecha = + core_funcions::post_instalacion(adi.instalacion.clone(), &temporal); + if !post_instalacion_hecha { + let error = + MsgError::new("Algo fallo al ejecutar los scripts post-instalacion"); + error.print_salir(); + } + } + } else { + let mut carpeta = adi.paquete.nombre.clone(); + carpeta.push_str(".d"); + let ruta_proyecto = directorio.join(carpeta).join(adi.descarga.carpeta.clone()); + + core_funcions::instalar_dependencias_externas( + &ruta_proyecto.to_str().unwrap(), + adi.clone(), + ); + + pb.message("Ejecutando scripts pre-instalacion"); + pb.inc(); + if !adi.instalacion.pre_instalacion.is_empty() { + let pre_instalacion_hecha = core_funcions::pre_instalacion( + adi.instalacion.clone(), + ruta_proyecto.as_path(), + ); + if !pre_instalacion_hecha { + let error = MsgError::new("Algo fallo al ejecutar el script pre-instalacion"); + error.print_salir(); + } + } + + pb.message("Instalando archivos"); + pb.inc(); + let temporal = ruta_proyecto.as_path(); + archivos::instalar_archivos(adi.instalacion.clone(), &temporal.to_str().unwrap()); + + pb.message("Ejecutando scripts post-instalacion"); + pb.inc(); + if !adi.instalacion.post_instalacion.is_empty() { + let post_instalacion_hecha = + core_funcions::post_instalacion(adi.instalacion.clone(), &temporal); + if !post_instalacion_hecha { + let error = + MsgError::new("Algo fallo al ejecutar los scripts post-instalacion"); + error.print_salir(); + } + } + } + + pb.message("Ejecutando los ultimos pasos"); + pb.inc(); + let ruta_adi = Path::new("/etc/apmpkg/paquetes"); + let mut nombre_adi = adi.paquete.nombre; + nombre_adi.push_str(".adi"); + archivos::copiar_archivo( + "install.d/apkg.adi", + &ruta_adi.join(nombre_adi).to_str().unwrap(), + ); + let borrar_dir = fs::remove_dir_all(directorio); + match borrar_dir { + Ok(_v) => _v, + Err(e) => { + let error = MsgError::new(&e.to_string()); + error.print_salir(); + } } - } - let abi_funcion = archivos::existe_adi(); - if abi_funcion { - instalar_abi_adi(no_user); + pb.finish_print("¡La instalacion se realizo correctamente!"); + if !adi.instalacion.mensaje.is_empty() { + println!("{}", adi.instalacion.mensaje); + } } else { - instalar_abi_abc(path); + let salida = fs::remove_dir_all("install.d"); + match salida { + Ok(_v) => _v, + Err(e) => { + let error = MsgError::new(&e.to_string()); + error.print_salir(); + } + } + let mut child = Command::new("bash") + .arg("/etc/apmpkg/iiabc/iiabc.sh") + .arg("-ib") + .arg(ruta) + .spawn() + .expect("Ocurrio un error al instalar el binario"); + let _result = child.wait().unwrap(); } } -fn instalar_abi_adi(no_user: bool) { - //Creacion del progress bar - let contador_bar = 7; - let mut pb = ProgressBar::new(contador_bar); - pb.format("(->.)"); - thread::sleep(Duration::from_secs(1)); - - // Leyendo metadata y confrmirmacion - let toml = archivos::read_fs("install.d/apkg.adi"); - let meta = archivos::read_adi(&toml); - core_funcions::clear(); - core_funcions::print_banner(); - core_funcions::print_metapkg(meta.clone()); - // Preguntando a por la confirmacion - if no_user { - println!("{}", "Omitiendo la confirmacion...".yellow()); - } else { - let confirm = core_funcions::quess("Deseas seguir con la instalacion?"); +pub fn remover_adi(nombre: &str, confirmacion: bool) { + let mut adi_nombre = String::from(nombre); + adi_nombre.push_str(".adi"); + let ruta_adi = Path::new("/etc/apmpkg/paquetes").join(adi_nombre); + let adi = Adi::nuevo(ruta_adi.to_str().unwrap()); + adi.imprimir_metadatos(); - if confirm { - println!("Iniciando proceso de instalacion"); - } else { - println!("Limpiando..."); - archivos::remove_dd("install.d/"); - println!("{}", "abortando!".red()); - process::exit(0x0100); - } - } - pb.inc(); + let mut pb = ProgressBar::new(2); + pb.format("(->.)"); - println!("Verificando conflictos..."); - let conflicto = Path::new(&meta.conflicto).exists(); - if conflicto { - let error = MsgError::nuevo("Ocurrio un error al ver los comflictos"); - error.print_salir(); + if confirmacion { + println!("{}", "Omitiendo confirmacion...".yellow()); } else { - println!("Pasando al siguiente paso..."); + let pregunta = core_funcions::pregunta("¿Deseas seguir con las desinstalacion?"); + if !pregunta { + let error = MsgError::new("Abortando desinstalacion"); + error.print_salir(); + } } - //Checando dependencias - println!("Leyendo dependencias"); - let ya_install = core_funcions::local_depen(&toml); - if ya_install { - println!("Yeah, ya tienes las dependencias instaladas!!!!"); - } else { - core_funcions::install_depen(&toml); - } + pb.message("Removiendo archivos "); pb.inc(); + archivos::remover_archivos(adi); - let desempacar_binario = archivos::binario_completo(&toml); - println!("Instalacion de librerias extras..."); - let es_git = archivos::source_git_q(&toml); - let local_install = archivos::source_es_local(&toml); - let git_o_local: bool; - if es_git || local_install { - git_o_local = true; - } else { - git_o_local = false; + pb.message("Realizando los ultimos movimientos "); + pb.inc(); + let remover = std::fs::remove_file(ruta_adi); + match remover { + Ok(_v) => _v, + Err(e) => { + let error = MsgError::new(&e.to_string()); + error.print_salir(); + } } - let descarga_meta = archivos::read_adi_down(&toml, git_o_local); - let mut src_path = String::from("install.d/"); - - if desempacar_binario { - //Analizando el codigo extraido - src_path.push_str(&descarga_meta.src); - src_path.push('/'); - archivos::extern_depen(&toml, &src_path); - pb.inc(); - - //Colocando los archivos en los lugares deseados - println!("Procediendo con la instalacion"); - let pkgd = Path::new("install.d/"); - core_funcions::pre_install(&toml, &pkgd.join(&descarga_meta.src)); - archivos::install_path(&toml, &src_path); - core_funcions::post_install(&toml, &pkgd.join(&descarga_meta.src)); - } else { - //Analizando el codigo extraido - - src_path.push_str(&meta.nombre); - src_path.push_str(".d/"); - src_path.push_str(&descarga_meta.src); - src_path.push('/'); - archivos::extern_depen(&toml, &src_path); - pb.inc(); + pb.finish_print("¡La deinstalacion se llevo con exito!"); +} - //Colocando los archivos en los lugares deseados - println!("Procediendo con la instalacion"); - core_funcions::pre_install(&toml, Path::new(&src_path)); - archivos::install_path(&toml, &src_path); - core_funcions::post_install(&toml, Path::new(&src_path)); - } - archivos::opt_src(&toml, &src_path); +pub fn construir_binario_adi(ruta: &str) { + let mut pb = ProgressBar::new(5); + pb.format("(->.)"); + pb.message("Leyendo archivo "); pb.inc(); + let adi = Adi::nuevo(ruta); - //Colocando en /etc/apmpkg/paquetes - println!("Ejecutando los ultimos disparadores para la instalacion..."); - let mut pack_db = String::from("/etc/apmpkg/paquetes/"); - pack_db.push_str(&meta.nombre); - pack_db.push_str(".adi"); - archivos::copy_dd("install.d/apkg.adi", &pack_db); + //Directorios + pb.message("Creando directorios "); pb.inc(); + let mut nombre_ruta = adi.paquete.nombre.clone(); + nombre_ruta.push_str(".d"); + let directorio = Path::new(&nombre_ruta); + if directorio.exists() { + let borrar = core_funcions::pregunta( + "Al parecer el directorio de trabajo ya esta creado, ¿Desea eliminarlo?", + ); + if !borrar { + let error = MsgError::new("No se puede continuar con la creacion del binario a menos que se borre dicho directorio"); + error.print_salir(); + } + let salida_borrar = fs::remove_dir_all(directorio); + match salida_borrar { + Ok(_v) => _v, + Err(e) => { + let error = MsgError::new(&e.to_string()); + error.print_salir(); + } + } + } - //Borrando el directorio install.d - println!("Limpiando las fuentes de instalacion"); - archivos::remove_dd("install.d/"); + //Obteniendo las fuentes + pb.message("Obteniendo fuentes "); pb.inc(); + let mut acd = String::from(&adi.paquete.nombre); + acd.push('-'); + acd.push_str(&adi.paquete.version); + acd.push_str(".acd.tar"); + let fuentes = adi.descarga.fuente.clone(); + match fuentes { + Fuente::Git(repositorio) => archivos::git_clone( + &repositorio, + &directorio + .join(adi.descarga.carpeta.clone()) + .to_str() + .unwrap(), + ), + Fuente::Url(url) => { + let creando = archivos::crear_directorio(&directorio.to_str().unwrap()); + match creando { + Ok(_v) => _v, + Err(e) => { + let error = MsgError::new(&e.to_string()); + error.print_salir(); + } + } + let descarga = + archivos::descarga(&url, &directorio.join(acd.clone()).to_str().unwrap()); + match descarga { + Ok(_v) => _v, + Err(e) => { + let error = MsgError::new(&e.to_string()); + error.print_salir(); + } + } + } + Fuente::Local(ruta) => { + let creando = archivos::crear_directorio(&directorio.to_str().unwrap()); + match creando { + Ok(_v) => _v, + Err(e) => { + let error = MsgError::new(&e.to_string()); + error.print_salir(); + } + } + archivos::copiar_archivo(&ruta, &directorio.join(&acd).to_str().unwrap()); + } + } - //Mensaje de desarrollador + pb.message("Verificando la integridad del archivo "); pb.inc(); - pb.finish_print("Se realizo con exito la instalacion!"); - core_funcions::msg_end(&toml); -} - -fn instalar_abi_abc(path: &str) { - archivos::remove_ddf("install.d"); - core_funcions::binario_abc(path); -} - -// Instalacion apartir de un archivo .abc -pub fn instalar_abc(path: &str, bin: bool) { - println!("Iniciando desde un .abc"); + if adi.descarga.sumasha == "SALTAR" { + println!("{}", "¡Se a saltado la verificacion!".yellow()); + } else if !archivos::verificacion_hash( + &directorio.join(acd.clone()).to_str().unwrap(), + &adi.descarga.sumasha, + ) { + let error = MsgError::new("Las sumas no son coinciden"); + error.print_salir(); + } - if bin { - let mut child = process::Command::new("bash") - .arg("/etc/apmpkg/iiabc/iiabc.sh") - .arg("-b") - .arg(path) - .spawn() - .expect("Al parecer no tienes iiabc, algo anda mal"); - let _result = child.wait().unwrap(); + pb.message("Extrayendo fuentes "); + pb.inc(); + if let Fuente::Git(_repositorio) = adi.descarga.fuente.clone() { + let _rr = _repositorio; } else { - let mut child = process::Command::new("bash") - .arg("/etc/apmpkg/iiabc/iiabc.sh") - .arg("-i") - .arg(path) - .spawn() - .expect("Al parecer no tienes iiabc, algo anda mal"); - let _result = child.wait().unwrap(); + let tar = archivos::extraer_tar( + &directorio.join(&acd).to_str().unwrap(), + &directorio.to_str().unwrap(), + ); + match tar { + Ok(_v) => _v, + Err(e) => { + let error = MsgError::new(&e.to_string()); + error.print_salir(); + } + } + } + + pb.message("Construyendo binario "); + pb.inc(); + archivos::construir_binario(adi, &directorio, ruta); + let salida_borrar = fs::remove_dir_all(directorio); + match salida_borrar { + Ok(_v) => _v, + Err(e) => { + let error = MsgError::new(&e.to_string()); + error.print_salir(); + } } + pb.finish_print("¡La creacion del binario a resultado ser correcta!"); } diff --git a/src/tests.rs b/src/tests.rs index 0b9fc7a..db44fd6 100644 --- a/src/tests.rs +++ b/src/tests.rs @@ -1,32 +1,27 @@ -use crate::archivos; +use crate::{archivos, estructuras::Adi}; #[test] -fn download_test() { - let testa = archivos::download( +fn descarga_test() { + let testeo = archivos::descarga( "https://raw.githubusercontent.com/Kedap/apmpkg/main/ejemplos/nspawn.adi", - "testdir/test.adi", + "testdir/test_descarga.adi", ); - match testa { - Err(e) => { - panic!("fallo el test de descarga {}", e) - } - _ => println!("de pana"), + match testeo { + Err(e) => panic!("fallo el test de descarga: {}", e), + _ => {} } } #[test] -fn read_adi_test() { - let file = archivos::read_fs("testdir/nspawn.adi"); - let _adi_file = archivos::read_adi(&file); +fn leer_adi_test() { + Adi::nuevo("testdir/nspawn.adi"); } #[test] -fn e_tar_test() { - let testar = archivos::e_tar("testdir/test-tar.tar.gz", "testdir/test-tar.d"); - match testar { - Err(e) => { - panic!("fallo extraer el archivo testdir/test-tar.tar.gz {}", e) - } - _ => println!("de pana"), +fn extraer_tar_test() { + let testeo = archivos::extraer_tar("testdir/test-tar.tar.gz", "testdir/extraer_tar.d"); + match testeo { + Err(e) => panic!("fallo al test de extraer tar: {}", e), + _ => {} } }