[Megoldva] Bash csomagkezelő készítés

Sziasztok!

Szeretnék készíteni magamnak egy "saját" egyszerű csomagkezelőt. Maga a csomag telepíés és a verzió ellenörzés megvan, de fogalmam sincs, hogyan tudnám megoldani a csomagok törlését. Csomagkezelő maga forrás alapú. Milyen letőségeim lennének rá?

Válaszokat előre is köszönöm.

Hozzászólások

Ha nem forrásalapú lenne, akkor egyszerű lenne: telepítéskor lemented valahova, hogy milyen fájlok vannak az adott csomagban.

Így viszont az az érzésem, hogy kénytelen leszel Makefile-t parsolni, hogy miket is hoz létre a make install. (Ötlet: make install előtt alias-olod a cp, ln, mkdir, install stb. parancsokat, hogy mentsék le, mit hoznak létre. Bolondbiztos nem lesz.)

Erre én is gondoltam, hogy make install parancs kimenetét "naplozom". Mondjuk, minden csomagnál létrehoz egy megadott helyen a csomagnévvel azonos filet, ami tartalmazná a make install kimenetét. A törlésnél meg simán végigmene a filet tartalmazó adatoknál egy rm parancsal. Szerintem egész jó mondszer. Már csak az a kérdés hogyan tudom ezt átültetni script-be?

"A törlésnél meg simán végigmene a filet tartalmazó adatoknál egy rm parancsal."

Itt jön elő a feladat szépsége. Ha X csomagot azért fordítottál/telepítettél, mert Y-nak szüksége volt rá, X "franc se emlékszik, ezt minek tettem ide"-alapú törlésével az egy hét múlva futtatni próbált Y "valami hülyeséget ír ki és nem megy".

"Szerintem egész jó mondszer."

Szerintem a de facto csomagkezelők azért bonyolultabbak, mert bonyolultabb a feladat, mint első blikkre.

A csomagban benne lehetnek a függőségei, ugyanúgy, mint a rendes csomagkezelőknél. Ezt le lehet menteni a telepítéskor, és X törlésekor ellenőrizni, hogy nincs-e olyan, ami függ tőle. (Szerk.:) Bonyolultabb, mint bináris csomagkezelőnél, mert a fordítási opcióktól függhet, hogy mire van szüksége. Így a csomagnak tartalmaznia kell, hogy milyen opcionális függőségek vannak. Aztán vagy utólag ellenőrizni, hogy hogy is lehetett fordítva, vagy inkább a fordítást csináló szkriptből/Makefile-ból lementeni.

Ennél szerintem bonyolultabb megbízhatóan ellenőrizni, hogy egyáltalán miket tesz föl egy make install. (Ugye áltlában csak adott néhány paranccsal: cp, install, stb. hoz létre fájlokat, de erre nincs garancia.)

Igen, csak mindez baromi hosszura tud nyulni. Nem veletlen, hogy a binaris csomagkezelok kulon metadata adatbazisokat epitgetnek inkabb, mint minden egyes csomagmuveletnel atnyalazzak az epp aktualis rendszert.

A masik, hogy nincs silver bullet a csomagok telepitesehez, tehat minden csomaggal egyedileg kell foglalkozni, adott esetben a make install helyett kezzel masolgatva a csomagokat, de a legtobb esetben a DESTDIR vagy a prefix/PREFIX valtozok megfelelo tweakelesevel elerheto, hogy a telepites ne a configure altal beallitott utvonalra, hanem egy temp mappaba tortenjen, es a fajllista innen valo lementese mar pofonegyszeru.
--

Ki oda vagyik, hol szall a galamb, elszalasztja a kincset itt alant. 

Reszben.

Az autoconf rendszerek ertelmezik a DESTDIR valtozo fogalmat, tehat:


make DESTDIR=/var/tmp/csomagkezelo/package-1.0/install install
M> install -d /var/tmp/csomagkezelo/package-1.0/install/usr
M> install -d /var/tmp/csomagkezelo/package-1.0/install/usr/bin
M> install program /var/tmp/csomagkezelo/package-1.0/install/usr/bin/programexe

Ahol M> a make parancs altal lefuttatott parancs.

Ezt a valtozot atvette tobb mas buildrendszer is, pl. a cmake is ismer ehhez hasonlo valtozot, talan ugyanez a neve is.

Ha az epites alatt allo csomag build rendszere valamiert megsem ertene a DESTDIR valtozot, akkor a make install-nal override-olni kell a prefix/PREFIX valtozot (fuggoen attol, hogy kis vagy nagybetusen szereti), de csak ott, tehat a configure-nek (ha van) illetve a fo build parancsnak (ha van) a normal /usr prefixet kell megadni, csak a make install eseteben kell ezen valtoztatni. Ez esetben viszont figyelni kell arra, hogy peldaul az etc mappa helyet tarolo valtozot is overrideolni kell, hiszen az a legtobbszor nem a prefix mappa (/usr) alatt van.

Erdemes attanulmanyozni a make parancs mukodeset illetve a nagyobb build rendszerek alapveto mukodeset, sok ilyen kis trukkel lehet cheatelni dolgokat (specialis CFLAGS, LDFLAGS, configure altal at nem adott flagek kezelese).
--

Ki oda vagyik, hol szall a galamb, elszalasztja a kincset itt alant. 

A legtobb buildrendszer tamogatja a DESTDIR valtozo hasznalatat, vagy van ra alternativaja


mkdir -p /var/tmp/csomagkezelo/install/valamicsomag-1.2.3
make DESTDIR=/var/tmp/csomagkezelo/install/valamicsomag-1.2.3 install

cd /var/tmp/csomagkezelo/install/valamicsomag-1.2.3 && find . > /var/tmp/csomagkezelo/temp/filelist.txt

And that's all.

--

Ki oda vagyik, hol szall a galamb, elszalasztja a kincset itt alant. 

Szerintem nézd meg előbb, hogy működik pl az rpmbuild. Elég sok ötlet meríthető belőle (pl telepítésnél átmeneti buildroot könyvtárba irányítás, majd onnan fájllista kigyűjtése), illetve segít megérteni, hogy mik a problémás esetek.

Másik ötletforrás esetleg Arch linux lehet. Ott a yaourt csinálja kb azt, amire gondolsz.

Amúgy kemény fába vágtad a fejszéd...
---
Régóta vágyok én, az androidok mezonkincsére már!

csomagtelepites elott egy find az vonatkozo filerendszerre, aztan utana is, es a kulonbozet megadja, hogy milyen fajlok jottek letre?
Nem lesz gyors, illetve gondolnod kell a /proc-ra, meg a tmp fileokra, illetve azokra, amik letrejonnek a gepen amugy, de ha valami szuk helyre kerulnek a filejaid (/usr/local, vagy /opt) akkor mukodhet.

a "make uninstall" miért nem jó???? (már ha meg vagyon írva az uninstall ugye)

kitömörít, configure, make uninstall

De ha csak a make uninstall részét is kirakod valahova mondjuk thispkg.uninstall néven és lefuttatod simán bashból is simán menne, persze a környezeti változókkal együtt.

wut?

1) elhanyagolhato mennyisegu csomagnal van make uninstall, az autoconf default nem is general ilyet IIRC, raadasul nyugos az adatokat tartalmazo mappak kezelese
2) Nincs olyan, hogy a "make uninstall reszet kirakod valahova". Egy build rendszer altalaban eleg sok fajlbol all, nem lehet csak ugy "lementeni" egy targetet belole. Erre nincs semmilyen modszer.

Btw, magyarazza mar el nekem valaki, mi a baj azzal, ha egy csomagkezelo metadataban letarolja, hogy az adott csomaghoz mi tartozik, es az alapjan torolget? Miert akarjuk ezt olyan eszkozokkel megoldani, amik nem hatekonyak a feladatra, adott esetben nem is erre vannak felkeszitve?
--

Ki oda vagyik, hol szall a galamb, elszalasztja a kincset itt alant. 

"magyarazza mar el nekem valaki, mi a baj azzal, ha egy csomagkezelo metadataban letarolja, hogy az adott csomaghoz mi tartozik, es az alapjan torolget?"

Forrás alapú csomagkezelőnél néha a fordítási opcióktól függhet, hogy milyen fájlok jönnek létre. Nem tudom, ez mennyire gyakori.

"And?"

Ha a metaadatokat úgy értetted, hogy benne van a csomagfájlban, akkor a nem biztos, hogy pontos lesz, azaz tényleg azok a fájlok lettek telepítve.

Ha a telepítéskor akarod letárolni valahova, akkor nem nyilvánvaló, hogy hogy deríted ki, hogy egyáltalán milyen fájlok jöttek létre.

"Ha a telepítéskor akarod letárolni valahova, akkor nem nyilvánvaló, hogy hogy deríted ki, hogy egyáltalán milyen fájlok jöttek létre."

A törlés úgy néz ki meg lett oldva a porg nevű program segítségével. A make install kimenetet menti le és az alapján törli ha jól tudom.

Sokadszorra irom le, de mar igazabol nem lep meg, hogy senki nem kepes elolvasni amit irok...

A legtobb build rendszer tamogatja a make install celgyokerenek atiranyitasat, a DESTDIR valtozo beallitasaval. Tehat, ha a DESTDIR mondjuk /home/gd/installteszt es a telepites alapbol egy /usr/local/bin/lofesz nevu binarist telepitene, akkor a valodi fajl a /home/gd/installteszt/usr/local/bin/lofesz utvonalra fog kerulni, de akkor es csakis akkor, ha a DESTDIR valtozo be van allitva a make install kiadasakor (make DESTDIR=/home/gd/installteszt install).

Ha es amennyiben az adott csomag nem tamogatja a DESTDIR valtozot valamilyen modon (nagyon keves ilyen van, el kell olvasni az adott build rendszer dokumentaciojat, az autotools, a cmake es az osszes scriptnyelv cucca tudja kezelni), akkor a make install fazisban el kell redirectelni az adott buildrendszer prefix valtozojat. Nagyon fontos, hogy ez ne a configure/make fazisban tortenjen, mert ha az adott csomag hardkodolja valahova a patheket, akkor ez hibas lehet.

Ha es amennyiben ennek a celmappanak (a pelda szerint a /home/gd/installteszt) tartalmat letarolod (cd /home/gd/installteszt && find . > /tmp/lofesz-1.0.0.txt), majd innen siman csak atcopyzod a dolgokat a gyokerbe, akkor ket dolgot is nyersz:
1) lesz egy fajl/mappa listad (nem teljesen accurate, ki kell szurni a tobb csomag altal ownolt mappakat, peldaul /usr/local/bin, /usr/local, /usr, stb)
2) van egy control pointod meg mielott barmit attennel az elo rendszerre. Ha gondolod, akar binaris csomagot is gyarthatsz belole, betomoritheted a man fajlokat, kiszedheted a felesleges nyelveket, strip-pelheted a binarisokat, viruskeresheted, akarmit megtehetsz.

De tenyleg azt javaslom, hogy tanulmanyozzatok hogyan mukodnek a mostanaban hasznalt build rendszerek. Nagyon aladolgoznak a csomagoloknak, sok ponton segitik oket.

--

Ki oda vagyik, hol szall a galamb, elszalasztja a kincset itt alant. 

Gentoo alá már csináltam frissitést. Nincs bajom, a mostani csomagkezelőkkel. Mindig is érdekel a "saját distró" készítés. Nem a "Pistike" módszere gondolok, hogy fogok egy meglévő rendszert és kisebb vagy nagyobb módosításokkat végrehajtva kész az "új" rendszer. LFS-ből készítettem egy rendszert, amihez egy egyedi csomagkezelőt szeretnék, eltérve a meglevő és "közismert" csomagkezelöktől.

Hát akkor nem bash-ban kellene megírni. Egyébként meg waste of time.

De írd meg pythonban, legyen sqlite adatbázis alatta, rendes csomagleíró a build-ekhez. Az nem egy csomagkezelő, hogy configure/make/install meg eltárolom mi hol van. Egy rendes csomagkezelő szépen tárol ezer másik dolgot, pl sum-ok, stb.

"A" Makefile mellé oda kéne tenni az alkönyvtárak Makefile-jait struktúrástul, és minden include-olt fájlt, nem lévén arra garancia, hogy minden törlés a főágban történik, és minden paraméter a fel van oldva ott.

Nyilván ezt is meg lehet csinálni, de én mégis inkább a pirospöttyös gomb elcsavarását javasolnám annak, aki meleg vízre vágyik.

Természetesen mind a két pont amit írtál igaz. Egy uninstall targetet nem lehet kiszedni csak úgy. Kivéve persze ha minden "csomag"hoz maga írja a Makefile-okat, és azokat úgy írja meg hogy ez mégis lehetséges legyen.

A legjobb az amit Te mondasz, hogy az install esetén igenis elrakjuk mit hova tesz egy metadatába. Mondjuk érdekes kérdés, hogy hogyan, pl a 'make install' kimenetét parsol-va.

Mondjuk az egészet nem értem, hogy mi értelme, mikor van ezer csomagkezelő és semmi értelme egy újat írni. Ott van pl. a pkgsrc, ami tökéletesen megfelel erre. Én is azt használom a saját LFS-ből épített Linux-omon. :D

Mondjuk az egészet nem értem, hogy mi értelme, mikor van ezer csomagkezelő és semmi értelme egy újat írni. Ott van pl. a pkgsrc, ami tökéletesen megfelel erre. Én is azt használom a saját LFS-ből épített Linux-omon. :D

Én is eleinte olyat akartam ami kész van. pl: paludis. Ez emerge-nek egy alternatív csomagkezelője. Gondoltam, feldobom és készítek saját ebuild-kat. Csak sajnos nem tudtam ráhegeszteni a rendszerre. Mivel itt se tudtak segíteni benne, ezért gondoltam készítek egy "simple package manager"-t.
Egyébként, pkgsrc-be honnét szeded a csomagokat?

Van hozza makepkg is.

Megmondom oszinten a pacman-t azert szeretem, mert van, amikor nincs ido forditgatni, es egy kesz csomagkeszletet kell reprodukalni $RANDOM helyekre. Ilyenkor sztem eleg ha makepkg-val legyartod a csomagokat, aztan ahol kell, pacman-ozol. (<
--

Ki oda vagyik, hol szall a galamb, elszalasztja a kincset itt alant. 

nézd meg hogy mukodik a slackware csomagkezeloje.

Ajanlom a slackbuilds.org es az http://www.sbopkg.org-t/
Szerintem eleg korrekt rendszer. Lefordit neked mindent. nincs benne dependency resolution ugyan, de leellenorzi neked a verziot, telepit, uninstallal, frissit, letolt, mindezt forrasokbol.

Ja, es lehet queue file-okat csinalni amik leforditjak a "fuggosegeket" a korrekt sorrend szerint.

Saját csomagokhoz mindig is a paco-t használtam. Az egyik legjobb.


paco -lp csomagom "make install"
paco -r csomagom

paco -ia
paco -ua

http://paco.sourceforge.net/

--
A főnököm mindig megtartja amit ígér, ha pénzt ígér azt is!

Valóban, viszont van helyette porg. Még nem teszteltem, de a paco a mai napig teszi a dolgát :)

szerk: letöltöttem, a paco adatbázist átrántotta a paco2porg paranccsal, ugyanúgy működik, javítások vannak. Jelenleg 0.2-es verziónál tart. Remélem a GTKMM-et kivágja a francba, de nem hiszem. Sima GTK-nak jobban örülnék.

--
A főnököm mindig megtartja amit ígér, ha pénzt ígér azt is!

Egyik lehetőség a már párszor említett DESTDIR.
Viszont a ./configure-féle --prefix-et NEM ajánlom, főleg nem abban az esetben, ha kb. követed az FHS-t, azaz nem az egy program-egy könyvtár elvet követed, hanem a binárisok a /usr/bin-be, a libek a /usr/lib-be, stb. Miért is nem ajánlom? Ha megcsinálod --prefix-szel, akkor a létrejövő *.pc fájlokban (pkgconfig) a megadott prefix-szel lesznek a megadott hivatkozások (tehát /tmp/csomagok/), ami gondot okoz egy ettől függő csomag fordításakor, ui. a létrejött *.pc fájlban olyan könyvtárra fogsz hivatkozni, ami nem is létezik - ami még nem baj, csak aztán a szükséges header-ek nem lesznek meg.
A másik lehetőség a kézikönyv 6.3.2.5-ös pontja (LD_PRELOAD vagy strace).
Egy harmadik opció, hogy make install előtt létrehozol egy üres fájlt, utána make install, majd egy find -newer létrehozott_fájl megtalálja neked azokat a fájlokat, amelyeket a fentebb létrehozott fájlnál későbbiek.

Az LFS Hints-ben pedig ezeket találtam:
http://www.linuxfromscratch.org/hints/downloads/files/package_managemen…
http://www.linuxfromscratch.org/hints/downloads/files/pm_with_git.txt (érdekes ötlet, gyakorlatilag a git-re bízod)

A ./configure ... --prefix=... az azt adja meg, hogy telepítés után hol legyen a helye a fájloknak a működő rendszerben.
Hogy a forrás hová tegye a telepítendő fájlok könyvtárszerkezetét azt pedig
make install DESTDIR=....
esetleg
make install [INSTALL_ROOT | INSTALL_PREFIX]
vagy van olyan is, ami:
DESTDIR=/path/to make install
... csomagfüggő a dolog.

-fs-
Az olyan tárgyakat, amik képesek az mc futtatására, munkaeszköznek nevezzük.
/usr/lib/libasound.so --gágágágá --lilaliba

Épp ezért nem lesz neki jó a --prefix.
Ha teszem azt, azt akarja, hogy a foo csomagot ideiglenesen egy külön könyvtárba (mondjuk chroot) telepíti, hogy könnyű legyen file-listát generálni:
- meghívod --prefix=/tmp/csomagok/usr módon
- telepíted a /tmp/csomagok/usr/{bin,lib,stb.}-ba, generálod egy find-dal a fájllistát
- a /tmp/csomagok-ból átpakolsz mindent a /-be.

Ez azért nem lesz jó, mert mondjuk a gtk2-nek a *.pc fájljaiban az lesz, hogy:

prefix=/tmp/csomagok/usr
includedir=${prefix}/include
...
Cflags: -I${includedir}/gtk-2.0

Azaz a Cflags a /tmp/csomagok/usr/include/gtk-2.0 könyvtárat mondaná, hogy ott is keresgélni kell a header-eket. Viszont ott már nincs semmi!

Szóval ezért mondtam, hogy ne a prefix-et használja erre a célra, hanem a DESTDIR-t (ha autoconf/automake-es esetet nézünk, eléggé számíthatunk a DESTDIR-re).

A porg-gal egyetlen gond, hogy csak a "make install" reszt automatizalja be, a configure/make folyamatokat nem, tehat a --prefix es tarsainek beallitasat nem fogod meguszni.
--
Ki oda vágyik, hol száll a galamb, elszalasztja a kincset itt alant:


()=() 
('Y') Blog | @hron84
C . C Üzemeltető macik
()_()

Itt nagy keveredés van. A "--prefix" azt mondja meg, hogy a "DESTDIR=/" esetén hol legyenek a csomagok, magyarul a gyökérhez képest. Ezt lehet felüldefiniálni, hogy ne az alaprendszerbe, hanem egy külön könyvtárba telepítsen. Ergo a "DESTDIR=/var/tmp/destroot make install" a /var/tmp/destroot/$prefix/... könyvtárba fog pakolni...

Amúgy érdemes lenne megnézni a Frugalware vagy az Arch csomagkészítőjét. Minimális munkával át lehetne alakítani és nagyon jól kezeli mindkettő a build függőségeket...

Sziasztok !

Segítségeteket szeretném kérni. Van 2 változom. Az 1-ik kilistáza a felsorolt csomagokat "ha találja" a másik meg tartalmazza a csomag listát. Az a kérdésem hogyan tudom összehasonlítani őket, úgy hogy a amiket az első kilistáz és nem szerepel az írja ki pirossan amit talál azt meg zölden. Azt már késsz ami ha mindegyik megvan akkor zölden nyomja ki a listát ha nincs akkor meg pirossan. Már csak azt kéne hogy kombinálja öket.

Körülbelül 20szor kellett átolvasnom és kitalálnom hogy milyen nyelven is írtad, mert néhol hiányzik a tárgy a mondatban, de van hogy az alany és az állítmány is. A határozókról nem is beszélve. :D

Amúgy meg ha bash, akkor két forciklussal, de a kisebbik listán kezdj el először átszaladni. Ha mondjuk bármilyen más interpreter nyelv lenne, akkor kivonnám egymásból a két array-t vagy hash-t.

Sok sikert, de az oka eléggé érdekelne, hogy miért is?

egy ilyet gyártottam:

http://pvtv.hu/tarolo/out_files/xzpkg

A csomagokat úgy készítem, hogy a DESTDIRT tömörítem tar.xz-re.

-fs-
Az olyan tárgyakat, amik képesek az mc futtatására, munkaeszköznek nevezzük.
/usr/lib/libasound.so --gágágágá --lilaliba

Én a helyedben kipróbálnám, hogy a telepítéskor "strace -f -eopen" mennyivel lassítja a telepítést. Ha nem nagyon, akkor ez lehet jobb megfejtés, mint a find előtte és utána is. De az, hogy melyik a gyorsabb nagyon sok mindentől függ. Ha mondjuk az egész Xorg-ot telepíted egy 32GB-os SSD-re, akkor nyilván jobban jársz a find előtte-utána megoldással...

Sziasztok !

Szeretném segítségeteket kérni abba, hogy lementettem file-ba a make install rész kimenetét.Létrehozott file-ban a sorok elejére szeretnék "rm -rf"-et hozzáadni. Rádásul, minden fileba addja hozzá a legelehére, a #!/bin/bash -t.

Ezt hogyan tudnám kivitelezni?

Oke. Kezdjuk ott, hogy a make install kimenete kozvetlenul nem hasznosithato, mert egy csomo, parancskent nem ertelmezheto sort tartalmaz.

Aztan, nem a sor elejere kell beszurni az "rm -rf" -et, hanem az install/mkdir parancsokat kell lecserelni erre.

De meg ezekkel a megkotesekkel sem ajanlom igy ebben a formaban a dolgot. Sok telepito ugyanis a /usr, /usr/bin, /usr/sbin konyvtarakat is "letrehozza" (az mkdir -p/install -d csak akkor hoz letre tenyleges mappakat, ha azok nem leteznek), marpedig ezek "rm -rf" -fel vakon torteno torlese katasztrofalis eredmenyhez vezetne.

Ugyhogy a legbiztonsagosabb megoldas atolvasni a fajlt, es kimasolgatni az utvonalakat. Ha adsz peldakimenetet (nem tudom, melyik progi "make install" kimenetet mentetted le, raadasul egy cmake tok mas kimenetet ad, mint egy normal autoconfos cucc), akkor a kigyujteshez tudok adni tippet, de a kigyujtott fajl- es mappaneveket ketszer, haromszor at kell nezni, hogy tuti ne okozz kart a vegen.
--
Ki oda vágyik, hol száll a galamb, elszalasztja a kincset itt alant:


()=() 
('Y') Blog | @hron84
C . C Üzemeltető macik
()_()

Tulajdonképp, egy egyszerű bash csomagkezelővel készítésével kisérletezgetek. A csomagok törlésére találtam ki, hogy "make install"-t lementem. Benne található eléréseket simán "rm" parancsal törlöm. Ezen tényleg átsiklottam, hogy más csomag is használhatja úgyan azt a mappát. Köszi a figyelmeztetést . :) Ennek törlése tényleg elég nagy káoszt okozna. De "-rf" nélkül mappát nem töröl, így a csomagok álltal belerakott file-t törli csak ki. Elméletileg, így nem okozhat káoszt.

Ebben a topicban már implicite és explicite elhangzott, hogy a csomagkezelés nem egyszerű dolog (sosem volt igazán az, és egyre kevésbé), ezért nincs is olyan állat, hogy egyszerű csomagkezelő.
A profi csomagkezelők se tudnak annyira profik lenni, hogy annak, aki elég sokat dolgozik velük, ne kelljen olykor átve[nr]ni az irányítást.

Szóval csak óvatosan, mert ezen a tájon nem vicces a klasszikus "gyors, egyszerű és hibás megoldás".

Üdv!

Gyártottam ilyet, én úgyoldottam meg, hogy fordítás után a DESTDIR-be bekerültek a csomag fájljai, abból simán tar.xz-t csináltam, és a telepítés fázisában csinálok egy listt ennek a tartalmáról... persze azt is tömörítve.

a teleptés így néz ki:

xzpkg install csomagnév.tar.xz

a telepítés "lényege":

...

case $1 in

...

install)
ACTUALDIR=`pwd`
echo -n $2" "
cd $TARGET
echo -n " telepítése..."
tar -Jxf $SOURCE"/$2".tar.xz --strip-components=1 >/dev/null 2>/dev/null
echo -n " listáz..."
tar -Jtf $SOURCE"/$2".tar.xz --strip-components=1 2>/dev/null | sed -n 's/'$2'//pg' | xz -c3 - >"$TARGET"/var/lib/xzpkg/$2.txt.xz

...

az uninstall rész:

...

uninstall)
echo -n "Uninstall: $2 delete... "
xz -dc "$TARGET"/var/lib/xzpkg/$2.txt.xz | sort -r | while readfilename
do
if [ -d "$TARGET""$filename" ]
then
rmdir "$TARGET""$filename" >/dev/null 2>/dev/null
else
rm "$TARGET""$filename" >/dev/null 2>/dev/null
fi
done
echo -n "clean... "
rm "$TARGET"/var/lib/xzpkg/$2.txt.xz >/dev/null 2>/dev/null
echo -n "sync... "
sync

-fs-
Az olyan tárgyakat, amik képesek az mc futtatására, munkaeszköznek nevezzük.
/usr/lib/libasound.so --gágágágá --lilaliba

Szerintem a kérdező azt érti forrás alapon, hogy nem akar csomagot készíteni, csak egyenesen a rendszerre telepíteni.

A telepített fájlok elvileg (sacc per kb) így meghatározhatóak:

find / >/tmp/elotte.txt
telepit ... ...
find / >/tmp/utana.txt
diff lst.txt lst2.txt | grep -v "^---" | grep -v "^[0-9c0-9]" | sed -n 's/> //pg' >uj_fajlok.txt

-fs-
Az olyan tárgyakat, amik képesek az mc futtatására, munkaeszköznek nevezzük.
/usr/lib/libasound.so --gágágágá --lilaliba

Legyszi olvass utana, hogy mi az a DESTDIR, es hogy mukodik az autoconf alapu build rendszer, es ird ide ha sikerult. Akkor tovabb tudunk segiteni. De ennyibol lovesed sincs ezekrol, addig pedig en nem akarnek csomagkezelot irni, plane nem forrasalaput.

Tahonak tunhet a fenti kijelentes, de ezek alapveto dolgok, ha nem tudod, akkor nagyon sokat fogsz szivni, mire rajossz.
--
Ki oda vágyik, hol száll a galamb, elszalasztja a kincset itt alant:


()=() 
('Y') Blog | @hron84
C . C Üzemeltető macik
()_()

Ahol a

... ./configure ...
... make ...
... make install

a telepítés menete, ott könnyen átírható ez a script. A probléma, hogy sok forrásnál teljesen más a telepítés menete.
Ha egy nem átlagos csomagról van szó, írhatsz hozzá egy installscriptet. Ha van, azt futtatod, ha nincs akkor ./configure;make;make install;

-fs-
Az olyan tárgyakat, amik képesek az mc futtatására, munkaeszköznek nevezzük.
/usr/lib/libasound.so --gágágágá --lilaliba

A helyedben en a csomagot egy temp konyvtarba telepitenem (pl: make install DESTDIR=/tmp/temp-csomagnev) ebbol egyeszeruen ki tudod deriteni hogy mi a konkret file-lista amit majd uninstall eseten torolnod kell, majd csak utana tennem a file-kat a vegso helyukre.

Esetleg a fileokra meg ráengedhetsz egy md5sum-t hogy a jovendoben el tudd donteni hogy mindent-t torolni akarsz-e vagy pl meg akarod tartani a megvaltoztatott conf file-kat.

edit:
nezd meg ezeket a scripteket:
http://ftp.heanet.ie/mirrors/slackware/pub/slackware/slackware64-14.1/s…

Szisztok !

Egy kis segítséget szeretnék kérni. Eddig egész jó uton halad az "egyedi" csomagkezelöm. Konfigurálás 2 megoldás jutott eszembe.
1; minden csomaghoz lenne külön config file ami tartalmazza a config kapcsolokat. Ha nem létezik a file akkor elöbb létre kell hozni.
2; alapból egy sima "./configure" parancs lefutna mindenféle kapcsoló nélkül HA nem létezik egy konfig file. Ha létezik akkor a meghatározott kapcsolok alapján futna le.

Kérdésem az lenne, hogy szerintetek melyik a jobb megoldás. Személy szerint, én a 2-dik megoldást jobbnak tartom. Ha esetleg van valaknek saját ötlete szívesen fogadom. :)

En megneznem mas csomagkezelok (peldaul Gentoo Portage, BSD Ports, stb.) hogyan csinaljak ezeket.

Ami biztos nem jo megoldas, az a ./configure lefuttatasa kapcsolok nelkul. Nagyon sokfele csomag van, nagyon sokfele elbokott defaulttal. Ha a rendszerednek nincs egy standard konyvtarfelepitese, hanem minden "ahogy esik ugy puffan" alapon kerul fel, az kovethetetlen es hasznalhatatlan rendszert eredmenyez. Legrosszabb esetben is a --prefix, --sysconfdir es hasonlo kapcsolokat meg KELL adni a rendszerben, hogy mindig kovetheto, kitalalhato legyen mi hova kerul.

Amire kulonosen ugyelned kell, az a teny, hogy ha egy forrasfaban van egy "configure" nevu vegrehajthato allomany, az nem jelenti implicite azt, hogy az egy autoconf/automake alapokon gyartott konfiguracios script. Nagyon sok olyan csomag van, ahol ez az allitas egyszeruen nem igaz.

Amit en javaslok: legyenek alap opciok minden csomaghoz magaban a csomag/build leirojaban, amik fixek, nem valtoztathatok user oldalrol, nem is konfiguralhatoak. Ezek az alapvetesek, ami alapjan legalabb valamilyen QA-t lehet biztositani. Aztan, ha akarsz user-specified opciokat tamogatni, akkor arra legyen egy kulon fajl, amiben csak azokat az opciokat tarolod, amik elternek a defaulttol.

Egyebkent erosen javaslom, hogy minden ilyen kerdesed felmerulese eseteben eloszor nezd meg, hogy mukodik az adott build kornyezet, esetedben az autoconf/automake alapu rendszer. Gondold at alaposan, tizszer, szazszor, hogy ez mit jelent, milyen buktatoi lehetnek. Nezd meg, masok hogyan csinaljak, es gondold at, vagy kerdezz ra, miert igy csinaljak. Tanulj masoktol, mert mar sokan megoldottak azokat a problemakat, amikkel te szembesulsz, nincs olyan kerdes, amit mar fel ne tettek volna a temaban. Ne akarj mindent egyedul kitalalni, otletek tekinteteben nyugodtan tamaszkodj mas projektekre, valoszinuleg nem veletlenul hasznaljak azt a rendszert, amit.
--
Ki oda vágyik, hol száll a galamb, elszalasztja a kincset itt alant:


()=() 
('Y') Blog | @hron84
C . C Üzemeltető macik
()_()

Nem azt mondtam, hogy fogja meg a vagolapot, es ollozza ossze maganak. De ezek jol fejlett, tisztan forrasalapu rendszerek, az alapotletuk pedig tokeletesen fuggetlen attol, hogy Pythonban vagy BSD Make-ban vannak irva, raadasul a tarolasi modjukban sincs semmi, ami jellemzo lenne az adott nyelvre (nem python marshallingban tarolja a cuccot a Portage pl, es a Ports altal letett fajloknak sincs semmi relaciojuk a Make fajlokhoz).

FYI: az ebuildek egyebkent bash script alapuak, barmily meglepo is ez. Sehol, semmilyen koze nincs a python nyelvhez az ebuildoknak, ugyanis egy bash alapu keretrendszer futtatja oket.
--
Ki oda vágyik, hol száll a galamb, elszalasztja a kincset itt alant:


()=() 
('Y') Blog | @hron84
C . C Üzemeltető macik
()_()

Akkor csak a portage-rendszer python? Nem használtam gentoo-t számottevő ideig, az ebuild-ek meg... hát, az valóban szinte nyelvfüggetlen. Akkor legyen a Gentoo.
Viszont a FreeBSD-t továbbra se javallom, nézd meg a mpd Makefile-ját! Ötleteket valóban lehet meríteni, de azért kézikönyv nélkül a különböző okosságokra megmondani, hogy mi mit csinál, kicsit meredek :) Ellenkező véglet: xprop.

Nem tudom, talan nem fogalmaztam vilagosan.

Nem azt mondtam, hogy nezegesse a Makefajlokat, es az alapja epitse meg a rendszeret. De a FreeBSD, a Gentoo, az Arch es a tobbi forrasalapu rendszer mind-mind szembekerult mar azzal a problemakorrel, amivel most kuzd. Ha megnezem, hogy mas rendszerek milyen elmeleti alapokon indultak neki a megoldasnak, attol en meg megirhatom Rubyban vagy PHP-ban az implementaciot, mert baromira nem az szamit, mi mennyire fosul van megirva, vagy mennyire lassu, hatekonytalan a mukodese. Fohosunknek jelen pillanatban az elmeleti alapokkal van problemaja, kommentjebol lathatoan sut az, hogy meg sosem gondolkodott el azon, hogyan epul fel egy Linux rendszer az alapjaitol. Az LFS konyv felutese talan megtortent, de nem probalta meg a leirtak okait kutatni, a mogottes logikat felfedezni, hogy mitol lesz egy rendszer egyseges egesz, es nem egy nyuves Frankenstein.

Ha a BSD modszere alapjan kialakit egy tarolasi strukturat, attol meg nem kotelezo neki sem a mpd sem az xprop Makefajljait alapul venni a sajat csomagjaihoz. Elobb jussunk el oda, hogy taroljunk opciokat _valahogyan_, epitsunk ki egy adatbazist, es utana vitatkozzunk a tartalmarol.
--
Ki oda vágyik, hol száll a galamb, elszalasztja a kincset itt alant:


()=() 
('Y') Blog | @hron84
C . C Üzemeltető macik
()_()

Mindenki jó ötleteket és tanácsokat adott. Mindenkép lehet tanulni belölük. Mindenféle ötlet és segítségnek örülök. Egyébként én se voltam valami pontos, 2. "ötlet" amit írtam nem voltam elég pontos. Ez ügyben szeretnék elnézés kérni töletek. Nem arra gondoltam, hogy csak simán "./configure" azt kész. Hanem, Lennének alap kapcsolok ami minden csomagra egyaránt forgatásában benne lenne. Pl.: ./configure --prefix=/usr --localstatedir=/var --sysconfdir=/etc CFLAGS="-O3" -march=pentium2 -pipe" CXXFLAGS=$CFLAGS make -j3 ezek egységesek lennének minden csomagnál. A külön névre szóló config file tartalmazná az egyébb kapcsolokat. Lehet, ez is rossz ötlet.

ui: Amikor neki kezdtem a "project"-nek nem terveztem semmi extrát. Letölt, telepít, töröl. Még patch-t se terveztem. Egy tényleg egyszerű kis telepítőre gondoltam. Föleg, mivel a bash nyelvet se regében keztem itthon tanulgatni. De úgy gondolom, egész jól halad a csomagkezelőm. Nem kell, hogy jobban müködjön. Csak szeretnék egy saját viszonylag jól müködő csomagkezelőt. De a legfőbb oka ennek a bash tanulás és még mélyebben megismerni a rendszert.

"Lennének alap kapcsolok ami minden csomagra egyaránt forgatásában benne lenne"

CFLAGS, CXXFLAGS lehetoleg ne legyen kozos, a make -j3 plane ne legyen az. Nagyon sok csomag nincs felkeszitve parhuzamos forditasra, sok mas pedig kulonfele CFLAGS-okon hasal meg. E temaban nagyon sokat lehet tanulni az Autotools Mythbusters-bol, bar kicsit mas teruletekre fokuszal, azert nagyon sokat elmond az autoconf/automake rendszerek mukodeserol. Az irok kozott van az a Diego Elio "Flameeyes" Pettenò, aki az egyik legregebbi Gentoo csomagkeszitok egyike. Ha valakinek a tudasara biztosan tamaszkodhatsz, az az ove. Tobb opensource csomaghoz irt mar build scriptet mint amennyit te fel tudsz sorolni.

Ha nagyon, sot bantoan oszinte akarnek lenni, senkit nem engednek a csomagkezeles kozelebe, aki nem huzott le legalabb 2 evet advanced Gentoo felhasznalokent, es nem hagyott mar maga mogott minimum 10 ebuildot. De ez termeszetesen az en hibam, en meg a hobbiprojektjeimben is maximalista vagyok, minosegre torekszem akkor is, ha senki sem fogja hasznalni. Na de ennyit rolam. Amit igazabol akarok mondani: a csomagkezeles messze bonyolultabb dolog, mint leforgatni egy csomagot. Tul sokfele csomag van, tul sok lehetoseg, nagyon nehez ezekhez egy jo atlathato feluletet biztositani.

Az igazsag az, hogy szurkolok neked, hogy egy faja kis rendszer jojjon ossze a cuccbol, es pont ezert probalok minden tolem telheto segitseget megadni. Aztan lehet, hogy a vegen meg sikerul.
--
Ki oda vágyik, hol száll a galamb, elszalasztja a kincset itt alant:


()=() 
('Y') Blog | @hron84
C . C Üzemeltető macik
()_()

Akkor a legegyszerűbb megoldást talán az jelenti, hogy lfs csomagok telepítő beállításait rakom bele egy névre szóló config file-ba. Így biztos nem lesz gubanc. Esetleg ha más kapcsolot is szükségem van akkor csak hozzá kell majd írni. Nem túl praktikus megoldás de müködöképes.

Én értem, mit mondasz. Ebből viszont az következik, hogy én nem fogalmaztam világosan :)

Azt akartam mondani, ha bash-alapon akarja megcsinálni, akkor érdemesebb bash-szerű dolgokat nézegetni. A Makefile teljesen (vagy legalábbis jelentősen) más, mint a bash, tehát abból azért az ötleteket kimazsolázni nem biztos, hogy annyira egyszerű. Az xprop-ot azért hoztam példának, hogy egy full egyszerű program/csomag Makefile-ja egyszerűen csak ennyi, gyakorlatilag (a kérdező szempontjából) értékelhető információ nélkül, míg az ArchLinux-féle xprop-ból kicsit esélyesebb.
Az mpd-t meg "elrettentésképpen" hoztam - doksi-olvasgatás nélkül nem biztos, hogy triviális, hogy a MAD_CONFIGURE_ENABLE=mad mire is szolgál (ha a MAD opció be van kapcsolva, akkor a configure kap egy --enable-mad -ot, ha kikapcsolt, akkor egy --disable-mad -ot), míg a Arch-féle mpd kicsit olvashatóbb, áttekinthetőbb, bash-értőknek könnyen feldolgozható.

Pont ezert mondtam a Gentoo Portage-t is, eleg kozel all a bash-hez... amugy a make file-ok emlitett resze is felfoghato kornyezeti valtozokent, amit a Gentoo Portage is hasznal. Mondom, elveikben minimalisan kulonboznek, kulonosen azert, mert a Portage a BSD-s Ports es PkgSRC rendszerektol tanult.
A Portage eseteben se biztos, hogy egy IUSE="mad" az reszben egy --enable-mad jellegu kapcsolot jelent, plusz egy fuggoseget is.
--
Ki oda vágyik, hol száll a galamb, elszalasztja a kincset itt alant:


()=() 
('Y') Blog | @hron84
C . C Üzemeltető macik
()_()

Az Arch ill. Frugalware által használt "makepkg" rendszer konkrétan bash script. Hasonló dolgot akar, mint a kérdező, azzal a különbséggel, hogy ezeknek a végeredménye egy tarball. Kezel függőségeket, azokat is buildeli, ha kell... A végeredményt kell átírni, hogy ne tarballt csináljon. Vagy szimplán csak átnézni, hogy mit hogy old meg...

Konfigulálás megvan. Felhasználom az lfs linux csomag beállításait (alapnak). Az a problémám, hogy a konfig filet létrehoztam, de fogalmam sincs, hogy adjam meg neki a nem futt le az egyik program hiba nélkül, akkor ne folytassa. pl patch-nél ha nem sikerült a patch akkor ne ugorjon a következő parancsra. Esetleg ebbe tudnátok segíteni?

Fazisokat kell csinalni, prepare, configure, build, install (ezt fuggvenyekkel konnyen szet lehet szervezni), a fazisokon belul && -el ossze is kapcsolhatod a parancsokat, de ez igazabol felesleges, eleg, ha a fazis maga megdoglik, es nem ugrasz a kovetkezo fazisra.

Viszont, ha szep reportingot is szeretnel, akkor minden egyes fazis lefutasa utan if-fel vizsgalni kell a $? erteket, es relevans hibauzenetet megjeleniteni a usernek.
--
Ki oda vágyik, hol száll a galamb, elszalasztja a kincset itt alant:


()=() 
('Y') Blog | @hron84
C . C Üzemeltető macik
()_()

Sziasztok!
Most csinálom a source.list listának frissítésének az ellenörzését. A következőbe kérném a segítségetek.
A frissítés a csomagok hivatalos szerveréről történik ill az elenörzése is. A következő képpen:
curl -L -# http://download.savannah.gnu.org/releases/acl/ | tr "<>" "\ " | grep "acl" | awk '{print $12}' | grep -v ".sig" | tail -n 1
Eddig rendben is van de szeretném a "tar.gz" a tömörítés leszedni úgy, hogy csak a csomag és a verzió maradjon. Normál esetbe a végére raknám a "cut -c 1-10" de ezzel az a baj, ha verzió változik akkor nem fogja helyesen mutatni. Próbáltam a grep -v "tar.gz"-vel de nem jutottam eredményre.

sed 's/\.tar\.gz//'

Egyebkent nem biztos, hogy ez igy jo otlet. Nem minden forrascsomag van olyan szerveren, ahol van directory lista. Nem tudom, mire hasznalod ezt az ellenorzest, de jobb helyeken a csomag meretet es MD5/SHA1 hashet szokas letarolni es azt csekkolni. A meret egeszen konnyen beszerezheto, ha -I kapcsoloval HEAD kerest kuldesz, a Content-Length fejlecben erkezik a meret.
--
Ki oda vágyik, hol száll a galamb, elszalasztja a kincset itt alant:


()=() 
('Y') Blog | @hron84
C . C Üzemeltető macik
()_()

Arra használom, hogy megtudjam van e újabb csomag belőle. A gcc-nél másabb volt mert ott minden újabb verzió új mappába is kertül. Ott lekértem az újabb mappát és útána meg a mappán belül az új forrást. A mappa volt az összehasonlitóm a telepített csomaggal.

Én is hasonló dolgot csinálok. Esetleg megvan még a script? Vagy tudnál írni egy példát, hogy te hogyan csináltad? Sajnos, az én modszerem 1-2 helyen nem igazán müködik. Pl.: bzip.org/1.0.6/bzip2-1.0.6.tar.gz de találkoztam olyannal is hogy nem a legutolsó és nem is az első volt a legfrissebb hanem az utolsó elötti. Ezeket te hogyan tudtad korigálni?

Ha elő tudod szedni, akkor egyszerű. Ha meg nem tudod lekérni a listát, akkor meg vagy lőve. Ekkor a html-ből szedheted ki :)

A sort -t. -n nem jó:

$ cat lista 
1.10
1.9
1.10.2
1.9.2
$ sort -t. -n lista 
1.10
1.10.2
1.9
1.9.2

A sort-nak egyébként van egy "-V" (--version-sort) opciója, azt javaslom inkább :)

Kiparzolod sed-del, grep-pel, awk-val. Javaslom az AWK-val valo ismerkedest egyebkent, shell programozashoz nelkulozhetetlen, es nagyon powerful szovegfeldolgozo nyelv.
--
Ki oda vágyik, hol száll a galamb, elszalasztja a kincset itt alant:


()=() 
('Y') Blog | @hron84
C . C Üzemeltető macik
()_()

Sziasztok !
Arra gondoltam, hogy a telepítés befejezés útán belerakatom a installpkg.list-be a feltelepített csomagot verzió számmal együtt. Ez eddig rendben is van, de ha csak frissítésről van szó akkor, ne adja újból hozzá hanem cserélje le "régit" az új verzióval. Arra gondoltam, echo-val rakatnám bele és if-el szétpontanám ha létezik akkor csere ha nem akkor addja hozzá. Azt viszont nem tudom, hogy esetleg sed-el nem e lehet egyszerübben megoldani. Ha igen akkor hogyan? Ti melyiket ajánjátok?

Csináld úgy, ahogy sok más rendszer is csinálja: létrehozol egy /var/db/pkg könyvtárat, és ebbe pakolsz könyvtárakat, pl. firefox-32.0, ami arra utal, hogy a firefox 32.0 van telepítve. Minden ilyen könyvtárban lenne egy installed-files, meg ilyesmi fájlok. Nézd meg a Slackware-nél, ott is így csinálják (úgy rémlik).

Funtoo is így csinálja. Ide pakol mindent ami alapján telepített.(keywords use stb). Egyébként igazatok van. Fölösleges külön nementenem egy file-ba a telepített csoagokat és verzíoit. Mivel telepített csomagról létrehoz egy filet, amibe van a törlésre használt elérési útvonalak. Célszerübb lenne ezt felhasználni. Köszi a segítséget.

Sziasztok !

Már csak az "update" van hátra. Elösször arra gondoltam, hogy lesz egy külön script ami a csomagok frissitéseit fogyja figyelni. Nekem csak annyi lett volna a dolgom, hogy ha dob ki frissebbet akkor átírom a source.list file megfelelő sorát és lehet is frissíteni. De mivel ez a project nem annyira egyszerű csomagkezelő mint aminek indult. Arra gondoltam, jó lenne ha a source.list bejegyzéseit is modosítani.
Abba kérnék segítséget, hogy ezt hogyan tudnám kivitelezni.
A source.list tartalmazza a csomagok teljes elérési utvonalát.Egymás alatt felsorolva. Pl.: http://robotlab.itk.ppke.hu/gcc/releases/gcc-4.9.1/gcc-4.9.1.tar.gz
van egy külön script ami figyeli a verziót. Szóval arrol lenne szó, ha gcc-ből megjelenik egy frissebb pl:gcc-4.9.2 akkor hogyan tudnám a source.listbe átírni így (http://robotlab.itk.ppke.hu/gcc/releases/gcc-4.9.2/gcc-4.9.2.tar.gz ) ebbe az esetbe 2 helyen is átkell írni.

Változók. A frissülésfigyelőd mikor lefut, létrehoz egy gcc_version nevű változót, amiben tárolja a gcc legfrissebb verzióját, a sources.list-edben meg http://robotlab.itk.ppke.hu/gcc/releases/gcc-${gcc_version}/gcc-${gcc_version}.tar.gz van, oszt' kalap, nem kell senkinek semmit sehol átírogatni.

Nem birom nem megemliteni: a legtobb csomagkeszito a puszta ket kezevel potyogi be az epp aktualis verziokat a csomagfajlokba. Nem veletlenul: a weboldalak megszunhetnek, megvaltozhatnak, elkoltozhetnek, fuggeni toluk a leheto legrosszabb otlet. Ne legy lusta.
--
Ki oda vágyik, hol száll a galamb, elszalasztja a kincset itt alant:


()=() 
('Y') Blog | @hron84
C . C Üzemeltető macik
()_()

Hi!
Frugalware alatt az expect FrugalBuild-je.
A FrugalBuild-ben van egy up2date rész, ami felel a verzió ellenőrzésért. Naponta párszor automatikusan ellenőrzi a verziókat, az eredmény ilyen. Mint látod elég sok a "There was no output!" jelzés, azokban a csomagokban már törött az up2date, javítani kellene. hrgy84-nek tehát igaza van, hogy az automatikus verzió ellenőrzés is plusz munka, de inkább uzsolt megközelítése a jobb, sokat is tud segíteni. (Frugalware-nál maradva: 7101 csomagból 682-ben törött az up2date, a többinél releváns infót ad.)

expect-nél maradva, abban nem látod az up2date-t, mert azt a sourceforge.sh -ban van definiálva (amely megoldás illik az összes sourceforge csomagra:) Van még több sourceforge-hoz hasonló séma.

Ez egy egyszerűbb up2date, hogy egyértelmű legyen: unzip.

" Ezért van úgy megtervezve a config file-ok is, hogy egyszer kell csak megcsinálni öket."

Hiszed te. Holnap az expat wordpressre koltozik, a fajlokat kipakoljak s3-ba, ahol nem lehet oket listazni. Holnaputan az openssl apache projektte valik, megvaltozik a mappaszerkezet, a weboldal szerkezete, es a fajlnevek felepitese.

Nem. Egy csomagkezelo sosem arrol szol, hogy egyszer megcsinalom, oszt jo'van. Hidd el, naladnal sokkal okosabb emberek is atmentek mar ezeken a tevedeseken, nem hiszem, hogy te talalnad itten fel a melegvizet, ahhoz mar tulontul sok letezo rendszer es letezo csomagkezelo van.

Egy csomagkezelo csak annyira jo, amennyire karbantartjak a csomagjait. Marpedig egy scriptelt csomag akkor lehet a legjobb, ha minel kevesebb dologtol fugg. Ha hirtelen kitalalja a komplett GNU projekt, hogy marpedig ok kikoltoznek S3-ba, ahol nem kapcsoljak be a fajlok listazasat, akkor nagyon megszivod, mert nem egy csomag, hanem vagy harminc-otven kerul hirtelen ki a latokorodbol, es vaghatsz bele a GNU honlap parzolasaba - ha egyaltalan ugy elo tudod szedni, es parhuzamosan nem kezdik mondjuk valami javascriptes mokaval kigeneralni a lapokat valami S3-as API alapjan formazatlan JSON-bol, amit eleg problemas bash-bol kezelgetni.

Felre ne erts, amit csinalsz, az ujjgyakorlatnak tokeletes. Rengeteg dolgot megtanulhatsz altala. De meg csak veletlenul se tekints ugy erre a projektre, hogy barmi haszna van. Ahogy no a csomagok szama, egyre tobb karbantartasi feladatot csinalsz magadnak, raadasul minel bonyolultabban van megoldva a csomagok felepitese es mukodese, annal bonyolultabbakka valnak a karbantartasi feladataid is. Egy verzioszamot atirni: a piece of cake (1 perc). Egy komplett parzolo scriptet atnezni/javitani/atirni: pain in the ass (fel-egy ora). Es nem lesz mindig idod ezeket maintenelni.
--
Ki oda vágyik, hol száll a galamb, elszalasztja a kincset itt alant:


()=() 
('Y') Blog | @hron84
C . C Üzemeltető macik
()_()

Igaz, ha valamelyik honlap megszünik vagy költözik akkor megszívtam hacsak, nem találok egy "alternativ" oldalt ahonnét tudom folytatni. Ha modjuk "http://ftp.gnu.org/gnu/" megszűnik akkor felborul minden. Mivel elég sok csomagot innét kértem le. Számoltam ilyen lehetöséggel.
Mondjuk elég sokmindent tanultam így az első projetembe. Ennek egy része a csomagezelők menyire összetett, más részt a "programozásról" jobban mondva a script írásról. Valahol olvastam, hogy program írása elött, érdemes papírt és ceruzát ragadni és vázlatot készíteni mielött nekilátunk az program írásnak. Eleinte hülyeségnek tartottam, de mostmár úgy gondolom, hogy van benne vami. Töletek is sokat tanultam amiért hálás is vagyok. Mivel vizuális tipús vagyok így könyebben tanulok másoktól. Tudom, ez a project nem épp a legjobb legalábbis, kivitelezésben és megtervezésben. De elmodhatom, hogy az enyém. Mégha nem is igazán lehetnék rá büszke. :) Ígyekeztem, saját megoldásokat találni és nem koppintani másokat. Nem egy emerge,rmp,pacman vagy egyébb más csomagkezelőt akartam bashba átírni. Ez egy saját független megközelítés annak elenére, hogy akadha hasonlonló vagy megegyező megoldás más csomagkezelővel. Lassan kész a project-em. Tudom elég lassan készült el, de kevés a szabadídőm.
Köszönöm mégegyszer mindenkinek a segítségét és a tanítását.

ui.: Már ki van gondolva a következő project is. Természetesen, ez is olyan project lesz amihez nem értek. Nem tudom pontossan hogyan is müködik valojában. De remélhetőleg ebből is jó dolog fog majd kisülni min t a mostaniból. :)

Ha magadnak csinálsz Linuxot, akkor tudni fogod, mikor jön el az ideje, hogy valamiből már kell az új. Ilyenkor lehet, hogy megúszod az adott csomag újrafordításával, vagy max. néhány függőségével. Lehet olyan is, hogy egy csomag miatt az egészet az eljétől újra kell fordítani. Ilyenkor jön jól, ha már az egész művelet le van scriptelve, a forráscsomagok is átalakírva olyanra, hogy ha új forrást teszel, csak a verziószámot írd át.

-fs-
Az olyan tárgyakat, amik képesek az mc futtatására, munkaeszköznek nevezzük.
/usr/lib/libasound.so --gágágágá --lilaliba

Kozben fentebb reagaltam, anelkul hogy ezt a kommentedet lattam volna. Mindegy, amit mondtam, tartom.

Alapvetoen egy jo otlet, de az a problema vele, hogy ha meg nem is publikalod, akkor sincs semmi haszna, meg szamodra sem. Tobb gondod lenne vele, ha ez alapjan akarnal barmit is csinalni (akar csak a sajat kornyezetedben, pl laptop), mintha nekiulnel megismerni mondjuk az RPM alapu csomagok szerkezetet, es elkezdened kitalalni, hogyan mukodik a csomagkeszites.

Ertettem es megertettem a projekt celjat, azonban szerintem egy ilyen tanulo projektnek az lenne a celja, hogy minel tobb _hasznos_ tudast szerezz altala. Ebbol is egeszen sokat tanulhatsz, sot, de ha egy olyan letezo rendszerrel kezdenel el foglalkozni, amit tobb projekt is hasznal, abbol meg tobbet profitalhatnal, raadasul szinte azonnal be is szallhatnal valamelyik projektbe csomag-maintainernek. Jelenleg eleg sok projektben eleg sok csomag arva, nincs gazdaja, nincs aki karbantartana, meg az olyan kezdoket is nagyon szivesen latnak, mint amilyen te vagy. Minden projektben akad egy-ket srac, aki szivesen a szarnyai ala veszi a kezdoket, es kitanitja. De ehhez szukseges az is, hogy ne csak a sajat - adott esetben hibas - logikadat lasd at, hanem kepes legyel egy fokkal bonyolultabb rendszert is attekinteni. Lepj ki minel tobbszor a komfortzonadbol, vagj bele ismeretlen rendszerek felterkepezesebe, abbol tanulod a legtobbet. Nem veletlenul spameltelek folyamatosan, hogy melyik rendszert erdemes atnezni, hogy mi-hogy mukodik benne.

Kicsit az az erzesem, hogy sikerult szamottevo lovaglotudas nelkul forditva megulni egy olyan pacit, amit nem is olyan egyszeru kezelni. Nem rakhatsz ra nyerget, az allatok jogai tiltjak, hogy sarkantyuzd, es a kotofekre egyszeruen nem reagal. Elobb meg kellene tanulni lovagolni...
--
Ki oda vágyik, hol száll a galamb, elszalasztja a kincset itt alant:


()=() 
('Y') Blog | @hron84
C . C Üzemeltető macik
()_()

A bzip2-1.0.6 fordításánál kicsit kókányolni kell, a "make install [PREFIX|DESTDIR]=..." valahogy nem igazán akar működni. Nekem így sikerült kicsikarnom a kívánt eredményt:

# cat bzip2.system.build
...
...
./configure --prefix= --bindir=/bin --libexecdir=/usr/libexec --datarootdir=/usr/share --mandir=/usr/share/man --bindir=/bin --includedir=/usr/include
sed -i 's/-O2/-O3 -funroll-all-loops -minline-all-stringops -fomit-frame-pointer/pg' Makefile
#sed -i 's/\/man\//\/usr\/share\/man/pg' Makefile

sed -i 's/-O2/-O3 -funroll-all-loops -minline-all-stringops -fomit-frame-pointer/pg' Makefile-libbz2_so
make -f Makefile-libbz2_so
cp libbz2.so* /tmp/$TARGET_PKG/lib
#make clean
make -j2
make install PREFIX=/tmp/$TARGET_PKG
cp libbz2.so* /tmp/$TARGET_PKG/lib
mkdir -p /tmp/$TARGET_PKG/usr/share
cp --recursive /tmp/$TARGET_PKG/include /tmp/$TARGET_PKG/usr
cp --recursive /tmp/$TARGET_PKG/man /tmp/$TARGET_PKG/usr/share
rm -r /tmp/$TARGET_PKG/include
rm -r /tmp/$TARGET_PKG/man
cd /tmp/$TARGET_PKG/lib
rm libbz2.so.1.0
ln -s libbz2.so.1.0.6 libbz2.so.1.0
cd /tmp/$TARGET_PKG/bin
rm bzcmp
rm bzegrep
rm bzfgrep
rm bzless
ln -s bzdiff bzcmp
ln -s bzgrep bzegrep
ln -s bzgrep bzfgrep
ln -s bzmore less

...
...

-fs-
Az olyan tárgyakat, amik képesek az mc futtatására, munkaeszköznek nevezzük.
/usr/lib/libasound.so --gágágágá --lilaliba

Sziasztok.

Arra gondoltam, az update parancsra (lekérdezés alatt) mutatná hány százalék van kész. Ezt hogyan tudnám kivitelezni? Mondjuk, a csík állhatna ebből "#"

És az miért baj? Ha rendesen csinálnád meg, akkor sokkal egyszerűbb lenne bővíteni.
Pl.

#!/usr/bin/env bash
pkgversion="..."
source="..."

# $1 - homepage
# $* - szűrés
bovites() {
   hp=$1 ; shift
   curl -L -s $hp | $* >> ${pkgversion}
   echo $hp >> ${source}
   echo "$((szamlalo*100/osszes))% kész"
   szamlalo=$((szamlalo+1))
}

szamlalo=1
osszes=`grep "bovites " $0 | wc -l`

bovites http://download.savannah.gnu.org/releases/acl/ 'tr "<>" "\ " | grep "acl" | awk '{print $12}' | grep -v ".sig" | sort -V | tail -n 1'
bovites http://ftp.gnu.org/gnu/gcc/ 'tr "<>" "\ " | grep "gcc" | awk '{print $12}' | tail -n 1'
satöbbi

Sziasztok.

Minden igaz, az utolsó rész van hátra és kész a csomagkezelő. Utána már csak bővíteni kell a csomaglistát. Már megvan a csomaglista frissítés is. A következőt találtam ki.
Van egy változó ahol az összes telepített csomag benne fileba. Másik változóba benne van az update csomag verziója.
Az a kérdés hogyan tudom 1 verzió tartalmát összehasonlítani 2 változóval úgy, hogy ne keljen egyesével if-et használni minden csomagnál?

Ezt lehet akkor is használni, ha mindkét változó tartalma változik?
Az első változó aszerint változik, hogy telepítek vagy törlök belöle. A második változó a szerverekről lekért csomagok verziója változhat. Tulajdonképp, 1 változó csomagjait ki kell szürni a 2 verzió-ból és azokat kell összehasónlítani. Ezt hogyan tudnám egyszerüen megcsinálni?

Sziasztok.

Egyszerüen nem jöbök rá hogyan tudnám megcsinálni az utolsó részt. Raktam bele egy "--update-list" kapcsolot aminek az lenne a funkciója, hogy megmutassa milyen csomagokat tudnék frissíteni.
Arra gondoltam, hogy valahogy a remove mappában lévő rm kiterjesztésű file-kat kéne kiszürni a pkgversion-ból.
pkgversion tartalma: http://pastebin.com/72hAUmRu
remove mappába: gcc-4.9.1.rm bash-4.3.rm (itt milyenden telepített csomag benne van és a késöbbiekbe telepítettek is bekerülnek ide.)

A kérdés az hogyan tudom ez a kettő összehasonlítani úgy, hogy azokat a csomagokat mutassan amikből talál frissítéseket és azt jelenitse is meg, melyik csomagot frissíthető mire.

"A remove mappába található az általam telepített csomagok verziói. Ez azért van rm kiterjesztésbe a file mert ez egybe a törlő script is."

Khhmm... apro, felkezes, szegyenlos facepalm. Ne. Ezt igy ne, nagyon kerlek.
--
Ki oda vágyik, hol száll a galamb, elszalasztja a kincset itt alant:


()=() 
('Y') Blog | @hron84
C . C Üzemeltető macik
()_()

for ciklusba beolvaasod ls-el a remove mappad *.rm fajlait, a ciklusban megnevezel ket valtozot az egyik a progi neve, masik a verzioja, sed-vagy amivel tetszik, aztan a progi neve valtozoval keresel a pkgversion fajlban, a talalatot feldolgozod, kinyered belole a verziot, ez is egy valtozoba, aztan az *.rm fajlbo kinyert verziot osszehasonlitod a pkgversion bol nyert verzioval egy if- ben, ha azonos akkor semmi tovabb a ciklus kovetkezo elemere, ha nem egyezik, kiiratod, hogy ennel a proginal van ilyen es ilyen frissebb verzio, aztan tovabb a kovire?

Valami ilyesmivel probálkoztam.

for u in $(ls $REMOVE | grep "*.*" | sed 's/\.rm//'); do
for l in $(cat $VERSION | grep "$u" | sed 's/\.tar\.xz//' | sed 's/\.tar\.gz//' | sed 's/\.tar\.bz2//' | sed 's/\src//'); do
if [ $u != $l ]; then
echo "$u >> $l"
else
echo "Nincs frissítés"
fi
done
done

az $u az neked ilyesmi nem pl: gcc-4.9.1?
ha ezzel keresel, de a frissítés fájlodban már gcc-4.9.2.tar.gz van, akkor nem ad találatot, így az echo-d kimenete: gcc-4.9.1 > >

én valahogy így csinálnám:

for u in $(ls $REMOVE/*.rm); do
# az összes .rm végződéső fájl beolvasása a $REMOVE alól
_name=$(echo $u | sed -n 's/\(.*\)-[0-9].*/\1/p')
# a kimenet elvileg a '-' és egy szám előtti rész
# pl gcc-4.9.1.rm esetén: -4 előtti azaz gcc
_ver=$(echo $u | sed -n "s/$_name-\(.*\).rm/\1/p")
# az előbb megkapott csomagnév és a .rm közti rész,
# azaz a verzió
_new_ver=$(grep $_name $VERSION | sed -n "s/$_name-\(.*\)/\1/p" | sed 's/\.tar\.gz//;s/\.tar\.bz2//;s/\src//')
# hát ez most nem megy szebben :P
# reményeim szerint az új verziót kapod meg
if [ $_ver != $_new_ver ]; then
echo "$_name: $_ver >> $_new_ver"
else
echo "$_name: Nincs frissítés"
fi
done

Nem próbáltam, nem tudom működik-e egyáltalán, meg ha van/lesz olyan csomagjaid hogy pl firefox és firefox-hu, akkor félremegy a dolog, mert a firefox ra keresésnél találatot ad a firefox-hu-ra is....

Valahogy így gondoltad?

for u in $(ls $REMOVE*.rm); do
_name=$(echo $u | sed -n 's/$REMOVE\/\(.*\)-[0-9].*/\1/p')
_ver=$(echo $u | sed -n 's/.*$_name-\(.*\)\.rm/\1/p')
_new_ver=$(grep $_name $VERSION | sed -n 's/$_name-\(.*\)/\1/p' | sed 's/\.tar\.gz//;s/\.tar\.bz2//;s/\.src//')

if [ $_ver != $_new_ver ]; then
echo "$_name:$_ver >> $_new_ver"
else
echo "$_name: Nincs frissítés"
fi
done

a _name nal sed -r legyen es az elvalaszto ne /, hanem pl :

a tobbi azzert ures, mert mar a _name is semmi

szerk:

sed -n 's/$REMOVE\/\(.*\)-[0-9].*/\1/p'

helyett

sed -r "s:$REMOVE/(.*)-[0-9].*:\1:p"

szerk2: az osszes sed-esnel, ahol valtozot is felhasznalunk '///' helyett "///" legyen, ' ' eseten nem helyettesiti be a valtozott....

Rájötttem, hogy a "_ver" változó nem add vissza eredményt. Másik dolog "for u in $(ls $REMOVE*.rm)" erről le lehet hagyni a "*.rm" -t mivel a mappába lévő filekat listázás és úgyan az lesz az eredmény.
_name=$(echo $u | sed 's/\-[0-9]*//') >> ez így csak a csomag nevét dobja ki ahogy kell.
Viszont a "_ver" változóra még nem találtam megoldást, ahogy robálkoztam vagy eredményt nem add vagy csomagot mutatja "rm" végzödés nélkül.
Ebbe tudna valaki segíteni, hogyan tudnám lecsipni az elejét és a végét?

a _new_ver nem jó, ott csak a csomagverziónak kellene lennie...

_new_ver=$(grep $_name $VERSION | sed -n "s/$_name-\(.*\)/\1/p" | sed 's/\.tar\.gz//;s/\.tar\.bz2//;s/\src//')

ez van nálad?

vagy ahogy uzsolt írta össze is lehet vonni a sed-eket:
_new_ver=$(grep $_name $VERSION | sed -n "s/$_name-\(.*\)/\1/p;s/\.tar\.gz//p;s/\.tar\.bz2//p;s/\src//p")

figyelj a sed-nél a "" vagy '' -re. A fentiek szerint én megkapom a $VERSION alatt lévő fájlban felsorolt sorok közül pl a gcc verzióját, és csak a verzióját.

nálam tehát gcc-nél maradva ezek az értékek:
_name=gcc
_ver=4.9.1
_new_ver=4.9.2

és ezután:
if [ $_ver != $_new_ver ]; then
echo "$_name: $_ver >> $_new_ver"
else
echo "$_name: Nincs frissítés"
fi

ezt kapom:
gcc: 4.9.1 >> 4.9.2

Sziasztok. Folyik a tesztelés a csomagkezelőmnek. A csomag letöltés, kibontás, Csomagfa frissítés rendessen müködik, de a confignál van egy kis gond. A konfig file így nézz ki pl a nano-nak. http://pastebin.com/b8kh7aJ9
Eleinte a configure is be volt rakva egy oylan if-be mint a build. De nem hajtotta végre a feladatát. Mióta kivettem azóta lefutt a konfig de a build nem. Ha kiveszem az if-ből a build-et akkor lefutt az is. A problémám vele, ha a configure-ba hiba akkor folytatja a build-el de viszont ezt nem szeretném. Ezt hogyan lehetnem megoldani, hogy ha nem futt le a configure akkor nem folytassan csak akkor ha hiba nélkül le tud futni a config.

Grep, awk, tr... Csodalom, hogy meg nem sikitott fel senki erre erzekeny hangosan. Mint egy rossz szexfilm. Egy strip meg egy touch hianyzik belole meg... :-)

Ha a build nem fut le, annak az lehet az oka, hogy a $? nem nulla. Probaltad mar peldaul kiiratni a $? erteket, hogy mi a baj?

Ami a fuggvenyneveket illeti, probalj valami semlegeset adni a configure-nek, mert ha a "." pathen van, nem biztos, h az tortenik, amit elvarsz... Mondjuk egy pkg_config() / pkg_build() fgv nevek jobbak lehetnenek.
--
Ki oda vágyik, hol száll a galamb, elszalasztja a kincset itt alant:


()=() 
('Y') Blog | @hron84
C . C Üzemeltető macik
()_()

Miért mi a baj a "grep, awk, tr"-rel? Müködik nálam és a többi is így lett csinálva. Sőt, még a update rész is (tulajdonképp úgyan ez van abba is).
kézzel is lefuttatam a configure-t és gond nélkül lefutt. Csak a build nem indult el.
Egyébként, a teszteléssel jelenleg még nem folyik. Gondjaim vannak, mert make nem müködik. (szegmentális hiba)-t ír.

curl -L -s http://ftp.gnu.org/gnu/nano/ | tr "<>" "\ " | grep "nano" | awk '{print $8}' | grep -v ".sig" | grep -v "/a" | sed 's/\.tar\.gz//' | sort -V | tail -n 1

vs.

curl -L -s http://ftp.gnu.org/gnu/nano/ | sed -rn '/href="nano/ s@.*a href="(nano-[^"]*.tar.gz).*@\1@p' | sort -V | tail -n 1

Egyrészt rövidebb. Másrészt könnyebben áttekinthető. Harmadrészt könnyebben karbantartható. Negyedrészt lényegesen kevesebb (felesleges!) külső program hívás (6 és 1, a sort és tail részt sehol nem számolva), ami nyilván sebességben is meglátszódik.
Ui. pl. grep-awk páros felesleges, hiszen az awk is tudja azt, ami neked kell a grep-ből.

Igazad van, tényleg rövidebb és kevesebb plusz programot hív meg. Lefuttatam néhányat a te verziódból, hogy melyik a gyorsabb. Külömbséget nem vettem nagyon észre. Remélhetőleg, nem nagyon kell karban tartani. Eredetíleg úgy terveztem, hogy a programot mindig a megadott helyről frissíti ebben az esetben "http://ftp.gnu.org/gnu/nano/" a nano-t. Ha esetleg valami miatt nem tudja lekérni pl:megszünik az oldal vagy elköltözik. Abban az esetbe kell az új oldalon lekérni és kicserélni az update ill a csomaghoz tartozó config fileba.
Amint rájövök, az lfs linux-ba miért nem müködik a make-4.1 (segmental fail) és sikerül kijavítani nekiállok tesztelni.
Köszönöm az észrevétel és a rengeteg segítséget. Ha a tesztek sikeresek, elkezdem bővíteni a csomagokat amik kellenek nekem azt mehet egy új project.

Ebben az esetben valóban nem biztos, hogy feltűnik a sebességkülönbség, ui. szerintem az internettel való okoskodás több időt vesz igénybe. Viszont ha net nélküli részt írnál, és sok ilyen lenne, szembetűnőbb lenne a sebesség-különbség.
Viszont ha erre szoksz rá, nagyon átláthatatlanok lesznek a szkriptjeid. Ami, ha soha a büdös életbe nem veszel elő, "csak" használod, nem számít. A legfontosabb, hogy menjen rendesen.
Viszont azt már most garantálom, hogy mindig kell majd valamit alakítani rajta. És akkor egyszerűbb lesz egy áttekinthetőbb kódot bővíteni, változtatni, mint egy nagy katyvaszt, aminél egy sorban is tíz lépcső van (egy tr-elt output-ot grep-pel szűrünk, majd awk-val csak a nyolcadik oszlopot íratom ki, majd újra grep, meg sed. Két hét múlva neked is öt percig kell majd ülnöd felette, hogy ezt most miért. Na, mindegy, majd meglátod.

Make segfault-ja. Először is, biztos, hogy a make segfault-ol? Nem pedig a gcc vagy esetleg valamelyik teszt egy csomagfordítás közepette? A pontos hibaüzenetet másold ide (még egyszer sem sikerült leírnod rendesen hogy "Segmentation fault" - ui. gondolom, hogy ezt írta ki).

Igazad van. Elég nagy a katyvasz a programomba. főleg, a "fő" programomba. De tervezem kicsit áttekinthetőbbé rakni amint sikeres teszt lesz.(Első probálkozásnak szerintem azért elfogadható.)
Tuti, hogy a make-val van a gond. A konfigure rész lefutt szépen utána jön a make parancsra a gond. "Segmentation fault" bármit csinálok a make-val. pl: make --version -ra is úgyan úgy kidobja a "Segmentation fault" hibát. Ebből gondolom, hogy ez szállt el.

(fejvakar) igazabol en eredetileg foleg azert mondtam, hogy ez a fajta frissitesi mod nem lesz annyira jo, mert egyvalamit nem tamogat a csomagkezelod: az elore letoltott forrasokbol offline telepitest, mert a verziot mindig helyben online akarja feloldani. Tudom, hogy ma mar mindenutt van internet, de meg igy is elofordulhatnak helyzetek, amikor epp doglodik, es idotolteskeppen kivasalnal peldaul egy make segfault hibat.
--
Ki oda vágyik, hol száll a galamb, elszalasztja a kincset itt alant:


()=() 
('Y') Blog | @hron84
C . C Üzemeltető macik
()_()

Tudom, hogy "van" vagy "lehet" hátülötöje ennek a mondhatni sajátos modszernek. Viszont, ahogy elörébb is írtam, nem lesz publikálva. Még az se 100%, hogy saját magam használoni fogom. Bár gondoltam rá ha a teszteken müködik, visszatérek lfs-re és ott használni fogom.(Ha tesztek alatt tényleg müködik akkor nagy valószinüséggle használom is.) Bizok benne, azért egy egésszen müködő kis csomagkezelőt tudtam fabrikálni. Jelenleg függösékeket se kezeli. Ha esetleg, rendben müködik, és használom is akkor valószínű tovább fogom fejleszteni magamnak. Pl: kitalálok valamit a függöség kezelésre.
Ez a project első sorban a tanulás miatt indult. Ezt a nyelvet választottam első nyelvnek és első project-em ez a csomagkezelő. Mondjuk, ha meglátnátok a magát a csomagkezelőt hogy nézz ki sírva fakadnátok. Lehetne mit finomítani rajta, amit fogok is. Minden esetre, számomra tanulságos volt maga a project. Nagyon sok új dolgot tanultam ill tanitottatok. Gondolom ez sovány vigaz mert közben hajatokat téptétek, de örülök, hogy szántatok rám az időtökből és segítetek. :)

u.i: Hamarossan, nekiesek az új project-nek, ami egy bash-ba írt windows manager lesz.
Mégegyszer köszönöm mindenki segítségét.

s/X Windows/X Window/

egyes szam. Mint ahogy nem Windows Manager, hanem csak Window Manager. Nem ablakokkezelo, hanem ablakkezelo.

Figyelj oda, mert egy betu es mast jelent, az angol mar csak ilyen. Nagyon nem mindegy, hogy "Are you see" vagy "Are you sea"
--
Ki oda vágyik, hol száll a galamb, elszalasztja a kincset itt alant:


()=() 
('Y') Blog | @hron84
C . C Üzemeltető macik
()_()

Sziasztok.

Szépen alakul a csomagkezelő. Már 0.2-es verziónál járok. Ebben a verzióban van már csomagkereső és megmutatja, melyik csomagokat lehet miről mire frissíteni. Arra gondoltam, ha már ennyire eltértem egy "szimpla" csomagkezelőtől megprobálok függöségkezelést is belerakni. Ebbe kérnék egy kis segítséget kérni. Hogyan lehet, ezt viszonylag egyszerüen kivitelezni? Már ha van rá egyszerünek mondható megoldás.
Nekem egy olyan megoldás jutott az eszembe, hogy csinálok egy változót ami tartalmazza a függöségeket és szépen minden egyes függöségi csomagot berakok egy if-be leellenörzöm fel van e telepítve ha nincs akkor ráindítok a telepítésre. Van valami egyszerübb modszer rá?

Válaszokat elöre is köszönöm.

Én se tudnék (lényegesen) más módszert.
Amire még érdemes lehet figyelni: verzió-függőség is, azaz pl. egy X csomag függ az Y csomagtól, de annak is a legalább 2.1-es verziójától. Nem annyira mainstream, de széles körben használt csomagoknál sűrűn előfordul, hogy az Y-ból a legújabb kell neki.

Azzal nem lesz gond, hogy a legújabbat kapja. Mivel az egész csomagkezelő ezen alapszik, hogy a legfrissebb csomagok érhetök le azonnal. Szerintem, a függöség kezelés egyenlőre hanyagolom. Késöbbiekbe meg folytatom. Addig is jöhet egy másik project.

Ez a project mondhatni sokkal jobb lett mint amit elösször akartam. Nem gondoltam, hogy elsőre ilyent össze tudok tákolni. Nekem nagyon tanulságos volt.
Köszönöm mindenkinek a segítségét. Gondolom, kiváncsi vagytok hogyan nézz ki a tálkolmányom. Mielött nagyon kritizálnátok jusson eszetekbe első project és első probálkozásom a bash script ill az egész "programozás" világába. Tanácsokat észrevételt szívesen fogadok okulás gyanánt.
http://pastebin.com/McHjYbgh

Sziasztok !

Tesztelésnek vége. Az eredmény pozitív. Nagyon jól müködik. Egy kis finomhangolást szeretnék csinálni rajta. Amibe, kérném a segítségeteket.
Az első "bashpkg --sync" futtatásnál ami a csomaglista frissítés ebbe szeretnék egy olyant ami mutatja %-ba hol tart plusz [########## ]- valami ilyesmi csikba is. Ilyesmi kép nézze ki "[######################] 76%".
A Másik : ez itt a csomag frissítés mutatja, hogy van e csomag amit frissíthetek. Így nézz ki.

for u in $(porg -a | grep "$PACKNAME"); do
name="$(echo $u | sed 's/-[0-9].*//')"
ver=$(echo $u | sed "s/$name\-//")
new_ver="$(cat $VERSION | grep "$name" | sed "s/\.tar\.gz//;s/\.tar\.bz2//;s/\.src//;s/\.tar\.xz//")"

if [ "$name-$ver" != "$new_ver" ]; then
echo -e "$name-$ver $g -->$def $r $new_ver$def"
else
echo -e "$r Nincs frissítés.$def $g:)$def"
fi
done

Annyi a gond vele, hogy amikor nincs frisssíthető csomag akkor minden csomagnál kiírja "Nincs frissítés." De úgy szeretném, hogy ha nincs egyeltalán akkor csak 1x írja ki.

Segítséget előre is köszönöm.

Anelkul, hogy megprobalnam megerteni, mit csinal a kod (kora hajnal van meg, ez ilyenkor nem megy):


anyupdate=0

for u in $(porg -a | grep "$PACKNAME"); do
  name="$(echo $u | sed 's/-[0-9].*//')"
  ver=$(echo $u | sed "s/$name\-//")
  new_ver="$(cat $VERSION | grep "$name" | sed "s/\.tar\.gz//;s/\.tar\.bz2//;s/\.src//;s/\.tar\.xz//")"

  if [ "$name-$ver" != "$new_ver" ]; then
    echo -e "$name-$ver $g -->$def $r $new_ver$def"
    anyupdate=$((anyupdate + 1))
  fi
done

if [ "${anyupdate}" -eq 0 ]; then
  echo -e "$r Nincs frissítés.$def $g:)$def"
else
  echo -e "$r $anyupdate db csomag frissíthető"
fi

Btw, az echo-knal en angol kiirast alkalmaznek, es megismerkednek a gettext nevu parancs hasznalataval. Bovebben lsd: https://github.com/meonkeys/bash-i18n-example

Ami a progress baros kerdest illeti, azt a) elfelejtenem b) megbaratkoznek a gondolattal, hogy "dialog" alapon irom ki. Rendes progress bart csinalni nativ bash-bol nem annyira trivialis, mivel a nyelv maga egy stateless cucc, az egyes programok nem tudjak rendesen a kozponti kornyezetben tarolni az allapotukat ket meghivas kozott.

Amit helyette ajanlok: felejtsd el a progress bart, ird ki csak a szazalekot paddingolva, es akkor azt 3 backspace jellel vissza tudod torolni.

Demonstracio:


#!/bin/bash

echo -ne "Progress:   0%"
for i in $(seq 1 100); do
  sleep 1
  echo -ne "\b\b\b\b$(printf "%3d%%" ${i})"
done
echo

Egyvalamire figyelj nagyon: a folyamatjelzo lefutasa utan mindenkepp kell egy ures echo, hogy visszaalljon a rendes kiirasi ciklus. Ha fuggvenyeket irsz a dologra, mindenkeppen kell egy "progressbreak" fuggveny is, hogy a hibajelzeseket ki tudd szepen irni.
--
Ki oda vágyik, hol száll a galamb, elszalasztja a kincset itt alant:


()=() 
('Y') Blog | @hron84
C . C Üzemeltető macik
()_()

Hali.

Progress rész nem teljessen értem. A script elszámol 100-ig az oké. De ezt hogyan tudom összekapocsolni a lekéréssel?

Másik kérdés: Találkoztam egy érdekes problémával. Konfig file-ba is leszeretném csípni a végét (tar.gz, ta.bz2 stb...) ilyen módon (sed "s/\.tar\.gz//;s/\.tar\.bz2//;s/\.src//;s/\.tar\.xz//") de érdekes módon csak a tar.gz-t szedi le. Config file így nézz ki http://pastebin.com/cUVfAz78 a kérdés itt miért csak a tar.gz-t szedi le?

"De ezt hogyan tudom összekapocsolni a lekéréssel?"

Akkor irsz ki uj szazalekot, amikor epp akarsz. Ha van 50 csomagod, akkor mindegyik utan 2-vel tobbet irsz ki (2%-4%-8%-10%. stb). De ez csak kreativitas kerdese, gondolom szazalekszamitast meg vettetek mar suliban :-)


$ echo foo.src.tar.gz | sed 's/\.tar.\+//;s/\.src//'
foo

Egyre figyelj, a kep.tar-0.25.zip -bol csak kep lesz.
--
Ki oda vágyik, hol száll a galamb, elszalasztja a kincset itt alant:


()=() 
('Y') Blog | @hron84
C . C Üzemeltető macik
()_()

Progress bar:

#!/bin/bash
while :; do
echo -en "\e[10G" # kurzort 10. oszlopba mozgat
read -n 1 n # számot beolvas
echo -en "\e[1G\e[J\e[41m"
# \e[1G kurzort 1. oszlopba mozgat
# \e[J letörli a terminált a kurzortól kezdve
# \e[41m háttérszínt pirosra beállít
for (( c=1; c<=$n; c++ )); do
echo -n " "
done
echo -en "\e[0m" # háttérszínt visszaállít
done

Amelyik számbillentyűt lenyomod, annyi karakter széles piros csíkot kirajzol. A "read -n 1 n" utáni kódot másold ki ha akarod ezt használni; "n" változóba kell rakni hogy hány karakter széles legyen.

En nem szeretem feltetlen ezt az ASCII-s cuccot, mert ha valaki egyszinu terminalrol nezi, az nem lat semmi haladast. Gondolom egy csomagkezelonel ez elkepzelheto scenario.

Egyebkent erdekes megoldas, koszi.
--
Ki oda vágyik, hol száll a galamb, elszalasztja a kincset itt alant:


()=() 
('Y') Blog | @hron84
C . C Üzemeltető macik
()_()

Sziasztok köszönöm a segítséget.

Lenne még egy kérdésem. Van egy változó a konfig file-ba ami így néz ki pl gcc-be :
VERSION="$(cat /usr/bashpkg/pkgversion | grep "gcc" | sed "s/\.tar\.gz//;s/\.tar\.bz2//;s/\.src//;s/\.tar\.xz//")" kimenete a következő : "gcc-4.9.2"
Elméletileg a sed rész leszedi az összes "tar.gz; tar.bz2; src; tar.xz" kiterjesztését. Sőt gyakorlatileg is működik conzolba tesztelve. A probléma az, hogy a változóba nem hajtja végbe a teljessen. Csak a tar.gz-t szedi le. A kérés az lenne miért csak a tar.gz-t szedi le? Ezt a fajta megoldást máshol is használom de ott jó.

Megoldva. Elfelejtettem a fő programomba is belerakni a tar.xz kiterjesztés. Csomagok készítésénél tartok azt mehet az éleszbe kicsit huzamosabb tesztelés azt lehet visszatérek az lfs linuxra. Természetessen a saját csomagkezelömmel.
Egyenlőre a frissítés százalékba való mutatását. Köszönöm a segítséget mindenkinek.

Kellemes ünnepeket mindenkinek.

Köszi a már megoldottam. Már 26 config file van ami alapján lehet telepíteni a csomagokat. Egy darabig nem tudok foglalkozni vele. De amint lesz rá lehetöségem, folytatom. Csomag gyártás kb 1-2 percet fesz igénybe. Már csak a további csomagokat kell megcsinálni és használhatóm a csomagkezelőmet.
Modhatni, a project elkészült. Rádásul, jocskán túlszárnyalta az elvárásaimat. Ebbe elég nagy szerepet játszatatok ti is (ötletek, tanácsok és megoldásokba). Nagyon sokat tanultam ebből a project-ből.
Remélem hamarossan neki tudok állni egy újabb project-nek.

Köszönöm mindenkinek a segítségét.

Kellemes karácsonyi és boldog új évet kívánok mindenkinek.