Browse Source

first commit

silverweed 8 years ago
commit
5f0e23914f
2 changed files with 404 additions and 0 deletions
  1. 8 0
      Makefile
  2. 396 0
      welcome.hs

+ 8 - 0
Makefile

@@ -0,0 +1,8 @@
+all: welcome
+
+welcome: welcome.hs deps
+	ghc $< -o welcometolcm
+
+deps:
+	cabal update && cabal install hscurses
+	touch deps

+ 396 - 0
welcome.hs

@@ -0,0 +1,396 @@
+-- WelcomeToLCM 2.0 by Giacomo Parolini (jp)
+-- August 2015
+import System.Exit
+import Control.Exception (bracket_)
+import Control.Monad (void)
+import UI.HSCurses.Curses
+import qualified UI.HSCurses.CursesHelper as CH
+
+data ColorScheme = WhiteOnBlack
+                 | GreenOnBlack
+                 | RedOnBlack
+                 | MagentaOnBlack
+                 | CyanOnBlack
+                 | YellowOnBlack
+                 | RedOnBlue
+                 | BlackOnGreen
+                 deriving Enum
+
+data Language = Italian 
+              | English 
+              | NLangs -- keep in last position
+              deriving Enum
+
+data Page = PageTerm
+          | PageDoc
+          | PageInternet
+          | PageDevices
+          | PageRemote
+          | PageLCM
+          | PageAbout
+          | PageSSH
+          | PageSCP
+
+main :: IO ()
+main = bracket_ start endWin welcome
+
+start :: IO ()
+start = do
+        initCurses
+        hasColors <- hasColors
+        if hasColors 
+                then do
+                        startColor
+                        initPair (Pair 1) (CH.white)   (defaultBackground)
+                        initPair (Pair 2) (CH.green)   (defaultBackground)
+                        initPair (Pair 3) (CH.red)     (defaultBackground)
+                        initPair (Pair 4) (CH.magenta) (defaultBackground)
+                        initPair (Pair 5) (CH.cyan)    (defaultBackground)
+                        initPair (Pair 6) (CH.yellow)  (defaultBackground)
+                        initPair (Pair 7) (CH.red)     (CH.blue)
+                        initPair (Pair 8) (CH.black)   (CH.green)
+                        return ()
+                else
+                        return ()
+        keypad stdScr True
+        echo False
+        cursSet CursorInvisible
+        cBreak True
+
+-- Shortcut for mvAddStr
+mas :: Int -> Int -> String -> IO ()
+mas = mvWAddStr stdScr
+
+-- Shortcut for language checking
+lmas :: Language -> Int -> Int -> [String] -> IO ()
+lmas lang row col list = mas row col $ list !! (fromEnum lang)
+
+-- Convenient color setting helper
+setCol :: ColorScheme -> IO ()
+setCol = attrSet attr0 . Pair . (\x -> fromEnum x + 1)
+
+welcome :: IO ()
+welcome = mainScreen English
+
+mainScreen :: Language -> IO ()
+mainScreen lang = do
+        erase
+        printTitle lang
+        printMainList lang 0
+        refresh
+        mainScreen lang
+
+printTitle :: Language -> IO ()
+printTitle lang = do
+        (_, cols) <- scrSize
+        setCol GreenOnBlack
+        lmas lang 1 1 ["BENVENUTO/A IN LCM!", "WELCOME TO LCM!"]
+        setCol CyanOnBlack
+        lmas lang 3 1 ["Se non hai familiarita' con Linux ecco un tutorial sui comandi"
+                      ,"If you're not familiar with Linux, here is a tutorial about the"]
+        lmas lang 4 1 ["piu' importanti che ti troverai ad utilizzare."
+                      ,"most common features you'll need to use."]
+        setCol YellowOnBlack
+        lmas lang 5 1 ["l", "l"]
+        setCol CyanOnBlack
+        case lang of
+                Italian -> wAddStr stdScr ": cambia lingua"
+                English -> wAddStr stdScr ": change language"
+        setCol YellowOnBlack
+        lmas lang 6 1 ["Invio", "Enter"]
+        setCol CyanOnBlack
+        case lang of
+                Italian -> wAddStr stdScr ": seleziona"
+                English -> wAddStr stdScr ": select"
+        setCol YellowOnBlack
+        lmas lang 7 1 ["q", "q"]
+        setCol CyanOnBlack
+        case lang of
+                Italian -> wAddStr stdScr ": esci"
+                English -> wAddStr stdScr ": exit"
+
+-- The list of available pages from main page
+printMainList = printList [(PageTerm,     ["Comandi di base del terminale"
+                                          ,"Basic terminal commands"])
+                          ,(PageDoc,      ["Creare/modificare documenti"
+                                          ,"Create/Edit documents"])
+                          ,(PageInternet, ["Internet"
+                                          ,"Internet"])
+                          ,(PageDevices,  ["Stampante, scanner e chiavette USB"
+                                          ,"Printer, scanner and USB"])
+                          ,(PageRemote,   ["Collegamento remoto: ssh, scp"
+                                          ,"Remote connections: ssh, scp"])
+                          ,(PageLCM,      ["Utilizzo dell'account LCM"
+                                          ,"Using your LCM account"])
+                          ,(PageAbout,    ["Dettagli su questo programma"
+                                          ,"About this program"])]
+
+printList :: [(Page, [String])] -> Language -> Int -> IO ()
+printList pages lang line = do
+        let nLines = length pages
+
+        printLines lang 0 line pages 
+        refresh
+
+        ch <- getCh
+        case ch of
+                KeyChar 'q'  -> exitSuccess
+                KeyChar 'l'  -> let newlang = toEnum $ mod (fromEnum lang + 1) 
+                                                           (fromEnum NLangs)
+                                in do erase
+                                      mainScreen newlang
+                KeyUp        -> printList pages lang $ (line - 1) `mod` nLines
+                KeyDown      -> printList pages lang $ (line + 1) `mod` nLines
+                KeyEnter     -> printInfo lang $ fst $ pages !! line
+                KeyChar '\n' -> printInfo lang $ fst $ pages !! line
+                _ -> return () -- ignore
+
+
+printLines :: Language -> Int -> Int -> [(Page, [String])] -> IO ()
+printLines lang curLine selLine pages = do
+        if curLine == selLine
+                then setCol BlackOnGreen
+                else setCol MagentaOnBlack
+        mas (2*curLine + 9) 3 $ (snd $ pages !! curLine) !! (fromEnum lang)
+        if curLine == length pages - 1
+                then return ()
+                else printLines lang (curLine + 1) selLine pages 
+
+printInfo :: Language -> Page -> IO ()
+printInfo lang page = do
+        erase
+        printPage page
+        refresh
+        void getCh 
+        where 
+        -- moar brevity!
+        l = lmas lang
+
+        printPage :: Page -> IO ()
+        printPage PageTerm = do
+                setCol GreenOnBlack
+                l 1 2 ["COMANDI FONDAMENTALI PER TERMINALE", "BASIC TERMINAL COMMANDS"]
+                setCol CyanOnBlack
+                l 2 2  ["ls : stampa a video il contenuto di una cartella"
+                       ,"ls : print at screen the content of a directory"]
+                l 3 3  ["-> ls -l : per mostrare anche le proprieta' dei file (permessi,owner,size)"
+                       ,"-> ls -l : also show file properties (permissions,owner,size"]
+                l 4 3  ["-> ls -a/A: per mostrare anche i file nascosti (che iniziano con `.')"
+                       ,"-> ls -a/A: also show hidden files (which begin with `.')"]
+                l 6 2  ["cd : cambia la cartella corrente"
+                       ,"cd : change directory"]
+                l 7 3  ["sintassi: cd <percorso>; 'cd ..' per tornare su di un livello"
+                       ,"syntax: cd <path>; 'cd ..' to switch to upper level"]
+                l 9 2  ["cp : copia un file da un percorso ad un altro"
+                       ,"cp : copy a file from a given path to another"]
+                l 10 3 ["sintassi: cp <file_da_copiare> <dove_copiarlo>"
+                       ,"syntax: cp <file_to_copy> <where_to_copy>"]
+                l 11 3 ["e' necessaria la flag -r per copiare delle cartelle."
+                       ,"the flag -r is necessary to copy directories"]
+                l 13 2 ["mv : sposta un file (usato anche per rinominare un file)"
+                       ,"mv : move a file (also used to rename a file)"]
+                l 14 3 ["sintassi: come cp"
+                       ,"syntax: like cp"]
+                l 16 2 ["cat/less : mostra il contenuto di un file"
+                       ,"cat/less : show the content of a file"]
+                l 18 2 ["man : fornisce le istruzioni di utilizzo di un programma"
+                       ,"man : gives the instruction about a program"]
+                l 19 3 ["sintassi: man <nomeprogramma>"
+                       ,"syntax: man <name_program>"]
+                l 21 2 ["ps : mostra i processi attivi (ps aux per la lista completa)"
+                       ,"ps : shows active processes of the terminal (ps aux for complete list)"]
+                l 23 2 ["whoall : mostra tutti gli utenti connessi al cluster"
+                       ,"whoall : shows all users connected to the LCM cluster."]
+                l 25 2 ["IMPORTANTE: . indica la cartella corrente. ~ indica la home."
+                       ,"IMPORTANT: . means the current directory. ~ means the home"]
+
+        printPage PageDoc = do
+                setCol GreenOnBlack
+                l 1 2 ["PROGRAMMI UTILI PER MODIFICARE DOCUMENTI", "UTILITIES TO EDIT DOCUMENTS"]
+                setCol CyanOnBlack
+                l 2 2 ["gedit : apre l'editor di testo (solit. usato per programmare)"
+                      ,"gedit : opens the default text editor (usually used for programming)"]
+                l 4 2 ["libreoffice : apre documenti Word, Excel, PowerPoint, ecc"
+                      ,"libreoffice : opens Word, Excel, PowerPoint, etc documents"]
+                l 6 2 ["evince : apre file .pdf, .dvi, .ps e simili"
+                      ,"evince : opens .pdf files, .dvi, .ps and similar"]
+                l 8 2 ["gimp : apre l'editor di immagini"
+                      ,"gimp : opens the image editor"]
+                l 10 2 ["eog : mostra l'anteprima di un'immagine"
+                       ,"eog : shows an image's preview"]
+                l 12 2 ["vim : apre l'editor di testo da terminale (avanzato)"
+                       ,"vim : opens the console editor (advanced)"]
+
+        printPage PageInternet = do
+                setCol GreenOnBlack
+                l 1 2 ["ANDARE SU INTERNET", "BROWSING THE INTERNET"]
+                setCol CyanOnBlack
+                l 2 2 ["iceweasel/firefox : apre il browser Iceweasel (consigliato)"
+                      ,"iceweasel/firefox : opens the browser Iceweasel (suggested option)"]
+                l 3 3 ["N.B. La cache di Iceweasel viene salvata dentro la directory nascosta"
+                      ,"N.B. Iceweasel's cache is saved in the hidden directory"]
+                l 4 3 ["~/.mozilla/firefox; dopo molto tempo che non viene svuotata, la cache"
+                      ,"~/.mozilla/firefox; after some time passes without being emptied, the cache"]
+                l 5 3 ["puo' arrivare a pesare anche varie centinaia di MB! Se noti che la tua"
+                      ,"can start weighting even several hundreds of MB! If you notice that your"]
+                l 6 3 ["home inizia a pesare molto senza che tu abbia file di grandi dimensioni"
+                      ,"home starts having a huge size without you having big-sized files,"]
+                l 7 3 ["la cosa piu' probabile e' che sia ora di svuotare la cache di Iceweasel."
+                      ,"it is very likely that it's time to cancel Iceweasel's cache."]
+                l 9 2 ["E' possibile (ma sconsigliato, in quanto e' piu' probabile che non siano"
+                      ,"It is possible (but deprecated, because they're less likely to be properly"]
+                l 10 2 ["preconfigurati) usare altri browser, ad esempio chromium, opera o konqueror."
+                       ,"configured) to use alternative browsers, like chromium or konqueror."]
+                l 12 2 ["Se ci sono problemi di browsing, controllare che i proxy siano settati"
+                       ,"If you find browsing problems, make sure your proxys are correctly set."]
+                l 13 2 ["correttamente: *su Iceweasel: Edit->Preferences->Advanced->Network->Settings"
+                       ,"*on Iceweasel: Edit->Preferences->Advanced->Network->Settings"]
+                l 14 2 ["Settare: Automatic proxy configuration URL: http://lcm.mi.infn.it/proxy.pac"
+                       ,"Set: Automatic proxy configuration URL: http://lcm.mi.infn.it/proxy.pac"]
+                l 15 2 ["*su konqueror: Settings->Configure Konqueror->Web Browising->Proxy->Use"
+                       ,"*on konqueror: Settings->Configure Konqueror->Web Browising->Proxy->Use"]
+                l 16 2 ["proxy configuration URL->http://lcm.mi.infn.it/proxy.pac"
+                       ,"proxy configuration URL->http://lcm.mi.infn.it/proxy.pac"]
+                l 17 2 ["*su chromium: da terminale digitare "
+                       ,"*on chromium: type on the terminal: "]
+                l 18 3 ["chromium --proxy-pac-url=http://lcm.mi.infn.it/proxy.pac" 
+                       ,"chromium --proxy-pac-url=http://lcm.mi.infn.it/proxy.pac"]
+
+        printPage PageDevices = do
+                l 2 2 ["La stampante presente in LCM1 e' lcmprinter."
+                      ,"The printer in LCM1 is called lcmprinter."]
+                l 3 2 ["Per stampare un documento via terminale: lpr <nome_documento>"
+                      ,"To print a document via terminal:lpr <file_name>"]
+                l 4 2 ["Per vedere la coda di stampa della stampante: lpq"
+                      ,"To check the printing queue: lpq"]
+                l 6 2 ["Ogni utente di LCM puo' stampare gratuitamente fino a 60 pagine"
+                      ,"Every LCM user can freely print up to 60 pagines per month."]
+                l 7 2 ["al mese. Per vedere le pagine stampate questo mese: cupsami"
+                      ,"To check the number of printed pages this month: cupsami"]
+                l 9 2 ["Per usare lo scanner: xsane"
+                      ,"To use the scanner: xsane"]
+                l 11 2 ["Per montare una chiavetta USB: pmount /dev/sdxY"
+                       ,"To mount an USB device: pmount /dev/sdxY"]
+                l 12 2 ["dove x sta per l'opportuna lettera che identifica il device"
+                       ,"where x is the proper letter which identifies the device"]
+                l 13 2 ["(es. sdb, sdc, ...) e Y sta per il numero della partizione"
+                       ,"(e.g. sdb, sdc, ...) and Y is the partition number of the device"]
+                l 14 2 ["del device (solitamente 1). Il device verra' montato in /media/NOMEDEVICE"
+                       ,"(1 typically). The device will be mounted in /media/NOMEDEVICE"]
+                l 15 2 ["Nota: per conoscere la lettera che identifica la chiavetta, un modo"
+                       ,"Note: to identify the device, a quick method is to call `dmesg`"]
+                l 16 2 ["rapido e' chiamare `dmesg` subito dopo averla pluggata."
+                       ,"immediately after plugging it."]
+
+        printPage PageRemote = printList [(PageSSH, ["SSH (Secure SHell)", "SSH (Secure SHell)"])
+                                         ,(PageSCP, ["SCP (Secure CoPy)", "SCP (Secure CoPy)"])] lang 0
+
+        printPage PageSSH = do
+                setCol GreenOnBlack
+                l 1 2 ["UTILIZZO DI SSH", "SSH USAGE"]
+                setCol CyanOnBlack
+                l 2 2  ["E' possibile collegarsi al proprio account LCM in qualunque"
+                       ,"It is possible to connect to your LCM account anytime"]
+                l 3 2  ["momento e da qualunque posto tramite il protocollo Secure SHell."
+                       ,"from any place using the Secure SHell protocol."]
+                l 5 2  ["Il comando da terminale e' ssh <nome_utente>@lcm.mi.infn.it"
+                       ,"The terminal command is ssh <username>@lcm.mi.infn.it"]
+                l 6 2  ["Aggiungendo la flag -X a ssh e' possibile abilitare l'X-forwarding"
+                       ,"By adding the flag -X to ssh, it is possible to enable X-forwarding"]
+                l 7 2  ["che permette di utilizzare da remoto programmi che richiedono"
+                       ,"which allows the remote use of programs which require a graphical"]
+                l 8 2  ["l'ambiente grafico (come gedit, eog, iceweasel, ...). Si tenga pero'"
+                       ,"environment (like gedit, eog, iceweasel, ...). Remember, though,"]
+                l 9 2  ["presente che tale opzione puo' rallentare anche molto la connessione."
+                       ,"that this option may slow down the connection even heavily."]
+                l 11 2 ["IMPORTANTE: per collegarsi in remoto da Windows e' necessario il"
+                       ,"IMPORTANT: to remotely connect from Windows you'll need the"]
+                l 12 2 ["programma PuTTY (ed e' consigliabile integrarlo a WinSCP, che permette"
+                       ,"program PuTTY (and it is suggested to integrate it to WinSCP, which allows"]
+                l 13 2 ["anche la copia e la gestione di file e cartelle con un'interfaccia"
+                       ,"also to copy and manage files and directories with an intuitive"]
+                l 14 2 ["intuitiva.). Da MacOS o da Linux e' ovviamente sufficiente il normale"
+                       ,"interface.). From MacOS or from Linux clearly you'll just need the "]
+                l 15 2 ["terminale UNIX."
+                       ,"common UNIX terminal."]
+        
+        printPage PageSCP = do
+                setCol GreenOnBlack
+                l 1 2 ["UTILIZZO DI SCP", "SCP USAGE"]
+                setCol CyanOnBlack
+                l 2 2  ["Per trasferire file e cartelle da un computer ad un altro esiste il"
+                       ,"To transfer files or directories from a computer to another, there is the"]
+                l 3 2  ["comando scp. L'utilizzo e' analogo a cp, ma e' necessario specificare"
+                       ,"command scp. The usage is analogous to cp, but it is necessary to specify"]
+                l 4 2  ["l'host su cui (o da cui) si intende trasferire il file."
+                       ,"the host whereto (or wherefrom) you wish to transfer the file."]
+                l 6 2  ["Esempio: copiare un file dall'account LCM al proprio computer:"
+                       ,"Example: to copy a file from your LCM account to your computer:"]
+                l 7 3  ["scp <nome_utente>@lcm.mi.infn.it:<percorso_file> ."
+                       ,"scp <username>@lcm.mi.infn.it:<file_path> ."]
+                l 8 2  ["dove <percorso_file> e' il percorso in cui si trova il file, a partire"
+                       ,"where<file_path> is the complete path where the file is located, starting"]
+                l 9 2  ["dalla propria home (quindi [...].lcm.mi.infn.it:. indica la home)"
+                       ,"from your home (thus [...].lcm.mi.infn.it:. means your LCM home)"]
+                l 11 2 ["Esempio: copiare un file dal proprio computer all'account LCM:"
+                       ,"Example: to copy a file from your computer to your LCM account:"]
+                l 12 3 ["scp <nome_file> <nome_utente>@lcm.mi.infn.it:."
+                       ,"scp <file_path> <username>@lcm.mi.infn.it:."]
+                l 14 2 ["Si ricordi che '.' indica la cartella in cui ci si trova, per cui negli"
+                       ,"Remember that '.' means the current directory, so in the examples above"]
+                l 15 2 ["esempi sopra abbiamo copiato nel primo caso nella cartella del computer"
+                       ,"we have copied respectively in the home of the current computer and"]
+                l 16 2 ["in cui ci trovavamo, e nel secondo nella home dell'account LCM. E'"
+                       ,"in the LCM account's home. Obviously, it is possible to change this `.'"]
+                l 17 2 ["ovviamente possibile modificare questo '.' con il percorso desiderato."
+                       ,"with the desired path. Remember the flag -r to copy directories."]
+                l 18 2 ["Si ricordi anche che per copiare cartelle e' necessaria la flag -r."
+                       ,""]
+
+        printPage PageLCM = do
+                setCol GreenOnBlack
+                l 1 2 ["UTILIZZO DELL'ACCOUNT LCM", "USING YOUR LCM ACCOUNT"]
+                setCol CyanOnBlack
+                l 2 2  ["L'account LCM e' strettamente personale e non puo' essere prestato a terzi."
+                       ,"Your LCM account is strictly personal and cannot be leased to others."]
+                l 4 2  ["Esso dura 3 anni a partire dal giorno della creazione dello stesso."
+                       ,"Its duration is 3 years from the day of creation."]
+                l 5 2  ["Trascorso questo periodo e' possibile richiedere il rinnovo dell'account"
+                       ,"After 3 years, it is possible to ask for an account renewal to the LCM staff."]
+                l 6 2  ["allo staff di LCM."
+                       ,"Every user has a disposable disk usage limit of 800 MB. It is possible to exceed"]
+                l 8 2  ["Lo spazio a disposizione per ogni utente e' di 800 MB. E' possibile sforare"
+                       ,"this limit up to 1.3 GB for a maximum period of 2 weeks, after which the extra"]
+                l 9 2  ["questo limite fino a 1.3 GB per non piu' di 2 settimane, dopodiche' il"
+                       ,"content will be deleted."]
+                l 10 2 ["contenuto in eccesso verra' cancellato."
+                       ,"To precisely monitor the disk usage: ncdu (from your home)"]
+                l 11 2 ["Per monitorare con precisione lo spazio utilizzato: ncdu (nella home)"
+                       ,""]
+                l 13 2 ["E' MOLTO IMPORTANTE controllare periodicamente la mail di lcm (creata assieme"
+                       ,"It is VERY IMPORTANT to check the lcm mail periodically (which is created along"]
+                l 14 2 ["all'account: <nome_utente>@lcm.mi.infn.it), perche' e' l'unico mezzo di"
+                       ,"with the account: <username>@lcm.mi.infn.it), because it is the only way of"]
+                l 15 2 ["comunicazione tra lo staff e l'utenza."
+                       ,"communication between the staff and the users."]
+                l 17 2 ["E' possibile impostare una redirezione dalla mail di lcm ad una propria mail"
+                       ,"It is possible to set a mail forwarding to another mail via the hidden file"]
+                l 18 2 ["tramite il file nascosto ~/.qmail. Sintassi: &<nome_mail_a_cui_redirigere>"
+                       ,"~/.qmail. Syntax: &<mail_where_to_forward>"]
+                
+        printPage PageAbout = do
+                setCol GreenOnBlack
+                l 1 2 ["INFO SU QUESTO PROGRAMMA", "ABOUT THIS PROGRAM"]
+                setCol WhiteOnBlack
+                l 2 2 ["welcometolcm 2.0", "welcometolcm 2.0"]
+                l 3 2 ["Creato il: 4 Set 2015 (jp)", "Created on: 4 Sep 2015 (jp)"]
+                l 4 2 ["Ultima modifica: 4 Set 2015 (jp)", "Last Modified: 4 Set 2015 (jp)"]
+                setCol CyanOnBlack
+                l 6 2  ["Questo programma viene eseguito di default durante il primo login"
+                       ,"This program is executed by default during the first login"]
+                l 7 2  ["e in generale quando il file ~/.welcome non esiste."
+                       ,"and whenever the hidden file ~/.welcome does not exist."]
+                l 9 2  ["E' possibile disabilitare permanentemente il lancio del programma"
+                       ,"It is possible to permanently disable the program execution"]
+                l 10 2 ["modificando il proprio ~/.bashrc a piacimento."
+                       ,"by editing your ~/.bashrc."]