Aktualności:

Nasza strona na Facebooku - poleć znajomym.

Menu główne

mindc

Zaczęty przez mindc, 05 Wrzesień 2008, 18:45

mindc

nick: mindc / panther
imię: Paweł
urodzony: 30 marca 1978
skąd: Szczytno (warmińsko-mazurskie)
zawód wyuczony: radioelektronik
zawód wykonywany: administrator sieci
zainteresowania: ułatwianie sobie życia skryptami, grafika, szeroko pojęte dłubanie w kompach (hardware i software), sporadycznie AVR (asembler)
ulubione gry: DeusEx, Hitman 2, Diablo II, Quake III Arena, CS/CSS, saga Homeworld, Dragon Age, Cabal Online, BattleForge... a ostatnio EVE Online
www: http://mindc.net

Swoją przygodę z liczeniem rozproszonym rozpocząłem w drugiej połowie 1999 roku.
Na ustach wszystkich było SETI, każdy chciał coś policzyć więc i ja.
Odkrycie, że przy wyłączeniu graficznego wygaszacza, próbki liczą się trzy razy szybciej, było porażające :D

W 2000 roku, moje liczenie wygasło śmiercią naturalną...

długo, długo nic.......................

W 2006 roku, szukałem czegoś, co mogłoby wygrzać kompa no i przypomniałem sobie o SETI. Po kilku latach
przerwy, odkryłem BOINC. Po testach, zapuściłem SETI na trzech trupowatych kompach. Szybko przestałem liczyć na domowym kompie, no bo już się wygrzał :D, a trupy liczyły sobie dalej.....

W kwietniu 2008, przypomniałem sobie o SETI, z dorobkiem 50000 punktów, ponownie zacząłem liczyć.
Tak sobie liczyłem, liczyłem, doszedłem do ok. 200000 punktów i zostałem zaproszony, właśnie do BOINC@Poland...

No i tak liczę do dzisiaj...

SETI - coraz mniej, stwierdziłem, że to projekt dla samego liczenia, ale sentyment pozostał...
POEM - zaczęło się od 'projektu miesiąca' w drużynie, dobiłem tak do 1M. Teraz liczę od czasu do czasu...
Cosmology - również zaczęło się od 'projektu miesiąca', jednak w tamtym okresie Cosmo zaczęło mieć problemy, i zacząłem szukać innych projektów...
PrimeGrid - lubię cyferki...
MilkyWay - odkryłem duży RAC, ale po nastaniu ery liczących GPU i zawirowaniach z optymalkami - odpuściłem sobie...

Obecnie liczę nasze AP26 (PrimeGrid) oraz Collatz Conjecture

AP26 znaleziono, więc teraz przyszła pora na SZTAKI, projekt w sam raz na moje kompy-trupy....

FreeHAL - dużo punktów za nic... - jak na razie "projekt" ma "przerwę" ;)

AQUA - chcę dobić do 1M...

Ostatnio zająłem się WEP-M+2 Project...

Resztę widać tu:


W międzyczasie skrobnąłem tutorial o robieniu własnych statystyk BOINC z RRDTool

Pozdrawiam



domowa radiówka:




stasieks

Fajnie napisane. No i zdjecie jest !!

Pozdrawiam z Poznania.

emik

w mojej wizytówce też jest zdjęcie ;D


Pigu

witam serdecznie kamrrrata na pokładzie

AiDec

#4
Witam serdecznie kolege z podobnymi zainteresowaniami (znaczy sie zainteresowanego dobrym RAC`em  :P  ;D ). Punkciki, punkciki... ;D



Bo jest paru kumpli :),
Bo jest parę w życiu dobrych chwil...


Moja wizytowka i sygnaturka

Troll81


mindc

#6
Moje zabawy z RRDtool...




kempler


Kury Nas pogryzą, Raptory zeżrą....

emik

może byś zamieścił jakąś instrukcję jak wykonać sobie samemu takie ładne wykresiki ;D


mindc

#9
UWAGA: Informacje o RRDTool są przedawnione, odsyłam do aktualnej wersji

Tutorial/gotowiec: własne wykresy BOINC RAC i Total Credits

Wykresy są generowane pod Linuxem, o porcie na Windows może kiedyś pomyślę :)
Służę pomocą, gdyby ktoś to chciał odpalić u siebie.

potrzebujemy:
- maszyny z Linuxem
- uruchomiony BOINC z podpiętymi projektami jakie chemy mieć na wykresach
- działającego RRDtoola
- Perl zawsze się znajdzie + moduł RRDs + XML::Simple

Projekty, których nie chcemy liczyć na tej maszynie, ustawiamy na 'no new tasks'.
BOINC robi za nas najważniejszą robotę, czyli pobiera aktualne dane o punktach i RAC bezpośrednio z
projektów i zapisuje sobie to wszystko w plikach xml. Podpinamy pod crona skrypt (u siebie ustawiłem co 26 minut),
który nam będzie wymuszał aktualizację projektów. Najprostszy skrypt do aktualizacji:


#!/bin/bash

BOINCDIR=/sciezka/do/BOINC
cd $BOINCDIR
for PROJECT in `command ls -1 $BOINCDIR/projects | tr _ /`;do
./boinc_cmd --project http://$PROJECT update
done


Gdy już mamy samoaktualizującego się BOINCa, wystarczy, że co pewien czas (u mnie cron, co 10 minut)
uruchomimy zamieszczony poniżej skrypt w Perlu.
(chciałbym dodać, że nie jestem z wykształcenia programistą i przepraszam za jakość kodu,
ja po prostu piszę sobie skrypty i np.: komentarze wstawiłem dopiero teraz :) )


#!/usr/bin/perl -w

use strict;
use warnings;
use XML::Simple;
use POSIX qw(strftime);
use lib qw( /ścieżka/do/katalogu/z/modułem/RRDs );
use RRDs;

my $BOINC_DIR = '/scieżka/do/BOINC';
my $BOINC_CMD = $BOINC_DIR.'/boinc_cmd';
my $WORKDIR = '/ściezka/do/katalogu/z/plikami/rrd';

chdir $BOINC_DIR;
opendir my $dh, 'projects';
my $dir = [ ];
@$dir = readdir($dh); # pobieramy listę projektów

my $timestamp = time;
my $ftime = strftime('%Y-%m-%d %H\:%M\:%S %Z',localtime($timestamp)); # stopka na wykresie

# ogólny wygląd wykresu
my @graph_defaults = (
"--slope",
"--font=DEFAULT:6:$WORKDIR/fleftex.ttf", # tu użyłem niestandardowej czcionki, więc w przypadku jej braku wykres rozjedzie się
"--width=269",
"--height=269",
"--lower-limit=0",
"--units=si",
"--rigid",
"--color=BACK#ffffff00",
"--color=CANVAS#ffffff00",
"--color=AXIS#000000",
"--color=FONT#000000",
"--color=MGRID#00000030",
"--color=GRID#00000020",
"--color=SHADEA#F5F5F500",
"--color=SHADEB#F0F0F000",
"--color=ARROW#000000",
);

my $projects = {};
my $totals = {};

foreach ( @$dir ) { # przetwarzamy każdy z projektów
    next if m'^\.';
    print "$_...\n";

    unless ( -r "$WORKDIR/$_.rrd" ) { # tworzymy jednorazowo bazę dla konkretnego projektu
        RRDs::create "$WORKDIR/$_.rrd","--start=now-30d",
            "--step=3600",
            "DS:user_total_credit:GAUGE:86400:0:U",
            "DS:user_expavg_credit:GAUGE:86400:0:U",
            "RRA:LAST:0.5:1:20000",
            ;
    }
   
    # czytamy dane z plików xml
    my $account = read_xml("$BOINC_DIR/account_${_}.xml");
    my $statistics = read_xml("$BOINC_DIR/statistics_${_}.xml");

    # wyciągamy interesujące nas dane
    $projects->{$_}{user_total_credit} = $statistics->{daily_statistics}[-1]{user_total_credit};
    $projects->{$_}{user_expavg_credit} = $statistics->{daily_statistics}[-1]{user_expavg_credit};

    $totals->{user_total_credit} += $projects->{$_}{user_total_credit};
    $totals->{user_expavg_credit} += $projects->{$_}{user_expavg_credit};
   
    # w którymś z projektów 'projekt_name' okazał się pusty przez jakiś czas
    # więc zatąpiłem go urlem
    $projects->{$_}{name} = $account->{project_name} || $account->{master_url};

    # aktualizujemy bazę
    RRDs::update ( "$WORKDIR/$_.rrd","$timestamp:$projects->{$_}{user_total_credit}:$projects->{$_}{user_expavg_credit}");
    if ( my $err = RRDs::error ) {print "update: $err\n"}
}

# tablica z kolorami dla projektów
# zawartoś tablicy to np.: [ 'FF0000' , 'FF9900' ... ] czyli mozna sobie ustawić kolory wedle upodobań
my @colors;
my $total = keys %$projects;
for ( my $i = 0;$i < $total;$i++ ) {
    push @colors,hsv2rgb($i/$total*360,1,1);
}

# sortujemy wykres po RAC
my @prosort = sort { $projects->{$b}{user_expavg_credit} <=> $projects->{$a}{user_expavg_credit} } keys %$projects;

# lub po nazwie projektu
#my @prosort = sort { uc($projects->{$a}{name}) cmp uc($projects->{$b}{name}) } keys %$projects;

# maksymalna wysokość wykresu
$totals->{user_total_credit} *= 1.05;
$totals->{user_expavg_credit} *= 1.05;

# tworzymy wykresy
foreach my $target ( qw (user_total_credit user_expavg_credit) ) {
    do_graph($target);
}

exit;

# wykres
sub do_graph {
    my $target = shift;
    my $i = 0;
    my $title;

    my @graphs;
    my @stack;

    foreach my $project ( @prosort ) {
        (my $project_name = $projects->{$project}{name}) =~ s/:/\\:/g; # gdy w nazie projektu pojawi się ':' musimy go 'poprawić'
        push @stack,"$target$i"; # ustawiamy odpowiednie nazwy zmiennych dla wyrażeń RPN

        if ( $target eq 'user_expavg_credit') {
            $title = 'boinc racs';
            push @graphs,
                "DEF:$target$i=$WORKDIR/$project.rrd:$target:LAST",
                "AREA:$target$i#$colors[$i]:$project_name ".'.' x (41 - length($projects->{$project}{name})).":STACK",
                "GPRINT:$target$i:LAST:%8.2lf\\n";
        }

        if ( $target eq 'user_total_credit' ) {
            $title = 'boinc totals';
            push @graphs,
                "DEF:$target$i=$WORKDIR/$project.rrd:$target:LAST",
                "AREA:$target$i#$colors[$i]:$project_name ".'.' x (36 - length($projects->{$project}{name})).":STACK",
                "GPRINT:$target$i:LAST:%11.2lf\\n";
        }
        $i++;
    }

    if ( $target eq 'user_expavg_credit' ) {
        push @graphs,
            "COMMENT: \\n",
            "--upper-limit=$totals->{user_expavg_credit}",
            "CDEF:total=".join(',', @stack).',+' x (@stack - 1),
            "GPRINT:total:LAST:TOTAL ".'.' x (43 - length('total'))." %9.2lf\\n";
    }

    if ( $target eq 'user_total_credit' ) {
        push @graphs,
            "COMMENT: \\n",
            "--upper-limit=$totals->{user_total_credit}",
            "CDEF:total=".join(',', @stack).',+' x (@stack - 1), # sumujemy dane z wszystkich projektów
            "GPRINT:total:LAST:TOTAL ".'.' x (38 - length('total'))."  %11.2lf\\n";
    }

    RRDs::graph "$WORKDIR/$target.png",
        "--title=$title",
        "--start=1215129600", # start wykresów
        @graph_defaults,
        @graphs,
        "COMMENT: \\n",
        "COMMENT:generated \@ $ftime\\r",
        ;
    if ( my $err = RRDs::error ) {print "graph:$target: $err\n"}
}

# czytanie plików xml
sub read_xml {
    my $path = shift;
    my $content = XMLin( $path, ForceArray => ['daily_statistics'],  SuppressEmpty => 1, NormalizeSpace => 2, KeyAttr => '', );
    return $content;
}

sub dec2hex {
    return sprintf "%02x",int shift;
}

# dla łatwego rysowania 'tęczy', wykorzystałem funkcję zamieniającą model kolorów HSV na RGB
# źródło: wiki :)
sub hsv2rgb {
    my ($h,$s,$v) = @_;
    my $hi = int($h/60) % 6;
    my $f = $h/60 - int($h/60);
    my $p = $v * (1 - $s);
    my $q = $v * (1 - $f * $s);
    my $t = $v * (1 - (1 - $f) * $s);

    for ($v,$t,$p,$q) {
        $_ *= 255;
        $_ = dec2hex($_);
    }

    return "$v$t$p" if $hi == 0;
    return "$q$v$p" if $hi == 1;
    return "$p$v$t" if $hi == 2;
    return "$p$q$v" if $hi == 3;
    return "$t$p$v" if $hi == 4;
    return "$v$p$q" if $hi == 5;
}


To chyba wszystko. Uwagi/sugestie mile widziane.

Pozdrawiam


Mori

Gdybyś jednak przerobił to tak, by można było podawać własne XMLe z wartościami... Wtedy nie potrzeba było maszyny z BOINCem, a jedynie pobierać odpowiednie dane z HTTP, co nie jest trudne. Najchętniej widziałbym w ogóle oddzielenie modułu do pobierania danych i samego rysowania wykresu.

+ przerobienie tego na PHP i wykorzystanie czegokolwiek, co w PHP grafikę rysuje.

Uhm, i takie pytanie: nie wiem jak w Perlu, ale AFAIR w PHP readdir zwracał także . i .. - pozbywasz się ich gdzieś?

PS. Pokazałbyś gdzieś jakiś własny przykład danych z jednego projektu, jakie dostarczasz do RRD? Jak to wygląda?

mindc

Cytat: Mori w 20 Wrzesień 2008, 13:13
Gdybyś jednak przerobił to tak, by można było podawać własne XMLe z wartościami... Wtedy nie potrzeba było maszyny z BOINCem, a jedynie pobierać odpowiednie dane z HTTP, co nie jest trudne. Najchętniej widziałbym w ogóle oddzielenie modułu do pobierania danych i samego rysowania wykresu.

hmmm... rzeczywiście, jak dojde do tego, jak odczytywać pewne dane bezpośrednio z serwera projektu, być może przerobie skrypt.
Z drugiej strony, wystarczy, że do maszyny dodam projekt i już niczym nie muszę się martwić, reszta robi się automatycznie

Cytat
+ przerobienie tego na PHP i wykorzystanie czegokolwiek, co w PHP grafikę rysuje.

PHP wykorzystuję do totalnie innych rzeczy, ale sie domyślam do czego bijesz. Nie każdy ma dostęp do powłoki
ale sporo osób do własnego www+php ma :)
A jesli chodzi o grafikę, to jest chyba moduł RRD pod PHP, rysowanie tego od zera, dla mnie mija się z celem.
Dlatego wybrałem RRD, zbieranie danych + reprezentacja graficzna w jednym.

Cytat
Uhm, i takie pytanie: nie wiem jak w Perlu, ale AFAIR w PHP readdir zwracał także . i .. - pozbywasz się ich gdzieś?

tak :) tutaj:
next if m'^\.';
nazwy projektów nie zaczynaja się od kropek, więc mogłem sobie to uprościć

Cytat
PS. Pokazałbyś gdzieś jakiś własny przykład danych z jednego projektu, jakie dostarczasz do RRD? Jak to wygląda?

nie wiem czy dokładnie o to Ci chodzi...
w pliku np.: statistics_boinc.fzk.de_poem.xml
mamy fragment

    <daily_statistics>
        <day>1221868800.000000</day>
        <user_total_credit>461808.409442</user_total_credit>
        <user_expavg_credit>3920.411788</user_expavg_credit>
        <host_total_credit>0.000000</host_total_credit>
        <host_expavg_credit>0.000000</host_expavg_credit>
    </daily_statistics>


wyciagam z tego dane, takie jakie są i wrzucam do RRD


RRDs::update ( '/home/panther/boinc/boinc.fzk.de_poem.rrd', '1221910380:461808.409442:3920.411788' );





Mori

Cytat: mindc w 20 Wrzesień 2008, 13:46hmmm... rzeczywiście, jak dojde do tego, jak odczytywać pewne dane bezpośrednio z serwera projektu, być może przerobie skrypt.
Z drugiej strony, wystarczy, że do maszyny dodam projekt i już niczym nie muszę się martwić, reszta robi się automatycznie

Niby tak - ale dużo łatwiej byłoby podać tylko user/pass, a potem żeby skrypt sam łączył się po kolei z wszystkimi projektami, próbował się zalogować... Jak jest konto - dodaje je do bazy. Jak nie ma - to nie ma.

A potem by tylko z tych serwerów, gdzie konto jest, pobierał dane.

CytatPHP wykorzystuję do totalnie innych rzeczy, ale sie domyślam do czego bijesz. Nie każdy ma dostęp do powłoki ale sporo osób do własnego www+php ma :)

No więc właśnie. Poza tym chyba 'pijesz' ;) Chociaż ja abstynent akurat jestem.

CytatA jesli chodzi o grafikę, to jest chyba moduł RRD pod PHP, rysowanie tego od zera, dla mnie mija się z celem.
Dlatego wybrałem RRD, zbieranie danych + reprezentacja graficzna w jednym.

Są gotowe klasy do rysowania w PHPie. Poza tym żadne tam rysowanie od zera - dość podobne rzeczy, jakie robisz teraz, robić trzeba będzie w PHPie.

Cytattak :) tutaj:
next if m'^\.';
nazwy projektów nie zaczynaja się od kropek, więc mogłem sobie to uprościć

Ha, wiedziałem xD BTW. Dżizaz, co za składnia... Tragedia. Jak człowiek ma rozumieć to:
m' [tu regexp] '
:/ Chyba jednak najpierw się za Pythona wezmę, nie za Perla...

Cytatnie wiem czy dokładnie o to Ci chodzi...
w pliku np.: statistics_boinc.fzk.de_poem.xml
mamy fragment

    <daily_statistics>
        <day>1221868800.000000</day>
        <user_total_credit>461808.409442</user_total_credit>
        <user_expavg_credit>3920.411788</user_expavg_credit>
        <host_total_credit>0.000000</host_total_credit>
        <host_expavg_credit>0.000000</host_expavg_credit>
    </daily_statistics>


wyciagam z tego dane, takie jakie są i wrzucam do RRD


RRDs::update ( '/home/panther/boinc/boinc.fzk.de_poem.rrd', '1221910380:461808.409442:3920.411788' );


Tak, o to. W takim razie staty będą działać tylko od momentu rozpoczęcia pobierania danych i wszystko na tych aktualkach się będzie opierać... Szkoda. Myślałem, że można gdzieś dostać historię tego...

PS. Jak serwer nie wygenerował nowych statystyk za dany dzień to day i tak się update'uje? Poza tym co 10 minut to chyba jest jednak za często - nie lepiej robić to raz na 12/24h? Koniec końców day i tak pewnie raz tylko aktualizują, więc czy nie kończy się to tylko xxx wpisami z tym samym timestamp'em w pliku .rrd?

PS. Pokazałbyś jakiś plik .rrd, o ile to tekst.

mindc

#13
Cytat: Mori w 20 Wrzesień 2008, 14:17
(...) ale dużo łatwiej byłoby podać tylko user/pass, a potem żeby skrypt sam łączył się po kolei z wszystkimi projektami, próbował się zalogować... Jak jest konto - dodaje je do bazy. Jak nie ma - to nie ma.
A potem by tylko z tych serwerów, gdzie konto jest, pobierał dane.

jasne, próbowałem własnie wbić się na serwer POEM, wrzucając mu te same dane co wysyła BOINC ( kopiuj/wklej z tcpdumpa :) )
no i otrzymuję

<scheduler_reply>
<scheduler_version>603</scheduler_version>
<master_url>http://boinc.fzk.de/poem/</master_url>
<request_delay>7.000000</request_delay>
<message priority="low">Error in request message: no end tag </message>
<project_name>Poem@Home</project_name>
</scheduler_reply>


mimo że przejrzałem, czy gdzieś literówki nie ma w zapytaniu, niestety dalej to samo

CytatSą gotowe klasy do rysowania w PHPie. Poza tym żadne tam rysowanie od zera - dość podobne rzeczy, jakie robisz teraz, robić trzeba będzie w PHPie.
brrr... ;)

Cytat
Cytattak :) tutaj:
next if m'^\.';
Ha, wiedziałem xD BTW. Dżizaz, co za składnia... Tragedia. Jak człowiek ma rozumieć to:
m' [tu regexp] '
:/ Chyba jednak najpierw się za Pythona wezmę, nie za Perla...
ja to jeszcze piszę kulturalnie, częściej znajdziesz tak:
next if /^\./;

Cytat(...) W takim razie staty będą działać tylko od momentu rozpoczęcia pobierania danych i wszystko na tych aktualkach się będzie opierać... Szkoda. Myślałem, że można gdzieś dostać historię tego...
tak jak piszesz, ale historię mozna wyciągnąć (chyba) tylko z BOINCStats i pochodnych

Cytat
PS. Jak serwer nie wygenerował nowych statystyk za dany dzień to day i tak się update'uje? Poza tym co 10 minut to chyba jest jednak za często - nie lepiej robić to raz na 12/24h? Koniec końców day i tak pewnie raz tylko aktualizują, więc czy nie kończy się to tylko xxx wpisami z tym samym timestamp'em w pliku .rrd?

W teorii. Dane na dany dzień aktualizowane są na bierząco, jak tylko przydzielą kredyty za próbkę. Więc wpis dla danego dnia także się aktualizuje. Dopiero jak juz dzień się skończy, zostają dane z ostatniej aktualizacji w poprzednim dniu.

Cytat
PS. Pokazałbyś jakiś plik .rrd, o ile to tekst.

Niestety, to są binarki. Ale w samym pakiecie od RRD jest narzędzie do dump/restore w wyniku możemy zrzucić dane do pliku xml, podłubac w nich trochę i z powrotem zobić plik rrd.
Fragmenty pliku po dumpie:

<!-- Round Robin Database Dump --><rrd> <version> 0003 </version>
        <step> 3600 </step> <!-- Seconds -->
        <lastupdate> 1221400022 </lastupdate> <!-- 2008-09-14 15:47:02 CEST -->
        <ds>
                <name> user_total_credit </name>
                <type> GAUGE </type>
                <minimal_heartbeat> 86400 </minimal_heartbeat>
                <min> NaN </min>
                <max> NaN </max>
                <!-- PDP Status -->
                <last_ds> 438524.957450 </last_ds>
                <value> 1.2375169071e+09 </value>
                <unknown_sec> 0 </unknown_sec>
        </ds>

<!-- Round Robin Archives -->   <rra>
                <cf> LAST </cf>
                <pdp_per_row> 1 </pdp_per_row> <!-- 3600 seconds -->
                <params>
                <xff> 5.0000000000e-01 </xff>
                </params>
                <cdp_prep>
                        <ds>
                        <primary_value> 4.3826351904e+05 </primary_value>
                        <secondary_value> NaN </secondary_value>
                        <value> NaN </value>
                        <unknown_datapoints> 0 </unknown_datapoints>
                        </ds>
                        <ds>
                </cdp_prep>
                <database>
                        <!-- 2003-03-25 15:00:00 CET / 1048600800 --> <row><v> NaN </v><v> NaN </v><v> NaN </v></row>
                        <!-- 2003-03-25 16:00:00 CET / 1048604400 --> <row><v> NaN </v><v> NaN </v><v> NaN </v></row>

                        <!-- 2008-09-14 11:00:00 CEST / 1221382800 --> <row><v> 4.3789903405e+05 </v><v> 3.9287622463e+03 </v><v> NaN </v></row>
                        <!-- 2008-09-14 12:00:00 CEST / 1221386400 --> <row><v> 4.3804409243e+05 </v><v> 3.9327159951e+03 </v><v> NaN </v></row>
                        <!-- 2008-09-14 13:00:00 CEST / 1221390000 --> <row><v> 4.3816961994e+05 </v><v> 3.9232498000e+03 </v><v> NaN </v></row>
                        <!-- 2008-09-14 14:00:00 CEST / 1221393600 --> <row><v> 4.3817514456e+05 </v><v> 3.9120825319e+03 </v><v> NaN </v></row>
                        <!-- 2008-09-14 15:00:00 CEST / 1221397200 --> <row><v> 4.3826351904e+05 </v><v> 3.9002132229e+03 </v><v> NaN </v></row>
                </database>
        </rra>
</rrd>




buninek

Cytat: mindc w 20 Wrzesień 2008, 15:07
jasne, próbowałem własnie wbić się na serwer POEM, wrzucając mu te same dane co wysyła BOINC ( kopiuj/wklej z tcpdumpa :) )

curl ewentualnie wget bez problemu pobiorą dane z serwera (o ile będzie on dostępny)

Swoją drogą i tak skrypt spełnia swoje podstawowe zadanie, prezentację za okres dłuźszy niż 60 dni.

mindc

Cytat: buninek w 20 Wrzesień 2008, 15:51
Cytat: mindc w 20 Wrzesień 2008, 15:07
jasne, próbowałem własnie wbić się na serwer POEM, wrzucając mu te same dane co wysyła BOINC ( kopiuj/wklej z tcpdumpa :) )

curl ewentualnie wget bez problemu pobiorą dane z serwera (o ile będzie on dostępny)

tu nie chodzi o pytanie 'czym' (do testowania używam echo "<scheduler_request><tu testowe dane></scheduler_request>" | lynx --source --post_data http://boinc.fzk.de/poem_cgi/cgi), tylko 'jak skonstruować zapytanie do serwera, żeby zwrócił dane które potrzebuje.'
szukam dalej...


buninek

#16
curl -A "Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)" -d "email_addr=buninek%40gmail.com&passwd=moje_haslo" -s --cookie cookies -L --url http://www.cosmologyathome.org/login_action.php > cosmo_moje_konto.html
lub -o cosmo_moje_konto.html lub | sed | grep | awk ...

EDIT:
Wypadałoby się jeszcze wylogować ;)
curl to potężne narzędzie w rękach osób znających dobrze protokół http, php.
Ma multum zastosowań. Można nawet nim pobrać pocztę przez www.

Ciekawostka dla webasterów.
echo "scale=4;`curl -s -o /dev/null -w '%{time_starttransfer}-%{time_pretransfer}' http://www.boincatpoland.org/smf`"| sed 's/,/\./g' | bc
Mierzy czas reakcji strony od momentu połączenia do rozpoczęcia transferu

Czas reakcji http://www.boincatpoland.org/smf
u mnie wyszło 0.152s.
dla przykładu http://forum.pclab.pl
prawie 1s

mindc

fajnie, u mnie
http://www.boincatpoland.org/smf : 0.054s
http://forum.pclab.pl : 0.174s

Tylko co mi z tego, że się zaloguję na stronę? Potrzebuję się wbić do schedulera.


buninek

w czym problem?
nie znasz swojego userid?

mindc

#19
nawet jak mu wyślę to co sam BOINC wysyła, czyli np.: zawartość pliku sched_request_www.ps3grid.net.xml, to dostaję w odpowiedzi

<scheduler_reply>
<scheduler_version>603</scheduler_version>
<master_url>http://www.ps3grid.net/</master_url>
<request_delay>31.000000</request_delay>
<message priority="low">Error in request message: no end tag </message>
<project_name>PS3GRID</project_name>
</scheduler_reply>


a plik xml jest ok, nie wiem gdzie szukać haczyka


mindc

#20
ok, znalazłem ten haczyk :)
Całe oprogramowanie BOINC: klient, core i serwer nie korzystają z normalnego parsera xml, tylko z prostego wyszukiwania ciągu znaków i zapis:

<scheduler_request>
   <authenticator>aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa</authenticator>
</scheduler_request>

jest poprawny, ale

<scheduler_request><authenticator>aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa</authenticator></scheduler_request>

już nie  :o



na podstawie zebranych obserwacji, wyklepałem taki o to kod:

#!/usr/bin/perl -w

use strict;
use Digest::MD5 qw(md5_hex);
use XML::Simple;
use Data::Dumper;
use LWP::UserAgent;

# główne dane do kont
my $global_email = 'glowny@email';
my $global_passwd = 'glowne.haslo;

# lista projektów, z ktorych chcemy pobierać dane
my $projects = [
    ['http://milkyway.cs.rpi.edu/milkyway/','altrenatywny@email.com','alternatywne.haslo'],
    ['http://boinc.fzk.de/poem/'],
    ['http://www.ps3grid.net/'],
    ['http://www.primegrid.com'],
    ['http://setiweb.ssl.berkeley.edu/beta/'],
    ['http://setiathome.berkeley.edu/'],
];

my $ua = LWP::UserAgent->new;
$ua->timeout(10);

my $out = {};

# mielimy każdy projekt z osobna
foreach my $project ( @$projects ) {
    if (   (my $authenticator = lookup_account($project->[0],$project->[1],$project->[2]))
        && (my $scheduler_url = get_scheduler_url($project->[0]))) {

        # wysyłamy zapytanie do schedulera
        # w większości projektów nie trzeba podawać wersji klienta
        # ale POEM wymagał tego
        my $req = HTTP::Request->new(POST => $scheduler_url );
        $req->content_type('application/x-www-form-urlencoded');
        $req->content("<scheduler_request>\n<authenticator>$authenticator</authenticator>
            <core_client_major_version>6</core_client_major_version>
            <core_client_minor_version>2</core_client_minor_version>
            <core_client_release>18</core_client_release>
            </scheduler_request>
            ");
        my $res = $ua->request($req);

        my $schdres;
        if ( $res->is_success ) {
            $schdres = XMLin($res->content);
        } else {
            warn "error: $project->[0]: ",$res->status_line,"\n";
            next;
        }

        # agregacja wyników
        push @{$out->{projects}{project}},{
                        project_url => $schdres->{master_url},
                        project_name => $schdres->{project_name},
                        user_total_credit => $schdres->{user_total_credit},
                        user_expavg_credit => $schdres->{user_expavg_credit},
        };
    }
}

# wypluwamy na wyjście xmla
print XMLout($out,NoAttr => 1,KeepRoot => 1);
exit;

sub lookup_account {
    my ($url,$email,$passwd) = @_;

    # gdy nie podamy alternatywnych parametrów do konta
    # przyjmowane są globalne
    $email = $global_email unless $email;
    $passwd = $global_passwd unless $passwd;

    # pobieramy uid
    my $req = HTTP::Request->new( GET => "$url/lookup_account.php?email_addr=$email&passwd_hash=@{[md5_hex($passwd.$email)]}" );
    my $res = $ua->request($req);
    if ( $res->is_success ) {
        my $lookupres = $res->content;
        # sprawdzamy czy nie było jakiegoś błędu, lub po prostu brak konta
        if ( $lookupres =~ m'<error_msg>(.*)</error_msg>' ) {
            warn "error: $url: $1\n";
            return 0;
        } else {
            return XMLin($lookupres)->{authenticator};
        }
    } else {
        warn "error: $url: ",$res->status_line,"\n";
        return 0;
    }
}

sub get_scheduler_url {
    my $url = shift;
    my $scheduler_url;
    my $req = HTTP::Request->new( GET => $url );
    my $res = $ua->request($req);

    if ( $res->is_success ) {
        # szukanie na głównej stronie projektu adresu schedulera
        ($scheduler_url) = $res->content =~ m'<scheduler>\s*(.*?)\s*</scheduler>';
        return $scheduler_url if $scheduler_url;
        return 0;
    } else {
        warn "error: $url: ",$res->status_line,"\n";
        return 0
    }
}


po uruchomieniu otrzymujemy...


<projects>
  <project>
    <project_name>Milkyway@home</project_name>
    <project_url>http://milkyway.cs.rpi.edu/milkyway/</project_url>
    <user_expavg_credit>21331.856267</user_expavg_credit>
    <user_total_credit>1395576.115154</user_total_credit>
  </project>
  <project>
    <project_name>Poem@Home</project_name>
    <project_url>http://boinc.fzk.de/poem/</project_url>
    <user_expavg_credit>3855.326193</user_expavg_credit>
    <user_total_credit>468820.897871</user_total_credit>
  </project>
  <project>
    <project_name>PS3GRID</project_name>
    <project_url>http://www.ps3grid.net/</project_url>
    <user_expavg_credit>2519.313827</user_expavg_credit>
    <user_total_credit>54945.082169</user_total_credit>
  </project>
  <project>
    <project_name>PrimeGrid</project_name>
    <project_url>http://www.primegrid.com/</project_url>
    <user_expavg_credit>765.754475</user_expavg_credit>
    <user_total_credit>48781.400469</user_total_credit>
  </project>
  <project>
    <project_name>SETI@home Beta Test</project_name>
    <project_url>http://setiweb.ssl.berkeley.edu/beta/</project_url>
    <user_expavg_credit>0.117859</user_expavg_credit>
    <user_total_credit>3475.677871</user_total_credit>
  </project>
  <project>
    <project_name>SETI@home</project_name>
    <project_url>http://setiathome.berkeley.edu/</project_url>
    <user_expavg_credit>2117.077308</user_expavg_credit>
    <user_total_credit>619959.777887</user_total_credit>
  </project>
</projects>


...dane w xml, do łatwego przetwarzania  8)


EDIT:
gdyby ktoś próbował to odpalić, ostrzegam że kod ten generuje ogromne ilości hostów/duchów w bazach schedulera.
Najnowsza wersja bez tego buga znajduje się tutaj: http://boinc.mindc.net



buninek

scheduler wyrzuca te same dane co po zalogowaniu się na konto
choć to zaproponowane jest dużo bardziej
eleganckie :P
sprawdziłem działa ;D



AiDec

#22
Niedlugo Twoje urodziny - wszystkiego najlepsiejszego juz teraz :parrrty: (naczelny cziterze i modyfikatorze :P ).



Bo jest paru kumpli :),
Bo jest parę w życiu dobrych chwil...


Moja wizytowka i sygnaturka

Troll81

no to  :parrrty:

KrzychuP

spoookoojnie, jeszcze prawie tydzień  ;)

AiDec

Wiem, wiem. Ale chcialem byc pierwszy :P



Bo jest paru kumpli :),
Bo jest parę w życiu dobrych chwil...


Moja wizytowka i sygnaturka

KrzychuP

Nooo, jeśli chcesz tak długo świętować, to ja odpadam  :D

emik

tygodniówka się szykuje ?? :parrrty:


mindc

lokalizacja kompów, które coś tam dla mnie liczą  :attack:



mindc

nudziłem się  ;D



sesef

Ile ty masz tych kompów?? Tyle ich jest i tylko po 30k/day w AP26.

mindc

Cytat: sesef w 05 Sierpień 2009, 19:22
Ile ty masz tych kompów?? Tyle ich jest i tylko po 30k/day w AP26.

ponad 170 sztuk  :attack:
ale to trupy, w stylu pentium III 500MHz  ;D


X X X

O! To może mi pomożesz. BOINC chodzi niby na wszystkim, nawet na W95, ale dziś próbowałem odpalić go na Celeronie 600 i Win98se. Niestety, BM wprawdzie chodził, ale co wybrałem jakiś projekt, to okazywało się, że wywala błędy. Klasyczne WCG wprawdzie chodziło, ale komp nigdy nie był w stanie zdążyć przed terminem...
Masz jakąś propozycję niedużych projektów dla słabych maszyn?

Rysiu

Leiden, FreeHAL.

AiDec

Ta lokalizacja setki kompow mindc - fantastyczna robota. Podziwiam i doceniam Twoja prace (ilosc kompow oczywiscie) :).



Bo jest paru kumpli :),
Bo jest parę w życiu dobrych chwil...


Moja wizytowka i sygnaturka

Troll81

Jezusie jak żeś ty to zrobił?? szantażujesz ludzi teczkami z IPN żeby puszczali twojego boinca na swoich maszynach?? :D

Rysiu

I do tego w sumie niezależny RAC bo jak padnie jedna/dwie maszynki albo coś się gdzieś skiełbasi to na wynikach dziennych praktycznie to się nie odbija.

Ale jak On to zrobił... Nie mam pojęcia. Musi mieć jakąś robotę / znajomości itp.

X X X

Pewnie nic im nie mówi albo że to jakieś zabezpieczenie do kompa przeciw insektom...
XD

A tak poważniej - jak zainstalować BOINC pod Windows, aby klient nie widział tej intrygującej ikonki?  :book:

Troll81

odpalać samego boinc client zamiast boinc managera :D do tego jako usługę systemową :D

mindc

a więc skąd tyle kompów?

- pracuje tam gdzie pracuje  :ph34r:
- 99% maszyn chodzą pod Linuxem
- na żadnym nie ma Xów i nikt przy nich nie siedzi na co dzień
- tylko 4 osoby (łącznie ze mną) mogą sprawdzić co tam się dzieje
- tylko 2 osoby (łącznie ze mną) mają wpływ na to co tam się dzieje
- tylko jedna osoba (czyli ja) BOINCa nazywa SkyNetem  ;D i nie pozwala nikomu go dotykać

:attack:

Cytat: 7NBI_Zarecki Robert w 05 Sierpień 2009, 19:59
Masz jakąś propozycję niedużych projektów dla słabych maszyn?

albo projekty które szybko się liczą (AP26 lub PSP Sieve z PrimeGrid)
albo które mają dłuuuuugi deadline