Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: QB FOS juttua *TAAS!*

Sivun loppuun

juhaz [07.08.2005 01:28:40]

#

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...

juhaz [07.08.2005 03:31:32]

#

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.

juhaz [07.08.2005 09:25:33]

#

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.

Blaze [07.08.2005 13:35:03]

#

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

hunajavohveli [07.08.2005 19:48:12]

#

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.

juhaz [07.08.2005 23:23:00]

#

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ä?

Blaze [08.08.2005 00:02:43]

#

If InStr(komento, "|") <> 0 Then
  'useampi komento, splittaillaan
Else
  'vain yks, suoritetaan se
End If

juhaz [10.08.2005 23:16:57]

#

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.

Metabolix [10.08.2005 23:27:15]

#

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.

juhaz [11.08.2005 00:00:04]

#

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.

FooBat [11.08.2005 00:30:36]

#

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.

Juice [11.08.2005 20:50:53]

#

Javassahan on zip-virrat sisäänrakennettuina, joten jos Java kelpaa, niin voin tekaista :P

EDIT: Tosin sitten FOSin vaatimuksiin tulisi JVM :P

juhaz [11.08.2005 22:09:10]

#

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.

juhaz [13.08.2005 07:19:03]

#

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/cline.zip

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.

juhaz [14.08.2005 07:23:44]

#

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/23392-qb-binary-tallennus

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/wux.zip

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?

juhaz [14.08.2005 11:14:28]

#

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.


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta