Haluan vielä ainakin kerran viritellä tälläisen Fake OS systeemin. Siitä tulee lähes kopio edellisestä versiosta tosin sillä erolla, että sorsat on kirjoitettu 100% alusta sillä vanhat katosivat. Fake OS:sta tulee olemaan komentorivimuotoinen Unix-tyylinen (unixin tyyliset komennot ja hakemistot tyyliin /bin, /home /usr etc...) ja tarvitsisin siihen jonkinlaisen asennusohjelman, mutta en osaa itse kehittää sitä. Olisi hyvä jos tiedostot saataisiin pakattua yhteen tiedostoon niin, että tällä asennusohjelmalla voitaisiin purkaa ja se asennusohjelma tietäisi, että mikä tiedosto kuuluu minnekkin.
Esimerkiksi exe-tiedostot (muut kuin komennot tai systeemin omat) menevät minulla /usr/bin hakemistoon, josta niitä voi suorittaa komennolla ./[ohjelman nimi], ohjelmien asetustiedostot menevät hakemistoon /etc jne...
Jos jollakin olisi aikaa, halua ja osaamista niin olisin mielissäni kaikesta avusta, jota siihen asennusohjelman tekoon saisin.
Selitän nyt hieman enemmän Fake OS:n hakemistoista ja tiedostoista.
Juurihakemistossa minulla on cshell.001, joka sisältää tiedon siitä, että mikä on ohjelman (Fake OS:n) osoite (esim . C:\fakeos)
/bin (eli c:\fakeos\bin) hakemistossa on fake os:n komennot (ls, clear, cd, rmdir, rm, mkdir jne..)
/etc hakemistossa (eli C:\fakeos\etc) minulla on ohjelmien asetustiedostoja
hostname.001 - komentokehoite näkee tästä ns. hostnamen ja näyttää sen komentokehoitteessa niin, että komentokehoite näyttää tältä:
[juhaz@jurri.kaskiharju.homenet /etc]$_
luser.001 - sisältää tiedon sisäänloggautuneeska käyttäjästä. Ikävä kyllä en ole vielä osannut kehittää tätä siihen suuntaan, että tätä voisi käyttää monta ihmistä samaan aikaan :P
luser ei tarkoita tuossa tilanteessa luuseria vaan logged user, mutta lyhennettynä xD
ltime.001 - Sisältää tiedon siitä, että koska Fake OS:iin ollaan loggauduttu viimeksi (tärkeä uptime komennon osalta).
/etc-hakemistossa on myös kaksi kansiota, jotka ovat nimiltään ext ja passwd, joista ext:ssä pitäisi olla tiedostojen päätteet ja niissä tiedot siitä, että mikä tiedosto on minkäkin ohjelman.
Passwd hakemistossa on käyttäjät ja niiden salasanat + niiden oikeudet eli purkkaviritelmä. Tiedostot ovat esim. root.003 ja tiedosto sisältää esimerkiksi tekstin "salasana, root", jossa salasana on salasana ja root on se, että millainen käyttäjä se on.
/home:ssa on käyttäjien kotihakemistot ja käyttäjien kotihakemistoista löytyy ainakin tiedosto history.001, jossa on kaikki käyttäjän kirjoittamat komennot.
Sen sisältö on tämäntyylinen:
07-08-2005 18:35 | ls 07-08-2005 18:35 | rm tiedosto
/usr hakemistosta löytyy hakemistot man, docs, src, bin, sys ja sys sisältää vielä hakemiston bin, jossa on systeemin keskeiset osat (komentokehoite jne...).
man-hakemistosta löytyy manuaalisivut, docs:sta muut documentit, src:stä lähdekoodit ja bin on tarkoitettu kaikille muille ohjelmille.
Myös oikeastaan kaikenlaista muutakin softaa tarvitsen. Esimerkiksi jonkinlainen kevyt tekstinkäsittely olisi hyvä, että jos teillä on jotain entisiä vanhoja projekteja tai nykyisiäkin, joille voisi olla käyttöä tässä projektissa niin otan mielelläni vastaan. :P
PS: Älkää niitatko minua sitten seinään jos tämä on teistä naurettavaa...
Minulla tuli vastaan vakava ongelma!
Tässä koodi:
DECLARE FUNCTION split% (stringi$, erotin$, taulu$(), max%) OPEN "cshell.001" FOR INPUT AS #1 INPUT #1, rootdir$ CLOSE #1 OPEN rootdir$ + "\etc\luser.001" FOR INPUT AS #1 INPUT #1, usr$ CLOSE #1 OPEN rootdir$ + "\etc\hostname.001" FOR INPUT AS #1 INPUT #1, hostname$ CLOSE #1 prompt: CLS PRINT "W-UX Operating System 1.0 - Copyright(C)2005 Pleasantware." main: d = 0 PRINT "["; usr$; "@"; hostname$; " "; path$; "]"; : INPUT "$", cline$ '------------History--------------- OPEN rootdir$ + "\home\" + usr$ + "\history.001" FOR APPEND AS #1 PRINT #1, TIME$; " "; DATE$; " | "; cline$ CLOSE #1 '------------History ends---------- 'select case mid$(cline$, 1,2) 'case is = "./" 'shell rootdir$ + "\usr\bin\" + ltrim$(rtrim$(mid$(cline$, 3,300))) 'case else 'shell rootdir$ + "\bin\" + cline$ 'end select 'goto main DIM m$(7) s: PRINT split(cline$, "|", m$(), 0) SELECT CASE MID$(m$(d), 1, 2) CASE IS = "./" SHELL rootdir$ + "\usr\bin\" + LTRIM$(RTRIM$(MID$(cline$, 3, 300))) CASE ELSE SHELL rootdir$ + "\bin\" + m$(d) d = d + 1 END SELECT IF d = 8 THEN GOTO main GOTO s FUNCTION split% (stringi$, erotin$, taulu$(), max%) se$ = stringi$ 'ei rikota alkuper?ist? teksti?... kohta% = INSTR(se$, erotin$) 'miss? kohdassa on eka erotin$ IF kohta% = 0 THEN EXIT FUNCTION'jos ei ole yht??n niin ei anneta yht??n WHILE kohta% 'etsit??n lis?? kunnes ei erotinta l?ydy en?? taulu$(ne%) = LEFT$(se$, kohta% - 1) 'lis?t??n l?ydetty taulukkoon se$ = MID$(se$, kohta% + LEN(erotin$)) 'irrotetaan jo l?ydetty ne% = ne% + 1 'lis?t??n laskuria kohta% = INSTR(se$, erotin$) 'miss? kohdassa seuraava erotin$ IF ne% = max% THEN 'jos ei haluta en?? niin ei anneta en?? split% = ne% EXIT FUNCTION END IF WEND taulu$(ne%) = se$ 'viimeinen osa split% = ne% + 1 'kerrotaan montako l?ytyi END FUNCTION
tuo ei toimi jos laittaa komennon tyyliin:
echo moi| echo heh | echo hah
mutta toimii jos laitan:
echo moi|echo heh|echo hah
onko jotain keinoa saada toimimaan niin, että siinä saa olla väli |:n ja seuraavan suoritettavan komennon välillä?
EDIT: Ja kuinka voin tehdä tuon niin, että ei ole pakko olla
PRINT split(cline$, "|", m$(), 0)
koska en halua, että käyttäjä näkee niitä numeroita. Jos jätän print pois niin tuo valittaa jotain expresionista ja jos jätän tuon koko rivin pois niin ei tapahdu mitään.
Olen lisännyt ns. toimivan chmod komennon. Tällä ei voida estää vielä esimerkiksi jos käyttäjä menee jonkun toisen kotihakemistoon, mutta tällä voidaan estää käyttäjää käyttämästä esimerkiksi jotain ohjelmaa tai komentoa.
juhaz kirjoitti:
onko jotain keinoa saada toimimaan niin, että siinä saa olla väli |:n ja seuraavan suoritettavan komennon välillä?
Trim()maa ne splitillä erotetut osaset jokainen.
juhaz kirjoitti:
EDIT: Ja kuinka voin tehdä tuon niin, että ei ole pakko olla
PRINT split(cline$, "|", m$(), 0)
Arvaus:
split cline$, "|", m$(), 0
Jos Split kerran on funktio, niin silloin se paluuarvo täytyy myös laittaa johonkin, ja tuossa tapauksessa se laitetaan PRINT-käskyn parametriksi.
Edit: Voit siis laittaa sen paluuarvon vaikka muuttujaan, ei sitä ole pakko tulostaa.
No entäs jos käyttäjä antaa vain yhden komennon niin kuinka tehdään, että ei ole sitten kuitenkaan pakko laittaa sitä yhtä |-merkkiä?
If InStr(komento, "|") <> 0 Then 'useampi komento, splittaillaan Else 'vain yks, suoritetaan se End If
Onko jonkinlainen zip-tiedostojen purku ja pakkausohjelmien teko hirmu vaikeaa? Tarvitsisin tuohon Fake OS:iin ohjelman, joka osaisi purkaa paketteja ja asentaa ne oikeille paikoilleen. Se olisi vähänkuin joku komento eli, kun käyttäjä antaisi vaikka /tmp hakemistossa komennon install paketti.zip niin se purkaisi ja siirtäisi tiedostot oikeisiin paikkoihin, jolloin käyttäjä voisi suorittaa sitä ohjelmaa, jonka hän juuri oli asentanut.
Kyllä se hieman mutkikasta taitaa olla, ja käsittääkseni siinä on myös patenttiongelma vastassa (vai?). Tuollaisessa pikkuprojektissa voit varmaankin käyttää aivan hyvin jotakin valmista zip-ohjelmaa. Toinen hyvä vaihtoehto ovat tar-gz-paketit, joiden käsittelyyn löytyy vapaata lähdekoodia (C-kielistä) ja ilmaisohjelmia.
No tuo zip oli kyllä lähinnä esimerkki, mutta joku vastaava olisi tarpeen. Ihan nykyiset valmiit ohjelmat eivät taida kelvata sillä niitä pitäisi saada ihan pikkuriikkisen verran modattua, että ne eivät erottuisi hirveästi muuten tuosta mun projektista.
bzip2:n perusalgoritmi on helppo toteuttaa itsekin ja sillä saa hyvän pakkauksen aikaan.
Algoritmi:
1. Burrows-Wheeler-Transform(BWT)
2. Move to front
3. Runlength encoding
4. Huffman koodaus
BWT on aika jännä algoritmi, jolla tekstin pystyy järjestämä siten, että tekstiin muodostuu pitkiä samojen kirjaimien jonoja. MoveToFrontissa pitkät samojen merkkien jonot muuttuvat pääosin jonoiksi nollia. RLE:llä pitkät jonot koodataan lyhyesti ja huffman koodauksella tämän koodauksen merkistö muutetaan optimaaliseksi bittinypläyksellä. Google kertoo lisää.
Tein tuollaisen joku kesä sitten javalla ja pakkaustulos pärjäsi ihan hyvin winzipille ja oli monesti parempi.
Javassahan on zip-virrat sisäänrakennettuina, joten jos Java kelpaa, niin voin tekaista :P
EDIT: Tosin sitten FOSin vaatimuksiin tulisi JVM :P
ja sitäpaitsi JVM tuskin toimii DOS:issa... epäilen... Joku C/C++ softakin olisi hyvä, kunhan se olisi sopiva juuri tähän FOS:iin ja osaisi sitten lopulta siirtää kaikki kamat sinne minne ne kuuluvat.
Nyt tuli uusi ongelma, kun aloin kehittämään Xwindows-tyylistä softaa FOS:iin (lähinnä copy+paste tavalla).
Softa löytyy osoitteesta:
http://jumbo66.adsl.netsonic.fi/jussi/ohjelmat/
Eli sillein, että jos tuon cline.exe:n käynnistää ja sitä vetää paikasta toiseen niin syntyy kuin uusi komentokehoite ja vanha jää sinne taustalle. En haluaisi, että se vanha jää tuonne taustalle, mutta en keksi muuta keinoa kuin ottaa tuon heittomerkin (kommentti) pois shell "GDI.EXE $desktop_refresh" kohdasta ja sitten, kun käännän sen ja käynnistän (cline2) niin se ei toimi. Näkyy vain tuollaista ihme punaisia pisteitä ym...
Koko Millenium OS softa löytyy osoitteesta:
http://kldp.net/frs/download.php/2225/mos.zip
Jos joku keksii jonkin korjauksen tuohon niin olisi hyvä sillä itse en keksi vaikka olen yrittänyt jo varmaan pariakymmentä eri juttua saamatta yhtäkään toimimasta oikein.
Adduser komento lakkasi toimimasta jostain syystä oikein... tai ainakin se valittaa jotain ihan ihmeellistä...
Muutin adduser komentoa sillä tavoin, että se ei tee salasanasta enään aukinaista niin, että kuka tahansa voisi lukea sen käyttäen tätä: https://www.ohjelmointiputka.net/koodivinkit/
Nyt se valittaa aina virhettä "Extended Error 183", mutta se kuitenkin tallentaa sen salasanan niin, että se toimii sitten loginissa eli hirveän iso virhe ei siis ole kyseessä, mutta ärsyttävä se silti on, kun virhettä latelee aina, kun adduser komentoa käyttää.
FOS ja sen sourcet löytyvät osoitteesta:
http://jumbo66.adsl.netsonic.fi/jussi/ohjelmat/
rootin salasana on "proball" ilman lainausmerkkejä. Eli jos keksitte vian niin olisi kiva tietää se, että sen saisi korjattua :)
Mitenköhän tuohon muuten pitäisi toteuttaa oikeudet niin, että esimerkiksi jos käyttäjällä "juhaz" ei ole oikeutta lukea root-käyttäjän kotihakemistoa niin vaikka käyttäjä "juha" kirjoittaisi komennon "cd /home/root" niin se estäisi "juhaz":ia pääsemästä sinne?
Ilmeisesti siinä on nyt sitten jotain muutakin ongelmaa kuin vain ja ainoastaan tuo adduserin extended error >(
Nyt ei pysty jostain syystä loggautumaan sisään sillä se väittää, että salasana on väärä vaikka se varmasti on oikea.
Aihe on jo aika vanha, joten et voi enää vastata siihen.