tcosmonitor/0000775000000000000000000000000012260544542010332 5ustar tcosmonitor/images/0000775000000000000000000000000012260544373011601 5ustar tcosmonitor/images/cdrom_mount.png0000664000000000000000000000233312260544373014636 0ustar PNG  IHDRĴl;bKGDj pHYs B(xtIME!ohIDAT8˵O\U{ܹ3|ܙB)I)M؅XM*qeW.jn7%-6|$,LmCc_3mR䜓sy_B  l8b+AD5S ﭬ\ S5,vhss/Ӷm0Davv0 `iiß p N۶amA@x{xKCC=@?sD P457B:md@/T ԖB1M2ѿ1VRi'Op=ÃCѝRi!x1;URO6MۮbR(ƯĄEѢhT 0Dj0u틡τ8=J)4M{.ˋ7s>~̙3߬!#3"RJoOkk˲v !tugFFF~/@rg`M2>IENDB`tcosmonitor/images/active_ssl.png0000664000000000000000000000112212260544373014437 0ustar PNG  IHDRasRGBbKGD pHYs  ~tIME 27wDbIDAT8ˍkSQ?KLDuv)_ҿ@C%M:*bAA ڪH&&kIL|,9ýD"Ǽ( _$v,?.f G\yeewJ),K=w@1NGXf0Njjͣ\4KV?͘B7ݒ/|X3&k[il';~QYݝ4 Tz6";*rBK8Oc0BEkk?[D2.|^RMRM;26 ds i*d)gΥ-.f\Wp7^66X+WO|_鈽<4R.u]q]W-)Tnʳ$2X-oȣ65!HAHpe={bRz&gm>4J$_̛/5?D\x`…IENDB`tcosmonitor/images/hdd_mount.png0000664000000000000000000000175012260544373014273 0ustar PNG  IHDRĴl;bKGD pHYs B(xtIME)xuIDAT8ݕO#e?tigB!4nMnը7H8&$bb'xƨx +Gb6R1X@Bia贅v>X,m\ȳ~R8dwuGuM(J$|p Ғr:ib,#IBf}ccG:-mmmONNft:-jh8"NK& @%$p%ӣ(J\Q$I4Mlvvst܀;::3MEUU.!:55o{[ !D0'[ ߮޾M:!v#Ș&v6[' ]x8#JxwF ; 77{]]dB!rJ,}H|L ieejme޽BV # [lh'hB OZ3gBRڊmF8iB.źT*y!@)*lӧYq /?ihJ1p0r9R()IU*Ò*`r pz<8^"/bmc?Gxm=%tvM4FnaIF&i4 JJX|3HI0<^:v gY:EhBPs(Sĥ$C=~0i?*)HIr^ﯯwIx*+YY[_mxԭe2h08s ttiWU/dbmxX1|V}ֆ %ee/hy%!R`9< v oB B䣠os8SUyP,y@xP(0 (?dyIENDB`tcosmonitor/images/button_exit.png0000664000000000000000000000237212260544373014657 0ustar PNG  IHDRĴl;sRGBbKGD pHYs B(xtIME / zIDAT8˥oU?޹?Kk[, Ji@i A#!hM` A$ 1"OD$ƦM1@Ԣ Bmtd=|/y>kmcMx}"{y@Yk B"ԪcHP~葏n55q&D#C/ubb(e* JZcu;vqQ2v֑ё[0i`AZkDZZ1A`qZZZHxd2ƍ q%R`%*LDDkM] RA@,Ek5"*Y;ĢQZ+"bO}9? =cbxY$1nCPB*\auWwF)E]z,9b-һyf$|{oo\ժ4JT)cLZ0WKCcΝ޽=ɰgx8OC+%X+MNQJ5[Cni~ v?/\{zxj&S[֍I֯_O{{;`\NzaKW<| :|y bB'Or96 H駰6ekdYr,usiǏӿgًQABkg\ݞ|ի>۞c^n0ʶV ׮0冢 Gq(\~fǁ 1.}gҋd2;;Ivu͊GhIU#pc 5ϣZP}s6=7GK?Hmvv#/->uj5Rj5&~`M(s2>>}yLfHXD"X |Vqi'p3g3R*V.cJnDZ6@)au?OjuW\.#Zajcr}ݒ} A0}VqrL~>GV:;;imkCʥbQ(Kx D+BnZ"S*q7Դ!" 27-瘞.|'y}%mu%X".6L ( ܽ}[€9j3_иf^[P) mxwժTj¿"khIENDB`tcosmonitor/images/unlocked.png0000664000000000000000000000124512260544373014115 0ustar PNG  IHDRabKGD pHYs B(xtIME @ic2IDAT8˥NA陝u^ \<>$|Gzf|b<up <Egvٝ01b%JUUݩ=,VAUAEҊ=zoǹk |úA"((U޻!0QGEQVQBga4)[A`\ $QDt\]ۍt"0548N8pfiPn79`pmk]3tHͪfYN1d8N CX:{ya3d8,M!ia%<`pC|0>ψ㜢(jv>!cLq1(cf#c(+ ͛XUPxW~j9*gs h~j>9<8E텢Ҧ֊ E!z|}~^^8ޟX|_]a.Aūv?Z@ ^FQ?+RCGsK$IN8RԁbS\l$cKLJD IENDB`tcosmonitor/images/button_exec.png0000664000000000000000000000200612260544373014624 0ustar PNG  IHDRrP6sRGBbKGD pHYs  tIME 0vIDAT8˵OLE3;}ewa? EkBMz6BEjEѓ^ը ^yR(L1&@H",e]`wf<z$s>I^/%@*ؘ.Z<^r( ۡ+W>n>?ړ1OU$uN|׮3<<@2 -..T*uN5uH"R-tvttkK&(5jkkp֯twwcEJ:$l G 5BAhfB <*yQ'`=hZ)%*Lj0\ǕA1_kD l͍444H$RdX^^&sQ`CX.^D+f?= p]:;;֦?|6 @UTv*+ù.[[ds9Eec``nrrА}"ChM1R8>*BYIiooŷ >j_~ XIgXt幓5TV]) l2; kQ*LE$[ c1d,<%y +iՁCf|krl޾MGkp8Gw>LkI^ĔR8cAWDbUU( ^k|u d\ IENDB`tcosmonitor/images/button_rtp.png0000664000000000000000000000216512260544373014513 0ustar PNG  IHDRrP6sRGBbKGD pHYs  tIME 4aIDAT8uSKHg=$F&G5Rh]HP;EaD0,RH)J ڢQ3 F2>bw_WS|Ļps"T? v;iii s]]]7z@SS/'pXUnn/}>?|> }CPBȕ'Pv%hkkbD#t蔔HDH @bccZ~711qnxxQ&qF<;;諫+,..bppzϧf3B^ڐC P(qhhhN)\. 8]ӷ=+++{0̣5lxr~j 6@IENDB`tcosmonitor/images/menu_configure.png0000664000000000000000000000114312260544373015313 0ustar PNG  IHDRabKGD pHYs  tIME  9cHIDAT8˥KhaLM JƅE.4bfBp!T-RCBkAte@‰bW6IUiӗ DD:3nf1³{?'#Q X"M4QlRTlb4u#Q ZêEtFZdfx>XBr"2>06א:%Z,1`o %nFa~N(/;+tHRa %Nʿ4J'{( LA0: ԬN Gl6y75 irtI4Mk @ҾB0L8;77TIENDB`tcosmonitor/images/menu_rtp.png0000664000000000000000000000165012260544373014142 0ustar PNG  IHDRasRGBbKGD pHYs  tIME 48r{#!(IDAT8uMHccy9шvKEčuZHb"v. N B݊KiILbIT:_ɠ$ &Stѳp=D,`iiIn:#F`0pXXX666l@^]]}0zT\.رXLbS]T쫫+[4;ϓ]t_ [kvv0r: ifV*KQr}(a23N ;2O^G4[4R<jEQ&A" ˲>Op:""www$wz%`xxl6 cx<d\.@?bW A,PGQrLXR0::5[ժvzW011ѫ)>OhkkhpssCMQ,P//_=R6W(А lg>::P(nܪEqt<p333geYhHd:TQ0 r-4-0O{{{~JjFC |@@4ǟ<}wuyj^Y[q~HR]SSS6@$2l?8n_-yѣQ$ZdmvApC4MS,2owf``@k:zA( $iUă6LVp8,=(:lONN~MY:IENDB`tcosmonitor/images/info_sound_ko.png0000664000000000000000000000337512260544373015153 0ustar PNG  IHDR szzsBIT|dIDATXlUg?9=sRnQ:Dnj?dmbLLX3d11Ѱ2m uDI+a26,嶽?{9m`sϾɓ''}?K䮮]>* ,J" Ou>Mh %hmK~4b EJLkh}!g={vLF5:Nƺ:V],KYons?~nNc-TH;ײìj[Κ˚MOEyWhjj xX {Dض[R+Tu]'#&i -1I$7 i:T{4sydMhSoOyo[H@ڒ@J 48399_xW vnкuO`dd7T*d2WmCAQr[Yg&?c=ڼIKBk׬v_x{XE0$  9!'D88x#sss4bZ=ZoP@]N>?C0-~r9Z'r JyqL 8 hКMuٖj3(H$b eFe,$VVPVkEh4LRŖRXcKI>S/P,ZcXRJ--I%b|bq0Ms=aJE^.TZQ*() xR"-TU"|E aYZk\%X.{>QƼ% ÛI(QgnB0LY&'F'BJ?g~D23J>_cK \а LӼ>34K2J)l;Hۖ#ׯXO0ĶL꥽)N˧>08\Jtt(1Kkjfpp_WA,$h澵\! 9b1ZXI0D+0 ",Gw@X|a0^:vbX>Wb&c1RVDQֵ5Vo87SXӳ'Oz,맺--ɤ7REkqRyTQR_^kNrϞ]@OWUKo;Ag}i뺼ʟm%b\X(Vtk ۻxCCn M oڶѱOl{Ko](O,],d>_>s?|4UBJukאH1 I2,%aMTf @HԀY$ PSc`a.غ5l֞s| ~O%<^0[6KbOJ](mZ\]]2+4X/HJ O31'׶|\`v8"Pcp~\BϤG5Fnذ _z]mq q/z sKĤ OtOeک;1V18>o/ 2<g { _eƉYd;#qUUtXǂ M BI51w`h1!ZX}`j"jv3,[,Ke(W[<zi@1X&,Y5-#ˋ,,bllQtHF$L R@<[1 &=t Ƒ422־9k H6E ]sZQᥬ Xh,\.,`#t4V@ "?ш~}74a(+eYA;񘔍@@ Hb6CΟT*pP` 8&VU-v8lK8Ȳc@3 zmA]G27˃#bxsì}{;(Pdx("{/$II0:  u֋Cgy"KNN֣R 4HE%t*%X,3gN[ΝP6 C?WW//r:i ")Ծt l6HE<'+Vᱚ@eeIK<θNK,˔$J((̅p8`2*f3v;4M%zG+n j^f-ǰ#0hxEx*(SEHT=`ΎWݘ-D7ABsԾז>koDKSg6q zՕ6"B&ge`۶E1A#(oW`{V 21aT \ڢu()QlcnvcAD93cb_$l7|~WJı16'շtJ alcd,N lc< i򭖰ҥa}DPud,d #}l\IJ48ETsffNse8F8nL>zoyiyjzFMGGc?[4bžwNLܺ}ͩS'F@.GDxٝ^``Z8B(?jV_~yo;`> HqY_hj9$/g} DퟘFIENDB`tcosmonitor/images/floppy2.png0000664000000000000000000000216012260544373013701 0ustar PNG  IHDRĴl;bKGD pHYs  tIME $* IDAT8˭mTU{gw^V%t}IEPEH0A Rk($"F/"*X}XbbRVʦ;ڴwvӇ;suRtpj;xٗAq$ux~eHCS8w==R"a B)_'ZmFk  h,1y6Epa`Ml;ɶp{5*[5$gajvљɶn; '/ygcnVbفuK,'bAҌG U3`3ѹhPRbPw%,ڬIL}G&΢+9J0*pN@Nvl?8Ѱjq#O?Nkώ!`Le9DZaBC#Rc7*zːhYsD+u";$IoSx;a$mcf0X9cV! .^D1\%p]VFFr9r#9+CKwV-d.۷1.W f43=gOk40ĭCձž _M^l8l?3]X1/23ǕgƧg^hڷuS( wD-HU/<A2e^ۏ^,}?,az  ,Hc$UgnSui&vn{'v>Eq4Akw_?߼''k'W%߼[0j>AX-/?ԩT=eYcJ奎Go@W!'$_ԓSln\{&?3 DV%r=?JeFmXv@x\qqah=Ѿ2;}З|9r-k5tT2>hMA҄ǡ̖MD, z=*];[x 8wyIuI1MN<-I7, #?[FՕD(̗ˣRmcer-0{ W1oR ]!PՑl.UvjeIENDB`tcosmonitor/images/tcos-icon.png0000664000000000000000000006524712260544373014223 0ustar PNG  IHDRXbKGD pHYsg tIME fr IDATxwx\6~Lo4d\6IhSv!$_ >vɦm ^1`ܻ-H#M3缿?=֫lYFn`ww @2r7tvvYWWx˖-P^/v[ZZ(D"BZVIDYEY-[7pY^upι0y饗6XbUuu`s̭HeڵMMM=xnWE}?a0*@7\;wyEEH$10 Y%`lRgglٲϗ?os%udnqFF"6lHhg1<_8p|(ɂ Xf̘uewwwwsNfÇgqMgbذa×y[{ß׭޺w]Ι^aHZZZmmmgziZ<TezqqE߲,'.]|,es&xQN!,uO=x{֭[wÇXf*P}>_lŊ^$Vux^^^ .袋byyyoZo?QQcg~wܕ/3f̸yLĉ+g͚5`&d|-r#@ؙ6Qr< գq"? B!DZԱP6ꫯ^L&-BiizEmݴiSm Ccrn  @5f١wP3_  w}?ϼ_UUyΝJ޽;iӦw"|D` -v'ٽ .6 @}ve593 uww,X(Y|{~gc ~n/y Ji3}} l/P~1sev -X(Dh:#[w_HfYf2X{}=w_E8gL ?>RWWY,HwG}d.((: Ji34!- H*R A0Bhl7o`:.poT©nD'i{uoSKjyf1[|8~*~l$zk@^13%IBIIVPPP B4 !p Q `2ICqY" ̸-vN%/!ZE)hKK] n\|g73?ק"W2y7|8M 7.[,~oY) .?Dnn7F29! -~s ( jN01Fl!q(R-4Mj4<(ncρn1}^^vjpc\֚9sT566N8wұ0ovמ={ffKظqc_|Ǔ$%N3,p #rm1$ە"K)wl+c !mb̩7 { HJV)F(I)7]5hiiɞ{ 5>B]ַv[ _~ru׍ @&O߅`0R=ߋ&c{kPe,Țan2X`b YJ;¹x5g Ә^TLF5y@) Sv"|Ng T\2[y衇oߩ?EM%s~[v.Ciiiy'Z[@*G%3o>qcT(Ͱʀhf0/T̥CᎸ qgKRc!A'5ADC-!S;KK P\3Hnկ~',K rM$s"/2!FIuāzQbb ] c=Elai vg̱ vz޸Wg+Ǝ 1{#lͷEJ#4F(H$E jP\>i^*S z -KOUUG̛B'[oos.R\\,2INUUU{1 F+_ v\éo =Xb3SPq{O#g{8[AqvD W d  xٍ㫏~n 95U+tsB8N#uHjb~R UU JWȱcDŽ~:|rcK3v!v-$ Sw3gW9ʱ } Ax$:@ $AP ]f? T)-v}x H&2>p7"׿uuCohh8$ sƍ^sXN\XXX(-=G}!P-jSc 8 qBY9=G?י9DF_%=vY =0?ըfmm^28o!,1ja>u=.+EQ… QVV͆ǎ9oJ-SL'LP駟l,))i{`n=N H\=8#[;F9ʩNӉ,+<N(4j M#9MC,yxoMPk"ΕYwGp>Y~ʕ+wzWm6477#L HšsB`2N+;@ VxݬDLe-b{uBJc+i e{ i`^PNҽZV@l#6NN͹V_RP^" .ilC:8裏nI&9An]\\l=tP\,xL]u3r?G *I*Yخ%Y\5yEzv&B*pxiɓC={y뭷kvfŋ(J':tw.m'Np@YYYꫯ$I)ӹhUlP9v0h vjgW8BN$[ Bs4U-=aROBR337Ưd8D89,\glv?El60yd\zH$bfwyEEEnG})49ux;x}6 &n #nS'=G Tba ~پ*mC>ب7?=sI$]=ՁC4U8cD$z/%aMg.o6mZ(x?Oneee3^{5+_ʨ!'NH$bqM:-[Wx<!O 1 8l-b`0`raCA,pq Adu#u?r:!`+ 0D5qmm#X$X$"[hT1rGKlڵkWƍh 6vF7RZZ9 ;@_׍2>8R!r;=<[d3pI4h*Lqu7q;J!+PkImU]7bg,&pZ 8 x [kw(Qa"c+PvDOWA 0@ $j,Fn1Xv 8-(*p x š& Q5"H8 B@AT` Tf.3fKJ` tM֭ȄjmFEك-O>mmm#yR) gZ[< Q[gF6ggљ4RF8AI62gkFa?9+8l_Kai1N1*z\=߀BzʌK|O=Qɪbx B*'E`lRRR@)=Ic,YĽ|rWGGGUGLd7V/ ՇV/X2qLTn/TR*Ո1BI6:EM0rqюq1;n z< ۓ*/mh t!|ҤQ~נB H> h4ḴdiOO\\\r:$t= &2Ԁz\wrÁJE$)nIyއ-*H7R05Q^vjk`zF)B:`G ESU׫g:MUv2AKe˖);w{ww9rNoYtid4VAAQ$&MUWW@D^T,]#NE/vqƪLi"S*Ƭki%Aʼnl c4V_+`<DZRj`EK7cWt{vU"gwP > μ"Fؿȑ#zk~Yrec=QdB_{:@ti7ZJoBo آÞTD|ĪdWqaϼBV{=xB}cpD yT3vT^ ]zB*J'C\脩XFP/Ҷ/x̛7PŵiӦH4 16wD. P1'MCit݋,\#1RXy2n+, IрIנ;k]¦=榷̅})^*J)H+O/>8BQ IiPy>Hz! CKcwD<[o} /|sϞ=>@ PSDYy`0 |5׀RT mfo ,O.,@ߠ氀RI~ \;prS82 c?CN#l_Es ɀ4BMPTSl:Dq HjcrMIt| CVX?0}?>p@CKKKi$=s 7yyy$Iٳg. ?xO']Il^pjz9F,DS -E۞#%   ᅬ84VWrӋIW#nrx+4P;Lm'QCJ Nq鉾> vGo$ wA")+5@\ HW3J`@m<qn]7(jB.j)]S$8iIB6̛힀I7i7my3k~٠)5vP+IIRTPT+f yt*R3nBdRvGTasρR*pӤFzc 7NXT+۹ Mz6 Yܙ; @ H&y3bLj[Mak6ξxj_o 7{n+ IDAT.@H* =s@ T2{[H7h(A}>B}vBt\҂ p8ěozk46|2*X2z,{89/n)jlO%Go Zg3v 4^ K؏I7ANKDl)uಔ0E\S Na%QEdy`Aqa(ee]D"5k֠eҳ>kX >?3  ?E3 *3C\PpjGP-k7`uؔ`9 ʤh@О/GƢO7-J#"CG`".,'^*f4x]$&zl5iôA|Y{seN_˗[&3ȈWƒApjGHU+_JۢmmČvO3)юر~l'/(i8iFzWbE@@ Mjޥ;Ca4RVVTnE<`ұdI*"r+ZٺN^p>D޶È\{X U% jǤc8UNfčTiV_3U + Jb304g@_mǷX2T#]o:*|'lٲO\"eggOo~y%fN|@ H9]3tmHoW 4]Hꊫ +Q왿~DtNEȖMN8{qAʼnIWU|&- $\<Wxp('A u؆3TAMt֬Y:pY,U=:kZOq"-9yz}y t!y3jʯ M"jJeh UNsd.ADcEp ^ȉ3-@OMH=U{{0 q2:o<~UUҥK~pbXQ%H$ EQb KR8r?V@Y:XA)lJsZ 栱"ZU"[PUqA`op+Bry4m1F7K,ml\t{h|kk 34M#RfcTz)A@{{f۵_}\ <Ao@' y:3c-[Ɲ(MEn%#=BWO[Q)k2(=iƁD 9eT,[lnnPr:9s_}Ub1Xd2Ob}}$v%zsi7.:d@w:*ހXypbu87>=+ p*!<=4fGj1GpΘZyղDd0OŜڲ^xaX!De5MK+T+C7o[t8 qPZ 7QԸ #a(a?gxhYMQEPlF fwԔ8OAJX*Q0 5tttT-]WE\veիW+W@$A$P%9^2[H͞cE?zMΚE(n܉¦]4sA z@e+:Jq,D)6F>@4v]/ =vrV \sxwIHD&@dY @i<1U~G }e>cb 0o`FtJ g(M$S^+8-/$=m(e#ݵ+I *sgzؾ}> %كމdrX3EQ%I uuuxH.=4dn_8ZS(aLƕ>(r/$Z0&ꕾT,>"ը1{:I^z{ ӑ"fGUW]~#XX2۵FB1*:oȖslNAng%+^l=L.,O}`r>*{R)*='Q9\afzrr : =KP[1=hS3_^Dp)ۤ (f( S"H:G/Iz0jH,a.(JKKq׿uYfZjՐ`("pA/ۄ*Ɗ񙩼<]JXjZV{/EnQ<PVj#[B`X+!_MN@1f*O;z9/P sT3f$ӟ֔E߇n/2LJm!Á .,^x7K/m -3G_׀\ ϞC {&bυKQܰ MQY6wj$;pYi_8 m TjBQTlVJg5}o~97~*R3/}kpN8@^oNP/R^!V0.YDr:e]FMf2Lҵ^;.DZ]H?"'8U!aIdi_*qbƴ#JTLd p-(j*fޡTۊZ ҍ1 \TV^ R%c&4~ϯ~+cvv{PYǍ Ð41 t7lx wUiG:聀~Ы4I`qS>ELa(xpג 6G29tt{8} #v6EQSSOl=j0̚ 9%f@Ts ϸH v/骃 œRHA*c?2$;)Q(ɾS"SG9O%|Ic?ysũY| $o w <)=RTT!}޽?Oґ e7r UBg=m"a}#k~Omv^4(Q6FS22Q4`$ Q{~`E!z$-@?twΦA> ݌=Bi2,VQx6'tw)mݺվm۶!gI d2I @TFKU ' tSц `փpO;K> )>7eb%T5Dpŀ zQ_v-Ma`G''D7pG"ȋ(OΕ+m??|rKKK CRUjA =[.׳IN=cľ_OcZ3Go3<eCT3\pwIrbQPE3t{8AW۳HG*!\/5kt566H$9f/f㣏>:BMtw;!Q @*Ax^7Մ{ $dľGo3f_/yBntG}Ԁ=E6S <'ڀ]5v*I8RGhynq2Ό|׿* MtEu]',XG^y!P |T!5s-"pF)ߙg=ZHEh=u^'I:Ϧ^$|bBǐP"mv7LpZ=ŁF{*1cxy-ݻw7 ;wڜN$!nL`6ȸaN2 * Jk3\U u0qo^W&ך ?*_+)iL*%=rAN-αV8}9W[V- Aϣ RƮ8"`7BJaҤIś6m*h2V^cJ y# "xl;=tJ$|p~nivJ Ag!v,zXP'ctB2 = D_ I"W yXRWbt[$` XZZZzvs<6c <Ν;M'Ҿ~$%z6Fǜ(44B Rh4 =@l :Hxo>l4>M3\`пAQ91:9 q  S% {&yhSxu/ҥX!h>|X6mގG}4MEaRc~O*ud,p 4LHFooͷY&jZ,wLYfrjIyi?vAzO- g׺(4HwUOr?1Ο_A,4~rڐ]/HZFQ"?p A=Pb11''xڵn<裱p8 H&#=7 dAS ̧=x Nci_ºٹa(f0rn_1w9t9Py0Hm«X|b&fcH; |n)^>R=KȻK裏)Ѩ+//o3U/7QMEVIШ@#v1L5)$4` ]_lF0 T`4*eQ?;?46ԙ$jhE*ףotra.k@ 0>|؈Gyb _T9 Fvպ&e@Bn8vХ>"iA8/_+4W-^i<6\AѺkkc;\Z2~!LZ6# ?a #ШjsϞ=G}1č8ɼ,b"7'Wi=w37Plv`@>:[*fAl y@4Ёpq݉[HO !!)ZxP9Zѹ!cyH 3$F1O?DMw:jU&Nr[YYyʕ $db6J RrJ@AP-Y ~ p Q*6 i08ݺZ0a%Ʃ"JնWp_ {DfKeROcvV>u%<X~v3(SLQjkkoɡP<ÃVͣFUUk ys H5D;T깬w| $ L*sG{ (ޤLPW;H LDD%k;rbdL`G,w [-o0EeΛ# QOh6 >,ك믿~Tfo虻qUSj V-?c&A^Nt~Fb]C#4la@ BIdEQ իlf4/ HY̞p2p98[Ω[fћD :[!Yɺz 42cAOҌ=0٤ӓ&,M[j, U\hn!ꁺ  |D}^F:0<談OWHp;yXzᓞM"#e9Į,"M#F{6nGh4Te (IccB Ilɓ5BHZWW'744X2cgG4ёS-z]LB YEyyd$#Ȅ |L&i!~[Rwڅ@ &c I(PX,6=쳪544( P($#wGV+j088SW^QDwv19$#9I$$HRx<SHy d2NH ̉,˲5MӢh$ v{$77W?>&OM)~(p@<򗿐ݻwK%QSʳf2]{沲2gnnD Y,gIdX,vI$eZn'X,f@$Ir`[$,F,iZBQoB)+ғ՝I#x<I$MN3P__B(dJ8qB}|xS]]]n%x`ki x/^lCټy38qpAZ\\l5k 9!Z͛g+-SN=d2&I>}!Lʄ!DAԻ @DQDqqiSjIJ0`kRM$!Dup\RM4JF)U CTӴDYYY2HDtΖG}VzO.ٳbŊؽޫk3{}>bŊ~hɒ%gyF;pݷ~{F3_| yRMM؞/eY,oqq'R7ok֬Y9"cillt[zٳg w}7Y` K_ V3[tK!2(#mba4Fi}}=ݰa]nݹs'4J*Ip8Byyy9s.\Xdl64ijj[& @ |E<W\{.;׶EI@mm-0am$r'bNN J^; y\۝o0&XViܒ$eL&tȂ X,&رGAee%((++u]3f`„ l@*2JUUUɤF FIEQd2&(aQլ^YOh4 /r ~A1 ` ,˲dXDUU͚̤xسgxG IDATlB֯_O;p8 QxPQQiӦ/͜9'N(PU^WƌFcT6DwwwcǪN8Qk6h$H(ryaD&zp8ܭ(>jݎ<@6n(& %IRRIx<"=`0AF ,LI\lD4a8x |vrR#N3N)ɲb᪪V +p\PggFP(H$x<7 ٳYYY]Aww7v{E l4e$ jJBcc3l6;v;:: drfi.I,˔R((DQlݺdΝ9s&,Xs碢V(;GL"`ȶl\x^F{{{ޱcǡD"{AP/E%Az5MŽ١F ?yweEQ JJJ.5s-w]vnb4C +W4WWW[f}…opڴiӦNZF'&rB`0X%Iu_$B`0LD)iW$( {_OvG"ΫzT^WWWD}l6Cc%%%ݺtf\RXrv/*** J$ uttjNןp";;ӛ@w,^xazH$Һi&^yCvv]UՉSL)S Et: DQtKdE$s`If9l6g;yKov06;ߟpz KJJ(Qƍ t~qXF|שގ`0644|XYSS YYYgyFEF;9;x 3eY.5ӝN JTY=F1l6(`0^w힜sK ؒL&_{p #=QeYQfя~D׬YӥW_ulڴI!;''Ƃo8i$X{G8is2 ۷+0K_R}#j6lذh49a9bX`0̴fE&q0ln/8r^͛7o.**Fp5KeE];8΃ԬiytYjd4-ʺjf 1#yqĒn7 Vz HݎT[0S1x|(R{W^mBFcEVV\2l6O2LF4X3FUUTUUׯw[掎)HMzٔfB![nxgO8QTb۳v{dÆ y999?r& ֢Ѩ=/~1y՟4pؐzRu[qK<%?o/9#s"_Z+00b̑$iNvvEXe R:`EACC֯_իWÄR:;_l#VP^^^'@ss󡶶aE~tj=== k֬)>}S^&%~7p BF&r'꒟n'H} HxZT[.f `O߭^B`#4H5AGw}7 7Vulv@mm-{=wVwqQe3 ,0 (( Ң&b撥fwl߬7q,3"Bͫ^ EٗtXf93s04wy>*Z r)sՔeȼP.,29E'*?*3;Gs|ϷlOEe涯<^C`D?Yy\… NOO6444BT*V{+K2{Fz?Wmu:]u~#F ݳg ,Y]h2],}A؉',++bWl;;zixՍ\E_ww}a[Ag"ׂe4N5dņX=4!m+Y)O9`w_߲e=Y,[ƿ'2SlClb@~ql[e2>QT.-"  JaKE_WKG?GoE>%ł6A\pgϞVX1$I={^um߾&ߊ+~LQJU˗ˌbi *?,* i7Y ^Fh]8@1`T15[lWY ,N𧐖ٳ'uVdd-Iy6l`ʦsDDD+--]5mذiFW>zuAg;""ܽ{r\w?/n?f̘k9tC#؊sMk{8D_M ߍ1cr@'/Uצ>Q**3m̵h7dJA:r!L`[A A(?h#?JQq8[Pwl`6g& `4vjn@h7򎲲2oϓO>_siYd8\.bȑ7vwVݴ8q1B :sM輻&/{q}xQf( ~r$N-ǯJ҈>#)oO0Nvwj6Ռ @!K $~]fќ?C1y"..Nhyx^{EEŲC>rJ棏>zO?ѣ_gUUUyg\۔)S~a'PZZW_}5yժUʇ~) ShkkéSPZZ"nBA- XoUx]6!(qUq -)W^^_MkH8qb]A9o>EEEAss3<A |wrw)_/h@@!#~Ci'RtRcƮ,ľ#.wC@0OI-~E!_`>_L|C>RYs;W8I;*aSob@`1a0GDFF2@&Ƽ:}tb.//9W9 <b$69%(RFFF:Rьe2Yi.bhll|v;e˖^ST*W_ǁ뮫sѣD[o]h H0LhH{wˮ:@y^^a]jks`S_KnmxƂh2ҏ8J[CJ<мGaא F]hÏQš Q@Wk<69(?lLD N/ _ 6~W.:#De F;?DS{ʜNgh!44F^?T.`&R&S.ewmm궶YF1eѢEv;9a„KJJ>裞μgyFغubQ<쳽>F/;y!^*7P(~!55˲_z%j"馅7@}?d "[GD"xNnM(t#8Î;H4440 (#""B^o^O$V[RuZAeYbcZ78-ygo...r7 SNzʔ)Oddd4gſ[EEE:t~رcypUV#Fq㐘a" kK Bf6& PeM~[rak@ˋ(}t2V4Xo ^V®!DE Aaאm_MsU'LPt1ѡd2YF!M BKQ|)w v;nwqss.Ųv̼hħ~J)+Vx:rٛO<;niꊊz@׮] y6h4GSRR 'N8*--ZA8.:**ĉ[:I9iK3>.1;1w{ڷ`oRDꄰkHDaLޒ PIIIdSS,<<\VVVfڵk7H_~ Dr\.oޗy8onn>r:Be몫=gϾ脳i&Muu=/ V5r޼y;RRR(**z~J=88tPLnn$d޼y wuW-ܒ*HQ,::z:;vr'Nxg+HF/]VhJ&-~mRyIh4Z6l6 ^._~XeYβl8ZSSm}}@ 4}K UV=YUUe?EU?ﺒgff /b~rrbrL67瞻,9 .aÅ~=|~oKKKjؚ* {=B I_y˲6.]z}HkkkdHHHFQat4M+ P4MA_hU8^fXr:bQg]'OIp֭jͲ+V!=XIFFƌ#C$???-++k}b>lZG>S׬ b}1L7\(a1ͥuuu-[Ï?xj2 NVˍ;TOn݈*BM$I>'N;N^WEEE)tBjy72 b0T:NV]]m(*L.jFROu\zUaaaJEQX'k` <zޓ>^.;[ZZ &\,$''_pm۶S… 5!C#f]?TT#j[^&O0a:_T*_ BBBb}󡶶V~>|>'Y=lZ-w.U6em xJKKӧOnW0L2L&&&uuutEEB&)t:Of޽[e͛hT*n1cD Ё}>(BP*J*11Q@MiZ&IIIgN~ \@nO:A,{f;YUUuzܹ|eݺu={>zGw(:|׏=˶fe%%%P߿?-++gy+]Vֽ{^j,*b޽@\\RRR> > 8m6C5e2Y}.]Zβl[bb͜~?OÇ;v$t hT*d2.KmM2,TP<ȑ#DNNoUXVRѐөQFQQQ\.o7o.x^/HAW ,˲l 8x8lhh(ydHHHfky?~|LT| 7z@\Ma0Zg͚ҥKYW_}5r֬Yv󲲲fq׼Y|Ei̭[޶o߾XMntMu&04M3BJ%$ (AL!..N!!!vyF/qm,:X|Vkkiiiz &O86l L&ūWҮFkС_.]O 222 f݈J#WV111z[SSSoRT=z}*Aq`Y_k.v@jԾi41d7iii0W%<񠪪 i& J)))2e F(d jW}_<ϣGƍo>#""0bdff"==Fj/pNQ(j S:rY,&&$XfQ&=K/ͫ x{?8lذ&Lݻw,]۷8ȰM<˲NAfsskkfH0 UUUvZ}J}&h͛jڧΝ;&5z pT_/{17߼"mۦ{'׿y󼐐,rrr̙_~,~=#h:tիWˮ~wu= @HJJFgeeҨJtFعs!ClG|1bʕ+u=lڴ)dڵ}aaaE}m64Dvv6nݺ" 8B= Š+u-_|~/yrzzz(vҥϬ]tDׯbbbR^{{޾>(*++ FӉFr.))zcƌiqy駭7ndҤI^IA$.UV$IKNڿ4M z,{5˲~Kv5kbqƈ;wum۶hmm{b4;e˖Ç/ ̘1C;w8lٲ^6oL}g~Ư|r#xΜ9uoaÆ9O&%%fvѧ%']rZVoLyذ0>9 ~N9/_vwzᨷZo1Hqmh4:tHsKRPԖDGG[~ @Jrw}_/auuuKJJ~{Wo֔o߾JRhbFT**R9_ hPv{|>o,\ևzH8q_X|}Þ>}[PPJLL t֍cYyid%$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$.W@4IENDB`tcosmonitor/images/menu_list.png0000664000000000000000000000144312260544373014310 0ustar PNG  IHDRasRGBbKGD pHYs  tIME OIDAT8ˍ1Haݩk %28 Cq))YQC])]0BqIZL!ww_6Uj??𿢧5f2|>OFc鐔Ri" "jZaݾJ677dYw]WΖʶm !1J077Gnvww?uPBjB]]]r\`ooT6BZ-L&l60lFsX=j~~y,yFEpyy$I!T*(J0ƠRQ1!LDRA(18* VRaR A@J "a}Qz c"s"b7:<ϋ|z4( Ca}%dN[Z 9888<<>>:11NؓHWx 6=='LRqmnH)E'3veIENDB`tcosmonitor/images/hdd_umount.png0000664000000000000000000000112012260544373014447 0ustar PNG  IHDRnbKGD̿ pHYs B(xtIME)*5dIDAT(ϽkawwMrI iA 8;)TI A MppAQPjWb5$mCI]n}{^ء:!O۫xu>TmTg*K!&_%h؟5ދG wd=ev$B v3uihLws8X@Q>kP#FeVnh GtT E`_V`6=Kxa abʈW9:)1Iv2HL2ד-]3d=)Ya,skæ*UY֚*0 TxTkKqAκ3p?@B&{@٘, P?Zt!NjQ&NG09= # yNE,ޙ 推3IENDB`tcosmonitor/images/pendrive_umount.png0000664000000000000000000000135312260544373015534 0ustar PNG  IHDRnbKGD̿ pHYs B(xtIME 0O@|IDAT(ϕKHTQGgfE4Y*Z1j#$Z"ZFVmjh!@ A4&Lg3s̽޹sZXA_|?}XL1ٙt{\I̷zvt/Αd%RљLl|"|zFQԄUkgPt=u2L؊35W5w~B2Pw6й" ! ML_U56tpCW^oWӞHiv., _ڀuI=W(i(Dy t=pV!G^\(Y+BX#^! C6Um٢L̢XƟ! Co07*`Ǚ򅸳F6Y$/{'jc8<1&b?y$%8& Ѻa g*ɨqZ o+^*kc6iH)IF0o4 <ɥ>kI$! C 6A>B K|bu0ÃM|:H+wѵ:FDA*ߍ$ (QeD'ZʲDJ*#Ec6jߪ/1`V^M}>VMr9P`+=Yϋ ᎊ^U,IENDB`tcosmonitor/images/info_proc.png0000664000000000000000000000240212260544373014263 0ustar PNG  IHDR szzbKGD pHYs B(xtIME  $Jk YIDATXKlTU-LJ!`+,#Fb&]hL\7ƍ t\b1Z"A*PK X3v޹sq1wfΝ]IN=wpߛ ۨBJRKl3 c)7A"B7T/S{zO8eqH4p8|Z`Ӿ}@)w*y:*Ȑ8ytPo}Q^[Ŗ 5|sq@ B q(:B<|(矦+ V6l]%MYMZY: _C{|~$!rr Srr]͆c}kfh*5'CKЍxNbY), #`T=\.*#=3W5w2qz;̢ t90 ~b[vuD֏ab?ºaIYZeCy ȜBh1CWDrRt`ٮƹk\m`>6O(\TBYpUuFd[~M'>Hv2+DS0yz~XY8;Q@PU \c 6,s_ 7B4l7xo:ƥ\Ӈ{)r[U}6QDCYN;{-uWq#oώa1ZQ2 \{bש BKCد֝? TջH 8:^:`3zY3?l[7̒ Xh]AuBsa Oqqɶ^ߢHS'N}{av8ئpuesX ͔ڇ@! =hy5@=/m{+PL̷}q8'k.a `P 4@ttU\o_KH"vK 4ˮc0@Jtoiï5ԎmPkʕ44{# ^} `(w%Up6ʔawvYF$B:nY'd3Y)5}*\ RUmg쓣g}GHurR "d:-R.u]qGnՏ?k2)Ogvŋ7Q%Z_D!]IENDB`tcosmonitor/images/info_swap.png0000664000000000000000000000404112260544373014273 0ustar PNG  IHDR szzgAMA7IDATxkpUsy$KKIxJtmjeǶؙvG 8XhAIy\Cb]3g·Z/\r?ݳ@ź,?5~7mf^HsR?c7ğ[E o6#̀'wRnK؀ 8Z.'xn({-lm s!H4 gs;o]҇J~?]llk$x̏݀d6t>LJoL ttJOɁ .PP^zcgNdrPC F0T*J(KBK܍- 1Ӄw+҃^f$΍z~['5{^qׇi0˃`hE3!xd8l @ yYӡ0+q' =)p, r 9 T  Qo}$d- | C@-!A_6@ʹͬO;3\ N e17 Ck89%9з7o$V~[m^ctbǵ@|sA^U栦OKn}fM5s_fĒgkoM]zGVԝpxb< 2.-[>WlKGJsد%Xѵjͬ]uk9|uDP@1 F$ih٩npfM/z4a]/}:yloX0TS{q]g73wSy0Ab#@P*`JRMRl&BuG) ##%Fi/tV 9ӭ݃ŗhR Ȟ2n0#ՠ@*Kp] z:Gϣ~fặI.*` )N@H^' -&$ÁBB( Ùc =\l+odm<5Gv !?E>BU"жr@( 4-{0uza!1lz{󂤾)оvA8?;nAfÌj1jE(|SQ4jk?$AU̜m2l1vxH8-{hBmo%T0a"k4WLw?%;jn9T@BК(\sN1a36R5A,VIC}fT13bԤi!f; )&,G:Z(` 30uSB Ȫyuaj#[ccHq9g["] A)!,@f`4jy`J|/q$ mUA?TU2hnX *PqFI,Q+h:ok}gՖe +^x)cՆ15+&@1lUn'R#H[ytDj.`y&WF=cF˲k*pr)'0Orx3w$i7%鈠ZE ¶]ljiE{@~݌Y肋%h@ ]tgJG Q-TGǯm,8ݴp-  ]oM< wKrߡ>]]䄇H5_cdt88DaDDDJ" 6K).=jFv>ǷN8R`V`f(Ż\c(jn|<3 8ܨTcDQ$ERJ2!0@kk/῁NR{RO1׋`t; "z19sݣJ=]34'B4yީ'*Cc ~bdt-E6%"[; I\@OǏ'qM{H)M fa)>\gfhTPJABx:h-d_2A Q9a~mc#뺮e1.|U? "fz.t\gZD!DG4Mkʦbw [}T^ [5 ۶a&t!`1T;ޮ@kHSطkyB#]]]}`* fggBoo/,ˆlۆeY?*4MDdh꺁DtɖV$ R))8pc8 "Ajt:D2aXZZծ]ԝD+08D"lj4Mrl`{L: " >6;WBJ "xi痗#G0 J2 DwW7Q.o`cc.yغyo[~zhz5xzwhhJ!62 L066K*wB0R-d2ߙa4[* %(iH(jbb .+7u?xAݾ}{';00MSbǔGaff3ϟrss<<1!588eYjPrʯry@Q IENDB`tcosmonitor/images/menu_chat.png0000664000000000000000000000171312260544373014254 0ustar PNG  IHDRasRGBbKGD pHYs  tIME 1:HKIDAT8mS_H[w=߽ׄ4uʴ-_6ֲ΀I < ,`T&T|tQInJLKA?Mrco]K;޾9Q---g].Wv=Q;dyy2 9rM{&LUUiZjT'N#bfffv{,i yJVSh09 B떖V P(T4Gw;::$=`0rqK]]]^V BxmMT*ݻ(Jy{{[h4JNsVHdX[]=DVgOj!R4 b0qQ$h_ F:>>G`rr3DX'v/{:ɘ;W@>#pܼuE1wr u]ݿUy1IENDB`tcosmonitor/images/menu_unlock.png0000664000000000000000000000134512260544373014631 0ustar PNG  IHDRabKGD pHYs  tIME ’.5tEXtComment(c) 2004 Jakub Steiner Created with The GIMPًo1IDAT8˝KTQ?7X Bm u6G3)P \j+J a?hUIԪUI H5cIA 4)4k1o޻Zs=#]z`kvzOn){o<%4C= '}}]>c55PSH,P(X\kReox!R v5j׼*,K`Ku|>l% 5=w|e~ L֓no3 eMK*AgGiy wɷhqJҒF)xx<`{qƑ2!?mr2 J6*R!Mn (?sF VʀS!1s.C,fsoRJ  M";>Zk|G)y58PwD瑣>}nGJAֺBnB ^XY]]9-m"J).X4rBy;a0"b G`~&ϙ f=}f%%GoO෵ržk %s $ef3W;?VH>` w}S/1bHZFɠdvz+OGU9\a&@.bKMQ֮j(ho K 5&BfݦIENDB`tcosmonitor/images/menu_exec.png0000664000000000000000000000155212260544373014262 0ustar PNG  IHDRabKGD pHYs B(xtIME  ,,IDAT8}oe?3λ;JЖljA -*މd.(A-M &֐K;$&s}'ymIL\1 ~^R.o|zMLNL"7u#eFX*:N~~m144sd\EJI,O둑̥a)%R.ض2aRHP)|G)RmqꬭQ}.l6i/hJ) 9\ZѣL2)yZ*0^0D)NIff3<~)%]~OO~-ϣ!%bcǏSnQmH$&i20z#^͛7iSQL8!@DgTb ũ;$4 uMױ,D"A='eYx 8APVZ^uwNەbmTzd2] P("at]ʽK2^KNtznzCI0VEmFXTŻk ?uڿ9(t߿olͩRa]"FPo-g)?K"lIENDB`tcosmonitor/images/button_search.png0000664000000000000000000000143712260544373015154 0ustar PNG  IHDRĴl;sRGBbKGD pHYs  tIME  RjYIDAT8͔_HSqǿ{fR#ԇ6t(TRo=TC/KCZAQG@ "SGDYlGn5t :p8p?;s-N_Ƈ*kWLQ  oiUouWl0T AV4waLϤKk[iJ |W^Ö[SW)' ty6Ąj3=I92B49!Pm^i)Xd0ե@!#l*@P0q$bbv8ޘrO{ &t<#".yfb/otsߛ=jw~/jqioCxpab%rг܃ڜn/'ђ9[+eM #׮X ublOG5oFz{IENDB`tcosmonitor/images/info_pci.png0000664000000000000000000000244712260544373014104 0ustar PNG  IHDR szz pHYs  gAMA|Q cHRMz%u0`:o_FIDATxb?@bb`@pЀ; ѱ .]zΰ|y4#,@@lC1=C XXY/Y 4/1C XJJaXXO_A1 {Zpm11fcadUa R U/r< .wgdP~ gWB {?~pi.2AX9T wtLexr /<^@t?m ˵d8k% (* 9[w2h;0h3c:E >d`a rLO! _gAi!;/`g˃x!(Sٳ O\' 2D!ȑ pR~F ]6w_w| [_/A} `ǀ\[0E>E!z(9`NxKSE =!b@W/@.oH^&<`f``pI`8q/ gf沆=,;}g>1Q G![ @Pq`C+N}`pW0c8K1'``jh6@xC~`߳g_+h0| % X[2pAO›K3#NH:KAJa޳NS7V%Gڅ y0(bx/Ooj?>??` {o:~f xb2cq;UVaN!e@t 3.'Ów31Ơ!8?3Ȱ3J%30-s;&@8`po ,0rjEbr-{T /Svnb; \jrhLIP& ƁЀ7h@p~vIENDB`tcosmonitor/images/info_kernel.png0000664000000000000000000000322012260544373014577 0ustar PNG  IHDR szzbKGD pHYs  tIME 4oJ4IDATXõ}lW?}p}ڕ@@ۡZ)lau%ffb|1'qiLfx1dRgrJ^jioK߸}~kp?NsKTVV>iZa"v踛/޴i뷔`6VSSCCCN.sUhtK{{;X AQtPx~!h6Mq(`B-[&PHt]4NJKKȴ,P,*((brСC'Ν@ ؟ˤJ$I00`u ^}5b֭{| Sfu^_fIZ_a7FլSN.X-bHQW:^%"%rɮҰ=/BR02:\[@g2_O6$0WLnz' _LT8-gL}UF.˲<020@Wss|8<qu]{!u,Ky.߾guUU*Ht:-SSSH$$i(2 xFq<# i$ P%:}'ϑHܶ,&:3z]JJJ(** O8Cw pٶk79?N=Tj}&?c8 iZZZ;A[cŷ8}/\yT׶> ^"Bm;w3 9ts\k:vy'?ϖ7_oBtދ&<] y߱oFcS}g8| Uԇ7nu]{Qqp.VL_^5g~,ΛMtW 3vB~ mq˲8}mFcGc@.V6X} lSynX]&9)f>8D /a/G)\vLm$oə @em`|o̭}e:: ߇JKXGI45[ VHIΜ.\lj??5l</Uኵ^iC@fa|w;-b{ݲqEQ"'0)1&G5g?Ztb{}',IENDB`tcosmonitor/images/info_sound_ok.png0000664000000000000000000000377112260544373015153 0ustar PNG  IHDR szzsBIT|dIDATXk]U{=>qts[:N)eQ?b 1hLLH_&h@P S ҊPhowft^}~wjC'?Y9+k^k}vc^HLxL{?1zR$pZBtܹ& "r\.G~j u(x[ ~|b^{/?j=I ȹ_h%O>O"l[co<Tꖇ~Z-Xo}U{DHu㱟})n뺻{ǰ{L'ٔdKO7 ^}45%xhmm1e /%BR;o8=) = `9~D-۶?#JW˷8e eZqTJp~>qu=zg꜊zwmh澢1bdȚk[tя|Ӧϝ;ǡG8R`[˔XEĎ`Y&a $2sn% {=5Z.jJh퟽g`Gp.jY,Sb6F](XFlSY*w( CqlP%뮝}5cP(*-[' Lq\ǹK,V'LPVinj"Z^ =T/X ݈uwd]:~ysstuvp p"Z-$SI )D"~D"' hhRB] `gAoYB@ܔNqRRIZȓH$(˘A-I__}}}^O]D"Fa[U.{A m/ Dit@Ѷ,VVVftR 5ҔXE*bݺz7КlE6 Q\^@+);+f"ղF$LT*P\]X(Ac[i!5ϣX,*TQ4Z>NLa)P=hN(\!ePTL!ꚴRC0 VVVOY_`yy˶.eyXaj" +Kuegw@WB"aӫ+ YWRR ێ0?@<Ƕ-iWql;!%Z)LàXce_%V` bq.e!$295M5I< RmmnaˉbvhulBi(Kxa)6x@TBO]6> V?x,A$`T۶;Cuio@qdLql-,("RJ G -hBN-Gsgs.4%N3>Ոb 5a< [V27 e!%=Ti+#/;8281;;hk#-Ve݅i(?;漺}McORJo%ã/yP6o/ e#q'$ ;E/{J2IENDB`tcosmonitor/images/unlogged.png0000664000000000000000000000147012260544373014115 0ustar PNG  IHDRabKGD pHYs  tIME%5tEXtComment(c) 2004 Jakub Steiner Created with The GIMPًoIDAT8ˍnT?{xF Lɉ"LHAg)p-U:8!M$ *( RHDD3{ۋ&qi:==QF_9+"R煅7gggrJ{nUgqq0 < |@=i~ah(쥥m_nd?Z돴hD5V`aggc_ "EAYEl6c{{fvmollʲ$MS\ץ( Zm15g m֚td2CaU!2(b2h4HvMj5R$ɪ'''#"j(˒,Huj8CeV4Mq]Wh "8syy`0m1y8n PC>zn.18hdp[XA69XK N/>`qm|-WkiWxMBZ|f|3c.,2`jjInoٶ} oȸ@p]NNNy<A}x 6ތo^Ţ#<<<}'j8 p0|CCCbnnn=lmmQ:F?~Ǧi^.0==A*z!˲4M]|ffBawtt*>xf Eץ8]"$u5MR*r[mۆeYamu-߇ii;.lF&9u] "RHx.>0p]躞B۶/\4(%ݮZXضށE$,˧1*JVo__ƾnZ~{>z]j<"b2c {j[徉 LEvo|̦2/Sϕ\ʕ_N0PZ[(JKOJθ0I$ r9r2lnnޫg_ܸ$ B.-nӀi+Nsj6i(wǥ%vEz,ɠ}-./kaCXDDJ|Od]H$`aeeeYT(c_Yv `I]%2"J0<*D_~QlXIENDB`tcosmonitor/images/tcos-icon-32x32.png0000664000000000000000000000320712260544373014766 0ustar PNG  IHDR szzbKGD pHYsg tIME bIDATX[lT}Ιm &&C87(8i8"Z!%jC/(}DJڦJ(!.RF !(m2F{f90 "Rڪ>{_Z{5pnPy)J pQX~zj༠o,s Tź[umZ 1Ta~oi@=) huǣ1!/_r7W?Un__־q6oѼ5/x`j~De> @&BLdLJ)CJ +I͍Tҵpʱczש;;t۟X܌`;00!+Fݧm;s L?c&ÛiڡwŅUTcT'#'$C U/PIҶ h*ڲoJe'Z/@ϪMKy6F, /r 8n 4ÕZ/ |~[ꅔ4u喆7|3c cYS m4N ܆d{+P>Olx3Zwot6 WIsז>Zg+ D0c'ԥG#/֥SktVg-ʑKK .M]ffxZP:VcA9Y8VR.V sE=K L 5,)Ej|Bѫ~Q[|!:::x< X,uxt!i:eYP(Dҁ@ JvmܹSkih:ZMIENDB`tcosmonitor/images/pendrive_mount.png0000664000000000000000000000231012260544373015341 0ustar PNG  IHDRĴl;bKGD pHYs B(xtIME 8A7UIDAT8˵KlTUwtZhL$TFF (ưDh•jаPc@j)v:} +A'9wr9?-/GFvU.;]}vsy98sBc7Z;uUJegAMû}}_##C{{CD(u:yŘ{ccKjsG+{^Ga`ws<=n2$ |(3Jv?Nl?'(ZDZXS)G2H$/eSq^-̗Ӕ[A#0 $( Flf?>v]X,Zoxpr)VV"t|!yEbN\`ax!RqN}\DZa41+H!~]XX>"ռ/lYZ6ӏw:iF7@ժXkCb|e% 4R4U{?)O5g]R mמLUٛjF^]S W8m+eY"|$¥0edfh#I]>yVHQJ]nhsz>Ι.D捜 ^XcB\ PL)ɕ甒jG@o*FI֮=]9KKKskxj6,\'Ð1ŤpЎ_݁AxQ23ƶP, W D{Bf(tzIf#_c{wz#RJ8SmM$""`wQaod(L" stDCmoŹ^PHD7@['NѾݻcU76$1A)% J\nRin `nn xDz'mΟW9]>&bMmZ)RJRJ VZ:UNg})t=,mU6ф̌S5W;+B@}3(V эl6{c~~~JJQH)/ʇ-aKO\?IENDB`tcosmonitor/images/locked_net_screen.png0000664000000000000000000000134312260544373015756 0ustar PNG  IHDRasRGBbKGD pHYs  tIME ;-d*tEXtCommentCreated with GIMPW>IDAT8˅KTasFqLDBaaP!\tA!?@ 1iԢn\8r^"]D)<`s9sPͱyO`@]mJm.>-ǡfgF uLN}"HUm&i\zVp2S,ȹ*#{㵈dtY{6S-8;"_"d WPKWW' "-չ@[Aɣy =\ ɈVSry%S~H o1s,zNR;Mt#잺G ܷ ]` 2F>osY|0ce?8xZR(6GRQQqr_@ĞKb1Ua, YOeC)~A"QRRZ;(*'up IKr$@8g^=^xBNRn9]à;Rɻ0M ŝ2/,h/t,v Vnh4|]6CB5zIENDB`tcosmonitor/images/menu_proc.png0000664000000000000000000000147212260544373014302 0ustar PNG  IHDRabKGD pHYs  tIME  8|IDAT8˕MkWd2L45XmR)mj*"@t['見ҖFܖ"]]ZBbTlT2FԱhN&3Ls_\gqW8p8}曝lvRk=z>U,|e' &1x {(\;a2ZO >wff˝lR+V ']|r}E&1ّ̖!e̦~MoNCuS;K V bIQc2 BpxgUX־:- L1<KWoG;)?X`󖡵k=n-vjsm W0Vg>M Ug'Lqlofg=3Oލ8[.~=#'|Bpk3(%ǎ!/ v_~)~&o <Ǖ\=S8cpYs `=—?U u߃Ӗ'W{i+W(-0ݢOKԑ&p@JFŹ2G[q7gܪ#E/89utKmM ˮR[QsHbZvrz!9|"♛T,|*~]P9jٛ$I6m8{ !(VR-uCqR>TZtBw!%m !䊔a{W\AnMT(IENDB`tcosmonitor/images/button_text.png0000664000000000000000000000225012260544373014665 0ustar PNG  IHDRrP6sRGBbKGD pHYs B(xtIME 6+}(IDAT8˕oTUƟs03N@MChjbCHda0p]DV~P (TԆJM 6%C;t;h-lLݼ}/< 9v ύ!`D:~dCg=8DÊm`&kf,P(J[Z&Miier1{bHOwtE85Q(XɵdyfnrR>Cƞ]9>4rú=r#=C `U46<9=w`G~mt߫4?i5hՋvaȃ)܎^.kexe=Z?4:"z{mnP UUx2EAEMu ǖ)TUWGa`Gots\טխmR-5>JM2 I-:;^Qb6e'$-]i1'#{j@4v );rzaɂ*E bח>ua_UU"qP]{xv$%W(v6NJ%탰 ͨj1C>5fUHZ qZ"0A@rhP AT4@#XX0-M *i6t֨W[pD kȧjfKQՖz C$1pafI mJetVeS?ʀIzhR%9F`@1|΄$:R?V&~#.ubUBDX $69,M-,㉑;=o]eM[i"^2 .ErdnOʉտ_cۦ߭ՆәLuŬgvFSdҹ˕+Kz2=`*D/+<+VJşFeK?hVWa'Kΰ%&3GGJ;nGHb콝 MnG0OMIKLD "]Mb_ȱScz?=Ɔ0IENDB`tcosmonitor/images/logged.png0000664000000000000000000000161712260544373013555 0ustar PNG  IHDRabKGD pHYs  tIME,mS! 5tEXtComment(c) 2004 Jakub Steiner Created with The GIMPًoIDAT8}Kh\uޙ{I2 I;4ML"ք QXQAh][ -+u)Jݹ1(.RH|"*2G38>>M2M}s>>eް@hSmwcS=$Xf\tA6MlӒՑDxal |?["!6Z$^/GNMTQdtX:Ql(lœ4m0Cu(=Fh;٩t.7׭Ffu^kaz k':>>|k K}kX RMC&3q zu8aP))CQ TJcx1jU8_vӇ3ѭ|w\)a27^I3*|sAR?} O=sP2a]^xG Z7M3;?N?l}קPwⷵ:22/2yK!!2X):w؟JOEI0@[5g*2 PKhۇBD . <:j%x%{d~[m7E,qWw_=뙫m{͞{DYFϤZ`IENDB`tcosmonitor/images/button_audio.png0000664000000000000000000000216512260544373015007 0ustar PNG  IHDRrP6sRGBbKGD pHYs  tIME 4aIDAT8uSKHg=$F&G5Rh]HP;EaD0,RH)J ڢQ3 F2>bw_WS|Ļps"T? v;iii s]]]7z@SS/'pXUnn/}>?|> }CPBȕ'Pv%hkkbD#t蔔HDH @bccZ~711qnxxQ&qF<;;諫+,..bppzϧf3B^ڐC P(qhhhN)\. 8]ӷ=+++{0̣5lxr~j 6@IENDB`tcosmonitor/images/menu_dpms_off.png0000664000000000000000000000155012260544373015131 0ustar PNG  IHDRasRGBbKGD pHYs B(xtIMEyڡIDAT8]=oU{w"!H BI?@((>4TED"HH(B@DHh0qxޏٝ 'mNqkn}v˨jU es!sxUUg,-._;]P`@C hx1Rٓ'_mlllYaoK y@BU ^Ak5qtyy驪bDO^\8d(Øc:. A1,ݫsZQU[[[(T4wՀ2yttZ<~ q,9/l?;O$09޻)*ιZOŖei֊2p䉣 'DoҤ D֚BuΉDҘ L_m(sRGBbKGD pHYs B(xtIME of@s#IDATx՛y]}?g[g &Q[t `7 `8vA#mHo(-5t I/jGY,Is!9s~-p }s={~;*xΎp0sp[D |XRaX0>&J=N?#so:6 4  \nKE/d@Rwn; Zek010hAk$MS4%Qze;W-kW;>KF+A2hTYDrۛcK)My x@#A"uwN=wwN= Y ߩk5L~zj-^dȇr~vXo82Q%p{'bI&8/m ,iRZC> B !B U7X\Y:wVcD!iϾK=\'FGQz$cC #y(8"m<&HvmK46Q&Mj&Jizlng *Z-T*>Ԃw7R ųǘ+ҬWo1_w6<')?}Q6F"JBFZ e|gG;k(e\fmpݠRkxCc/2wr[NߪԕV$|A cfDz7MJR>OP;NDChU(VV8~UN^yKđ̯15GA>RsmNvufi3|f;PxrO{>D¸>U cNG\q~c(Sy}xS<0 zY e%>ԕbg)~og|m&psEx<,*"i50$k# țt#Lbr0ڗ@+&sCí9wQ!(aA)2P^'Xsc#_~$Yopᖰ^閶!a<O[d b`}OAfѯc5GF kU87ˇ7< A8D1}uջN3uG4&O11;uZ:Z緆lJkLC)KtRr`뷒~흽N_/񁘋/Α22y aR? Hܙ|lsIh x w m@2U&#pc ؝@ o'3Z&7V>CmN_oS.0,J2E^?fqzZȆ? o^tEN@8w' ӧZ nm˞Ʒ뎷r;HQC1nw?$8C~(C&ϿureQ^$ =ZQhJu.x(wz\$Kxa"˹PD<< ؗw㥀= 8B.$aZaVT~=4ͨD1Mڃs]FX%KxR*$o|w1qV@(e4&*#DTST{х͚TX9I & CB9*|qI"IRC`)P)'Z <ι_չ\%78௷\Ya{ōRKwN*K`w)*=O09:hF8x[($IzI݌랪 PMA\g$OFf- X$ a/cprr}+H[VhVpx\ z@:j8.-DU䭮#A!KZdI} K=F#l r ޼$Z';y8vF0mըQYBTAL {vrpPW};ֆeT(@RU[%mn]ۊR,&u|m y9VMV|@u&G\NqxUllTvclj6+1Cg,;\6 sem#20i޽w\% NBLs 8$/=pdl7ph0;;z5t(&}J@źƥK*Rh(;mS:SO"btan|{._e=(D5\}|Ŗb.(ryJŀ( TRci]s#ZQn2wﱰx[ˬ3Ĩ0)چ=PR{6|>/J)Ҥh'WxF4p>#:B%%C)Eڔx4^ Na :tVqdH^owCy>vbRFȷٴ5UQlC{ԝU]!j] `wgff5;;VlR9fq0jM!پ ,=˲^_?ڬF}5o5l8F'#@ܵW%v3o6xu]Y{ho]D^I\GD}Fhxx8pZ1 I Dos;ً]I@b|E0Ql;Kz1;;kR'E g;RBc>辯k4ED$T)%ιQܨIyYD>'G"rӟo +QwJ)άSZ{8L4Y#T*1Y>oc<9g,Lp/ȯfvv333r``:"usDQKCǀWR_Zc0 ZkQJ Z;jVsF֮X, )zM '$v{ශӕ =YBZT*1>>Fϝ;1הR_ hcbbi9ZKE.'At7QZk0 ]EZN[x7K/.1`ehh8=GR8nin {jA୵^HXϝ+drZ+J|u`"sjJR{OxﳎpԴ1f::#"4MgDA@.ZK$IŎ+o{DdYfsFDsN;sN%IZVs{/"^D*"?IPTJi` Qa $7ƈsNH ",ȿʲlV=jz SkM٤VyoAjUZHDȲ4M+I\L\*wb08Lw:@Mg 8 neYҡ2KιO:&=A xxJ+Ja`{{EDր .o6+;}jJ$eIDZ?B$}x@8{/@}H6Yc瀳/G":j&@#MDFRn3k^Wֲ,;O"{#I_WJscL{e_Ԡ? ZkrIz3[333@tʧgy>l ^~֚0 STZfҍ>URZ맂 IҘۯdh59sIOڕ%ܹsJ/+EѰhO~ؾZv{OC}PJ_ViͿw3=[Wr9i{]ۇiAp2 C9tЙݯqݯOc rYibccFR_4ƼE }QwAuDb@e4`B"rƘr7ڞ8?RƣNucU'r(IP`UX,aXޫbضGj}JMgz>P`ZwEk} PJuc#ٖy1%FII>^;}m/"ι+Y}}nIENDB`tcosmonitor/images/button_send.png0000664000000000000000000000166212260544373014640 0ustar PNG  IHDRrP6sRGBbKGD pHYs  tIME 2,>P2IDAT8˥kdE[} IT0&0.dѕ 1YQlR\iE(J쭢"BN4L~};;rяI Ꜫ_YUR81nmookkk?-..Nw])@JeY(PJaYRfRB)EEbRj жmǝNVbczUaǙ[+++F`P(`6D8YXXZ2>>)T\.Oy,//h4Ź,KKKOXAP e)%mF<{{{iJEDQDqLEaj?. 55(tZ.RA=rfQj_(Ji8"񘣲¬m  Qp?^h64M9:\C0r=<M.4Vi}'D QXJ/71ĉ!L4cqbgPvډBHt6@HkB@ΖT*-wtIn8I7{,/ @kmlʵ=I C 38*9{߻wkhL/L)H.(|P;Zw?v3o$ຌW>;~0L5L٧o~ /d- ťuIENDB`tcosmonitor/images/menu_restartx.png0000664000000000000000000000121212260544373015203 0ustar PNG  IHDRabKGD pHYs B(xtIME ;+坈5IDAT8˥kQfffɢIhjPlѮB@n(R mOTH](n,JMqςE$5I#E4!AAq) 4&j5*P7(J4jvD"yp5uMV3ضmT*\../\$ B I,8Bȹ 3H&C躎i躎C4@Zw߽a@+5}z,LiPH&|9*HyTH&Y[=|L0/Ḫ28~66J8Lva4Ϟ>'e0&YeAf2rr*o:uj1ʁu(#ǰ')~%i8q"Dd\.R {%|YLM\aT6YFAP5%|ﱏm;0\*n 0%aa\%63 f)ҙև./'׿~qq,"2-c. ,Uy$I;P S1@DqD68ꎼSr@+ " `T*)fF}fYD[O$~}2VW>`b.LoAhֺEΰ0a=uEGxPT,#J)X@ĸzoql_Elz ƾ+ny!zk JXk(( !0n1EB@DeɌz1ԱPC-΢Ψ V1>1nz:!t cqqI@Z]8xg; {wWȘ3,J-#?1VV XD@ՀqsZ>51,!0Tcuu c\W-ShS3Z>zQc,2Ze[j}=Ex060ƴ"mPY:ܻ xuXOJ)hmItUX^J@""am4'8gfL楒`iiLg-.! jc$i-cFmi,4|4ZṔ63hS Jա^l0B OA@~-g%ބ,:DGHg?MSa "{h.,\uy o{Gv8[V6vܢ0F7{ё_OiZyoKsnU)}snD1As{nJ)\tg3;fҀ4M嵋ko̽3gsnn:&w#RTG.|x7(;nM3H|aN>. ڷJ}KCCC'փE2쾛zlqDLßlLxe\i=/v|BZJ} "qЏ~ 9Vz?;22kJ$G,8p`vm,\vU(3!I LnG^fZXkΝ;Փ'Oя_y%90k.M`br/z~}-xOГ?==, Q;V*g{Q*'T^#xW((x`ǝ$׿~4-?׌1RT\;b8JeoOI3iaPwBW< AiqnqqJ<-ͺw|s:boG)`[QDXu5d RP4T{C((?OYJmt *+ۤAg/18#Ѐс/'.p*~8|z2ʬYhaԹs]J6ߕBt¡ PԔmm-[~?B\.WbBLIUTD&'K7 B5kx[UpwLyqՑ Nm᫤ٳsܦ)څLJJ8r8((躞ĵw/OR&M]C8 TSav G/,L8IdӉ|o^sSi#+'GSwg [`k)={xb4\$`4nɏw0 M@ k耝}@L i( p M/IENDB`tcosmonitor/images/menu_poweroff.png0000664000000000000000000000174112260544373015165 0ustar PNG  IHDR bKGD pHYs B(xtIME ,^%nIDAT8˭]hU}}4_&klVw1Щ ~MQDv1DvWK+ :JA*N?nݨkvLk4i,I7o.x9xһf8^W<~bpo.B:t]Ԉ-`%a^GIs lGCXxhV my4QBRR .SA3MyOl`|}ݹb=gfjIss?h]'bf(6aDj.|tZII޻/֮--*7Uj2+Um|`CVx cӟR3[0p_[׻kr;< @ j]ttvcQ&| L!ݥ mU,"MҔ7[?i DGoS TLqV,Xhj+ U XF[[Z[|gic}zogZ:/)ʏlnD%#˗u8E"iscCC h>Pmu!-mJ JOS.ݒɼNx2ݝ>_;J),ᰚp}iiU{ ֽ8~w4gn4E7\e|럜flP4h쮧>M{n4}ՅR,T,hd_zgKHqOLlIENDB`tcosmonitor/images/menu_screenshot.png0000664000000000000000000000135012260544373015507 0ustar PNG  IHDRVΎWbKGD pHYs  tIME .'uIDAT8˭NA0@7[$&.$ o V> `bp'#QL 8C_o *I|9u]|@` d|\ ,/ L̼h44Mcooowii%.4 wK>~4?7_t _77a[ ITVn<1^3bc} Q藦?38vڝE_40P}:==OG밽I$iX^,vX]< tz !(9iLU tjCu}\ף\md@ ORE'>';oUX|vFGDQDQg}Q,bXYYE/#Nb4E){J4 ˲hw:8C٤R uDRtH:j5t]'솸K(hg>(UJIBR Q,iZr&Q٥ #gk}cg$vt54)2irxq0Lb!ϑA+&@-)%q_lKl9U^as(XdeXC*3_ }e#IENDB`tcosmonitor/images/button_all.png0000664000000000000000000000220212260544373014446 0ustar PNG  IHDRĴl;sRGBbKGD pHYs  tIME 7_IDAT8˵Oh\E?חݕ%il%44֋A* DygA"H"^?F':|w޲vGdQ "sF3=" q9G_s;fGgWPVFQU$^DwJ;V+xn0.uZDZ Z+Du\֠(R8紈V8V8;"Ppuu w+ 68p(0~G{RA^}猪*Cp0%1ZBD% 93FDh7xqk kp nmͪW}`fyc,"R;Ho,gGrxV9GCF NzWq7M9pOOPch6$IBhidYF(y4eyyyts<=}uNuaRhi4h{_=]DXZZbbb<p0,ZhɐeikVPRIm%fIENDB`tcosmonitor/images/usb_umount.png0000664000000000000000000000125212260544373014507 0ustar PNG  IHDRnbKGD̿ pHYs  tIME))D;IDAT(ϽOHqoϳ=ϖNfSIbV`Bu) O]ɨ:EB:D!#LbQ3|t1hts~>|h?:IdIF<[1 VD|:u"F144sD;C%XG)Nxpcݟ6/63!XM~`0mpeXePƏ`']^;K{a 2&(G!Eq7=n[ D[!$p2Kpgrn# 5 6RHTd3İwE{k V' )Fc#:\vq3tk')$4dyCZpPq|a5x3×1u׸,@Cn$$x ݾֈ%KY]yA(I LZ# >ʐҔR/!C.XB \; O&=UI%`ÆN?]$iSەHyfGDC߲X3O4ˆ^oY"_}й+=hZ}irN~Q2IENDB`tcosmonitor/images/ltsp_logo.png0000664000000000000000000000347412260544373014321 0ustar PNG  IHDR PLTE~~".6:>BF&V*B62*>JF.2:JF:RBB.>^:.Nzv"B6F>2.&Z2*:6BB2*&>>>.::.:6&6&2*¾6.2*&*:&~"B.2>F"6B>6*zz""J2JFJ~z"&*tRNS@fbKGDH pHYs  tIME .7A$tEXtCommentCreated with The GIMPd%nrIDATXWmSFvSCs& 1uۘdNhJwZM?{zC!N;%V{>Z= 8IZ^#ʼnlW2h +4-@4}|i)Cl bM%:Dщcr[CK7Mg2?y t ݄Ud!"#Mc9`,Y(VH¾(`Ӊ"N6Cx7H4\1o .)"22>\8syK{F~ ah,2M|! `#\1}}t6r CދYX q>2&;C. YU>Ń^J} w\x;N)rٞ4_GXVV+[*ສq$t<&}zǜQIB<&B-[E⽠`w]E! hYgZ銰|рr>,+ `pw"pḌd@_fuQ3ӷ'|]g@ ǃu)VL{ @̫e|(8#޻zӜyBAq]9AE 7MT`%\+Rde eR)]FzW$-VG!_A8_V)HA4 kȌύwP$ ָptB4Lg}"澿aD 'k<7l e=uSQL>:]$?9`)rsbpf?ED F#j9 r[n؇6oLNqf|#wc-D')我(Wȧ :3ꡟ(:ܣZ?pd*ls(uq :q ?elW{O)ṟ^r4CU"1-org.oFW9͂'U"^l.N4scew_p/Pao1u 7x l[>K6Q-!{ k~b5gUPHqDY?U\ZgAySkĒ'M# +Jշd~!<xiUT14 jSY6b^%:@ íZ{OM>(ouN|@c\N  K;!tGO(n_IENDB`tcosmonitor/images/icon_mixer.png0000664000000000000000000000213412260544373014443 0ustar PNG  IHDR szzsBIT|dIDATXkUǿޝ;3&I1?ڢZ4EU, o yk)% H"XiW;ݝ;3LJlMe8a89dKga^a#I.E{ )}棹59C$ymu}Q|g|E"pɈ0 QUF Ĺo&֭U74Bhv,h\ CCC8,!%VrNP=@ O%]dLui!JsE#4%p\Kf f3g9n|z~ +~@cD4,V#g;v(Į>ƼOx>tn`+ 8=S#BH:o;l$!ӿby}g@o5 .m x孶 81 *tS0SLPL$ DGc;F|o_؞JIM 1qz%pQxd!G5US jqi`w.ܡk:9|;#lgB<߂HL1o|&#'=دut]Gə&g3Z;ZoHF (vH% |>pkn={O<9pDY0ump$/ !,"$TṄ_ e1̳F52Nz)u>;0 ntBq6H%dWMз֥>oC/[HuBt~fԊc:ĚIENDB`tcosmonitor/images/info_ram.png0000664000000000000000000000370212260544373014103 0ustar PNG  IHDR szzbKGDwIDATxkpU%'4Đ@p%@rFPFlڂ-Rӱ? "An-:A ! @$J\DcELgϚ=[}Y7_7S|9'w[|e?&m6SNi?Oe1EEʶn~^^S\̟'|?6ZZWx].gĉ7֘fs_jZ9e-ߋƖ.޹Ȫ/F~*~]ַ\/rݜ+b~0NJ0)v%R^?$n؆i) sKW;s%Ew(--/BHE`Y!,, ޵pؠɰar#m,o s?xʗnnvcYֵ2!B ܎(H}Wuڼ?^ͷr[͖a IμŒ46\F]R@(dP_ߊJW*mr\dd⋯2Np֪yy3o|ik$P  8|>`PGU5TUU:t@zk sUJSP蜘& Z~ri@MH<.S8o9vFtjk/pرnׇͦt %XeI(LX̎!k^:gu X:`&?ꗠ[ mW">0G  C߯ȑi$''gkhb,;tEE g4k:JT"e8Y@nTyO@3ztEQPUMPU Fbb,gJ;7]`u gYgGE]硹 0A- wfZe, ;8[ȤIwBtT5e~Փ3g5k%3fσ'Qmg0 pIm|Z [ft#1Kۈ]/rMhϧnݻl<#F "5$))/xmN"qY( Wz؃=@ ! e覡W,'pn t}'>} q\?11Qx<>ϟر̝;?aWu8Ȟ4$1 GGv$ Z߀ͨ HI\>~;L^@\\sPAN s1uaX9p<-lR}}UeJ?&* Os"HiȦ5_-ǒKm4M"I$b.EĮ]ί_i%^p0iӹ֗yh7|OAH8_ϣTaiE&4:@%CbD:Ё:D'€8$$b0QAb6b{iKg{/}s[<,e ZGxPPLΎgQ1X~=2Ou@8s$P_|Ab"$IO X7ρ#WI Gr9,c'zYxc A 9xهV,g]s /%~X6"sź;N9.0߻ ~X]`탋"ӝ4T +w䷀se]r*,4@êT7>1QlT@FNZܷgݷ?6ϫ4R+`$n隥ʝ[s?(J)B"1 ?p!3 5;m[ۊ㷑>[[6Pf, 95+yoZ -8tuАko#e۶<3٘֫>ub H'$ q4U2sEV~8P "aRGKH\R}Pdkfli4G?fC&ոR$Eќ&H{˯~sWm6䏻45Ƥt+VV%—O&Ƶ_ߵB77\^G}&"}TQ+ζgh-:271s9ĎM~5x)b! 7GM^}#&\N{Csvn^ӝ/[! K/a|)TOdqBqh#nɊ񝷩_Zf/d["!I^/%@*ؘ.Z<^r( ۡ+W>n>?ړ1OU$uN|׮3<<@2 -..T*uN5uH"R-tvttkK&(5jkkp֯twwcEJ:$l G 5BAhfB <*yQ'`=hZ)%*Lj0\ǕA1_kD l͍444H$RdX^^&sQ`CX.^D+f?= p]:;;֦?|6 @UTv*+ù.[[ds9Eec``nrrА}"ChM1R8>*BYIiooŷ >j_~ XIgXt幓5TV]) l2; kQ*LE$[ c1d,<%y +iՁCf|krl޾MGkp8Gw>LkI^ĔR8cAWDbUU( ^k|u d\ IENDB`tcosmonitor/images/menu_lock.png0000664000000000000000000000137412260544373014270 0ustar PNG  IHDRabKGD pHYs  tIME  h5tEXtComment(c) 2004 Jakub Steiner Created with The GIMPًoHIDAT8˝KaKEEPCm^EY -ZEhF@.H ZX0$f3:3M<w8[oZ z;OǦfpiJxl(Zc,P[ ;q,tLNFJYhх`W%}TT8`}= T%X٬GvAkzQxǫqv.\<7 Y]U"98_fQj7 z;R>(tk  uzY @wI{QDF<6QDB077˛ Ɣ8yf?ʀAzp!KUUGp]Ki@+{CL 84 䟒 6=AcǷզ4E/}u4,d:9ʡTH/[z YZduC=U!U#<_r8 P(?*FJǢVBC@P76ħˋPĨ_^x^"M-$ȏOc|FkVv.8d8IENDB`tcosmonitor/images/idiomas2.png0000664000000000000000000001355612260544373014030 0ustar PNG  IHDRPPsBIT|dtEXtSoftwarewww.inkscape.org<IDATx{t]u?3ҕ-ɒ&1vlc\'4M".I4i$%m()5$HCJ)nhjպ iH!uiub c[Ʋ,+c~̹WڲZ֬{fcf̞={FB)Nnd (bp0~[*{JWޖVxTX n !g{~ <|G)5o ύ.:B5j)%P`0ijer<1h B'WAڂYا}6 #-ԋ !.VD"8---,XTLWK)Qx>'tQB|+ H$Xh֭K122ƒ>'!.i8o🃐s*R{t(,x61q:::ԧnE(? m">/zpx|9|R<=~2uB|fL,ڵBH)ٿ~gXދ!AB=mZEp"|b̈_[~$}ԋǺ( `~6 qDUVaRJ~_dq F$ E1Bd 0LB96U-p 9B[S0-wF-L!!>׃Ϻ(s)|Hd25׬ a{u hf4c`a@Jp]cᖊ82A1ci#<E)!MB0u|P |G w$L>+Nc2IJeWa|9t \5ahf3ވIxA!QŵJ2F4(ֶg]~o~!mR@o vL2(df$M`F0IXF8 [*3Z*jNtẪ~uWJ  M`i.9wH)1ǏA&RuB-m(FX#f#C&U3Px]B `?MA,/H?PJnEی# Bj1J(bK0 R>hu4H3 02 4L!A $2ROF! ͪd;ɰo !A]^dDD1M3g"A*b||!Z#BJ)AHBF_G?S~gd?~ i2455RR*,IsQE9ʱQsؙ40vn ǵKr=2+PguB*ki/'\щI$)%`a2 sc`e\'Όb` csc8*%m䜽[[a]e|yݠa7H$!L"@HӤGFX(8vy\3#$(WUvkpyV eƘ +oo^RqH$Rd)s' `O35{z Bc!yo&U^h钆 AQ? +@xӣ7p8L"@AXP(\8;^c ?"DFª ȹeŅ2Ί<ŏ @aD`sB-^K|b~U<9u. 0Zs ^}ws \!+Ƴ)%a ى'5y}( +E8;@o3QY`s#((`bpT nZ49ϴ$,_<xJw_p[S?]X:@1 Ža誢sŚ1KsvLzBђl`e 1/ gBD4L$r J3r* )FXE[[J)v*6<5S@2m dsy"aFHDØ2J͝>FɲVH ~xɴi6l4 R !$N{YY3-_Քr1^S^;%֙%f|'=:Q#ꢷw*R@V^(HW<3Zb3 ftpVk/n;G Yms=NP(eY%&j`xrQBWJe|7-9;ST*N* :8C>Dz,o$>7HcJ<\?o R~Ъ fm;w=T]r*6=JAtml6[N;Y0m-?s،rA6mz-[sQJMMtuuD}՜ڹPr{]n׼`A,j`٬XnNo/FEDƛTun4K{'|h R (Q PdY>{婝{9|0aaCӧJB=zO1mql ʻlm~6g!R]5b <1=m\萓 2_ 7s5ؼu;_ϓ+YH)ill.$eq!~i _Mܲv7W(_6^nSJ}n|] Y|Ѭn?"UG~ 'FW̟wB б|+qp`\X~I`C0 ly'>^]Nd㵃/'5%0insګYdaY˶y?igJ31 >s9m:bgBA(flnz9{SyoT>@`ݚN@`x k YψT&K,1D<~ /@e͚5X[y{{ʗ!`_ f$@$օA #҄$z#R2H"9ptN㿳a6l-[gziqvLN0mj%z@!D=H#4F W$4*K33HDM [Y[r뭷ԹuVFF!nU۶tIe:ހeN@@)L T4BHiF46-$l?Ωٴi7pmsq>%[? [zyeCf-a [ ohuF!M!de M hlV;]C d2:oKG{ d^Suvw̞/pgwd B*!PֿR$֚__K4pWwڅR˔0Y z؁f{):Y:^(gr(F)gG~2Ypjq&l5=JG5ォ΄/g,;)T@ LOڵ{~v?~U~]7wqyecY>2:V} TM^;'Kcz߽TXN]?+g

S:9.JqJBR((n Qo>B]#p67mll4(!aFEkb'Z5hYY)hi 䗾_6d֕Q6 e5FX;$"עMIENDB`tcosmonitor/images/menu_broadcast.png0000664000000000000000000000165712260544373015306 0ustar PNG  IHDRasRGBbKGD pHYs  tIME 1 YG/IDAT8ˍKLTg LgP:Lv@kMmbh R4}Dl&nъlkbTT )ۙp׽߽_mhK]xrNx~҃W҅~c jt,j hmt^w=pOjOηwmV[#8W]r,a"T`8çu;🞏Ud5>giJYeˊUozBg_9tv;ױ3?y/~P8vd5eYd`LD9s'8u$f81nyE^39="{#1"P*MfarqAY6^-FSjjwcd"%#q 5M'`j|I`ͨۻs3%~_xy=6u. Y[<* QH_ӊPMƶNMG=ג7<#ѱϱZ3N;3aύzsSOk_M]YFYOL͐G}!%@p++a}EI({ T%Kܾ"׆d*RU% @D0-Cԯ% AgLFGuU9 p.,+x_BhtRd56gCЖ(T5ELcjR_]$ZZ`*6mTV;yN|[Xœ=ZQLg2k+kG;DFbE YцfaLJFW_ݑc]+O@/ŸS_WJIENDB`tcosmonitor/images/menu_newconf.png0000664000000000000000000000166612260544373015003 0ustar PNG  IHDRabKGD pHYs B(xtIME μCIDAT8mQlS{ooou+Ub`u&{$y !3>hFH|Ðibh4lR:0ӑQi냡orN/x٣a,߆B¹Z4?i 0ȯ =壤2򇂷4pbB  ['Oz]"Ÿc^|*Ig!Kk8jt| ܏áGFOd,^KLpkd,`Za7U;V䖖~/SP[Mg^Z%MML>TNMpo/QRr0 k_ vK4 Dq`nff&'yd܉ bwL d|~*1@t!gic§$ u¥mǎuR I1ǁ;\ؼVQxq2S=".MC !l|}Xa\Q6|Zw7驲>'S0CLJf7 ])yp'ͺ:W3"@W;&IBlM56< ޝkCP(P(PUݏsF psV篙Lx?s"\ , <ح"=DaGljes.!UBL/'U:4t]b#XCb\kSF%oR&.%|^f*ʲͼg0/z_Hș;hдYIj*FwfflKmi,WKHC=+ISˡ kj"IENDB`tcosmonitor/images/ok.png0000664000000000000000000000150712260544373012723 0ustar PNG  IHDRasRGBbKGD pHYs  tIME  +IDAT8uk\u?{sdb'mZQJAӽʅ"\N)@0PeTl#iqB$ɽsgw\An|}ҕz|V/\OȿQh@Dwl|D5cqn6;LPǀH4ytUAD0rK?;tn63W6Ýu(]&1B0ZIn4=gfaof}^?d{gPcq}z6SOT `qtr~ (rRF(CAB-`}L"Vc#,[!oƒlm\]1L} bqI<>LIoaf<abTa0c_2X4c5"P=aK\3;H {}R!n s:xe&—0 6.mz>YfTl9 R'I<Kq-JPMa'kw)߷9T~{kO|O軔mv 4`Id3]'ͷlv|ݱe|n&;<<`#*/ʅ)7L?!bqwP:+J(m/KwDI"\==*@{kcig;rмiq3[ oW 2IENDB`tcosmonitor/images/share.png0000664000000000000000000000240312260544373013410 0ustar PNG  IHDRrP6sRGBbKGD pHYs 8BtIME  '-cIDAT8˅T[lTU];v:t҇ӱ(P@>cR|@hQ@>6Qc`LJ4QHc5Pie{ wV{!hi9߾jؓ@]/}z'/Z?phyUC'<Xy}f\c,N.lMd$)cB. gyh}jM+P2gطck7>^Q=\E%6\aa2r1`8gW&p`nػm&@>p9@uI2,rThH>5N<9Ea=Jvo᫘i!mR 86F2ąYneܻg>_P&3tiׯ]x"@dPĒ@qdD HH!*<\Q/L:W_@&$ n1xn-da.ʱ`i3R5ː'{wo&Y-z=J G"WPPY*1tiÎ} 82 .ޫQr'qj3p6natΉ`58r.G nȰ$2!XRjEēqWĸWRXHKeF7' ݡU$W#oxN>BB 193AMEe#h۲F7bu˚{>S(yb:<)0;MĘH$SX Rs:c#8y6'ǾvH:h,'KKKB;rM]ݑ=,Dr`.7LB"B=1@2Dmm-~? H*RXJK< _|fT)qTx`EnZ&``u?6k\uRIwl~)>v#^P@9Cg CYe2ƖCEqu{BGŃfk`pp ^eh{K=OKPBQ% bA&Rܸ A)TU4MG(#+W}ptOOGa-|19܈ρ]%eҟ nMk.C~IENDB`tcosmonitor/images/floppy1.png0000664000000000000000000000143012260544373013677 0ustar PNG  IHDRĴl;sBIT|dIDAT8[MQZ{3̝ bP(^HQ\e\\"M̨IPҔ$/xxP.'ah8g?I9_^^}kɼ-=}~zT:D:ڹ|aZ > ;/y{oPSS[64ơ;ۿ U0Txq,Gg)ns=[e)]n#[CѼJCRŪ Y<"!(RdfLcׅg~Ր͕ח*eNK3sZ,T@5Bx/U8'#CI|~=[ ֱTz@8gKHp41u8\u\e"!3a[9h_*Ȋ^U7Cs^~RWW'Td*ɸ3 RsF 2BZ +@:.'  ^) dw*yf@iW5/b1F`287 fՖ*~~9ZՀh$?1D\1qpK;6Be~BNI'XcgF.T(䴷=~ƚzV־x1bRFjgL TEd6W@IENDB`tcosmonitor/images/usb2.png0000664000000000000000000000244012260544373013162 0ustar PNG  IHDRĴl;sBIT|dtEXtTitleMade with Sodipodi/'tEXtAuthorUnknown! zTXtDescriptionxKT(L.)-J_~ ,oIDATxoluwv-e+֭( Ln$ q(>X|8̂QN!H6 uغ5n^{z#eB|o> ܲ-|->mOAbt]}XBa5(˅)L(htm6N &F Ma`l__1hY'ĺ!]ދֻ,Pղ;%,I1]aM9x FAX1790-GW^^|dM,Svۘ !< V}iPdb;4&bLlǞs{>{;?Nts=go-ZZ֪}ٳg1777omfCD߿}766T7lzˍX3gΨԦczYDÇMD JS~e')nwC333raLOOcvv?ϻͅpH/FƐ@p5]0#aKD @MD"3~gϞ%8==,ܹsػw/Ξ=[rŹs(>"SQۃ ScZ)UJ+QcvƕC4DiHqW* ,1s佇=ιxo{ kyyG.xfh1DQ[> @R}+Z 2,W, RB׃sn}o.Ry>x衇 {/G(BƜ$]{:Y@=q(v{`11`༃sAi ;x0Z#C(!$I (BKm$۱el)D+"F@ r9ڻw>f̎3xI)B?> A*I^|U^yR k"S,;F0 `s̥pY &40n֦h4P:[W/"Mu׽knlqwfu˻ d撂%"zD " 1^}  D`)k@+BN;@BR& "(+(0ÀP܃r`# kW|}Q=4,U DP}zϟǕ+Wb&Ih034M-Xq B5&4 0$GCR @&q 4ZspހќVA E M2EԤV XEA!  25CQHCo*r DRp,@A ؒ?T"s(@g6ZjA1PDgG`xabP~b Rp(*+~":"́.s\ҸQYH6Dxd3 6^SwCk&U6H$j5,Jr7FgѵB(@NX *Z{xoUD[SC $I !"(#'6JgEd7@JȩJwZYU3n)̸ _}fYC`.J)Dm$"P@}A-쒓ijuZsLeyR} _͹J+hacynh51uvDA54$x% .K*n'vT[SǑ-Rc֨BZgs ԯyPFCRWv`l>|DF⅟begD4u9g,* gNe@U@f֮Ƀ"*^M :Pq{pB4k+uuz -yY-[t0YЁЊ10BK @WԿPSDP*s nmy9݈}T +ZB>@$RYi#0F-6@څW` { HWJU"T)RޏT'sa T t]1pu^H Tpv:8yG :]BX`L4cDqVrHYWЅ;E*4 8/Hq{FxPaẠQChB* Vc;xoQyR"y \TJWQƬnSZ7@QNK`8X{'6-!|]&j&ٗ9ffͥR?Y0{tiO޽J@Admf&z )ekp;f`'1IN{1zSn}Yٛ%v3SriBVL ̨`2< eB50K6D ce*Z8æ]$iP j04xHu!I)\1zdE.VZ`600y( 4z #Xw-J2Qbr^Sv'c A~,Ղz[ZU'h 2g4E, hz2,8)wYEٲe@+l 歕A{5x :,'€x0 Rka}FL0dH"H.N|ߠ #ɉZgcV" EzD$RUV䁛q]ҝZ5,vؠF(*/LAbA :~Gr tEM,Ky (\@g ,v# CDcZ2 8`bELt m5W !LlOP}]h6'!ﭪG]an]?f=?$/\۬% 5QmrC(p4]i1t:0&aiZ]՟{nП(TJ>kaZsYk-mZ$IFa8yqZ Hs履}o>#OUƿE_~eZ\\,'j1===\%˚F$fzٳgui{߾}p1/1ScVR.hZ"bRrj؋Hw͆Itž>|`vv6mz ]gh!Z벩^7RP-,v] Y33[k=6EESFch\j(XkMDA`q,ED4MaDZk6wqGo||8?$Y4kwVU5}s.${@1Fr TDDr!>}t{g10^AXfטι:D[c\!1A^w(vn|;O}m5%I>b3V$i'Il}CD~"$I⭵.03>MDT:"mf8V5(jz{~~|"0%󙋯p=gY7l:)H|=qĎ yzc怈zrkYf]opX1RHDhqqҗ?Ocn$;x )^wֺwZS}:w&''<̟jFQt8̲fε#R8FVC+׮]?>SŋݓO>3gάnSF׿}=/q|gUsQWU +s?/G!E)%yTVl6111቉/8qb<|mb̗.]9h{gW8lEs$j=7QwJ.8< C1??c=vjk?|uιڢA k6 maTXF]]~Z,//4(pU)4MfYsf9B$ LRQUz=Kϭ/kM@1f\K$k evtF-8qڵkqe]JmJ8w jG/RXT,]N͏Q~I`f N$XXXKKKry/mǏǷmw5/#IENDB`tcosmonitor/images/button_msg.png0000664000000000000000000000225012260544373014467 0ustar PNG  IHDRrP6sRGBbKGD pHYs B(xtIME 6+}(IDAT8˕oTUƟs03N@MChjbCHda0p]DV~P (TԆJM 6%C;t;h-lLݼ}/< 9v ύ!`D:~dCg=8DÊm`&kf,P(J[Z&Miier1{bHOwtE85Q(XɵdyfnrR>Cƞ]9>4rú=r#=C `U46<9=w`G~mt߫4?i5hՋvaȃ)܎^.kexe=Z?4:"z{mnP UUx2EAEMu ǖ)TUWGa`Gots\טխmR-5>JM2 I-:;^Qb6e'$-]i1'#{j@4v );rzaɂ*E bח>ua_UU"qP]{xv$%W(v6NJ%탰 ͨj1C>5fUHZ qZ"0A@rhP AT4@#XX0-M *i6t֨W[pD kȧjfKQՖz C$1pafI mJetVeS?ʀIzhR%9F`@1|΄$:R?V&~#.ubUBDX $69,M-,㉑;=o]eM[i"^2 .ErdnOʉտ_cۦ߭ՆәLuŬgvFSdҹ˕+Kz2=`*D/+<+VJşFeK?hVWa'Kΰ%&3GGJ;nGHb콝 MnG0OMIKLD "]Mb_ȱScz?=Ɔ0IENDB`tcosmonitor/images/menu_unlocknet.png0000664000000000000000000000101212260544373015327 0ustar PNG  IHDRasRGBbKGD pHYs  tIME 5,7tEXtCommentCreated with GIMPWeIDAT8˝?KBao~0B("j0d DPPCAP~"Z@pRF!A^9UЉaT&,N791֬r~af6p".Cs("p{PKgtazt 6}Vͮ9EX$zRe`ٙ^4>S}v5AX{:=%&KUwju5tkx, PŀĺM&)*犺'T*y"g'T& >T<$n5 qp1qTx # E}}}v% EQ0[XfQT-vƍêC/$=Ër`2߿?grMUcc#Ò)o4UEQU:F;x3$ u3 // J|Bs(VNEE#/ (DR[q$N ?lC]Eۻ11ܾ}YeNhnntrY]#I$QRRBVVև0@1cFuoH1\xPZZرc줣qNbb"0h {C ā;ŹSĿ.woka%oDKKغuDkkWBV`8P/n '7Π @G[dB( Tm|t]իWuEQ8r'Ed[,|VZi]3Uw'" @$d=]dn3*eNۇcx#e4]jZ_!6mKw?W#hk`ҙ8NvIvv6WvN7 +3߾Ll1cF`4{PC8xOoqu%Cnc23ߦ1]Kڵt D' 5Ư hd;U͏I>=v6:.tAMfZǦFرyVbi40,'E#}JE\8e[ʂU(۽[%)7:̢ [X91@h9+<&HVˋ\Obvƺ9eny,$\6Nx-!X(SWQTflo(k7om;roc?'++ `bb tT+fH@)݇'߇&p#`cc3_Vk7D٬ڮiy@i^'AEީ(HrP_ G</~% _o:K1^X8 X IL&qiQMox`Zjj/z+`4x|u/C.F29H$Bt](S\\Xt>}YRu,P9&&&]ava:c6"ZwSq86MO.۱Tyal|  ` @^BN144n8pt2Q*Y:ęXaG)U~'<jsu#lillDGGXE(tVRR>^RO̝|C?W}8!-ῠa+w$ٙIENDB`tcosmonitor/images/menu_dpms_on.png0000664000000000000000000000100312260544373014764 0ustar PNG  IHDR7sRGBbKGD̿ pHYs B(xtIMEbIDAT(EϿnP|>vM%(T*+ˀK` `a`g@BH10U֡H* 4u8}Z`}S 48W]>W.=%p,ܨo4<.g%s JA#'jEY%HH,6q`C1"Cŧi#ˌe:+X ։ds)YPs# Jܶi P>W*dqb i]x*sb1hGb[S5r3R$(Njm/ڟ^K ~mz@qߖLj<~Yxn/QT8Nw>IENDB`tcosmonitor/images/eject.png0000664000000000000000000000121512260544373013400 0ustar PNG  IHDRĴl;sRGBbKGD pHYs B(xtIME:4`y IDAT8AkSAy///*M}`5MjTAHE!J?N+BmեЅ6NQLHLMb7Ej mԮc՗>>5zOØ^wƭSՕ=\ VJPtanUeʼ?A#HZ_Uի\UU_ /R*J Fl2~[zf%Lg U9ʁrRP 5IpXm̥lؘejn@]5Rj ,pQXl NDb '3 !$@4-},B|^v=a_l/n zG ̋E~ 'WRwg \1 M=6}ZZB 0 ffR ͆pΞ`4;GvocL`6j s-YzƘ `ފF!2>pXYY5;;;_)%2yt=1###Fa!(xds29)h1#e97<σRJI)H)a @J)twwCk[`ae8]_B} `a;Uk-PPT < g.!\9(J哓jppuVK\Rj[R ƘoOOO-,,|ڒ  "D"r c眃bjT*fxx8$X,ftQk=^U*|B}hFolV:::?3099jއ X^^~NLLLлbzuvqqJܤ'Þ>55u8>r`L2 i/VwIENDB`tcosmonitor/images/tcos-devices-32x32.png0000664000000000000000000000523112260544373015457 0ustar PNG  IHDR szzbKGD pHYsg tIME 9 &IDATXÍyl\WΝ;wf8{qI'*%iJWBUjY ڰXEO|- !P 4I8nbg_{gi;h{}<=":`;0mxQc'o3C묂]Hㅇe:g^>U@cV> WxST-5[nhB|W]|YX?}Oya/x%:0ݲsz?ppУ:He.֔ 'Qі}$pm0!XߟΒ<0?z#Qڧ޽g  Xxٓ󁶙c֐`pW4ɸ\qrVWp=OsXj3`Sď!Hu~u<7>X?PXa6B_z14U`9p"-9pN24z ԩgMh6U[_o~=snx_ =F?=0"oȸdY)0,f!=@GʛG \C]^H@BYRPS|6г&ݺsӽ9r}\͹U):82 (pk/5P MGfu% :ٖpc~:5}-kh |xxG*l,gM7E4gϊ5TU--os]yLv4Խg[oH׀7za"TM!ZcV_\STUK lѦZ=_Ĵ\Q$} )U]htt4)u:qHTUq'k<̿rI8.,EGv~Bs9Cq38t`Kʦ7wڭtR/G,nذ) Dm#o/i^$ѪHU zmV~)RɳP$jPrki*F zMkڪ--y_&Et5]e]X6,_Zz㵵i:,LvkzߵMŵ={')M9?[3E4jDɧ gΜٸjU" )%U # bMhTyoko[;ipb)7nJ1FZV Q+mRu%ByDJLfV~< >.mw|DQY ԥ@#%E3ߟB!5Nj =# d=FFFF+w$ PZŋx.]kzHhOULs=Ǐvw_ !y(CvEsC0lmSyx񸐗twۭժ"8grOjR1U/p  88~w3z;5xo(S*jo#~Z+w?.cQ(HHl)m4mw7{J)PM7!=o̮pe TyT6}tvveJ$˞U!WJ6=rSÊbTw"PfC ^_ Rʔ7J6;O*3{z2c0 >u* ~+TА"@4tݫj!]N$ɟXв۟HnͿ8zJBs Ztu utt9v-[O${dքPR]_#S.5)AJ,2ĂA!@N)g& ʷc^"IENDB`tcosmonitor/images/idiomas.png0000664000000000000000000001450512260544373013741 0ustar PNG  IHDRCCʸssRGBbKGD pHYs  tIME $IDATxi]yrϝ2hQ617@6R0&m!P8mRC-HhֈENXV$NI(r>s{.p )EMMD@p,<_}!ޭ(?&Q`dK<; >"y 8L@#`\ g̩U@LBkZDEl xXҬ 3RmYz_E0v>Yn={ ֮͝[+>${[ KwQW:9$?, ΂cƺ/ZǏ=1ꍖV7ؼ|^<^ȝO:况n]^Pzw0 | O$ ]bX =׍ML(H{TE_\<'776WZH ԡ@(a{*)Xk1=ִyV7{#Oa+k)vC v$Q2z;wKU*b||R5kl^yՅ9(hQשTu*I(FJ)s/DLH)F/rXqH۫0RZpx 8=B_~% ÷zc Mt8u4F$a!J)k E)~~Ck o-Qggrc3)pEʃѻBx=_ۗ BWԪi..g)fZI\$U(FP)ȳ 裔.CE$Q Ns|!ؗ<)p[& ZbtqmZ(-^Z{iٳi3.ߣZkP5Kp DwxqaMQZuZV-as+e7W,7/9aߥXcO?=M*6q02Ҧ^xA1a IRl12>N=JV'N8! ctH)@VGҨ7?9\SR[ R>()ijXZ$"Z/1mR)(Z!:KP%J"D)R !BZ588Hu?9֬S kV܃[uZZ+=(%* jtk8gB9uk Yv( :se\;[ԒA~'@Iq+V-_DXA!JJ Iwc%8c(n:u-v0BC2NGqdn#Ct$Id$K{x[[}Ft7~&ϑJXSgOyFgS+eI#u..a켗@ջqAG$.{ $!&lm u 9rD@0&"ɳ,zd>0-7tVBtٴs<JxJҮU7a{<8yq-%QzK\x0w퓯c>JHo( tݛ3ojuc9^,6VW)wl Ol[r#Tzn%,g?R휬nF)$r^]r0ڒoܳϰruJA:S%ր!Cz#Qm bmZ`5Pr}2M(nxϺb'6V<{$?}Q4ȅ9O#BTh$P@oRT\ gɌ}rZj/7wnoScjƺw2-X|΃'sRn%k.qj:>L0:"W!wʹ; ckfHbi~YG:kM?0FƸP3p'׻`qq1!m "`qmހ׬:R2p\d]xu>{U0 .!ԊjwξW{nDZ{@tk[c&Z>x>BSX D9N6X찰ΥU./_㍫+L82&ve*W7?}gtBțm">fdnl P /nCm{|;BFBI5Ty&WYZYamu677YX]:6@IdN/z?|%/V_tY 3CWX?\Թyߙ7Ȝ3Scr F#I$=Af:kovc#T8٬#OǞfRe' N;Ɛ,\glܳȹ 1ٮ3Ѩ OULƒM;4g$oUxz OZ_G@/ˑB.u~A j$c: v{J|Oge)886C>Ƀ'f8<&T|'w<X˕2?{SikT|G-:`5 CG;=Fb6mĹY/sy}.{6P:x?o| .0R9 Nq;L!3oDocqlէHӻ}ъ2._X{߸K~Z9 c<4EV! guzqu~YnONq=|i^y;hOƯ@g%"E~@j!qA0P~8p8}E ;w2:+fٗYWgߞnjO0Ns,~Tv78\zy[E澐ԃg3^I)=;'E]NxpMuoU.S"W^DOwdin(Gرc4M}Q^!}?us̞Y지@\f-CHPx?p聄G'H<%WGR"hW31{+ [_bd%6W8pEdq#{;ݧZ؟+2T -܏lr`HUJSׁ@DO016I]O5BU! kDAB%Tu5(33ރ|gf ׿]cEQѽUw8/#{k"q@$ɃMD̍u⅐zߜLF:'Oi;D<#㠆VH'Bc B-7<#2*ozg~z_[4{qH)BE[. SAUd* &weF>+-߬JI- tVڲ-VH0>C:{++gG90`qeCuN}|aH{r Jzrqe9c2;HFjTZiJ}E@&y;04U&8qoy2k/əoӟ9ޣMԂe#zFM\/&s;]xw 0 & #  Ʌp;˱:QUDfc'1>n #{ȗQZREnx`2xۋ)-QkB]9OarRϖH!K_6r3Xg0>[6^mp9ϵl-S|?2»5jM&j="D˜\P(<+ R( /\NaS S +08WPKʠ]`=)c!JmX{{aזM4(((LR%YȑBdOb0.'9fLءXr/pΗͦm[<țUz?lK;5.:հt (в@J] 'opaZ\A1pFY*눛yv_yBI++D8Q^QHjh媝wejutoܤ6:] Al“g3Vz(-m0`W\bxmLj%Xk#N%LLѣiʔo R|aPަ;O).b>ql!p#xgGo:HNܚ{mnѸ8n0|H/m%cG+,;:B@K[ ]x=m:lF fi{3iÇ[t: =BԓKP.ikoiFO<޽ >=F^Au5\`|YF r*=JWNE "ڶ-446-4y55Ck[DNb:!ډ\ *tdV*{U,(,z@eYKj9+<|>6(wwDPUW,fr?A۶M.#xugl&S(UV߽EQ`O/V"PPbDP:7avh^}};Gkb6u^{Kj}ʋDlWOos8|գ{ z oeY'pH/&PT;efPHեq u~&0KǏ<}} ϿtlTq5,/W e'xdC;_M\.!R_#BCIENDB`tcosmonitor/images/menu_reboot.png0000664000000000000000000000206112260544373014624 0ustar PNG  IHDR bKGD pHYs  tIME ;\IDAT8͔mLUk_ӗe+F1te8.۲͗9(ƙdhA]Y ܐ*e vctP<~iћs=wOAypW֪V_C )Rp96篞͖z˚T* H2VnN {^v\׿dYW0̆@ηã/D,Jsmd2 $%"#sd>~ðc?uϐ}~ueu7c*ĸΤC྿TR:&_M~~= >ܐoU1Ce=C[Vbv)G:2-3qom44MA!9<֑RAUEۄG9~&[Ü T oӢ5ڦM{e cЙdtMO;8xά[Ae83p{ *?7`ĜԞUT 6K2i̞xx/ݣx"1.BDfaԛv+&{llx 4jg).|ep;d{'.E7FcH(CEfs=p\2=q"I]ˮCn5fp2uvCT 7/tfzwP"#Cy,N;9r T6}o<*@$8 7TC;9{+xL3$՟2~f;WA7BmdR8lηYlOm؟ ^`g|Zvfm-FBq@D$ec<]ZZ{?*,8yO~׏o}Ų, @)%A 7f)7ﳰ0W8V)[w~Ų͋AP>yy.P][>pMMx ,B7Ӷ} g )B2 ) ɔR'סPo_OxTJ!-`)%Ig@fVD"h4Hߞ,B۶KU> @UTRv ]׏7>mK)Q*'Q-baMa2[X!UEUU@%"DY|f0w_;#[ Oؽx$N%DM`oߧUնmCR`F`w\\nNFP026D]"@URR~BEٴ-<#y>/DQW4 $_CJhFuup8nha(Y[+*'l"H^+RW!U(J&B1  y>p4io`)(BWfg4M'"H&I$Xܛ= yBǡX,H$|t]gzzzL|ёUj\,(0 j2 묭H&RpgƎ=pJ:??_rB6p̌~t]GA.#LҰfY^^.[fbbMSW]vs߼NfѮ *BR8N5<X !9{bv(Z退S($ɻR7vi躾R>aH$O>].N/ܼysBJ9455UnaJ(B4BoU>/Cl@ӴVXKJT[eM%̦`lFl`G2?C{ЌyYk5¨ܐҝj9M#N<u`)n&fb@ʹ)U*9e[[h TUG.^`\6_ww7Dw ;DKW"MIENDB`tcosmonitor/images/tcos-volume-32x32.png0000664000000000000000000000525012260544373015345 0ustar PNG  IHDR szzbKGD pHYsg tIME  8EX 5IDATXå{luw^ྗE")zY8b;H1Lu Ց[F Frc4hiR(cnǒU])$z"ԒϙpT3{݃ g݃~`ЅҲRcPa?zzPf!D[D(mJlWQJI!Ĵ@ _{o"= dYz;9ܿn6R; [=߼xZ}À6/?T[}k33홎v^z\Ӽy 隫(@ލ~qa詡@؍~ѲO )=IIDCXkI&חu]}OLJ ]JB x+zj(S>ZwݹӘw~Jy0 2Y>L@u _`iie\gxXWw?ox⛏w[\I'C?z]4(>Jn1gfUkdeY``S=$ca 0<4V yb^M>Ϟݻ>IXē}twsH0 ~?MM+jh$'P* j@g~~p~>_`4T'tkW& #H&5 w+$2.5!eP_ Įmjf)%dH$ p]0t z{{ZE&j:ir9-e:)4R12rTB)fhI2$Nx"ߊ+pDh.nj祢 %RJ" 4J6v! ib&Qױmq\A#`4t鸁m'|)][PhWTt!Vz"R*Vk>tC'/03="B|J5dnZR)x]k۶o]Q] %~ze/ԴOsxROJW.H), B!,u\KbJ-IDSSS)-'`vOރo8݉rgʟ> FRtvrr_"i8 3Z8Ԕ,ڥz F<wčLu:cxWk몵P(*؝<6Xh''O%z8ǀo) ܾ\" qO:%v8+өu;2mKxZXD3zVrmNbnFĉNў;n/kˏr# =jH0~pH/f'[2mjzZYyNQ;ZT nZʈD^(&`ȭYGIèښ;9*F=e:6 Gc-T.bVC= C'.^$tӸ~޽g$Bz8Jb9#tEf.ЙqbkwB\KTƷu~u>Phbll̮pZyT(=^*b~~JC%XsIZW).̚xL{VsA`ԍW/JR,1puڵ{olts۴4"infZ/crFvBt6ps*3@8I5:~jrr&ֲ4iM;s7o(\`j6첤Jp~.!L!8 STٸ!4mD־mo>R,{Xx]"R4{?B=T _et@n=ʉ`ۀ7ر?<W}{ց@ͭӫcO .?L\)(| 0!Lm \AG+ L%ϭm8SڒyH &ϿNĻ*ptDq^A# x 0[Tһ\o}^kW*DV&]toEKGĆ ;׃ρ7~0 |zuvւL6wp[c..mdė+?V,0C[[%,05wؓ@bՒZ \`8 7H( Gʣ3{$ /x 4!W@6C[)kk^gAnV$Z>|ljَ]7#e E&w(%rWмFkfSf;#W~gkA3~`p6Q $+Y䒒O~}Hz3@h ko%%6ևz5@@ 7̞WW'vdtRƜ^-}FP7hiih4Ï"JMs"ҭ'礥tQj]#C5^hDWׁ^}:_QIENDB`tcosmonitor/images/host_standalone.png0000664000000000000000000001420612260544373015477 0ustar PNG  IHDRP;" 4sRGBbKGD pHYs B(xtIME 3)64IDATxy}飯gzss"u%ٖ!Q6VȮG#X` a;F=Yx,1XbH4%H3==}/[oPU_T}w~dqn ~K6 a0 @7ɽGT2PR *:СZyJIWJ()=)#D"!54TtE4"3V-cd{vC^FwRoOV-k% nAB@hkθ14FIwL&?H$eaARzuUIYq*o`@jZ @Hcm4nkvU="-%X+?iv깏?l޶}Tvʲt:Kf2y4-|ɇ!굺kVza t0\ |wl.Ss=p*/yA q=Z[֧- 8oaWBp0g3ã{!# `<R )%TѹT_z3  OL@Vl6=]KMY˙K?sHsPnm3@)WPo8!`sn03PB(e-d8m sx4: wq/nei(%RQ4 BJHWB)RJ(2%w#zv  ÀOn<8Sw cH_BH!N8q# D |n]nt4eY- J#MIgO RJ8/a1 T|_ _5@܀OS YH]7d20ɐHPJ4J g B(_+`$PRB )d'%T0Hj#Jz9h$lκk g0 mCHXeul(mVJPL.I+9E5Q;Pi8 J,T PAڶ(L3SjmZS0#iVA+ݶ|JGi(VVq` :R59cGd*"Oim' 0MLP !H);,VaQHzeø8C # !5B 8"p:{MwZ0 1H) h !4Va eѴ.# !RΎ4 A(K#²KGum fLiĝm~\:H#hjҦ$u;Iۀ B;Ь+%9xJpԁeyA| &5UF ivJɸ$AFB) LLDĎ AJn0 ;42@Ngˀx"F;"hܴF2j>U+mCVaZX50GfdԧF@kC8cP]#n&@4ԎH[5%5BٮEj :*OBttz swF5PsF$mK)N``c h;N-q;HiG#Am]G4xa)e +#$1v$ȹҶضXY$+m89GҶQ7J7( 4)D? 7RgD0;%=P,`  L#)AYpa';YF7KC C ҄0 TJ{A!Jڟj'۠5RCHA sDB d*@>hR&  PfPɜJ ÄVaD>5jқa!.um39RR x<7l*BQ=R UJg!Y4@t&:Pds_<jq;I_$J)h@)AT&ގTJGoe##LK P! 2J++p\7f#a,#bF0!t<5kUhe% LW/Bu\ׅ븨T*ب|σy}Zk$6vQV2V[B5ȶ*L줊 JAi;жSHRmHBRe,s=j ͦ)$Սf¶vr8mH$,v8@F!LD9`Bi'Cz 4 RQ#@3ǿ'_uϾu Fef^JkfcNq`xptt2A. ?7j0M󯶕#UBZjHd[:li"aBjs|೶Doomhǩ !T"lTBJ6fsAGk$*A:鵀Rڱ4PJޢJEL(A1a;]Y) rTlMӞ ڵ7VL=T #|a)ePw*)*:p g2YTPBnRe(R$%";ºd;X,#NEFJ edfӽ7{9_|ٷN Jcc{OOfdPRu A q\xmTZ*I$(! %Y:P-v*U.0aHd=lw(%AB0f& "p{(D496~gݳ0sڇWgϞ^i۸vmTf*mÅ &m= {nGātAl6(/$9D aVjȉ'ٞO(BUYߨUAG{cx4ɘt8<l*^֨nT93go:u+3aŸa,͜*&&O?sOɉ'TYq>w_߻~H}? Hמޟf = HSB3aXJi194I}79鏝x2PQJW*biqY|/_ԡ$SW.zwðiYl6_ܻ8F渎S키[D39[؉TBP;vQtjy^3ϗG}{Nvu7u۵;V6-&>o*.?p`ȉ/~޶fR^v7W*Q)YC ;ugO;c8¸i&& ~B[v4V0 ʌq1#G(S2afh$-T&WM tҊI`TZiW#}+/-ѓ{㲼/ngHoapP BȈa4ORuKjk>NG=<@KfҔ0 ֛liu~2ƈmB?'&&FFFJ鳯8^0m NsJ 7PG.>:(H}I;{)%P@(Y~ їUMfΫs]rsM/9M];Ȟ=cS][7?l.-mkP8c,Nlfpppx```*䇇wg5::4,˂W\'Oo_~]'q.>g$ZL`0]e/^WZ{&{. 7.\A9|G^6(e/x[wl[u'm[aig2Ldddl׮]GST~ddohh\. mxfRw>RbyyY={vW_=yɗ666?]pf*i7838\g :L9}}"> Bu5 ayqd_W~r )N;OL>/5f-&sa۶bqO__T* <öm$r;\sxw7|kK.]Hg⧟'z՟=<}`0 `mdS ­rGϕvRs|\{ K.O{k$߰gttC}5M 5{tD9V(xPLa0v`{7Pہnc5ְ*/^8K/o`'C=ӟzSO<Î(Iiy[Ϯ ^R8[^ohœؒcē'~4ys-{׵"vB Auv̩˗7|'Or K?ԓ?>|Vn9c?qF j+7&n(S^,N&Um;ՋmoۇуR q._jJe1BL@~BIENDB`tcosmonitor/images/menu_wol.png0000664000000000000000000000154712260544373014143 0ustar PNG  IHDRasRGBbKGD pHYs  tIME786HtEXtComment(c) 2006 Jakub Steiner created with the GIMP :: http://gimp.org#X@IDAT8˅RMOQ=3u(B+X)T`p҅&K;c\`\W,qgPZBZ;~LgRsy\K.F/X,!bw8<Qm u<4 j8/*Ye JMzp{<!@~7x=N ʵJ&Z=U 8v[x,>¶/<ҫ<}<'ܓhyG=)Ispp_zyuݽ{EQƁW$pX7K(S9i@Ec__P֣@();;;zm45H]Eq!殹Ћ/>V%L"IZvQ}<GeA`rr)8 2dh4JO7dL_LFCZ?㿽~^溺7o( ^),( DN(jx'7x>.\9IBc2.O}}=SSSH"I:eY=N p=۠Ğ# '09tmmmsR|rrr0@,cdd`0xK j)$122>fٍF#N@aTw󑓓Cqq1+VLLLV;( ee%w:Lc7zb!wl6g477:@EE$3::J^^+V vZ B8N X,~ɏ(Y.zp TWWH dJ[M@C4I~~>`4Tw%LB"ॗ_,saA,:lwHI4l2DQdddDuřjw˗/WW-5h30+WDep8\vM}&33X,fClxuFF.Qŷ~blmhh8eܹs秭#ؼyCgz}B(V%$xC!/|<[nݻ^ "H$2'zS"26H$(ׇ,h4y#ѯ5 q@s||`69xJ4Yɤ/*B(RIM__dee@$wN$I$ u)rvLFaҲ 044F#I`0lu'O~qyDiiiY(ʸvf9eFFFX,Z FC" m򝝝$I *' CCC((e˖3g~λE s^@w^͛)**bpppfX,F(^Et] 1́S!g߾}455 :|vnD$FvlZAjivE#^ۭzTTTեFU[ [wV ݸq#ի 5_G8FQ)((  RPPU}vс& "2PHP)Y ݸqG~0e/^Ad>hnW \sgΜabbBBlkPYE5vTVVIE߽*5|0q-h߿Pq\|Wi_+zښ#8 d26T؛Y*̮Rq?U:,!DeZZZp8ttt >vܾ`at<`D"466x^YYYa$I"##5kpe՘Pwf7Tkkk㙧F`w@fMM+W vvuЭh dSS֭]EV˗MMK,{v͕+W.%;vk!YոBUUlڴI}7ʺu|}O%sk-&qG$2/|'\|0̈́BO+ ,&n>} Fs߅.jφ }SZF* {wP"𔗗i f|255^-m&(u[,\.>s/_+͛7FlݺSN( cccl۶^{)"۶miSo۷oɓ$ Z- p~-jTyOsrrb~XNNN/P;wZ#---̎;YhKK4&hp\ǬVȕ+Wt@>n<3ߊ/b?cq`hX?$`NO< d-7VUwĉiI`rrܹsRdfꣳ%At_ܓ}۟1FaIENDB`tcosmonitor/images/button_pref.png0000664000000000000000000000321212260544373014634 0ustar PNG  IHDRĴl;sRGBbKGD pHYs  tIME   IDAT8}T]LS[]-\*$ԛp !&&O8h3 f4q2\ h a"HgPpo-gN?zN>M]._6ceۇN 0ҥK_ڵk3g8].WC]^^+6:uh><1<~nfj\.ٚf8cxAeeeӎ_ر㟍߲ey||'N0MMMXvo)..;v̠( 8f,d2!`ff %{}arrի^]s~H$[給&FQd2 EҺ:娪$IB4,(k V͛ѹ9 y@$ITe( e~JDEwޥ.k Dž $%!N!z=L&r4M(PUhM|07ap8ٺu+օ8>|'f֭[*n^'TM$ /_XX0yV+xg,8[0ɨ0K`uuU! N#JA4F.BedY#ieeEamې@ T,ӕ+WBkRtuu [8NDggg鱷oSUv9gNEa0ׯRmmm鬠"ѱsc===lf***gLMM.O4773uuuLH&bf((($I\ /BXϧEQrah$J)rPU?~dD$F*dYlܸ;tLLL`w޻i&R!J!LtMRL~2l6kzWUUUAanbi&aC^xT*eL&a2  2BoU>/Cl@ӴVXKJT[eM%̦`lFl`G2?C{ЌyYk5¨ܐҝj9M#N<u`)n&fb@ʹ)U*9e[[h TUG.^`\6_ww7Dw ;DKW"MIENDB`tcosmonitor/images/client.png0000664000000000000000000001137312260544373013572 0ustar PNG  IHDRF>_m(sRGBbKGD pHYs  tIME :EW{IDATxy]Uy>~c&3L@&JE:UQVKUk,j*.e9edH @HLH͹߽L{ܛQG۳^:}~ C~m<;z\0`:F4@C3*V]vw̟m(ad0L% XƛXUnUn5G#9/n)|ݫV,p9=y|#S(8dPmeˎ=f.jzЋ1FO=coxu2'QBlYےPH6u!߽{_U-0-Pw[zʺxHH*@SESAcHՆ"/hu=/_gͭ(IgqDݛ0P =N)/8E]}:VX*ۊx%ɃɉԊơb䄹+^r^u1 !/`!tMȇ/?MdvWK&֪"1~"H CĀD#ıR),)<8Ձ]e`TY!&շ\tJzjULPUT& @[*"HboeQmL-&|vYk?պĊ$$ƯWb "4k"4b13V޳9p]~I\.߸28L`,t0īb*x]Wl@XbIBT(~2^N;C%5z H&Ɂ0HZ! 8Sl"(\ŝ F_0S&V)88hjs6zƔ,S(㔻:cwep[s̘H&BT8[;ÐQƨ&&8g)6??^=Ž=b[Rt*bOS0,%gCԅ&jvgGP;vԍG.D5ʚK )n5;\ riۣ5t f̉h:l89S&3Qm7і&kB !j#&206nUZ̕؇6ubw1 5F=aIkN5gdۦS`iyH{"Qj.n]hB=-;ajc^ՇRtӌi*1viޏdN>#5{8q2l&Z4F(!&M41c[ᬕyh"V3k1Nwvy15>n0?6G`cQ=D!؎=Q4tMP;ҝ!m։M|Ztp8'ݹ'*t#I 3Tc޸ 9…\\u6D] if"}6=]L;f{4treQ(|fj~37ލDU/Ljㇹ!/->$?#Tc~ P'Wl5y1A)|0Vr 3x!f9I?-slWM8%SFk_}`Yr_ fϔexlımWģb~vrMO' $4-aCc IZW+Od"=ϩgO͐:?ԁ_t]t%o3W/xˎPTN9y }<3;8G800GPFn{̘[_J p׺GN(L0G[馐!b]fب:fSW굧&)cqǩ1t3 8aKZ{u';!/Ϧ%cz+ -*.ӧ3kT|<18z@>وY' 8NV&30 h;ZDXd7~p49RkƅZ=rphXޑ |aw;?#P<9EDPDeoSU<9xxZZwB|xh.=c[ ϩSKۨ Tc7Fo|R<{4jDnRxPtO~&O4-B#\ӝ22VkOԦaNH I,A`юO?s:^N`qΑ s^w~xX rwuI2V>c4=G,/_4e'-' Ƙ۠9 ]~t|a m'(IH`L8 ==J+(tUHyat=W] _.ٱ}7W};|dh*]1+E4~yo.ynض'l妻cνLeZ/1%t"Xulݾk>t՗k#Q{fi< BSS<ڷ?(|>~z)2{M7|uY̟=e3kؼ}Z^wo$bޛ?#Oc7 bϻFD;-!\%6N?g%_tox2jH<}wo!ܳo|HXbժU\z%Mo}5U]txx ❉/)\5Xs.3Ɨ̬.r,/?S];uog…TU/_yG{<S)viewϿ1jg:͘ %%3Mo!D3$eqy |ϻǗϼڎ1cW]uqPfܹXJO e쿬/w=(e&@_zX,;[3ZQy` J%8"5/K| M[l2{9b<\Fiɔ " ^L'ik” Rsb }{g [a՜CP Y֭{ }EJNA/_ / &$B_l;kj1ll2A$,c*p+'^>v_}_z 7)YNab4)BTWdԘ6WgvSxa4 NINb!b|c8 g^|cqL]{^cPP2;>c01m`'/Z*H#J${ǀIĩ#J(uVmv=c*}9Aג$7^x.M-UQO@49B۳byIi!AI3]`XRG*UTˮR/yhD um U!?x, L;4;?GAb:Z. 6s 8IIbr˯ٞh{+m1uƣTglekS┌5=ˀhqW9t̷ (ѴBx"z1&cMbbf#lsڦޤ2҈zxYŤ3m`b$JuI ңǯWI(@sQjLj|+d#iW"=&uĉGTuǪ(GOs^֡Nz@}j /cѣ7e:j벤* bcBϼ%>hxx"LL)AOMxcÃEjZdcgxcG#V4´ǢXe&W"+gx+V7O6k23`e:>y+.Wyt)*qȘG+jV0p43mf8S: WcϤuݵ"P^WB/yҝYn4]>LJE{Xha&y;8n4tx̩N\11Y# p ϛ ͑B`vVgBn ]_zZx!pgY D2b#'kR'SO 8#%M '*#qT L: q# ͑wʏU8(-E ƄTՂPnUv=()r͑n@*ۖ߄ԕЀnjEU]#fNw .)Np78{O7>.aI+sׅ+~_=#*-߳4s$~J\ϴZQ~9$%0 fA-akیvþ][AթFe~M+717+dtkzZzd?JKOjBxIENDB`tcosmonitor/images/floppy_mount.png0000664000000000000000000000140212260544373015037 0ustar PNG  IHDRĴl;bKGD pHYs B(xtIME WWIDAT8˵OQ?n*("Z-&hibcacaec$ڨA 7{{Rݙy<8%=Hvl Po{ a ^' k׆ZZS71@t]ߴ+ac>)` Smt"7T*Q.95 2!^n/m`XPf*̓:O^X$Z2]0Mfe<,\^jO0Q&IugX*"*O5VJ|F?rIӳ֧ٙ >߹,8QG>!JIENDB`tcosmonitor/images/button_refresh.png0000664000000000000000000000304112260544373015336 0ustar PNG  IHDRĴl;sRGBbKGD pHYs  tIME xIDAT8˕{lW?~obka-I "MHȘd[;6%^6-P b\64N ₤ܺ^ŷ۾~wu$OrIyOy1{)CE[S;XcpN&Ub26mB4@̓GDuՎCooviփu|yn_꒰(?4Rt8]=z]gx>?~dρj2!(r*wo^W*jjH9.5u"iWz"j~-׶,{`7ϼ՗eB'V;KwoZS9+FF,a1 >¹ [d媂zKhEeNV\i^^?{0V֦[S݊%!v'WzǤ*;nYM$;M)3k7. W{sr$cwVlW1::! )6mu7ZJFL=6#8xV=QT,t D!%Y^Qs`>-lϛ(-Zyg8>:jxM'6X5GkV^!%|\`nVQ)ecdLXh4||ˁ.yHR/P~ڦ(= yx4NMIMu at؎8s6!&L ρ~AyӺ=?ٮR^!YhloiB5D@iO B#>{;VDlIJRcӧ߽(uҏ5v+aHL$~c$5znO/Ez߾v펿ET!Gk!z ~)եlӹ'/}s}tY2ߗ',XzEv]sSCW Hw*7ߙ6\Xk \Hc}'"r,/ih7t>:.3#` B ;;fZ&N2e=v,nBxx@h% n5!SBzЖri 1v̸1HH͸3;dO IENDB`tcosmonitor/images/inactive.png0000664000000000000000000000120612260544373014110 0ustar PNG  IHDRagAMA a pHYs  ~tIME >M'IDAT8ˍ_HQg>d'BK6A@R2+bѕv7]Dta *#.VE $rkt# 3 im͝`ҏ޻hǺ&4 'ЋߺhѩA+VM? *繹H)+V|>`ɬ'M6Wt` #xkd*2·P@ 2ffH6D[s'\F&ER8 }GHUPMs*RJil"O!6qI33mT͜qz.FuJB x^A0 Ok{G: R&S q":59w]$ d,R]. ~mBvA2GYh@45QN[K [ʿ FC_(^z4MRxn'71UVk1RKY̗~ bO IENDB`tcosmonitor/images/menu_tiza.png0000664000000000000000000000157612260544373014313 0ustar PNG  IHDRabKGD pHYs  tIME  1$qg7$tEXtCommentCreated with The GIMPd%nIDAT8˕oU潱l7I8!N!QB vEDJ]@ꆿK Xm%]W"HB PT)mV(qb{h6 ! w|K)%At„R4>.rw6Zk\=dBNN. KntxgCimDZNZknw'Z/e_fGl$mxEdRpL|[_|CEh[o{"=u31h>&GƼ:[,e>݉ɠG]HI!WOa.vo1}L!=n8Taq;e6fQS,%c0Oo7R[[ھiZ)5W]5{**xN%wQ9^xC\. o_lt$}z8ImdF^U5.5 ٙk7,zK 办`gYy ?%VOqѶv -t;ڂ?37e9IENDB`tcosmonitor/images/menu_msg.png0000664000000000000000000000137312260544373014125 0ustar PNG  IHDRabKGD pHYs B(xtIME  MhIDAT8͒Kq?vq풙ĹJiwA**(&TCQK_(҈2H,hD-K眛.}{@y8p885IyV\lu7|DŽg&U.f`R+Z|tK}|L0;v=AM%]D_ox#d1oma#8>~ g}c[nIEClciיsZoGA=C)^Rhg,t Մ* J{&lʄfNn=@-DӶf )Ө- qNQcE~ i@]}25p:M!laAs{hufed1fG]ÁjE$4M's2 /?{m&žt9E۟#լ}{񚖆N@T01R&$4M0TT9] ;n?$Azw;ޝxCU3%7Ut*]gOH~#k3P <;5=uHkB(7~O@H=9D~S(r8(8T;p0<6gogw|5hM8W3 2΢g+Cw`O` <)Χ%1}k"U)bMw,v&P'Opv0|yqc1#Okn8SHZ7"wLUQ& K'n ~c/` g39v }[sC+%E(`MHsRXku\ v+:'f2eYbmL'5KQl E$6kb3cZ[LSh}b]ktF@ ոJ䛺n]9#Q_eY6lv݆QX9`18H>'X?Aum/sEiGt(Ā:Rpޱ`})JnhUu<ۄEL?N5 d3`\cʗJ%!1"{{/L5vNg_k}{)j{ x<,xHVY!EU[4PRU~`Dه{ARƵc"!OS05=" v+Ni~Zqo}P*fBTv`s5ƺ{Z<mq'o[t:ZyN{:e5m NdF)P!oX?^6TZ :a'Zky3t FP}+V?EXW;i -k㯁I4E?jA̒UJ`&jlQ& jb6>aG=? \%IENDB`tcosmonitor/images/menu_clear.png0000664000000000000000000000140512260544373014421 0ustar PNG  IHDRasBIT|dtEXtSoftwarewww.inkscape.org<IDAT8KhgLHBHը+& ҂JKvэ" ]Rƅ`Ku 1-i411qFIe?O+Ec!pQG`s8Ʋ @4߯mڰ1zt^`qET*-XHs~SIՙJV|Rt}#ה]K뙋Lɧʕ7M/JDڧNWrUsK;=rT%'_A*vitsGWvjUC3F%њdS}k9$j&]toeQP5~Pν_ ` )RI(r;͵:.iB `dA϶Ր wj2[ԯVI8RwU{#e`g!^̌#^UVJo5RLZ[P">WXPFDJOz'yMwqcLL˥ep)DX6 EЃ18o #z)u=<p ݘܺy%oLe‘ߤYQ{/'e52 CC}Y‘wҀ1t =v咆?jӣkr ;8TR-S>L8xK~C(IENDB`tcosmonitor/images/tcos-logo.png0000664000000000000000000003125312260544373014221 0ustar PNG  IHDR^RsRGBbKGD pHYsg tIME 7\69 IDATxyx]Wyfɲ%OI<$ !!#ƔTxKR -S-m)m\(n)! %!Bfǎxٖe`Gg>g?Zzq} \ksj.m+S@n;DpKfK~Z,Zj`'^Ճj֛"Cr@0D#a`8F'GT6lmJB ~0O hp1va8 Ix9\vX"]̗^0\㤈gE @F1Iw{gsn"( P'*X\ ,j ,̼8< l&ҥbEeAVvm^9y>[ |0`fd FZX"$*n. DGT6f5W4=|Hͱy;Ĉ1IJ2 5023]NArv@L*+k"V hZ[W4=<6-`9$np'9 5 Rqn-K9l0>1k368+,Q|hoGOskWkbZ ~V4=[V&`|W Z2FDʸa(DY}\ᴈ6;d0R8$]#\:vWF(̦wҞw^%9'̭fg07@V/NZ%"g:0b`e0HH#l #i@kҎ_WOGETuUF]Lp9pp!-y͜]&I1ElŴB%6HwPBaNDձ"( h{ՊV}k-p%`| U"%fTE|VZsx~F-%bKocL@80BuH VfYb>sB4,PD>;0\|w6yjܰke6Ty Gfo' PI5{Xbba,fD3$d-wpkz0]DJ'drH :qRw)r !#b IEmT[":{|?^߉-hLpT2$Ϻ Ў_Rlb^M'erW̲L<$,vR8Xzoqx;piJlxTϘe(;j,DM%jjgRu^%~Ё*!l:'GMIN@ nM1=녖lR)̸q{ u<|9^פ_F}' yj.b-rj,@k(=nj.n,Yf=ܙ% ujܰʌf֠κbRAH 70{,EX|=lRiY81j-6`*H:IǶ6s. Z/oLT>;49Wȳ:B}Z8v{`ڀO(,e Nіأc 8}frTXI5E6 Ϲh@M DM>T5nNlNo)" |BL[ \/oBL7ʸXK'<@$4owNIPSAf`LIe\$Z3Q"Xb.R/h̳إ["3`Q"{-=hyn"|yfoIˌɖ[~ۡW)/RM}61q.4O類>/1=n6l,`1A&)H NiB X4V%Y:H7N0dZa9FUP%ckU biә`E sa3"'_hVR a0❵ڈ j"G|lYE7u w?JPL1rTl#]qPPAPS FꨢC]l_*̈Ƅ1#,h:NV&Wυq3N஡yKQN)d,'Ҁūv-XT&JĴ|0B7sɲXS" Q]1G4{&Қ'aaͮ0,2䨳=cE+ \`E}BL7`8BTXδFKG/ Y`MY;㊝?`NaO׾'d1"(PSs'9ZnxfqMAD-Gc0ᔥ子SFq.DEFNikJUbi"(y d0$1#6 LS(hK6QȂsEvT4=cb=,B&u`^ī-Կ4PӃsyM= tB-+.fǸAР mAME{0&jo%3U nJ"H993~%&#q*.>~Sz*o'PY~ޖ5gFaQ|XufB3`;_^1ڦN@`KPf0AѾ'f5 $#'ҶrRꆺP7Eɡk9vjFNqMWǨ&?A+V g|vtjN@jXP&8/h-kĚ Osm"˃V@fa6gh \ru`mn!ۮ~lknv脯L4O>H%XW7)@*;xl>V(IR-TD$f~lfR u0#.o[)D@uM-=UɁb"W0аG{6\mk?-/giQsk,O~h/_rvJ]P^¥rMl(ޢ>h)  (ޱu* uVo=U;|&]^sakv|p.UDu3{Wu*_Ɍi̓5uA+Qԧ!+_XU#*Xt-'jϝf,/XMnr= 0fm̢i0vas_qE&Q0Gغ_F{HEk8."Uh =.kѵt.^#wgt4pm{I{Z_hA0ӚB@̒[H$=L\FYó$BEPE&].;'گ!IzjɊ:R7]ѽJ0VՀ=}$/sJјTb4׹"'ByP\2$-G+qW0U00Qn&),*3Yret-|hGZvlm׼Kw)Z`qT'z*b_Pޓk.RDöM>πő YФF{#2E0uL͜.9&((Ri#j"=oQ#YF`|0t*F5TE]˱7MLl?07®-Dӣl[Xu=#Očgޥ^Xս~f8  8!Jȑc7:bx4Mh K,;b2{Id逦~%6ҽ` h owSCNFOpd9ikPX^u~YO''wnnq񈤼5qdO3a3pkK oI@R:cgh2nqZc!Σ'qO< {5_hPPq%]뜊&[M P`kga؋[\B}xLU'zXT[`~ Lεa,uU\uBh6kJY0c 0,sz7#vީ1z´bEj$jFNS3<5očN>YoNqi9u>"h܅3`tG0Y!\>f,]*c^ GxbkPXmWZY&&o)ڦ9"l7a}wVGO3BL9b/!KF*RzXeSh4Hde詥 'g5FE*QyKa~=v1@-qdg0~I˪='1^~de۠!;k-k*OrzZV b~.b#|>6H*#K){۴5fhh3@[h 7).a}P/K0̴RĦk%Eʴ_.;jߙ0۾E WH`mc5wns:FkLy6r&8ѐ[aY+\BQSCNF&30KBDĐˤ(0^ʯ^4εH2ֵ(92Gq^Ǵs|ыo^.kZƦ׳swh/-=ϣ,<[>H545zVXwܠjE="v A9Ym/a}0[[}>s2ϔciR<ߙVT԰; յep.E$`݄rЍLM"T5@m*bl*df1n{ivF,#7-oH6I~3 Fƃn 5ȫkEMHH1pJ4l;"҇q=䱎2@R,p(>LzqYdƦ^kHr:E=Z6RǙ߽ڑzܒO;ɅN34)&7[BCkm!Gj:mPa!Jh)GG4]1 a;l,5,eid&H_o'oi vQ;|bfOi+nYl<2dKye Hv"S⬛\= , /GDVPN`vpD 25 Eپm`͎#gw94^(: `qpE+-Q'rzIJ Lgg,:e/(ͷ5y?safd (^J#HXmW?dOAՙ0AܚөXJm2lXQ~;`*`|1?uZFU_P7?%}pf a׌_}Q,-g, xu"jf,r>tq*P( Zg)Җ'8o)xBޝ\M¸[Ðk``m沽?S;V/EgUޠIš􂳴.L~+fa a}]w2Xq ;`R43ң'FU UN8Ξe]FǞԧK&s|ckg_q,&&y7b# ;lg hjFa[ DX6wIDAT.?ndW(3ъ̢ۖ;JT5Zg,s3!c62ŔL-Wǫ8k"}Ppm= [X 3j1H:o;-}vvz'`zp 5U(K嚀pXK;ԌD*tUk5uץ**h|mO<Ŭio"t˪Y_f뢡|*Vy?kGӃm 6Tl_hy`4hQ̶?(w W'REh4$:JLm)[rsgp׌ ,+DVn:8:y=ct[+s8:#o:ޢ寉Mޢ6&CYR}{ubÖi%tNT .(Ͽ Ew68rg8>XIqrv+Sɧ߶wuU1mq|'Җk`H3|"9S/k^"<~yَxtg0~i71>eW{Zdv,UR漥d<*qY6>*e=¼0v 1K>:qk]\[N)n:BiwxYomΊDfWKΠshK~GlM8M>A/Uj2|-(YK4h:Ȝ>kScLrhvrueb;lx/XZpP X,\P8ENx۪L:%T sNk(aF;(^;{p_wn R(BcB9bG~`3`Eꨀ\L~~]%aevrȦsN.GtHu:?ˌHO RH0E ZUwEW)qJ\=l&dY35G Ll*D=9g1Uj-K,tPI#Ls`?ũ%Fg/2}  BZrb@qcgkPfwȊ=;[)"&_zw==_@yFyLj }n.M5ÍCZ>̅<Ø磸lfI1K /hfQSI^Q,[-hލ2mL7F6=-}H\V e8Z rfFS˘@ D\/gFdqQNcbk6& ޾Ixv(#D(P5ks5\ReM|+sm]8U:NYBs;ݾlq96pMYK^v,n 7wdtoU,ѡ οGab8-=q~ |Lunx׀"#VDS ]oE8UYo32|%o .`(owϹw{R D" ;܉A]]w5y3wq3'KX,s{1y(7Ok(I`VJ%#0n8kuxi9 %\WwBwxBݿuu ^_[#`Cwq{*³[JI]~Wt[yRu.]XȌت:JǹgAqyyqn]b%&k:\T{r|Qu0ㄅɒoѰJɴKu!~heSuuerke0?G 3pxLu{?m]Y.֟N9 SnkMr6#-%}%΀JuqQ9$ۀi eaJC?c?|&{7HR2 v+niV&A%7*DLjV#ƴO(" =kPsDpZ2i^0TS6-R-~@2x73P=OYY'}!Fat {n\ie2Ij`L4iMf2 RS<$:gcra=QY{KՀ/q>v:A;{fPg^;&eWZ"3yw3:|B^1&iqf@Ns?\ux(Y\Si7x[睨HP眷Z`SoNi^ye=] >,JR-Q)ûuajb%|R}K^8brtr^wܢ8ef(KI/X ``@na %pF,9 ܫ:qw 8ҷ8xP(}+7ŭCSbPa x#bnԫh}z[:.Vƿ[e [{oVپ,D/z&̽̈/u59lh}1JVyǯkb8M[gi/ꋲ}JͰ>1W7[Qۄ Qv %*i9)LXTQX`rc +^X&%Wd17',YqU{-r셻u+oN=,ϰci~2{5ɹIـ% TqBPUo5̄׉GhG9#Etk Qj`?5A&Esnn|Z-HȵzZz^?L3ǡPxtk;gw:gg`̽N}a3 z ?>RpD"xQ_K[)>=qYbRjܪIJs x ]^~2*|TE:D\CSNN\ϻ8>72aUS9w*ן_hudמ۷SRksm͵6\ksm͵6\ksm͵?R IENDB`tcosmonitor/images/menu_send.png0000664000000000000000000000140012260544373014257 0ustar PNG  IHDRasRGBbKGD pHYs  tIME 3[MIDAT8˥nce]ɱ4C HҤ BJŃ</A (HJސͮ\HaH#O 0e"Mg,K{k#"i? GI|6zo}xppxrҿG14`E1ш_NN,AgYfuFb wcgnTTJ+ Bod\Zo퐬ru=<@0F G\u\ _Nd41Oh@K "1ǀ_ {2&IENDB`tcosmonitor/images/button_broadcast.png0000664000000000000000000000156212260544373015650 0ustar PNG  IHDRrP6sRGBbKGD pHYs  tIME & t!IDAT8˥[HTQufTxLD圱̤H)+EPPQFEAE#D"*cv18vч}Y85SF 6a-k "|12(+4Wyt)*qȘG+jV0p43mf8S: WcϤuݵ"P^WB/yҝYn4]>LJE{Xha&y;8n4tx̩N\11Y# p ϛ ͑B`vVgBn ]_zZx!pgY D2b#'kR'SO 8#%M '*#qT L: q# ͑wʏU8(-E ƄTՂPnUv=()r͑n@*ۖ߄ԕЀnjEU]#fNw .)Np78{O7>.aI+sׅ+~_=#*-߳4s$~J\ϴZQ~9$%0 fA-akیvþ][AթFe~M+717+dtkzZzd?JKOjBxIENDB`tcosmonitor/tcosmonitor/0000775000000000000000000000000012260544542012712 5ustar tcosmonitor/tcosmonitor/__init__.py0000664000000000000000000000405512260544373015031 0ustar # -*- coding: UTF-8 -*- # TcosMonitor version __VERSION__ # # Copyright (c) 2006-2011 Mario Izquierdo # # This package is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # # This package is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. import glob as __glob__ import os as __os__ import sys as __sys__ def __load__(): """ read contents of tcosmonitor dir and put in __all__ list """ _ext_dir=__os__.path.dirname( __file__ ) _ext=[] for file_ in __glob__.glob(_ext_dir+"/*.py"): if file_ == "__init__.py": continue _ext_name = __os__.path.basename(file_).split('.py')[0] if _ext_name == "__init__": continue _ext.append( _ext_name ) try: if __sys__.version_info[0:3] < (2, 5, 0): __import__('tcosmonitor.' + _ext_name, globals(), locals(), ['extensions'] ) else: __import__('tcosmonitor.' + _ext_name, fromlist = ['extensions'] ) except Exception, err: print ("Exception importing tcosmonitor='%s', err='%s'"%(_ext_name, err)) return _ext if not "DISPLAY" in __os__.environ or __os__.environ['DISPLAY'] == '': print >> __sys__.stderr, ("WARNING: [tcosmonitor.__init__] No display defined, no importing extensions") else: if "TCOSMONITOR_NO_EXTENSIONS" in __os__.environ: print >> __sys__.stderr, ("TCOSMONITOR_NO_EXTENSIONS in environment, no load extensions") else: __all__=__load__() tcosmonitor/tcosmonitor/TcosPAM.py0000664000000000000000000000400112260544373014527 0ustar # -*- coding: UTF-8 -*- # TcosMonitor version __VERSION__ # # Copyright (c) 2006-2011 Mario Izquierdo # # This package is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # # This package is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. import PAM def auth(user, password): class AuthConv: def __init__(self, password): self.password = password def __call__(self, auth, query_list, userData): resp = [] for query, qt in query_list: if qt == PAM.PAM_PROMPT_ECHO_ON: resp.append((self.password, 0)) elif qt == PAM.PAM_PROMPT_ECHO_OFF: resp.append((self.password, 0)) elif qt == PAM.PAM_PROMPT_ERROR_MSG or type == PAM.PAM_PROMPT_TEXT_INFO: print query resp.append(('', 0)) else: return None return resp auth = PAM.pam() auth.start("passwd") auth.set_item(PAM.PAM_USER, user) auth.set_item(PAM.PAM_CONV, AuthConv(password)) try: auth.authenticate() auth.acct_mgmt() return True except PAM.error, resp: if resp[1] == 9: print "error: TcosPAM error in pam connection. Are you root?" else: print "error: TcosPAM user:%s error:%s" % (user, resp) return False if __name__ == '__main__': print auth("test", "test") tcosmonitor/tcosmonitor/TcosIconView.py0000664000000000000000000002012112260544373015636 0ustar # -*- coding: UTF-8 -*- # TcosMonitor version __VERSION__ # # Copyright (c) 2006-2011 Mario Izquierdo # # This package is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # # This package is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. import sys import gtk from gettext import gettext as _ import tcosmonitor.shared def print_debug(txt): if tcosmonitor.shared.debug: print >> sys.stderr, "%s::%s" % (__name__, txt) #print("%s::%s" % (__name__, txt), file=sys.stderr) class TcosIconView(object): def __init__(self, main): print_debug("__init__()") self.main=main self.ui=self.main.ui self.__selected_icon=None self.avalaible_info=[ [_("IP"), 'ip' ], [ _("Hostname"), 'hostname' ], [ _("Username"), 'username'], [ _("Logged"), 'logged'], [ _("Time log in"), 'time_logged'], [ _("Screen locked"), 'blocked_screen'], [ _("Network locked"), 'blocked_net'], ] self.default_tip = _("Place mouse on any computer to see brief info about it.") self.icon_tooltips = None self.hosts={} self.iconview=self.ui.get_object('iconview') self.model = gtk.ListStore(str, str, gtk.gdk.Pixbuf) self.iconview.set_model(self.model) self.iconview.set_text_column(0) self.iconview.set_pixbuf_column(2) if hasattr(self.iconview.props, 'has_tooltip'): self.iconview.props.has_tooltip = True self.iconview.connect("motion-notify-event", self.on_iconview_event) self.iconview.connect("button_press_event", self.on_iconview_click) def isenabled(self): """ return True if only configuration enable IconView prevent to work if IconView is hidden """ if self.main.config.GetVar("listmode") == 'icons' or self.main.config.GetVar("listmode") == 'both': return True return False def isactive(self): """ Return True if IconView is enabled and is active (We click on it) know this getting tabindex of viewtabas widget. 0 => active list view 1 => active icon view """ if not self.isenabled: return False if self.main.viewtabs.get_current_page() != 1: return False print_debug("isactive() IconView Mode active") return True def get_multiple(self): allhosts=[] selected=self.iconview.get_selected_items() if len(selected) > 0: for sel in selected: allhosts.append( self.model[sel][1] ) print_debug("get_multiple() allhosts=%s"%allhosts) return allhosts def ismultiple(self): if not self.isactive(): return False print_debug("ismultiple() num selected=%s"%len(self.iconview.get_selected_items())) if len(self.iconview.get_selected_items()) > 0: return True else: return False def clear(self): print_debug("clear() clean iconview") self.model.clear() self.hosts={} self.set_selected(None) def set_selected(self, ip): self.__selected_icon=ip def get_selected(self): return self.__selected_icon def get_host(self, ip): if self.hosts.has_key(ip): return self.hosts[ip]['hostname'] def generate_icon(self, data): print_debug("generate_icon() data=%s"%data) if data['username'] == tcosmonitor.shared.NO_LOGIN_MSG: pixbuf = gtk.gdk.pixbuf_new_from_file(tcosmonitor.shared.IMG_DIR + tcosmonitor.shared.icon_image_no_logged) else: pixbuf = gtk.gdk.pixbuf_new_from_file(tcosmonitor.shared.IMG_DIR + tcosmonitor.shared.icon_image_thin) if not data['active']: pixbuf.saturate_and_pixelate(pixbuf, 0.6, True) if data['image_blocked']: pixbuf2 = data['image_blocked'] pixbuf2.composite(pixbuf, 0, 0, pixbuf.props.width, pixbuf.props.height, 0, 0, 1.0, 1.0, gtk.gdk.INTERP_HYPER, 255) if data['username'] == tcosmonitor.shared.NO_LOGIN_MSG: self.model.append([data['hostname'].replace('.aula',''), data['ip'], pixbuf]) else: self.model.append([data['username'], data['ip'], pixbuf]) self.hosts[data['ip']]=data def generate_tooltip(self, ip): if not self.hosts.has_key(ip): return "" data=self.hosts[ip] txt="" for info in self.avalaible_info: if data[info[1]] == True: value=_("yes") elif data[info[1]] == False: value=_("no") else: value=data[info[1]] txt+=" %s: %s \n" %(info[0], value) # remove last '\n' return txt[:-1] def on_iconview_event(self, iv, event): """Deletes old tooltip and adds new one for new icon.""" # On mouse move, old tooltip must dissapear. # Adds tip if no buttons are pressed during the move. if not event.state: #print_debug("on_iconview_event() iv=%s event=%s"%(iv, event)) if not hasattr(iv, 'set_tooltip_text'): self.icon_tooltips = gtk.Tooltips() # deprecated pos = iv.get_path_at_pos(int(event.x), int(event.y)) if pos: mod = list(iv.get_model()[pos]) tip=self.generate_tooltip(mod[1]) else: tip=self.default_tip if not hasattr(iv, 'set_tooltip_text'): self.icon_tooltips.set_tip(iv, tip) else: iv.set_tooltip_text(tip) def on_iconview_click(self, iv, event): if event.button == 3: pos = self.iconview.get_path_at_pos(int(event.x), int(event.y)) if len(self.iconview.get_selected_items()) < 2 and pos: #generate menu self.main.menus.RightClickMenuOne( pos , self.model) self.iconview.grab_focus() #self.iconview.set_cursor( path, col, 0) self.iconview.select_path(pos) ip=iv.get_model()[pos][1] self.set_selected(ip) self.main.menu.popup( None, None, None, event.button, event.time) return True else: # need to remake allmenu (for title selected|all ) self.main.menus.RightClickMenuAll() self.main.allmenu.popup( None, None, None, event.button, event.time) print_debug ( "on_iconview_click() NO icon selected" ) self.set_selected(None) return def change_lockscreen(self, ip, pixbuf2, status_screen, status_net): self.hosts[ip]['blocked_screen']=status_screen self.hosts[ip]['blocked_net']=status_net data=self.hosts[ip] if data['username'] == tcosmonitor.shared.NO_LOGIN_MSG: pixbuf = gtk.gdk.pixbuf_new_from_file(tcosmonitor.shared.IMG_DIR + tcosmonitor.shared.icon_image_no_logged) else: pixbuf = gtk.gdk.pixbuf_new_from_file(tcosmonitor.shared.IMG_DIR + tcosmonitor.shared.icon_image_thin) pixbuf2.composite(pixbuf, 0, 0, pixbuf.props.width, pixbuf.props.height, 0, 0, 1.0, 1.0, gtk.gdk.INTERP_HYPER, 255) for m in self.model: if m[1] == ip: m[2]=pixbuf return tcosmonitor/tcosmonitor/TcosXmlRpc.py0000664000000000000000000010740112260544373015327 0ustar # -*- coding: UTF-8 -*- # TcosMonitor version __VERSION__ # # Copyright (c) 2006-2011 Mario Izquierdo # # This package is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # # This package is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. import xmlrpclib from time import time, sleep import sys import tcosmonitor.shared from gettext import gettext as _ import socket from tcosmonitor.ping import PingPort # needed for __escape__ function import xml.sax.saxutils import traceback def print_debug(txt): if tcosmonitor.shared.debug: print >> sys.stderr, "%s::%s" % (__name__, txt) #print("%s::%s" % (__name__, txt), file=sys.stderr) def howmany(start, txt): print_debug ("howmany() Time to %s=%f" %(txt, (time() - start)) ) class TcosXmlRpc: def __init__(self, main): print_debug ( "__init__()" ) self.main=main self.ip=None self.version=None self.logged=False self.connected=False self.url=None self.tc=None self.lock=False self.sslconnection=False self.ports=[] self.resethosts() self.__dic__= { '\"' : '´´', '\'' : '´' } if self.main != None: self.cache_timeout=self.main.config.GetVar("cache_timeout") self.username=self.main.config.GetVar("xmlrpc_username") self.password=self.main.config.GetVar("xmlrpc_password") if self.username == "" or self.password == "": # warn empty username and password if self.main.name == "TcosMonitor": self.main.common.threads_enter("TcosXmlRpc:__init__ no user or password") tcosmonitor.shared.error_msg( _("Username or password are empty,\nplease edit in preferences dialog!") ) self.main.common.threads_leave("TcosXmlRpc:__init__ no user or password") else: print_debug ( "running outside tcosmonitor" ) def resethosts(self): self.lasthost=None self.lastport=None self.laststandalone_ip=None self.aliveStatus=None self.isStandAlone=None def wait(self): """ wait (max 4 sec) for self.lock == True """ print_debug("############## wait() lock=%s #################"%self.lock) if not self.lock: return i=0 for i in range(40): print_debug("############## wait() i=%s ##############"%i) if not self.lock: return sleep(0.1) def isPortListening(self, ip, port, force=False): """ check if ip and port is live and running something (using sockets) """ if not ip: return False if not port: return False # this avoid to scan same ip a lot of times, but can give errors FIXME if not force and self.lasthost == ip and self.lastport == port and self.aliveStatus == "OPEN": print_debug("isPortListening() not scanning again, using lastip=%s lastport=%s OPEN" %(ip, port)) return True elif not force and self.lasthost == ip and self.lastport == port and self.aliveStatus == "CLOSED": print_debug("isPortListening() not scanning again, using lastip=%s lastport=%s CLOSED" %(ip, port)) return False self.aliveStatus=PingPort(ip,port).get_status() self.lastport=port #print_debug ( "isPortListening() PING PORT DONE status=%s" %(self.aliveStatus) ) if self.aliveStatus == "OPEN": print_debug ( "isPortListening(%s:%s) PinPort => OPEN" %(ip, port)) return True else: print_debug ( "isPortListening(%s:%s) PinPort => CLOSED" %(ip, port) ) return False def newhost(self, ip, nossl=False): #print_debug ( "newhost(%s)" %(ip) ) if not ip: print_debug("\n\n##########################################\n\n") print_debug("newhost() ip is None") print_debug("\n\n##########################################\n\n") if tcosmonitor.shared.debug: sys.exit(1) else: return self.ip=ip self.version=None self.logged=None cached = None force=False # this avoid to scan same ip a lot of times, but can give errors FIXME if self.lasthost == ip and self.connected: #print_debug("newhost() not scanning again, using lastip=%s lastport=%s SSL=%s" %(ip,self.lastport, self.sslconnection)) return True # change ip, force new if self.lasthost != ip: self.resethosts() self.lasthost=ip # reset SSL status too self.sslconnection=False self.connected=False self.lastport=tcosmonitor.shared.xmlremote_port #print_debug("newhost() enable_sslxmlrpc='%s'" %(self.main.config.GetVar("enable_sslxmlrpc")) ) if self.main.config.GetVar("enable_sslxmlrpc") == 1 and nossl == False: print_debug("newhost() SSL enabled, trying to ping %s port" %(tcosmonitor.shared.xmlremote_sslport)) force=True if self.isPortListening(ip, tcosmonitor.shared.xmlremote_sslport): print_debug("newhost() SSL enabled **********") self.sslconnection=True if not self.sslconnection: if not self.isPortListening(ip, tcosmonitor.shared.xmlremote_port, force): print_debug("newhost() SSL disabled, trying to ping %s port" %(tcosmonitor.shared.xmlremote_port)) self.connected=False self.sslconnection=False return False if self.main.config.GetVar("enable_sslxmlrpc") == 1 and self.sslconnection: self.url = 'https://%s:%d/RPC2' % (self.ip, tcosmonitor.shared.xmlremote_sslport) else: self.url = 'http://%s:%d/RPC2' % (self.ip, tcosmonitor.shared.xmlremote_port) try: # set min socket timeout to 2 secs socket.setdefaulttimeout(2) self.tc = xmlrpclib.ServerProxy(self.url, verbose=False) self.connected=True # save socket default timeout socket.setdefaulttimeout(tcosmonitor.shared.socket_default_timeout) print_debug ( "newhost() tcosxmlrpc running on %s" %(self.url) ) print_debug( {'conected':self.connected, 'ssl':self.sslconnection, 'ip':self.lasthost, 'port':self.lastport} ) return True except Exception, err: print_debug("newhost() ERROR conection unavalaible !!! error: %s"%err) self.connected=False self.CheckSSL(err) return False def CheckSSL(self, err): txt="%s" %err if txt.find("SSL2_READ_INTERNAL") != -1 and txt.find("bad mac decode") != -1: print_debug("SSL BAD MAC DECODE... Deactivating ssl security layer over xmlrpc.") self.main.config.SetVar("enable_sslxmlrpc", 0) self.main.config.SaveToFile() self.main.xmlrpc.resethosts() return True def GetVersion(self): if not self.connected: print_debug ("GetVersion() Error, NO CONNECTION!!") return None if self.version != None: return self.version try: self.version=self.tc.tcos.version() return self.version except Exception, err: print_debug("GetVersion() Exception error %s"%err) self.CheckSSL(err) return None def Exe(self, cmd): """ Exe a command in thin client """ print_debug ("EXE() INIT, %s" %(cmd) ) if not self.connected: print_debug ("Exe() Error, NO CONNECTION!!") return None print_debug ("Exe(): user=\"%s\" pass=\"******\" " \ %(self.main.config.GetVar("xmlrpc_username") ) ) try: self.tc.tcos.exe(cmd, \ self.main.config.GetVar("xmlrpc_username"), \ self.main.config.GetVar("xmlrpc_password")) except Exception, err: print_debug("Exe() Exception error %s"%err) self.CheckSSL(err) def Kill(self, app): """ kill a running app in thin client """ print_debug ("Kill() INIT, %s" %(app) ) if not self.connected: print_debug ("Kill() Error, NO CONNECTION!!") return None try: self.tc.tcos.kill(app, \ self.main.config.GetVar("xmlrpc_username"), \ self.main.config.GetVar("xmlrpc_password")) except Exception, err: print_debug("Kill() Exception error %s"%err) self.CheckSSL(err) def GetStatus(self, cmd): """ get cmd and exec a xmlrpc request parse value, and return: 1 if running 0 if not running None if access denied """ if not self.connected: print_debug ("GetStatus() Error, NO CONNECTION!!") return None try: status=self._ParseResult( self.tc.tcos.status(cmd) ) except Exception, err: print_debug("GetStatus() Exception PARSER error %s"%err) self.CheckSSL(err) return False if status == "1": print_debug ("GetStatus() %s is running" %(cmd) ) return True else: print_debug ("GetStatus() %s is NOT running" %(cmd) ) return False def _ParseResult(self, txt): print_debug ( "_ParseResult(%s)" %(txt) ) if txt == None or txt == True or txt == False: return txt if txt.find("error") == 0: return None else: return txt def ReadInfo(self, string): """ server.tcos.info("cpu_model") """ if not self.connected: print_debug ( "ReadInfo() NO CONNECTION" ) return None try: result=self.tc.tcos.info(string) except Exception, err: print_debug ( "ReadInfo(%s): ERROR, can't connect to XMLRPC server!!! error %s" %(string, err) ) self.CheckSSL(err) return "" if result.find('error') == 0: print_debug ( "ReadInfo(%s): ERROR, result contains error string!!!" %string ) return "" else: return result def IsStandalone(self, ip=None): if not ip: print_debug("IsStandalone() WARNING using old IP: %s" %self.ip) else: self.newhost(ip) if not self.connected: print_debug("IsStandalone() NO CONNECTION") return False # use last data if self.laststandalone_ip == ip: return self.isStandAlone self.laststandalone_ip=ip if self.ReadInfo("get_client") == "standalone": print_debug("IsStandalone() ip=%s TRUE" %ip) self.isStandAlone=True return True print_debug("IsStandalone() ip=%s FALSE" %ip) self.isStandAlone=False return False def GetStandalone(self, item, ingroup=None): if item == "get_user": if not self.connected: print_debug ( "GetStandalone() NO CONNECTION" ) return tcosmonitor.shared.NO_LOGIN_MSG try: result=self.tc.tcos.standalone("get_user", "") except Exception, err: print_debug("GetStandalone(get_user) Exception error: %s"%err) self.CheckSSL(err) return tcosmonitor.shared.NO_LOGIN_MSG if result.find('error') == 0: return tcosmonitor.shared.NO_LOGIN_MSG elif result == "": return tcosmonitor.shared.NO_LOGIN_MSG else: return result elif item == "get_process": try: return self.tc.tcos.standalone("get_process", "") except Exception, err: print_debug("GetStandalone(get_process) Exception error: %s"%err) self.CheckSSL(err) return "" elif item == "get_server": nossl=self.main.config.GetVar("enable_sslxmlrpc") try: return self.tc.tcos.standalone("get_server", "%s" %nossl) except Exception, err: print_debug("GetStandalone(get_server) Exception error %s"%err) self.CheckSSL(err) return "" elif item == "get_time": try: return self.tc.tcos.standalone("get_time", "") except Exception, err: print_debug("GetStandalone(get_time) Exception error %s"%err) self.CheckSSL(err) return None elif item == "get_exclude": if not self.connected: print_debug ( "GetStandalone() NO CONNECTION" ) return False try: result=self.tc.tcos.standalone("get_exclude", "%s" %ingroup) if result.find('error') == 0 or result == "" or result == "noexclude": return False else: return True except Exception, err: print_debug("GetStandalone(get_exclude) Exception error %s"%err) self.CheckSSL(err) return False else: return "" def __escape__(self, txt): return xml.sax.saxutils.escape(txt, self.__dic__) def IsEnabled(self, item): if self.main.name in ["TcosVolumeManager", "TcosDevicesNG"]: user=self.main.xauth.get_cookie() passwd=self.main.xauth.get_hostname() if user == None: print_debug ( "IsEnabled() error loading cookie info" ) return False print_debug ( "IsEnabled() cookie=%s hostname=%s" %(user, passwd) ) else: user=self.main.config.GetVar("xmlrpc_username") passwd=self.main.config.GetVar("xmlrpc_password") # connect to host if not self.connected: print_debug ( "IsEnabled() NO CONNECTION" ) return False try: result=self.tc.tcos.config("--get", item, user, passwd ) except Exception, err: print_debug("IsEnabled(--isenabled) Exception error: %s"%err) self.CheckSSL(err) return False if result.find('error') == 0: print_debug ( "IsEnabled(): ERROR, result contains error string!!!\n%s" %(result)) return False else: print_debug ( "IsEnabled(): result='%s'" %(result)) if result == "-1" or result == "0": return False return True def DBus(self, action, data): username=self.GetStandalone("get_user") remote_user=self.main.config.GetVar("xmlrpc_username") remote_passwd=self.main.config.GetVar("xmlrpc_password") if action == "mess": data=self.__escape__( data ) cmd="--auth='%s:%s' --type=%s --text='%s' --username=%s" %(remote_user, remote_passwd, action, data, username ) print_debug ("DBus() cmd=%s" %(cmd) ) try: return self.tc.tcos.dbus(cmd, remote_user, remote_passwd) except Exception, err: print_debug("DBus Exception error %s"%err) self.CheckSSL(err) return None def GetSoundChannels(self): """ Exec soundctl.sh with some of these args --showcontrols ( return all mixer channels ) --getlevel CHANNEL ( return CHANNEL level xx% xx% left and right ) --setlevel CHANNEL xx% ( change and return CHANNEL level xx% xx% left and right ) --getmute CHANNEL ( return off if mute or on if unmute CHANNEL ) --setmute CHANNEL ( mute CHANNEL and return off if succesfull ) --setunmute CHANNEL ( unmute CHANNEL and return on if succesfull ) """ if self.main.name == "TcosVolumeManager": user=self.main.xauth.get_cookie() passwd=self.main.xauth.get_hostname() if user == None: print_debug ( "GetSoundChannels() error loading cookie info" ) return None print_debug ( "GetSoundChannels() cookie=%s hostname=%s" %(user, passwd) ) else: user=self.main.config.GetVar("xmlrpc_username") passwd=self.main.config.GetVar("xmlrpc_password") if not self.connected: print_debug ( "GetSoundChannels() NO CONNECTION" ) return None try: result=self.tc.tcos.sound("--showcontrols", "", user, passwd ) except Exception, err: print_debug("GetSoundChannels(--showcontrols) Exception error: %s"%err) self.CheckSSL(err) return "" if result.find('error') == 0: print_debug ( "GetSoundChannels(): ERROR, result contains error string!!!\n%s" %(result)) #self.main.write_into_statusbar( "ERROR: %s" %(result) ) return "" else: number=len(result.split('|')) return result.split('|')[:number-1] def GetSoundChannelsContents(self): """ Exec soundctl.sh with some of these args --showcontents ( return all mixer channels ) """ if self.main.name == "TcosVolumeManager": user=self.main.xauth.get_cookie() passwd=self.main.xauth.get_hostname() if user == None: print_debug ( "GetSoundChannelsContents() error loading cookie info" ) return [] print_debug ( "GetSoundChannelsContents() cookie=%s hostname=%s" %(user, passwd) ) else: user=self.main.config.GetVar("xmlrpc_username") passwd=self.main.config.GetVar("xmlrpc_password") if not self.connected: print_debug ( "GetSoundChannelsContents() NO CONNECTION" ) return [] try: result=self.tc.tcos.sound("--showcontents", "", user, passwd ) except Exception, err: print_debug("GetSoundChannelsContents(--showcontents) Exception error: %s"%err) self.CheckSSL(err) return [] if result.find('error') == 0: print_debug ( "GetSoundChannelsContents(): ERROR, result contains error string!!!\n%s" %(result)) #self.main.write_into_statusbar( "ERROR: %s" %(result) ) return [] else: channels=[] tmp=result.split('#') number=len(tmp) for i in range(len(tmp)): c=tmp[i].split(',') if len(c) != 4: print_debug("***NOT CHANNEL*** c=%s"%c) continue channels.append( {'name':c[0], 'type': c[1], 'level': c[2], 'mute': c[3]} ) return channels def GetSoundInfo(self, channel, mode="--getlevel"): """ mode = "--getlevel" mode = "--getmute" mode = "--getserverinfo" """ user=self.main.config.GetVar("xmlrpc_username") passwd=self.main.config.GetVar("xmlrpc_password") if self.main.name == "TcosVolumeManager": user=self.main.xauth.get_cookie() passwd=self.main.xauth.get_hostname() if user == None: print_debug ( "GetSoundInfo() error loading cookie info" ) return None print_debug ( "GetSoundInfo() cookie=%s hostname=%s" %(user, passwd) ) if not self.connected: print_debug ( "GetSoundInfo() NO CONNECTION" ) return None try: result=self.tc.tcos.sound(mode, " \"%s\" " %(channel), user, passwd ) except Exception, err: print_debug("GetSoundInfo() Exception error: %s"%err) self.CheckSSL(err) return "" if result.find('error') == 0: print_debug ( "GetSoundInfo(): ERROR, result contains error string!!!\n%s" %(result)) return "" else: return result def SetSound(self, ip, channel, value, mode="--setlevel"): if channel == "": return {} if not self.connected: print_debug ( "SetSound() NO CONNECTION" ) return {} user=self.main.config.GetVar("xmlrpc_username") passwd=self.main.config.GetVar("xmlrpc_password") if self.main.name == "TcosVolumeManager": user=self.main.xauth.get_cookie() passwd=self.main.xauth.get_hostname() if user == None: print_debug ( "SetSound() error loading cookie info" ) return {} print_debug ( "SetSound() cookie=%s hostname=%s" %(user, passwd) ) try: result=self.tc.tcos.sound(mode, " \"%s\" \"%s\" " %(channel,value), user, passwd) print_debug("SetSound() result=%s"%result) except Exception, err: print_debug("SetSound() Exception error: %s"%err) self.CheckSSL(err) return {} if result.find('error') == 0: print_debug ( "SetSound(): ERROR, result contains error string!!!\n%s" %(result)) #self.main.write_into_statusbar( "ERROR: %s" %(result) ) return {} else: c=result.split(',') if len(c) != 4: print_debug("***NOT CHANNEL*** c=%s"%c) return {} return {'name':c[0], 'type': c[1], 'level': c[2], 'mute': c[3]} def RestartSoundDaemon(self): """ Exec soundctl.sh --restartpulse ( return nothing ) """ if self.main.name == "TcosVolumeManager": user=self.main.xauth.get_cookie() passwd=self.main.xauth.get_hostname() if user == None: print_debug ( "RestartSoundDaemon() error loading cookie info" ) return [] print_debug ( "RestartSoundDaemon() cookie=%s hostname=%s" %(user, passwd) ) else: user=self.main.config.GetVar("xmlrpc_username") passwd=self.main.config.GetVar("xmlrpc_password") if not self.connected: print_debug ( "RestartSoundDaemon() NO CONNECTION" ) return [] try: result=self.tc.tcos.sound("--restartpulse", "", user, passwd ) except Exception, err: print_debug("RestartSoundDaemon (--restartpulse) Exception error: %s"%err) return [] if result.find('error') == 0: print_debug ( "RestartSoundDaemon(): ERROR, result contains error string!!!\n%s" %(result)) return def GetDevicesInfo(self, device, mode="--getsize"): if not self.connected: print_debug ( "GetDevicesInfo() NO CONNECTION" ) return None remote_hostname=self.main.xauth.get_hostname() xauth_cookie=self.main.xauth.get_cookie() if mode == "--getxdrivers": xauth_cookie="foo" if xauth_cookie == None: return "GetDevicesInfo error: xauth cookie don't match" # wait for other petitions self.wait() # lock process self.lock=True # don't fail if timeout try: result=self.tc.tcos.devices(mode, " \"%s\" " %(device), \ xauth_cookie, \ remote_hostname ) self.lock=False if "error" in result: print_debug ( "GetDevicesInfo(device=%s, mode=%s): ERROR, result contains error string!!!\n%s" %(device, mode, result)) return result except Exception, err: self.lock=False print_debug("GetDevicesInfo(device=%s, mode=%s) EXCEPTION getting info err=%s"%(device, mode, err) ) self.CheckSSL(err) return "" def lockscreen(self, ip=None): if ip: self.newhost(ip) if self.isPortListening(self.ip, self.lastport): try: self.tc.tcos.lockscreen( \ self.main.config.GetVar("xmlrpc_username"), \ self.main.config.GetVar("xmlrpc_password")) return True except Exception, err: print_debug ("lockscreen() Exception, error: %s" %err) self.CheckSSL(err) return False def unlockscreen(self, ip=None): if ip: self.newhost(ip) if self.isPortListening(self.ip, self.lastport): try: self.tc.tcos.unlockscreen(\ self.main.config.GetVar("xmlrpc_username"), \ self.main.config.GetVar("xmlrpc_password")) return True except Exception, err: print_debug ("unlockscreen() Exception, error: %s" %err) self.CheckSSL(err) return False def lockcontroller(self, action, ip=None): if ip: self.newhost(ip) if self.isPortListening(self.ip, self.lastport): try: self.tc.tcos.lockcontroller("%s" %action, \ self.main.config.GetVar("xmlrpc_username"), \ self.main.config.GetVar("xmlrpc_password")) return True except Exception, err: print_debug ("lockcontroller() Exception, error: %s" %err) self.CheckSSL(err) return False def unlockcontroller(self, action, ip=None): if ip: self.newhost(ip) if self.isPortListening(self.ip, self.lastport): try: self.tc.tcos.unlockcontroller("%s" %action, \ self.main.config.GetVar("xmlrpc_username"), \ self.main.config.GetVar("xmlrpc_password")) return True except Exception, err: print_debug ("unlockcontroller() Exception, error: %s" %err) self.CheckSSL(err) return False def status_lockscreen(self, ip=None): if ip: self.newhost(ip) if self.isPortListening(self.ip, self.lastport): #self.login () result=self._ParseResult(self.GetStatus("lockscreen")) print_debug ( "lockscreen() %s" %(result) ) return result return False def tnc(self, action, username, ports=None, ip=None): print_debug("tnc() action=%s username=%s ports=%s ip=%s only-ports=%s"%(action, username, ports, ip, tcosmonitor.shared.tnc_only_ports)) if ip: self.newhost(ip) try: if action == "status": return self.tc.tcos.tnc("%s" %action, "", "", "%s" %username, \ self.main.config.GetVar("xmlrpc_username"), \ self.main.config.GetVar("xmlrpc_password") ) elif action == "enable-internet": return self.tc.tcos.tnc("%s" %action, "--only-ports=%s" %tcosmonitor.shared.tnc_only_ports, "", "%s" %username, \ self.main.config.GetVar("xmlrpc_username"), \ self.main.config.GetVar("xmlrpc_password")) elif action == "disable-internet": return self.tc.tcos.tnc("%s" %action, "--only-ports=%s" %tcosmonitor.shared.tnc_only_ports, "%s" %ports, "%s" %username, \ self.main.config.GetVar("xmlrpc_username"), \ self.main.config.GetVar("xmlrpc_password")) except Exception, err: print_debug ("tnc() Exception, error: %s" %err) self.CheckSSL(err) return False def screenshot(self, size="65"): print_debug ( "screenshot() size=%s" %(size) ) try: result=self._ParseResult( self.tc.tcos.screenshot(\ "%s" %(size),\ self.main.config.GetVar("xmlrpc_username"), \ self.main.config.GetVar("xmlrpc_password")) ) print_debug ( "screenshot(size=%s percent) %s done" %(size, result) ) return True except Exception, err: print_debug ("screenshot() Exception, error: %s" %err) self.CheckSSL(err) return False def getscreenshot(self, size="65"): try: result=self.tc.tcos.getscreenshot(\ "%s" %(size),\ self.main.config.GetVar("xmlrpc_username"), \ self.main.config.GetVar("xmlrpc_password")) print_debug ( "getscreenshot(size=%s percent) done result=%s" %(size, result[0]) ) return result except Exception, err: print_debug ("getscreenshot() Exception, error: %s" %err) self.CheckSSL(err) return [False, err] def vnc(self, action, ip, args=""): self.newhost(ip) print_debug("vnc(action='%s' ip='%s' args='%s')"%(action, ip, args) ) try: if action == "genpass": passwd=args return self.tc.tcos.vnc("genpass", "%s /tmp/.tcosvnc" %passwd, \ self.main.config.GetVar("xmlrpc_username"), \ self.main.config.GetVar("xmlrpc_password") ) elif action == "startserver": return self.tc.tcos.vnc("startserver", "/tmp/.tcosvnc", \ self.main.config.GetVar("xmlrpc_username"), \ self.main.config.GetVar("xmlrpc_password") ) elif action == "startscale": size=int(self.main.config.GetVar("miniscrot_size")) scale="%sx%s"%(size/100., size/100.) return self.tc.tcos.vnc("startscale", "/tmp/.tcosvnc %s"%scale, \ self.main.config.GetVar("xmlrpc_username"), \ self.main.config.GetVar("xmlrpc_password") ) elif action == "stopserver": return self.tc.tcos.vnc("stopserver", "", \ self.main.config.GetVar("xmlrpc_username"), \ self.main.config.GetVar("xmlrpc_password") ) elif action == "startclient": server_ip=args return self.tc.tcos.vnc("startclient", "%s /tmp/.tcosvnc" %server_ip, \ self.main.config.GetVar("xmlrpc_username"), \ self.main.config.GetVar("xmlrpc_password") ) elif action == "stopclient": return self.tc.tcos.vnc("stopclient", "", \ self.main.config.GetVar("xmlrpc_username"), \ self.main.config.GetVar("xmlrpc_password") ) except Exception, err: print_debug ("vnc() Exception, error: %s" %err) traceback.print_exc(file=sys.stderr) self.CheckSSL(err) return False def rtp(self, action, ip, broadcast=None): self.newhost(ip) try: if action == "startrtp-recv": return self.tc.tcos.rtp("startrtp-recv", broadcast, \ self.main.config.GetVar("xmlrpc_username"), \ self.main.config.GetVar("xmlrpc_password") ) elif action == "stoprtp-recv": return self.tc.tcos.rtp("stoprtp-recv", "", \ self.main.config.GetVar("xmlrpc_username"), \ self.main.config.GetVar("xmlrpc_password") ) elif action == "startrtp-send": return self.tc.tcos.rtp("startrtp-send", broadcast, \ self.main.config.GetVar("xmlrpc_username"), \ self.main.config.GetVar("xmlrpc_password") ) elif action == "stoprtp-send": return self.tc.tcos.rtp("stoprtp-send", "", \ self.main.config.GetVar("xmlrpc_username"), \ self.main.config.GetVar("xmlrpc_password") ) elif action == "startrtp-chat": return self.tc.tcos.rtp("startrtp-chat", broadcast, \ self.main.config.GetVar("xmlrpc_username"), \ self.main.config.GetVar("xmlrpc_password") ) elif action == "stoprtp-chat": return self.tc.tcos.rtp("stoprtp-chat", "", \ self.main.config.GetVar("xmlrpc_username"), \ self.main.config.GetVar("xmlrpc_password") ) except Exception, err: print_debug ("rtp() Exception, error: %s" %err) self.CheckSSL(err) return False def vlc(self, ip, volume, lock): self.newhost(ip) try: return self.tc.tcos.vlc("%s" %volume, "%s" %lock, \ self.main.config.GetVar("xmlrpc_username"), \ self.main.config.GetVar("xmlrpc_password") ) except Exception, err: print_debug ("vlc() Exception, error: %s" %err) self.CheckSSL(err) return False def dpms(self, action, ip=None): print_debug("dpms() action=%s ip=%s"%(action, ip)) if ip: self.newhost(ip) if not self.connected: return False if action == "on" or action == "off" or action == "status": try: return self.tc.tcos.dpms("%s" %action, \ self.main.config.GetVar("xmlrpc_username"), \ self.main.config.GetVar("xmlrpc_password") ) except Exception, err: print_debug ("dpms() Exception, error: %s" %err) self.CheckSSL(err) return False if __name__ == '__main__': tcosmonitor.shared.debug = True app=TcosXmlRpc (None) if app.isPortListening("192.168.0.3", "80"): print "80 is listening" else: print "80 is NOT listening" if app.isPortListening("192.168.0.3", "8998"): print "8998 is listening" else: print "8998 is NOT listening" #if app.isPortListening("192.168.0.10", "8998"): # print "8998 is listening" #else: # print "8998 is NOT listening" #start=time() #print_debug ("TCOS_VERSION: %s" %(app.GetVersion()) ) #howmany(start, "get version info") start=time() app.newhost("192.168.0.3") print_debug ("TCOS_«tilda»_STATUS: %s" %(app.GetStatus("tilda")) ) howmany(start, "get status of tilda") #app.Exe("xterm") #app.status_lockscreen() #app.lockscreen() #sleep(2) #app.status_lockscreen() #app.unlockscreen() #app.Exe("glxgears -printfps > glxgears.log") #start=time() #app.logout() #howmany(start, "logout") tcosmonitor/tcosmonitor/WakeOnLan.py0000664000000000000000000000427012260544373015110 0ustar # -*- coding: UTF-8 -*- ########################################################################## # Wake-On-LAN # # Copyright (C) 2002 by Micro Systems Marc Balmer # Written by Marc Balmer, marc@msys.ch, http://www.msys.ch/ # This code is free software under the GPL # # This package is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 1. # # This package is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. import struct, socket import tcosmonitor.shared import sys def print_debug(txt): if tcosmonitor.shared.debug: print >> sys.stderr, "%s::%s" % (__name__, txt) #print("%s::%s" % (__name__, txt), file=sys.stderr) def WakeOnLan(ethernet_address): errortxt=None # Construct a six-byte hardware address if not ethernet_address: print_debug("Not valid ethernet address: \"%s\""%ethernet_address) return False try: addr_byte = ethernet_address.split(':') hw_addr = struct.pack('BBBBBB', int(addr_byte[0], 16), int(addr_byte[1], 16), int(addr_byte[2], 16), int(addr_byte[3], 16), int(addr_byte[4], 16), int(addr_byte[5], 16)) # Build the Wake-On-LAN "Magic Packet"... msg = '\xff' * 6 + hw_addr * 16 # ...and send it to the broadcast address using UDP s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) s.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1) s.sendto(msg, ('', 9)) s.close() print_debug("WakeOnLan() send to %s done"%ethernet_address) return True except Exception, err: print_debug("Exception error %s"%err) return False # Example use #WakeOnLan('0:3:93:81:68:b2') tcosmonitor/tcosmonitor/TcosPreferences.py0000664000000000000000000006404612260544373016372 0ustar # -*- coding: UTF-8 -*- # TcosMonitor version __VERSION__ # # Copyright (c) 2006-2011 Mario Izquierdo # # This package is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # # This package is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. import sys from time import time import gtk from gettext import gettext as _ import tcosmonitor.shared def print_debug(txt): if tcosmonitor.shared.debug: print >> sys.stderr, "%s::%s" % (__name__, txt) #print("%s::%s" % (__name__, txt), file=sys.stderr) class TcosPreferences: def __init__(self, main): self.main=main #self.ui=self.main.ui self.visible_menu_items=[] self.ui=gtk.Builder() self.ui.set_translation_domain(tcosmonitor.shared.PACKAGE) # init pref window and buttons self.ui.add_from_file(tcosmonitor.shared.GLADE_DIR + 'tcosmonitor-prefwindow.ui') self.main.pref = self.ui.get_object('prefwindow') self.main.pref.hide() self.main.pref.set_icon_from_file(tcosmonitor.shared.IMG_DIR + 'tcos-icon-32x32.png') # dont destroy window # http://www.async.com.br/faq/pygtk/index.py?req=show&file=faq10.006.htp self.main.pref.connect('delete-event', self.prefwindow_close ) # extensions table self.main.extensions_table=self.ui.get_object('extensions_table') # buttons self.main.pref_ok = self.ui.get_object('pref_ok_button') self.main.pref_ok.connect('clicked', self.on_pref_ok_button_click) self.main.pref_cancel = self.ui.get_object('pref_cancel_button') self.main.pref_cancel.connect('clicked', self.on_pref_cancel_button_click) # make pref widgets self.main.pref_spin_update = self.ui.get_object('spin_update') self.main.pref_cache_timeout = self.ui.get_object('spin_cache_timeout') self.main.pref_actions_timeout = self.ui.get_object('spin_actions_timeout') self.main.pref_scrotsize = self.ui.get_object('spin_scrotsize') self.main.pref_miniscrotsize = self.ui.get_object('spin_miniscrotsize') self.main.pref_xmlrpc_username = self.ui.get_object('xmlrpc_username') self.main.pref_xmlrpc_password = self.ui.get_object('xmlrpc_password') self.main.pref_ssh_remote_username = self.ui.get_object('ssh_remote_username') self.main.pref_ports_tnc = self.ui.get_object('ports_net_controller') self.main.pref_vlc_method_send = self.ui.get_object('vlc_method_send') self.populate_select(self.main.pref_vlc_method_send, tcosmonitor.shared.vlc_methods_send ) # populate selects (only on startup) self.main.combo_network_interfaces = self.ui.get_object('combo_networkinterface') self.populate_select(self.main.combo_network_interfaces, self.main.common.GetAllNetworkInterfaces() ) # scan method self.main.pref_combo_scan_method = self.ui.get_object('combo_scanmethod') self.populate_select(self.main.pref_combo_scan_method, tcosmonitor.shared.scan_methods ) # static host list button self.main.pref_open_static = self.ui.get_object('button_open_static') self.main.pref_open_static.connect('clicked', self.on_button_open_static) # add signal changed to scan_method to enable/disable button on the fly #self.main.pref_combo_scan_method.connect('changed', self.on_scan_method_change) # listmode method self.main.pref_combo_listmode = self.ui.get_object('combo_listmode') self.populate_select(self.main.pref_combo_listmode, tcosmonitor.shared.list_modes ) # checkboxes self.main.pref_populatelistatstartup = self.ui.get_object('ck_showliststartup') #self.main.pref_cybermode = self.ui.get_object('ck_cybermode') self.main.pref_systemprocess = self.ui.get_object('ck_systemprocess') self.main.pref_threadscontrol = self.ui.get_object('ck_threadscontrol') self.main.pref_enable_sslxmlrpc = self.ui.get_object('ck_enable_sslxmlrpc') self.main.pref_consolekit = self.ui.get_object('ck_consolekit') self.main.pref_blockactioninthishost = self.ui.get_object('ck_blockactioninthishost') self.main.pref_notshowwhentcosmonitor = self.ui.get_object('ck_notshowwhentcosmonitor') self.main.pref_onlyshowtcos = self.ui.get_object('ck_onlyshowtcos') self.main.pref_selectedhosts = self.ui.get_object('ck_selectedhosts') self.main.pref_tcosinfo = self.ui.get_object('ck_tcosinfo') self.main.pref_cpuinfo = self.ui.get_object('ck_cpuinfo') self.main.pref_kernelmodulesinfo = self.ui.get_object('ck_kernelmodulesinfo') self.main.pref_pcibusinfo = self.ui.get_object('ck_pcibusinfo') self.main.pref_ramswapinfo = self.ui.get_object('ck_ramswapinfo') self.main.pref_processinfo = self.ui.get_object('ck_processinfo') self.main.pref_networkinfo = self.ui.get_object('ck_networkinfo') self.main.pref_xorginfo = self.ui.get_object('ck_xorginfo') self.main.pref_soundserverinfo = self.ui.get_object('ck_soundserverinfo') self.main.pref_menugroups = self.ui.get_object('ck_menugroups') # menus show hide for menu in tcosmonitor.shared.preferences_menus: setattr(self.main, "pref_" + menu, self.ui.get_object(menu) ) for menu in tcosmonitor.shared.button_preferences_menus: setattr(self.main, "pref_" + menu, self.ui.get_object(menu) ) def SaveSettings(self): """ save settings """ start=time() print_debug ( "SaveSettings() INIT" ) self.main.config.SetVar("xmlrpc_username", "" + self.main.pref_xmlrpc_username.get_text() ) self.main.config.SetVar("xmlrpc_password", "" + self.main.pref_xmlrpc_password.get_text() ) self.main.config.SetVar("ssh_remote_username", "" + self.main.pref_ssh_remote_username.get_text() ) self.main.config.SetVar("ports_tnc", "" + self.main.pref_ports_tnc.get_text() ) if self.main.pref_vlc_method_send.get_active() == 0: self.main.config.SetVar("vlc_method_send", "ffmpeg-MPEG4") elif self.main.pref_vlc_method_send.get_active() == 1: self.main.config.SetVar("vlc_method_send", "ffmpeg-MPEG1") elif self.main.pref_vlc_method_send.get_active() == 2: self.main.config.SetVar("vlc_method_send", "x264-MPEG4") elif self.main.pref_vlc_method_send.get_active() == 3: self.main.config.SetVar("vlc_method_send", "http-Theora") elif self.main.pref_vlc_method_send.get_active() == 4: self.main.config.SetVar("vlc_method_send", "http-MPEG1") self.main.config.SetVar("refresh_interval", float(self.main.pref_spin_update.get_value()) ) self.main.config.SetVar("scrot_size", int(self.main.pref_scrotsize.get_value()) ) self.main.config.SetVar("miniscrot_size", int(self.main.pref_miniscrotsize.get_value()) ) self.main.config.SetVar("cache_timeout", float(self.main.pref_cache_timeout.get_value()) ) self.main.config.SetVar("actions_timeout", int(self.main.pref_actions_timeout.get_value()) ) self.main.config.SetVar("tcosmonitorversion", tcosmonitor.shared.version ) self.read_checkbox(self.main.pref_populatelistatstartup, "populate_list_at_startup") #self.read_checkbox(self.main.pref_cybermode, "work_as_cyber_mode") self.read_checkbox(self.main.pref_systemprocess, "systemprocess") self.read_checkbox(self.main.pref_threadscontrol, "threadscontrol") self.read_checkbox(self.main.pref_enable_sslxmlrpc, "enable_sslxmlrpc") self.read_checkbox(self.main.pref_consolekit, "consolekit") self.read_checkbox(self.main.pref_blockactioninthishost, "blockactioninthishost") self.read_checkbox(self.main.pref_notshowwhentcosmonitor, "notshowwhentcosmonitor") self.read_checkbox(self.main.pref_onlyshowtcos, "onlyshowtcos") self.read_checkbox(self.main.pref_selectedhosts, "selectedhosts") method=tcosmonitor.shared.scan_methods[self.main.pref_combo_scan_method.get_active()] self.main.config.SetVar("scan_network_method", method) # if self.main.pref_combo_scan_method.get_active() == 0: # self.main.config.SetVar("scan_network_method", "netstat") # elif self.main.pref_combo_scan_method.get_active() == 1: # self.main.config.SetVar("scan_network_method", "ping") # elif self.main.pref_combo_scan_method.get_active() == 2: # self.main.config.SetVar("scan_network_method", "nmap") # else: # self.main.config.SetVar("scan_network_method", "static") active=self.main.pref_combo_listmode.get_active() self.main.config.SetVar("listmode", tcosmonitor.shared.list_modes[active][0]) self.main.config.SetVar("statichosts", self.main.static.get_static_conf() ) self.read_checkbox(self.main.pref_tcosinfo, "tcosinfo") self.read_checkbox(self.main.pref_kernelmodulesinfo, "kernelmodulesinfo") self.read_checkbox(self.main.pref_pcibusinfo, "pcibusinfo") self.read_checkbox(self.main.pref_ramswapinfo, "ramswapinfo") self.read_checkbox(self.main.pref_processinfo, "processinfo") self.read_checkbox(self.main.pref_networkinfo, "networkinfo") self.read_checkbox(self.main.pref_tcosinfo, "tcosinfo") self.read_checkbox(self.main.pref_cpuinfo, "cpuinfo") self.read_checkbox(self.main.pref_xorginfo, "xorginfo") self.read_checkbox(self.main.pref_soundserverinfo, "soundserverinfo") self.read_checkbox(self.main.pref_menugroups, "menugroups") # read all combo values and save text self.main.config.SetVar("network_interface", \ self.read_select_value(self.main.combo_network_interfaces, "network_interface") ) visible_menus=[] for menu in tcosmonitor.shared.preferences_menus: pref_name=menu.replace('ck_menu_', '') widget=getattr(self.main, "pref_" + menu) if widget.get_active(): visible_menus.append("%s:1" %pref_name) else: visible_menus.append("%s:0" %pref_name) # convert array into string separated by comas self.main.config.SetVar("visible_menus", ",".join(visible_menus) ) visible_buttons_menus=[] for menu in tcosmonitor.shared.button_preferences_menus: pref_name=menu.replace('ck_button_menu_', '') widget=getattr(self.main, "pref_" + menu) if widget.get_active(): visible_buttons_menus.append("%s:1" %pref_name) else: visible_buttons_menus.append("%s:0" %pref_name) # convert array into string separated by comas self.main.config.SetVar("visible_buttons_menus", ",".join(visible_buttons_menus) ) # reput auth in dbus self.main.dbus_action.set_auth( self.main.pref_xmlrpc_username.get_text(), self.main.pref_xmlrpc_password.get_text() ) self.main.config.SaveToFile() def read_checkbox(self, widget, varname): if widget.get_active() == 1: print_debug ( "read_checkbox(%s) CHECKED" %(widget.name) ) self.main.config.SetVar(varname, 1) else: print_debug ( "read_checkbox(%s) UNCHECKED" %(widget.name) ) self.main.config.SetVar(varname, 0) def read_select_value(self, widget, varname): selected=-1 try: selected=widget.get_active() except Exception, err: print_debug ( "read_select() ERROR reading %s, error=%s" %(varname, err) ) #FIXME ALERT model=widget.get_model() value=model[selected][0] print_debug ( "read_select() reading %s=%s" %(varname, value) ) return value def prefwindow_close(self, widget, event): print_debug ( "prefwindow_close() closing preferences window" ) self.main.pref.hide() return True def check_button_pref_menus(self): total=0 for menu in tcosmonitor.shared.button_preferences_menus: pref_name=menu.replace('ck_button_menu_', '') widget_pref=getattr(self.main, "pref_" + menu) if widget_pref.get_active(): total+=1 if total > 5: tcosmonitor.shared.info_msg(_("You have select more than 5 button menus.\nOnly allowed to select a maximum of 5 buttons.")) return True return False def on_pref_ok_button_click(self, widget): if self.check_button_pref_menus(): return self.SaveSettings() # refresh pref widgets self.populate_pref() print_debug ( "on_pref_ok_button_click() SAVE SETTINGS !!!" ) self.main.write_into_statusbar ( _("New settings saved.") ) self.main.pref.hide() def on_pref_cancel_button_click(self, widget): print_debug ( "on_pref_cancel_button_click()" ) # refresh pref widgets self.populate_pref() self.main.pref.hide() def on_button_open_static(self, widget): print_debug("on_button_open_static()") self.main.static.show_static() self.main.pref.hide() def on_scan_method_change(self, widget): if widget.get_active() == 2: self.main.pref_open_static.set_sensitive(True) else: self.main.pref_open_static.set_sensitive(False) def populate_pref(self): # set default for combos self.set_active_in_select(self.main.pref_combo_scan_method, \ self.main.config.GetVar("scan_network_method")) self.set_active_in_select(self.main.combo_network_interfaces, \ self.main.config.GetVar("network_interface")) #if self.main.config.GetVar("scan_network_method") != "static": # self.main.pref_open_static.set_sensitive(False) #else: # self.main.pref_open_static.set_sensitive(True) # set value of spin self.main.pref_spin_update.set_value( float(self.main.config.GetVar("refresh_interval")) ) self.main.pref_cache_timeout.set_value( float(self.main.config.GetVar("cache_timeout")) ) self.main.pref_actions_timeout.set_value( float(self.main.config.GetVar("actions_timeout")) ) self.main.pref_scrotsize.set_value( float(self.main.config.GetVar("scrot_size")) ) self.main.pref_miniscrotsize.set_value( float(self.main.config.GetVar("miniscrot_size")) ) # set value of text widgets if self.main.config.use_secrets == False: self.main.pref_xmlrpc_username.set_sensitive(True) self.main.pref_xmlrpc_password.set_sensitive(True) self.main.pref_xmlrpc_username.set_text(\ self.main.config.GetVar("xmlrpc_username").replace('"', '') ) self.main.pref_xmlrpc_password.set_text(\ self.main.config.GetVar("xmlrpc_password").replace('"', '') ) else: self.main.pref_xmlrpc_username.set_text("") self.main.pref_xmlrpc_password.set_text("") self.main.pref_xmlrpc_username.set_sensitive(False) self.main.pref_xmlrpc_password.set_sensitive(False) self.main.pref_ssh_remote_username.set_text(\ self.main.config.GetVar("ssh_remote_username").replace('"', '') ) self.main.pref_ports_tnc.set_text(\ self.main.config.GetVar("ports_tnc").replace('"', '') ) self.set_active_in_select(self.main.pref_vlc_method_send, \ self.main.config.GetVar("vlc_method_send")) self.set_active_in_select(self.main.pref_combo_listmode, \ self.main.config.GetVar("listmode") ) # populate checkboxes self.populate_checkboxes(self.main.pref_populatelistatstartup, "populate_list_at_startup") #self.populate_checkboxes(self.main.pref_cybermode, "work_as_cyber_mode") self.populate_checkboxes(self.main.pref_systemprocess, "systemprocess") self.populate_checkboxes(self.main.pref_threadscontrol, "threadscontrol") self.populate_checkboxes(self.main.pref_enable_sslxmlrpc, "enable_sslxmlrpc") self.populate_checkboxes(self.main.pref_consolekit, "consolekit") self.populate_checkboxes(self.main.pref_blockactioninthishost, "blockactioninthishost") self.populate_checkboxes(self.main.pref_notshowwhentcosmonitor, "notshowwhentcosmonitor") self.populate_checkboxes(self.main.pref_onlyshowtcos, "onlyshowtcos") self.populate_checkboxes(self.main.pref_selectedhosts, "selectedhosts") self.populate_checkboxes(self.main.pref_tcosinfo, "tcosinfo") self.populate_checkboxes(self.main.pref_cpuinfo, "cpuinfo") self.populate_checkboxes(self.main.pref_kernelmodulesinfo, "kernelmodulesinfo") self.populate_checkboxes(self.main.pref_pcibusinfo, "pcibusinfo") self.populate_checkboxes(self.main.pref_ramswapinfo, "ramswapinfo") self.populate_checkboxes(self.main.pref_processinfo, "processinfo") self.populate_checkboxes(self.main.pref_networkinfo, "networkinfo") self.populate_checkboxes(self.main.pref_xorginfo, "xorginfo") self.populate_checkboxes(self.main.pref_soundserverinfo, "soundserverinfo") self.populate_checkboxes(self.main.pref_menugroups, "menugroups") # button menus show hide visible_buttons_menus=[] visible_buttons_menu_keys={} first_run=False total=0 visible_buttons_menus_txt=self.main.config.GetVar("visible_buttons_menus") if visible_buttons_menus_txt != "": print_debug("visible_buttons_menus is not empty") visible_buttons_menus=visible_buttons_menus_txt.split(',') for item in visible_buttons_menus: item = item.split(":") if len(item) == 1: visible_buttons_menu_keys[item[0]]="1" else: visible_buttons_menu_keys[item[0]]=item[1] else: first_run=self.main.config.IsNew("visible_buttons_menus") first_run=True print_debug("visible_buttons_menus is empty first_run=%s"%first_run) self.main.toolbar2.show() for menu in tcosmonitor.shared.button_preferences_menus: pref_name=menu.replace('ck_button_menu_', '') widget_button=getattr(self.main, "handlebox_" + pref_name) widget_pref=getattr(self.main, "pref_" + menu) if first_run: # first run, set defaults if tcosmonitor.shared.button_preferences_menus[menu][0] != False: #widget.set_active(shared.preferences_menus[menu][0]) #visible_menu_items.append(menu) #continue #visible_menus.append("%s:1" %pref_name) visible_buttons_menu_keys[pref_name]="1" if pref_name in visible_buttons_menu_keys.keys(): if visible_buttons_menu_keys[pref_name] == "1": widget_button.show() widget_pref.set_active(1) total+=1 elif visible_buttons_menu_keys[pref_name] == "0": widget_button.hide() widget_pref.set_active(0) elif pref_name not in visible_buttons_menu_keys.keys() and \ tcosmonitor.shared.button_preferences_menus[menu][0] != False: widget_button.show() widget_pref.set_active(1) total+=1 else: widget_button.hide() widget_pref.set_active(0) if total == 0: self.main.toolbar2.hide() # menus show hide visible_menus=[] visible_menu_items=[] visible_menu_keys={} first_run=False visible_menus_txt=self.main.config.GetVar("visible_menus") if visible_menus_txt != "": print_debug("visible_menus is not empty") visible_menus=visible_menus_txt.split(',') for item in visible_menus: item = item.split(":") if len(item) == 1: visible_menu_keys[item[0]]="1" else: visible_menu_keys[item[0]]=item[1] else: first_run=self.main.config.IsNew("visible_menus") first_run=True print_debug("visible_menus is empty first_run=%s"%first_run) self.visible_menu_items={"menuone":[], "menuall":[], "names":[]} for menu in tcosmonitor.shared.preferences_menus: pref_name=menu.replace('ck_menu_', '') widget=getattr(self.main, "pref_" + menu) if not widget: continue if first_run: # first run, set defaults if tcosmonitor.shared.preferences_menus[menu][0] != False: #widget.set_active(shared.preferences_menus[menu][0]) #visible_menu_items.append(menu) #continue #visible_menus.append("%s:1" %pref_name) visible_menu_keys[pref_name]="1" if pref_name in visible_menu_keys.keys(): if visible_menu_keys[pref_name] == "1": widget.set_active(1) visible_menu_items.append(menu) self.visible_menu_items["names"].append(pref_name) elif visible_menu_keys[pref_name] == "0": widget.set_active(0) elif pref_name not in visible_menu_keys.keys() and \ tcosmonitor.shared.preferences_menus[menu][0] != False: widget.set_active(1) visible_menu_items.append(menu) self.visible_menu_items["names"].append(pref_name) else: widget.set_active(0) for item in visible_menu_items: self.visible_menu_items["menuone"]+=tcosmonitor.shared.preferences_menus[item][1] self.visible_menu_items["menuall"]+=tcosmonitor.shared.preferences_menus[item][2] print_debug("visible_menu_items() %s"%self.visible_menu_items) # make menus self.main.menus.RightClickMenuOne(None) self.main.menus.RightClickMenuAll() listmode=self.main.config.GetVar("listmode") oldtab=self.main.viewtabs.get_current_page() if listmode == 'list': self.main.viewtabs.set_property('show-tabs', False) self.main.viewtabs.set_current_page(0) self.main.searchbutton.set_sensitive(True) self.main.searchtxt.set_sensitive(True) elif listmode == 'icons': self.main.viewtabs.set_property('show-tabs', False) self.main.viewtabs.set_current_page(1) self.main.searchbutton.set_sensitive(False) self.main.searchtxt.set_sensitive(False) elif listmode == 'class': self.main.viewtabs.set_property('show-tabs', False) self.main.viewtabs.set_current_page(2) self.main.searchbutton.set_sensitive(False) self.main.searchtxt.set_sensitive(False) else: self.main.viewtabs.set_property('show-tabs', True) self.main.viewtabs.set_current_page(2) self.main.searchbutton.set_sensitive(False) self.main.searchtxt.set_sensitive(False) print_debug("populate_pref() done") def populate_checkboxes(self, widget, varname): checked=self.main.config.GetVar(varname) if checked == "": checked=1 checked=int(checked) if checked == 1: widget.set_active(1) else: widget.set_active(0) return def populate_select(self, widget, values): valuelist = gtk.ListStore(str, str) for value in values: if isinstance(value, list): valuelist.append([value[0], value[1]]) else: valuelist.append([value.split()[0], value.split()[0]]) widget.set_model(valuelist) widget.set_text_column(1) model=widget.get_model() return def set_active_in_select(self, widget, default): model=widget.get_model() for i in range(len(model)): if model[i][0] == default: print_debug ("set_active_in_select() default is %s, index %d" %( model[i][0] , i ) ) widget.set_active(i) return def add_extension_row(self, args, text): # FIXME add checkboxes for every extension print_debug("add_extension_file() args=%s, text=%s" %(args, text)) table=gtk.Table(2, 2, False) table.show() button=gtk.Button(_("Stop")) image = gtk.Image() image.set_from_stock (gtk.STOCK_STOP, gtk.ICON_SIZE_BUTTON) button.set_image(image) # FIXME need to add actipon for button click event #button.connect('clicked', self.on_progressbox_click, args, table) button.show() label=gtk.Label( text ) label.show() table.attach(button, 0, 1, 0, 1, False, False, 0, 0) table.attach(label, 1, 2, 0, 1 ) self.main.progressbox.add(table) self.main.progressbox.show() tcosmonitor/tcosmonitor/ftps_server.py0000664000000000000000000003625712260544373015645 0ustar # -*- coding: UTF-8 -*- # # http://svn.osafoundation.org/m2crypto/trunk/demo/medusa/ftps_server.py # """An FTP/TLS server built on Medusa's ftp_server. # # Source taken from python-M2Crypto demo/medusa # # Copyright (c) 1999-2003 Ng Pheng Siong. All rights reserved.""" # Python import socket, string, sys, time # Medusa import asynchat, asyncore from tcosmonitor.counter import counter from medusa import ftp_server, logger # M2Crypto from M2Crypto import SSL VERSION_STRING='0.09' class ftp_tls_channel(ftp_server.ftp_channel): """FTP/TLS server channel for Medusa.""" def __init__(self, server, ssl_ctx, conn, addr): """Initialise the channel.""" self.ssl_ctx = ssl_ctx self.server = server self.current_mode = 'a' self.addr = addr asynchat.async_chat.__init__(self, conn) self.set_terminator('\r\n') self.client_addr = (addr[0], 21) self.client_dc = None self.in_buffer = '' self.closing = 0 self.passive_acceptor = None self.passive_connection = None self.filesystem = None self.authorized = 0 self._ssl_accepting = 0 self._ssl_accepted = 0 self._pbsz = None self._prot = None resp = '220 %s M2Crypto (Medusa) FTP/TLS server v%s ready.' self.respond(resp % (self.server.hostname, VERSION_STRING)) def writable(self): return self._ssl_accepting or self._ssl_accepted def handle_read(self): """Handle a read event.""" if self._ssl_accepting: self._ssl_accepted = self.socket.accept_ssl() if self._ssl_accepted: self._ssl_accepting = 0 else: try: ftp_server.ftp_channel.handle_read(self) except SSL.SSLError, what: if str(what) == 'unexpected eof': self.close() else: raise def handle_write(self): """Handle a write event.""" if self._ssl_accepting: self._ssl_accepted = self.socket.accept_ssl() if self._ssl_accepted: self._ssl_accepting = 0 else: try: ftp_server.ftp_channel.handle_write(self) except SSL.SSLError, what: if str(what) == 'unexpected eof': self.close() else: raise def send(self, data): """Send data over SSL.""" try: result = self.socket.send(data) if result <= 0: return 0 else: return result except SSL.SSLError, what: self.close() self.log_info('send: closing channel %s %s' % (repr(self), what)) return 0 def recv(self, buffer_size): """Receive data over SSL.""" try: result = self.socket.recv(buffer_size) if not result: return '' else: return result except SSL.SSLError, what: self.close() self.log_info('recv: closing channel %s %s' % (repr(self), what)) return '' def found_terminator(self): """Dispatch the FTP command.""" line = self.in_buffer if not len(line): return sp = string.find(line, ' ') if sp != -1: line = [line[:sp], line[sp+1:]] else: line = [line] command = string.lower(line[0]) if string.find(command, 'stor') != -1: while command and command[0] not in string.letters: command = command[1:] func_name = 'cmd_%s' % command if command != 'pass': self.log('<== %s' % repr(self.in_buffer)[1:-1]) else: self.log('<== %s' % line[0]+' ') self.in_buffer = '' if not hasattr(self, func_name): self.command_not_understood(line[0]) return func = getattr(self, func_name) if not self.check_command_authorization(command): self.command_not_authorized(command) else: try: result = apply(func, (line,)) except: self.server.total_exceptions.increment() (file, func, line), t, v, tbinfo = asyncore.compact_traceback() if self.client_dc: try: self.client_dc_close() except: pass resp = '451 Server error: %s, %s: file %s line: %s' self.respond(resp % (t, v, file, line)) def make_xmit_channel(self): """Create a connection for sending data.""" pa = self.passive_acceptor if pa: if pa.ready: conn, addr = pa.ready if self._prot: cdc = tls_xmit_channel(self, conn, self.ssl_ctx, addr) else: cdc = ftp_server.xmit_channel(self, addr) cdc.set_socket(conn) cdc.connected = 1 self.passive_acceptor.close() self.passive_acceptor = None else: if self._prot: cdc = tls_xmit_channel(self, None, self.ssl_ctx, None) else: cdc = ftp_server.xmit_channel(self) else: if self._prot: cdc = tls_xmit_channel(self, None, self.ssl_ctx, self.client_addr) else: cdc = ftp_server.xmit_channel(self, self.client_addr) cdc.create_socket(socket.AF_INET, socket.SOCK_STREAM) if self.bind_local_minus_one: cdc.bind(('', self.server.port - 1)) try: cdc.connect(self.client_addr) except socket.error, what: self.respond('425 Cannot build data connection') self.client_dc = cdc def make_recv_channel(self, fd): """Create a connection for receiving data.""" pa = self.passive_acceptor if pa: if pa.ready: conn, addr = pa.ready if self._prot: cdc = tls_recv_channel(self, conn, self.ssl_ctx, addr, fd) else: cdc = ftp_server.recv_channel(self, addr, fd) cdc.set_socket(conn) cdc.connected = 1 self.passive_acceptor.close() self.passive_acceptor = None else: if self._prot: cdc = tls_recv_channel(self, None, self.ssl_ctx, None, fd) else: cdc = ftp_server.recv_channel(self, None, fd) else: if self._prot: cdc = tls_recv_channel(self, None, self.ssl_ctx, self._prot, self.client_addr, fd) else: cdc = ftp_server.recv_channel(self, self.client_addr, fd) cdc.create_socket(socket.AF_INET, socket.SOCK_STREAM) try: cdc.connect(self.client_addr) except socket.error, what: self.respond('425 Cannot build data connection') self.client_dc = cdc def cmd_auth(self, line): """Prepare for TLS operation.""" # XXX Handle variations. if line[1] != 'TLS': self.command_not_understood (string.join(line)) else: self.respond('234 AUTH TLS successful') self._ssl_accepting = 1 self.socket = SSL.Connection(self.ssl_ctx, self.socket) self.socket.setup_addr(self.addr) self.socket.setup_ssl() self.socket.set_accept_state() self._ssl_accepted = self.socket.accept_ssl() if self._ssl_accepted: self._ssl_accepting = 0 def cmd_pbsz(self, line): """Negotiate size of buffer for secure data transfer. For FTP/TLS the only valid value for the parameter is '0'; any other value is accepted but ignored.""" if not (self._ssl_accepting or self._ssl_accepted): return self.respond('503 AUTH TLS must be issued prior to PBSZ') self._pbsz = 1 self.respond('200 PBSZ=0 successful.') def cmd_prot(self, line): """Negotiate the security level of the data connection.""" if self._pbsz is None: return self.respond('503 PBSZ must be issued prior to PROT') if line[1] == 'C': self.respond('200 Protection set to Clear') self._pbsz = None self._prot = None elif line[1] == 'P': self.respond('200 Protection set to Private') self._prot = 1 elif line[1] in ('S', 'E'): self.respond('536 PROT %s unsupported' % line[1]) else: self.respond('504 PROT %s unsupported' % line[1]) class ftp_tls_server(ftp_server.ftp_server): """FTP/TLS server for Medusa.""" SERVER_IDENT = 'M2Crypto FTP/TLS Server (v%s)' % VERSION_STRING ftp_channel_class = ftp_tls_channel def __init__(self, authz, ssl_ctx, host=None, ip='', port=21, resolver=None, log_obj=None): """Initialise the server.""" self.ssl_ctx = ssl_ctx self.ip = ip self.port = port self.authorizer = authz if host is None: self.hostname = socket.gethostname() else: self.hostname = host self.total_sessions = counter() self.closed_sessions = counter() self.total_files_out = counter() self.total_files_in = counter() self.total_bytes_out = counter() self.total_bytes_in = counter() self.total_exceptions = counter() asyncore.dispatcher.__init__(self) self.create_socket(socket.AF_INET, socket.SOCK_STREAM) self.set_reuse_addr() self.bind((self.ip, self.port)) self.listen(5) if log_obj is None: log_obj = sys.stdout if resolver: self.logger = logger.resolving_logger(resolver, log_obj) else: self.logger = logger.unresolving_logger(logger.file_logger(sys.stdout)) l = 'M2Crypto (Medusa) FTP/TLS server started at %s\n\tAuthz: %s\n\tHostname: %s\n\tPort: %d' self.log_info(l % (time.ctime(time.time()), repr(self.authorizer), self.hostname, self.port)) def handle_accept(self): """Accept a socket and dispatch a channel to handle it.""" conn, addr = self.accept() self.total_sessions.increment() self.log_info('Connection from %s:%d' % addr) self.ftp_channel_class(self, self.ssl_ctx, conn, addr) class nbio_ftp_tls_actor: """TLS protocol negotiation mixin for FTP/TLS.""" def tls_init(self, sock, ssl_ctx, client_addr): """Perform TLS protocol negotiation.""" self.ssl_ctx = ssl_ctx self.client_addr = client_addr self._ssl_handshaking = 1 self._ssl_handshake_ok = 0 if sock: self.socket = SSL.Connection(self.ssl_ctx, sock) self.socket.setup_addr(self.client_addr) self.socket.setup_ssl() self._ssl_handshake_ok = self.socket.accept_ssl() if self._ssl_handshake_ok: self._ssl_handshaking = 0 self.add_channel() # else the client hasn't connected yet; when that happens, # handle_connect() will be triggered. def tls_neg_ok(self): """Return status of TLS protocol negotiation.""" if self._ssl_handshaking: self._ssl_handshake_ok = self.socket.accept_ssl() if self._ssl_handshake_ok: self._ssl_handshaking = 0 return self._ssl_handshake_ok def handle_connect(self): """Handle a data connection that occurs after this instance came into being. When this handler is triggered, self.socket has been created and refers to the underlying connected socket.""" self.socket = SSL.Connection(self.ssl_ctx, self.socket) self.socket.setup_addr(self.client_addr) self.socket.setup_ssl() self._ssl_handshake_ok = self.socket.accept_ssl() if self._ssl_handshake_ok: self._ssl_handshaking = 0 self.add_channel() def send(self, data): """Send data over SSL.""" try: result = self.socket.send(data) if result <= 0: return 0 else: return result except SSL.SSLError, what: self.close() self.log_info('send: closing channel %s %s' % (repr(self), what)) return 0 def recv(self, buffer_size): """Receive data over SSL.""" try: result = self.socket.recv(buffer_size) if not result: return '' else: return result except SSL.SSLError, what: self.close() self.log_info('recv: closing channel %s %s' % (repr(self), what)) return '' class tls_xmit_channel(nbio_ftp_tls_actor, ftp_server.xmit_channel): """TLS driver for a send-only data connection.""" def __init__(self, channel, conn, ssl_ctx, client_addr=None): """Initialise the driver.""" ftp_server.xmit_channel.__init__(self, channel, client_addr) self.tls_init(conn, ssl_ctx, client_addr) def readable(self): """This channel is readable iff TLS negotiation is in progress. (Which implies a connected channel, of course.)""" if not self.connected: return 0 else: return self._ssl_handshaking def writable(self): """This channel is writable iff TLS negotiation is in progress or the application has data to send.""" if self._ssl_handshaking: return 1 else: return ftp_server.xmit_channel.writable(self) def handle_read(self): """Handle a read event: either continue with TLS negotiation or let the application handle this event.""" if self.tls_neg_ok(): ftp_server.xmit_channel.handle_read(self) def handle_write(self): """Handle a write event: either continue with TLS negotiation or let the application handle this event.""" if self.tls_neg_ok(): ftp_server.xmit_channel.handle_write(self) class tls_recv_channel(nbio_ftp_tls_actor, ftp_server.recv_channel): """TLS driver for a receive-only data connection.""" def __init__(self, channel, conn, ssl_ctx, client_addr, fd): """Initialise the driver.""" ftp_server.recv_channel.__init__(self, channel, client_addr, fd) self.tls_init(conn, ssl_ctx, client_addr) def writable(self): """This channel is writable iff TLS negotiation is in progress.""" return self._ssl_handshaking def handle_read(self): """Handle a read event: either continue with TLS negotiation or let the application handle this event.""" if self.tls_neg_ok(): ftp_server.recv_channel.handle_read(self) def handle_write(self): """Handle a write event: either continue with TLS negotiation or let the application handle this event.""" if self.tls_neg_ok(): ftp_server.recv_channel.handle_write(self) tcosmonitor/tcosmonitor/shared.py0000664000000000000000000005760512260544373014551 0ustar # -*- coding: UTF-8 -*- # TcosMonitor version __VERSION__ # # Copyright (c) 2006-2011 Mario Izquierdo # # This package is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # # This package is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # Defaults values of TcosMonitor import os import sys from gettext import gettext as _ from gettext import bindtextdomain, textdomain from locale import setlocale, LC_ALL have_display=False allow_local_display=False # import if DISPLAY is defined if "DISPLAY" in os.environ: if os.environ["DISPLAY"] != "": have_display=True import pygtk pygtk.require('2.0') import gtk # program name to use in gettext .mo PACKAGE = "tcosmonitor" # version version="__VERSION__" website="http://www.tcosproject.org" LICENSE_FILE="/usr/share/common-licenses/GPL-2" # default debug value (overwrite with --debug or -d) debug=False # default TCOS config file (default in this path, if installed use global) tcos_config_file="./tcos.conf" # if exec from svn or sources dir if os.path.isdir('./debian') and os.path.isdir('./po'): LOCALE_DIR = "./po/" GLADE_DIR = "./ui/" IMG_DIR = "./images/" tcos_config_file="./tcos.conf" GLOBAL_CONF='./tcosmonitor.conf' else: tcos_config_file="/etc/tcos/tcos.conf" GLADE_DIR = "/usr/share/tcosmonitor/ui/" IMG_DIR = "/usr/share/tcosmonitor/images/" LOCALE_DIR = "/usr/share/locale" GLOBAL_CONF='/etc/tcos/tcosmonitor.conf' # gettext support setlocale( LC_ALL ) bindtextdomain( PACKAGE, LOCALE_DIR ) textdomain( PACKAGE ) # config file config_file=os.path.expanduser('~/.tcosmonitor.conf') config_file_secrets=('/etc/tcos/secrets/tcosmonitor-secret') scan_methods=[ "netstat", "ping", "nmap", "static", "consolekit", "avahi", ] vcodecs=["mp4v", "mp1v", "h264", "theo"] vencs=["ffmpeg", "x264", "theora"] acodecs=["mpga", "vorb"] aencs=["ffmpeg", "vorbis"] accesss=["udp", "http"] muxs=["ts", "ogg"] vlc_methods_send=[ "ffmpeg-MPEG4", "ffmpeg-MPEG1", "x264-MPEG4", "http-Theora", "http-MPEG1" ] list_modes=[ ['list', _("Traditional list only") ], ['icons', _("Icons only") ], ['class', _("Simulate classroom") ], ['both', _("Lists, icons and classroom with tabs") ], ] DefaultConfig=[ ["populate_list_at_startup", 0, "int"], #["work_as_cyber_mode", 0, "int"], ["refresh_interval", 0, "int"], ["cache_timeout", 0, "int"], ["actions_timeout", 0, "int"], ["scan_network_method", "netstat", "str"], ["scrot_size", 65, "int"], # % of screenshot ["miniscrot_size", 25, "int"], # % of screenshot ["xmlrpc_username", "user", "str"], ["xmlrpc_password","", "str"], ["network_interface","eth0", "str"], ["tcosinfo", 1, "int"], ["cpuinfo", 0, "int"], ["kernelmodulesinfo", 0, "int"], ["pcibusinfo", 0, "int"], ["ramswapinfo", 0, "int"], ["processinfo", 0, "int"], ["networkinfo", 0, "int"], ["xorginfo", 0, "int"], ["soundserverinfo", 0, "int"], ["systemprocess", 0, "int"], ["threadscontrol", 1, "int"], ["tcosmonitorversion", version, "str"], ["blockactioninthishost", 1, "int"], ["notshowwhentcosmonitor", 0, "int"], ["onlyshowtcos", 1, "int"], ["selectedhosts", 0, "int"], ["statichosts", "", "str"], ["ssh_remote_username", "root", "str"], ["vlc_method_send", "ffmpeg-MPEG4", "str"], ["show_donate", 1, "int"], ["visible_menus", "", "str"], ["visible_buttons_menus", "", "str"], ["enable_sslxmlrpc", 0, "int"], ["ports_tnc", "", "str"], ["listmode", "list", "str"], ["menugroups", 1, "int"], ["positions", "", "str"], ["show_about", 1, "int"], ["consolekit", 0, "int"], ] # # IMPORTANT NOTE # PLEASE DON'T SET "show__donate" TO "0" by default if you don't have a good reason # tcosmonitor need to show this message when loads first time to get some # users colaboration. # # Please contact with developers if you are not agree with this. # # method ping is list 0 of combo_scan_method # text file enabling or disabling tcos-devices-ng or tcos-volume-manager module_conf_file="/etc/tcos/tcosmonitor.conf" httpd_port=8081 xmlremote_port=8998 xmlremote_sslport=8999 xmlremote_url="/RPC2" pulseaudio_soundserver_port=4713 # #char *dev_name[SOUND_MIXER_NRDEVICES] = { \ # "Master", \ # "Bass", \ # "Treble", \ # "Synth", \ # "PCM", \ # "Speaker", \ # "Line", \ # "Mic", \ # "CD", \ # "Mix", \ # "PCM2", \ # "Record", \ # "Input", \ # "Output", \ # "Line 1", \ # "Line 2", \ # "Line 3", \ # "Digital1", \ # "Digital2", \ # "Digital3", \ # "Phone In", \ # "PhoneOut", \ # "Video", \ # "Radio", \ # "Monitor" }; # sound_only_channels=["Front", "Master", "Master Front", "PCM", "Line", "CD", "Mic", "Front Mic", "Aux", "Headphone", "Speaker" , "PC Speaker", "vol", "pcm", "line", "cd", "mic", "Mix", "PCM2", "Capture"] hidden_network_ifaces=["lo", "sit0", "pan0", "wmaster0", "vmnet0", "vmnet1", "vmnet8", "vbox0", "vbox1", "vbox2", "vboxnet0", "vboxnet1"] # for enable exclude users, change to "tcosmonitor-exclude" dont_show_users_in_group="tcosmonitor-exclude" check_tcosmonitor_user_group=False tnc_only_ports="no" cache_timeout=20 wait_between_many_host=0.1 socket_default_timeout=15 dbus_disabled=False disable_textview_on_update=True icon_image_thin="client.png" icon_image_standalone="client.png" icon_image_no_logged="host_tcos.png" NO_LOGIN_MSG="---" ## ## entry completion example apps ## appslist=[ 'xterm', 'firefox', 'iceweasel', 'gimp', 'oowriter', 'oocalc', 'oodraw' , 'gnumeric', 'abiword' , 'gedit', 'jclic', 'amsn', 'gftp', 'gcalctool', 'nautilus', 'konqueror', 'beep-media-player', 'audacious', 'tcos-volume-manager', 'tcos-devices-ng' ] # main one host menus ### ### [ TEXT, ICON (in images dir), [submenus index] ] ### onehost_mainmenus = [ [ _("Terminal actions") , "active.png", [0,2,3,4,5,22,23,9,10,12,19,1] ], [ _("User actions") , "logged.png", [11,13,14,15,20,21,6,7] ], [ _("Audio, video and files"), "multimedia.png", [8,17,16,18,24]], ] ### ### [ TEXT, ICON (in images dir), EXTENSION (or None) ] ### onehost_menuitems=[ [ _("Refresh terminal info"), "menu_refresh.png", "extensions.info" , 0] , #action=0 [ _("Clean info about terminal"), "menu_clear.png"] , #action=1 [ _("Reboot"), "menu_reboot.png"] , #action=2 [ _("Poweroff"), "menu_poweroff.png"] , #action=3 [ _("Lock screen"), "menu_lock.png" ] , #action=4 [ _("Unlock screen"), "menu_unlock.png" ] , #action=5 [ _("Connect to remote screen (iTALC)"), "menu_remote.png" ],#action=6 [ _("Connect to remote screen (VNC)"), "menu_remote.png" ] , #action=7 [ _("Screenshot"), "menu_screenshot.png" ] , #action=8 [ _("Give a remote xterm"), "menu_xterm.png" ] , #action=9 [ _("Configure this host"), "menu_configure.png" ] , #action=10 [ _("Logout client"), "menu_restartx.png" ] , #action=11 [ _("Restart X session with new settings"), "menu_newconf.png" ] , #action=12 [ _("Exec app on user display") , "menu_exec.png" ] , #action=13 [ _("Send a text message to user") , "menu_msg.png" ] , #action=14 [ _("Show running apps of this client") , "menu_proc.png" ], #action=15 [ _("Audio/Video broadcast") , "menu_broadcast.png" ], #action=16 [ _("Send files") , "menu_send.png" ], #action=17 [ _("Demo mode (from this host)") , "menu_tiza.png" ], #action=18 [ _("Boot client (WakeOnLan)") , "menu_wol.png" ], #action=19 [ _("Lock internet"), "menu_locknet.png" ] , #action=20 [ _("Unlock internet"), "menu_unlocknet.png" ], #action=21 [ _("DPMS Power off monitor"), "menu_dpms_off.png" ] , #action=22 [ _("DPMS Power on monitor"), "menu_dpms_on.png" ], #action=23 [ _("Send MIC audio (from this host)"), "menu_rtp.png" ], #action=24 ] # main one host menus ### ### [ TEXT, ICON (in images dir), [submenus index] ] ### allhost_mainmenus = [ [ _("Terminal actions") , "active.png", [0,1,2,3,4,5,13,16,17] ], [ _("User actions") , "logged.png", [6,7,8,14,15,19] ], [ _("Audio, video and files"), "multimedia.png", [10,12,11,9,18]], ] ### ### [ TEXT, ICON (in images dir) ] ### allhost_menuitems=[ [ _("Reboot all clients"), "menu_reboot.png"] , #action=0 [ _("Poweroff all clients"), "menu_poweroff.png"] , #action=1 [ _("Lock all screens"), "menu_lock.png" ] , #action=2 [ _("Unlock all screens"), "menu_unlock.png" ] , #action=3 [ _("Logout clients"), "menu_restartx.png" ] , #action=4 [ _("Restart X session of all clients"), "menu_newconf.png" ] ,#action=5 [ _("Exec same app in all connected users") , "menu_exec.png" ] ,#action=6 [ _("Send a text message to all connected users") , "menu_msg.png" ], #action=7 [ _("Enter demo mode, all connected users see my screen") , "menu_tiza.png" ], #action=8 [ _("Enter conference mode, all connected users can hear me") , "menu_rtp.png" ], #action=9 [ _("Capture All clients screens") , "menu_screenshot.png" ], #action=10 [ _("Audio/Video broadcast") , "menu_broadcast.png" ], #action=11 [ _("Send files") , "menu_send.png" ], #action=12 [ _("Boot All clients (WakeOnLan)") , "menu_wol.png" ], #action=13 [ _("Lock internet in all connected users"), "menu_locknet.png" ] , #action=14 [ _("Unlock internet in all connected users"), "menu_unlocknet.png" ], #action=15 [ _("DPMS Power off monitors"), "menu_dpms_off.png" ] , #action=16 [ _("DPMS Power on monitors"), "menu_dpms_on.png" ], #action=17 [ _("Chat audio conference"), "menu_rtp.png" ], #action=18 [ _("Live view screens with VNC"), "menu_remote.png" ], #action=19 ] preferences_menus_always_show={"menuone":[0,1], "menuall":[4]} # format #ui_widget, [default_enabled, menuone , menuall] preferences_menus={ "ck_menu_lock":[ True, [4,5], [2,3] ], "ck_menu_italc":[ False, [6], [] ], "ck_menu_vnc":[ True, [7], [] ], "ck_menu_reboot":[ True, [2,3], [0,1] ], "ck_menu_screenshots":[ True, [8], [10]], "ck_menu_shell":[ False, [9], []], "ck_menu_xorg":[ True, [10,11], [] ], "ck_menu_restartx":[ True, [12], [5] ], "ck_menu_exe":[ True, [13], [6] ], "ck_menu_text":[ True, [14], [7] ], "ck_menu_show":[ True, [15], [] ], "ck_menu_video":[ True, [16], [11] ], "ck_menu_send":[ True, [17], [12] ], "ck_menu_demo":[ True, [18], [8] ], "ck_menu_wakeonlan":[ False, [19], [13] ], "ck_menu_conference":[ True, [24], [9,18] ], "ck_menu_net":[ True, [20,21],[14,15] ], "ck_menu_dpms":[ True, [22,23],[16,17] ], "ck_menu_personalize":[ False, [10], [] ], "ck_menu_livevnc":[ True, [], [19] ], } button_preferences_menus={ "ck_button_menu_chat":[ False ], "ck_button_menu_list":[ False ], "ck_button_menu_exe":[ False ], "ck_button_menu_text":[ False ], "ck_button_menu_video":[ False ], "ck_button_menu_send":[ False ], "ck_button_menu_audio":[ False ], } # this list contains all process to not show in user processes system_process=[ "dbus-daemon", "tcos-dbus-client", "scp-client", "ssh-agent", "dbus-launch", "gam_server", "gconfd", "gnome-keyring-daemon", "gnome-applets", "gnome-pty-helper", "gnome-settings-daemon", "-applet", "gnome-vfs", "panel-plugins", "dcop", "bonobo", "xauth", "faucet", "trackerd", "metacity", "gnome-panel", "nautilus", "gnome-power-manager", "gnome-cups-icon", "evolution-alarm-notify", "update-notifier", "system-config-printer", "gnome-volume-manager", "seahorse-agent", "smart-notifier", "[python]", "[sh]", "tcos-volume-manager", "notification-daemon", "bash", "gvfsd", "gconf-helper", "gdu-notification-daemon", "gvfs-gdu-volume", "gvfs-afc-volume-monitor", "gvfs-gphoto2-volume-monitor", "indicator-messages-service", "indicator-application-service", "indicator-sound-service", "notify-osd", "polkit-gnome-authentication-agent-1", "gvfs-fuse-daemon", ] # TcosPersonalize stuff remotehost=None xsession_values=[ "XDMCP", "local", "sshX", "FreeNX", "rDesktop" ] xsession_default="XDMCP" # FIXME need to support other drivers xdriver_values=[ "auto" ] xdriver_default="auto" # obtained from configure xorg # grep "@" bin/configurexorg | \ # grep Hz | awk -F ")" '{print $1}' | awk '{print $1", "}' xres_values=[ "640x480 @ 60Hz", "640x480 @ 72Hz", "800x600 @ 60Hz", "800x600 @ 72Hz", "800x600 @ 85Hz", "832x624 @ 75Hz", "1024x768 @ 60Hz", # <= default "1024x768 @ 70Hz", "1024x768 @ 75Hz", "1152x768 @ 54.8Hz", "1152x864 @ 60Hz", "1152x864 @ 75Hz", "1280x768 @ 60Hz", "1280x800 @ 60Hz", "1280x960 @ 60Hz", "1280x960 @ 85Hz", "1280x1024 @ 60Hz", "1400x1050 @ 60Hz", "1400x1050 @ 75Hz", "1440x900 @ 60Hz", "1440x900 @ 75Hz", "1600x1024 @ 85Hz", "1600x1200 @ 60Hz", "1600x1200 @ 75Hz", "1600x1200 @ 85Hz", "1680x1050 @ 60Hz", "1792x1344 @ 75Hz", "1792x1344 @ 60Hz", "1856x1392 @ 60Hz", "1856x1392 @ 75Hz", "1920x1200 @ 60Hz", "1920x1440 @ 60Hz", "1920x1440 @ 75Hz", "1920x1440 @ 85Hz", "2048x1536 @ 60Hz", "2048x1536 @ 75Hz", "2048x1536 @ 85Hz", ] xres_default="1024x768 @ 60Hz" xdepth_values=[ "24", "16", "15", "8", "4", "1" ] xdepth_default="16" PersonalizeConfig=[ ["xdriver", xdriver_default, "str"], ["xres", xres_default, "str"], ["xdepth", xdepth_default, "str"], ["xmousewheel",1, "int"], ["xdontzap",0, "int"], ["xdpms",1, "int"], ["xsession", xsession_default, "str"], ["xhorizsync", "", "str"], ["xvertsync", "", "str"], ["tcospersonalizeversion", version, "str"] ] # shared functions def print_debug(txt): if debug: print >> sys.stderr, "%s::%s" % (__name__, txt) #print("%s::%s" % (__name__, txt), file=sys.stderr) if have_display: def ask_msg(txt): response="yes" d = gtk.MessageDialog(None, gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT, gtk.MESSAGE_QUESTION, gtk.BUTTONS_YES_NO, txt) if d.run() == gtk.RESPONSE_YES: response=True else: response=False d.destroy() print_debug( _("QUESTION: %(txt)s, RESPONSE %(response)s") %{"txt":txt, "response":response} ) return response def info_msg(txt, urgency=False): if urgency: d = gtk.MessageDialog(None, gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT, gtk.MESSAGE_INFO, gtk.BUTTONS_OK_CANCEL, None) d.set_markup(txt) if d.run() == gtk.RESPONSE_OK: response=True else: response=False d.destroy() print_debug ( _("INFO: %s") % txt ) return response else: d = gtk.MessageDialog(None, gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT, gtk.MESSAGE_INFO, gtk.BUTTONS_OK, txt) d.run() d.destroy() print_debug ( _("INFO: %s") % txt ) def error_msg(txt): d = gtk.MessageDialog(None, gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT, gtk.MESSAGE_WARNING, gtk.BUTTONS_OK, txt) d.run() d.destroy() print_debug ( _("ERROR: %s") % txt ) def test_start(module): """ read conf file and test if module is active """ f=open(module_conf_file, "r") conf=f.readlines() f.close() for line in conf: if line == '\n': continue if line.find('#') == 0: continue line=line.replace('\n', '') if "=" in line: if line.split('=')[0] == module: if line.split('=')[1] == "0": return False else: return True import binascii import IPy import ipaddr import re def isIPAddr(ip_str): pattern = r"\b(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b" if re.match(pattern, ip_str): return True else: return False def is_bin(txt): if txt in ['3a', '2e', '61', '62', '63', '64', '65', '66']: # txt is ':' or '.' or a letter between a-f return False try: txt=int(txt) except ValueError: # can't convert txt to int, txt is hexadecimal aka binary return True if txt >= 30 and txt <= 39: # txt is between 0(0x30) and 9(0x39) return False # return binary by default return True def parseIPAddress(ipstr, return_ipv4=True): """ pass an string or binary IP and return IPV4 """ newip=[] isBin=False if ipstr == "::1": # localhost in IPV6 return "127.0.0.1" # GDM when change username use a $DISPLAY like this "::12" if re.match("::([0-9]{1,9})$", ipstr): return "" # XEPHYR NAME ':20.0' if re.match(":([0-9]{1,9}|[0-9]{1,9}.[0-9]{1,9})$", ipstr): return "" # match x.x.x.x:0 or x.x.x.x:0.0 if re.match(".*:([0-9]{1,9}|[0-9{1-9}].[0-9{1-9}])$", ipstr): #print_debug("delete display from IP\n\n") ipstr=ipstr.rsplit(":", 1)[0] # match "localhost:10" if re.match("[a-zA-Z].*:([0-9]{1,9})", ipstr): ipstr=ipstr.rsplit(":", 1)[0] return ipstr # match "127.0.0.1:10.0" if re.match(".*:([0-9{1-9}][0-9{1-9}].[0-9{1-9}])$", ipstr): ipstr=ipstr.rsplit(":", 1)[0] return ipstr # hostname must start with letter and contain letters numbers and '-' or '.' if re.match("^[a-zA-Z][a-zA-Z0-9.-]+$", ipstr): # ipstr is a hostname return ipstr for it in ipstr: eol=is_bin(binascii.hexlify(it)) if eol: isBin=True #print_debug("%s => %s string=%s"%(it, binascii.hexlify(it), eol) ) newip.append(binascii.hexlify(it)) if ipstr == '': return '' if isBin: try: ip=ipaddr.IPAddress(IPy.parseAddress("0x" + "".join(newip) )[0]) except: return ipstr else: try: ip=ipaddr.IPAddress(ipstr) #except Exception: except Exception, err: print_debug(" parseIPAddress() Exception, error=%s"%err) return ipstr ipv4=ip if return_ipv4 and ip.version == 6 and ip.ipv4_mapped: #print_debug(" IPV6 found %s"%ip) ipv4=ip.ipv4_mapped.exploded return ipv4 if __name__ == "__main__": debug=True if len(sys.argv) > 1: value=parseIPAddress(sys.argv[1]) print >> sys.stderr, "shared.py sys.argv[1]='%s' => '%s'"%(sys.argv[1],value) print value sys.exit(0) # test IPV6 print " IPV6 '::ffff:10.0.2.22' => ", parseIPAddress('::ffff:10.0.2.22') # test binary IP import Xlib.xauth a=Xlib.xauth.Xauthority().entries[-1][1] #print Xlib.xauth.Xauthority().entries print " Xlib '%s' => '%s'" %(a, parseIPAddress(a)) # try with $DISPLAY print " DISPLAY '192.168.0.10:0.0' => '%s'" %parseIPAddress('192.168.0.10:0.0') print " DISPLAY 'thinkpad:0.0' => '%s'" %parseIPAddress('thinkpad:0.0') # try with hostname print " NAME 'tcos10:0.0' => '%s'" %parseIPAddress('tcos10:0.0') # try with Xephyr hostname print " XEPHYR NAME ':20.0' => '%s'" %parseIPAddress(':20.0') print " GDM change username '::2' => '%s'" %parseIPAddress('::2') print " Hostname 'tcos-01:0' => '%s'" %parseIPAddress('tcos-01:0') print " Hostname 'tcos.01:0' => '%s'" %parseIPAddress('tcos.01:0') print " Hostname 'localhost:10.0' => '%s'" %parseIPAddress('localhost:10.0') print " Hostname '127.0.0.1:10.0' => '%s'" %parseIPAddress('127.0.0.1:10.0') # try with IPV6 $DISPLAY print " IPV6 DISPLAY '::ffff:192.168.0.1:0.0' => '%s'" %parseIPAddress('::ffff:192.168.0.1:0.0') print " IPV6 DISPLAY '::ffff:192.168.0.1:12' => '%s'" %parseIPAddress('::ffff:192.168.0.1:12') print " IPV6 DISPLAY '::ffff:172.16.10.200:12' => '%s'" %parseIPAddress('::ffff:172.16.10.200:12') print " isIPAddr(127.0.0.1) =%s"%isIPAddr('127.0.0.1') print " isIPAddr(pc22) =%s"%isIPAddr('pc22') print " isIPAddr(localhost) =%s"%isIPAddr('localhost') from threading import Thread class Workers: def __init__(self, main, target, args, dog=True): self.dog=dog self.main=main self.target=target self.args=args if not self.dog: #print_debug ( "worker() no other jobs job=%s args=%s" %(self.target, self.args) ) self.th=Thread(target=self.target, args=(self.args) ) self.__stop=True return if self.main.worker_running == True: #print_debug ( "worker() other jobs pending NO START job=%s args=%s" %(self.target, self.args) ) pass else: #print_debug ( "worker() no other jobs job=%s args=%s" %(self.target, self.args) ) self.th=Thread(target=self.target, args=(self.args) ) self.__stop=True def start_watch_dog(self, dog_thread): if not self.dog: #print_debug ( "start_watch_dog() dog DISABLED" ) return print_debug ( "start_watch_dog() starting watch dog..." ) watch_dog=Thread(target=self.watch_dog, args=([dog_thread]) ) watch_dog.start() def watch_dog(self, dog_thread): print_debug ( "watch_dog() __init__ " ) dog_thread.join() self.set_finished() print_debug ( "watch_dog() FINISHED" ) def start(self): if hasattr(self.main, "progressbutton"): self.main.progressbutton.set_sensitive(True) if self.main.worker_running == False: self.set_started() # config var as started self.th.start() # start thread self.start_watch_dog(self.th) # start watch_dog else: print_debug ( "worker() other work pending... not starting" ) def stop(self): self.__stop=True self.__finished=True #self.main.worker_running=False def set_finished(self): print_debug("worker set_finished() *****") self.__finished = True self.__stop=False self.main.worker_running=False def set_started(self): print_debug("worker set_started() *****") self.__finished=False self.__stop=False self.main.worker_running=True def is_stoped(self): return self.__stop def get_finished(self): return self.__finished def set_for_all_action(self, function, allhost, action): Thread( target=function, args=([allhost, action]) ).start() tcosmonitor/tcosmonitor/TcosConf.py0000664000000000000000000001655512260544373015020 0ustar # -*- coding: UTF-8 -*- # TcosMonitor version __VERSION__ # # Copyright (c) 2006-2011 Mario Izquierdo # # This package is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # # This package is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. import os import sys from time import time import tcosmonitor.shared def print_debug(txt): if tcosmonitor.shared.debug: print >> sys.stderr, "%s::%s" % (__name__, txt) #print("%s::%s" % (__name__, txt), file=sys.stderr) def crono(start, txt): print_debug ("crono(), %s get %f seconds" %(txt, (time() - float(start))) ) return class TcosConf: def __init__(self, main, openfile=True): print_debug ( "__init__()" ) self.main=main self.FirstRunning=False self.allnetworkinterfaces=[] #self.GetAllNetworkInterfaces() # reset memory data self.data="" self.vars=None self.use_secrets=False self.vars=[] self.vars_secrets=[] if openfile: self.CheckConfFile() self.reset() else: print_debug ( "__init__() not opening conf file" ) def reset(self): print_debug("reset() reset data...") # reset memory data self.data="" self.vars=None self.vars=[] self.use_secrets=False self.vars_secrets=[] self.OpenFile() def OpenFile(self): self.CheckConfFile() conf=None conf=[] print_debug("open_file() reading data from \"%s\"..." \ %(tcosmonitor.shared.config_file) ) try: fd=file(tcosmonitor.shared.config_file, 'r') except Exception, err: print("Error Opening %s file, error=%s"%(tcosmonitor.shared.config_file, err) ) return self.data=fd.readlines() fd.close() for line in self.data: if line != '\n': line=line.replace('\n', '') conf.append(line) print_debug ( "OpenFile() Found %d vars" %( len(conf)) ) if len(conf) <1: print_debug ( "OpenFile() FILE IS EMPTY!!!" ) return for i in range( len(conf) ): if conf[i].find("#") != 0: (var, value)=conf[i].split("=", 1) self.vars.append([var, value]) if os.path.isfile(tcosmonitor.shared.config_file_secrets): if self.main.ingroup_tcos == False and os.getuid() != 0: return try: fd=file(tcosmonitor.shared.config_file_secrets, 'r') except Exception, err: print("Error saving %s file, error=%s"%(tcosmonitor.shared.config_file_secrets, err) ) return self.data=fd.readline() fd.close() if self.data != "\n": (var1, var2)=self.data.replace("\n", "").split(":") self.vars_secrets.append([var1, var2]) self.use_secrets=True return def CheckConfFile(self): conf=None conf=[] if not os.path.isfile(tcosmonitor.shared.config_file): print_debug ( "CheckConfFile() %s not exists" %(tcosmonitor.shared.config_file) ) self.CreateConfFile() return try: fd=file(tcosmonitor.shared.config_file, 'r') except Exception, err: print("Error Opening %s file, error=%s"%(tcosmonitor.shared.config_file, err) ) return self.data=fd.readlines() fd.close() for line in self.data: if line != '\n': line=line.replace('\n', '') conf.append(line) if len(conf) <1: print_debug ( "CheckConfFile() FILE IS EMPTY!!!" ) self.CreateConfFile() return def CreateConfFile(self): print_debug ( "CreateConfFile()" ) # save this into file fd=file(tcosmonitor.shared.config_file, 'w') for item in tcosmonitor.shared.DefaultConfig: key=item[0] value=item[1] print_debug ("key=%s value=%s" %(key, value)) fd.write("%s=%s\n" %(key, value) ) fd.close() # make chmod 600 os.chmod(tcosmonitor.shared.config_file, 0600) self.FirstRunning=True def SetVar(self, varname, value): print_debug ( "SetVar(%s)=\"%s\"" %(varname, value) ) self.newdata=None self.newdata=[] for i in range(len(self.vars)): if varname == self.vars[i][0]: print_debug ( "changing value %s to %s of %s" \ %(self.vars[i][1], value, varname) ) self.vars[i][1]="%s" %(value) return print_debug ("SetVar() WARNING var=%s value=%s not in vars!!!" %(varname, value)) def SaveToFile(self): print_debug ( "SaveToFile() len(self.vars)=%d" %( len(self.vars) ) ) if len(self.vars) < 1: print_debug ( "SaveToFile() self.vars is empty" ) return fd=file(tcosmonitor.shared.config_file, 'w') for i in range(len(self.vars)): fd.write("%s=%s\n" %(self.vars[i][0], self.vars[i][1])) fd.close os.chmod(tcosmonitor.shared.config_file, 0600) print_debug ( "SaveToFile() new settings SAVED!!!") return def GetVar(self, varname): if self.use_secrets: if varname == "xmlrpc_username": return self.vars_secrets[0][0] elif varname == "xmlrpc_password": return self.vars_secrets[0][1] for i in range( len(self.vars) ): if self.vars[i][0].find(varname) == 0: if self.vars[i][1] == "1": return 1 return self.vars[i][1] # search for new var for _var in tcosmonitor.shared.DefaultConfig: if _var[0] == varname: print_debug ( "GetVar() NEW VAR FOUND, %s, adding to list \"\""\ %(varname) ) self.vars.append( [_var[0], _var[1], "new"] ) return _var[1] print_debug ( "GetVar() not found, %s, returning \"\"" %(varname) ) return "" def IsNew(self, varname): for var in self.vars: #print_debug("IsNew() searching in var %s" %var) if var[0] == varname and len(var) == 3 and var[2] == "new": return True print_debug("IsNew() self.vars=%s"%self.vars) print_debug("IsNew() var %s not found in self.vars"%varname) return False if __name__ == '__main__': conf = TcosConf(None) conf.SetVar("xmlrpc_username", "user2") print_debug ( conf.vars ) conf.SaveToFile() tcosmonitor/tcosmonitor/TcosStaticHosts.py0000664000000000000000000002420212260544373016367 0ustar # -*- coding: UTF-8 -*- # TcosMonitor version __VERSION__ # # Copyright (c) 2006-2011 Mario Izquierdo # # This package is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # # This package is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. import sys import gtk from gettext import gettext as _ import tcosmonitor.shared from time import time COL_IP, COL_MAC= range(2) # constant to font sizes PANGO_SCALE=1024 def print_debug(txt): if tcosmonitor.shared.debug: print >> sys.stderr, "%s::%s" % (__name__, txt) #print("%s::%s" % (__name__, txt), file=sys.stderr) def crono(start, txt): print_debug ("crono(), %s get %f seconds" %(txt, (time() - start)) ) return class TcosStaticHosts: def __init__(self, main): print_debug ("__init__ starting") self.selected_ip=None self.selected_mac=None self.mode="add" self.data=[] self.main=main self.ui=self.main.ui self.model=gtk.ListStore(str, str) self.ui = gtk.Builder() self.ui.set_translation_domain(tcosmonitor.shared.PACKAGE) self.ui.add_from_file(tcosmonitor.shared.GLADE_DIR + 'tcosmonitor-staticwindow.ui') self.main.staticwindow=self.ui.get_object('staticwindow') self.main.staticwindow.connect('delete-event', self.staticwindow_close ) self.ui.add_from_file(tcosmonitor.shared.GLADE_DIR + 'tcosmonitor-staticwindownew.ui') self.ui.set_translation_domain(tcosmonitor.shared.PACKAGE) self.main.staticwindownew=self.ui.get_object('staticwindownew') self.main.staticwindownew.connect('delete-event', self.staticwindownew_close ) self.init_statichostlist() self.main.static_button_cancel=self.ui.get_object('button_static_cancel') self.main.static_button_cancel.connect('clicked', self.staticwindow_close) self.main.static_button_save=self.ui.get_object('button_static_save') self.main.static_button_save.connect('clicked', self.staticwindow_save) self.main.static_button_add=self.ui.get_object('button_static_add') self.main.static_button_add.connect('clicked', self.static_add) self.main.static_button_modify=self.ui.get_object('button_static_modify') self.main.static_button_modify.connect('clicked', self.static_modify) self.main.static_button_delete=self.ui.get_object('button_static_delete') self.main.static_button_delete.connect('clicked', self.static_delete) self.main.static_button_get=self.ui.get_object('button_static_get') self.main.static_button_get.connect('clicked', self.static_get) # static_line buttons self.main.static_button_line_cancel=self.ui.get_object('button_static_line_cancel') self.main.static_button_line_cancel.connect('clicked', self.staticwindownew_close) self.main.static_button_line_save=self.ui.get_object('button_static_line_save') self.main.static_button_line_save.connect('clicked', self.on_static_new) # new line self.main.static_new_ip=self.ui.get_object('static_new_ip') self.main.static_new_mac=self.ui.get_object('static_new_mac') self.control_buttons(False) self.init_data(self.main.config.GetVar("statichosts")) def init_data(self, txt): if txt == "": return tmp=txt.split("#") for host in tmp: self.data.append(host.split("|")) #remove last empty element self.data=self.data[:-1] print_debug("init_data() self.data=%s" %self.data) self.populate_data(self.data) def populate_data(self, data): for host in data: self.new_line=True model=self.main.staticlist.get_model() model.foreach(self.line_exists, host) if self.new_line: print_debug("populate_data() adding ip=%s" %host[0]) self.iter = self.model.append (None) self.model.set_value (self.iter, COL_IP, host[0] ) self.model.set_value (self.iter, COL_MAC, host[1] ) def line_exists(self, model, path, iter, args): ip, mac = args # change mac if ip is the same. if model.get_value(iter, 0) == ip: model.set_value(iter, 1, mac) self.new_line=False def staticwindow_close(self, *args): self.main.staticwindow.hide() return True def staticwindownew_close(self, *args): self.main.staticwindownew.hide() return True def init_statichostlist(self): print_debug ( "init_statichostlist()" ) self.main.staticlist = self.ui.get_object('staticlist') self.main.staticlist.set_model (self.model) cell1 = gtk.CellRendererText () column1 = gtk.TreeViewColumn (_("IP address"), cell1, text = COL_IP) column1.set_resizable (True) column1.set_sort_column_id(COL_IP) self.main.staticlist.append_column (column1) cell2 = gtk.CellRendererText () column2 = gtk.TreeViewColumn (_("MAC address"), cell2, text = COL_MAC) column2.set_resizable (True) column2.set_sort_column_id(COL_MAC) self.main.staticlist.append_column (column2) self.table_file = self.main.staticlist.get_selection() self.table_file.connect("changed", self.on_static_list_change) return def show_static(self): self.main.staticwindow.show() def on_static_list_change (self, data): (model, iter) = self.main.staticlist.get_selection().get_selected() if not iter: self.control_buttons(False) return self.selected_ip=model.get_value(iter,0) self.selected_mac=model.get_value(iter, 1) print_debug("selected_ip=%s selected_mac=%s" %(self.selected_ip, self.selected_mac)) self.control_buttons(True) def control_buttons(self, seteditable): if seteditable: self.main.static_button_modify.set_sensitive(True) self.main.static_button_delete.set_sensitive(True) else: self.main.static_button_modify.set_sensitive(False) self.main.static_button_delete.set_sensitive(False) def static_add(self, widget): self.mode="add" self.main.static_new_ip.set_sensitive(True) self.main.staticwindownew.show() def on_static_new(self, widget): print_debug("on_static_new()") # read ip and mac address ip=self.main.static_new_ip.get_text() mac=self.main.static_new_mac.get_text() if self.mode == "add": # put into treeview self.iter = self.model.append (None) self.model.set_value (self.iter, COL_IP, ip ) self.model.set_value (self.iter, COL_MAC, mac ) if self.mode == "edit": model=self.main.staticlist.get_model() model.foreach(self.line_changer, [ip, mac]) self.main.static_new_ip.set_text("") self.main.static_new_mac.set_text("") self.staticwindownew_close() def line_changer(self, model, path, iter, args): ip, mac = args # change mac if ip is the same. if model.get_value(iter, 0) == ip: model.set_value(iter, 1, mac) def static_modify(self, widget): print_debug("on_static_modify()") self.mode="edit" self.main.static_new_ip.set_sensitive(False) # read ip and mac address self.main.static_new_ip.set_text(self.selected_ip) self.main.static_new_mac.set_text(self.selected_mac) self.main.staticwindownew.show() def static_delete(self, widget): print_debug("static_delete()") (model, iter) = self.main.staticlist.get_selection().get_selected() if iter: model.remove(iter) def line_saver(self, model, path, iter, args): ip=model.get_value(iter, 0) mac=model.get_value(iter,1) self.data.append([ip, mac]) def staticwindow_save(self, widget): print_debug("staticwindow_save()") # save in conf file self.main.preferences.SaveSettings() self.staticwindow_close() def get_static_conf(self): # get items in treeview self.data=[] model=self.main.staticlist.get_model() model.foreach(self.line_saver, [self.data]) print_debug("get_static_conf() data=%s" %self.data) # convert in text format txt="" for host in self.data: # host separated with # and ip mac separated with | txt+="%s|%s#" %(host[0], host[1]) print_debug("get_static_conf() txt=%s" %txt) return txt def static_get(self, widget): print_debug ("static_get()") if len(self.main.localdata.allclients) < 1: # exit if no hosts tcosmonitor.shared.error_msg ( _("No hosts found, please click on Refresh button using another method.") ) return print_debug ("static_get() allclients=%s"%self.main.localdata.allclients) self.data=[] # scan hosts and get MAC address for host in self.main.localdata.allclients: if not self.main.xmlrpc.newhost(host): continue mac=self.main.xmlrpc.ReadInfo("network_mac") if not mac: mac = "" self.data.append([host, mac]) print_debug("static_get() data=%s"%self.data) self.populate_data(self.data) tcosmonitor/tcosmonitor/LocalData.py0000664000000000000000000007507412260544373015127 0ustar # -*- coding: UTF-8 -*- # TcosMonitor version __VERSION__ # # Copyright (c) 2006-2011 Mario Izquierdo # # This package is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # # This package is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. import tcosmonitor.shared import os import sys from gettext import gettext as _ from time import time from tcosmonitor.ping import Ping import utmp from UTMPCONST import WTMP_FILE, USER_PROCESS import pwd, grp import socket COL_HOST, COL_IP, COL_USERNAME, COL_ACTIVE, COL_LOGGED, COL_BLOCKED, COL_PROCESS, COL_TIME = range(8) unknow=_("unknow") def print_debug(txt): if tcosmonitor.shared.debug: print >> sys.stderr, "%s::%s" % (__name__, txt) #print("%s::%s" % (__name__, txt), file=sys.stderr) def crono(start, txt): print_debug ("crono(), %s get %f seconds" %(txt, (time() - start)) ) return class LocalData: def __init__(self, main): print_debug ( "__init__()" ) self.main=main self.allclients=None self.allclients=[] self.dhostname=_("unknow") self.hostname=None self.username=None self.ip=None self.active=None self.logged=None self.blocked=None self.num_process=None self.time_login=None self.allhostdata=[] self.arptable=[] if self.main: self.cache_timeout=self.main.config.GetVar("cache_timeout") def newhost(self, host): print_debug ( "newhost(%s)" %(host) ) self.hostname=None self.ip=host self.username=None self.active=None self.logged=None self.blocked=None self.num_process=None self.time_login=None def cache(self, ip, num): """ cache array is like this: self.allhostdata [ ip, hostname, username, numprocess() , timelogged() , isLogged(bool), time() ] 0 1 2 3 4 5 6 """ #print_debug ( "cache(ip=\"%s\" [ %s ])" %(ip, num) ) for i in range(len(self.allhostdata)): if self.allhostdata[i][0] == ip: #print_debug ( "cache() %s cached from %s secs" %(ip, float(time() - self.allhostdata[i][6])) ) if time() - self.allhostdata[i][6] < self.cache_timeout: #print_debug ( "cache() IS CACHED" ) #print_debug ( "cache() %s" %(self.allhostdata[i]) ) return self.allhostdata[i][num] else: #clean cache #print_debug ( "cache() DELETE OLD CACHE" ) #print_debug ( self.allhostdata ) self.allhostdata.pop(i) print_debug ( self.allhostdata ) return None #print_debug ( "\n%s\n" %(self.allhostdata) ) return None def add_to_cache(self, ip, num, value): print_debug ( "add_to_cache(\"%s\", \"%s\", \"%s\")" %(ip, num, value) ) if self.cache(ip, num) != None: #print_debug ( "add_to_cache() already cached" ) return new=True for host in self.allhostdata: if host[0] == ip: new=False if new: self.allhostdata.append( [ip, None, None, None, None, None, time() ] ) for i in range(len(self.allhostdata)): if self.allhostdata[i][0] == ip: if self.allhostdata[i][num] == value: if time() - self.allhostdata[i][6] < self.cache_timeout: print_debug ( "cached at %s secs" %(float(time() - self.allhostdata[i][6])) ) return # save value in num pos #print_debug ( "add_to_cache(%s)[%d]=%s EDIT HOST" %(ip, num, value) ) self.allhostdata[i][num]=value self.allhostdata[i][6]=time() #print_debug ( self.allhostdata ) def get_username(self): return pwd.getpwuid(os.getuid())[0] def get_userid(self): return os.getuid() def user_in_group(self, user=None, group=None): print_debug("in group tcos: %s"%(self.main.ingroup_tcos)) if self.main.ingroup_tcos: return self.main.ingroup_tcos if not user: user=self.get_username() sgroups=grp.getgrall() if user == "root": return True for (sgroup, spass, sid, susers) in sgroups: if sgroup == group and user in susers: print_debug("user %s is in group %s"%(user, sgroup)) return True return False def sorted_copy(self, alist): # inspired by Alex Martelli # http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/52234 indices = map(self._generate_index, alist) decorated = zip(indices, alist) decorated.sort() return [ item for index, item in decorated ] def _generate_index(self, txt): """ Splits a string into alpha and numeric elements, which is used as an index for sorting" """ # # the index is built progressively # using the _append function # index = [] def _append(fragment, alist=index): if fragment.isdigit(): fragment = int(fragment) alist.append(fragment) # initialize loop prev_isdigit = txt[0].isdigit() current_fragment = '' # group a string into digit and non-digit parts for char in txt: curr_isdigit = char.isdigit() if curr_isdigit == prev_isdigit: current_fragment += char else: _append(current_fragment) current_fragment = char prev_isdigit = curr_isdigit _append(current_fragment) return tuple(index) def GetAllClients(self, method): """ Read active connections at 6000 local port OTHER BEST METHOD??? "who" ??? read netstat -putan|grep 6000|awk '{print $5}'| awk -F ":" '{print $2}| sort|uniq' """ if method == "nmap": self.allclients=[] interface=self.main.config.GetVar("network_interface") print_debug ( "GetAllClients() using method \"nmap\" in interface %s" %(interface) ) ping=Ping(self.main) ss=ping.get_net_address(interface) if ss == None: self.main.write_into_statusbar( \ _("Selected network inteface (%s) don't have IP address" ) %(interface) ) return [] print_debug ( "GetAllClients() method=nmap starting worker without dog iface=%s ip=%s" %(interface, ss) ) self.main.worker=tcosmonitor.shared.Workers(self.main, ping.ping_iprange_nmap, [ss], dog=False ) self.main.worker.start() return [] elif method == "ping": self.allclients=[] interface=self.main.config.GetVar("network_interface") print_debug ( "GetAllClients() using method \"ping\" in interface %s" %(interface) ) ping=Ping(self.main) ss=ping.get_ip_address(interface) if ss == None: self.main.write_into_statusbar( \ _("Selected network inteface (%s) don't have IP address" ) %(interface) ) return [] print_debug ( "GetAllClients() method=ping starting worker without dog iface=%s ip=%s" %(interface, ss) ) self.main.worker=tcosmonitor.shared.Workers(self.main, ping.ping_iprange, [ss], dog=False ) self.main.worker.start() return [] elif method == "netstat": print_debug ( "GetAllClients() using method \"netstat\" in port 600[0-9]" ) start=time() self.allclients=[] self.hostname=None #read this command output cmd="LC_ALL=C LC_MESSAGES=C netstat -putan 2>/dev/null | grep \":600[0-9] \"| grep ESTABLISHED | awk '{print $5}'" output=self.main.common.exe_cmd(cmd) #avoid to have a spimple string if isinstance(output, str): output=[output] for xhost in output: host=xhost.split(':', 1)[0] if host != "" and host != "0.0.0.0": if host not in self.allclients: #print(host) self.allclients.append(host) # sort list self.allclients.sort() # sort numeric self.allclients = self.sorted_copy(self.allclients) # check for notshowwhentcosmonitor if self.main.config.GetVar("notshowwhentcosmonitor") == 1: # if $DISPLAY = xx.xx.xx.xx:0 remove from allclients try: if str(tcosmonitor.shared.parseIPAddress(os.environ["DISPLAY"])) != '': # running tcosmonitor on thin client i=str(tcosmonitor.shared.parseIPAddress(os.environ["DISPLAY"])) self.allclients.pop(i) except Exception, err: print_debug("GetAllClients() can't read DISPLAY, %s"%err) # onlys show host running tcosxmlrpc in 8998 or 8999 port if self.main.config.GetVar("onlyshowtcos") == 1: if hasattr(self.main, "write_into_statusbar"): self.main.write_into_statusbar( _("Testing if found clients have 8998 or 8999 port open...") ) hosts=[] for host in self.allclients: # view status of port 8998 or 8999 if self.main.xmlrpc.newhost(host): if self.main.xmlrpc.GetVersion(): print_debug("GetAllClients() host=%s ports 8998 or 8999 OPEN" %(host)) hosts.append(host) else: print_debug("GetAllClients() host=%s ports 8998 or 8999 OPEN but not tcosxmlrpc" %(host)) else: print_debug("GetAllClients() host=%s ports 8998 or 8999 CLOSED" %(host)) #hosts.append(host) self.allclients=hosts print_debug ( "GetAllClients() Host connected=%s" %(self.allclients) ) crono(start, "GetAllClients()") return self.allclients elif method == "consolekit": print_debug ( "GetAllClients() using method \"consolekit\"" ) self.allclients=[] from tcosmonitor.Sessions import Connections conobj=Connections() for conn in conobj.connections: if not conn['is_local']: self.allclients.append(conn['remote_host_name']) return self.allclients elif method == "avahi": print_debug ( "GetAllClients() using method \"avahi\"" ) self.allclients=[] if not hasattr(self.main, 'avahi'): from tcosmonitor.Avahi import AvahiDiscover self.main.avahi=AvahiDiscover( ['_workstation._tcp'] , 'tcos') self.main.avahi.callback=self.main.actions.populate_host_list return self.main.avahi.get_all_ips() else: self.allclients=[] if len(self.main.static.data) < 1: tcosmonitor.shared.error_msg( _("Static list method configured but no hosts in list.\n\nPlease, open preferences, click on 'Open Static Host list' and add some hosts.") ) return self.allclients ping=Ping(self.main) for host in self.main.static.data: # we have a single ip or range of ips?? ip=host[0] if ip.find("-") != -1: base=ip.split(".") minip=int(base[3].split("-")[0]) maxip=int(base[3].split("-")[1]) if minip < maxip: for i in range(minip, maxip): newip=".".join(base[0:3]) + ".%s" %(i) self.allclients.append(newip) else: for i in range(maxip, minip): newip=".".join(base[0:3]) + ".%s" %(i) self.allclients.append(newip) else: self.allclients.append(ip) self.main.worker=tcosmonitor.shared.Workers(self.main, ping.ping_iprange_static, [self.allclients], dog=False ) self.main.worker.start() return [] def ipValid(self, ip): # ip is XXX.XXX.XXX.XXX # http://mail.python.org/pipermail/python-list/2006-March/333963.html try: xip=ip.split('.') if len(xip) != 4: #print_debug ( "ipValid() len != 4" ) return False for block in xip: if int(block) < 0 or int(block) >= 255: print_debug ( "ipValid() block < 0 or >= 255 %s" %(block) ) return False return True except Exception, err: print_debug("ipValid() Exception, error=%s"%err) return False def GetIpAddress(self, hostname): try: return socket.getaddrinfo(hostname, None)[0][4][0] except Exception, err: print_debug("GetIpAddress() Exception, error=%s"%err) return None def GetHostname(self, ip): """ Try to resolve ip to hostname first read /etc/hosts second search into dhcpd.conf """ print_debug("GetHostname() ip=%s" %(ip)) ######## cache( ip, 1=hostname) cached=self.cache(ip, 1) if cached != None: print_debug("GetHostname() return cached DATA '%s'"%cached) return cached start=time() #if self.hostname != None: # return self.hostname self.hostname=unknow # use python-dns module to search for reverse DNS self.hostname=self.main.common.revlookup(ip) if self.hostname != unknow: self.add_to_cache( ip, 1 , self.hostname ) return self.hostname ######## new method ######### old_timeout=socket.getdefaulttimeout() try: socket.setdefaulttimeout(2) self.hostname = socket.gethostbyaddr(ip)[0] self.add_to_cache( ip, 1 , self.hostname ) socket.setdefaulttimeout(old_timeout) return self.hostname except Exception, err: print_debug("GetHostname() Exception, error=%s"%err) socket.setdefaulttimeout(old_timeout) #read hostname from /etc/hosts fd=file("/etc/hosts", 'r') allfile=fd.read() allfile=allfile.split('\n') fd.close() print_debug ( "GetHostname() searching ip=%s" %(ip) ) for line in allfile: if line.find('#')==0: continue if line.find(' ')==0: continue if len(line) == 0: continue # split cuts with '\t' or ' ' xline=line.split() #print_debug ( "xline=%s" %(xline) ) if self.ipValid(xline[0]): if xline[0]==ip and len(xline) == 2: self.hostname = xline[1] self.add_to_cache( ip, 1 , self.hostname ) return self.hostname print_debug ( "GetHostname() search in /etc/hosts no results, try DHCP leases """ ) #search in dhcpd.conf if /etc/dhcp3/dhcpd.conf exists if not os.path.isfile("/etc/dhcp3/dhcpd.conf"): print_debug ( "GetHostname() /etc/dhcp3/dhcpd.conf not found" ) crono(start, "GetHostname()") # save into cache self.add_to_cache( ip, 1 , self.hostname ) return self.hostname else: cmd="grep -A 3 -B 3 \"fixed.*%s;\" /etc/dhcp3/dhcpd.conf|grep -v \"^#\"|grep host|awk '{print $2}'" %(ip) print_debug ( "GetHostname(%s) cmd=\"%s\"" %(ip, cmd) ) stdout = self.main.common.exe_cmd(cmd, verbose=0, background=False, lines=1) output = stdout.readlines() if len(output) > 1: print_debug ( "GetHostname() DHCP have many leases=%s" %(output) ) crono(start, "GetHostname()") # save into cache self.add_to_cache( ip, 1 , self.hostname ) return self.hostname elif len(output) == 0: print_debug ( "GetHostname() DHCP not found enter" ) crono(start, "GetHostname()") # save into cache self.add_to_cache( ip, 1 , self.hostname ) return self.hostname else: for lease in output: self.hostname=lease.replace('\n', '') print_debug ( "GetHostname() found DHCP hostname=%s for ip=%s" %(self.hostname, ip) ) crono(start, "GetHostname()") # save into cache self.add_to_cache( ip, 1 , self.hostname ) return self.hostname crono(start, "GetHostname()") # save into cache self.add_to_cache( ip, 1 , self.hostname ) return self.hostname def GetUsernameAndHost(self, ip): print_debug("GetUsernameAndHost() => get username and host") if self.username != None and self.username != tcosmonitor.shared.NO_LOGIN_MSG: username=self.username else: username=self.GetUsername(ip) if self.main.xmlrpc.IsStandalone(ip=ip): return "%s:%s" % (username, ip) else: return username def isLastExclude(self, username, ingroup=None): print_debug("isExclude() username=%s ingroup=%s "%(username, ingroup) ) exclude="noexclude" if ingroup != None: try: cmd="groups %s 2>/dev/null" %username usersingroup=[] usersingroup=self.main.common.exe_cmd(cmd).split() #usersingroup=grp.getgrnam(ingroup)[3] except Exception, err: usersingroup=[] print_debug("usersingroup: %s" %usersingroup) for group in usersingroup: if ingroup == group: exclude="exclude" return exclude def GetLast(self, ip, ingroup=None): start=time() last=None data={} if ip != "" and not self.ipValid(ip): ip=self.GetIpAddress(ip) hostname=self.GetHostname(ip) print_debug("GetLast() ip=%s hostname=%s "%(ip, hostname) ) if self.main.config.GetVar("consolekit") == 1: # try to connect with GDM througth dbus to read all # sessions & display info, better than read wtmp if os.path.isfile("/etc/dbus-1/system.d/gdm.conf"): from tcosmonitor.Sessions import Sessions app=Sessions() for session in app.sessions: if session.remote_host_name == ip: print_debug("GetLast() session=%s"%session) crono(start, "GetLast()") data= {"pid":0, "user":session.user, "host":tcosmonitor.shared.parseIPAddress(session.remote_host_name), "time":session.since, "timelogged":session.diff, "exclude":self.isLastExclude(session.user, ingroup)} return data for i in range(10): last_file=WTMP_FILE if i != 0: last_file=WTMP_FILE+".%d" %i if os.path.isfile(last_file): print_debug("GetLast() Searching in %s" %last_file) a = utmp.UtmpRecord(last_file) while 1: b = a.getutent() if not b: break if b[0] == USER_PROCESS: uthost=str(tcosmonitor.shared.parseIPAddress(b.ut_host)) utline=str(tcosmonitor.shared.parseIPAddress(b.ut_line)) half1="%s" %(uthost[:(len(uthost)/2)]) half2="%s" %(uthost[(len(uthost)/2):]) if half1 == half2 and str(tcosmonitor.shared.parseIPAddress(half1)) == utline: b.ut_host = half1 else: b.ut_host = uthost #print_debug(" ==> '%s' != '%s' ut_line=%s" %(uthost, ip, b.ut_line) ) if uthost == ip or uthost == hostname: if b.ut_line.startswith("pts/") or not \ os.path.isdir("/proc/%s"%b.ut_pid): continue print_debug(" Ip \"%s:0\" => found host=%s hostname=%s ut_line=%s user=%s pid=%s" % \ (ip, hostname, b.ut_host, b.ut_line, b.ut_user, b.ut_pid)) last=b a.endutent() if last and os.path.isdir("/proc/%s"%last.ut_pid): break if last and os.path.isdir("/proc/%s"%last.ut_pid): # take diff between now and login time diff=time()-last.ut_tv[0] # get days and set diff to rest days=int(diff/(3600*24)) diff=diff-days*3600*24 # get hours and set diff to rest hours=int(diff/3600) diff=diff-hours*3600 # get minutes and set seconds to rest minutes=int(diff/60) seconds=int(diff-minutes*60) print_debug ("GetLast() days=%s hours=%s minutes=%s seconds=%s"%(days, hours, minutes, diff)) # only print days if > 0 if days == 0: timelogged="%02dh:%02dm"%(hours,minutes) else: timelogged="%dd %02dh:%02dm"%(days,hours,minutes) exclude=self.isLastExclude(last.ut_user, ingroup) data={"pid":last.ut_pid, "user":last.ut_user, "host":last.ut_host.split(":")[0], "time":last.ut_tv[0], "timelogged":timelogged, "exclude":exclude} print_debug("GetLast() data=%s"%data) crono(start, "GetLast()") return data def GetUsername(self, ip): """ read username """ ######## cache( ip, 1=hostname) # FIXME esto falla mas que una escopeta de feria #cached=self.cache(ip, 2) #if cached != None: # print_debug ( "GetUsername() RETURNING CACHE DATA" ) # return cached #if self.username != None: # return self.username self.username=tcosmonitor.shared.NO_LOGIN_MSG if self.main.xmlrpc.IsStandalone(ip=ip): print_debug("GetUsername(%s) standalone" %ip) self.username=self.main.xmlrpc.GetStandalone("get_user") return self.username print_debug("GetUsername(%s) NO standalone" %ip) if not self.IsActive(ip): print_debug ( "GetUsername(%s) not active, returning NO_LOGIN_MSG" %(ip) ) return tcosmonitor.shared.NO_LOGIN_MSG output=self.GetLast(ip) if output and output['user']: self.username=output['user'] self.add_to_cache( ip, 2 , self.username ) return self.username print_debug ( "GetUsername() fail to search username, return unknow" ) self.add_to_cache( ip, 2 , self.username ) return self.username def IsActive(self, host): """ return True or False if host is active use xmlrpc echo """ #print_debug ( "IsActive(%s) = %s " %(host, self.main.xmlrpc.GetVersion()) ) if not self.main.xmlrpc.newhost(host): return False if self.main.xmlrpc.GetVersion() != None: print_debug ( "IsActive(%s)=True" %(host) ) return True else: print_debug ( "IsActive(%s)=False" %(host) ) return False def IsLogged(self, host): """ return True if is logged """ if not self.main.xmlrpc.newhost(host): return False print_debug("IsLogged() => Username=%s" %self.username) if self.username == None: self.GetUsername(host) if self.username == tcosmonitor.shared.NO_LOGIN_MSG or self.username == None: return False elif self.username != None and self.username != tcosmonitor.shared.NO_LOGIN_MSG: return True def IsBlocked(self, host): """ return if lockscreen is exec """ if not self.main.xmlrpc.newhost(host): return False status=self.main.xmlrpc.status_lockscreen() if status == 1: print_debug("IsBlocked(ip=%s) TRUE status=%s"%(host, status)) return True else: print_debug("IsBlocked(ip=%s) FALSE status=%s"%(host, status)) return False def IsBlockedNet(self, host, username=None): if not self.main.xmlrpc.newhost(host): return False if username != None and username != tcosmonitor.shared.NO_LOGIN_MSG: username=username elif self.IsLogged(host): username=self.username else: return False if self.main.xmlrpc.IsStandalone(host): if self.main.xmlrpc.tnc("status", username) == "disabled": return True else: return False cmd="/usr/lib/tcos/tnc status %s"%(username) output=self.main.common.exe_cmd(cmd) if output == "disabled": return True elif output == "enabled": return False elif output == "denied": print_debug("You don't have permission to execute tcos-net controller /usr/lib/tcos/tnc") return False return False def BlockNet(self, action, username, ports=None, iface=None): print_debug("BlockNet() action=%s username=%s ports=%s iface=%s only-ports=%s" % \ (action, username, ports, iface, tcosmonitor.shared.tnc_only_ports)) if ports == None: ports="" if iface == None: iface="" cmd="/usr/lib/tcos/tnc %s --only-ports=%s %s %s %s" % \ (action, tcosmonitor.shared.tnc_only_ports, ports, iface, username) output=self.main.common.exe_cmd(cmd) print_debug("output=%s"%output) return output def Route(self, action, ip, netmask, iface): print_debug("Route() action=%s multicast=%s netmask=%s iface=%s" % \ (action, ip, netmask, iface)) cmd="/usr/lib/tcos/tnc %s %s %s %s"%(action, ip, netmask, iface) output=self.main.common.exe_cmd(cmd) print_debug("output=%s"%output) return output def isExclude(self, host, ingroup=None): if self.username == None or self.username == tcosmonitor.shared.NO_LOGIN_MSG: return False output=self.GetLast(host, ingroup) if output and output['exclude'] == "exclude": return True return False def GetUserID(self, username): try: uid=pwd.getpwnam(username)[2] except Exception, err: uid=None print_debug("GetUserID Exception error %s"%err) return uid def GetNumProcess(self, host): """ return number of process """ if not self.main.xmlrpc.newhost(host): return False #self.username=self.GetUsername(host) if self.username == None or self.username == tcosmonitor.shared.NO_LOGIN_MSG: return "---" if self.main.xmlrpc.IsStandalone(host): return self.main.xmlrpc.GetStandalone("get_process") # use uid to support long usernames (>8) uid=self.GetUserID(self.username) cmd="ps U %s -o pid | sed 's/[[:blank:]]//g' | grep -c ^[0-9]"%(uid) process=self.main.common.exe_cmd(cmd) print_debug ("GetNumProcess() process=%s" %(process) ) return process def GetTimeLogged(self, host): if not self.main.xmlrpc.newhost(host): return False if self.username == tcosmonitor.shared.NO_LOGIN_MSG or self.username == None: return "---" output=self.GetLast(host) if output and output['timelogged']: return output['timelogged'] # no time return "---" def get_arptable(self): """ Get a list of dictionaries with IP address MAC and iface """ data=[] names=['IP address', 'HW type', 'Flags', 'HW address', 'Mask', 'Device'] f=open("/proc/net/arp", 'r') for l in f.readlines(): if l.startswith("IP address"): continue tmp=l.strip().split() data.append({'ip':tmp[0], 'mac':tmp[3], 'iface':tmp[5]}) f.close() self.arptable=data return data if __name__ == '__main__': tcosmonitor.shared.debug=True local=LocalData (None) #import sys #print local.GetLast(sys.argv[1]) #local.GetAllClients() #local.GetHostname("192.168.0.2") #local.GetHostname("192.168.0.10") #local.GetUsername("192.168.0.10") #local.GetTimeLogged("192.168.0.10") print local.get_arptable() tcosmonitor/tcosmonitor/TcosDBus.py0000664000000000000000000004441112260544373014760 0ustar # -*- coding: UTF-8 -*- # TcosMonitor version __VERSION__ # # Copyright (c) 2006-2011 Mario Izquierdo # # This package is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # # This package is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # dbus classes for tcosmonitor import dbus import dbus.service import dbus.glib import gobject import os import signal import subprocess, threading import pwd import sys from gettext import gettext as _ import pynotify from time import sleep # needed for __escape__ function import xml.sax.saxutils import tcosmonitor.shared def print_debug(txt): if tcosmonitor.shared.debug: print >> sys.stderr, "%s::%s" % (__name__, txt) #print("%s::%s" % (__name__, txt), file=sys.stderr) class TcosDBusServer: def __init__(self): self.username = pwd.getpwuid(os.getuid())[0] self.admin=None self.passwd=None self.error_msg=None print_debug ( "TcosDBusServer() __init__ as username=%s" %(self.username) ) print_debug ( "TcosDBusServer() admin='%s' passwd='*****'" %(self.admin) ) self.__dic__= { '\"' : '"', '\'' : ''' } import tcosmonitor.TcosCommon self.common=tcosmonitor.TcosCommon.TcosCommon(self) self.host=self.common.get_display(ip_mode=True) # in Ubuntu with NetworkManager probably don't have IP now, make a wait loop if self.host is None: while not self.host: print "TcosDBusServer: No IP found (%s) waiting..." % (self.host) sleep(3) self.host=self.common.get_display(ip_mode=True) # If here IP found get hostname self.hostname=self.common.get_display(ip_mode=False) self.bus = dbus.SystemBus() def auth(self): #print_debug ( "self.admin=%s self.passwd=%s" %(self.admin, self.passwd) ) if not self.admin or not self.passwd: print_debug ( "Need admin and passwd data to do this action" ) return False if self.host == "" and not tcosmonitor.shared.allow_local_display: self.error_msg=_("TcosDBus not allowed in local display") print_debug ( "auth() not allowed in local display" ) return False import tcosmonitor.ping # for standalone use local ip as self.host if tcosmonitor.shared.allow_local_display: p=tcosmonitor.ping.Ping(None) ips=p.get_server_ips() if len(ips) < 1: print "tcos-dbus-client **WARNING** Can't get IP adrress, trying with hostname" else: if len(ips) > 1: print "tcos-dbus-client **WARNING** This host have more than one IP: %s using first: %s" % (ips, ips[0]) self.host=ips[0] # is self.host is empty try with hostname if self.host == "": import socket self.host=socket.gethostname() # check if tcosxmlrpc is running status=tcosmonitor.ping.PingPort(self.host, tcosmonitor.shared.xmlremote_port).get_status() print_debug ( "isPortListening() status=%s" %(status) ) if status == "CLOSED" or status == "ERROR": print_debug ( "auth() seems that tcosxmlrpc isn't running on host=\"%s\"" %(self.host) ) self.error_msg=_("Seems that tcosxmlrpc isn't running on host=\"%s\"" %(self.host) ) return False else: print_debug ("auth() status=%s" %(status)) # check tcosxmlrpc username and pass if not self.connect_tcosxmlrpc(self.host): print_debug ( "auth() tcosxmlrpc says access denied" ) return False # if here grant access return True def connect_tcosxmlrpc(self, host): self.url = 'http://%s:%d/RPC2' % (host, tcosmonitor.shared.xmlremote_port) print_debug ( "connect_tcosxmlrpc() url=%s" %(self.url) ) try: import xmlrpclib self.tc = xmlrpclib.Server(self.url) print_debug ( "connect_tcosxmlrpc() tcosxmlrpc running on %s" %(host) ) except Exception, err: self.error_msg=_("tcosxmlrpc ERROR conection unavalaible." ) print_debug("connect_tcosxmlrpc() ERROR conection unavalaible !!!, error=%s"%err) return False cmd= "uname" # try to exec something print_debug("connect_tcosxmlrpc() try to exec \"%s\" " %(cmd) ) try: result=self.tc.tcos.exe(cmd, self.admin, self.passwd) except Exception, err: print_debug("connect_tcosxmlrpc() cmd error=%s"%err) if result == cmd: print_debug ( "connect_tcosxmlrpc() cmd run OK." ) return True else: self.error_msg=_("ERROR conecting to tcosxmlrpc, check username and password." ) print_debug ( "error connecting: %s" %(result) ) return False def send_error_msg(self): #FIXME, how to return error message with dbus??? pass def parse_dbus_str(self, data): #print_debug( "parse_dbus_str() data=%s type=%s" %(data, type(data)) ) if isinstance(data, dbus.String): return str(data) return(data) def get_desktop_path(self): print_debug ( "get_desktop_path()") cmd="/usr/lib/tcos/get-xdg-desktop" try: p = subprocess.Popen(cmd, shell=True, bufsize=0, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, close_fds=True) except Exception, e: print_debug("Exception in subprocess cmd(%s), error='%s'"%(cmd, e)) return None desktop=None try: result=p.stdout.readlines() for line in result: if line != '\n': desktop=line.replace('\n', '') except Exception, e: print_debug("Exception in subprocess::readlines() cmd(%s), error='%s'"%(cmd, e)) return None if not os.path.isdir(desktop): desktop=os.path.expanduser("~/Desktop") return desktop def new_message(self, message): print_debug ( "new_message() %s" %(message) ) self.admin = self.parse_dbus_str(message[0][0]) self.passwd = self.parse_dbus_str(message[0][1]) if not self.auth(): self.send_error_msg() return for user in message[1]: print_debug ("new_message() loop users => user=%s" %(user) ) if user == self.username: msg_type=self.parse_dbus_str(message[2][0]) print_debug ( "new_message() Ummm one message for me!!" ) if msg_type == "sendfiles": tmp=[] print_debug(message[3]) if " " in message[3][0]: # standalone # dbus.Array([dbus.String(u'Teacher 192.168.0.254 True')], signature=...) tmp=self.parse_dbus_str(message[3][0]).split() else: # thin client # dbus.Array([dbus.String(u'Teacher'), dbus.String(u'192.168.0.254'), dbus.String(u'True')], signature=...) tmp=message[3] msg_arg_1=self.parse_dbus_str(tmp[0]) msg_arg_2=self.parse_dbus_str(tmp[1]) msg_arg_3=self.parse_dbus_str(tmp[2]) print_debug ( "new_message() type=%s arg_1=%s arg_2=%s arg_3=%s" %(msg_type, msg_arg_1, msg_arg_2, msg_arg_3) ) else: msg_args=self.parse_dbus_str(message[3][0]) print_debug ( "new_message() type=%s args=%s" %(msg_type, msg_args) ) if msg_type == "kill": pid=int(msg_args) self.user_kill(pid) if msg_type == "killall": self.user_killall(msg_args) elif msg_type == "exec": self.user_exec(msg_args) elif msg_type == "mess": self.user_msg(msg_args) elif msg_type == "sendfiles": self.user_sendfiles(msg_arg_1, msg_arg_2, msg_arg_3) else: print_debug ( "new_message() ERROR, unknow type of message=\"%s\"" %(msg_type) ) print_debug ( "new_message() finish !!!" ) def cleanproc(self, proc): try: os.waitpid(proc.pid, os.WCONTINUED) except os.error, err: print_debug("OSError exception: %s" %err) def user_kill(self, pid): print_debug ( "user_kill() %s" %(pid) ) pid=int(pid) try: os.kill(pid, signal.SIGKILL) except Exception, err: print_debug ( "user_kill() error, pid not found %d, error=%s" %(pid, err) ) return def user_killall(self, app): print_debug ( "user_killall() %s" %(app) ) p = subprocess.Popen("killall -s KILL %s" %(app), shell=True, close_fds=True) try: th=threading.Thread(target=self.cleanproc, args=(p,) ) #th.setDaemon(1) th.start() print_debug("Threads count: %s" %threading.activeCount()) except Exception, err: print_debug ( "user_killall() error, error=%s" %(err) ) return def user_exec(self, cmd): print_debug ( "user_exec() %s" %(cmd) ) p = subprocess.Popen(cmd, shell=True, close_fds=True) try: th=threading.Thread(target=self.cleanproc, args=(p,) ) #th.setDaemon(1) th.start() print_debug("Threads count: %s" %threading.activeCount()) except Exception, err: print_debug ( "user_exec() error, error=%s" %(err) ) #pass return def user_sendfiles(self, dir, server, openfile): print_debug ( "user_sendfiles() dir=%s server=%s open=%s" %(dir, server, openfile)) desktop=self.get_desktop_path() local_dir=os.path.join(desktop, dir) cmd="/usr/lib/tcos/tcos-ftpclient --dir=%s --server=%s --open=%s" %(local_dir, server, openfile) print_debug("user_sendfiles() cmd=%s" %cmd) p = subprocess.Popen(cmd, shell=True, close_fds=True) try: th=threading.Thread(target=self.cleanproc, args=(p,) ) #th.setDaemon(1) th.start() print_debug("Threads count: %s" %threading.activeCount()) except Exception, err: print_debug ( "user_sendfiles() error, error=%s" %(err) ) #pass return def __escape__(self, txt): return xml.sax.saxutils.escape(txt, self.__dic__) def user_msg(self, txt): print_debug ( "user_msg() %s" %(txt) ) # use pynotify better??? self.show_notification( self.__escape__( _("Message from admin") ), self.__escape__( txt ) ) # p = subprocess.Popen("zenity --info --text='%s' --title='%s'" %(txt.replace("'", "´"), _("Message from admin").replace("'", "´")), shell=True, close_fds=True) # try: # th=threading.Thread(target=self.cleanproc, args=(p,) ) # #th.setDaemon(1) # th.start() # print_debug("Threads count: %s" %threading.activeCount()) # except Exception, err: # print_debug ( "user_msg() error, error=%s" %(err) ) # pass # return def show_notification(self, title, msg, urgency=pynotify.URGENCY_CRITICAL): print_debug("show_notification() title='%s', msg='%s'" %(title, msg) ) pynotify.init("tcosmonitor") if os.path.isfile("/usr/share/pixmaps/tcos-icon-32x32-custom.png"): image_uri="file://usr/share/pixmaps/tcos-icon-32x32-custom.png" else: image_uri="file://usr/share/pixmaps/tcos-icon-32x32.png" n = pynotify.Notification( title , msg, image_uri ) n.set_urgency(urgency) n.set_category("TcosDBus") n.set_timeout(40000) # 15 sec if not n.show(): print_debug ("show_notification() Failed to send notification") def start(self): self.bus.add_signal_receiver(self.new_message, signal_name='GotSignal', dbus_interface='com.consoltux.TcosMonitor.Comm', path='/TCOSObject') mainloop = gobject.MainLoop() mainloop.run() class TcosDBusClient(dbus.service.Object): def __init__(self, bus_name, object_path="/TCOSObject"): print_debug ( "TcosDBusClient() starting client" ) dbus.service.Object.__init__(self, bus_name, object_path) @dbus.service.signal("com.consoltux.TcosMonitor.Comm", signature="aas") def GotSignal(self, message): pass class TcosDBusAction: def __init__(self, main, admin="", passwd=""): print_debug ("TcosDBusAction() starting action...") self.admin=admin self.passwd=passwd self.connection = False self.error = None self.done = False self.main=main try: system_bus = dbus.SystemBus() except Exception, err: self.error = "Error getting system bus. Is DBus running?" print_debug ( "TcosDbusAction::__init__() error, error=%s" %(err) ) return try: name = dbus.service.BusName("com.consoltux.TcosMonitor", bus=system_bus) except Exception, err: self.error = "Error getting name of TcosMonitor dbus, are you autorized?" print_debug ( "TcosDbusAction::__init__() error, error=%s" %(err) ) return self.dbus_iface = TcosDBusClient(name) self.connection=True def set_auth(self, admin, passwd): self.admin=admin self.passwd=passwd def get_error_msg(self): return self.error def do_sendfiles(self, users, dir, server, open): print_debug ( "do_sendfiles() users=%s dir=%s server=%s open=%s" %(users, dir, server, open) ) if not self.connection: print_debug ( self.error ) return False try: self.dbus_iface.GotSignal( [ [self.admin, self.passwd], users , ["sendfiles"] , [dir, server, open] ]) self.done = True except Exception, err: self.error = _("User not allowed to run this dbus call.") print_debug ( "User not allowed to use dbus, error=%s"%err ) return self.done def do_exec(self, users, app): print_debug ( "do_exec() users=%s app=%s" %(users, app) ) if not self.connection: print_debug ( self.error ) return False try: self.dbus_iface.GotSignal( [ [self.admin, self.passwd], users , ["exec"] , [app] ]) self.done = True except Exception, err: self.error = _("User not allowed to run this dbus call.") print_debug ( "User not allowed to use dbus, error=%s"%err ) return self.done def do_message(self, users, text=""): print_debug ( "do_message() users=%s text='%s'" %(users, text) ) if not self.connection: print_debug ( self.error ) return False try: self.dbus_iface.GotSignal( [ [self.admin, self.passwd], users , ["mess"] , [text] ]) self.done = True except Exception, err: self.error = _("User not allowed to run this dbus call.") print_debug ( "User not allowed to use dbus, error=%s"%err ) return self.done def do_kill(self, users, pid="0"): print_debug ( "do_kill() users=%s pid=%s" %(users, pid) ) if not self.connection: print_debug ( self.error ) return False try: print_debug ( "send signal" ) self.dbus_iface.GotSignal( [ [self.admin, self.passwd], users , ["kill"] , [pid] ]) self.done = True except Exception, err: self.error = _("User not allowed to run this dbus call.") print_debug ( "User not allowed to use dbus, error=%s"%err ) return self.done def do_killall(self, users, proc=""): print_debug ( "do_kill() users=%s proc=%s" %(users, proc) ) if not self.connection: print_debug ( self.error ) return False try: print_debug ( "send signal" ) self.dbus_iface.GotSignal( [ [self.admin, self.passwd], users , ["killall"] , [proc] ]) self.done = True except Exception, err: self.error = _("User not allowed to run this dbus call.") print_debug ( "User not allowed to use dbus, error=%s"%err ) return self.done if __name__ == "__main__": tcosmonitor.shared.debug=True if len(sys.argv) < 2: print ( "Need --server or --client param " ) sys.exit(1) if sys.argv[1] == "--server": print_debug ("starting server") server=TcosDBusServer().start() if sys.argv[1] == "--client": action=TcosDBusAction(admin="root", passwd="root") result2 = action.do_message( ["mario"] , "Test message from dbus interface") if not result2: print action.get_error_msg() #result = action.do_exec( ["prueba"] , "xterm") #if not result: # print action.get_error_msg() #result = action.do_kill( ["mario"] , "9146") #if not result: # print action.get_error_msg() tcosmonitor/tcosmonitor/TcosTrayIcon.py0000664000000000000000000001721312260544542015651 0ustar # -*- coding: UTF-8 -*- # TcosMonitor version __VERSION__ # # Copyright (c) 2006-2011 Mario Izquierdo # # This package is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # # This package is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. import gtk import os import sys from gettext import gettext as _ from time import time import tcosmonitor.shared def print_debug(txt): if tcosmonitor.shared.debug: print >> sys.stderr, "[%d] %s::%s" % (os.getpid(), __name__, txt) #print("[%d] %s::%s" % (os.getpid(), __name__, txt), file=sys.stderr) def crono(start, txt): print_debug ("crono(), %s get %f seconds" %(txt, (time() - start)) ) return class TcosTrayIcon: def __init__(self, disable_quit=True, allow_reboot_poweroff=True): self.actions={} self.args={} #self.statusIcon = gtk.StatusIcon() self.menu=gtk.Menu() if not disable_quit: self.items={ "quit": [_("Quit"), "menu_kill.png", True, None] } else: self.items={} if allow_reboot_poweroff: self.items["reboot"]=[_("Reboot"), "menu_reboot.png", True, None] self.items["poweroff"]=[_("Poweroff"), "menu_poweroff.png", True, None] self.InitMenu() self.InitStatusIcon() def InitMenu(self): #print_debug ("InitMenu()") self.menu.popdown() self.menu=gtk.Menu() menu_item = gtk.MenuItem(_("TcosDevices")) self.menu.append(menu_item) menu_item.set_sensitive(False) menu_item.show() _sorted=self.items.keys() _sorted.sort() for m in _sorted: if m != "quit": self.menu.append(self.create_menu(self.items[m], m) ) # add quit menu at bottom if self.items.has_key("quit"): self.menu.append(self.create_menu(self.items["quit"], "quit") ) return def update_status(self, device, actions, status): print_debug ("updating status of %s to %s" %(actions, status)) if self.items.has_key("%s"%device): self.items["%s"%device][3]["%s"%actions][2]=status self.InitMenu() else: print_debug( " WW: no updating status of %s"%(actions) ) def register_action(self, action, function, *args): self.actions["%s" %action]=function self.args["%s" %action]=args #self.InitMenu() return def unregister_action(self, action): self.actions.pop(action) #self.InitMenu() return def register_device(self, device, devname, devimage, show, actions, devid): self.items["%s"%(device)]=[ devname, devimage, show, actions, devid] self.InitMenu() #print self.items["%s"%(device)] def unregister_device(self, device): if self.items.has_key(device): self.items.pop("%s"%device) else: print "WARNING: device %s not found" % device def create_menu(self, item, name): #print_debug (" => creating menu %s for %s" %(item,name) ) # search for icon icon_file_found=False if item[1] != None: icon_file_found=True icon_file=tcosmonitor.shared.IMG_DIR + item[1] if not os.path.isfile(icon_file): icon_file_found=False if icon_file_found: # we have icon menu_items=gtk.ImageMenuItem(item[0], True) icon = gtk.Image() icon.set_from_file(icon_file) menu_items.set_image(icon) else: buf = item[0] menu_items = gtk.MenuItem(buf) menu_items.show() menu_items.set_sensitive(item[2]) #print_debug("create_menu() name=%s item=%s" %(name, item)) #print "name=%s sensitive=%s " %(name, item[2]) if item[3]: submenu = gtk.Menu() _sorted=item[3].keys() _sorted.sort() for subitem in _sorted: #print_debug("create_menu() name=%s item=%s" %(subitem, item[3][subitem])) #print_debug( " => creando submenu %s item=%s" %(subitem, item[3][subitem]) ) submenu.append( self.create_menu(item[3][subitem], subitem) ) menu_items.set_submenu(submenu) #menu_items.connect("activate", self.do_action, name) else: menu_items.connect("activate", self.do_action, name) return menu_items def do_action(self, widget, name): print_debug ("do_action() widget=%s name=%s" %(widget, name) ) if self.actions.has_key(name): #print_debug("do_action() function=%s args=%s" %(self.actions[name], self.args[name]) ) self.actions[name](self.args[name]) else: print "TcosTrayIcon WARNING: no menu action set for \"%s\" event" % (name) return def InitStatusIcon(self): if hasattr(gtk, 'status_icon_new_from_file'): # use gtk.status_icon self.statusIcon = gtk.status_icon_new_from_file(tcosmonitor.shared.IMG_DIR + "tcos-devices-32x32.png") self.statusIcon.set_tooltip( _("Tcos Devices") ) self.statusIcon.connect('popup-menu', self.popup_menu) else: shared.error_msg( _("ERROR: No tray icon support") ) sys.exit(1) def popup_menu(self, widget, button, mtime): self.InitMenu() if self.menu: self.menu.show_all() self.menu.popup(None, None, None, 3, mtime) return def popup_menu2(self, widget, event): self.InitMenu() self.menu.popup(None, None, None, event.button, event.time) if __name__ == "__main__": def myprint(*args): print "MYPRINT %s" % args tcosmonitor.shared.debug=True def change(*args): systray.status = not systray.status systray.update_status("usb1", "usb1_mount", systray.status) systray.update_status("usb1", "usb1_umount", not systray.status) systray=TcosTrayIcon() systray.status=True systray.update_status("cdrom1", "cdrom1_mount", False) systray.update_status("cdrom1", "cdrom1_umount", False) #systray.register_action("quit", lambda w: gtk.main_quit() ) systray.register_action("quit", change ) systray.register_action("cdrom1_mount", myprint ) systray.register_action("cdrom1_umount", myprint ) systray.register_device("usb1", _("Usb flash"), "floppy_mount.png", True, { "usb1_mount":[ _("Mount USB1"), "floppy_mount.png", False, None, "/dev/sda1"], "usb1_umount":[ _("Umount USB1"), "floppy_umount.png", False, None, "/dev/sda1"], }, "/dev/sda1" ) systray.update_status("usb1", "usb1_mount", True) systray.update_status("usb1", "usb1_umount", False) systray.register_action("usb1_umount", change ) systray.register_action("usb1_mount", change ) #systray.register_action("usb1", change ) gtk.main() tcosmonitor/tcosmonitor/TcosMonitorDaemon.py0000664000000000000000000000167512260544373016703 0ustar # -*- coding: UTF-8 -*- # TcosMonitor version __VERSION__ # # Copyright (c) 2006-2011 Mario Izquierdo # # This package is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # # This package is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. import xmlrpclib class TcosMonitorDaemon: def __init__(self): pass def foo(self): pass tcosmonitor/tcosmonitor/TcosClassView.py0000664000000000000000000005131412260544373016023 0ustar # -*- coding: UTF-8 -*- # TcosMonitor version __VERSION__ # # Copyright (c) 2006-2011 Mario Izquierdo # # This package is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # # This package is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. import sys import gtk from gettext import gettext as _ import tcosmonitor.shared import os def print_debug(txt): if tcosmonitor.shared.debug: print >> sys.stderr, "%s::%s" % (__name__, txt) #print("%s::%s" % (__name__, txt), file=sys.stderr) class TcosClassView(object): def __init__(self, main): print_debug("__init__()") self.main=main self.ui=self.main.ui self.hosts={} self.__selected_icon=None self.selected=[] self.class_external_exe=None self.class_external_video=None self.class_external_send=None self.avalaible_info=[ [_("IP"), 'ip' ], [ _("Hostname"), 'hostname' ], [ _("Username"), 'username'], [ _("Logged"), 'logged'], [ _("Time log in"), 'time_logged'], [ _("Screen locked"), 'blocked_screen'], [ _("Network locked"), 'blocked_net'], ] self.default_tip = _("Place mouse on any computer to see brief info about it.\n\ You can select and unselect multiple host clicking on every one.\n\ Drag and drop hosts to positions and save clicking on right mouse button.") self.icon_tooltips = None self.classview=self.ui.get_object('classview') self.classeventbox=self.ui.get_object('classeventbox') self.classeventbox1=self.ui.get_object('classeventbox1') self.classview.drag_dest_set(gtk.DEST_DEFAULT_MOTION | gtk.DEST_DEFAULT_HIGHLIGHT | gtk.DEST_DEFAULT_DROP, [], gtk.gdk.ACTION_MOVE) self.classview.drag_dest_set(0, [], 0) self.classview.connect('drag_motion', self.motion_cb) self.classview.connect('drag_drop', self.on_drag_data_received) self.classeventbox.connect("button_press_event", self.on_classview_click) #self.classeventbox.connect("size-allocate", self.get_max_pos) self.classeventbox.connect("motion-notify-event", self.on_classview_event) self.oldpos={} #self.classview.set_size_request(200, 200) self.initialX=10 self.initialY=10 self.position=[10,10] self.iconsize=[115,115] # gtk.Frame don't support changing background color (default gray) use gtk eventbox print_debug("setting white background") self.classeventbox.modify_bg(gtk.STATE_NORMAL, gtk.gdk.color_parse("white")) self.classeventbox1.modify_bg(gtk.STATE_NORMAL, gtk.gdk.color_parse('white')) self.loadpos() def get_max_pos(self, *args): x, y, width, height = self.classeventbox.get_allocation() #print_debug("get_max_pos() width=%s height=%s"%(width, height)) return [width, height] def isenabled(self): """ return True if only configuration enable IconView prevent to work if ClassView is hidden """ if self.main.config.GetVar("listmode") == 'icons' or \ self.main.config.GetVar("listmode") == 'both' or \ self.main.config.GetVar("listmode") == 'class': return True return False def isactive(self): """ Return True if IconView is enabled and is active (We click on it) know this getting tabindex of viewtabas widget. 0 => active list view 1 => active icon view """ if not self.isenabled: return False if self.main.viewtabs.get_current_page() != 2: return False #print_debug("isactive() ClassView Mode active") return True def set_selected(self, ip): self.__selected_icon=ip def get_selected(self): return self.__selected_icon def get_host(self, ip): if self.hosts.has_key(ip): return self.hosts[ip]['hostname'] def __increment_position(self): maxpos=self.get_max_pos() #print_debug("__increment_position() self.position[0](%s) >= maxpos[0](%s) -self.iconsize[0](%s)"%(self.position[0], maxpos[0], self.iconsize[0])) if self.position[0] + self.iconsize[0] >= maxpos[0] - self.iconsize[0]: #print_debug("__increment_position() NEW FILE") self.position[1]=self.position[1]+self.iconsize[1] self.position[0]=self.initialX else: self.position[0]=self.position[0]+self.iconsize[0] print_debug("__increment_position() position=%s"%(self.position)) def __getoverride(self, ax, ay, aip): # read oldpos to know override saved settings for h in self.oldpos: if h == aip: # self movement continue x, y = self.oldpos[h] diffx=abs(ax-x) - (self.iconsize[0]-5) diffy=abs(ay-y) - (self.iconsize[1]-20) if diffx < 0 and diffy < 0: #print_debug("__getoverride() h=%s self.oldpos[h]=%s => [%s,%s] diffx=%s diffy=%s"%(h, self.oldpos[h], ax, ay, diffx, diffy)) return True # read pos of printed icons for w in self.classview.get_children(): x, y, width, height = w.get_allocation() ip=[] for c in w.get_children(): c.get_model().foreach(lambda model, path, iter: ip.append(model.get_value(iter, 1)) ) if aip == ip[0]: # self movement continue diffx=abs(ax-x) - (self.iconsize[0]-5) diffy=abs(ay-y) - (self.iconsize[1]-20) #print_debug("__getoverride() ### POSITION ### Elem[%s,%s] new[%s,%s] => abs(ax-x)=%s abs(ay-y)=%s restax=%s restay=%s"%(x,y,ax,ay,abs(ax-x), abs(ay-y), diffx, diffy )) if diffx < 0 and diffy < 0: print_debug("__getoverride() ### POSITION ### Elem[%s,%s] new[%s,%s] => abs(ax-x)=%s abs(ay-y)=%s restax=%s restay=%s"%(x, y, ax, ay, abs(ax-x), abs(ay-y), diffx, diffy )) return True return False def savepos(self, widget, action): if action == "reset": self.oldpos={} self.main.config.SetVar("positions", "") self.main.config.SaveToFile() print_debug("savepos() reset to %s"%self.oldpos) self.main.write_into_statusbar( _("Positions reset to defaults.") ) return for w in self.classview.get_children(): x, y, width, height = w.get_allocation() ip=[] for c in w.get_children(): c.get_model().foreach(lambda model, path, iter: ip.append(model.get_value(iter, 1)) ) print_debug("savepos() ### POSITION ### x=%s y=%s width=%s height=%s ip=%s"%(x, y, width, height, ip)) self.oldpos[ip[0]]=[x,y] print_debug("savepos() self.oldpos=%s"%self.oldpos) txt="" for ip in self.oldpos: txt+="%s:%s:%s,"%(ip, self.oldpos[ip][0], self.oldpos[ip][1] ) # remove last coma txt=txt[:-1] print_debug("savepos() txt=%s"%txt) self.main.config.SetVar("positions", txt) self.main.config.SaveToFile() self.main.write_into_statusbar( _("Positions saved.") ) def loadpos(self): print_debug("loadpos()") txt=self.main.config.GetVar("positions") if txt == "": return self.oldpos={} a=txt.split(',') for host in a: if len(host) < 1: continue h=host.split(':') self.oldpos[h[0]]=[int(h[1]),int(h[2])] print_debug("loadpos() self.oldpos=%s"%self.oldpos) def clear(self): for w in self.classview.get_children(): w.destroy() self.position=[self.initialX,self.initialY] print_debug("clear() restore position to %s"%(self.position)) self.selected=[] def generate_icon(self, data): print_debug("generate_icon() ip=%s hostname=%s"%(data['ip'], data['hostname']) ) iconview=gtk.IconView() model = gtk.ListStore(str, str, gtk.gdk.Pixbuf) if data['username'] == tcosmonitor.shared.NO_LOGIN_MSG and not data['standalone']: pixbuf = gtk.gdk.pixbuf_new_from_file(tcosmonitor.shared.IMG_DIR + tcosmonitor.shared.icon_image_no_logged) elif data['standalone']: pixbuf = gtk.gdk.pixbuf_new_from_file(tcosmonitor.shared.IMG_DIR + tcosmonitor.shared.icon_image_standalone) else: pixbuf = gtk.gdk.pixbuf_new_from_file(tcosmonitor.shared.IMG_DIR + tcosmonitor.shared.icon_image_thin) if not data['active']: pixbuf.saturate_and_pixelate(pixbuf, 0.6, True) if data['image_blocked']: pixbuf2 = data['image_blocked'] print_debug("generate_icon() compositing isblocked=True") pixbuf2.composite(pixbuf, 0, 0, pixbuf.props.width, pixbuf.props.height, 0, 0, 1.0, 1.0, gtk.gdk.INTERP_HYPER, 255) iconview.set_model(model) iconview.set_text_column(0) iconview.set_pixbuf_column(2) if hasattr(iconview.props, 'has_tooltip'): iconview.props.has_tooltip = True #if data['username'] == tcosmonitor.shared.NO_LOGIN_MSG: # model.append([data['username'], data['ip'], pixbuf]) # show hostname instead of username in standalone if data['standalone']: model.append([data['hostname'].split('.')[0], data['ip'], pixbuf]) else: model.append([data['username'], data['ip'], pixbuf]) iconview.show() # in old versions of gtk we need to put explicity iconview size if gtk.gtk_version < (2, 10, 0): iconview.set_size_request(pixbuf.props.width+14, pixbuf.props.height+28) # connect drag and drop signal with external data iconview.drag_dest_set( gtk.DEST_DEFAULT_ALL, [( 'text/uri-list', 0, 2 ), ], gtk.gdk.ACTION_DEFAULT | gtk.gdk.ACTION_COPY) iconview.connect( 'drag_data_received', self.on_external_drag_data_received, data['ip']) #iconview.set_size_request(110,110) iconview.set_item_width(82) button = gtk.Button() button.set_relief(gtk.RELIEF_NONE) button.add(iconview) button.drag_source_set(gtk.gdk.BUTTON1_MASK, [], gtk.gdk.ACTION_COPY) if data['active']: button.connect("button_press_event", self.on_iconview_click, data['ip']) button.connect("enter", self.on_button_enter, data['ip']) button.set_size_request(111, 113) button.show_all() if self.oldpos.has_key(data['ip']): # we have and old possition print_debug("generate_icon() found old position => %s"%self.oldpos[data['ip']]) self.classview.put(button, self.oldpos[data['ip']][0], self.oldpos[data['ip']][1] ) else: #while self.__getoverride(self.position[0], self.position[1], data['ip'] ): # print_debug("generate_icon() OVERRIDE ICON !!!") # self.__increment_position() self.classview.put(button, self.position[0], self.position[1]) print_debug("generate_icon() put not positioned icon at [%s,%s] !!!"%(self.position[0], self.position[1])) self.__increment_position() self.hosts[data['ip']]=data def on_external_drag_data_received( self, widget, context, x, y, selection, targetType, dtime, ip_recv): ip=None if not self.ismultiple(): if not ip_recv: return ip=ip_recv self.set_selected(ip) print_debug("get_selected()=%s get_multiple()=%s" %(self.get_selected(), self.get_multiple())) filenames=[] files = selection.data.split('\n') extensions = (".avi", ".mpg", ".mpeg", ".ogg", ".ogm", ".asf", ".divx", ".wmv", ".vob", ".m2v", ".m4v", ".mp2", ".mp4", ".ac3", ".ogg", ".mp1", ".mp2", ".mp3", ".wav", ".wma") print_debug("on_external_drag_data_received() files=%s dtime=%s ip=%s"%(files, dtime, ip)) for f in files: if f: filenames.append(f.strip().replace('%20', ' ')) #break if len(filenames) < 1: return if filenames[0].startswith('file:///') and filenames[0].lower().endswith('.desktop') and os.path.isfile(filenames[0][7:]): if self.class_external_exe != None: self.class_external_exe(filenames[0][7:]) print_debug("get_selected() ip=%s file=%s" %(self.get_selected(), filenames[0][7:])) elif filenames[0].startswith('file:///') and filter(filenames[0].lower().endswith, extensions) and os.path.isfile(filenames[0][7:]): if self.class_external_video != None: self.class_external_video(filenames[0][7:]) print_debug("get_selected() ip=%s file=%s" %(self.get_selected(), filenames[0][7:])) elif filenames[0].startswith('file:///') and os.path.isfile(filenames[0][7:]): if self.class_external_send != None: self.class_external_send(filenames) print_debug("get_selected() ip=%s file=%s" %(self.get_selected(), filenames)) else: tcosmonitor.shared.error_msg( _("%s is not a valid file to exe or send") %(os.path.basename(filenames[0][7:])) ) return True def on_drag_data_received(self, widget, context, x, y, dtime): button=context.get_source_widget() if not button: #print context #print dir(context) #print context.get_data() #print context.targets print_debug("on_drag_data_received() no button detected") return bx, by, width, height = button.get_allocation() # calculate newx and newy with valid positions newx=x-(width/2) newy=y-(height/2) maxpos=self.get_max_pos() if newx < 0: newx=10 if newy < 0: newy=10 print_debug("on_drag_data_received() newx=%s newy=%s maxpos[0]=%s maxpos[1]=%s"%(newx, newy, maxpos[0], maxpos[1])) if newx > maxpos[0]: print_debug("on_drag_data_received() newx=%s > maxpos[0]=%s or negative"%(newx, maxpos[0])) return if newy > maxpos[1]: print_debug("on_drag_data_received() newy=%s > maxpos[1]=%s or negative"%(newy, maxpos[1])) return # get button ip address and pass to __getoverride to not put 2 hosts (with different IP) in same position ip=[] for c in button.get_children(): c.get_model().foreach(lambda model, path, iter: ip.append(model.get_value(iter, 1)) ) if self.hosts[ip[0]]['active']: # set unselect if host is active self.change_select(c, ip[0]) #if self.__getoverride(newx, newy, ip[0]): # print_debug("on_drag_data_received() ip=%s another host is near x=%s y=%s, don't move!!"%(ip[0], x, y) ) # self.main.write_into_statusbar( _("Can't move icon, another host is near.") ) # return self.classview.move(button, newx, newy) def motion_cb(self, widget, context, x, y, time): context.drag_status(gtk.gdk.ACTION_MOVE, time) return True def change_select(self, widget, ip): #print_debug("change_colour() ip=%s widget=%s"%(ip,widget)) colour_selected=gtk.gdk.color_parse("#98ec98") # green colour_white=gtk.gdk.color_parse("white") style = widget.get_style().copy() if self.isselected(ip): style.base[gtk.STATE_NORMAL] = colour_white style.base[gtk.STATE_PRELIGHT] = colour_white self.set_unselect(ip) else: style.base[gtk.STATE_NORMAL] = colour_selected style.base[gtk.STATE_PRELIGHT] = colour_selected self.set_select(ip) widget.set_style(style) def on_iconview_click(self, widget, event, ip): if event.button == 3: # right click show menu print_debug("on_iconview_click() ip=%s" %(ip)) self.main.menus.RightClickMenuOne( None , None, ip) self.main.menu.popup( None, None, None, event.button, event.time) #self.set_select(ip) self.set_selected(ip) return True if event.button == 1: # select host (change color) and call set_selected or set_unselected for c in widget.get_children(): self.change_select(c, ip) def on_classview_click(self, iv, event): if event.button == 3: # need to remake allmenu (for title selected|all ) #print_debug( "on_classview_click() all=%s"%self.selected ) self.main.menus.RightClickMenuAll() self.main.allmenu.popup( None, None, None, event.button, event.time) return def on_button_enter(self, button, ip): txt="" data=self.hosts[ip] for info in self.avalaible_info: if data[info[1]] == True: value=_("yes") elif data[info[1]] == False: value=_("no") else: value=data[info[1]] txt+=" %s: %s \n" %(info[0], value) if hasattr(button, 'set_tooltip_text'): button.set_tooltip_text(txt) else: self.icon_tooltips = gtk.Tooltips() #deprecated self.icon_tooltips.set_tip(button, txt) def get_multiple(self): return self.selected def set_select(self, ip): print_debug("set_select() ip=%s all=%s"%(ip, self.selected)) if ip in self.selected: return self.selected.append(ip) def set_unselect(self, ip): if self.isselected(ip): self.selected.remove(ip) print_debug("set_unselect() ip=%s all=%s"%(ip, self.selected)) def isselected(self, ip): if ip in self.selected: #print_debug("isselected() TRUE ip=%s"%ip) return True #print_debug("isselected() FALSE ip=%s"%ip) return False def ismultiple(self): if not self.isactive(): return False print_debug("ismultiple() self.selected=%s"%self.selected) if len(self.selected) > 0: return True else: return False def on_classview_event(self, widget, event): if not event.state: #print_debug("on_classview_event() tip") if hasattr(widget, 'set_tooltip_text'): widget.set_tooltip_text(self.default_tip) else: self.icon_tooltips = gtk.Tooltips() # deprecated self.icon_tooltips.set_tip(widget, self.default_tip) def change_lockscreen(self, ip, pixbuf2, status_screen, status_net): print_debug("change_lockscreen() ip=%s pixbuf=%s"%(ip, pixbuf2)) self.hosts[ip]['blocked_screen']=status_screen self.hosts[ip]['blocked_net']=status_net data=self.hosts[ip] if data['username'] == tcosmonitor.shared.NO_LOGIN_MSG: pixbuf = gtk.gdk.pixbuf_new_from_file(tcosmonitor.shared.IMG_DIR + tcosmonitor.shared.icon_image_no_logged) else: pixbuf = gtk.gdk.pixbuf_new_from_file(tcosmonitor.shared.IMG_DIR + tcosmonitor.shared.icon_image_thin) pixbuf2.composite(pixbuf, 0, 0, pixbuf.props.width, pixbuf.props.height, 0, 0, 1.0, 1.0, gtk.gdk.INTERP_HYPER, 255) for w in self.classview.get_children(): for c in w.get_children(): model=c.get_model() if model[0][1] == ip: model2 = gtk.ListStore(str, str, gtk.gdk.Pixbuf) c.set_model(model2) c.set_text_column(0) c.set_pixbuf_column(2) if data['username'] == tcosmonitor.shared.NO_LOGIN_MSG: model2.append([data['hostname'].replace('.aula',''), data['ip'], pixbuf]) else: model2.append([data['username'], data['ip'], pixbuf]) #model[0][2]=pixbuf return tcosmonitor/tcosmonitor/TcosListView.py0000664000000000000000000002567312260544373015702 0ustar # -*- coding: UTF-8 -*- # TcosMonitor version __VERSION__ # # Copyright (c) 2006-2011 Mario Izquierdo # # This package is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # # This package is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. import sys import gtk from gettext import gettext as _ import tcosmonitor.shared COL_HOST, COL_IP, COL_USERNAME, COL_ACTIVE, COL_LOGGED, COL_BLOCKED, COL_PROCESS, COL_TIME, COL_SEL, COL_SEL_ST = range(10) # constant to font sizes PANGO_SCALE=1024 def print_debug(txt): if tcosmonitor.shared.debug: print >> sys.stderr, "%s::%s" % (__name__, txt) #print("%s::%s" % (__name__, txt), file=sys.stderr) class TcosListView(object): def __init__(self, main): print_debug("__init__()") self.main=main self.ui=self.main.ui self.main.updating=True self.searching=False # boolean True thread running False not running # define as None and register with info extension self.populate_datatxt=None self.model=gtk.ListStore(str, str, str, gtk.gdk.Pixbuf, gtk.gdk.Pixbuf, gtk.gdk.Pixbuf, str, str, bool,bool) self.main.tabla = self.ui.get_object('hostlist') self.main.tabla.set_model (self.model) cell1 = gtk.CellRendererText () column1 = gtk.TreeViewColumn (_("Hostname"), cell1, text = COL_HOST) column1.set_resizable (True) column1.set_sort_column_id(COL_HOST) self.main.tabla.append_column (column1) cell2 = gtk.CellRendererText () column2 = gtk.TreeViewColumn (_("IP address"), cell2, text = COL_IP) column2.set_resizable (True) column2.set_sort_column_id(COL_IP) self.main.tabla.append_column (column2) cell3 = gtk.CellRendererText () column3 = gtk.TreeViewColumn (_("Username"), cell3, text = COL_USERNAME) column3.set_resizable (True) column3.set_sort_column_id(COL_USERNAME) self.main.tabla.append_column (column3) cell4 = gtk.CellRendererPixbuf() column4 = gtk.TreeViewColumn (_("Active"), cell4, pixbuf = COL_ACTIVE) #column4.set_sort_column_id(COL_ACTIVE) self.main.tabla.append_column (column4) cell5 = gtk.CellRendererPixbuf() column5 = gtk.TreeViewColumn (_("Logged"), cell5, pixbuf = COL_LOGGED) #column5.set_sort_column_id(COL_LOGGED) self.main.tabla.append_column (column5) cell6 = gtk.CellRendererPixbuf() column6 = gtk.TreeViewColumn (_("Screen Blocked"), cell6, pixbuf = COL_BLOCKED) #column6.set_sort_column_id(COL_BLOCKED) self.main.tabla.append_column (column6) cell7 = gtk.CellRendererText () column7 = gtk.TreeViewColumn (_("Num of process"), cell7, text = COL_PROCESS) column7.set_resizable (True) column7.set_sort_column_id(COL_PROCESS) self.main.tabla.append_column (column7) cell8 = gtk.CellRendererText () column8 = gtk.TreeViewColumn (_("Time log in"), cell8, text = COL_TIME) column8.set_resizable (True) column8.set_sort_column_id(COL_TIME) self.main.tabla.append_column (column8) if self.main.config.GetVar("selectedhosts") == 1: cell9 = gtk.CellRendererToggle () cell9.connect('toggled', self.on_sel_click, self.model, COL_SEL_ST) #column9 = gtk.TreeViewColumn(_("Sel"), cell9, active=COL_SEL_ST, activatable=1) # activatable make warnings , not needed column9 = gtk.TreeViewColumn(_("Sel"), cell9, active=COL_SEL_ST) self.main.tabla.append_column (column9) # print rows in alternate colors if theme allow self.main.tabla.set_rules_hint(True) self.main.tabla_file = self.main.tabla.get_selection() self.main.tabla_file.connect("changed", self.on_hostlist_click) # allow to work right click self.main.tabla.connect_object("button_press_event", self.on_hostlist_event, self.main.menu) return def on_hostlist_click(self, hostlist): if self.main.worker_running: return if not self.populate_datatxt: print_debug ("on_hostlist_click() self.populate_datatxt() NOT DEFINED") return self.main.progressbar.hide() (model, iter) = hostlist.get_selected() if not iter: return self.main.selected_host=model.get_value(iter,COL_HOST) self.main.selected_ip=model.get_value(iter, COL_IP) print_debug ( "on_hostlist_clic() selectedhost=%s selectedip=%s" \ %(self.main.selected_host, self.main.selected_ip) ) # call to read remote info #self.main.localdata.newhost(self.main.selected_ip) self.main.xmlrpc.newhost(self.main.selected_ip) self.main.xmlrpc.ip=self.main.selected_ip if not self.main.xmlrpc.isPortListening(self.main.selected_ip, self.main.xmlrpc.lastport): print_debug ( "on_host_list_click() XMLRPC not running in %s" %(self.main.selected_ip) ) self.main.write_into_statusbar ( _("Error connecting to tcosxmlrpc in %s") %(self.main.selected_ip) ) return print_debug ( "on_host_list_click() AUTH OK" ) self.main.write_into_statusbar ( "" ) print_debug ( "on_hostlist_click() callig worker to populate in Thread" ) self.main.worker=tcosmonitor.shared.Workers( self.main,\ target=self.populate_datatxt, args=([self.main.selected_ip]) ).start() return def on_hostlist_event(self, widget, event): if event.button == 3: x = int(event.x) y = int(event.y) time = event.time pthinfo = self.main.tabla.get_path_at_pos(x, y) if pthinfo is not None: path, col, cellx, celly = pthinfo #generate menu self.main.menus.RightClickMenuOne( path ) self.main.tabla.grab_focus() self.main.tabla.set_cursor( path, col, 0) self.main.menu.popup( None, None, None, event.button, time) return 1 else: self.main.menus.RightClickMenuAll() self.main.allmenu.popup( None, None, None, event.button, time) print_debug ( "on_hostlist_event() NO row selected" ) return def on_sel_click(self, cell, path, model, col=0): # reverse status of sel row (saved in COL_SEL_ST) iter = model.get_iter(path) self.model.set_value(iter, col, not model[path][col]) print_debug("on_sel_click() ip=%s status=%s" %(model[path][COL_IP], model[path][col])) return True def isenabled(self): """ return True if only configuration enable IconView prevent to work if ClassView is hidden """ if self.main.config.GetVar("listmode") == 'list' or \ self.main.config.GetVar("listmode") == 'both': return True return False def isactive(self): """ Return True if IconView is enabled and is active (We click on it) know this getting tabindex of viewtabas widget. 0 => active list view 1 => active icon view """ if not self.isenabled: return False if self.main.viewtabs.get_current_page() != 0: return False return True def clear(self): self.model.clear() def generate_file(self, data): self.iter = self.model.append (None) self.model.set_value (self.iter, COL_HOST, data['hostname'] ) self.model.set_value (self.iter, COL_IP, data['host'] ) self.model.set_value (self.iter, COL_USERNAME, data['username'] ) self.model.set_value (self.iter, COL_ACTIVE, data['image_active'] ) self.model.set_value (self.iter, COL_LOGGED, data['image_logged'] ) self.model.set_value (self.iter, COL_BLOCKED, data['image_blocked'] ) self.model.set_value (self.iter, COL_PROCESS, data['num_process'] ) self.model.set_value (self.iter, COL_TIME, data['time_logged'] ) def getmultiple(self): allclients=[] #model=self.main.tabla.get_model() rows = [] self.model.foreach(lambda model, path, iter: rows.append(path)) for host in rows: iter=self.model.get_iter(host) if self.model.get_value(iter, COL_SEL_ST): allclients.append(self.model.get_value(iter, COL_IP)) return allclients def get_selected(self): (model, iter) = self.main.tabla.get_selection().get_selected() if iter == None: print_debug( "get_selected() not selected thin client !!!" ) return return model.get_value(iter, COL_IP) def get_host(self, ip): (model, iter) = self.main.tabla.get_selection().get_selected() if iter == None: print_debug( "get_selected() not selected thin client !!!" ) return return model.get_value(iter, COL_HOST) def change_lockscreen(self, ip, image): self.model.foreach(self.__lockscreen_changer, [ip, image]) def __lockscreen_changer(self, model, path, iter, args): ip, image = args # change image if ip is the same. if model.get_value(iter, COL_IP) == ip: model.set_value(iter, COL_BLOCKED, image) def refresh_client_info(self, ip, data): self.model.foreach(self.__refresh_client_info, [ip, data] ) def __refresh_client_info(self, model, path, iter, args): ip, data = args print_debug ( "__refresh_client_info() ip=%s model_ip=%s" %(ip, model.get_value(iter, COL_IP)) ) # update data if ip is the same. if model.get_value(iter, COL_IP) == ip: #self.set_client_data(ip, model, iter) model.set_value (iter, COL_HOST, data['hostname'] ) model.set_value (iter, COL_IP, data['ip'] ) model.set_value (iter, COL_USERNAME, data['username'] ) model.set_value (iter, COL_ACTIVE, data['image_active'] ) model.set_value (iter, COL_LOGGED, data['image_logged'] ) model.set_value (iter, COL_BLOCKED, data['image_blocked'] ) model.set_value (iter, COL_PROCESS, data['num_process'] ) model.set_value (iter, COL_TIME, data['time_logged'] ) tcosmonitor/tcosmonitor/Sessions.py0000664000000000000000000002424312260544373015101 0ustar # -*- coding: UTF-8 -*- # TcosMonitor version __VERSION__ # # Copyright (c) 2006-2011 Mario Izquierdo # # This package is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # # This package is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. import pwd import os import time import datetime import gzip import dbus import dateutil.parser CK_PATH="/var/log/ConsoleKit/" def username(uid): try: return pwd.getpwuid( int(uid) ).pw_name except Exception, err: return None class Connection(object): def __repr__(self): return ""%(self.session_x11_display, str(self.__dict__)) def __init__(self, line): self.type=None self.seat_id=None self.session_type=None self.session_remote_host_name=None self.session_unix_user=None self.username=None self.session_creation_time=None self.session_x11_display=None self.time=None self.strtime=None self.diffint=0 self.__parse__(line) if self.session_unix_user: self.username=username(self.session_unix_user) if self.session_x11_display: self.session_x11_display=self.session_x11_display.replace("'", "") self.diff=self.diffnow() def __parse__(self, line): for elem in line.split(): if not "=" in elem and "." in elem: self.strtime=elem self.time=time.localtime( float(elem) ) continue if not "=" in elem: continue #print elem varname=elem.split('=')[0].replace('-', '_') value=elem.split('=')[1] if hasattr(self, varname): setattr(self, varname, value) def diffnow(self): diff=datetime.timedelta(0, time.time() - float(self.strtime)) """ >>> d = timedelta(microseconds=-1) >>> (d.days, d.seconds, d.microseconds) (-1, 86399, 999999) """ self.diffint=int(diff.days)*86400 + int(diff.seconds) if diff.days > 0: return "%dd %s"%(diff.days, datetime.timedelta(0, diff.seconds)) else: return "%s"%datetime.timedelta(0, diff.seconds) class ConsoleKitHistory(object): def __init__(self, username=None, last=False): self.logfiles=[] self.data=[] self.searchlogs() # reverse logs #self.logfiles.reverse() #print self.logfiles self.readlogs() if username: newdata=[] for con in self.data: if con.username == username: newdata.append(con) self.data=newdata # sort array by diffint self.data=sorted(self.data, key=lambda data: data.diffint) if last and len(self.data)>0: newdata=[self.data[0]] self.data=newdata def readlogs(self): for logfile in self.logfiles: if ".gz" in logfile: f = gzip.open(logfile, 'rb') else: f=open(logfile, 'r') for line in f.readlines(): if "type=SEAT_SESSION_ADDED" in line: con=Connection(line) if con.username and int(con.session_unix_user) > 500 and con.session_x11_display != '' : self.data.append( con ) f.close() def searchlogs(self): if os.path.isfile(CK_PATH + "history"): self.logfiles.append(CK_PATH + "history") i=1 if os.path.isfile(CK_PATH + "history" + "." + str(i)): self.logfiles.append(CK_PATH + "history" + "." + str(i)) for i in range(2,10): if os.path.isfile(CK_PATH + "history" + "." + str(i) + ".gz"): self.logfiles.append(CK_PATH + "history" + "." + str(i) + ".gz") class Display(object): def __repr__(self): return ""%(self.x11_display, str(self.__dict__)) def __init__(self, obj): self.id=None self.seatid=None self.active=False self.is_local=None self.remote_host_name=None self.x11_display=None self.unix_user=None self.user=None self.__parse__(obj) def __parse__(self, obj): self.id=str(obj.GetId()) self.seatid=str(obj.GetSeatId()) self.is_local=bool(obj.IsLocal()) self.remote_host_name=str(obj.GetRemoteHostname()) self.x11_display=str(obj.GetX11DisplayName()) bus = dbus.SystemBus () manager_obj = bus.get_object ('org.freedesktop.ConsoleKit', '/org/freedesktop/ConsoleKit/Manager') manager = dbus.Interface (manager_obj, 'org.freedesktop.ConsoleKit.Manager') for sessionid in manager.GetSessions(): session_obj = bus.get_object ('org.freedesktop.ConsoleKit', sessionid) session = dbus.Interface (session_obj, 'org.freedesktop.ConsoleKit.Session') if session.GetX11Display() == self.x11_display: self.unix_user=int(session.GetUnixUser()) if self.unix_user > 900: self.user=username(self.unix_user) self.since= str(session.GetCreationTime()) self.active=True self.diff=self.diffnow(self.since) return def diffnow(self, date): diff=datetime.timedelta(0, time.mktime(time.gmtime()) - time.mktime(dateutil.parser.parse(date).timetuple())) """ if days == 0: timelogged="%02dh:%02dm"%(hours,minutes) else: timelogged="%dd %02dh:%02dm"%(days,hours,minutes) """ if diff.days > 0: return "%dd %s"%(diff.days, datetime.timedelta(0, diff.seconds)) else: return "%s"%datetime.timedelta(0, diff.seconds) class Sessions(object): def __init__(self): self.sessions=[] self.__get_all__() pass def __get_all__(self): bus = dbus.SystemBus () manager_obj = bus.get_object ('org.gnome.DisplayManager', '/org/gnome/DisplayManager/Manager') manager = dbus.Interface (manager_obj, 'org.gnome.DisplayManager.Manager') sessions=[] for display in manager.GetDisplays(): display_obj = bus.get_object ('org.gnome.DisplayManager', display) session = dbus.Interface (display_obj, 'org.gnome.DisplayManager.Display') self.sessions.append( Display(session) ) class Connections(object): def __init__(self): self.connections=[] self.__get_all__() def __get_all__(self): bus = dbus.SystemBus() manager_obj = bus.get_object ('org.freedesktop.ConsoleKit', '/org/freedesktop/ConsoleKit/Manager') manager = dbus.Interface (manager_obj, 'org.freedesktop.ConsoleKit.Manager') for sessionid in manager.GetSessions(): session_obj = bus.get_object ('org.freedesktop.ConsoleKit', sessionid) session = dbus.Interface (session_obj, 'org.freedesktop.ConsoleKit.Session') userid=int(session.GetUnixUser()) usernametxt=None active=False diff=None if str(session.GetSessionType()) != 'LoginWindow':#FIXME userid > 900: better??? usernametxt=username(userid) active=True diff=self.diffnow(str(session.GetCreationTime())) con={'unix_user':userid, 'user':usernametxt, 'since':str(session.GetCreationTime()), 'active':active, 'diff':diff, #'id':str(session.GetId()), 'is_local':bool(session.IsLocal()), 'remote_host_name':str(session.GetRemoteHostName()), 'x11_display':str(session.GetX11Display()) } self.connections.append(con) def diffnow(self, date): diff=datetime.timedelta(0, time.mktime(time.gmtime()) - time.mktime(dateutil.parser.parse(date).timetuple())) """ if days == 0: timelogged="%02dh:%02dm"%(hours,minutes) else: timelogged="%dd %02dh:%02dm"%(days,hours,minutes) """ if diff.days > 0: return "%dd %s"%(diff.days, datetime.timedelta(0, diff.seconds)) else: return "%s"%datetime.timedelta(0, diff.seconds) class MultiSeat(Connections): def __init__(self): Connections.__init__(self) EMPTY={'is_local': None, 'unix_user': None, 'remote_host_name': None, 'active': None, 'diff': '', 'x11_display': '', 'since': '', 'user': ''} multiseats={} for seat in self.get_seats(): multiseats[seat]=EMPTY multiseats[seat]['x11_display']=":%s"%seat isrunning=False for con in self.connections: if con['x11_display'] == ":%s"%seat: multiseats[seat]=con isrunning=True multiseats[seat]['running']=isrunning self.connections=multiseats def get_seats(self): if os.path.isdir('/dev/usbseat/'): return ['0'] + os.listdir('/dev/usbseat/') return ['0'] if __name__ == "__main__": # # search for last connection of user prueba # app=ConsoleKitHistory(None, last=False) # from pprint import pprint # for con in app.data: # pprint (con) # print "\n" # print "\n------------------------------\n" # # list all connections # app=Sessions() # for session in app.sessions: # print(session) # print "\n" app=Connections() for con in app.connections: print con tcosmonitor/tcosmonitor/TcosXauth.py0000664000000000000000000001000612260544373015205 0ustar # -*- coding: UTF-8 -*- # TcosMonitor version __VERSION__ # # Copyright (c) 2006-2011 Mario Izquierdo # # This package is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # # This package is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. import sys import binascii from Xlib import xauth from tcosmonitor import shared def print_debug(txt): if shared.debug: print >> sys.stderr, "%s::%s" % (__name__, txt) #print("%s::%s" % (__name__, txt), file=sys.stderr) import tcosmonitor.TcosCommon import tcosmonitor.TcosConf import tcosmonitor.TcosXmlRpc class TcosXauth(object): def __init__(self, main): self.main=main self.cookie=None self.common=tcosmonitor.TcosCommon.TcosCommon(self) self.display_host=self.common.get_display(ip_mode=False) self.display_ip=self.common.get_display(ip_mode=True) print_debug("display_host='%s'" %self.display_host) print_debug("display_ip='%s'" %self.display_ip) def init_standalone(self): print_debug ( "init_standalone() " ) self.name="TcosXauth" self.config=tcosmonitor.TcosConf.TcosConf(self, openfile=False) self.xmlrpc=tcosmonitor.TcosXmlRpc.TcosXmlRpc(self) def read_cookie(self): if self.cookie != None: # return last cookie (cookie in X session don't change) return self.cookie # use python-xlib for getting IPAddress and data (support IPV6) for line in self.parseDisplay(): if line[0] == self.display_host or line[0] == self.display_ip: self.cookie=line[1] return self.cookie return None def parseDisplay(self): """ read xauth and get IP addr using xlib python bindings """ a=xauth.Xauthority() entries=a.entries lines=[] for entry in entries: ipv4=str(shared.parseIPAddress(entry[1], return_ipv4=True)) if ipv4 is None: ipv4=entry[1] cookie=self.parseCookie(entry[4]) print_debug("parseDisplay() ip=%s cookie=%s"%(ipv4, cookie)) lines.append([ipv4, cookie]) return lines def parseCookie(self, cookiestr): """ read bin cookie and return hex string """ cookie=[] for i in cookiestr: cookie.append(binascii.hexlify(i)) return "".join(cookie) def get_cookie(self): return self.read_cookie() def get_hostname(self): return self.display_ip def test_auth(self, nossl=False): cookie=self.read_cookie() print_debug("test_auth() cookie=%s ip=%s"%(cookie, self.display_ip)) if cookie == None: print_debug ( "test_auth() Can't read cookie" ) return self.xmlrpc.newhost(self.display_ip, nossl) if not self.xmlrpc.connected: print_debug ( "test_auth() No connection" ) return try: returned = self.xmlrpc.tc.tcos.xauth(cookie, self.display_ip) except Exception, err: print_debug("test_auth() Exception error: %s"%err) returned = "error" if "OK" in returned: return True else: return False if __name__ == "__main__": shared.debug=True app=TcosXauth(None) app.init_standalone() if app.test_auth(): print "Xauth OK" else: print "Xauth error" tcosmonitor/tcosmonitor/ping.py0000664000000000000000000004661612260544373014240 0ustar # -*- coding: UTF-8 -*- # # pingip based on # Filename: ping.py # Discripion: # Author(s): yetist # Version: # URL: http://www.osprg.org/modules/newbb/viewtopic.php?forum=3&post_id=487 # # TcosMonitor version __VERSION__ # # Copyright (c) 2006-2011 Mario Izquierdo # # This package is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # # This package is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. import sys import os import re from threading import Thread import socket from gettext import gettext as _ from subprocess import Popen, PIPE, STDOUT import netifaces import IPy import tcosmonitor.shared import xml.dom.minidom def print_debug(txt): if tcosmonitor.shared.debug: print >> sys.stderr, "%s::%s" % (__name__, txt) #print("%s::%s" % (__name__, txt), file=sys.stderr) class pingip(Thread): def __init__ (self, ip): Thread.__init__(self) self.ip = ip self.status = -1 self.lifeline = re.compile(r"(\d) received") def run(self): #print_debug("ping to '%s'" %self.ip) pingalingout = Popen(["ping", "-q", "-W1", "-c2", "%s" %self.ip], \ shell=False, stdout=PIPE, stderr=STDOUT, close_fds=True) try: pingalingout.wait() except Exception, err: print_debug("pingip() Exception in wait() error: %s"%err) pingaling = pingalingout.stdout while 1: line = pingaling.readline() if not line: break igot = re.findall(self.lifeline, line) if igot: self.status = int(igot[0]) class Ping: def __init__(self, main): print_debug ( "__init__()" ) self.main=main self.reachip=[] def ping_iprange_nmap(self, selfip): print_debug("ping_iprange_nmap() ip=%s"%selfip) pinglist=[] reachip=[] server_ips=self.get_server_ips() self.main.common.threads_enter("Nmap:only show tcos") self.main.write_into_statusbar( _("Testing if found clients have 8998 or 8999 port open...")) self.main.common.threads_leave("Nmap:only show tcos") if self.main.config.GetVar("onlyshowtcos") == 1: print_debug("cmd='nmap -sS -p%s -n --open -oX - %s'"%(tcosmonitor.shared.xmlremote_port, selfip)) cmd="nmap -sS -p%s -n --open -oX - %s" %(tcosmonitor.shared.xmlremote_port, selfip) else: print_debug("cmd='nmap -sP -n -oX - %s'"%selfip) cmd="nmap -sP -n -oX - %s" %selfip try: p = Popen(cmd, shell=True, bufsize=100000, stdin=PIPE, stdout=PIPE, stderr=PIPE, close_fds=True) except Exception, e: print_debug("Exception in subprocess cmd(%s), error='%s'"%(cmd, e)) return None # Use dom to parse output, idea taken from python-nmap source # wait until finished # get output (nmap_last_output, nmap_err) = p.communicate() # If there was something on stderr, there was a problem so abort... if len(nmap_err) > 0: print_debug("Error in nmap cmd(%s), error='%s'"%(cmd, nmap_err)) return [] dom = xml.dom.minidom.parseString(nmap_last_output) for dhost in dom.getElementsByTagName('host'): ipnmap = dhost.getElementsByTagName('address')[0].getAttributeNode('addr').value for dstatus in dhost.getElementsByTagName('status'): # is up? up = dstatus.getAttributeNode('state').value reason = dstatus.getAttributeNode('reason').value if up != "up" or reason != "arp-response": continue if self.main.config.GetVar("onlyshowtcos") == 1: for dport in dhost.getElementsByTagName('port'): proto = dport.getAttributeNode('protocol').value port = int(dport.getAttributeNode('portid').value) state = dport.getElementsByTagName('state')[0].getAttributeNode('state').value if port == tcosmonitor.shared.xmlremote_port and state == "open": pinglist.append(ipnmap) else: pinglist.append(ipnmap) print_debug(pinglist) try: inhosttcos=str(tcosmonitor.shared.parseIPAddress(os.environ["DISPLAY"])) # running tcosmonitor on thin client ? except Exception, err: print_debug("ping_iprange_nmap() can't read DISPLAY, %s"%err) i=0 for ipnmap in pinglist: i=i+1 if ipnmap in server_ips: print_debug("Nmap:: ip (%s) is in server_ips(%s)" % (ipnmap, server_ips) ) continue #print "ping to %s" %(ip) if self.main.worker.is_stoped(): print_debug("ping_iprange_nmap() WORKER is stoped") # this is a stop thread var break ########## self.main.common.threads_enter("Ping:ping_iprange_nmap show progress") self.main.progressbar.show() self.main.progressbutton.show() self.main.actions.set_progressbar( _("Checking %s...")%(ipnmap), float(i)/len(pinglist) ) #print_debug("ping_iprange() ip=%s"%(ip)) self.main.common.threads_leave("Ping:ping_iprange_nmap show progress") ############ # check for notshowwhentcosmonitor if self.main.config.GetVar("notshowwhentcosmonitor") == 1: # if $DISPLAY = xx.xx.xx.xx:0 remove from allclients if inhosttcos == ipnmap: # running tcosmonitor on thin client continue # only show in list hosts running tcosxmlrpc in 8998 or 8999 port if self.main.config.GetVar("onlyshowtcos") == 1: self.main.common.threads_enter("Ping:only show tcos") self.main.write_into_statusbar( _("Testing if found clients have 8998 or 8999 port open...")) self.main.common.threads_leave("Ping:only show tcos") # view status of port 8998 or 8999 if self.main.xmlrpc.newhost(ipnmap): if self.main.xmlrpc.GetVersion(): print_debug("ping_iprange() host=%s ports 8998 or 8999 OPEN" %(ipnmap)) reachip.append(ipnmap) else: print_debug("ping_iprange() host=%s ports 8998 or 8999 OPEN but not tcosxmlrpc" %(ipnmap)) else: print_debug("ping_iprange() host=%s ports 8998 or 8999 closed" %(ipnmap)) else: reachip.append(ipnmap) print_debug("ping_iprange_nmap() discovered host finished" ) self.main.worker.set_finished() if len(reachip) == 0: self.main.common.threads_enter("Ping:ping_iprange_nmap print no hosts") self.main.write_into_statusbar ( _("Not connected hosts found.") ) self.main.progressbar.hide() self.main.progressbutton.hide() self.main.common.threads_leave("Ping:ping_iprange_nmap print no hosts") if len(reachip) > 0: self.main.common.threads_enter("Ping:ping_iprange_nmap print num hosts") self.main.actions.lenclients=len(reachip) self.main.write_into_statusbar ( _("Found %d hosts" ) %len(reachip) ) self.main.common.threads_leave("Ping:ping_iprange_nmap print num hosts") self.main.localdata.allclients=reachip self.main.worker=tcosmonitor.shared.Workers( self.main,\ target=self.main.actions.populate_hostlist, \ args=([reachip]) ) self.main.worker.start() return reachip def ping_iprange(self, selfip): print_debug("ping_iprange() ip=%s"%selfip) pinglist=[] reachip=[] server_ips=self.get_server_ips() for i in range(1, 255): iprange=selfip.split(".")[:-1] ip=".".join(iprange)+"."+str(i) # don't show server in list if ip in server_ips: print_debug("Ping:: ip (%s) is in server_ips(%s)" % (ip, server_ips) ) continue #print "ping to %s" %(ip) if self.main.worker.is_stoped(): print_debug("ping_iprange() WORKER is stoped") # this is a stop thread var break ########## self.main.common.threads_enter("Ping:ping_iprange show progress") self.main.progressbar.show() self.main.progressbutton.show() self.main.actions.set_progressbar( _("Ping to %s...")%(ip), float(i)/float(254) ) #print_debug("ping_iprange() ip=%s"%(ip)) self.main.common.threads_leave("Ping:ping_iprange show progress") ############ current = pingip(ip) try: # in some situations ( I can reproduce ) thread can't be started # don't fail and only wait if thread start ok current.start() pinglist.append(current) except Exception, err: print_debug("ping thread Exception ip=%s err=%s"%(ip, err)) self.main.common.threads_enter("Ping:ping_iprange print waiting") self.main.actions.set_progressbar( _("Waiting for pings...") , float(1) ) self.main.common.threads_leave("Ping:ping_iprange print waiting") try: inhosttcos=str(tcosmonitor.shared.parseIPAddress(os.environ["DISPLAY"])) # running tcosmonitor on thin client ? except Exception, err: print_debug("ping_iprange_nmap() can't read DISPLAY, %s"%err) for pingle in pinglist: pingle.join() if pingle.status == 2: # check for notshowwhentcosmonitor if self.main.config.GetVar("notshowwhentcosmonitor") == 1: # if $DISPLAY = xx.xx.xx.xx:0 remove from allclients if inhosttcos == pingle.ip: # running tcosmonitor on thin client continue # only show in list hosts running tcosxmlrpc in 8998 or 8999 port if self.main.config.GetVar("onlyshowtcos") == 1: self.main.common.threads_enter("Ping:only show tcos") self.main.write_into_statusbar( _("Testing if found clients have 8998 or 8999 port open...")) self.main.common.threads_leave("Ping:only show tcos") # view status of port 8998 or 8999 if self.main.xmlrpc.newhost(pingle.ip): if self.main.xmlrpc.GetVersion(): print_debug("ping_iprange() host=%s ports 8998 or 8999 OPEN" %(pingle.ip)) reachip.append(pingle.ip) else: print_debug("ping_iprange() host=%s ports 8998 or 8999 OPEN but not tcosxmlrpc" %(pingle.ip)) else: print_debug("ping_iprange() host=%s ports 8998 or 8999 closed" %(pingle.ip)) else: reachip.append(pingle.ip) print_debug("ping_iprange() discovered host finished" ) self.main.worker.set_finished() if len(reachip) == 0: self.main.common.threads_enter("Ping:ping_iprange print no hosts") self.main.write_into_statusbar ( _("Not connected hosts found.") ) self.main.progressbar.hide() self.main.progressbutton.hide() self.main.common.threads_leave("Ping:ping_iprange print no hosts") if len(reachip) > 0: self.main.common.threads_enter("Ping:ping_iprange print num hosts") self.main.actions.lenclients=len(reachip) self.main.write_into_statusbar ( _("Found %d hosts" ) %len(reachip) ) self.main.common.threads_leave("Ping:ping_iprange print num hosts") self.main.localdata.allclients=reachip self.main.worker=tcosmonitor.shared.Workers( self.main,\ target=self.main.actions.populate_hostlist, \ args=([reachip]) ) self.main.worker.start() return reachip def ping_iprange_static(self, allclients): print_debug("ping_iprange_static() ip=%s"%allclients) pinglist=[] reachip=[] for ip in allclients: #print "ping to %s" %(ip) if self.main.worker.is_stoped(): print_debug("ping_iprange() WORKER is stoped") # this is a stop thread var break current = pingip(ip) pinglist.append(current) current.start() for pingle in pinglist: pingle.join() if pingle.status == 2: # only show in list hosts running tcosxmlrpc in 8998 or 8999 port if self.main.config.GetVar("onlyshowtcos") == 1: self.main.common.threads_enter("Ping:only show tcos") self.main.write_into_statusbar( _("Testing if found clients have 8998 or 8999 port open...")) self.main.common.threads_leave("Ping:only show tcos") # view status of port 8998 or 8999 if self.main.xmlrpc.newhost(pingle.ip): if self.main.xmlrpc.GetVersion(): print_debug("ping_iprange() host=%s ports 8998 or 8999 OPEN" %(pingle.ip)) reachip.append(pingle.ip) else: print_debug("ping_iprange() host=%s ports 8998 or 8999 OPEN but not tcosxmlrpc" %(pingle.ip)) else: print_debug("ping_iprange() host=%s ports 8998 or 8999 closed" %(pingle.ip)) else: reachip.append(pingle.ip) print_debug("ping_iprange_static() discovered host finished" ) self.main.worker.set_finished() self.main.localdata.allclients=reachip if len(reachip) == 0: self.main.common.threads_enter("Ping:ping_iprange_static print no hosts") self.main.write_into_statusbar ( _("Not connected hosts found.") ) self.main.common.threads_leave("Ping:ping_iprange_static print no hosts") if len(reachip) > 0: self.main.common.threads_enter("Ping:ping_iprange_static print num hosts") self.main.write_into_statusbar ( _("Found %d hosts" ) %len(reachip) ) self.main.common.threads_leave("Ping:ping_iprange_static print num hosts") self.main.worker=tcosmonitor.shared.Workers( self.main,\ target=self.main.actions.populate_hostlist, \ args=([reachip]) ) self.main.worker.start() return reachip def get_ip_address(self, ifname): print_debug("get_ip_address() ifname=%s" %(ifname) ) if not ifname in netifaces.interfaces(): return None ip=netifaces.ifaddresses(ifname) if ip.has_key(netifaces.AF_INET): return ip[netifaces.AF_INET][0]['addr'] return None def get_net_address(self, ifname): print_debug("get_net_address() ifname=%s" %(ifname) ) if not ifname in netifaces.interfaces(): return None ip=netifaces.ifaddresses(ifname) if ip.has_key(netifaces.AF_INET): address="%s" %ip[netifaces.AF_INET][0]['addr'] mask="%s" %ip[netifaces.AF_INET][0]['netmask'] net="%s" %IPy.IP(address).make_net(mask) print_debug("net=%s" %net) return net return None def get_server_ips(self): IPS=[] for dev in netifaces.interfaces(): if not dev in tcosmonitor.shared.hidden_network_ifaces: print_debug("get_server_ips() add interface %s"%dev) ip=netifaces.ifaddresses(dev) if ip.has_key(netifaces.AF_INET): ip[netifaces.AF_INET][0]['gateway']=self.get_gateway(dev) print_debug("get_server_ips() iface=%s data=%s"%(dev, ip[netifaces.AF_INET] )) IPS.append(ip[netifaces.AF_INET][0]['addr']) return IPS def get_gateway(self, iface): data=[] f=open("/proc/net/route", 'r') for l in f.readlines(): if l.startswith(iface): tmp=l.strip().split() if tmp[1] == "00000000": data.append(self.__hex2dec__(tmp[2])) f.close() if len(data) < 1: #print ("WARNING: no gateway") return None else: return data[0] def __hex2dec__(self, s): out=[] for i in range(len(s)/2): out.append( str(int(s[i*2:(i*2)+2], 16)) ) # data in /proc/net/route is reversed out.reverse() return ".".join(out) class PingPort: """ try to open a socket to host:ip """ def __init__(self, host, port, timeout=1): self.host=host self.port=int(port) print_debug("PingPort() host=%s port=%d" %(host, self.port) ) if self.host == "": print_debug ( "PingPort() need host to connect" ) self.status = "CLOSED" return self.status=None socket.setdefaulttimeout(timeout) self.sd = socket.socket(socket.AF_INET, socket.SOCK_STREAM) print_debug( "PingPort()::__init__(host=%s, port=%d timeout=%f)" %(self.host, self.port, timeout) ) try: # connect to the given host:port self.sd.connect((self.host, self.port)) except socket.error: # set the CLOSED flag self.status = "CLOSED" else: self.status = "OPEN" self.sd.close() socket.setdefaulttimeout(timeout) def get_status(self): """ return socket status values: OPEN CLOSED """ print_debug ( "%s:%s port is \"%s\"" %(self.host, self.port, self.status) ) socket.setdefaulttimeout(tcosmonitor.shared.socket_default_timeout) return self.status if __name__ == '__main__': tcosmonitor.shared.debug=True #for i in range(20): # PingPort("192.168.0.3", i+100).get_status() #PingPort("192.168.0.5", 6000, 0.5).get_status() #PingPort("192.168.0.1", 6000, 0.5).get_status() #PingPort(sys.argv[1], sys.argv[2], 0.5).get_status() app=Ping(None) print ( app.get_server_ips() ) print ( app.get_ip_address('eth0') ) print ( app.get_ip_address('br0') ) tcosmonitor/tcosmonitor/Avahi.py0000664000000000000000000001427612260544373014330 0ustar # -*- coding: UTF-8 -*- # TcosMonitor version __VERSION__ # # Copyright (c) 2006-2011 Mario Izquierdo # # This package is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # # This package is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. import dbus import gobject import avahi import avahi.ServiceTypeDatabase import time from dbus import DBusException from dbus.mainloop.glib import DBusGMainLoop from pprint import pprint __all__ = ['ZeroconfService', 'AvahiDiscover'] class AvahiDiscover(object): def __init__(self, discover_types=['_workstation._tcp'], default_service_name='tcosxmlrpc', loop=None): self.services={} self.default_service_name=default_service_name if loop: self.loop else: self.loop = DBusGMainLoop() self.bus = dbus.SystemBus(mainloop=self.loop) self.server = dbus.Interface( self.bus.get_object(avahi.DBUS_NAME, '/'), 'org.freedesktop.Avahi.Server') if len(discover_types)> 0: for srv in discover_types: self.add_service(srv) else: for srv in avahi.ServiceTypeDatabase.ServiceTypeDatabase().items(): self.add_service(srv[0]) def add_service(self, stype): print "add_service() stype=%s"%stype sbrowser = dbus.Interface(self.bus.get_object(avahi.DBUS_NAME, self.server.ServiceBrowserNew(avahi.IF_UNSPEC, avahi.PROTO_INET, stype, 'local', dbus.UInt32(0))), avahi.DBUS_INTERFACE_SERVICE_BROWSER) sbrowser.connect_to_signal("ItemNew", self.new_service) sbrowser.connect_to_signal('ItemRemove', self.remove_service) def mainLoop(self): gobject.MainLoop().run() def new_service(self, interface, protocol, name, stype, domain, flags): if flags & avahi.LOOKUP_RESULT_LOCAL: # local service, skip return self.server.ResolveService(interface, protocol, name, stype, domain, avahi.PROTO_INET, dbus.UInt32(0), reply_handler=self.service_resolved, error_handler=self.print_error) def remove_service(self, interface, protocol, name, stype, domain, flags): if self.services.has_key(str(name)): self.services.pop(str(name)) self.callback() print "------------------------------------------------------------" pprint(self.services) print "------------------------------------------------------------" def service_resolved(self, *args): service_name=str(args[2]) if self.default_service_name and not service_name.startswith(self.default_service_name): return name = args[5].split('.')[0] ip = args[7] port = args[8] txt = args[9] #print "NEW hostname=%s ip=%s port=%s TXT=%s"%(name, ip, port, avahi.txt_array_to_string_array(txt)) self.services[str(args[2])]={'port':int(port), 'ip': str(ip), 'hostname':str(name), 'txt':avahi.txt_array_to_string_array(txt), 'service_type':str(args[3]), 'service_name':str(args[2])} print "------------------------------------------------------------" pprint(self.services) print "------------------------------------------------------------" self.callback() def print_error(self, *args): print 'error_handler' print args def getConnectedIP(self): ips=[] for srv in self.services: ips.append(self.services[srv]['ip']) return ips def callback(self): pass def get_all_ips(self): allips=[] for srv in self.services: allips.append(self.services[srv]['ip']) return allips class ZeroconfService: """A simple class to publish a network service with zeroconf using avahi. Example: from ZeroconfService import ZeroconfService import time service = ZeroconfService(name="Joe's awesome FTP server", port=3000, stype="_ftp._tcp") service.publish() time.sleep(10) service.unpublish() """ def __init__(self, name, port, stype="_http._tcp", domain="", host="", text=""): self.name = name self.stype = stype self.domain = domain self.host = host self.port = port self.text = text def publish(self): bus = dbus.SystemBus() server = dbus.Interface( bus.get_object( avahi.DBUS_NAME, avahi.DBUS_PATH_SERVER), avahi.DBUS_INTERFACE_SERVER) g = dbus.Interface( bus.get_object(avahi.DBUS_NAME, server.EntryGroupNew()), avahi.DBUS_INTERFACE_ENTRY_GROUP) g.AddService(avahi.IF_UNSPEC, avahi.PROTO_UNSPEC,dbus.UInt32(0), self.name, self.stype, self.domain, self.host, dbus.UInt16(self.port), self.text) g.Commit() self.group = g def unpublish(self): self.group.Reset() if __name__ == "__main__": #app=AvahiDiscover('_http._tcp', 'tcosxmlrpc') app=AvahiDiscover( ['_workstation._tcp', '_http._tcp'] , 'tcos') app.mainLoop() tcosmonitor/tcosmonitor/TcosExtensions.py0000664000000000000000000004173312260544373016266 0ustar # -*- coding: UTF-8 -*- # TcosMonitor version __VERSION__ # # Copyright (c) 2006-2011 Mario Izquierdo # # This package is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # # This package is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. import tcosmonitor.shared import os import sys import exceptions from gettext import gettext as _ import gtk import socket def print_debug(txt): if tcosmonitor.shared.debug: print >> sys.stderr, "%s::%s" % (__name__, txt) #print("%s::%s" % (__name__, txt), file=sys.stderr) class Error(exceptions.Exception): def __init__(self, msg): self.msg = msg def __str__(self): tcosmonitor.shared.error_msg( _("Exception:") + "\n" + "="*40 + "\n\nError:\n" + self.msg ) return "" % self.msg __repr__ = __str__ def __call__(self): return (self.msg,) class TcosExtension(object): def __init__(self, main): #print_debug("__init__()") if not main: raise Error, "self.main not defined" self.main=main self.preferences={} def register(self): raise Error, "TcosExtension register() not defined" def get_client(self): if self.main.iconview.isactive(): self.main.selected_ip=self.main.iconview.get_selected() self.main.selected_host=self.main.iconview.get_host(self.main.selected_ip) elif self.main.classview.isactive(): self.main.selected_ip=self.main.classview.get_selected() self.main.selected_host=self.main.classview.get_host(self.main.selected_ip) else: self.main.selected_ip=self.main.listview.get_selected() self.main.selected_host=self.main.listview.get_host(self.main.selected_ip) if self.main.force_selected_ip != None: self.main.selected_ip=self.main.force_selected_ip self.main.force_selected_ip=None if not self.main.selected_ip: # show a msg tcosmonitor.shared.error_msg ( _("Error: no IP!") ) return False self.connected_users=[] self.connected_users_txt="" self.connected_users_txt_all="" self.newallclients=[] self.allclients_logged=[] self.main.localdata.newhost(self.main.selected_ip) self.main.xmlrpc.newhost(self.main.selected_ip) self.client_type = self.main.xmlrpc.ReadInfo("get_client") self.host=self.main.localdata.GetHostname(self.main.selected_ip) counter=1 counter_all=1 if self.main.localdata.IsLogged(self.main.selected_ip): username=self.main.localdata.GetUsernameAndHost(self.main.selected_ip) if username.find(":") != -1: usern, ip = username.split(":") self.connected_users_txt+="%s, " %(usern) self.connected_users_txt_all+="%s, " %(usern) else: self.connected_users_txt+="%s, " %(username) self.connected_users_txt_all+="%s, " %(username) self.connected_users.append(username) if counter % 4 == 0: self.connected_users_txt+="\n" if counter_all % 4 == 0: self.connected_users_txt_all+="\n" counter=int(counter+1) counter_all=int(counter_all+1) self.newallclients.append(self.main.selected_ip) self.allclients_logged.append(self.main.selected_ip) elif not self.main.xmlrpc.IsStandalone(self.main.selected_ip): self.allclients_logged.append(self.main.selected_ip) self.connected_users_txt_all+="%s, " %(self.main.selected_ip) if counter_all % 4 == 0: self.connected_users_txt_all+="\n" counter_all=int(counter_all+1) else: self.connected_users_txt_all+="%s, " %(self.main.selected_ip) if counter_all % 4 == 0: self.connected_users_txt_all+="\n" counter_all=int(counter_all+1) if self.connected_users_txt[-2:] == "\n": self.connected_users_txt=self.connected_users_txt[:-2] if self.connected_users_txt[-2:] == ", ": self.connected_users_txt=self.connected_users_txt[:-2] if self.connected_users_txt_all[-2:] == "\n": self.connected_users_txt_all=self.connected_users_txt_all[:-2] if self.connected_users_txt_all[-2:] == ", ": self.connected_users_txt_all=self.connected_users_txt_all[:-2] print_debug("get_clients() self.main.selected_ip=%s self.main.selected_host=%s"%(self.main.selected_ip, self.main.selected_host) ) return True #if not self.doaction_onthisclient(action, self.main.selected_ip): # # show a msg # tcosmonitor.shared.info_msg ( _("Can't exec this action because you are connected at this host!") ) # return ######################################################################################## def get_all_clients(self): # don't make actions in clients not selected if self.main.iconview.ismultiple(): allclients=self.main.iconview.get_multiple() elif self.main.classview.ismultiple(): allclients=self.main.classview.get_multiple() elif self.main.listview.isactive() and self.main.config.GetVar("selectedhosts") == 1: allclients=self.main.listview.getmultiple() if len(allclients) == 0: allclients=self.main.localdata.allclients else: # get all clients connected allclients=self.main.localdata.allclients if len(allclients) == 0: tcosmonitor.shared.info_msg ( _("No clients connected, press refresh button.") ) return False self.allclients=allclients self.connected_users=[] self.connected_users_txt="" self.connected_users_txt_all="" self.allclients_txt="" self.newallclients=[] self.newallclients_txt="" self.allclients_logged=[] self.allclients_logged_txt="" counter=1 counter_all=1 for client in allclients: self.allclients_txt+="\n %s" %(client) self.main.localdata.newhost(client) if self.main.localdata.IsLogged(client): username=self.main.localdata.GetUsernameAndHost(client) if username.find(":") != -1: usern, ip = username.split(":") self.connected_users_txt+="%s, " %(usern) self.connected_users_txt_all+="%s, " %(usern) else: self.connected_users_txt+="%s, " %(username) self.connected_users_txt_all+="%s, " %(username) self.connected_users.append(username) if counter % 4 == 0: self.connected_users_txt+="\n" if counter_all % 4 == 0: self.connected_users_txt_all+="\n" counter=int(counter+1) counter_all=int(counter_all+1) self.newallclients.append(client) self.newallclients_txt+="\n %s" %(client) self.allclients_logged.append(client) self.allclients_logged_txt+="\n %s" %(client) elif not self.main.xmlrpc.IsStandalone(client): self.allclients_logged.append(client) self.allclients_logged_txt+="\n %s" %(client) self.connected_users_txt_all+="%s, " %(client) if counter_all % 4 == 0: self.connected_users_txt_all+="\n" counter_all=int(counter_all+1) else: self.connected_users_txt_all+="%s, " %(client) if counter_all % 4 == 0: self.connected_users_txt_all+="\n" counter_all=int(counter_all+1) if self.connected_users_txt[-2:] == "\n": self.connected_users_txt=self.connected_users_txt[:-2] if self.connected_users_txt[-2:] == ", ": self.connected_users_txt=self.connected_users_txt[:-2] if self.connected_users_txt_all[-2:] == "\n": self.connected_users_txt_all=self.connected_users_txt_all[:-2] if self.connected_users_txt_all[-2:] == ", ": self.connected_users_txt_all=self.connected_users_txt_all[:-2] return True ######################################################################################## def doaction_onthisclient(self, action, ip): # return True if an exec action # return False if can not # get $DISPLAY host=str(tcosmonitor.shared.parseIPAddress(os.environ["DISPLAY"])) if host == "": return True print_debug("doaction_onthisclient() host=%s ip=%s action=%s filteraction=%s" % \ (host, ip, action, action.split(' ')[0]) ) # convert to IP host=socket.gethostbyname(host) print_debug("doaction_onthisclient() comparing %s <=> %s" % \ (host, socket.gethostbyname(host) ) ) if int(self.main.config.GetVar("blockactioninthishost")) == 1 and \ host == socket.gethostbyname(ip): print_debug("doaction_onthisclient() ALERT !!! searching for dangerous actions") # dangerous actions if action.split(' ')[0] in ["poweroff", "reboot", "lockscreen", "restartx", "down-controller"]: print_debug("doaction_onthisclient() returning FALSE") return False print_debug("doaction_onthisclient() no dangerous action") print_debug("doaction_onthisclient() no host match") return True def action_for_clients(self, allclients, action): if not allclients or len(allclients) < 1: return print_debug("action_for_clients() allclients='%s' action='%s'"%(allclients, action)) self.main.common.threads_enter("TcosActions::action_for_clients cleaning") self.start_action() self.main.progressbar.show() self.main.common.threads_leave("TcosActions::action_for_clients cleaning") for ip in allclients: if not self.doaction_onthisclient(action, ip): # show a msg print_debug( _("Can't exec this action at '%s' because you are connected at this host!") %ip ) self.main.common.threads_enter("TcosActions::action_for_clients doing action") self.main.write_into_statusbar( _("Can't exec this action at '%s' because you are connected at this host!") %ip ) self.main.common.threads_leave("TcosActions::action_for_clients doing action") continue percent=float( allclients.index(ip)/len(allclients) ) print_debug ( "doing %s in %s, percent complete=%f"\ %(action, ip, percent) ) mydict={} mydict["action"]=action mydict["ip"]=ip self.main.common.threads_enter("TcosActions::action_for_clients doing action") self.main.actions.set_progressbar( _("Doing action \"%(action)s\" in %(ip)s...") %mydict , percent ) self.main.common.threads_leave("TcosActions::action_for_clients doing action") if not self.main.xmlrpc.connected: print_debug("action_for_clients() xmlrpc not connected") continue try: # call new IP self.main.xmlrpc.newhost(ip) # overwrite real_action in your extension self.real_action(ip, action) ######################################## except Exception, err: print_debug ( "action_for_clients() error while exec '%s' in %s error: %s" %(action, ip, err) ) self.main.common.threads_enter("TcosActions::action_for_clients END client") self.main.actions.set_progressbar( _("Done action \"%(action)s\" in %(ip)s") %mydict , 1 ) self.main.common.threads_leave("TcosActions::action_for_clients END") #sleep(tcosmonitor.shared.wait_between_many_host) self.main.common.threads_enter("TcosActions::action_for_clients END all") self.finish_action() self.main.progressbar.hide() self.main.common.threads_leave("TcosActions::action_for_clients END all") return def change_lockscreen(self, ip): """ change lockscreen icon status=True icon=locked.png status=False icon=unlocked.png """ #self.main.localdata.newhost(ip) status_net=self.main.localdata.IsBlockedNet(ip) status_screen=self.main.localdata.IsBlocked(ip) status_dpms=self.main.xmlrpc.dpms('status', ip) print_debug ( "change_lockscreen(%s)=(LOCK)%s,(NET)%s,(DPMS)%s" %(ip, status_screen, status_net, status_dpms) ) locked_image = gtk.gdk.pixbuf_new_from_file(tcosmonitor.shared.IMG_DIR + 'locked.png') locked_net_image = gtk.gdk.pixbuf_new_from_file(tcosmonitor.shared.IMG_DIR + 'locked_net.png') locked_net_screen_image = gtk.gdk.pixbuf_new_from_file(tcosmonitor.shared.IMG_DIR + 'locked_net_screen.png') unlocked_image = gtk.gdk.pixbuf_new_from_file(tcosmonitor.shared.IMG_DIR + 'unlocked.png') dpms_off_image = gtk.gdk.pixbuf_new_from_file(tcosmonitor.shared.IMG_DIR + 'menu_dpms_off.png') dpms_on_image = gtk.gdk.pixbuf_new_from_file(tcosmonitor.shared.IMG_DIR + 'menu_dpms_on.png') if status_dpms == 'Off': image=dpms_off_image elif status_screen and status_net: image=locked_net_screen_image elif status_screen == False and status_net: image=locked_net_image #elif status_screen == False and status_net == False and status_dpms == 'On': # image=dpms_on_image elif status_screen and status_net == False: image=locked_image else: image=unlocked_image if self.main.classview.isactive(): self.main.classview.change_lockscreen(ip, image, status_screen, status_net) if self.main.iconview.isactive(): self.main.iconview.change_lockscreen(ip, image, status_screen, status_net) if self.main.listview.isactive(): self.main.listview.change_lockscreen(ip, image) def add_progressbox(self, args, text): print_debug("add_progressbox() args=%s, text=%s" %(args, text)) table=gtk.Table(2, 2, False) table.show() button=gtk.Button(_("Stop")) image = gtk.Image() image.set_from_stock (gtk.STOCK_STOP, gtk.ICON_SIZE_BUTTON) button.set_image(image) button.connect('clicked', self.on_progressbox_click, args, table) button.show() label=gtk.Label( text ) label.show() table.attach(button, 0, 1, 0, 1, False, False, 0, 0) table.attach(label, 1, 2, 0, 1 ) self.main.progressbox.add(table) self.main.progressbox.show() self.main.stop_running_actions.append(button) print_debug("add_progressbox() widget=%s" %(button)) def on_progressbox_click(self, widget, args, box): #def on_progressbox_click(self, *args): raise Error, "TcosExtension on_progressbox_click() not defined" def real_action(self, ip, action): #def real_action(self, *args): raise Error, "TcosExtension real_action() not defined" def start_action(self, *args): print_debug("start_action() not defined") def finish_action(self, *args): print_debug("finish_action() not defined") class TcosExtLoader(object): def __init__(self, main): self.main=main self.extensions=None import tcosmonitor.extensions as __ext__ self.extensions=__ext__ #print_debug ("TcosExtLoader::__init__()%s" %self.extensions ) for _ext in self.extensions.__all__: obj=getattr( self.extensions, _ext ) if hasattr(obj, "__extclass__"): print_debug( "TcosExtLoader::__init__() registering extension %s"%_ext ) tmp=obj.__extclass__(self.main) tmp.register() else: raise Error, "Extension '%s' don't have defined __extclass__ attribute" % _ext return if __name__ == '__main__': tcosmonitor.shared.debug=True app=TcosExtLoader(None) tcosmonitor/tcosmonitor/TcosTrayIcon2.py0000664000000000000000000003220512260544373015733 0ustar # -*- coding: UTF-8 -*- # TcosMonitor version __VERSION__ # # Copyright (c) 2006-2011 Mario Izquierdo # # This package is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # # This package is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. import gtk import os import sys from gettext import gettext as _ from time import time import gobject import tcosmonitor.shared def print_debug(txt): if tcosmonitor.shared.debug: print >> sys.stderr, "[%d] %s::%s" % (os.getpid(), __name__, txt) #print("[%d] %s::%s" % (os.getpid(), __name__, txt), file=sys.stderr) def crono(start, txt): print_debug ("crono(), %s get %f seconds" %(txt, (time() - start)) ) return class TcosTrayIcon(object): def __init__(self, disable_quit=True, allow_reboot_poweroff=True): self.actions={} self.args={} self.first_time=True self.menu=gtk.Menu() if not disable_quit: self.items={ "quit": [_("Quit"), "menu_kill.png", True, None, None, False] } else: self.items={} if allow_reboot_poweroff: self.items["reboot"]=[_("Reboot"), "menu_reboot.png", True, None, None, False] self.items["poweroff"]=[_("Poweroff"), "menu_poweroff.png", True, None, None, False] self.InitStatusIcon() self.InitMenu() def InitStatusIcon(self): self.statusIcon = gtk.status_icon_new_from_file(tcosmonitor.shared.IMG_DIR + "tcos-devices-32x32.png") self.statusIcon.set_tooltip( _("Tcos Devices") ) # locale support import gettext gettext.bindtextdomain(tcosmonitor.shared.PACKAGE, tcosmonitor.shared.LOCALE_DIR) gettext.textdomain(tcosmonitor.shared.PACKAGE) self.ui = gtk.Builder() self.ui.set_translation_domain(tcosmonitor.shared.PACKAGE) self.ui.add_from_file(tcosmonitor.shared.GLADE_DIR + 'tray.ui') self.window = self.ui.get_object('popup') self.hide_button = self.ui.get_object("hide_button") self.hide_button.connect("clicked", self.close_popup) self.statusIcon.connect('popup-menu', self.popup_window) self.statusIcon.connect('activate', self.popup_window) self.devbox=self.ui.get_object("devbox") self.window = self.ui.get_object('popup') def InitMenu(self): #print_debug (" ##### InitMenu() ######") # clean devbox self.devbox=self.ui.get_object("devbox") self.devbox.foreach( lambda(widget): widget.destroy() ) # sort items _sorted=self.items.keys() _sorted.sort() for m in _sorted: if m not in ["poweroff", "reboot", "quit"]: self.append_item(self.items[m], m) for extra in ["poweroff", "reboot", "quit"]: # add quit, reboot and poweroff menus at bottom if self.items.has_key(extra): self.append_item(self.items[extra], extra ) def append_item(self, item, title): #print_debug("append_item() title=%s item=%s" %(title,item) ) #return # need a table with 3 columns # # #################################### # # # # # # # Icon # Device info # Button # # # # # # # #################################### # table=gtk.Table(1, 3, False) table.set_col_spacings(5) status=self.items[title][5] #if title not in ['reboot', 'poweroff', 'quit']: # print " title %s status=%s"%(title, status) ####################################### icon = gtk.Image() if item[1] != None: icon_file_found=True icon_file=tcosmonitor.shared.IMG_DIR + item[1] if not os.path.isfile(icon_file): icon_file_found=False if title not in ['reboot', 'poweroff', 'quit'] and icon_file_found: # we have icon icon.set_from_file(icon_file) icon.set_sensitive(status) icon.show() #table.attach(icon, 0, 1, 0, 1, gtk.FILL, False, 0, 0) table.attach(icon, 0, 1, 0, 1, gtk.FILL) ######################################## label=gtk.Label() label.set_use_markup(True) label.set_alignment(0, 0.5) label.set_justify(gtk.JUSTIFY_LEFT) if title not in ['reboot', 'poweroff', 'quit']: if "floppy" in title: devtype=_("Floppy: %s") %item[4] elif "cdrom" in title: devtype=_("CDROM: %s") %item[4] elif "usb" in title: devtype=_("USB: %s") %item[4] elif "hdd" in title: devtype=_("HDD partition: %s") %item[4] else: devtype=_("Unknow: %s") %item[4] # have device description??? if item[6] is not None and item[6] != "unknow": devdesc=item[6] else: devdesc=item[0] label.set_markup( "%s\n%s" %(devtype, devdesc) ) label.set_sensitive(status) else: label.set_markup("%s"%item[0]) label.show() #table.attach(label, 1, 2, 0, 1, gtk.EXPAND, False, 0, 0) table.attach(label, 1, 2, 0, 1, gtk.EXPAND) ########## BUTTON ######## button_image=gtk.Image() button=gtk.Button() button.set_sensitive(True) if title in ['reboot', 'poweroff', 'quit']: button_image.set_from_file(icon_file) #button.set_sensitive(True) else: button_image.set_from_file(tcosmonitor.shared.IMG_DIR + "eject.png") #button.set_sensitive(False) button.set_image(button_image) button.connect("clicked", self.do_action, title, item) button.show() #table.attach(button, 2, 3, 0, 1, gtk.FILL, False, 0, 0) table.attach(button, 2, 3, 0, 1, gtk.FILL) table.show() self.devbox.add(table) # add separator separator=gtk.HSeparator() self.devbox.add(separator) def close_popup(self, *args): #print_debug( "close_popup() args=%s" %str(args) ) gobject.timeout_add(100, self.window.hide) def popup_window(self, *args): #print_debug("popup_window() args=%s" %str(args)) # get popup size winx, winy = self.window.size_request() # get window size width=gtk.gdk.screen_width() height=gtk.gdk.screen_height() # get trayicon position a, rect, c = self.statusIcon.get_geometry() # new pos if rect.x + winx > width: #print( "rect.x=%s + winx=%s GREATER with=%s" %(rect.x, winx, width) ) newx=abs(width-winx) else: #print( "rect.x=%s + winx=%s LOWER with=%s" %(rect.x, winx, width) ) newx=rect.x if rect.y + winy > height: #print( "rect.y=%s + winy=%s GREATER que height=%s" %(rect.y, winy, height) ) newy=abs( height-winy-(self.statusIcon.get_size()) -5 ) else: #print( "rect.y=%s + winy=%s LOWER que height=%s" %(rect.y, winy, height) ) newy=abs( rect.y-(self.statusIcon.get_size()) ) # move self.window.move( newx, newy ) #print "newx=%s newy=%s"%(newx, newy) # ugly hack to avoid wrong height if self.first_time: #self.window.show() #self.window.hide() self.first_time=False self.popup_window() gobject.timeout_add(100, self.window.show) #self.window.show() def update_status(self, device, actions, status): print_debug ("update_status() device=%s of %s to %s" %(device, actions, status)) if self.items.has_key(device): if "_mount" in actions and status: #print " action UMOUNTING..." # if xxx_mount is True device is umounted self.items[device][5]=False if "_umount" in actions and status: #print " action MOUNTING..." self.items[device][5]=True #print " STATUS of %s is %s" %(device, status) self.items["%s"%device][3]["%s"%actions][2]=status #self.InitMenu() gobject.timeout_add(100, self.InitMenu) else: print_debug( " WW: no updating status of %s"%(actions) ) def register_action(self, action, function, *args): #print_debug("register_action() action=%s function=%s, args=%s" %(action, function, args) ) self.actions["%s" %action]=function self.args["%s" %action]=args #self.InitMenu() return def unregister_action(self, action): self.actions.pop(action) #self.InitMenu() return def register_device(self, device, devname, devimage, show, actions, devid, devdesc=None): if devdesc is not None: devdesc=devdesc.replace('_', ' ').replace('|', '') print_debug("register_device() device='%s' devname='%s' devimage='%s' show='%s' actions='%s' devid='%s' devdesc='%s'" %(device, devname, devimage, show, actions, devid, devdesc) ) self.items["%s"%(device)]=[ devname, devimage, show, actions, devid, False, devdesc] self.InitMenu() #print self.items["%s"%(device)] def unregister_device(self, device): print_debug("unregister_device() device=%s" %(device) ) if self.items.has_key(device): self.items.pop(device) else: print "WARNING: device %s not found" % device def do_action(self, widget, name, item=None): print_debug ("do_action() widget=%s name=%s" %(widget, name) ) if self.actions.has_key(name): #print_debug("do_action() function=%s args=%s" %(self.actions[name], self.args[name]) ) self.actions[name](self.args[name]) else: if item: #print self.items[name][5] if self.items[name][5]: # mounted => umount #print "umount" key="%s_umount" %name else: #print "mount" key="%s_mount" %name if self.actions.has_key(key): self.actions[key](self.args[key]) else: print "TcosTrayIcon WARNING: no menu action set for \"%s\" event" % (name) return if __name__ == "__main__": def myprint(*args): print "MYPRINT %s" % args tcosmonitor.shared.debug=True def change(*args): systray.status = not systray.status systray.update_status("usb1", "usb1_mount", systray.status) systray.update_status("usb1", "usb1_umount", not systray.status) systray=TcosTrayIcon(disable_quit=False) systray.status=True systray.update_status("cdrom1", "cdrom1_mount", False) systray.update_status("cdrom1", "cdrom1_umount", False) #systray.register_action("quit", lambda w: gtk.main_quit() ) systray.register_action("quit", change ) systray.register_action("cdrom1_mount", myprint ) systray.register_action("cdrom1_umount", myprint ) systray.register_device("usb1", _("Usb flash"), "floppy_mount.png", True, { "usb1_mount":[ _("Mount USB1"), "floppy_mount.png", False, None, "/dev/sda1"], "usb1_umount":[ _("Umount USB1"), "floppy_umount.png", False, None, "/dev/sda1"], }, "/dev/sda1" ) def usb(action): print "ACTION usb, action=%s" % action if action == "umount": print "desmontando....." systray.update_status("usb1", "usb1_mount", True) systray.update_status("usb1", "usb1_umount", False) print "................... desmontado" else: print "montando........" systray.update_status("usb1", "usb1_mount", False) systray.update_status("usb1", "usb1_umount", True) print ".................... montado" systray.update_status("usb1", "usb1_mount", True) systray.update_status("usb1", "usb1_umount", False) systray.register_action("usb1_umount", usb , "umount") systray.register_action("usb1_mount", usb , "mount") #systray.register_action("usb1", change ) gtk.main() tcosmonitor/tcosmonitor/Initialize.py0000664000000000000000000002307112260544373015372 0ustar # -*- coding: UTF-8 -*- # TcosMonitor version __VERSION__ # # Copyright (c) 2006-2011 Mario Izquierdo # # This package is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # # This package is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. import gtk from gettext import gettext as _ from time import time import os import sys import tcosmonitor.shared # constant to font sizes PANGO_SCALE=1024 def print_debug(txt): if tcosmonitor.shared.debug: print >> sys.stderr, "%s::%s" % (__name__, txt) #print("%s::%s" % (__name__, txt), file=sys.stderr) def crono(start, txt): print_debug ("crono(), %s get %f seconds" %(txt, (time() - start)) ) return class Initialize(object): def __init__(self, main): print_debug ( "__init__() starting" ) self.main=main self.ui=self.main.ui self.model=gtk.ListStore(str, str, str, gtk.gdk.Pixbuf, gtk.gdk.Pixbuf, gtk.gdk.Pixbuf, str, str, bool,bool) self.main.updating=True self.searching=False # boolean True thread running False not running self.main.statusbar=self.ui.get_object('statusbar') self.main.viewtabs=self.ui.get_object('viewtabs') self.main.viewtabs.set_property('show-tabs', False) self.main.viewtabs.connect("switch_page", self.on_viewtabs_change) self.ask_mode=None def on_viewtabs_change(self, widget, pointer, tabnum): if tabnum != 0: self.main.searchbutton.set_sensitive(False) self.main.searchtxt.set_sensitive(False) else: self.main.searchbutton.set_sensitive(True) self.main.searchtxt.set_sensitive(True) def init_progressbar(self): self.main.progressbar=self.ui.get_object('progressbar') self.main.progressbutton=self.ui.get_object('progressbutton') self.main.progressbutton.connect('clicked', self.main.actions.on_progressbutton_click ) self.main.progressbar.hide() self.main.progressbox=self.ui.get_object('progressbox') def initbuttons(self): print_debug ( "initbuttons()" ) self.main.quitbutton = self.ui.get_object('quitbutton') self.main.quitbutton.connect('clicked', self.main.quitapp) self.main.preferencesbutton = self.ui.get_object('preferencesbutton') self.main.preferencesbutton.connect('clicked', self.main.actions.on_preferencesbutton_click) self.main.refreshbutton = self.ui.get_object('refreshbutton') self.main.refreshbutton.connect('clicked', self.main.actions.on_refreshbutton_click) self.main.fullscreenbutton = self.ui.get_object('fullscreenbutton') self.main.fullscreenbutton.connect('clicked', self.main.actions.on_fullscreenbutton_click) self.main.allhostbutton = self.ui.get_object('allhostbutton') self.main.allhostbutton.connect('clicked', self.main.actions.on_allhostbutton_click) self.main.aboutbutton = self.ui.get_object('aboutbutton') self.main.aboutbutton.connect('clicked', self.main.actions.on_aboutbutton_click) self.main.searchbutton = self.ui.get_object('searchbutton') self.main.searchbutton.connect('clicked', self.main.actions.on_searchbutton_click) self.main.searchtxt = self.ui.get_object('searchtxt') self.main.searchtxt.connect('activate', self.main.search_host) self.main.toolbar2 = self.ui.get_object('toolbar2') self.main.button_audio = self.ui.get_object('button_audio') self.main.handlebox_audio = self.ui.get_object('handlebox_audio') self.main.button_audio.connect('clicked', self.main.button_actions, "audio") self.main.button_chat = self.ui.get_object('button_chat') self.main.handlebox_chat = self.ui.get_object('handlebox_chat') self.main.button_chat.connect('clicked', self.main.button_actions, "chat") self.main.button_list = self.ui.get_object('button_list') self.main.handlebox_list = self.ui.get_object('handlebox_list') self.main.button_list.connect('clicked', self.main.button_actions, "list") self.main.button_video = self.ui.get_object('button_video') self.main.handlebox_video = self.ui.get_object('handlebox_video') self.main.button_video.connect('clicked', self.main.button_actions, "video") self.main.button_send = self.ui.get_object('button_send') self.main.handlebox_send = self.ui.get_object('handlebox_send') self.main.button_send.connect('clicked', self.main.button_actions, "send") self.main.button_exe = self.ui.get_object('button_exe') self.main.handlebox_exe = self.ui.get_object('handlebox_exe') self.main.button_exe.connect('clicked', self.main.button_actions, "exe") self.main.button_text = self.ui.get_object('button_text') self.main.handlebox_text = self.ui.get_object('handlebox_text') self.main.button_text.connect('clicked', self.main.button_actions, "text") for button in ['button_audio', 'button_chat', 'button_list', 'button_video', 'button_send', 'button_exe', 'button_text']: if os.path.isfile(tcosmonitor.shared.IMG_DIR + "/%s.png" %(button)): img=self.ui.get_object( button.replace("button", "image") ) if img: img.set_from_file(tcosmonitor.shared.IMG_DIR + "/%s.png" %(button) ) else: print_debug("WARNING: Error loading button image %s"%button) else: print_debug("WARNING: Image file '%s' don't exists" %(tcosmonitor.shared.IMG_DIR + "/%s.png" %(button)) ) def initabouttcos(self): self.aboutui = gtk.Builder() self.aboutui.set_translation_domain(tcosmonitor.shared.PACKAGE) self.aboutui.add_from_file(tcosmonitor.shared.GLADE_DIR + 'tcosmonitor-abouttcos.ui') self.main.abouttcos = self.aboutui.get_object('abouttcos') self.main.abouttcos.hide() self.main.abouttcos.set_icon_from_file(tcosmonitor.shared.IMG_DIR +'tcos-icon-32x32.png') self.main.abouttabs = self.aboutui.get_object('abouttabs') #self.main.abouttcos.connect("close", self.on_about_close) self.main.abouttcos.connect("delete_event", self.main.actions.on_abouttcos_close) self.main.abouttcos_version=self.aboutui.get_object('abouttcos_version') self.main.abouttcos_version.set_text(tcosmonitor.shared.version) self.main.donateurllabel = self.aboutui.get_object('donateurllabel') self.main.abouttcos_donatebutton = self.aboutui.get_object('abouttcos_donatebutton') self.main.abouttcos_donatebutton.connect('clicked', self.main.actions.on_donateurl_click) # LOAD LICENSE_FILE in TextView self.main.abouttcos_license = self.aboutui.get_object('abouttcos_license') textbuffer = self.main.abouttcos_license.get_buffer() if os.path.isfile(tcosmonitor.shared.LICENSE_FILE): fd1=open(tcosmonitor.shared.LICENSE_FILE, "r") data=fd1.read() fd1.close() textbuffer.set_text(data) else: textbuffer.set_text( _("GPL-2 license file not found") ) self.main.abouttcos_logo = self.aboutui.get_object('abouttcos_logo') self.main.abouttcos_logo.set_from_file(tcosmonitor.shared.IMG_DIR +'tcos-logo.png') self.main.abouttcos_webbutton = self.aboutui.get_object('abouttcos_webbutton') self.main.abouttcos_webbutton.connect('clicked', self.main.actions.on_weburl_click) self.main.abouttcos_donatecheck = self.aboutui.get_object('abouttcos_donatecheck') self.main.abouttcos_donatecheck.connect('toggled', self.main.actions.on_abouttcos_donatecheck_change) if self.main.config.GetVar("show_about") == 1: self.main.abouttcos.show() self.main.abouttabs.set_current_page(0) self.main.config.SetVar("show_about", "0") self.main.config.SaveToFile() if self.main.config.GetVar("show_donate") == 1: self.main.abouttcos.show() self.main.abouttabs.set_current_page(self.main.abouttabs.get_n_pages()-1) self.main.abouttcos_donatecheck.set_active(False) else: self.main.abouttcos_donatecheck.set_active(True) if __name__ == '__main__': init=Initialize (None) tcosmonitor/tcosmonitor/extensions/0000775000000000000000000000000012260544373015113 5ustar tcosmonitor/tcosmonitor/extensions/__init__.py0000664000000000000000000000333312260544373017226 0ustar # -*- coding: UTF-8 -*- # TcosMonitor version __VERSION__ # # Copyright (c) 2006-2011 Mario Izquierdo # # This package is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # # This package is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. import glob as __glob__ import os as __os__ import sys as __sys__ def __load__(): """ read contents of extensions dir and put in __all__ list """ _ext_dir=__os__.path.dirname( __file__ ) _ext=[] for file_ in __glob__.glob(_ext_dir+"/*.py"): if file_ == "__init__.py": continue _ext_name = __os__.path.basename(file_).split('.py')[0] if _ext_name == "__init__": continue _ext.append( _ext_name ) try: if __sys__.version_info[0:3] < (2, 5, 0): __import__('tcosmonitor.extensions.' + _ext_name, globals(), locals(), ['extensions'] ) else: __import__('tcosmonitor.extensions.' + _ext_name, fromlist = ['extensions'] ) except Exception, err: print ("Exception importing extension='%s', err='%s'"%(_ext_name, err)) return _ext __all__=__load__() tcosmonitor/tcosmonitor/extensions/lockscreen.py0000664000000000000000000000757612260544373017634 0ustar # -*- coding: UTF-8 -*- # TcosMonitor version __VERSION__ # # Copyright (c) 2006-2011 Mario Izquierdo # # This package is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # # This package is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. """ template extension """ from gettext import gettext as _ import sys from tcosmonitor import shared from tcosmonitor.TcosExtensions import TcosExtension def print_debug(txt): if shared.debug: print >> sys.stderr, "%s::%s" % (__name__, txt) #print("%s::%s" % (__name__, txt), file=sys.stderr) class LockUnlockScreen(TcosExtension): def register(self): self.main.menus.register_simple( _("Lock screen"), "menu_lock.png", 0, self.lock, "lock") self.main.menus.register_all( _("Lock all screens"), "menu_lock.png", 0, self.lock_all, "lock") self.main.menus.register_simple( _("Unlock screen"), "menu_unlock.png", 0, self.unlock, "lock") self.main.menus.register_all( _("Unlock all screens"), "menu_unlock.png", 0, self.unlock_all, "lock") def lock(self, w, ip): if not self.get_client(): return if not self.main.xmlrpc.lockscreen(): shared.error_msg( _("Can't connect to tcosxmlrpc.\nPlease verify user and password in prefences!") ) return self.change_lockscreen(ip) def unlock(self, w, ip): if not self.get_client(): return if not self.main.xmlrpc.unlockscreen(): shared.error_msg( _("Can't connect to tcosxmlrpc.\nPlease verify user and password in prefences!") ) return self.change_lockscreen(ip) def real_action(self, ip, action): print_debug("real_action() ip=%s action='%s'"%(ip, action) ) if action == 'lockscreen': self.main.xmlrpc.lockscreen() # update icon self.main.common.threads_enter("extensions/lockscreen::real_action lockscreen") self.change_lockscreen(ip) self.main.common.threads_leave("extensions/lockscreen::real_action lockscreen") elif action == 'unlockscreen': self.main.xmlrpc.unlockscreen() # update icon self.main.common.threads_enter("extensions/lockscreen::real_action unlockscreen") self.change_lockscreen(ip) self.main.common.threads_leave("extensions/lockscreen::real_action unlockscreen") def lock_all(self, *args): if not self.get_all_clients(): return msg=_( _("Do you want to lock the following screens: %s?" )%(self.connected_users_txt_all) ) if shared.ask_msg ( msg ): self.main.worker=shared.Workers(self.main, None, None) self.main.worker.set_for_all_action(self.action_for_clients, \ self.allclients_logged, "lockscreen" ) def unlock_all(self, *args): if not self.get_all_clients(): return msg=_( _("Do you want to unlock the following screens: %s?" )%(self.connected_users_txt_all) ) if shared.ask_msg ( msg ): self.main.worker=shared.Workers(self.main, None, None) self.main.worker.set_for_all_action(self.action_for_clients, \ self.allclients_logged, "unlockscreen" ) __extclass__=LockUnlockScreen tcosmonitor/tcosmonitor/extensions/reboot.py0000664000000000000000000001156212260544373016764 0ustar # -*- coding: UTF-8 -*- # TcosMonitor version __VERSION__ # # Copyright (c) 2006-2011 Mario Izquierdo # # This package is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # # This package is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. """ template extension """ from gettext import gettext as _ import sys from tcosmonitor import shared from tcosmonitor.TcosExtensions import TcosExtension def print_debug(txt): if shared.debug: print >> sys.stderr, "%s::%s" % (__name__, txt) #print("%s::%s" % (__name__, txt), file=sys.stderr) class RebootPoweroff(TcosExtension): def register(self): self.main.menus.register_simple(_("Reboot"), "menu_reboot.png", 0, self.reboot, "reboot") self.main.menus.register_all( _("Reboot all clients"), "menu_reboot.png", 0, self.reboot_all, "reboot") self.main.menus.register_simple( _("Poweroff"), "menu_poweroff.png", 0, self.poweroff, "reboot") self.main.menus.register_all( _("Poweroff all clients"), "menu_poweroff.png", 0, self.poweroff_all, "reboot") def reboot(self, w, ip): if not self.get_client(): return msg=_( _("Do you want to reboot: %s?" ) %(self.connected_users_txt_all) ) if shared.ask_msg ( msg ): timeout=self.main.config.GetVar("actions_timeout") msg=(_("Pc will reboot in %s seconds") %timeout) self.exe_app_in_client("reboot", timeout, msg, users=[ip], connected_users=self.connected_users) def reboot_all(self, *args): if not self.get_all_clients(): return msg=_( _("Do you want to reboot the following clients: %s?" ) %(self.connected_users_txt_all) ) if shared.ask_msg ( msg ): timeout=self.main.config.GetVar("actions_timeout") msg=(_("Pc will reboot in %s seconds") %timeout) self.exe_app_in_client("reboot", timeout, msg, users=self.allclients, connected_users=self.connected_users) def poweroff(self, w, ip): if not self.get_client(): return msg=_( _("Do you want to poweroff: %s?" ) %(self.connected_users_txt_all) ) if shared.ask_msg ( msg ): timeout=self.main.config.GetVar("actions_timeout") msg=(_("Pc will shutdown in %s seconds") %timeout) self.exe_app_in_client("poweroff", timeout, msg, users=[ip], connected_users=self.connected_users) def poweroff_all(self, *args): if not self.get_all_clients(): return msg=_( _("Do you want to poweroff the following clients: %s?" )%(self.connected_users_txt_all) ) if shared.ask_msg ( msg ): timeout=self.main.config.GetVar("actions_timeout") msg=(_("Pc will shutdown in %s seconds") %timeout) self.exe_app_in_client("poweroff", timeout, msg, users=self.allclients, connected_users=self.connected_users) def real_action(self, ip, action): print_debug("real_action() ip=%s action='%s'"%(ip, action) ) self.main.xmlrpc.Exe(action) def exe_app_in_client(self, mode, timeout=0, msg="", users=[], connected_users=[]): remote_cmd=("/usr/lib/tcos/session-cmd-send %s %s %s" %(mode.upper(), timeout, msg.replace("'", "´"))) action="down-controller %s %s" %(mode, timeout) print_debug("exe_app_in_client() usernames=%s" %users) if len(connected_users) != 0 and connected_users[0] != shared.NO_LOGIN_MSG: newusernames=[] for user in connected_users: if user.find(":") != -1: # we have a standalone user... usern, ip = user.split(":") self.main.xmlrpc.newhost(ip) self.main.xmlrpc.DBus("exec", remote_cmd ) else: # we have a thin client newusernames.append(user) result = self.main.dbus_action.do_exec( newusernames, remote_cmd ) if not result: shared.error_msg ( _("Error while exec remote app:\nReason:%s") %( self.main.dbus_action.get_error_msg() ) ) self.main.worker=shared.Workers(self.main, None, None) self.main.worker.set_for_all_action(self.action_for_clients, users, action ) return __extclass__=RebootPoweroff tcosmonitor/tcosmonitor/extensions/screenshot.py0000664000000000000000000002377412260544373017657 0ustar # -*- coding: UTF-8 -*- # TcosMonitor version __VERSION__ # # Copyright (c) 2006-2011 Mario Izquierdo # # This package is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # # This package is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. from gettext import gettext as _ # needed for get_screenshot from time import localtime import gtk import os import sys from tcosmonitor import shared from tcosmonitor.TcosExtensions import TcosExtension def print_debug(txt): if shared.debug: print >> sys.stderr, "%s::%s" % (__name__, txt) #print("%s::%s" % (__name__, txt), file=sys.stderr) class Screenshot(TcosExtension): def register(self): self.main.menus.register_simple( _("Screenshot"), "menu_screenshot.png", 2, self.take_screenshot, "screenshots") self.main.menus.register_all( _("Capture All clients screens") , "menu_screenshot.png", 2, self.take_all_screenshots, "screenshots") self.main.screenshots_action=None self.__screenshot_counter=0 self.__screenshot_data={} ########### SIMPLE HOST ############### def take_screenshot(self, widget, ip): if not self.get_client(): return print_debug("take_screenshot() widget=%s ip=%s"%(widget, ip)) self.main.worker=shared.Workers(self.main, target=self.get_screenshot, args=(ip,) ) self.main.worker.start() def get_screenshot(self, ip): self.main.xmlrpc.newhost(ip) if not self.main.xmlrpc.connected: print_debug ( "get_screenshot(%s) NO CONNECTION" %(ip) ) self.main.common.threads_enter("TcosActions::get_screenshot writing error msg") self.main.write_into_statusbar( _("Can't make screenshot, error: %s") %"NO CONNECTION" ) self.main.common.threads_leave("TcosActions::get_screenshot writing error msg") return # get_size print_debug ( "get_screenshot() scrot_size=%s" %(self.main.config.GetVar("scrot_size")) ) # write into statusbar self.main.common.threads_enter("TcosActions::get_screenshot writing wait msg") self.main.write_into_statusbar ( _("Trying to order terminal to do a screenshot...") ) self.main.common.threads_leave("TcosActions::get_screenshot writing wait msg") # use Base64 screenshot scrot=self.main.xmlrpc.getscreenshot( self.main.config.GetVar("scrot_size") ) if scrot[0] != "ok": #if not self.main.xmlrpc.screenshot( self.main.config.GetVar("scrot_size") ): self.main.common.threads_enter("TcosActions::get_screenshot writing error msg") self.main.write_into_statusbar( _("Can't make screenshot, error: %s") %scrot[1] ) self.main.common.threads_leave("TcosActions::get_screenshot writing error msg") return False slabel=_("Get another screenshot") self.main.common.threads_enter("TcosActions::get_screenshot creating button") self.main.another_screenshot_button=None self.main.another_screenshot_button=gtk.Button(label=slabel ) self.main.another_screenshot_button.connect("clicked", self.take_screenshot, ip) self.main.another_screenshot_button.show() self.main.common.threads_leave("TcosActions::get_screenshot creating button") print_debug ( "get_screenshot() creating button..." ) year, month, day, hour, minute, seconds ,wdy, yday, isdst= localtime() datetxt="%02d/%02d/%4d %02d:%02d:%02d" %(day, month, year, hour, minute, seconds) print_debug ( "get_screenshot() date=%s" %(datetxt) ) hostname=self.main.localdata.GetUsername(ip) if hostname == shared.NO_LOGIN_MSG: hostname=self.main.localdata.GetHostname(ip) block_txt=_("Screenshot of %s")%(hostname) block_txt+=" %s " %(datetxt) block_txt+=" " %( slabel ) self.main.common.threads_enter("TcosActions::get_screenshot show capture") #url="http://%s:%s/capture-thumb.jpg" %(ip, shared.httpd_port) self.main.datatxt.clean() self.main.datatxt.insert_block( block_txt ) #self.main.datatxt.insert_html( "%s\n"\ # %(url, _("Screenshot of %s" %(ip) )) ) # Use Base64 data self.main.screenshots_action=self.on_screenshot_click self.__screenshot_counter=0 savedatetxt="%02d-%02d-%4d_%02d-%02d" %(day, month, year, hour, minute) self.__screenshot_data["%s"%self.__screenshot_counter]={'hostname':hostname, 'ip':ip, 'date':savedatetxt} self.main.datatxt.insert_html("""\n\n"""%(self.__screenshot_counter, scrot[1])) self.main.common.threads_leave("TcosActions::get_screenshot show capture") self.main.common.threads_enter("TcosActions::get_screenshot END") self.main.datatxt.display() self.main.write_into_statusbar ( _("Screenshot of %s, done.") %(ip) ) self.main.common.threads_leave("TcosActions::get_screenshot END") return False def on_screenshot_click(self, eventbox, event, number, pixbuf): if event.button == 3: ip=self.__screenshot_data[number]['ip'] self.main.force_selected_ip=ip # right click show menu self.main.menus.RightClickMenuOne( None , None, ip) self.main.menu.popup( None, None, None, event.button, event.time) return True menu=gtk.Menu() save_scrot = gtk.ImageMenuItem(_("Save Screenshot"), True) icon = gtk.Image() icon.set_from_stock (gtk.STOCK_SAVE, gtk.ICON_SIZE_BUTTON) save_scrot.set_image(icon) save_scrot.connect("activate", self.save_screenshot, number, pixbuf) save_scrot.show() menu.append(save_scrot) menu.popup( None, None, None, event.button, event.time) def save_screenshot(self, image, number, pixbuf): data=self.__screenshot_data[number] dialog = gtk.FileChooserDialog(title=_("Select file to save screenshot..."), action=gtk.FILE_CHOOSER_ACTION_SAVE, buttons=(gtk.STOCK_CANCEL,gtk.RESPONSE_CANCEL,gtk.STOCK_SAVE,gtk.RESPONSE_OK)) dialog.set_default_response(gtk.RESPONSE_OK) dialog.set_current_name( _("screenshot_of_%(hostname)s_date_%(date)s.png") %{'hostname':data['hostname'], 'date':data['date']} ) folder = _folder = os.environ['HOME'] dialog.set_current_folder(folder) _filter = gtk.FileFilter() _filter.set_name( _("Image Files ( *.png, *.jpg)") ) file_types=["*.png", "*.jpg"] for elem in file_types: _filter.add_pattern( elem ) dialog.add_filter(_filter) response = dialog.run() if response == gtk.RESPONSE_OK: filename=dialog.get_filename() fext=filename.split('.')[-1] if not fext in ['png', 'jpg']: shared.error_msg( _("File must be png or jpg.") ) dialog.destroy() return params={} # if fext == "jpeg": # {"quality":"100"} pixbuf.save(filename, fext, params) dialog.destroy() ########### MULTIPLE HOSTS ############### def take_all_screenshots(self, widget): if not self.get_all_clients(): return self.main.screenshots_action=self.on_screenshot_click self.main.worker=shared.Workers(self.main, None, None) self.main.worker.set_for_all_action(self.action_for_clients, self.allclients, 'screenshot' ) def start_action(self, *args): self.__screenshot_counter=0 self.__screenshot_data={} self.main.datatxt.clean() self.main.datatxt.insert_block( _("Screenshots of all hosts") ) self.main.datatxt.insert_html("
") def real_action(self, ip, action): print_debug("real_action() ip=%s" %ip) self.main.xmlrpc.newhost(ip) scrot=self.main.xmlrpc.getscreenshot(self.main.config.GetVar("miniscrot_size")) if scrot and scrot[0] == "ok": self.__screenshot_counter+=1 hostname=self.main.localdata.GetUsername(ip) if hostname == shared.NO_LOGIN_MSG: hostname=self.main.localdata.GetHostname(ip) self.main.common.threads_enter("extensions/screenshot::real_action screenshot") year, month, day, hour, minute, seconds ,wdy, yday, isdst= localtime() savedatetxt="%02d-%02d-%4d_%02d-%02d" %(day, month, year, hour, minute) self.__screenshot_data["%s"%self.__screenshot_counter]={'hostname':hostname, 'ip':ip, 'date':savedatetxt} self.main.datatxt.insert_html( "" + "\n\t " %(self.__screenshot_counter, scrot[1],_( "Screenshot of %s" ) %(hostname) ) + "__\n"+ "") self.main.common.threads_leave("extensions/screenshot::real_action screenshot") def finish_action(self, *args): self.main.datatxt.display() __extclass__=Screenshot tcosmonitor/tcosmonitor/extensions/viewproc.py0000664000000000000000000001335512260544373017332 0ustar # -*- coding: UTF-8 -*- # TcosMonitor version __VERSION__ # # Copyright (c) 2006-2011 Mario Izquierdo # # This package is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # # This package is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. """ template extension """ from gettext import gettext as _ import sys from tcosmonitor import shared from tcosmonitor.TcosExtensions import TcosExtension import gtk def print_debug(txt): if shared.debug: print >> sys.stderr, "%s::%s" % (__name__, txt) #print("%s::%s" % (__name__, txt), file=sys.stderr) class ViewProc(TcosExtension): def register(self): self.main.menus.register_simple( _("Show running apps of this client") , "menu_proc.png", 1, self.viewproc, "show") def viewproc(self, widget, ip): if not self.get_client(): return if len(self.connected_users) == 0 or self.connected_users[0] == shared.NO_LOGIN_MSG: shared.error_msg ( _("Can't show runnings apps, user is not logged") ) return self.get_user_processes(ip) def get_user_processes(self, ip): """get user processes in session""" print_debug( "get_user_processes(%s) __init__" %ip ) #check user is connected if not self.main.localdata.IsLogged(ip): shared.info_msg( _("User not connected, no processes.") ) return if self.main.xmlrpc.IsStandalone(ip): username=self.main.localdata.GetUsernameAndHost(ip) tmp=self.main.xmlrpc.ReadInfo("get_process") if tmp != "": process=tmp.split('|')[0:-1] else: process=["PID COMMAND", "66000 can't read process list"] else: username=self.main.localdata.GetUsername(ip) cmd="LANG=C ps U \"%s\" -o pid,command | /usr/lib/tcos/clean_string.sh " %(self.main.localdata.GetUserID(username)) print_debug ( "get_user_processes(%s) cmd=%s " %(ip, cmd) ) process=self.main.common.exe_cmd(cmd, verbose=0) self.main.datatxt.clean() self.main.datatxt.insert_block( _("Running processes for user \"%s\": " ) %(username), image=shared.IMG_DIR + "info_proc.png" ) if self.main.config.GetVar("systemprocess") == "0": self.main.datatxt.insert_block ( \ _("ALERT: There are some system process hidden. Enable it in Preferences dialog.") \ , image=shared.IMG_DIR + "icon_alert.png" ,\ color="#f08196", size="medium" ) self.main.datatxt.insert_html ( """

""" + _("Pid") + "\t" + "\t" + _("Process command") +"
" ) counter=0 self.main.kill_proc_buttons=None self.main.kill_proc_buttons=[] blabel=_("Kill this process") for proc in process: is_hidden=False if proc.split()[0]== "PID": continue pid=proc.split()[0] # not convert to int DBUS need string name=" ".join(proc.split()[1:]) name=name.replace('<','<').replace('>','>') name=name.replace('&','&') if int(self.main.config.GetVar("systemprocess")) == 0: for hidden in shared.system_process: if hidden in name: is_hidden=True if is_hidden: continue kill_button=gtk.Button(label=blabel) kill_button.connect("clicked", self.on_kill_button_click, pid, username) kill_button.show() self.main.kill_proc_buttons.append(kill_button) self.main.datatxt.insert_html(""" %6s %s
""" %(counter, blabel, pid, name) ) counter+=1 self.main.datatxt.display() return def on_kill_button_click(self, widget, pid, username): print_debug ( "on_kill_button_click() pid=%s username=%s" %(pid, username) ) if shared.ask_msg ( _("Are you sure you want to stop this process?") ): print_debug ( "KILL KILL KILL" ) if username.find(":") != -1 : usern, ip = username.split(":") self.main.xmlrpc.newhost(ip) self.main.xmlrpc.DBus("kill", str(pid) ) else: result = self.main.dbus_action.do_kill( [username] , str(pid) ) if not result: shared.error_msg ( _("Error while killing app:\nReason: %s") %( self.main.dbus_action.get_error_msg() ) ) else: print_debug ( "on_kill_button_click() KILLED ;)" ) self.get_user_processes(self.main.selected_ip) __extclass__=ViewProc tcosmonitor/tcosmonitor/extensions/info.py0000664000000000000000000007224112260544373016426 0ustar # -*- coding: UTF-8 -*- # TcosMonitor version __VERSION__ # # Copyright (c) 2006-2011 Mario Izquierdo # # This package is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # # This package is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. """ template extension """ from gettext import gettext as _ from time import time import gtk import os import sys from tcosmonitor import shared from tcosmonitor.TcosExtensions import TcosExtension from tcosmonitor.ping import PingPort def crono(start, txt): print_debug ("crono(), %s get %f seconds" %(txt, (time() - start)) ) return def print_debug(txt): if shared.debug: print >> sys.stderr, "%s::%s" % (__name__, txt) #print("%s::%s" % (__name__, txt), file=sys.stderr) class Info(TcosExtension): def register(self): self.main.menus.register_simple(_("Refresh terminal info"), "menu_refresh.png", 0, self.get_info, "info") # register file click event target self.main.listview.populate_datatxt=self.populate_datatxt def get_info(self, widget, ip): if not self.get_client(): return print_debug("get_info() ip=%s"%(ip)) self.main.xmlrpc.ip=ip self.main.worker=shared.Workers( self.main,\ target=self.populate_datatxt, args=(ip,) ).start() def populate_datatxt(self, ip): start1=time() print_debug ("populate_datatxt() INIT ip %s"%ip) if not self.main.xmlrpc.connected: print_debug ( "populate_datatxt(%s) NO CONNECTION" %(ip) ) crono(start1, "populate_datatxt(%s)" %(ip) ) return # dictionary with all data tcos_vars={} self.datatxt = self.main.datatxt # clear datatxt self.main.common.threads_enter("TcosActions:populate_datatxt clean datatxt") self.datatxt.clean() self.main.common.threads_leave("TcosActions:populate_datatxt clean datatxt") tcos_vars["get_client"] = self.main.xmlrpc.ReadInfo("get_client") print_debug ( "Client type=%s" %(tcos_vars["get_client"]) ) # print into statusbar self.main.common.threads_enter("TcosActions:populate_datatxt show progressbar") if shared.disable_textview_on_update and self.main.listview.isactive(): self.main.tabla.set_sensitive(True) #self.main.write_into_statusbar( _("Connecting with %s to retrieve some info..." ) %(ip) ) self.main.progressbar.show() #self.main.progressbutton.show() self.main.actions.set_progressbar( _("Connecting with %s to retrieve some info..." ) %(ip) , 0, show_percent=False) self.main.common.threads_leave("TcosActions:populate_datatxt show progressbar") info_percent=0.0 info_items=0 for elem in self.main.config.vars: # elem can have 2 or 3 elements (don't use key,value in for) key=elem[0] value=elem[1] if self.main.config.GetVar(key) == 1: info_items += 1 if info_items != 0: percent_step=float((100/info_items)) percent_step=percent_step/100 if self.main.config.GetVar("tcosinfo") == 1: info_percent+=percent_step self.main.common.threads_enter("TcosActions:populate_datatxt update progressbar") self.main.actions.update_progressbar( info_percent ) self.main.common.threads_leave("TcosActions:populate_datatxt update progressbar") if tcos_vars["get_client"] == "tcos": self.datatxt.insert_block( _("Tcos info") , image=shared.IMG_DIR + "tcos-icon-32x32.png" ) elif tcos_vars["get_client"] == "pxes": self.datatxt.insert_block( _("PXES info") , image="/usr/share/pixmaps/pxesconfig/2X.png" ) elif tcos_vars["get_client"] == "ltsp": self.datatxt.insert_block( _("LTSP info") , image=shared.IMG_DIR + "ltsp_logo.png" ) elif tcos_vars["get_client"] == "standalone": self.datatxt.insert_block( _("Standalone info") , image=shared.IMG_DIR + "standalone.png" ) elif tcos_vars["get_client"] == "multiseat": self.datatxt.insert_block( _("Multiseat info") , image=shared.IMG_DIR + "standalone.png" ) else: self.datatxt.insert_block( _("Unknow client info") ) tcos_vars["hostname"]=self.main.localdata.GetHostname(ip) tcos_vars["version"]=self.main.xmlrpc.GetVersion() if not tcos_vars["version"]: tcos_vars["version"]=_("unknow") self.datatxt.insert_list( [ [ _("Hostname: "), tcos_vars["hostname"] ] , \ [ _("Ip address: "), ip ] , \ [ _("TcosXmlRpc version: "), tcos_vars["version"] ] ] ) tcos_vars["tcos_version"]=self.main.xmlrpc.ReadInfo("tcos_version") tcos_vars["tcos_generation_date"]=self.main.xmlrpc.ReadInfo("tcos_generation_date") tcos_vars["tcos_date"]=self.main.xmlrpc.ReadInfo("tcos_date") tcos_vars["tcos_uptime"]=self.main.xmlrpc.ReadInfo("tcos_uptime") self.datatxt.insert_list( [ \ [_("Tcos image version: "), tcos_vars["tcos_version"] ], \ [_("Tcos image date: "), tcos_vars["tcos_generation_date"] ], \ [_("Date of thin client: "), tcos_vars["tcos_date"] ], [_("Uptime: "), tcos_vars["tcos_uptime"] ] ] ) if self.main.config.GetVar("kernelmodulesinfo") == 1: info_percent+=percent_step self.main.common.threads_enter("TcosActions:populate_datatxt update progressbar") self.main.actions.update_progressbar( info_percent ) self.main.common.threads_leave("TcosActions:populate_datatxt update progressbar") self.datatxt.insert_block( _("Kernel info"), image=shared.IMG_DIR + "info_kernel.png" ) tcos_vars["kernel_version"]=self.main.xmlrpc.ReadInfo("kernel_version") tcos_vars["kernel_complete_version"]=self.main.xmlrpc.ReadInfo("kernel_complete_version") tcos_vars["modules_loaded"]=self.main.xmlrpc.ReadInfo("modules_loaded") tcos_vars["modules_notfound"]=self.main.xmlrpc.ReadInfo("modules_notfound") if tcos_vars["modules_notfound"] != "OK" and tcos_vars["get_client"] == "tcos": blabel=_("Force download and mount all modules") self.main.action_button=gtk.Button( label=blabel ) self.main.action_button.connect("clicked", self.on_downloadallmodules_click) self.main.action_button.show() tcos_vars["modules_notfound"] = """ %s """ % (tcos_vars["modules_notfound"], "self.main.action_button" , blabel) else: tcos_vars["modules_notfound"] = _("None") self.datatxt.insert_list( [ \ [_("Kernel version: "), tcos_vars["kernel_version"] ], \ [_("Kernel complete version: "), tcos_vars["kernel_complete_version"] ], \ [_("Loaded Modules: "), tcos_vars["modules_loaded"] ], \ [_("Modules not found: "), tcos_vars["modules_notfound"] ] ] ) cpuinfo=self.main.config.GetVar("cpuinfo") pciinfo=self.main.config.GetVar("pcibusinfo") ramswapinfo=self.main.config.GetVar("ramswapinfo") networkinfo=self.main.config.GetVar("networkinfo") if cpuinfo == 1: info_percent+=percent_step self.main.common.threads_enter("TcosActions:populate_datatxt update progressbar") self.main.actions.update_progressbar( info_percent ) self.main.common.threads_leave("TcosActions:populate_datatxt update progressbar") self.datatxt.insert_block( _("Cpu info: "), image=shared.IMG_DIR + "info_cpu.png" ) tcos_vars["cpu_model"]=self.main.xmlrpc.ReadInfo("cpu_model") tcos_vars["cpu_vendor"]=self.main.xmlrpc.ReadInfo("cpu_vendor") tcos_vars["cpu_speed"]=self.main.xmlrpc.ReadInfo("cpu_speed") self.datatxt.insert_list( [ \ [_("Cpu model: "), tcos_vars["cpu_model"] ], \ [_("Cpu vendor: "), tcos_vars["cpu_vendor"] ], \ [_("Cpu speed: "), tcos_vars["cpu_speed"] ] ] ) if pciinfo == 1: info_percent+=percent_step self.main.common.threads_enter("TcosActions:populate_datatxt update progressbar") self.main.actions.update_progressbar( info_percent ) self.main.common.threads_leave("TcosActions:populate_datatxt update progressbar") # PCI info self.datatxt.insert_block( _("PCI buses: ") , image=shared.IMG_DIR + "info_pci.png" ) pcilist=[] try: allpci=self.main.xmlrpc.tc.tcos.pci("pci_all").split(' ') except Exception, err: print_debug("info() Exception pci error %s"%err) self.main.xmlrpc.CheckSSL(err) for pci_id in allpci: if pci_id != "": try: pci_info=self.main.xmlrpc.tc.tcos.pci(pci_id) pcilist.append( [pci_id + " ", pci_info] ) except Exception, err: print_debug("info() Exception pci error %s"%err) self.main.xmlrpc.CheckSSL(err) self.datatxt.insert_list( pcilist ) if self.main.config.GetVar("processinfo") == 1 and tcos_vars["get_client"] != "standalone": info_percent+=percent_step self.main.common.threads_enter("TcosActions:populate_datatxt update progressbar") self.main.actions.update_progressbar( info_percent ) self.main.common.threads_leave("TcosActions:populate_datatxt update progressbar") self.datatxt.insert_block( _("Process running: "), image=shared.IMG_DIR + "info_proc.png" ) proclist=[] allprocess=self.main.xmlrpc.ReadInfo("get_process").split('|') self.datatxt.insert_proc( allprocess ) if ramswapinfo == 1: info_percent+=percent_step self.main.common.threads_enter("TcosActions:populate_datatxt update progressbar") self.main.actions.update_progressbar( info_percent ) self.main.common.threads_leave("TcosActions:populate_datatxt update progressbar") self.datatxt.insert_block( _("Ram info: "), image=shared.IMG_DIR + "info_ram.png" ) tcos_vars["ram_total"]=self.main.xmlrpc.ReadInfo("ram_total") tcos_vars["ram_free"]=self.main.xmlrpc.ReadInfo("ram_free") tcos_vars["ram_active"]=self.main.xmlrpc.ReadInfo("ram_active") self.datatxt.insert_list( [ \ [_("Total Ram: "), tcos_vars["ram_total"] ], \ [_("Free RAM: "), tcos_vars["ram_free"] ], \ [_("Active RAM: "), tcos_vars["ram_active"] ] ] ) self.datatxt.insert_block( _("Swap info: "), image=shared.IMG_DIR + "info_swap.png" ) tcos_vars["swap_avalaible"]=self.main.xmlrpc.ReadInfo("swap_avalaible") tcos_vars["swap_total"]=self.main.xmlrpc.ReadInfo("swap_total") tcos_vars["swap_used"]=self.main.xmlrpc.ReadInfo("swap_used") self.datatxt.insert_list( [ \ [_("Swap enabled: "), tcos_vars["swap_avalaible"] ], \ [_("Total Swap: "), tcos_vars["swap_total"] ], \ [_("Used Swap: "), tcos_vars["swap_used"] ] ] ) if networkinfo == 1: info_percent+=percent_step self.main.common.threads_enter("TcosActions:populate_datatxt update progressbar") self.main.actions.update_progressbar( info_percent ) self.main.common.threads_leave("TcosActions:populate_datatxt update progressbar") self.datatxt.insert_block( _("Network info: ") , image=shared.IMG_DIR + "info_net.png" ) tcos_vars["network_hostname"]=self.main.xmlrpc.ReadInfo("network_hostname") tcos_vars["network_ip"]=self.main.xmlrpc.ReadInfo("network_ip") tcos_vars["network_mask"]=self.main.xmlrpc.ReadInfo("network_mask") tcos_vars["network_mac"]=self.main.xmlrpc.ReadInfo("network_mac") tcos_vars["network_rx"]=self.main.xmlrpc.ReadInfo("network_rx") tcos_vars["network_tx"]=self.main.xmlrpc.ReadInfo("network_tx") self.datatxt.insert_list( [ \ [_("Network hostname: "), tcos_vars["network_hostname"] ], \ [_("Network IP: "), tcos_vars["network_ip"] ], \ [_("Network MASK: "), tcos_vars["network_mask"] ], \ [_("Network MAC: "), tcos_vars["network_mac"] ], \ [_("Data received(rx): "), tcos_vars["network_rx"] ], \ [_("Data send(tx): "), tcos_vars["network_tx"] ] ] ) if self.main.config.GetVar("xorginfo") == 1 and tcos_vars["get_client"] != "standalone": info_percent+=percent_step self.main.common.threads_enter("TcosActions:populate_datatxt update progressbar") self.main.actions.update_progressbar( info_percent ) self.main.common.threads_leave("TcosActions:populate_datatxt update progressbar") self.datatxt.insert_block( _("Xorg info") , image=shared.IMG_DIR + "info_xorg.png" ) xorglist=[] try: alldata=self.main.xmlrpc.tc.tcos.xorg("get", "", \ self.main.config.GetVar("xmlrpc_username"), \ self.main.config.GetVar("xmlrpc_password") ).split() except Exception, err: print_debug("info() Exception networking error %s"%err) self.main.xmlrpc.CheckSSL(err) print_debug ( "populate_datatxt() %s" %( " ".join(alldata) ) ) if alldata[0].find("error") == 0: #shared.error_msg( _("Error getting Xorg info:\n%s" ) %( " ".join(alldata)) ) pass else: for data in alldata: try: (key, value)=data.split('=') except Exception, err: print_debug("populate_datatxt() Exception spliting data=%s, err=%s"%(data, err)) key=data value="" if value== "1": value = _("enabled") elif value == "0": value = _("disabled") if key == "xsession": key=_("X Session Type") elif key == "xdriver": key=_("Xorg Driver") elif key == "xres": key=_("Xorg Resolution") elif key == "xdepth": key=_("Xorg Color depth") elif key == "xdpms": key=_("DPMS energy monitor control") elif key == "xdontzap": key=_("Disable kill X with Ctrl+Alt+Backspace") elif key == "xmousewheel": key=_("Enable mouse wheel") elif key == "xrefresh": key=_("Refresh rate") elif key == "xfontserver": key = _("Xorg font server") elif key == "xmousedev": key = _("Mouse device") elif key == "xmouseprotocol": key = _("Mouse protocol") elif key == "xhorizsync": key = _("X Horiz sync") elif key == "xvertsync": key = _("X Vert sync") xorglist.append( [key + " " , value] ) self.datatxt.insert_list(xorglist) if self.main.config.GetVar("soundserverinfo") == 1: info_percent+=percent_step self.main.common.threads_enter("TcosActions:populate_datatxt update progressbar") self.main.actions.update_progressbar( info_percent ) self.main.common.threads_leave("TcosActions:populate_datatxt update progressbar") # make a ping to port if tcos_vars["get_client"] == "standalone" or PingPort(ip, shared.pulseaudio_soundserver_port, 0.5).get_status() == "OPEN": self.datatxt.insert_block ( _("PulseAudio Sound server is running"), image=shared.IMG_DIR + "info_sound_ok.png" ) channel_list=[] tcos_sound_vars={} #tcos_sound_vars["allchannels"]=self.main.xmlrpc.GetSoundChannels() tcos_sound_vars["allchannels"]=self.main.xmlrpc.GetSoundChannelsContents() #print_debug ( "populate_datatxt() sound channels=%s" %(tcos_sound_vars["allchannels"]) ) counter=0 self.main.volume_sliders=[] self.main.volume_checkboxes=[] self.datatxt.insert_html("""
%s
""" %( shared.IMG_DIR + "icon_mixer.png", _("Remote Sound Mixer")) ) for channel in tcos_sound_vars["allchannels"]: volumebutton=None # only show channel in list if not channel['name'] in shared.sound_only_channels: print_debug("populate_datatxt() *** AUDIO CHANNEL HIDDEN*** channel=%s"%channel) continue txt="""
%s: """ %(channel['name']) #value=self.main.xmlrpc.GetSoundInfo(channel, mode="--getlevel") #value=value.replace('%','') value=channel['level'] try: value=float(value) except Exception, err: print_debug("populate_datatxt() Exception getting volume=%s, err=%s"%(value, err) ) value=0.0 #ismute=self.main.xmlrpc.GetSoundInfo(channel, mode="--getmute") ismute=channel['mute'] if ismute == "off": ismute = True else: ismute = False ctype=channel['type'] print_debug ( "populate_datatxt() channel=%s ismute=%s volume level=%s ctype=%s" %(channel['name'], ismute, value, ctype) ) ############ mute checkbox ################## volume_checkbox=gtk.CheckButton(label=_("Mute"), use_underline=True) volume_checkbox.set_active(ismute) volume_checkbox.connect("toggled", self.checkbox_value_changed, channel['name'], ip) if "switch" in ctype: volume_checkbox.show() else: volume_checkbox.hide() self.main.volume_checkboxes.append(volume_checkbox) txt+="" %(counter) ############# volume slider ################### adjustment = gtk.Adjustment(value=0, lower=0, upper=100, step_incr=1, page_incr=1) volume_slider = gtk.HScale(adjustment) volume_slider.set_size_request(100, 30) volume_slider.set_value_pos(gtk.POS_RIGHT) volume_slider.set_digits(0) volume_slider.set_value( value ) volume_slider.connect("button_release_event", self.slider_value_changed, adjustment, channel['name'], ip) volume_slider.connect("scroll_event", self.slider_value_changed, adjustment, channel['name'], ip) if "volume" in ctype: volume_slider.show() else: volume_slider.hide() self.main.volume_sliders.append(volume_slider) txt+="" %(counter) txt+="
" self.datatxt.insert_html(txt) counter+=1 if tcos_vars["get_client"] == "tcos": # PulseAudio utils self.main.openvolumecontrol_button=None self.main.openvolumecontrol_button=gtk.Button(label=_("PulseAudio Control") ) self.main.openvolumecontrol_button.connect("clicked", self.on_openvolumecontrol_button_click, ip) self.main.openvolumecontrol_button.show() self.main.openvolumemeter_button=None self.main.openvolumemeter_button=gtk.Button(label=_("PulseAudio Meter") ) self.main.openvolumemeter_button.connect("clicked", self.on_openvolumemeter_button_click, ip) self.main.openvolumemeter_button.show() self.main.volumemanager_button=None self.main.volumemanager_button=gtk.Button(label=_("PulseAudio Manager") ) self.main.volumemanager_button.connect("clicked", self.on_volumemanager_button_click, ip) self.main.volumemanager_button.show() self.datatxt.insert_block(_("PulseAudio utils: ") + """ """) self.datatxt.insert_block( _("PulseAudio stats") ) pulseaudioinfo=self.main.xmlrpc.GetSoundInfo(channel="", mode="--getserverinfo").split('|') #print pulseaudioinfo allpulseaudioinfo=[] allpulseaudioinfo_trans=[] output=[] for line in pulseaudioinfo: if line != "" and line.find(":") != -1: key, value = line.split(':') allpulseaudioinfo.append([ key+":", value ]) allpulseaudioinfo_trans.append(value) if len(allpulseaudioinfo_trans) == 11: output.append( ["%s:" %( _("Currently in use")), allpulseaudioinfo_trans[0] ]) output.append( ["%s:" %( _("Allocated during whole lifetime")), allpulseaudioinfo_trans[1] ]) output.append( ["%s:" %( _("Sample cache size")), allpulseaudioinfo_trans[2] ]) output.append( ["%s:" %( _("User name")), allpulseaudioinfo_trans[3] ]) output.append( ["%s:" %( _("Host Name")), allpulseaudioinfo_trans[4] ]) output.append( ["%s:" %( _("Server Name")), allpulseaudioinfo_trans[5] ]) output.append( ["%s:" %( _("Server Version")), allpulseaudioinfo_trans[6] ]) output.append( ["%s:" %( _("Default Sample Specification")), allpulseaudioinfo_trans[7] ]) output.append( ["%s:" %( _("Default Sink")), allpulseaudioinfo_trans[8] ]) output.append( ["%s:" %( _("Default Source")), allpulseaudioinfo_trans[9] ]) output.append( ["%s:" %( _("Cookie")), allpulseaudioinfo_trans[10] ]) self.datatxt.insert_list( output ) else: self.datatxt.insert_list( allpulseaudioinfo ) else: self.datatxt.insert_block ( _("Sound server is not running"), image=shared.IMG_DIR + "info_sound_ko.png") self.main.common.threads_enter("TcosActions:populate_datatxt end") self.datatxt.display() self.main.actions.update_progressbar( 1 ) self.main.progressbar.hide() if shared.disable_textview_on_update and self.main.iconview.isactive(): self.main.tabla.set_sensitive(True) self.main.common.threads_leave("TcosActions:populate_datatxt end") crono(start1, "populate_datatxt(%s)" %(ip) ) return False def on_downloadallmodules_click(self, widget): print_debug ( "on_downloadallmodules_click() ################" ) if self.main.selected_ip != None: print_debug( "on_downloadallmodules_click() downloading modules for %s" %(self.main.selected_ip) ) # download allmodules.squashfs and mount it self.main.xmlrpc.Exe("useallmodules.sh") return def slider_value_changed(self, widget, adjustment, event, channel, ip): value=widget.get_value() print_debug ( "slider_value_changed() ip=%s channel=%s value=%s" %(ip, channel, value) ) self.main.write_into_statusbar( \ _("Changing value of %(channel)s channel, to %(value)s%%..." )\ %{"channel":channel, "value":value} ) tmp=self.main.xmlrpc.SetSound(ip, channel, str(value)+"%") newvalue="%2d%%"%int(tmp['level']) self.main.write_into_statusbar( \ _("Changed value of %(channel)s channel, to %(value)s" ) \ %{"channel":channel, "value":newvalue} ) def checkbox_value_changed(self, widget, channel, ip): value=widget.get_active() if not value: value="off" self.main.write_into_statusbar( _("Unmuting %s channel..." ) %(channel) ) tmp=self.main.xmlrpc.SetSound(ip, channel, value="", mode="--setunmute") newvalue=tmp['mute'] else: value="on" self.main.write_into_statusbar( _("Muting %s channel..." ) %(channel) ) tmp=self.main.xmlrpc.SetSound(ip, channel, value="", mode="--setmute") newvalue=tmp['mute'] self.main.write_into_statusbar( _("Status of %(channel)s channel, is \"%(newvalue)s\"" )\ %{"channel":channel, "newvalue":newvalue} ) def on_openvolumecontrol_button_click(self, widget, ip): print_debug ( "on_openvolumecontrol_button_click() ip=%s" %(ip) ) cmd="PULSE_SERVER=\"%s\" pavucontrol" %(ip) if os.path.isdir("/dev/shm"): self.main.common.exe_cmd( cmd, verbose=0, background=True ) else: shared.error_msg ( _("PulseAudio apps need /dev/shm.") ) def on_openvolumemeter_button_click(self, widget, ip): print_debug ( "on_openvolumemeter_button_click() ip=%s" %(ip) ) cmd="PULSE_SERVER=\"%s\" pavumeter" %(ip) if os.path.isdir("/dev/shm"): self.main.common.exe_cmd( cmd, verbose=0, background=True ) else: shared.error_msg ( _("PulseAudio apps need /dev/shm.") ) def on_volumemanager_button_click(self, widget, ip): print_debug ( "on_volumemanager_button_click() ip=%s" %(ip) ) cmd="PULSE_SERVER=\"%s\" paman" %(ip) if os.path.isdir("/dev/shm"): self.main.common.exe_cmd( cmd, verbose=0, background=True ) else: shared.error_msg ( _("PulseAudio apps need /dev/shm.") ) __extclass__=Info tcosmonitor/tcosmonitor/extensions/tcosnetcontroller.py0000664000000000000000000001725212260544373021257 0ustar # -*- coding: UTF-8 -*- # TcosMonitor version __VERSION__ # # Copyright (c) 2006-2011 Mario Izquierdo # # This package is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # # This package is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. """ template extension """ from gettext import gettext as _ import sys from tcosmonitor import shared from tcosmonitor.TcosExtensions import TcosExtension def print_debug(txt): if shared.debug: print >> sys.stderr, "%s::%s" % (__name__, txt) #print("%s::%s" % (__name__, txt), file=sys.stderr) class TcosNetController(TcosExtension): def register(self): self.main.menus.register_simple( _("Lock internet"), "menu_locknet.png", 1, self.locknet_simple, "net") self.main.menus.register_simple( _("Unlock internet"), "menu_unlocknet.png", 1, self.unlocknet_simple, "net") self.main.menus.register_all( _("Lock internet in all connected users"), "menu_locknet.png", 1, self.locknet_all, "net") self.main.menus.register_all( _("Unlock internet in all connected users"), "menu_unlocknet.png", 1, self.unlocknet_all, "net") def locknet_simple(self, w, ip): if not self.get_client(): return # lock net eth=self.main.config.GetVar("network_interface") ports="--ports=%s" %self.main.config.GetVar("ports_tnc") remote_msg=_("Internet connection has been disabled") act="disable-internet" if len(self.connected_users) == 0 or self.connected_users[0] == shared.NO_LOGIN_MSG: shared.error_msg ( _("Can't disable internet, user is not logged") ) return if self.client_type == "tcos": if not self.main.localdata.user_in_group(None, 'tcos'): msg=(_("In order to lock and unlock internet you need to be in 'tcos' group.\n\nExe by root: adduser %s tcos" ) %(self.main.localdata.get_username())) shared.error_msg ( msg ) return result = self.main.localdata.BlockNet(act, self.connected_users[0], ports, eth) if result == "disabled": self.main.dbus_action.do_message( self.connected_users, remote_msg ) else: result = self.main.xmlrpc.tnc(act, self.connected_users[0].split(":")[0], ports) if result == "disabled": self.main.xmlrpc.DBus("mess", remote_msg) self.change_lockscreen(ip) def unlocknet_simple(self, w, ip): if not self.get_client(): return # unlock net remote_msg=_("Internet connection has been enabled") act="enable-internet" if len(self.connected_users) == 0 or self.connected_users[0] == shared.NO_LOGIN_MSG: shared.error_msg ( _("Can't enable internet, user is not logged") ) return if self.client_type == "tcos": if not self.main.localdata.user_in_group(None, 'tcos'): msg=(_("In order to lock and unlock internet you need to be in 'tcos' group.\n\nExe by root: adduser %s tcos" ) %(self.main.localdata.get_username())) shared.error_msg ( msg ) return result = self.main.localdata.BlockNet(act, self.connected_users[0]) if result == "enabled": self.main.dbus_action.do_message( self.connected_users, remote_msg ) else: result = self.main.xmlrpc.tnc(act, self.connected_users[0].split(":")[0]) if result == "enabled": self.main.xmlrpc.DBus("mess", remote_msg) self.change_lockscreen(ip) def locknet_all(self, *args): if not self.get_all_clients(): return if not self.main.localdata.user_in_group(None, 'tcos'): msg=(_("In order to lock and unlock internet you need to be in 'tcos' group.\n\nExe by root: adduser %s tcos" ) %(self.main.localdata.get_username())) shared.error_msg ( msg ) return # disable internet eth=self.main.config.GetVar("network_interface") ports="--ports=%s" %self.main.config.GetVar("ports_tnc") remote_msg=_("Internet connection has been disabled") act="disable-internet" if len(self.connected_users) == 0 or self.connected_users[0] == shared.NO_LOGIN_MSG: shared.error_msg( _("No users logged.") ) return msg=_( _("Do you want disable internet to following users: %s?" )%(self.connected_users_txt) ) if not shared.ask_msg ( msg ): return newusernames=[] for user in self.connected_users: if user.find(":") != -1: usern, ip=user.split(":") self.main.xmlrpc.newhost(ip) result = self.main.xmlrpc.tnc(act, usern, ports) if result == "disabled": self.main.xmlrpc.DBus("mess", remote_msg) else: result = self.main.localdata.BlockNet(act, user, ports, eth) if result == "disabled": newusernames.append(user) result = self.main.dbus_action.do_message( newusernames, remote_msg ) for client in self.newallclients: self.main.localdata.newhost(client) self.main.xmlrpc.newhost(client) self.change_lockscreen(client) def unlocknet_all(self, *args): if not self.get_all_clients(): return if not self.main.localdata.user_in_group(None, 'tcos'): msg=(_("In order to lock and unlock internet you need to be in 'tcos' group.\n\nExe by root: adduser %s tcos" ) %(self.main.localdata.get_username())) shared.error_msg ( msg ) return # enable internet remote_msg=_("Internet connection has been enabled") act="enable-internet" if len(self.connected_users) == 0 or self.connected_users[0] == shared.NO_LOGIN_MSG: shared.error_msg( _("No users logged.") ) return msg=_( _("Do you want enable internet to following users: %s?" )%(self.connected_users_txt) ) if not shared.ask_msg ( msg ): return newusernames=[] for user in self.connected_users: if user.find(":") != -1: usern, ip=user.split(":") self.main.xmlrpc.newhost(ip) result = self.main.xmlrpc.tnc(act, usern) if result == "enabled": self.main.xmlrpc.DBus("mess", remote_msg) else: result = self.main.localdata.BlockNet(act, user) if result == "enabled": newusernames.append(user) result = self.main.dbus_action.do_message( newusernames, remote_msg ) for client in self.newallclients: self.main.localdata.newhost(client) self.main.xmlrpc.newhost(client) self.change_lockscreen(client) __extclass__=TcosNetController tcosmonitor/tcosmonitor/extensions/tcospersonalize.py0000664000000000000000000000372512260544373020720 0ustar # -*- coding: UTF-8 -*- # TcosMonitor version __VERSION__ # # Copyright (c) 2006-2011 Mario Izquierdo # # This package is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # # This package is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. """ template extension """ from gettext import gettext as _ import os import sys from tcosmonitor import shared from tcosmonitor.TcosExtensions import TcosExtension def print_debug(txt): if shared.debug: print >> sys.stderr, "%s::%s" % (__name__, txt) #print("%s::%s" % (__name__, txt), file=sys.stderr) class TcosPersonalize(TcosExtension): def register(self): self.main.menus.register_simple( _("Configure this host"), "menu_configure.png", 0, self.launch_tcospersonalize, "personalize") def launch_tcospersonalize(self, w, ip): if not self.get_client(): return if self.client_type == "tcos": if self.main.ingroup_tcos == False and os.getuid() != 0: cmd="gksu \"tcospersonalize --host=%s\"" %(ip) else: cmd="tcospersonalize --host=%s" %(ip) print_debug ( "launch_tcospersonalize() cmd=%s" %(cmd) ) th=self.main.common.exe_cmd( cmd, verbose=0, background=True ) else: shared.info_msg( _("%s is not supported to personalize!") %(self.client_type) ) __extclass__=TcosPersonalize tcosmonitor/tcosmonitor/extensions/clean.py0000664000000000000000000000311312260544373016545 0ustar # -*- coding: UTF-8 -*- # TcosMonitor version __VERSION__ # # Copyright (c) 2006-2011 Mario Izquierdo # # This package is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # # This package is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. """ template extension """ from gettext import gettext as _ import sys from tcosmonitor import shared from tcosmonitor.TcosExtensions import TcosExtension def print_debug(txt): if shared.debug: print >> sys.stderr, "%s::%s" % (__name__, txt) #print("%s::%s" % (__name__, txt), file=sys.stderr) class Clean(TcosExtension): def register(self): self.main.menus.register_simple(_("Clean info about terminal"), "menu_clear.png", 0, self.clean, "clean") self.main.menus.register_all( _("Clean info about terminal"), "menu_clear.png", 0, self.clean, "clean") def clean(self, *args): print_debug("clean()") self.main.datatxt.clean() self.main.write_into_statusbar('') __extclass__=Clean tcosmonitor/tcosmonitor/extensions/logout.py0000664000000000000000000000675612260544373017014 0ustar # -*- coding: UTF-8 -*- # TcosMonitor version __VERSION__ # # Copyright (c) 2006-2011 Mario Izquierdo # # This package is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # # This package is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. """ template extension """ from gettext import gettext as _ import sys from tcosmonitor import shared from tcosmonitor.TcosExtensions import TcosExtension def print_debug(txt): if shared.debug: print >> sys.stderr, "%s::%s" % (__name__, txt) #print("%s::%s" % (__name__, txt), file=sys.stderr) class LogOut(TcosExtension): def register(self): self.main.menus.register_simple( _("Logout client"), "menu_restartx.png", 0, self.logout, "restartx") self.main.menus.register_all( _("Logout clients"), "menu_restartx.png" , 0, self.logout_all, "restartx") def logout(self, w, ip): if not self.get_client(): return if len(self.connected_users) == 0 or self.connected_users[0] == shared.NO_LOGIN_MSG: shared.error_msg ( _("User not logged") ) return msg=_( _("Do you want to logout user: %s?" ) %(self.connected_users_txt) ) if shared.ask_msg ( msg ): newusernames=[] timeout=self.main.config.GetVar("actions_timeout") msg=_("Session will close in %s seconds") %timeout remote_cmd="/usr/lib/tcos/session-cmd-send LOGOUT %s %s" %(timeout, msg.replace("'", "´")) if self.connected_users[0].find(":") != -1: # we have a standalone user... self.main.xmlrpc.DBus("exec", remote_cmd ) else: newusernames.append(self.connected_users[0]) self.main.dbus_action.do_exec(newusernames, remote_cmd ) def logout_all(self, widget): if not self.get_all_clients(): return if len(self.connected_users) == 0 or self.connected_users[0] == shared.NO_LOGIN_MSG: shared.error_msg ( _("User not logged") ) return msg=_( _("Do you want to logout the following users: %s?" )%(self.connected_users_txt) ) if shared.ask_msg ( msg ): newusernames=[] timeout=self.main.config.GetVar("actions_timeout") msg=_("Session will close in %s seconds") %timeout remote_cmd="/usr/lib/tcos/session-cmd-send LOGOUT %s %s" %(timeout, msg.replace("'", "´")) for user in self.connected_users: if user.find(":") != -1: # we have a standalone user... usern, ip = user.split(":") self.main.xmlrpc.newhost(ip) self.main.xmlrpc.DBus("exec", remote_cmd ) else: newusernames.append(user) self.main.dbus_action.do_exec( newusernames, remote_cmd ) __extclass__=LogOut tcosmonitor/tcosmonitor/extensions/wakeonlan.py0000664000000000000000000001010312260544373017437 0ustar # -*- coding: UTF-8 -*- # TcosMonitor version __VERSION__ # # Copyright (c) 2006-2011 Mario Izquierdo # # This package is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # # This package is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. """ template extension """ from gettext import gettext as _ import sys from tcosmonitor import shared from tcosmonitor.TcosExtensions import TcosExtension from tcosmonitor.WakeOnLan import WakeOnLan def print_debug(txt): if shared.debug: print >> sys.stderr, "%s::%s" % (__name__, txt) #print("%s::%s" % (__name__, txt), file=sys.stderr) class WOL(TcosExtension): def register(self): self.main.menus.register_simple( _("Boot client (WakeOnLan)") , "menu_wol.png", 0, self.wol_one, "wakeonlan") self.main.menus.register_all( _("Boot All clients (WakeOnLan)") , "menu_wol.png", 0, self.wol_all, "wakeonlan") def wol_one(self, widget, ip): if not self.get_client(): print_debug("wol_one() no client") return if self.main.config.GetVar("scan_network_method") != "static": msg=(_("Wake On Lan only works with static list.\n\nEnable scan method \"static\" in Preferences\nand (wake on lan) support in bios of clients." )) shared.info_msg ( msg ) return msg=_( _("Do you want boot %s client?" %ip)) if shared.ask_msg ( msg ): data=[] hostslist=self.main.config.GetVar("statichosts") #eth=self.main.config.GetVar("network_interface") if hostslist == "": return data=hostslist.split("#") data=data[:-1] for host in data: mip, mac=host.split("|") print_debug("wol_one() ip=%s mac=%s" %(mip, mac) ) if mip == self.main.selected_ip: if mac == "": self.main.write_into_statusbar(_("No register MAC address for ip: \"%s\"")%ip) continue print_debug("Send magic packet to mac=%s" %mac) if not WakeOnLan("%s"%mac): self.main.write_into_statusbar(_("Not valid MAC address: \"%s\"")%mac) def wol_all(self, *args): if self.main.config.GetVar("scan_network_method") != "static": msg=(_("Wake On Lan only works with static list.\n\nEnable scan method \"static\" in Preferences\nand (wake on lan) support in bios of clients." )) shared.info_msg ( msg ) return msg=_( _("Do you want boot all clients?" )) if shared.ask_msg ( msg ): data=[] hostslist=self.main.config.GetVar("statichosts") #eth=self.main.config.GetVar("network_interface") if hostslist == "": return data=hostslist.split("#") data=data[:-1] errors=[] for host in data: mac=host.split("|")[1] if mac == "": self.main.write_into_statusbar(_("No register MAC address for ip: \"%s\"")%host) continue print_debug("Send magic packet to mac=%s" %mac) if not WakeOnLan("%s"%mac): errors.append(mac) if len(errors) >1: print_debug("menu_event_all() errors=%s"%errors) self.main.write_into_statusbar(_("Not valid MAC address: \"%s\"")%" ".join(errors)) __extclass__=WOL tcosmonitor/tcosmonitor/extensions/italc.py0000664000000000000000000000643212260544373016566 0ustar # -*- coding: UTF-8 -*- # TcosMonitor version __VERSION__ # # Copyright (c) 2006-2011 Mario Izquierdo # # This package is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # # This package is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. """ template extension """ from gettext import gettext as _ from time import sleep import sys from tcosmonitor import shared from tcosmonitor.TcosExtensions import TcosExtension def print_debug(txt): if shared.debug: print >> sys.stderr, "%s::%s" % (__name__, txt) #print("%s::%s" % (__name__, txt), file=sys.stderr) class iTalc(TcosExtension): def register(self): self.main.menus.register_simple( _("Connect to remote screen (iTALC)"), "menu_remote.png", 1, self.ivs, "italc") def ivs(self, w, ip): if not self.get_client(): return if len(self.allclients_logged) == 0: shared.error_msg( _("No user logged.") ) return self.main.worker=shared.Workers(self.main, target=self.start_ivs, args=(self.allclients_logged) ) self.main.worker.start() def start_ivs(self, ip): self.main.xmlrpc.newhost(ip) # check if remote proc is running if not self.main.xmlrpc.GetStatus("ivs"): self.main.common.threads_enter("TcosActions:start_ivs write connecting msg") self.main.write_into_statusbar( "Connecting with %s to start iTALC support" %(ip) ) self.main.common.threads_leave("TcosActions:start_ivs write connecting msg") try: self.main.xmlrpc.newhost(ip) self.main.xmlrpc.Exe("startivs") self.main.common.threads_enter("TcosActions:start_ivs write waiting msg") self.main.write_into_statusbar( "Waiting for start of IVS server..." ) self.main.common.threads_leave("TcosActions:start_ivs write waiting msg") sleep(5) except Exception, err: print_debug("start_ivs() Exception, error=%s"%err) self.main.common.threads_enter("TcosActions:start_ivs write error msg") shared.error_msg ( _("Can't start IVS, please add iTALC support") ) self.main.common.threads_leave("TcosActions:start_ivs write error msg") return cmd = "icv " + ip + " root" print_debug ( "start_process() threading \"%s\"" %(cmd) ) self.main.common.exe_cmd (cmd, verbose=0, background=True) self.main.common.threads_enter("TcosActions:start_ivs END") self.main.write_into_statusbar( "" ) self.main.common.threads_leave("TcosActions:start_ivs END") __extclass__=iTalc tcosmonitor/tcosmonitor/extensions/livevnc.py0000664000000000000000000001760612260544373017145 0ustar # -*- coding: UTF-8 -*- # TcosMonitor version __VERSION__ # # Copyright (c) 2006-2011 Mario Izquierdo # # This package is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # # This package is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. from gettext import gettext as _ import gtk import sys # needed for get_screenshot from time import sleep from tcosmonitor import shared from tcosmonitor.TcosExtensions import TcosExtension from tcosmonitor.ping import PingPort import gtkvnc from random import Random import string def print_debug(txt): if shared.debug: print >> sys.stderr, "%s::%s" % (__name__, txt) #print("%s::%s" % (__name__, txt), file=sys.stderr) class LiveVNC(TcosExtension): def register(self): self.main.menus.register_all( _("Live view screens with VNC") , "menu_remote.png", 1, self.live_all, "livevnc") self.main.livevnc={} self.vncpasswd="" self.vncxres={} self.main.triggers['clean.datatxt']=self.__cleandatatxt self.main.stop_liveview_button=None ########### MULTIPLE HOSTS ############### def live_all(self, widget): if not self.get_all_clients(): return self.vncpasswd=''.join( Random().sample(string.letters+string.digits, 12) ) self.main.worker=shared.Workers(self.main, None, None) self.main.worker.set_for_all_action(self.action_for_clients, self.allclients, 'livevnc' ) def start_action(self, *args): print_debug("START_ACTION") self.main.datatxt.clean() self.main.stop_liveview_button=gtk.Button(_("Stop") ) self.main.stop_liveview_button.connect("clicked", self.__cleandatatxt, 'force') self.main.stop_liveview_button.show() self.main.datatxt.insert_block( _("Live view of all hosts") ) #""" """ ) self.main.datatxt.insert_html("
") def real_action(self, ip, action): #print_debug("real_action() ip=%s self.main.livevnc=%s" %(ip, self.main.livevnc) ) max_wait=10 # generate pass on client #self.main.xmlrpc.newhost(ip) self.main.xmlrpc.vnc("genpass", ip, self.vncpasswd) # start x11vnc result=self.main.xmlrpc.vnc("startscale", ip) print_debug("real_action() start remote x11vnc result=%s"%result) if result.find("error") != -1: return # wait for start status = "CLOSED" wait=0 while status != "OPEN": status=PingPort(ip, 5900).get_status() if status == "CLOSED": sleep(1) wait+=1 if wait > max_wait: break # start vnc and save in self.main.vnc dict self.main.livevnc[ip]=gtkvnc.Display() self.main.livevnc[ip].set_credential(gtkvnc.CREDENTIAL_PASSWORD, self.vncpasswd) self.main.livevnc[ip].set_credential(gtkvnc.CREDENTIAL_CLIENTNAME, self.main.name) self.main.livevnc[ip].connect("vnc-auth-credential", self._vnc_auth_cred, ip) #self.main.livevnc[ip].connect("size-request", self._force_resize, ip) self.main.livevnc[ip].connect("vnc-connected", self._vnc_connected, ip) #self.main.livevnc[ip].connect("clicked", self._vnc_clicked, ip) self.main.livevnc[ip].connect("button-press-event", self.on_iconview_click, ip) # this freeze GUI #self.main.livevnc[ip].set_tooltip_text("%s"%ip) #print dir(self.main.livevnc[ip]) print_debug("real_action() vnc started!!! ") def _vnc_clicked(self, vnc, ip): print_debug("_vnc_clicked() vnc=%s ip=%s"%(vnc, ip)) def on_iconview_click(self, widget, event, ip): if event.button == 3: self.main.force_selected_ip=ip # right click show menu self.main.menus.RightClickMenuOne( None , None, ip) self.main.menu.popup( None, None, None, event.button, event.time) return True def _vnc_auth_cred(self, *args): #print_debug("vnc_auth_cred() args=%s"%args) return def _force_resize(self, src, size, ip): #print_debug("_force_resize() src=%s size=%s ip=%s"%(src, size, ip)) w, h = src.get_size_request() #print "_force_resize() w=%s h=%s"%(w, h) if w == -1 or h == -1: print_debug("_force_resize() returning w=%s h=%s ip=%s"%(w, h, ip)) return width=300 height=200 if self.vncxres.has_key(ip): # cached data width=self.vncxres[ip][0] height=self.vncxres[ip][1] else: self.vncxres[ip]=[width, height] try: screensize=self.main.xmlrpc.ReadInfo("screensize") if screensize != '': width=int(screensize.split('x')[0]) * 100 / int(self.main.config.GetVar("miniscrot_size")) height=int(screensize.split('x')[1]) * 100 / int(self.main.config.GetVar("miniscrot_size")) self.vncxres[ip]=[width, height] print_debug("_force_resize() RESIZE w=%s h=%s"%(width, height)) except Exception, err: print_debug("_force_resize() Exception err=%s"%err) width=300 height=200 self.vncxres[ip]=[width, height] self.main.livevnc[ip].set_size_request(self.vncxres[ip][0], self.vncxres[ip][1]) def _vnc_connected(self, vnc, ip): print_debug("_vnc_connected() vnc=%s livevnc[ip]=%s ip=%s"%(vnc, self.main.livevnc[ip], ip)) self.main.livevnc[ip].show() self.main.livevnc[ip].realize() def finish_action(self, *args): for ip in self.main.livevnc: #self.main.livevnc[ip] hostname=self.main.localdata.GetUsername(ip) if hostname == shared.NO_LOGIN_MSG: hostname=self.main.localdata.GetHostname(ip) self.main.datatxt.insert_html( "" + "\n\t " %(ip, hostname) + "__\n"+ "") self.main.livevnc[ip].open_host(ip, '5900') #self.main.livevnc[ip].set_scaling(True) self.main.livevnc[ip].set_read_only(True) self.main.livevnc[ip].show() # draw widgets self.main.datatxt.display() stopargs={"target": "livevnc"} self.add_progressbox( stopargs, _("Running in LiveView mode") ) def on_progressbox_click(self, widget, args, box): try: box.destroy() except: pass self.__cleandatatxt(None, 'force') def __cleandatatxt(self, *args): # stop all livevnc connections for ip in self.main.livevnc: print_debug("__cleandatatxt() STOPPING ip=%s"%ip) self.main.livevnc[ip].close() # stop server (don't wait) self.main.xmlrpc.vnc("stopserver", ip ) self.main.livevnc={} if len(args) == 2 and args[1] == 'force': self.main.datatxt.clean() self.main.stop_liveview_button=None __extclass__=LiveVNC tcosmonitor/tcosmonitor/extensions/appsmsg.py0000664000000000000000000003546112260544373017150 0ustar # -*- coding: UTF-8 -*- # TcosMonitor version __VERSION__ # # Copyright (c) 2006-2011 Mario Izquierdo # # This package is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # # This package is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. """ template extension """ from gettext import gettext as _ from tcosmonitor import shared from tcosmonitor.TcosExtensions import TcosExtension import gtk from time import time import os import sys import glob def print_debug(txt): if shared.debug: print >> sys.stderr, "%s::%s" % (__name__, txt) #print("%s::%s" % (__name__, txt), file=sys.stderr) def crono(start, txt): print_debug ("crono(), %s get %f seconds" %(txt, (time() - start)) ) return class AppsAndMsgs(TcosExtension): def register(self): self.init_ask() self.main.classview.class_external_exe=self.exe_app_external self.main.actions.button_action_exe=self.exe_app_all self.main.actions.button_action_text=self.send_msg_all self.main.menus.register_simple( _("Exec app on user display") , "menu_exec.png", 1, self.exe_app, "exe") self.main.menus.register_simple( _("Send a text message to user") , "menu_msg.png", 1, self.send_msg, "text") self.main.menus.register_all( _("Exec same app in all connected users") , "menu_exec.png", 1, self.exe_app_all, "exe") self.main.menus.register_all( _("Send a text message to all connected users") , "menu_msg.png", 1, self.send_msg_all, "text") ############################################################################## def askfor(self, mode="mess", msg="", users=None, users_txt=None): if users == None or users_txt == None: users=[] self.ask_usernames=[] if len(users) == 0 or users[0] == shared.NO_LOGIN_MSG: shared.error_msg( _("Clients not connected") ) return else: self.ask_usernames=users #users_txt="" #counter=1 #for user in self.ask_usernames: # users_txt+="%s, " %(user) # print_debug("askfor() counter=%s" %(counter) ) # if counter % 4 == 0: # users_txt+="\n" # counter=int(counter+1) #if users_txt[-2:] == "\n": users_txt=users_txt[:-2] #if users_txt[-2:] == ", ": users_txt=users_txt[:-2] if mode == "exec": # enable drag & drop self.main.ask_fixed.show() self.main.ask_dragdrop.show() self.main.image_entry.show() self.main.image_entry.set_from_stock(gtk.STOCK_DIALOG_QUESTION, 4) self.main.ask_label.set_markup( _("Exec app in user(s) screen(s)\nor open web address to:\n%s" ) %( users_txt ) ) elif mode == "mess": self.main.ask_label.set_markup( _("Send a message to:\n%s" ) %( users_txt ) ) elif mode == "any": self.main.ask_label.set_markup( msg ) self.ask_mode=mode self.main.ask.show() return True def on_ask_exec_click(self, widget): app=self.main.ask_entry.get_text() if app != "": self.exe_app_in_client_display(app) return def on_ask_cancel_click(self, widget): self.main.ask.hide() self.main.ask_entry.set_text("") # disable drag & drop self.main.ask_fixed.hide() self.main.image_entry.hide() self.main.ask_dragdrop.hide() return ############################################################################## def exe_app_external(self, filename=None, txt=None): if self.main.classview.ismultiple() or txt != None: if not self.get_all_clients(): return elif not self.get_client(): return if len(self.connected_users) == 0 or self.connected_users[0] == shared.NO_LOGIN_MSG: shared.error_msg ( _("Can't exec application, user is not logged") ) return #print_debug("user=%s data=%s" %(self.connected_users, data) app="" self.ask_usernames=self.connected_users self.ask_mode="exec" if txt != None: app="x-www-browser %s" %txt self.exe_app_in_client_display(app) return print_debug("open_file() reading data from \"%s\"..." \ %(filename) ) try: fd=file(filename, 'r') data=fd.readlines() fd.close() except Exception, err: shared.error_msg( _("%s is not a valid application") %(os.path.basename(filename)) ) return for line in data: if line != '\n': if line.startswith("Exec="): line=line.replace('\n', '') action, app=line.split("=",1) app=app.replace("%U","").replace("%u","").replace("%F","").replace("%f","").replace("%c","").replace("%i","").replace("%m","") if len(app) <1: shared.error_msg( _("%s is not a valid application") %(os.path.basename(filename)) ) if app != "": self.exe_app_in_client_display(app) return def exe_app(self, w, ip): if not self.get_client(): return if len(self.connected_users) == 0 or self.connected_users[0] == shared.NO_LOGIN_MSG: shared.error_msg ( _("Can't exec application, user is not logged") ) return self.askfor(mode="exec", users=self.connected_users, users_txt=self.connected_users_txt) def send_msg(self, w, ip): if not self.get_client(): return if len(self.connected_users) == 0 or self.connected_users[0] == shared.NO_LOGIN_MSG: shared.error_msg ( _("Can't send message, user is not logged") ) return self.askfor(mode="mess", users=self.connected_users, users_txt=self.connected_users_txt) def exe_app_all(self, *args): if not self.get_all_clients(): return self.askfor(mode="exec", users=self.connected_users, users_txt=self.connected_users_txt) def send_msg_all(self, *args): if not self.get_all_clients(): return self.askfor(mode="mess", users=self.connected_users, users_txt=self.connected_users_txt) ####################### INIT ############################################ def init_ask(self): self.main.ask_ip=None self.ui = gtk.Builder() self.ui.set_translation_domain(shared.PACKAGE) self.ui.add_from_file(shared.GLADE_DIR + 'tcosmonitor-askwindow.ui') self.main.ask = self.ui.get_object('askwindow') self.main.ask.connect('delete-event', self.askwindow_close ) self.main.ask.set_icon_from_file(shared.IMG_DIR +'tcos-icon-32x32.png') self.main.ask_label = self.ui.get_object('txt_asklabel') ## arrastrar y soltar self.main.ask_fixed = self.ui.get_object('ask_fixed') self.main.ask_dragdrop = self.ui.get_object('label99') self.main.image_entry = self.ui.get_object('image_askentry') self.main.image_entry.drag_dest_set( gtk.DEST_DEFAULT_ALL, [( 'text/uri-list', 0, 2 ), ], gtk.gdk.ACTION_DEFAULT | gtk.gdk.ACTION_COPY) self.main.image_entry.connect( 'drag_data_received', self.on_drag_data_received) self.main.ask_fixed.hide() self.main.image_entry.hide() self.main.ask_dragdrop.hide() ## fin arrastrar y soltar self.liststore = gtk.ListStore(str) for s in shared.appslist: self.liststore.append([s]) self.main.ask_entry = self.ui.get_object('txt_askentry') self.main.ask_completion = gtk.EntryCompletion() self.main.ask_completion.set_model(self.liststore) self.main.ask_entry.set_completion(self.main.ask_completion) self.main.ask_completion.set_text_column(0) self.main.ask_completion.connect('match-selected', self.match_cb) self.main.ask_entry.connect('activate', self.activate_cb) self.main.ask_cancel = self.ui.get_object('ask_cancelbutton') self.main.ask_exec = self.ui.get_object('ask_exebutton') # buttons signals self.main.ask_exec.connect('clicked', self.on_ask_exec_click) self.main.ask_cancel.connect('clicked', self.on_ask_cancel_click) def askwindow_close(self, widget, event): print_debug ( "askwindow_close() closing ask window" ) self.main.ask.hide() return True def on_drag_data_received( self, widget, context, x, y, selection, targetType, dtime): files = selection.data.split('\n', 1) start1=time() print_debug("on_drag_data_received() files=%s dtime=%s"%(files, dtime)) for f in files: if f: desktop = f.strip().replace('%20', ' ') break if desktop.startswith('file:///') and desktop.lower().endswith('.desktop') and os.path.isfile(desktop[7:]): print_debug("open_file() reading data from \"%s\"..." \ %(desktop[7:]) ) fd=file(desktop[7:], 'r') data=fd.readlines() fd.close() # try to load gnome theme with gconf mytheme=[] theme=self.main.common.get_icon_theme() print_debug("on_drag_data_received() gconf theme=%s"%theme) str_image="" files=[] if theme and os.path.isdir("/usr/share/icons/%s"%theme): files+=glob.glob("/usr/share/icons/%s/48x48/*.png"%(theme)) files+=glob.glob("/usr/share/icons/hicolor/48x48/*/*.png") + \ glob.glob("/usr/share/icons/gnome/48x48/*/*.png") + \ glob.glob("/usr/share/pixmaps/*png") +\ glob.glob("/usr/share/pixmaps/*xpm") for line in data: if line != '\n': if line.startswith("Exec="): line=line.replace('\n', '') action, str_exec=line.split("=",1) str_exec=str_exec.replace("%U","").replace("%u","").replace("%F","").replace("%f","").replace("%c","").replace("%i","").replace("%m","") elif line.startswith("Icon="): line=line.replace('\n', '') action, image_name=line.split("=",1) if not os.path.isfile(image_name): start2=time() for f in files: if image_name in f or image_name.replace('_', '-') in f: str_image=f crono(start2, "on_drag_data_received() ICON FOUND AT %s"%f ) break else: str_image=image_name if len(str_exec) <1: shared.error_msg( _("%s is not application") %(os.path.basename(desktop[7:])) ) else: if len(str_image) <1: print_debug("on_drag_data_received() image '%s' not found"%image_name) self.main.image_entry.set_from_stock(gtk.STOCK_DIALOG_QUESTION, 4) else: self.main.image_entry.set_from_file(str_image) self.main.ask_entry.set_text(str_exec) else: shared.error_msg( _("%s is not application") %(os.path.basename(desktop[7:])) ) crono(start1, "on_drag_data_received() end" ) return True def match_cb(self, completion, model, iter): print_debug ( "match_cb() " ) print_debug( "%s was selected" %(model[iter][0]) ) self.exe_app_in_client_display(model[iter][0]) return def activate_cb(self, entry): text = self.main.ask_entry.get_text() print_debug ( "activate_cb() text=%s" %(text) ) # append to liststore if text: if text not in [row[0] for row in self.liststore]: self.liststore.append([text]) #self.main.ask_entry.set_text('') # exe app self.exe_app_in_client_display(text) return def exe_app_in_client_display(self, arg): usernames=self.ask_usernames newusernames=[] print_debug("exe_app_in_client_display() usernames=%s" %usernames) if arg.startswith('rm ') or arg.find(" rm ") != -1 \ or arg.startswith('mv ') or arg.find(" mv ") != -1 \ or arg.startswith('cp ') or arg.find(" cp ") != -1: arg="" #if self.ask_mode == "mess": # arg=arg.replace("'", "´") if self.ask_mode == "exec": if arg.startswith('http://') or arg.startswith('https://') or arg.startswith('ftp://'): arg="xdg-open %s" %arg for user in usernames: if user.find(":") != -1: # we have a standalone user... usern, ip = user.split(":") print_debug("exe_app_in_client_display() STANDALONE username=%s ip=%s" %(usern, ip)) self.main.xmlrpc.newhost(ip) self.main.xmlrpc.DBus(self.ask_mode, arg) else: newusernames.append(user) # we have a thin client user if self.ask_mode == "exec": result = self.main.dbus_action.do_exec( newusernames , arg ) if not result: shared.error_msg ( _("Error while exec remote app:\nReason: %s") %( self.main.dbus_action.get_error_msg() ) ) else: self.main.ask.hide() self.main.ask_entry.set_text("") elif self.ask_mode == "mess": result = self.main.dbus_action.do_message( newusernames , arg) if not result: shared.error_msg ( _("Error while send message:\nReason: %s") %( self.main.dbus_action.get_error_msg() ) ) self.main.ask_dragdrop.hide() self.main.ask_fixed.hide() self.main.image_entry.hide() self.main.ask.hide() self.main.ask_entry.set_text("") dbus_action=None self.ask_mode=None return __extclass__=AppsAndMsgs tcosmonitor/tcosmonitor/extensions/remotessh.py0000664000000000000000000000343412260544373017502 0ustar # -*- coding: UTF-8 -*- # TcosMonitor version __VERSION__ # # Copyright (c) 2006-2011 Mario Izquierdo # # This package is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # # This package is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. """ template extension """ from gettext import gettext as _ import sys from tcosmonitor import shared from tcosmonitor.TcosExtensions import TcosExtension def print_debug(txt): if shared.debug: print >> sys.stderr, "%s::%s" % (__name__, txt) #print("%s::%s" % (__name__, txt), file=sys.stderr) class RemoteSSH(TcosExtension): def register(self): self.main.menus.register_simple( _("Give a remote xterm"), "menu_xterm.png", 0, self.remotessh, "shell") def remotessh(self, w, ip): if not self.get_client(): return # give a remote xterm throught SSH pass_msg=_("Enter password of remote thin client (if asked for it)") cmd="xterm -e \"echo '%s'; ssh %s@%s || sleep 5\"" %(pass_msg, self.main.config.GetVar("ssh_remote_username"),ip) print_debug ( "remotessh() cmd=%s" %(cmd) ) th=self.main.common.exe_cmd( cmd, verbose=0, background=True ) __extclass__=RemoteSSH tcosmonitor/tcosmonitor/extensions/audiortp.py0000664000000000000000000006161212260544373017322 0ustar # -*- coding: UTF-8 -*- # TcosMonitor version __VERSION__ # # Copyright (c) 2006-2011 Mario Izquierdo # # This package is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # # This package is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. """ template extension """ from gettext import gettext as _ import gtk import sys from tcosmonitor import shared from tcosmonitor.TcosExtensions import TcosExtension COL_N, COL_ACTIVE,COL_B,COL_BOOL= range(4) def print_debug(txt): if shared.debug: print >> sys.stderr, "%s::%s" % (__name__, txt) #print("%s::%s" % (__name__, txt), file=sys.stderr) class AudioRTP(TcosExtension): def register(self): self.rtp_count={} self.rtp_control_count={} self.control_list=False self.init_chat() self.main.actions.button_action_audio=self.rtp_all self.main.actions.button_action_chat=self.rtp_chat self.main.actions.button_action_list=self.control_chat self.main.menus.register_all( _("Send audio conference") , "menu_rtp.png", 2, self.rtp_all, "conference") self.main.menus.register_all( _("Audio chat conference") , "menu_chat.png", 2, self.rtp_chat, "conference") self.main.menus.register_all( _("Audio chat list") , "menu_list.png", 2, self.control_chat, "conference") self.main.menus.register_simple( _("Send audio conference (from this host)") , "menu_rtp.png", 2, self.rtp_simple, "conference") def init_chat(self): print_debug ("init chat control") self.selected_emission=None self.model=gtk.ListStore(str, gtk.gdk.Pixbuf, str, 'gboolean') self.ui = gtk.Builder() self.ui.set_translation_domain(shared.PACKAGE) self.ui.add_from_file(shared.GLADE_DIR + 'tcosmonitor-chatwindow.ui') self.main.chatwindow=self.ui.get_object('chatwindow') self.main.chatwindow.connect('delete-event', self.chat_exit ) self.main.chatlist = self.ui.get_object('chatlist') self.main.chatlist.set_model (self.model) cell1 = gtk.CellRendererText () column1 = gtk.TreeViewColumn (_("Emission"), cell1, text = COL_N) column1.set_resizable (True) column1.set_sort_column_id(COL_N) self.main.chatlist.append_column (column1) cell2 = gtk.CellRendererPixbuf() column2 = gtk.TreeViewColumn (_("State"), cell2, pixbuf = COL_ACTIVE) self.main.chatlist.append_column (column2) cell3 = gtk.CellRendererText () column3 = gtk.TreeViewColumn (_("Channel"), cell3, text = COL_B) column3.set_resizable (True) column3.set_sort_column_id(COL_B) self.main.chatlist.append_column (column3) self.table_file = self.main.chatlist.get_selection() self.table_file.connect("changed", self.on_chat_list_change) self.main.chat_button_disconnect=self.ui.get_object('button_chat_disconnect') self.main.chat_button_disconnect.connect('clicked', self.chat_disconnect) self.main.chat_button_connect=self.ui.get_object('button_chat_connect') self.main.chat_button_connect.connect('clicked', self.chat_connect) self.main.chat_button_exit=self.ui.get_object('button_exit') self.main.chat_button_exit.connect('clicked', self.chat_exit) self.main.chat_button_disconnect.set_sensitive(False) self.main.chat_button_connect.set_sensitive(False) self.main.chatwindow.hide() def control_chat(self, *args): #if len(self.rtp_count) < 1: # shared.info_msg( _("No active chats to manage") ) # return self.populate_data(self.rtp_count) self.main.chatwindow.show() self.control_list=True def populate_data(self, data): self.image_noactive = gtk.gdk.pixbuf_new_from_file(shared.IMG_DIR + 'no.png') self.image_active = gtk.gdk.pixbuf_new_from_file(shared.IMG_DIR + 'ok.png') for item in data: if data[item] not in self.rtp_control_count.keys(): continue self.new_line=True model=self.main.chatlist.get_model() model.foreach(self.line_exists, data[item]) if self.new_line: self.iter = self.model.append (None) name="Chat %s" %item self.model.set_value (self.iter, COL_N, name ) self.model.set_value (self.iter, COL_B, data[item] ) if len(self.rtp_control_count[data[item]]) < 1: self.model.set_value (self.iter, COL_ACTIVE, self.image_noactive ) self.model.set_value (self.iter, COL_BOOL, False ) else: self.model.set_value (self.iter, COL_ACTIVE, self.image_active ) self.model.set_value (self.iter, COL_BOOL, True ) def control_buttons(self, active): if active: self.main.chat_button_disconnect.set_sensitive(True) self.main.chat_button_connect.set_sensitive(False) else: self.main.chat_button_disconnect.set_sensitive(False) self.main.chat_button_connect.set_sensitive(True) def on_chat_list_change (self, data): (model, iter) = self.main.chatlist.get_selection().get_selected() if not iter: self.control_buttons(False) return self.selected_num=model.get_value(iter,0) self.selected_channel=model.get_value(iter, 2) self.connected_rtp=model.get_value(iter, 3) print_debug("selected_num=%s selected_channel=%s connected=%s" %(self.selected_num, self.selected_channel, self.connected_rtp)) if self.connected_rtp: self.control_buttons(True) else: self.control_buttons(False) def chat_disconnect(self, *args): (model, iter) = self.main.chatlist.get_selection().get_selected() if not iter: self.control_buttons(False) return self.selected_channel=model.get_value(iter, 2) self.main.common.exe_cmd("pactl unload-module %s" %self.rtp_control_count[self.selected_channel][0]) self.main.common.exe_cmd("pactl unload-module %s" %self.rtp_control_count[self.selected_channel][1]) self.rtp_control_count[self.selected_channel]=[] print_debug("chat_connects %s" %self.rtp_control_count) model.foreach(self.line_changer, [self.selected_channel, self.image_noactive, False]) self.main.chat_button_disconnect.set_sensitive(False) self.main.chat_button_connect.set_sensitive(True) return True def chat_connect(self, *args): (model, iter) = self.main.chatlist.get_selection().get_selected() if not iter: self.control_buttons(False) return self.selected_channel=model.get_value(iter, 2) output_send = self.main.common.exe_cmd("pactl load-module module-rtp-send format=s16be channels=2 rate=44100 source=@DEFAULT_SOURCE@ loop=0 destination=%s" %self.selected_channel) output_recv = self.main.common.exe_cmd("pactl load-module module-rtp-recv sap_address=%s" %self.selected_channel) if output_send != "" or output_recv != "": self.rtp_control_count[self.selected_channel]=[output_send, output_recv] print_debug("chat_connects %s" %self.rtp_control_count) model.foreach(self.line_changer, [self.selected_channel, self.image_active, True]) self.main.chat_button_disconnect.set_sensitive(True) self.main.chat_button_connect.set_sensitive(False) return True def chat_exit(self, *args): self.main.chatwindow.hide() self.model.clear() self.control_list=False return True def line_exists(self, model, path, iter, args): ip = args # change mac if ip is the same. if model.get_value(iter, 2) == ip: self.new_line=False def line_changer(self, model, path, iter, args): ip, image, active = args # change mac if ip is the same. if model.get_value(iter, 2) == ip: model.set_value(iter, 1, image) model.set_value(iter, 3, active) def line_delete(self, model, path, iter, args): ip = args if model.get_value(iter, 2) == ip: self.delete_iter=iter def chat_delete(self, data): print_debug("chat_delete() data=%s" %data) model=self.main.chatlist.get_model() self.delete_iter=None model.foreach(self.line_delete, data) # delete iter if found if self.delete_iter is not None: model.remove(self.delete_iter) def rtp_all(self, *args): if not self.get_all_clients(): return # conference mode if len(self.connected_users) == 0 or self.connected_users[0] == shared.NO_LOGIN_MSG: shared.error_msg( _("No users logged.") ) return cmd=("LC_ALL=C LC_MESSAGES=C pactl --version 2>/dev/null | awk '{print $2}' | awk -F\".\" '{if ((int($2) >= 9) && (int($3) >= 10)) printf 1}'") output=self.main.common.exe_cmd(cmd) if output != "1": shared.error_msg( _("Your pulseaudio server is too old.\nIs required pulseaudio version >= 0.9.10") ) return msg=_( _("Do you want to start audio conference to the following users: %s?" )%(self.connected_users_txt) ) if not shared.ask_msg ( msg ): return remote_msg=_("You have entered in audio conference") eth=self.main.config.GetVar("network_interface") max_uip=255 uip=0 while uip <= max_uip: uip_cmd="225.0.0.%s" %(uip) cmd=("LC_ALL=C LC_MESSAGES=C netstat -putan 2>/dev/null | grep -c %s" %(uip_cmd) ) print_debug("Check broadcast ip %s." %(uip_cmd) ) output=self.main.common.exe_cmd(cmd) uip+=1 if output == "0" and uip_cmd not in self.rtp_count.values(): print_debug("Broadcast ip found: %s" %(uip_cmd)) ip_broadcast="%s" %uip_cmd break elif uip == max_uip: print_debug("Not found an available broadcast ip") return result = self.main.localdata.Route("route-add", ip_broadcast, "255.255.255.255", eth) if result == "error": print_debug("Add multicast-ip route failed") return self.main.common.exe_cmd("/usr/lib/tcos/pactl-controller.sh start-server") output = self.main.common.exe_cmd("pactl load-module module-rtp-send format=s16be channels=2 rate=44100 source=@DEFAULT_SOURCE@ loop=0 destination=%s" %ip_broadcast) self.main.write_into_statusbar( _("Waiting for start audio conference...") ) total=0 for client in self.newallclients: self.main.xmlrpc.rtp("startrtp-recv", client, ip_broadcast ) total+=1 if total < 1: self.main.write_into_statusbar( _("No users logged.") ) # kill x11vnc self.main.common.exe_cmd("pactl unload-module %s" %output) result = self.main.localdata.Route("route-del", ip_broadcast, "255.255.255.255", eth) if result == "error": print_debug("Del multicast-ip route failed") if len(self.rtp_count.keys()) == 0: self.main.common.exe_cmd("/usr/lib/tcos/pactl-controller.sh stop-server") else: newusernames=[] for user in self.connected_users: if user.find(":") != -1: # we have a standalone user... usern, ip = user.split(":") self.main.xmlrpc.newhost(ip) self.main.xmlrpc.DBus("mess", remote_msg) else: newusernames.append(user) self.main.dbus_action.do_message( newusernames, remote_msg ) self.main.write_into_statusbar( _("Running in audio conference with %s clients.") %(total) ) # new mode Stop Button if len(self.rtp_count.keys()) != 0: count=len(self.rtp_count.keys())-1 nextkey=self.rtp_count.keys()[count]+1 self.rtp_count[nextkey]=ip_broadcast else: nextkey=1 self.rtp_count[nextkey]=ip_broadcast #self.main.menus.broadcast_count[ip_broadcast]=None self.add_progressbox( {"target": "rtp", "pid":output, "allclients":self.newallclients, "ip":"", "ip_broadcast":ip_broadcast, "iface":eth, "key":nextkey}, _("Running in audio conference from server. Conference Nº %s") %(nextkey) ) def rtp_simple(self, widget, ip_simple): if not self.get_client(): return client_simple=self.connected_users_txt # conference mode if len(self.connected_users) == 0 or self.connected_users[0] == shared.NO_LOGIN_MSG: shared.error_msg( _("Can't start conference mode, user is not logged") ) return cmd=("LC_ALL=C LC_MESSAGES=C pactl --version 2>/dev/null | awk '{print $2}' | awk -F\".\" '{if ((int($2) >= 9) && (int($3) >= 10)) printf 1}'") output=self.main.common.exe_cmd(cmd) if output != "1": shared.error_msg( _("Your pulseaudio server is too old.\nIs required pulseaudio version >= 0.9.10") ) return msg=_( _("Do you want audio conference from user %s?" ) %(client_simple) ) if not shared.ask_msg ( msg ): return # Allow one client # if len(self.allclients) == 0: return remote_msg=_("You have entered in audio conference from user %s") %client_simple eth=self.main.config.GetVar("network_interface") max_uip=255 uip=0 while uip <= max_uip: uip_cmd="225.0.0.%s" %(uip) cmd=("LC_ALL=C LC_MESSAGES=C netstat -putan 2>/dev/null | grep -c %s" %(uip_cmd) ) print_debug("Check broadcast ip %s." %(uip_cmd) ) output=self.main.common.exe_cmd(cmd) uip+=1 if output == "0" and uip_cmd not in self.rtp_count.values(): print_debug("Broadcast ip found: %s" %(uip_cmd)) ip_broadcast="%s" %uip_cmd break elif uip == max_uip: print_debug("Not found an available broadcast ip") return if not self.get_all_clients(): return result = self.main.localdata.Route("route-add", ip_broadcast, "255.255.255.255", eth) if result == "error": print_debug("Add multicast-ip route failed") return #self.main.xmlrpc.newhost(ip) self.main.xmlrpc.rtp("startrtp-send", ip_simple, ip_broadcast ) self.main.write_into_statusbar( _("Waiting for start audio conference from user %s...") %(client_simple) ) output = self.main.common.exe_cmd("pactl load-module module-rtp-recv sap_address=%s" %ip_broadcast) newallclients2=[] total=1 for client in self.newallclients: self.main.localdata.newhost(client) if client != ip_simple: self.main.xmlrpc.rtp("startrtp-recv", client, ip_broadcast ) total+=1 newallclients2.append(client) if total < 1: self.main.write_into_statusbar( _("No users logged.") ) self.main.common.exe_cmd("pactl unload-module %s" %output) self.main.xmlrpc.rtp("stoprtp-send", ip_simple ) result = self.main.localdata.Route("route-del", ip_broadcast, "255.255.255.255", eth) if result == "error": print_debug("Del multicast-ip route failed") else: newusernames=[] for user in self.connected_users: if user.find(":") != -1: # we have a standalone user... usern, ip = user.split(":") self.main.xmlrpc.newhost(ip) self.main.xmlrpc.DBus("mess", remote_msg) else: newusernames.append(user) self.main.dbus_action.do_message( newusernames, remote_msg ) self.main.write_into_statusbar( _("Running in audio conference with %s clients.") %(total) ) # new mode Stop Button if len(self.rtp_count.keys()) != 0: count=len(self.rtp_count.keys())-1 nextkey=self.rtp_count.keys()[count]+1 self.rtp_count[nextkey]=ip_broadcast else: nextkey=1 self.rtp_count[nextkey]=ip_broadcast #self.main.menus.broadcast_count[ip_broadcast]=None self.add_progressbox( {"target": "rtp", "pid":output, "allclients":newallclients2, "ip":ip_simple, "ip_broadcast":ip_broadcast, "iface":eth, "key":nextkey}, _("Running in audio conference from user %(host)s. Conference Nº %(count)s") %{"host":client_simple, "count":nextkey} ) def rtp_chat(self, *args): if not self.get_all_clients(): return # conference mode if len(self.connected_users) == 0 or self.connected_users[0] == shared.NO_LOGIN_MSG: shared.error_msg( _("No users logged.") ) return cmd=("LC_ALL=C LC_MESSAGES=C pactl --version 2>/dev/null | awk '{print $2}' | awk -F\".\" '{if ((int($2) >= 9) && (int($3) >= 10)) printf 1}'") output=self.main.common.exe_cmd(cmd) if output != "1": shared.error_msg( _("Your pulseaudio server is too old.\nIs required pulseaudio version >= 0.9.10") ) return msg=_( _("Do you want to start audio chat conference to the following users: %s?" )%(self.connected_users_txt) ) if not shared.ask_msg ( msg ): return remote_msg=_("You have entered in audio chat conference. Participants: %s") %self.connected_users_txt eth=self.main.config.GetVar("network_interface") max_uip=255 uip=0 while uip <= max_uip: uip_cmd="225.0.0.%s" %(uip) cmd=("LC_ALL=C LC_MESSAGES=C netstat -putan 2>/dev/null | grep -c %s" %(uip_cmd) ) print_debug("Check broadcast ip %s." %(uip_cmd) ) output=self.main.common.exe_cmd(cmd) uip+=1 if output == "0" and uip_cmd not in self.rtp_count.values(): print_debug("Broadcast ip found: %s" %(uip_cmd)) ip_broadcast="%s" %uip_cmd break elif uip == max_uip: print_debug("Not found an available broadcast ip") return result = self.main.localdata.Route("route-add", ip_broadcast, "255.255.255.255", eth) if result == "error": print_debug("Add multicast-ip route failed") return self.main.write_into_statusbar( _("Waiting for start audio chat conference...") ) output_send="" output_recv="" self.rtp_control_count[ip_broadcast]=[] self.main.common.exe_cmd("/usr/lib/tcos/pactl-controller.sh start-server") msg=_( "Do you want to connect to this audio chat conference now?" ) if shared.ask_msg ( msg ): output_send = self.main.common.exe_cmd("pactl load-module module-rtp-send format=s16be channels=2 rate=44100 source=@DEFAULT_SOURCE@ loop=0 destination=%s" %ip_broadcast) output_recv = self.main.common.exe_cmd("pactl load-module module-rtp-recv sap_address=%s" %ip_broadcast) self.rtp_control_count[ip_broadcast]=[output_send, output_recv] total=0 for client in self.newallclients: self.main.xmlrpc.rtp("startrtp-chat", client, ip_broadcast ) total+=1 if total < 1: self.main.write_into_statusbar( _("No users logged.") ) # kill x11vnc if output_send != "" or output_recv != "": self.main.common.exe_cmd("pactl unload-module %s" %output_send) self.main.common.exe_cmd("pactl unload-module %s" %output_recv) del self.rtp_control_count[ip_broadcast] result = self.main.localdata.Route("route-del", ip_broadcast, "255.255.255.255", eth) if result == "error": print_debug("Del multicast-ip route failed") if len(self.rtp_count.keys()) == 0: self.main.common.exe_cmd("/usr/lib/tcos/pactl-controller.sh stop-server") else: newusernames=[] for user in self.connected_users: if user.find(":") != -1: # we have a standalone user... usern, ip = user.split(":") self.main.xmlrpc.newhost(ip) self.main.xmlrpc.DBus("mess", remote_msg) else: newusernames.append(user) self.main.dbus_action.do_message( newusernames, remote_msg ) self.main.write_into_statusbar( _("Running in audio chat conference with %s clients.") %(total) ) # new mode Stop Button if len(self.rtp_count.keys()) != 0: count=len(self.rtp_count.keys())-1 nextkey=self.rtp_count.keys()[count]+1 self.rtp_count[nextkey]=ip_broadcast else: nextkey=1 self.rtp_count[nextkey]=ip_broadcast if self.control_list: self.populate_data(self.rtp_count) #self.main.menus.broadcast_count[ip_broadcast]=None self.add_progressbox( {"target": "rtp-chat", "pid_send":output_send, "pid_recv":output_recv, "allclients":self.newallclients, "ip":"", "ip_broadcast":ip_broadcast, "iface":eth, "key":nextkey}, _("Running in audio chat conference. Conference Nº %s") %(nextkey) ) def on_progressbox_click(self, widget, args, box): box.destroy() print_debug("on_progressbox_click() widget=%s, args=%s, box=%s" %(widget, args, box) ) if not args['target']: return self.main.stop_running_actions.remove(widget) if args['target'] == "rtp": del self.rtp_count[args['key']] if args['ip_broadcast'] != "": result = self.main.localdata.Route("route-del", args['ip_broadcast'], "255.255.255.255", args['iface']) if result == "error": print_debug("Del multicast-ip route failed") #del self.main.menus.broadcast_count[args['ip_broadcast']] for client in args['allclients']: self.main.xmlrpc.rtp("stoprtp-recv", client) if "pid" in args: self.main.common.exe_cmd("pactl unload-module %s" %args['pid']) if args['ip'] != "": self.main.xmlrpc.rtp("stoprtp-send", args['ip'] ) if len(self.rtp_count.keys()) == 0: self.main.common.exe_cmd("/usr/lib/tcos/pactl-controller.sh stop-server") self.main.write_into_statusbar( _("Conference mode off.") ) if args['target'] == "rtp-chat": del self.rtp_count[args['key']] if args['ip_broadcast'] != "": result = self.main.localdata.Route("route-del", args['ip_broadcast'], "255.255.255.255", args['iface']) if result == "error": print_debug("Del multicast-ip route failed") #del self.main.menus.broadcast_count[args['ip_broadcast']] for client in args['allclients']: self.main.xmlrpc.rtp("stoprtp-chat", client) if self.rtp_control_count.has_key(args['ip_broadcast']) and len(self.rtp_control_count[args['ip_broadcast']]) > 0: self.main.common.exe_cmd("pactl unload-module %s" %self.rtp_control_count[args['ip_broadcast']][0]) self.main.common.exe_cmd("pactl unload-module %s" %self.rtp_control_count[args['ip_broadcast']][1]) del self.rtp_control_count[args['ip_broadcast']] if self.control_list: self.chat_delete(args['ip_broadcast']) if len(self.rtp_count.keys()) == 0: self.main.common.exe_cmd("/usr/lib/tcos/pactl-controller.sh stop-server") self.main.write_into_statusbar( _("Audio chat conference off.") ) __extclass__=AudioRTP tcosmonitor/tcosmonitor/extensions/videolan.py0000664000000000000000000007536012260544373017301 0ustar # -*- coding: UTF-8 -*- # TcosMonitor version __VERSION__ # # Copyright (c) 2006-2011 Mario Izquierdo # # This package is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # # This package is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. """ template extension """ from gettext import gettext as _ import sys from tcosmonitor import shared from tcosmonitor.TcosExtensions import TcosExtension import os import gtk import subprocess import signal def print_debug(txt): if shared.debug: print >> sys.stderr, "%s::%s" % (__name__, txt) #print("%s::%s" % (__name__, txt), file=sys.stderr) class VideoOne(TcosExtension): def register(self): self.vlc_count={} self.main.classview.class_external_video=self.video_external self.main.actions.button_action_video=self.video_all self.main.menus.register_simple( _("Send Audio/Video broadcast") , "menu_broadcast.png", 2, self.video_one, "video") self.main.menus.register_all( _("Send Audio/Video broadcast") , "menu_broadcast.png", 2, self.video_all, "video") def video_external(self, filename): if self.main.classview.ismultiple(): if not self.get_all_clients(): return elif not self.get_client(): return # action sent by vidal_joshur at gva dot es # start video broadcast mode # Stream to single client unicast eth=self.main.config.GetVar("network_interface") if len(self.connected_users) == 0 or self.connected_users[0] == shared.NO_LOGIN_MSG: shared.error_msg ( _("Can't send video broadcast, user is not logged") ) return str_scapes=[" ", "(", ")", "*", "!", "?", "\"", "`", "[", "]", "{", "}", ";", ":", ",", "=", "$"] lock="disable" volume="85" if self.main.pref_vlc_method_send.get_active() == 0: vcodec=shared.vcodecs[0] venc=shared.vencs[0] acodec=shared.acodecs[0] aenc=shared.aencs[0] access=shared.accesss[0] mux=shared.muxs[0] elif self.main.pref_vlc_method_send.get_active() == 1: vcodec=shared.vcodecs[1] venc=shared.vencs[0] acodec=shared.acodecs[0] aenc=shared.aencs[0] access=shared.accesss[0] mux=shared.muxs[0] elif self.main.pref_vlc_method_send.get_active() == 2: vcodec=shared.vcodecs[2] venc=shared.vencs[1] acodec=shared.acodecs[0] aenc=shared.aencs[0] access=shared.accesss[0] mux=shared.muxs[0] elif self.main.pref_vlc_method_send.get_active() == 3: vcodec=shared.vcodecs[3] venc=shared.vencs[2] acodec=shared.acodecs[1] aenc=shared.aencs[1] access=shared.accesss[1] mux=shared.muxs[1] elif self.main.pref_vlc_method_send.get_active() == 4: vcodec=shared.vcodecs[1] venc=shared.vencs[0] acodec=shared.acodecs[1] aenc=shared.aencs[1] access=shared.accesss[1] mux=shared.muxs[1] if access == "udp": max_uip=255 uip=0 while uip <= max_uip: uip_cmd="239.254.%s.0" %(uip) cmd=("LC_ALL=C LC_MESSAGES=C netstat -putan 2>/dev/null | grep -c %s" %(uip_cmd) ) print_debug("Check broadcast ip %s." %(uip_cmd) ) output=self.main.common.exe_cmd(cmd) uip+=1 if output == "0": print_debug("Broadcast ip found: %s" %(uip_cmd)) ip_broadcast="%s:1234" %uip_cmd break elif uip == max_uip: print_debug("Not found an available broadcast ip") return else: max_uip=50255 uip=50000 while uip <= max_uip: uip_cmd=":%s" %(uip) cmd=("LC_ALL=C LC_MESSAGES=C netstat -putan 2>/dev/null | grep -c %s" %(uip_cmd) ) print_debug("Check broadcast ip %s." %(uip_cmd) ) output=self.main.common.exe_cmd(cmd) uip+=1 if output == "0": print_debug("Broadcast ip found: %s" %(uip_cmd)) ip_broadcast=uip_cmd uip_cmd="" break elif uip == max_uip: print_debug("Not found an available broadcast ip") return if uip_cmd != "": result = self.main.localdata.Route("route-add", uip_cmd, "255.255.255.0", eth) if result == "error": print_debug("Add multicast-ip route failed") return if filename.find(" ") != -1: msg=_("Not allowed white spaces in \"%s\".\nPlease rename it." %os.path.basename(filename) ) shared.info_msg( msg ) return if access == "udp": remote_cmd_standalone="vlc udp://@%s --udp-caching=1000 --aout=alsa --brightness=2.000000 --volume=300 --fullscreen --aspect-ratio=4:3 --loop" %(ip_broadcast) remote_cmd_thin="vlc udp://@%s --udp-caching=1000 --aout=alsa --brightness=2.000000 --volume=300 --aspect-ratio=4:3 --loop" %(ip_broadcast) p=subprocess.Popen(["vlc", "file://%s" %filename, "--sout=#duplicate{dst=display{delay=1000},dst=\"transcode{vcodec=%s,venc=%s,acodec=%s,aenc=%s,vb=800,ab=112,channels=2,soverlay}:standard{access=%s,mux=%s,dst=%s}\"}" %(vcodec, venc, acodec, aenc, access, mux, ip_broadcast), "--miface=%s" %eth, "--ttl=12", "--brightness=2.000000"], shell=False, bufsize=0, close_fds=True) self.main.write_into_statusbar( _("Waiting for start video transmission...") ) #msg=_("First select the DVD chapter or play movie\nthen press enter to send client..." ) #shared.info_msg( msg ) # check if vlc is running or fail like check ping in demo mode running = p.poll() is None if not running: self.main.write_into_statusbar( _("Error while exec app")) return #msg=_( "Lock keyboard and mouse on client?" ) #if shared.ask_msg ( msg ): # lock="enable" newusernames=[] for user in self.connected_users: if user.find(":") != -1: # we have a standalone user... usern, ip = user.split(":") self.main.xmlrpc.newhost(ip) if access == "http": server=self.main.xmlrpc.GetStandalone("get_server") remote_cmd_standalone="vlc http://%s%s --aout=alsa --brightness=2.000000 --volume=300 --fullscreen --aspect-ratio=4:3 --http-reconnect --loop" %(server, ip_broadcast) self.main.xmlrpc.DBus("exec", remote_cmd_standalone ) else: newusernames.append(user) if access == "http": remote_cmd_thin="vlc http://localhost%s --aout=alsa --brightness=2.000000 --volume=300 --aspect-ratio=4:3 --http-reconnect --loop" % (ip_broadcast) result = self.main.dbus_action.do_exec( newusernames, remote_cmd_thin ) if not result: shared.error_msg ( _("Error while exec remote app:\nReason:%s") %( self.main.dbus_action.get_error_msg() ) ) for client in self.newallclients: self.main.xmlrpc.vlc( client, volume, lock ) self.main.write_into_statusbar( _("Running in broadcast video transmission.") ) # new mode to Stop Button if len(self.vlc_count.keys()) != 0: count=len(self.vlc_count.keys())-1 nextkey=self.vlc_count.keys()[count]+1 self.vlc_count[nextkey]=uip_cmd else: nextkey=1 self.vlc_count[nextkey]=uip_cmd self.add_progressbox( {"target": "vlc", "pid":p.pid, "lock":lock, "allclients":self.newallclients, "ip":uip_cmd, "iface":eth, "key":nextkey}, _("Running in broadcast video transmission to user %(host)s. Broadcast Nº %(count)s") %{"host":self.connected_users_txt, "count":nextkey} ) def video_one(self, widget, ip): if not self.get_client(): return # action sent by vidal_joshur at gva dot es # start video broadcast mode # Stream to single client unicast eth=self.main.config.GetVar("network_interface") if len(self.connected_users) == 0 or self.connected_users[0] == shared.NO_LOGIN_MSG: shared.error_msg ( _("Can't send video broadcast, user is not logged") ) return str_scapes=[" ", "(", ")", "*", "!", "?", "\"", "`", "[", "]", "{", "}", ";", ":", ",", "=", "$"] lock="disable" volume="85" if self.main.pref_vlc_method_send.get_active() == 0: vcodec=shared.vcodecs[0] venc=shared.vencs[0] acodec=shared.acodecs[0] aenc=shared.aencs[0] access=shared.accesss[0] mux=shared.muxs[0] elif self.main.pref_vlc_method_send.get_active() == 1: vcodec=shared.vcodecs[1] venc=shared.vencs[0] acodec=shared.acodecs[0] aenc=shared.aencs[0] access=shared.accesss[0] mux=shared.muxs[0] elif self.main.pref_vlc_method_send.get_active() == 2: vcodec=shared.vcodecs[2] venc=shared.vencs[1] acodec=shared.acodecs[0] aenc=shared.aencs[0] access=shared.accesss[0] mux=shared.muxs[0] elif self.main.pref_vlc_method_send.get_active() == 3: vcodec=shared.vcodecs[3] venc=shared.vencs[2] acodec=shared.acodecs[1] aenc=shared.aencs[1] access=shared.accesss[1] mux=shared.muxs[1] elif self.main.pref_vlc_method_send.get_active() == 4: vcodec=shared.vcodecs[1] venc=shared.vencs[0] acodec=shared.acodecs[1] aenc=shared.aencs[1] access=shared.accesss[1] mux=shared.muxs[1] if access == "udp": if self.client_type == "tcos": max_uip=255 uip=0 while uip <= max_uip: uip_cmd="239.254.%s.0" %(uip) cmd=("LC_ALL=C LC_MESSAGES=C netstat -putan 2>/dev/null | grep -c %s" %(uip_cmd) ) print_debug("Check broadcast ip %s." %(uip_cmd) ) output=self.main.common.exe_cmd(cmd) uip+=1 if output == "0": print_debug("Broadcast ip found: %s" %(uip_cmd)) ip_unicast="%s:1234" %uip_cmd break elif uip == max_uip: print_debug("Not found an available broadcast ip") return remote_cmd="vlc udp://@%s --udp-caching=1000 --aout=alsa --brightness=2.000000 --volume=300 --aspect-ratio=4:3 --loop" %(ip_unicast) else: uip_cmd="" ip_unicast="%s:1234" %self.main.selected_ip remote_cmd="vlc udp://@:1234 --udp-caching=1000 --aout=alsa --brightness=2.000000 --volume=300 --fullscreen --aspect-ratio=4:3 --loop" else: max_uip=50255 uip=50000 while uip <= max_uip: uip_cmd=":%s" %(uip) cmd=("LC_ALL=C LC_MESSAGES=C netstat -putan 2>/dev/null | grep -c %s" %(uip_cmd) ) print_debug("Check broadcast ip %s." %(uip_cmd) ) output=self.main.common.exe_cmd(cmd) uip+=1 if output == "0": print_debug("Broadcast ip found: %s" %(uip_cmd)) ip_unicast=uip_cmd uip_cmd="" break elif uip == max_uip: print_debug("Not found an available broadcast ip") return if self.client_type == "tcos": remote_cmd="vlc http://localhost%s --aout=alsa --brightness=2.000000 --volume=300 --aspect-ratio=4:3 --http-reconnect --loop" %(ip_unicast) if uip_cmd != "": result = self.main.localdata.Route("route-add", uip_cmd, "255.255.255.0", eth) if result == "error": print_debug("Add multicast-ip route failed") return dialog = gtk.FileChooserDialog(_("Select audio/video file.."), None, gtk.FILE_CHOOSER_ACTION_OPEN, (_("Play DVD"), 1, _("Play SVCD/VCD"), 2, _("Play AudioCD"), 3, gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, gtk.STOCK_OPEN, gtk.RESPONSE_OK)) dialog.set_default_response(gtk.RESPONSE_OK) self.folder = self._folder = os.environ['HOME'] dialog.set_current_folder(self.folder) filter = gtk.FileFilter() filter.set_name("Media Files ( *.avi, *.mpg, *.mpeg, *.mp3, *.wav, etc.. )") file_types=["*.avi", "*.mpg", "*.mpeg", "*.ogg", "*.ogm", "*.asf", "*.divx", "*.wmv", "*.vob", "*.m2v", "*.m4v", "*.mp2", "*.mp4", "*.ac3", "*.ogg", "*.mp1", "*.mp2", "*.mp3", "*.wav", "*.wma"] for elem in file_types: filter.add_pattern( elem ) dialog.add_filter(filter) filter = gtk.FileFilter() filter.set_name("All Files") filter.add_pattern("*.*") dialog.add_filter(filter) response = dialog.run() if response == gtk.RESPONSE_OK or response == 1 or response == 2 or response == 3: filename=dialog.get_filename() dialog.destroy() #for scape in str_scapes: # filename=filename.replace("%s" %scape, "\%s" %scape) if response == gtk.RESPONSE_OK: if filename.find(" ") != -1: msg=_("Not allowed white spaces in \"%s\".\nPlease rename it." %os.path.basename(filename) ) shared.info_msg( msg ) return p=subprocess.Popen(["vlc", "file://%s" %filename, "--sout=#duplicate{dst=display{delay=1000},dst=\"transcode{vcodec=%s,venc=%s,acodec=%s,aenc=%s,vb=800,ab=112,channels=2,soverlay}:standard{access=%s,mux=%s,dst=%s}\"}" %(vcodec, venc, acodec, aenc, access, mux, ip_unicast), "--miface=%s" %eth, "--ttl=12", "--brightness=2.000000"], shell=False, bufsize=0, close_fds=True) elif response == 1: p=subprocess.Popen(["vlc", "dvdsimple:///dev/cdrom", "--sout=#duplicate{dst=display{delay=700},dst=\"transcode{vcodec=%s,venc=%s,acodec=%s,aenc=%s,vb=800,ab=112,channels=2,soverlay}:standard{access=%s,mux=%s,dst=%s}\"}" %(vcodec, venc, acodec, aenc, access, mux, ip_unicast), "--miface=%s" %eth, "--ttl=12", "--loop", "--brightness=2.000000"], shell=False, bufsize=0, close_fds=True) elif response == 2: p=subprocess.Popen(["vlc", "vcd:///dev/cdrom", "--sout=#duplicate{dst=display{delay=1000},dst=\"transcode{vcodec=%s,venc=%s,acodec=%s,aenc=%s,vb=800,ab=112,channels=2,soverlay}:standard{access=%s,mux=%s,dst=%s}\"}" %(vcodec, venc, acodec, aenc, access, mux, ip_unicast), "--miface=%s" %eth, "--ttl=12", "--brightness=2.000000"], shell=False, bufsize=0, close_fds=True) elif response == 3: p=subprocess.Popen(["vlc", "cdda:///dev/cdrom", "--sout=#duplicate{dst=display,dst=\"transcode{vcodec=%s,venc=%s,acodec=%s,aenc=%s,vb=200,ab=112,channels=2}:standard{access=%s,mux=%s,dst=%s}\"}" %(vcodec, venc, acodec, aenc, access, mux, ip_unicast), "--miface=%s" %eth, "--ttl=12"], shell=False, bufsize=0, close_fds=True) # exec this app on client self.main.write_into_statusbar( _("Waiting for start video transmission...") ) msg=_("First select the DVD chapter or play movie\nthen press enter to send clients..." ) shared.info_msg( msg ) # check if vlc is running or fail like check ping in demo mode running = p.poll() is None if not running: self.main.write_into_statusbar( _("Error while exec app")) return msg=_( "Lock keyboard and mouse on client?" ) if shared.ask_msg ( msg ): lock="enable" newusernames=[] for user in self.connected_users: if user.find(":") != -1: # we have a standalone user... if access == "http": server=self.main.xmlrpc.GetStandalone("get_server") remote_cmd="vlc http://%s%s --aout=alsa --brightness=2.000000 --volume=300 --fullscreen --aspect-ratio=4:3 --http-reconnect --loop" %(server, ip_unicast) self.main.xmlrpc.DBus("exec", remote_cmd ) else: newusernames.append(user) result = self.main.dbus_action.do_exec( newusernames, remote_cmd ) if not result: shared.error_msg ( _("Error while exec remote app:\nReason:%s") %( self.main.dbus_action.get_error_msg() ) ) self.main.xmlrpc.vlc( self.main.selected_ip, volume, lock ) self.main.write_into_statusbar( _("Running in broadcast video transmission.") ) # new mode to Stop Button if len(self.vlc_count.keys()) != 0: count=len(self.vlc_count.keys())-1 nextkey=self.vlc_count.keys()[count]+1 self.vlc_count[nextkey]=uip_cmd else: nextkey=1 self.vlc_count[nextkey]=uip_cmd self.add_progressbox( {"target": "vlc", "pid":p.pid, "lock":lock, "allclients":self.newallclients, "ip":uip_cmd, "iface":eth, "key":nextkey}, _("Running in broadcast video transmission to user %(host)s. Broadcast Nº %(count)s") %{"host":self.connected_users_txt, "count":nextkey} ) else: dialog.destroy() def on_progressbox_click(self, widget, args, box): box.destroy() print_debug("on_progressbox_click() widget=%s, args=%s, box=%s" %(widget, args, box) ) if not args['target']: return self.main.stop_running_actions.remove(widget) if args['target'] == "vlc": del self.vlc_count[args['key']] if args['ip'] != "": result = self.main.localdata.Route("route-del", args['ip'], "255.255.255.0", args['iface']) if result == "error": print_debug("Del multicast-ip route failed") connected_users=[] for client in args['allclients']: self.main.localdata.newhost(client) if self.main.localdata.IsLogged(client): if args['lock'] == "enable": self.main.xmlrpc.unlockcontroller("lockvlc", client) connected_users.append(self.main.localdata.GetUsernameAndHost(client)) newusernames=[] for user in connected_users: if user.find(":") != -1: # we have a standalone user... in some cases or after much time need SIGKILL vlc usern, ip = user.split(":") self.main.xmlrpc.newhost(ip) self.main.xmlrpc.DBus("killall", "-s KILL vlc" ) else: newusernames.append(user) result = self.main.dbus_action.do_killall( newusernames , "-s KILL vlc" ) if "pid" in args: os.kill(args['pid'], signal.SIGKILL) else: self.main.common.exe_cmd("killall -s KILL vlc", verbose=0, background=True) self.main.write_into_statusbar( _("Video broadcast stopped.") ) def video_all(self, *args): if not self.get_all_clients(): return # action sent by vidal_joshur at gva dot es # start video broadcast mode # search for connected users # Stream to multiple clients eth=self.main.config.GetVar("network_interface") if len(self.connected_users) == 0 or self.connected_users[0] == shared.NO_LOGIN_MSG: shared.error_msg( _("No users logged.") ) return str_scapes=[" ", "(", ")", "*", "!", "?", "\"", "`", "[", "]", "{", "}", ";", ":", ",", "=", "$"] if self.main.pref_vlc_method_send.get_active() == 0: vcodec=shared.vcodecs[0] venc=shared.vencs[0] acodec=shared.acodecs[0] aenc=shared.aencs[0] access=shared.accesss[0] mux=shared.muxs[0] elif self.main.pref_vlc_method_send.get_active() == 1: vcodec=shared.vcodecs[1] venc=shared.vencs[0] acodec=shared.acodecs[0] aenc=shared.aencs[0] access=shared.accesss[0] mux=shared.muxs[0] elif self.main.pref_vlc_method_send.get_active() == 2: vcodec=shared.vcodecs[2] venc=shared.vencs[1] acodec=shared.acodecs[0] aenc=shared.aencs[0] access=shared.accesss[0] mux=shared.muxs[0] elif self.main.pref_vlc_method_send.get_active() == 3: vcodec=shared.vcodecs[3] venc=shared.vencs[2] acodec=shared.acodecs[1] aenc=shared.aencs[1] access=shared.accesss[1] mux=shared.muxs[1] elif self.main.pref_vlc_method_send.get_active() == 4: vcodec=shared.vcodecs[1] venc=shared.vencs[0] acodec=shared.acodecs[1] aenc=shared.aencs[1] access=shared.accesss[1] mux=shared.muxs[1] if access == "udp": max_uip=255 uip=0 while uip <= max_uip: uip_cmd="239.254.%s.0" %(uip) cmd=("LC_ALL=C LC_MESSAGES=C netstat -putan 2>/dev/null | grep -c %s" %(uip_cmd) ) print_debug("Check broadcast ip %s." %(uip_cmd) ) output=self.main.common.exe_cmd(cmd) uip+=1 if output == "0": print_debug("Broadcast ip found: %s" %(uip_cmd)) ip_broadcast="%s:1234" %uip_cmd break elif uip == max_uip: print_debug("Not found an available broadcast ip") return else: max_uip=50255 uip=50000 while uip <= max_uip: uip_cmd=":%s" %(uip) cmd=("LC_ALL=C LC_MESSAGES=C netstat -putan 2>/dev/null | grep -c %s" %(uip_cmd) ) print_debug("Check broadcast ip %s." %(uip_cmd) ) output=self.main.common.exe_cmd(cmd) uip+=1 if output == "0": print_debug("Broadcast ip found: %s" %(uip_cmd)) ip_broadcast=uip_cmd uip_cmd="" break elif uip == max_uip: print_debug("Not found an available broadcast ip") return lock="disable" volume="85" if uip_cmd != "": result = self.main.localdata.Route("route-add", uip_cmd, "255.255.255.0", eth) if result == "error": print_debug("Add multicast-ip route failed") return dialog = gtk.FileChooserDialog(_("Select audio/video file.."), None, gtk.FILE_CHOOSER_ACTION_OPEN, (_("Play DVD"), 1, _("Play SVCD/VCD"), 2, _("Play AudioCD"), 3, gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, gtk.STOCK_OPEN, gtk.RESPONSE_OK)) dialog.set_default_response(gtk.RESPONSE_OK) self.folder = self._folder = os.environ['HOME'] dialog.set_current_folder(self.folder) filter = gtk.FileFilter() filter.set_name("Media Files ( *.avi, *.mpg, *.mpeg, *.mp3, *.wav, etc.. )") file_types=["*.avi", "*.mpg", "*.mpeg", "*.ogg", "*.ogm", "*.asf", "*.divx", "*.wmv", "*.vob", "*.m2v", "*.m4v", "*.mp2", "*.mp4", "*.ac3", "*.ogg", "*.mp1", "*.mp2", "*.mp3", "*.wav", "*.wma"] for elem in file_types: filter.add_pattern( elem ) dialog.add_filter(filter) filter = gtk.FileFilter() filter.set_name("All Files") filter.add_pattern("*.*") dialog.add_filter(filter) response = dialog.run() if response == gtk.RESPONSE_OK or response == 1 or response == 2 or response == 3: filename=dialog.get_filename() dialog.destroy() #for scape in str_scapes: # filename=filename.replace("%s" %scape, "\%s" %scape) if response == gtk.RESPONSE_OK: if filename.find(" ") != -1: msg=_("Not allowed white spaces in \"%s\".\nPlease rename it." %os.path.basename(filename) ) shared.info_msg( msg ) return p=subprocess.Popen(["vlc", "file://%s" %filename, "--sout=#duplicate{dst=display{delay=1000},dst=\"transcode{vcodec=%s,venc=%s,acodec=%s,aenc=%s,vb=800,ab=112,channels=2,soverlay}:standard{access=%s,mux=%s,dst=%s}\"}" %(vcodec, venc, acodec, aenc, access, mux, ip_broadcast), "--miface=%s" %eth, "--ttl=12", "--brightness=2.000000"], shell=False, bufsize=0, close_fds=True) elif response == 1: p=subprocess.Popen(["vlc", "dvdsimple:///dev/cdrom", "--sout=#duplicate{dst=display{delay=700},dst=\"transcode{vcodec=%s,venc=%s,acodec=%s,aenc=%s,vb=800,ab=112,channels=2,soverlay}:standard{access=%s,mux=%s,dst=%s}\"}" %(vcodec, venc, acodec, aenc, access, mux, ip_broadcast), "--miface=%s" %eth, "--ttl=12", "--loop", "--brightness=2.000000"], shell=False, bufsize=0, close_fds=True) elif response == 2: p=subprocess.Popen(["vlc", "vcd:///dev/cdrom", "--sout=#duplicate{dst=display{delay=1000},dst=\"transcode{vcodec=%s,venc=%s,acodec=%s,aenc=%s,vb=800,ab=112,channels=2,soverlay}:standard{access=%s,mux=%s,dst=%s}\"}" %(vcodec, venc, acodec, aenc, access, mux, ip_broadcast), "--miface=%s" %eth, "--ttl=12", "--brightness=2.000000"], shell=False, bufsize=0, close_fds=True) elif response == 3: p=subprocess.Popen(["vlc", "cdda:///dev/cdrom", "--sout=#duplicate{dst=display,dst=\"transcode{vcodec=%s,venc=%s,acodec=%s,aenc=%s,vb=200,ab=112,channels=2}:standard{access=%s,mux=%s,dst=%s}\"}" %(vcodec, venc, acodec, aenc, access, mux, ip_broadcast), "--miface=%s" %eth, "--ttl=12"], shell=False, bufsize=0, close_fds=True) # exec this app on client if access == "udp": remote_cmd_standalone="vlc udp://@%s --udp-caching=1000 --aout=alsa --brightness=2.000000 --volume=300 --fullscreen --aspect-ratio=4:3 --loop" %(ip_broadcast) remote_cmd_thin="vlc udp://@%s --udp-caching=1000 --aout=alsa --brightness=2.000000 --volume=300 --aspect-ratio=4:3 --loop" %(ip_broadcast) self.main.write_into_statusbar( _("Waiting for start video transmission...") ) msg=_("First select the DVD chapter or play movie\nthen press enter to send clients..." ) shared.info_msg( msg ) # check if vlc is running or fail like check ping in demo mode running = p.poll() is None if not running: self.main.write_into_statusbar( _("Error while exec app")) return msg=_( "Lock keyboard and mouse on clients?" ) if shared.ask_msg ( msg ): lock="enable" newusernames=[] for user in self.connected_users: if user.find(":") != -1: # we have a standalone user... usern, ip = user.split(":") self.main.xmlrpc.newhost(ip) if access == "http": server=self.main.xmlrpc.GetStandalone("get_server") remote_cmd_standalone="vlc http://%s%s --aout=alsa --brightness=2.000000 --volume=300 --fullscreen --aspect-ratio=4:3 --http-reconnect --loop" %(server, ip_broadcast) self.main.xmlrpc.DBus("exec", remote_cmd_standalone ) else: newusernames.append(user) if access == "http": remote_cmd_thin="vlc http://localhost%s --aout=alsa --brightness=2.000000 --volume=300 --aspect-ratio=4:3 --http-reconnect --loop" % (ip_broadcast) result = self.main.dbus_action.do_exec( newusernames, remote_cmd_thin ) if not result: shared.error_msg ( _("Error while exec remote app:\nReason:%s") %( self.main.dbus_action.get_error_msg() ) ) for client in self.newallclients: self.main.xmlrpc.vlc( client, volume, lock ) self.main.write_into_statusbar( _("Running in broadcast video transmission.") ) # new mode Stop Button if len(self.vlc_count.keys()) != 0: count=len(self.vlc_count.keys())-1 nextkey=self.vlc_count.keys()[count]+1 self.vlc_count[nextkey]=uip_cmd else: nextkey=1 self.vlc_count[nextkey]=uip_cmd self.add_progressbox( {"target": "vlc", "pid":p.pid, "lock":lock, "allclients": self.newallclients, "ip":uip_cmd, "iface":eth, "key":nextkey}, _("Running in broadcast video transmission. Broadcast Nº %s") %(nextkey) ) else: dialog.destroy() __extclass__=VideoOne tcosmonitor/tcosmonitor/extensions/dpms.py0000664000000000000000000000740012260544373016431 0ustar # -*- coding: UTF-8 -*- # TcosMonitor version __VERSION__ # # Copyright (c) 2006-2011 Mario Izquierdo # # This package is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # # This package is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. """ template extension """ from gettext import gettext as _ import sys from tcosmonitor import shared from tcosmonitor.TcosExtensions import TcosExtension def print_debug(txt): if shared.debug: print >> sys.stderr, "%s::%s" % (__name__, txt) #print("%s::%s" % (__name__, txt), file=sys.stderr) class Dpms(TcosExtension): def register(self): self.main.menus.register_simple( _("DPMS Power off monitor"), "menu_dpms_off.png", 0, self.dpms_off, "dpms") self.main.menus.register_all( _("DPMS Power off monitors"), "menu_dpms_off.png", 0, self.dpms_off_all, "dpms") self.main.menus.register_simple( _("DPMS Power on monitor"), "menu_dpms_on.png", 0, self.dpms_on, "dpms") self.main.menus.register_all( _("DPMS Power on monitors"), "menu_dpms_on.png", 0, self.dpms_on_all, "dpms") def dpms_off(self, w, ip): if not self.get_client(): return # DPMS off self.main.xmlrpc.dpms('off') self.change_lockscreen(self.main.selected_ip) def dpms_on(self, w, ip): if not self.get_client(): return # DPMS on self.main.xmlrpc.dpms('on') self.change_lockscreen(self.main.selected_ip) def real_action(self, ip, action): print_debug("real_action() ip=%s action='%s'"%(ip, action) ) if action == 'dpmsoff': result=self.main.xmlrpc.dpms('off') print_debug("real_action() DPMS OFF result=%s"%result) self.main.common.threads_enter("extensions/dpms::real_action dpms off") self.change_lockscreen(ip) self.main.common.threads_leave("extensions/dpms::real_action dpms off") elif action == 'dpmson': result=self.main.xmlrpc.dpms('on') print_debug("real_action() DPMS ON result=%s"%result) self.main.common.threads_enter("extensions/dpms::real_action dpms on") self.change_lockscreen(ip) self.main.common.threads_leave("extensions/dpms::real_action dpms on") def dpms_off_all(self, *args): if not self.get_all_clients(): return msg=_( _("Do you want to switch off the following monitors: %s?" ) %(self.connected_users_txt_all) ) if shared.ask_msg ( msg ): self.main.worker=shared.Workers(self.main, None, None) self.main.worker.set_for_all_action(self.action_for_clients, \ self.allclients_logged, "dpmsoff" ) def dpms_on_all(self, *args): if not self.get_all_clients(): return msg=_( _("Do you want to switch on the following monitors: %s?" ) %(self.connected_users_txt_all) ) if shared.ask_msg ( msg ): self.main.worker=shared.Workers(self.main, None, None) self.main.worker.set_for_all_action(self.action_for_clients, \ self.allclients_logged, "dpmson" ) __extclass__=Dpms tcosmonitor/tcosmonitor/extensions/restartxorg.py0000664000000000000000000001744112260544373020060 0ustar # -*- coding: UTF-8 -*- # TcosMonitor version __VERSION__ # # Copyright (c) 2006-2011 Mario Izquierdo # # This package is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # # This package is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. """ template extension """ from gettext import gettext as _ import gtk import sys from tcosmonitor import shared from tcosmonitor.TcosExtensions import TcosExtension def print_debug(txt): if shared.debug: print >> sys.stderr, "%s::%s" % (__name__, txt) #print("%s::%s" % (__name__, txt), file=sys.stderr) class RestartXorg(TcosExtension): def register(self): self.main.menus.register_simple( _("Restart X session with new settings"), "menu_newconf.png", 0, self.restartx, "xorg") self.main.menus.register_all( _("Restart X session of all clients"), "menu_newconf.png" , 0, self.restartx_all, "xorg") def restartx(self, w, ip): if not self.get_client(): return # restart xorg with new settings # thin client must download again XXX.XXX.XXX.XXX.conf and rebuild xorg.conf if self.client_type == "tcos": msg=_( "Restart X session of %s with new config?" ) %(self.host) if shared.ask_msg ( msg ): # see xmlrpc/xorg.h, rebuild will download and sed xorg.conf.tpl try: self.main.xmlrpc.tc.tcos.xorg("rebuild", "--restartxorg", \ self.main.config.GetVar("xmlrpc_username"), \ self.main.config.GetVar("xmlrpc_password") ) except Exception, err: print_debug("restartx() Exception error %s"%err) self.main.xmlrpc.CheckSSL(err) self.refresh_client_info(ip) else: shared.info_msg( _("%s is not supported to restart Xorg!") %(self.client_type) ) def restartx_all(self, widget): if not self.get_all_clients(): return onlythinclients=[] onlythinclients_txt="" for client in self.allclients: if not self.main.xmlrpc.IsStandalone(client): onlythinclients.append(client) onlythinclients_txt+="\n %s" %(client) if len(onlythinclients) == 0: shared.error_msg( _("No thin clients found.") ) return msg=_( _("Do you want to restart X screens (only thin clients):%s?" )%(onlythinclients_txt) ) if shared.ask_msg ( msg ): self.main.worker=shared.Workers(self.main, None, None) self.main.worker.set_for_all_action(self.action_for_clients, onlythinclients, "restartx" ) def real_action(self, ip, action): print_debug("real_action() ip=%s action='%s'"%(ip, action) ) self.main.xmlrpc.Exe(action) def refresh_client_info(self, ip): print_debug ( "refresh_client_info() updating host data..." ) inactive_image = gtk.gdk.pixbuf_new_from_file(shared.IMG_DIR + 'inactive.png') active_image = gtk.gdk.pixbuf_new_from_file(shared.IMG_DIR + 'active.png') active_ssl_image = gtk.gdk.pixbuf_new_from_file(shared.IMG_DIR + 'active_ssl.png') logged_image = gtk.gdk.pixbuf_new_from_file(shared.IMG_DIR + 'logged.png') unlogged_image = gtk.gdk.pixbuf_new_from_file(shared.IMG_DIR + 'unlogged.png') locked_image = gtk.gdk.pixbuf_new_from_file(shared.IMG_DIR + 'locked.png') locked_net_image = gtk.gdk.pixbuf_new_from_file(shared.IMG_DIR + 'locked_net.png') locked_net_screen_image = gtk.gdk.pixbuf_new_from_file(shared.IMG_DIR + 'locked_net_screen.png') unlocked_image = gtk.gdk.pixbuf_new_from_file(shared.IMG_DIR + 'unlocked.png') dpms_off_image = gtk.gdk.pixbuf_new_from_file(shared.IMG_DIR + 'menu_dpms_off.png') dpms_on_image = gtk.gdk.pixbuf_new_from_file(shared.IMG_DIR + 'menu_dpms_on.png') # disable cache self.main.localdata.cache_timeout=0 data={} data['ip']=ip print_debug("refresh_client_info() => get username") data['username']=self.main.localdata.GetUsername(ip) print_debug("refresh_client_info() => get hostname") data['hostname']=self.main.localdata.GetHostname(ip) if data['username'].startswith('error: tcos-last'): data['username']="---" try: print_debug("refresh_client_info() => get num process") data['num_process']=self.main.localdata.GetNumProcess(ip) except Exception, err: print_debug("refresh_client_info() Exception error=%s"%err) data['num_process']="---" print_debug("refresh_client_info() => get time logged") data['time_logged']=self.main.localdata.GetTimeLogged(ip) if not data['time_logged'] or data['time_logged'] == "" or data['time_logged'].startswith('error: tcos-last'): data['time_logged']="---" print_debug("refresh_client_info() => get active connection") if self.main.localdata.IsActive(ip): if self.main.xmlrpc.sslconnection: data['image_active']=active_ssl_image else: data['image_active']=active_image else: data['image_active']=inactive_image print_debug("refresh_client_info() => get is logged") if self.main.localdata.IsLogged(ip): data['image_logged']=logged_image else: data['image_logged']=unlogged_image print_debug("refresh_client_info() => get is blocked") if self.main.localdata.IsBlocked(ip): data['blocked_screen']=True else: data['blocked_screen']=False print_debug("refresh_client_info() => get is blocked net") if self.main.localdata.IsBlockedNet(ip, data['username']): data['blocked_net']=True else: data['blocked_net']=False if self.main.xmlrpc.dpms('status', ip) == "Off": data['dpms_off']=True else: data['dpms_off']=False if data['dpms_off']: data['image_blocked']=dpms_off_image elif data['blocked_screen'] and data['blocked_net']: data['image_blocked']=locked_net_screen_image elif data['blocked_screen'] == False and data['blocked_net']: data['image_blocked']=locked_net_image elif data['blocked_screen'] and data['blocked_net'] == False: data['image_blocked']=locked_image else: data['image_blocked']=unlocked_image #enable cache again self.main.localdata.cache_timeout=shared.cache_timeout if self.main.classview.isactive(): self.main.classview.change_lockscreen(ip, data['image_blocked'], data['blocked_screen'], data['blocked_net']) if self.main.iconview.isactive(): self.main.iconview.change_lockscreen(ip, data['image_blocked'], data['blocked_screen'], data['blocked_net']) if self.main.listview.isactive(): self.main.listview.refresh_client_info(ip, data['image_blocked']) __extclass__=RestartXorg tcosmonitor/tcosmonitor/extensions/sendfiles.py0000664000000000000000000002772512260544373017456 0ustar # -*- coding: UTF-8 -*- # TcosMonitor version __VERSION__ # # Copyright (c) 2006-2011 Mario Izquierdo # # This package is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # # This package is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. """ template extension """ from gettext import gettext as _ from tcosmonitor import shared from tcosmonitor.TcosExtensions import TcosExtension import netifaces from shutil import copy import os import gtk import sys def print_debug(txt): if shared.debug: print >> sys.stderr, "%s::%s" % (__name__, txt) #print("%s::%s" % (__name__, txt), file=sys.stderr) class SendFiles(TcosExtension): def register(self): self.main.actions.button_action_send=self.send_all self.main.classview.class_external_send=self.send_external self.main.menus.register_simple( _("Send files") , "menu_send.png", 2, self.send_one, "send") self.main.menus.register_all( _("Send files") , "menu_send.png", 2, self.send_all, "send") def get_ip_address(self, ifname): print_debug("get_ip_address() ifname=%s" %(ifname) ) if not ifname in netifaces.interfaces(): return None ip=netifaces.ifaddresses(ifname) if ip.has_key(netifaces.AF_INET): return ip[netifaces.AF_INET][0]['addr'] return None def send_external(self, filenames): if self.main.classview.ismultiple(): if not self.get_all_clients(): return elif not self.get_client(): return # action sent by vidal_joshur at gva dot es # send files # search for connected users if len(self.connected_users) == 0 or self.connected_users[0] == shared.NO_LOGIN_MSG: shared.error_msg ( _("Can't send files, user is not logged") ) return if not os.path.isdir("/tmp/tcos_share"): shared.info_msg( _("TcosMonitor: FTP+TLS server is not running.") ) return for filename in os.listdir("/tmp/tcos_share/"): if os.path.isfile("/tmp/tcos_share/%s" %filename): os.remove("/tmp/tcos_share/%s" %filename) open="True" basenames = "" for filename in filenames: basenames += "%s\n" % ( os.path.basename(filename[7:]) ) copy(filename[7:], "/tmp/tcos_share/") os.chmod("/tmp/tcos_share/%s" %os.path.basename(filename[7:]), 0644) self.main.write_into_statusbar( _("Waiting for send files...") ) newusernames=[] for user in self.connected_users: if user.find(":") != -1: usern, ip=user.split(":") self.main.xmlrpc.newhost(ip) server=self.main.xmlrpc.GetStandalone("get_server") self.main.xmlrpc.DBus("sendfiles", "%s %s %s" %(_("Teacher"), server, open) ) self.main.xmlrpc.DBus("mess", _("Teacher has sent some files to %(teacher)s folder:\n\n%(basenames)s") %{"teacher":_("Teacher"), "basenames":basenames}) else: newusernames.append(user) interface=self.main.config.GetVar("network_interface") # maybe we the x remote display is other than tcosmonitor server server=self.get_ip_address(interface) result = self.main.dbus_action.do_sendfiles( newusernames , _("Teacher"), server, open) if not result: shared.error_msg ( _("Error while exec remote app:\nReason:%s") %( self.main.dbus_action.get_error_msg() ) ) self.main.write_into_statusbar( _("Error creating destination folder.") ) else: result = self.main.dbus_action.do_message(newusernames , _("Teacher has sent some files to %(teacher)s folder:\n\n%(basenames)s") %{"teacher":_("Teacher"), "basenames":basenames} ) self.main.write_into_statusbar( _("Files sent.") ) def send_one(self, widget, ip): if not self.get_client(): return # action sent by vidal_joshur at gva dot es # send files # search for connected users if len(self.connected_users) == 0 or self.connected_users[0] == shared.NO_LOGIN_MSG: shared.error_msg ( _("Can't send files, user is not logged") ) return str_scapes=[" ", "(", ")", "*", "!", "?", "\"", "`", "[", "]", "{", "}", ";", ":", ",", "=", "$"] dialog = gtk.FileChooserDialog( _("Select file or files..."), None, gtk.FILE_CHOOSER_ACTION_OPEN, (gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, gtk.STOCK_OPEN, gtk.RESPONSE_OK)) dialog.set_default_response(gtk.RESPONSE_OK) #dialog.set_select_multiple(select_multiple) dialog.set_select_multiple(True) self.folder = self._folder = os.environ['HOME'] dialog.set_current_folder(self.folder) filter = gtk.FileFilter() filter.set_name("All files") filter.add_pattern("*") dialog.add_filter(filter) if not os.path.isdir("/tmp/tcos_share"): shared.info_msg( _("TcosMonitor: FTP+TLS server is not running.") ) return for filename in os.listdir("/tmp/tcos_share/"): if os.path.isfile("/tmp/tcos_share/%s" %filename): os.remove("/tmp/tcos_share/%s" %filename) response = dialog.run() if response == gtk.RESPONSE_OK: filenames = dialog.get_filenames() open="False" basenames = "" for filename in filenames: basenames += "%s\n" % ( os.path.basename(filename) ) copy(filename, "/tmp/tcos_share/") os.chmod("/tmp/tcos_share/%s" %os.path.basename(filename), 0644) self.main.write_into_statusbar( _("Waiting for send files...") ) msg=_( "Do you want open file(s) on client?" ) if shared.ask_msg ( msg ): open="True" newusernames=[] for user in self.connected_users: if user.find(":") != -1: #usern, ip=user.split(":") #self.main.xmlrpc.newhost(ip) server=self.main.xmlrpc.GetStandalone("get_server") self.main.xmlrpc.DBus("sendfiles", "%s %s %s" %(_("Teacher"), server, open) ) self.main.xmlrpc.DBus("mess", _("Teacher has sent some files to %(teacher)s folder:\n\n%(basenames)s") %{"teacher":_("Teacher"), "basenames":basenames}) else: newusernames.append(user) interface=self.main.config.GetVar("network_interface") # maybe we the x remote display is other than tcosmonitor server server=self.get_ip_address(interface) result = self.main.dbus_action.do_sendfiles( newusernames , _("Teacher"), server, open) if not result: shared.error_msg ( _("Error while exec remote app:\nReason:%s") %( self.main.dbus_action.get_error_msg() ) ) self.main.write_into_statusbar( _("Error creating destination folder.") ) else: result = self.main.dbus_action.do_message(newusernames , _("Teacher has sent some files to %(teacher)s folder:\n\n%(basenames)s") %{"teacher":_("Teacher"), "basenames":basenames} ) self.main.write_into_statusbar( _("Files sent.") ) dialog.destroy() def send_all(self, *args): if not self.get_all_clients(): return # action sent by vidal_joshur at gva dot es # send files # search for connected users if len(self.connected_users) == 0 or self.connected_users[0] == shared.NO_LOGIN_MSG: shared.error_msg( _("No users logged.") ) return str_scapes=[" ", "(", ")", "*", "!", "?", "\"", "`", "[", "]", "{", "}", ";", ":", ",", "=", "$"] dialog = gtk.FileChooserDialog( _("Select file or files..."), None, gtk.FILE_CHOOSER_ACTION_OPEN, (gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, gtk.STOCK_OPEN, gtk.RESPONSE_OK)) dialog.set_default_response(gtk.RESPONSE_OK) #dialog.set_select_multiple(select_multiple) dialog.set_select_multiple(True) self.folder = self._folder = os.environ['HOME'] dialog.set_current_folder(self.folder) filter = gtk.FileFilter() filter.set_name("All files") filter.add_pattern("*") dialog.add_filter(filter) if not os.path.isdir("/tmp/tcos_share"): shared.info_msg( _("TcosMonitor: FTP+TLS server is not running.") ) return for filename in os.listdir("/tmp/tcos_share/"): if os.path.isfile("/tmp/tcos_share/%s" %filename): os.remove("/tmp/tcos_share/%s" %filename) response = dialog.run() if response == gtk.RESPONSE_OK: filenames = dialog.get_filenames() open="False" basenames = "" for filename in filenames: basenames += "%s\n" % ( os.path.basename(filename) ) copy(filename, "/tmp/tcos_share/") os.chmod("/tmp/tcos_share/%s" %os.path.basename(filename), 0644) self.main.write_into_statusbar( _("Waiting for send files...") ) msg=_( "Do you want open file(s) on client?" ) if shared.ask_msg ( msg ): open="True" newusernames=[] for user in self.connected_users: if user.find(":") != -1: usern, ip=user.split(":") self.main.xmlrpc.newhost(ip) server=self.main.xmlrpc.GetStandalone("get_server") self.main.xmlrpc.DBus("sendfiles", "%s %s %s" %(_("Teacher"), server, open) ) self.main.xmlrpc.DBus("mess", _("Teacher has sent some files to %(teacher)s folder:\n\n%(basenames)s") %{"teacher":_("Teacher"), "basenames":basenames}) else: newusernames.append(user) interface=self.main.config.GetVar("network_interface") # maybe we the x remote display is other than tcosmonitor server server=self.get_ip_address(interface) result = self.main.dbus_action.do_sendfiles( newusernames , _("Teacher"), server, open) if not result: shared.error_msg ( _("Error while exec remote app:\nReason:%s") %( self.main.dbus_action.get_error_msg() ) ) self.main.write_into_statusbar( _("Error creating destination folder.") ) else: result = self.main.dbus_action.do_message(newusernames , _("Teacher has sent some files to %(teacher)s folder:\n\n%(basenames)s") %{"teacher":_("Teacher"), "basenames":basenames} ) self.main.write_into_statusbar( _("Files sent.") ) dialog.destroy() __extclass__=SendFiles tcosmonitor/tcosmonitor/extensions/vnc.py0000664000000000000000000005164712260544373016270 0ustar # -*- coding: UTF-8 -*- # TcosMonitor version __VERSION__ # # Copyright (c) 2006-2011 Mario Izquierdo # # This package is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # # This package is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. """ template extension """ from gettext import gettext as _ from tcosmonitor import shared from tcosmonitor.TcosExtensions import TcosExtension import os from random import Random from time import sleep import string import subprocess import signal from tcosmonitor.ping import PingPort import gtkvnc import gtk import traceback import sys def print_debug(txt): if shared.debug: print >> sys.stderr, "%s::%s" % (__name__, txt) #print("%s::%s" % (__name__, txt), file=sys.stderr) class VNC(TcosExtension): def register(self): self.vnc_count={} self.main.menus.register_simple( _("Connect to remote screen (VNC)"), "menu_remote.png", 1, self.vnc_simple, "vnc") self.main.menus.register_simple( _("Demo mode (from this host)") , "menu_tiza.png", 1, self.vnc_demo_simple, "demo") self.main.menus.register_all( _("Enter demo mode, all connected users see my screen") , "menu_tiza.png", 1, self.vnc_demo_all, "demo") self.vnc={} self.vncwindow={} self.is_fullscreen={} def vnc_demo_all(self, *args): if not self.get_all_clients(): return # demo mode #generate password vnc if len(self.connected_users) == 0 or self.connected_users[0] == shared.NO_LOGIN_MSG: shared.error_msg( _("No users logged.") ) return msg=_( _("Do you want to start demo mode the following users: %s?" )%(self.connected_users_txt) ) if not shared.ask_msg ( msg ): return passwd=''.join( Random().sample(string.letters+string.digits, 12) ) self.main.common.exe_cmd("x11vnc -storepasswd %s %s >/dev/null 2>&1" \ %(passwd, os.path.expanduser('~/.tcosvnc')), verbose=0, background=True ) # start x11vnc in local p=subprocess.Popen(["x11vnc", "-shared", "-noshm", "-viewonly", "-forever", "-rfbauth", "%s" %( os.path.expanduser('~/.tcosvnc') ) ], shell=False, bufsize=0, close_fds=True) self.main.write_into_statusbar( _("Waiting for start demo mode...") ) # need to wait for start, PingPort loop status = "CLOSED" max_wait=10 wait=0 while status != "OPEN": status=PingPort("127.0.0.1", 5900).get_status() if status == "CLOSED": sleep(1) wait+=1 if wait > max_wait: break if status != "OPEN": self.main.write_into_statusbar( _("Error while exec app")) return total=0 for client in self.newallclients: self.main.xmlrpc.vnc("genpass", client, passwd ) # get server ip server_ip=self.main.xmlrpc.GetStandalone("get_server") print_debug("menu_event_all() vnc server ip=%s" %(server_ip)) # start vncviewer self.main.xmlrpc.vnc("startclient", client, server_ip ) total+=1 if total < 1: self.main.write_into_statusbar( _("No users logged.") ) # kill x11vnc os.kill(p.pid, signal.SIGKILL) else: self.main.write_into_statusbar( _("Running in demo mode with %s clients.") %(total) ) #server_ip=self.main.xmlrpc.GetStandalone("get_server") #hostname=self.main.localdata.GetHostname(server_ip) # new mode Stop Button if len(self.vnc_count.keys()) != 0: count=len(self.vnc_count.keys())-1 nextkey=self.vnc_count.keys()[count]+1 self.vnc_count[nextkey]=None else: nextkey=1 self.vnc_count[nextkey]=None self.add_progressbox( {"target": "vnc", "ip":"", "pid":p.pid, "allclients":self.newallclients, "key":nextkey}, _("Running in demo mode from server. Demo Nº %s") %(nextkey) ) def vnc_simple(self, w, ip): if not self.get_client(): return if len(self.allclients_logged) == 0: shared.error_msg( _("No user logged.") ) return self.main.worker=shared.Workers(self.main, target=self.start_vnc, args=(self.allclients_logged) ) self.main.worker.start() def start_vnc(self, ip): # force kill x11vnc in client self.main.xmlrpc.newhost(ip) host=self.main.localdata.GetHostname(self.main.selected_ip) max_wait=5 wait=0 self.main.common.threads_enter("TcosActions:start_vnc print status msg") self.main.write_into_statusbar( _("Connecting with %s to start VNC support") %(host) ) self.main.common.threads_leave("TcosActions:start_vnc print status msg") status="OPEN" while status != "CLOSED": status=PingPort(ip, 5900).get_status() self.main.xmlrpc.vnc("stopserver", ip ) print_debug("start_vnc() waiting to kill x11vnc...") sleep(1) wait+=1 if wait > max_wait: print_debug("max_wait, returning") # fixme show error message return # gen password in thin client passwd=''.join( Random().sample(string.letters+string.digits, 12) ) self.main.xmlrpc.vnc("genpass", ip, passwd) os.system("x11vnc -storepasswd %s %s >/dev/null 2>&1" \ %(passwd, os.path.expanduser('~/.tcosvnc')) ) try: # before starting server, vnc-controller.sh exec killall x11vnc, not needed to stop server #self.main.xmlrpc.vnc("stopserver", ip ) result=self.main.xmlrpc.vnc("startserver", ip) if result.find("error") != -1: self.main.common.threads_enter("TcosActions:start_vnc print error msg") shared.error_msg ( _("Can't start VNC, error:\n%s") %(result) ) self.main.common.threads_leave("TcosActions:start_vnc print error msg") return self.main.common.threads_enter("TcosActions:start_vnc print waiting msg") self.main.write_into_statusbar( _("Waiting for start of VNC server...") ) self.main.common.threads_leave("TcosActions:start_vnc print waiting msg") # need to wait for start, PingPort loop status = "CLOSED" wait=0 while status != "OPEN": status=PingPort(ip, 5900).get_status() if status == "CLOSED": sleep(1) wait+=1 if wait > max_wait: break if status == "OPEN": #cmd=("LC_ALL=C LC_MESSAGES=C vncviewer --version 2>&1| grep built |grep -c \"4.1\"") #output=self.main.common.exe_cmd(cmd) #if output == "1": # cmd = ("vncviewer " + ip + " -UseLocalCursor=0 -passwd %s" %os.path.expanduser('~/.tcosvnc') ) #else: # cmd = ("vncviewer " + ip + " -passwd %s" %os.path.expanduser('~/.tcosvnc') ) #print_debug ( "start_process() threading \"%s\"" %(cmd) ) #self.main.common.exe_cmd (cmd, verbose=0, background=True) self.main.common.threads_enter("TcosActions:start_vnc print x11vnc support msg") self.vncviewer(ip, passwd) self.main.common.threads_leave("TcosActions:start_vnc print x11vnc support msg") except Exception, err: print_debug("start_vnc() Exception, error=%s"%err) traceback.print_exc(file=sys.stderr) self.main.common.threads_enter("TcosActions:start_vnc print x11vnc support msg") shared.error_msg ( _("Can't start VNC, please add X11VNC support") ) self.main.common.threads_leave("TcosActions:start_vnc print x11vnc support msg") return self.main.common.threads_enter("TcosActions:start_vnc clean status msg") self.main.write_into_statusbar( "" ) self.main.common.threads_leave("TcosActions:start_vnc clean status msg") def vncviewer_destroy(self, window, ip): try: self.vncwindow[ip].hide() self.vncwindow[ip].destroy() except Exception, err: print_debug("vncviewer_destroy() Cant hide/destroy vncviewer window, err=%s"%err) print_debug("vncviewer_destroy() self.vnc=%s"%self.vnc) if self.vnc.has_key(ip): self.vnc[ip].close() self.vnc.pop(ip) if self.vncwindow.has_key(ip): self.vncwindow.pop(ip) def vncviewer_fullcontrol(self, button, ip): image=gtk.Image() if self.vnc[ip].get_read_only(): self.vnc[ip].set_read_only(False) button.set_label( _("Switch to view only") ) image.set_from_stock('gtk-find', gtk.ICON_SIZE_BUTTON) button.set_image(image) else: self.vnc[ip].set_read_only(True) button.set_label( _("Switch to full control") ) image.set_from_stock('gtk-find-and-replace', gtk.ICON_SIZE_BUTTON) button.set_image(image) def vncviewer_force_resize(self, vnc, size, ip): w, h = vnc.get_size_request() if w == -1 or h == -1: print_debug("_force_resize() returning w=%s h=%s ip=%s"%(w, h, ip)) return vnc.set_size_request(w/2, h/2) def on_fullscreenbutton_click(self, button, ip): image=gtk.Image() if self.is_fullscreen[ip]: self.vncwindow[ip].unfullscreen() self.is_fullscreen[ip]=False image.set_from_stock('gtk-fullscreen', gtk.ICON_SIZE_BUTTON) else: self.vncwindow[ip].fullscreen() self.is_fullscreen[ip]=True image.set_from_stock('gtk-leave-fullscreen', gtk.ICON_SIZE_BUTTON) button.set_image(image) def vncviewer(self, ip, passwd, stoptarget=None, stopargs=None): self.vncwindow[ip] = gtk.Window(gtk.WINDOW_TOPLEVEL) self.vncwindow[ip].set_icon_from_file(shared.IMG_DIR + 'tcos-icon-32x32.png') self.vncwindow[ip].set_title( _("VNC host %s") %(ip) ) self.vncwindow[ip].connect("destroy", self.vncviewer_destroy, ip) box1 = gtk.HBox(True, 10) button = gtk.Button( _("Switch to full control") ) button.connect("clicked", self.vncviewer_fullcontrol, ip) image=gtk.Image() image.set_from_stock('gtk-find-and-replace', gtk.ICON_SIZE_BUTTON) button.set_image(image) box1.pack_start(button, False, False, 0) button.show_all() fbutton = gtk.Button( _("Switch to fullscreen") ) fbutton.connect("clicked", self.on_fullscreenbutton_click, ip) image=gtk.Image() image.set_from_stock('gtk-fullscreen', gtk.ICON_SIZE_BUTTON) fbutton.set_image(image) box1.pack_start(fbutton, False, False, 0) fbutton.show_all() if stoptarget: sbutton = gtk.Button( _("Stop") ) sbutton.connect("clicked", stoptarget, stopargs, None) image=gtk.Image() image.set_from_stock('gtk-stop', gtk.ICON_SIZE_BUTTON) sbutton.set_image(image) box1.pack_start(sbutton, False, False, 0) sbutton.show_all() lastbutton = gtk.Button( _("Quit") ) image=gtk.Image() image.set_from_stock('gtk-quit', gtk.ICON_SIZE_BUTTON) lastbutton.set_image(image) lastbutton.connect("clicked", self.vncviewer_destroy, ip) box1.pack_start(lastbutton, False, False, 0) lastbutton.show_all() self.vnc[ip]=gtkvnc.Display() self.vnc[ip].set_credential(gtkvnc.CREDENTIAL_PASSWORD, passwd) self.vnc[ip].set_credential(gtkvnc.CREDENTIAL_CLIENTNAME, self.main.name) #self.vnc[ip].connect("vnc-auth-credential", self._vnc_auth_cred, ip) self.vnc[ip].connect("size-request", self.vncviewer_force_resize, ip) #self.vnc[ip].connect("vnc-connected", self._vnc_connected, ip) # this freeze GUI, search another way #self.vnc[ip].set_tooltip_text("%s"%ip) self.vnc[ip].open_host(ip, '5900') self.vnc[ip].set_scaling(True) self.vnc[ip].set_read_only(True) self.vnc[ip].show() # Show the box box1.show() box2 = gtk.VBox(False, 0) box2.pack_start(box1, False, False, 0) box2.pack_start(self.vnc[ip], True, True, 0) # Show the window self.vncwindow[ip].add(box2) self.vncwindow[ip].show_all() self.is_fullscreen[ip]=False def vnc_demo_simple(self, widget, ip): if not self.get_client(): return client_simple=self.connected_users_txt if len(self.connected_users) == 0 or self.connected_users[0] == shared.NO_LOGIN_MSG: shared.error_msg ( _("Can't start demo mode, user is not logged") ) return msg=_( _("Do you want demo mode from user %s?" ) %(client_simple) ) if not shared.ask_msg ( msg ): return if self.main.iconview.ismultiple(): self.allclients=self.main.iconview.get_multiple() elif self.main.classview.ismultiple(): self.allclients=self.main.classview.get_multiple() elif self.main.listview.isactive() and self.main.config.GetVar("selectedhosts") == 1: self.allclients=self.main.listview.getmultiple() if len(self.allclients) == 0: self.allclients=self.main.localdata.allclients else: # get all clients connected self.allclients=self.main.localdata.allclients # Allow one client # if len(self.allclients) == 0: return # force kill x11vnc in client self.main.xmlrpc.newhost(ip) max_wait=5 wait=0 self.main.write_into_statusbar( _("Connecting with %s to start VNC support") %(client_simple) ) status="OPEN" while status != "CLOSED": status=PingPort(ip, 5900).get_status() self.main.xmlrpc.vnc("stopserver", ip ) print_debug("start_vnc() waiting to kill x11vnc...") sleep(1) wait+=1 if wait > max_wait: print_debug("max_wait, returning") # fixme show error message return #generate password vnc passwd=''.join( Random().sample(string.letters+string.digits, 12) ) self.main.common.exe_cmd("x11vnc -storepasswd %s %s >/dev/null 2>&1" \ %(passwd, os.path.expanduser('~/.tcosvnc')), verbose=0, background=True ) # start x11vnc in remote host self.main.xmlrpc.vnc("genpass", ip, passwd ) self.main.xmlrpc.vnc("startserver", ip ) self.main.write_into_statusbar( _("Waiting for start demo mode from user %s...") %(client_simple) ) # need to wait for start, PingPort loop status = "CLOSED" max_wait=10 wait=0 while status != "OPEN": status=PingPort(ip, 5900).get_status() if status == "CLOSED": sleep(1) wait+=1 if wait > max_wait: break if status != "OPEN": self.main.write_into_statusbar( _("Error while exec app")) return # start in 1 (teacher) newallclients=[] total=1 for client in self.allclients: self.main.localdata.newhost(client) if self.main.localdata.IsLogged(client) and client != ip: self.main.xmlrpc.vnc("genpass", client, passwd ) self.main.xmlrpc.vnc("startclient", client, ip ) total+=1 newallclients.append(client) if total < 1: self.main.write_into_statusbar( _("No users logged.") ) # kill x11vnc in host self.main.xmlrpc.vnc("stopserver", ip ) else: self.main.write_into_statusbar( _("Running in demo mode with %s clients.") %(total) ) #cmd=("LC_ALL=C LC_MESSAGES=C vncviewer --version 2>&1| grep built |grep -c \"4.1\"") #output=self.main.common.exe_cmd(cmd) #if output == "1": # p=subprocess.Popen(["vncviewer", ip, "-UseLocalCursor=0", "-PasswordFile", "%s" %os.path.expanduser('~/.tcosvnc')], shell=False, bufsize=0, close_fds=True) #else: # p=subprocess.Popen(["vncviewer", ip, "-passwd", "%s" %os.path.expanduser('~/.tcosvnc')], shell=False, bufsize=0, close_fds=True) # new mode for stop button if len(self.vnc_count.keys()) != 0: count=len(self.vnc_count.keys())-1 nextkey=self.vnc_count.keys()[count]+1 self.vnc_count[nextkey]=None else: nextkey=1 self.vnc_count[nextkey]=None stopargs={"target": "vnc", "ip": ip, "allclients":newallclients, "key":nextkey} self.vncviewer(ip, passwd, stoptarget=self.on_progressbox_click, stopargs=stopargs) #self.add_progressbox( {"target": "vnc", "pid":p.pid, "ip": ip, "allclients":newallclients, "key":nextkey}, _("Running in demo mode from user %(host)s. Demo Nº %(count)s") %{"host":client_simple, "count":nextkey} ) self.add_progressbox( stopargs, _("Running in demo mode from user %(host)s. Demo Nº %(count)s") %{"host":client_simple, "count":nextkey} ) def on_progressbox_click(self, widget, args, box): if box: box.destroy() else: for table in self.main.progressbox.get_children(): #[, ] # read key from label tlabel=table.get_children()[0] tbutton=table.get_children()[1] key=int(tlabel.get_text().split('Nº ')[1]) if args['key'] == key: # we have found IP in label !!! destroy table table.destroy() widget=tbutton print_debug("on_progressbox_click() widget=%s, args=%s, box=%s" %(widget, args, box) ) if not args['target']: return try: self.main.stop_running_actions.remove(widget) except Exception, err: print_debug("on_progressbox_click() can't remove widget=%s err=%s"%(widget, err)) if args['target'] == "vnc": del self.vnc_count[args['key']] if args['ip'] != "": for client in args['allclients']: self.main.localdata.newhost(client) if self.main.localdata.IsLogged(client): self.main.xmlrpc.newhost(client) self.main.xmlrpc.vnc("stopclient", client) # kill only in server one vncviewer #if "pid" in args: # os.kill(args['pid'], signal.SIGKILL) #else: # self.main.common.exe_cmd("killall -s KILL vncviewer", verbose=0, background=True) self.vncviewer_destroy(None, args['ip']) self.main.xmlrpc.newhost(args['ip']) self.main.xmlrpc.vnc("stopserver", args['ip'] ) else: # get all users at this demo mode and not kill others demo modes, in some cases need SIGKILL for client in args['allclients']: self.main.localdata.newhost(client) if self.main.localdata.IsLogged(client): self.main.xmlrpc.newhost(client) self.main.xmlrpc.vnc("stopclient", client) if "pid" in args: os.kill(args['pid'], signal.SIGKILL) else: self.main.common.exe_cmd("killall -s KILL x11vnc", verbose=0, background=True) self.main.write_into_statusbar( _("Demo mode off.") ) __extclass__=VNC tcosmonitor/tcosmonitor/extensions/Makefile0000664000000000000000000000054012260544373016552 0ustar all: #none include ../../common.mk clean: rm -f *~ *.pyc install: install -d $(DESTDIR)/$(PREFIX)/share/$(PACKAGE)/extensions @for ext in $(shell ls *.py |grep -v template); do \ echo "install -m 644 $$ext $(DESTDIR)/$(PREFIX)/share/$(PACKAGE)/extensions" ; \ install -m 644 $$ext $(DESTDIR)/$(PREFIX)/share/$(PACKAGE)/extensions ; \ done tcosmonitor/tcosmonitor/htmltextview.py0000664000000000000000000007755012260544373016050 0ustar # -*- coding: UTF-8 -*- # TcosMonitor version __VERSION__ # # Copyright (c) 2006-2011 Mario Izquierdo # # This package is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # # This package is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. ''' A gtk.TextView-based renderer for XHTML-IM, as described in: http://www.jabber.org/jeps/jep-0071.html ''' import gobject import pango import gtk import xml.sax, xml.sax.handler import re import warnings from cStringIO import StringIO import urllib2 import operator import base64 import gc __all__ = ['HtmlTextView'] whitespace_rx = re.compile("\\s+") allwhitespace_rx = re.compile("^\\s*$") ## pixels = points * display_resolution display_resolution = 0.3514598*(gtk.gdk.screen_height() / float(gtk.gdk.screen_height_mm())) def _parse_css_color(color): '''_parse_css_color(css_color) -> gtk.gdk.Color''' if color.startswith("rgb(") and color.endswith(')'): r, g, b = [int(c)*257 for c in color[4:-1].split(',')] return gtk.gdk.Color(r, g, b) else: return gtk.gdk.color_parse(color) class HtmlHandler(xml.sax.handler.ContentHandler): def __init__(self, textview, startiter, main=None): self.main=main xml.sax.handler.ContentHandler.__init__(self) self.textbuf = textview.get_buffer() self.textview = textview self.iter = startiter self.text = '' self.styles = [] # a gtk.TextTag or None, for each span level self.list_counters = [] # stack (top at head) of list # counters, or None for unordered list def _parse_style_color(self, tag, value): color = _parse_css_color(value) tag.set_property("foreground-gdk", color) def _parse_style_background_color(self, tag, value): color = _parse_css_color(value) tag.set_property("background-gdk", color) if gtk.gtk_version >= (2, 8): tag.set_property("paragraph-background-gdk", color) if gtk.gtk_version >= (2, 8, 5) or gobject.pygtk_version >= (2, 8, 1): def _get_current_attributes(self): attrs = self.textview.get_default_attributes() self.iter.backward_char() self.iter.get_attributes(attrs) self.iter.forward_char() return attrs else: ## Workaround http://bugzilla.gnome.org/show_bug.cgi?id=317455 def _get_current_style_attr(self, propname, comb_oper=None): tags = [tag for tag in self.styles if tag is not None] tags.reverse() is_set_name = propname + "-set" value = None for tag in tags: if tag.get_property(is_set_name): if value is None: value = tag.get_property(propname) if comb_oper is None: return value else: value = comb_oper(value, tag.get_property(propname)) return value class _FakeAttrs(object): __slots__ = ("font", "font_scale") def _get_current_attributes(self): attrs = self._FakeAttrs() attrs.font_scale = self._get_current_style_attr("scale", operator.mul) if attrs.font_scale is None: attrs.font_scale = 1.0 attrs.font = self._get_current_style_attr("font-desc") if attrs.font is None: attrs.font = self.textview.style.font_desc return attrs def __parse_length_frac_size_allocate(self, textview, allocation, frac, callback, args): callback(allocation.width*frac, *args) def _parse_length(self, value, font_relative, callback, *args): '''Parse/calc length, converting to pixels, calls callback(length, *args) when the length is first computed or changes''' if value.endswith('%'): frac = float(value[:-1])/100 if font_relative: attrs = self._get_current_attributes() font_size = attrs.font.get_size() / pango.SCALE callback(frac*display_resolution*font_size, *args) else: ## CSS says "Percentage values: refer to width of the closest ## block-level ancestor" ## This is difficult/impossible to implement, so we use ## textview width instead; a reasonable approximation.. alloc = self.textview.get_allocation() self.__parse_length_frac_size_allocate(self.textview, alloc, frac, callback, args) self.textview.connect("size-allocate", self.__parse_length_frac_size_allocate, frac, callback, args) elif value.endswith('pt'): # points callback(float(value[:-2])*display_resolution, *args) elif value.endswith('em'): # ems, the height of the element's font attrs = self._get_current_attributes() font_size = attrs.font.get_size() / pango.SCALE callback(float(value[:-2])*display_resolution*font_size, *args) elif value.endswith('ex'): # x-height, ~ the height of the letter 'x' ## FIXME: figure out how to calculate this correctly ## for now 'em' size is used as approximation attrs = self._get_current_attributes() font_size = attrs.font.get_size() / pango.SCALE callback(float(value[:-2])*display_resolution*font_size, *args) elif value.endswith('px'): # pixels callback(int(value[:-2]), *args) else: warnings.warn("Unable to parse length value '%s'" % value) def __parse_font_size_cb(length, tag): tag.set_property("size-points", length/display_resolution) __parse_font_size_cb = staticmethod(__parse_font_size_cb) def _parse_style_font_size(self, tag, value): try: scale = { "xx-small": pango.SCALE_XX_SMALL, "x-small": pango.SCALE_X_SMALL, "small": pango.SCALE_SMALL, "medium": pango.SCALE_MEDIUM, "large": pango.SCALE_LARGE, "x-large": pango.SCALE_X_LARGE, "xx-large": pango.SCALE_XX_LARGE, } [value] except KeyError: pass else: attrs = self._get_current_attributes() tag.set_property("scale", scale / attrs.font_scale) return if value == 'smaller': tag.set_property("scale", pango.SCALE_SMALL) return if value == 'larger': tag.set_property("scale", pango.SCALE_LARGE) return self._parse_length(value, True, self.__parse_font_size_cb, tag) def _parse_style_font_style(self, tag, value): try: style = { "normal": pango.STYLE_NORMAL, "italic": pango.STYLE_ITALIC, "oblique": pango.STYLE_OBLIQUE, } [value] except KeyError: warnings.warn("unknown font-style %s" % value) else: tag.set_property("style", style) def __frac_length_tag_cb(length, tag, propname): tag.set_property(propname, length) __frac_length_tag_cb = staticmethod(__frac_length_tag_cb) def _parse_style_margin_left(self, tag, value): #print ":::::_parse_style_margin_left::::: tag=%s value=%s" %(tag,value) self._parse_length(value, False, self.__frac_length_tag_cb, tag, "left-margin") def _parse_style_margin_right(self, tag, value): #print ":::::_parse_style_margin_right::::: tag=%s value=%s" %(tag,value) self._parse_length(value, False, self.__frac_length_tag_cb, tag, "right-margin") def _parse_style_font_weight(self, tag, value): ## TODO: missing 'bolder' and 'lighter' try: weight = { '100': pango.WEIGHT_ULTRALIGHT, '200': pango.WEIGHT_ULTRALIGHT, '300': pango.WEIGHT_LIGHT, '400': pango.WEIGHT_NORMAL, '500': pango.WEIGHT_NORMAL, '600': pango.WEIGHT_BOLD, '700': pango.WEIGHT_BOLD, '800': pango.WEIGHT_ULTRABOLD, '900': pango.WEIGHT_HEAVY, 'normal': pango.WEIGHT_NORMAL, 'bold': pango.WEIGHT_BOLD, } [value] except KeyError: warnings.warn("unknown font-style %s" % value) else: tag.set_property("weight", weight) def _parse_style_font_family(self, tag, value): tag.set_property("family", value) def _parse_style_text_align(self, tag, value): try: align = { 'left': gtk.JUSTIFY_LEFT, 'right': gtk.JUSTIFY_RIGHT, 'center': gtk.JUSTIFY_CENTER, 'justify': gtk.JUSTIFY_FILL, } [value] except KeyError: warnings.warn("Invalid text-align:%s requested" % value) else: tag.set_property("justification", align) def _parse_style_text_decoration(self, tag, value): if value == "none": tag.set_property("underline", pango.UNDERLINE_NONE) tag.set_property("strikethrough", False) elif value == "underline": tag.set_property("underline", pango.UNDERLINE_SINGLE) tag.set_property("strikethrough", False) elif value == "overline": warnings.warn("text-decoration:overline not implemented") tag.set_property("underline", pango.UNDERLINE_NONE) tag.set_property("strikethrough", False) elif value == "line-through": tag.set_property("underline", pango.UNDERLINE_NONE) tag.set_property("strikethrough", True) elif value == "blink": warnings.warn("text-decoration:blink not implemented") else: warnings.warn("text-decoration:%s not implemented" % value) ## build a dictionary mapping styles to methods, for greater speed __style_methods = dict() for style in ["background-color", "color", "font-family", "font-size", "font-style", "font-weight", "margin-left", "margin-right", "text-align", "text-decoration"]: try: method = locals()["_parse_style_%s" % style.replace('-', '_')] except KeyError: warnings.warn("Style attribute '%s' not yet implemented" % style) else: __style_methods[style] = method del style ## -- def _get_style_tags(self): return [tag for tag in self.styles if tag is not None] def _begin_span(self, style, tag=None): if style is None: self.styles.append(tag) return None if tag is None: tag = self.textbuf.create_tag() for attr, val in [item.split(':', 1) for item in style.split(';')]: attr = attr.strip().lower() val = val.strip() try: method = self.__style_methods[attr] except KeyError: warnings.warn("Style attribute '%s' requested " "but not yet implemented" % attr) else: method(self, tag, val) self.styles.append(tag) def _end_span(self): self.styles.pop(-1) def _insert_text(self, text): tags = self._get_style_tags() if tags: try: self.textbuf.insert_with_tags(self.iter, text, *tags) except: pass else: try: self.textbuf.insert(self.iter, text) except: pass def _flush_text(self): if not self.text: return self._insert_text(self.text.replace('\n', '')) self.text = '' def _anchor_event(self, tag, textview, event, iter, href, type_): if event.type == gtk.gdk.BUTTON_PRESS and event.button == 1: self.textview.emit("url-clicked", href, type_) return True return False def characters(self, content): if allwhitespace_rx.match(content) is not None: return if self.text: self.text += ' ' self.text += whitespace_rx.sub(' ', content) def startElement(self, name, attrs): self._flush_text() try: style = attrs['style'] except KeyError: style = None tag = None if name == 'a': tag = self.textbuf.create_tag() tag.set_property('foreground', '#0000ff') tag.set_property('underline', pango.UNDERLINE_SINGLE) try: type_ = attrs['type'] except KeyError: type_ = None tag.connect('event', self._anchor_event, attrs['href'], type_) tag.is_anchor = True self._begin_span(style, tag) if name == 'br': pass # handled in endElement elif name == 'p': if not self.iter.starts_line(): self._insert_text("\n") elif name == 'div': if not self.iter.starts_line(): self._insert_text("\n") elif name == 'span': pass elif name == 'ul': if not self.iter.starts_line(): self._insert_text("\n") self.list_counters.insert(0, None) elif name == 'ol': if not self.iter.starts_line(): self._insert_text("\n") self.list_counters.insert(0, 0) elif name == 'li': if self.list_counters[0] is None: li_head = unichr(0x2022) else: self.list_counters[0] += 1 li_head = "%i." % self.list_counters[0] self.text = ' '*len(self.list_counters)*4 + li_head + ' ' elif name == 'img': title=None title_rotate=None b64=None pixbuf=None try: imgfile = attrs['file'] except KeyError: imgfile = None try: title=attrs['title'] except KeyError: title=None try: b64=attrs['base64'] except: b64=None try: onclick=attrs['onclick'] except: onclick=None try: title_rotate=attrs['title_rotate'] except KeyError: title_rotate=None if imgfile: #print "############" #print attrs['file'] #print "############" import os if os.path.isfile(imgfile): #print "file exists" pixbuf = gtk.gdk.pixbuf_new_from_file( imgfile ) tags = self._get_style_tags() if tags: tmpmark = self.textbuf.create_mark(None, self.iter, True) self.textbuf.insert_pixbuf(self.iter, pixbuf) if tags: start = self.textbuf.get_iter_at_mark(tmpmark) for tag in tags: self.textbuf.apply_tag(tag, start, self.iter) self.textbuf.delete_mark(tmpmark) else: print "WARNING: HtmlTextView() img_parser, file %s don't exists" % (imgfile) pixbuf=None else: if b64: try: #print "loading image from base64" loader = gtk.gdk.PixbufLoader() loader.write(base64.decodestring(b64)) loader.close() pixbuf = loader.get_pixbuf() del loader gc.collect() #print pixbuf except Exception, err: print "WARNING Exception loading base64 error: %s" % err else: try: ## Max image size = 10 MB (to try to prevent DoS) mem = urllib2.urlopen(attrs['src']).read(10*1024*1024) ## Caveat: GdkPixbuf is known not to be safe to load ## images from network... this program is now potentially ## hackable ;) loader = gtk.gdk.PixbufLoader() loader.write(mem); loader.close() pixbuf = loader.get_pixbuf() except Exception, ex: pixbuf = None try: alt = attrs['alt'] except KeyError: alt = "Broken image" if pixbuf is not None: tags = self._get_style_tags() if tags: tmpmark = self.textbuf.create_mark(None, self.iter, True) if title: label=gtk.Label(title) if title_rotate: try: title_rotate=int(title_rotate) label.set_property("angle", title_rotate) except: pass label.show() anchor_widget = self.textbuf.create_child_anchor(self.iter) try: self.textview.add_child_at_anchor (label, anchor_widget) except: pass if onclick is not None: # Connect to button events to call pixbuf action, save for example... evbox=gtk.EventBox() evbox.connect("button_press_event", self.main.screenshots_action, onclick, pixbuf) _img=gtk.Image() _img.set_from_pixbuf(pixbuf) _img.show() evbox.add(_img) evbox.show() anchor_widget = self.textbuf.create_child_anchor(self.iter) self.textview.add_child_at_anchor (evbox, anchor_widget) else: self.textbuf.insert_pixbuf(self.iter, pixbuf) if tags: start = self.textbuf.get_iter_at_mark(tmpmark) for tag in tags: self.textbuf.apply_tag(tag, start, self.iter) self.textbuf.delete_mark(tmpmark) else: self._insert_text("[IMG: %s]" % alt) elif name == 'body': pass elif name == 'a': pass elif name == 'input': itype=None iname=None ilabel=None iindex=None widget=None try: itype = attrs['type'] except KeyError: print "WARNING: Unknow input type" try: ilabel = attrs['label'] except KeyError: pass try: iname = attrs['name'] except KeyError: print "WARNING: Unknow input name" try: iindex = int(attrs['index']) except KeyError: pass ########################### add widget ############################# if itype == "checkbox" or itype == "button" or itype == "slider": if iname != None: if iindex != None: widget_array=eval( iname ) widget=widget_array[iindex] else: widget=eval(iname) else: widget=None # add a widget if self.main != None: # based on http://njhurst.org/programming/python-toys/textview.txt anchor_widget = self.textbuf.create_child_anchor(self.iter) try: self.textview.add_child_at_anchor (widget, anchor_widget) except: pass else: print "WARNING: not add widget, something wrong added" ######################### end add widget ############################ elif name == "livevnc": #print "htmltextview: name=%s ip=%s objdict=%s"%(name, attrs['ip'], attrs['objdict']) vnc=getattr(self.main, attrs['objdict'])[attrs['ip']] # set tittle label=gtk.Label(attrs['title']) title_rotate=int(attrs['title_rotate']) label.set_property("angle", title_rotate) label.show() anchor_widget = self.textbuf.create_child_anchor(self.iter) try: self.textview.add_child_at_anchor (label, anchor_widget) except: pass # insert vnc widget anchor_widget = self.textbuf.create_child_anchor(self.iter) try: self.textview.add_child_at_anchor(vnc, anchor_widget) except Exception, err: print "htmltextview Exception, error=%s" % err else: warnings.warn("Unhandled element '%s'" % name) def endElement(self, name): self._flush_text() if name == 'p': if not self.iter.starts_line(): self._insert_text("\n") elif name == 'div': if not self.iter.starts_line(): self._insert_text("\n") elif name == 'span': pass elif name == 'br': self._insert_text("\n") elif name == 'ul': self.list_counters.pop() elif name == 'ol': self.list_counters.pop() elif name == 'li': self._insert_text("\n") elif name == 'img': pass elif name == 'body': pass elif name == 'a': pass elif name == 'input': pass elif name == 'livevnc': pass else: warnings.warn("Unhandled element '%s'" % name) self._end_span() class HtmlTextView(gtk.TextView): __gtype_name__ = 'HtmlTextView' __gsignals__ = { 'url-clicked': (gobject.SIGNAL_RUN_LAST, None, (str, str)), # href, type } def __init__(self, main=None): self.main=main gtk.TextView.__init__(self) self.set_wrap_mode(gtk.WRAP_CHAR) self.set_editable(False) self._changed_cursor = False self.connect("motion-notify-event", self.__motion_notify_event) self.connect("leave-notify-event", self.__leave_event) self.connect("enter-notify-event", self.__motion_notify_event) self.set_pixels_above_lines(6) self.set_pixels_below_lines(6) self.set_left_margin(10) self.set_right_margin(10) self.set_accepts_tab(True) #self.set_tabs(pango.TabArray(20, True)) self.myhtml="" self.is_clean=True def __leave_event(self, widget, event): if self._changed_cursor: window = widget.get_window(gtk.TEXT_WINDOW_TEXT) window.set_cursor(gtk.gdk.Cursor(gtk.gdk.XTERM)) self._changed_cursor = False def __motion_notify_event(self, widget, event): x, y, _ = widget.window.get_pointer() x, y = widget.window_to_buffer_coords(gtk.TEXT_WINDOW_TEXT, x, y) tags = widget.get_iter_at_location(x, y).get_tags() for tag in tags: if getattr(tag, 'is_anchor', False): is_over_anchor = True break else: is_over_anchor = False if not self._changed_cursor and is_over_anchor: window = widget.get_window(gtk.TEXT_WINDOW_TEXT) window.set_cursor(gtk.gdk.Cursor(gtk.gdk.HAND2)) self._changed_cursor = True elif self._changed_cursor and not is_over_anchor: window = widget.get_window(gtk.TEXT_WINDOW_TEXT) window.set_cursor(gtk.gdk.Cursor(gtk.gdk.XTERM)) self._changed_cursor = False return False def display_html(self, html): #print ":::::::::::::::::::::HtmlTextView display_html():::::::::::::::::::::" #print html #print ":::::::::::::::::::::HtmlTextView display_html():::::::::::::::::::::" #print "HtmlViewText::display_html() html=%s" %(html) buffer = self.get_buffer() eob = buffer.get_end_iter() ## this works too if libxml2 is not available parser = xml.sax.make_parser(['drv_libxml2']) # parser.setFeature(xml.sax.handler.feature_validation, True) parser.setContentHandler(HtmlHandler(self, eob, main=self.main)) parser.parse(StringIO(html)) """ try: parser.parse(StringIO(html)) except: print "Found exception in HtmlParser" print html """ if not eob.starts_line(): try: buffer.insert(eob, "\n") except: pass def insert_html(self, html): # FIXME need a BLOCK to avoid inserting from 2 threads.... #print "::::::::::::::::HtmlTextView insert_html():::::::::::::::" self.myhtml+=html self.myhtml+='\n' def clean(self): #print "CLEAN_HTML !!!!" self.is_clean=True buffer = self.get_buffer() #gtk.gdk.threads_enter() buffer.set_text("") #gtk.gdk.threads_leave() if self.main.triggers.has_key('clean.datatxt'): self.main.triggers['clean.datatxt']() self.myhtml="\n\n" def display(self): #print ":::::::::::::::::::::HtmlTextView display():::::::::::::::::::::" if self.myhtml.find("") == -1: self.insert_html("") self.display_html(self.myhtml) def insert_block(self, txt, image=None, color="#96aeea", size="xx-large"): self.insert_html("""
""" %(color) ) if image != None: self.insert_html(""" """ %(image) ) self.insert_html(""" %s
\n\n""" %(size, txt) ) def insert_alert(self, txt, image=None, color="#f08196", size="medium"): self.insert_html("""
""") if image != None: self.insert_html(""" """ %(image) ) self.insert_html(""" %s
\n\n""" %(txt) ) def insert_list(self, mylist): #print mylist self.insert_html("\n\t
    \n") for key, value in mylist: #print "%s=%s" %(key, value) self.insert_html("""
  • %s %s
  • """ %(key, value) ) self.insert_html("\n\t
\n") def insert_proc(self, txt): self.insert_html("
\n") for line in txt: if line == "": continue data=line.split() #print "data=%s len=%s"%(data, len(data) ) if len(data) < 2: continue PID = data[0] Uid = data[1] #VmSize = data[2] #Stat = data[3] Command = " ".join(data[2:]).replace('<', '<').replace('>','>,') if PID == "PID": self.insert_html("\n
%8s %6s %s
\n" \ %(PID, Uid, Command) ) continue #PID, Uid, VmSize, Stat, Command = line.split(' ', 5) if not Command == "": #print "%8s %6s %5s %5s %s" %(PID, Uid, VmSize, Stat, Command) self.insert_html("\n%8s %6s %s
" %(PID, Uid, Command) ) self.insert_html("\n
\n") if gobject.pygtk_version < (2, 8): gobject.type_register(HtmlTextView) if __name__ == '__main__': htmlview = HtmlTextView() def url_cb(view, url, type_): print "url-clicked", url, type_ htmlview.connect("url-clicked", url_cb) htmlview.display_html('
Hello
\n' '
\n' ' World\n' '
\n') htmlview.display_html("
") htmlview.display_html("""

OMG, I'm green with envy!

""") htmlview.display_html("
") htmlview.display_html("""

As Emerson said in his essay Self-Reliance:

"A foolish consistency is the hobgoblin of little minds."

""") htmlview.display_html("
") htmlview.display_html("""

Hey, are you licensed to Jabber?

A License to Jabber

""") htmlview.display_html("""
  • One
  • Two
  • Three
""") htmlview.display_html("""
  1. One
  2. Two
  3. Three
""") htmlview.show() sw = gtk.ScrolledWindow() sw.set_property("hscrollbar-policy", gtk.POLICY_AUTOMATIC) sw.set_property("vscrollbar-policy", gtk.POLICY_AUTOMATIC) sw.set_property("border-width", 0) sw.add(htmlview) sw.show() frame = gtk.Frame() frame.set_shadow_type(gtk.SHADOW_IN) frame.show() frame.add(sw) w = gtk.Window() w.add(frame) w.set_default_size(400, 300) w.show_all() w.connect("destroy", lambda w: gtk.main_quit()) gtk.main() tcosmonitor/tcosmonitor/TcosMenus.py0000664000000000000000000002565612260544373015224 0ustar # -*- coding: UTF-8 -*- # TcosMonitor version __VERSION__ # # Copyright (c) 2006-2011 Mario Izquierdo # # This package is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # # This package is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. import gtk from gettext import gettext as _ import os import sys import tcosmonitor.shared menus_group = [ [ 0, _("Terminal actions") , "active.png"], [ 1, _("User actions") , "logged.png"], [ 2, _("Audio, video and files"), "multimedia.png"], ] def print_debug(txt): if tcosmonitor.shared.debug: print >> sys.stderr, "%s::%s" % (__name__, txt) #print("%s::%s" % (__name__, txt), file=sys.stderr) class TcosMenus(object): def __init__(self, main): print_debug("__init__()") self.main=main self.ui=self.main.ui self.simplemenus=[] self.allmenus=[] self.main.menu=gtk.Menu() self.main.allmenu=gtk.Menu() #self.broadcast_count={} def register_simple(self, name, icon, group, action, func_name): #print_debug("register_simple() name=%s, icons=%s, group=%s, action=%s" %(name, icon, group, action)) self.simplemenus.append( [name, icon, group, action, func_name] ) #print_debug("%s" %[name, icon, group, action, func_name] ) def register_all(self, name, icon, group, action, func_name): #print_debug("register_all() name=%s, icons=%s, group=%s, action=%s" %(name, icon, group, action)) self.allmenus.append( [name, icon, group, action, func_name] ) def MustShowMenu(self, func_name, menutype): item_name="ck_menu_%s" %func_name if not item_name in tcosmonitor.shared.preferences_menus: #print_debug("MustShowMenu() %s %s NOT FOUND return True item_name=%s" %(func_name, menutype, item_name) ) return True if menutype == "menuone": for number in tcosmonitor.shared.preferences_menus[item_name][1]: if number in tcosmonitor.shared.preferences_menus_always_show[menutype]: #print_debug("MustShowMenu() %s %s FOUND in MENUONE return True" %(func_name, menutype) ) return True if menutype == "menuall": for number in tcosmonitor.shared.preferences_menus[item_name][2]: if number in tcosmonitor.shared.preferences_menus_always_show[menutype]: #print_debug("MustShowMenu() %s %s found in MENUALL return True" %(func_name, menutype) ) return True if func_name in self.main.preferences.visible_menu_items["names"]: #print_debug("MustShow() number %s found at %s menutype %s"%(number, self.main.preferences.visible_menu_items[menutype], menutype)) return True #print_debug("MustShowMenu() %s %s return False item_name=%s" %(func_name, menutype, item_name) ) return False def RightClickMenuOne(self, path=None, model=None, ip=None): """ menu for one client""" print_debug ( "RightClickMenuOne() creating menu" ) self.main.menu=gtk.Menu() #print_debug ("%s"%self.simplemenus) totalhidemenus=0 #menu header if ip: menu_items = gtk.MenuItem( _("Actions for %s") %(ip) ) self.main.menu.append(menu_items) menu_items.set_sensitive(False) menu_items.show() elif path == None: menu_items = gtk.MenuItem(_("Actions for selected host")) self.main.menu.append(menu_items) menu_items.set_sensitive(False) menu_items.show() else: if not model: model=self.main.tabla.get_model() menu_items = gtk.MenuItem( _("Actions for %s") %(model[path][1]) ) ip=model[path][1] self.main.menu.append(menu_items) menu_items.set_sensitive(False) menu_items.show() for mainmenu in menus_group: if mainmenu[2] != None and os.path.isfile(tcosmonitor.shared.IMG_DIR + mainmenu[2]): menu_item = gtk.ImageMenuItem(mainmenu[1], True) icon = gtk.Image() icon.set_from_file(tcosmonitor.shared.IMG_DIR + mainmenu[2]) menu_item.set_image(icon) else: menu_item=gtk.MenuItem(mainmenu[1]) submenu = gtk.Menu() count=0 # parse submenu items and create submenu for _s in self.simplemenus: if _s[2] != mainmenu[0]: continue if _s[1] != None and os.path.isfile(tcosmonitor.shared.IMG_DIR + _s[1]): sub = gtk.ImageMenuItem(_s[0], True) icon = gtk.Image() icon.set_from_file(tcosmonitor.shared.IMG_DIR + _s[1]) sub.set_image(icon) else: sub=gtk.MenuItem(_s[0]) # show ??? if self.MustShowMenu(_s[4], "menuone"): #print_debug("RightClickMenuOne() [SHOW] %s"%_s) sub.connect("activate", _s[3], ip) sub.show() count+=1 else: #print_debug("RightClickMenuOne() [HIDE] %s"%_s) sub.hide() totalhidemenus+=1 if self.main.config.GetVar("menugroups") == 1: #print_debug("RightClickMenuOne() MENU GROUPS") submenu.append(sub) else: #print_debug("RightClickMenuOne() PLAIN MENU") self.main.menu.append(sub) menu_item.set_submenu(submenu) # if submenu is empty don't show if count == 0: menu_item.hide() else: menu_item.show() # append to main menu if self.main.config.GetVar("menugroups") == 1: self.main.menu.append(menu_item) if totalhidemenus > 0: hide_items = gtk.MenuItem(_("%d hidden actions") %totalhidemenus) hide_items.set_sensitive(False) hide_items.show() self.main.menu.append(hide_items) return def RightClickMenuAll(self): """ menu for ALL clients""" self.main.allmenu=gtk.Menu() totalhidemenus=0 #menu headers if self.main.config.GetVar("selectedhosts") == 1: menu_items = gtk.MenuItem(_("Actions for selected hosts")) elif self.main.iconview.ismultiple() or self.main.classview.ismultiple(): menu_items = gtk.MenuItem(_("Actions for selected hosts")) else: menu_items = gtk.MenuItem(_("Actions for all hosts")) self.main.allmenu.append(menu_items) menu_items.set_sensitive(False) menu_items.show() for mainmenu in menus_group: if mainmenu[2] != None and os.path.isfile(tcosmonitor.shared.IMG_DIR + mainmenu[2]): menu_item = gtk.ImageMenuItem(mainmenu[1], True) icon = gtk.Image() icon.set_from_file(tcosmonitor.shared.IMG_DIR + mainmenu[2]) menu_item.set_image(icon) else: menu_item=gtk.MenuItem(mainmenu[1]) submenu = gtk.Menu() count=0 # parse submenu items and create submenu for _s in self.allmenus: if _s[2] != mainmenu[0]: continue if _s[1] != None and os.path.isfile(tcosmonitor.shared.IMG_DIR + _s[1]): sub = gtk.ImageMenuItem(_s[0], True) icon = gtk.Image() icon.set_from_file(tcosmonitor.shared.IMG_DIR + _s[1]) sub.set_image(icon) else: sub=gtk.MenuItem(_s[0]) if self.MustShowMenu(_s[4], "menuall"): #print_debug("RightClickMenuOne() [SHOW] %s"%_s) sub.connect("activate", _s[3], ) sub.show() count+=1 else: sub.hide() totalhidemenus+=1 if self.main.config.GetVar("menugroups") == 1: #print_debug("RightClickMenuAll() MENU GROUPS") submenu.append(sub) else: #print_debug("RightClickMenuAll() PLAIN MENU") self.main.allmenu.append(sub) menu_item.set_submenu(submenu) # if submenu is empty don't show if count == 0: menu_item.hide() else: menu_item.show() # append to main allmenu if self.main.config.GetVar("menugroups") == 1: self.main.allmenu.append(menu_item) if totalhidemenus > 0: hide_items = gtk.MenuItem(_("%d hidden actions") %totalhidemenus) hide_items.set_sensitive(False) hide_items.show() self.main.allmenu.append(hide_items) if self.main.classview.isactive(): save_pos = gtk.ImageMenuItem(_("Save hosts positions"), True) icon = gtk.Image() icon.set_from_stock (gtk.STOCK_SAVE, gtk.ICON_SIZE_BUTTON) save_pos.set_image(icon) save_pos.connect("activate", self.main.classview.savepos, "save") save_pos.show() self.main.allmenu.append(save_pos) reset_pos = gtk.ImageMenuItem(_("Reset hosts positions"), True) icon = gtk.Image() icon.set_from_stock (gtk.STOCK_REFRESH, gtk.ICON_SIZE_BUTTON) reset_pos.set_image(icon) reset_pos.connect("activate", self.main.classview.savepos, "reset") reset_pos.show() self.main.allmenu.append(reset_pos) return def on_rightclickmenuone_click(self, menu, number): print_debug ( "on_rightclickmenuone_click() => onehost_menuitems[%d]=%s" \ % (number, tcosmonitor.shared.onehost_menuitems[number][0]) ) self.main.actions.menu_event_one(number) def on_rightclickmenuall_click(self, menu, number): print_debug ( "on_rightclickmenuall_click() => allhost_menuitems[%d]=%s" \ % (number, tcosmonitor.shared.allhost_menuitems[number][0]) ) self.main.actions.menu_event_all(number) tcosmonitor/tcosmonitor/TcosActions.py0000664000000000000000000004750412260544373015531 0ustar # -*- coding: UTF-8 -*- # TcosMonitor version __VERSION__ # # Copyright (c) 2006-2011 Mario Izquierdo # # This package is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # # This package is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. from time import time import gobject import gtk from gettext import gettext as _ import sys import tcosmonitor.shared def print_debug(txt): if tcosmonitor.shared.debug: print >> sys.stderr, "%s::%s" % (__name__, txt) #print("%s::%s" % (__name__, txt), file=sys.stderr) def crono(start, txt): print_debug ("crono(), %s get %f seconds" %(txt, (time() - start)) ) return class TcosActions: def __init__(self, main): print_debug ( "__init__()" ) self.main=main self.button_action_audio=None self.button_action_chat=None self.button_action_list=None self.button_action_video=None self.button_action_send=None self.button_action_exe=None self.button_action_text=None self.excludes=0 self.lenclients=0 #self.model=self.main.init.model #self.main.progressstop_args={} def on_allhostbutton_click(self, widget): print_debug("on_allhostbutton_click() ....") event = gtk.gdk.Event(gtk.gdk.BUTTON_PRESS) self.main.menus.RightClickMenuAll() self.main.allmenu.popup( None, None, None, event.button, event.time) return True def on_preferencesbutton_click(self, widget): self.main.pref.show() def on_aboutbutton_click(self, widget): #self.main.about.show() self.main.abouttcos.show() def on_fullscreenbutton_click(self, widget): if self.main.is_fullscreen: self.main.mainwindow.unfullscreen() self.main.is_fullscreen=False self.main.fullscreenbutton.set_stock_id("gtk-fullscreen") else: self.main.mainwindow.fullscreen() self.main.is_fullscreen=True self.main.fullscreenbutton.set_stock_id("gtk-leave-fullscreen") def on_progressbutton_click(self, widget): print_debug( "on_progressbutton_click()" ) if not self.main.worker.is_stoped(): self.main.worker.stop() self.main.progressbutton.hide() def on_refreshbutton_click(self, widget): if self.main.config.GetVar("xmlrpc_username") == "" or self.main.config.GetVar("xmlrpc_password") == "": return self.main.write_into_statusbar ( _("Searching for connected hosts...") ) # clear cached ips and ports self.main.xmlrpc.resethosts() self.datatxt = self.main.datatxt # clear datatxt if len allclients is 0 self.datatxt.clean() self.lenclients=0 self.excludes=0 method=self.main.config.GetVar("scan_network_method") if method in ['ping', 'static', 'nmap']: # clean icons and files self.main.listview.clear() self.main.iconview.clear() self.main.classview.clear() allclients=self.main.localdata.GetAllClients(self.main.config.GetVar("scan_network_method")) # ping will call populate_hostlist when finish return else: # clean icons and files self.main.listview.clear() self.main.iconview.clear() self.main.classview.clear() allclients=self.main.localdata.GetAllClients(self.main.config.GetVar("scan_network_method")) if len(allclients) == 0: self.main.write_into_statusbar ( _("Not connected hosts found.") ) return self.main.write_into_statusbar ( _("Found %d hosts" ) %len(allclients) ) self.lenclients=len(allclients) # populate_list in a thread self.main.worker=tcosmonitor.shared.Workers(self.main, \ self.populate_hostlist, [allclients] ) self.main.worker.start() return def on_searchbutton_click(self, widget): if self.main.config.GetVar("xmlrpc_username") == "" or \ self.main.config.GetVar("xmlrpc_password") == "": return print_debug ( "on_searchbutton_click()" ) self.main.search_host(widget) def on_donatebutton_click(self, widget): self.main.donatewindow.show() def on_donatewindow_close(self, *args): notshowagain=self.main.donateshowagain.get_active() if notshowagain: self.main.config.SetVar("show_donate", "0") self.main.config.SaveToFile() self.main.donatewindow.hide() return True def on_donateurl_click(self, *args): url=self.main.donateurllabel.get_text() self.main.common.exe_cmd("x-www-browser %s"%url, \ verbose=0, \ background=True) def on_weburl_click(self, *args): self.main.common.exe_cmd("x-www-browser %s" % tcosmonitor.shared.website, \ verbose=0, \ background=True) def on_abouttcos_close(self, *args): self.main.abouttcos.hide() return True def on_abouttcos_donatecheck_change(self, *args): notshowagain=self.main.abouttcos_donatecheck.get_active() if notshowagain: self.main.config.SetVar("show_donate", "0") self.main.config.SaveToFile() else: self.main.config.SetVar("show_donate", "1") self.main.config.SaveToFile() ############################################################################ def populate_host_list(self): #allclients=self.main.localdata.GetAllClients( self.main.config.GetVar("scan_network_method") ) #Thread( target=self.populate_hostlist, args=([allclients]) ).start() # clear cached ips and ports self.main.xmlrpc.resethosts() self.datatxt = self.main.datatxt # clear datatxt if len allclients is 0 self.datatxt.clean() self.lenclients=0 self.excludes=0 self.main.write_into_statusbar ( _("Searching for connected hosts...") ) # clean icons and files self.main.listview.clear() self.main.iconview.clear() self.main.classview.clear() method=self.main.config.GetVar("scan_network_method") if method in ['ping', 'static', 'nmap']: allclients=self.main.localdata.GetAllClients(self.main.config.GetVar("scan_network_method")) self.main.refreshbutton.set_sensitive(True) return False # ping will call populate_hostlist when finish elif method == 'avahi': allclients=self.main.avahi.get_all_ips() if not allclients: self.main.write_into_statusbar ( _("Not connected hosts found.") ) return False if len(allclients)>0: self.main.write_into_statusbar ( _("Found %d hosts" ) %len(allclients) ) self.main.worker=tcosmonitor.shared.Workers(self.main, self.populate_hostlist, [allclients] ) self.main.worker.start() return False else: allclients=self.main.localdata.GetAllClients(self.main.config.GetVar("scan_network_method")) if len(allclients) != 0: self.main.write_into_statusbar ( _("Found %d hosts" ) %len(allclients) ) # populate_list in a thread self.lenclients=len(allclients) self.main.worker=tcosmonitor.shared.Workers(self.main, self.populate_hostlist, [allclients] ) self.main.worker.start() return False self.main.write_into_statusbar ( _("Not connected hosts found.") ) self.main.refreshbutton.set_sensitive(True) print_debug ( "POPULATE_HOST_LIST() returning %s" %(self.main.updating) ) #return self.main.updating return False def set_progressbar(self, txt, number, show_percent=True): percent=int(number*100) if show_percent: self.main.progressbar.set_text("%s (%d %%)" %(txt, percent)) else: self.main.progressbar.set_text("%s" %(txt)) self.main.progressbar.set_fraction(number) def update_progressbar(self, number): number=float(number) if number > 1: return print_debug( "update_progressbar() set number=%f" %(number) ) self.main.progressbar.set_fraction(number) def populate_hostlist(self, clients): print_debug ( "populate_hostlist() init" ) start1=time() # clean list print_debug ( "populate_hostlist() clear list and start progressbar!!!" ) self.main.common.threads_enter("TcosActions:populate_hostlist show progressbar") if tcosmonitor.shared.disable_textview_on_update and self.main.iconview.isactive(): self.main.tabla.set_sensitive(True) #disable refresh button self.main.refreshbutton.set_sensitive(False) self.main.progressbar.show() self.main.progressbutton.show() self.set_progressbar( _("Searching info of hosts..."), 0) if self.main.config.GetVar("listmode") == "both": self.main.listview.clear() self.main.iconview.clear() self.main.classview.clear() elif self.main.listview.isenabled(): self.main.listview.clear() elif self.main.iconview.isenabled(): self.main.iconview.clear() elif self.main.classview.isenabled(): self.main.classview.clear() self.main.common.threads_leave("TcosActions:populate_hostlist show progressbar") inactive_image = gtk.gdk.pixbuf_new_from_file(tcosmonitor.shared.IMG_DIR + 'inactive.png') active_image = gtk.gdk.pixbuf_new_from_file(tcosmonitor.shared.IMG_DIR + 'active.png') active_ssl_image = gtk.gdk.pixbuf_new_from_file(tcosmonitor.shared.IMG_DIR + 'active_ssl.png') logged_image = gtk.gdk.pixbuf_new_from_file(tcosmonitor.shared.IMG_DIR + 'logged.png') unlogged_image = gtk.gdk.pixbuf_new_from_file(tcosmonitor.shared.IMG_DIR + 'unlogged.png') locked_image = gtk.gdk.pixbuf_new_from_file(tcosmonitor.shared.IMG_DIR + 'locked.png') locked_net_image = gtk.gdk.pixbuf_new_from_file(tcosmonitor.shared.IMG_DIR + 'locked_net.png') locked_net_screen_image = gtk.gdk.pixbuf_new_from_file(tcosmonitor.shared.IMG_DIR + 'locked_net_screen.png') unlocked_image = gtk.gdk.pixbuf_new_from_file(tcosmonitor.shared.IMG_DIR + 'unlocked.png') dpms_off_image = gtk.gdk.pixbuf_new_from_file(tcosmonitor.shared.IMG_DIR + 'menu_dpms_off.png') dpms_on_image = gtk.gdk.pixbuf_new_from_file(tcosmonitor.shared.IMG_DIR + 'menu_dpms_on.png') i=0 for host in clients: start2=time() try: if self.main.worker.is_stoped(): print_debug ( "populate_hostlist() WORKER IS STOPPED" ) break except Exception, err: print_debug("populate_hostlist() can't read worker status, error=%s"%err) i += 1 self.main.common.threads_enter("TcosActions:populate_hostlist show connecting") self.main.progressbar.show() self.set_progressbar( _("Connecting to %s...") %(host), float(i)/float(len(clients)) ) self.main.common.threads_leave("TcosActions:populate_hostlist show connecting") self.main.localdata.newhost(host) # Avoid frezee tcosmonitor trying to connect always if not self.main.xmlrpc.newhost(host): print_debug("Host %s is not tcosxmlrpc, continue with populate_hostlist..." %host) continue data={} data['host']=host data['ip']=host data['standalone']=False data['logged']=False print_debug("populate_hostlist() => get username") data['username']=self.main.localdata.GetUsername(data['ip']) if data['username'].startswith('error: tcos-last'): data['username']="---" if tcosmonitor.shared.dont_show_users_in_group != None and not data['username'] in ["---", None]: if self.main.xmlrpc.IsStandalone(data['ip']): groupexclude=self.main.xmlrpc.GetStandalone("get_exclude", \ tcosmonitor.shared.dont_show_users_in_group) print_debug("***standalone***, get_exclude(%s)=%s"%(data['ip'], groupexclude)) else: groupexclude=self.main.localdata.isExclude(data['ip'], \ tcosmonitor.shared.dont_show_users_in_group) print_debug("***thin-client***, isExclude(%s)=%s"%(data['ip'], groupexclude)) if groupexclude in ['exclude', True]: print_debug("Host %s excluded, blacklisted by group" %data['ip']) self.excludes+=1 self.main.write_into_statusbar ( _("Found %(len)d hosts, %(ex)d hosts excluded" ) %{"len":self.lenclients, "ex":self.excludes} ) continue print_debug("populate_hostlist() => get hostname") data['hostname']=self.main.localdata.GetHostname(data['ip']) try: print_debug("populate_hostlist() => get num process") data['num_process']=self.main.localdata.GetNumProcess(data['ip']) except Exception, err: print_debug("populate_hostlist() Exception getting num process, error=%s"%err) data['num_process']="---" print_debug("populate_hostlist() => get time logged") if self.main.xmlrpc.IsStandalone(data['ip']): data['time_logged']=self.main.xmlrpc.GetStandalone("get_time") data['standalone']=True else: data['time_logged']=self.main.localdata.GetTimeLogged(data['ip']) data['standalone']=False if not data['time_logged'] or data['time_logged'] == "" or data['time_logged'].startswith('error: tcos-last'): data['time_logged']="---" print_debug("populate_hostlist() => get active connection") if self.main.localdata.IsActive(data['ip']): data['active']=True if self.main.xmlrpc.sslconnection: data['image_active']=active_ssl_image else: data['image_active']=active_image else: data['image_active']=inactive_image data['active']=False print_debug("populate_hostlist() => get is logged") if self.main.localdata.IsLogged(data['ip']): data['image_logged']=logged_image data['logged']=True else: data['image_logged']=unlogged_image data['logged']=False print_debug("populate_hostlist() => get is blocked") if self.main.localdata.IsBlocked(data['ip']): data['blocked_screen']=True else: data['blocked_screen']=False print_debug("populate_hostlist() => get is blocked net") if self.main.localdata.IsBlockedNet(host, data['username']): data['blocked_net']=True else: data['blocked_net']=False print_debug("populate_hostlist() => get status dpms") if self.main.xmlrpc.dpms('status', data['ip']) == "Off": data['dpms_off']=True else: data['dpms_off']=False if data['dpms_off']: data['image_blocked']=dpms_off_image elif data['blocked_screen'] and data['blocked_net']: data['image_blocked']=locked_net_screen_image elif data['blocked_screen'] == False and data['blocked_net']: data['image_blocked']=locked_net_image elif data['blocked_screen'] and data['blocked_net'] == False: data['image_blocked']=locked_image else: data['image_blocked']=unlocked_image if self.main.config.GetVar("listmode") == "both": self.main.common.threads_enter("TcosActions:populate_hostlist all generate_icon") self.main.listview.generate_file(data) self.main.iconview.generate_icon(data) self.main.classview.generate_icon(data) self.main.common.threads_leave("TcosActions:populate_hostlist all generate_icon") elif self.main.listview.isactive(): self.main.common.threads_enter("TcosActions:populate_hostlist LIST generate_icon") self.main.listview.generate_file(data) self.main.common.threads_leave("TcosActions:populate_hostlist LIST generate_icon") elif self.main.iconview.isactive(): self.main.common.threads_enter("TcosActions:populate_hostlist ICON generate_icon") self.main.iconview.generate_icon(data) self.main.common.threads_leave("TcosActions:populate_hostlist ICON generate_icon") elif self.main.classview.isactive(): self.main.common.threads_enter("TcosActions:populate_hostlist CLASS generate_icon") self.main.classview.generate_icon(data) self.main.common.threads_leave("TcosActions:populate_hostlist CLASS generate_icon") crono(start2, "populate_host_list(%s)" %(data['ip']) ) self.main.common.threads_enter("TcosActions:populate_hostlist END") self.main.progressbar.hide() self.main.progressbutton.hide() self.main.refreshbutton.set_sensitive(True) self.main.progressbutton.set_sensitive(True) if tcosmonitor.shared.disable_textview_on_update and \ self.main.iconview.isactive(): self.main.tabla.set_sensitive(True) self.main.common.threads_leave("TcosActions:populate_hostlist END") try: self.main.worker.set_finished() except Exception, err: print_debug("populate_hostlist() Exception setting worker status, err=%s" %err) crono(start1, "populate_host_list(ALL)" ) return def update_hostlist(self): #if self.main.config.GetVar("populate_list_at_startup") == "1": if float(self.main.config.GetVar("refresh_interval")) > 0: update_every=float(self.main.config.GetVar("refresh_interval")) if float(self.main.config.GetVar("refresh_interval")) >= 10: update_every=float(2) self.main.refreshbutton.set_sensitive(False) print_debug ( "update_hostlist() every %f secs" %(update_every) ) gobject.timeout_add(int(update_every * 1000), self.populate_host_list ) return if __name__ == "__main__": app=TcosActions(None) tcosmonitor/tcosmonitor/TcosCommon.py0000664000000000000000000003123612260544373015354 0ustar # -*- coding: UTF-8 -*- # TcosMonitor version __VERSION__ # # Copyright (c) 2006-2011 Mario Izquierdo # # This package is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # # This package is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. import os import sys import socket import pwd import tcosmonitor.shared import threading from subprocess import Popen, PIPE, STDOUT from gettext import gettext as _ import netifaces import DNS from time import sleep def print_debug(txt): if tcosmonitor.shared.debug: print >> sys.stderr, "%s::%s" % (__name__, txt) #print("%s::%s" % (__name__, txt), file=sys.stderr) class TcosCommon: def __init__(self, main): self.main=main self.thread_lock=False self.vars={} self.extensions={} print_debug("__init__()") self.theme=None def get_username(self): return pwd.getpwuid(os.getuid())[0] def get_userid(self): return os.getuid() def user_in_group(self, group): groups=self.exe_cmd("id") if group != "": if group in groups: return True else: return False return False def cleanproc(self, proc): try: os.waitpid(proc.pid, os.WCONTINUED) except os.error, err: print_debug("OSError exception: %s" %err) pass def exe_cmd(self, cmd, verbose=1, background=False, lines=0, cthreads=1): try: self.p = Popen(cmd, shell=True, bufsize=0, stdout=PIPE, stderr=STDOUT, close_fds=True) except Exception, e: print_debug("Exception in subprocess cmd(%s), error='%s'"%(cmd, e)) return None if self.main.config.GetVar("threadscontrol") == 1 and cthreads == 1: try: th=threading.Thread(target=self.cleanproc, args=(self.p,) ) th.setDaemon(1) th.start() except Exception, err: msg= _("ThreadController: Found error executing %(cmd)s\n\nIf problem persist, disable Thread Controller\nin Preferences and report bug.\nError=%(error)s" %{'cmd':cmd, 'error':err}) print_debug(msg) self.threads_enter("TcosCommon:exe_cmd ThreadController error") tcosmonitor.shared.error_msg(msg) self.threads_leave("TcosCommon:exe_cmd ThreadController error") print_debug("Threads count: %s" %threading.activeCount()) if background: return output=[] stdout = self.p.stdout if lines == 1: return stdout try: result=stdout.readlines() except Exception, e: print_debug("Exception in subprocess::readlines() cmd(%s), error='%s'"%(cmd, e)) return None for line in result: if line != '\n': line=line.replace('\n', '') output.append(line) if len(output) == 1: return output[0] elif len(output) > 1: if verbose==1: print_debug ( "exe_cmd(%s) %s" %(cmd, output) ) return output else: if verbose == 1: print_debug ( "exe_cmd(%s)=None" %(cmd) ) return [] def get_ip_address(self, ifname): print_debug("get_ip_address() ifname=%s" %(ifname) ) if not ifname in netifaces.interfaces(): return None ip=netifaces.ifaddresses(ifname) if ip.has_key(netifaces.AF_INET): return ip[netifaces.AF_INET][0]['addr'] return None def GetAllNetworkInterfaces(self): self.vars["allnetworkinterfaces"]=[] for dev in netifaces.interfaces(): if not dev in tcosmonitor.shared.hidden_network_ifaces: self.vars["allnetworkinterfaces"].append(dev) ip=netifaces.ifaddresses(dev) print_debug ( "GetAllNetworkInterfaces() %s" %( self.vars["allnetworkinterfaces"] ) ) return self.vars["allnetworkinterfaces"] def get_my_local_ip(self, last=True, force=False): print_debug("get_my_local_ip(), last=%s, force=%s" %(last, force)) if force == True or not "local_ip" in self.vars or len(self.vars["local_ip"]) == 0: #print_debug("get_my_local_ip()") self.vars["local_ip"]=[] for dev in self.GetAllNetworkInterfaces(): ip=self.get_ip_address(dev) if ip: print_debug("get_my_local_ip() dev loop, found ip=%s"%ip) self.vars["local_ip"].append(ip) print_debug("get_my_local_ip() self.vars=%s"%self.vars) if len(self.vars["local_ip"]) == 0: print_debug("get_my_local_ip() NO IP found returning None") return None elif last: print_debug("get_my_local_ip() last=True, returning [0]=%s"%self.vars["local_ip"][0]) return self.vars["local_ip"][0] else: print_debug("get_my_local_ip() last=False, returning []=%s"%self.vars["local_ip"]) return self.vars["local_ip"] def get_all_my_ips(self): print_debug("get_all_my_ips()") if "local_ip" in self.vars: return self.vars["local_ip"] return self.get_my_local_ip(last=False) def revlookup(self, name): """ Copy from python-dns lazy.py Added support for small timeout (0,5 secs) convenience routine for doing a reverse lookup of an address""" print_debug("revlookup name=%s"%(name) ) if DNS.Base.defaults['server'] == []: DNS.Base.DiscoverNameServers() a = name.split('.') a.reverse() b = ".".join(a)+'.in-addr.arpa' # this will only return one of any records returned. response=_("unknow") for nameserver in DNS.Base.defaults['server']: try: print_debug("revlookup() reverse name=%s"%b) c=DNS.Base.DnsRequest(b, qtype = 'ptr', timeout=0.2, server=nameserver).req() response=c.answers[0]['data'] except DNS.Base.DNSError, err: print_debug("revlookup() nameserver=%s Exception Timeout, error=%s"%(nameserver,err)) except IndexError, err: print_debug("revlookup() nameserver=%s Exception IndexError, error=%s"%(nameserver,err)) return response def lookup(self, name): response=name if DNS.Base.defaults['server'] == []: DNS.Base.DiscoverNameServers() # /etc/resolv.conf can have 2 or more nameservers # ask every nameserver DNS for nameserver in DNS.Base.defaults['server']: try: c=DNS.Base.DnsRequest(name, qtype = 'a', timeout=0.2, server=nameserver).req() response=c.answers[0]['data'] except DNS.Base.DNSError, err: print_debug("lookup() nameserver=%s Exception Timeout, error=%s"%(nameserver,err)) except IndexError, err: print_debug("lookup() nameserver=%s Exception IndexError, error=%s"%(nameserver, err)) return response def DNSgethostbyaddr(self, ip): hostname=_("unknow") hostname=self.revlookup(ip) if hostname == _("unknow"): try: hostname=socket.gethostbyaddr(ip)[2][0] except Exception, err: print_debug("DNSgethostbyaddr Exception socket.gethostbyaddr, error=%s"%err) return hostname def get_display(self, ip_mode=True): print_debug("get_display() ip_mode=%s"%(ip_mode) ) self.vars["display_host"]=str(tcosmonitor.shared.parseIPAddress(os.environ["DISPLAY"])) self.vars["display_hostname"]=self.vars["display_host"] self.vars["display_ip"]=self.vars["display_host"] if self.vars["display_host"] != "": #self.vars["display_hostname"]=self.DNSgethostbyaddr(self.vars["display_host"]) self.vars["display_hostname"]=self.vars["display_host"] self.vars["display_ip"]=self.lookup(self.vars["display_host"]) else: print_debug("get_display() running in local DISPLAY") self.vars["display_ip"]=self.get_my_local_ip() if self.vars["display_ip"]: # only get hostname if IP != None self.vars["display_hostname"]=self.DNSgethostbyaddr(self.vars["display_ip"]) if ip_mode: display=self.vars["display_ip"] else: display=self.vars["display_hostname"] print_debug ( "get_display() ip_mode='%s' display_host=%s display_hostname=%s display_ip=%s" %(ip_mode, self.vars["display_host"], self.vars["display_hostname"], self.vars["display_ip"]) ) return display def get_extensions(self): if "extensions" in self.vars: return self.vars["extensions"] self.vars["extensions"]=[] #FIXME tcosmonitor.shared.EXTENSIONS what is this??? for ext in os.listdir(tcosmonitor.shared.EXTENSIONS): if ext.endswith('.py') and ext != "__init__.py" and ext != "template.py": #print_debug("get_extensions() extension=%s" %ext) self.vars["extensions"].append( ext.split(".py")[0] ) print_debug("get_extensions() all=%s"%self.vars['extensions']) return self.vars["extensions"] def register_extension(self, ext): print_debug("register_extension() ext=%s"%ext) tmp=__import__(ext, fromlist=['extensions']) # init extension self.extensions[ext]=tmp.__extclass__(self.main) # call register method self.extensions[ext].register() def init_all_extensions(self): """Init all extensions that contains a extension_filter string""" self.extensions={} for ext in self.get_extensions(): try: self.extensions[ext]=__import__("extensions." + ext) except Exception, err: print_debug("init_all_extensions() EXCEPTION importing '%s', error=%s"%(ext, err) ) continue print_debug("init_extensions() init '%s'" %(ext)) self.register_extension( eval("self.extensions[ext]."+ext) ) #self.init_extension( eval("self.extensions[ext]."+ext) ) def threads_enter(self, fromtxt=None): import gtk #print_debug("===> threads_enter() FROM %s"%fromtxt) if self.thread_lock: self.wait() self.thread_lock=True gtk.gdk.threads_enter() def threads_leave(self, fromtxt=None): import gtk #print_debug("======> threads_leave() FROM %s"%fromtxt) gtk.gdk.threads_leave() self.thread_lock=False def wait(self): """ wait (max 4 sec) for self.lock == True """ print_debug("\n\nwait() CALLED\n\n") if not self.thread_lock: return i=0 for i in range(40): print_debug("wait() ************* i=%s ***************"%i) if not self.thread_lock: return sleep(0.1) def get_icon_theme(self): if self.theme: return self.theme try: import gconf except Exception, err: print_debug("get_icon_theme() conf module not installed, error=%s"%err) return None c=gconf.client_get_default() self.theme=c.get_string("/desktop/gnome/interface/icon_theme") print_debug("get_icon_theme() readed gconf theme=%s"%self.theme) return self.theme if __name__ == '__main__': tcosmonitor.shared.debug=True #import sys app=TcosCommon(TcosCommon) #print app.get_my_local_ip(last=True) #print app.get_display() #print app.get_all_my_ips() #app.get_extensions() #app.init_all_extensions() print app.get_display(ip_mode=True) print app.get_display(ip_mode=False) #print app.get_icon_theme() #print app.get_all_my_ips() #print app.GetAllNetworkInterfaces() #print app.get_ip_address('eth0') #print app.get_ip_address('eth1') #print app.get_ip_address('br0') #print app.get_ip_address('br0:0') tcosmonitor/tcosmonitor/counter.py0000664000000000000000000000251712260544373014752 0ustar # -*- coding: UTF-8 -*- # -*- Mode: Python; tab-width: 4 -*- # # Source taken from python-M2Crypto demos # # It is tempting to add an __int__ method to this class, but it's not # a good idea. This class tries to gracefully handle integer # overflow, and to hide this detail from both the programmer and the # user. Note that the __str__ method can be relied on for printing out # the value of a counter: # # >>> print 'Total Client: %s' % self.total_clients # # If you need to do arithmetic with the value, then use the 'as_long' # method, the use of long arithmetic is a reminder that the counter # will overflow. class counter: "general-purpose counter" def __init__ (self, initial_value=0): self.value = initial_value def increment (self, delta=1): result = self.value try: self.value = self.value + delta except OverflowError: self.value = long(self.value) + delta return result def decrement (self, delta=1): result = self.value try: self.value = self.value - delta except OverflowError: self.value = long(self.value) - delta return result def as_long (self): return long(self.value) def __nonzero__ (self): return self.value != 0 def __repr__ (self): return '' % (self.value, id(self)) def __str__ (self): return str(long(self.value)) #return str(long(self.value))[:-1] tcosmonitor/ui/0000775000000000000000000000000012260544373010751 5ustar tcosmonitor/ui/tcosmonitor-askwindow.ui0000664000000000000000000001176012260544373015701 0ustar 430 300 Question center True 10 vertical 5 43 True 90 90 True 0.5 True True 167 4 0 True You can drag and drop launcher file to this box False False 1 True <b>Run app in unknow host</b> True 2 True True True True False False 3 40 True True gtk-cancel True True False True False False 0 gtk-ok True True False True False False 1 False False 4 tcosmonitor/ui/tcos-volume-manager.ui0000664000000000000000000001273612260544373015206 0ustar 500 320 Tcos Volume Manager True vertical True both True gtk-quit False True True gtk-refresh False True Restart sound True gtk-go-forward False True True True Sound levels True center True False False False 0 True True True True automatic never True Main Channels False True True automatic never 1 True Secondary Channels 1 False 1 True False False 2 tcosmonitor/ui/tcosmonitor-mainwindow.ui0000664000000000000000000011671112260544373016051 0ustar 950 660 TcosMonitor center True vertical 3 True both True Exit TcosMonitor Quit True gtk-quit False True True Open preferences dialog Preferences True gtk-preferences False True True Update host list Refresh True gtk-refresh False True True gtk-fullscreen False True True All Hosts True gtk-go-down False True True 130 True True False True Find True gtk-find False True True About this app gtk-about False True False False 0 both True True True True False none True 0 0 True 2 True False False 0 True Send audio conference True False False 1 False True True True True False none True 0 0 True 2 True False False 0 True Start audio chat True False False 1 False True True True True False none True 0 0 True 2 True False False 0 True Audio chat list True False False 1 False True True True True False none True 0 0 True 2 True False False 0 True Send audio/video True False False 1 False True True True True False none True 0 0 True 2 True False False 0 True Send files True False False 1 False True True True True False none True 0 0 True 2 True False False 0 True Exe app True False False 1 False True True True True False none True 0 0 True 2 True False False 0 True Send message True False False 1 False True False False False 1 True True 2 vertical True True False 100 True True automatic automatic in True True True True gtk-justify-fill 0 True List view False False 1 False True True automatic automatic in True True multiple True 1 True True gtk-select-color 0 True Icon view False False 1 1 False True True True automatic automatic True True True 2 True True gtk-dnd-multiple 0 True Simulate my classroom False False 1 2 False True True True True automatic automatic in True True 2 True False False 3 True 2 True False True 0 0 True 2 True gtk-cancel False False 0 True Cancel True False False 1 GTK_FILL 0.10000000149 1 2 GTK_EXPAND | GTK_SHRINK | GTK_FILL False 4 vertical False 5 tcosmonitor/ui/tray.ui0000664000000000000000000001052212260544373012267 0ustar 5 popup gtk-harddisk True vertical True 30 True <big><b>TCOS devices</b></big> True False False 0 True True False True 0 0 True 2 True gtk-go-down False False 0 True Hide True False False 1 False 1 False False 0 True False 1 True 2 tcosmonitor/ui/tcosmonitor-prefwindow.ui0000664000000000000000000025012412260544373016056 0ustar 1 100 1 10 1 100 1 10 65 100 5 10 20 100 1 5 30 1 10 Preferences False True center True dialog True True 10 vertical 10 True True True 10 13 2 10 10 Show host list on startup True False True True 2 5 6 GTK_FILL True 0 Scan network method GTK_FILL True 0 Network interface (thin client) 2 3 GTK_FILL True 1 2 2 3 GTK_FILL GTK_FILL True 1 2 GTK_FILL GTK_FILL Show system process True True False True True 2 6 7 GTK_FILL Don't do actions when running TcosMonitor in thin client True True False True True 2 8 9 GTK_FILL True 0 List of hosts 1 2 GTK_FILL True True False True 0 0 True 2 True gtk-edit False False 0 True Open static host list True False False 1 1 2 1 2 GTK_FILL Only show hosts running tcosxmlrpc (8998 port) True True False True True 2 10 11 GTK_FILL Only do all actions on selected hosts (requires restart TcosMonitor) True True False True True 2 7 8 GTK_FILL Enable SSL connections to XMLRPC clients True True False True True 2 11 12 GTK_FILL True 0 Host list mode 3 4 GTK_FILL True 1 2 3 4 GTK_FILL GTK_FILL Show right menu with groups (NEW) True True False True True 2 4 5 GTK_FILL Don't show thin client if TcosMonitor is running there True True False True True 2 9 10 GTK_FILL Enable ConsoleKit to search users and times (experimental) True True False True True 2 12 13 GTK_FILL True True gtk-execute 0 True Settings False False 1 False True 20 9 2 10 10 True 0 Update host list every (seg) True GTK_FILL 2 True True Update host list every selected seconds. Value=0 disable update. adjustment1 1 1 2 True 0 Cache timeout (seg) True 1 2 GTK_FILL True True Cache some data and connection status during selected seconds. Value=0 disable cache. adjustment2 1 1 2 1 2 True 0 Screenshot size: 4 5 GTK_FILL True True % Size of screnshot. adjustment3 5 1 2 4 5 True 0 Mini screenshot size: 5 6 GTK_FILL True True % Size of screnshot. adjustment4 1 1 2 5 6 True 0 Timeout actions (seg) 6 7 GTK_FILL True True Timeout in seg for actions Value=0 default adjustment5 1 1 2 6 7 True 0 SSH remote username 2 3 GTK_FILL True True root 1 2 2 3 True 0 VLC method to send 3 4 GTK_FILL True 1 2 3 4 True 0 <b>Experimental: Thread Controller</b> ( if you have problems, disable it ) True 8 9 GTK_FILL Actions controlled True True False True True 1 2 8 9 GTK_FILL True 0 Block ports: (80,8080... etc) 7 8 GTK_FILL True True 1 2 7 8 1 True True gtk-index 0 True Advanced False False 1 1 False True 10 3 2 10 10 True 0 2 TcosXmlRpc username True right True GTK_FILL True True 1 2 True 0 2 TcosXmlRpc password True right 1 2 GTK_FILL True True False 1 2 1 2 True 0 <b>NOTE:</b> Default user is <b>root</b> and default password is <b>root</b>. For <u>thin clients</u> change TCOS_ROOT_PASSWD or use TcosConfig and regenerate boot images again. For <u>standalone</u> users you can use a system account (root) but this is not recomended. Install tcos-standalone and start it by root. Set user and password, this will create a <b>/etc/tcospasswd</b> file only used by TCOS and your root acount will be secure. True True 2 2 3 GTK_FILL 2 True True gtk-dialog-authentication 0 True Authentication False False 1 2 False True 10 vertical 10 True <b>Info avalaible from tcosxmlrpc</b> True False False 0 Tcos general info True True False True True False False 1 Cpu info True True False True True False False 2 Kernel and modules info True True False True True False False 3 PCI bus info True True False True True False False 4 Ram and swap info True True False True True False False 5 Process info True True False True True False False 6 Network info True True False True True False False 7 Xorg info True True False True True False False 8 Sound server info True True False True True False False 9 3 True True gtk-dialog-question 0 True Avalaible info False False 1 3 False True 10 vertical 10 True <b>Show / hide menu items</b> True False False 0 True 12 2 5 True Lock and unlock screen True True False True True 1 2 GTK_FILL Remote SSH shell True True False True True 1 2 1 2 GTK_FILL Configure Xorg settings True True False True True 1 2 2 3 GTK_FILL True 2 4 5 GTK_FILL Exe app on user display True True False True True 5 6 GTK_FILL Send a text message True True False True True 1 2 5 6 GTK_FILL Show running apps True True False True True 6 7 GTK_FILL Send video broadcast True True False True True 1 2 6 7 GTK_FILL Send files True True False True True 7 8 GTK_FILL Demo mode True True False True True 1 2 7 8 GTK_FILL True 2 8 9 GTK_FILL Wake on LAN True True False True True 9 10 GTK_FILL Audio conference mode True True False True True 1 2 9 10 GTK_FILL Screenshots True True False True True 1 2 GTK_FILL Reboot and poweroff True True False True True GTK_FILL Lock and unlock internet True True False True True 10 11 GTK_FILL DPMS monitor on/off True True False True True 1 2 10 11 GTK_FILL Connect using VNC True True False True True 2 3 GTK_FILL Connect using iTALC True False True True 11 12 GTK_FILL Restart session with new settings True True False True True 3 4 GTK_FILL Configure this host True True False True True 1 2 3 4 GTK_FILL Live view screens with VNC True True False True True 1 2 11 12 GTK_FILL False False 1 4 True True gtk-sort-descending 0 True Menus False False 1 4 False True 10 vertical 10 True <b>Show / hide menu buttons</b> True False False 0 True 4 2 30 5 True Exe app on user display True True False True True GTK_FILL Send a text message True True False True True 1 2 GTK_FILL Send video broadcast True True False True True 1 2 1 2 GTK_FILL Send files True True False True True 1 2 GTK_FILL Audio conference True True False True True 2 3 GTK_FILL Audio chat conference True True False True True 1 2 2 3 GTK_FILL Audio Chat control True True False True True 3 4 GTK_FILL False False 1 5 True True gtk-index 0 True Menu buttons False False 1 5 False 0 True 10 gtk-cancel True True False True False end 1 gtk-ok True True False True False end 0 False end 1 tcosmonitor/ui/tcospersonalize.ui0000664000000000000000000007051212260544373014541 0ustar True Preferences False center True dialog True True 10 vertical 10 True <span size="x-large"><b>TcosPersonalize</b></span> True False False 0 True <b>unknow host</b> True False False 1 True True True 10 9 2 10 10 Enable mouse wheel True True False True True 2 4 5 GTK_FILL Disable Ctrl + Alt + Backspace (for kill Xorg) True True False True True True 2 5 6 GTK_FILL True 0 Xorg Resolution 2 3 GTK_FILL True 1 2 2 3 GTK_FILL GTK_FILL True 1 2 1 2 GTK_FILL GTK_FILL True 0 Xorg Color depth 3 4 GTK_FILL True 1 2 3 4 GTK_FILL GTK_FILL True 0 X Session Type GTK_FILL True 1 2 GTK_FILL GTK_FILL DPMS energy monitor control True True False True True 2 6 7 GTK_FILL True True 0 Xorg Driver False False 0 Get avalaible drivers True True False True False False 1 1 2 GTK_FILL GTK_FILL True Display Settings False True vertical True 10 2 2 10 10 True 0 X Horiz sync GTK_FILL True 0 X Vert sync 1 2 GTK_FILL True True 1 2 True True 1 2 1 2 1 1 True Advanced 1 False True 6 2 True 0 15 15 Default boot kernel 1 2 GTK_FILL True 1 2 1 2 True 10 <b>PXE Boot options</b> True 2 GTK_FILL True 0 15 15 Default boot method 2 3 GTK_FILL True 1 2 2 3 GTK_FILL True 0 15 15 Command line 3 4 GTK_FILL True True 1 2 3 4 True 10 gtk-apply True True False True False False 1 gtk-delete True True False True False False 3 1 2 4 5 GTK_FILL 2 True Boot options 2 False 2 True 10 True True False True 0 0 True 2 True gtk-delete False False 0 True Delete Config True False False 1 False False 2 gtk-cancel True True False True False end 1 gtk-ok 90 True True False True False end 0 False end 3 tcosmonitor/ui/tcosmonitor-staticwindow.ui0000664000000000000000000004353312260544373016415 0ustar 500 300 Static hosts list center True vertical True <span size="x-large">Static Hosts list</span> True True False False 0 True True True automatic automatic in True True 0 True vertical True True False True 0 0 True 2 True gtk-add False False 0 True Add True False False 1 False False 0 True True False True 0 0 True 2 True gtk-edit False False 0 True Modify True False False 1 False False 1 True True False True 0 0 True 2 True gtk-remove False False 0 True Delete True False False 1 False False 2 True True False True 0 0 True 2 2 True gtk-network False False 0 True Get from connected True False False 1 False False 3 False 1 1 30 True True True True False True 0 0 True 2 True gtk-cancel False False 0 True Cancel True False False 1 False False 1 True True False True 0 0 True 2 True gtk-apply False False 0 True Save True False False 1 False False 2 False 2 tcosmonitor/ui/tcosmonitor-chatwindow.ui0000664000000000000000000002422312260544373016040 0ustar 400 218 Chat emission list center True vertical True <span size="x-large">Chat emission list</span> True True False False 0 True True True automatic automatic in True True 0 True vertical True True False True 0 0 True 2 True gtk-redo False False 0 True Connect True False False 1 False False 0 True True False True 0 0 True 2 True gtk-stop False False 0 True Disconnect True False False 1 False False 1 True True False True 0 0 True 2 True gtk-undo False False 0 True Exit True False False 1 False False 2 False 1 1 tcosmonitor/ui/tcosmonitor-staticwindownew.ui0000664000000000000000000002373512260544373017131 0ustar 400 250 New or edit hosts center True vertical True 5 False False 0 True vertical True You can add a simple host, example: <b>192.168.0.100</b> or range of hosts, example: <b>192.168.0.100-120</b> MAC address is optional True False False 0 True 10 2 2 True 0 IP address * GTK_FILL True 0 MAC address 1 2 GTK_FILL True True 1 2 True True 1 2 1 2 False 1 1 True 10 True True True False True 0 0 True 2 True gtk-cancel False False 0 True Cancel True False False 1 False False 1 True True False True 0 0 True 2 True gtk-apply False False 0 True Save True False False 1 False False 2 False 2 tcosmonitor/ui/tcosmonitor-abouttcos.ui0000664000000000000000000005034112260544373015674 0ustar About TCOS True center dialog True vertical True 5 10 <span size="xx-large">TcosMonitor</span> True True False False 0 True True 10 True True 0 True vertical True True True True 2 <b>Version:</b> True False False 0 True 5 False False 1 1 True Thin client and standalone monitoring tool. True True False False 2 True True False none False True 0 0 True 2 True gtk-go-forward False False 0 True Project web site True False False 1 False False 3 True False False 5 1 False True 5 About False True True never automatic in True True 2 2 False 2 2 False 1 True 5 License 1 False True vertical True 10 Main developers: * Mario Izquierdo <mariodebian at gmail.com> * Ignacio Vidal <vidal_joshur at gva.es> Contributors: * Andrés Jimenez * Quirón Special thanks to: Comunidad de Madrid, MaX group (Spain) False False 1 2 True 5 Authors 2 False True vertical True True 20 Translated to your language by: False False 0 True 10 Mario Izquierdo <mariodebian@gmail.com> False False 1 3 True 5 Translators 3 False True vertical True 0 10 10 TCOS is a free software project that need a lot of work to be the best thin client plataform. We work every day a lot of hours to make changes and support more devices and features. We want to continue developing this software but need your help, if you use, sell or hack TCOS pehaps you could donate some money to project. Click on next url to get some info. True True False False 0 True False False none False True 0 0 True 2 True gtk-go-forward False False 0 True <u>http://wiki.tcosproject.org/TcosProject:Site_support</u> True False False 1 False False 1 Don't show donations message on start. True True False 8 True True False False 2 4 True 5 Donate 4 False 1 tcosmonitor/tcosmonitor.desktop0000664000000000000000000000063612260544373014314 0ustar [Desktop Entry] Version=1.0 Name=TcosMonitor Name[en_GB]=TcosMonitor Name[es]=TcosMonitor Comment=Thin client network monitor Comment[en_GB]=Thin client network monitor Comment[es]=Monitorizar una red de clientes ligeros Exec=/usr/bin/tcosmonitor $@ Terminal=false Type=Application Icon=/usr/share/pixmaps/tcos-icon-32x32.png GenericName[es_ES]=TcosMonitor Categories=GNOME;Settings;System;DesktopSettings;Monitor tcosmonitor/COPYING0000664000000000000000000004310412260544373011371 0ustar GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Library General Public License instead of this License. tcosmonitor/conf/0000775000000000000000000000000012260544373011261 5ustar tcosmonitor/conf/tcos.conf0000664000000000000000000001122012260544373013074 0ustar # some build vars TCOS_DIR=/usr/share/initramfs-tools-tcos TCOS_BINS=/usr/lib/tcos TFTP_DIR=/var/lib/tcos/tftp TCOS_CONF=/etc/tcos TCOS_VAR=/var/lib/tcos TCOS_PKG_CACHE=/var/cache/tcos/packages #TCOS___OPT=/opt/tcos # deprecated #TFTP___DIR=/tftpboot/tcos # deprecated ISOS="/var/lib/tcos/isos" VOLUMENAME="TCOS boot cd" DISTRO="TCOS" # kernel used to build initramfs TCOS_KERNEL=__TCOS_DEFAULT_KERNEL__ # kernel cmdline ( needed for nbi images) TCOS_APPEND="ramdisk_size=65536 initrd=initramfs-${TCOS_KERNEL} root=/dev/ram boot=tcos quiet splash" # verbose messages TCOS_DEBUG=1 # If RAM is less than this number (in Mb) tcos will try to boot from NFS server TCOS_MIN_RAM=38 # show a message of not found modules (better use showmodules cmdline) TCOS_SHOW_NEEDED_MODULES= # disable usr.squashfs if =1, empty create usr.squashfs TCOS_DISABLE_SQUASHFS= # include usr.squashfs in initramfs /mnt/, if =1 download with tftp (less tftpboot time) TCOS_SQUASHFS=1 # usplash theme (default usplash-tcos.so) TCOS_USPLASH="usplash-tcos.so" # wireless support TCOS_WIRELESS= # wireless modules # (avalaible ipw2200, ipw2100, madwifi (ath-pci, ath-hal, etc...), zd1211 (Zydas) and all kernel supported) # ndiswrapper don't work (perl script) # server must have firmware to generate correct images # put names with spaces # example: TCOS_WIRELESS_MODS="ipw2200 ipw2100 zd1211" TCOS_WIRELESS_MODS="" # methods of encription # empty=no encryption # WEP # WPA # only one method (no autodetection yet): example: TCOS_WIRELESS_ENC="WEP" TCOS_WIRELESS_ENC="WPA" # inetd support (actions with telnet) TCOS_INETD=1 # acpid support (button poweroff thin client) TCOS_ACPID=1 # server user to be admin in Thin Client network (need ssh key and italc key) TCOS_ADMIN_USER="root" # number of TTY created on boot (default 1) TCOS_TTY=1 # tty1 console with password (default 1 = yes) TCOS_TTY1_PROTECTED=1 # ssh support => dropbear package needed TCOS_SSH=1 # root password ( if empty root password is "root" ) TCOS_ROOT_PASSWD="" # Autofs support (deprecated) TCOS_AUTOFS= # REMOTEFS access mode ( values: shfs, ltspfs, none ) TCOS_REMOTEFS="ltspfs" # USB support TCOS_USB=1 # Put this vars to 1 to lower initramfs size (disables USB and IDE) TCOS_DISABLE_USB= TCOS_DISABLE_IDE= # discover support ( load kernel modules of found hardware) TCOS_DISCOVER=1 # Xorg support (needed to connect XDCMP or local session) TCOS_XORG=1 # Include in image all xorg installed drivers (~ +3Mb) TCOS_XORG_ALLDRIVERS=1 # Include OpenGL files (needed to run apps in fullscreen ~ +3Mb) TCOS_XORG_OPENGL=1 # Xorg cmdline options ( example -ac to disable control access, default empty) TCOS_XORG_OPTS="" # allowed host than can use Xorg (localhost is always, host separated with spaces) TCOS_XORG_XHOSTS="" # DEFAULT keyboard map TCOS_XORG_XKB="es" # DEFAULT keyboard map TCOS_XORG_XKBMODEL="pc105" # type of X session ( L=local R=remote S=SSH F=freenx N=no startx W=rdesktop) TCOS_XORG_TYPE="R" # printer support TCOS_PRINTER=1 # freenx support ( need freenx installed on server ) TCOS_FREENX= # freenx squashfs ( need freenx installed on server ) TCOS_FREENX_SQUASHFS= # italc Master-Eye client support TCOS_ITALC= # support for x11vnc server ( conflicts with iTALC ) TCOS_X11VNC=1 # rdesktop support (IP address or hostname of MS Windows Terminal Server) TCOS_RDESKTOP_SERVER="" # embedded web browser values=none, dillo(25 Mb), links2 (6 Mb) TCOS_WEB_BROWSER=none # Sound support ( this includes kernel sound modules alsa files and esound binaries) TCOS_SOUND=1 # ISA sound support (old sound cards) TCOS_SOUND_ISA= # force OSS compability (sis7019 need it), normally it is autodetected TCOS_SOUND_OSS= # disable acpi and raid stuff TCOS_DISABLE_ACPI=1 # write some fuck service to inetd.conf (insecure, debug only) opentelnet=0 # VOLUME levels of mixer master and pcm ( values 0%-100% or 1-31 ) TCOS_VOLUME="80%" # boot quietly (no used yet) TCOS_quiet=n # PulseAudio support, use pulseaudio instead of Esound Daemon TCOS_PULSEAUDIO=1 # PulseAudio work with some resample methods # Avalaible options= # * src-sinc-medium-quality # * src-sinc-best-quality # * src-sinc-fastest # * src-zero-order-hold # * src-linear # * trivial TCOS_PULSEAUDIO_RESAMPLE_METHOD="src-sinc-fastest" # Use NFS and not download files with tftp. Values= (none|nfs) TCOS_USENFS=none # This is intended to install a debian/ubuntu system in thin client # with debootstrap TCOS_DEBOOTSTRAP= # Include installer (you can build isos with these) TCOS_INSTALLER=1 # syslinux installer extra boot params TCOS_INSTALLER_BOOT_OPT="quiet splash" # some special settings for thin clients # epatec 3800 (via) TCOS_ETC3800= # All dynamic data come here.... tcosmonitor/tcos-volume-manager.desktop0000664000000000000000000000036012260544373015613 0ustar [Desktop Entry] Version=1.0 Encoding=UTF-8 Name=Tcos Volume levels remote control Exec=tcos-volume-manager Terminal=false Type=Application Icon=/usr/share/tcosmonitor/images/tcos-volume-32x32.png Categories=Application;AudioVideo;GTK;GNOME tcosmonitor/README.server-utils0000664000000000000000000000316712260544373013666 0ustar README file for server-utils tool server-utils is a small python tool to allow do some jobs from UNIX cron. ================= Requisites to run ================= First of all need to create a conf file in the user who run cron jobs with data to connect to thin client. Example (user root): create /root/.tcosmonitor.conf with this data: ####################### xmlrpc_username=__TCOS_USERNAME__ xmlrpc_password=__TCOS_PASSWORD__ ####################### Replace __TCOS_USERNAME__ and __TCOS_PASSWORD__ with the correct info that you are configured in /etc/tcos/tcos.conf Be sure to chmod 600 this file, password is in plain text. ========================= Poweroff All TCOS clients ========================= Add this to your /etc/crontab: 55 20 * * 5 root /usr/sbin/tcos-server-utils --action=message --text="In 5 minutes poweroff all pcs" 00 21 * * 5 root /usr/sbin/tcos-server-utils --action=poweroff This will poweroff all TCOS thin clients at 21:00 all Fridays ========================= Reboot All TCOS clients ========================= Add this to your /etc/crontab: 55 14 * * * root /usr/sbin/tcos-server-utils --action=message --text="In 5 minutes all pcs will be rebooted" 00 15 * * * root /usr/sbin/tcos-server-utils --action=reboot This will reboot all TCOS thin clients at 15:00 all days of week ============================= Restart Xorg All TCOS clients ============================= Add this to your /etc/crontab: 00 09 * * * root /usr/sbin/tcos-server-utils --action=restartx This will reboot all TCOS thin clients at 09:00 all days of week For more cron info see man crontab tcosmonitor/tcosmonitor.py0000664000000000000000000003127212260544542013271 0ustar #!/usr/bin/env python # -*- coding: UTF-8 -*- # TcosMonitor version __VERSION__ # # Copyright (c) 2006-2011 Mario Izquierdo # # This package is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # # This package is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. import sys import os #if not os.path.isfile("Initialize.py"): # #print "DEBUG: append tcosmonitor dir" # sys.path.append("/usr/share/tcosmonitor") import pygtk pygtk.require('2.0') import gtk from time import time import getopt from gettext import gettext as _ from threading import Thread gtk.gdk.threads_init() import gobject from tcosmonitor import shared import grp, pwd import gettext # Medusa import asyncore from medusa import default_handler from medusa import filesys from medusa import ftp_server from medusa import status_handler # M2Crypto try: from tcosmonitor import ftps_server except: print "NO FTP TLS support" pass from threading import Thread import M2Crypto class TCOSFTPSERVER (Thread): def __init__(self): self.FTP_PORT = 8997 M2Crypto.Rand.load_file('/tmp/randpooltcos.dat', -1) self.ssl_ctx=M2Crypto.SSL.Context('sslv23') self.ssl_ctx.load_cert('/etc/tcos/ssl/tcos_server.pem') self.ssl_ctx.load_client_CA('/etc/tcos/ssl/tcos_ca.crt') self.ssl_ctx.set_verify(M2Crypto.SSL.verify_none, 10) self.ssl_ctx.set_session_id_ctx('127.0.0.1:9443') self.ssl_ctx.set_tmp_dh('/etc/tcos/ssl/tcos_dh1024.pem') self.ssl_ctx.set_info_callback() Thread.__init__(self) def run(self): if not os.path.isdir("/tmp/tcos_share"): os.mkdir("/tmp/tcos_share") self.fauthz = ftp_server.anon_authorizer('/tmp/tcos_share') self.ftps = ftps_server.ftp_tls_server(self.fauthz, self.ssl_ctx, port=self.FTP_PORT) self.ftps.status() self.sh=status_handler.status_extension([self.ftps]) M2Crypto.Rand.save_file('/tmp/randpooltcos.dat') asyncore.loop() gettext.bindtextdomain(shared.PACKAGE, shared.LOCALE_DIR) gettext.textdomain(shared.PACKAGE) def print_debug(txt): if shared.debug: print >>sys.stderr, "%s::%s" % ("tcosmonitor", txt) #print("%s::%s" % ("tcosmonitor", txt), file=sys.stderr) return def crono(start, txt): print_debug ("crono(), %s get %f seconds" %(txt, (time() - float(start))) ) return def usage(): print ("TcosMonitor help:") print ("") print (" tcosmonitor -d [--debug] (write debug data to stdout)") print (" tcosmonitor -h [--help] (this help)") try: OPTS, ARGS = getopt.getopt(sys.argv[1:], ":hd", ["help", "debug"]) except getopt.error, msg: print (msg) print ("for command line options use tcosconfig --help") sys.exit(2) # process options for o, a in OPTS: if o in ("-d", "--debug"): print ("DEBUG ACTIVE") shared.debug = True if o in ("-h", "--help"): usage() sys.exit() import tcosmonitor class TcosMonitor(object): def __init__(self): # if true auto-update is active, false only one update self.updating=False self.name="TcosMonitor" self.force_selected_ip=None # register triggers self.triggers={} self.mainloop = gobject.MainLoop() self.groupconf=self.loadconf( os.path.abspath(shared.GLOBAL_CONF) ) try: if int(self.groupconf['check_tcosmonitor_user_group']) == 1: shared.check_tcosmonitor_user_group=True except Exception, err: print_debug("__init__() Exception getting group, error=%s"%err) pass if self.groupconf['dont_show_users_in_group'] != '': shared.dont_show_users_in_group=self.groupconf['dont_show_users_in_group'] #else: # shared.dont_show_users_in_group=None if self.groupconf['tnc_only_ports'] != "no": shared.tnc_only_ports="yes" ################################################## self.worker_running=False self.ingroup_tcos=False if shared.check_tcosmonitor_user_group: for group in os.getgroups(): if grp.getgrgid(group)[0] == "tcos": self.ingroup_tcos=True if os.getuid() == 0: self.ingroup_tcos=True if self.ingroup_tcos == False and os.getuid() != 0: shared.error_msg( _("The user \"%s\" must be member of the group \"tcos\"\ to exec tcosmonitor.\n\nIf you are system administrator, add your\ user to tcos group." %pwd.getpwuid(os.getuid())[0])) sys.exit(1) # Widgets self.ui = gtk.Builder() self.ui.set_translation_domain(shared.PACKAGE) print_debug("Loading ui file...") self.ui.add_from_file(shared.GLADE_DIR + 'tcosmonitor-mainwindow.ui') self.mainwindow = self.ui.get_object('mainwindow') self.mainwindow.set_icon_from_file(shared.IMG_DIR +\ 'tcos-icon-32x32.png') self.is_fullscreen=False # close windows signals self.mainwindow.connect('destroy', self.quitapp ) self.mainwindow.connect("delete_event", self.quitapp) # reduce mainwindow size if running in height < 1024x768 #>>> gtk.gdk.screen_height() #>>> gtk.gdk.screen_width() if gtk.gdk.screen_height() < 768: print_debug("set lower size of mainwindow") self.mainwindow.set_size_request(760,520) # ui file (mainwindow) visible=False, show now self.mainwindow.show() # FIXME self.scrolledtextview = self.ui.get_object('scrolledtextview') #import htmltextview #htmltextview.HtmlHandler().set_main(self) self.datatxt = tcosmonitor.htmltextview.HtmlTextView(self) self.datatxt.show() self.scrolledtextview.add(self.datatxt) self.datatxt.clean() # init classes self.common=tcosmonitor.TcosCommon.TcosCommon(self) self.config=tcosmonitor.TcosConf.TcosConf(self) self.localdata=tcosmonitor.LocalData.LocalData(self) self.xmlrpc=tcosmonitor.TcosXmlRpc.TcosXmlRpc(self) self.xauth=tcosmonitor.TcosXauth.TcosXauth(self) self.preferences=tcosmonitor.TcosPreferences.TcosPreferences(self) self.menus=tcosmonitor.TcosMenus.TcosMenus(self) self.actions=tcosmonitor.TcosActions.TcosActions(self) # views self.listview=tcosmonitor.TcosListView.TcosListView(self) self.iconview=tcosmonitor.TcosIconView.TcosIconView(self) self.classview=tcosmonitor.TcosClassView.TcosClassView(self) self.init=tcosmonitor.Initialize.Initialize(self) self.static=tcosmonitor.TcosStaticHosts.TcosStaticHosts(self) ######### init some elements ########### self.init.init_progressbar() self.init.initabouttcos() ######################################### self.init.initbuttons() self.preferences.populate_pref() self.extloader=tcosmonitor.TcosExtensions.TcosExtLoader(self) if not shared.dbus_disabled: self.dbus_action=tcosmonitor.TcosDBus.TcosDBusAction(self, admin=self.config.GetVar("xmlrpc_username"), passwd=self.config.GetVar("xmlrpc_password")) self.stop_running_actions=[] # generate host list if checked if self.config.GetVar("populate_list_at_startup") == "1": self.populate_host_list() self.actions.update_hostlist() try: self.ftp_thread = TCOSFTPSERVER() self.ftp_thread.setDaemon(1) self.ftp_thread.start() except Exception, err: shared.error_msg("Exception starting FTPs %s" %err) pass def loadconf(self, conffile): conf={} print_debug ( "loadconf() conffile=%s" %conffile ) if os.path.isfile(conffile): print_debug ("loadconf() found conf file %s" %conffile) f=open(conffile, "r") data=f.readlines() f.close() for line in data: if line == '\n': continue if line.find('#') == 0: continue line=line.replace('\n', '') if "=" in line: try: conf["%s"%line.split('=')[0]] = line.split('=')[1].replace('"', '') except Exception, err: print_debug("loadconf() Exception: %s" %err) pass print_debug( "loadconf conf=%s" %conf ) return conf def button_actions(self, widget, action): print_debug ( "button_actionst() action=%s" %action) if action == "audio": if self.actions.button_action_audio != None: self.actions.button_action_audio() elif action == "chat": if self.actions.button_action_chat != None: self.actions.button_action_chat() elif action == "list": if self.actions.button_action_list != None: self.actions.button_action_list() elif action == "video": if self.actions.button_action_video != None: self.actions.button_action_video() elif action == "send": if self.actions.button_action_send != None: self.actions.button_action_send() elif action == "exe": if self.actions.button_action_exe != None: self.actions.button_action_exe() elif action == "text": if self.actions.button_action_text != None: self.actions.button_action_text() return def search_host(self, widget): print_debug ( "search_host()" ) txt=self.searchtxt.get_text() if txt == "": allclients=self.localdata.GetAllClients( self.config.GetVar("scan_network_method") ) Thread( target=self.actions.populate_hostlist, args=([allclients]) ).start() model=self.tabla.get_model() notvalid=[] model.foreach(self.delete_not_searched, (notvalid)) notvalid.reverse() for host in notvalid: model.remove( model.get_iter(host) ) def delete_not_searched(self, model, path, iter, data): txt=self.searchtxt.get_text() hostname=model.get_value(iter, 0) ip=model.get_value(iter, 1) username=model.get_value(iter, 2) if txt != hostname and txt != ip and txt != username: data.append(path) def write_into_statusbar(self, msg, *args): #print_debug("STATUSBAR: Writing \"%s\" into statusbar" % msg) context_id=self.statusbar.get_context_id("status") self.statusbar.pop(context_id) self.statusbar.push(context_id, msg) return def quitapp(self, *args): print_debug ( _("Exiting") ) #gtk.main_quit() widgets=self.stop_running_actions[:] print_debug("Running actions: %s" %len(widgets)) for widget in widgets: print_debug("Stop running action... widget=%s" %(widget)) try: widget.clicked() except: pass if os.path.isdir("/tmp/tcos_share/"): for filename in os.listdir("/tmp/tcos_share/"): if os.path.isfile("/tmp/tcos_share/%s" %filename): os.remove("/tmp/tcos_share/%s" %filename) if os.path.isdir("/tmp/tcos_share"): os.rmdir("/tmp/tcos_share") if os.path.isfile(os.path.expanduser('~/.tcosvnc')): os.remove(os.path.expanduser('~/.tcosvnc')) self.mainloop.quit() def run (self): try: self.mainloop.run() except KeyboardInterrupt: # Press Ctrl+C self.quitapp() if __name__ == '__main__': app = TcosMonitor () # Run app app.run () tcosmonitor/README0000664000000000000000000000237312260544373011221 0ustar TcosMonitor (mariodebian AT gmail DOT com) TcosMonitor is a pygtk app to control and supervise a thin client classroom based on TCOS, PXES, LTSP or others. The project have 2 different parts: * Teacher Tool (TcosMonitor) made with pygtk and other standar libs * Thin Client daemon (tcosxmlrpc) developed in C based on xmlrpc libs and abyss web server code and libs. For debug output exec TCOS_DEBUG=1 /usr/bin/tcosxmlrpc /etc/abys.conf * Some extra tools (hex2ascii, update-tcospasswd, etc...) The initial code is written from scratch helped with pygtk tutorial [1] and some web pages (blogs, maillist, etc...) I have reutilized some python/C code from others: ping.py High based on yetist [2], I have added a second class named PingPort writen by me. (don't know license of it, japanesse page) TcosDbus.py class Based on dbus bindings of Student-Control-Center of Ubuntu [3] GPL Copyright Holder: Oliver Grawert Links: [1] http://www.pygtk.org/pygtk2tutorial-es/ [2] http://www.osprg.org/modules/newbb/viewtopic.php?forum=3&post_id=487 [3] http://people.ubuntu.com/~ogra/bzr-archive/student-control-panel-0.1/ tcosmonitor/server-utils/0000775000000000000000000000000012260544373013000 5ustar tcosmonitor/server-utils/tcos-server-utils.py0000775000000000000000000001526412260544373016777 0ustar #!/usr/bin/env python # -*- coding: UTF-8 -*- # # TcosMonitor version __VERSION__ # # Copyright (c) 2006-2011 Mario Izquierdo # # This package is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # # This package is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. import os, sys import getopt from gettext import gettext as _ if os.geteuid() != 0: print "tcos-server-utils ERROR: you must be root to run this" sys.exit(1) # append current dir to sys-path if exec from sources for m in range(len(sys.path)): if "server-utils" in sys.path[m]: sys.path[m]=os.path.dirname(sys.path[m]) from tcosmonitor import shared def print_debug(txt): if shared.debug: print "%s::%s" %("tcos-server-utils", txt) shared.from_cron=False actions=["reboot", "poweroff", "restartx", "message", "nothing"] action = "" text="" users="" def usage(): print "tcos-server-utils help:" print "" print " tcos-server-utils --action=XXX (action must be: %s ) " %(", ".join(actions) ) print " (use --action=nothing to test with doing nothing!!!)" print " tcos-server-utils --text=\"foo\" (if action=message this text will be displayed " print " in all connected users with notification-daemon)" print " --users=foo,bar (coma separated list of users we want to do action" print " only valid for --action=message)" print " tcos-server-utils -d [--debug] (write debug data to stdout)" print " tcos-server-utils -h [--help] (this help)" try: opts, args = getopt.getopt(sys.argv[1:], ":hd", ["help", "cron", "debug", "action=", "text=", "users="]) except getopt.error, msg: print msg print "for command line options use tcos-server-utils --help" sys.exit(2) # process options for o, a in opts: if o in ("--help"): usage() sys.exit(0) if o in ("-d", "--debug"): shared.debug = True if o in ("--cron"): shared.from_cron=True if o == "--action": if not a in actions: print "TCOS tcos-server-utils ERROR: action \"%s\" not avalaible" %(a) sys.exit(1) action = a if o == "--text": text=a if o == "--users": users=a if action=="": print "tcos-server-utils ERROR: action must be in: %s" %(", ".join(actions) ) sys.exit(0) class ServerUtils: def __init__(self): self.name="ServerUtils" self.worker_running = False # get all devices import tcosmonitor.TcosCommon import tcosmonitor.TcosXmlRpc import tcosmonitor.TcosConf self.common=tcosmonitor.TcosCommon.TcosCommon(self) self.config=tcosmonitor.TcosConf.TcosConf(self) self.xmlrpc=tcosmonitor.TcosXmlRpc.TcosXmlRpc(self) if self.config.GetVar("xmlrpc_username") == "" or self.config.GetVar("xmlrpc_password") == "": print "tcos-server-utils ERROR: need to create /root/.tcosmonitor.conf with user and pass." print " see /usr/share/doc/tcosmonitor/README.tcos-server-utils" sys.exit(1) import tcosmonitor.LocalData self.localdata=tcosmonitor.LocalData.LocalData(self) self.alltcosclients=[] self.allclients=self.localdata.GetAllClients("netstat") if len(self.allclients) == 0: print "tcos-server-utils No host connected, exiting..." sys.exit(0) for host in self.allclients: self.xmlrpc.newhost(host) if self.xmlrpc.connected: print_debug ("Host %s connected" %(host) ) self.alltcosclients.append(host) else: print_debug ("Host %s NOT connected" %(host) ) print ("Doing action \"%s\" in %s" %(action, self.alltcosclients) ) if action == "message": if text != "": print ( "Searching for all connected users..." ) connected_users=[] #connected_users=['magna26'] if users != "": connected_users = users.split(',') print "Users from cdmline: %s" %(connected_users) else: for client in self.alltcosclients: if self.localdata.IsLogged(client): connected_users.append(self.localdata.GetUsername(client)) print ( "Connected users: %s" %connected_users) from tcosmonitor.TcosDBus import TcosDBusAction self.dbus_action=TcosDBusAction( self, \ admin=self.config.GetVar("xmlrpc_username"), \ passwd=self.config.GetVar("xmlrpc_password") ) result=self.dbus_action.do_message ( connected_users, text ) if not result: print "ERROR: sending dbus msg: %s" %(self.dbus_action.get_error_msg() ) else: print "DBus message send ok." else: print ( "ERROR: message action need a --text value" ) for client in self.alltcosclients: if action == "reboot": print ( "Restarting %s..." %client ) self.xmlrpc.newhost(client) self.xmlrpc.Exe("reboot") elif action == "poweroff": print ( "Shutting down %s..." %client ) self.xmlrpc.newhost(client) self.xmlrpc.Exe("poweroff") elif action == "restartx": print ( "Restarting Xorg of %s..." %client ) self.xmlrpc.newhost(client) self.xmlrpc.Exe("restartx") elif action == "message": pass else: print ( "Unknow action %s in client %s" %(action, client) ) if __name__ == "__main__": app=ServerUtils() tcosmonitor/tcospersonalize.py0000664000000000000000000005210112260544373014131 0ustar #!/usr/bin/env python # -*- coding: UTF-8 -*- # TcosMonitor version __VERSION__ # # Copyright (c) 2006-2011 Mario Izquierdo # # This package is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # # This package is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. import sys import os import glob import pygtk pygtk.require('2.0') import gtk from tcosmonitor import shared from time import time import getopt from gettext import gettext as _ import gobject import grp debug_name="tcospersonalize" PXELINUX_CFG=[ "default __TCOS_METHOD__", "prompt 0", "timeout 50", "label default", " kernel vmlinuz-__TCOS_KERNEL__", " append ramdisk_size=65536 boot=tcos root=/dev/ram0 initrd=initramfs-__TCOS_KERNEL__ __TCOS_CMDLINE__", "label nfs", " kernel vmlinuz-__TCOS_KERNEL__", " append ramdisk_size=32768 boot=tcos root=/dev/ram0 initrd=initramfs-__TCOS_KERNEL__-nfs forcenfs __TCOS_CMDLINE__", "", "#kernel=__TCOS_KERNEL__", "#method=__TCOS_METHOD__", "#cmdline='__TCOS_CMDLINE__'", ] PXE_METHODS=[ "default", "nfs" ] PXELINUX_CMDLINE="quiet splash" def print_debug(txt): if shared.debug: print >> sys.stderr, "%s::%s" % (debug_name, txt) #print("%s::%s" % (debug_name, txt), file=sys.stderr) return def crono(start, txt): print_debug ("crono(), %s get %f seconds" %(txt, (time() - float(start))) ) return def usage(): print ("TcosPersonalize help:") print ("") print (" tcospersonalize [--host=XXX.XXX.XXX.XXX] (host to personalize)") print (" tcospersonalize -d [--debug] (write debug data to stdout)") print (" tcospersonalize -h [--help] (this help)") try: opts, args = getopt.getopt(sys.argv[1:], ":hd", ["help", "debug", "host="]) except getopt.error, msg: print (msg) print ("for command line options use tcosconfig --help") sys.exit(2) # process options for o, a in opts: if o in ("-d", "--debug"): print ("DEBUG ACTIVE") shared.debug = True if o == "--host": print ("HOST %s" % a) shared.remotehost = a if o in ("-h", "--help"): usage() sys.exit() class TcosPersonalize: def __init__(self): print_debug ( "__init__()" ) self.name="TcosPersonalize" # exit if no host if shared.remotehost == None: usage() shared.error_msg ( _("Need a host to configure!!!\nTry exec:\n tcospersonalize --host=XXX.XXX.XXX.XXX") ) sys.exit(1) nogroup=True for group in os.getgroups(): if grp.getgrgid(group)[0] == "tcos": nogroup=False if nogroup and os.getuid() != 0: shared.error_msg( "You must be root to exec tcospersonalize." ) sys.exit(1) self.remotehost_config = os.path.join ("/var/lib/tcos/tftp/conf/", shared.remotehost + ".conf" ) # Widgets import gettext gettext.bindtextdomain(shared.PACKAGE, shared.LOCALE_DIR) gettext.textdomain(shared.PACKAGE) print_debug("loading %s" %(shared.GLADE_DIR + 'tcospersonalize.ui')) self.ui = gtk.Builder() self.ui.set_translation_domain(shared.PACKAGE) self.ui.add_from_file(shared.GLADE_DIR + 'tcospersonalize.ui') self.main = self.ui.get_object('mainwindow') # close windows signals self.main.connect('destroy', self.quitapp ) # buttons self.buttonok=self.ui.get_object('ok_button') self.buttoncancel=self.ui.get_object('cancel_button') self.buttondelete=self.ui.get_object('delete_button') self.buttongetavalaible=self.ui.get_object('getavalaible_button') # signals on buttons self.buttonok.connect('clicked', self.on_buttonok_click ) self.buttoncancel.connect('clicked', self.on_buttoncancel_click ) self.buttondelete.connect('clicked', self.on_buttondelete_click ) self.buttongetavalaible.connect('clicked', self.on_buttongetavalaible_click ) # get combos self.combo_xsession=self.ui.get_object('combo_xsession') self.combo_xdriver=self.ui.get_object('combo_xdriver') self.combo_xres=self.ui.get_object('combo_xres') self.combo_xdepth=self.ui.get_object('combo_xdepth') # get checkboxes self.ck_xmousewheel=self.ui.get_object('ck_xmousewheel') self.ck_xdontzap=self.ui.get_object('ck_xdontzap') self.ck_xdpms=self.ui.get_object('ck_xdpms') # get textboxes #self.text_extramodules=self.ui.get_object('txt_extramodules') self.text_xhorizsync=self.ui.get_object('txt_xhorizsync') self.text_xvertsync=self.ui.get_object('txt_xvertsync') # boot options self.combo_kernel=self.ui.get_object('combo_kernel') self.combo_method=self.ui.get_object('combo_method') self.text_cmdline=self.ui.get_object('txt_cmdline') self.buttonapply=self.ui.get_object('apply_button') self.buttonapply.connect('clicked', self.on_buttonapply_click ) self.deleteboot=self.ui.get_object('delete_boot_button') self.deleteboot.connect('clicked', self.on_deleteboot_click ) # host label self.hostlabel=self.ui.get_object('label_host') self.hostlabel.set_markup ( "" + _("host: ") + shared.remotehost + "" ) # get conf file self.vars=[] self.OpenFile() found=False for var in self.vars: if var[0] == "xdisablesync": found=True if not found: print_debug("adding xdisablesync....") self.vars.append(["xdisablesync", ""]) # populate combos self.populate_select(self.combo_xsession, shared.xsession_values ) self.set_active_in_select(self.combo_xsession, self.GetVar("xsession") ) self.populate_select(self.combo_xdriver, shared.xdriver_values ) self.set_active_in_select(self.combo_xdriver, self.GetVar("xdriver") ) #self.populate_select(self.combo_xdriver, ['auto'] ) #self.set_active_in_select(self.combo_xdriver, "\"auto\"" ) self.populate_select(self.combo_xres, shared.xres_values ) self.set_active_in_select(self.combo_xres, self.GetVar("xres") ) self.populate_select(self.combo_xdepth, shared.xdepth_values ) self.set_active_in_select(self.combo_xdepth, self.GetVar("xdepth") ) # populate checkbox #self.populate_checkboxes( self.ck_xmousewheel, 1) #self.populate_checkboxes( self.ck_xdontzap, 1) #self.populate_checkboxes( self.ck_xdpms, 1) self.populate_checkboxes( self.ck_xmousewheel, self.GetVar("xmousewheel") ) self.populate_checkboxes( self.ck_xdontzap, self.GetVar("xdontzap") ) self.populate_checkboxes( self.ck_xdpms, self.GetVar("xdpms") ) self.populate_textboxes( self.text_xhorizsync, self.GetVar("xhorizsync") ) self.populate_textboxes( self.text_xvertsync, self.GetVar("xvertsync") ) kernels=self.getkernels() self.bootfilename=self.get_hexfilename(shared.remotehost) self.bootparams={'kernel':'', 'method':'default', 'cmdline':'quiet splash'} if os.path.isfile(self.bootfilename): f=open(self.bootfilename, 'r') for line in f.readlines(): if line.startswith("#kernel"): self.bootparams['kernel']=line.split('=')[1].strip() if line.startswith("#method"): self.bootparams['method']=line.split('=')[1].strip() if line.startswith("#cmeline"): self.bootparams['cmdline']=line.split('=')[1].strip() f.close() self.deleteboot.set_sensitive(True) else: if len(kernels) == 1: self.bootparams['kernel']=kernels[0] else: self.buttonapply.set_sensitive(False) self.combo_kernel.connect('changed', self.on_combo_kernel_change) self.deleteboot.set_sensitive(False) self.populate_select(self.combo_kernel, kernels ) self.set_active_in_select(self.combo_kernel, self.bootparams['kernel'] ) self.populate_select(self.combo_method, PXE_METHODS ) self.set_active_in_select(self.combo_method, self.bootparams['method'] ) self.text_cmdline.set_text(PXELINUX_CMDLINE) # populate textboxes # NOTHING self.issaved=False # end init process def CheckConfFile(self): self.isnew=False if not os.path.isfile(self.remotehost_config): print_debug ( "CheckConfFile() %s not exists" %(self.remotehost_config) ) self.isnew=True self.CreateConfFile() def CreateConfFile(self): print_debug ( "CreateConfFile()" ) # save this into file fd=file(self.remotehost_config, 'w') for item in shared.PersonalizeConfig: key=item[0] value=item[1] print_debug ("key=%s value=%s" %(key, value)) fd.write("%s=\"%s\"\n" %(key, value) ) fd.close() self.FirstRunning=True def OpenFile(self): self.CheckConfFile() conf=None conf=[] print_debug("open_file() reading data from \"%s\"..."\ %(self.remotehost_config) ) fd=file(self.remotehost_config, 'r') self.data=fd.readlines() fd.close() for line in self.data: if line != '\n': line=line.replace('\n', '') conf.append(line) print_debug ( "OpenFile() Found %d vars" %( len(conf)) ) if len(conf) <1: print_debug ( "OpenFile() FILE IS EMPTY!!!" ) return for i in range( len(conf) ): if conf[i].find("#") != 0: #print_debug ( "OpenFile() conf=" + conf[i] ) (var, value)=conf[i].split("=", 1) self.vars.append([var, value]) def GetVar(self, varname): for i in range( len(self.vars) ): if self.vars[i][0].find(varname) == 0: print_debug ( "GetVar() found, %s=%s" \ %(self.vars[i][0], self.vars[i][1]) ) return self.vars[i][1] print_debug ( "GetVar() not found, %s, returning \"\"" %(varname) ) return "" def SetVar(self, varname, value): print_debug ( "SetVar(%s)=\"%s\"" %(varname, value) ) for i in range(len(self.vars)): if varname == self.vars[i][0]: print_debug ( "changing %s value %s to \"%s\" of %s"\ %(self.vars[i][0], self.vars[i][1], value, varname) ) self.vars[i][1]="\"%s\"" %(value) def SaveToFile(self): self.issaved=True print_debug ( "SaveToFile() len(self.vars)=%d" %( len(self.vars) ) ) if len(self.vars) < 1: print_debug ( "SaveToFile() self.vars is empty" ) return try: fd=file(self.remotehost_config, 'w') except IOError: shared.error_msg( "Can't write into %s file.\n\nRun as root?" %(self.remotehost_config) ) return for i in range(len(self.vars)): fd.write("%s=%s\n" %(self.vars[i][0], self.vars[i][1])) fd.close() print_debug ( "SaveToFile() new settings SAVED!!!") return def SaveSettings(self): """ save settings """ print_debug ( "SaveSettings() INIT" ) # read combos self.SetVar("xsession", self.read_select_value(self.combo_xsession, "xsession") ) self.SetVar("xdriver", self.read_select_value(self.combo_xdriver, "xdriver") ) self.SetVar("xres", self.read_select_value(self.combo_xres, "xres") ) self.SetVar("xdepth", self.read_select_value(self.combo_xdepth, "xdepth") ) self.SetVar("xhorizsync", self.read_textbox(self.text_xhorizsync, "xhorizsync")) self.SetVar("xvertsync", self.read_textbox(self.text_xvertsync, "xvertsync") ) if self.GetVar("xhorizsync") == "\"disable\"" or self.GetVar("xvertsync") == "\"disable\"": self.SetVar("xdisablesync", "disable") else: self.SetVar("xdisablesync", "") # read checkboxes self.read_checkbox(self.ck_xmousewheel, "xmousewheel") self.read_checkbox(self.ck_xdontzap, "xdontzap") self.read_checkbox(self.ck_xdpms, "xdpms") # save to file self.SaveToFile() def populate_select(self, widget, values, set_text_column=True): valuelist = gtk.ListStore(str) for value in values: #print_debug ( "populate_select() appending %s" %([value.split('_')[0]]) ) valuelist.append( [value.split('_')[0]] ) widget.set_model(valuelist) if set_text_column: widget.set_text_column(0) model=widget.get_model() return def set_active_in_select(self, widget, default): model=widget.get_model() for i in range(len(model)): #print (model[i][0] + default) if "\"%s\"" % (model[i][0]) == default or model[i][0] == default: print_debug ("set_active_in_select(%s) default is %s, index %d"\ %(widget.name, model[i][0] , i ) ) widget.set_active(i) return print_debug ( "set_active_in_select(%s) NOT HAVE DEFAULT" %(widget.name) ) def populate_checkboxes(self, widget, value): if value == "\"1\"" or value == "1": value=1 elif value== "\"0\"" or value == "0": value=0 else: print_debug ( "populate_checkboxes() unknow value=\"%s\"" %(value) ) return checked=int(value) if checked == 1: widget.set_active(1) else: widget.set_active(0) return def populate_textboxes(self, widget, value): if value: widget.set_text(value.replace('"','') ) def read_select_value(self, widget, varname): selected=-1 try: selected=widget.get_active() except Exception, err: print_debug ( "read_select() ERROR reading %s, error=%s" %(varname, err) ) model=widget.get_model() value=model[selected][0] print_debug ( "read_select() reading %s=%s" %(varname, value) ) return value def read_checkbox(self, widget, varname): if widget.get_active() == 1: print_debug ( "read_checkbox(%s) CHECKED" %(widget.name) ) self.SetVar(varname, 1) else: print_debug ( "read_checkbox(%s) UNCHECKED" %(widget.name) ) self.SetVar(varname, 0) def read_textbox(self, widget, varname): if widget.get_text(): print_debug ( "read_textbox(%s) value=%s" %(widget.name, widget.get_text() ) ) return widget.get_text() else: print_debug ( "read_textbox(%s) can't read textbox" %(widget.name) ) return "" def on_buttongetavalaible_click(self, widget): print_debug( "on_button_getavalaible_click()" ) import tcosmonitor.TcosXauth self.xauth=tcosmonitor.TcosXauth.TcosXauth(self) import tcosmonitor.TcosConf self.config=tcosmonitor.TcosConf.TcosConf(self) import tcosmonitor.TcosXmlRpc self.xmlrpc=tcosmonitor.TcosXmlRpc.TcosXmlRpc(self) self.xmlrpc.newhost(shared.remotehost) if not self.xmlrpc.connected: shared.error_msg ( _("Host down, can't connect to tcosxmlrpc.") ) print_debug ( "on_buttongetavalaible_click() host down!!" ) return #alldrivers=self.xmlrpc.GetDevicesInfo("", "--getxdrivers").split('|')[0:-1] alldrivers=self.xmlrpc.GetDevicesInfo("", "--getxdrivers") print_debug ( "on_buttongetavalaible_click() alldrivers=%s" %(alldrivers) ) alldrivers=alldrivers.split('|')[0:-1] self.populate_select(self.combo_xdriver, shared.xdriver_values + alldrivers, set_text_column=False) shared.info_msg ( _("New %d drivers loaded from terminal.") %(len(alldrivers)) ) def on_buttonok_click(self, widget): print_debug ( "on_buttonok_click()" ) self.SaveSettings() self.quitapp() def on_combo_kernel_change(self, widget): if self.read_select_value(widget, 'kernel') != '': self.buttonapply.set_sensitive(True) def get_hexfilename(self, ip): name="" for a in ip.split('.'): hexn="%X" %int(a) if len(hexn) == 1: hexn="0%s"%hexn name="%s%s"%(name, hexn ) return os.path.join("/var/lib/tcos/tftp/pxelinux.cfg" , name ) def on_buttonapply_click(self, widget): print_debug("on_buttonapply_click()") kernel=self.read_select_value(self.combo_kernel, 'kernel') method=self.read_select_value(self.combo_method, 'method') cmdline=self.text_cmdline.get_text() try: f=open(self.bootfilename, 'w') except Exception, err: print_debug("Error opening %s, error=%s"%(self.bootfilename, err) ) return for line in PXELINUX_CFG: out=line.replace('__TCOS_KERNEL__', kernel) out=out.replace('__TCOS_METHOD__', method) out=out.replace('__TCOS_CMDLINE__', cmdline) f.write(out + '\n') f.close() self.deleteboot.set_sensitive(True) def on_deleteboot_click(self, widget): print_debug("on_deleteboot_click() ") try: os.unlink(self.bootfilename) self.deleteboot.set_sensitive(False) except Exception, err: print_debug("on_deleteboot_click() Exception deleting: %s"%err) def on_buttoncancel_click(self, widget): print_debug ( "on_buttoncancel_click()" ) if not self.issaved and self.isnew: # delete file print_debug ( "on_buttoncancel_click() deleting file" ) os.remove(self.remotehost_config) self.quitapp() def on_buttondelete_click(self, widget): print_debug ( "on_buttondelete_click()" ) # ask for delete if shared.ask_msg ( _("Really delete config of %s?") %(shared.remotehost) ): print_debug ( "on_buttondelete_click() deleting file" ) os.remove(self.remotehost_config) shared.info_msg ( _("Deleted!") ) self.quitapp() def getkernels(self): # valid kernel >= 2.6.12 # perpahps we can try to build initrd image instead of initramfs # in kernel < 2.6.12, this require a lot of work in gentcos and init scripts kernels=[] #print_debug ("getkernels() read all vmlinuz in /boot/") #for _file in os.listdir(shared.chroot + '/boot'): # FIXME need to detect chroot kernels #for _file in os.listdir('/var/lib/tcos/tftp'): for _file in glob.glob('/var/lib/tcos/tftp/vmlinuz*'): try: os.stat(_file) except Exception, err: print_debug("getkernels() link %s broken, error=%s" %(_file, err) ) continue kernel=os.path.basename(_file).replace('vmlinuz-','') print_debug("getkernels() found %s"%kernel) # split only 3 times try: (kmay, kmed, kmin) = kernel.split('.', 2) except Exception, err: print_debug("getkernels() exception spliting kernel '%s' version, %s"%(kernel, err)) continue import re pattern = re.compile ('[-_.+]') (kmin, kextra) = pattern.split(kmin, 1) # need kernel >= 2.6.12 if int(kmay)==2 and int(kmed)==6 and int(kmin)>=12: #print_debug( "getkernels() VALID kernel %s" %(kernel) ) kernels.append(kernel) else: print_debug( "getkernels() INVALID OLD kernel %s" %(kernel) ) return kernels def quitapp(self, *args): print_debug ( _("Exiting") ) gtk.main_quit() def run (self): try: gtk.main() except KeyboardInterrupt: self.quitapp() if __name__ == '__main__': #gtk.gdk.threads_init() gobject.threads_init() app = TcosPersonalize () # Run app app.run () tcosmonitor/pixmaps/0000775000000000000000000000000012260544373012015 5ustar tcosmonitor/pixmaps/tcos-icon.png0000664000000000000000000006524712260544373014437 0ustar PNG  IHDRXbKGD pHYsg tIME fr IDATxwx\6~Lo4d\6IhSv!$_ >vɦm ^1`ܻ-H#M3缿?=֫lYFn`ww @2r7tvvYWWx˖-P^/v[ZZ(D"BZVIDYEY-[7pY^upι0y饗6XbUuu`s̭HeڵMMM=xnWE}?a0*@7\;wyEEH$10 Y%`lRgglٲϗ?os%udnqFF"6lHhg1<_8p|(ɂ Xf̘uewwwwsNfÇgqMgbذa×y[{ß׭޺w]Ι^aHZZZmmmgziZ<TezqqE߲,'.]|,es&xQN!,uO=x{֭[wÇXf*P}>_lŊ^$Vux^^^ .袋byyyoZo?QQcg~wܕ/3f̸yLĉ+g͚5`&d|-r#@ؙ6Qr< գq"? B!DZԱP6ꫯ^L&-BiizEmݴiSm Ccrn  @5f١wP3_  w}?ϼ_UUyΝJ޽;iӦw"|D` -v'ٽ .6 @}ve593 uww,X(Y|{~gc ~n/y Ji3}} l/P~1sev -X(Dh:#[w_HfYf2X{}=w_E8gL ?>RWWY,HwG}d.((: Ji34!- H*R A0Bhl7o`:.poT©nD'i{uoSKjyf1[|8~*~l$zk@^13%IBIIVPPP B4 !p Q `2ICqY" ̸-vN%/!ZE)hKK] n\|g73?ק"W2y7|8M 7.[,~oY) .?Dnn7F29! -~s ( jN01Fl!q(R-4Mj4<(ncρn1}^^vjpc\֚9sT566N8wұ0ovמ={ffKظqc_|Ǔ$%N3,p #rm1$ە"K)wl+c !mb̩7 { HJV)F(I)7]5hiiɞ{ 5>B]ַv[ _~ru׍ @&O߅`0R=ߋ&c{kPe,Țan2X`b YJ;¹x5g Ә^TLF5y@) Sv"|Ng T\2[y衇oߩ?EM%s~[v.Ciiiy'Z[@*G%3o>qcT(Ͱʀhf0/T̥CᎸ qgKRc!A'5ADC-!S;KK P\3Hnկ~',K rM$s"/2!FIuāzQbb ] c=Elai vg̱ vz޸Wg+Ǝ 1{#lͷEJ#4F(H$E jP\>i^*S z -KOUUG̛B'[oos.R\\,2INUUU{1 F+_ v\éo =Xb3SPq{O#g{8[AqvD W d  xٍ㫏~n 95U+tsB8N#uHjb~R UU JWȱcDŽ~:|rcK3v!v-$ Sw3gW9ʱ } Ax$:@ $AP ]f? T)-v}x H&2>p7"׿uuCohh8$ sƍ^sXN\XXX(-=G}!P-jSc 8 qBY9=G?י9DF_%=vY =0?ըfmm^28o!,1ja>u=.+EQ… QVV͆ǎ9oJ-SL'LP駟l,))i{`n=N H\=8#[;F9ʩNӉ,+<N(4j M#9MC,yxoMPk"ΕYwGp>Y~ʕ+wzWm6477#L HšsB`2N+;@ VxݬDLe-b{uBJc+i e{ i`^PNҽZV@l#6NN͹V_RP^" .ilC:8裏nI&9An]\\l=tP\,xL]u3r?G *I*Yخ%Y\5yEzv&B*pxiɓC={y뭷kvfŋ(J':tw.m'Np@YYYꫯ$I)ӹhUlP9v0h vjgW8BN$[ Bs4U-=aROBR337Ưd8D89,\glv?El60yd\zH$bfwyEEEnG})49ux;x}6 &n #nS'=G Tba ~پ*mC>ب7?=sI$]=ՁC4U8cD$z/%aMg.o6mZ(x?Oneee3^{5+_ʨ!'NH$bqM:-[Wx<!O 1 8l-b`0`raCA,pq Adu#u?r:!`+ 0D5qmm#X$X$"[hT1rGKlڵkWƍh 6vF7RZZ9 ;@_׍2>8R!r;=<[d3pI4h*Lqu7q;J!+PkImU]7bg,&pZ 8 x [kw(Qa"c+PvDOWA 0@ $j,Fn1Xv 8-(*p x š& Q5"H8 B@AT` Tf.3fKJ` tM֭ȄjmFEك-O>mmm#yR) gZ[< Q[gF6ggљ4RF8AI62gkFa?9+8l_Kai1N1*z\=߀BzʌK|O=Qɪbx B*'E`lRRR@)=Ic,YĽ|rWGGGUGLd7V/ ՇV/X2qLTn/TR*Ո1BI6:EM0rqюq1;n z< ۓ*/mh t!|ҤQ~נB H> h4ḴdiOO\\\r:$t= &2Ԁz\wrÁJE$)nIyއ-*H7R05Q^vjk`zF)B:`G ESU׫g:MUv2AKe˖);w{ww9rNoYtid4VAAQ$&MUWW@D^T,]#NE/vqƪLi"S*Ƭki%Aʼnl c4V_+`<DZRj`EK7cWt{vU"gwP > μ"Fؿȑ#zk~Yrec=QdB_{:@ti7ZJoBo آÞTD|ĪdWqaϼBV{=xB}cpD yT3vT^ ]zB*J'C\脩XFP/Ҷ/x̛7PŵiӦH4 16wD. P1'MCit݋,\#1RXy2n+, IрIנ;k]¦=榷̅})^*J)H+O/>8BQ IiPy>Hz! CKcwD<[o} /|sϞ=>@ PSDYy`0 |5׀RT mfo ,O.,@ߠ氀RI~ \;prS82 c?CN#l_Es ɀ4BMPTSl:Dq HjcrMIt| CVX?0}?>p@CKKKi$=s 7yyy$Iٳg. ?xO']Il^pjz9F,DS -E۞#%   ᅬ84VWrӋIW#nrx+4P;Lm'QCJ Nq鉾> vGo$ wA")+5@\ HW3J`@m<qn]7(jB.j)]S$8iIB6̛힀I7i7my3k~٠)5vP+IIRTPT+f yt*R3nBdRvGTasρR*pӤFzc 7NXT+۹ Mz6 Yܙ; @ H&y3bLj[Mak6ξxj_o 7{n+ IDAT.@H* =s@ T2{[H7h(A}>B}vBt\҂ p8ěozk46|2*X2z,{89/n)jlO%Go Zg3v 4^ K؏I7ANKDl)uಔ0E\S Na%QEdy`Aqa(ee]D"5k֠eҳ>kX >?3  ?E3 *3C\PpjGP-k7`uؔ`9 ʤh@О/GƢO7-J#"CG`".,'^*f4x]$&zl5iôA|Y{seN_˗[&3ȈWƒApjGHU+_JۢmmČvO3)юر~l'/(i8iFzWbE@@ Mjޥ;Ca4RVVTnE<`ұdI*"r+ZٺN^p>D޶È\{X U% jǤc8UNfčTiV_3U + Jb304g@_mǷX2T#]o:*|'lٲO\"eggOo~y%fN|@ H9]3tmHoW 4]Hꊫ +Q왿~DtNEȖMN8{qAʼnIWU|&- $\<Wxp('A u؆3TAMt֬Y:pY,U=:kZOq"-9yz}y t!y3jʯ M"jJeh UNsd.ADcEp ^ȉ3-@OMH=U{{0 q2:o<~UUҥK~pbXQ%H$ EQb KR8r?V@Y:XA)lJsZ 栱"ZU"[PUqA`op+Bry4m1F7K,ml\t{h|kk 34M#RfcTz)A@{{f۵_}\ <Ao@' y:3c-[Ɲ(MEn%#=BWO[Q)k2(=iƁD 9eT,[lnnPr:9s_}Ub1Xd2Ob}}$v%zsi7.:d@w:*ހXypbu87>=+ p*!<=4fGj1GpΘZyղDd0OŜڲ^xaX!De5MK+T+C7o[t8 qPZ 7QԸ #a(a?gxhYMQEPlF fwԔ8OAJX*Q0 5tttT-]WE\veիW+W@$A$P%9^2[H͞cE?zMΚE(n܉¦]4sA z@e+:Jq,D)6F>@4v]/ =vrV \sxwIHD&@dY @i<1U~G }e>cb 0o`FtJ g(M$S^+8-/$=m(e#ݵ+I *sgzؾ}> %كމdrX3EQ%I uuuxH.=4dn_8ZS(aLƕ>(r/$Z0&ꕾT,>"ը1{:I^z{ ӑ"fGUW]~#XX2۵FB1*:oȖslNAng%+^l=L.,O}`r>*{R)*='Q9\afzrr : =KP[1=hS3_^Dp)ۤ (f( S"H:G/Iz0jH,a.(JKKq׿uYfZjՐ`("pA/ۄ*Ɗ񙩼<]JXjZV{/EnQ<PVj#[B`X+!_MN@1f*O;z9/P sT3f$ӟ֔E߇n/2LJm!Á .,^x7K/m -3G_׀\ ϞC {&bυKQܰ MQY6wj$;pYi_8 m TjBQTlVJg5}o~97~*R3/}kpN8@^oNP/R^!V0.YDr:e]FMf2Lҵ^;.DZ]H?"'8U!aIdi_*qbƴ#JTLd p-(j*fޡTۊZ ҍ1 \TV^ R%c&4~ϯ~+cvv{PYǍ Ð41 t7lx wUiG:聀~Ы4I`qS>ELa(xpג 6G29tt{8} #v6EQSSOl=j0̚ 9%f@Ts ϸH v/骃 œRHA*c?2$;)Q(ɾS"SG9O%|Ic?ysũY| $o w <)=RTT!}޽?Oґ e7r UBg=m"a}#k~Omv^4(Q6FS22Q4`$ Q{~`E!z$-@?twΦA> ݌=Bi2,VQx6'tw)mݺվm۶!gI d2I @TFKU ' tSц `փpO;K> )>7eb%T5Dpŀ zQ_v-Ma`G''D7pG"ȋ(OΕ+m??|rKKK CRUjA =[.׳IN=cľ_OcZ3Go3<eCT3\pwIrbQPE3t{8AW۳HG*!\/5kt566H$9f/f㣏>:BMtw;!Q @*Ax^7Մ{ $dľGo3f_/yBntG}Ԁ=E6S <'ڀ]5v*I8RGhynq2Ό|׿* MtEu]',XG^y!P |T!5s-"pF)ߙg=ZHEh=u^'I:Ϧ^$|bBǐP"mv7LpZ=ŁF{*1cxy-ݻw7 ;wڜN$!nL`6ȸaN2 * Jk3\U u0qo^W&ך ?*_+)iL*%=rAN-αV8}9W[V- Aϣ RƮ8"`7BJaҤIś6m*h2V^cJ y# "xl;=tJ$|p~nivJ Ag!v,zXP'ctB2 = D_ I"W yXRWbt[$` XZZZzvs<6c <Ν;M'Ҿ~$%z6Fǜ(44B Rh4 =@l :Hxo>l4>M3\`пAQ91:9 q  S% {&yhSxu/ҥX!h>|X6mގG}4MEaRc~O*ud,p 4LHFooͷY&jZ,wLYfrjIyi?vAzO- g׺(4HwUOr?1Ο_A,4~rڐ]/HZFQ"?p A=Pb11''xڵn<裱p8 H&#=7 dAS ̧=x Nci_ºٹa(f0rn_1w9t9Py0Hm«X|b&fcH; |n)^>R=KȻK裏)Ѩ+//o3U/7QMEVIШ@#v1L5)$4` ]_lF0 T`4*eQ?;?46ԙ$jhE*ףotra.k@ 0>|؈Gyb _T9 Fvպ&e@Bn8vХ>"iA8/_+4W-^i<6\AѺkkc;\Z2~!LZ6# ?a #ШjsϞ=G}1č8ɼ,b"7'Wi=w37Plv`@>:[*fAl y@4Ёpq݉[HO !!)ZxP9Zѹ!cyH 3$F1O?DMw:jU&Nr[YYyʕ $db6J RrJ@AP-Y ~ p Q*6 i08ݺZ0a%Ʃ"JնWp_ {DfKeROcvV>u%<X~v3(SLQjkkoɡP<ÃVͣFUUk ys H5D;T깬w| $ L*sG{ (ޤLPW;H LDD%k;rbdL`G,w [-o0EeΛ# QOh6 >,ك믿~Tfo虻qUSj V-?c&A^Nt~Fb]C#4la@ BIdEQ իlf4/ HY̞p2p98[Ω[fћD :[!Yɺz 42cAOҌ=0٤ӓ&,M[j, U\hn!ꁺ  |D}^F:0<談OWHp;yXzᓞM"#e9Į,"M#F{6nGh4Te (IccB Ilɓ5BHZWW'744X2cgG4ёS-z]LB YEyyd$#Ȅ |L&i!~[Rwڅ@ &c I(PX,6=쳪544( P($#wGV+j088SW^QDwv19$#9I$$HRx<SHy d2NH ̉,˲5MӢh$ v{$77W?>&OM)~(p@<򗿐ݻwK%QSʳf2]{沲2gnnD Y,gIdX,vI$eZn'X,f@$Ir`[$,F,iZBQoB)+ғ՝I#x<I$MN3P__B(dJ8qB}|xS]]]n%x`ki x/^lCټy38qpAZ\\l5k 9!Z͛g+-SN=d2&I>}!Lʄ!DAԻ @DQDqqiSjIJ0`kRM$!Dup\RM4JF)U CTӴDYYY2HDtΖG}VzO.ٳbŊؽޫk3{}>bŊ~hɒ%gyF;pݷ~{F3_| yRMM؞/eY,oqq'R7ok֬Y9"cillt[zٳg w}7Y` K_ V3[tK!2(#mba4Fi}}=ݰa]nݹs'4J*Ip8Byyy9s.\Xdl64ijj[& @ |E<W\{.;׶EI@mm-0am$r'bNN J^; y\۝o0&XViܒ$eL&tȂ X,&رGAee%((++u]3f`„ l@*2JUUUɤF FIEQd2&(aQլ^YOh4 /r ~A1 ` ,˲dXDUU͚̤xسgxG IDATlB֯_O;p8 QxPQQiӦ/͜9'N(PU^WƌFcT6DwwwcǪN8Qk6h$H(ryaD&zp8ܭ(>jݎ<@6n(& %IRRIx<"=`0AF ,LI\lD4a8x |vrR#N3N)ɲb᪪V +p\PggFP(H$x<7 ٳYYY]Aww7v{E l4e$ jJBcc3l6;v;:: drfi.I,˔R((DQlݺdΝ9s&,Xs碢V(;GL"`ȶl\x^F{{{ޱcǡD"{AP/E%Az5MŽ١F ?yweEQ JJJ.5s-w]vnb4C +W4WWW[f}…opڴiӦNZF'&rB`0X%Iu_$B`0LD)iW$( {_OvG"ΫzT^WWWD}l6Cc%%%ݺtf\RXrv/*** J$ uttjNןp";;ӛ@w,^xazH$Һi&^yCvv]UՉSL)S Et: DQtKdE$s`If9l6g;yKov06;ߟpz KJJ(Qƍ t~qXF|שގ`0644|XYSS YYYgyFEF;9;x 3eY.5ӝN JTY=F1l6(`0^w힜sK ؒL&_{p #=QeYQfя~D׬YӥW_ulڴI!;''Ƃo8i$X{G8is2 ۷+0K_R}#j6lذh49a9bX`0̴fE&q0ln/8r^͛7o.**Fp5KeE];8΃ԬiytYjd4-ʺjf 1#yqĒn7 Vz HݎT[0S1x|(R{W^mBFcEVV\2l6O2LF4X3FUUTUUׯw[掎)HMzٔfB![nxgO8QTb۳v{dÆ y999?r& ֢Ѩ=/~1y՟4pؐzRu[qK<%?o/9#s"_Z+00b̑$iNvvEXe R:`EACC֯_իWÄR:;_l#VP^^^'@ss󡶶aE~tj=== k֬)>}S^&%~7p BF&r'꒟n'H} HxZT[.f `O߭^B`#4H5AGw}7 7Vulv@mm-{=wVwqQe3 ,0 (( Ң&b撥fwl߬7q,3"Bͫ^ EٗtXf93s04wy>*Z r)sՔeȼP.,29E'*?*3;Gs|ϷlOEe涯<^C`D?Yy\… NOO6444BT*V{+K2{Fz?Wmu:]u~#F ݳg ,Y]h2],}A؉',++bWl;;zixՍ\E_ww}a[Ag"ׂe4N5dņX=4!m+Y)O9`w_߲e=Y,[ƿ'2SlClb@~ql[e2>QT.-"  JaKE_WKG?GoE>%ł6A\pgϞVX1$I={^um߾&ߊ+~LQJU˗ˌbi *?,* i7Y ^Fh]8@1`T15[lWY ,N𧐖ٳ'uVdd-Iy6l`ʦsDDD+--]5mذiFW>zuAg;""ܽ{r\w?/n?f̘k9tC#؊sMk{8D_M ߍ1cr@'/Uצ>Q**3m̵h7dJA:r!L`[A A(?h#?JQq8[Pwl`6g& `4vjn@h7򎲲2oϓO>_siYd8\.bȑ7vwVݴ8q1B :sM輻&/{q}xQf( ~r$N-ǯJ҈>#)oO0Nvwj6Ռ @!K $~]fќ?C1y"..Nhyx^{EEŲC>rJ棏>zO?ѣ_gUUUyg\۔)S~a'PZZW_}5yժUʇ~) ShkkéSPZZ"nBA- XoUx]6!(qUq -)W^^_MkH8qb]A9o>EEEAss3<A |wrw)_/h@@!#~Ci'RtRcƮ,ľ#.wC@0OI-~E!_`>_L|C>RYs;W8I;*aSob@`1a0GDFF2@&Ƽ:}tb.//9W9 <b$69%(RFFF:Rьe2Yi.bhll|v;e˖^ST*W_ǁ뮫sѣD[o]h H0LhH{wˮ:@y^^a]jks`S_KnmxƂh2ҏ8J[CJ<мGaא F]hÏQš Q@Wk<69(?lLD N/ _ 6~W.:#De F;?DS{ʜNgh!44F^?T.`&R&S.ewmm궶YF1eѢEv;9a„KJJ>裞μgyFغubQ<쳽>F/;y!^*7P(~!55˲_z%j"馅7@}?d "[GD"xNnM(t#8Î;H4440 (#""B^o^O$V[RuZAeYbcZ78-ygo...r7 SNzʔ)Oddd4gſ[EEE:t~رcypUV#Fq㐘a" kK Bf6& PeM~[rak@ˋ(}t2V4Xo ^V®!DE Aaאm_MsU'LPt1ѡd2YF!M BKQ|)w v;nwqss.Ųv̼hħ~J)+Vx:rٛO<;niꊊz@׮] y6h4GSRR 'N8*--ZA8.:**ĉ[:I9iK3>.1;1w{ڷ`oRDꄰkHDaLޒ PIIIdSS,<<\VVVfڵk7H_~ Dr\.oޗy8onn>r:Be몫=gϾ脳i&Muu=/ V5r޼y;RRR(**z~J=88tPLnn$d޼y wuW-ܒ*HQ,::z:;vr'Nxg+HF/]VhJ&-~mRyIh4Z6l6 ^._~XeYβl8ZSSm}}@ 4}K UV=YUUe?EU?ﺒgff /b~rrbrL67瞻,9 .aÅ~=|~oKKKjؚ* {=B I_y˲6.]z}HkkkdHHHFQat4M+ P4MA_hU8^fXr:bQg]'OIp֭jͲ+V!=XIFFƌ#C$???-++k}b>lZG>S׬ b}1L7\(a1ͥuuu-[Ï?xj2 NVˍ;TOn݈*BM$I>'N;N^WEEE)tBjy72 b0T:NV]]m(*L.jFROu\zUaaaJEQX'k` <zޓ>^.;[ZZ &\,$''_pm۶S… 5!C#f]?TT#j[^&O0a:_T*_ BBBb}󡶶V~>|>'Y=lZ-w.U6em xJKKӧOnW0L2L&&&uuutEEB&)t:Of޽[e͛hT*n1cD Ё}>(BP*J*11Q@MiZ&IIIgN~ \@nO:A,{f;YUUuzܹ|eݺu={>zGw(:|׏=˶fe%%%P߿?-++gy+]Vֽ{^j,*b޽@\\RRR> > 8m6C5e2Y}.]Zβl[bb͜~?OÇ;v$t hT*d2.KmM2,TP<ȑ#DNNoUXVRѐөQFQQQ\.o7o.x^/HAW ,˲l 8x8lhh(ydHHHfky?~|LT| 7z@\Ma0Zg͚ҥKYW_}5r֬Yv󲲲fq׼Y|Ei̭[޶o߾XMntMu&04M3BJ%$ (AL!..N!!!vyF/qm,:X|Vkkiiiz &O86l L&ūWҮFkС_.]O 222 f݈J#WV111z[SSSoRT=z}*Aq`Y_k.v@jԾi41d7iii0W%<񠪪 i& J)))2e F(d jW}_<ϣGƍo>#""0bdff"==Fj/pNQ(j S:rY,&&$XfQ&=K/ͫ x{?8lذ&Lݻw,]۷8ȰM<˲NAfsskkfH0 UUUvZ}J}&h͛jڧΝ;&5z pT_/{17߼"mۦ{'׿y󼐐,rrr̙_~,~=#h:tիWˮ~wu= @HJJFgeeҨJtFعs!ClG|1bʕ+u=lڴ)dڵ}aaaE}m64Dvv6nݺ" 8B= Š+u-_|~/yrzzz(vҥϬ]tDׯbbbR^{{޾>(*++ FӉFr.))zcƌiqy駭7ndҤI^IA$.UV$IKNڿ4M z,{5˲~Kv5kbqƈ;wum۶hmm{b4;e˖Ç/ ̘1C;w8lٲ^6oL}g~Ư|r#xΜ9uoaÆ9O&%%fvѧ%']rZVoLyذ0>9 ~N9/_vwzᨷZo1Hqmh4:tHsKRPԖDGG[~ @Jrw}_/auuuKJJ~{Wo֔o߾JRhbFT**R9_ hPv{|>o,\ևzH8q_X|}Þ>}[PPJLL t֍cYyid%$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$.W@4IENDB`tcosmonitor/setup.py0000775000000000000000000001024312260544373012051 0ustar #!/usr/bin/python # -*- coding: UTF-8 -*- # # TcosMonitor version __VERSION__ # # Copyright (c) 2006-2011 Mario Izquierdo # # This package is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # # This package is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # # This script is inspired by the debian package python-chardet import os import glob from distutils.core import setup from distutils.command.build import build from distutils.command.install_data import install_data as install_data data_files = [] import sys def get_debian_version(): f=open('debian/changelog', 'r') line=f.readline() f.close() version=line.split()[1].replace('(','').replace(')','') return version class build_locales(build): def run(self): os.system("cd po && make") # parse __VERSION__ in build_scripts for pyfile in glob.glob( "%s/*.py" %self.build_scripts): process_version(pyfile) libdir=self.build_lib + '/tcosmonitor' for pyfile in glob.glob( "%s/*.py" %libdir): process_version(pyfile) extdir=libdir+'/extensions' for pyfile in glob.glob( "%s/*.py" %extdir): process_version(pyfile) build.run(self) class tcosmonitor_install_data(install_data): def run(self): install_data.run(self) # rename scripts (delete .py extension) for pyfile in glob.glob(self.install_dir + '/bin/*.py'): new=pyfile.split('.py')[0] print(" * Renaming %s => %s" %(pyfile, new ) ) os.rename( pyfile, new ) def process_version(pyfile): version=get_debian_version() print("sed -i -e 's/__VERSION__/%s/g' %s" %(version, pyfile) ) os.system("sed -i -e 's/__VERSION__/%s/g' %s" %(version, pyfile) ) for (path, dirs, files) in os.walk("po"): if "tcosmonitor.mo" in files: target = path.replace("po", "share/locale", 1) data_files.append((target, [os.path.join(path, "tcosmonitor.mo")])) def get_files(ipath): files = [] for afile in glob.glob('%s/*'%(ipath) ): if os.path.isfile(afile): files.append(afile) return files # images (menus and buttons) data_files.append(('share/tcosmonitor/images', get_files("images") )) data_files.append(('share/pixmaps', ['images/tcos-icon-32x32.png'] )) # Interface files data_files.append(('share/tcosmonitor/ui', get_files("ui") )) # config files and Xsession.d launcher data_files.append( ('/etc/tcos', ['tcosmonitor.conf']) ) data_files.append( ('/etc/tcos', ['tcos-devices-ng.conf']) ) data_files.append( ('/etc/X11/Xsession.d', ['dbus/81tcos-utils']) ) # Desktop files data_files.append( ('share/applications/', ['tcosmonitor.desktop', 'tcospersonalize.desktop', 'tcos-volume-manager.desktop']) ) setup(name='TcosMonitor', description = 'Thin Client Manager for teachers', version=get_debian_version(), author = 'Mario Izquierdo', author_email = 'mariodebian@gmail.com', url = 'http://www.tcosproject.org', license = 'GPLv2', platforms = ['linux'], keywords = ['thin client', 'teacher monitor', 'ltsp'], packages=['tcosmonitor', 'tcosmonitor.extensions'], package_dir = {'':''}, scripts=['tcosmonitor.py', 'tcos-volume-manager.py', 'tcos-devices-ng.py', 'tcospersonalize.py', 'dbus/tcos-dbus-client.py', 'server-utils/tcos-server-utils.py'], cmdclass = {'build': build_locales, 'install_data' : tcosmonitor_install_data}, data_files=data_files ) tcosmonitor/dbus/0000775000000000000000000000000012260544373011271 5ustar tcosmonitor/dbus/81tcos-utils0000664000000000000000000000124712260544373013477 0ustar # $Id:$ # Startup script for tcos utils # if [ -f /usr/share/pyshared/tcosmonitor/shared.py ]; then DISPLAY_HOST=$(python /usr/share/pyshared/tcosmonitor/shared.py "$DISPLAY" 2>/dev/null) else DISPLAY_HOST=$(python -c 'import os; import tcosmonitor.shared; print tcosmonitor.shared.parseIPAddress(os.environ["DISPLAY"])') fi if [ ! -z "${DISPLAY_HOST}" ]; then # launch tcos-dbus-client tcos-dbus-client & # new device manager tcos-devices-ng & # volume levels tcos-volume-manager & fi if [ -e /etc/default/tcos-standalone ]; then . /etc/default/tcos-standalone if [ "${TCOS_STANDALONE_START}" = "1" ]; then tcos-dbus-client --only-local & fi fi tcosmonitor/dbus/server.py0000775000000000000000000000420312260544373013153 0ustar #!/usr/bin/env python # -*- coding: UTF-8 -*- # TcosMonitor version __VERSION__ # # Copyright (c) 2006-2011 Mario Izquierdo # # This package is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # # This package is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. import dbus import dbus.service import dbus.glib import gobject import os import signal import subprocess import pwd username = pwd.getpwuid(os.getuid())[0] print "username=%s" %(username) bus = dbus.SystemBus() #remote_object = bus.get_object("com.consoltux.TcosMonitor", "/SCPObject") #iface = dbus.Interface(remote_object, "com.consoltux.TcosMonitor.Comm") def new_message(message): print "new_message=%s" %(message) for user in message[0]: if user == username: if message[1][0] == "kill": os.kill(int(message[2][0]), signal.SIGKILL) if message[1][0] == "exec": subprocess.Popen(message[2][0], shell=True) if message[1][0] == "mess": subprocess.Popen(['zenity', '--info', '--text=' + message[2][0] + ' ', '--title="Message from admin"']) #iface.connect_to_signal('hello_signal', new_message) bus.add_signal_receiver(new_message, signal_name='GotSignal', dbus_interface='com.consoltux.TcosMonitor.Comm', path='/TCOSObject') #bus.add_signal_receiver(new_message, # 'DeviceAdded', # 'org.freedesktop.Hal.Manager', # 'org.freedesktop.Hal', # '/org/freedesktop/Hal/Manager') mainloop = gobject.MainLoop() mainloop.run() tcosmonitor/dbus/tcos-dbus-client.py0000775000000000000000000000401512260544373015025 0ustar #!/usr/bin/env python # -*- coding: UTF-8 -*- # TcosMonitor version __VERSION__ # # Copyright (c) 2006-2011 Mario Izquierdo # # This package is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # # This package is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. import os, sys import getopt #if os.path.isdir('./debian') and os.path.isdir('./po'): # sys.path.insert(0, './') from tcosmonitor import shared print "tcos-dbus-client: starting daemon..." #shared.debug=True def print_debug(txt): if shared.debug: print "%s::%s" %("TcosDBusServer()", txt) try: opts, args = getopt.getopt(sys.argv[1:], ":hd", ["help", "debug", "only-local"]) except getopt.error, msg: print msg print "for command line options use tcos-dbus-client --help" sys.exit(2) for o, a in opts: if o in ("-d", "--debug"): print "DEBUG ACTIVE" shared.debug = True if o == "--only-local": shared.allow_local_display=True host = str(shared.parseIPAddress(os.environ["DISPLAY"])) if host == "" and not shared.allow_local_display: print "tcos-dbus-client: Not allowed to run in local DISPLAY" sys.exit(0) if host != "" and shared.allow_local_display: print "tcos-dbus-client: Not allowed to run in remote DISPLAY: \"%s\"" %(host) sys.exit(0) from tcosmonitor.TcosDBus import TcosDBusServer try: server=TcosDBusServer().start() except KeyboardInterrupt: print_debug("Ctrl+C exiting...") sys.exit(0) tcosmonitor/dbus/client.py0000775000000000000000000000306312260544373013126 0ustar #!/usr/bin/python # -*- coding: UTF-8 -*- # TcosMonitor version __VERSION__ # # Copyright (c) 2006-2011 Mario Izquierdo # # This package is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # # This package is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # # Based on StudentControlPanel of Ubuntu # # import signal #import gobject #import pwd #import subprocess import dbus import dbus.service import dbus.glib class SCPObject(dbus.service.Object): def __init__(self, bus_name, object_path="/TCOSObject"): dbus.service.Object.__init__(self, bus_name, object_path) @dbus.service.signal("com.consoltux.TcosMonitor.Comm", signature="aas") def GotSignal(self, message): pass system_bus = dbus.SystemBus() name = dbus.service.BusName("com.consoltux.TcosMonitor", bus=system_bus) dbus_iface = SCPObject(name) dbus_iface.GotSignal([ ["mario"] , ["exec"] , ["xterm"] ]) dbus_iface.GotSignal([ ["mario"] , ["mess"] , ["Test message from dbus interface"] ]) tcosmonitor/dbus/Makefile0000664000000000000000000000043212260544373012730 0ustar DESTDIR:=/ all: include ../common.mk install: install -d $(DESTDIR)$(X11_CONF)/ install -d $(DESTDIR)/$(PREFIX)/bin/ install -m 644 81tcos-utils $(DESTDIR)$(X11_CONF)/ install -m 755 tcos-dbus-client.py $(DESTDIR)/$(PREFIX)/bin/tcos-dbus-client clean: rm -f *.pyc *~ tcosmonitor/tcosmonitor.conf0000664000000000000000000000113112260544373013557 0ustar # conf file of tcosmonitor # tcos-devices-ng enable or disable (values 0 or 1) tcos-devices-ng=1 # tcos-volume-manager enable or disable (values 0 or 1) tcos-volume-manager=1 # for enable exclude users, change to "tcosmonitor-exclude" # put users in group tcosmonitor-exclude and these users # will not show in tcosmonitor dont_show_users_in_group="" # Only allow to exec tcosmonitor when user is in group tcos # (values 0 disabled, 1 enabled) check_tcosmonitor_user_group=0 # Net controller (disable/enable internet) only block ports specified in Tcosmonitor->Preferences tnc_only_ports="no" tcosmonitor/man/0000775000000000000000000000000012260544373011107 5ustar tcosmonitor/man/tcos-dbus-client.10000664000000000000000000000204412260544373014350 0ustar .\"Created with GNOME Manpages Editor Wizard .\"http://gmanedit.sourceforge.net .\"Sergio Rua .\" .TH tcos-dbus-client 1 "Mar 11, 2007" "tcos-dbus-client man page" .SH NAME tcos-dbus-client \- DBUS service that allow TcosMonitor to exec or retrieve data from connected users. .SH DESCRIPTION .PP \fBtcos-dbus-client\fP is a python script that generate DBUS service used by TcosMonitor to do some jobs: * Send a message * Exec app * Read all user running process and kill by PID tcos-dbus-client use same auth that tcosxmlrpc (user and password) and is loaded in /etc/X11/Xsession.d/81tcos-dbus-client. If DISPLAY is local tcos-dbus-client don't start. .SH OPTIONS .B [no options] With no options will run a dbus service for connected user. .B --help Some usage help about tcos-dbus-client .B --debug Show verbose output when running .SH BUGS Contact Mario Izquierdo Homepage: http://www.tcosproject.org .SH SEE ALSO tcos-dbus-client(1) .SH AUTHOR Mario Izquierdo (mariodebian) tcosmonitor/man/tcospersonalize.10000664000000000000000000000152712260544373014422 0ustar .TH tcospersonalize 1 "Mar 11, 2007" "tcospersonalize man page" .SH NAME tcospersonalize \- Python GTK2 gui that allow to create single host files to configure some TCOS vars. .SH DESCRIPTION .PP \fBtcospersonalize\fP is a python GUI that allow to: * Select remote X protocol (XMDCP, Local, rDesktop, ...) * Select Xorg driver, resolution, and bitmap color. tcospersonalize is exec by root because write files into /var/lib/tcos/tftp/config .SH OPTIONS .B --host=xx.xx.xx.xx Host that will be configured (file /var/lib/tcos/tftp/config/xx.xx.xx.xx.conf ) .B --debug Show verbose output when running .B --help Some usage help about tcospersonalize .SH BUGS Contact Mario Izquierdo Homepage: http://www.tcosproject.org .SH SEE ALSO tcospersonalize(1) .SH AUTHOR Mario Izquierdo (mariodebian) tcosmonitor/man/tcosmonitor.10000664000000000000000000000147612260544373013561 0ustar .TH tcosmonitor 1 "Mar 11, 2007" "tcosmonitor man page" .SH NAME tcosmonitor \- Python GTK2 gui that allow an admin or teacher to take control of a thin client classrom. .SH DESCRIPTION .PP \fBtcosmonitor\fP is a python complete GUI with which a teacher or admin can : * Reboot / Poweroff all connected host or single one. * Lock / Unlock screens. * Take a screenshot * Send text, exec app, kill app * etc... TcosMonitor uses auth with tcosxmlrpc (user and password) .SH OPTIONS .B [no options] With no options will run in normal mode. .B --help Some usage help about tcosmonitor .B --debug Show verbose output when running .SH BUGS Contact Mario Izquierdo Homepage: http://www.tcosproject.org .SH SEE ALSO tcosmonitor(1) .SH AUTHOR Mario Izquierdo (mariodebian) tcosmonitor/man/tcos-server-utils.10000664000000000000000000000176112260544373014610 0ustar .TH tcos-server-utils 1 "Sep 24, 2007" "tcos-server-utils man page" .SH NAME tcos-server-utils \- Python script to exec some actions on connected thin clients. .SH DESCRIPTION .PP \fBtcos-server-utils\fP is a python script that generate XMLRPC events to do some jobs: * Send a message * Reboot * Poweroff * Restart Xorg tcos-server-utils use ~/.tcosconfig.conf auth and need to be configured before using it. .SH OPTIONS .B [no options] With no options show some actions. .B --help Some usage help about tcos-server-utils .B --action=foo Exec desired action ( reboot, poweroff, restartx, message, nothing ) (action nothing is a self test) .B --text="foo" If action=message this will the text displayed .B --users=user1,user2 Coma separated list of usernames to send text message .B --debug Show verbose output when running .SH BUGS Contact Mario Izquierdo Homepage: http://www.tcosproject.org .SH AUTHOR Mario Izquierdo (mariodebian) tcosmonitor/man/tcos-volume-manager.10000664000000000000000000000225112260544373015056 0ustar .TH tcos-volume-manager 1 "Mar 11, 2007" "tcos-volume-manager man page" .SH NAME tcos-volume-manager \- Python GTK2 gui that allow to change thin client sound levels. .SH DESCRIPTION .PP \fBtcos-volume-manager\fP is a python GUI exec in client session startup and allow to: * Read thin client sound card levels. * Change (mute/unmute) levels. tcos-volume-manager use xauth with tcosxmlrpc (MIT-MAGIC-COOKIE) .SH OPTIONS .B [no options] With no options will launch hidden GUI (systray) app. .B --host=xx.xx.xx.xx Overwrite DISPLAY with this var (not work unless thin client Xorg is started with \-ac) .B --debug Show verbose output when running .B --help Some usage help about tcos\-volume\-manager .SH TIPS You can create 2 files to change default behaviour of tcos-volume-manager .B ~/.tcos-volume-manager.allow.restartpulse This file show restart PulseAudio button .B ~/.tcos-volume-manager.start.restartpulse This file restart PulseAudio when tcos-volume-manager starts .SH BUGS Contact Mario Izquierdo Homepage: http://www.tcosproject.org .SH SEE ALSO tcos-volume-manager(1) .SH AUTHOR Mario Izquierdo (mariodebian) tcosmonitor/man/tcos-devices-ng.10000664000000000000000000000337012260544373014166 0ustar .TH tcos-devices-ng 1 "Jun 19, 2007" "tcos-devices-ng man page" .SH NAME tcos-devices-ng \- Python GTK2 systray app that allow to access thin client filesystems and devices easyly. .SH DESCRIPTION .PP \fBtcos-devices-ng\fP is a python systray app exec in client session startup and allow to: * Mount / umount floppy cdrom * Detect USB devices and mount automatically (udev events) * Mount / umount hard disk partitions (of the thin client) tcos-devices-ng use xauth with tcosxmlrpc (MIT-MAGIC-COOKIE) .SH OPTIONS .B [no options] With no options will launch in normal mode. .B --host=xx.xx.xx.xx Overwrite DISPLAY with this var (doesn't work unless thin client Xorg is started with \-ac) .B --debug Show verbose output when running .B --help Some usage help about tcos-devices-ng .SH OPTIONAL CONFIGURATION You can create a conf file in user home ~/.tcos\-devices\-ng.conf (for one user) or edit /etc/tcos/tcos\-devices\-ng.conf (for all users) with this content: hdc=myCdrom hdd=cdWriter hda1=winData hda2=debianData When mounting a device will search in this file an if device exists use value as mount point .B Please only use numbers and letters in mount point (not spaces). ex: for hda1 /home/USERNAME/Desktop/winData .SH DISABLE SOME DEVICES Put into ~/.tcos\-devices\-ng.conf or edit /etc/tcos/tcos\-devices\-ng.conf like this: # disable floppy disable_floppy=1 #disable all cdroms disable_cdroms=1 #disable hard disk partitions disable_hdd=1 Special disable line: # disable quit item disable_quit=1 .SH BUGS Contact Mario Izquierdo Homepage: http://www.tcosproject.org .SH SEE ALSO tcos-devices-ng(1) .SH AUTHOR Mario Izquierdo (mariodebian) tcosmonitor/INSTALL0000664000000000000000000000123212260544373011363 0ustar If you can, better use debian package if not using debian/ubuntu: Requirements: * python2.4 * python2.4 xml libs * dbus and python-dbus * libxmlrpc-c3-dev * libxmlrpc-c3 * busybox static bin placed on busybox dir (you can donwload and uncompress debian package, see busybox/Makefile for commands) # make # make install Then install your thin client arquitecture bindings: PXES # make install-pxes(VERSION) VERSION could be 1.0, 1.1, or 1.2 LTSP (installed on /opt/ltsp/ if not make a link, or move to it) # make install-ltsp TCOS # make install-tcos Regenerate init images in case of pxes or tcos. tcosmonitor/README.standalone0000664000000000000000000000276212260544373013352 0ustar ============================================ README for TCOS Standalone mode ============================================ 1.- Security If you activate standalone mode you will expose 8998 port to anybody, if your network is untrusted please block all uncomming connections to these ports, (with iptables for example) For example if your server (when tcosmonitor gui runs) is 192.168.0.254: iptables -A INPUT -p tcp -s 192.168.0.254 --destination-port 8998 --syn -j ACCEPT iptables -A INPUT -p tcp -s 0/0 -d 0/0 --destination-port 8998 --syn -j DROP You can add this rules to your firewall or put into /etc/rc.local 2.- Configure user and password It's posible to work with standard *nix auth but for better security it's recomended to use a standalone autentication. In standalone host make this: # update-tcospasswd Arquitecture to update password: * TCOS * STANDALONE : STANDALONE Username (usually root): root TCOS Password: I will write this file: /etc/tcospasswd Continue? [Y/n] Y In TcosMonitor you will need to put same user and password than here. 3.- Activate Change TCOS_STANDALONE_START=1 4.- Search for hosts. In TcosMonitor you need to configure discover method with ping (netstat don't work) You can make a small trick to get a standalone host with netstat: #!/bin/sh while [ 1 ]; do telnet SERVER_IP 6000 done Put this script at user session start. tcosmonitor/tcospersonalize.desktop0000664000000000000000000000064612260544373015161 0ustar [Desktop Entry] Version=1.0 Name=TcosPersonalize Name[en_GB]=TcosPersonalize Name[es]=TcosPersonalize Comment=Configure a simple TCOS thin client Comment[en_GB]=Configure a simple TCOS thin client Comment[es]=Configurar un terminal TCOS Exec=/usr/bin/tcospersonalize $@ Terminal=false Type=Application Icon=/usr/share/pixmaps/tcos-icon-32x32.png GenericName[es_ES]=TcosPersonalize NoDisplay=true NotShowIn=GNOME,KDE,XFCE; tcosmonitor/AUTHORS0000664000000000000000000000054112260544373011404 0ustar Mario Izquierdo (mariodebian) http://www.consoltux.com http://soleup.eup.uva.es/mariodebian CONTRIBUTIONS: * Patches of video broadcast or send files vidal_joshur at gva.es * Fix some english typos and translations Andrés Jimenez * Remove wrong copyright lines Quirón tcosmonitor/tcos-devices-ng.conf0000664000000000000000000000106712260544373014201 0ustar # here you can disable some tcos-devices-ng parts # to all users # # this settings are more important than ~/.tcos-devices-ng.py # # disable floppy #disable_floppy=1 #disable all cdroms #disable_cdroms=1 #disable hard disk partitions #disable_hdd=1 # disable quit item #disable_quit=1 # can change mount point too # # DON'T use spaces or any other char (only letters and numbers) # #hdc=myCdReader #hdd=cdWriter #hda1=winData #hda2=debianData # enable reboot and poweroff enable_reboot_poweroff=1 # Timeout to reboot or poweroff #reboot_poweroff_timeout=10 tcosmonitor/.gitignore0000664000000000000000000000001212260544542012313 0ustar *.pyc *.~ tcosmonitor/tcos-volume-manager.py0000775000000000000000000003453112260544542014602 0ustar #!/usr/bin/env python # -*- coding: UTF-8 -*- # # TcosMonitor version __VERSION__ # # Copyright (c) 2006-2011 Mario Izquierdo # # This package is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # # This package is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. import os, sys import gobject import getopt from gettext import gettext as _ import pygtk pygtk.require('2.0') import gtk from tcosmonitor import shared # load conf file and exit if not active if not shared.test_start("tcos-volume-manager") : print >> sys.stderr, "tcos-volume-manager disabled at %s" % (shared.module_conf_file) #print("tcos-volume-manager disabled at %s" % (shared.module_conf_file), file=sys.stderr) sys.exit(1) import pwd def print_debug(txt): if shared.debug: print >> sys.stderr, "%s::%s" % ("tcos-volume-manager", txt) #print("%s::%s" % ("tcos-volume-manager", txt), file=sys.stderr) def get_username(): return pwd.getpwuid(os.getuid())[0] def usage(): print ("tcos-volume-manager help:") print ("") print (" tcos-volume-manager [--host=XXX.XXX.XXX.XXX] ") print (" (force host to connect to change volumes, default is DISPLAY)") print (" tcos-volume-manager -d [--debug] (write debug data to stdout)") print (" tcos-volume-manager -h [--help] (this help)") try: opts, args = getopt.getopt(sys.argv[1:], ":hd", ["help", "debug", "host="]) except getopt.error, msg: print (msg) print ("for command line options use tcosconfig --help") sys.exit(2) shared.remotehost=str(shared.parseIPAddress(os.environ["DISPLAY"])) # process options for o, a in opts: if o in ("-d", "--debug"): print ("DEBUG ACTIVE") shared.debug = True if o == "--host": shared.remotehost = str(shared.parseIPAddress(a)) if o in ("-h", "--help"): usage() sys.exit() if shared.remotehost == "": print ("tcos-volume-manager: Not allowed to run in local DISPLAY") #shared.error_msg ( _("tcos-volume-manager isn't allowed to run in local DISPLAY\nForce with --host=xx.xx.xx.xx") ) sys.exit(0) class TcosVolumeManager: def __init__(self, host): self.host=host self.name="TcosVolumeManager" self.visible=False if hasattr(gtk, 'status_icon_new_from_file'): # use gtk.status_icon icon = gtk.status_icon_new_from_file(shared.IMG_DIR + "tcos-volume-32x32.png") icon.set_tooltip( _("Tcos Sound levels on:\n%s") %(self.host) ) icon.connect("activate", self.on_tray_icon_press_event) else: shared.error_msg( _("ERROR: No tray icon support") ) sys.exit(1) from tcosmonitor.ping import PingPort if PingPort(self.host, shared.xmlremote_port, 0.5).get_status() != "OPEN": shared.error_msg( _("ERROR: It appears that TcosXmlRpc is not running on %s.") %(self.host) ) sys.exit(1) import tcosmonitor.TcosXauth self.xauth=tcosmonitor.TcosXauth.TcosXauth(self) self.xauth.init_standalone() # get all channels import tcosmonitor.TcosXmlRpc import tcosmonitor.TcosConf self.config=tcosmonitor.TcosConf.TcosConf(self, openfile=False) self.xmlrpc=tcosmonitor.TcosXmlRpc.TcosXmlRpc(self) nossl=True # make a test and exit if no cookie match if not self.xauth.test_auth(nossl): print ("tcos-volume-manager: ERROR: Xauth cookie don't match") #sys.exit(1) self.xmlrpc.newhost(self.host,nossl) if not self.xmlrpc.connected: shared.error_msg( _("Error connecting with TcosXmlRpc in %s.") %(self.host) ) sys.exit(1) # check for enabled sound have_sound=self.xmlrpc.IsEnabled("TCOS_SOUND") if not have_sound: print ("tcos-volume-manager: TCOS_SOUND is disabled") sys.exit(0) self.allchannels=self.xmlrpc.GetSoundChannelsContents() print_debug ("__init__() %s" %( self.allchannels ) ) self.ui = gtk.Builder() self.ui.set_translation_domain(shared.PACKAGE) # Widgets self.ui.add_from_file(shared.GLADE_DIR + 'tcos-volume-manager.ui') self.mainwindow = self.ui.get_object('mainwindow') # close windows signals #self.mainwindow.connect('destroy', self.quitapp ) self.mainwindow.connect('delete-event', self.mainwindow_close ) self.mainlabel=self.ui.get_object('mainlabel') self.scrolledwindow=self.ui.get_object('scrolledwindow') self.scrolledwindow2=self.ui.get_object('scrolledwindow2') self.quitbutton=self.ui.get_object('quitbutton') self.quitbutton.connect('clicked', self.quitapp ) self.statusbar=self.ui.get_object('statusbar') self.refreshbutton=self.ui.get_object('refreshbutton') self.refreshbutton.connect('clicked', self.on_refresh_button ) self.restartbutton=self.ui.get_object('restartbutton') self.restartbutton.connect('clicked', self.on_restart_button ) # only show if we found this file in $HOME dir allowfile=os.path.expanduser("~/.tcos-volume-manager.allow.restartpulse") if os.path.isfile(allowfile): self.restartbutton.show() # restart on start restartfile=os.path.expanduser("~/.tcos-volume-manager.start.restartpulse") if os.path.isfile(restartfile): self.xmlrpc.RestartSoundDaemon() # FIXME try to not focus on quitbutton self.refreshbutton.grab_focus() self.get_channel_info() def on_refresh_button(self, widget): self.allchannels=self.xmlrpc.GetSoundChannelsContents() self.scrolledwindow.foreach( self.delete_child, self.scrolledwindow ) self.scrolledwindow2.foreach( self.delete_child, self.scrolledwindow2 ) self.get_channel_info() def on_restart_button(self, widget): self.xmlrpc.RestartSoundDaemon() self.on_refresh_button(None) def delete_child(self, widget, scrolled): scrolled.remove(widget) def get_channel_info(self): # retry cookie auth nossl=True self.xauth.test_auth(nossl) primary_channels=[] secondary_channels=[] if self.allchannels != None and len(self.allchannels) > 0: gobject.timeout_add( 50, self.write_into_statusbar, _("Loading channels info...") ) for channel in self.allchannels: #if not channel in shared.sound_only_channels: if not channel['name'] in shared.sound_only_channels: secondary_channels.append(channel) continue primary_channels.append(channel) gobject.timeout_add( 500, self.populate_mixer, primary_channels, self.scrolledwindow) gobject.timeout_add( 1500, self.populate_mixer, secondary_channels, self.scrolledwindow2) #gobject.timeout_add( 4000, self.write_into_statusbar, _("Ready") ) else: print_debug ( "ERROR: No auth" ) gobject.timeout_add( 2000, self.write_into_statusbar, _("Error loading channels info (xauth error)") ) self.mainwindow.set_icon_from_file(shared.IMG_DIR + 'tcos-icon-32x32.png') self.mainwindow.set_title( _("Tcos Volume Manager") ) self.mainlabel.set_markup( _("Sound mixer of %s host") %(self.host) ) #self.mainwindow.show() #self.populate_mixer(primary_channels, self.scrolledwindow) #self.populate_mixer(secondary_channels, self.scrolledwindow2) def populate_mixer(self, all_channels, scrollwindow): box1 = gtk.HBox(False, 0) box1.set_border_width(0) box1.show() scrollwindow.add_with_viewport(box1) for channel in all_channels: #frame = gtk.Frame(channel) frame = gtk.Frame(channel['name']) #frame.show() box2 = gtk.VBox(True, 0) box2.set_border_width(0) ########################################################### #value=self.xmlrpc.GetSoundInfo(channel, mode="--getlevel") #value=value.replace('%','') value=channel['level'] try: value=float(value) except Exception, err: print_debug("Exception, can't get float value, error=%s"%err) value=0.0 ctype=channel['type'] #ismute=self.xmlrpc.GetSoundInfo(channel, mode="--getmute") ismute=channel['mute'] if ismute == "off": ismute = True else: ismute = False #print_debug ( "populate_mixer() channel=%s ismute=%s volume level=%s" %(channel, ismute, value) ) print_debug ( "populate_mixer() channel=%s ismute=%s volume level=%s ctype=%s" %(channel['name'], ismute, value, ctype) ) ############################################################# adjustment = gtk.Adjustment(value=0, lower=0, upper=100, step_incr=1, page_incr=1) volume_slider = None volume_slider = gtk.VScale(adjustment) volume_slider.set_digits(0) volume_slider.set_inverted(True) volume_slider.set_size_request(30, 100) volume_slider.set_value_pos(gtk.POS_TOP) volume_slider.set_value( value ) #volume_slider.connect("button_release_event", self.slider_value_changed, adjustment, channel, self.host) #volume_slider.connect("scroll_event", self.slider_value_changed, adjustment, channel, self.host) volume_slider.connect("button_release_event", self.slider_value_changed, adjustment, channel['name'], self.host) volume_slider.connect("scroll_event", self.slider_value_changed, adjustment, channel['name'], self.host) if "volume" in ctype: volume_slider.show() else: volume_slider.hide() box2.pack_start(volume_slider, False, True, 0) volume_checkbox=gtk.CheckButton(label=_("Mute"), use_underline=True) volume_checkbox.set_active(ismute) #volume_checkbox.connect("toggled", self.checkbox_value_changed, channel, self.host) volume_checkbox.connect("toggled", self.checkbox_value_changed, channel['name'], self.host) if "switch" in ctype: volume_checkbox.show() else: volume_checkbox.hide() box2.pack_start(volume_checkbox, False, True, 0) box2.show() frame.add(box2) frame.show() box1.pack_start(frame, True, True, 0) # write in statusbar if populating primary controls if scrollwindow == self.scrolledwindow: self.write_into_statusbar( _("Main controls ready") ) # write in statusbar if populating secondary controls if scrollwindow == self.scrolledwindow2: self.write_into_statusbar( _("All remote controls loaded.") ) return False def slider_value_changed(self, widget, event, adj, channel, ip): value=widget.get_value() print_debug ( "slider_value_changed() ip=%s channel=%s value=%s" %(ip, channel, value) ) self.write_into_statusbar( \ _("Changing value of %(channel)s channel, to %(value)s%%..." )\ %{"channel":channel, "value":value} ) tmp=self.xmlrpc.SetSound(ip, channel, str(value)+"%") newvalue="%2d%%"%int(tmp['level']) self.write_into_statusbar( \ _("Changed value of %(channel)s channel, to %(value)s" ) \ %{"channel":channel, "value":newvalue} ) def checkbox_value_changed(self, widget, channel, ip): value=widget.get_active() if not value: value="off" self.write_into_statusbar( _("Unmuting %s channel..." ) %(channel) ) tmp=self.xmlrpc.SetSound(ip, channel, value="", mode="--setunmute") newvalue=tmp['mute'] else: value="on" self.write_into_statusbar( _("Muting %s channel..." ) %(channel) ) tmp=self.xmlrpc.SetSound(ip, channel, value="", mode="--setmute") newvalue=tmp['mute'] self.write_into_statusbar( _("Status of %(channel)s channel, is \"%(newvalue)s\"" )\ %{"channel":channel, "newvalue":newvalue} ) def write_into_statusbar(self, msg, *args): context_id=self.statusbar.get_context_id("status") self.statusbar.pop(context_id) self.statusbar.push(context_id, msg) return False def on_tray_icon_press_event(self, *args): if self.visible: self.mainwindow.hide() else: self.mainwindow.show() self.visible = not self.visible return def mainwindow_close(self, widget, event): print_debug ( "mainwindow_close() closing mainwindow to systray" ) self.visible=False self.mainwindow.hide() return True def quitapp(self, *args): print_debug ( _("Exiting") ) self.mainloop.quit() def run (self): self.mainloop = gobject.MainLoop() try: self.mainloop.run() except KeyboardInterrupt: # Ctrl+C Event self.quitapp() if __name__ == "__main__": app=TcosVolumeManager(shared.remotehost) app.run() tcosmonitor/pylint.rc0000664000000000000000000002232412260544373012204 0ustar # lint Python modules using external checkers. # # This is the main checker controling the other ones and the reports # generation. It is itself both a raw checker and an astng checker in order # to: # * handle message activation / deactivation at the module level # * handle some basic but necessary stats'data (number of classes, methods...) # [MASTER] # Specify a configuration file. #rcfile= # Python code to execute, usually for sys.path manipulation such as # pygtk.require(). #init-hook= # Profiled execution. profile=no # Add to the black list. It should be a base name, not a # path. You may set this option multiple times. ignore=CVS # Pickle collected data for later comparisons. persistent=yes # Set the cache size for astng objects. cache-size=500 # List of plugins (as comma separated values of python modules names) to load, # usually to register additional checkers. load-plugins= [MESSAGES CONTROL] # Enable only checker(s) with the given id(s). This option conflicts with the # disable-checker option #enable-checker= # Enable all checker(s) except those with the given id(s). This option # conflicts with the enable-checker option #disable-checker= # Enable all messages in the listed categories. #enable-msg-cat= # Disable all messages in the listed categories. #disable-msg-cat= # Enable the message(s) with the given id(s). #enable-msg= # Disable the message(s) with the given id(s). disable-msg=C0322,C0111,C0103,C0301,W0703,W0613,W0612,W0201,R0201,W0622,R0902,R0913,R0904 #C0301,C0302 #W0703: Catch "Exception" #W0613:Unused argument 'data' #W0612: Unused variable 'spass' #W0201:Attribute 'ask_mode' defined outside __init__ #R0201:Method could be a function #W0622:Redefining built-in 'iter' #R0902:Too many instance attributes #R0913:Too many arguments #R0904:Too many public methods [REPORTS] # set the output format. Available formats are text, parseable, colorized, msvs # (visual studio) and html output-format=colorized # Include message's id in output include-ids=yes # Put messages in a separate file for each module / package specified on the # command line instead of printing them on stdout. Reports (if any) will be # written in a file name "pylint_global.[txt|html]". files-output=no # Tells wether to display a full report or only the messages reports=yes # Python expression which should return a note less than 10 (10 is the highest # note).You have access to the variables errors warning, statement which # respectivly contain the number of errors / warnings messages and the total # number of statements analyzed. This is used by the global evaluation report # (R0004). evaluation=10.0 - ((float(5 * error + warning + refactor + convention) / statement) * 10) # Add a comment according to your evaluation note. This is used by the global # evaluation report (R0004). comment=yes # Enable the report(s) with the given id(s). #enable-report= # Disable the report(s) with the given id(s). #disable-report= # checks for : # * doc strings # * modules / classes / functions / methods / arguments / variables name # * number of arguments, local variables, branchs, returns and statements in # functions, methods # * required module attributes # * dangerous default values as arguments # * redefinition of function / method / class # * uses of the global statement # [BASIC] # Required attributes for module, separated by a comma required-attributes= # Regular expression which should only match functions or classes name which do # not require a docstring no-docstring-rgx=__.*__ # Regular expression which should only match correct module names module-rgx=(([a-z_][a-z0-9_]*)|([A-Z][a-zA-Z0-9]+))$ # Regular expression which should only match correct module level names const-rgx=(([A-Z_][A-Z1-9_]*)|(__.*__))$ # Regular expression which should only match correct class names class-rgx=[A-Z_][a-zA-Z0-9]+$ # Regular expression which should only match correct function names function-rgx=[a-z_][a-z0-9_]{2,30}$ # Regular expression which should only match correct method names method-rgx=[a-z_][a-z0-9_]{2,30}$ # Regular expression which should only match correct instance attribute names attr-rgx=[a-z_][a-z0-9_]{2,30}$ # Regular expression which should only match correct argument names argument-rgx=[a-z_][a-z0-9_]{2,30}$ # Regular expression which should only match correct variable names variable-rgx=[a-z_][a-z0-9_]{2,30}$ # Regular expression which should only match correct list comprehension / # generator expression variable names inlinevar-rgx=[A-Za-z_][A-Za-z0-9_]*$ # Good variable names which should always be accepted, separated by a comma good-names=i,j,k,ex,Run,_ # Bad variable names which should always be refused, separated by a comma bad-names=foo,bar,baz,toto,tutu,tata # List of builtins function names that should not be used, separated by a comma bad-functions=map,filter,apply,input # try to find bugs in the code using type inference # [TYPECHECK] # Tells wether missing members accessed in mixin class should be ignored. A # mixin class is detected if its name ends with "mixin" (case insensitive). ignore-mixin-members=yes # List of classes names for which member attributes should not be checked # (useful for classes with attributes dynamicaly set). ignored-classes=SQLObject # When zope mode is activated, consider the acquired-members option to ignore # access to some undefined attributes. zope=no # List of members which are usually get through zope's acquisition mecanism and # so shouldn't trigger E0201 when accessed (need zope=yes to be considered). acquired-members=REQUEST,acl_users,aq_parent # checks for # * unused variables / imports # * undefined variables # * redefinition of variable from builtins or from an outer scope # * use of variable before assigment # [VARIABLES] # Tells wether we should check for unused import in __init__ files. init-import=yes # A regular expression matching names used for dummy variables (i.e. not used). dummy-variables-rgx=_|dummy # List of additional names supposed to be defined in builtins. Remember that # you should avoid to define new builtins when possible. additional-builtins= # checks for : # * methods without self as first argument # * overridden methods signature # * access only to existant members via self # * attributes not defined in the __init__ method # * supported interfaces implementation # * unreachable code # [CLASSES] # List of interface methods to ignore, separated by a comma. This is used for # instance to not check methods defines in Zope's Interface base class. ignore-iface-methods=isImplementedBy,deferred,extends,names,namesAndDescriptions,queryDescriptionFor,getBases,getDescriptionFor,getDoc,getName,getTaggedValue,getTaggedValueTags,isEqualOrExtendedBy,setTaggedValue,isImplementedByInstancesOf,adaptWith,is_implemented_by # List of method names used to declare (i.e. assign) instance attributes. defining-attr-methods=__init__,__new__,setUp # checks for # * external modules dependencies # * relative / wildcard imports # * cyclic imports # * uses of deprecated modules # [IMPORTS] # Deprecated modules which should not be used, separated by a comma deprecated-modules=regsub,string,TERMIOS,Bastion,rexec # Create a graph of every (i.e. internal and external) dependencies in the # given file (report R0402 must not be disabled) import-graph= # Create a graph of external dependencies in the given file (report R0402 must # not be disabled) ext-import-graph= # Create a graph of internal dependencies in the given file (report R0402 must # not be disabled) int-import-graph= # checks for sign of poor/misdesign: # * number of methods, attributes, local variables... # * size, complexity of functions, methods # [DESIGN] # Maximum number of arguments for function / method max-args=5 # Maximum number of locals for function / method body max-locals=30 # Maximum number of return / yield for function / method body max-returns=6 # Maximum number of branch for function / method body max-branchs=12 # Maximum number of statements in function / method body max-statements=100 # Maximum number of parents for a class (see R0901). max-parents=7 # Maximum number of attributes for a class (see R0902). max-attributes=7 # Minimum number of public methods for a class (see R0903). min-public-methods=2 # Maximum number of public methods for a class (see R0904). max-public-methods=20 # checks for : # * unauthorized constructions # * strict indentation # * line length # * use of <> instead of != # [FORMAT] # Maximum number of characters on a single line. max-line-length=120 # Maximum number of lines in a module max-module-lines=1000 # String used as indentation unit. This is usually " " (4 spaces) or "\t" (1 # tab). indent-string=' ' # checks for: # * warning notes in the code like FIXME, XXX # * PEP 263: source code with non ascii character but no encoding declaration # [MISCELLANEOUS] # List of note tags to take in consideration, separated by a comma. notes=FIXME,XXX,TODO # checks for similarities and duplicated code. This computation may be # memory / CPU intensive, so you should disable it if you experiments some # problems. # [SIMILARITIES] # Minimum lines number of a similarity. min-similarity-lines=4 # Ignore comments when computing similarities. ignore-comments=yes # Ignore docstrings when computing similarities. ignore-docstrings=yes tcosmonitor/po/0000775000000000000000000000000012260544373010752 5ustar tcosmonitor/po/ca.po0000664000000000000000000023752012260544373011706 0ustar # Catalan translations for tcosmonitor package # Traducció a català dels missatges del paquet tcosmonitor # Copyright (C) 2007 Carles Sadurní Anguita # This file is distributed under the same license as the PACKAGE package. # Carles Sadurní Anguita , 2007. # # msgid "" msgstr "" "Project-Id-Version: tcosmonitor 0.0.1\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-03-18 15:48+0100\n" "PO-Revision-Date: 2008-06-03 08:58+0200\n" "Last-Translator: Carles Sadurní Anguita \n" "Language-Team: catalan\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../tcosmonitor.py:129 #, fuzzy, python-format msgid "" "The user \"%s\" must be member of the group \"tcos\" to exec tcosmonitor.\n" "\n" "If you are system administrator, add your user to tcos group." msgstr "" "L'usuari \"%s\" ha de ser membre del grup \"tcos\".\n" "\n" "Si sou administrador/a, afegiu l'usuari al grup tcos." #: ../tcosmonitor.py:247 msgid "Send files disabled. rsync not configured." msgstr "" #: ../tcosmonitor.py:329 ../tcospersonalize.py:562 #: ../tcos-volume-manager.py:378 msgid "Exiting" msgstr "Eixint" #: ../tcos-devices-ng.py:188 #, python-format msgid "Rebooting in %s seconds" msgstr "Reinici en %s segons" #: ../tcos-devices-ng.py:190 #, python-format msgid "Shutting down in %s seconds" msgstr "Apagada en %s segons" #: ../tcos-devices-ng.py:206 ../tcos-devices-ng.py:209 #, python-format msgid "" "ERROR during action %(action)s:\n" "%(errortxt)s" msgstr "" #: ../tcos-devices-ng.py:239 msgid "Tcos device daemon" msgstr "" #: ../tcos-devices-ng.py:283 ../tcos-volume-manager.py:143 #, python-format msgid "Error connecting with TcosXmlRpc in %s." msgstr "Error en intentar connectar amb TcosXmlRpc en %s." #: ../tcos-devices-ng.py:314 #, python-format msgid "Cdrom device %s" msgstr "Dispositiu de CDROM %s" #: ../tcos-devices-ng.py:317 msgid "Mount Cdrom" msgstr "Munta CDROM" #: ../tcos-devices-ng.py:318 msgid "Umount Cdrom" msgstr "Desmunta CDROM" #: ../tcos-devices-ng.py:340 #, python-format msgid "Disk partition %s" msgstr "Partició %s" #: ../tcos-devices-ng.py:343 msgid "Mount disk partition" msgstr "Munta la partició de disc" #: ../tcos-devices-ng.py:344 msgid "Umount disk partition" msgstr "Desmunta la partició de disc" #: ../tcos-devices-ng.py:356 msgid "No floppy detected" msgstr "No s'ha detectat el disquet" #: ../tcos-devices-ng.py:368 ../tcos-devices-ng.py:674 #: ../tcos-devices-ng.py:680 ../tcos-devices-ng.py:686 msgid "Floppy" msgstr "Disquet" #: ../tcos-devices-ng.py:371 msgid "Mount Floppy" msgstr "Munta el disquet" #: ../tcos-devices-ng.py:372 msgid "Umount Floppy" msgstr "Desmunta el disquet" #: ../tcos-devices-ng.py:382 msgid "Floppy mounted. Ready for use." msgstr "Disquet muntat. Preparat." #: ../tcos-devices-ng.py:384 msgid "Floppy umounted. You can extract it." msgstr "Disquet desmuntat. Podeu extraure'l" #: ../tcos-devices-ng.py:400 msgid "Hard disk partition mounted. Ready for use." msgstr "Partició de disc muntada. Preparada." #: ../tcos-devices-ng.py:403 msgid "Hard disk partition umounted." msgstr "Partició de disc desmuntada" #: ../tcos-devices-ng.py:425 msgid "Audio cdrom mounted., you can listen music opening wav files." msgstr "El CD d'audio està muntat, podeu sentir música obrint els fitxers wav." #: ../tcos-devices-ng.py:427 msgid "Cdrom mounted. Ready for use." msgstr "CDROM muntat. Preparat." #: ../tcos-devices-ng.py:430 msgid "Cdrom umounted. You can extract it." msgstr "CDROM desmuntat. Podeu extraure'l." #: ../tcos-devices-ng.py:529 #, python-format msgid "" "Mounting device %s\n" "Please wait..." msgstr "" "Desmuntant el dispositiu %s.\n" "Per favor, espereu..." #: ../tcos-devices-ng.py:578 msgid "Error mounting LTSPFS, check versions of LTSPFS packages" msgstr "" "Error durant el muntatge de LTSPFS, comproveu les versions dels paquets " "LTSPFS" #: ../tcos-devices-ng.py:604 #, python-format msgid "" "Umounting device %s.\n" "Please wait..." msgstr "" "Desmuntant el dispositiu %s.\n" "Per favor, espereu..." #: ../tcos-devices-ng.py:651 msgid "usbdisk" msgstr "Disc USB" #: ../tcos-devices-ng.py:653 msgid "firewiredisk" msgstr "disc firewire" #: ../tcos-devices-ng.py:678 msgid "Can't mount floppy" msgstr "No ha estat possible muntar el disquet" #: ../tcos-devices-ng.py:689 msgid "Can't umount floppy" msgstr "No ha estat possible desmuntar el disquet" #: ../tcos-devices-ng.py:702 ../tcos-devices-ng.py:712 #: ../tcos-devices-ng.py:723 ../tcos-devices-ng.py:836 #: ../tcos-devices-ng.py:848 ../tcos-devices-ng.py:867 #: ../tcos-devices-ng.py:879 ../tcos-devices-ng.py:911 #, python-format msgid "Cdrom_%s" msgstr "Cdrom_%s" #: ../tcos-devices-ng.py:710 msgid "Can't mount cdrom" msgstr "No ha esta possible muntar el CDROM" #: ../tcos-devices-ng.py:726 msgid "Can't umount cdrom" msgstr "No ha estat possible desmuntar el CDROM" #: ../tcos-devices-ng.py:742 ../tcos-devices-ng.py:752 #: ../tcos-devices-ng.py:763 #, python-format msgid "Disk_%s" msgstr "Disc_%s" #: ../tcos-devices-ng.py:750 msgid "Can't mount hard disk partition" msgstr "No ha estat possible muntar la partició del disc" #: ../tcos-devices-ng.py:766 msgid "Can't umount hard disk partition" msgstr "No ha estat possible desmuntar la partició del disc" #: ../tcos-devices-ng.py:807 #, python-format msgid "" "From terminal %(host)s.\n" "Connected CDROM USB device %(device)s\n" "%(vendor)s %(model)s" msgstr "" #: ../tcos-devices-ng.py:811 #, python-format msgid "CDROM USB device %s" msgstr "Dispositiu CDROM USB %s" #: ../tcos-devices-ng.py:814 #, python-format msgid "Mount CDROM USB device %s" msgstr "Munta el dispositiu CDROM USB %s" #: ../tcos-devices-ng.py:815 #, python-format msgid "Umount CDROM USB device %s" msgstr "Desmunta el dispositiu CDROM USB %s" #: ../tcos-devices-ng.py:840 ../tcos-devices-ng.py:871 #: ../tcos-devices-ng.py:1001 ../tcos-devices-ng.py:1012 #: ../tcos-devices-ng.py:1058 ../tcos-devices-ng.py:1138 #: ../tcos-devices-ng.py:1149 ../tcos-devices-ng.py:1195 #, python-format msgid "Error, can't mount device %s" msgstr "Error: ha estat impossible muntar %s" #: ../tcos-devices-ng.py:898 #, python-format msgid "" "From terminal %(host)s.\n" "Disconnected CDROM USB device %(device)s\n" "%(vendor)s %(model)s" msgstr "" #: ../tcos-devices-ng.py:926 #, python-format msgid "Can't umount cdrom usb %s" msgstr "No ha estat possible desmuntar el cdrom usb %s" #: ../tcos-devices-ng.py:951 #, python-format msgid "" "From terminal %(host)s.\n" "Connected USB device %(device)s\n" "%(vendor)s %(model)s" msgstr "" #: ../tcos-devices-ng.py:954 #, python-format msgid "" "From terminal %(host)s.\n" "Disconnected USB device %(device)s\n" "%(vendor)s %(model)s" msgstr "" #: ../tcos-devices-ng.py:982 #, python-format msgid "USB device %s" msgstr "Dispositiu USB %s" #: ../tcos-devices-ng.py:985 #, python-format msgid "Mount USB device %s" msgstr "Munta el dispositiu USB %s" #: ../tcos-devices-ng.py:986 #, python-format msgid "Umount USB device %s" msgstr "Desmunta el dispositiu USB %s" #: ../tcos-devices-ng.py:1088 #, python-format msgid "" "From terminal %(host)s.\n" "Connected Firewire device %(device)s\n" "%(vendor)s %(model)s" msgstr "" #: ../tcos-devices-ng.py:1091 #, python-format msgid "" "From terminal %(host)s.\n" "Disconnected Firewire device %(device)s\n" "%(vendor)s %(model)s" msgstr "" #: ../tcos-devices-ng.py:1119 #, python-format msgid "Firewire device %s" msgstr "Dispositiu firewire %s" #: ../tcos-devices-ng.py:1122 #, python-format msgid "Mount Firewire device %s" msgstr "Munta el dispositiu firewire %s" #: ../tcos-devices-ng.py:1123 #, python-format msgid "Umount Firewire device %s" msgstr "Desmunta el dispositiu firewire %s" #: ../tcos-devices-ng.py:1206 #, python-format msgid "CDROM USB device %s umounted. You can extract it." msgstr "El dispositiu CDROM USB %s està desmuntat. Podeu extraure'l." #: ../tcos-devices-ng.py:1209 #, python-format msgid "CDROM USB device %s mounted. Ready for use." msgstr "El dispositiu CDROM USB %s està muntat. Preparat." #: ../tcos-devices-ng.py:1247 #, python-format msgid "USB device %s umounted. You can extract it." msgstr "El dispositiu USB %s està desmuntat. Podeu extraure'l." #: ../tcos-devices-ng.py:1250 #, python-format msgid "USB device %s mounted. Ready for use." msgstr "El dispositiu USB %s està muntat. Preparat." #: ../tcos-devices-ng.py:1286 #, python-format msgid "Firewire device %s umounted. You can extract it." msgstr "El dispositiu firewire %s està desmuntat. Podeu extraure'l." #: ../tcos-devices-ng.py:1289 #, python-format msgid "Firewire device %s mounted. Ready for use." msgstr "El dispositiu firewire %s està muntat. Preparat." #: ../tcospersonalize.py:115 msgid "" "Need a host to configure!!!\n" "Try exec:\n" " tcospersonalize --host=XXX.XXX.XXX.XXX" msgstr "" "Cal indicar l'adreça de l'equip!\n" "Proveu:\n" " tcospersonalize --host=XXX.XXX.XXX.XXX" #: ../tcospersonalize.py:190 msgid "host: " msgstr "equip: " #: ../tcospersonalize.py:454 msgid "Host down, can't connect to tcosxmlrpc." msgstr "Equip inaccessible: no s'ha pogut connectar a tcosxmlrpc" #: ../tcospersonalize.py:462 #, python-format msgid "New %d drivers loaded from terminal." msgstr "%d drivers nou carregats des del terminal" #: ../tcospersonalize.py:521 #, python-format msgid "Really delete config of %s?" msgstr "Eliminar la configuració de %s?" #: ../tcospersonalize.py:524 msgid "Deleted!" msgstr "Eliminat!" #: ../tcos-volume-manager.py:101 ../tcos-volume-manager.py:113 #, python-format msgid "" "Tcos Sound levels on:\n" "%s" msgstr "" "Nivells de volum en:\n" "%s" #: ../tcos-volume-manager.py:121 #, python-format msgid "ERROR: It appears that TcosXmlRpc is not running on %s." msgstr "ERROR: Sembla que TcosXmlRpc no s'està executant en %s." #: ../tcos-volume-manager.py:217 msgid "Loading channels info..." msgstr "Càrrega de la informació dels canals..." #: ../tcos-volume-manager.py:230 msgid "Error loading channels info (xauth error)" msgstr "Error en intentar carregar la informació dels canals (xauth error)" #: ../tcos-volume-manager.py:233 ../ui/tcos-volume-manager.ui:8 msgid "Tcos Volume Manager" msgstr "Gestor de volum Tcos" #: ../tcos-volume-manager.py:234 #, python-format msgid "Sound mixer of %s host" msgstr "Mesclador de so de l'equip %s" #: ../tcos-volume-manager.py:300 ../tcosmonitor/extensions/info.py:442 msgid "Mute" msgstr "Enmudeix" #: ../tcos-volume-manager.py:319 msgid "Main controls ready" msgstr "Controls principals preparats" #: ../tcos-volume-manager.py:323 msgid "All remote controls loaded." msgstr "Carregats tots els controls remots." #: ../tcos-volume-manager.py:332 ../tcosmonitor/extensions/info.py:557 #, python-format msgid "Changing value of %(channel)s channel, to %(value)s%%..." msgstr "Canviant el valor del canal %(channel)s a %(value)s%%..." #: ../tcos-volume-manager.py:339 ../tcosmonitor/extensions/info.py:564 #, python-format msgid "Changed value of %(channel)s channel, to %(value)s" msgstr "" #: ../tcos-volume-manager.py:346 ../tcosmonitor/extensions/info.py:571 #, python-format msgid "Unmuting %s channel..." msgstr "Estic restablint el volum del canal %s..." #: ../tcos-volume-manager.py:351 ../tcosmonitor/extensions/info.py:576 #, python-format msgid "Muting %s channel..." msgstr "Estic enmudint el canal %s..." #: ../tcos-volume-manager.py:354 ../tcosmonitor/extensions/info.py:579 #, python-format msgid "Status of %(channel)s channel, is \"%(newvalue)s\"" msgstr "" #: ../tcosmonitor/TcosDBus.py:94 msgid "TcosDBus not allowed in local display" msgstr "TcosDBus no permés en pantalla local" #: ../tcosmonitor/TcosDBus.py:122 #, python-format msgid "Seems that tcosxmlrpc isn't running on host=\"%s\"" msgstr "Sembla que tcosxmlrpc no s'està executant en l'equip=\"%s\"" #: ../tcosmonitor/TcosDBus.py:143 msgid "tcosxmlrpc ERROR conection unavalaible." msgstr "tcosxmlrpc ERROR: connexió no disponible" #: ../tcosmonitor/TcosDBus.py:159 msgid "ERROR conecting to tcosxmlrpc, check username and password." msgstr "ERROR en la connexió a tcosxmlrpc: comproveu usuari i contrasenya" #: ../tcosmonitor/TcosDBus.py:251 msgid "Message from admin" msgstr "Missatge de l'administrador" #: ../tcosmonitor/TcosDBus.py:341 ../tcosmonitor/TcosDBus.py:357 #: ../tcosmonitor/TcosDBus.py:375 ../tcosmonitor/TcosDBus.py:393 msgid "User not allowed to run this dbus call." msgstr "L'usuari no té permís per a executar aquesta crida a dbus" #: ../tcosmonitor/TcosStaticHosts.py:163 ../tcosmonitor/TcosListView.py:70 msgid "IP address" msgstr "Adreça IP" #: ../tcosmonitor/TcosStaticHosts.py:169 #: ../ui/tcosmonitor-staticwindownew.ui:68 msgid "MAC address" msgstr "Adreça MAC" #: ../tcosmonitor/TcosStaticHosts.py:279 msgid "No hosts found, please click on Refresh button using another method." msgstr "" "No s'ha trobat cap equip. Per favor, feu clic en el botó Refrescar usant un " "altre mètode." #: ../tcosmonitor/shared.py:108 msgid "Traditional list only" msgstr "" #: ../tcosmonitor/shared.py:109 msgid "Icons only" msgstr "" #: ../tcosmonitor/shared.py:110 msgid "Simulate classroom" msgstr "" #: ../tcosmonitor/shared.py:111 msgid "Lists, icons and classroom with tabs" msgstr "" #: ../tcosmonitor/shared.py:270 ../tcosmonitor/shared.py:312 #: ../tcosmonitor/TcosMenus.py:35 msgid "Terminal actions" msgstr "" #: ../tcosmonitor/shared.py:271 ../tcosmonitor/shared.py:313 #: ../tcosmonitor/TcosMenus.py:36 msgid "User actions" msgstr "" #: ../tcosmonitor/shared.py:272 ../tcosmonitor/shared.py:314 #: ../tcosmonitor/TcosMenus.py:37 #, fuzzy msgid "Audio, video and files" msgstr "Difusió de àudio/vídeo" #: ../tcosmonitor/shared.py:279 ../tcosmonitor/extensions/info.py:47 msgid "Refresh terminal info" msgstr "Actualitza la informació dels terminals" #: ../tcosmonitor/shared.py:280 ../tcosmonitor/extensions/clean.py:40 #: ../tcosmonitor/extensions/clean.py:41 msgid "Clean info about terminal" msgstr "Neteja informació del terminal" #: ../tcosmonitor/shared.py:281 ../tcosmonitor/TcosTrayIcon.py:54 #: ../tcosmonitor/extensions/reboot.py:40 ../tcosmonitor/TcosTrayIcon2.py:58 msgid "Reboot" msgstr "Reinicia" #: ../tcosmonitor/shared.py:282 ../tcosmonitor/TcosTrayIcon.py:55 #: ../tcosmonitor/extensions/reboot.py:42 ../tcosmonitor/TcosTrayIcon2.py:59 msgid "Poweroff" msgstr "Apaga" #: ../tcosmonitor/shared.py:283 ../tcosmonitor/extensions/lockscreen.py:40 msgid "Lock screen" msgstr "Bloca" #: ../tcosmonitor/shared.py:284 ../tcosmonitor/extensions/lockscreen.py:42 msgid "Unlock screen" msgstr "Desbloca" #: ../tcosmonitor/shared.py:285 ../tcosmonitor/extensions/italc.py:43 msgid "Connect to remote screen (iTALC)" msgstr "Connecta a la pantalla remota (iTALC)" #: ../tcosmonitor/shared.py:286 ../tcosmonitor/extensions/vnc.py:54 msgid "Connect to remote screen (VNC)" msgstr "Connecta a la pantalla remota (VNC)" #: ../tcosmonitor/shared.py:287 ../tcosmonitor/extensions/screenshot.py:45 msgid "Screenshot" msgstr "Captura de pantalla" #: ../tcosmonitor/shared.py:288 ../tcosmonitor/extensions/remotessh.py:40 msgid "Give a remote xterm" msgstr "Executa un terminal en el client" #: ../tcosmonitor/shared.py:289 #: ../tcosmonitor/extensions/tcospersonalize.py:40 #: ../ui/tcosmonitor-prefwindow.ui:1324 msgid "Configure this host" msgstr "Configura aquest equip" #: ../tcosmonitor/shared.py:290 ../tcosmonitor/extensions/logout.py:40 msgid "Logout client" msgstr "Desconnecta client" #: ../tcosmonitor/shared.py:291 ../tcosmonitor/extensions/restartxorg.py:41 msgid "Restart X session with new settings" msgstr "Reiniciar la sessió X amb la nova configuració" #: ../tcosmonitor/shared.py:292 ../tcosmonitor/extensions/appsmsg.py:52 msgid "Exec app on user display" msgstr "Executa programa en la pantalla de l'usuari" #: ../tcosmonitor/shared.py:293 ../tcosmonitor/extensions/appsmsg.py:53 msgid "Send a text message to user" msgstr "Envia missatges als usuaris" #: ../tcosmonitor/shared.py:294 ../tcosmonitor/extensions/viewproc.py:41 msgid "Show running apps of this client" msgstr "Mostrar els programes que s'executen en el client" #: ../tcosmonitor/shared.py:295 ../tcosmonitor/shared.py:332 msgid "Audio/Video broadcast" msgstr "Difusió de àudio/vídeo" #: ../tcosmonitor/shared.py:296 ../tcosmonitor/shared.py:333 #: ../tcosmonitor/extensions/sendfiles.py:49 #: ../tcosmonitor/extensions/sendfiles.py:50 #: ../ui/tcosmonitor-prefwindow.ui:1134 ../ui/tcosmonitor-prefwindow.ui:1475 #: ../ui/tcosmonitor-mainwindow.ui:387 msgid "Send files" msgstr "Enviar fitxers" #: ../tcosmonitor/shared.py:297 ../tcosmonitor/extensions/vnc.py:55 msgid "Demo mode (from this host)" msgstr "Mode demostració (des d'aquest equip)" #: ../tcosmonitor/shared.py:298 ../tcosmonitor/extensions/wakeonlan.py:41 msgid "Boot client (WakeOnLan)" msgstr "Arranca l'ordinador (WakeOnLan)" #: ../tcosmonitor/shared.py:299 #: ../tcosmonitor/extensions/tcosnetcontroller.py:38 msgid "Lock internet" msgstr "Bloqueig d'Internet" #: ../tcosmonitor/shared.py:300 #: ../tcosmonitor/extensions/tcosnetcontroller.py:39 msgid "Unlock internet" msgstr "Desbloca la connexió a Internet" #: ../tcosmonitor/shared.py:301 ../tcosmonitor/extensions/dpms.py:40 #, fuzzy msgid "DPMS Power off monitor" msgstr "Control d'energia del monitor DPMS" #: ../tcosmonitor/shared.py:302 ../tcosmonitor/extensions/dpms.py:42 #, fuzzy msgid "DPMS Power on monitor" msgstr "Control d'energia del monitor DPMS" #: ../tcosmonitor/shared.py:303 #, fuzzy msgid "Send MIC audio (from this host)" msgstr "Mode demostració (des d'aquest equip)" #: ../tcosmonitor/shared.py:321 ../tcosmonitor/extensions/reboot.py:41 msgid "Reboot all clients" msgstr "Reinicia tots els equips" #: ../tcosmonitor/shared.py:322 ../tcosmonitor/extensions/reboot.py:43 msgid "Poweroff all clients" msgstr "Apaga tots els equips" #: ../tcosmonitor/shared.py:323 ../tcosmonitor/extensions/lockscreen.py:41 msgid "Lock all screens" msgstr "Bloca totes les pantalles" #: ../tcosmonitor/shared.py:324 ../tcosmonitor/extensions/lockscreen.py:43 msgid "Unlock all screens" msgstr "Desbloca totes les pantalles" #: ../tcosmonitor/shared.py:325 ../tcosmonitor/extensions/logout.py:41 msgid "Logout clients" msgstr "Desconnecta clients" #: ../tcosmonitor/shared.py:326 ../tcosmonitor/extensions/restartxorg.py:42 msgid "Restart X session of all clients" msgstr "Reinicia la sessió X en tots els clients" #: ../tcosmonitor/shared.py:327 ../tcosmonitor/extensions/appsmsg.py:55 msgid "Exec same app in all connected users" msgstr "Executat el mateix programa per a tots els usuaris connectats" #: ../tcosmonitor/shared.py:328 ../tcosmonitor/extensions/appsmsg.py:56 msgid "Send a text message to all connected users" msgstr "Envia un missatge a tots els usuaris connectats" #: ../tcosmonitor/shared.py:329 ../tcosmonitor/extensions/vnc.py:57 msgid "Enter demo mode, all connected users see my screen" msgstr "Entra en mode demo: tots els usuaris veuran la meua pantalla" #: ../tcosmonitor/shared.py:330 msgid "Enter conference mode, all connected users can hear me" msgstr "Entra en mode conferència: tots els usuaris em sentiran" #: ../tcosmonitor/shared.py:331 ../tcosmonitor/extensions/screenshot.py:46 msgid "Capture All clients screens" msgstr "Captura les pantalles de tots els clients" #: ../tcosmonitor/shared.py:334 ../tcosmonitor/extensions/wakeonlan.py:42 msgid "Boot All clients (WakeOnLan)" msgstr "Inicia tots els equips (WakeOnLan)" #: ../tcosmonitor/shared.py:335 #: ../tcosmonitor/extensions/tcosnetcontroller.py:41 msgid "Lock internet in all connected users" msgstr "Bloca la connexió a Internet per a tots els usuaris connectats" #: ../tcosmonitor/shared.py:336 #: ../tcosmonitor/extensions/tcosnetcontroller.py:42 msgid "Unlock internet in all connected users" msgstr "Desbloca la connexió a Internet per a tots els usuaris connectats" #: ../tcosmonitor/shared.py:337 ../tcosmonitor/extensions/dpms.py:41 #, fuzzy msgid "DPMS Power off monitors" msgstr "Control d'energia del monitor DPMS" #: ../tcosmonitor/shared.py:338 ../tcosmonitor/extensions/dpms.py:43 #, fuzzy msgid "DPMS Power on monitors" msgstr "Control d'energia del monitor DPMS" #: ../tcosmonitor/shared.py:339 #, fuzzy msgid "Chat audio conference" msgstr "Mode audioconferència" #: ../tcosmonitor/shared.py:340 ../tcosmonitor/extensions/livevnc.py:51 #: ../ui/tcosmonitor-prefwindow.ui:1342 msgid "Live view screens with VNC" msgstr "" #: ../tcosmonitor/shared.py:538 #, python-format msgid "QUESTION: %(txt)s, RESPONSE %(response)s" msgstr "PREGUNTA: %(txt)s, RESPOSTA %(response)s" #: ../tcosmonitor/shared.py:555 ../tcosmonitor/shared.py:566 #, python-format msgid "INFO: %s" msgstr "INFO: %s" #: ../tcosmonitor/shared.py:577 #, python-format msgid "ERROR: %s" msgstr "ERROR: %s" #: ../tcosmonitor/TcosClassView.py:50 ../tcosmonitor/TcosIconView.py:47 msgid "IP" msgstr "" #: ../tcosmonitor/TcosClassView.py:51 ../tcosmonitor/TcosIconView.py:48 #: ../tcosmonitor/TcosListView.py:64 msgid "Hostname" msgstr "Equip" #: ../tcosmonitor/TcosClassView.py:52 ../tcosmonitor/TcosIconView.py:49 #: ../tcosmonitor/TcosListView.py:76 msgid "Username" msgstr "Usuari" #: ../tcosmonitor/TcosClassView.py:53 ../tcosmonitor/TcosIconView.py:50 #: ../tcosmonitor/TcosListView.py:87 msgid "Logged" msgstr "Connectat" #: ../tcosmonitor/TcosClassView.py:54 ../tcosmonitor/TcosIconView.py:51 #: ../tcosmonitor/TcosListView.py:103 msgid "Time log in" msgstr "Temps" #: ../tcosmonitor/TcosClassView.py:55 ../tcosmonitor/TcosIconView.py:52 #, fuzzy msgid "Screen locked" msgstr "Blocada" #: ../tcosmonitor/TcosClassView.py:56 ../tcosmonitor/TcosIconView.py:53 #, fuzzy msgid "Network locked" msgstr "Informació de la xarxa" #: ../tcosmonitor/TcosClassView.py:58 msgid "" "Place mouse on any computer to see brief info about it.\n" "You can select and unselect multiple host clicking on every one.\n" "Drag and drop hosts to positions and save clicking on right mouse button." msgstr "" #: ../tcosmonitor/TcosClassView.py:179 msgid "Positions reset to defaults." msgstr "" #: ../tcosmonitor/TcosClassView.py:197 #, fuzzy msgid "Positions saved." msgstr "S'ha desat la configuració." #: ../tcosmonitor/TcosClassView.py:323 #, python-format msgid "%s is not a valid file to exe or send" msgstr "" #: ../tcosmonitor/TcosClassView.py:409 ../tcosmonitor/TcosIconView.py:156 msgid "yes" msgstr "" #: ../tcosmonitor/TcosClassView.py:411 ../tcosmonitor/TcosIconView.py:158 msgid "no" msgstr "" #: ../tcosmonitor/TcosTrayIcon.py:49 ../tcosmonitor/extensions/vnc.py:298 #: ../tcosmonitor/TcosTrayIcon2.py:53 ../ui/tcosmonitor-mainwindow.ui:23 msgid "Quit" msgstr "Ix" #: ../tcosmonitor/TcosTrayIcon.py:65 msgid "TcosDevices" msgstr "" #: ../tcosmonitor/TcosTrayIcon.py:172 ../tcosmonitor/TcosTrayIcon.py:186 #: ../tcosmonitor/TcosTrayIcon2.py:67 msgid "Tcos Devices" msgstr "Dispositius TCOS" #: ../tcosmonitor/TcosTrayIcon.py:232 ../tcosmonitor/TcosTrayIcon2.py:351 msgid "Usb flash" msgstr "USB flash" #: ../tcosmonitor/TcosTrayIcon.py:234 ../tcosmonitor/TcosTrayIcon2.py:353 msgid "Mount USB1" msgstr "Munta USB1" #: ../tcosmonitor/TcosTrayIcon.py:235 ../tcosmonitor/TcosTrayIcon2.py:354 msgid "Umount USB1" msgstr "Desmunta USB1" #: ../tcosmonitor/extensions/lockscreen.py:49 #: ../tcosmonitor/extensions/lockscreen.py:57 msgid "" "Can't connect to tcosxmlrpc.\n" "Please verify user and password in prefences!" msgstr "" "No ha estat possible connectar a tcosxmlprc.\n" "Comproveu el nom d'usuari i la contrasenya en les preferències." #: ../tcosmonitor/extensions/lockscreen.py:81 #, fuzzy, python-format msgid "Do you want to lock the following screens: %s?" msgstr "Voleu bloquejar les pantalles dels equips següents:%s?" #: ../tcosmonitor/extensions/lockscreen.py:90 #, fuzzy, python-format msgid "Do you want to unlock the following screens: %s?" msgstr "Voleu desbloquejar les pantalles els equips següents:%s?" #: ../tcosmonitor/extensions/appsmsg.py:64 msgid "Clients not connected" msgstr "Clients no connectats" #: ../tcosmonitor/extensions/appsmsg.py:87 #, fuzzy, python-format msgid "" "Exec app in user(s) screen(s)\n" "or open web address to:\n" "%s" msgstr "" "Execució d'un programa en la pantalla de l'usuari:\n" "%s" #: ../tcosmonitor/extensions/appsmsg.py:89 #, python-format msgid "" "Send a message to:\n" "%s" msgstr "" "Envia un missatge a:\n" "%s" #: ../tcosmonitor/extensions/appsmsg.py:122 #: ../tcosmonitor/extensions/appsmsg.py:163 msgid "Can't exec application, user is not logged" msgstr "No es pot executar l'aplicació: no hi ha entrat cap usuari" #: ../tcosmonitor/extensions/appsmsg.py:141 #: ../tcosmonitor/extensions/appsmsg.py:152 #, fuzzy, python-format msgid "%s is not a valid application" msgstr "%s no és un programa" #: ../tcosmonitor/extensions/appsmsg.py:172 msgid "Can't send message, user is not logged" msgstr "" "No s'ha pogut enviar cap missatge: no hi ha cap sessió d'usuari oberta." #: ../tcosmonitor/extensions/appsmsg.py:289 #: ../tcosmonitor/extensions/appsmsg.py:298 #, python-format msgid "%s is not application" msgstr "%s no és un programa" #: ../tcosmonitor/extensions/appsmsg.py:353 #, python-format msgid "" "Error while exec remote app:\n" "Reason: %s" msgstr "" "Error durant l'execució del programa remot:\n" "Motiu: %s" #: ../tcosmonitor/extensions/appsmsg.py:360 #, python-format msgid "" "Error while send message:\n" "Reason: %s" msgstr "" "Error durant l'enviament del missatge:\n" "Motiu: %s" #: ../tcosmonitor/extensions/remotessh.py:47 msgid "Enter password of remote thin client (if asked for it)" msgstr "Introduïu la contrasenya del client (si cal)" #: ../tcosmonitor/extensions/dpms.py:79 #, fuzzy, python-format msgid "Do you want to switch off the following monitors: %s?" msgstr "Voleu apagar els equips següents:%s?" #: ../tcosmonitor/extensions/dpms.py:88 #, fuzzy, python-format msgid "Do you want to switch on the following monitors: %s?" msgstr "Voleu apagar els equips següents:%s?" #: ../tcosmonitor/extensions/screenshot.py:66 #: ../tcosmonitor/extensions/screenshot.py:83 #, python-format msgid "Can't make screenshot, error: %s" msgstr "Ha estat impossible fer la captura, error: %s" #: ../tcosmonitor/extensions/screenshot.py:75 msgid "Trying to order terminal to do a screenshot..." msgstr "Intentant donar l'ordre al terminal de fer una captura de pantalla..." #: ../tcosmonitor/extensions/screenshot.py:87 msgid "Get another screenshot" msgstr "Feu una altra captura de pantalla" #: ../tcosmonitor/extensions/screenshot.py:102 #, python-format msgid "Screenshot of %s" msgstr "Captura de pantalla de %s" #: ../tcosmonitor/extensions/screenshot.py:125 #, python-format msgid "Screenshot of %s, done." msgstr "S'ha realitzat la captura de pantalla de %s." #: ../tcosmonitor/extensions/screenshot.py:139 #, fuzzy msgid "Save Screenshot" msgstr "Captura de pantalla" #: ../tcosmonitor/extensions/screenshot.py:151 #, fuzzy msgid "Select file to save screenshot..." msgstr "Tria fitxer(s)..." #: ../tcosmonitor/extensions/screenshot.py:155 #, python-format msgid "screenshot_of_%(hostname)s_date_%(date)s.png" msgstr "" #: ../tcosmonitor/extensions/screenshot.py:159 msgid "Image Files ( *.png, *.jpg)" msgstr "" #: ../tcosmonitor/extensions/screenshot.py:169 msgid "File must be png or jpg." msgstr "" #: ../tcosmonitor/extensions/screenshot.py:192 msgid "Screenshots of all hosts" msgstr "Captures de pantalla de tots els equips" #: ../tcosmonitor/extensions/screenshot.py:208 #, python-format msgid "Screenshot of %s" msgstr "Captura de pantalla de %s" #: ../tcosmonitor/extensions/sendfiles.py:62 #: ../tcosmonitor/extensions/sendfiles.py:120 msgid "Can't send files, user is not logged" msgstr "No s'ha pogut enviar cap fitxer: no hi ha cap sessió d'usuari oberta." #: ../tcosmonitor/extensions/sendfiles.py:66 #: ../tcosmonitor/extensions/sendfiles.py:142 #: ../tcosmonitor/extensions/sendfiles.py:237 msgid "" "TcosMonitor need special configuration for rsync daemon to send files.\n" "\n" "Please read configuration requeriments in:\n" "/usr/share/doc/tcosmonitor/README.rsync" msgstr "" "TcosMonitor necessita una configuració especial del dimoni rsync per a poder " "enviar fitxers.\n" "\n" "Llegiu els requisits en:\n" "/usr/share/doc/tcosmonitor/README.rsync" #: ../tcosmonitor/extensions/sendfiles.py:84 #: ../tcosmonitor/extensions/sendfiles.py:176 #: ../tcosmonitor/extensions/sendfiles.py:270 msgid "Waiting for send files..." msgstr "Esperant per a enviar fitxers..." #: ../tcosmonitor/extensions/sendfiles.py:93 #: ../tcosmonitor/extensions/sendfiles.py:95 #: ../tcosmonitor/extensions/sendfiles.py:99 #: ../tcosmonitor/extensions/sendfiles.py:108 #: ../tcosmonitor/extensions/sendfiles.py:189 #: ../tcosmonitor/extensions/sendfiles.py:191 #: ../tcosmonitor/extensions/sendfiles.py:195 #: ../tcosmonitor/extensions/sendfiles.py:204 #: ../tcosmonitor/extensions/sendfiles.py:283 #: ../tcosmonitor/extensions/sendfiles.py:285 #: ../tcosmonitor/extensions/sendfiles.py:289 #: ../tcosmonitor/extensions/sendfiles.py:298 msgid "Teacher" msgstr "Profe" #: ../tcosmonitor/extensions/sendfiles.py:95 #: ../tcosmonitor/extensions/sendfiles.py:108 #: ../tcosmonitor/extensions/sendfiles.py:191 #: ../tcosmonitor/extensions/sendfiles.py:204 #: ../tcosmonitor/extensions/sendfiles.py:285 #: ../tcosmonitor/extensions/sendfiles.py:298 #, python-format msgid "" "Teacher has sent some files to %(teacher)s folder:\n" "\n" "%(basenames)s" msgstr "" "El/la profe ha enviat un fitxer (o més d'un) a la carpeta %(teacher)s:\n" "\n" "%(basenames)s" #: ../tcosmonitor/extensions/sendfiles.py:104 #: ../tcosmonitor/extensions/sendfiles.py:200 #: ../tcosmonitor/extensions/sendfiles.py:294 #: ../tcosmonitor/extensions/reboot.py:108 #: ../tcosmonitor/extensions/videolan.py:194 #: ../tcosmonitor/extensions/videolan.py:389 #: ../tcosmonitor/extensions/videolan.py:629 #, python-format msgid "" "Error while exec remote app:\n" "Reason:%s" msgstr "" "Error durant l'execució del programa remot:\n" "Motiu:%s" #: ../tcosmonitor/extensions/sendfiles.py:105 #: ../tcosmonitor/extensions/sendfiles.py:201 #: ../tcosmonitor/extensions/sendfiles.py:295 msgid "Error creating destination folder." msgstr "Error mentre intentava crear la carpeta de destinació." #: ../tcosmonitor/extensions/sendfiles.py:110 #: ../tcosmonitor/extensions/sendfiles.py:205 #: ../tcosmonitor/extensions/sendfiles.py:300 msgid "Files sent." msgstr "Fitxers enviats." #: ../tcosmonitor/extensions/sendfiles.py:125 #: ../tcosmonitor/extensions/sendfiles.py:220 msgid "Select file or files..." msgstr "Tria fitxer(s)..." #: ../tcosmonitor/extensions/sendfiles.py:178 #: ../tcosmonitor/extensions/sendfiles.py:272 #, fuzzy msgid "Do you want open file(s) on client?" msgstr "Voleu iniciar %s?" #: ../tcosmonitor/extensions/sendfiles.py:215 #: ../tcosmonitor/extensions/tcosnetcontroller.py:113 #: ../tcosmonitor/extensions/tcosnetcontroller.py:155 #: ../tcosmonitor/extensions/videolan.py:457 #: ../tcosmonitor/extensions/vnc.py:68 ../tcosmonitor/extensions/vnc.py:112 #: ../tcosmonitor/extensions/vnc.py:422 #: ../tcosmonitor/extensions/audiortp.py:229 #: ../tcosmonitor/extensions/audiortp.py:275 #: ../tcosmonitor/extensions/audiortp.py:373 #: ../tcosmonitor/extensions/audiortp.py:407 #: ../tcosmonitor/extensions/audiortp.py:460 msgid "No users logged." msgstr "No hi ha cap usuari connectat" #: ../tcosmonitor/extensions/info.py:91 #, python-format msgid "Connecting with %s to retrieve some info..." msgstr "Connectant amb %s per obtenir informació..." #: ../tcosmonitor/extensions/info.py:117 msgid "Tcos info" msgstr "Informació sobre Tcos" #: ../tcosmonitor/extensions/info.py:120 msgid "PXES info" msgstr "Informació sobre PXE" #: ../tcosmonitor/extensions/info.py:123 msgid "LTSP info" msgstr "Informació sobre LTSP" #: ../tcosmonitor/extensions/info.py:126 #, fuzzy msgid "Standalone info" msgstr "Informació disponible" #: ../tcosmonitor/extensions/info.py:129 msgid "Unknow client info" msgstr "" #: ../tcosmonitor/extensions/info.py:135 ../tcosmonitor/LocalData.py:43 #: ../tcosmonitor/LocalData.py:62 ../tcosmonitor/TcosCommon.py:182 #: ../tcosmonitor/TcosCommon.py:190 ../tcosmonitor/TcosCommon.py:206 #: ../tcosmonitor/TcosCommon.py:209 msgid "unknow" msgstr "desconegut" #: ../tcosmonitor/extensions/info.py:138 msgid "Hostname: " msgstr "Equip:" #: ../tcosmonitor/extensions/info.py:139 msgid "Ip address: " msgstr "Adreça IP:" #: ../tcosmonitor/extensions/info.py:140 msgid "TcosXmlRpc version: " msgstr "Versió de TcosXmlRpc:" #: ../tcosmonitor/extensions/info.py:149 msgid "Tcos image version: " msgstr "Versió de la imatge Tcos:" #: ../tcosmonitor/extensions/info.py:150 msgid "Tcos image date: " msgstr "Data de la imatge Tcos:" #: ../tcosmonitor/extensions/info.py:151 msgid "Date of thin client: " msgstr "Data del client lleuger:" #: ../tcosmonitor/extensions/info.py:152 msgid "Uptime: " msgstr "Temps:" #: ../tcosmonitor/extensions/info.py:163 msgid "Kernel info" msgstr "Informació del nucli" #: ../tcosmonitor/extensions/info.py:172 msgid "Force download and mount all modules" msgstr "Força la descàrrega i muntatge de tots els mòduls" #: ../tcosmonitor/extensions/info.py:183 msgid "None" msgstr "Cap" #: ../tcosmonitor/extensions/info.py:186 msgid "Kernel version: " msgstr "Versió del nucli:" #: ../tcosmonitor/extensions/info.py:187 msgid "Kernel complete version: " msgstr "Versió del nucli (completa):" #: ../tcosmonitor/extensions/info.py:188 msgid "Loaded Modules: " msgstr "Mòduls carregats:" #: ../tcosmonitor/extensions/info.py:189 msgid "Modules not found: " msgstr "Mòduls no trobats:" #: ../tcosmonitor/extensions/info.py:205 msgid "Cpu info: " msgstr "Informació de la CPU:" #: ../tcosmonitor/extensions/info.py:212 msgid "Cpu model: " msgstr "Model de la CPU:" #: ../tcosmonitor/extensions/info.py:213 msgid "Cpu vendor: " msgstr "Marca de la CPU:" #: ../tcosmonitor/extensions/info.py:214 msgid "Cpu speed: " msgstr "Velocitat del micro:" #: ../tcosmonitor/extensions/info.py:225 msgid "PCI buses: " msgstr "Buses PCI:" #: ../tcosmonitor/extensions/info.py:254 msgid "Process running: " msgstr "Processos en execució:" #: ../tcosmonitor/extensions/info.py:267 msgid "Ram info: " msgstr "Informació sobre la RAM:" #: ../tcosmonitor/extensions/info.py:274 msgid "Total Ram: " msgstr "RAM (total):" #: ../tcosmonitor/extensions/info.py:275 msgid "Free RAM: " msgstr "Memòria RAM lliure:" #: ../tcosmonitor/extensions/info.py:276 msgid "Active RAM: " msgstr "Memòria RAM activa:" #: ../tcosmonitor/extensions/info.py:279 msgid "Swap info: " msgstr "Informació sobre la memòria d'intercanvi:" #: ../tcosmonitor/extensions/info.py:285 msgid "Swap enabled: " msgstr "Memòria d'intercanvi activada:" #: ../tcosmonitor/extensions/info.py:286 msgid "Total Swap: " msgstr "Memòria d'intercanvi total:" #: ../tcosmonitor/extensions/info.py:287 msgid "Used Swap: " msgstr "Memòria d'intercanvi usada:" #: ../tcosmonitor/extensions/info.py:297 msgid "Network info: " msgstr "Informació de la xarxa:" #: ../tcosmonitor/extensions/info.py:307 msgid "Network hostname: " msgstr "Nom de l'equip" #: ../tcosmonitor/extensions/info.py:308 msgid "Network IP: " msgstr "Adreça IP:" #: ../tcosmonitor/extensions/info.py:309 msgid "Network MASK: " msgstr "Màscara de xarxa:" #: ../tcosmonitor/extensions/info.py:310 msgid "Network MAC: " msgstr "Adreça MAC:" #: ../tcosmonitor/extensions/info.py:311 msgid "Data received(rx): " msgstr "Dades rebudes(tx)" #: ../tcosmonitor/extensions/info.py:312 msgid "Data send(tx): " msgstr "Dades enviades(tx)" #: ../tcosmonitor/extensions/info.py:322 ../ui/tcosmonitor-prefwindow.ui:911 msgid "Xorg info" msgstr "Informació sobre Xorg" #: ../tcosmonitor/extensions/info.py:348 msgid "enabled" msgstr "activat" #: ../tcosmonitor/extensions/info.py:350 msgid "disabled" msgstr "desactivat" #: ../tcosmonitor/extensions/info.py:353 ../ui/tcospersonalize.ui:159 msgid "X Session Type" msgstr "Tipus de sessió X" #: ../tcosmonitor/extensions/info.py:355 ../ui/tcospersonalize.ui:201 msgid "Xorg Driver" msgstr "Driver de Xorg" #: ../tcosmonitor/extensions/info.py:357 ../ui/tcospersonalize.ui:94 msgid "Xorg Resolution" msgstr "Resolució de Xorg" #: ../tcosmonitor/extensions/info.py:359 ../ui/tcospersonalize.ui:133 msgid "Xorg Color depth" msgstr "Profunditat de color de Xorg" #: ../tcosmonitor/extensions/info.py:361 ../ui/tcospersonalize.ui:179 msgid "DPMS energy monitor control" msgstr "Control d'energia del monitor DPMS" #: ../tcosmonitor/extensions/info.py:363 msgid "Disable kill X with Ctrl+Alt+Backspace" msgstr "Desactivar interrupció de les X Ctrl+Alt+Backspace" #: ../tcosmonitor/extensions/info.py:365 ../ui/tcospersonalize.ui:57 msgid "Enable mouse wheel" msgstr "Activar la roda del ratolí" #: ../tcosmonitor/extensions/info.py:367 msgid "Refresh rate" msgstr "Freqüència de refresc" #: ../tcosmonitor/extensions/info.py:369 msgid "Xorg font server" msgstr "Servidor de tipus de lletra" #: ../tcosmonitor/extensions/info.py:371 msgid "Mouse device" msgstr "Ratolí" #: ../tcosmonitor/extensions/info.py:373 msgid "Mouse protocol" msgstr "Protocol del ratolí" #: ../tcosmonitor/extensions/info.py:375 ../ui/tcospersonalize.ui:273 msgid "X Horiz sync" msgstr "Sincronització horitzontal" #: ../tcosmonitor/extensions/info.py:377 ../ui/tcospersonalize.ui:284 msgid "X Vert sync" msgstr "Sincronització vertical" #: ../tcosmonitor/extensions/info.py:390 msgid "PulseAudio Sound server is running" msgstr "El servidor de so PulseAudio està en execució" #: ../tcosmonitor/extensions/info.py:408 msgid "Remote Sound Mixer" msgstr "Mesclador de so remot" #: ../tcosmonitor/extensions/info.py:480 msgid "PulseAudio Control" msgstr "Control de volum de PulseAudio" #: ../tcosmonitor/extensions/info.py:485 msgid "PulseAudio Meter" msgstr "Indicadors de PulseAudio" #: ../tcosmonitor/extensions/info.py:490 msgid "PulseAudio Manager" msgstr "Gestor de PulseAudio" #: ../tcosmonitor/extensions/info.py:494 msgid "PulseAudio utils: " msgstr "Ferramentes de PulseAudio" #: ../tcosmonitor/extensions/info.py:500 msgid "PulseAudio stats" msgstr "Estadístiques de PulseAudio" #: ../tcosmonitor/extensions/info.py:512 msgid "Currently in use" msgstr "Actualment en ús" #: ../tcosmonitor/extensions/info.py:513 msgid "Allocated during whole lifetime" msgstr "" #: ../tcosmonitor/extensions/info.py:514 msgid "Sample cache size" msgstr "" #: ../tcosmonitor/extensions/info.py:515 msgid "User name" msgstr "Usuari" #: ../tcosmonitor/extensions/info.py:516 msgid "Host Name" msgstr "Equip" #: ../tcosmonitor/extensions/info.py:517 msgid "Server Name" msgstr "Nom del servidor" #: ../tcosmonitor/extensions/info.py:518 msgid "Server Version" msgstr "Versió del servidor " #: ../tcosmonitor/extensions/info.py:519 msgid "Default Sample Specification" msgstr "" #: ../tcosmonitor/extensions/info.py:520 msgid "Default Sink" msgstr "" #: ../tcosmonitor/extensions/info.py:521 msgid "Default Source" msgstr "" #: ../tcosmonitor/extensions/info.py:522 msgid "Cookie" msgstr "Galeta (cookie)" #: ../tcosmonitor/extensions/info.py:528 msgid "Sound server is not running" msgstr "El servidor de so no està en execució" #: ../tcosmonitor/extensions/info.py:589 ../tcosmonitor/extensions/info.py:597 #: ../tcosmonitor/extensions/info.py:605 msgid "PulseAudio apps need /dev/shm." msgstr "El programes que usen PulseAudio necessiten /dev/shm." #: ../tcosmonitor/extensions/logout.py:48 #: ../tcosmonitor/extensions/logout.py:71 #, fuzzy msgid "User not logged" msgstr "No hi ha cap usuari connectat" #: ../tcosmonitor/extensions/logout.py:51 #, fuzzy, python-format msgid "Do you want to logout user: %s?" msgstr "Voleu fer sortir l'usuari \"%s\"?" #: ../tcosmonitor/extensions/logout.py:55 #: ../tcosmonitor/extensions/logout.py:77 #, python-format msgid "Session will close in %s seconds" msgstr "La sessió es tancarà en %s segons" #: ../tcosmonitor/extensions/logout.py:73 #, fuzzy, python-format msgid "Do you want to logout the following users: %s?" msgstr "Voleu fer sortir els usuaris següents:%s?" #: ../tcosmonitor/extensions/reboot.py:48 #, fuzzy, python-format msgid "Do you want to reboot: %s?" msgstr "Voleu reiniciar %s?" #: ../tcosmonitor/extensions/reboot.py:51 #: ../tcosmonitor/extensions/reboot.py:61 #, python-format msgid "Pc will reboot in %s seconds" msgstr "L'ordinador es reiniciarà en %s segons" #: ../tcosmonitor/extensions/reboot.py:58 #, fuzzy, python-format msgid "Do you want to reboot the following clients: %s?" msgstr "Voleu reiniciar els equips següents:%s?" #: ../tcosmonitor/extensions/reboot.py:67 #, fuzzy, python-format msgid "Do you want to poweroff: %s?" msgstr "Voleu apagar %s?" #: ../tcosmonitor/extensions/reboot.py:70 #: ../tcosmonitor/extensions/reboot.py:80 #, python-format msgid "Pc will shutdown in %s seconds" msgstr "L'ordinador s'apagarà en %s segons" #: ../tcosmonitor/extensions/reboot.py:77 #, fuzzy, python-format msgid "Do you want to poweroff the following clients: %s?" msgstr "Voleu apagar els equips següents:%s?" #: ../tcosmonitor/extensions/tcosnetcontroller.py:50 #: ../tcosmonitor/extensions/tcosnetcontroller.py:109 msgid "Internet connection has been disabled" msgstr "La connexió a Internet ha estat desactivada" #: ../tcosmonitor/extensions/tcosnetcontroller.py:54 msgid "Can't disable internet, user is not logged" msgstr "" "No s'ha pogut desactivar la connexió a internet: no hi ha cap sessió " "d'usuari oberta." #: ../tcosmonitor/extensions/tcosnetcontroller.py:59 #: ../tcosmonitor/extensions/tcosnetcontroller.py:85 #: ../tcosmonitor/extensions/tcosnetcontroller.py:103 #: ../tcosmonitor/extensions/tcosnetcontroller.py:147 #, python-format msgid "" "In order to lock and unlock internet you need to be in 'tcos' group.\n" "\n" "Exe by root: adduser %s tcos" msgstr "" #: ../tcosmonitor/extensions/tcosnetcontroller.py:77 #: ../tcosmonitor/extensions/tcosnetcontroller.py:151 msgid "Internet connection has been enabled" msgstr "La connexió a Internet ha estat activada" #: ../tcosmonitor/extensions/tcosnetcontroller.py:81 msgid "Can't enable internet, user is not logged" msgstr "" "No s'ha pogut activar la connexió a internet: no hi ha cap sessió d'usuari " "oberta." #: ../tcosmonitor/extensions/tcosnetcontroller.py:116 #, fuzzy, python-format msgid "Do you want disable internet to following users: %s?" msgstr "Voleu desactivar internet per als usuaris següents:%s?" #: ../tcosmonitor/extensions/tcosnetcontroller.py:158 #, fuzzy, python-format msgid "Do you want enable internet to following users:%s?" msgstr "Voleu activar internet per als usuaris següents:%s?" #: ../tcosmonitor/extensions/videolan.py:48 #: ../tcosmonitor/extensions/videolan.py:49 #, fuzzy msgid "Send Audio/Video broadcast" msgstr "Difusió de àudio/vídeo" #: ../tcosmonitor/extensions/videolan.py:65 #: ../tcosmonitor/extensions/videolan.py:219 msgid "Can't send video broadcast, user is not logged" msgstr "No s'hi pot enviar vídeo: no hi ha cap usuari connectat" #: ../tcosmonitor/extensions/videolan.py:149 #: ../tcosmonitor/extensions/videolan.py:347 #: ../tcosmonitor/extensions/videolan.py:578 #, python-format msgid "" "Not allowed white spaces in \"%s\".\n" "Please rename it." msgstr "" "No hi pot haver espais en \"%s\".\n" "Per favor, canvieu-li el nom." #: ../tcosmonitor/extensions/videolan.py:159 #: ../tcosmonitor/extensions/videolan.py:359 #: ../tcosmonitor/extensions/videolan.py:594 msgid "Waiting for start video transmission..." msgstr "Esperant l'inici de la transmissió de vídeo" #: ../tcosmonitor/extensions/videolan.py:167 #: ../tcosmonitor/extensions/videolan.py:367 #: ../tcosmonitor/extensions/videolan.py:602 #: ../tcosmonitor/extensions/vnc.py:98 ../tcosmonitor/extensions/vnc.py:407 msgid "Error while exec app" msgstr "Error durant l'execució del programa" #: ../tcosmonitor/extensions/videolan.py:199 #: ../tcosmonitor/extensions/videolan.py:393 #: ../tcosmonitor/extensions/videolan.py:634 msgid "Running in broadcast video transmission." msgstr "Difusió de vídeo." #: ../tcosmonitor/extensions/videolan.py:208 #: ../tcosmonitor/extensions/videolan.py:402 #, fuzzy, python-format msgid "" "Running in broadcast video transmission to user %(host)s. Broadcast Nº %" "(count)s" msgstr "Difusió de vídeo per a %s" #: ../tcosmonitor/extensions/videolan.py:311 #: ../tcosmonitor/extensions/videolan.py:541 msgid "Select audio/video file.." msgstr "Selecciona fitxer d'audio o de vídeo." #: ../tcosmonitor/extensions/videolan.py:314 #: ../tcosmonitor/extensions/videolan.py:544 msgid "Play DVD" msgstr "Reprodueix un DVD" #: ../tcosmonitor/extensions/videolan.py:315 #: ../tcosmonitor/extensions/videolan.py:545 msgid "Play SVCD/VCD" msgstr "Reprodueix un SVCD/VCD" #: ../tcosmonitor/extensions/videolan.py:316 #: ../tcosmonitor/extensions/videolan.py:546 msgid "Play AudioCD" msgstr "Reprodueix un CD d'audio" #: ../tcosmonitor/extensions/videolan.py:361 #: ../tcosmonitor/extensions/videolan.py:596 msgid "" "First select the DVD chapter or play movie\n" "then press enter to send clients..." msgstr "" "Primer elegiu el capítol del DVD o reproduïu la pel·lícula\n" "i, després, premeu ENTER per a fer l'enviament..." #: ../tcosmonitor/extensions/videolan.py:370 msgid "Lock keyboard and mouse on client?" msgstr "Voleu blocar el teclat i el ratolí del client?" #: ../tcosmonitor/extensions/videolan.py:444 msgid "Video broadcast stopped." msgstr "Retransmissió de vídeo aturada." #: ../tcosmonitor/extensions/videolan.py:605 msgid "Lock keyboard and mouse on clients?" msgstr "Blocar el teclat i el ratolí en els clients?" #: ../tcosmonitor/extensions/videolan.py:643 #, fuzzy, python-format msgid "Running in broadcast video transmission. Broadcast Nº %s" msgstr "Difusió de vídeo." #: ../tcosmonitor/extensions/restartxorg.py:51 #, python-format msgid "Restart X session of %s with new config?" msgstr "Voleu reiniciar la sessió X de l'equip %s amb la nova configuració?" #: ../tcosmonitor/extensions/restartxorg.py:64 #, python-format msgid "%s is not supported to restart Xorg!" msgstr "" #: ../tcosmonitor/extensions/restartxorg.py:78 msgid "No thin clients found." msgstr "No s'ha trobat cap client" #: ../tcosmonitor/extensions/restartxorg.py:81 #, python-format msgid "Do you want to restart X screens (only thin clients):%s?" msgstr "Voleu reiniciar les X (només dels clients lleugers):%s?" #: ../tcosmonitor/extensions/italc.py:51 ../tcosmonitor/extensions/vnc.py:135 msgid "No user logged." msgstr "No hi ha cap usuari connectat" #: ../tcosmonitor/extensions/italc.py:75 msgid "Can't start IVS, please add iTALC support" msgstr "" #: ../tcosmonitor/extensions/tcospersonalize.py:54 #, python-format msgid "%s is not supported to personalize!" msgstr "" #: ../tcosmonitor/extensions/vnc.py:71 #, fuzzy, python-format msgid "Do you want to start demo mode the following users: %s?" msgstr "Vol iniciar la manera demostració als usuaris següents:%s?" #: ../tcosmonitor/extensions/vnc.py:83 msgid "Waiting for start demo mode..." msgstr "Esperant l'inici del mode demostració..." #: ../tcosmonitor/extensions/vnc.py:116 ../tcosmonitor/extensions/vnc.py:426 #, python-format msgid "Running in demo mode with %s clients." msgstr "Mode demostració amb %s clients." #: ../tcosmonitor/extensions/vnc.py:127 #, fuzzy, python-format msgid "Running in demo mode from server. Demo Nº %s" msgstr "Treballant en mode demostració des del servidor" #: ../tcosmonitor/extensions/vnc.py:149 ../tcosmonitor/extensions/vnc.py:369 #, fuzzy, python-format msgid "Connecting with %s to start VNC support" msgstr "Connectant amb %s per obtenir informació..." #: ../tcosmonitor/extensions/vnc.py:178 #, fuzzy, python-format msgid "" "Can't start VNC, error:\n" "%s" msgstr "Ha estat impossible fer la captura, error: %s" #: ../tcosmonitor/extensions/vnc.py:182 #, fuzzy msgid "Waiting for start of VNC server..." msgstr "Esperant l'inici del mode demostració..." #: ../tcosmonitor/extensions/vnc.py:211 msgid "Can't start VNC, please add X11VNC support" msgstr "" #: ../tcosmonitor/extensions/vnc.py:237 msgid "Switch to view only" msgstr "" #: ../tcosmonitor/extensions/vnc.py:242 ../tcosmonitor/extensions/vnc.py:273 #, fuzzy msgid "Switch to full control" msgstr "Accions controlades" #: ../tcosmonitor/extensions/vnc.py:269 #, python-format msgid "VNC host %s" msgstr "" #: ../tcosmonitor/extensions/vnc.py:281 msgid "Switch to fullscreen" msgstr "" #: ../tcosmonitor/extensions/vnc.py:290 #: ../tcosmonitor/extensions/livevnc.py:72 #: ../tcosmonitor/TcosPreferences.py:539 ../tcosmonitor/TcosExtensions.py:338 msgid "Stop" msgstr "Stop" #: ../tcosmonitor/extensions/vnc.py:342 msgid "Can't start demo mode, user is not logged" msgstr "No es pot començar el mode demostració: l'usuari no està connectat." #: ../tcosmonitor/extensions/vnc.py:345 #, fuzzy, python-format msgid "Do you want demo mode from user %s?" msgstr "Voleu entrar en mode demostració des de l'equip %s?" #: ../tcosmonitor/extensions/vnc.py:392 #, fuzzy, python-format msgid "Waiting for start demo mode from user %s..." msgstr "Esperant l'inici del mode demo des de %s..." #: ../tcosmonitor/extensions/vnc.py:446 #, fuzzy, python-format msgid "Running in demo mode from user %(host)s. Demo Nº %(count)s" msgstr "Mode demostració des de %s" #: ../tcosmonitor/extensions/vnc.py:501 msgid "Demo mode off." msgstr "Demo mode off." #: ../tcosmonitor/extensions/wakeonlan.py:50 #: ../tcosmonitor/extensions/wakeonlan.py:75 msgid "" "Wake On Lan only works with static list.\n" "\n" "Enable scan method \"static\" in Preferences\n" "and (wake on lan) support in bios of clients." msgstr "" #: ../tcosmonitor/extensions/wakeonlan.py:54 #, python-format msgid "Do you want boot %s client?" msgstr "Voleu iniciar %s?" #: ../tcosmonitor/extensions/wakeonlan.py:67 #: ../tcosmonitor/extensions/wakeonlan.py:91 #, fuzzy, python-format msgid "No register MAC address for ip: \"%s\"" msgstr "L'adreça MAC no és vàlida: \"%s\"" #: ../tcosmonitor/extensions/wakeonlan.py:71 #: ../tcosmonitor/extensions/wakeonlan.py:98 #, python-format msgid "Not valid MAC address: \"%s\"" msgstr "L'adreça MAC no és vàlida: \"%s\"" #: ../tcosmonitor/extensions/wakeonlan.py:79 msgid "Do you want boot all clients?" msgstr "Voleu iniciar tots els clients?" #: ../tcosmonitor/extensions/livevnc.py:76 #, fuzzy msgid "Live view of all hosts" msgstr "Captures de pantalla de tots els equips" #: ../tcosmonitor/extensions/livevnc.py:194 msgid "Running in LiveView mode" msgstr "" #: ../tcosmonitor/extensions/viewproc.py:48 msgid "Can't show runnings apps, user is not logged" msgstr "" "No s'han pogut mostrar els programes en execució: no hi ha cap sessió " "d'usuari oberta." #: ../tcosmonitor/extensions/viewproc.py:58 msgid "User not connected, no processes." msgstr "No hi cap usuari, per tant, no hi ha processos." #: ../tcosmonitor/extensions/viewproc.py:76 #, python-format msgid "Running processes for user \"%s\": " msgstr "Processos en execució de l'usuari \"%s\":" #: ../tcosmonitor/extensions/viewproc.py:80 msgid "" "ALERT: There are some system process hidden. Enable it in Preferences dialog." msgstr "" #: ../tcosmonitor/extensions/viewproc.py:85 msgid "Pid" msgstr "PID" #: ../tcosmonitor/extensions/viewproc.py:86 #, fuzzy msgid "Process command" msgstr "Informació dels processos" #: ../tcosmonitor/extensions/viewproc.py:91 msgid "Kill this process" msgstr "Finalitza aquest procés" #: ../tcosmonitor/extensions/viewproc.py:127 msgid "Are you sure you want to stop this process?" msgstr "Esteu segur/a de voler aturar el procés?" #: ../tcosmonitor/extensions/viewproc.py:136 #, python-format msgid "" "Error while killing app:\n" "Reason: %s" msgstr "" "Error en el tancament de l'aplicació:\n" "Motiu: %s" #: ../tcosmonitor/extensions/audiortp.py:49 #: ../ui/tcosmonitor-mainwindow.ui:163 #, fuzzy msgid "Send audio conference" msgstr "Mode audioconferència" #: ../tcosmonitor/extensions/audiortp.py:50 #: ../ui/tcosmonitor-prefwindow.ui:1507 #, fuzzy msgid "Audio chat conference" msgstr "Mode audioconferència" #: ../tcosmonitor/extensions/audiortp.py:51 #: ../ui/tcosmonitor-mainwindow.ui:275 msgid "Audio chat list" msgstr "" #: ../tcosmonitor/extensions/audiortp.py:52 #, fuzzy msgid "Send audio conference (from this host)" msgstr "Mode demostració (des d'aquest equip)" #: ../tcosmonitor/extensions/audiortp.py:73 msgid "Emission" msgstr "" #: ../tcosmonitor/extensions/audiortp.py:79 #, fuzzy msgid "State" msgstr "Desa" #: ../tcosmonitor/extensions/audiortp.py:83 #, fuzzy msgid "Channel" msgstr "Anul·la" #: ../tcosmonitor/extensions/audiortp.py:235 #: ../tcosmonitor/extensions/audiortp.py:322 #: ../tcosmonitor/extensions/audiortp.py:413 msgid "" "Your pulseaudio server is too old.\n" "Is required pulseaudio version >= 0.9.10" msgstr "" #: ../tcosmonitor/extensions/audiortp.py:238 #, fuzzy, python-format msgid "Do you want to start audio conference to the following users: %s?" msgstr "Vol iniciar la manera conferència als usuaris següents:%s?" #: ../tcosmonitor/extensions/audiortp.py:243 #, fuzzy msgid "You have entered in audio conference" msgstr "Mode audioconferència" #: ../tcosmonitor/extensions/audiortp.py:267 #, fuzzy msgid "Waiting for start audio conference..." msgstr "Esperant l'inici del mode conferència..." #: ../tcosmonitor/extensions/audiortp.py:295 #: ../tcosmonitor/extensions/audiortp.py:390 #, fuzzy, python-format msgid "Running in audio conference with %s clients." msgstr "Mode demostració amb %s clients." #: ../tcosmonitor/extensions/audiortp.py:305 #, fuzzy, python-format msgid "Running in audio conference from server. Conference Nº %s" msgstr "Treballant en mode demostració des del servidor" #: ../tcosmonitor/extensions/audiortp.py:316 #, fuzzy msgid "Can't start conference mode, user is not logged" msgstr "No es pot començar el mode demostració: l'usuari no està connectat." #: ../tcosmonitor/extensions/audiortp.py:325 #, fuzzy, python-format msgid "Do you want audio conference from user %s?" msgstr "Voleu entrar en mode demostració des de l'equip %s?" #: ../tcosmonitor/extensions/audiortp.py:331 #, fuzzy, python-format msgid "You have entered in audio conference from user %s" msgstr "Voleu entrar en mode demostració des de l'equip %s?" #: ../tcosmonitor/extensions/audiortp.py:359 #, fuzzy, python-format msgid "Waiting for start audio conference from user %s..." msgstr "Esperant l'inici del mode demo des de %s..." #: ../tcosmonitor/extensions/audiortp.py:400 #, fuzzy, python-format msgid "Running in audio conference from user %(host)s. Conference Nº %(count)s" msgstr "Treballant en mode demostració des del servidor" #: ../tcosmonitor/extensions/audiortp.py:416 #, fuzzy, python-format msgid "Do you want to start audio chat conference to the following users: %s?" msgstr "Vol iniciar la manera conferència als usuaris següents:%s?" #: ../tcosmonitor/extensions/audiortp.py:421 #, fuzzy, python-format msgid "You have entered in audio chat conference. Participants: %s" msgstr "Voleu entrar en mode demostració des de l'equip %s?" #: ../tcosmonitor/extensions/audiortp.py:443 #, fuzzy msgid "Waiting for start audio chat conference..." msgstr "Esperant l'inici del mode conferència..." #: ../tcosmonitor/extensions/audiortp.py:449 #, fuzzy msgid "Do you want to connect to this audio chat conference now?" msgstr "Vol iniciar la manera conferència als usuaris següents:%s?" #: ../tcosmonitor/extensions/audiortp.py:483 #, fuzzy, python-format msgid "Running in audio chat conference with %s clients." msgstr "Mode demostració amb %s clients." #: ../tcosmonitor/extensions/audiortp.py:495 #, fuzzy, python-format msgid "Running in audio chat conference. Conference Nº %s" msgstr "Treballant en mode demostració des del servidor" #: ../tcosmonitor/extensions/audiortp.py:521 msgid "Conference mode off." msgstr "Mode conferència desactivat." #: ../tcosmonitor/extensions/audiortp.py:540 #, fuzzy msgid "Audio chat conference off." msgstr "Mode audioconferència" #: ../tcosmonitor/TcosXmlRpc.py:85 msgid "" "Username or password are empty,\n" "please edit in preferences dialog!" msgstr "" "Nom d'usuari o contrasenya buits,\n" "modifiqueu-ho, per favor, en preferències!" #: ../tcosmonitor/TcosIconView.py:55 msgid "Place mouse on any computer to see brief info about it." msgstr "" #: ../tcosmonitor/TcosListView.py:82 msgid "Active" msgstr "Actiu" #: ../tcosmonitor/TcosListView.py:92 msgid "Screen Blocked" msgstr "Blocada" #: ../tcosmonitor/TcosListView.py:97 msgid "Num of process" msgstr "Nre de processos" #: ../tcosmonitor/TcosListView.py:112 msgid "Sel" msgstr "Sel" #: ../tcosmonitor/TcosListView.py:148 #, python-format msgid "Error connecting to tcosxmlrpc in %s" msgstr "Error en la connexió a tcosxmlrpc en %s" #: ../tcosmonitor/TcosTrayIcon2.py:154 #, fuzzy, python-format msgid "Floppy: %s" msgstr "Disquet" #: ../tcosmonitor/TcosTrayIcon2.py:156 #, fuzzy, python-format msgid "CDROM: %s" msgstr "ERROR: %s" #: ../tcosmonitor/TcosTrayIcon2.py:158 #, fuzzy, python-format msgid "USB: %s" msgstr "Dispositiu USB %s" #: ../tcosmonitor/TcosTrayIcon2.py:160 #, fuzzy, python-format msgid "HDD partition: %s" msgstr "Partició %s" #: ../tcosmonitor/TcosTrayIcon2.py:162 #, fuzzy, python-format msgid "Unknow: %s" msgstr "desconegut" #: ../tcosmonitor/Initialize.py:217 msgid "GPL-2 license file not found" msgstr "No s" #: ../tcosmonitor/LocalData.py:212 #, python-format msgid "Selected network inteface (%s) don't have IP address" msgstr "La interfície de xarxa (%s) no té cap adreça IP" #: ../tcosmonitor/LocalData.py:260 ../tcosmonitor/ping.py:108 #: ../tcosmonitor/ping.py:171 msgid "Testing if found clients have 8998 or 8999 port open..." msgstr "" "Comprovant si els clients que s'han trobat tenen el port 8998 o 8999 obert..." #: ../tcosmonitor/LocalData.py:282 msgid "" "Static list method configured but no hosts in list.\n" "\n" "Please, open preferences, click on 'Open Static Host list' and add some " "hosts." msgstr "" "Heu configurat el sistema per a usar el mètode de llista estàtica, però no " "hi ha cap equip en la llista.\n" "Per favor, aneu a preferències, feu clic sobre \"Obre llista estàtica " "d'equips i afegiu-n'hi algun." #: ../tcosmonitor/TcosPreferences.py:264 msgid "" "You have select more than 5 button menus.\n" "Only allowed to select a maximum of 5 buttons." msgstr "" #: ../tcosmonitor/TcosPreferences.py:275 msgid "New settings saved." msgstr "S'ha desat la configuració." #: ../tcosmonitor/TcosMenus.py:102 ../tcosmonitor/TcosMenus.py:114 #, python-format msgid "Actions for %s" msgstr "Accions per a %s" #: ../tcosmonitor/TcosMenus.py:107 msgid "Actions for selected host" msgstr "Accions per a l'ordinador seleccionat" #: ../tcosmonitor/TcosMenus.py:168 ../tcosmonitor/TcosMenus.py:299 #, python-format msgid "%d hidden actions" msgstr "" #: ../tcosmonitor/TcosMenus.py:243 ../tcosmonitor/TcosMenus.py:245 msgid "Actions for selected hosts" msgstr "Accions per als ordinadors seleccionats" #: ../tcosmonitor/TcosMenus.py:247 msgid "Actions for all hosts" msgstr "Accions per a tots els ordinadors" #: ../tcosmonitor/TcosMenus.py:304 msgid "Save hosts positions" msgstr "" #: ../tcosmonitor/TcosMenus.py:312 msgid "Reset hosts positions" msgstr "" #: ../tcosmonitor/ping.py:80 #, python-format msgid "Ping to %s..." msgstr "Ping a %s..." #: ../tcosmonitor/ping.py:89 msgid "Waiting for pings..." msgstr "Esperant pings..." #: ../tcosmonitor/ping.py:127 ../tcosmonitor/ping.py:192 #: ../tcosmonitor/TcosActions.py:185 ../tcosmonitor/TcosActions.py:264 msgid "Not connected hosts found." msgstr "No s'ha trobat cap equip." #: ../tcosmonitor/ping.py:134 ../tcosmonitor/ping.py:197 #: ../tcosmonitor/TcosActions.py:187 ../tcosmonitor/TcosActions.py:259 #, python-format msgid "Found %d hosts" msgstr "S'han trobat %d equips" #: ../tcosmonitor/TcosActions.py:162 ../tcosmonitor/TcosActions.py:241 msgid "Searching for connected hosts..." msgstr "Buscant equips connectats..." #: ../tcosmonitor/TcosActions.py:1019 msgid "Searching info of hosts..." msgstr "Cercant informació sobre els equips..." #: ../tcosmonitor/TcosActions.py:1058 #, python-format msgid "Connecting to %s..." msgstr "Connectant amb %s..." #: ../tcosmonitor/TcosExtensions.py:41 msgid "Exception:" msgstr "" #: ../tcosmonitor/TcosExtensions.py:77 msgid "Error: no IP!" msgstr "" #: ../tcosmonitor/TcosExtensions.py:154 msgid "No clients connected, press refresh button." msgstr "No consta cap equip connectat: feu clic en 'refrescar'." #: ../tcosmonitor/TcosExtensions.py:251 ../tcosmonitor/TcosExtensions.py:253 #, fuzzy, python-format msgid "Can't exec this action at '%s' because you are connected at this host!" msgstr "" "No s'ha pogut executar l'ordre perquè no hi ha connexió amb aquest equip!" #: ../tcosmonitor/TcosExtensions.py:267 #, python-format msgid "Doing action \"%(action)s\" in %(ip)s..." msgstr "" #: ../tcosmonitor/TcosExtensions.py:285 #, python-format msgid "Done action \"%(action)s\" in %(ip)s" msgstr "" #: ../tcosmonitor/TcosCommon.py:89 #, python-format msgid "" "ThreadController: Found error executing %(cmd)s\n" "\n" "If problem persist, disable Thread Controller\n" "in Preferences and report bug.\n" "Error=%(error)s" msgstr "" #: ../ui/tcosmonitor-prefwindow.ui:35 ../ui/tcospersonalize.ui:7 #: ../ui/tcosmonitor-mainwindow.ui:36 msgid "Preferences" msgstr "Preferències" #: ../ui/tcosmonitor-prefwindow.ui:62 msgid "Show host list on startup" msgstr "Mostra la llista d'equips a l'inici" #: ../ui/tcosmonitor-prefwindow.ui:80 msgid "Scan network method" msgstr "Mètode de escanejat de la xarxa" #: ../ui/tcosmonitor-prefwindow.ui:91 msgid "" "Network interface\n" "(thin client)" msgstr "" "Interfície de xarxa\n" "(client)" #: ../ui/tcosmonitor-prefwindow.ui:127 msgid "Show system process" msgstr "Mostra processos del sistema" #: ../ui/tcosmonitor-prefwindow.ui:144 #, fuzzy msgid "Don't do actions when running TcosMonitor in thin client" msgstr "No duu a terme accions quan TcosMonitor s'executa en un client" #: ../ui/tcosmonitor-prefwindow.ui:163 msgid "List of hosts" msgstr "Llista d'equips" #: ../ui/tcosmonitor-prefwindow.ui:200 msgid "Open static host list" msgstr "Obre llista fixa d'equips" #: ../ui/tcosmonitor-prefwindow.ui:225 msgid "Only show hosts running tcosxmlrpc (8998 port)" msgstr "Mostra només els equips que executen tcosxmlrpc (port 8080)" #: ../ui/tcosmonitor-prefwindow.ui:242 #, fuzzy msgid "Only do all actions on selected hosts (requires restart TcosMonitor)" msgstr "" "Executa accions només en els equips selecionats (cal reiniciar TcosMonitor)" #: ../ui/tcosmonitor-prefwindow.ui:259 msgid "Enable SSL connections to XMLRPC clients" msgstr "" #: ../ui/tcosmonitor-prefwindow.ui:278 #, fuzzy msgid "Host list mode" msgstr "Equip" #: ../ui/tcosmonitor-prefwindow.ui:302 msgid "Show right menu with groups (NEW)" msgstr "" #: ../ui/tcosmonitor-prefwindow.ui:319 #, fuzzy msgid "Don't show thin client if TcosMonitor is running there" msgstr "No duu a terme accions quan TcosMonitor s'executa en un client" #: ../ui/tcosmonitor-prefwindow.ui:351 msgid "Settings" msgstr "Configuració" #: ../ui/tcosmonitor-prefwindow.ui:376 msgid "Update host list every (seg)" msgstr "Actualitza la llista d'equips cada (segons)" #: ../ui/tcosmonitor-prefwindow.ui:389 msgid "" "Update host list every selected seconds.\n" "\n" "Value=0 disable update." msgstr "" "Actualitza la llista d'equips amb el període indicat.\n" "\n" "Valor=0 desactiva l'actualització." #: ../ui/tcosmonitor-prefwindow.ui:405 msgid "Cache timeout (seg)" msgstr "Temps de vida en la memòria cau (segons)" #: ../ui/tcosmonitor-prefwindow.ui:419 msgid "" "Cache some data and connection status during selected seconds.\n" "\n" "Value=0 disable cache." msgstr "" "Conservar dades i status de connexió durant el temps indicat (segons)\n" "Valor=0 desactiva la memòria cau" #: ../ui/tcosmonitor-prefwindow.ui:437 msgid "Screenshot size:" msgstr "Dimensions de la captura de pantalla:" #: ../ui/tcosmonitor-prefwindow.ui:450 ../ui/tcosmonitor-prefwindow.ui:479 msgid "% Size of screnshot." msgstr "% Dimensions de la captura de pantalla." #: ../ui/tcosmonitor-prefwindow.ui:466 msgid "Mini screenshot size:" msgstr "Mini captures de pantalla:" #: ../ui/tcosmonitor-prefwindow.ui:495 msgid "Timeout actions (seg)" msgstr "Temps de vida en les accions (segons)" #: ../ui/tcosmonitor-prefwindow.ui:508 msgid "" "Timeout in seg for actions\n" "\n" "Value=0 default" msgstr "" #: ../ui/tcosmonitor-prefwindow.ui:526 msgid "SSH remote username" msgstr "Nom d'usuari remot per a SSH" #: ../ui/tcosmonitor-prefwindow.ui:553 msgid "VLC method to send" msgstr "" #: ../ui/tcosmonitor-prefwindow.ui:578 msgid "" "Experimental: Thread Controller\n" "( if you have problems, disable it )" msgstr "" #: ../ui/tcosmonitor-prefwindow.ui:591 msgid "Actions controlled" msgstr "Accions controlades" #: ../ui/tcosmonitor-prefwindow.ui:611 msgid "Block ports: (80,8080... etc)" msgstr "Bloca ports: (80, 8080, etc.)" #: ../ui/tcosmonitor-prefwindow.ui:653 ../ui/tcospersonalize.ui:333 msgid "Advanced" msgstr "Avançat" #: ../ui/tcosmonitor-prefwindow.ui:680 msgid "TcosXmlRpc username" msgstr "Nom d'usuari per a TcosXmlRpc" #: ../ui/tcosmonitor-prefwindow.ui:706 msgid "TcosXmlRpc password" msgstr "Contrasenya per a TcosXmlRpc" #: ../ui/tcosmonitor-prefwindow.ui:735 msgid "" "NOTE:\n" "Default user is root and default password is root.\n" "\n" "For thin clients change TCOS_ROOT_PASSWD or use TcosConfig and " "regenerate boot images again.\n" "\n" "For standalone users you can use a system account (root) but this is " "not recomended. Install tcos-standalone and start it by root. Set user and " "password, this will create a /etc/tcospasswd file only used by TCOS " "and your root acount will be secure." msgstr "" #: ../ui/tcosmonitor-prefwindow.ui:772 msgid "Authentication " msgstr "Autenticació " #: ../ui/tcosmonitor-prefwindow.ui:795 msgid "Info avalaible from tcosxmlrpc" msgstr "Informació disponible de tcosxmlrpc" #: ../ui/tcosmonitor-prefwindow.ui:806 msgid "Tcos general info" msgstr "Informació general de Tcos" #: ../ui/tcosmonitor-prefwindow.ui:821 msgid "Cpu info" msgstr "Informació de la CPU" #: ../ui/tcosmonitor-prefwindow.ui:836 msgid "Kernel and modules info" msgstr "Informació del nucli i dels mòduls" #: ../ui/tcosmonitor-prefwindow.ui:851 msgid "PCI bus info" msgstr "Informació del bus PCI" #: ../ui/tcosmonitor-prefwindow.ui:866 msgid "Ram and swap info" msgstr "Informació de la RAM i la memòria d'intercanvi" #: ../ui/tcosmonitor-prefwindow.ui:881 msgid "Process info" msgstr "Informació dels processos" #: ../ui/tcosmonitor-prefwindow.ui:896 msgid "Network info" msgstr "Informació de la xarxa" #: ../ui/tcosmonitor-prefwindow.ui:926 msgid "Sound server info" msgstr "Informació del servidor de so" #: ../ui/tcosmonitor-prefwindow.ui:962 msgid "Avalaible info" msgstr "Informació disponible" #: ../ui/tcosmonitor-prefwindow.ui:985 msgid "Show / hide menu items" msgstr "Mostra / oculta elements al menú" #: ../ui/tcosmonitor-prefwindow.ui:1003 msgid "Lock and unlock screen" msgstr "Blocar i desblocar les pantalles" #: ../ui/tcosmonitor-prefwindow.ui:1019 msgid "Remote SSH shell" msgstr "Shell SSH remota" #: ../ui/tcosmonitor-prefwindow.ui:1037 msgid "Configure Xorg settings" msgstr "Configurar Xorg" #: ../ui/tcosmonitor-prefwindow.ui:1066 ../ui/tcosmonitor-prefwindow.ui:1427 msgid "Exe app on user display" msgstr "Executa programa en la pantalla de l'usuari" #: ../ui/tcosmonitor-prefwindow.ui:1082 ../ui/tcosmonitor-prefwindow.ui:1441 msgid "Send a text message" msgstr "Enviar missatges de text" #: ../ui/tcosmonitor-prefwindow.ui:1100 msgid "Show running apps" msgstr "Mostra els programes que s'executen en aquest client" #: ../ui/tcosmonitor-prefwindow.ui:1116 ../ui/tcosmonitor-prefwindow.ui:1457 msgid "Send video broadcast" msgstr "Enviar vídeo" #: ../ui/tcosmonitor-prefwindow.ui:1150 msgid "Demo mode" msgstr "Mode demostració" #: ../ui/tcosmonitor-prefwindow.ui:1179 msgid "Wake on LAN" msgstr "" #: ../ui/tcosmonitor-prefwindow.ui:1195 msgid "Audio conference mode" msgstr "Mode audioconferència" #: ../ui/tcosmonitor-prefwindow.ui:1213 msgid "Screenshots" msgstr "Captura de pantalla" #: ../ui/tcosmonitor-prefwindow.ui:1229 msgid "Reboot and poweroff" msgstr "Reiniciar i apagar" #: ../ui/tcosmonitor-prefwindow.ui:1243 msgid "Lock and unlock internet" msgstr "Activar i desactivar la connexió a Internet" #: ../ui/tcosmonitor-prefwindow.ui:1259 #, fuzzy msgid "DPMS monitor on/off" msgstr "Control d'energia del monitor DPMS" #: ../ui/tcosmonitor-prefwindow.ui:1277 msgid "Connect using VNC" msgstr "Connectar per VNC" #: ../ui/tcosmonitor-prefwindow.ui:1293 msgid "Connect using iTALC" msgstr "Connectar per iTALC" #: ../ui/tcosmonitor-prefwindow.ui:1308 msgid "Restart session with new settings" msgstr "Reiniciar la sessió amb la nova configuració" #: ../ui/tcosmonitor-prefwindow.ui:1385 msgid "Menus" msgstr "Menús" #: ../ui/tcosmonitor-prefwindow.ui:1408 #, fuzzy msgid "Show / hide menu buttons" msgstr "Mostra / oculta elements al menú" #: ../ui/tcosmonitor-prefwindow.ui:1491 #, fuzzy msgid "Audio conference" msgstr "Mode audioconferència" #: ../ui/tcosmonitor-prefwindow.ui:1525 #, fuzzy msgid "Audio Chat control" msgstr "Control de volum de PulseAudio" #: ../ui/tcosmonitor-prefwindow.ui:1569 msgid "Menu buttons" msgstr "" #: ../ui/tcosmonitor-abouttcos.ui:6 msgid "About TCOS" msgstr "Quant a TCOS" #: ../ui/tcosmonitor-abouttcos.ui:19 msgid "TcosMonitor" msgstr "TcosMonitor" #: ../ui/tcosmonitor-abouttcos.ui:62 msgid "Version:" msgstr "Versió:" #: ../ui/tcosmonitor-abouttcos.ui:90 msgid "" "Thin client and standalone\n" "monitoring tool." msgstr "" "Programa de monitorització\n" " de clients lleugers i d'ordinadors autònoms." #: ../ui/tcosmonitor-abouttcos.ui:131 msgid "Project web site" msgstr "Pàgina del projecte" #: ../ui/tcosmonitor-abouttcos.ui:178 msgid "About" msgstr "Quant a..." #: ../ui/tcosmonitor-abouttcos.ui:212 msgid "License" msgstr "Llicència" #: ../ui/tcosmonitor-abouttcos.ui:230 msgid "" "Main developers:\n" " * Mario Izquierdo \n" " * Ignacio Vidal \n" "\n" "Contributors:\n" " * Andrés Jimenez\n" " * Quirón\n" "\n" "Special thanks to:\n" " Comunidad de Madrid, MaX group (Spain)" msgstr "" "Desenvolupadors principals:\n" " * Mario Izquierdo \n" " * Ignacio Vidal \n" "\n" "Contribuïdors:\n" " * Andrés Jimenez\n" " * Quirón\n" "\n" "Agraïments especials a:\n" " Comunidad de Madrid, MaX group (Spain)" #: ../ui/tcosmonitor-abouttcos.ui:259 msgid "Authors" msgstr "Autors" #: ../ui/tcosmonitor-abouttcos.ui:275 msgid "Translated to your language by:" msgstr "Traduït al català per:" #: ../ui/tcosmonitor-abouttcos.ui:287 msgid "Mario Izquierdo " msgstr "Carles Sadurní " #: ../ui/tcosmonitor-abouttcos.ui:307 msgid "Translators" msgstr "Traductors" #: ../ui/tcosmonitor-abouttcos.ui:324 msgid "" "TCOS is a free software project that need a lot of work to be the best thin " "client plataform.\n" "\n" "We work every day a lot of hours to make changes and support more devices " "and features.\n" "\n" "We want to continue developing this software but need your help, if you use, " "sell or hack TCOS pehaps you could donate some money to project.\n" "\n" "Click on next url to get some info." msgstr "" "TCOS és un projecte de software lliure que requereix molta dedicació per a " "ser la millor plataforma de clients lleugers.\n" "\n" "Treballem cada dia moltes hores per a fer canvis, afegir noves " "característiques i donar suport a nous dispositius.\n" "\n" "Volem continuar desenvolupant aquest programa, però ens cal la vostra ajuda. " "Si useu, veneu o modifiqueu TCOS potser podríeu fer una donació al " "projecte.\n" "\n" "Feu clic en l'adreça següent si en voleu més informació." #: ../ui/tcosmonitor-abouttcos.ui:370 msgid "http://wiki.tcosproject.org/TcosProject:Site_support" msgstr "" #: ../ui/tcosmonitor-abouttcos.ui:392 msgid "Don't show donations message on start." msgstr "No mostrar els missatges de sol·licitud de donacions." #: ../ui/tcosmonitor-abouttcos.ui:415 msgid "Donate" msgstr "Donacions" #: ../ui/tray.ui:20 msgid "TCOS devices" msgstr "" #: ../ui/tray.ui:57 msgid "Hide" msgstr "" #: ../ui/tcos-volume-manager.ui:39 msgid "Restart sound" msgstr "" #: ../ui/tcos-volume-manager.ui:54 msgid "Sound levels" msgstr "Nivells d'audio" #: ../ui/tcos-volume-manager.ui:90 msgid "Main Channels" msgstr "Canals principals" #: ../ui/tcos-volume-manager.ui:113 msgid "Secondary Channels" msgstr "Canals secundaris" #: ../ui/tcosmonitor-chatwindow.ui:8 msgid "Chat emission list" msgstr "" #: ../ui/tcosmonitor-chatwindow.ui:17 #, fuzzy msgid "Chat emission list" msgstr "Llista d'equips" #: ../ui/tcosmonitor-chatwindow.ui:80 msgid "Connect" msgstr "" #: ../ui/tcosmonitor-chatwindow.ui:128 msgid "Disconnect" msgstr "" #: ../ui/tcosmonitor-chatwindow.ui:176 #, fuzzy msgid "Exit" msgstr "Eixint" #: ../ui/tcosmonitor-staticwindow.ui:8 msgid "Static hosts list" msgstr "Llista d'equips" #: ../ui/tcosmonitor-staticwindow.ui:17 msgid "Static Hosts list" msgstr "Llista d'equips" #: ../ui/tcosmonitor-staticwindow.ui:80 msgid "Add" msgstr "Afegeix" #: ../ui/tcosmonitor-staticwindow.ui:128 msgid "Modify" msgstr "Modifica" #: ../ui/tcosmonitor-staticwindow.ui:176 msgid "Delete" msgstr "Elimina" #: ../ui/tcosmonitor-staticwindow.ui:225 msgid "Get from connected" msgstr "" #: ../ui/tcosmonitor-staticwindow.ui:292 ../ui/tcosmonitor-mainwindow.ui:771 #: ../ui/tcosmonitor-staticwindownew.ui:150 msgid "Cancel" msgstr "Anul·la" #: ../ui/tcosmonitor-staticwindow.ui:340 #: ../ui/tcosmonitor-staticwindownew.ui:198 msgid "Save" msgstr "Desa" #: ../ui/tcospersonalize.ui:34 msgid "unknow host" msgstr "equip desconegut" #: ../ui/tcospersonalize.ui:74 msgid "Disable Ctrl + Alt + Backspace (for kill Xorg)" msgstr "Desactivar Ctrl + Alt + Backspace (per a tancar Xorg)" #: ../ui/tcospersonalize.ui:211 msgid "Get avalaible drivers" msgstr "Obtín els drivers disponibles" #: ../ui/tcospersonalize.ui:248 msgid "Display Settings" msgstr "Configuració gràfica" #: ../ui/tcospersonalize.ui:351 msgid "Default boot kernel" msgstr "" #: ../ui/tcospersonalize.ui:376 msgid "PXE Boot options" msgstr "" #: ../ui/tcospersonalize.ui:391 msgid "Default boot method" msgstr "" #: ../ui/tcospersonalize.ui:419 msgid "Command line" msgstr "" #: ../ui/tcospersonalize.ui:507 msgid "Boot options" msgstr "" #: ../ui/tcospersonalize.ui:551 msgid "Delete Config" msgstr "Elimina configuració" #: ../ui/tcosmonitor-mainwindow.ui:8 msgid "TcosMonitor" msgstr "TcosMonitor" #: ../ui/tcosmonitor-mainwindow.ui:22 msgid "Exit TcosMonitor" msgstr "Ix de TcosMonitor" #: ../ui/tcosmonitor-mainwindow.ui:35 msgid "Open preferences dialog" msgstr "Obre preferències" #: ../ui/tcosmonitor-mainwindow.ui:48 msgid "Update host list" msgstr "Actualitzar la llista d'equips" #: ../ui/tcosmonitor-mainwindow.ui:49 msgid "Refresh" msgstr "Actualitza" #: ../ui/tcosmonitor-mainwindow.ui:71 msgid "All Hosts" msgstr "Tots els equips" #: ../ui/tcosmonitor-mainwindow.ui:99 msgid "Find" msgstr "" #: ../ui/tcosmonitor-mainwindow.ui:111 msgid "About this app" msgstr "Quant a..." #: ../ui/tcosmonitor-mainwindow.ui:219 msgid "Start audio chat" msgstr "" #: ../ui/tcosmonitor-mainwindow.ui:331 #, fuzzy msgid "Send audio/video" msgstr "Selecciona fitxer d'audio o de vídeo." #: ../ui/tcosmonitor-mainwindow.ui:443 msgid "Exe app" msgstr "" #: ../ui/tcosmonitor-mainwindow.ui:499 #, fuzzy msgid "Send message" msgstr "Enviar missatges de text" #: ../ui/tcosmonitor-mainwindow.ui:581 msgid "List view" msgstr "" #: ../ui/tcosmonitor-mainwindow.ui:629 msgid "Icon view" msgstr "" #: ../ui/tcosmonitor-mainwindow.ui:689 msgid "Simulate my classroom" msgstr "" #: ../ui/tcosmonitor-staticwindownew.ui:8 msgid "New or edit hosts" msgstr "Nou o edita equips" #: ../ui/tcosmonitor-staticwindownew.ui:32 msgid "" "You can add a simple host, \n" " example: 192.168.0.100\n" "\n" "or range of hosts, \n" " example: 192.168.0.100-120\n" "\n" "MAC address is optional" msgstr "" "Podeu afegir un únic equip, \n" " per exemple: 192.168.0.100\n" "\n" "o un interval d'equips, \n" " per exemple: 192.168.0.100-120\n" "\n" "l'adreça física (MAC) és opcional" #: ../ui/tcosmonitor-staticwindownew.ui:57 msgid "IP address *" msgstr "Adreça IP" #: ../ui/tcosmonitor-askwindow.ui:8 msgid "Question" msgstr "Pregunta" #: ../ui/tcosmonitor-askwindow.ui:50 msgid "You can drag and drop launcher file to this box" msgstr "Podeu arrossegar i soltar un llançador en aquesta caixa" #: ../ui/tcosmonitor-askwindow.ui:61 msgid "Run app in unknow host" msgstr "Executa programa en equip desconegut" #, fuzzy #~ msgid "Quit from TcosMonitor" #~ msgstr "Ix de TcosMonitor" #, fuzzy #~ msgid "Lliurex Lab" #~ msgstr "TcosMonitor" #, fuzzy #~ msgid "Clonning clients...." #~ msgstr "Connectant amb %s..." #, fuzzy #~ msgid "Clone clients" #~ msgstr "Connectant amb %s..." #, fuzzy #~ msgid "Clone clients (from this host)" #~ msgstr "Mode demostració (des d'aquest equip)" #, fuzzy #~ msgid "No clients to clone." #~ msgstr "No s'ha trobat cap client" #, fuzzy #~ msgid "Do you want to clone the following clients: %s?" #~ msgstr "Voleu apagar els equips següents:%s?" #, fuzzy #~ msgid "Waiting for start clone mode..." #~ msgstr "Esperant l'inici del mode conferència..." #, fuzzy #~ msgid "Select image file to clone.." #~ msgstr "Tria fitxer(s)..." #, fuzzy #~ msgid "Running in clone mode with %s clients." #~ msgstr "Mode demostració amb %s clients." #, fuzzy #~ msgid "Running in clone mode from server. Clone Nº %s" #~ msgstr "Treballant en mode demostració des del servidor" #, fuzzy #~ msgid "Do you want to clone from client %s?" #~ msgstr "Voleu entrar en mode demostració des de l'equip %s?" #, fuzzy #~ msgid "Do you want only create a image from host %s?" #~ msgstr "Voleu entrar en mode demostració des de l'equip %s?" #, fuzzy #~ msgid "Waiting for start clone mode from client %s..." #~ msgstr "Esperant l'inici del mode demo des de %s..." #, fuzzy #~ msgid "Select file to save clone image..." #~ msgstr "Tria fitxer(s)..." #, fuzzy #~ msgid "Running in clone mode from client %(host)s. Clone Nº %(count)s" #~ msgstr "Mode demostració des de %s" #, fuzzy #~ msgid "Clone mode off." #~ msgstr "Mode conferència desactivat." #, fuzzy #~ msgid "Cloning client, please wait..." #~ msgstr "" #~ "Desmuntant el dispositiu %s.\n" #~ "Per favor, espereu..." #~ msgid "" #~ "Error getting Xorg info:\n" #~ "%s" #~ msgstr "" #~ "Error a l'intentar la informació de Xorg:\n" #~ "%s" #, fuzzy #~ msgid "Chat conference mode off." #~ msgstr "Mode conferència desactivat." #~ msgid "No host found" #~ msgstr "No s'han trobat equips" #, fuzzy #~ msgid "Do you want to start conference mode the following users: %s?" #~ msgstr "Vol iniciar la manera conferència als usuaris següents:%s?" #, fuzzy #~ msgid "" #~ "Running in broadcast video transmission to host %(host)s. Broadcast Nº %" #~ "(count)d" #~ msgstr "Difusió de vídeo per a %s" #~ msgid "" #~ "Special characters used in \"%s\".\n" #~ "Please rename it." #~ msgstr "" #~ "No hi pot haver caràcters \"especials\" (accents, etc.) en \"%s\".\n" #~ "Per favor, canvieu-li el nom." #~ msgid "No clients selected, do you want to select all?" #~ msgstr "No heu triat cap equip, voleu seleccionar-los tots?" #, fuzzy #~ msgid "Running in broadcast video transmission" #~ msgstr "Difusió de vídeo." #, fuzzy #~ msgid "Conference chat mode off." #~ msgstr "Mode conferència desactivat." #~ msgid "Can't exec this action because you are connected at this host!" #~ msgstr "" #~ "No s'ha pogut executar l'ordre perquè no hi ha connexió amb aquest equip!" #~ msgid "Can't logout, user is not logged" #~ msgstr "No es pot sortir: no hi ha entrat cap usuari" #~ msgid "Waiting for screenshots..." #~ msgstr "Esperant captures..." #~ msgid "Work as cyber mode (not work yet)" #~ msgstr "Mode ciber (no disponible encara)" #~ msgid "Extra modules" #~ msgstr "Mòduls extra" #~ msgid "Kernel modules" #~ msgstr "Mòduls del kernel" #~ msgid "Extra modules avalaible" #~ msgstr "Moduls extra disponibles" #~ msgid "Add X11vnc support" #~ msgstr "Afegeix suport per a X11vnc" #~ msgid "Add iTALC support" #~ msgstr "Afegeix suport per a iTALC" #~ msgid "Add FreeNX support" #~ msgstr "Afegeix suport per a FreeNX" #~ msgid "Addons" #~ msgstr "Afegits" tcosmonitor/po/tcosmonitor.pot0000664000000000000000000016716612260544373014077 0ustar # SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-03-18 15:48+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../tcosmonitor.py:129 #, python-format msgid "" "The user \"%s\" must be member of the group \"tcos\" to exec tcosmonitor.\n" "\n" "If you are system administrator, add your user to tcos group." msgstr "" #: ../tcosmonitor.py:247 msgid "Send files disabled. rsync not configured." msgstr "" #: ../tcosmonitor.py:329 ../tcospersonalize.py:562 #: ../tcos-volume-manager.py:378 msgid "Exiting" msgstr "" #: ../tcos-devices-ng.py:188 #, python-format msgid "Rebooting in %s seconds" msgstr "" #: ../tcos-devices-ng.py:190 #, python-format msgid "Shutting down in %s seconds" msgstr "" #: ../tcos-devices-ng.py:206 ../tcos-devices-ng.py:209 #, python-format msgid "" "ERROR during action %(action)s:\n" "%(errortxt)s" msgstr "" #: ../tcos-devices-ng.py:239 msgid "Tcos device daemon" msgstr "" #: ../tcos-devices-ng.py:283 ../tcos-volume-manager.py:143 #, python-format msgid "Error connecting with TcosXmlRpc in %s." msgstr "" #: ../tcos-devices-ng.py:314 #, python-format msgid "Cdrom device %s" msgstr "" #: ../tcos-devices-ng.py:317 msgid "Mount Cdrom" msgstr "" #: ../tcos-devices-ng.py:318 msgid "Umount Cdrom" msgstr "" #: ../tcos-devices-ng.py:340 #, python-format msgid "Disk partition %s" msgstr "" #: ../tcos-devices-ng.py:343 msgid "Mount disk partition" msgstr "" #: ../tcos-devices-ng.py:344 msgid "Umount disk partition" msgstr "" #: ../tcos-devices-ng.py:356 msgid "No floppy detected" msgstr "" #: ../tcos-devices-ng.py:368 ../tcos-devices-ng.py:674 #: ../tcos-devices-ng.py:680 ../tcos-devices-ng.py:686 msgid "Floppy" msgstr "" #: ../tcos-devices-ng.py:371 msgid "Mount Floppy" msgstr "" #: ../tcos-devices-ng.py:372 msgid "Umount Floppy" msgstr "" #: ../tcos-devices-ng.py:382 msgid "Floppy mounted. Ready for use." msgstr "" #: ../tcos-devices-ng.py:384 msgid "Floppy umounted. You can extract it." msgstr "" #: ../tcos-devices-ng.py:400 msgid "Hard disk partition mounted. Ready for use." msgstr "" #: ../tcos-devices-ng.py:403 msgid "Hard disk partition umounted." msgstr "" #: ../tcos-devices-ng.py:425 msgid "Audio cdrom mounted., you can listen music opening wav files." msgstr "" #: ../tcos-devices-ng.py:427 msgid "Cdrom mounted. Ready for use." msgstr "" #: ../tcos-devices-ng.py:430 msgid "Cdrom umounted. You can extract it." msgstr "" #: ../tcos-devices-ng.py:529 #, python-format msgid "" "Mounting device %s\n" "Please wait..." msgstr "" #: ../tcos-devices-ng.py:578 msgid "Error mounting LTSPFS, check versions of LTSPFS packages" msgstr "" #: ../tcos-devices-ng.py:604 #, python-format msgid "" "Umounting device %s.\n" "Please wait..." msgstr "" #: ../tcos-devices-ng.py:651 msgid "usbdisk" msgstr "" #: ../tcos-devices-ng.py:653 msgid "firewiredisk" msgstr "" #: ../tcos-devices-ng.py:678 msgid "Can't mount floppy" msgstr "" #: ../tcos-devices-ng.py:689 msgid "Can't umount floppy" msgstr "" #: ../tcos-devices-ng.py:702 ../tcos-devices-ng.py:712 #: ../tcos-devices-ng.py:723 ../tcos-devices-ng.py:836 #: ../tcos-devices-ng.py:848 ../tcos-devices-ng.py:867 #: ../tcos-devices-ng.py:879 ../tcos-devices-ng.py:911 #, python-format msgid "Cdrom_%s" msgstr "" #: ../tcos-devices-ng.py:710 msgid "Can't mount cdrom" msgstr "" #: ../tcos-devices-ng.py:726 msgid "Can't umount cdrom" msgstr "" #: ../tcos-devices-ng.py:742 ../tcos-devices-ng.py:752 #: ../tcos-devices-ng.py:763 #, python-format msgid "Disk_%s" msgstr "" #: ../tcos-devices-ng.py:750 msgid "Can't mount hard disk partition" msgstr "" #: ../tcos-devices-ng.py:766 msgid "Can't umount hard disk partition" msgstr "" #: ../tcos-devices-ng.py:807 #, python-format msgid "" "From terminal %(host)s.\n" "Connected CDROM USB device %(device)s\n" "%(vendor)s %(model)s" msgstr "" #: ../tcos-devices-ng.py:811 #, python-format msgid "CDROM USB device %s" msgstr "" #: ../tcos-devices-ng.py:814 #, python-format msgid "Mount CDROM USB device %s" msgstr "" #: ../tcos-devices-ng.py:815 #, python-format msgid "Umount CDROM USB device %s" msgstr "" #: ../tcos-devices-ng.py:840 ../tcos-devices-ng.py:871 #: ../tcos-devices-ng.py:1001 ../tcos-devices-ng.py:1012 #: ../tcos-devices-ng.py:1058 ../tcos-devices-ng.py:1138 #: ../tcos-devices-ng.py:1149 ../tcos-devices-ng.py:1195 #, python-format msgid "Error, can't mount device %s" msgstr "" #: ../tcos-devices-ng.py:898 #, python-format msgid "" "From terminal %(host)s.\n" "Disconnected CDROM USB device %(device)s\n" "%(vendor)s %(model)s" msgstr "" #: ../tcos-devices-ng.py:926 #, python-format msgid "Can't umount cdrom usb %s" msgstr "" #: ../tcos-devices-ng.py:951 #, python-format msgid "" "From terminal %(host)s.\n" "Connected USB device %(device)s\n" "%(vendor)s %(model)s" msgstr "" #: ../tcos-devices-ng.py:954 #, python-format msgid "" "From terminal %(host)s.\n" "Disconnected USB device %(device)s\n" "%(vendor)s %(model)s" msgstr "" #: ../tcos-devices-ng.py:982 #, python-format msgid "USB device %s" msgstr "" #: ../tcos-devices-ng.py:985 #, python-format msgid "Mount USB device %s" msgstr "" #: ../tcos-devices-ng.py:986 #, python-format msgid "Umount USB device %s" msgstr "" #: ../tcos-devices-ng.py:1088 #, python-format msgid "" "From terminal %(host)s.\n" "Connected Firewire device %(device)s\n" "%(vendor)s %(model)s" msgstr "" #: ../tcos-devices-ng.py:1091 #, python-format msgid "" "From terminal %(host)s.\n" "Disconnected Firewire device %(device)s\n" "%(vendor)s %(model)s" msgstr "" #: ../tcos-devices-ng.py:1119 #, python-format msgid "Firewire device %s" msgstr "" #: ../tcos-devices-ng.py:1122 #, python-format msgid "Mount Firewire device %s" msgstr "" #: ../tcos-devices-ng.py:1123 #, python-format msgid "Umount Firewire device %s" msgstr "" #: ../tcos-devices-ng.py:1206 #, python-format msgid "CDROM USB device %s umounted. You can extract it." msgstr "" #: ../tcos-devices-ng.py:1209 #, python-format msgid "CDROM USB device %s mounted. Ready for use." msgstr "" #: ../tcos-devices-ng.py:1247 #, python-format msgid "USB device %s umounted. You can extract it." msgstr "" #: ../tcos-devices-ng.py:1250 #, python-format msgid "USB device %s mounted. Ready for use." msgstr "" #: ../tcos-devices-ng.py:1286 #, python-format msgid "Firewire device %s umounted. You can extract it." msgstr "" #: ../tcos-devices-ng.py:1289 #, python-format msgid "Firewire device %s mounted. Ready for use." msgstr "" #: ../tcospersonalize.py:115 msgid "" "Need a host to configure!!!\n" "Try exec:\n" " tcospersonalize --host=XXX.XXX.XXX.XXX" msgstr "" #: ../tcospersonalize.py:190 msgid "host: " msgstr "" #: ../tcospersonalize.py:454 msgid "Host down, can't connect to tcosxmlrpc." msgstr "" #: ../tcospersonalize.py:462 #, python-format msgid "New %d drivers loaded from terminal." msgstr "" #: ../tcospersonalize.py:521 #, python-format msgid "Really delete config of %s?" msgstr "" #: ../tcospersonalize.py:524 msgid "Deleted!" msgstr "" #: ../tcos-volume-manager.py:101 ../tcos-volume-manager.py:113 #, python-format msgid "" "Tcos Sound levels on:\n" "%s" msgstr "" #: ../tcos-volume-manager.py:121 #, python-format msgid "ERROR: It appears that TcosXmlRpc is not running on %s." msgstr "" #: ../tcos-volume-manager.py:217 msgid "Loading channels info..." msgstr "" #: ../tcos-volume-manager.py:230 msgid "Error loading channels info (xauth error)" msgstr "" #: ../tcos-volume-manager.py:233 ../ui/tcos-volume-manager.ui:8 msgid "Tcos Volume Manager" msgstr "" #: ../tcos-volume-manager.py:234 #, python-format msgid "Sound mixer of %s host" msgstr "" #: ../tcos-volume-manager.py:300 ../tcosmonitor/extensions/info.py:442 msgid "Mute" msgstr "" #: ../tcos-volume-manager.py:319 msgid "Main controls ready" msgstr "" #: ../tcos-volume-manager.py:323 msgid "All remote controls loaded." msgstr "" #: ../tcos-volume-manager.py:332 ../tcosmonitor/extensions/info.py:557 #, python-format msgid "Changing value of %(channel)s channel, to %(value)s%%..." msgstr "" #: ../tcos-volume-manager.py:339 ../tcosmonitor/extensions/info.py:564 #, python-format msgid "Changed value of %(channel)s channel, to %(value)s" msgstr "" #: ../tcos-volume-manager.py:346 ../tcosmonitor/extensions/info.py:571 #, python-format msgid "Unmuting %s channel..." msgstr "" #: ../tcos-volume-manager.py:351 ../tcosmonitor/extensions/info.py:576 #, python-format msgid "Muting %s channel..." msgstr "" #: ../tcos-volume-manager.py:354 ../tcosmonitor/extensions/info.py:579 #, python-format msgid "Status of %(channel)s channel, is \"%(newvalue)s\"" msgstr "" #: ../tcosmonitor/TcosDBus.py:94 msgid "TcosDBus not allowed in local display" msgstr "" #: ../tcosmonitor/TcosDBus.py:122 #, python-format msgid "Seems that tcosxmlrpc isn't running on host=\"%s\"" msgstr "" #: ../tcosmonitor/TcosDBus.py:143 msgid "tcosxmlrpc ERROR conection unavalaible." msgstr "" #: ../tcosmonitor/TcosDBus.py:159 msgid "ERROR conecting to tcosxmlrpc, check username and password." msgstr "" #: ../tcosmonitor/TcosDBus.py:251 msgid "Message from admin" msgstr "" #: ../tcosmonitor/TcosDBus.py:341 ../tcosmonitor/TcosDBus.py:357 #: ../tcosmonitor/TcosDBus.py:375 ../tcosmonitor/TcosDBus.py:393 msgid "User not allowed to run this dbus call." msgstr "" #: ../tcosmonitor/TcosStaticHosts.py:163 ../tcosmonitor/TcosListView.py:70 msgid "IP address" msgstr "" #: ../tcosmonitor/TcosStaticHosts.py:169 #: ../ui/tcosmonitor-staticwindownew.ui:68 msgid "MAC address" msgstr "" #: ../tcosmonitor/TcosStaticHosts.py:279 msgid "No hosts found, please click on Refresh button using another method." msgstr "" #: ../tcosmonitor/shared.py:108 msgid "Traditional list only" msgstr "" #: ../tcosmonitor/shared.py:109 msgid "Icons only" msgstr "" #: ../tcosmonitor/shared.py:110 msgid "Simulate classroom" msgstr "" #: ../tcosmonitor/shared.py:111 msgid "Lists, icons and classroom with tabs" msgstr "" #: ../tcosmonitor/shared.py:270 ../tcosmonitor/shared.py:312 #: ../tcosmonitor/TcosMenus.py:35 msgid "Terminal actions" msgstr "" #: ../tcosmonitor/shared.py:271 ../tcosmonitor/shared.py:313 #: ../tcosmonitor/TcosMenus.py:36 msgid "User actions" msgstr "" #: ../tcosmonitor/shared.py:272 ../tcosmonitor/shared.py:314 #: ../tcosmonitor/TcosMenus.py:37 msgid "Audio, video and files" msgstr "" #: ../tcosmonitor/shared.py:279 ../tcosmonitor/extensions/info.py:47 msgid "Refresh terminal info" msgstr "" #: ../tcosmonitor/shared.py:280 ../tcosmonitor/extensions/clean.py:40 #: ../tcosmonitor/extensions/clean.py:41 msgid "Clean info about terminal" msgstr "" #: ../tcosmonitor/shared.py:281 ../tcosmonitor/TcosTrayIcon.py:54 #: ../tcosmonitor/extensions/reboot.py:40 ../tcosmonitor/TcosTrayIcon2.py:58 msgid "Reboot" msgstr "" #: ../tcosmonitor/shared.py:282 ../tcosmonitor/TcosTrayIcon.py:55 #: ../tcosmonitor/extensions/reboot.py:42 ../tcosmonitor/TcosTrayIcon2.py:59 msgid "Poweroff" msgstr "" #: ../tcosmonitor/shared.py:283 ../tcosmonitor/extensions/lockscreen.py:40 msgid "Lock screen" msgstr "" #: ../tcosmonitor/shared.py:284 ../tcosmonitor/extensions/lockscreen.py:42 msgid "Unlock screen" msgstr "" #: ../tcosmonitor/shared.py:285 ../tcosmonitor/extensions/italc.py:43 msgid "Connect to remote screen (iTALC)" msgstr "" #: ../tcosmonitor/shared.py:286 ../tcosmonitor/extensions/vnc.py:54 msgid "Connect to remote screen (VNC)" msgstr "" #: ../tcosmonitor/shared.py:287 ../tcosmonitor/extensions/screenshot.py:45 msgid "Screenshot" msgstr "" #: ../tcosmonitor/shared.py:288 ../tcosmonitor/extensions/remotessh.py:40 msgid "Give a remote xterm" msgstr "" #: ../tcosmonitor/shared.py:289 #: ../tcosmonitor/extensions/tcospersonalize.py:40 #: ../ui/tcosmonitor-prefwindow.ui:1324 msgid "Configure this host" msgstr "" #: ../tcosmonitor/shared.py:290 ../tcosmonitor/extensions/logout.py:40 msgid "Logout client" msgstr "" #: ../tcosmonitor/shared.py:291 ../tcosmonitor/extensions/restartxorg.py:41 msgid "Restart X session with new settings" msgstr "" #: ../tcosmonitor/shared.py:292 ../tcosmonitor/extensions/appsmsg.py:52 msgid "Exec app on user display" msgstr "" #: ../tcosmonitor/shared.py:293 ../tcosmonitor/extensions/appsmsg.py:53 msgid "Send a text message to user" msgstr "" #: ../tcosmonitor/shared.py:294 ../tcosmonitor/extensions/viewproc.py:41 msgid "Show running apps of this client" msgstr "" #: ../tcosmonitor/shared.py:295 ../tcosmonitor/shared.py:332 msgid "Audio/Video broadcast" msgstr "" #: ../tcosmonitor/shared.py:296 ../tcosmonitor/shared.py:333 #: ../tcosmonitor/extensions/sendfiles.py:49 #: ../tcosmonitor/extensions/sendfiles.py:50 #: ../ui/tcosmonitor-prefwindow.ui:1134 ../ui/tcosmonitor-prefwindow.ui:1475 #: ../ui/tcosmonitor-mainwindow.ui:387 msgid "Send files" msgstr "" #: ../tcosmonitor/shared.py:297 ../tcosmonitor/extensions/vnc.py:55 msgid "Demo mode (from this host)" msgstr "" #: ../tcosmonitor/shared.py:298 ../tcosmonitor/extensions/wakeonlan.py:41 msgid "Boot client (WakeOnLan)" msgstr "" #: ../tcosmonitor/shared.py:299 #: ../tcosmonitor/extensions/tcosnetcontroller.py:38 msgid "Lock internet" msgstr "" #: ../tcosmonitor/shared.py:300 #: ../tcosmonitor/extensions/tcosnetcontroller.py:39 msgid "Unlock internet" msgstr "" #: ../tcosmonitor/shared.py:301 ../tcosmonitor/extensions/dpms.py:40 msgid "DPMS Power off monitor" msgstr "" #: ../tcosmonitor/shared.py:302 ../tcosmonitor/extensions/dpms.py:42 msgid "DPMS Power on monitor" msgstr "" #: ../tcosmonitor/shared.py:303 msgid "Send MIC audio (from this host)" msgstr "" #: ../tcosmonitor/shared.py:321 ../tcosmonitor/extensions/reboot.py:41 msgid "Reboot all clients" msgstr "" #: ../tcosmonitor/shared.py:322 ../tcosmonitor/extensions/reboot.py:43 msgid "Poweroff all clients" msgstr "" #: ../tcosmonitor/shared.py:323 ../tcosmonitor/extensions/lockscreen.py:41 msgid "Lock all screens" msgstr "" #: ../tcosmonitor/shared.py:324 ../tcosmonitor/extensions/lockscreen.py:43 msgid "Unlock all screens" msgstr "" #: ../tcosmonitor/shared.py:325 ../tcosmonitor/extensions/logout.py:41 msgid "Logout clients" msgstr "" #: ../tcosmonitor/shared.py:326 ../tcosmonitor/extensions/restartxorg.py:42 msgid "Restart X session of all clients" msgstr "" #: ../tcosmonitor/shared.py:327 ../tcosmonitor/extensions/appsmsg.py:55 msgid "Exec same app in all connected users" msgstr "" #: ../tcosmonitor/shared.py:328 ../tcosmonitor/extensions/appsmsg.py:56 msgid "Send a text message to all connected users" msgstr "" #: ../tcosmonitor/shared.py:329 ../tcosmonitor/extensions/vnc.py:57 msgid "Enter demo mode, all connected users see my screen" msgstr "" #: ../tcosmonitor/shared.py:330 msgid "Enter conference mode, all connected users can hear me" msgstr "" #: ../tcosmonitor/shared.py:331 ../tcosmonitor/extensions/screenshot.py:46 msgid "Capture All clients screens" msgstr "" #: ../tcosmonitor/shared.py:334 ../tcosmonitor/extensions/wakeonlan.py:42 msgid "Boot All clients (WakeOnLan)" msgstr "" #: ../tcosmonitor/shared.py:335 #: ../tcosmonitor/extensions/tcosnetcontroller.py:41 msgid "Lock internet in all connected users" msgstr "" #: ../tcosmonitor/shared.py:336 #: ../tcosmonitor/extensions/tcosnetcontroller.py:42 msgid "Unlock internet in all connected users" msgstr "" #: ../tcosmonitor/shared.py:337 ../tcosmonitor/extensions/dpms.py:41 msgid "DPMS Power off monitors" msgstr "" #: ../tcosmonitor/shared.py:338 ../tcosmonitor/extensions/dpms.py:43 msgid "DPMS Power on monitors" msgstr "" #: ../tcosmonitor/shared.py:339 msgid "Chat audio conference" msgstr "" #: ../tcosmonitor/shared.py:340 ../tcosmonitor/extensions/livevnc.py:51 #: ../ui/tcosmonitor-prefwindow.ui:1342 msgid "Live view screens with VNC" msgstr "" #: ../tcosmonitor/shared.py:538 #, python-format msgid "QUESTION: %(txt)s, RESPONSE %(response)s" msgstr "" #: ../tcosmonitor/shared.py:555 ../tcosmonitor/shared.py:566 #, python-format msgid "INFO: %s" msgstr "" #: ../tcosmonitor/shared.py:577 #, python-format msgid "ERROR: %s" msgstr "" #: ../tcosmonitor/TcosClassView.py:50 ../tcosmonitor/TcosIconView.py:47 msgid "IP" msgstr "" #: ../tcosmonitor/TcosClassView.py:51 ../tcosmonitor/TcosIconView.py:48 #: ../tcosmonitor/TcosListView.py:64 msgid "Hostname" msgstr "" #: ../tcosmonitor/TcosClassView.py:52 ../tcosmonitor/TcosIconView.py:49 #: ../tcosmonitor/TcosListView.py:76 msgid "Username" msgstr "" #: ../tcosmonitor/TcosClassView.py:53 ../tcosmonitor/TcosIconView.py:50 #: ../tcosmonitor/TcosListView.py:87 msgid "Logged" msgstr "" #: ../tcosmonitor/TcosClassView.py:54 ../tcosmonitor/TcosIconView.py:51 #: ../tcosmonitor/TcosListView.py:103 msgid "Time log in" msgstr "" #: ../tcosmonitor/TcosClassView.py:55 ../tcosmonitor/TcosIconView.py:52 msgid "Screen locked" msgstr "" #: ../tcosmonitor/TcosClassView.py:56 ../tcosmonitor/TcosIconView.py:53 msgid "Network locked" msgstr "" #: ../tcosmonitor/TcosClassView.py:58 msgid "" "Place mouse on any computer to see brief info about it.\n" "You can select and unselect multiple host clicking on every one.\n" "Drag and drop hosts to positions and save clicking on right mouse button." msgstr "" #: ../tcosmonitor/TcosClassView.py:179 msgid "Positions reset to defaults." msgstr "" #: ../tcosmonitor/TcosClassView.py:197 msgid "Positions saved." msgstr "" #: ../tcosmonitor/TcosClassView.py:323 #, python-format msgid "%s is not a valid file to exe or send" msgstr "" #: ../tcosmonitor/TcosClassView.py:409 ../tcosmonitor/TcosIconView.py:156 msgid "yes" msgstr "" #: ../tcosmonitor/TcosClassView.py:411 ../tcosmonitor/TcosIconView.py:158 msgid "no" msgstr "" #: ../tcosmonitor/TcosTrayIcon.py:49 ../tcosmonitor/extensions/vnc.py:298 #: ../tcosmonitor/TcosTrayIcon2.py:53 ../ui/tcosmonitor-mainwindow.ui:23 msgid "Quit" msgstr "" #: ../tcosmonitor/TcosTrayIcon.py:65 msgid "TcosDevices" msgstr "" #: ../tcosmonitor/TcosTrayIcon.py:172 ../tcosmonitor/TcosTrayIcon.py:186 #: ../tcosmonitor/TcosTrayIcon2.py:67 msgid "Tcos Devices" msgstr "" #: ../tcosmonitor/TcosTrayIcon.py:232 ../tcosmonitor/TcosTrayIcon2.py:351 msgid "Usb flash" msgstr "" #: ../tcosmonitor/TcosTrayIcon.py:234 ../tcosmonitor/TcosTrayIcon2.py:353 msgid "Mount USB1" msgstr "" #: ../tcosmonitor/TcosTrayIcon.py:235 ../tcosmonitor/TcosTrayIcon2.py:354 msgid "Umount USB1" msgstr "" #: ../tcosmonitor/extensions/lockscreen.py:49 #: ../tcosmonitor/extensions/lockscreen.py:57 msgid "" "Can't connect to tcosxmlrpc.\n" "Please verify user and password in prefences!" msgstr "" #: ../tcosmonitor/extensions/lockscreen.py:81 #, python-format msgid "Do you want to lock the following screens: %s?" msgstr "" #: ../tcosmonitor/extensions/lockscreen.py:90 #, python-format msgid "Do you want to unlock the following screens: %s?" msgstr "" #: ../tcosmonitor/extensions/appsmsg.py:64 msgid "Clients not connected" msgstr "" #: ../tcosmonitor/extensions/appsmsg.py:87 #, python-format msgid "" "Exec app in user(s) screen(s)\n" "or open web address to:\n" "%s" msgstr "" #: ../tcosmonitor/extensions/appsmsg.py:89 #, python-format msgid "" "Send a message to:\n" "%s" msgstr "" #: ../tcosmonitor/extensions/appsmsg.py:122 #: ../tcosmonitor/extensions/appsmsg.py:163 msgid "Can't exec application, user is not logged" msgstr "" #: ../tcosmonitor/extensions/appsmsg.py:141 #: ../tcosmonitor/extensions/appsmsg.py:152 #, python-format msgid "%s is not a valid application" msgstr "" #: ../tcosmonitor/extensions/appsmsg.py:172 msgid "Can't send message, user is not logged" msgstr "" #: ../tcosmonitor/extensions/appsmsg.py:289 #: ../tcosmonitor/extensions/appsmsg.py:298 #, python-format msgid "%s is not application" msgstr "" #: ../tcosmonitor/extensions/appsmsg.py:353 #, python-format msgid "" "Error while exec remote app:\n" "Reason: %s" msgstr "" #: ../tcosmonitor/extensions/appsmsg.py:360 #, python-format msgid "" "Error while send message:\n" "Reason: %s" msgstr "" #: ../tcosmonitor/extensions/remotessh.py:47 msgid "Enter password of remote thin client (if asked for it)" msgstr "" #: ../tcosmonitor/extensions/dpms.py:79 #, python-format msgid "Do you want to switch off the following monitors: %s?" msgstr "" #: ../tcosmonitor/extensions/dpms.py:88 #, python-format msgid "Do you want to switch on the following monitors: %s?" msgstr "" #: ../tcosmonitor/extensions/screenshot.py:66 #: ../tcosmonitor/extensions/screenshot.py:83 #, python-format msgid "Can't make screenshot, error: %s" msgstr "" #: ../tcosmonitor/extensions/screenshot.py:75 msgid "Trying to order terminal to do a screenshot..." msgstr "" #: ../tcosmonitor/extensions/screenshot.py:87 msgid "Get another screenshot" msgstr "" #: ../tcosmonitor/extensions/screenshot.py:102 #, python-format msgid "Screenshot of %s" msgstr "" #: ../tcosmonitor/extensions/screenshot.py:125 #, python-format msgid "Screenshot of %s, done." msgstr "" #: ../tcosmonitor/extensions/screenshot.py:139 msgid "Save Screenshot" msgstr "" #: ../tcosmonitor/extensions/screenshot.py:151 msgid "Select file to save screenshot..." msgstr "" #: ../tcosmonitor/extensions/screenshot.py:155 #, python-format msgid "screenshot_of_%(hostname)s_date_%(date)s.png" msgstr "" #: ../tcosmonitor/extensions/screenshot.py:159 msgid "Image Files ( *.png, *.jpg)" msgstr "" #: ../tcosmonitor/extensions/screenshot.py:169 msgid "File must be png or jpg." msgstr "" #: ../tcosmonitor/extensions/screenshot.py:192 msgid "Screenshots of all hosts" msgstr "" #: ../tcosmonitor/extensions/screenshot.py:208 #, python-format msgid "Screenshot of %s" msgstr "" #: ../tcosmonitor/extensions/sendfiles.py:62 #: ../tcosmonitor/extensions/sendfiles.py:120 msgid "Can't send files, user is not logged" msgstr "" #: ../tcosmonitor/extensions/sendfiles.py:66 #: ../tcosmonitor/extensions/sendfiles.py:142 #: ../tcosmonitor/extensions/sendfiles.py:237 msgid "" "TcosMonitor need special configuration for rsync daemon to send files.\n" "\n" "Please read configuration requeriments in:\n" "/usr/share/doc/tcosmonitor/README.rsync" msgstr "" #: ../tcosmonitor/extensions/sendfiles.py:84 #: ../tcosmonitor/extensions/sendfiles.py:176 #: ../tcosmonitor/extensions/sendfiles.py:270 msgid "Waiting for send files..." msgstr "" #: ../tcosmonitor/extensions/sendfiles.py:93 #: ../tcosmonitor/extensions/sendfiles.py:95 #: ../tcosmonitor/extensions/sendfiles.py:99 #: ../tcosmonitor/extensions/sendfiles.py:108 #: ../tcosmonitor/extensions/sendfiles.py:189 #: ../tcosmonitor/extensions/sendfiles.py:191 #: ../tcosmonitor/extensions/sendfiles.py:195 #: ../tcosmonitor/extensions/sendfiles.py:204 #: ../tcosmonitor/extensions/sendfiles.py:283 #: ../tcosmonitor/extensions/sendfiles.py:285 #: ../tcosmonitor/extensions/sendfiles.py:289 #: ../tcosmonitor/extensions/sendfiles.py:298 msgid "Teacher" msgstr "" #: ../tcosmonitor/extensions/sendfiles.py:95 #: ../tcosmonitor/extensions/sendfiles.py:108 #: ../tcosmonitor/extensions/sendfiles.py:191 #: ../tcosmonitor/extensions/sendfiles.py:204 #: ../tcosmonitor/extensions/sendfiles.py:285 #: ../tcosmonitor/extensions/sendfiles.py:298 #, python-format msgid "" "Teacher has sent some files to %(teacher)s folder:\n" "\n" "%(basenames)s" msgstr "" #: ../tcosmonitor/extensions/sendfiles.py:104 #: ../tcosmonitor/extensions/sendfiles.py:200 #: ../tcosmonitor/extensions/sendfiles.py:294 #: ../tcosmonitor/extensions/reboot.py:108 #: ../tcosmonitor/extensions/videolan.py:194 #: ../tcosmonitor/extensions/videolan.py:389 #: ../tcosmonitor/extensions/videolan.py:629 #, python-format msgid "" "Error while exec remote app:\n" "Reason:%s" msgstr "" #: ../tcosmonitor/extensions/sendfiles.py:105 #: ../tcosmonitor/extensions/sendfiles.py:201 #: ../tcosmonitor/extensions/sendfiles.py:295 msgid "Error creating destination folder." msgstr "" #: ../tcosmonitor/extensions/sendfiles.py:110 #: ../tcosmonitor/extensions/sendfiles.py:205 #: ../tcosmonitor/extensions/sendfiles.py:300 msgid "Files sent." msgstr "" #: ../tcosmonitor/extensions/sendfiles.py:125 #: ../tcosmonitor/extensions/sendfiles.py:220 msgid "Select file or files..." msgstr "" #: ../tcosmonitor/extensions/sendfiles.py:178 #: ../tcosmonitor/extensions/sendfiles.py:272 msgid "Do you want open file(s) on client?" msgstr "" #: ../tcosmonitor/extensions/sendfiles.py:215 #: ../tcosmonitor/extensions/tcosnetcontroller.py:113 #: ../tcosmonitor/extensions/tcosnetcontroller.py:155 #: ../tcosmonitor/extensions/videolan.py:457 #: ../tcosmonitor/extensions/vnc.py:68 ../tcosmonitor/extensions/vnc.py:112 #: ../tcosmonitor/extensions/vnc.py:422 #: ../tcosmonitor/extensions/audiortp.py:229 #: ../tcosmonitor/extensions/audiortp.py:275 #: ../tcosmonitor/extensions/audiortp.py:373 #: ../tcosmonitor/extensions/audiortp.py:407 #: ../tcosmonitor/extensions/audiortp.py:460 msgid "No users logged." msgstr "" #: ../tcosmonitor/extensions/info.py:91 #, python-format msgid "Connecting with %s to retrieve some info..." msgstr "" #: ../tcosmonitor/extensions/info.py:117 msgid "Tcos info" msgstr "" #: ../tcosmonitor/extensions/info.py:120 msgid "PXES info" msgstr "" #: ../tcosmonitor/extensions/info.py:123 msgid "LTSP info" msgstr "" #: ../tcosmonitor/extensions/info.py:126 msgid "Standalone info" msgstr "" #: ../tcosmonitor/extensions/info.py:129 msgid "Unknow client info" msgstr "" #: ../tcosmonitor/extensions/info.py:135 ../tcosmonitor/LocalData.py:43 #: ../tcosmonitor/LocalData.py:62 ../tcosmonitor/TcosCommon.py:182 #: ../tcosmonitor/TcosCommon.py:190 ../tcosmonitor/TcosCommon.py:206 #: ../tcosmonitor/TcosCommon.py:209 msgid "unknow" msgstr "" #: ../tcosmonitor/extensions/info.py:138 msgid "Hostname: " msgstr "" #: ../tcosmonitor/extensions/info.py:139 msgid "Ip address: " msgstr "" #: ../tcosmonitor/extensions/info.py:140 msgid "TcosXmlRpc version: " msgstr "" #: ../tcosmonitor/extensions/info.py:149 msgid "Tcos image version: " msgstr "" #: ../tcosmonitor/extensions/info.py:150 msgid "Tcos image date: " msgstr "" #: ../tcosmonitor/extensions/info.py:151 msgid "Date of thin client: " msgstr "" #: ../tcosmonitor/extensions/info.py:152 msgid "Uptime: " msgstr "" #: ../tcosmonitor/extensions/info.py:163 msgid "Kernel info" msgstr "" #: ../tcosmonitor/extensions/info.py:172 msgid "Force download and mount all modules" msgstr "" #: ../tcosmonitor/extensions/info.py:183 msgid "None" msgstr "" #: ../tcosmonitor/extensions/info.py:186 msgid "Kernel version: " msgstr "" #: ../tcosmonitor/extensions/info.py:187 msgid "Kernel complete version: " msgstr "" #: ../tcosmonitor/extensions/info.py:188 msgid "Loaded Modules: " msgstr "" #: ../tcosmonitor/extensions/info.py:189 msgid "Modules not found: " msgstr "" #: ../tcosmonitor/extensions/info.py:205 msgid "Cpu info: " msgstr "" #: ../tcosmonitor/extensions/info.py:212 msgid "Cpu model: " msgstr "" #: ../tcosmonitor/extensions/info.py:213 msgid "Cpu vendor: " msgstr "" #: ../tcosmonitor/extensions/info.py:214 msgid "Cpu speed: " msgstr "" #: ../tcosmonitor/extensions/info.py:225 msgid "PCI buses: " msgstr "" #: ../tcosmonitor/extensions/info.py:254 msgid "Process running: " msgstr "" #: ../tcosmonitor/extensions/info.py:267 msgid "Ram info: " msgstr "" #: ../tcosmonitor/extensions/info.py:274 msgid "Total Ram: " msgstr "" #: ../tcosmonitor/extensions/info.py:275 msgid "Free RAM: " msgstr "" #: ../tcosmonitor/extensions/info.py:276 msgid "Active RAM: " msgstr "" #: ../tcosmonitor/extensions/info.py:279 msgid "Swap info: " msgstr "" #: ../tcosmonitor/extensions/info.py:285 msgid "Swap enabled: " msgstr "" #: ../tcosmonitor/extensions/info.py:286 msgid "Total Swap: " msgstr "" #: ../tcosmonitor/extensions/info.py:287 msgid "Used Swap: " msgstr "" #: ../tcosmonitor/extensions/info.py:297 msgid "Network info: " msgstr "" #: ../tcosmonitor/extensions/info.py:307 msgid "Network hostname: " msgstr "" #: ../tcosmonitor/extensions/info.py:308 msgid "Network IP: " msgstr "" #: ../tcosmonitor/extensions/info.py:309 msgid "Network MASK: " msgstr "" #: ../tcosmonitor/extensions/info.py:310 msgid "Network MAC: " msgstr "" #: ../tcosmonitor/extensions/info.py:311 msgid "Data received(rx): " msgstr "" #: ../tcosmonitor/extensions/info.py:312 msgid "Data send(tx): " msgstr "" #: ../tcosmonitor/extensions/info.py:322 ../ui/tcosmonitor-prefwindow.ui:911 msgid "Xorg info" msgstr "" #: ../tcosmonitor/extensions/info.py:348 msgid "enabled" msgstr "" #: ../tcosmonitor/extensions/info.py:350 msgid "disabled" msgstr "" #: ../tcosmonitor/extensions/info.py:353 ../ui/tcospersonalize.ui:159 msgid "X Session Type" msgstr "" #: ../tcosmonitor/extensions/info.py:355 ../ui/tcospersonalize.ui:201 msgid "Xorg Driver" msgstr "" #: ../tcosmonitor/extensions/info.py:357 ../ui/tcospersonalize.ui:94 msgid "Xorg Resolution" msgstr "" #: ../tcosmonitor/extensions/info.py:359 ../ui/tcospersonalize.ui:133 msgid "Xorg Color depth" msgstr "" #: ../tcosmonitor/extensions/info.py:361 ../ui/tcospersonalize.ui:179 msgid "DPMS energy monitor control" msgstr "" #: ../tcosmonitor/extensions/info.py:363 msgid "Disable kill X with Ctrl+Alt+Backspace" msgstr "" #: ../tcosmonitor/extensions/info.py:365 ../ui/tcospersonalize.ui:57 msgid "Enable mouse wheel" msgstr "" #: ../tcosmonitor/extensions/info.py:367 msgid "Refresh rate" msgstr "" #: ../tcosmonitor/extensions/info.py:369 msgid "Xorg font server" msgstr "" #: ../tcosmonitor/extensions/info.py:371 msgid "Mouse device" msgstr "" #: ../tcosmonitor/extensions/info.py:373 msgid "Mouse protocol" msgstr "" #: ../tcosmonitor/extensions/info.py:375 ../ui/tcospersonalize.ui:273 msgid "X Horiz sync" msgstr "" #: ../tcosmonitor/extensions/info.py:377 ../ui/tcospersonalize.ui:284 msgid "X Vert sync" msgstr "" #: ../tcosmonitor/extensions/info.py:390 msgid "PulseAudio Sound server is running" msgstr "" #: ../tcosmonitor/extensions/info.py:408 msgid "Remote Sound Mixer" msgstr "" #: ../tcosmonitor/extensions/info.py:480 msgid "PulseAudio Control" msgstr "" #: ../tcosmonitor/extensions/info.py:485 msgid "PulseAudio Meter" msgstr "" #: ../tcosmonitor/extensions/info.py:490 msgid "PulseAudio Manager" msgstr "" #: ../tcosmonitor/extensions/info.py:494 msgid "PulseAudio utils: " msgstr "" #: ../tcosmonitor/extensions/info.py:500 msgid "PulseAudio stats" msgstr "" #: ../tcosmonitor/extensions/info.py:512 msgid "Currently in use" msgstr "" #: ../tcosmonitor/extensions/info.py:513 msgid "Allocated during whole lifetime" msgstr "" #: ../tcosmonitor/extensions/info.py:514 msgid "Sample cache size" msgstr "" #: ../tcosmonitor/extensions/info.py:515 msgid "User name" msgstr "" #: ../tcosmonitor/extensions/info.py:516 msgid "Host Name" msgstr "" #: ../tcosmonitor/extensions/info.py:517 msgid "Server Name" msgstr "" #: ../tcosmonitor/extensions/info.py:518 msgid "Server Version" msgstr "" #: ../tcosmonitor/extensions/info.py:519 msgid "Default Sample Specification" msgstr "" #: ../tcosmonitor/extensions/info.py:520 msgid "Default Sink" msgstr "" #: ../tcosmonitor/extensions/info.py:521 msgid "Default Source" msgstr "" #: ../tcosmonitor/extensions/info.py:522 msgid "Cookie" msgstr "" #: ../tcosmonitor/extensions/info.py:528 msgid "Sound server is not running" msgstr "" #: ../tcosmonitor/extensions/info.py:589 ../tcosmonitor/extensions/info.py:597 #: ../tcosmonitor/extensions/info.py:605 msgid "PulseAudio apps need /dev/shm." msgstr "" #: ../tcosmonitor/extensions/logout.py:48 #: ../tcosmonitor/extensions/logout.py:71 msgid "User not logged" msgstr "" #: ../tcosmonitor/extensions/logout.py:51 #, python-format msgid "Do you want to logout user: %s?" msgstr "" #: ../tcosmonitor/extensions/logout.py:55 #: ../tcosmonitor/extensions/logout.py:77 #, python-format msgid "Session will close in %s seconds" msgstr "" #: ../tcosmonitor/extensions/logout.py:73 #, python-format msgid "Do you want to logout the following users: %s?" msgstr "" #: ../tcosmonitor/extensions/reboot.py:48 #, python-format msgid "Do you want to reboot: %s?" msgstr "" #: ../tcosmonitor/extensions/reboot.py:51 #: ../tcosmonitor/extensions/reboot.py:61 #, python-format msgid "Pc will reboot in %s seconds" msgstr "" #: ../tcosmonitor/extensions/reboot.py:58 #, python-format msgid "Do you want to reboot the following clients: %s?" msgstr "" #: ../tcosmonitor/extensions/reboot.py:67 #, python-format msgid "Do you want to poweroff: %s?" msgstr "" #: ../tcosmonitor/extensions/reboot.py:70 #: ../tcosmonitor/extensions/reboot.py:80 #, python-format msgid "Pc will shutdown in %s seconds" msgstr "" #: ../tcosmonitor/extensions/reboot.py:77 #, python-format msgid "Do you want to poweroff the following clients: %s?" msgstr "" #: ../tcosmonitor/extensions/tcosnetcontroller.py:50 #: ../tcosmonitor/extensions/tcosnetcontroller.py:109 msgid "Internet connection has been disabled" msgstr "" #: ../tcosmonitor/extensions/tcosnetcontroller.py:54 msgid "Can't disable internet, user is not logged" msgstr "" #: ../tcosmonitor/extensions/tcosnetcontroller.py:59 #: ../tcosmonitor/extensions/tcosnetcontroller.py:85 #: ../tcosmonitor/extensions/tcosnetcontroller.py:103 #: ../tcosmonitor/extensions/tcosnetcontroller.py:147 #, python-format msgid "" "In order to lock and unlock internet you need to be in 'tcos' group.\n" "\n" "Exe by root: adduser %s tcos" msgstr "" #: ../tcosmonitor/extensions/tcosnetcontroller.py:77 #: ../tcosmonitor/extensions/tcosnetcontroller.py:151 msgid "Internet connection has been enabled" msgstr "" #: ../tcosmonitor/extensions/tcosnetcontroller.py:81 msgid "Can't enable internet, user is not logged" msgstr "" #: ../tcosmonitor/extensions/tcosnetcontroller.py:116 #, python-format msgid "Do you want disable internet to following users: %s?" msgstr "" #: ../tcosmonitor/extensions/tcosnetcontroller.py:158 #, python-format msgid "Do you want enable internet to following users:%s?" msgstr "" #: ../tcosmonitor/extensions/videolan.py:48 #: ../tcosmonitor/extensions/videolan.py:49 msgid "Send Audio/Video broadcast" msgstr "" #: ../tcosmonitor/extensions/videolan.py:65 #: ../tcosmonitor/extensions/videolan.py:219 msgid "Can't send video broadcast, user is not logged" msgstr "" #: ../tcosmonitor/extensions/videolan.py:149 #: ../tcosmonitor/extensions/videolan.py:347 #: ../tcosmonitor/extensions/videolan.py:578 #, python-format msgid "" "Not allowed white spaces in \"%s\".\n" "Please rename it." msgstr "" #: ../tcosmonitor/extensions/videolan.py:159 #: ../tcosmonitor/extensions/videolan.py:359 #: ../tcosmonitor/extensions/videolan.py:594 msgid "Waiting for start video transmission..." msgstr "" #: ../tcosmonitor/extensions/videolan.py:167 #: ../tcosmonitor/extensions/videolan.py:367 #: ../tcosmonitor/extensions/videolan.py:602 #: ../tcosmonitor/extensions/vnc.py:98 ../tcosmonitor/extensions/vnc.py:407 msgid "Error while exec app" msgstr "" #: ../tcosmonitor/extensions/videolan.py:199 #: ../tcosmonitor/extensions/videolan.py:393 #: ../tcosmonitor/extensions/videolan.py:634 msgid "Running in broadcast video transmission." msgstr "" #: ../tcosmonitor/extensions/videolan.py:208 #: ../tcosmonitor/extensions/videolan.py:402 #, python-format msgid "" "Running in broadcast video transmission to user %(host)s. Broadcast Nº %" "(count)s" msgstr "" #: ../tcosmonitor/extensions/videolan.py:311 #: ../tcosmonitor/extensions/videolan.py:541 msgid "Select audio/video file.." msgstr "" #: ../tcosmonitor/extensions/videolan.py:314 #: ../tcosmonitor/extensions/videolan.py:544 msgid "Play DVD" msgstr "" #: ../tcosmonitor/extensions/videolan.py:315 #: ../tcosmonitor/extensions/videolan.py:545 msgid "Play SVCD/VCD" msgstr "" #: ../tcosmonitor/extensions/videolan.py:316 #: ../tcosmonitor/extensions/videolan.py:546 msgid "Play AudioCD" msgstr "" #: ../tcosmonitor/extensions/videolan.py:361 #: ../tcosmonitor/extensions/videolan.py:596 msgid "" "First select the DVD chapter or play movie\n" "then press enter to send clients..." msgstr "" #: ../tcosmonitor/extensions/videolan.py:370 msgid "Lock keyboard and mouse on client?" msgstr "" #: ../tcosmonitor/extensions/videolan.py:444 msgid "Video broadcast stopped." msgstr "" #: ../tcosmonitor/extensions/videolan.py:605 msgid "Lock keyboard and mouse on clients?" msgstr "" #: ../tcosmonitor/extensions/videolan.py:643 #, python-format msgid "Running in broadcast video transmission. Broadcast Nº %s" msgstr "" #: ../tcosmonitor/extensions/restartxorg.py:51 #, python-format msgid "Restart X session of %s with new config?" msgstr "" #: ../tcosmonitor/extensions/restartxorg.py:64 #, python-format msgid "%s is not supported to restart Xorg!" msgstr "" #: ../tcosmonitor/extensions/restartxorg.py:78 msgid "No thin clients found." msgstr "" #: ../tcosmonitor/extensions/restartxorg.py:81 #, python-format msgid "Do you want to restart X screens (only thin clients):%s?" msgstr "" #: ../tcosmonitor/extensions/italc.py:51 ../tcosmonitor/extensions/vnc.py:135 msgid "No user logged." msgstr "" #: ../tcosmonitor/extensions/italc.py:75 msgid "Can't start IVS, please add iTALC support" msgstr "" #: ../tcosmonitor/extensions/tcospersonalize.py:54 #, python-format msgid "%s is not supported to personalize!" msgstr "" #: ../tcosmonitor/extensions/vnc.py:71 #, python-format msgid "Do you want to start demo mode the following users: %s?" msgstr "" #: ../tcosmonitor/extensions/vnc.py:83 msgid "Waiting for start demo mode..." msgstr "" #: ../tcosmonitor/extensions/vnc.py:116 ../tcosmonitor/extensions/vnc.py:426 #, python-format msgid "Running in demo mode with %s clients." msgstr "" #: ../tcosmonitor/extensions/vnc.py:127 #, python-format msgid "Running in demo mode from server. Demo Nº %s" msgstr "" #: ../tcosmonitor/extensions/vnc.py:149 ../tcosmonitor/extensions/vnc.py:369 #, python-format msgid "Connecting with %s to start VNC support" msgstr "" #: ../tcosmonitor/extensions/vnc.py:178 #, python-format msgid "" "Can't start VNC, error:\n" "%s" msgstr "" #: ../tcosmonitor/extensions/vnc.py:182 msgid "Waiting for start of VNC server..." msgstr "" #: ../tcosmonitor/extensions/vnc.py:211 msgid "Can't start VNC, please add X11VNC support" msgstr "" #: ../tcosmonitor/extensions/vnc.py:237 msgid "Switch to view only" msgstr "" #: ../tcosmonitor/extensions/vnc.py:242 ../tcosmonitor/extensions/vnc.py:273 msgid "Switch to full control" msgstr "" #: ../tcosmonitor/extensions/vnc.py:269 #, python-format msgid "VNC host %s" msgstr "" #: ../tcosmonitor/extensions/vnc.py:281 msgid "Switch to fullscreen" msgstr "" #: ../tcosmonitor/extensions/vnc.py:290 #: ../tcosmonitor/extensions/livevnc.py:72 #: ../tcosmonitor/TcosPreferences.py:539 ../tcosmonitor/TcosExtensions.py:338 msgid "Stop" msgstr "" #: ../tcosmonitor/extensions/vnc.py:342 msgid "Can't start demo mode, user is not logged" msgstr "" #: ../tcosmonitor/extensions/vnc.py:345 #, python-format msgid "Do you want demo mode from user %s?" msgstr "" #: ../tcosmonitor/extensions/vnc.py:392 #, python-format msgid "Waiting for start demo mode from user %s..." msgstr "" #: ../tcosmonitor/extensions/vnc.py:446 #, python-format msgid "Running in demo mode from user %(host)s. Demo Nº %(count)s" msgstr "" #: ../tcosmonitor/extensions/vnc.py:501 msgid "Demo mode off." msgstr "" #: ../tcosmonitor/extensions/wakeonlan.py:50 #: ../tcosmonitor/extensions/wakeonlan.py:75 msgid "" "Wake On Lan only works with static list.\n" "\n" "Enable scan method \"static\" in Preferences\n" "and (wake on lan) support in bios of clients." msgstr "" #: ../tcosmonitor/extensions/wakeonlan.py:54 #, python-format msgid "Do you want boot %s client?" msgstr "" #: ../tcosmonitor/extensions/wakeonlan.py:67 #: ../tcosmonitor/extensions/wakeonlan.py:91 #, python-format msgid "No register MAC address for ip: \"%s\"" msgstr "" #: ../tcosmonitor/extensions/wakeonlan.py:71 #: ../tcosmonitor/extensions/wakeonlan.py:98 #, python-format msgid "Not valid MAC address: \"%s\"" msgstr "" #: ../tcosmonitor/extensions/wakeonlan.py:79 msgid "Do you want boot all clients?" msgstr "" #: ../tcosmonitor/extensions/livevnc.py:76 msgid "Live view of all hosts" msgstr "" #: ../tcosmonitor/extensions/livevnc.py:194 msgid "Running in LiveView mode" msgstr "" #: ../tcosmonitor/extensions/viewproc.py:48 msgid "Can't show runnings apps, user is not logged" msgstr "" #: ../tcosmonitor/extensions/viewproc.py:58 msgid "User not connected, no processes." msgstr "" #: ../tcosmonitor/extensions/viewproc.py:76 #, python-format msgid "Running processes for user \"%s\": " msgstr "" #: ../tcosmonitor/extensions/viewproc.py:80 msgid "" "ALERT: There are some system process hidden. Enable it in Preferences dialog." msgstr "" #: ../tcosmonitor/extensions/viewproc.py:85 msgid "Pid" msgstr "" #: ../tcosmonitor/extensions/viewproc.py:86 msgid "Process command" msgstr "" #: ../tcosmonitor/extensions/viewproc.py:91 msgid "Kill this process" msgstr "" #: ../tcosmonitor/extensions/viewproc.py:127 msgid "Are you sure you want to stop this process?" msgstr "" #: ../tcosmonitor/extensions/viewproc.py:136 #, python-format msgid "" "Error while killing app:\n" "Reason: %s" msgstr "" #: ../tcosmonitor/extensions/audiortp.py:49 #: ../ui/tcosmonitor-mainwindow.ui:163 msgid "Send audio conference" msgstr "" #: ../tcosmonitor/extensions/audiortp.py:50 #: ../ui/tcosmonitor-prefwindow.ui:1507 msgid "Audio chat conference" msgstr "" #: ../tcosmonitor/extensions/audiortp.py:51 #: ../ui/tcosmonitor-mainwindow.ui:275 msgid "Audio chat list" msgstr "" #: ../tcosmonitor/extensions/audiortp.py:52 msgid "Send audio conference (from this host)" msgstr "" #: ../tcosmonitor/extensions/audiortp.py:73 msgid "Emission" msgstr "" #: ../tcosmonitor/extensions/audiortp.py:79 msgid "State" msgstr "" #: ../tcosmonitor/extensions/audiortp.py:83 msgid "Channel" msgstr "" #: ../tcosmonitor/extensions/audiortp.py:235 #: ../tcosmonitor/extensions/audiortp.py:322 #: ../tcosmonitor/extensions/audiortp.py:413 msgid "" "Your pulseaudio server is too old.\n" "Is required pulseaudio version >= 0.9.10" msgstr "" #: ../tcosmonitor/extensions/audiortp.py:238 #, python-format msgid "Do you want to start audio conference to the following users: %s?" msgstr "" #: ../tcosmonitor/extensions/audiortp.py:243 msgid "You have entered in audio conference" msgstr "" #: ../tcosmonitor/extensions/audiortp.py:267 msgid "Waiting for start audio conference..." msgstr "" #: ../tcosmonitor/extensions/audiortp.py:295 #: ../tcosmonitor/extensions/audiortp.py:390 #, python-format msgid "Running in audio conference with %s clients." msgstr "" #: ../tcosmonitor/extensions/audiortp.py:305 #, python-format msgid "Running in audio conference from server. Conference Nº %s" msgstr "" #: ../tcosmonitor/extensions/audiortp.py:316 msgid "Can't start conference mode, user is not logged" msgstr "" #: ../tcosmonitor/extensions/audiortp.py:325 #, python-format msgid "Do you want audio conference from user %s?" msgstr "" #: ../tcosmonitor/extensions/audiortp.py:331 #, python-format msgid "You have entered in audio conference from user %s" msgstr "" #: ../tcosmonitor/extensions/audiortp.py:359 #, python-format msgid "Waiting for start audio conference from user %s..." msgstr "" #: ../tcosmonitor/extensions/audiortp.py:400 #, python-format msgid "Running in audio conference from user %(host)s. Conference Nº %(count)s" msgstr "" #: ../tcosmonitor/extensions/audiortp.py:416 #, python-format msgid "Do you want to start audio chat conference to the following users: %s?" msgstr "" #: ../tcosmonitor/extensions/audiortp.py:421 #, python-format msgid "You have entered in audio chat conference. Participants: %s" msgstr "" #: ../tcosmonitor/extensions/audiortp.py:443 msgid "Waiting for start audio chat conference..." msgstr "" #: ../tcosmonitor/extensions/audiortp.py:449 msgid "Do you want to connect to this audio chat conference now?" msgstr "" #: ../tcosmonitor/extensions/audiortp.py:483 #, python-format msgid "Running in audio chat conference with %s clients." msgstr "" #: ../tcosmonitor/extensions/audiortp.py:495 #, python-format msgid "Running in audio chat conference. Conference Nº %s" msgstr "" #: ../tcosmonitor/extensions/audiortp.py:521 msgid "Conference mode off." msgstr "" #: ../tcosmonitor/extensions/audiortp.py:540 msgid "Audio chat conference off." msgstr "" #: ../tcosmonitor/TcosXmlRpc.py:85 msgid "" "Username or password are empty,\n" "please edit in preferences dialog!" msgstr "" #: ../tcosmonitor/TcosIconView.py:55 msgid "Place mouse on any computer to see brief info about it." msgstr "" #: ../tcosmonitor/TcosListView.py:82 msgid "Active" msgstr "" #: ../tcosmonitor/TcosListView.py:92 msgid "Screen Blocked" msgstr "" #: ../tcosmonitor/TcosListView.py:97 msgid "Num of process" msgstr "" #: ../tcosmonitor/TcosListView.py:112 msgid "Sel" msgstr "" #: ../tcosmonitor/TcosListView.py:148 #, python-format msgid "Error connecting to tcosxmlrpc in %s" msgstr "" #: ../tcosmonitor/TcosTrayIcon2.py:154 #, python-format msgid "Floppy: %s" msgstr "" #: ../tcosmonitor/TcosTrayIcon2.py:156 #, python-format msgid "CDROM: %s" msgstr "" #: ../tcosmonitor/TcosTrayIcon2.py:158 #, python-format msgid "USB: %s" msgstr "" #: ../tcosmonitor/TcosTrayIcon2.py:160 #, python-format msgid "HDD partition: %s" msgstr "" #: ../tcosmonitor/TcosTrayIcon2.py:162 #, python-format msgid "Unknow: %s" msgstr "" #: ../tcosmonitor/Initialize.py:217 msgid "GPL-2 license file not found" msgstr "" #: ../tcosmonitor/LocalData.py:212 #, python-format msgid "Selected network inteface (%s) don't have IP address" msgstr "" #: ../tcosmonitor/LocalData.py:260 ../tcosmonitor/ping.py:108 #: ../tcosmonitor/ping.py:171 msgid "Testing if found clients have 8998 or 8999 port open..." msgstr "" #: ../tcosmonitor/LocalData.py:282 msgid "" "Static list method configured but no hosts in list.\n" "\n" "Please, open preferences, click on 'Open Static Host list' and add some " "hosts." msgstr "" #: ../tcosmonitor/TcosPreferences.py:264 msgid "" "You have select more than 5 button menus.\n" "Only allowed to select a maximum of 5 buttons." msgstr "" #: ../tcosmonitor/TcosPreferences.py:275 msgid "New settings saved." msgstr "" #: ../tcosmonitor/TcosMenus.py:102 ../tcosmonitor/TcosMenus.py:114 #, python-format msgid "Actions for %s" msgstr "" #: ../tcosmonitor/TcosMenus.py:107 msgid "Actions for selected host" msgstr "" #: ../tcosmonitor/TcosMenus.py:168 ../tcosmonitor/TcosMenus.py:299 #, python-format msgid "%d hidden actions" msgstr "" #: ../tcosmonitor/TcosMenus.py:243 ../tcosmonitor/TcosMenus.py:245 msgid "Actions for selected hosts" msgstr "" #: ../tcosmonitor/TcosMenus.py:247 msgid "Actions for all hosts" msgstr "" #: ../tcosmonitor/TcosMenus.py:304 msgid "Save hosts positions" msgstr "" #: ../tcosmonitor/TcosMenus.py:312 msgid "Reset hosts positions" msgstr "" #: ../tcosmonitor/ping.py:80 #, python-format msgid "Ping to %s..." msgstr "" #: ../tcosmonitor/ping.py:89 msgid "Waiting for pings..." msgstr "" #: ../tcosmonitor/ping.py:127 ../tcosmonitor/ping.py:192 #: ../tcosmonitor/TcosActions.py:185 ../tcosmonitor/TcosActions.py:264 msgid "Not connected hosts found." msgstr "" #: ../tcosmonitor/ping.py:134 ../tcosmonitor/ping.py:197 #: ../tcosmonitor/TcosActions.py:187 ../tcosmonitor/TcosActions.py:259 #, python-format msgid "Found %d hosts" msgstr "" #: ../tcosmonitor/TcosActions.py:162 ../tcosmonitor/TcosActions.py:241 msgid "Searching for connected hosts..." msgstr "" #: ../tcosmonitor/TcosActions.py:1019 msgid "Searching info of hosts..." msgstr "" #: ../tcosmonitor/TcosActions.py:1058 #, python-format msgid "Connecting to %s..." msgstr "" #: ../tcosmonitor/TcosExtensions.py:41 msgid "Exception:" msgstr "" #: ../tcosmonitor/TcosExtensions.py:77 msgid "Error: no IP!" msgstr "" #: ../tcosmonitor/TcosExtensions.py:154 msgid "No clients connected, press refresh button." msgstr "" #: ../tcosmonitor/TcosExtensions.py:251 ../tcosmonitor/TcosExtensions.py:253 #, python-format msgid "Can't exec this action at '%s' because you are connected at this host!" msgstr "" #: ../tcosmonitor/TcosExtensions.py:267 #, python-format msgid "Doing action \"%(action)s\" in %(ip)s..." msgstr "" #: ../tcosmonitor/TcosExtensions.py:285 #, python-format msgid "Done action \"%(action)s\" in %(ip)s" msgstr "" #: ../tcosmonitor/TcosCommon.py:89 #, python-format msgid "" "ThreadController: Found error executing %(cmd)s\n" "\n" "If problem persist, disable Thread Controller\n" "in Preferences and report bug.\n" "Error=%(error)s" msgstr "" #: ../ui/tcosmonitor-prefwindow.ui:35 ../ui/tcospersonalize.ui:7 #: ../ui/tcosmonitor-mainwindow.ui:36 msgid "Preferences" msgstr "" #: ../ui/tcosmonitor-prefwindow.ui:62 msgid "Show host list on startup" msgstr "" #: ../ui/tcosmonitor-prefwindow.ui:80 msgid "Scan network method" msgstr "" #: ../ui/tcosmonitor-prefwindow.ui:91 msgid "" "Network interface\n" "(thin client)" msgstr "" #: ../ui/tcosmonitor-prefwindow.ui:127 msgid "Show system process" msgstr "" #: ../ui/tcosmonitor-prefwindow.ui:144 msgid "Don't do actions when running TcosMonitor in thin client" msgstr "" #: ../ui/tcosmonitor-prefwindow.ui:163 msgid "List of hosts" msgstr "" #: ../ui/tcosmonitor-prefwindow.ui:200 msgid "Open static host list" msgstr "" #: ../ui/tcosmonitor-prefwindow.ui:225 msgid "Only show hosts running tcosxmlrpc (8998 port)" msgstr "" #: ../ui/tcosmonitor-prefwindow.ui:242 msgid "Only do all actions on selected hosts (requires restart TcosMonitor)" msgstr "" #: ../ui/tcosmonitor-prefwindow.ui:259 msgid "Enable SSL connections to XMLRPC clients" msgstr "" #: ../ui/tcosmonitor-prefwindow.ui:278 msgid "Host list mode" msgstr "" #: ../ui/tcosmonitor-prefwindow.ui:302 msgid "Show right menu with groups (NEW)" msgstr "" #: ../ui/tcosmonitor-prefwindow.ui:319 msgid "Don't show thin client if TcosMonitor is running there" msgstr "" #: ../ui/tcosmonitor-prefwindow.ui:351 msgid "Settings" msgstr "" #: ../ui/tcosmonitor-prefwindow.ui:376 msgid "Update host list every (seg)" msgstr "" #: ../ui/tcosmonitor-prefwindow.ui:389 msgid "" "Update host list every selected seconds.\n" "\n" "Value=0 disable update." msgstr "" #: ../ui/tcosmonitor-prefwindow.ui:405 msgid "Cache timeout (seg)" msgstr "" #: ../ui/tcosmonitor-prefwindow.ui:419 msgid "" "Cache some data and connection status during selected seconds.\n" "\n" "Value=0 disable cache." msgstr "" #: ../ui/tcosmonitor-prefwindow.ui:437 msgid "Screenshot size:" msgstr "" #: ../ui/tcosmonitor-prefwindow.ui:450 ../ui/tcosmonitor-prefwindow.ui:479 msgid "% Size of screnshot." msgstr "" #: ../ui/tcosmonitor-prefwindow.ui:466 msgid "Mini screenshot size:" msgstr "" #: ../ui/tcosmonitor-prefwindow.ui:495 msgid "Timeout actions (seg)" msgstr "" #: ../ui/tcosmonitor-prefwindow.ui:508 msgid "" "Timeout in seg for actions\n" "\n" "Value=0 default" msgstr "" #: ../ui/tcosmonitor-prefwindow.ui:526 msgid "SSH remote username" msgstr "" #: ../ui/tcosmonitor-prefwindow.ui:553 msgid "VLC method to send" msgstr "" #: ../ui/tcosmonitor-prefwindow.ui:578 msgid "" "Experimental: Thread Controller\n" "( if you have problems, disable it )" msgstr "" #: ../ui/tcosmonitor-prefwindow.ui:591 msgid "Actions controlled" msgstr "" #: ../ui/tcosmonitor-prefwindow.ui:611 msgid "Block ports: (80,8080... etc)" msgstr "" #: ../ui/tcosmonitor-prefwindow.ui:653 ../ui/tcospersonalize.ui:333 msgid "Advanced" msgstr "" #: ../ui/tcosmonitor-prefwindow.ui:680 msgid "TcosXmlRpc username" msgstr "" #: ../ui/tcosmonitor-prefwindow.ui:706 msgid "TcosXmlRpc password" msgstr "" #: ../ui/tcosmonitor-prefwindow.ui:735 msgid "" "NOTE:\n" "Default user is root and default password is root.\n" "\n" "For thin clients change TCOS_ROOT_PASSWD or use TcosConfig and " "regenerate boot images again.\n" "\n" "For standalone users you can use a system account (root) but this is " "not recomended. Install tcos-standalone and start it by root. Set user and " "password, this will create a /etc/tcospasswd file only used by TCOS " "and your root acount will be secure." msgstr "" #: ../ui/tcosmonitor-prefwindow.ui:772 msgid "Authentication " msgstr "" #: ../ui/tcosmonitor-prefwindow.ui:795 msgid "Info avalaible from tcosxmlrpc" msgstr "" #: ../ui/tcosmonitor-prefwindow.ui:806 msgid "Tcos general info" msgstr "" #: ../ui/tcosmonitor-prefwindow.ui:821 msgid "Cpu info" msgstr "" #: ../ui/tcosmonitor-prefwindow.ui:836 msgid "Kernel and modules info" msgstr "" #: ../ui/tcosmonitor-prefwindow.ui:851 msgid "PCI bus info" msgstr "" #: ../ui/tcosmonitor-prefwindow.ui:866 msgid "Ram and swap info" msgstr "" #: ../ui/tcosmonitor-prefwindow.ui:881 msgid "Process info" msgstr "" #: ../ui/tcosmonitor-prefwindow.ui:896 msgid "Network info" msgstr "" #: ../ui/tcosmonitor-prefwindow.ui:926 msgid "Sound server info" msgstr "" #: ../ui/tcosmonitor-prefwindow.ui:962 msgid "Avalaible info" msgstr "" #: ../ui/tcosmonitor-prefwindow.ui:985 msgid "Show / hide menu items" msgstr "" #: ../ui/tcosmonitor-prefwindow.ui:1003 msgid "Lock and unlock screen" msgstr "" #: ../ui/tcosmonitor-prefwindow.ui:1019 msgid "Remote SSH shell" msgstr "" #: ../ui/tcosmonitor-prefwindow.ui:1037 msgid "Configure Xorg settings" msgstr "" #: ../ui/tcosmonitor-prefwindow.ui:1066 ../ui/tcosmonitor-prefwindow.ui:1427 msgid "Exe app on user display" msgstr "" #: ../ui/tcosmonitor-prefwindow.ui:1082 ../ui/tcosmonitor-prefwindow.ui:1441 msgid "Send a text message" msgstr "" #: ../ui/tcosmonitor-prefwindow.ui:1100 msgid "Show running apps" msgstr "" #: ../ui/tcosmonitor-prefwindow.ui:1116 ../ui/tcosmonitor-prefwindow.ui:1457 msgid "Send video broadcast" msgstr "" #: ../ui/tcosmonitor-prefwindow.ui:1150 msgid "Demo mode" msgstr "" #: ../ui/tcosmonitor-prefwindow.ui:1179 msgid "Wake on LAN" msgstr "" #: ../ui/tcosmonitor-prefwindow.ui:1195 msgid "Audio conference mode" msgstr "" #: ../ui/tcosmonitor-prefwindow.ui:1213 msgid "Screenshots" msgstr "" #: ../ui/tcosmonitor-prefwindow.ui:1229 msgid "Reboot and poweroff" msgstr "" #: ../ui/tcosmonitor-prefwindow.ui:1243 msgid "Lock and unlock internet" msgstr "" #: ../ui/tcosmonitor-prefwindow.ui:1259 msgid "DPMS monitor on/off" msgstr "" #: ../ui/tcosmonitor-prefwindow.ui:1277 msgid "Connect using VNC" msgstr "" #: ../ui/tcosmonitor-prefwindow.ui:1293 msgid "Connect using iTALC" msgstr "" #: ../ui/tcosmonitor-prefwindow.ui:1308 msgid "Restart session with new settings" msgstr "" #: ../ui/tcosmonitor-prefwindow.ui:1385 msgid "Menus" msgstr "" #: ../ui/tcosmonitor-prefwindow.ui:1408 msgid "Show / hide menu buttons" msgstr "" #: ../ui/tcosmonitor-prefwindow.ui:1491 msgid "Audio conference" msgstr "" #: ../ui/tcosmonitor-prefwindow.ui:1525 msgid "Audio Chat control" msgstr "" #: ../ui/tcosmonitor-prefwindow.ui:1569 msgid "Menu buttons" msgstr "" #: ../ui/tcosmonitor-abouttcos.ui:6 msgid "About TCOS" msgstr "" #: ../ui/tcosmonitor-abouttcos.ui:19 msgid "TcosMonitor" msgstr "" #: ../ui/tcosmonitor-abouttcos.ui:62 msgid "Version:" msgstr "" #: ../ui/tcosmonitor-abouttcos.ui:90 msgid "" "Thin client and standalone\n" "monitoring tool." msgstr "" #: ../ui/tcosmonitor-abouttcos.ui:131 msgid "Project web site" msgstr "" #: ../ui/tcosmonitor-abouttcos.ui:178 msgid "About" msgstr "" #: ../ui/tcosmonitor-abouttcos.ui:212 msgid "License" msgstr "" #: ../ui/tcosmonitor-abouttcos.ui:230 msgid "" "Main developers:\n" " * Mario Izquierdo \n" " * Ignacio Vidal \n" "\n" "Contributors:\n" " * Andrés Jimenez\n" " * Quirón\n" "\n" "Special thanks to:\n" " Comunidad de Madrid, MaX group (Spain)" msgstr "" #: ../ui/tcosmonitor-abouttcos.ui:259 msgid "Authors" msgstr "" #: ../ui/tcosmonitor-abouttcos.ui:275 msgid "Translated to your language by:" msgstr "" #: ../ui/tcosmonitor-abouttcos.ui:287 msgid "Mario Izquierdo " msgstr "" #: ../ui/tcosmonitor-abouttcos.ui:307 msgid "Translators" msgstr "" #: ../ui/tcosmonitor-abouttcos.ui:324 msgid "" "TCOS is a free software project that need a lot of work to be the best thin " "client plataform.\n" "\n" "We work every day a lot of hours to make changes and support more devices " "and features.\n" "\n" "We want to continue developing this software but need your help, if you use, " "sell or hack TCOS pehaps you could donate some money to project.\n" "\n" "Click on next url to get some info." msgstr "" #: ../ui/tcosmonitor-abouttcos.ui:370 msgid "http://wiki.tcosproject.org/TcosProject:Site_support" msgstr "" #: ../ui/tcosmonitor-abouttcos.ui:392 msgid "Don't show donations message on start." msgstr "" #: ../ui/tcosmonitor-abouttcos.ui:415 msgid "Donate" msgstr "" #: ../ui/tray.ui:20 msgid "TCOS devices" msgstr "" #: ../ui/tray.ui:57 msgid "Hide" msgstr "" #: ../ui/tcos-volume-manager.ui:39 msgid "Restart sound" msgstr "" #: ../ui/tcos-volume-manager.ui:54 msgid "Sound levels" msgstr "" #: ../ui/tcos-volume-manager.ui:90 msgid "Main Channels" msgstr "" #: ../ui/tcos-volume-manager.ui:113 msgid "Secondary Channels" msgstr "" #: ../ui/tcosmonitor-chatwindow.ui:8 msgid "Chat emission list" msgstr "" #: ../ui/tcosmonitor-chatwindow.ui:17 msgid "Chat emission list" msgstr "" #: ../ui/tcosmonitor-chatwindow.ui:80 msgid "Connect" msgstr "" #: ../ui/tcosmonitor-chatwindow.ui:128 msgid "Disconnect" msgstr "" #: ../ui/tcosmonitor-chatwindow.ui:176 msgid "Exit" msgstr "" #: ../ui/tcosmonitor-staticwindow.ui:8 msgid "Static hosts list" msgstr "" #: ../ui/tcosmonitor-staticwindow.ui:17 msgid "Static Hosts list" msgstr "" #: ../ui/tcosmonitor-staticwindow.ui:80 msgid "Add" msgstr "" #: ../ui/tcosmonitor-staticwindow.ui:128 msgid "Modify" msgstr "" #: ../ui/tcosmonitor-staticwindow.ui:176 msgid "Delete" msgstr "" #: ../ui/tcosmonitor-staticwindow.ui:225 msgid "Get from connected" msgstr "" #: ../ui/tcosmonitor-staticwindow.ui:292 ../ui/tcosmonitor-mainwindow.ui:771 #: ../ui/tcosmonitor-staticwindownew.ui:150 msgid "Cancel" msgstr "" #: ../ui/tcosmonitor-staticwindow.ui:340 #: ../ui/tcosmonitor-staticwindownew.ui:198 msgid "Save" msgstr "" #: ../ui/tcospersonalize.ui:34 msgid "unknow host" msgstr "" #: ../ui/tcospersonalize.ui:74 msgid "Disable Ctrl + Alt + Backspace (for kill Xorg)" msgstr "" #: ../ui/tcospersonalize.ui:211 msgid "Get avalaible drivers" msgstr "" #: ../ui/tcospersonalize.ui:248 msgid "Display Settings" msgstr "" #: ../ui/tcospersonalize.ui:351 msgid "Default boot kernel" msgstr "" #: ../ui/tcospersonalize.ui:376 msgid "PXE Boot options" msgstr "" #: ../ui/tcospersonalize.ui:391 msgid "Default boot method" msgstr "" #: ../ui/tcospersonalize.ui:419 msgid "Command line" msgstr "" #: ../ui/tcospersonalize.ui:507 msgid "Boot options" msgstr "" #: ../ui/tcospersonalize.ui:551 msgid "Delete Config" msgstr "" #: ../ui/tcosmonitor-mainwindow.ui:8 msgid "TcosMonitor" msgstr "" #: ../ui/tcosmonitor-mainwindow.ui:22 msgid "Exit TcosMonitor" msgstr "" #: ../ui/tcosmonitor-mainwindow.ui:35 msgid "Open preferences dialog" msgstr "" #: ../ui/tcosmonitor-mainwindow.ui:48 msgid "Update host list" msgstr "" #: ../ui/tcosmonitor-mainwindow.ui:49 msgid "Refresh" msgstr "" #: ../ui/tcosmonitor-mainwindow.ui:71 msgid "All Hosts" msgstr "" #: ../ui/tcosmonitor-mainwindow.ui:99 msgid "Find" msgstr "" #: ../ui/tcosmonitor-mainwindow.ui:111 msgid "About this app" msgstr "" #: ../ui/tcosmonitor-mainwindow.ui:219 msgid "Start audio chat" msgstr "" #: ../ui/tcosmonitor-mainwindow.ui:331 msgid "Send audio/video" msgstr "" #: ../ui/tcosmonitor-mainwindow.ui:443 msgid "Exe app" msgstr "" #: ../ui/tcosmonitor-mainwindow.ui:499 msgid "Send message" msgstr "" #: ../ui/tcosmonitor-mainwindow.ui:581 msgid "List view" msgstr "" #: ../ui/tcosmonitor-mainwindow.ui:629 msgid "Icon view" msgstr "" #: ../ui/tcosmonitor-mainwindow.ui:689 msgid "Simulate my classroom" msgstr "" #: ../ui/tcosmonitor-staticwindownew.ui:8 msgid "New or edit hosts" msgstr "" #: ../ui/tcosmonitor-staticwindownew.ui:32 msgid "" "You can add a simple host, \n" " example: 192.168.0.100\n" "\n" "or range of hosts, \n" " example: 192.168.0.100-120\n" "\n" "MAC address is optional" msgstr "" #: ../ui/tcosmonitor-staticwindownew.ui:57 msgid "IP address *" msgstr "" #: ../ui/tcosmonitor-askwindow.ui:8 msgid "Question" msgstr "" #: ../ui/tcosmonitor-askwindow.ui:50 msgid "You can drag and drop launcher file to this box" msgstr "" #: ../ui/tcosmonitor-askwindow.ui:61 msgid "Run app in unknow host" msgstr "" tcosmonitor/po/ca@valencia.po0000664000000000000000000025043212260544373013506 0ustar # translation of devhelp.po to # Devhelp translation to Catalan. # Copyright © 2003, 2008 Free Software Foundation, Inc. # Aleix Badia , 2003. # Raül Cambeiro , 2003. # Jordi Mallach , 2003. # # msgid "" msgstr "" "Project-Id-Version: qcv\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-03-18 15:48+0100\n" "PO-Revision-Date: 2008-10-30 18:05+0100\n" "Last-Translator: Pilar Embid Giner \n" "Language-Team: Valencian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: ../tcosmonitor.py:129 #, python-format msgid "" "The user \"%s\" must be member of the group \"tcos\" to exec tcosmonitor.\n" "\n" "If you are system administrator, add your user to tcos group." msgstr "" "L'usuari \"%s\" ha de ser membre del grup \"tcos\".\n" "\n" "Si sou administrador del sistema, afegiu l'usuari al grup tcos." #: ../tcosmonitor.py:247 msgid "Send files disabled. rsync not configured." msgstr "L'enviament de fitxer està inhabilitat. No està configutat rsync." #: ../tcosmonitor.py:329 ../tcospersonalize.py:562 #: ../tcos-volume-manager.py:378 msgid "Exiting" msgstr "S'està eixint" #: ../tcos-devices-ng.py:188 #, python-format msgid "Rebooting in %s seconds" msgstr "L'equip es reiniciarà en %s segons" #: ../tcos-devices-ng.py:190 #, python-format msgid "Shutting down in %s seconds" msgstr "L'equip s'apagarà en %s segons" #: ../tcos-devices-ng.py:206 ../tcos-devices-ng.py:209 #, python-format msgid "" "ERROR during action %(action)s:\n" "%(errortxt)s" msgstr "" "S'ha produït un ERROR mentres es realitzava l'acció %(action)s:\n" "%(errortxt)s" #: ../tcos-devices-ng.py:239 msgid "Tcos device daemon" msgstr "Dimoni de dispositius TCOS" #: ../tcos-devices-ng.py:283 ../tcos-volume-manager.py:143 #, python-format msgid "Error connecting with TcosXmlRpc in %s." msgstr "S'ha produït un error mentres es connectava amb tcosxmlrpc en %s" #: ../tcos-devices-ng.py:314 #, python-format msgid "Cdrom device %s" msgstr "Dispositiu cdrom %s" #: ../tcos-devices-ng.py:317 msgid "Mount Cdrom" msgstr "Munta el cdrom" #: ../tcos-devices-ng.py:318 msgid "Umount Cdrom" msgstr "Desmunta el cdrom" #: ../tcos-devices-ng.py:340 #, python-format msgid "Disk partition %s" msgstr "Partición del disc %s" #: ../tcos-devices-ng.py:343 msgid "Mount disk partition" msgstr "Munta la partició del disc" #: ../tcos-devices-ng.py:344 msgid "Umount disk partition" msgstr "Desmunta la partició del disc" #: ../tcos-devices-ng.py:356 msgid "No floppy detected" msgstr "No s'ha detectat cap disquet" #: ../tcos-devices-ng.py:368 ../tcos-devices-ng.py:674 #: ../tcos-devices-ng.py:680 ../tcos-devices-ng.py:686 msgid "Floppy" msgstr "Disquet" #: ../tcos-devices-ng.py:371 msgid "Mount Floppy" msgstr "Munta el disquet" #: ../tcos-devices-ng.py:372 msgid "Umount Floppy" msgstr "Desmunta el disquet" #: ../tcos-devices-ng.py:382 msgid "Floppy mounted. Ready for use." msgstr "Disquet muntat. Preparat per a usar." #: ../tcos-devices-ng.py:384 msgid "Floppy umounted. You can extract it." msgstr "Disquet desmuntat. Ara pot extraure'l." #: ../tcos-devices-ng.py:400 msgid "Hard disk partition mounted. Ready for use." msgstr "Partició muntada del disc dur. Preparat per a usar." #: ../tcos-devices-ng.py:403 msgid "Hard disk partition umounted." msgstr "Partició desmuntada del disc dur." #: ../tcos-devices-ng.py:425 msgid "Audio cdrom mounted., you can listen music opening wav files." msgstr "Cdrom d'àudio muntat., ara podeu obrir els fitxers de música wav." #: ../tcos-devices-ng.py:427 msgid "Cdrom mounted. Ready for use." msgstr "Cdrom muntat. Preparat per a usar." #: ../tcos-devices-ng.py:430 msgid "Cdrom umounted. You can extract it." msgstr "Cdrom desmuntat. Ara podeu extraure'l." #: ../tcos-devices-ng.py:529 #, python-format msgid "" "Mounting device %s\n" "Please wait..." msgstr "" "S'està muntant el dispositiu %s\n" "Per favor, espere..." #: ../tcos-devices-ng.py:578 msgid "Error mounting LTSPFS, check versions of LTSPFS packages" msgstr "" "S'ha produït un error mentres es muntava LTSPFS, comproveu les versions dels " "paquets LTSPFS" #: ../tcos-devices-ng.py:604 #, python-format msgid "" "Umounting device %s.\n" "Please wait..." msgstr "" "S'està desmuntant el dispositiu %s.\n" "Per favor, espere..." #: ../tcos-devices-ng.py:651 msgid "usbdisk" msgstr "disc-usb" #: ../tcos-devices-ng.py:653 msgid "firewiredisk" msgstr "disc-firewire" #: ../tcos-devices-ng.py:678 msgid "Can't mount floppy" msgstr "No es pot muntar el disquet" #: ../tcos-devices-ng.py:689 msgid "Can't umount floppy" msgstr "No es pot desmuntar el disquet" #: ../tcos-devices-ng.py:702 ../tcos-devices-ng.py:712 #: ../tcos-devices-ng.py:723 ../tcos-devices-ng.py:836 #: ../tcos-devices-ng.py:848 ../tcos-devices-ng.py:867 #: ../tcos-devices-ng.py:879 ../tcos-devices-ng.py:911 #, python-format msgid "Cdrom_%s" msgstr "Cdrom_%s" #: ../tcos-devices-ng.py:710 msgid "Can't mount cdrom" msgstr "No es pot muntar el cdrom" #: ../tcos-devices-ng.py:726 msgid "Can't umount cdrom" msgstr "No es pot desmuntar el cdrom" #: ../tcos-devices-ng.py:742 ../tcos-devices-ng.py:752 #: ../tcos-devices-ng.py:763 #, python-format msgid "Disk_%s" msgstr "Disc_%s" #: ../tcos-devices-ng.py:750 msgid "Can't mount hard disk partition" msgstr "No es pot muntar la partició del disc dur" #: ../tcos-devices-ng.py:766 msgid "Can't umount hard disk partition" msgstr "No es pot desmuntar la partició del disc dur" #: ../tcos-devices-ng.py:807 #, python-format msgid "" "From terminal %(host)s.\n" "Connected CDROM USB device %(device)s\n" "%(vendor)s %(model)s" msgstr "" "Des del terminal %(host)s.\n" "Dispositiu CDROM USB connectat %(device)s\n" "%(vendor)s %(model)s" #: ../tcos-devices-ng.py:811 #, python-format msgid "CDROM USB device %s" msgstr "Dispositiu CDROM USB %s" #: ../tcos-devices-ng.py:814 #, python-format msgid "Mount CDROM USB device %s" msgstr "Munta el dispositiu CDROM USB %s" #: ../tcos-devices-ng.py:815 #, python-format msgid "Umount CDROM USB device %s" msgstr "Desmunta el dispositiu CDROM USB %s" #: ../tcos-devices-ng.py:840 ../tcos-devices-ng.py:871 #: ../tcos-devices-ng.py:1001 ../tcos-devices-ng.py:1012 #: ../tcos-devices-ng.py:1058 ../tcos-devices-ng.py:1138 #: ../tcos-devices-ng.py:1149 ../tcos-devices-ng.py:1195 #, python-format msgid "Error, can't mount device %s" msgstr "S'ha produït un error, no es pot muntar el dispositiu %s" #: ../tcos-devices-ng.py:898 #, python-format msgid "" "From terminal %(host)s.\n" "Disconnected CDROM USB device %(device)s\n" "%(vendor)s %(model)s" msgstr "" "Des del terminal %(host)s.\n" "Dispositiu CDROM USB desconnectat %(device)s\n" "%(vendor)s %(model)s" #: ../tcos-devices-ng.py:926 #, python-format msgid "Can't umount cdrom usb %s" msgstr "No es pot desmuntar el cdrom usb %s" #: ../tcos-devices-ng.py:951 #, python-format msgid "" "From terminal %(host)s.\n" "Connected USB device %(device)s\n" "%(vendor)s %(model)s" msgstr "" "Des del terminal %(host)s.\n" "Dispositiu USB connectat %(device)s\n" "%(vendor)s %(model)s" #: ../tcos-devices-ng.py:954 #, python-format msgid "" "From terminal %(host)s.\n" "Disconnected USB device %(device)s\n" "%(vendor)s %(model)s" msgstr "" "Des del terminal %(host)s.\n" "Dispositiu USB desconnectat %(device)s\n" "%(vendor)s %(model)s" #: ../tcos-devices-ng.py:982 #, python-format msgid "USB device %s" msgstr "Dispositiu USB %s" #: ../tcos-devices-ng.py:985 #, python-format msgid "Mount USB device %s" msgstr "Munta el dispositiu USB %s" #: ../tcos-devices-ng.py:986 #, python-format msgid "Umount USB device %s" msgstr "Desmunta el dispositiu USB %s" #: ../tcos-devices-ng.py:1088 #, python-format msgid "" "From terminal %(host)s.\n" "Connected Firewire device %(device)s\n" "%(vendor)s %(model)s" msgstr "" "Des del terminal %(host)s.\n" "Dispositiu Firewire connectat %(device)s\n" "%(vendor)s %(model)s" #: ../tcos-devices-ng.py:1091 #, python-format msgid "" "From terminal %(host)s.\n" "Disconnected Firewire device %(device)s\n" "%(vendor)s %(model)s" msgstr "" "Des del terminal %(host)s.\n" "Dispositiu Firewire desconnectat %(device)s\n" "%(vendor)s %(model)s" #: ../tcos-devices-ng.py:1119 #, python-format msgid "Firewire device %s" msgstr "Dispositiu Firewire %s" #: ../tcos-devices-ng.py:1122 #, python-format msgid "Mount Firewire device %s" msgstr "Munta el dispositiu Firewire %s" #: ../tcos-devices-ng.py:1123 #, python-format msgid "Umount Firewire device %s" msgstr "Desmunta el dispositiu Firewire %s" #: ../tcos-devices-ng.py:1206 #, python-format msgid "CDROM USB device %s umounted. You can extract it." msgstr "Dispositiu CDROM USB %s desmuntat. Ara podeu extraure'l." #: ../tcos-devices-ng.py:1209 #, python-format msgid "CDROM USB device %s mounted. Ready for use." msgstr "Dispositiu CDROM USB %s muntat. Preparat per a usar." #: ../tcos-devices-ng.py:1247 #, python-format msgid "USB device %s umounted. You can extract it." msgstr "Dispositiu USB %s desmuntat. Ara podeu extraure'l." #: ../tcos-devices-ng.py:1250 #, python-format msgid "USB device %s mounted. Ready for use." msgstr "Dispositiu USB %s muntat. Preparat per a usar." #: ../tcos-devices-ng.py:1286 #, python-format msgid "Firewire device %s umounted. You can extract it." msgstr "Dispositiu Firewire %s desmuntat. Ara podeu extraure'l." #: ../tcos-devices-ng.py:1289 #, python-format msgid "Firewire device %s mounted. Ready for use." msgstr "Dispositiu Firewire %s muntat. Preparat per a usar." #: ../tcospersonalize.py:115 msgid "" "Need a host to configure!!!\n" "Try exec:\n" " tcospersonalize --host=XXX.XXX.XXX.XXX" msgstr "" "Es necessita una adreça d'equip a configurar!!!\n" "Proveu a executar:\n" " tcospersonalize --host=XXX.XXX.XXX.XXX" #: ../tcospersonalize.py:190 msgid "host: " msgstr "equip: " #: ../tcospersonalize.py:454 msgid "Host down, can't connect to tcosxmlrpc." msgstr "L'equip és inaccessible, no es pot connectar a tcosxmlrpc." #: ../tcospersonalize.py:462 #, python-format msgid "New %d drivers loaded from terminal." msgstr "S'han carregat %d controladors des del terminal." #: ../tcospersonalize.py:521 #, python-format msgid "Really delete config of %s?" msgstr "Esteu segur que voleu eliminar la configuració de %s?" #: ../tcospersonalize.py:524 msgid "Deleted!" msgstr "Esborrat!" #: ../tcos-volume-manager.py:101 ../tcos-volume-manager.py:113 #, python-format msgid "" "Tcos Sound levels on:\n" "%s" msgstr "" "Nivells de volum del TCOS en:\n" "%s" #: ../tcos-volume-manager.py:121 #, python-format msgid "ERROR: It appears that TcosXmlRpc is not running on %s." msgstr "ERROR: Sembla que el tcosxmlrpc no està en execució en %s" #: ../tcos-volume-manager.py:217 msgid "Loading channels info..." msgstr "S'està carregant la informació dels canals..." #: ../tcos-volume-manager.py:230 msgid "Error loading channels info (xauth error)" msgstr "" "S'ha produït un error en carregar la informació de canals (error de xauth)" #: ../tcos-volume-manager.py:233 ../ui/tcos-volume-manager.ui:8 msgid "Tcos Volume Manager" msgstr "Gestor de volum del TCOS" #: ../tcos-volume-manager.py:234 #, python-format msgid "Sound mixer of %s host" msgstr "Mesclador d'àudio de l'equip %s" #: ../tcos-volume-manager.py:300 ../tcosmonitor/extensions/info.py:442 msgid "Mute" msgstr "Sense so" #: ../tcos-volume-manager.py:319 msgid "Main controls ready" msgstr "Els controls principals estan preparats" #: ../tcos-volume-manager.py:323 msgid "All remote controls loaded." msgstr "Tots els controls remots estan carregats." #: ../tcos-volume-manager.py:332 ../tcosmonitor/extensions/info.py:557 #, python-format msgid "Changing value of %(channel)s channel, to %(value)s%%..." msgstr "S'està canviant el valor del canal %(channel)s, a %(value)s%%..." #: ../tcos-volume-manager.py:339 ../tcosmonitor/extensions/info.py:564 #, python-format msgid "Changed value of %(channel)s channel, to %(value)s" msgstr "S'ha canviat el valor del canal %(channel)s, a %(value)s" #: ../tcos-volume-manager.py:346 ../tcosmonitor/extensions/info.py:571 #, python-format msgid "Unmuting %s channel..." msgstr "S'està eliminant l'emmudiment al canal %s..." #: ../tcos-volume-manager.py:351 ../tcosmonitor/extensions/info.py:576 #, python-format msgid "Muting %s channel..." msgstr "S'està emmudint el canal %s..." #: ../tcos-volume-manager.py:354 ../tcosmonitor/extensions/info.py:579 #, python-format msgid "Status of %(channel)s channel, is \"%(newvalue)s\"" msgstr "L'estat del canal %(channel)s és \"%(newvalue)s\"" #: ../tcosmonitor/TcosDBus.py:94 msgid "TcosDBus not allowed in local display" msgstr "El TcosDBus no està permés en pantalla local." #: ../tcosmonitor/TcosDBus.py:122 #, python-format msgid "Seems that tcosxmlrpc isn't running on host=\"%s\"" msgstr "Sembla que el tcosxmlrpc no s'està executant en l'equip=\"%s\"" #: ../tcosmonitor/TcosDBus.py:143 msgid "tcosxmlrpc ERROR conection unavalaible." msgstr "S'ha produït un ERROR del tcosxmlrpc la connexió no està disponible" #: ../tcosmonitor/TcosDBus.py:159 msgid "ERROR conecting to tcosxmlrpc, check username and password." msgstr "" "No es pot connectar a tcosxmlrpc, comproveu el nom d'usuari i la contrasenya." #: ../tcosmonitor/TcosDBus.py:251 msgid "Message from admin" msgstr "Missatge de l'administrador" #: ../tcosmonitor/TcosDBus.py:341 ../tcosmonitor/TcosDBus.py:357 #: ../tcosmonitor/TcosDBus.py:375 ../tcosmonitor/TcosDBus.py:393 msgid "User not allowed to run this dbus call." msgstr "L'usuari no té permeses estes telefonades dbus." #: ../tcosmonitor/TcosStaticHosts.py:163 ../tcosmonitor/TcosListView.py:70 msgid "IP address" msgstr "Adreça IP" #: ../tcosmonitor/TcosStaticHosts.py:169 #: ../ui/tcosmonitor-staticwindownew.ui:68 msgid "MAC address" msgstr "Adreça MAC" #: ../tcosmonitor/TcosStaticHosts.py:279 msgid "No hosts found, please click on Refresh button using another method." msgstr "" "No s'han trobat equips, per favor, premeu el botó Actualitza usant un altre " "mètode." #: ../tcosmonitor/shared.py:108 msgid "Traditional list only" msgstr "Només la llista tradicional" #: ../tcosmonitor/shared.py:109 msgid "Icons only" msgstr "Només icones" #: ../tcosmonitor/shared.py:110 msgid "Simulate classroom" msgstr "Simula una aula" #: ../tcosmonitor/shared.py:111 msgid "Lists, icons and classroom with tabs" msgstr "Llistes, icones i aula amb pestanyes" #: ../tcosmonitor/shared.py:270 ../tcosmonitor/shared.py:312 #: ../tcosmonitor/TcosMenus.py:35 msgid "Terminal actions" msgstr "Accions per al terminal" #: ../tcosmonitor/shared.py:271 ../tcosmonitor/shared.py:313 #: ../tcosmonitor/TcosMenus.py:36 msgid "User actions" msgstr "Accions per a l'usuari" #: ../tcosmonitor/shared.py:272 ../tcosmonitor/shared.py:314 #: ../tcosmonitor/TcosMenus.py:37 msgid "Audio, video and files" msgstr "Fitxers d'àudio i vídeo" #: ../tcosmonitor/shared.py:279 ../tcosmonitor/extensions/info.py:47 msgid "Refresh terminal info" msgstr "Actualitza la informació del terminal" #: ../tcosmonitor/shared.py:280 ../tcosmonitor/extensions/clean.py:40 #: ../tcosmonitor/extensions/clean.py:41 msgid "Clean info about terminal" msgstr "Neteja la informació del terminal" #: ../tcosmonitor/shared.py:281 ../tcosmonitor/TcosTrayIcon.py:54 #: ../tcosmonitor/extensions/reboot.py:40 ../tcosmonitor/TcosTrayIcon2.py:58 msgid "Reboot" msgstr "Reinicia" #: ../tcosmonitor/shared.py:282 ../tcosmonitor/TcosTrayIcon.py:55 #: ../tcosmonitor/extensions/reboot.py:42 ../tcosmonitor/TcosTrayIcon2.py:59 msgid "Poweroff" msgstr "Apaga" #: ../tcosmonitor/shared.py:283 ../tcosmonitor/extensions/lockscreen.py:40 msgid "Lock screen" msgstr "Bloqueja la pantalla" #: ../tcosmonitor/shared.py:284 ../tcosmonitor/extensions/lockscreen.py:42 msgid "Unlock screen" msgstr "Desbloqueja la pantalla" #: ../tcosmonitor/shared.py:285 ../tcosmonitor/extensions/italc.py:43 msgid "Connect to remote screen (iTALC)" msgstr "Connecta a la pantalla remota (iTALC)" #: ../tcosmonitor/shared.py:286 ../tcosmonitor/extensions/vnc.py:54 msgid "Connect to remote screen (VNC)" msgstr "Connecta a la pantalla remota (VNC)" #: ../tcosmonitor/shared.py:287 ../tcosmonitor/extensions/screenshot.py:45 msgid "Screenshot" msgstr "Captura de pantalla" #: ../tcosmonitor/shared.py:288 ../tcosmonitor/extensions/remotessh.py:40 msgid "Give a remote xterm" msgstr "Executa un terminal xterm remot" #: ../tcosmonitor/shared.py:289 #: ../tcosmonitor/extensions/tcospersonalize.py:40 #: ../ui/tcosmonitor-prefwindow.ui:1324 msgid "Configure this host" msgstr "Configura este equip" #: ../tcosmonitor/shared.py:290 ../tcosmonitor/extensions/logout.py:40 msgid "Logout client" msgstr "Desconnecta el client" #: ../tcosmonitor/shared.py:291 ../tcosmonitor/extensions/restartxorg.py:41 msgid "Restart X session with new settings" msgstr "Reinicia la sessió X amb la nova configuració" #: ../tcosmonitor/shared.py:292 ../tcosmonitor/extensions/appsmsg.py:52 msgid "Exec app on user display" msgstr "Executa l'aplicació en la pantalla d'usuari" #: ../tcosmonitor/shared.py:293 ../tcosmonitor/extensions/appsmsg.py:53 msgid "Send a text message to user" msgstr "Envia un missatge de text a l'usuari" #: ../tcosmonitor/shared.py:294 ../tcosmonitor/extensions/viewproc.py:41 msgid "Show running apps of this client" msgstr "Mostra les aplicacions en execució d'este client" #: ../tcosmonitor/shared.py:295 ../tcosmonitor/shared.py:332 msgid "Audio/Video broadcast" msgstr "Difusió d'àudio/vídeo" #: ../tcosmonitor/shared.py:296 ../tcosmonitor/shared.py:333 #: ../tcosmonitor/extensions/sendfiles.py:49 #: ../tcosmonitor/extensions/sendfiles.py:50 #: ../ui/tcosmonitor-prefwindow.ui:1134 ../ui/tcosmonitor-prefwindow.ui:1475 #: ../ui/tcosmonitor-mainwindow.ui:387 msgid "Send files" msgstr "Envia els fitxers" #: ../tcosmonitor/shared.py:297 ../tcosmonitor/extensions/vnc.py:55 msgid "Demo mode (from this host)" msgstr "Mode de demostració (des d'este equip)" #: ../tcosmonitor/shared.py:298 ../tcosmonitor/extensions/wakeonlan.py:41 msgid "Boot client (WakeOnLan)" msgstr "Arranca el client (WakeOnLan)" #: ../tcosmonitor/shared.py:299 #: ../tcosmonitor/extensions/tcosnetcontroller.py:38 msgid "Lock internet" msgstr "Bloqueja Internet" #: ../tcosmonitor/shared.py:300 #: ../tcosmonitor/extensions/tcosnetcontroller.py:39 msgid "Unlock internet" msgstr "Desbloqueja Internet" #: ../tcosmonitor/shared.py:301 ../tcosmonitor/extensions/dpms.py:40 msgid "DPMS Power off monitor" msgstr "Desactiva el DPMS per al monitor (control d'energia del monitor)" #: ../tcosmonitor/shared.py:302 ../tcosmonitor/extensions/dpms.py:42 msgid "DPMS Power on monitor" msgstr "Activa el DPMS per al monitor (control d'energia del monitor)" #: ../tcosmonitor/shared.py:303 msgid "Send MIC audio (from this host)" msgstr "Envia àudio MIC (des d'este equip)" #: ../tcosmonitor/shared.py:321 ../tcosmonitor/extensions/reboot.py:41 msgid "Reboot all clients" msgstr "Reinicia tots els clients" #: ../tcosmonitor/shared.py:322 ../tcosmonitor/extensions/reboot.py:43 msgid "Poweroff all clients" msgstr "Apaga tots els clients" #: ../tcosmonitor/shared.py:323 ../tcosmonitor/extensions/lockscreen.py:41 msgid "Lock all screens" msgstr "Bloqueja totes les pantalles" #: ../tcosmonitor/shared.py:324 ../tcosmonitor/extensions/lockscreen.py:43 msgid "Unlock all screens" msgstr "Desbloqueja totes les pantalles" #: ../tcosmonitor/shared.py:325 ../tcosmonitor/extensions/logout.py:41 msgid "Logout clients" msgstr "Desconnecta tots els clients" #: ../tcosmonitor/shared.py:326 ../tcosmonitor/extensions/restartxorg.py:42 msgid "Restart X session of all clients" msgstr "Reinicia la sessió X de tots els clients" #: ../tcosmonitor/shared.py:327 ../tcosmonitor/extensions/appsmsg.py:55 msgid "Exec same app in all connected users" msgstr "Executa la mateixa aplicació en tots els usuaris connectats" #: ../tcosmonitor/shared.py:328 ../tcosmonitor/extensions/appsmsg.py:56 msgid "Send a text message to all connected users" msgstr "Envia un missatge de text a tots els usuaris connectats" #: ../tcosmonitor/shared.py:329 ../tcosmonitor/extensions/vnc.py:57 msgid "Enter demo mode, all connected users see my screen" msgstr "Entra en mode de demostració, tots els usuaris veuen la meua pantalla" #: ../tcosmonitor/shared.py:330 msgid "Enter conference mode, all connected users can hear me" msgstr "Entra en mode conferència, tots els usuaris poden escoltar-me" #: ../tcosmonitor/shared.py:331 ../tcosmonitor/extensions/screenshot.py:46 msgid "Capture All clients screens" msgstr "Captura totes les pantalles dels clients" #: ../tcosmonitor/shared.py:334 ../tcosmonitor/extensions/wakeonlan.py:42 msgid "Boot All clients (WakeOnLan)" msgstr "Arranca tots els clients (WakeOnLan)" #: ../tcosmonitor/shared.py:335 #: ../tcosmonitor/extensions/tcosnetcontroller.py:41 msgid "Lock internet in all connected users" msgstr "Bloqueja Internet a tots els usuaris connectats" #: ../tcosmonitor/shared.py:336 #: ../tcosmonitor/extensions/tcosnetcontroller.py:42 msgid "Unlock internet in all connected users" msgstr "Desbloqueja Internet a tots els usuaris connectats" #: ../tcosmonitor/shared.py:337 ../tcosmonitor/extensions/dpms.py:41 msgid "DPMS Power off monitors" msgstr "Desactiva el DPMS per als monitors (control d'energia del monitor)" #: ../tcosmonitor/shared.py:338 ../tcosmonitor/extensions/dpms.py:43 msgid "DPMS Power on monitors" msgstr "Activa el DPMS per als monitors (control d'energia del monitor)" #: ../tcosmonitor/shared.py:339 msgid "Chat audio conference" msgstr "Audioconferència" #: ../tcosmonitor/shared.py:340 ../tcosmonitor/extensions/livevnc.py:51 #: ../ui/tcosmonitor-prefwindow.ui:1342 msgid "Live view screens with VNC" msgstr "" #: ../tcosmonitor/shared.py:538 #, python-format msgid "QUESTION: %(txt)s, RESPONSE %(response)s" msgstr "PREGUNTA: %(txt)s, RESPOSTA %(response)s" #: ../tcosmonitor/shared.py:555 ../tcosmonitor/shared.py:566 #, python-format msgid "INFO: %s" msgstr "INFO: %s" # FIXME: handleme #: ../tcosmonitor/shared.py:577 #, python-format msgid "ERROR: %s" msgstr "ERROR: %s" #: ../tcosmonitor/TcosClassView.py:50 ../tcosmonitor/TcosIconView.py:47 msgid "IP" msgstr "IP" #: ../tcosmonitor/TcosClassView.py:51 ../tcosmonitor/TcosIconView.py:48 #: ../tcosmonitor/TcosListView.py:64 msgid "Hostname" msgstr "Nom de l'ordinador" #: ../tcosmonitor/TcosClassView.py:52 ../tcosmonitor/TcosIconView.py:49 #: ../tcosmonitor/TcosListView.py:76 msgid "Username" msgstr "Nom d'usuari" #: ../tcosmonitor/TcosClassView.py:53 ../tcosmonitor/TcosIconView.py:50 #: ../tcosmonitor/TcosListView.py:87 msgid "Logged" msgstr "Connectat" #: ../tcosmonitor/TcosClassView.py:54 ../tcosmonitor/TcosIconView.py:51 #: ../tcosmonitor/TcosListView.py:103 msgid "Time log in" msgstr "Temps de connexió" #: ../tcosmonitor/TcosClassView.py:55 ../tcosmonitor/TcosIconView.py:52 msgid "Screen locked" msgstr "Pantalla bloquejada" #: ../tcosmonitor/TcosClassView.py:56 ../tcosmonitor/TcosIconView.py:53 msgid "Network locked" msgstr "Xarxa bloquejada" #: ../tcosmonitor/TcosClassView.py:58 msgid "" "Place mouse on any computer to see brief info about it.\n" "You can select and unselect multiple host clicking on every one.\n" "Drag and drop hosts to positions and save clicking on right mouse button." msgstr "" "Moveu el ratolí sobre cada equip per a obtindre una informació breu de cada " "un.\n" "Podeu seleccionar i desseleccionar múltiples equips fent clic en cadascun.\n" "Arrossegueu i deixeu anar els equips a les posicions i guardeu-les fent clic " "amb el botó dret." #: ../tcosmonitor/TcosClassView.py:179 msgid "Positions reset to defaults." msgstr "Posicions reinicialitzades per defecte." #: ../tcosmonitor/TcosClassView.py:197 msgid "Positions saved." msgstr "Posicions guardades." #: ../tcosmonitor/TcosClassView.py:323 #, python-format msgid "%s is not a valid file to exe or send" msgstr "%s no és un fitxer vàlid per a executar-lo o enviar-lo" #: ../tcosmonitor/TcosClassView.py:409 ../tcosmonitor/TcosIconView.py:156 msgid "yes" msgstr "sí" #: ../tcosmonitor/TcosClassView.py:411 ../tcosmonitor/TcosIconView.py:158 msgid "no" msgstr "no" #: ../tcosmonitor/TcosTrayIcon.py:49 ../tcosmonitor/extensions/vnc.py:298 #: ../tcosmonitor/TcosTrayIcon2.py:53 ../ui/tcosmonitor-mainwindow.ui:23 msgid "Quit" msgstr "Ix" #: ../tcosmonitor/TcosTrayIcon.py:65 msgid "TcosDevices" msgstr "Dispositius TCOS" #: ../tcosmonitor/TcosTrayIcon.py:172 ../tcosmonitor/TcosTrayIcon.py:186 #: ../tcosmonitor/TcosTrayIcon2.py:67 msgid "Tcos Devices" msgstr "Dispositius TCOS" #: ../tcosmonitor/TcosTrayIcon.py:232 ../tcosmonitor/TcosTrayIcon2.py:351 msgid "Usb flash" msgstr "Memòria USB flash" #: ../tcosmonitor/TcosTrayIcon.py:234 ../tcosmonitor/TcosTrayIcon2.py:353 msgid "Mount USB1" msgstr "Munta USB1" #: ../tcosmonitor/TcosTrayIcon.py:235 ../tcosmonitor/TcosTrayIcon2.py:354 msgid "Umount USB1" msgstr "Desmunta USB1" #: ../tcosmonitor/extensions/lockscreen.py:49 #: ../tcosmonitor/extensions/lockscreen.py:57 msgid "" "Can't connect to tcosxmlrpc.\n" "Please verify user and password in prefences!" msgstr "" "No es pot connectar a tcosxmlrpc.\n" "Per favor verifiqueu l'usuari i la contrasenya en les preferències." #: ../tcosmonitor/extensions/lockscreen.py:81 #, python-format msgid "Do you want to lock the following screens: %s?" msgstr "Voleu bloquejar la pantalla dels següents equips: %s?" #: ../tcosmonitor/extensions/lockscreen.py:90 #, python-format msgid "Do you want to unlock the following screens: %s?" msgstr "Voleu desbloquejar la pantalla dels següents equips: %s?" #: ../tcosmonitor/extensions/appsmsg.py:64 msgid "Clients not connected" msgstr "No hi ha clients connectats" #: ../tcosmonitor/extensions/appsmsg.py:87 #, python-format msgid "" "Exec app in user(s) screen(s)\n" "or open web address to:\n" "%s" msgstr "" "Executa l'aplicació en la pantalla(s) d'usuari(s)\n" "o obri l'adreça web a:\n" "%s" #: ../tcosmonitor/extensions/appsmsg.py:89 #, python-format msgid "" "Send a message to:\n" "%s" msgstr "" "Envia un missatge a:\n" "%s" #: ../tcosmonitor/extensions/appsmsg.py:122 #: ../tcosmonitor/extensions/appsmsg.py:163 msgid "Can't exec application, user is not logged" msgstr "No es poden executar aplicacions, l'usuari no està connectat" #: ../tcosmonitor/extensions/appsmsg.py:141 #: ../tcosmonitor/extensions/appsmsg.py:152 #, python-format msgid "%s is not a valid application" msgstr "%s no és una aplicació vàlida" #: ../tcosmonitor/extensions/appsmsg.py:172 msgid "Can't send message, user is not logged" msgstr "No es poden enviar missatges, l'usuari no està connectat" #: ../tcosmonitor/extensions/appsmsg.py:289 #: ../tcosmonitor/extensions/appsmsg.py:298 #, python-format msgid "%s is not application" msgstr "%s no és una aplicació" #: ../tcosmonitor/extensions/appsmsg.py:353 #, python-format msgid "" "Error while exec remote app:\n" "Reason: %s" msgstr "" "S'ha produït un error quan s'executava aplicació remota:\n" "Raó: %s" #: ../tcosmonitor/extensions/appsmsg.py:360 #, python-format msgid "" "Error while send message:\n" "Reason: %s" msgstr "" "S'ha produït un error quan s'enviava un missatge:\n" "Raó: %s" #: ../tcosmonitor/extensions/remotessh.py:47 msgid "Enter password of remote thin client (if asked for it)" msgstr "Introduïu la contrasenya del client lleuger (si es demanara)" #: ../tcosmonitor/extensions/dpms.py:79 #, python-format msgid "Do you want to switch off the following monitors: %s?" msgstr "Voleu desconnectar els monitors següents: %s?" #: ../tcosmonitor/extensions/dpms.py:88 #, python-format msgid "Do you want to switch on the following monitors: %s?" msgstr "Voleu connectar els monitors següents: %s?" #: ../tcosmonitor/extensions/screenshot.py:66 #: ../tcosmonitor/extensions/screenshot.py:83 #, python-format msgid "Can't make screenshot, error: %s" msgstr "No es pot fer una captura de pantalla, error: %s" #: ../tcosmonitor/extensions/screenshot.py:75 msgid "Trying to order terminal to do a screenshot..." msgstr "S'està intentant manar al terminal que faça una captura de pantalla..." #: ../tcosmonitor/extensions/screenshot.py:87 msgid "Get another screenshot" msgstr "Fes una altra captura de pantalla" #: ../tcosmonitor/extensions/screenshot.py:102 #, python-format msgid "Screenshot of %s" msgstr "Captura de pantalla de %s" #: ../tcosmonitor/extensions/screenshot.py:125 #, python-format msgid "Screenshot of %s, done." msgstr "La captura de pantalla de %s està feta." #: ../tcosmonitor/extensions/screenshot.py:139 msgid "Save Screenshot" msgstr "Guarda la captura de pantalla" #: ../tcosmonitor/extensions/screenshot.py:151 msgid "Select file to save screenshot..." msgstr "Seleccioneu el fitxer per a guardar la captura de pantalla..." #: ../tcosmonitor/extensions/screenshot.py:155 #, python-format msgid "screenshot_of_%(hostname)s_date_%(date)s.png" msgstr "screenshot_of_%(hostname)s_date_%(date)s.png" #: ../tcosmonitor/extensions/screenshot.py:159 msgid "Image Files ( *.png, *.jpg)" msgstr "Fitxers d'imatge (*.png, *.jpg)" #: ../tcosmonitor/extensions/screenshot.py:169 msgid "File must be png or jpg." msgstr "El fitxer ha de ser png o jpg." #: ../tcosmonitor/extensions/screenshot.py:192 msgid "Screenshots of all hosts" msgstr "Captura de pantalla de tots els equips" #: ../tcosmonitor/extensions/screenshot.py:208 #, python-format msgid "Screenshot of %s" msgstr "Captura de pantalla de %s" #: ../tcosmonitor/extensions/sendfiles.py:62 #: ../tcosmonitor/extensions/sendfiles.py:120 msgid "Can't send files, user is not logged" msgstr "No es poden enviar fitxers, l'usuari no està connectat" #: ../tcosmonitor/extensions/sendfiles.py:66 #: ../tcosmonitor/extensions/sendfiles.py:142 #: ../tcosmonitor/extensions/sendfiles.py:237 msgid "" "TcosMonitor need special configuration for rsync daemon to send files.\n" "\n" "Please read configuration requeriments in:\n" "/usr/share/doc/tcosmonitor/README.rsync" msgstr "" "El TcosMonitor necessita una configuració especial del dimoni rsync per a " "enviar fitxers.\n" "\n" "Llegiu la configuració requerida en:\n" "/usr/share/doc/tcosmonitor/README.rsync" #: ../tcosmonitor/extensions/sendfiles.py:84 #: ../tcosmonitor/extensions/sendfiles.py:176 #: ../tcosmonitor/extensions/sendfiles.py:270 msgid "Waiting for send files..." msgstr "S'està esperant l'enviament de fitxers..." #: ../tcosmonitor/extensions/sendfiles.py:93 #: ../tcosmonitor/extensions/sendfiles.py:95 #: ../tcosmonitor/extensions/sendfiles.py:99 #: ../tcosmonitor/extensions/sendfiles.py:108 #: ../tcosmonitor/extensions/sendfiles.py:189 #: ../tcosmonitor/extensions/sendfiles.py:191 #: ../tcosmonitor/extensions/sendfiles.py:195 #: ../tcosmonitor/extensions/sendfiles.py:204 #: ../tcosmonitor/extensions/sendfiles.py:283 #: ../tcosmonitor/extensions/sendfiles.py:285 #: ../tcosmonitor/extensions/sendfiles.py:289 #: ../tcosmonitor/extensions/sendfiles.py:298 msgid "Teacher" msgstr "Mestre" #: ../tcosmonitor/extensions/sendfiles.py:95 #: ../tcosmonitor/extensions/sendfiles.py:108 #: ../tcosmonitor/extensions/sendfiles.py:191 #: ../tcosmonitor/extensions/sendfiles.py:204 #: ../tcosmonitor/extensions/sendfiles.py:285 #: ../tcosmonitor/extensions/sendfiles.py:298 #, python-format msgid "" "Teacher has sent some files to %(teacher)s folder:\n" "\n" "%(basenames)s" msgstr "" "El professor ha enviat diversos fitxers a la carpeta %(teacher)s:\n" "\n" "%(basenames)s" #: ../tcosmonitor/extensions/sendfiles.py:104 #: ../tcosmonitor/extensions/sendfiles.py:200 #: ../tcosmonitor/extensions/sendfiles.py:294 #: ../tcosmonitor/extensions/reboot.py:108 #: ../tcosmonitor/extensions/videolan.py:194 #: ../tcosmonitor/extensions/videolan.py:389 #: ../tcosmonitor/extensions/videolan.py:629 #, python-format msgid "" "Error while exec remote app:\n" "Reason:%s" msgstr "" "S'ha produït un error quan s'executava l'aplicació remota:\n" "Raó: %s" #: ../tcosmonitor/extensions/sendfiles.py:105 #: ../tcosmonitor/extensions/sendfiles.py:201 #: ../tcosmonitor/extensions/sendfiles.py:295 msgid "Error creating destination folder." msgstr "S'ha produït un error en crear el directori destinació." #: ../tcosmonitor/extensions/sendfiles.py:110 #: ../tcosmonitor/extensions/sendfiles.py:205 #: ../tcosmonitor/extensions/sendfiles.py:300 msgid "Files sent." msgstr "Fitxers enviats." #: ../tcosmonitor/extensions/sendfiles.py:125 #: ../tcosmonitor/extensions/sendfiles.py:220 msgid "Select file or files..." msgstr "Seleccioneu el fitxer o fitxers..." #: ../tcosmonitor/extensions/sendfiles.py:178 #: ../tcosmonitor/extensions/sendfiles.py:272 msgid "Do you want open file(s) on client?" msgstr "Voleu obrir el fitxer(s) en el client?" #: ../tcosmonitor/extensions/sendfiles.py:215 #: ../tcosmonitor/extensions/tcosnetcontroller.py:113 #: ../tcosmonitor/extensions/tcosnetcontroller.py:155 #: ../tcosmonitor/extensions/videolan.py:457 #: ../tcosmonitor/extensions/vnc.py:68 ../tcosmonitor/extensions/vnc.py:112 #: ../tcosmonitor/extensions/vnc.py:422 #: ../tcosmonitor/extensions/audiortp.py:229 #: ../tcosmonitor/extensions/audiortp.py:275 #: ../tcosmonitor/extensions/audiortp.py:373 #: ../tcosmonitor/extensions/audiortp.py:407 #: ../tcosmonitor/extensions/audiortp.py:460 msgid "No users logged." msgstr "No hi ha usuaris connectats." #: ../tcosmonitor/extensions/info.py:91 #, python-format msgid "Connecting with %s to retrieve some info..." msgstr "S'està connectant a %s per a rebre informació..." #: ../tcosmonitor/extensions/info.py:117 msgid "Tcos info" msgstr "Informació de Tcos" #: ../tcosmonitor/extensions/info.py:120 msgid "PXES info" msgstr "Informació de PXES" #: ../tcosmonitor/extensions/info.py:123 msgid "LTSP info" msgstr "Informació d'LTSP" #: ../tcosmonitor/extensions/info.py:126 msgid "Standalone info" msgstr "Informació de l'equip autònom" #: ../tcosmonitor/extensions/info.py:129 msgid "Unknow client info" msgstr "Informació de client desconegut" #: ../tcosmonitor/extensions/info.py:135 ../tcosmonitor/LocalData.py:43 #: ../tcosmonitor/LocalData.py:62 ../tcosmonitor/TcosCommon.py:182 #: ../tcosmonitor/TcosCommon.py:190 ../tcosmonitor/TcosCommon.py:206 #: ../tcosmonitor/TcosCommon.py:209 msgid "unknow" msgstr "desconegut" #: ../tcosmonitor/extensions/info.py:138 msgid "Hostname: " msgstr "Equip: " #: ../tcosmonitor/extensions/info.py:139 msgid "Ip address: " msgstr "Adreça IP: " #: ../tcosmonitor/extensions/info.py:140 msgid "TcosXmlRpc version: " msgstr "Versió de TcosXmlRpc: " #: ../tcosmonitor/extensions/info.py:149 msgid "Tcos image version: " msgstr "Versió de la imatge del TCOS: " #: ../tcosmonitor/extensions/info.py:150 msgid "Tcos image date: " msgstr "Data de la imatge del TCOS: " #: ../tcosmonitor/extensions/info.py:151 msgid "Date of thin client: " msgstr "Data del client lleuger: " #: ../tcosmonitor/extensions/info.py:152 msgid "Uptime: " msgstr "Temps encés: " #: ../tcosmonitor/extensions/info.py:163 msgid "Kernel info" msgstr "Informació del nucli" #: ../tcosmonitor/extensions/info.py:172 msgid "Force download and mount all modules" msgstr "Força la baixada i munta tots els mòduls" # Mozilla 1.3->groupByNone.label #: ../tcosmonitor/extensions/info.py:183 msgid "None" msgstr "Cap" #: ../tcosmonitor/extensions/info.py:186 msgid "Kernel version: " msgstr "Versió del nucli: " #: ../tcosmonitor/extensions/info.py:187 msgid "Kernel complete version: " msgstr "Versió completa del nucli: " #: ../tcosmonitor/extensions/info.py:188 msgid "Loaded Modules: " msgstr "Mòduls carregats: " #: ../tcosmonitor/extensions/info.py:189 msgid "Modules not found: " msgstr "Mòduls no trobats: " #: ../tcosmonitor/extensions/info.py:205 msgid "Cpu info: " msgstr "Informació de la CPU: " #: ../tcosmonitor/extensions/info.py:212 msgid "Cpu model: " msgstr "Model de CPU: " #: ../tcosmonitor/extensions/info.py:213 msgid "Cpu vendor: " msgstr "Venedor de la CPU: " #: ../tcosmonitor/extensions/info.py:214 msgid "Cpu speed: " msgstr "Velocitat de la CPU: " #: ../tcosmonitor/extensions/info.py:225 msgid "PCI buses: " msgstr "Busos PCI: " #: ../tcosmonitor/extensions/info.py:254 msgid "Process running: " msgstr "Processos en execució:" #: ../tcosmonitor/extensions/info.py:267 msgid "Ram info: " msgstr "Informació de la ram:" #: ../tcosmonitor/extensions/info.py:274 msgid "Total Ram: " msgstr "RAM total: " #: ../tcosmonitor/extensions/info.py:275 msgid "Free RAM: " msgstr "RAM lliure: " #: ../tcosmonitor/extensions/info.py:276 msgid "Active RAM: " msgstr "RAM activa: " #: ../tcosmonitor/extensions/info.py:279 msgid "Swap info: " msgstr "Informació de la SWAP:" #: ../tcosmonitor/extensions/info.py:285 msgid "Swap enabled: " msgstr "Swap activada: " #: ../tcosmonitor/extensions/info.py:286 msgid "Total Swap: " msgstr "Swap total: " #: ../tcosmonitor/extensions/info.py:287 msgid "Used Swap: " msgstr "Swap usada: " #: ../tcosmonitor/extensions/info.py:297 msgid "Network info: " msgstr "Informació de la xarxa:" #: ../tcosmonitor/extensions/info.py:307 msgid "Network hostname: " msgstr "Nom de màquina de xarxa: " #: ../tcosmonitor/extensions/info.py:308 msgid "Network IP: " msgstr "Adreça IP: " #: ../tcosmonitor/extensions/info.py:309 msgid "Network MASK: " msgstr "Màscara de xarxa: " #: ../tcosmonitor/extensions/info.py:310 msgid "Network MAC: " msgstr "Xarxa de MAC: " #: ../tcosmonitor/extensions/info.py:311 msgid "Data received(rx): " msgstr "Dades rebudes(rx): " #: ../tcosmonitor/extensions/info.py:312 msgid "Data send(tx): " msgstr "Dades enviades(tx): " #: ../tcosmonitor/extensions/info.py:322 ../ui/tcosmonitor-prefwindow.ui:911 msgid "Xorg info" msgstr "Informació de l'Xorg" #: ../tcosmonitor/extensions/info.py:348 msgid "enabled" msgstr "activat" #: ../tcosmonitor/extensions/info.py:350 msgid "disabled" msgstr "desactivat" #: ../tcosmonitor/extensions/info.py:353 ../ui/tcospersonalize.ui:159 msgid "X Session Type" msgstr "Tipus de sessió X" #: ../tcosmonitor/extensions/info.py:355 ../ui/tcospersonalize.ui:201 msgid "Xorg Driver" msgstr "Controlador d'Xorg" #: ../tcosmonitor/extensions/info.py:357 ../ui/tcospersonalize.ui:94 msgid "Xorg Resolution" msgstr "Resolució de l'Xorg" #: ../tcosmonitor/extensions/info.py:359 ../ui/tcospersonalize.ui:133 msgid "Xorg Color depth" msgstr "Profunditat de color de l'Xorg" #: ../tcosmonitor/extensions/info.py:361 ../ui/tcospersonalize.ui:179 msgid "DPMS energy monitor control" msgstr "Control d'energia del monitor DPMS" #: ../tcosmonitor/extensions/info.py:363 msgid "Disable kill X with Ctrl+Alt+Backspace" msgstr "Inhabilita matar l'X amb Ctrl+Alt+Backspace" #: ../tcosmonitor/extensions/info.py:365 ../ui/tcospersonalize.ui:57 msgid "Enable mouse wheel" msgstr "Activa la roda del ratolí" #: ../tcosmonitor/extensions/info.py:367 msgid "Refresh rate" msgstr "Taxa de refresc" #: ../tcosmonitor/extensions/info.py:369 msgid "Xorg font server" msgstr "Servidor de tipus de lletra de l'Xorg" #: ../tcosmonitor/extensions/info.py:371 msgid "Mouse device" msgstr "Dispositiu del ratolí" #: ../tcosmonitor/extensions/info.py:373 msgid "Mouse protocol" msgstr "Protocol del ratolí" #: ../tcosmonitor/extensions/info.py:375 ../ui/tcospersonalize.ui:273 msgid "X Horiz sync" msgstr "Sincronització horitzontal X" #: ../tcosmonitor/extensions/info.py:377 ../ui/tcospersonalize.ui:284 msgid "X Vert sync" msgstr "Sincronització vertical X" #: ../tcosmonitor/extensions/info.py:390 msgid "PulseAudio Sound server is running" msgstr "El servidor PulseAudio està en funcionament" #: ../tcosmonitor/extensions/info.py:408 msgid "Remote Sound Mixer" msgstr "Mesclador de so remot" #: ../tcosmonitor/extensions/info.py:480 msgid "PulseAudio Control" msgstr "Control de PulseAudio" #: ../tcosmonitor/extensions/info.py:485 msgid "PulseAudio Meter" msgstr "Comptador de PulseAudio " #: ../tcosmonitor/extensions/info.py:490 msgid "PulseAudio Manager" msgstr "Gestor de PulseAudio" #: ../tcosmonitor/extensions/info.py:494 msgid "PulseAudio utils: " msgstr "Utilitats de PulseAudio: " #: ../tcosmonitor/extensions/info.py:500 msgid "PulseAudio stats" msgstr "Estadístiques de PulseAudio: " #: ../tcosmonitor/extensions/info.py:512 msgid "Currently in use" msgstr "Actualment en ús" #: ../tcosmonitor/extensions/info.py:513 msgid "Allocated during whole lifetime" msgstr "S'ha assignat per sempre" #: ../tcosmonitor/extensions/info.py:514 msgid "Sample cache size" msgstr "Mida de la memòria cau de mostra" #: ../tcosmonitor/extensions/info.py:515 msgid "User name" msgstr "Nom d'usuari" #: ../tcosmonitor/extensions/info.py:516 msgid "Host Name" msgstr "Nom de l'ordinador" #: ../tcosmonitor/extensions/info.py:517 msgid "Server Name" msgstr "Nom del servidor" #: ../tcosmonitor/extensions/info.py:518 msgid "Server Version" msgstr "Versió del servidor" #: ../tcosmonitor/extensions/info.py:519 msgid "Default Sample Specification" msgstr "Especificació de la mostra per defecte" #: ../tcosmonitor/extensions/info.py:520 msgid "Default Sink" msgstr "Eixida d'àudio per defecte" #: ../tcosmonitor/extensions/info.py:521 msgid "Default Source" msgstr "Entrada d'àudio per defecte" #: ../tcosmonitor/extensions/info.py:522 msgid "Cookie" msgstr "Galleta" #: ../tcosmonitor/extensions/info.py:528 msgid "Sound server is not running" msgstr "El servidor de so no està en funcionament" #: ../tcosmonitor/extensions/info.py:589 ../tcosmonitor/extensions/info.py:597 #: ../tcosmonitor/extensions/info.py:605 msgid "PulseAudio apps need /dev/shm." msgstr "L'aplicació PulseAudio necessita /dev/shm" #: ../tcosmonitor/extensions/logout.py:48 #: ../tcosmonitor/extensions/logout.py:71 msgid "User not logged" msgstr "L'usuari no està connectat." #: ../tcosmonitor/extensions/logout.py:51 #, python-format msgid "Do you want to logout user: %s?" msgstr "Voleu desconnectar l'usuari: %s?" #: ../tcosmonitor/extensions/logout.py:55 #: ../tcosmonitor/extensions/logout.py:77 #, python-format msgid "Session will close in %s seconds" msgstr "La sessió es tancarà en %s segons" #: ../tcosmonitor/extensions/logout.py:73 #, python-format msgid "Do you want to logout the following users: %s?" msgstr "Voleu desconnectar els següents usuaris: %s?" #: ../tcosmonitor/extensions/reboot.py:48 #, python-format msgid "Do you want to reboot: %s?" msgstr "Voleu tornar a arracar: %s?" #: ../tcosmonitor/extensions/reboot.py:51 #: ../tcosmonitor/extensions/reboot.py:61 #, python-format msgid "Pc will reboot in %s seconds" msgstr "L'equip es reiniciarà en %s segons" #: ../tcosmonitor/extensions/reboot.py:58 #, python-format msgid "Do you want to reboot the following clients: %s?" msgstr "Voleu tornar a arracar els clients següents: %s?" #: ../tcosmonitor/extensions/reboot.py:67 #, python-format msgid "Do you want to poweroff: %s?" msgstr "Voleu apagar l'equip: %s?" #: ../tcosmonitor/extensions/reboot.py:70 #: ../tcosmonitor/extensions/reboot.py:80 #, python-format msgid "Pc will shutdown in %s seconds" msgstr "L'equip s'apagarà en %s segons" #: ../tcosmonitor/extensions/reboot.py:77 #, python-format msgid "Do you want to poweroff the following clients: %s?" msgstr "Voleu apagar els clients següents: %s?" #: ../tcosmonitor/extensions/tcosnetcontroller.py:50 #: ../tcosmonitor/extensions/tcosnetcontroller.py:109 msgid "Internet connection has been disabled" msgstr "La connexió a Internet s'ha inhabilitat" #: ../tcosmonitor/extensions/tcosnetcontroller.py:54 msgid "Can't disable internet, user is not logged" msgstr "No es pot inhabilitar Internet, l'usuari no està connectat" #: ../tcosmonitor/extensions/tcosnetcontroller.py:59 #: ../tcosmonitor/extensions/tcosnetcontroller.py:85 #: ../tcosmonitor/extensions/tcosnetcontroller.py:103 #: ../tcosmonitor/extensions/tcosnetcontroller.py:147 #, python-format msgid "" "In order to lock and unlock internet you need to be in 'tcos' group.\n" "\n" "Exe by root: adduser %s tcos" msgstr "" "Per a bloquejar i desbloquejar internet heu de estar en el grup 'tcos'.\n" "\n" "Executeu com a root: adduser %s tcos" #: ../tcosmonitor/extensions/tcosnetcontroller.py:77 #: ../tcosmonitor/extensions/tcosnetcontroller.py:151 msgid "Internet connection has been enabled" msgstr "La connexió a Internet s'ha habilitat" #: ../tcosmonitor/extensions/tcosnetcontroller.py:81 msgid "Can't enable internet, user is not logged" msgstr "No es pot habilitar Internet, l'usuari no està connectat" #: ../tcosmonitor/extensions/tcosnetcontroller.py:116 #, python-format msgid "Do you want disable internet to following users: %s?" msgstr "Voleu inhabilitar Internet als següents usuaris: %s?" #: ../tcosmonitor/extensions/tcosnetcontroller.py:158 #, fuzzy, python-format msgid "Do you want enable internet to following users:%s?" msgstr "Voleu habilitar Internet als següents usuaris: %s?" #: ../tcosmonitor/extensions/videolan.py:48 #: ../tcosmonitor/extensions/videolan.py:49 msgid "Send Audio/Video broadcast" msgstr "Envia difusió d'àudio/vídeo" #: ../tcosmonitor/extensions/videolan.py:65 #: ../tcosmonitor/extensions/videolan.py:219 msgid "Can't send video broadcast, user is not logged" msgstr "No es pot enviar la difusió de vídeo, l'usuari no està connectat" #: ../tcosmonitor/extensions/videolan.py:149 #: ../tcosmonitor/extensions/videolan.py:347 #: ../tcosmonitor/extensions/videolan.py:578 #, python-format msgid "" "Not allowed white spaces in \"%s\".\n" "Please rename it." msgstr "" "No es permeten espais en \"%s\".\n" "Reanomeneu-lo." #: ../tcosmonitor/extensions/videolan.py:159 #: ../tcosmonitor/extensions/videolan.py:359 #: ../tcosmonitor/extensions/videolan.py:594 msgid "Waiting for start video transmission..." msgstr "S'està esperant per a arrancar la transmissió de vídeo..." #: ../tcosmonitor/extensions/videolan.py:167 #: ../tcosmonitor/extensions/videolan.py:367 #: ../tcosmonitor/extensions/videolan.py:602 #: ../tcosmonitor/extensions/vnc.py:98 ../tcosmonitor/extensions/vnc.py:407 msgid "Error while exec app" msgstr "S'ha produït un error quan s'executava l'aplicació" #: ../tcosmonitor/extensions/videolan.py:199 #: ../tcosmonitor/extensions/videolan.py:393 #: ../tcosmonitor/extensions/videolan.py:634 msgid "Running in broadcast video transmission." msgstr "S'està executant en mode de difusió de vídeo." #: ../tcosmonitor/extensions/videolan.py:208 #: ../tcosmonitor/extensions/videolan.py:402 #, python-format msgid "" "Running in broadcast video transmission to user %(host)s. Broadcast Nº %" "(count)s" msgstr "" "S'està executant en mode de difusió de vídeo a l'usuari %(host)s. Difusió " "núm. %(count)s" #: ../tcosmonitor/extensions/videolan.py:311 #: ../tcosmonitor/extensions/videolan.py:541 msgid "Select audio/video file.." msgstr "Selecciona el fitxer d'àudio/vídeo..." #: ../tcosmonitor/extensions/videolan.py:314 #: ../tcosmonitor/extensions/videolan.py:544 msgid "Play DVD" msgstr "Reproduïx el DVD" #: ../tcosmonitor/extensions/videolan.py:315 #: ../tcosmonitor/extensions/videolan.py:545 msgid "Play SVCD/VCD" msgstr "Reproduïx el SVCD/VCD" #: ../tcosmonitor/extensions/videolan.py:316 #: ../tcosmonitor/extensions/videolan.py:546 msgid "Play AudioCD" msgstr "Reproduïx l'àudioCD" #: ../tcosmonitor/extensions/videolan.py:361 #: ../tcosmonitor/extensions/videolan.py:596 msgid "" "First select the DVD chapter or play movie\n" "then press enter to send clients..." msgstr "" "Primer seleccioneu el capítol del DVD o reproduïu la pel·lícula\n" "després, premeu retorn per a enviar-ho als clients..." #: ../tcosmonitor/extensions/videolan.py:370 msgid "Lock keyboard and mouse on client?" msgstr "Voleu bloquejar el teclat i el ratolí del client?" #: ../tcosmonitor/extensions/videolan.py:444 msgid "Video broadcast stopped." msgstr "La difusió de vídeo està parada." #: ../tcosmonitor/extensions/videolan.py:605 msgid "Lock keyboard and mouse on clients?" msgstr "Voleu bloquejar el teclat i el ratolí en els clients?" #: ../tcosmonitor/extensions/videolan.py:643 #, python-format msgid "Running in broadcast video transmission. Broadcast Nº %s" msgstr "S'està executant en mode de difusió de vídeo. Difusió núm. %s" #: ../tcosmonitor/extensions/restartxorg.py:51 #, python-format msgid "Restart X session of %s with new config?" msgstr "Voleu reiniciar la sessió X de %s amb la nova configuració?" #: ../tcosmonitor/extensions/restartxorg.py:64 #, python-format msgid "%s is not supported to restart Xorg!" msgstr "%s no permet reiniciar l'Xorg!" #: ../tcosmonitor/extensions/restartxorg.py:78 msgid "No thin clients found." msgstr "No s'han trobat clients lleugers." #: ../tcosmonitor/extensions/restartxorg.py:81 #, python-format msgid "Do you want to restart X screens (only thin clients):%s?" msgstr "" "Voleu reiniciar les sessions X dels següents equips (només clients lleugers):" "%s?" #: ../tcosmonitor/extensions/italc.py:51 ../tcosmonitor/extensions/vnc.py:135 msgid "No user logged." msgstr "L'usuari no està connectat." #: ../tcosmonitor/extensions/italc.py:75 msgid "Can't start IVS, please add iTALC support" msgstr "No es pot arrancar el procés IVS. Afegiu el suport per a iTALC" #: ../tcosmonitor/extensions/tcospersonalize.py:54 #, python-format msgid "%s is not supported to personalize!" msgstr "%s no permet personalitzar!" #: ../tcosmonitor/extensions/vnc.py:71 #, python-format msgid "Do you want to start demo mode the following users: %s?" msgstr "Voleu iniciar en mode demostració els següents usuaris: %s?" #: ../tcosmonitor/extensions/vnc.py:83 msgid "Waiting for start demo mode..." msgstr "S'està esperant l'arrancada del mode demostració..." #: ../tcosmonitor/extensions/vnc.py:116 ../tcosmonitor/extensions/vnc.py:426 #, python-format msgid "Running in demo mode with %s clients." msgstr "S'està executant en mode demostració amb %s equips." #: ../tcosmonitor/extensions/vnc.py:127 #, python-format msgid "Running in demo mode from server. Demo Nº %s" msgstr "" "S'està executant en mode demostració des del servidor. Demostració núm. %s" #: ../tcosmonitor/extensions/vnc.py:149 ../tcosmonitor/extensions/vnc.py:369 #, python-format msgid "Connecting with %s to start VNC support" msgstr "S'està connectant a %s per a arrancar el suport per a VNC" #: ../tcosmonitor/extensions/vnc.py:178 #, python-format msgid "" "Can't start VNC, error:\n" "%s" msgstr "" "S'ha produït un error, no es pot arrancar el VNC:\n" "%s" #: ../tcosmonitor/extensions/vnc.py:182 msgid "Waiting for start of VNC server..." msgstr "S'està esperant que comence el servidor VNC..." #: ../tcosmonitor/extensions/vnc.py:211 msgid "Can't start VNC, please add X11VNC support" msgstr "No es pot arrancar el VNC, per favor afegiu el suport per a X11VNC." #: ../tcosmonitor/extensions/vnc.py:237 msgid "Switch to view only" msgstr "" #: ../tcosmonitor/extensions/vnc.py:242 ../tcosmonitor/extensions/vnc.py:273 msgid "Switch to full control" msgstr "" #: ../tcosmonitor/extensions/vnc.py:269 #, python-format msgid "VNC host %s" msgstr "" #: ../tcosmonitor/extensions/vnc.py:281 msgid "Switch to fullscreen" msgstr "" # Netscape_4.7->Dialog Box Control:TEXTIMP.DLL #: ../tcosmonitor/extensions/vnc.py:290 #: ../tcosmonitor/extensions/livevnc.py:72 #: ../tcosmonitor/TcosPreferences.py:539 ../tcosmonitor/TcosExtensions.py:338 msgid "Stop" msgstr "Para" #: ../tcosmonitor/extensions/vnc.py:342 msgid "Can't start demo mode, user is not logged" msgstr "No es pot arrancar el mode demostració, l'usuari no està connectat" #: ../tcosmonitor/extensions/vnc.py:345 #, python-format msgid "Do you want demo mode from user %s?" msgstr "Voleu iniciar el mode demostració des de l'usuari %s?" #: ../tcosmonitor/extensions/vnc.py:392 #, python-format msgid "Waiting for start demo mode from user %s..." msgstr "S'està esperant l'arrancada del mode demostració des de l'usuari %s..." #: ../tcosmonitor/extensions/vnc.py:446 #, python-format msgid "Running in demo mode from user %(host)s. Demo Nº %(count)s" msgstr "" "S'està executant en mode demostració des de l'usuari %(host)s. Demostració " "núm. %(count)s" #: ../tcosmonitor/extensions/vnc.py:501 msgid "Demo mode off." msgstr "El mode demostració està desactivat." #: ../tcosmonitor/extensions/wakeonlan.py:50 #: ../tcosmonitor/extensions/wakeonlan.py:75 msgid "" "Wake On Lan only works with static list.\n" "\n" "Enable scan method \"static\" in Preferences\n" "and (wake on lan) support in bios of clients." msgstr "" "L'arrancada per xarxa només funciona amb llista estática.\n" "\n" "Activa el mètode d'escaneig \"static\" en Preferències\n" "i el suport (wake on lan) en la bios dels clients." #: ../tcosmonitor/extensions/wakeonlan.py:54 #, python-format msgid "Do you want boot %s client?" msgstr "Voleu arrancar el client %s ?" #: ../tcosmonitor/extensions/wakeonlan.py:67 #: ../tcosmonitor/extensions/wakeonlan.py:91 #, python-format msgid "No register MAC address for ip: \"%s\"" msgstr "No hi ha cao adreça MAC per a l'IP: \"%s\"" #: ../tcosmonitor/extensions/wakeonlan.py:71 #: ../tcosmonitor/extensions/wakeonlan.py:98 #, python-format msgid "Not valid MAC address: \"%s\"" msgstr "L'adreça MAC no és vàlida: \"%s\"" #: ../tcosmonitor/extensions/wakeonlan.py:79 msgid "Do you want boot all clients?" msgstr "Voleu arrancar tots els clients?" #: ../tcosmonitor/extensions/livevnc.py:76 #, fuzzy msgid "Live view of all hosts" msgstr "Captura de pantalla de tots els equips" #: ../tcosmonitor/extensions/livevnc.py:194 msgid "Running in LiveView mode" msgstr "" #: ../tcosmonitor/extensions/viewproc.py:48 msgid "Can't show runnings apps, user is not logged" msgstr "" "No es poden veure les aplicacions en execució, l'usuari no està connectat." #: ../tcosmonitor/extensions/viewproc.py:58 msgid "User not connected, no processes." msgstr "L'usuari no està connectat, no existixen processos." #: ../tcosmonitor/extensions/viewproc.py:76 #, python-format msgid "Running processes for user \"%s\": " msgstr "S'estan executant els processos per a l'usuari \"%s\":" #: ../tcosmonitor/extensions/viewproc.py:80 msgid "" "ALERT: There are some system process hidden. Enable it in Preferences dialog." msgstr "" "AVÍS: Hi ha diversos processos del sistema ocults. Podeu activar-los en la " "finestra de Preferències." # Projecte_Gnome_2.2 [libgtop.libgtop-GNOME-2-0-port.ca.po] #: ../tcosmonitor/extensions/viewproc.py:85 msgid "Pid" msgstr "Identificador de procés" #: ../tcosmonitor/extensions/viewproc.py:86 msgid "Process command" msgstr "Orde del procés" #: ../tcosmonitor/extensions/viewproc.py:91 msgid "Kill this process" msgstr "Mata este procés" #: ../tcosmonitor/extensions/viewproc.py:127 msgid "Are you sure you want to stop this process?" msgstr "Esteu segur que voleu parar este procés?" #: ../tcosmonitor/extensions/viewproc.py:136 #, python-format msgid "" "Error while killing app:\n" "Reason: %s" msgstr "" "S'ha produït un error quan es tancava l'aplicació:\n" "Raó: %s" #: ../tcosmonitor/extensions/audiortp.py:49 #: ../ui/tcosmonitor-mainwindow.ui:163 msgid "Send audio conference" msgstr "Envia audioconferència" #: ../tcosmonitor/extensions/audiortp.py:50 #: ../ui/tcosmonitor-prefwindow.ui:1507 msgid "Audio chat conference" msgstr "Xat d'audioconferència" #: ../tcosmonitor/extensions/audiortp.py:51 #: ../ui/tcosmonitor-mainwindow.ui:275 msgid "Audio chat list" msgstr "Llista de xats d'àudio" #: ../tcosmonitor/extensions/audiortp.py:52 msgid "Send audio conference (from this host)" msgstr "Envia audioconferència (des d'este equip)" #: ../tcosmonitor/extensions/audiortp.py:73 msgid "Emission" msgstr "Emissió" #: ../tcosmonitor/extensions/audiortp.py:79 msgid "State" msgstr "Estat" # Winrar 2.9->Dialog Box Control:rarlng.dll #: ../tcosmonitor/extensions/audiortp.py:83 msgid "Channel" msgstr "Canal" #: ../tcosmonitor/extensions/audiortp.py:235 #: ../tcosmonitor/extensions/audiortp.py:322 #: ../tcosmonitor/extensions/audiortp.py:413 msgid "" "Your pulseaudio server is too old.\n" "Is required pulseaudio version >= 0.9.10" msgstr "" "El vostre servidor de pulseaudio és molt antic.\n" "Es requerix una versió de pulseaudio >= 0.9.10" #: ../tcosmonitor/extensions/audiortp.py:238 #, python-format msgid "Do you want to start audio conference to the following users: %s?" msgstr "Voleu iniciar el mode d'audioconferència als usuaris següents: %s?" #: ../tcosmonitor/extensions/audiortp.py:243 msgid "You have entered in audio conference" msgstr "Heu entrat en audioconferència" #: ../tcosmonitor/extensions/audiortp.py:267 msgid "Waiting for start audio conference..." msgstr "S'està esperant l'arrancada de l'audioconferència..." #: ../tcosmonitor/extensions/audiortp.py:295 #: ../tcosmonitor/extensions/audiortp.py:390 #, python-format msgid "Running in audio conference with %s clients." msgstr "S'està executant en mode audioconferència amb %s clients." #: ../tcosmonitor/extensions/audiortp.py:305 #, python-format msgid "Running in audio conference from server. Conference Nº %s" msgstr "" "S'està executant en mode audioconferència des del servidor. Conferència núm. " "%s" #: ../tcosmonitor/extensions/audiortp.py:316 msgid "Can't start conference mode, user is not logged" msgstr "No es pot arrancar el mode conferència, l'usuari no està connectat" #: ../tcosmonitor/extensions/audiortp.py:325 #, python-format msgid "Do you want audio conference from user %s?" msgstr "Voleu iniciar el mode audioconferència des de l'usuari %s?" #: ../tcosmonitor/extensions/audiortp.py:331 #, python-format msgid "You have entered in audio conference from user %s" msgstr "Heu entrat en l'audioconferència des de l'usuari %s" #: ../tcosmonitor/extensions/audiortp.py:359 #, python-format msgid "Waiting for start audio conference from user %s..." msgstr "" "S'està esperant l'arrancada de l'audioconferència des de l'usuari %s..." #: ../tcosmonitor/extensions/audiortp.py:400 #, python-format msgid "Running in audio conference from user %(host)s. Conference Nº %(count)s" msgstr "" "S'està executant en mode audioconferència des de l'usuari %(host)s. " "Conferència núm. %(count)s" #: ../tcosmonitor/extensions/audiortp.py:416 #, python-format msgid "Do you want to start audio chat conference to the following users: %s?" msgstr "Voleu iniciar el mode xat d'audioconferència als usuaris següents: %s?" #: ../tcosmonitor/extensions/audiortp.py:421 #, python-format msgid "You have entered in audio chat conference. Participants: %s" msgstr "Heu entrat en el xat d'audioconferència. Participants: %s" #: ../tcosmonitor/extensions/audiortp.py:443 msgid "Waiting for start audio chat conference..." msgstr "S'està esperant l'arrancada del xat d'audioconferència..." #: ../tcosmonitor/extensions/audiortp.py:449 msgid "Do you want to connect to this audio chat conference now?" msgstr "Voleu connectar-vos a este xat d'audioconferecia ara?" #: ../tcosmonitor/extensions/audiortp.py:483 #, python-format msgid "Running in audio chat conference with %s clients." msgstr "S'està executant en mode xat d'audioconferència amb %s clients." #: ../tcosmonitor/extensions/audiortp.py:495 #, python-format msgid "Running in audio chat conference. Conference Nº %s" msgstr "S'està executant en mode xat d'audioconferència. Conferència núm. %s" #: ../tcosmonitor/extensions/audiortp.py:521 msgid "Conference mode off." msgstr "El mode conferència està desactivat." #: ../tcosmonitor/extensions/audiortp.py:540 msgid "Audio chat conference off." msgstr "Xat d'audioconferència desactivat." #: ../tcosmonitor/TcosXmlRpc.py:85 msgid "" "Username or password are empty,\n" "please edit in preferences dialog!" msgstr "" "L'usuari o la contrasenya estan buits,\n" "per favor, editeu el diàleg de preferències" #: ../tcosmonitor/TcosIconView.py:55 msgid "Place mouse on any computer to see brief info about it." msgstr "" "Moveu el ratolí per damunt de cada equip per a obtindre una descripció més " "detallada." #: ../tcosmonitor/TcosListView.py:82 msgid "Active" msgstr "Actiu" #: ../tcosmonitor/TcosListView.py:92 msgid "Screen Blocked" msgstr "Pantalla bloquejada" #: ../tcosmonitor/TcosListView.py:97 msgid "Num of process" msgstr "Nombre de processos" #: ../tcosmonitor/TcosListView.py:112 msgid "Sel" msgstr "Selecciona" #: ../tcosmonitor/TcosListView.py:148 #, python-format msgid "Error connecting to tcosxmlrpc in %s" msgstr "S'ha produït un error en connectar a tcosxmlrpc en %s" #: ../tcosmonitor/TcosTrayIcon2.py:154 #, fuzzy, python-format msgid "Floppy: %s" msgstr "Disquet" # FIXME: handleme #: ../tcosmonitor/TcosTrayIcon2.py:156 #, fuzzy, python-format msgid "CDROM: %s" msgstr "ERROR: %s" #: ../tcosmonitor/TcosTrayIcon2.py:158 #, fuzzy, python-format msgid "USB: %s" msgstr "Dispositiu USB %s" #: ../tcosmonitor/TcosTrayIcon2.py:160 #, fuzzy, python-format msgid "HDD partition: %s" msgstr "Partición del disc %s" #: ../tcosmonitor/TcosTrayIcon2.py:162 #, fuzzy, python-format msgid "Unknow: %s" msgstr "desconegut" #: ../tcosmonitor/Initialize.py:217 msgid "GPL-2 license file not found" msgstr "El fitxer de llicència GPL-2 no s'ha trobat" #: ../tcosmonitor/LocalData.py:212 #, python-format msgid "Selected network inteface (%s) don't have IP address" msgstr "La interfície de xarxa seleccionada (%s) no té adreça IP" #: ../tcosmonitor/LocalData.py:260 ../tcosmonitor/ping.py:108 #: ../tcosmonitor/ping.py:171 msgid "Testing if found clients have 8998 or 8999 port open..." msgstr "" "S'està comprovant si els clients trobats tenen el port 8998 o 8999 obert..." #: ../tcosmonitor/LocalData.py:282 msgid "" "Static list method configured but no hosts in list.\n" "\n" "Please, open preferences, click on 'Open Static Host list' and add some " "hosts." msgstr "" "Està configurat el mètode de llista estàtica d'equips però no hi ha equips " "en la llista.\n" "\n" "Per favor, obriu les preferències, feu clic en 'Obri la llista estàtica " "d'equips' i afegiu-ne alguns." #: ../tcosmonitor/TcosPreferences.py:264 msgid "" "You have select more than 5 button menus.\n" "Only allowed to select a maximum of 5 buttons." msgstr "" "Heu seleccionat més de 5 botons de menús.\n" "Només està permés seleccionar un màxim de 5 botons." #: ../tcosmonitor/TcosPreferences.py:275 msgid "New settings saved." msgstr "Configuració nova guardada." #: ../tcosmonitor/TcosMenus.py:102 ../tcosmonitor/TcosMenus.py:114 #, python-format msgid "Actions for %s" msgstr "Accions per a %s" #: ../tcosmonitor/TcosMenus.py:107 msgid "Actions for selected host" msgstr "Accions per a l'equip seleccionat" #: ../tcosmonitor/TcosMenus.py:168 ../tcosmonitor/TcosMenus.py:299 #, python-format msgid "%d hidden actions" msgstr "%d accions ocultes" #: ../tcosmonitor/TcosMenus.py:243 ../tcosmonitor/TcosMenus.py:245 msgid "Actions for selected hosts" msgstr "Accions per als equips seleccionats" #: ../tcosmonitor/TcosMenus.py:247 msgid "Actions for all hosts" msgstr "Accions per a tots els equips" #: ../tcosmonitor/TcosMenus.py:304 msgid "Save hosts positions" msgstr "Guarda les posicions dels equips" #: ../tcosmonitor/TcosMenus.py:312 msgid "Reset hosts positions" msgstr "Reinicialitza les posicions dels equips" #: ../tcosmonitor/ping.py:80 #, python-format msgid "Ping to %s..." msgstr "Ping a %s..." #: ../tcosmonitor/ping.py:89 msgid "Waiting for pings..." msgstr "S'estan esperant els pings..." #: ../tcosmonitor/ping.py:127 ../tcosmonitor/ping.py:192 #: ../tcosmonitor/TcosActions.py:185 ../tcosmonitor/TcosActions.py:264 msgid "Not connected hosts found." msgstr "No s'han trobat equips connectats." #: ../tcosmonitor/ping.py:134 ../tcosmonitor/ping.py:197 #: ../tcosmonitor/TcosActions.py:187 ../tcosmonitor/TcosActions.py:259 #, python-format msgid "Found %d hosts" msgstr "S'han trobat %d equips" #: ../tcosmonitor/TcosActions.py:162 ../tcosmonitor/TcosActions.py:241 msgid "Searching for connected hosts..." msgstr "S'estan buscant equips connectats..." #: ../tcosmonitor/TcosActions.py:1019 msgid "Searching info of hosts..." msgstr "S'està buscant informació d'equips..." #: ../tcosmonitor/TcosActions.py:1058 #, python-format msgid "Connecting to %s..." msgstr "S'està connectant a %s..." #: ../tcosmonitor/TcosExtensions.py:41 msgid "Exception:" msgstr "Excepció:" #: ../tcosmonitor/TcosExtensions.py:77 msgid "Error: no IP!" msgstr "Error: No s'ha indicat cap adreça IP." #: ../tcosmonitor/TcosExtensions.py:154 msgid "No clients connected, press refresh button." msgstr "No hi ha clients connectats, premeu el botó d'actualitzar." #: ../tcosmonitor/TcosExtensions.py:251 ../tcosmonitor/TcosExtensions.py:253 #, python-format msgid "Can't exec this action at '%s' because you are connected at this host!" msgstr "" "No es pot executar esta acció a '%s' perquè esteu connectat a este equip." #: ../tcosmonitor/TcosExtensions.py:267 #, python-format msgid "Doing action \"%(action)s\" in %(ip)s..." msgstr "S'està realitzant l'acció \"%(action)s\" en l'equip %(ip)s..." #: ../tcosmonitor/TcosExtensions.py:285 #, python-format msgid "Done action \"%(action)s\" in %(ip)s" msgstr "L'acció \"%(action)s\" s'ha acabat en %(ip)s" #: ../tcosmonitor/TcosCommon.py:89 #, python-format msgid "" "ThreadController: Found error executing %(cmd)s\n" "\n" "If problem persist, disable Thread Controller\n" "in Preferences and report bug.\n" "Error=%(error)s" msgstr "" "Controlador de fils: S'ha trobat un error en executar %(cmd)s\n" "\n" "Si el problema persistix, desactiveu el Controlador de fils\n" "en Preferències i informeu de l'error.\n" "Error=%(error)s" #: ../ui/tcosmonitor-prefwindow.ui:35 ../ui/tcospersonalize.ui:7 #: ../ui/tcosmonitor-mainwindow.ui:36 msgid "Preferences" msgstr "Preferències" #: ../ui/tcosmonitor-prefwindow.ui:62 msgid "Show host list on startup" msgstr "Mostra la llista d'equips a l'arrancada" #: ../ui/tcosmonitor-prefwindow.ui:80 msgid "Scan network method" msgstr "Mètode d'escaneig de xarxa" #: ../ui/tcosmonitor-prefwindow.ui:91 msgid "" "Network interface\n" "(thin client)" msgstr "" "Interfície de xarxa\n" "(clients lleugers)" #: ../ui/tcosmonitor-prefwindow.ui:127 msgid "Show system process" msgstr "Mostra els processos del sistema" #: ../ui/tcosmonitor-prefwindow.ui:144 #, fuzzy msgid "Don't do actions when running TcosMonitor in thin client" msgstr "" "No executes accions quan el Lliurex Lab s'execute des d'un client lleuger" #: ../ui/tcosmonitor-prefwindow.ui:163 msgid "List of hosts" msgstr "Llista d'equips" #: ../ui/tcosmonitor-prefwindow.ui:200 msgid "Open static host list" msgstr "Obri la llista d'equips estàtics" #: ../ui/tcosmonitor-prefwindow.ui:225 msgid "Only show hosts running tcosxmlrpc (8998 port)" msgstr "Mostra només els equips que executen amb tcosmxlrpc (port 8998)" #: ../ui/tcosmonitor-prefwindow.ui:242 #, fuzzy msgid "Only do all actions on selected hosts (requires restart TcosMonitor)" msgstr "" "Fes només les accions per a equips seleccionats (cal reiniciar el Lliurex " "Lab)" #: ../ui/tcosmonitor-prefwindow.ui:259 msgid "Enable SSL connections to XMLRPC clients" msgstr "Habilita les connexions SSL als clients XMLRPC" #: ../ui/tcosmonitor-prefwindow.ui:278 msgid "Host list mode" msgstr "Mode llista d'equips" #: ../ui/tcosmonitor-prefwindow.ui:302 msgid "Show right menu with groups (NEW)" msgstr "Mostra el menú de la dreta amb grups (NOU)" #: ../ui/tcosmonitor-prefwindow.ui:319 #, fuzzy msgid "Don't show thin client if TcosMonitor is running there" msgstr "" "No executes accions quan el Lliurex Lab s'execute des d'un client lleuger" # Winrar 2.9->String:rarlng.dll #: ../ui/tcosmonitor-prefwindow.ui:351 msgid "Settings" msgstr "Paràmetres" #: ../ui/tcosmonitor-prefwindow.ui:376 msgid "Update host list every (seg)" msgstr "Actualitza la llista d'equips cada (seg)" #: ../ui/tcosmonitor-prefwindow.ui:389 msgid "" "Update host list every selected seconds.\n" "\n" "Value=0 disable update." msgstr "" "Actualitza la llista d'equips cada nombre\n" "de segons seleccionat.\n" "Valor=0 inhabilita l'actualització." #: ../ui/tcosmonitor-prefwindow.ui:405 msgid "Cache timeout (seg)" msgstr "Temps de vida de la memòria cau (seg)" #: ../ui/tcosmonitor-prefwindow.ui:419 msgid "" "Cache some data and connection status during selected seconds.\n" "\n" "Value=0 disable cache." msgstr "" "Guarda en la memòria cau dades i l'estat de connexió durant el nombre de " "segons seleccionat.\n" "\n" "Valor=0 inhabilita la memòria cau." #: ../ui/tcosmonitor-prefwindow.ui:437 msgid "Screenshot size:" msgstr "Grandària de captura de pantalla:" #: ../ui/tcosmonitor-prefwindow.ui:450 ../ui/tcosmonitor-prefwindow.ui:479 msgid "% Size of screnshot." msgstr "%s de grandària de captura de pantalla." #: ../ui/tcosmonitor-prefwindow.ui:466 msgid "Mini screenshot size:" msgstr "Grandària de les minicaptures de pantalla:" #: ../ui/tcosmonitor-prefwindow.ui:495 msgid "Timeout actions (seg)" msgstr "Temps d'espera per a accions (seg)" #: ../ui/tcosmonitor-prefwindow.ui:508 msgid "" "Timeout in seg for actions\n" "\n" "Value=0 default" msgstr "" "Temps d'espera en segons per a accions\n" "\n" "Valor=per defecte 0" #: ../ui/tcosmonitor-prefwindow.ui:526 msgid "SSH remote username" msgstr "Usuari remot SSH" #: ../ui/tcosmonitor-prefwindow.ui:553 msgid "VLC method to send" msgstr "VLC mètode d'enviament" #: ../ui/tcosmonitor-prefwindow.ui:578 msgid "" "Experimental: Thread Controller\n" "( if you have problems, disable it )" msgstr "" "Experimental: Control de fils\n" "( Si teniu problemes, desactiveu-lo )" #: ../ui/tcosmonitor-prefwindow.ui:591 msgid "Actions controlled" msgstr "Accions controlades" #: ../ui/tcosmonitor-prefwindow.ui:611 msgid "Block ports: (80,8080... etc)" msgstr "Bloqueja els ports: (80,8080... etc)" #: ../ui/tcosmonitor-prefwindow.ui:653 ../ui/tcospersonalize.ui:333 msgid "Advanced" msgstr "Avançat" #: ../ui/tcosmonitor-prefwindow.ui:680 msgid "TcosXmlRpc username" msgstr "Usuari del TcosXmlRpc" #: ../ui/tcosmonitor-prefwindow.ui:706 msgid "TcosXmlRpc password" msgstr "Contrasenya del TcosXmlRpc" #: ../ui/tcosmonitor-prefwindow.ui:735 msgid "" "NOTE:\n" "Default user is root and default password is root.\n" "\n" "For thin clients change TCOS_ROOT_PASSWD or use TcosConfig and " "regenerate boot images again.\n" "\n" "For standalone users you can use a system account (root) but this is " "not recomended. Install tcos-standalone and start it by root. Set user and " "password, this will create a /etc/tcospasswd file only used by TCOS " "and your root acount will be secure." msgstr "" "NOTA:\n" "L'usuari per defecte és root i la contrasenya és root.\n" "\n" "Per a clients lleugers canvieu el TCOS_ROOT_PASSWD o utilitzeu el " "TcosConfig i regenereu les imatges d'arrancada de nou.\n" "\n" "Per a equips autònoms(standalone) podeu utilitzar el compte del " "sistema (root) però això no és recomandable. Instal·leu el paquet tcos-" "standalone i executeu-ho com a administrador. Establiu un usuari i una " "contrasenya.La contrasenya es guardarà en /etc/tcospasswd, fitxer que " "només el necessita el TCOS perquè el vostre compte de superusuari (root) " "estiga segur." #: ../ui/tcosmonitor-prefwindow.ui:772 msgid "Authentication " msgstr "Autenticació" #: ../ui/tcosmonitor-prefwindow.ui:795 msgid "Info avalaible from tcosxmlrpc" msgstr "Informació disponible de tcosxmlrpc" #: ../ui/tcosmonitor-prefwindow.ui:806 msgid "Tcos general info" msgstr "Informació general de Tcos" #: ../ui/tcosmonitor-prefwindow.ui:821 msgid "Cpu info" msgstr "Informació de la CPU" #: ../ui/tcosmonitor-prefwindow.ui:836 msgid "Kernel and modules info" msgstr "Informació del nucli i els mòduls" #: ../ui/tcosmonitor-prefwindow.ui:851 msgid "PCI bus info" msgstr "Informació del bus PCI" #: ../ui/tcosmonitor-prefwindow.ui:866 msgid "Ram and swap info" msgstr "Informació de la RAM i la SWAP" #: ../ui/tcosmonitor-prefwindow.ui:881 msgid "Process info" msgstr "Informació de processos" #: ../ui/tcosmonitor-prefwindow.ui:896 msgid "Network info" msgstr "Informació de la xarxa" #: ../ui/tcosmonitor-prefwindow.ui:926 msgid "Sound server info" msgstr "Informació del servidor de so" #: ../ui/tcosmonitor-prefwindow.ui:962 msgid "Avalaible info" msgstr "Informació disponible" #: ../ui/tcosmonitor-prefwindow.ui:985 msgid "Show / hide menu items" msgstr "Mostra / oculta elements de menú" #: ../ui/tcosmonitor-prefwindow.ui:1003 msgid "Lock and unlock screen" msgstr "Bloqueja i desbloqueja pantalles" #: ../ui/tcosmonitor-prefwindow.ui:1019 msgid "Remote SSH shell" msgstr "Intèrpret d'ordes SSH remot" #: ../ui/tcosmonitor-prefwindow.ui:1037 msgid "Configure Xorg settings" msgstr "Configura els paràmetres de l'Xorg" #: ../ui/tcosmonitor-prefwindow.ui:1066 ../ui/tcosmonitor-prefwindow.ui:1427 msgid "Exe app on user display" msgstr "Executa l'aplicació en la pantalla de l'usuari" #: ../ui/tcosmonitor-prefwindow.ui:1082 ../ui/tcosmonitor-prefwindow.ui:1441 msgid "Send a text message" msgstr "Envia un missatge de text" #: ../ui/tcosmonitor-prefwindow.ui:1100 msgid "Show running apps" msgstr "Mostra les aplicacions en execució" #: ../ui/tcosmonitor-prefwindow.ui:1116 ../ui/tcosmonitor-prefwindow.ui:1457 msgid "Send video broadcast" msgstr "Envia la difusió del vídeo" #: ../ui/tcosmonitor-prefwindow.ui:1150 msgid "Demo mode" msgstr "Mode demostració" #: ../ui/tcosmonitor-prefwindow.ui:1179 msgid "Wake on LAN" msgstr "Desperta per xarxa" #: ../ui/tcosmonitor-prefwindow.ui:1195 msgid "Audio conference mode" msgstr "Mode àudio conferència" #: ../ui/tcosmonitor-prefwindow.ui:1213 msgid "Screenshots" msgstr "Captures de pantalla" #: ../ui/tcosmonitor-prefwindow.ui:1229 msgid "Reboot and poweroff" msgstr "Apaga i reinicia" #: ../ui/tcosmonitor-prefwindow.ui:1243 msgid "Lock and unlock internet" msgstr "Bloqueja i desbloqueja Internet" #: ../ui/tcosmonitor-prefwindow.ui:1259 msgid "DPMS monitor on/off" msgstr "Control DPMS del monitor" #: ../ui/tcosmonitor-prefwindow.ui:1277 msgid "Connect using VNC" msgstr "Connecta usant el VNC" #: ../ui/tcosmonitor-prefwindow.ui:1293 msgid "Connect using iTALC" msgstr "Connecta usant l'iTALC" #: ../ui/tcosmonitor-prefwindow.ui:1308 msgid "Restart session with new settings" msgstr "Reinicia la sessió amb la nova configuració" #: ../ui/tcosmonitor-prefwindow.ui:1385 msgid "Menus" msgstr "Menús" #: ../ui/tcosmonitor-prefwindow.ui:1408 msgid "Show / hide menu buttons" msgstr "Mostra / oculta els botons del menú" #: ../ui/tcosmonitor-prefwindow.ui:1491 msgid "Audio conference" msgstr "Audioconferència" #: ../ui/tcosmonitor-prefwindow.ui:1525 msgid "Audio Chat control" msgstr "Control de xat d'àudio" #: ../ui/tcosmonitor-prefwindow.ui:1569 msgid "Menu buttons" msgstr "Botons de menú" #: ../ui/tcosmonitor-abouttcos.ui:6 msgid "About TCOS" msgstr "Quant al TCOS" #: ../ui/tcosmonitor-abouttcos.ui:19 msgid "TcosMonitor" msgstr "TcosMonitor" #: ../ui/tcosmonitor-abouttcos.ui:62 msgid "Version:" msgstr "Versió:" #: ../ui/tcosmonitor-abouttcos.ui:90 msgid "" "Thin client and standalone\n" "monitoring tool." msgstr "" #: ../ui/tcosmonitor-abouttcos.ui:131 msgid "Project web site" msgstr "Pàgina web del projecte" #: ../ui/tcosmonitor-abouttcos.ui:178 msgid "About" msgstr "Quant a" #: ../ui/tcosmonitor-abouttcos.ui:212 msgid "License" msgstr "Llicència" #: ../ui/tcosmonitor-abouttcos.ui:230 msgid "" "Main developers:\n" " * Mario Izquierdo \n" " * Ignacio Vidal \n" "\n" "Contributors:\n" " * Andrés Jimenez\n" " * Quirón\n" "\n" "Special thanks to:\n" " Comunidad de Madrid, MaX group (Spain)" msgstr "" "Programadors principals:\n" " * Mario Izquierdo \n" " * Ignacio Vidal \n" "\n" "Han contribuït:\n" " * Andrés Jimenez\n" " * Quirón\n" "\n" "Molt especialment gràcies a:\n" " Comunitat de Madrid, grup MaX (Espanya)" #: ../ui/tcosmonitor-abouttcos.ui:259 msgid "Authors" msgstr "Autors" #: ../ui/tcosmonitor-abouttcos.ui:275 msgid "Translated to your language by:" msgstr "Traduït al vostre idioma per:" #: ../ui/tcosmonitor-abouttcos.ui:287 msgid "Mario Izquierdo " msgstr "Pilar Embid (Lliurex) " #: ../ui/tcosmonitor-abouttcos.ui:307 msgid "Translators" msgstr "Traductors" #: ../ui/tcosmonitor-abouttcos.ui:324 msgid "" "TCOS is a free software project that need a lot of work to be the best thin " "client plataform.\n" "\n" "We work every day a lot of hours to make changes and support more devices " "and features.\n" "\n" "We want to continue developing this software but need your help, if you use, " "sell or hack TCOS pehaps you could donate some money to project.\n" "\n" "Click on next url to get some info." msgstr "" "El TCOS és un projecte lliure que necessita molt de treball per a intentar " "ser la millor plataforma de clients lleugers.\n" "\n" "Treballem cada dia moltes hores per fer canvis i admetre més dispositius i " "característiques.\n" "\n" "Volem continuar fent-ho però necessitem la vostra ajuda, si utilitzeu, veneu " "o modifiqueu el TCOS, potser podreu donar alguns diners al projecte.\n" "\n" "Feu clic en l'url següent per a obtindre més informació." #: ../ui/tcosmonitor-abouttcos.ui:370 msgid "http://wiki.tcosproject.org/TcosProject:Site_support" msgstr "http://wiki.tcosproject.org/TcosProject:Site_support/es" #: ../ui/tcosmonitor-abouttcos.ui:392 msgid "Don't show donations message on start." msgstr "No mostres este missatge de donacions a l'inici." #: ../ui/tcosmonitor-abouttcos.ui:415 msgid "Donate" msgstr "Donacions" #: ../ui/tray.ui:20 msgid "TCOS devices" msgstr "" #: ../ui/tray.ui:57 msgid "Hide" msgstr "" #: ../ui/tcos-volume-manager.ui:39 msgid "Restart sound" msgstr "" #: ../ui/tcos-volume-manager.ui:54 msgid "Sound levels" msgstr "Nivells de volum" #: ../ui/tcos-volume-manager.ui:90 msgid "Main Channels" msgstr "Canals principals" #: ../ui/tcos-volume-manager.ui:113 msgid "Secondary Channels" msgstr "Canals secundaris" #: ../ui/tcosmonitor-chatwindow.ui:8 msgid "Chat emission list" msgstr "Llista d'emissió de xat" #: ../ui/tcosmonitor-chatwindow.ui:17 msgid "Chat emission list" msgstr "Emissió de xat" # Translators: Menu item Verb/Connect #: ../ui/tcosmonitor-chatwindow.ui:80 msgid "Connect" msgstr "Connecta" # Translators: Menu item Verb/Branch/Separate/Separate/Disconnect #: ../ui/tcosmonitor-chatwindow.ui:128 msgid "Disconnect" msgstr "Desconnecta" #: ../ui/tcosmonitor-chatwindow.ui:176 msgid "Exit" msgstr "Ix" #: ../ui/tcosmonitor-staticwindow.ui:8 msgid "Static hosts list" msgstr "Llista d'equips estàtics" #: ../ui/tcosmonitor-staticwindow.ui:17 msgid "Static Hosts list" msgstr "Llista d'equips estàtics" # Winrar 2.9->Dialog Box Control:rarlng.dll #: ../ui/tcosmonitor-staticwindow.ui:80 msgid "Add" msgstr "Afegix" # Projecte_Mandrake [tm-mandrake.po] #: ../ui/tcosmonitor-staticwindow.ui:128 msgid "Modify" msgstr "Modifica" #: ../ui/tcosmonitor-staticwindow.ui:176 msgid "Delete" msgstr "Esborra" #: ../ui/tcosmonitor-staticwindow.ui:225 msgid "Get from connected" msgstr "Pren des dels connectats" # Winrar 2.9->Dialog Box Control:rarlng.dll #: ../ui/tcosmonitor-staticwindow.ui:292 ../ui/tcosmonitor-mainwindow.ui:771 #: ../ui/tcosmonitor-staticwindownew.ui:150 msgid "Cancel" msgstr "Cancel·la" #: ../ui/tcosmonitor-staticwindow.ui:340 #: ../ui/tcosmonitor-staticwindownew.ui:198 msgid "Save" msgstr "Guarda" #: ../ui/tcospersonalize.ui:34 msgid "unknow host" msgstr "equip desconegut" #: ../ui/tcospersonalize.ui:74 msgid "Disable Ctrl + Alt + Backspace (for kill Xorg)" msgstr "Inhabilita Ctrl+Alt+Backspace (per a tancar l'Xorg)" #: ../ui/tcospersonalize.ui:211 msgid "Get avalaible drivers" msgstr "Carrega els controladors disponibles" #: ../ui/tcospersonalize.ui:248 msgid "Display Settings" msgstr "Configuració de la pantalla" #: ../ui/tcospersonalize.ui:351 msgid "Default boot kernel" msgstr "Nucli d'arrancada per defecte" #: ../ui/tcospersonalize.ui:376 msgid "PXE Boot options" msgstr "Opcions d'arrancada de PXE" #: ../ui/tcospersonalize.ui:391 msgid "Default boot method" msgstr "Mètode d'arrancada per defecte" #: ../ui/tcospersonalize.ui:419 msgid "Command line" msgstr "Línia d'ordes" #: ../ui/tcospersonalize.ui:507 msgid "Boot options" msgstr "Opcions d'arrancada" #: ../ui/tcospersonalize.ui:551 msgid "Delete Config" msgstr "Elimina la configuració" #: ../ui/tcosmonitor-mainwindow.ui:8 msgid "TcosMonitor" msgstr "TcosMonitor" #: ../ui/tcosmonitor-mainwindow.ui:22 msgid "Exit TcosMonitor" msgstr "Ix del TcosMonitor" #: ../ui/tcosmonitor-mainwindow.ui:35 msgid "Open preferences dialog" msgstr "Obri el diàleg de preferències" #: ../ui/tcosmonitor-mainwindow.ui:48 msgid "Update host list" msgstr "Actualitza la llista d'equips" # Netscape_4.7->Menu:RESDLL.DLL # 3 #: ../ui/tcosmonitor-mainwindow.ui:49 msgid "Refresh" msgstr "Refresca" #: ../ui/tcosmonitor-mainwindow.ui:71 msgid "All Hosts" msgstr "Tots els equips" # Winrar 2.9->Dialog Caption:rarlng.dll #: ../ui/tcosmonitor-mainwindow.ui:99 msgid "Find" msgstr "Busca" #: ../ui/tcosmonitor-mainwindow.ui:111 msgid "About this app" msgstr "Quant a esta aplicació" #: ../ui/tcosmonitor-mainwindow.ui:219 msgid "Start audio chat" msgstr "Inicia el xat d'àudio" #: ../ui/tcosmonitor-mainwindow.ui:331 msgid "Send audio/video" msgstr "Envia el fitxer d'àudio/vídeo" #: ../ui/tcosmonitor-mainwindow.ui:443 msgid "Exe app" msgstr "Executa l'aplicació" #: ../ui/tcosmonitor-mainwindow.ui:499 msgid "Send message" msgstr "Envia el missatge" #: ../ui/tcosmonitor-mainwindow.ui:581 msgid "List view" msgstr "Vista de llista" #: ../ui/tcosmonitor-mainwindow.ui:629 msgid "Icon view" msgstr "Vista d'icones" #: ../ui/tcosmonitor-mainwindow.ui:689 msgid "Simulate my classroom" msgstr "Simula la meua aula" #: ../ui/tcosmonitor-staticwindownew.ui:8 msgid "New or edit hosts" msgstr "Nou o edita la llista d'equips" #: ../ui/tcosmonitor-staticwindownew.ui:32 msgid "" "You can add a simple host, \n" " example: 192.168.0.100\n" "\n" "or range of hosts, \n" " example: 192.168.0.100-120\n" "\n" "MAC address is optional" msgstr "" "Podeu afegir un únic equip,\n" " exemple: 192.168.0.100\n" "\n" "o un rang d'equips, \n" " exemple: 192.168.0.100-120\n" "\n" "l'adreça MAC és opcional" #: ../ui/tcosmonitor-staticwindownew.ui:57 msgid "IP address *" msgstr "Adreça IP *" #: ../ui/tcosmonitor-askwindow.ui:8 msgid "Question" msgstr "Pregunta" #: ../ui/tcosmonitor-askwindow.ui:50 msgid "You can drag and drop launcher file to this box" msgstr "Podeu arrossegar i deixar anar un llançador a esta caixa" #: ../ui/tcosmonitor-askwindow.ui:61 msgid "Run app in unknow host" msgstr "Executa l'aplicació en un equip desconegut" #~ msgid "Lliurex Lab" #~ msgstr "Lliurex Lab" #~ msgid "Normal" #~ msgstr "Normal" #, fuzzy #~ msgid "Quit from TcosMonitor" #~ msgstr "Ix del TcosMonitor" #~ msgid "Salir de Lliurex Lab" #~ msgstr "Ix de Lliurex Lab" #~ msgid "Lliurex Lab" #~ msgstr "Lliurex Lab" #~ msgid "About Lliurex Lab" #~ msgstr "Quant al Lliurex Lab" #, fuzzy #~ msgid "Clonning clients...." #~ msgstr "S'està connectant a %s..." #~ msgid "Open share" #~ msgstr "Obri share" #~ msgid "Program mode" #~ msgstr "Mode de programa" #, fuzzy #~ msgid "Clone clients" #~ msgstr "S'està connectant a %s..." #~ msgid "" #~ "Lliurex Lab is a customized program\n" #~ "based on Mario Izquierdo TcosMonitor\n" #~ "and Tcos monitoring tool." #~ msgstr "" #~ "El programa Lliurex Lab és una adaptació\n" #~ "basada en el programa de seguiment\n" #~ "TcosMonitor i Tcos de Mario Izquierdo." #, fuzzy #~ msgid "Clone clients (from this host)" #~ msgstr "Mode de demostració (des d'este equip)" #, fuzzy #~ msgid "No clients to clone." #~ msgstr "No s'han trobat clients lleugers." #, fuzzy #~ msgid "Do you want to clone the following clients: %s?" #~ msgstr "Voleu apagar els clients següents: %s?" #, fuzzy #~ msgid "Waiting for start clone mode..." #~ msgstr "S'està esperant l'arrancada del mode demostració..." #, fuzzy #~ msgid "Select image file to clone.." #~ msgstr "Seleccioneu el fitxer o fitxers..." #, fuzzy #~ msgid "Running in clone mode with %s clients." #~ msgstr "S'està executant en mode demostració amb %s equips." #, fuzzy #~ msgid "Running in clone mode from server. Clone Nº %s" #~ msgstr "" #~ "S'està executant en mode demostració des del servidor. Demostració núm. %s" #, fuzzy #~ msgid "Do you want to clone from client %s?" #~ msgstr "Voleu iniciar el mode demostració des de l'usuari %s?" #, fuzzy #~ msgid "Do you want only create a image from host %s?" #~ msgstr "Voleu iniciar el mode demostració des de l'usuari %s?" #, fuzzy #~ msgid "Waiting for start clone mode from client %s..." #~ msgstr "" #~ "S'està esperant l'arrancada del mode demostració des de l'usuari %s..." #, fuzzy #~ msgid "Select file to save clone image..." #~ msgstr "Seleccioneu el fitxer per a guardar la captura de pantalla..." #, fuzzy #~ msgid "Running in clone mode from client %(host)s. Clone Nº %(count)s" #~ msgstr "" #~ "S'està executant en mode demostració des de l'usuari %(host)s. " #~ "Demostració núm. %(count)s" #, fuzzy #~ msgid "Clone mode off." #~ msgstr "El mode conferència està desactivat." tcosmonitor/po/gl.po0000664000000000000000000025771612260544373011736 0ustar # Spanish translations for tcosmonitor package # Traducciones al español para el paquete tcosmonitor. # Copyright (C) 2006 THE tcosmonitor'S COPYRIGHT HOLDER # This file is distributed under the same license as the tcosmonitor package. # , 2006. # , 2006. # # msgid "" msgstr "" "Project-Id-Version: tcosmonitor 0.0.1\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-03-18 15:48+0100\n" "PO-Revision-Date: 2008-11-26 19:29+0100\n" "Last-Translator: Enrique Estévez Fernández \n" "Language-Team: Galcian/Galiza \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Poedit-Language: Galician\n" #: ../tcosmonitor.py:129 #, python-format msgid "" "The user \"%s\" must be member of the group \"tcos\" to exec tcosmonitor.\n" "\n" "If you are system administrator, add your user to tcos group." msgstr "" "O usuario \"%s\" debe ser membro do grupo \"tcos\" para executar " "tcosmonitor.\n" "\n" "Se vostede é administrador do sistema, engada o seu usuario ao grupo tcos." #: ../tcosmonitor.py:247 msgid "Send files disabled. rsync not configured." msgstr "O envío de arquivos está desactivado, rsync non está configurado." #: ../tcosmonitor.py:329 ../tcospersonalize.py:562 #: ../tcos-volume-manager.py:378 msgid "Exiting" msgstr "Saíndo" #: ../tcos-devices-ng.py:188 #, python-format msgid "Rebooting in %s seconds" msgstr "O equipo reiniciarase en %s segundos" #: ../tcos-devices-ng.py:190 #, python-format msgid "Shutting down in %s seconds" msgstr "O equipo apagarase en %s segundos" #: ../tcos-devices-ng.py:206 ../tcos-devices-ng.py:209 #, python-format msgid "" "ERROR during action %(action)s:\n" "%(errortxt)s" msgstr "" "ERRO realizando acción %(action)s:\n" "%(errortxt)s" #: ../tcos-devices-ng.py:239 msgid "Tcos device daemon" msgstr "Xestor de dispositivos TCOS" #: ../tcos-devices-ng.py:283 ../tcos-volume-manager.py:143 #, python-format msgid "Error connecting with TcosXmlRpc in %s." msgstr "Erro conectando con tcosxmlrpc en %s" #: ../tcos-devices-ng.py:314 #, python-format msgid "Cdrom device %s" msgstr "Dispositivo cdrom %s" #: ../tcos-devices-ng.py:317 msgid "Mount Cdrom" msgstr "Montar cdrom" #: ../tcos-devices-ng.py:318 msgid "Umount Cdrom" msgstr "Desmontar cdrom" #: ../tcos-devices-ng.py:340 #, python-format msgid "Disk partition %s" msgstr "Partición do disco %s" #: ../tcos-devices-ng.py:343 msgid "Mount disk partition" msgstr "Montar partición" #: ../tcos-devices-ng.py:344 msgid "Umount disk partition" msgstr "Desmontar partición" #: ../tcos-devices-ng.py:356 msgid "No floppy detected" msgstr "Non se detectou disquete" #: ../tcos-devices-ng.py:368 ../tcos-devices-ng.py:674 #: ../tcos-devices-ng.py:680 ../tcos-devices-ng.py:686 msgid "Floppy" msgstr "Disquete" #: ../tcos-devices-ng.py:371 msgid "Mount Floppy" msgstr "Montar disquete" #: ../tcos-devices-ng.py:372 msgid "Umount Floppy" msgstr "Desmontar disquete" #: ../tcos-devices-ng.py:382 msgid "Floppy mounted. Ready for use." msgstr "Disquete montado. Listo para empregar." #: ../tcos-devices-ng.py:384 msgid "Floppy umounted. You can extract it." msgstr "Disquete desmontado. Agora pode extraelo." #: ../tcos-devices-ng.py:400 msgid "Hard disk partition mounted. Ready for use." msgstr "Partición montada. Lista para empregar." #: ../tcos-devices-ng.py:403 msgid "Hard disk partition umounted." msgstr "Partición desmontada." #: ../tcos-devices-ng.py:425 msgid "Audio cdrom mounted., you can listen music opening wav files." msgstr "" "Cdrom de música montado, agora podes escoita-lo abrindo os arquivos wav." #: ../tcos-devices-ng.py:427 msgid "Cdrom mounted. Ready for use." msgstr "Cdrom montado. Listo para empregar." #: ../tcos-devices-ng.py:430 msgid "Cdrom umounted. You can extract it." msgstr "Cdrom desmontado. Agora pode extraelo." #: ../tcos-devices-ng.py:529 #, python-format msgid "" "Mounting device %s\n" "Please wait..." msgstr "" "Montando dispositivo %s.\n" "Por favor, espere..." #: ../tcos-devices-ng.py:578 msgid "Error mounting LTSPFS, check versions of LTSPFS packages" msgstr "Erro montando LTSPFS, comprobe as versións dos paquetes LTSPFS" #: ../tcos-devices-ng.py:604 #, python-format msgid "" "Umounting device %s.\n" "Please wait..." msgstr "" "Desmontando dispositivo %s.\n" "Por favor, espere..." #: ../tcos-devices-ng.py:651 msgid "usbdisk" msgstr "disco-usb" #: ../tcos-devices-ng.py:653 msgid "firewiredisk" msgstr "disco-firewire" #: ../tcos-devices-ng.py:678 msgid "Can't mount floppy" msgstr "Non se puido montar o disquete" #: ../tcos-devices-ng.py:689 msgid "Can't umount floppy" msgstr "Non se puido desmontar o disquete" #: ../tcos-devices-ng.py:702 ../tcos-devices-ng.py:712 #: ../tcos-devices-ng.py:723 ../tcos-devices-ng.py:836 #: ../tcos-devices-ng.py:848 ../tcos-devices-ng.py:867 #: ../tcos-devices-ng.py:879 ../tcos-devices-ng.py:911 #, python-format msgid "Cdrom_%s" msgstr "Cdrom_%s" #: ../tcos-devices-ng.py:710 msgid "Can't mount cdrom" msgstr "Non se puido montar o cdrom" #: ../tcos-devices-ng.py:726 msgid "Can't umount cdrom" msgstr "Non se puido desmontar o cdrom" #: ../tcos-devices-ng.py:742 ../tcos-devices-ng.py:752 #: ../tcos-devices-ng.py:763 #, python-format msgid "Disk_%s" msgstr "Disco_%s" #: ../tcos-devices-ng.py:750 msgid "Can't mount hard disk partition" msgstr "Non se puido montar a partición" #: ../tcos-devices-ng.py:766 msgid "Can't umount hard disk partition" msgstr "Non se puido desmontar a partición" #: ../tcos-devices-ng.py:807 #, python-format msgid "" "From terminal %(host)s.\n" "Connected CDROM USB device %(device)s\n" "%(vendor)s %(model)s" msgstr "" "Dende o terminal %(host)s.\n" "Dispositivo CDROM USB conectado %(device)s\n" "%(vendor)s %(model)s" #: ../tcos-devices-ng.py:811 #, python-format msgid "CDROM USB device %s" msgstr "Dispositivo CDROM USB %s" #: ../tcos-devices-ng.py:814 #, python-format msgid "Mount CDROM USB device %s" msgstr "Montar dispositivo CDROM USB %s" #: ../tcos-devices-ng.py:815 #, python-format msgid "Umount CDROM USB device %s" msgstr "Desmontar dispositivo CDROM USB %s" #: ../tcos-devices-ng.py:840 ../tcos-devices-ng.py:871 #: ../tcos-devices-ng.py:1001 ../tcos-devices-ng.py:1012 #: ../tcos-devices-ng.py:1058 ../tcos-devices-ng.py:1138 #: ../tcos-devices-ng.py:1149 ../tcos-devices-ng.py:1195 #, python-format msgid "Error, can't mount device %s" msgstr "Erro, non se puido montar o dispositivo %s" #: ../tcos-devices-ng.py:898 #, python-format msgid "" "From terminal %(host)s.\n" "Disconnected CDROM USB device %(device)s\n" "%(vendor)s %(model)s" msgstr "" "Dende o terminal %(host)s.\n" "Dispositivo CDROM USB desconectado %(device)s\n" "%(vendor)s %(model)s" #: ../tcos-devices-ng.py:926 #, python-format msgid "Can't umount cdrom usb %s" msgstr "Non se puido desmontar o cdrom usb %s" #: ../tcos-devices-ng.py:951 #, python-format msgid "" "From terminal %(host)s.\n" "Connected USB device %(device)s\n" "%(vendor)s %(model)s" msgstr "" "Dende o terminal %(host)s.\n" "Dispositivo USB conectado %(device)s\n" "%(vendor)s %(model)s" #: ../tcos-devices-ng.py:954 #, python-format msgid "" "From terminal %(host)s.\n" "Disconnected USB device %(device)s\n" "%(vendor)s %(model)s" msgstr "" "Dende o terminal %(host)s.\n" "Dispositivo USB desconectado %(device)s\n" "%(vendor)s %(model)s" #: ../tcos-devices-ng.py:982 #, python-format msgid "USB device %s" msgstr "Dispositivo USB %s" #: ../tcos-devices-ng.py:985 #, python-format msgid "Mount USB device %s" msgstr "Montar dispositivo USB %s" #: ../tcos-devices-ng.py:986 #, python-format msgid "Umount USB device %s" msgstr "Desmontar dispositivo USB %s" #: ../tcos-devices-ng.py:1088 #, python-format msgid "" "From terminal %(host)s.\n" "Connected Firewire device %(device)s\n" "%(vendor)s %(model)s" msgstr "" "Dende o terminal %(host)s.\n" "Dispositivo Firewire conectado %(device)s\n" "%(vendor)s %(model)s" #: ../tcos-devices-ng.py:1091 #, python-format msgid "" "From terminal %(host)s.\n" "Disconnected Firewire device %(device)s\n" "%(vendor)s %(model)s" msgstr "" "Dende o terminal %(host)s.\n" "Dispositivo Firewire desconectado %(device)s\n" "%(vendor)s %(model)s" #: ../tcos-devices-ng.py:1119 #, python-format msgid "Firewire device %s" msgstr "Dispositivo Firewire %s" #: ../tcos-devices-ng.py:1122 #, python-format msgid "Mount Firewire device %s" msgstr "Montar dispositivo Firewire %s" #: ../tcos-devices-ng.py:1123 #, python-format msgid "Umount Firewire device %s" msgstr "Desmontar dispositivo Firewire %s" #: ../tcos-devices-ng.py:1206 #, python-format msgid "CDROM USB device %s umounted. You can extract it." msgstr "Dispositivo CDROM USB %s desmontado. Agora pode extraelo." #: ../tcos-devices-ng.py:1209 #, python-format msgid "CDROM USB device %s mounted. Ready for use." msgstr "Dispositivo CDROM USB %s montado.Listo para empregar." #: ../tcos-devices-ng.py:1247 #, python-format msgid "USB device %s umounted. You can extract it." msgstr "Dispositivo USB %s desmontado. Agora pode extraelo." #: ../tcos-devices-ng.py:1250 #, python-format msgid "USB device %s mounted. Ready for use." msgstr "Dispositivo USB %s montado.Listo para empregar." #: ../tcos-devices-ng.py:1286 #, python-format msgid "Firewire device %s umounted. You can extract it." msgstr "Dispositivo Firewire %s desmontado. Agora pode extraelo." #: ../tcos-devices-ng.py:1289 #, python-format msgid "Firewire device %s mounted. Ready for use." msgstr "Dispositivo Firewire %s montado.Listo para empregar." #: ../tcospersonalize.py:115 msgid "" "Need a host to configure!!!\n" "Try exec:\n" " tcospersonalize --host=XXX.XXX.XXX.XXX" msgstr "" "¡Necesitase un enderezo de equipo a configurar!\n" "Probe a executar:\n" " tcospersonalize --host=XXX.XXX.XXX.XXX" #: ../tcospersonalize.py:190 msgid "host: " msgstr "equipo: " #: ../tcospersonalize.py:454 msgid "Host down, can't connect to tcosxmlrpc." msgstr "Equipo inacesíbel, non se puido conectar a tcosxmlrpc." #: ../tcospersonalize.py:462 #, python-format msgid "New %d drivers loaded from terminal." msgstr "Cargados %d drivers dende o terminal." #: ../tcospersonalize.py:521 #, python-format msgid "Really delete config of %s?" msgstr "¿Borrar arquivo de configuración de %s?" #: ../tcospersonalize.py:524 msgid "Deleted!" msgstr "¡Borrado!" #: ../tcos-volume-manager.py:101 ../tcos-volume-manager.py:113 #, python-format msgid "" "Tcos Sound levels on:\n" "%s" msgstr "" "Niveis de volume TCOS en equipo:\n" "%s" #: ../tcos-volume-manager.py:121 #, python-format msgid "ERROR: It appears that TcosXmlRpc is not running on %s." msgstr "ERRO: Parece que tcosxmlrpc non se está executando en %s" #: ../tcos-volume-manager.py:217 msgid "Loading channels info..." msgstr "Cargando información de canles..." #: ../tcos-volume-manager.py:230 msgid "Error loading channels info (xauth error)" msgstr "Erro cargando información de canles (erro de xauth)" #: ../tcos-volume-manager.py:233 ../ui/tcos-volume-manager.ui:8 msgid "Tcos Volume Manager" msgstr "Monitor de volume TCOS" #: ../tcos-volume-manager.py:234 #, python-format msgid "Sound mixer of %s host" msgstr "Mesturador de audio do equipo %s" #: ../tcos-volume-manager.py:300 ../tcosmonitor/extensions/info.py:442 msgid "Mute" msgstr "Sen son" #: ../tcos-volume-manager.py:319 msgid "Main controls ready" msgstr "Controis principais cargados" #: ../tcos-volume-manager.py:323 msgid "All remote controls loaded." msgstr "Todos os controis remotos cargados." #: ../tcos-volume-manager.py:332 ../tcosmonitor/extensions/info.py:557 #, python-format msgid "Changing value of %(channel)s channel, to %(value)s%%..." msgstr "Cambiando valor da canle %(channel)s, a %(value)s%%..." #: ../tcos-volume-manager.py:339 ../tcosmonitor/extensions/info.py:564 #, python-format msgid "Changed value of %(channel)s channel, to %(value)s" msgstr "Valor cambiado da canle %(channel)s, a %(value)s" #: ../tcos-volume-manager.py:346 ../tcosmonitor/extensions/info.py:571 #, python-format msgid "Unmuting %s channel..." msgstr "Baixando o son a canale %s..." #: ../tcos-volume-manager.py:351 ../tcosmonitor/extensions/info.py:576 #, python-format msgid "Muting %s channel..." msgstr "Silenciado canle %s..." #: ../tcos-volume-manager.py:354 ../tcosmonitor/extensions/info.py:579 #, python-format msgid "Status of %(channel)s channel, is \"%(newvalue)s\"" msgstr "O estado da canle %(channel)s é \"%(newvalue)s\"" #: ../tcosmonitor/TcosDBus.py:94 msgid "TcosDBus not allowed in local display" msgstr "TcosDBus non permitido en pantalla local." #: ../tcosmonitor/TcosDBus.py:122 #, python-format msgid "Seems that tcosxmlrpc isn't running on host=\"%s\"" msgstr "Parece que tcosxmlrpc non se está executando no equipo=\"%s\"" #: ../tcosmonitor/TcosDBus.py:143 msgid "tcosxmlrpc ERROR conection unavalaible." msgstr "tcosxmlrpc ERRO conexión non disponíbel" #: ../tcosmonitor/TcosDBus.py:159 msgid "ERROR conecting to tcosxmlrpc, check username and password." msgstr "" "ERRO non se pode conectar a tcosxmlrpc, verifique o usuario e o contrasinal." #: ../tcosmonitor/TcosDBus.py:251 msgid "Message from admin" msgstr "Mensaxe do administrador" #: ../tcosmonitor/TcosDBus.py:341 ../tcosmonitor/TcosDBus.py:357 #: ../tcosmonitor/TcosDBus.py:375 ../tcosmonitor/TcosDBus.py:393 msgid "User not allowed to run this dbus call." msgstr "O seu usuario non ten permitidas estas chamadas dbus." #: ../tcosmonitor/TcosStaticHosts.py:163 ../tcosmonitor/TcosListView.py:70 msgid "IP address" msgstr "Enderezo IP" #: ../tcosmonitor/TcosStaticHosts.py:169 #: ../ui/tcosmonitor-staticwindownew.ui:68 msgid "MAC address" msgstr "Enderezo MAC" #: ../tcosmonitor/TcosStaticHosts.py:279 msgid "No hosts found, please click on Refresh button using another method." msgstr "" "Non se atoparon equipos, por favor, pulse o botón Actualizar empregando " "outro método." #: ../tcosmonitor/shared.py:108 msgid "Traditional list only" msgstr "Só lista tradicional" #: ../tcosmonitor/shared.py:109 msgid "Icons only" msgstr "Só iconas" #: ../tcosmonitor/shared.py:110 msgid "Simulate classroom" msgstr "Simular aula" #: ../tcosmonitor/shared.py:111 msgid "Lists, icons and classroom with tabs" msgstr "Lista, iconas e modo aula con separadores" #: ../tcosmonitor/shared.py:270 ../tcosmonitor/shared.py:312 #: ../tcosmonitor/TcosMenus.py:35 msgid "Terminal actions" msgstr "Accións para o terminal/equipo" #: ../tcosmonitor/shared.py:271 ../tcosmonitor/shared.py:313 #: ../tcosmonitor/TcosMenus.py:36 msgid "User actions" msgstr "Accións para o usuario" #: ../tcosmonitor/shared.py:272 ../tcosmonitor/shared.py:314 #: ../tcosmonitor/TcosMenus.py:37 msgid "Audio, video and files" msgstr "Son, vídeo e ficheiros" #: ../tcosmonitor/shared.py:279 ../tcosmonitor/extensions/info.py:47 msgid "Refresh terminal info" msgstr "Actualizar información do terminal" #: ../tcosmonitor/shared.py:280 ../tcosmonitor/extensions/clean.py:40 #: ../tcosmonitor/extensions/clean.py:41 msgid "Clean info about terminal" msgstr "Limpar información do terminal" #: ../tcosmonitor/shared.py:281 ../tcosmonitor/TcosTrayIcon.py:54 #: ../tcosmonitor/extensions/reboot.py:40 ../tcosmonitor/TcosTrayIcon2.py:58 msgid "Reboot" msgstr "Reiniciar" #: ../tcosmonitor/shared.py:282 ../tcosmonitor/TcosTrayIcon.py:55 #: ../tcosmonitor/extensions/reboot.py:42 ../tcosmonitor/TcosTrayIcon2.py:59 msgid "Poweroff" msgstr "Apagar" #: ../tcosmonitor/shared.py:283 ../tcosmonitor/extensions/lockscreen.py:40 msgid "Lock screen" msgstr "Bloquear pantalla" #: ../tcosmonitor/shared.py:284 ../tcosmonitor/extensions/lockscreen.py:42 msgid "Unlock screen" msgstr "Desbloquear pantalla" #: ../tcosmonitor/shared.py:285 ../tcosmonitor/extensions/italc.py:43 msgid "Connect to remote screen (iTALC)" msgstr "Conectar a pantalla remota (iTALC)" #: ../tcosmonitor/shared.py:286 ../tcosmonitor/extensions/vnc.py:54 msgid "Connect to remote screen (VNC)" msgstr "Conectar a pantalla remota (VNC)" #: ../tcosmonitor/shared.py:287 ../tcosmonitor/extensions/screenshot.py:45 msgid "Screenshot" msgstr "Captura de pantalla" #: ../tcosmonitor/shared.py:288 ../tcosmonitor/extensions/remotessh.py:40 msgid "Give a remote xterm" msgstr "Executar un terminal xterm no cliente" #: ../tcosmonitor/shared.py:289 #: ../tcosmonitor/extensions/tcospersonalize.py:40 #: ../ui/tcosmonitor-prefwindow.ui:1324 msgid "Configure this host" msgstr "Configurar este equipo" #: ../tcosmonitor/shared.py:290 ../tcosmonitor/extensions/logout.py:40 msgid "Logout client" msgstr "Desconectar cliente" #: ../tcosmonitor/shared.py:291 ../tcosmonitor/extensions/restartxorg.py:41 msgid "Restart X session with new settings" msgstr "Reiniciar sesión X coa nova configuración" #: ../tcosmonitor/shared.py:292 ../tcosmonitor/extensions/appsmsg.py:52 msgid "Exec app on user display" msgstr "Executar aplicación en pantalla de usuario" #: ../tcosmonitor/shared.py:293 ../tcosmonitor/extensions/appsmsg.py:53 msgid "Send a text message to user" msgstr "Enviar unha mensaxe de texto ao usuario" #: ../tcosmonitor/shared.py:294 ../tcosmonitor/extensions/viewproc.py:41 msgid "Show running apps of this client" msgstr "Amosar aplicacións executadas por este cliente" #: ../tcosmonitor/shared.py:295 ../tcosmonitor/shared.py:332 msgid "Audio/Video broadcast" msgstr "Difusión de audio/vídeo" #: ../tcosmonitor/shared.py:296 ../tcosmonitor/shared.py:333 #: ../tcosmonitor/extensions/sendfiles.py:49 #: ../tcosmonitor/extensions/sendfiles.py:50 #: ../ui/tcosmonitor-prefwindow.ui:1134 ../ui/tcosmonitor-prefwindow.ui:1475 #: ../ui/tcosmonitor-mainwindow.ui:387 msgid "Send files" msgstr "Enviar ficheiros" #: ../tcosmonitor/shared.py:297 ../tcosmonitor/extensions/vnc.py:55 msgid "Demo mode (from this host)" msgstr "Modo demo (dende este equipo)" #: ../tcosmonitor/shared.py:298 ../tcosmonitor/extensions/wakeonlan.py:41 msgid "Boot client (WakeOnLan)" msgstr "Arrancar cliente (WakeOnLan)" #: ../tcosmonitor/shared.py:299 #: ../tcosmonitor/extensions/tcosnetcontroller.py:38 msgid "Lock internet" msgstr "Bloquear internet" #: ../tcosmonitor/shared.py:300 #: ../tcosmonitor/extensions/tcosnetcontroller.py:39 msgid "Unlock internet" msgstr "Desbloquear internet" #: ../tcosmonitor/shared.py:301 ../tcosmonitor/extensions/dpms.py:40 msgid "DPMS Power off monitor" msgstr "DPMS apagar monitor" #: ../tcosmonitor/shared.py:302 ../tcosmonitor/extensions/dpms.py:42 msgid "DPMS Power on monitor" msgstr "DPMS acender monitor" #: ../tcosmonitor/shared.py:303 msgid "Send MIC audio (from this host)" msgstr "Enviar son do micrófono (dende este equipo)" #: ../tcosmonitor/shared.py:321 ../tcosmonitor/extensions/reboot.py:41 msgid "Reboot all clients" msgstr "Reiniciar todos os clientes" #: ../tcosmonitor/shared.py:322 ../tcosmonitor/extensions/reboot.py:43 msgid "Poweroff all clients" msgstr "Apagar todos os clientes" #: ../tcosmonitor/shared.py:323 ../tcosmonitor/extensions/lockscreen.py:41 msgid "Lock all screens" msgstr "Bloquear todas as pantallas" #: ../tcosmonitor/shared.py:324 ../tcosmonitor/extensions/lockscreen.py:43 msgid "Unlock all screens" msgstr "Desbloquear todas as pantallas" #: ../tcosmonitor/shared.py:325 ../tcosmonitor/extensions/logout.py:41 msgid "Logout clients" msgstr "Desconectar todos os clientes" #: ../tcosmonitor/shared.py:326 ../tcosmonitor/extensions/restartxorg.py:42 msgid "Restart X session of all clients" msgstr "Reiniciar sesión X de todos os clientes" #: ../tcosmonitor/shared.py:327 ../tcosmonitor/extensions/appsmsg.py:55 msgid "Exec same app in all connected users" msgstr "Executar mesma aplicación en todos os usuarios conectados" #: ../tcosmonitor/shared.py:328 ../tcosmonitor/extensions/appsmsg.py:56 msgid "Send a text message to all connected users" msgstr "Enviar unha mensaxe de texto a todos os usuarios conectados" #: ../tcosmonitor/shared.py:329 ../tcosmonitor/extensions/vnc.py:57 msgid "Enter demo mode, all connected users see my screen" msgstr "Entrar en modo demostración, todos os usuarios ven a miña pantalla" #: ../tcosmonitor/shared.py:330 msgid "Enter conference mode, all connected users can hear me" msgstr "Entrar en modo conferencia, todos os usuarios poden escoitarme" #: ../tcosmonitor/shared.py:331 ../tcosmonitor/extensions/screenshot.py:46 msgid "Capture All clients screens" msgstr "Capturar todas as pantallas" #: ../tcosmonitor/shared.py:334 ../tcosmonitor/extensions/wakeonlan.py:42 msgid "Boot All clients (WakeOnLan)" msgstr "Arrancar todos os clientes (WakeOnLan)" #: ../tcosmonitor/shared.py:335 #: ../tcosmonitor/extensions/tcosnetcontroller.py:41 msgid "Lock internet in all connected users" msgstr "Bloquear internet a todos os usuarios conectados" #: ../tcosmonitor/shared.py:336 #: ../tcosmonitor/extensions/tcosnetcontroller.py:42 msgid "Unlock internet in all connected users" msgstr "Desbloquear internet a todos os usuarios conectados" #: ../tcosmonitor/shared.py:337 ../tcosmonitor/extensions/dpms.py:41 msgid "DPMS Power off monitors" msgstr "DPMS apagar todos os monitores" #: ../tcosmonitor/shared.py:338 ../tcosmonitor/extensions/dpms.py:43 msgid "DPMS Power on monitors" msgstr "DPMS acender todos os monitores" #: ../tcosmonitor/shared.py:339 msgid "Chat audio conference" msgstr "Chat audio conferencia" #: ../tcosmonitor/shared.py:340 ../tcosmonitor/extensions/livevnc.py:51 #: ../ui/tcosmonitor-prefwindow.ui:1342 msgid "Live view screens with VNC" msgstr "" #: ../tcosmonitor/shared.py:538 #, python-format msgid "QUESTION: %(txt)s, RESPONSE %(response)s" msgstr "PREGUNTA: %(txt)s, RESPOSTA %(response)s" #: ../tcosmonitor/shared.py:555 ../tcosmonitor/shared.py:566 #, python-format msgid "INFO: %s" msgstr "INFO: %s" #: ../tcosmonitor/shared.py:577 #, python-format msgid "ERROR: %s" msgstr "ERRO: %s" #: ../tcosmonitor/TcosClassView.py:50 ../tcosmonitor/TcosIconView.py:47 msgid "IP" msgstr "IP" #: ../tcosmonitor/TcosClassView.py:51 ../tcosmonitor/TcosIconView.py:48 #: ../tcosmonitor/TcosListView.py:64 msgid "Hostname" msgstr "Equipo" #: ../tcosmonitor/TcosClassView.py:52 ../tcosmonitor/TcosIconView.py:49 #: ../tcosmonitor/TcosListView.py:76 msgid "Username" msgstr "Usuario" #: ../tcosmonitor/TcosClassView.py:53 ../tcosmonitor/TcosIconView.py:50 #: ../tcosmonitor/TcosListView.py:87 msgid "Logged" msgstr "Logueado" #: ../tcosmonitor/TcosClassView.py:54 ../tcosmonitor/TcosIconView.py:51 #: ../tcosmonitor/TcosListView.py:103 msgid "Time log in" msgstr "Tempo dentro" #: ../tcosmonitor/TcosClassView.py:55 ../tcosmonitor/TcosIconView.py:52 msgid "Screen locked" msgstr "Pantalla bloqueada" #: ../tcosmonitor/TcosClassView.py:56 ../tcosmonitor/TcosIconView.py:53 msgid "Network locked" msgstr "Rede bloqueada" #: ../tcosmonitor/TcosClassView.py:58 msgid "" "Place mouse on any computer to see brief info about it.\n" "You can select and unselect multiple host clicking on every one.\n" "Drag and drop hosts to positions and save clicking on right mouse button." msgstr "" "Mova o rato sobre cada equipo para obter unha breve información de cada un.\n" "Pode seleccionar e desseleccionar varios pulsando en cada un.\n" "Arrastre e solte os equipos as posicións e gardeas pulsando co botón dereito." #: ../tcosmonitor/TcosClassView.py:179 msgid "Positions reset to defaults." msgstr "Posicións reseteadas por defecto." #: ../tcosmonitor/TcosClassView.py:197 msgid "Positions saved." msgstr "Posicións gardadas." #: ../tcosmonitor/TcosClassView.py:323 #, python-format msgid "%s is not a valid file to exe or send" msgstr "%s non é un ficheiro válido para executar ou enviar" #: ../tcosmonitor/TcosClassView.py:409 ../tcosmonitor/TcosIconView.py:156 msgid "yes" msgstr "si" #: ../tcosmonitor/TcosClassView.py:411 ../tcosmonitor/TcosIconView.py:158 msgid "no" msgstr "non" #: ../tcosmonitor/TcosTrayIcon.py:49 ../tcosmonitor/extensions/vnc.py:298 #: ../tcosmonitor/TcosTrayIcon2.py:53 ../ui/tcosmonitor-mainwindow.ui:23 msgid "Quit" msgstr "Saír" #: ../tcosmonitor/TcosTrayIcon.py:65 msgid "TcosDevices" msgstr "Dispositivos TCOS" #: ../tcosmonitor/TcosTrayIcon.py:172 ../tcosmonitor/TcosTrayIcon.py:186 #: ../tcosmonitor/TcosTrayIcon2.py:67 msgid "Tcos Devices" msgstr "Dispositivos TCOS" #: ../tcosmonitor/TcosTrayIcon.py:232 ../tcosmonitor/TcosTrayIcon2.py:351 msgid "Usb flash" msgstr "Memoria USB flash" #: ../tcosmonitor/TcosTrayIcon.py:234 ../tcosmonitor/TcosTrayIcon2.py:353 msgid "Mount USB1" msgstr "Montar USB1" #: ../tcosmonitor/TcosTrayIcon.py:235 ../tcosmonitor/TcosTrayIcon2.py:354 msgid "Umount USB1" msgstr "Desmontar USB1" #: ../tcosmonitor/extensions/lockscreen.py:49 #: ../tcosmonitor/extensions/lockscreen.py:57 msgid "" "Can't connect to tcosxmlrpc.\n" "Please verify user and password in prefences!" msgstr "" "Non se pode conectar a tcosxmlrpc.\n" "Por favor verifique o usuario e o contrasinal nas preferencias." #: ../tcosmonitor/extensions/lockscreen.py:81 #, fuzzy, python-format msgid "Do you want to lock the following screens: %s?" msgstr "¿Quere bloquear a pantalla dos seguintes equipos: %s ?" #: ../tcosmonitor/extensions/lockscreen.py:90 #, fuzzy, python-format msgid "Do you want to unlock the following screens: %s?" msgstr "¿Quere desbloquear a pantalla dos seguintes equipos: %s ?" #: ../tcosmonitor/extensions/appsmsg.py:64 msgid "Clients not connected" msgstr "Non hai usuarios conectados" #: ../tcosmonitor/extensions/appsmsg.py:87 #, fuzzy, python-format msgid "" "Exec app in user(s) screen(s)\n" "or open web address to:\n" "%s" msgstr "" "Executar aplicación en pantalla de usuario(s) ou abrir enderezo web:\n" "%s" #: ../tcosmonitor/extensions/appsmsg.py:89 #, python-format msgid "" "Send a message to:\n" "%s" msgstr "" "Enviar mensaxe a:\n" "%s" #: ../tcosmonitor/extensions/appsmsg.py:122 #: ../tcosmonitor/extensions/appsmsg.py:163 msgid "Can't exec application, user is not logged" msgstr "Non se poden executar aplicacións, o usuario non está conectado" #: ../tcosmonitor/extensions/appsmsg.py:141 #: ../tcosmonitor/extensions/appsmsg.py:152 #, python-format msgid "%s is not a valid application" msgstr "%s non é unha aplicación válida" #: ../tcosmonitor/extensions/appsmsg.py:172 msgid "Can't send message, user is not logged" msgstr "Non se poden enviar mensaxes, o usuario non está conectado" #: ../tcosmonitor/extensions/appsmsg.py:289 #: ../tcosmonitor/extensions/appsmsg.py:298 #, python-format msgid "%s is not application" msgstr "%s non é unha aplicación" #: ../tcosmonitor/extensions/appsmsg.py:353 #, python-format msgid "" "Error while exec remote app:\n" "Reason: %s" msgstr "" "Erro cando se executaba a aplicación remota:\n" "Razón: %s" #: ../tcosmonitor/extensions/appsmsg.py:360 #, python-format msgid "" "Error while send message:\n" "Reason: %s" msgstr "" "Erro cando se enviaba mensaxe:\n" "Razón: %s" #: ../tcosmonitor/extensions/remotessh.py:47 msgid "Enter password of remote thin client (if asked for it)" msgstr "Introduza o contrasinal do cliente remoto (se preguntase)" #: ../tcosmonitor/extensions/dpms.py:79 #, fuzzy, python-format msgid "Do you want to switch off the following monitors: %s?" msgstr "¿Quere apagar os seguintes monitores: %s?" #: ../tcosmonitor/extensions/dpms.py:88 #, fuzzy, python-format msgid "Do you want to switch on the following monitors: %s?" msgstr "¿Quere acender os seguintes equipos: %s?" #: ../tcosmonitor/extensions/screenshot.py:66 #: ../tcosmonitor/extensions/screenshot.py:83 #, python-format msgid "Can't make screenshot, error: %s" msgstr "Non se puido facer unha captura de pantalla, erro: %s" #: ../tcosmonitor/extensions/screenshot.py:75 msgid "Trying to order terminal to do a screenshot..." msgstr "Intentando mandar ao terminal que se faga unha captura de pantalla" #: ../tcosmonitor/extensions/screenshot.py:87 msgid "Get another screenshot" msgstr "Facer outra captura de pantalla" #: ../tcosmonitor/extensions/screenshot.py:102 #, python-format msgid "Screenshot of %s" msgstr "Captura de pantalla de %s" #: ../tcosmonitor/extensions/screenshot.py:125 #, python-format msgid "Screenshot of %s, done." msgstr "Captura de pantalla de %s hecha." #: ../tcosmonitor/extensions/screenshot.py:139 msgid "Save Screenshot" msgstr "Gardar captura de pantalla" #: ../tcosmonitor/extensions/screenshot.py:151 msgid "Select file to save screenshot..." msgstr "Seleccionar arquivo para gardar captura de pantalla..." #: ../tcosmonitor/extensions/screenshot.py:155 #, python-format msgid "screenshot_of_%(hostname)s_date_%(date)s.png" msgstr "captura_de_%(hostname)s_data_%(date)s.png" #: ../tcosmonitor/extensions/screenshot.py:159 msgid "Image Files ( *.png, *.jpg)" msgstr "Ficheiros de imaxe (*.png, *.jpg)" #: ../tcosmonitor/extensions/screenshot.py:169 msgid "File must be png or jpg." msgstr "O ficheiro debe ser png o jpg." #: ../tcosmonitor/extensions/screenshot.py:192 msgid "Screenshots of all hosts" msgstr "Captura de pantalla de todos os equipos" #: ../tcosmonitor/extensions/screenshot.py:208 #, python-format msgid "Screenshot of %s" msgstr "Captura de pantalla de %s" #: ../tcosmonitor/extensions/sendfiles.py:62 #: ../tcosmonitor/extensions/sendfiles.py:120 msgid "Can't send files, user is not logged" msgstr "Non se poden enviar ficheiros, o usuario non está conectado" #: ../tcosmonitor/extensions/sendfiles.py:66 #: ../tcosmonitor/extensions/sendfiles.py:142 #: ../tcosmonitor/extensions/sendfiles.py:237 msgid "" "TcosMonitor need special configuration for rsync daemon to send files.\n" "\n" "Please read configuration requeriments in:\n" "/usr/share/doc/tcosmonitor/README.rsync" msgstr "" "TcosMonitor necesita unha configuración especial do demonio rsync para envio " "de ficheiros.\n" "\n" "Le a configuración requerida en:\n" "/usr/share/doc/tcosmonitor/README.rsync" #: ../tcosmonitor/extensions/sendfiles.py:84 #: ../tcosmonitor/extensions/sendfiles.py:176 #: ../tcosmonitor/extensions/sendfiles.py:270 msgid "Waiting for send files..." msgstr "Esperando ao envío de ficheiros..." #: ../tcosmonitor/extensions/sendfiles.py:93 #: ../tcosmonitor/extensions/sendfiles.py:95 #: ../tcosmonitor/extensions/sendfiles.py:99 #: ../tcosmonitor/extensions/sendfiles.py:108 #: ../tcosmonitor/extensions/sendfiles.py:189 #: ../tcosmonitor/extensions/sendfiles.py:191 #: ../tcosmonitor/extensions/sendfiles.py:195 #: ../tcosmonitor/extensions/sendfiles.py:204 #: ../tcosmonitor/extensions/sendfiles.py:283 #: ../tcosmonitor/extensions/sendfiles.py:285 #: ../tcosmonitor/extensions/sendfiles.py:289 #: ../tcosmonitor/extensions/sendfiles.py:298 msgid "Teacher" msgstr "Profesor" #: ../tcosmonitor/extensions/sendfiles.py:95 #: ../tcosmonitor/extensions/sendfiles.py:108 #: ../tcosmonitor/extensions/sendfiles.py:191 #: ../tcosmonitor/extensions/sendfiles.py:204 #: ../tcosmonitor/extensions/sendfiles.py:285 #: ../tcosmonitor/extensions/sendfiles.py:298 #, python-format msgid "" "Teacher has sent some files to %(teacher)s folder:\n" "\n" "%(basenames)s" msgstr "" "O profesor envioulle varios ficheiros ao cartafol %(teacher)s:\n" "\n" "%(basenames)s" #: ../tcosmonitor/extensions/sendfiles.py:104 #: ../tcosmonitor/extensions/sendfiles.py:200 #: ../tcosmonitor/extensions/sendfiles.py:294 #: ../tcosmonitor/extensions/reboot.py:108 #: ../tcosmonitor/extensions/videolan.py:194 #: ../tcosmonitor/extensions/videolan.py:389 #: ../tcosmonitor/extensions/videolan.py:629 #, python-format msgid "" "Error while exec remote app:\n" "Reason:%s" msgstr "" "Erro cando se executaba a aplicación remota:\n" "Razón: %s" #: ../tcosmonitor/extensions/sendfiles.py:105 #: ../tcosmonitor/extensions/sendfiles.py:201 #: ../tcosmonitor/extensions/sendfiles.py:295 msgid "Error creating destination folder." msgstr "Erro creando o cartafol de destino." #: ../tcosmonitor/extensions/sendfiles.py:110 #: ../tcosmonitor/extensions/sendfiles.py:205 #: ../tcosmonitor/extensions/sendfiles.py:300 msgid "Files sent." msgstr "Ficheiros enviados." #: ../tcosmonitor/extensions/sendfiles.py:125 #: ../tcosmonitor/extensions/sendfiles.py:220 msgid "Select file or files..." msgstr "Seleccionar ficheiro ou ficheiros..." #: ../tcosmonitor/extensions/sendfiles.py:178 #: ../tcosmonitor/extensions/sendfiles.py:272 msgid "Do you want open file(s) on client?" msgstr "¿Quere abrir o ficheiro(s) no cliente?" #: ../tcosmonitor/extensions/sendfiles.py:215 #: ../tcosmonitor/extensions/tcosnetcontroller.py:113 #: ../tcosmonitor/extensions/tcosnetcontroller.py:155 #: ../tcosmonitor/extensions/videolan.py:457 #: ../tcosmonitor/extensions/vnc.py:68 ../tcosmonitor/extensions/vnc.py:112 #: ../tcosmonitor/extensions/vnc.py:422 #: ../tcosmonitor/extensions/audiortp.py:229 #: ../tcosmonitor/extensions/audiortp.py:275 #: ../tcosmonitor/extensions/audiortp.py:373 #: ../tcosmonitor/extensions/audiortp.py:407 #: ../tcosmonitor/extensions/audiortp.py:460 msgid "No users logged." msgstr "Non hai usuarios conectados." #: ../tcosmonitor/extensions/info.py:91 #, python-format msgid "Connecting with %s to retrieve some info..." msgstr "Conectando a %s para recibir información..." #: ../tcosmonitor/extensions/info.py:117 msgid "Tcos info" msgstr "Información de Tcos" #: ../tcosmonitor/extensions/info.py:120 msgid "PXES info" msgstr "Información de PXES" #: ../tcosmonitor/extensions/info.py:123 msgid "LTSP info" msgstr "Información de LTSP" #: ../tcosmonitor/extensions/info.py:126 msgid "Standalone info" msgstr "Información do equipo autónomo" #: ../tcosmonitor/extensions/info.py:129 msgid "Unknow client info" msgstr "Información de cliente descoñecido" #: ../tcosmonitor/extensions/info.py:135 ../tcosmonitor/LocalData.py:43 #: ../tcosmonitor/LocalData.py:62 ../tcosmonitor/TcosCommon.py:182 #: ../tcosmonitor/TcosCommon.py:190 ../tcosmonitor/TcosCommon.py:206 #: ../tcosmonitor/TcosCommon.py:209 msgid "unknow" msgstr "descoñecido" #: ../tcosmonitor/extensions/info.py:138 msgid "Hostname: " msgstr "Equipo: " #: ../tcosmonitor/extensions/info.py:139 msgid "Ip address: " msgstr "Enderezo IP: " #: ../tcosmonitor/extensions/info.py:140 msgid "TcosXmlRpc version: " msgstr "Versión de TcosXmlRpc: " #: ../tcosmonitor/extensions/info.py:149 msgid "Tcos image version: " msgstr "Versión da imaxe TCOS: " #: ../tcosmonitor/extensions/info.py:150 msgid "Tcos image date: " msgstr "Data da imaxe TCOS: " #: ../tcosmonitor/extensions/info.py:151 msgid "Date of thin client: " msgstr "Data e hora do cliente lixeiro: " #: ../tcosmonitor/extensions/info.py:152 msgid "Uptime: " msgstr "Tempo acendido: " #: ../tcosmonitor/extensions/info.py:163 msgid "Kernel info" msgstr "Información do núcleo" #: ../tcosmonitor/extensions/info.py:172 msgid "Force download and mount all modules" msgstr "Forzar descarga e montaxe de todos os módulos" #: ../tcosmonitor/extensions/info.py:183 msgid "None" msgstr "Ningún" #: ../tcosmonitor/extensions/info.py:186 msgid "Kernel version: " msgstr "Versión do núcleo: " #: ../tcosmonitor/extensions/info.py:187 msgid "Kernel complete version: " msgstr "Versión completa do núcleo: " #: ../tcosmonitor/extensions/info.py:188 msgid "Loaded Modules: " msgstr "Módulos cargados: " #: ../tcosmonitor/extensions/info.py:189 msgid "Modules not found: " msgstr "Módulos non atopados: " #: ../tcosmonitor/extensions/info.py:205 msgid "Cpu info: " msgstr "Información da CPU: " #: ../tcosmonitor/extensions/info.py:212 msgid "Cpu model: " msgstr "Modelo de CPU: " #: ../tcosmonitor/extensions/info.py:213 msgid "Cpu vendor: " msgstr "Fabricante de CPU: " #: ../tcosmonitor/extensions/info.py:214 msgid "Cpu speed: " msgstr "Velocidade de CPU: " #: ../tcosmonitor/extensions/info.py:225 msgid "PCI buses: " msgstr "Buses PCI: " #: ../tcosmonitor/extensions/info.py:254 msgid "Process running: " msgstr "Procesos executándose" #: ../tcosmonitor/extensions/info.py:267 msgid "Ram info: " msgstr "Información da ram:" #: ../tcosmonitor/extensions/info.py:274 msgid "Total Ram: " msgstr "RAM total: " #: ../tcosmonitor/extensions/info.py:275 msgid "Free RAM: " msgstr "RAM libre: " #: ../tcosmonitor/extensions/info.py:276 msgid "Active RAM: " msgstr "RAM activa: " #: ../tcosmonitor/extensions/info.py:279 msgid "Swap info: " msgstr "Información da swap: " #: ../tcosmonitor/extensions/info.py:285 msgid "Swap enabled: " msgstr "Swap activada: " #: ../tcosmonitor/extensions/info.py:286 msgid "Total Swap: " msgstr "Swap total: " #: ../tcosmonitor/extensions/info.py:287 msgid "Used Swap: " msgstr "Swap empregada: " #: ../tcosmonitor/extensions/info.py:297 msgid "Network info: " msgstr "Información da rede:" #: ../tcosmonitor/extensions/info.py:307 msgid "Network hostname: " msgstr "Nome de máquina: " #: ../tcosmonitor/extensions/info.py:308 msgid "Network IP: " msgstr "Enderezo ip: " #: ../tcosmonitor/extensions/info.py:309 msgid "Network MASK: " msgstr "Máscara de rede: " #: ../tcosmonitor/extensions/info.py:310 msgid "Network MAC: " msgstr "Número de MAC: " #: ../tcosmonitor/extensions/info.py:311 msgid "Data received(rx): " msgstr "Datos recibidos(rx): " #: ../tcosmonitor/extensions/info.py:312 msgid "Data send(tx): " msgstr "Datos enviados(tx): " #: ../tcosmonitor/extensions/info.py:322 ../ui/tcosmonitor-prefwindow.ui:911 msgid "Xorg info" msgstr "Información de Xorg" #: ../tcosmonitor/extensions/info.py:348 msgid "enabled" msgstr "activado" #: ../tcosmonitor/extensions/info.py:350 msgid "disabled" msgstr "desactivado" #: ../tcosmonitor/extensions/info.py:353 ../ui/tcospersonalize.ui:159 msgid "X Session Type" msgstr "Tipo de sesión gráfica" #: ../tcosmonitor/extensions/info.py:355 ../ui/tcospersonalize.ui:201 msgid "Xorg Driver" msgstr "Driver de Xorg" #: ../tcosmonitor/extensions/info.py:357 ../ui/tcospersonalize.ui:94 msgid "Xorg Resolution" msgstr "Resolución de Xorg" #: ../tcosmonitor/extensions/info.py:359 ../ui/tcospersonalize.ui:133 msgid "Xorg Color depth" msgstr "Profundidade de cor de Xorg" #: ../tcosmonitor/extensions/info.py:361 ../ui/tcospersonalize.ui:179 msgid "DPMS energy monitor control" msgstr "Control de enerxía do monitor DPMS" #: ../tcosmonitor/extensions/info.py:363 msgid "Disable kill X with Ctrl+Alt+Backspace" msgstr "Desactivar matar Xorg con Ctrl+Alt+Backspace" #: ../tcosmonitor/extensions/info.py:365 ../ui/tcospersonalize.ui:57 msgid "Enable mouse wheel" msgstr "Activar roda do rato" #: ../tcosmonitor/extensions/info.py:367 msgid "Refresh rate" msgstr "Tasa de Refresco" #: ../tcosmonitor/extensions/info.py:369 msgid "Xorg font server" msgstr "Servidor de fontes de Xorg" #: ../tcosmonitor/extensions/info.py:371 msgid "Mouse device" msgstr "Dispositivo do rato" #: ../tcosmonitor/extensions/info.py:373 msgid "Mouse protocol" msgstr "Protocolo do rato" #: ../tcosmonitor/extensions/info.py:375 ../ui/tcospersonalize.ui:273 msgid "X Horiz sync" msgstr "Sincronización horizontal" #: ../tcosmonitor/extensions/info.py:377 ../ui/tcospersonalize.ui:284 msgid "X Vert sync" msgstr "Sincronización vertical" #: ../tcosmonitor/extensions/info.py:390 msgid "PulseAudio Sound server is running" msgstr "O servidor PulseAudio está funcionando" #: ../tcosmonitor/extensions/info.py:408 msgid "Remote Sound Mixer" msgstr "Mesturador de son remoto" #: ../tcosmonitor/extensions/info.py:480 msgid "PulseAudio Control" msgstr "Control de PulseAudio" #: ../tcosmonitor/extensions/info.py:485 msgid "PulseAudio Meter" msgstr "Niveis de PulseAudio " #: ../tcosmonitor/extensions/info.py:490 msgid "PulseAudio Manager" msgstr "Xestor de PulseAudio" #: ../tcosmonitor/extensions/info.py:494 msgid "PulseAudio utils: " msgstr "Utilidades de PulseAudio: " #: ../tcosmonitor/extensions/info.py:500 msgid "PulseAudio stats" msgstr "Estatísticas de PulseAudio: " #: ../tcosmonitor/extensions/info.py:512 msgid "Currently in use" msgstr "Actualmente en uso" #: ../tcosmonitor/extensions/info.py:513 msgid "Allocated during whole lifetime" msgstr "Asignado durante execución" #: ../tcosmonitor/extensions/info.py:514 msgid "Sample cache size" msgstr "Tamaño da caché" #: ../tcosmonitor/extensions/info.py:515 msgid "User name" msgstr "Nome de usuario" #: ../tcosmonitor/extensions/info.py:516 msgid "Host Name" msgstr "Nome do equipo" #: ../tcosmonitor/extensions/info.py:517 msgid "Server Name" msgstr "Nome do servidor" #: ../tcosmonitor/extensions/info.py:518 msgid "Server Version" msgstr "Versión do servidor pulseaudio" #: ../tcosmonitor/extensions/info.py:519 msgid "Default Sample Specification" msgstr "Especificación da mostra" #: ../tcosmonitor/extensions/info.py:520 msgid "Default Sink" msgstr "Saída de audio por defecto" #: ../tcosmonitor/extensions/info.py:521 msgid "Default Source" msgstr "Entrada de audio por defecto" #: ../tcosmonitor/extensions/info.py:522 msgid "Cookie" msgstr "Cookie" #: ../tcosmonitor/extensions/info.py:528 msgid "Sound server is not running" msgstr "O servidor PulseAudio non se está executando" #: ../tcosmonitor/extensions/info.py:589 ../tcosmonitor/extensions/info.py:597 #: ../tcosmonitor/extensions/info.py:605 msgid "PulseAudio apps need /dev/shm." msgstr "PulseAudio necesita /dev/shm" #: ../tcosmonitor/extensions/logout.py:48 #: ../tcosmonitor/extensions/logout.py:71 #, fuzzy msgid "User not logged" msgstr "Usuario non conectado." #: ../tcosmonitor/extensions/logout.py:51 #, fuzzy, python-format msgid "Do you want to logout user: %s?" msgstr "¿Quere desconectar ao usuario \"%s\"?" #: ../tcosmonitor/extensions/logout.py:55 #: ../tcosmonitor/extensions/logout.py:77 #, python-format msgid "Session will close in %s seconds" msgstr "A sesión pecharase en %s segundos" #: ../tcosmonitor/extensions/logout.py:73 #, fuzzy, python-format msgid "Do you want to logout the following users: %s?" msgstr "¿Quere desconectar aos seguintes usuarios: %s ?" #: ../tcosmonitor/extensions/reboot.py:48 #, fuzzy, python-format msgid "Do you want to reboot: %s?" msgstr "¿Quere reiniciar o equipo %s ?" #: ../tcosmonitor/extensions/reboot.py:51 #: ../tcosmonitor/extensions/reboot.py:61 #, python-format msgid "Pc will reboot in %s seconds" msgstr "O equipo reiniciarase en %s segundos" #: ../tcosmonitor/extensions/reboot.py:58 #, fuzzy, python-format msgid "Do you want to reboot the following clients: %s?" msgstr "¿Quere reiniciar os seguintes equipos: %s ?" #: ../tcosmonitor/extensions/reboot.py:67 #, fuzzy, python-format msgid "Do you want to poweroff: %s?" msgstr "¿Quere apagar o equipo %s?" #: ../tcosmonitor/extensions/reboot.py:70 #: ../tcosmonitor/extensions/reboot.py:80 #, python-format msgid "Pc will shutdown in %s seconds" msgstr "O equipo apagarase en %s segundos" #: ../tcosmonitor/extensions/reboot.py:77 #, fuzzy, python-format msgid "Do you want to poweroff the following clients: %s?" msgstr "¿Quere apagar os seguintes equipos: %s?" #: ../tcosmonitor/extensions/tcosnetcontroller.py:50 #: ../tcosmonitor/extensions/tcosnetcontroller.py:109 msgid "Internet connection has been disabled" msgstr "A conexión de internet foi desactivada" #: ../tcosmonitor/extensions/tcosnetcontroller.py:54 msgid "Can't disable internet, user is not logged" msgstr "Non se pode desactivar internet, o usuario non está conectado" #: ../tcosmonitor/extensions/tcosnetcontroller.py:59 #: ../tcosmonitor/extensions/tcosnetcontroller.py:85 #: ../tcosmonitor/extensions/tcosnetcontroller.py:103 #: ../tcosmonitor/extensions/tcosnetcontroller.py:147 #, python-format msgid "" "In order to lock and unlock internet you need to be in 'tcos' group.\n" "\n" "Exe by root: adduser %s tcos" msgstr "" "Para poder bloquear e desbloquear internet necesita pertencer ao grupo " "'tcos'.\n" "\n" "Execute como root: adduser %s tcos" #: ../tcosmonitor/extensions/tcosnetcontroller.py:77 #: ../tcosmonitor/extensions/tcosnetcontroller.py:151 msgid "Internet connection has been enabled" msgstr "A conexión a internet foi activada" #: ../tcosmonitor/extensions/tcosnetcontroller.py:81 msgid "Can't enable internet, user is not logged" msgstr "Non se pode activar internet, o usuario non está conectado" #: ../tcosmonitor/extensions/tcosnetcontroller.py:116 #, fuzzy, python-format msgid "Do you want disable internet to following users: %s?" msgstr "¿Quere desactivar internet aos seguintes usuarios: %s ?" #: ../tcosmonitor/extensions/tcosnetcontroller.py:158 #, python-format msgid "Do you want enable internet to following users:%s?" msgstr "¿Quere activar internet aos seguintes usuarios: %s ?" #: ../tcosmonitor/extensions/videolan.py:48 #: ../tcosmonitor/extensions/videolan.py:49 #, fuzzy msgid "Send Audio/Video broadcast" msgstr "Difusión de audio/vídeo" #: ../tcosmonitor/extensions/videolan.py:65 #: ../tcosmonitor/extensions/videolan.py:219 msgid "Can't send video broadcast, user is not logged" msgstr "Non se pode enviar a difusión de vídeo, o usuario non está conectado" #: ../tcosmonitor/extensions/videolan.py:149 #: ../tcosmonitor/extensions/videolan.py:347 #: ../tcosmonitor/extensions/videolan.py:578 #, python-format msgid "" "Not allowed white spaces in \"%s\".\n" "Please rename it." msgstr "" "Non se permiten espazos en \"%s\".\n" "Por favor, renomeo." #: ../tcosmonitor/extensions/videolan.py:159 #: ../tcosmonitor/extensions/videolan.py:359 #: ../tcosmonitor/extensions/videolan.py:594 msgid "Waiting for start video transmission..." msgstr "Esperando arranque do modo difusión de vídeo..." #: ../tcosmonitor/extensions/videolan.py:167 #: ../tcosmonitor/extensions/videolan.py:367 #: ../tcosmonitor/extensions/videolan.py:602 #: ../tcosmonitor/extensions/vnc.py:98 ../tcosmonitor/extensions/vnc.py:407 msgid "Error while exec app" msgstr "Erro cando se executaba a aplicación" #: ../tcosmonitor/extensions/videolan.py:199 #: ../tcosmonitor/extensions/videolan.py:393 #: ../tcosmonitor/extensions/videolan.py:634 msgid "Running in broadcast video transmission." msgstr "Modo difusión de vídeo activo." #: ../tcosmonitor/extensions/videolan.py:208 #: ../tcosmonitor/extensions/videolan.py:402 #, python-format msgid "" "Running in broadcast video transmission to user %(host)s. Broadcast Nº %" "(count)s" msgstr "" "Executándose en modo de difusión de vídeo ao cliente %(host)s. Broadcast Nº %" "(count)s" #: ../tcosmonitor/extensions/videolan.py:311 #: ../tcosmonitor/extensions/videolan.py:541 msgid "Select audio/video file.." msgstr "Seleccionar ficheiro de audio/vídeo..." #: ../tcosmonitor/extensions/videolan.py:314 #: ../tcosmonitor/extensions/videolan.py:544 msgid "Play DVD" msgstr "Reproducir DVD" #: ../tcosmonitor/extensions/videolan.py:315 #: ../tcosmonitor/extensions/videolan.py:545 msgid "Play SVCD/VCD" msgstr "Reproducir SVCD/VCD" #: ../tcosmonitor/extensions/videolan.py:316 #: ../tcosmonitor/extensions/videolan.py:546 msgid "Play AudioCD" msgstr "Reproducir AudioCD" #: ../tcosmonitor/extensions/videolan.py:361 #: ../tcosmonitor/extensions/videolan.py:596 msgid "" "First select the DVD chapter or play movie\n" "then press enter to send clients..." msgstr "" "Primeiro seleccione o capítulo do DVD ou reproduza o vídeo\n" "despois, presione «enter» para envia-lo aos clientes..." #: ../tcosmonitor/extensions/videolan.py:370 msgid "Lock keyboard and mouse on client?" msgstr "¿Bloquear teclado e rato do cliente?" #: ../tcosmonitor/extensions/videolan.py:444 msgid "Video broadcast stopped." msgstr "Difusión de vídeo parada." #: ../tcosmonitor/extensions/videolan.py:605 msgid "Lock keyboard and mouse on clients?" msgstr "¿Bloquear teclado e rato nos clientes?" #: ../tcosmonitor/extensions/videolan.py:643 #, python-format msgid "Running in broadcast video transmission. Broadcast Nº %s" msgstr "Executándose en modo difusión de vídeo. Broadcast Nº %s" #: ../tcosmonitor/extensions/restartxorg.py:51 #, python-format msgid "Restart X session of %s with new config?" msgstr "¿Reiniciar sesión X de %s coa nova configuración?" #: ../tcosmonitor/extensions/restartxorg.py:64 #, python-format msgid "%s is not supported to restart Xorg!" msgstr "¡%s non permite reiniciar Xorg!" #: ../tcosmonitor/extensions/restartxorg.py:78 msgid "No thin clients found." msgstr "Non se atoparon clientes lixeiros." #: ../tcosmonitor/extensions/restartxorg.py:81 #, python-format msgid "Do you want to restart X screens (only thin clients):%s?" msgstr "" "¿Quere reiniciar as sesións X dos seguintes equipos (só clientes lixeiros): %" "s?" #: ../tcosmonitor/extensions/italc.py:51 ../tcosmonitor/extensions/vnc.py:135 msgid "No user logged." msgstr "Usuario non conectado." #: ../tcosmonitor/extensions/italc.py:75 msgid "Can't start IVS, please add iTALC support" msgstr "Non se pode arrancar o proceso IVS. Engada soporte para iTALC" #: ../tcosmonitor/extensions/tcospersonalize.py:54 #, python-format msgid "%s is not supported to personalize!" msgstr "¡%s non está soportado para personalizar!" #: ../tcosmonitor/extensions/vnc.py:71 #, python-format msgid "Do you want to start demo mode the following users: %s?" msgstr "¿Quere iniciar modo demostración aos seguintes usuarios: %s ?" #: ../tcosmonitor/extensions/vnc.py:83 msgid "Waiting for start demo mode..." msgstr "Esperando ao arranque do modo demostración..." #: ../tcosmonitor/extensions/vnc.py:116 ../tcosmonitor/extensions/vnc.py:426 #, python-format msgid "Running in demo mode with %s clients." msgstr "Executándose en modo demostración con %s equipos." #: ../tcosmonitor/extensions/vnc.py:127 #, python-format msgid "Running in demo mode from server. Demo Nº %s" msgstr "Executándose en modo demostración dende o servidor. Demostración Nº %s" #: ../tcosmonitor/extensions/vnc.py:149 ../tcosmonitor/extensions/vnc.py:369 #, python-format msgid "Connecting with %s to start VNC support" msgstr "Conectando a %s para arrancar soporte VNC" #: ../tcosmonitor/extensions/vnc.py:178 #, python-format msgid "" "Can't start VNC, error:\n" "%s" msgstr "" "Non se puido arrancar VNC, erro:\n" "%s" #: ../tcosmonitor/extensions/vnc.py:182 msgid "Waiting for start of VNC server..." msgstr "Esperando a que comece o servidor VNC..." #: ../tcosmonitor/extensions/vnc.py:211 msgid "Can't start VNC, please add X11VNC support" msgstr "Non se puido arrancar VNC, por favor engada soporte para X11VNC." #: ../tcosmonitor/extensions/vnc.py:237 msgid "Switch to view only" msgstr "" #: ../tcosmonitor/extensions/vnc.py:242 ../tcosmonitor/extensions/vnc.py:273 #, fuzzy msgid "Switch to full control" msgstr "Lista de control chat" #: ../tcosmonitor/extensions/vnc.py:269 #, python-format msgid "VNC host %s" msgstr "" #: ../tcosmonitor/extensions/vnc.py:281 msgid "Switch to fullscreen" msgstr "" #: ../tcosmonitor/extensions/vnc.py:290 #: ../tcosmonitor/extensions/livevnc.py:72 #: ../tcosmonitor/TcosPreferences.py:539 ../tcosmonitor/TcosExtensions.py:338 msgid "Stop" msgstr "Parar" #: ../tcosmonitor/extensions/vnc.py:342 msgid "Can't start demo mode, user is not logged" msgstr "" "Non se puido arrancar modo demostración,\n" "o usuario non está conectado" #: ../tcosmonitor/extensions/vnc.py:345 #, python-format msgid "Do you want demo mode from user %s?" msgstr "¿Quere iniciar o modo demostración dende o cliente %s?" #: ../tcosmonitor/extensions/vnc.py:392 #, python-format msgid "Waiting for start demo mode from user %s..." msgstr "Esperando ao arranque do modo demostración dende o cliente %s..." #: ../tcosmonitor/extensions/vnc.py:446 #, python-format msgid "Running in demo mode from user %(host)s. Demo Nº %(count)s" msgstr "" "Executándose en modo demostración dende o cliente %(host)s. Demostración Nº %" "(count)s" #: ../tcosmonitor/extensions/vnc.py:501 msgid "Demo mode off." msgstr "Modo demostración desactivado." #: ../tcosmonitor/extensions/wakeonlan.py:50 #: ../tcosmonitor/extensions/wakeonlan.py:75 msgid "" "Wake On Lan only works with static list.\n" "\n" "Enable scan method \"static\" in Preferences\n" "and (wake on lan) support in bios of clients." msgstr "" "Arrancar por rede só funciona con lista estática.\n" "\n" "Activar método escaneo \"static\" en Preferencias\n" "e soporte (wake on lan) na configuración bios dos clientes." #: ../tcosmonitor/extensions/wakeonlan.py:54 #, python-format msgid "Do you want boot %s client?" msgstr "¿Quere arrancar o cliente %s ?" #: ../tcosmonitor/extensions/wakeonlan.py:67 #: ../tcosmonitor/extensions/wakeonlan.py:91 #, python-format msgid "No register MAC address for ip: \"%s\"" msgstr "Enderezo MAC non rexistrado para a IP: \"%s\"" #: ../tcosmonitor/extensions/wakeonlan.py:71 #: ../tcosmonitor/extensions/wakeonlan.py:98 #, python-format msgid "Not valid MAC address: \"%s\"" msgstr "Enderezo MAC non válido: \"%s\"" #: ../tcosmonitor/extensions/wakeonlan.py:79 msgid "Do you want boot all clients?" msgstr "¿Quere arrancar todos os clientes?" #: ../tcosmonitor/extensions/livevnc.py:76 #, fuzzy msgid "Live view of all hosts" msgstr "Captura de pantalla de todos os equipos" #: ../tcosmonitor/extensions/livevnc.py:194 msgid "Running in LiveView mode" msgstr "" #: ../tcosmonitor/extensions/viewproc.py:48 msgid "Can't show runnings apps, user is not logged" msgstr "" "Non se poden ver as aplicacións executadas,\n" "o usuario non está conectado." #: ../tcosmonitor/extensions/viewproc.py:58 msgid "User not connected, no processes." msgstr "Usuario non conectado, non existen procesos." #: ../tcosmonitor/extensions/viewproc.py:76 #, python-format msgid "Running processes for user \"%s\": " msgstr "Procesos executados polo usuario \"%s\":" #: ../tcosmonitor/extensions/viewproc.py:80 msgid "" "ALERT: There are some system process hidden. Enable it in Preferences dialog." msgstr "" "ALERTA: Hai varios procesos do sistema ocultos. Pode activa-los na ventá de " "Preferencias." #: ../tcosmonitor/extensions/viewproc.py:85 msgid "Pid" msgstr "Pid" #: ../tcosmonitor/extensions/viewproc.py:86 msgid "Process command" msgstr "Comando do proceso" #: ../tcosmonitor/extensions/viewproc.py:91 msgid "Kill this process" msgstr "Matar este proceso" #: ../tcosmonitor/extensions/viewproc.py:127 msgid "Are you sure you want to stop this process?" msgstr "¿Está seguro que quere parar este proceso?" #: ../tcosmonitor/extensions/viewproc.py:136 #, python-format msgid "" "Error while killing app:\n" "Reason: %s" msgstr "" "Erro cando se pechaba a aplicación:\n" "Razón: %s" #: ../tcosmonitor/extensions/audiortp.py:49 #: ../ui/tcosmonitor-mainwindow.ui:163 msgid "Send audio conference" msgstr "Enviar conferencia de audio" #: ../tcosmonitor/extensions/audiortp.py:50 #: ../ui/tcosmonitor-prefwindow.ui:1507 msgid "Audio chat conference" msgstr "Audio chat conferencia" #: ../tcosmonitor/extensions/audiortp.py:51 #: ../ui/tcosmonitor-mainwindow.ui:275 msgid "Audio chat list" msgstr "Lista de audio chat" #: ../tcosmonitor/extensions/audiortp.py:52 #, fuzzy msgid "Send audio conference (from this host)" msgstr "Enviar son do micrófono (dende este equipo)" #: ../tcosmonitor/extensions/audiortp.py:73 msgid "Emission" msgstr "Emisión" #: ../tcosmonitor/extensions/audiortp.py:79 msgid "State" msgstr "Estado" #: ../tcosmonitor/extensions/audiortp.py:83 msgid "Channel" msgstr "Canle" #: ../tcosmonitor/extensions/audiortp.py:235 #: ../tcosmonitor/extensions/audiortp.py:322 #: ../tcosmonitor/extensions/audiortp.py:413 msgid "" "Your pulseaudio server is too old.\n" "Is required pulseaudio version >= 0.9.10" msgstr "" "O seu servidor de pulseaudio é antigo.\n" "Requirese unha versión de pulseaudio >= 0.9.10" #: ../tcosmonitor/extensions/audiortp.py:238 #, python-format msgid "Do you want to start audio conference to the following users: %s?" msgstr "¿Quere iniciar conferencia de audio aos seguintes usuarios: %s ?" #: ../tcosmonitor/extensions/audiortp.py:243 msgid "You have entered in audio conference" msgstr "Entrou en conferencia de audio" #: ../tcosmonitor/extensions/audiortp.py:267 msgid "Waiting for start audio conference..." msgstr "Esperando ao arranque da conferencia de audio..." #: ../tcosmonitor/extensions/audiortp.py:295 #: ../tcosmonitor/extensions/audiortp.py:390 #, python-format msgid "Running in audio conference with %s clients." msgstr "Executándose en conferencia de audio con %s clientes." #: ../tcosmonitor/extensions/audiortp.py:305 #, python-format msgid "Running in audio conference from server. Conference Nº %s" msgstr "" "Executándose en conferencia de audio dende o servidor. Conferencia Nº %s" #: ../tcosmonitor/extensions/audiortp.py:316 msgid "Can't start conference mode, user is not logged" msgstr "" "Non se puido arrancar o modo conferencia,\n" "o usuario non está conectado" #: ../tcosmonitor/extensions/audiortp.py:325 #, python-format msgid "Do you want audio conference from user %s?" msgstr "¿Quere iniciar conferencia de audio dende o cliente %s?" #: ../tcosmonitor/extensions/audiortp.py:331 #, python-format msgid "You have entered in audio conference from user %s" msgstr "Entrou en conferencia de audio dende o cliente %s" #: ../tcosmonitor/extensions/audiortp.py:359 #, python-format msgid "Waiting for start audio conference from user %s..." msgstr "Esperando ao arranque da conferencia de audio dende o cliente %s..." #: ../tcosmonitor/extensions/audiortp.py:400 #, python-format msgid "Running in audio conference from user %(host)s. Conference Nº %(count)s" msgstr "" "Executándose en conferencia de audio dende o cliente %(host)s. Conferencia " "Nº %(count)s" #: ../tcosmonitor/extensions/audiortp.py:416 #, python-format msgid "Do you want to start audio chat conference to the following users: %s?" msgstr "¿Quere iniciar conferencia de audio chat aos seguintes usuarios: %s ?" #: ../tcosmonitor/extensions/audiortp.py:421 #, python-format msgid "You have entered in audio chat conference. Participants: %s" msgstr "Entrou en conferencia de audio chat. Participantes: %s" #: ../tcosmonitor/extensions/audiortp.py:443 msgid "Waiting for start audio chat conference..." msgstr "Esperando ao arranque da conferencia de audio chat..." #: ../tcosmonitor/extensions/audiortp.py:449 msgid "Do you want to connect to this audio chat conference now?" msgstr "¿Quere conectarse agora a esta conferencia de audio chat?" #: ../tcosmonitor/extensions/audiortp.py:483 #, python-format msgid "Running in audio chat conference with %s clients." msgstr "Executándose en conferencia de audio chat con %s clientes." #: ../tcosmonitor/extensions/audiortp.py:495 #, python-format msgid "Running in audio chat conference. Conference Nº %s" msgstr "Executándose en conferencia de audio chat. Conferencia Nº %s" #: ../tcosmonitor/extensions/audiortp.py:521 msgid "Conference mode off." msgstr "Modo conferencia desactivado." #: ../tcosmonitor/extensions/audiortp.py:540 #, fuzzy msgid "Audio chat conference off." msgstr "Audio chat conferencia" #: ../tcosmonitor/TcosXmlRpc.py:85 msgid "" "Username or password are empty,\n" "please edit in preferences dialog!" msgstr "" "O usuario ou o contrasinal están baleiros,\n" "por favor, verifique o dialogo de preferencias" #: ../tcosmonitor/TcosIconView.py:55 msgid "Place mouse on any computer to see brief info about it." msgstr "" "Pase o rato por encima de cada equipo para obter unha descrición máis " "detallada." #: ../tcosmonitor/TcosListView.py:82 msgid "Active" msgstr "Activo" #: ../tcosmonitor/TcosListView.py:92 msgid "Screen Blocked" msgstr "Bloqueado" #: ../tcosmonitor/TcosListView.py:97 msgid "Num of process" msgstr "Núm. de procesos" #: ../tcosmonitor/TcosListView.py:112 msgid "Sel" msgstr "Sel" #: ../tcosmonitor/TcosListView.py:148 #, python-format msgid "Error connecting to tcosxmlrpc in %s" msgstr "Erro conectando a tcosxmlrpc en %s" #: ../tcosmonitor/TcosTrayIcon2.py:154 #, fuzzy, python-format msgid "Floppy: %s" msgstr "Disquete" #: ../tcosmonitor/TcosTrayIcon2.py:156 #, fuzzy, python-format msgid "CDROM: %s" msgstr "ERRO: %s" #: ../tcosmonitor/TcosTrayIcon2.py:158 #, fuzzy, python-format msgid "USB: %s" msgstr "Dispositivo USB %s" #: ../tcosmonitor/TcosTrayIcon2.py:160 #, fuzzy, python-format msgid "HDD partition: %s" msgstr "Partición do disco %s" #: ../tcosmonitor/TcosTrayIcon2.py:162 #, fuzzy, python-format msgid "Unknow: %s" msgstr "descoñecido" #: ../tcosmonitor/Initialize.py:217 msgid "GPL-2 license file not found" msgstr "O arquivo de licenza GPL-2 non se atopou" #: ../tcosmonitor/LocalData.py:212 #, python-format msgid "Selected network inteface (%s) don't have IP address" msgstr "A interface de rede seleccionada (%s) non ten enderezo IP" #: ../tcosmonitor/LocalData.py:260 ../tcosmonitor/ping.py:108 #: ../tcosmonitor/ping.py:171 msgid "Testing if found clients have 8998 or 8999 port open..." msgstr "" "Comprobando se os clientes atopados teñen o porto 8998 o 8999 aberto..." #: ../tcosmonitor/LocalData.py:282 msgid "" "Static list method configured but no hosts in list.\n" "\n" "Please, open preferences, click on 'Open Static Host list' and add some " "hosts." msgstr "" "Está seleccionado o método lista estática de equipos pero\n" "non hai equipos configurados.\n" "\n" "Por favor, abra as preferencias, pulse en 'Lista de equipos' e angada algun." #: ../tcosmonitor/TcosPreferences.py:264 msgid "" "You have select more than 5 button menus.\n" "Only allowed to select a maximum of 5 buttons." msgstr "" "Seleccionou máis de 5 botóns de menus.\n" "So está permitido seleccionar máximo 5 botóns." #: ../tcosmonitor/TcosPreferences.py:275 msgid "New settings saved." msgstr "Configuración gardada." #: ../tcosmonitor/TcosMenus.py:102 ../tcosmonitor/TcosMenus.py:114 #, python-format msgid "Actions for %s" msgstr "Accións para %s" #: ../tcosmonitor/TcosMenus.py:107 msgid "Actions for selected host" msgstr "Accións para o equipo seleccionado" #: ../tcosmonitor/TcosMenus.py:168 ../tcosmonitor/TcosMenus.py:299 #, python-format msgid "%d hidden actions" msgstr "%d accións ocultas" #: ../tcosmonitor/TcosMenus.py:243 ../tcosmonitor/TcosMenus.py:245 msgid "Actions for selected hosts" msgstr "Accións para os equipos seleccionados" #: ../tcosmonitor/TcosMenus.py:247 msgid "Actions for all hosts" msgstr "Accións para todos os equipos" #: ../tcosmonitor/TcosMenus.py:304 msgid "Save hosts positions" msgstr "Gardar posicións dos equipos" #: ../tcosmonitor/TcosMenus.py:312 msgid "Reset hosts positions" msgstr "Resetear posicións dos equipos" #: ../tcosmonitor/ping.py:80 #, python-format msgid "Ping to %s..." msgstr "Facendo ping a %s..." #: ../tcosmonitor/ping.py:89 msgid "Waiting for pings..." msgstr "Esperando aos pings..." #: ../tcosmonitor/ping.py:127 ../tcosmonitor/ping.py:192 #: ../tcosmonitor/TcosActions.py:185 ../tcosmonitor/TcosActions.py:264 msgid "Not connected hosts found." msgstr "Non se atoparon equipos conectados." #: ../tcosmonitor/ping.py:134 ../tcosmonitor/ping.py:197 #: ../tcosmonitor/TcosActions.py:187 ../tcosmonitor/TcosActions.py:259 #, python-format msgid "Found %d hosts" msgstr "Atopados %d equipos" #: ../tcosmonitor/TcosActions.py:162 ../tcosmonitor/TcosActions.py:241 msgid "Searching for connected hosts..." msgstr "Buscando equipos conectados..." #: ../tcosmonitor/TcosActions.py:1019 msgid "Searching info of hosts..." msgstr "Buscando información de equipos..." #: ../tcosmonitor/TcosActions.py:1058 #, python-format msgid "Connecting to %s..." msgstr "Conectando a %s..." #: ../tcosmonitor/TcosExtensions.py:41 msgid "Exception:" msgstr "Excepción:" #: ../tcosmonitor/TcosExtensions.py:77 msgid "Error: no IP!" msgstr "Erro: Non se indicou enderezo IP." #: ../tcosmonitor/TcosExtensions.py:154 msgid "No clients connected, press refresh button." msgstr "Non se atoparon clientes, pulse o botón actualizar." #: ../tcosmonitor/TcosExtensions.py:251 ../tcosmonitor/TcosExtensions.py:253 #, python-format msgid "Can't exec this action at '%s' because you are connected at this host!" msgstr "" "Non se pode executar esta acción para '%s' porque está conectado dende él." #: ../tcosmonitor/TcosExtensions.py:267 #, python-format msgid "Doing action \"%(action)s\" in %(ip)s..." msgstr "Realizando acción \"%(action)s\" en equipo %(ip)s..." #: ../tcosmonitor/TcosExtensions.py:285 #, python-format msgid "Done action \"%(action)s\" in %(ip)s" msgstr "Acción \"%(action)s\" rematada en %(ip)s" #: ../tcosmonitor/TcosCommon.py:89 #, python-format msgid "" "ThreadController: Found error executing %(cmd)s\n" "\n" "If problem persist, disable Thread Controller\n" "in Preferences and report bug.\n" "Error=%(error)s" msgstr "" "ThreadController: Atopouse un erro ao executar %(cmd)s\n" "\n" "Se o problema persiste, desactive Thread Controller\n" "en Preferencias e reporte o bug.\n" "Erro=%(error)s" #: ../ui/tcosmonitor-prefwindow.ui:35 ../ui/tcospersonalize.ui:7 #: ../ui/tcosmonitor-mainwindow.ui:36 msgid "Preferences" msgstr "Preferencias" #: ../ui/tcosmonitor-prefwindow.ui:62 msgid "Show host list on startup" msgstr "Amosar lista de equipos ao arranque" #: ../ui/tcosmonitor-prefwindow.ui:80 msgid "Scan network method" msgstr "Método de escaneo de equipos" #: ../ui/tcosmonitor-prefwindow.ui:91 msgid "" "Network interface\n" "(thin client)" msgstr "" "Interface de rede\n" "(clientes lixeiros)" #: ../ui/tcosmonitor-prefwindow.ui:127 msgid "Show system process" msgstr "Amosar procesos do sistema" #: ../ui/tcosmonitor-prefwindow.ui:144 msgid "Don't do actions when running TcosMonitor in thin client" msgstr "Non executar accións cando TcosMonitor se execute dende un terminal." #: ../ui/tcosmonitor-prefwindow.ui:163 msgid "List of hosts" msgstr "Lista de equipos" #: ../ui/tcosmonitor-prefwindow.ui:200 msgid "Open static host list" msgstr "Abrir lista fixa de equipos" #: ../ui/tcosmonitor-prefwindow.ui:225 msgid "Only show hosts running tcosxmlrpc (8998 port)" msgstr "So amosar equipos con tcosmxlrpc (porto 8998)" #: ../ui/tcosmonitor-prefwindow.ui:242 msgid "Only do all actions on selected hosts (requires restart TcosMonitor)" msgstr "" "So facer accións para equipos seleccionados \n" "(necesita reiniciar TcosMonitor)" #: ../ui/tcosmonitor-prefwindow.ui:259 msgid "Enable SSL connections to XMLRPC clients" msgstr "Empregar conexións SSL aos clientes XMLRPC" #: ../ui/tcosmonitor-prefwindow.ui:278 msgid "Host list mode" msgstr "Modo de lista de equipos" #: ../ui/tcosmonitor-prefwindow.ui:302 msgid "Show right menu with groups (NEW)" msgstr "Amosar menú por categorías (NOVO)" #: ../ui/tcosmonitor-prefwindow.ui:319 #, fuzzy msgid "Don't show thin client if TcosMonitor is running there" msgstr "Non executar accións cando TcosMonitor se execute dende un terminal." #: ../ui/tcosmonitor-prefwindow.ui:351 msgid "Settings" msgstr "Configuración" #: ../ui/tcosmonitor-prefwindow.ui:376 msgid "Update host list every (seg)" msgstr "Actualizar interface cada (seg)" #: ../ui/tcosmonitor-prefwindow.ui:389 msgid "" "Update host list every selected seconds.\n" "\n" "Value=0 disable update." msgstr "" "Actualizar lista de equipos cada número\n" "de segundos seleccionado.\n" "\n" "Valor=0 deshabilitar actualización." #: ../ui/tcosmonitor-prefwindow.ui:405 msgid "Cache timeout (seg)" msgstr "Tempo de vida da cache (seg)" #: ../ui/tcosmonitor-prefwindow.ui:419 msgid "" "Cache some data and connection status during selected seconds.\n" "\n" "Value=0 disable cache." msgstr "" "Cachear datos e estado de conexións durante o número\n" "de segundos seleccionado.\n" "\n" "Valor=0 desactivar cache." #: ../ui/tcosmonitor-prefwindow.ui:437 msgid "Screenshot size:" msgstr "Tamaño de captura de pantalla" #: ../ui/tcosmonitor-prefwindow.ui:450 ../ui/tcosmonitor-prefwindow.ui:479 msgid "% Size of screnshot." msgstr "%s de tamaño de captura de pantalla" #: ../ui/tcosmonitor-prefwindow.ui:466 msgid "Mini screenshot size:" msgstr "Tamaño de mini capturas de pantalla" #: ../ui/tcosmonitor-prefwindow.ui:495 msgid "Timeout actions (seg)" msgstr "Tempo de espera para accións (seg)" #: ../ui/tcosmonitor-prefwindow.ui:508 msgid "" "Timeout in seg for actions\n" "\n" "Value=0 default" msgstr "" "Tempo de espera para accións\n" "\n" "por defecto 0" #: ../ui/tcosmonitor-prefwindow.ui:526 msgid "SSH remote username" msgstr "Usuario remoto SSH" #: ../ui/tcosmonitor-prefwindow.ui:553 msgid "VLC method to send" msgstr "VLC método de envio" #: ../ui/tcosmonitor-prefwindow.ui:578 msgid "" "Experimental: Thread Controller\n" "( if you have problems, disable it )" msgstr "" "Experimental: Control de Threads\n" "( Se ten problemas, desactive o control )" #: ../ui/tcosmonitor-prefwindow.ui:591 msgid "Actions controlled" msgstr "Accións controladas" #: ../ui/tcosmonitor-prefwindow.ui:611 msgid "Block ports: (80,8080... etc)" msgstr "Bloquear portos: (80,8080... etc)" #: ../ui/tcosmonitor-prefwindow.ui:653 ../ui/tcospersonalize.ui:333 msgid "Advanced" msgstr "Avanzado" #: ../ui/tcosmonitor-prefwindow.ui:680 msgid "TcosXmlRpc username" msgstr "Usuario TcosXmlRpc" #: ../ui/tcosmonitor-prefwindow.ui:706 msgid "TcosXmlRpc password" msgstr "Contrasinal TcosXmlRpc" #: ../ui/tcosmonitor-prefwindow.ui:735 msgid "" "NOTE:\n" "Default user is root and default password is root.\n" "\n" "For thin clients change TCOS_ROOT_PASSWD or use TcosConfig and " "regenerate boot images again.\n" "\n" "For standalone users you can use a system account (root) but this is " "not recomended. Install tcos-standalone and start it by root. Set user and " "password, this will create a /etc/tcospasswd file only used by TCOS " "and your root acount will be secure." msgstr "" "NOTA:\n" "O usuario por defecto é root e o contrasinal é root.\n" "\n" "Para terminais lixeiros podes modificar TCOS_ROOT_PASSWD ou empregar " "TcosConfig e rexenerar as imaxes de arranque de novo.\n" "\n" "Para equipos autónomos(standalone) podes empregar a conta do sistema " "(root) pero esto non é recomandable. Instala o paquete tcos-standalone " "execútao como administrador e configura un usuario e unha conta. O " "contrasinal gardarase en /etc/tcospasswd, arquivo que so o necesita " "TCOS polo que a túa conta de root estará a salvo." #: ../ui/tcosmonitor-prefwindow.ui:772 msgid "Authentication " msgstr "Autenticación" #: ../ui/tcosmonitor-prefwindow.ui:795 msgid "Info avalaible from tcosxmlrpc" msgstr "Información disponíbel de tcosxmlrpc" #: ../ui/tcosmonitor-prefwindow.ui:806 msgid "Tcos general info" msgstr "Información xeral de Tcos" #: ../ui/tcosmonitor-prefwindow.ui:821 msgid "Cpu info" msgstr "Información da CPU" #: ../ui/tcosmonitor-prefwindow.ui:836 msgid "Kernel and modules info" msgstr "Información do núcleo e módulos" #: ../ui/tcosmonitor-prefwindow.ui:851 msgid "PCI bus info" msgstr "Información bus PCI" #: ../ui/tcosmonitor-prefwindow.ui:866 msgid "Ram and swap info" msgstr "Información da RAM e SWAP" #: ../ui/tcosmonitor-prefwindow.ui:881 msgid "Process info" msgstr "Información de procesos" #: ../ui/tcosmonitor-prefwindow.ui:896 msgid "Network info" msgstr "Información da rede" #: ../ui/tcosmonitor-prefwindow.ui:926 msgid "Sound server info" msgstr "Información do servidor de son" #: ../ui/tcosmonitor-prefwindow.ui:962 msgid "Avalaible info" msgstr "Información disponíbel" #: ../ui/tcosmonitor-prefwindow.ui:985 msgid "Show / hide menu items" msgstr "Amosar / ocultar menús da aplicación" #: ../ui/tcosmonitor-prefwindow.ui:1003 msgid "Lock and unlock screen" msgstr "Bloquear e desbloquear pantallas" #: ../ui/tcosmonitor-prefwindow.ui:1019 msgid "Remote SSH shell" msgstr "Consola SSH remota" #: ../ui/tcosmonitor-prefwindow.ui:1037 msgid "Configure Xorg settings" msgstr "Configurar Xorg" #: ../ui/tcosmonitor-prefwindow.ui:1066 ../ui/tcosmonitor-prefwindow.ui:1427 msgid "Exe app on user display" msgstr "Executar aplicacións" #: ../ui/tcosmonitor-prefwindow.ui:1082 ../ui/tcosmonitor-prefwindow.ui:1441 msgid "Send a text message" msgstr "Enviar unha mensaxe de texto" #: ../ui/tcosmonitor-prefwindow.ui:1100 msgid "Show running apps" msgstr "Ver aplicacións executadas" #: ../ui/tcosmonitor-prefwindow.ui:1116 ../ui/tcosmonitor-prefwindow.ui:1457 msgid "Send video broadcast" msgstr "Enviar audio/vídeo" #: ../ui/tcosmonitor-prefwindow.ui:1150 msgid "Demo mode" msgstr "Modo demostración" #: ../ui/tcosmonitor-prefwindow.ui:1179 msgid "Wake on LAN" msgstr "Wake on LAN" #: ../ui/tcosmonitor-prefwindow.ui:1195 msgid "Audio conference mode" msgstr "Modo audio conferencia" #: ../ui/tcosmonitor-prefwindow.ui:1213 msgid "Screenshots" msgstr "Capturas de pantalla" #: ../ui/tcosmonitor-prefwindow.ui:1229 msgid "Reboot and poweroff" msgstr "Apagar e reiniciar" #: ../ui/tcosmonitor-prefwindow.ui:1243 msgid "Lock and unlock internet" msgstr "Bloquear e desbloquear internet" #: ../ui/tcosmonitor-prefwindow.ui:1259 msgid "DPMS monitor on/off" msgstr "DPMS control enerxía monitores" #: ../ui/tcosmonitor-prefwindow.ui:1277 msgid "Connect using VNC" msgstr "Conectar empregando VNC" #: ../ui/tcosmonitor-prefwindow.ui:1293 msgid "Connect using iTALC" msgstr "Conectar empregando iTALC" #: ../ui/tcosmonitor-prefwindow.ui:1308 msgid "Restart session with new settings" msgstr "Reiniciar coa nova configuración" #: ../ui/tcosmonitor-prefwindow.ui:1385 msgid "Menus" msgstr "Menús" #: ../ui/tcosmonitor-prefwindow.ui:1408 msgid "Show / hide menu buttons" msgstr "Amosar / ocultar botóns de menús" #: ../ui/tcosmonitor-prefwindow.ui:1491 msgid "Audio conference" msgstr "Audio conferencia" #: ../ui/tcosmonitor-prefwindow.ui:1525 msgid "Audio Chat control" msgstr "Control de audio chat" #: ../ui/tcosmonitor-prefwindow.ui:1569 msgid "Menu buttons" msgstr "Botóns de menús" #: ../ui/tcosmonitor-abouttcos.ui:6 msgid "About TCOS" msgstr "Acerca de TCOS" #: ../ui/tcosmonitor-abouttcos.ui:19 msgid "TcosMonitor" msgstr "TcosMonitor" #: ../ui/tcosmonitor-abouttcos.ui:62 msgid "Version:" msgstr "Versión:" #: ../ui/tcosmonitor-abouttcos.ui:90 msgid "" "Thin client and standalone\n" "monitoring tool." msgstr "" "Ferramenta de monitorización\n" "de clientes lixeiros e instalados." #: ../ui/tcosmonitor-abouttcos.ui:131 msgid "Project web site" msgstr "Páxina web do proxecto" #: ../ui/tcosmonitor-abouttcos.ui:178 msgid "About" msgstr "Acerca de" #: ../ui/tcosmonitor-abouttcos.ui:212 msgid "License" msgstr "Licenza" #: ../ui/tcosmonitor-abouttcos.ui:230 msgid "" "Main developers:\n" " * Mario Izquierdo \n" " * Ignacio Vidal \n" "\n" "Contributors:\n" " * Andrés Jimenez\n" " * Quirón\n" "\n" "Special thanks to:\n" " Comunidad de Madrid, MaX group (Spain)" msgstr "" "Desenvolvedores principais:\n" " * Mario Izquierdo \n" " * Ignacio Vidal \n" "\n" "Colaboradores:\n" " * Andrés Jimenez\n" " * Quirón\n" "\n" "Destacamos nos agradecementos a:\n" " Comunidade de Madrid, grupo MaX (España)" #: ../ui/tcosmonitor-abouttcos.ui:259 msgid "Authors" msgstr "Autores" #: ../ui/tcosmonitor-abouttcos.ui:275 msgid "Translated to your language by:" msgstr "Traducido ao seu idioma por:" #: ../ui/tcosmonitor-abouttcos.ui:287 msgid "Mario Izquierdo " msgstr "Mario Izquierdo " #: ../ui/tcosmonitor-abouttcos.ui:307 msgid "Translators" msgstr "Tradutores" #: ../ui/tcosmonitor-abouttcos.ui:324 msgid "" "TCOS is a free software project that need a lot of work to be the best thin " "client plataform.\n" "\n" "We work every day a lot of hours to make changes and support more devices " "and features.\n" "\n" "We want to continue developing this software but need your help, if you use, " "sell or hack TCOS pehaps you could donate some money to project.\n" "\n" "Click on next url to get some info." msgstr "" "TCOS é un proxecto libre que necesita moito traballo para intentar ser a " "mellor plataforma de clientes lixeiros.\n" "\n" "Traballamos cada día moitas horas para facer cambios e soportar máis " "dispositivos e características.\n" "\n" "Queremos continuar facéndoo pero necesitamos a túa axuda, si empregas, " "vendes ou modificas TCOS, quizáis poidas donar algo de diñeiro ao proxecto.\n" "\n" "Pulsa no enlace inferior para obter máis información." #: ../ui/tcosmonitor-abouttcos.ui:370 msgid "http://wiki.tcosproject.org/TcosProject:Site_support" msgstr "http://wiki.tcosproject.org/TcosProject:Site_support/es" #: ../ui/tcosmonitor-abouttcos.ui:392 msgid "Don't show donations message on start." msgstr "Non amosar esta mensaxe ao inicio." #: ../ui/tcosmonitor-abouttcos.ui:415 msgid "Donate" msgstr "Donacións" #: ../ui/tray.ui:20 msgid "TCOS devices" msgstr "" #: ../ui/tray.ui:57 msgid "Hide" msgstr "Ocultar" #: ../ui/tcos-volume-manager.ui:39 msgid "Restart sound" msgstr "" #: ../ui/tcos-volume-manager.ui:54 msgid "Sound levels" msgstr "Niveis de volume" #: ../ui/tcos-volume-manager.ui:90 msgid "Main Channels" msgstr "Canles principais" #: ../ui/tcos-volume-manager.ui:113 msgid "Secondary Channels" msgstr "Canles secundarias" #: ../ui/tcosmonitor-chatwindow.ui:8 msgid "Chat emission list" msgstr "Lista de emisión chat" #: ../ui/tcosmonitor-chatwindow.ui:17 msgid "Chat emission list" msgstr "Lista de emisión chat" #: ../ui/tcosmonitor-chatwindow.ui:80 msgid "Connect" msgstr "Conectar" #: ../ui/tcosmonitor-chatwindow.ui:128 msgid "Disconnect" msgstr "Desconectar" #: ../ui/tcosmonitor-chatwindow.ui:176 msgid "Exit" msgstr "Saír" #: ../ui/tcosmonitor-staticwindow.ui:8 msgid "Static hosts list" msgstr "Lista de equipos" #: ../ui/tcosmonitor-staticwindow.ui:17 msgid "Static Hosts list" msgstr "Lista de equipos" #: ../ui/tcosmonitor-staticwindow.ui:80 msgid "Add" msgstr "Engadir" #: ../ui/tcosmonitor-staticwindow.ui:128 msgid "Modify" msgstr "Modificar" #: ../ui/tcosmonitor-staticwindow.ui:176 msgid "Delete" msgstr "Borrar" #: ../ui/tcosmonitor-staticwindow.ui:225 msgid "Get from connected" msgstr "Tomar dende conectados" #: ../ui/tcosmonitor-staticwindow.ui:292 ../ui/tcosmonitor-mainwindow.ui:771 #: ../ui/tcosmonitor-staticwindownew.ui:150 msgid "Cancel" msgstr "Cancelar" #: ../ui/tcosmonitor-staticwindow.ui:340 #: ../ui/tcosmonitor-staticwindownew.ui:198 msgid "Save" msgstr "Gardar" #: ../ui/tcospersonalize.ui:34 msgid "unknow host" msgstr "equipo descoñecido" #: ../ui/tcospersonalize.ui:74 msgid "Disable Ctrl + Alt + Backspace (for kill Xorg)" msgstr "Desactivar Ctrl+Alt+Backspace (pechar Xorg)" #: ../ui/tcospersonalize.ui:211 msgid "Get avalaible drivers" msgstr "Cargar drivers disponíbeis" #: ../ui/tcospersonalize.ui:248 msgid "Display Settings" msgstr "Configuración gráfica" #: ../ui/tcospersonalize.ui:351 msgid "Default boot kernel" msgstr "Núcleo por defecto" #: ../ui/tcospersonalize.ui:376 msgid "PXE Boot options" msgstr "Opcións de arranque PXE" #: ../ui/tcospersonalize.ui:391 msgid "Default boot method" msgstr "Método de arranque por defecto" #: ../ui/tcospersonalize.ui:419 msgid "Command line" msgstr "Línea de arranque" #: ../ui/tcospersonalize.ui:507 msgid "Boot options" msgstr "Opcións de arranque" #: ../ui/tcospersonalize.ui:551 msgid "Delete Config" msgstr "Borrar configuración" #: ../ui/tcosmonitor-mainwindow.ui:8 msgid "TcosMonitor" msgstr "TcosMonitor" #: ../ui/tcosmonitor-mainwindow.ui:22 msgid "Exit TcosMonitor" msgstr "Saír de TcosMonitor" #: ../ui/tcosmonitor-mainwindow.ui:35 msgid "Open preferences dialog" msgstr "Abrir diálogo de preferencias" #: ../ui/tcosmonitor-mainwindow.ui:48 msgid "Update host list" msgstr "Actualizar lista de equipos" #: ../ui/tcosmonitor-mainwindow.ui:49 msgid "Refresh" msgstr "Actualizar" #: ../ui/tcosmonitor-mainwindow.ui:71 msgid "All Hosts" msgstr "Todos os equipos" #: ../ui/tcosmonitor-mainwindow.ui:99 msgid "Find" msgstr "Buscar" #: ../ui/tcosmonitor-mainwindow.ui:111 msgid "About this app" msgstr "Acerca desta aplicación" #: ../ui/tcosmonitor-mainwindow.ui:219 msgid "Start audio chat" msgstr "Iniciar audio chat" #: ../ui/tcosmonitor-mainwindow.ui:331 msgid "Send audio/video" msgstr "Enviar audio/vídeo" #: ../ui/tcosmonitor-mainwindow.ui:443 msgid "Exe app" msgstr "Executar aplicación" #: ../ui/tcosmonitor-mainwindow.ui:499 msgid "Send message" msgstr "Enviar mensaxe de texto" #: ../ui/tcosmonitor-mainwindow.ui:581 msgid "List view" msgstr "Vista lista de equipos" #: ../ui/tcosmonitor-mainwindow.ui:629 msgid "Icon view" msgstr "Vista iconas" #: ../ui/tcosmonitor-mainwindow.ui:689 msgid "Simulate my classroom" msgstr "Simular aula" #: ../ui/tcosmonitor-staticwindownew.ui:8 msgid "New or edit hosts" msgstr "Novo ou editar lista de equipos" #: ../ui/tcosmonitor-staticwindownew.ui:32 msgid "" "You can add a simple host, \n" " example: 192.168.0.100\n" "\n" "or range of hosts, \n" " example: 192.168.0.100-120\n" "\n" "MAC address is optional" msgstr "" "Pode engadir un equipo,\n" " exemplo: 192.168.0.100\n" "\n" "ou un rango, \n" " exemplo: 192.168.0.100-120\n" "\n" "ou enderezo MAC é opcional" #: ../ui/tcosmonitor-staticwindownew.ui:57 msgid "IP address *" msgstr "Enderezo IP *" #: ../ui/tcosmonitor-askwindow.ui:8 msgid "Question" msgstr "Pregunta" #: ../ui/tcosmonitor-askwindow.ui:50 msgid "You can drag and drop launcher file to this box" msgstr "Podes arrastrar e soltar un lanzador a esta caixa" #: ../ui/tcosmonitor-askwindow.ui:61 msgid "Run app in unknow host" msgstr "Executar aplicación en equipo descoñecido" #, fuzzy #~ msgid "Quit from TcosMonitor" #~ msgstr "Saír de TcosMonitor" #, fuzzy #~ msgid "Lliurex Lab" #~ msgstr "TcosMonitor" #, fuzzy #~ msgid "Clonning clients...." #~ msgstr "Conectando a %s..." #, fuzzy #~ msgid "Clone clients" #~ msgstr "Desconectar todos os clientes" #~ msgid "Can't move icon, another host is near." #~ msgstr "Non se pode mover a icona, hai un equipo preto." #~ msgid "" #~ "Error getting Xorg info:\n" #~ "%s" #~ msgstr "" #~ "Erro obtendo información de Xorg:\n" #~ "%s" #~ msgid "Send my MIC audio" #~ msgstr "Enviar o son do micrófono" #~ msgid "Chat conference mode off." #~ msgstr "Modo conferencia chat desactivado." #~ msgid "No host found" #~ msgstr "Non se atoparon equipos" #, fuzzy #~ msgid "button1" #~ msgstr "Botóns de menús" #~ msgid "Do you want to start conference mode the following users: %s?" #~ msgstr "¿Quiere iniciar modo conferencia a los siguientes usuarios: %s ?" #~ msgid "Waiting for start conference mode..." #~ msgstr "Esperando al arranque del modo conferencia..." #~ msgid "Running in conference mode with %s clients." #~ msgstr "Ejecutandose en modo conferencia con %s equipos." #~ msgid "" #~ "Running in broadcast video transmission to host %(host)s. Broadcast Nº %" #~ "(count)d" #~ msgstr "" #~ "Ejecutándose en modo de difusión de vídeo al equipo %(host)s. Broadcast " #~ "Nº %(count)d" #~ msgid "" #~ "Special characters used in \"%s\".\n" #~ "Please rename it." #~ msgstr "" #~ "Se han usado caracteres especiales en \"%s\"\n" #~ "Por favor, renómbrelo." #~ msgid "No clients selected, do you want to select all?" #~ msgstr "No se han seleccionado equipos, ¿quiere seleccionar todos?" #~ msgid "Running in broadcast video transmission" #~ msgstr "Ejecutándose el modo difusión de vídeo." #~ msgid "Conference chat mode off." #~ msgstr "Conferencia chat desactivado." #~ msgid "Can't exec this action because you are connected at this host!" #~ msgstr "" #~ "¡No se puede ejecutar esta acción porque está conectado desde ese equipo!" #~ msgid "Audio RTP" #~ msgstr "RTP de audio" #~ msgid "Can't logout, user is not logged" #~ msgstr "No se pudo desconectar al usuario, no está conectado" #~ msgid "Waiting for screenshots..." #~ msgstr "Esperando a las capturas..." #~ msgid "Work as cyber mode (not work yet)" #~ msgstr "Trabajar en modo cyber (no disponible)" #~ msgid "Extra modules" #~ msgstr "Módulos extra" #~ msgid "Kernel modules" #~ msgstr "Módulos del kernel" #~ msgid "Extra modules avalaible" #~ msgstr "Módulos extra disponibles" #~ msgid "Add X11vnc support" #~ msgstr "Añadir soporte X11vnc" #~ msgid "Add iTALC support" #~ msgstr "Añadir soporte iTALC" #~ msgid "Add FreeNX support" #~ msgstr "Añadir soporte FreeNX" #~ msgid "Addons" #~ msgstr "Añadidos" #~ msgid "Doing action %(action)s in %(timeout)s seconds" #~ msgstr "Realizando acción %(action)s en %(ip)s segundos" #~ msgid "General settings" #~ msgstr "Configuración general" #~ msgid "Advanced Settings" #~ msgstr "Configuración Avanzada" #~ msgid "" #~ "NOTE:\n" #~ "This values are needed to do some actions\n" #~ "on thin client, if you don't use \n" #~ "update-tcospasswd app, default\n" #~ "user is root and default password is root.\n" #~ "\n" #~ "To change it you have to edit /etc/tcos/tcos.conf and change\n" #~ "TCOS_ROOT_PASSWD var value. Then regenerate images with\n" #~ "gentcos or tcosconfig.\n" #~ "\n" #~ "Using TcosMonitor in PXES or LTSP networks require to use\n" #~ "update-tcospasswd script, run it as root, and follow\n" #~ "instructions. This will generate a tcospasswd file with asked data.\n" #~ msgstr "" #~ "NOTA:\n" #~ "Estos valores se necesitan para realizar ciertas acciones\n" #~ "en el cliente ligero, si no ha usado aún la aplicación\n" #~ "update-tcospasswd los valores por defecto son, \n" #~ "usuario: root contraseña:root.\n" #~ "\n" #~ "Para cambiarlos, edite el archivo /etc/tcos/tcos.conf editando\n" #~ "la variable TCOS_ROOT_PASSWD y regenere la\n" #~ "imagen de arranque con gentcos o use tcosconfig.\n" #~ "\n" #~ "Si está usando TcosMonitor en una red PXES o LTSP, necesita usar\n" #~ "el script update-tcospasswd, ejecútelo como root, y siga\n" #~ "las instrucciones. Esto generará un archivo tcospasswd con los datos " #~ "preguntados.\n" #~ msgid "" #~ "TcosMonitor need special configuration for rsync daemon.\n" #~ "\n" #~ "Please read configuration requeriments in:\n" #~ "/usr/share/doc/tcosmonitor/README.rsync" #~ msgstr "" #~ "TcosMonitor necesita una configuración especial del demonio rsync.\n" #~ "\n" #~ "Lea la configuración requerida en:\n" #~ "/usr/share/doc/tcosmonitor/README.rsync" #~ msgid "no standalone user connected" #~ msgstr "Usuario standalone no conectado." #~ msgid "VLC audio codec" #~ msgstr "Codec de audio para VLC" #~ msgid "VLC video codec" #~ msgstr "Codec de video para VLC" #~ msgid "" #~ "First create /tmp/tcos_share folder,\n" #~ "and restart rsync daemon\n" #~ "/etc/init.d/rsync restart" #~ msgstr "" #~ "Primero debe crear el directorio /tmp/tcos_share,\n" #~ "y después reiniciar el servicio rsync\n" #~ "/etc/init.d/rsync restart" #~ msgid "GNU/GPL" #~ msgstr "GNU/GPL" #~ msgid "A thin client network monitor" #~ msgstr "Un monitor de clientes ligeros" #~ msgid "translator-credits" #~ msgstr "" #~ "Mario Izquierdo (mariodebian)\n" #~ "" #~ msgid "About TCOS" #~ msgstr "Acerca de TCOS" #~ msgid "TcosMonitor web page" #~ msgstr "Página web de TcosMonitor" #~ msgid "Search for hostname, ip address or username" #~ msgstr "Buscar por nombre de equipo, dirección ip, o nombre de usuario" #~ msgid "Search" #~ msgstr "Buscar" #~ msgid "TCOS project needs your help" #~ msgstr "El proyecto TCOS necesita tu ayuda" #~ msgid "" #~ "Mounting device %(device)s in \n" #~ "%(mnt_point)s\n" #~ "Please wait..." #~ msgstr "" #~ "Montando dispositivo %(device)s en\n" #~ "%(mnt_point)s\n" #~ "Por favor, espere..." #~ msgid "Timeout" #~ msgstr "" #~ "Tiempo de \n" #~ "espera" #~ msgid "Your user isn't in fuse group, ask your system administrator." #~ msgstr "Su usuario no pertenece al grupo fuse, pregunte a su administrador." #~ msgid "Flash device mounted. Ready for use." #~ msgstr "Dispositivo flash montado.Listo para usar." #~ msgid "Flash device umounted. You can extract it." #~ msgstr "Dispositivo flash desmontado. Ahora puede extraerlo." #~ msgid "Can't mount device %s" #~ msgstr "No se pudo montar el dispositivo %s" #~ msgid "Can't umount device %s" #~ msgstr "No se pudo desmontar el dispositivo %s" #~ msgid "Umount %s remote device" #~ msgstr "Desmontar dispositivo %s remoto" #~ msgid "" #~ "Mounting device %(device)s in \n" #~ "%(mnt_point)s\n" #~ "Please wait...\n" #~ "Click on Desktop icon to secure umount." #~ msgstr "" #~ "Montando dispositivo %(device)s en\n" #~ "%(mnt_point)s\n" #~ "Por favor, espere\n" #~ "Pulse en el icono del escritorio para extracción segura." #~ msgid "Tcos Devices daemon on host %s" #~ msgstr "Gestor de dispositivos TCOS en equipo %s" #~ msgid "Tcos Devices on %s host" #~ msgstr "Gestor de dispositivos TCOS en equipo %s" #~ msgid "No support for more than one cdrom, first detected will be used" #~ msgstr "No hay soporte para más de un cdrom, se usará el primero." #~ msgid "Cdrom" #~ msgstr "Cdrom" #~ msgid "Umounting %s, please wait..." #~ msgstr "Desmontando %s, por favor, espere..." #~ msgid "Floppy status:" #~ msgstr "Estado del disquete:" #~ msgid "CDROM status:" #~ msgstr "Estado del CDROM:" #~ msgid "Mount CDROM" #~ msgstr "Montar CDROM" #~ msgid "Umount CDROM" #~ msgstr "Desmontar CDROM" #~ msgid "Do you want to restart Xorg of %s?" #~ msgstr "¿Quiere reiniciar Xorg del equipo %s?" tcosmonitor/po/FILES0000664000000000000000000000367212260544373011547 0ustar ../tcosmonitor.py ../tcos-devices-ng.py ../server-utils/tcos-server-utils.py ../ui/tcosmonitor-prefwindow.ui ../ui/tcosmonitor-abouttcos.ui ../ui/tray.ui ../ui/tcos-volume-manager.ui ../ui/tcosmonitor-chatwindow.ui ../ui/tcosmonitor-staticwindow.ui ../ui/tcospersonalize.ui ../ui/tcosmonitor-mainwindow.ui ../ui/tcosmonitor-staticwindownew.ui ../ui/tcosmonitor-askwindow.ui ../setup.py ../tcospersonalize.py ../tcos-volume-manager.py ../tcosmonitor/TcosDBus.py ../tcosmonitor/TcosXauth.py ../tcosmonitor/TcosStaticHosts.py ../tcosmonitor/__init__.py ../tcosmonitor/shared.py ../tcosmonitor/TcosClassView.py ../tcosmonitor/TcosTrayIcon.py ../tcosmonitor/TcosPAM.py ../tcosmonitor/extensions/lockscreen.py ../tcosmonitor/extensions/appsmsg.py ../tcosmonitor/extensions/remotessh.py ../tcosmonitor/extensions/__init__.py ../tcosmonitor/extensions/dpms.py ../tcosmonitor/extensions/screenshot.py ../tcosmonitor/extensions/sendfiles.py ../tcosmonitor/extensions/info.py ../tcosmonitor/extensions/logout.py ../tcosmonitor/extensions/reboot.py ../tcosmonitor/extensions/tcosnetcontroller.py ../tcosmonitor/extensions/videolan.py ../tcosmonitor/extensions/restartxorg.py ../tcosmonitor/extensions/italc.py ../tcosmonitor/extensions/tcospersonalize.py ../tcosmonitor/extensions/vnc.py ../tcosmonitor/extensions/wakeonlan.py ../tcosmonitor/extensions/livevnc.py ../tcosmonitor/extensions/viewproc.py ../tcosmonitor/extensions/audiortp.py ../tcosmonitor/extensions/clean.py ../tcosmonitor/TcosXmlRpc.py ../tcosmonitor/TcosMonitorDaemon.py ../tcosmonitor/TcosIconView.py ../tcosmonitor/TcosListView.py ../tcosmonitor/TcosTrayIcon2.py ../tcosmonitor/TcosConf.py ../tcosmonitor/Initialize.py ../tcosmonitor/LocalData.py ../tcosmonitor/TcosPreferences.py ../tcosmonitor/htmltextview.py ../tcosmonitor/TcosMenus.py ../tcosmonitor/ping.py ../tcosmonitor/TcosActions.py ../tcosmonitor/TcosExtensions.py ../tcosmonitor/TcosCommon.py ../dbus/client.py ../dbus/server.py ../dbus/tcos-dbus-client.py tcosmonitor/po/fr.po0000664000000000000000000025230312260544373011726 0ustar # Translation of tcosmonitor to french. # Copyright (C) 2012 Debian French l10n Team # This file is distributed under the same license as the tcosmonitor package. # Julien Patriarca , 2012. # msgid "" msgstr "" "Project-Id-Version: tcosmonitor\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2012-06-22 13:31+0200\n" "PO-Revision-Date: 2012-06-10 00:08+0100\n" "Last-Translator: Julien Patriarca \n" "Language-Team: FRENCH \n" "Language: fr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../tcos-volume-manager.py:97 ../tcos-volume-manager.py:109 #, python-format msgid "" "Tcos Sound levels on:\n" "%s" msgstr "" "les niveaux de Tcos Sound sont à :\n" "%s" #: ../tcos-volume-manager.py:117 #, python-format msgid "ERROR: It appears that TcosXmlRpc is not running on %s." msgstr "ERREUR : il apparaît que TcosXmlRpc n'est pas lancé sur %s" #: ../tcos-volume-manager.py:139 ../tcos-devices-ng.py:281 #, python-format msgid "Error connecting with TcosXmlRpc in %s." msgstr "" "Une erreur s'est produite lors de la connexion avec TcosXmlRpc dans %s." #: ../tcos-volume-manager.py:213 msgid "Loading channels info..." msgstr "Chargement en cours des informations des canaux…" #: ../tcos-volume-manager.py:226 msgid "Error loading channels info (xauth error)" msgstr "" "Une erreur s'est produite durant le chargement des informations des canaux " "(erreur xauth)" #: ../tcos-volume-manager.py:229 ../ui/tcos-volume-manager.ui:8 msgid "Tcos Volume Manager" msgstr "Tcos Volume Manager" #: ../tcos-volume-manager.py:230 #, python-format msgid "Sound mixer of %s host" msgstr "Mélangeur sonore de l' %s hôte" #: ../tcos-volume-manager.py:296 ../tcosmonitor/extensions/info.py:440 msgid "Mute" msgstr "Muet" #: ../tcos-volume-manager.py:315 msgid "Main controls ready" msgstr "Les commandes principales sont prêtes" #: ../tcos-volume-manager.py:319 msgid "All remote controls loaded." msgstr "Toutes les commandes distantes sont chargées." #: ../tcos-volume-manager.py:328 ../tcosmonitor/extensions/info.py:556 #, python-format msgid "Changing value of %(channel)s channel, to %(value)s%%..." msgstr "Changement en cours de la valeur du canal %(channel)s, à %(value)s %%…" #: ../tcos-volume-manager.py:335 ../tcosmonitor/extensions/info.py:563 #, python-format msgid "Changed value of %(channel)s channel, to %(value)s" msgstr "La valeur du canal %(channel)s a été changée à %(value)s" #: ../tcos-volume-manager.py:342 ../tcosmonitor/extensions/info.py:570 #, python-format msgid "Unmuting %s channel..." msgstr "Désactivation de la sourdine du canal %s…" #: ../tcos-volume-manager.py:347 ../tcosmonitor/extensions/info.py:575 #, python-format msgid "Muting %s channel..." msgstr "Activation de la sourdine pour le canal %s…" #: ../tcos-volume-manager.py:350 ../tcosmonitor/extensions/info.py:578 #, python-format msgid "Status of %(channel)s channel, is \"%(newvalue)s\"" msgstr "Le statut du %(channel)s canal, est « %(newvalue)s »" #: ../tcos-volume-manager.py:374 ../tcosmonitor.py:340 #: ../tcospersonalize.py:556 msgid "Exiting" msgstr "Clôture en cours" #: ../tcosmonitor/ping.py:86 ../tcosmonitor/ping.py:168 #: ../tcosmonitor/ping.py:265 ../tcosmonitor/ping.py:326 #: ../tcosmonitor/LocalData.py:278 msgid "Testing if found clients have 8998 or 8999 port open..." msgstr "" "Test en cours pour savoir si les clients trouvés ont les ports 8998 et 8999 " "ouverts…" #: ../tcosmonitor/ping.py:153 #, python-format msgid "Checking %s..." msgstr "Vérification de %s…" #: ../tcosmonitor/ping.py:187 ../tcosmonitor/ping.py:284 #: ../tcosmonitor/ping.py:347 ../tcosmonitor/TcosActions.py:119 #: ../tcosmonitor/TcosActions.py:202 ../tcosmonitor/TcosActions.py:220 msgid "Not connected hosts found." msgstr "Des hôtes non connectés ont été trouvés." #: ../tcosmonitor/ping.py:195 ../tcosmonitor/ping.py:292 #: ../tcosmonitor/ping.py:352 ../tcosmonitor/TcosActions.py:121 #: ../tcosmonitor/TcosActions.py:206 ../tcosmonitor/TcosActions.py:214 #, python-format msgid "Found %d hosts" msgstr "%d hôtes trouvés" #: ../tcosmonitor/ping.py:229 #, python-format msgid "Ping to %s..." msgstr "Ping vers %s…" #: ../tcosmonitor/ping.py:243 msgid "Waiting for pings..." msgstr "En attente des pings…" #: ../tcosmonitor/TcosCommon.py:85 #, python-format msgid "" "ThreadController: Found error executing %(cmd)s\n" "\n" "If problem persist, disable Thread Controller\n" "in Preferences and report bug.\n" "Error=%(error)s" msgstr "" "Contrôleur de processus : une erreur a été trouvée lors de l'exécution de " "%(cmd)s\n" "\n" "Si le problème persiste, désactivez le contrôleur de processus\n" "dans Préférences et signaler un bogue.\n" "Erreur = %(error)s" #: ../tcosmonitor/TcosCommon.py:180 ../tcosmonitor/TcosCommon.py:209 #: ../tcosmonitor/TcosCommon.py:212 ../tcosmonitor/LocalData.py:40 #: ../tcosmonitor/LocalData.py:60 ../tcosmonitor/extensions/info.py:135 msgid "unknow" msgstr "inconnu" #: ../tcosmonitor/TcosTrayIcon.py:47 ../tcosmonitor/extensions/vnc.py:296 #: ../tcosmonitor/TcosTrayIcon2.py:49 ../ui/tcosmonitor-mainwindow.ui:23 msgid "Quit" msgstr "Quitter" #: ../tcosmonitor/TcosTrayIcon.py:52 ../tcosmonitor/shared.py:281 #: ../tcosmonitor/extensions/reboot.py:37 ../tcosmonitor/TcosTrayIcon2.py:54 msgid "Reboot" msgstr "Redémarrage" #: ../tcosmonitor/TcosTrayIcon.py:53 ../tcosmonitor/shared.py:282 #: ../tcosmonitor/extensions/reboot.py:39 ../tcosmonitor/TcosTrayIcon2.py:55 msgid "Poweroff" msgstr "Extinction" #: ../tcosmonitor/TcosTrayIcon.py:63 msgid "TcosDevices" msgstr "MachinesTcos" #: ../tcosmonitor/TcosTrayIcon.py:170 ../tcosmonitor/TcosTrayIcon.py:184 #: ../tcosmonitor/TcosTrayIcon2.py:63 msgid "Tcos Devices" msgstr "Machines Tcos" #: ../tcosmonitor/TcosTrayIcon.py:230 ../tcosmonitor/TcosTrayIcon2.py:347 msgid "Usb flash" msgstr "Clé USB" #: ../tcosmonitor/TcosTrayIcon.py:232 ../tcosmonitor/TcosTrayIcon2.py:349 msgid "Mount USB1" msgstr "Monter USB1" #: ../tcosmonitor/TcosTrayIcon.py:233 ../tcosmonitor/TcosTrayIcon2.py:350 msgid "Umount USB1" msgstr "Démonter USB1" #: ../tcosmonitor/shared.py:107 msgid "Traditional list only" msgstr "Liste traditionnelle uniquement" #: ../tcosmonitor/shared.py:108 msgid "Icons only" msgstr "Icônes seulement" #: ../tcosmonitor/shared.py:109 msgid "Simulate classroom" msgstr "Simuler une salle de classe" #: ../tcosmonitor/shared.py:110 msgid "Lists, icons and classroom with tabs" msgstr "Listes, icônes et salle de classe avec des tabulations" #: ../tcosmonitor/shared.py:270 ../tcosmonitor/shared.py:312 #: ../tcosmonitor/TcosMenus.py:29 msgid "Terminal actions" msgstr "Actions de la console" #: ../tcosmonitor/shared.py:271 ../tcosmonitor/shared.py:313 #: ../tcosmonitor/TcosMenus.py:30 msgid "User actions" msgstr "Actions de l'utilisateur" #: ../tcosmonitor/shared.py:272 ../tcosmonitor/shared.py:314 #: ../tcosmonitor/TcosMenus.py:31 msgid "Audio, video and files" msgstr "Audio, vidéo et fichiers" #: ../tcosmonitor/shared.py:279 ../tcosmonitor/extensions/info.py:44 msgid "Refresh terminal info" msgstr "Rafraîchir les informations de la console" #: ../tcosmonitor/shared.py:280 ../tcosmonitor/extensions/clean.py:37 #: ../tcosmonitor/extensions/clean.py:38 msgid "Clean info about terminal" msgstr "Effacer les informations à propos de la console" #: ../tcosmonitor/shared.py:283 ../tcosmonitor/extensions/lockscreen.py:37 msgid "Lock screen" msgstr "Écran de verrouillage" #: ../tcosmonitor/shared.py:284 ../tcosmonitor/extensions/lockscreen.py:39 msgid "Unlock screen" msgstr "Écran de déverrouillage" #: ../tcosmonitor/shared.py:285 ../tcosmonitor/extensions/italc.py:38 msgid "Connect to remote screen (iTALC)" msgstr "Connecter à un écran distant (iTALC)" #: ../tcosmonitor/shared.py:286 ../tcosmonitor/extensions/vnc.py:50 msgid "Connect to remote screen (VNC)" msgstr "Connecter à un écran distant (VNC)" #: ../tcosmonitor/shared.py:287 ../tcosmonitor/extensions/screenshot.py:42 msgid "Screenshot" msgstr "Capture d'écran" #: ../tcosmonitor/shared.py:288 ../tcosmonitor/extensions/remotessh.py:37 msgid "Give a remote xterm" msgstr "Donner un xterm distant" #: ../tcosmonitor/shared.py:289 #: ../tcosmonitor/extensions/tcospersonalize.py:37 #: ../ui/tcosmonitor-prefwindow.ui:1341 msgid "Configure this host" msgstr "Configurer cet utilisateur" #: ../tcosmonitor/shared.py:290 ../tcosmonitor/extensions/logout.py:37 msgid "Logout client" msgstr "Déconnecter le client" #: ../tcosmonitor/shared.py:291 ../tcosmonitor/extensions/restartxorg.py:38 msgid "Restart X session with new settings" msgstr "Redémarrer la session X avec les nouveaux réglages" #: ../tcosmonitor/shared.py:292 ../tcosmonitor/extensions/appsmsg.py:49 msgid "Exec app on user display" msgstr "Exécuter une application sur l'affichage de l'utilisateur" #: ../tcosmonitor/shared.py:293 ../tcosmonitor/extensions/appsmsg.py:50 msgid "Send a text message to user" msgstr "Envoyer un message texte à l'utilisateur" #: ../tcosmonitor/shared.py:294 ../tcosmonitor/extensions/viewproc.py:38 msgid "Show running apps of this client" msgstr "Afficher les applications lancées de ce client" #: ../tcosmonitor/shared.py:295 ../tcosmonitor/shared.py:332 msgid "Audio/Video broadcast" msgstr "Diffusion Audio/Vidéo" #: ../tcosmonitor/shared.py:296 ../tcosmonitor/shared.py:333 #: ../tcosmonitor/extensions/sendfiles.py:45 #: ../tcosmonitor/extensions/sendfiles.py:46 #: ../ui/tcosmonitor-mainwindow.ui:387 ../ui/tcosmonitor-prefwindow.ui:1151 #: ../ui/tcosmonitor-prefwindow.ui:1492 msgid "Send files" msgstr "Envoyer des fichiers" #: ../tcosmonitor/shared.py:297 ../tcosmonitor/extensions/vnc.py:51 msgid "Demo mode (from this host)" msgstr "Mode de démonstration (depuis cet hôte)" #: ../tcosmonitor/shared.py:298 ../tcosmonitor/extensions/wakeonlan.py:38 msgid "Boot client (WakeOnLan)" msgstr "Client de démarrage (WakeOnLan)" #: ../tcosmonitor/shared.py:299 #: ../tcosmonitor/extensions/tcosnetcontroller.py:35 msgid "Lock internet" msgstr "Bloquer l'accès Internet" #: ../tcosmonitor/shared.py:300 #: ../tcosmonitor/extensions/tcosnetcontroller.py:36 msgid "Unlock internet" msgstr "Débloquer l'accès Internet" #: ../tcosmonitor/shared.py:301 ../tcosmonitor/extensions/dpms.py:37 msgid "DPMS Power off monitor" msgstr "Éteindre le moniteur avec DPMS" #: ../tcosmonitor/shared.py:302 ../tcosmonitor/extensions/dpms.py:39 msgid "DPMS Power on monitor" msgstr "Allumer le moniteur avec DPMS" #: ../tcosmonitor/shared.py:303 msgid "Send MIC audio (from this host)" msgstr "Envoyer du son Micro (depuis cet hôte)" #: ../tcosmonitor/shared.py:321 ../tcosmonitor/extensions/reboot.py:38 msgid "Reboot all clients" msgstr "Redémarrer tous les clients" #: ../tcosmonitor/shared.py:322 ../tcosmonitor/extensions/reboot.py:40 msgid "Poweroff all clients" msgstr "Éteindre tous les clients" #: ../tcosmonitor/shared.py:323 ../tcosmonitor/extensions/lockscreen.py:38 msgid "Lock all screens" msgstr "Verrouiller tous les écrans" #: ../tcosmonitor/shared.py:324 ../tcosmonitor/extensions/lockscreen.py:40 msgid "Unlock all screens" msgstr "Déverrouiller tous les écrans" #: ../tcosmonitor/shared.py:325 ../tcosmonitor/extensions/logout.py:38 msgid "Logout clients" msgstr "Déconnecter les clients" #: ../tcosmonitor/shared.py:326 ../tcosmonitor/extensions/restartxorg.py:39 msgid "Restart X session of all clients" msgstr "Redémarrer les sessions X de tous les clients" #: ../tcosmonitor/shared.py:327 ../tcosmonitor/extensions/appsmsg.py:52 msgid "Exec same app in all connected users" msgstr "Exécuter la même application sur tous les utilisateurs connectés" #: ../tcosmonitor/shared.py:328 ../tcosmonitor/extensions/appsmsg.py:53 msgid "Send a text message to all connected users" msgstr "Envoyer un message texte à tous les utilisateurs connectés" #: ../tcosmonitor/shared.py:329 ../tcosmonitor/extensions/vnc.py:53 msgid "Enter demo mode, all connected users see my screen" msgstr "" "Entrer en mode démonstration, tous les utilisateurs connectés voient mon " "écran" #: ../tcosmonitor/shared.py:330 msgid "Enter conference mode, all connected users can hear me" msgstr "" "Entrer en mode conférence, tous les utilisateurs connectés peuvent m'entendre" #: ../tcosmonitor/shared.py:331 ../tcosmonitor/extensions/screenshot.py:43 msgid "Capture All clients screens" msgstr "Capturer l'écran de tous les utilisateurs" #: ../tcosmonitor/shared.py:334 ../tcosmonitor/extensions/wakeonlan.py:39 msgid "Boot All clients (WakeOnLan)" msgstr "Démarrer tous les clients (WakeOnLan)" #: ../tcosmonitor/shared.py:335 #: ../tcosmonitor/extensions/tcosnetcontroller.py:38 msgid "Lock internet in all connected users" msgstr "Bloquer l'accès Internet de tous les utilisateurs connectés." #: ../tcosmonitor/shared.py:336 #: ../tcosmonitor/extensions/tcosnetcontroller.py:39 msgid "Unlock internet in all connected users" msgstr "Débloquer l'accès Internet de tous les utilisateurs connectés" #: ../tcosmonitor/shared.py:337 ../tcosmonitor/extensions/dpms.py:38 msgid "DPMS Power off monitors" msgstr "Éteindre les moniteurs avec DPMS" #: ../tcosmonitor/shared.py:338 ../tcosmonitor/extensions/dpms.py:40 msgid "DPMS Power on monitors" msgstr "Allumer les moniteurs avec DPMS" #: ../tcosmonitor/shared.py:339 msgid "Chat audio conference" msgstr "Conférence audio en ligne" #: ../tcosmonitor/shared.py:340 ../tcosmonitor/extensions/livevnc.py:47 #: ../ui/tcosmonitor-prefwindow.ui:1359 msgid "Live view screens with VNC" msgstr "Voir les écrans en direct avec VNC" #: ../tcosmonitor/shared.py:548 #, python-format msgid "QUESTION: %(txt)s, RESPONSE %(response)s" msgstr "QUESTION : %(txt)s, RÉPONSE %(response)s" #: ../tcosmonitor/shared.py:565 ../tcosmonitor/shared.py:576 #, python-format msgid "INFO: %s" msgstr "INFO : %s" #: ../tcosmonitor/shared.py:587 #, python-format msgid "ERROR: %s" msgstr "ERREUR : %s" #: ../tcosmonitor/Initialize.py:201 msgid "GPL-2 license file not found" msgstr "Impossible de trouver un fichier de licence GPL-2 " #: ../tcosmonitor/TcosClassView.py:47 ../tcosmonitor/TcosIconView.py:43 msgid "IP" msgstr "IP" #: ../tcosmonitor/TcosClassView.py:48 ../tcosmonitor/TcosIconView.py:44 #: ../tcosmonitor/TcosListView.py:60 msgid "Hostname" msgstr "Nom d'hôte" #: ../tcosmonitor/TcosClassView.py:49 ../tcosmonitor/TcosIconView.py:45 #: ../tcosmonitor/TcosListView.py:72 msgid "Username" msgstr "Nom d'utilisateur" #: ../tcosmonitor/TcosClassView.py:50 ../tcosmonitor/TcosIconView.py:46 #: ../tcosmonitor/TcosListView.py:83 msgid "Logged" msgstr "Connecté" #: ../tcosmonitor/TcosClassView.py:51 ../tcosmonitor/TcosIconView.py:47 #: ../tcosmonitor/TcosListView.py:99 msgid "Time log in" msgstr "Temps de connexion" #: ../tcosmonitor/TcosClassView.py:52 ../tcosmonitor/TcosIconView.py:48 msgid "Screen locked" msgstr "Écran verrouillé" #: ../tcosmonitor/TcosClassView.py:53 ../tcosmonitor/TcosIconView.py:49 msgid "Network locked" msgstr "Réseau bloqué" #: ../tcosmonitor/TcosClassView.py:55 msgid "" "Place mouse on any computer to see brief info about it.\n" "You can select and unselect multiple host clicking on every one.\n" "Drag and drop hosts to positions and save clicking on right mouse button." msgstr "" "Veuillez déplacer la souris sur n'importe quel ordinateur pour obtenir un " "bref résumé à son propos.\n" "Vous pouvez sélectionner et désélectionner plusieurs hôtes en cliquant sur " "chacun.\n" "Glisser/Déposer les hôtes sur des positions et sauvegarder en cliquant sur " "le bouton droit de la souris." #: ../tcosmonitor/TcosClassView.py:176 msgid "Positions reset to defaults." msgstr "Les positions ont été remises aux valeurs par défaut." #: ../tcosmonitor/TcosClassView.py:194 msgid "Positions saved." msgstr "Positions enregistrées." #: ../tcosmonitor/TcosClassView.py:323 #, python-format msgid "%s is not a valid file to exe or send" msgstr "%s n'est pas un fichier valide à exécuter ou à envoyer" #: ../tcosmonitor/TcosClassView.py:411 ../tcosmonitor/TcosIconView.py:152 msgid "yes" msgstr "oui" #: ../tcosmonitor/TcosClassView.py:413 ../tcosmonitor/TcosIconView.py:154 msgid "no" msgstr "non" #: ../tcosmonitor/TcosIconView.py:51 msgid "Place mouse on any computer to see brief info about it." msgstr "" "Déplacez la souris sur n'importe quel ordinateur pour en voir un bref résumé." #: ../tcosmonitor/TcosExtensions.py:39 msgid "Exception:" msgstr "Exception :" #: ../tcosmonitor/TcosExtensions.py:75 msgid "Error: no IP!" msgstr "Erreur : pas d'IP !" #: ../tcosmonitor/TcosExtensions.py:156 msgid "No clients connected, press refresh button." msgstr "Pas de clients connectés, veuillez appuyer sur le bouton rafraîchir." #: ../tcosmonitor/TcosExtensions.py:261 ../tcosmonitor/TcosExtensions.py:263 #, python-format msgid "Can't exec this action at '%s' because you are connected at this host!" msgstr "" "Impossible d'exécuter cette action à « %s » car vous êtes connecté à cet " "hôte !" #: ../tcosmonitor/TcosExtensions.py:277 #, python-format msgid "Doing action \"%(action)s\" in %(ip)s..." msgstr "En train d'effectuer les actions « %(action)s » sur %(ip)s…" #: ../tcosmonitor/TcosExtensions.py:294 #, python-format msgid "Done action \"%(action)s\" in %(ip)s" msgstr "Action « %(action)s » effectuée sur %(ip)s…" #: ../tcosmonitor/TcosExtensions.py:347 ../tcosmonitor/extensions/vnc.py:288 #: ../tcosmonitor/extensions/livevnc.py:68 #: ../tcosmonitor/TcosPreferences.py:543 msgid "Stop" msgstr "Arrêter" #: ../tcosmonitor/LocalData.py:213 ../tcosmonitor/LocalData.py:230 #, python-format msgid "Selected network inteface (%s) don't have IP address" msgstr "L'interface réseau choisie (%s) ne possède pas d'adresse IP" #: ../tcosmonitor/LocalData.py:321 msgid "" "Static list method configured but no hosts in list.\n" "\n" "Please, open preferences, click on 'Open Static Host list' and add some " "hosts." msgstr "" "Méthode par liste statique sélectionnée mais pas d'hôte dans la liste.\n" "\n" "Veuillez ouvrir les préférences, cliquer sur « Ouvrir la liste des hôtes " "statiques » et ajouter des hôtes." #: ../tcosmonitor/extensions/vnc.py:64 ../tcosmonitor/extensions/vnc.py:108 #: ../tcosmonitor/extensions/vnc.py:421 #: ../tcosmonitor/extensions/audiortp.py:226 #: ../tcosmonitor/extensions/audiortp.py:272 #: ../tcosmonitor/extensions/audiortp.py:371 #: ../tcosmonitor/extensions/audiortp.py:405 #: ../tcosmonitor/extensions/audiortp.py:458 #: ../tcosmonitor/extensions/sendfiles.py:200 #: ../tcosmonitor/extensions/videolan.py:456 #: ../tcosmonitor/extensions/tcosnetcontroller.py:110 #: ../tcosmonitor/extensions/tcosnetcontroller.py:152 msgid "No users logged." msgstr "Pas d'utilisateur connecté." #: ../tcosmonitor/extensions/vnc.py:67 #, python-format msgid "Do you want to start demo mode the following users: %s?" msgstr "" "Voulez-vous démarrer le mode démonstration pour les utilisateurs suivants : " "%s ?" #: ../tcosmonitor/extensions/vnc.py:79 msgid "Waiting for start demo mode..." msgstr "En attente du démarrage du mode démonstration…" #: ../tcosmonitor/extensions/vnc.py:94 ../tcosmonitor/extensions/vnc.py:406 #: ../tcosmonitor/extensions/videolan.py:164 #: ../tcosmonitor/extensions/videolan.py:364 #: ../tcosmonitor/extensions/videolan.py:601 msgid "Error while exec app" msgstr "Erreur lors de l'exécution de l'application" #: ../tcosmonitor/extensions/vnc.py:112 ../tcosmonitor/extensions/vnc.py:425 #, python-format msgid "Running in demo mode with %s clients." msgstr "Mode démonstration en cours pour les clients %s." #: ../tcosmonitor/extensions/vnc.py:123 #, python-format msgid "Running in demo mode from server. Demo Nº %s" msgstr "Mode démonstration en cours depuis le serveur. Démonstration nº %s" #: ../tcosmonitor/extensions/vnc.py:131 ../tcosmonitor/extensions/italc.py:46 msgid "No user logged." msgstr "Pas d'utilisateur connecté." #: ../tcosmonitor/extensions/vnc.py:145 ../tcosmonitor/extensions/vnc.py:368 #, python-format msgid "Connecting with %s to start VNC support" msgstr "Connexion en cours avec %s pour démarrer l'assistance VNC" #: ../tcosmonitor/extensions/vnc.py:174 #, python-format msgid "" "Can't start VNC, error:\n" "%s" msgstr "" "Impossible de démarrer VNC, erreur : \n" "%s" #: ../tcosmonitor/extensions/vnc.py:178 msgid "Waiting for start of VNC server..." msgstr "En attente du démarrage du serveur VNC…" #: ../tcosmonitor/extensions/vnc.py:209 msgid "Can't start VNC, please add X11VNC support" msgstr "Impossible de démarrer VNC, veuillez ajouter le support X11VNC" #: ../tcosmonitor/extensions/vnc.py:235 msgid "Switch to view only" msgstr "Basculer sur vue uniquement" #: ../tcosmonitor/extensions/vnc.py:240 ../tcosmonitor/extensions/vnc.py:271 msgid "Switch to full control" msgstr "Basculer sur contrôle total" #: ../tcosmonitor/extensions/vnc.py:267 #, python-format msgid "VNC host %s" msgstr "Hôte VNC %s" #: ../tcosmonitor/extensions/vnc.py:279 msgid "Switch to fullscreen" msgstr "Basculer en plein-écran" #: ../tcosmonitor/extensions/vnc.py:340 msgid "Can't start demo mode, user is not logged" msgstr "" "Impossible de démarrer le mode démonstration, l'utilisateur n'est pas " "connecté" #: ../tcosmonitor/extensions/vnc.py:343 #, python-format msgid "Do you want demo mode from user %s?" msgstr "Voulez-vous démarrer le mode démonstration depuis l'utilisateur %s ?" #: ../tcosmonitor/extensions/vnc.py:391 #, python-format msgid "Waiting for start demo mode from user %s..." msgstr "En attente du démarrage du mode démonstration depuis l'utilisateur %s…" #: ../tcosmonitor/extensions/vnc.py:445 #, python-format msgid "Running in demo mode from user %(host)s. Demo Nº %(count)s" msgstr "" "Mode démonstration en cours depuis l'utilisateur %(host)s. Démonstration " "nº %(count)s" #: ../tcosmonitor/extensions/vnc.py:501 msgid "Demo mode off." msgstr "Mode démonstration arrêté." #: ../tcosmonitor/extensions/info.py:88 #, python-format msgid "Connecting with %s to retrieve some info..." msgstr "Connexion en cours avec %s pour rapatrier des informations…" #: ../tcosmonitor/extensions/info.py:114 msgid "Tcos info" msgstr "Informations à propos de Tcos" #: ../tcosmonitor/extensions/info.py:117 msgid "PXES info" msgstr "Informations à propos de PXE" #: ../tcosmonitor/extensions/info.py:120 msgid "LTSP info" msgstr "Informations à propos de LTSP" #: ../tcosmonitor/extensions/info.py:123 msgid "Standalone info" msgstr "Informations à propos du mode autonome" #: ../tcosmonitor/extensions/info.py:126 msgid "Multiseat info" msgstr "Information à propos du multisiège" #: ../tcosmonitor/extensions/info.py:129 msgid "Unknow client info" msgstr "Informations à propos du client inconnu" #: ../tcosmonitor/extensions/info.py:138 msgid "Hostname: " msgstr "Nom d'hôte : " #: ../tcosmonitor/extensions/info.py:139 msgid "Ip address: " msgstr "Adresse IP : " #: ../tcosmonitor/extensions/info.py:140 msgid "TcosXmlRpc version: " msgstr "Version de TcosXmlRpc : " #: ../tcosmonitor/extensions/info.py:149 msgid "Tcos image version: " msgstr "Version de l'image Tcos : " #: ../tcosmonitor/extensions/info.py:150 msgid "Tcos image date: " msgstr "Date de l'image Tcos : " #: ../tcosmonitor/extensions/info.py:151 msgid "Date of thin client: " msgstr "Date du client léger : " #: ../tcosmonitor/extensions/info.py:152 msgid "Uptime: " msgstr "Temps de disponibilité : " #: ../tcosmonitor/extensions/info.py:163 msgid "Kernel info" msgstr "Informations à propos du noyau" #: ../tcosmonitor/extensions/info.py:172 msgid "Force download and mount all modules" msgstr "Forcer le téléchargement et monter tous les modules" #: ../tcosmonitor/extensions/info.py:183 msgid "None" msgstr "Aucun" #: ../tcosmonitor/extensions/info.py:186 msgid "Kernel version: " msgstr "Version du noyau : " #: ../tcosmonitor/extensions/info.py:187 msgid "Kernel complete version: " msgstr "Version complète du noyau : " #: ../tcosmonitor/extensions/info.py:188 msgid "Loaded Modules: " msgstr "Modules chargés : " #: ../tcosmonitor/extensions/info.py:189 msgid "Modules not found: " msgstr "Modules non trouvés : " #: ../tcosmonitor/extensions/info.py:205 msgid "Cpu info: " msgstr "Informations à propos du processeur : " #: ../tcosmonitor/extensions/info.py:212 msgid "Cpu model: " msgstr "Modèle de processeur : " #: ../tcosmonitor/extensions/info.py:213 msgid "Cpu vendor: " msgstr "Fabricant du processeur : " #: ../tcosmonitor/extensions/info.py:214 msgid "Cpu speed: " msgstr "Vitesse du processeur : " #: ../tcosmonitor/extensions/info.py:225 msgid "PCI buses: " msgstr "Bus PCI : " #: ../tcosmonitor/extensions/info.py:253 msgid "Process running: " msgstr "Processus en cours : " #: ../tcosmonitor/extensions/info.py:266 msgid "Ram info: " msgstr "Informations à propos de la RAM : " #: ../tcosmonitor/extensions/info.py:273 msgid "Total Ram: " msgstr "Taille totale de la RAM : " #: ../tcosmonitor/extensions/info.py:274 msgid "Free RAM: " msgstr "RAM disponible : " #: ../tcosmonitor/extensions/info.py:275 msgid "Active RAM: " msgstr "RAM utilisée : " #: ../tcosmonitor/extensions/info.py:278 msgid "Swap info: " msgstr "Informations à propos de la partition d'échange : " #: ../tcosmonitor/extensions/info.py:284 msgid "Swap enabled: " msgstr "Partition d'échange activée : " #: ../tcosmonitor/extensions/info.py:285 msgid "Total Swap: " msgstr "Taille totale de la partition d'échange : " #: ../tcosmonitor/extensions/info.py:286 msgid "Used Swap: " msgstr "Taille de la partition d'échange utilisée : " #: ../tcosmonitor/extensions/info.py:296 msgid "Network info: " msgstr "Informations à propos du réseau : " #: ../tcosmonitor/extensions/info.py:306 msgid "Network hostname: " msgstr "Nom d'hôte réseau : " #: ../tcosmonitor/extensions/info.py:307 msgid "Network IP: " msgstr "Adresse IP réseau : " #: ../tcosmonitor/extensions/info.py:308 msgid "Network MASK: " msgstr "MASQUE réseau : " #: ../tcosmonitor/extensions/info.py:309 msgid "Network MAC: " msgstr "Adresse MAC réseau : " #: ../tcosmonitor/extensions/info.py:310 msgid "Data received(rx): " msgstr "Données reçues (rx) : " #: ../tcosmonitor/extensions/info.py:311 msgid "Data send(tx): " msgstr "Données envoyées(tx) : " #: ../tcosmonitor/extensions/info.py:321 ../ui/tcosmonitor-prefwindow.ui:928 msgid "Xorg info" msgstr "Informations à propos de Xorg" #: ../tcosmonitor/extensions/info.py:346 msgid "enabled" msgstr "activé" #: ../tcosmonitor/extensions/info.py:348 msgid "disabled" msgstr "désactivé" #: ../tcosmonitor/extensions/info.py:351 ../ui/tcospersonalize.ui:159 msgid "X Session Type" msgstr "Type de Session X" #: ../tcosmonitor/extensions/info.py:353 ../ui/tcospersonalize.ui:201 msgid "Xorg Driver" msgstr "Pilote pour Xorg" #: ../tcosmonitor/extensions/info.py:355 ../ui/tcospersonalize.ui:94 msgid "Xorg Resolution" msgstr "Résolution de Xorg" #: ../tcosmonitor/extensions/info.py:357 ../ui/tcospersonalize.ui:133 msgid "Xorg Color depth" msgstr "Profondeur de couleurs pour Xorg" #: ../tcosmonitor/extensions/info.py:359 ../ui/tcospersonalize.ui:179 msgid "DPMS energy monitor control" msgstr "Contrôle de l'énergie du moniteur par DPMS" #: ../tcosmonitor/extensions/info.py:361 msgid "Disable kill X with Ctrl+Alt+Backspace" msgstr "Désactiver l'arrêt de X par Ctrl + Alt + Retour arrière" #: ../tcosmonitor/extensions/info.py:363 ../ui/tcospersonalize.ui:57 msgid "Enable mouse wheel" msgstr "Activer la roulette de la souris" #: ../tcosmonitor/extensions/info.py:365 msgid "Refresh rate" msgstr "Taux de rafraîchissement" #: ../tcosmonitor/extensions/info.py:367 msgid "Xorg font server" msgstr "Serveur de polices pour Xorg" #: ../tcosmonitor/extensions/info.py:369 msgid "Mouse device" msgstr "Souris" #: ../tcosmonitor/extensions/info.py:371 msgid "Mouse protocol" msgstr "Protocole pour la souris" #: ../tcosmonitor/extensions/info.py:373 ../ui/tcospersonalize.ui:273 msgid "X Horiz sync" msgstr "Synchronisation horizontale pour X" #: ../tcosmonitor/extensions/info.py:375 ../ui/tcospersonalize.ui:284 msgid "X Vert sync" msgstr "Synchronisation verticale pour X" #: ../tcosmonitor/extensions/info.py:388 msgid "PulseAudio Sound server is running" msgstr "Le serveur de son PulseAudio est lancé" #: ../tcosmonitor/extensions/info.py:406 msgid "Remote Sound Mixer" msgstr "Mélangeur de son distant" #: ../tcosmonitor/extensions/info.py:479 msgid "PulseAudio Control" msgstr "Commande PulseAudio" #: ../tcosmonitor/extensions/info.py:484 msgid "PulseAudio Meter" msgstr "Vu-mètre PulseAudio" #: ../tcosmonitor/extensions/info.py:489 msgid "PulseAudio Manager" msgstr "Gestionnaire PulseAudio" #: ../tcosmonitor/extensions/info.py:493 msgid "PulseAudio utils: " msgstr "Utilitaires pour PulseAudio : " #: ../tcosmonitor/extensions/info.py:499 msgid "PulseAudio stats" msgstr "Statistiques pour PulseAudio" #: ../tcosmonitor/extensions/info.py:511 msgid "Currently in use" msgstr "Actuellement utilisé" #: ../tcosmonitor/extensions/info.py:512 msgid "Allocated during whole lifetime" msgstr "Alloué durant toute la durée de vie" #: ../tcosmonitor/extensions/info.py:513 msgid "Sample cache size" msgstr "Taille simple de cache" #: ../tcosmonitor/extensions/info.py:514 msgid "User name" msgstr "Nom d'utilisateur" #: ../tcosmonitor/extensions/info.py:515 msgid "Host Name" msgstr "Nom d'hôte" #: ../tcosmonitor/extensions/info.py:516 msgid "Server Name" msgstr "Nom du serveur" #: ../tcosmonitor/extensions/info.py:517 msgid "Server Version" msgstr "Version du serveur" #: ../tcosmonitor/extensions/info.py:518 msgid "Default Sample Specification" msgstr "Spécification de l'échantillon par défaut" #: ../tcosmonitor/extensions/info.py:519 msgid "Default Sink" msgstr "Sortie par défaut" #: ../tcosmonitor/extensions/info.py:520 msgid "Default Source" msgstr "Source par défaut" #: ../tcosmonitor/extensions/info.py:521 msgid "Cookie" msgstr "Cookie" #: ../tcosmonitor/extensions/info.py:527 msgid "Sound server is not running" msgstr "Le serveur de son n'est pas lancé" #: ../tcosmonitor/extensions/info.py:588 ../tcosmonitor/extensions/info.py:596 #: ../tcosmonitor/extensions/info.py:604 msgid "PulseAudio apps need /dev/shm." msgstr "L'application PulseAudio nécessite /dev/shm." #: ../tcosmonitor/extensions/restartxorg.py:48 #, python-format msgid "Restart X session of %s with new config?" msgstr "Redémarrer la session X de %s avec la nouvelle configuration ?" #: ../tcosmonitor/extensions/restartxorg.py:61 #, python-format msgid "%s is not supported to restart Xorg!" msgstr "%s ne gère pas le redémarrage Xorg !" #: ../tcosmonitor/extensions/restartxorg.py:75 msgid "No thin clients found." msgstr "Aucun client léger trouvé." #: ../tcosmonitor/extensions/restartxorg.py:78 #, python-format msgid "Do you want to restart X screens (only thin clients):%s?" msgstr "" "Voulez-vous redémarrer les écrans X (sur les clients légers seulement) : %s" #: ../tcosmonitor/extensions/wakeonlan.py:47 #: ../tcosmonitor/extensions/wakeonlan.py:73 msgid "" "Wake On Lan only works with static list.\n" "\n" "Enable scan method \"static\" in Preferences\n" "and (wake on lan) support in bios of clients." msgstr "" "le Réveil Par le Réseau ne fonctionne qu'avec une liste statique.\n" "\n" "Veuillez activer la méthode de scan « statique » dans Préférences\n" "et la gestion (réveil par le réseau) dans le BIOS des clients." #: ../tcosmonitor/extensions/wakeonlan.py:51 #, python-format msgid "Do you want boot %s client?" msgstr "Voulez-vous démarrer le client %s ?" #: ../tcosmonitor/extensions/wakeonlan.py:65 #: ../tcosmonitor/extensions/wakeonlan.py:90 #, python-format msgid "No register MAC address for ip: \"%s\"" msgstr "Aucune adresse MAC enregistrée pour l'adresse IP : « %s »" #: ../tcosmonitor/extensions/wakeonlan.py:69 #: ../tcosmonitor/extensions/wakeonlan.py:97 #, python-format msgid "Not valid MAC address: \"%s\"" msgstr "Adresse MAC non valide : « %s »" #: ../tcosmonitor/extensions/wakeonlan.py:77 msgid "Do you want boot all clients?" msgstr "Voulez-vous démarrer tous les clients ?" #: ../tcosmonitor/extensions/reboot.py:45 #, python-format msgid "Do you want to reboot: %s?" msgstr "Voulez-vous redémarrer : %s ?" #: ../tcosmonitor/extensions/reboot.py:48 #: ../tcosmonitor/extensions/reboot.py:58 #, python-format msgid "Pc will reboot in %s seconds" msgstr "Le PC redémarrera dans %s secondes" #: ../tcosmonitor/extensions/reboot.py:55 #, python-format msgid "Do you want to reboot the following clients: %s?" msgstr "Voulez-vous redémarrer les clients suivants : %s ?" #: ../tcosmonitor/extensions/reboot.py:64 #, python-format msgid "Do you want to poweroff: %s?" msgstr "Voulez-vous éteindre : %s ?" #: ../tcosmonitor/extensions/reboot.py:67 #: ../tcosmonitor/extensions/reboot.py:77 #, python-format msgid "Pc will shutdown in %s seconds" msgstr "Le PC va s'éteindre dans %s secondes" #: ../tcosmonitor/extensions/reboot.py:74 #, python-format msgid "Do you want to poweroff the following clients: %s?" msgstr "Voulez-vous éteindre les clients suivants : %s ?" #: ../tcosmonitor/extensions/reboot.py:105 #: ../tcosmonitor/extensions/sendfiles.py:104 #: ../tcosmonitor/extensions/sendfiles.py:185 #: ../tcosmonitor/extensions/sendfiles.py:265 #: ../tcosmonitor/extensions/videolan.py:191 #: ../tcosmonitor/extensions/videolan.py:386 #: ../tcosmonitor/extensions/videolan.py:628 #, python-format msgid "" "Error while exec remote app:\n" "Reason:%s" msgstr "" "Un erreur s'est produite lors de l'exécution de l'application distante :\n" "Raison : %s" #: ../tcosmonitor/extensions/audiortp.py:46 #: ../ui/tcosmonitor-mainwindow.ui:163 msgid "Send audio conference" msgstr "Envoyer la conférence audio" #: ../tcosmonitor/extensions/audiortp.py:47 #: ../ui/tcosmonitor-prefwindow.ui:1524 msgid "Audio chat conference" msgstr "Conférence audio en ligne" #: ../tcosmonitor/extensions/audiortp.py:48 #: ../ui/tcosmonitor-mainwindow.ui:275 msgid "Audio chat list" msgstr "Liste des discussions en ligne" #: ../tcosmonitor/extensions/audiortp.py:49 msgid "Send audio conference (from this host)" msgstr "Envoyer la conférence audio (depuis cet hôte)" #: ../tcosmonitor/extensions/audiortp.py:70 msgid "Emission" msgstr "Émission" #: ../tcosmonitor/extensions/audiortp.py:76 msgid "State" msgstr "État" #: ../tcosmonitor/extensions/audiortp.py:80 msgid "Channel" msgstr "Canal" #: ../tcosmonitor/extensions/audiortp.py:232 #: ../tcosmonitor/extensions/audiortp.py:319 #: ../tcosmonitor/extensions/audiortp.py:411 msgid "" "Your pulseaudio server is too old.\n" "Is required pulseaudio version >= 0.9.10" msgstr "" "Votre serveur pulseaudio est trop ancien.\n" "La version de pulseaudio nécessaire doit être >= 0.9.10" #: ../tcosmonitor/extensions/audiortp.py:235 #, python-format msgid "Do you want to start audio conference to the following users: %s?" msgstr "" "Voulez-vous démarrer la conférence audio pour les utilisateurs suivants : " "%s ?" #: ../tcosmonitor/extensions/audiortp.py:240 msgid "You have entered in audio conference" msgstr "Vous êtes entré en conférence audio" #: ../tcosmonitor/extensions/audiortp.py:264 msgid "Waiting for start audio conference..." msgstr "En attente du démarrage de la conférence audio…" #: ../tcosmonitor/extensions/audiortp.py:292 #: ../tcosmonitor/extensions/audiortp.py:388 #, python-format msgid "Running in audio conference with %s clients." msgstr "Conférence audio en cours avec %s clients." #: ../tcosmonitor/extensions/audiortp.py:302 #, python-format msgid "Running in audio conference from server. Conference Nº %s" msgstr "Conférence audio en cours depuis le serveur. Conférence nº %s" #: ../tcosmonitor/extensions/audiortp.py:313 msgid "Can't start conference mode, user is not logged" msgstr "" "Impossible de démarrer le mode conférence, l'utilisateur n'est pas connecté" #: ../tcosmonitor/extensions/audiortp.py:322 #, python-format msgid "Do you want audio conference from user %s?" msgstr "Voulez-vous démarrer une conférence audio avec l'utilisateur %s ?" #: ../tcosmonitor/extensions/audiortp.py:329 #, python-format msgid "You have entered in audio conference from user %s" msgstr "Vous avez rejoint la conférence audio avec l'utilisateur %s" #: ../tcosmonitor/extensions/audiortp.py:357 #, python-format msgid "Waiting for start audio conference from user %s..." msgstr "En attente du démarrage de la conférence audio avec l'utilisateur %s…" #: ../tcosmonitor/extensions/audiortp.py:398 #, python-format msgid "Running in audio conference from user %(host)s. Conference Nº %(count)s" msgstr "" "Conférence audio en cours avec l'utilisateur %(host)s. Conférence " "nº %(count)s" #: ../tcosmonitor/extensions/audiortp.py:414 #, python-format msgid "Do you want to start audio chat conference to the following users: %s?" msgstr "" "Voulez-vous démarrer la conférence audio en ligne avec les utilisateurs " "suivants : %s ?" #: ../tcosmonitor/extensions/audiortp.py:419 #, python-format msgid "You have entered in audio chat conference. Participants: %s" msgstr "Vous avez rejoint la conférence audio en ligne. Participants : %s" #: ../tcosmonitor/extensions/audiortp.py:441 msgid "Waiting for start audio chat conference..." msgstr "En attente du démarrage de la conférence audio en ligne…" #: ../tcosmonitor/extensions/audiortp.py:447 msgid "Do you want to connect to this audio chat conference now?" msgstr "" "Voulez-vous vous connecter à cette conférence audio en ligne maintenant ?" #: ../tcosmonitor/extensions/audiortp.py:481 #, python-format msgid "Running in audio chat conference with %s clients." msgstr "Conférence audio en ligne en cours avec %s clients." #: ../tcosmonitor/extensions/audiortp.py:493 #, python-format msgid "Running in audio chat conference. Conference Nº %s" msgstr "Conférence audio en ligne en cours. Conférence nº %s" #: ../tcosmonitor/extensions/audiortp.py:519 msgid "Conference mode off." msgstr "Mode conférence arrêté." #: ../tcosmonitor/extensions/audiortp.py:538 msgid "Audio chat conference off." msgstr "Conférence audio en ligne arrêté." #: ../tcosmonitor/extensions/appsmsg.py:61 msgid "Clients not connected" msgstr "Clients non connectés" #: ../tcosmonitor/extensions/appsmsg.py:84 #, python-format msgid "" "Exec app in user(s) screen(s)\n" "or open web address to:\n" "%s" msgstr "" "Exécuter une application sur le ou les écrans du ou des utilisateurs\n" "ou ouvrir une page Internet vers : \n" "%s" #: ../tcosmonitor/extensions/appsmsg.py:86 #, python-format msgid "" "Send a message to:\n" "%s" msgstr "" "Envoyer un message à :\n" "%s" #: ../tcosmonitor/extensions/appsmsg.py:119 #: ../tcosmonitor/extensions/appsmsg.py:160 msgid "Can't exec application, user is not logged" msgstr "Impossible d'exécuter l'application, l'utilisateur n'est pas connecté" #: ../tcosmonitor/extensions/appsmsg.py:138 #: ../tcosmonitor/extensions/appsmsg.py:149 #, python-format msgid "%s is not a valid application" msgstr "%s n'est pas une application valide" #: ../tcosmonitor/extensions/appsmsg.py:169 msgid "Can't send message, user is not logged" msgstr "Impossible d'envoyer un message, l'utilisateur n'est pas connecté" #: ../tcosmonitor/extensions/appsmsg.py:286 #: ../tcosmonitor/extensions/appsmsg.py:295 #, python-format msgid "%s is not application" msgstr "%s n'est pas une application" #: ../tcosmonitor/extensions/appsmsg.py:350 #, python-format msgid "" "Error while exec remote app:\n" "Reason: %s" msgstr "" "Une erreur s'est produite lors de l'exécution de l'application distante :\n" "Raison : %s" #: ../tcosmonitor/extensions/appsmsg.py:357 #, python-format msgid "" "Error while send message:\n" "Reason: %s" msgstr "" "Une erreur s'est produite lors de l'envoi du message : \n" "Raison : %s" #: ../tcosmonitor/extensions/livevnc.py:72 msgid "Live view of all hosts" msgstr "Vue en direct pour tous les hôtes" #: ../tcosmonitor/extensions/livevnc.py:193 msgid "Running in LiveView mode" msgstr "Mode Vue en Direct en cours" #: ../tcosmonitor/extensions/screenshot.py:63 #: ../tcosmonitor/extensions/screenshot.py:80 #, python-format msgid "Can't make screenshot, error: %s" msgstr "Impossible de réaliser la capture d'écran, erreur : %s" #: ../tcosmonitor/extensions/screenshot.py:72 msgid "Trying to order terminal to do a screenshot..." msgstr "Essai d'enjoindre la console de réaliser une capture d'écran…" #: ../tcosmonitor/extensions/screenshot.py:84 msgid "Get another screenshot" msgstr "Faire une autre capture d'écran" #: ../tcosmonitor/extensions/screenshot.py:101 #, python-format msgid "Screenshot of %s" msgstr "Capture d'écran de %s" #: ../tcosmonitor/extensions/screenshot.py:124 #, python-format msgid "Screenshot of %s, done." msgstr "Capture d'écran de %s, faite." #: ../tcosmonitor/extensions/screenshot.py:138 msgid "Save Screenshot" msgstr "Enregistrer la capture d'écran" #: ../tcosmonitor/extensions/screenshot.py:150 msgid "Select file to save screenshot..." msgstr "Veuillez sélectionner un fichier pour enregistrer la capture d'écran…" #: ../tcosmonitor/extensions/screenshot.py:154 #, python-format msgid "screenshot_of_%(hostname)s_date_%(date)s.png" msgstr "Capture d'écran_de_%(hostname)s_date_%(date)s.png" #: ../tcosmonitor/extensions/screenshot.py:158 msgid "Image Files ( *.png, *.jpg)" msgstr "Fichiers image (*.png, *.jpg)" #: ../tcosmonitor/extensions/screenshot.py:168 msgid "File must be png or jpg." msgstr "Les fichiers doivent avoir l'extension png ou jpg." #: ../tcosmonitor/extensions/screenshot.py:191 msgid "Screenshots of all hosts" msgstr "Captures d'écran de tous les hôtes" #: ../tcosmonitor/extensions/screenshot.py:209 #, python-format msgid "Screenshot of %s" msgstr "Capture d'écran de %s" #: ../tcosmonitor/extensions/italc.py:70 msgid "Can't start IVS, please add iTALC support" msgstr "Impossible de démarrer IVS, veuillez ajouter le support iTALC" #: ../tcosmonitor/extensions/lockscreen.py:46 #: ../tcosmonitor/extensions/lockscreen.py:54 msgid "" "Can't connect to tcosxmlrpc.\n" "Please verify user and password in prefences!" msgstr "" "Impossible de se connecter à tcosxmlrpc.\n" "Veuillez vérifier l'utilisateur et son mot de passe dans les préférences !" #: ../tcosmonitor/extensions/lockscreen.py:78 #, python-format msgid "Do you want to lock the following screens: %s?" msgstr "Voulez-vous verrouiller les écrans suivants : %s ?" #: ../tcosmonitor/extensions/lockscreen.py:87 #, python-format msgid "Do you want to unlock the following screens: %s?" msgstr "Voulez-vous déverrouiller les écrans suivants : %s ?" #: ../tcosmonitor/extensions/sendfiles.py:67 #: ../tcosmonitor/extensions/sendfiles.py:120 msgid "Can't send files, user is not logged" msgstr "Impossible d'envoyer les fichiers, l'utilisateur n'est pas connecté" #: ../tcosmonitor/extensions/sendfiles.py:71 #: ../tcosmonitor/extensions/sendfiles.py:142 #: ../tcosmonitor/extensions/sendfiles.py:222 msgid "TcosMonitor: FTP+TLS server is not running." msgstr "TcosMonitor : le serveur FTP+TLS n'est pas lancé." #: ../tcosmonitor/extensions/sendfiles.py:84 #: ../tcosmonitor/extensions/sendfiles.py:161 #: ../tcosmonitor/extensions/sendfiles.py:241 msgid "Waiting for send files..." msgstr "Attente de l'envoi des fichiers…" #: ../tcosmonitor/extensions/sendfiles.py:93 #: ../tcosmonitor/extensions/sendfiles.py:94 #: ../tcosmonitor/extensions/sendfiles.py:101 #: ../tcosmonitor/extensions/sendfiles.py:108 #: ../tcosmonitor/extensions/sendfiles.py:174 #: ../tcosmonitor/extensions/sendfiles.py:175 #: ../tcosmonitor/extensions/sendfiles.py:182 #: ../tcosmonitor/extensions/sendfiles.py:189 #: ../tcosmonitor/extensions/sendfiles.py:254 #: ../tcosmonitor/extensions/sendfiles.py:255 #: ../tcosmonitor/extensions/sendfiles.py:262 #: ../tcosmonitor/extensions/sendfiles.py:269 msgid "Teacher" msgstr "Professeur" #: ../tcosmonitor/extensions/sendfiles.py:94 #: ../tcosmonitor/extensions/sendfiles.py:108 #: ../tcosmonitor/extensions/sendfiles.py:175 #: ../tcosmonitor/extensions/sendfiles.py:189 #: ../tcosmonitor/extensions/sendfiles.py:255 #: ../tcosmonitor/extensions/sendfiles.py:269 #, python-format msgid "" "Teacher has sent some files to %(teacher)s folder:\n" "\n" "%(basenames)s" msgstr "" "Le professeur a envoyé des fichiers au répertoire %(teacher)s : \n" "\n" "%(basenames)s" #: ../tcosmonitor/extensions/sendfiles.py:105 #: ../tcosmonitor/extensions/sendfiles.py:186 #: ../tcosmonitor/extensions/sendfiles.py:266 msgid "Error creating destination folder." msgstr "" "Une erreur s'est produite lors de la création du répertoire de destination." #: ../tcosmonitor/extensions/sendfiles.py:110 #: ../tcosmonitor/extensions/sendfiles.py:190 #: ../tcosmonitor/extensions/sendfiles.py:271 msgid "Files sent." msgstr "Les fichiers ont été envoyés." #: ../tcosmonitor/extensions/sendfiles.py:125 #: ../tcosmonitor/extensions/sendfiles.py:205 msgid "Select file or files..." msgstr "Veuillez sélectionner le ou les fichiers…" #: ../tcosmonitor/extensions/sendfiles.py:163 #: ../tcosmonitor/extensions/sendfiles.py:243 msgid "Do you want open file(s) on client?" msgstr "Voulez-vous ouvrir le/les fichier(s) sur le client ?" #: ../tcosmonitor/extensions/dpms.py:76 #, python-format msgid "Do you want to switch off the following monitors: %s?" msgstr "Voulez-vous éteindre les moniteurs suivants : %s ?" #: ../tcosmonitor/extensions/dpms.py:85 #, python-format msgid "Do you want to switch on the following monitors: %s?" msgstr "Voulez-vous allumer les moniteurs suivants : %s ?" #: ../tcosmonitor/extensions/viewproc.py:45 msgid "Can't show runnings apps, user is not logged" msgstr "" "Impossible d'afficher les applications en cours, l'utilisateur n'est pas " "connecté" #: ../tcosmonitor/extensions/viewproc.py:55 msgid "User not connected, no processes." msgstr "Utilisateur non connecté, pas de processus." #: ../tcosmonitor/extensions/viewproc.py:73 #, python-format msgid "Running processes for user \"%s\": " msgstr "Processus en cours pour l'utilisateur « %s » :" #: ../tcosmonitor/extensions/viewproc.py:77 msgid "" "ALERT: There are some system process hidden. Enable it in Preferences dialog." msgstr "" "ALERTE : il y a des processus systèmes cachés. Veuillez l'activer dans le " "menu Préférences." #: ../tcosmonitor/extensions/viewproc.py:82 msgid "Pid" msgstr "PID" #: ../tcosmonitor/extensions/viewproc.py:83 msgid "Process command" msgstr "Commande de processus" #: ../tcosmonitor/extensions/viewproc.py:88 msgid "Kill this process" msgstr "Tuer ce processus" #: ../tcosmonitor/extensions/viewproc.py:125 msgid "Are you sure you want to stop this process?" msgstr "Êtes-vous sur de vouloir arrêter ce processus ?" #: ../tcosmonitor/extensions/viewproc.py:134 #, python-format msgid "" "Error while killing app:\n" "Reason: %s" msgstr "" "Erreur lors de l'arrêt de l'application : \n" "Raison : %s" #: ../tcosmonitor/extensions/videolan.py:45 #: ../tcosmonitor/extensions/videolan.py:46 msgid "Send Audio/Video broadcast" msgstr "Envoyer la diffusion Audio/Vidéo" #: ../tcosmonitor/extensions/videolan.py:62 #: ../tcosmonitor/extensions/videolan.py:216 msgid "Can't send video broadcast, user is not logged" msgstr "" "Impossible d'envoyer la diffusion vidéo, l'utilisateur n'est pas connecté" #: ../tcosmonitor/extensions/videolan.py:146 #: ../tcosmonitor/extensions/videolan.py:344 #: ../tcosmonitor/extensions/videolan.py:577 #, python-format msgid "" "Not allowed white spaces in \"%s\".\n" "Please rename it." msgstr "" "Les espaces blancs ne sont pas autorisés dans « %s ».\n" "Veuillez le renommer." #: ../tcosmonitor/extensions/videolan.py:156 #: ../tcosmonitor/extensions/videolan.py:356 #: ../tcosmonitor/extensions/videolan.py:593 msgid "Waiting for start video transmission..." msgstr "En attente du démarrage de la transmission vidéo…" #: ../tcosmonitor/extensions/videolan.py:196 #: ../tcosmonitor/extensions/videolan.py:390 #: ../tcosmonitor/extensions/videolan.py:633 msgid "Running in broadcast video transmission." msgstr "Transmission vidéo en cours" #: ../tcosmonitor/extensions/videolan.py:205 #: ../tcosmonitor/extensions/videolan.py:399 #, python-format msgid "" "Running in broadcast video transmission to user %(host)s. Broadcast Nº " "%(count)s" msgstr "" "Transmission vidéo en cours pour l'utilisateur %(host)s. Diffusion " "nº %(count)s" #: ../tcosmonitor/extensions/videolan.py:308 #: ../tcosmonitor/extensions/videolan.py:540 msgid "Select audio/video file.." msgstr "Sélectionner un fichier audio/vidéo" #: ../tcosmonitor/extensions/videolan.py:311 #: ../tcosmonitor/extensions/videolan.py:543 msgid "Play DVD" msgstr "Jouer le DVD" #: ../tcosmonitor/extensions/videolan.py:312 #: ../tcosmonitor/extensions/videolan.py:544 msgid "Play SVCD/VCD" msgstr "Jouer le SVCD/VCD" #: ../tcosmonitor/extensions/videolan.py:313 #: ../tcosmonitor/extensions/videolan.py:545 msgid "Play AudioCD" msgstr "Jouer le disque audio" #: ../tcosmonitor/extensions/videolan.py:358 #: ../tcosmonitor/extensions/videolan.py:595 msgid "" "First select the DVD chapter or play movie\n" "then press enter to send clients..." msgstr "" "Veuillez d'abord sélectionner le chapitre du DVD ou jouer le film\n" "puis appuyer sur entrée pour l'envoyer aux clients…" #: ../tcosmonitor/extensions/videolan.py:367 msgid "Lock keyboard and mouse on client?" msgstr "Verrouiller le clavier et la souris sur le client ?" #: ../tcosmonitor/extensions/videolan.py:443 msgid "Video broadcast stopped." msgstr "Diffusion vidéo arrêtée." #: ../tcosmonitor/extensions/videolan.py:604 msgid "Lock keyboard and mouse on clients?" msgstr "Verrouiller le clavier et la souris sur les clients ?" #: ../tcosmonitor/extensions/videolan.py:642 #, python-format msgid "Running in broadcast video transmission. Broadcast Nº %s" msgstr "Transmission vidéo en cours. Diffusion nº %s" #: ../tcosmonitor/extensions/remotessh.py:44 msgid "Enter password of remote thin client (if asked for it)" msgstr "" "Veuillez entrer le mot de passe du client léger distant (si on vous le " "demande)" #: ../tcosmonitor/extensions/logout.py:45 #: ../tcosmonitor/extensions/logout.py:68 msgid "User not logged" msgstr "Utilisateur non connecté" #: ../tcosmonitor/extensions/logout.py:48 #, python-format msgid "Do you want to logout user: %s?" msgstr "Voulez-vous déconnecter l'utilisateur : %s ?" #: ../tcosmonitor/extensions/logout.py:52 #: ../tcosmonitor/extensions/logout.py:74 #, python-format msgid "Session will close in %s seconds" msgstr "La session sera fermée dans %s secondes" #: ../tcosmonitor/extensions/logout.py:70 #, python-format msgid "Do you want to logout the following users: %s?" msgstr "Voulez-vous déconnecter les utilisateurs suivants : %s ?" #: ../tcosmonitor/extensions/tcosnetcontroller.py:47 #: ../tcosmonitor/extensions/tcosnetcontroller.py:106 msgid "Internet connection has been disabled" msgstr "La connexion Internet a été désactivée" #: ../tcosmonitor/extensions/tcosnetcontroller.py:51 msgid "Can't disable internet, user is not logged" msgstr "" "Impossible de désactiver la connexion Internet, l'utilisateur n'est pas " "connecté" #: ../tcosmonitor/extensions/tcosnetcontroller.py:56 #: ../tcosmonitor/extensions/tcosnetcontroller.py:82 #: ../tcosmonitor/extensions/tcosnetcontroller.py:100 #: ../tcosmonitor/extensions/tcosnetcontroller.py:144 #, python-format msgid "" "In order to lock and unlock internet you need to be in 'tcos' group.\n" "\n" "Exe by root: adduser %s tcos" msgstr "" "Afin de déverrouiller la connexion Internet vous devez faire partie du " "groupe « tcos ».\n" "\n" "Exécutez par le superutilisateur : adduser %s tcos" #: ../tcosmonitor/extensions/tcosnetcontroller.py:74 #: ../tcosmonitor/extensions/tcosnetcontroller.py:148 msgid "Internet connection has been enabled" msgstr "La connexion Internet a été activée" #: ../tcosmonitor/extensions/tcosnetcontroller.py:78 msgid "Can't enable internet, user is not logged" msgstr "" "Impossible d'activer la connexion Internet, l'utilisateur n'est pas connecté" #: ../tcosmonitor/extensions/tcosnetcontroller.py:113 #, python-format msgid "Do you want disable internet to following users: %s?" msgstr "" "Voulez-vous désactiver la connexion Internet pour les utilisateurs " "suivants : %s ?" #: ../tcosmonitor/extensions/tcosnetcontroller.py:155 #, python-format msgid "Do you want enable internet to following users: %s?" msgstr "" "Voulez-vous activer la connexion Internet pour les utilisateurs suivants : " "%s ?" #: ../tcosmonitor/extensions/tcospersonalize.py:51 #, python-format msgid "%s is not supported to personalize!" msgstr "%s ne gère pas la personnalisation !" #: ../tcosmonitor/TcosMenus.py:97 ../tcosmonitor/TcosMenus.py:109 #, python-format msgid "Actions for %s" msgstr "Actions pour %s" #: ../tcosmonitor/TcosMenus.py:102 msgid "Actions for selected host" msgstr "Actions pour l'hôte sélectionné" #: ../tcosmonitor/TcosMenus.py:163 ../tcosmonitor/TcosMenus.py:232 #, python-format msgid "%d hidden actions" msgstr "%d actions cachées" #: ../tcosmonitor/TcosMenus.py:176 ../tcosmonitor/TcosMenus.py:178 msgid "Actions for selected hosts" msgstr "Actions pour les hôtes sélectionnés" #: ../tcosmonitor/TcosMenus.py:180 msgid "Actions for all hosts" msgstr "Actions pour tous les hôtes" #: ../tcosmonitor/TcosMenus.py:237 msgid "Save hosts positions" msgstr "Enregistrer la position des hôtes" #: ../tcosmonitor/TcosMenus.py:245 msgid "Reset hosts positions" msgstr "Réinitialiser la position des hôtes" #: ../tcosmonitor/TcosDBus.py:82 msgid "TcosDBus not allowed in local display" msgstr "TcosDBus n'est pas autorisé sur l'affichage local" #: ../tcosmonitor/TcosDBus.py:110 #, python-format msgid "Seems that tcosxmlrpc isn't running on host=\"%s\"" msgstr "Il semble que tcosxmlrpc n'est pas lancé sur l'hôte =« %s »" #: ../tcosmonitor/TcosDBus.py:131 msgid "tcosxmlrpc ERROR conection unavalaible." msgstr "ERREUR tcosxmlrpc, la connexion n'est pas disponible." #: ../tcosmonitor/TcosDBus.py:147 msgid "ERROR conecting to tcosxmlrpc, check username and password." msgstr "" "ERREUR durant la connexion à tcosxmlrpc, veuillez vérifier le nom " "d'utilisateur et le mot de passe." #: ../tcosmonitor/TcosDBus.py:293 msgid "Message from admin" msgstr "Message de la part de l'administrateur" #: ../tcosmonitor/TcosDBus.py:382 ../tcosmonitor/TcosDBus.py:398 #: ../tcosmonitor/TcosDBus.py:414 ../tcosmonitor/TcosDBus.py:432 #: ../tcosmonitor/TcosDBus.py:450 msgid "User not allowed to run this dbus call." msgstr "L'utilisateur n'est pas autorisé à exécuter cet appel à dbus." #: ../tcosmonitor/TcosPreferences.py:264 msgid "" "You have select more than 5 button menus.\n" "Only allowed to select a maximum of 5 buttons." msgstr "" "Vous avez sélectionné plus de 5 boutons de menu.\n" "Il n'est permis d'en sélectionner qu'au plus 5." #: ../tcosmonitor/TcosPreferences.py:275 msgid "New settings saved." msgstr "Nouveaux réglages enregistrés." #: ../tcosmonitor/TcosStaticHosts.py:148 ../tcosmonitor/TcosListView.py:66 msgid "IP address" msgstr "Adresse IP" #: ../tcosmonitor/TcosStaticHosts.py:154 #: ../ui/tcosmonitor-staticwindownew.ui:68 msgid "MAC address" msgstr "Adresse MAC" #: ../tcosmonitor/TcosStaticHosts.py:264 msgid "No hosts found, please click on Refresh button using another method." msgstr "" "Aucun hôte n'a pu être trouvé, veuillez appuyer sur le bouton Rafraîchir en " "utilisant une autre méthode." #: ../tcosmonitor/TcosXmlRpc.py:75 msgid "" "Username or password are empty,\n" "please edit in preferences dialog!" msgstr "" "Le nom d'utilisateur et le mot de passe sont vides, \n" "veuillez les modifier dans le menu préférences !" #: ../tcosmonitor/TcosListView.py:78 msgid "Active" msgstr "Actif" #: ../tcosmonitor/TcosListView.py:88 msgid "Screen Blocked" msgstr "Écran bloqué" #: ../tcosmonitor/TcosListView.py:93 msgid "Num of process" msgstr "Numéro de processus" #: ../tcosmonitor/TcosListView.py:108 msgid "Sel" msgstr "Sélection" #: ../tcosmonitor/TcosListView.py:144 #, python-format msgid "Error connecting to tcosxmlrpc in %s" msgstr "Une erreur s'est produite lors la connexion à tcosxmlrpc dans %s" #: ../tcosmonitor/TcosTrayIcon2.py:150 #, python-format msgid "Floppy: %s" msgstr "Lecteur de disquette : %s" #: ../tcosmonitor/TcosTrayIcon2.py:152 #, python-format msgid "CDROM: %s" msgstr "CD : %s" #: ../tcosmonitor/TcosTrayIcon2.py:154 #, python-format msgid "USB: %s" msgstr "USB : %s" #: ../tcosmonitor/TcosTrayIcon2.py:156 #, python-format msgid "HDD partition: %s" msgstr "Partition HDD : %s" #: ../tcosmonitor/TcosTrayIcon2.py:158 #, python-format msgid "Unknow: %s" msgstr "Inconnu : %s" #: ../tcosmonitor/TcosActions.py:92 ../tcosmonitor/TcosActions.py:184 msgid "Searching for connected hosts..." msgstr "Recherche des hôtes connectés…" #: ../tcosmonitor/TcosActions.py:258 msgid "Searching info of hosts..." msgstr "Recherche des informations sur les hôtes…" #: ../tcosmonitor/TcosActions.py:297 #, python-format msgid "Connecting to %s..." msgstr "Connexion en cours à %s…" #: ../tcosmonitor/TcosActions.py:331 #, python-format msgid "Found %(len)d hosts, %(ex)d hosts excluded" msgstr "%(len)d hôtes ont été trouvés, %(ex)d hôtes ont été exclus" #: ../tcos-devices-ng.py:185 #, python-format msgid "Rebooting in %s seconds" msgstr "Redémarrage dans %s secondes" #: ../tcos-devices-ng.py:187 #, python-format msgid "Shutting down in %s seconds" msgstr "Extinction dans %s secondes" #: ../tcos-devices-ng.py:203 ../tcos-devices-ng.py:206 #, python-format msgid "" "ERROR during action %(action)s:\n" "%(errortxt)s" msgstr "" "ERREUR durant l'action %(action)s :\n" "%(errortxt)s" #: ../tcos-devices-ng.py:236 msgid "Tcos device daemon" msgstr "Démon pour la machine Tcos" #: ../tcos-devices-ng.py:271 msgid "" "TCOS_DEVICES: Your user is not in group fuse and you can not use USB " "devices. Please contact with your administrator." msgstr "" "TCOS_DEVICES : votre identifiant n'est pas dans le groupe fuse et vous ne " "pouvez pas utiliser d'appareil USB. Veuillez contacter votre administrateur." #: ../tcos-devices-ng.py:315 #, python-format msgid "Cdrom device %s" msgstr "Lecteur de CD %s" #: ../tcos-devices-ng.py:318 msgid "Mount Cdrom" msgstr "Monter le lecteur de CD" #: ../tcos-devices-ng.py:319 msgid "Umount Cdrom" msgstr "Démonter le lecteur de CD" #: ../tcos-devices-ng.py:341 #, python-format msgid "Disk partition %s" msgstr "Partition du disque %s" #: ../tcos-devices-ng.py:344 msgid "Mount disk partition" msgstr "Monter la partition du disque" #: ../tcos-devices-ng.py:345 msgid "Umount disk partition" msgstr "Démonter la partition du disque" #: ../tcos-devices-ng.py:357 msgid "No floppy detected" msgstr "Aucun lecteur de disquette détecté" #: ../tcos-devices-ng.py:369 ../tcos-devices-ng.py:686 #: ../tcos-devices-ng.py:692 ../tcos-devices-ng.py:698 msgid "Floppy" msgstr "Lecteur de disquette" #: ../tcos-devices-ng.py:372 msgid "Mount Floppy" msgstr "Monter le lecteur de disquette" #: ../tcos-devices-ng.py:373 msgid "Umount Floppy" msgstr "Démonter le lecteur de disquette" #: ../tcos-devices-ng.py:383 msgid "Floppy mounted. Ready for use." msgstr "Le lecteur de disquette est monté et prêt à être utilisé." #: ../tcos-devices-ng.py:385 msgid "Floppy umounted. You can extract it." msgstr "Le lecteur de disquette est démonté. Vous pouvez la retirer." #: ../tcos-devices-ng.py:401 msgid "Hard disk partition mounted. Ready for use." msgstr "La partition du disque dur est montée et prête à être utilisée." #: ../tcos-devices-ng.py:404 msgid "Hard disk partition umounted." msgstr "La partition du disque dur est démontée." #: ../tcos-devices-ng.py:426 msgid "Audio cdrom mounted., you can listen music opening wav files." msgstr "" "Le CD audio est monté, vous pouvez écouter de la musique en ouvrant des " "fichiers WAV." #: ../tcos-devices-ng.py:428 msgid "Cdrom mounted. Ready for use." msgstr "Le lecteur de CD est monté et prêt à être utilisé." #: ../tcos-devices-ng.py:431 msgid "Cdrom umounted. You can extract it." msgstr "Le lecteur de CD est démonté. Vous pouvez le retirer." #: ../tcos-devices-ng.py:541 #, python-format msgid "" "Mounting device %s\n" "Please wait..." msgstr "" "Montage en cours du périphérique %s\n" "Veuillez patienter…" #: ../tcos-devices-ng.py:590 msgid "Error mounting LTSPFS, check versions of LTSPFS packages" msgstr "" "Une erreur s'est produite lors du montage de LTSPFS, veuillez vérifier la " "version des paquets LTSPFS" #: ../tcos-devices-ng.py:616 #, python-format msgid "" "Umounting device %s.\n" "Please wait..." msgstr "" "Montage en cours du périphérique %s.\n" "Veuillez patienter…" #: ../tcos-devices-ng.py:663 msgid "usbdisk" msgstr "disque USB" #: ../tcos-devices-ng.py:665 msgid "firewiredisk" msgstr "disque firewire" #: ../tcos-devices-ng.py:690 msgid "Can't mount floppy" msgstr "Impossible de monter le lecteur de disquette" #: ../tcos-devices-ng.py:701 msgid "Can't umount floppy" msgstr "Impossible de démonter le lecteur de disquette" #: ../tcos-devices-ng.py:714 ../tcos-devices-ng.py:724 #: ../tcos-devices-ng.py:735 ../tcos-devices-ng.py:850 #: ../tcos-devices-ng.py:862 ../tcos-devices-ng.py:881 #: ../tcos-devices-ng.py:893 ../tcos-devices-ng.py:925 #, python-format msgid "Cdrom_%s" msgstr "Cdrom_%s" #: ../tcos-devices-ng.py:722 msgid "Can't mount cdrom" msgstr "Impossible de monter le lecteur de CD" #: ../tcos-devices-ng.py:738 msgid "Can't umount cdrom" msgstr "Impossible de démonter le lecteur de CD" #: ../tcos-devices-ng.py:756 ../tcos-devices-ng.py:766 #: ../tcos-devices-ng.py:777 #, python-format msgid "Disk_%s" msgstr "Disque_%s" #: ../tcos-devices-ng.py:764 msgid "Can't mount hard disk partition" msgstr "Impossible de monter la partition du disque dur" #: ../tcos-devices-ng.py:780 msgid "Can't umount hard disk partition" msgstr "Impossible de démonter la partition du disque dur" #: ../tcos-devices-ng.py:821 #, python-format msgid "" "From terminal %(host)s.\n" "Connected CDROM USB device %(device)s\n" "%(vendor)s %(model)s" msgstr "" "Depuis la console %(host)s.\n" "Lecteur de CD USB %(device)s connecté\n" "%(vendor)s %(model)s" #: ../tcos-devices-ng.py:825 #, python-format msgid "CDROM USB device %s" msgstr "Lecteur de CD USB %s" #: ../tcos-devices-ng.py:828 #, python-format msgid "Mount CDROM USB device %s" msgstr "Monter le lecteur de CD USB %s" #: ../tcos-devices-ng.py:829 #, python-format msgid "Umount CDROM USB device %s" msgstr "Démonter le lecteur de CD USB %s" #: ../tcos-devices-ng.py:854 ../tcos-devices-ng.py:885 #: ../tcos-devices-ng.py:1015 ../tcos-devices-ng.py:1026 #: ../tcos-devices-ng.py:1072 ../tcos-devices-ng.py:1152 #: ../tcos-devices-ng.py:1163 ../tcos-devices-ng.py:1209 #, python-format msgid "Error, can't mount device %s" msgstr "Erreur, impossible de monter le lecteur %s" #: ../tcos-devices-ng.py:912 #, python-format msgid "" "From terminal %(host)s.\n" "Disconnected CDROM USB device %(device)s\n" "%(vendor)s %(model)s" msgstr "" "Depuis la console %(host)s.\n" "Lecteur de CD USB %(device)s déconnecté\n" "%(vendor)s %(model)s" #: ../tcos-devices-ng.py:940 #, python-format msgid "Can't umount cdrom usb %s" msgstr "Impossible de démonter le lecteur de CD USB %s" #: ../tcos-devices-ng.py:965 #, python-format msgid "" "From terminal %(host)s.\n" "Connected USB device %(device)s\n" "%(vendor)s %(model)s" msgstr "" "Depuis la console %(host)s.\n" "Périphérique USB %(device)s connecté\n" "%(vendor)s %(model)s" #: ../tcos-devices-ng.py:968 #, python-format msgid "" "From terminal %(host)s.\n" "Disconnected USB device %(device)s\n" "%(vendor)s %(model)s" msgstr "" "Depuis la console %(host)s.\n" "Périphérique USB %(device)s déconnecté\n" "%(vendor)s %(model)s" #: ../tcos-devices-ng.py:996 #, python-format msgid "USB device %s" msgstr "Périphérique USB %s" #: ../tcos-devices-ng.py:999 #, python-format msgid "Mount USB device %s" msgstr "Monter le périphérique USB %s" #: ../tcos-devices-ng.py:1000 #, python-format msgid "Umount USB device %s" msgstr "Démonter le périphérique USB %s" #: ../tcos-devices-ng.py:1102 #, python-format msgid "" "From terminal %(host)s.\n" "Connected Firewire device %(device)s\n" "%(vendor)s %(model)s" msgstr "" "Depuis la console %(host)s.\n" "Périphérique Firewire %(device)s connecté\n" "%(vendor)s %(model)s" #: ../tcos-devices-ng.py:1105 #, python-format msgid "" "From terminal %(host)s.\n" "Disconnected Firewire device %(device)s\n" "%(vendor)s %(model)s" msgstr "" "Depuis la console %(host)s.\n" "Périphérique Firewire %(device)s déconnecté\n" "%(vendor)s %(model)s" #: ../tcos-devices-ng.py:1133 #, python-format msgid "Firewire device %s" msgstr "Périphérique Firewire %s" #: ../tcos-devices-ng.py:1136 #, python-format msgid "Mount Firewire device %s" msgstr "Monter le périphérique Firewire %s" #: ../tcos-devices-ng.py:1137 #, python-format msgid "Umount Firewire device %s" msgstr "Démonter le périphérique Firewire %s" #: ../tcos-devices-ng.py:1220 #, python-format msgid "CDROM USB device %s umounted. You can extract it." msgstr "Le lecteur de CD USB %s est démonté. Vous pouvez le retirer." #: ../tcos-devices-ng.py:1223 #, python-format msgid "CDROM USB device %s mounted. Ready for use." msgstr "Le lecteur de CD USB %s est monté et prêt à être utilisé." #: ../tcos-devices-ng.py:1261 #, python-format msgid "USB device %s umounted. You can extract it." msgstr "Le lecteur USB %s est démonté. Vous pouvez le retirer." #: ../tcos-devices-ng.py:1264 #, python-format msgid "USB device %s mounted. Ready for use." msgstr "Le lecteur USB %s est monté et prêt à être utilisé." #: ../tcos-devices-ng.py:1300 #, python-format msgid "Firewire device %s umounted. You can extract it." msgstr "Le lecteur Firewire %s est démonté. Vous pouvez le retirer." #: ../tcos-devices-ng.py:1303 #, python-format msgid "Firewire device %s mounted. Ready for use." msgstr "Le lecteur Firewire %s est monté et prêt à être utilisé." #: ../tcosmonitor.py:164 #, python-format msgid "" "The user \"%s\" must be member of the group \"tcos\" to exec tcosmonitor.\n" "\n" "If you are system administrator, add your user to tcos group." msgstr "" "L'utilisateur « %s » doit faire partie du groupe « tcos » pour exécuter " "tcosmonitor.\n" "\n" "Si vous êtes administrateur du système, veuillez ajouter votre utilisateur " "au groupe tcos." #: ../tcospersonalize.py:113 msgid "" "Need a host to configure!!!\n" "Try exec:\n" " tcospersonalize --host=XXX.XXX.XXX.XXX" msgstr "" "Un hôte doit exister pour être configuré !!!\n" "Veuillez essayer d'exécuter :\n" " tcospersonalize --host=XXX.XXX.XXX.XXX" #: ../tcospersonalize.py:185 msgid "host: " msgstr "hôte :" #: ../tcospersonalize.py:448 msgid "Host down, can't connect to tcosxmlrpc." msgstr "L'hôte est hors-ligne, impossible de se connecter à tcosxmlrpc." #: ../tcospersonalize.py:456 #, python-format msgid "New %d drivers loaded from terminal." msgstr "Les nouveaux pilotes %d ont été chargés depuis la console." #: ../tcospersonalize.py:515 #, python-format msgid "Really delete config of %s?" msgstr "Êtes-vous sûr de vouloir effacer la configuration de %s ?" #: ../tcospersonalize.py:518 msgid "Deleted!" msgstr "Effacé !" #: ../ui/tcosmonitor-staticwindownew.ui:8 msgid "New or edit hosts" msgstr "Nouveau ou hôte à modifier" #: ../ui/tcosmonitor-staticwindownew.ui:32 msgid "" "You can add a simple host, \n" " example: 192.168.0.100\n" "\n" "or range of hosts, \n" " example: 192.168.0.100-120\n" "\n" "MAC address is optional" msgstr "" "Vous pouvez ajouter un hôte simple, \n" " exemple : 192.168.0.100\n" "\n" "ou un intervalle d'hôtes, \n" " exemple : 192.168.0.100-120\n" "\n" "L'adresse MAC est optionnelle" #: ../ui/tcosmonitor-staticwindownew.ui:57 msgid "IP address *" msgstr "Adresse IP *" #: ../ui/tcosmonitor-staticwindownew.ui:150 #: ../ui/tcosmonitor-mainwindow.ui:771 ../ui/tcosmonitor-staticwindow.ui:292 msgid "Cancel" msgstr "Annuler" #: ../ui/tcosmonitor-staticwindownew.ui:198 #: ../ui/tcosmonitor-staticwindow.ui:340 msgid "Save" msgstr "Enregistrer" #: ../ui/tcos-volume-manager.ui:39 msgid "Restart sound" msgstr "Redémarrer le son" #: ../ui/tcos-volume-manager.ui:54 msgid "Sound levels" msgstr "Niveaux sonores" #: ../ui/tcos-volume-manager.ui:90 msgid "Main Channels" msgstr "Principaux canaux" #: ../ui/tcos-volume-manager.ui:113 msgid "Secondary Channels" msgstr "Canaux secondaires" #: ../ui/tray.ui:20 msgid "TCOS devices" msgstr "Machines TCOS" #: ../ui/tray.ui:57 msgid "Hide" msgstr "Cacher" #: ../ui/tcosmonitor-abouttcos.ui:6 msgid "About TCOS" msgstr "À propos de TCOS" #: ../ui/tcosmonitor-abouttcos.ui:19 msgid "TcosMonitor" msgstr "TcosMonitor" #: ../ui/tcosmonitor-abouttcos.ui:62 msgid "Version:" msgstr "Version :" #: ../ui/tcosmonitor-abouttcos.ui:90 msgid "" "Thin client and standalone\n" "monitoring tool." msgstr "" "Client léger et autonome\n" "outil de supervision." #: ../ui/tcosmonitor-abouttcos.ui:131 msgid "Project web site" msgstr "Site Internet du projet" #: ../ui/tcosmonitor-abouttcos.ui:178 msgid "About" msgstr "À propos" #: ../ui/tcosmonitor-abouttcos.ui:212 msgid "License" msgstr "Licence" #: ../ui/tcosmonitor-abouttcos.ui:230 msgid "" "Main developers:\n" " * Mario Izquierdo \n" " * Ignacio Vidal \n" "\n" "Contributors:\n" " * Andrés Jimenez\n" " * Quirón\n" "\n" "Special thanks to:\n" " Comunidad de Madrid, MaX group (Spain)" msgstr "" "Principaux développeurs : \n" " * Mario Izquierdo \n" " * Ignacio Vidal \n" "\n" "Contributeurs :\n" " * Andrés Jimenez\n" " * Quirón\n" "\n" "Remerciements à : \n" " Comunidad de Madrid, MaX group (Espagne)" #: ../ui/tcosmonitor-abouttcos.ui:259 msgid "Authors" msgstr "Auteurs" #: ../ui/tcosmonitor-abouttcos.ui:275 msgid "Translated to your language by:" msgstr "Traduit dans votre langue par  : " #. put your name and mail #: ../ui/tcosmonitor-abouttcos.ui:287 msgid "Mario Izquierdo " msgstr "" "Julien Patriarca \n" "\n" "Remerciements à :\n" "L'équipe francophone de traduction Debian " #: ../ui/tcosmonitor-abouttcos.ui:307 msgid "Translators" msgstr "Traducteurs" #: ../ui/tcosmonitor-abouttcos.ui:324 msgid "" "TCOS is a free software project that need a lot of work to be the best thin " "client plataform.\n" "\n" "We work every day a lot of hours to make changes and support more devices " "and features.\n" "\n" "We want to continue developing this software but need your help, if you use, " "sell or hack TCOS pehaps you could donate some money to project.\n" "\n" "Click on next url to get some info." msgstr "" "TCOS est un logiciel libre qui nécessite un gros travail pour être la " "meilleure plate-forme pour client léger.\n" "\n" "Nous travaillons chaque jour durant de longues heures pour faire des " "changements et gérer plus de machines et de fonctionnalités.\n" "\n" "Nous voulons continuer à développer ce logiciel mais avons besoin de votre " "aide, si vous utilisez, vendez ou modifiez TCOS, peut-être pourriez faire un " "don au projet.\n" "\n" "Veuillez cliquer sur l'adresse suivante pour obtenir des informations." #. see wiki if translation is avalaible, ex in spanish: TcosProject:Site_support/es #: ../ui/tcosmonitor-abouttcos.ui:370 msgid "http://wiki.tcosproject.org/TcosProject:Site_support" msgstr "http://wiki.tcosproject.org/TcosProject:Site_support" #: ../ui/tcosmonitor-abouttcos.ui:392 msgid "Don't show donations message on start." msgstr "Ne pas afficher les message concernant les dons au démarrage." #: ../ui/tcosmonitor-abouttcos.ui:415 msgid "Donate" msgstr "Donner" #: ../ui/tcosmonitor-mainwindow.ui:8 msgid "TcosMonitor" msgstr "TcosMonitor" #: ../ui/tcosmonitor-mainwindow.ui:22 msgid "Exit TcosMonitor" msgstr "Sortir de TcosMonitor" #: ../ui/tcosmonitor-mainwindow.ui:35 msgid "Open preferences dialog" msgstr "Ouvrir la boîte de dialogue des préférences" #: ../ui/tcosmonitor-mainwindow.ui:36 ../ui/tcospersonalize.ui:7 #: ../ui/tcosmonitor-prefwindow.ui:35 msgid "Preferences" msgstr "Préférences" #: ../ui/tcosmonitor-mainwindow.ui:48 msgid "Update host list" msgstr "Mettre à jour la liste des hôtes" #: ../ui/tcosmonitor-mainwindow.ui:49 msgid "Refresh" msgstr "Rafraîchir" #: ../ui/tcosmonitor-mainwindow.ui:71 msgid "All Hosts" msgstr "Tous les hôtes" #: ../ui/tcosmonitor-mainwindow.ui:99 msgid "Find" msgstr "Trouver" #: ../ui/tcosmonitor-mainwindow.ui:111 msgid "About this app" msgstr "À propos de cette application" #: ../ui/tcosmonitor-mainwindow.ui:219 msgid "Start audio chat" msgstr "Démarrer le dialogue en ligne audio" #: ../ui/tcosmonitor-mainwindow.ui:331 msgid "Send audio/video" msgstr "Envoyer l'audio ou la vidéo" #: ../ui/tcosmonitor-mainwindow.ui:443 msgid "Exe app" msgstr "Exécuter l'application" #: ../ui/tcosmonitor-mainwindow.ui:499 msgid "Send message" msgstr "Envoyer un message" #: ../ui/tcosmonitor-mainwindow.ui:581 msgid "List view" msgstr "Vue en liste" #: ../ui/tcosmonitor-mainwindow.ui:629 msgid "Icon view" msgstr "Vue par icônes" #: ../ui/tcosmonitor-mainwindow.ui:689 msgid "Simulate my classroom" msgstr "Simuler ma salle de classe" #: ../ui/tcosmonitor-staticwindow.ui:8 msgid "Static hosts list" msgstr "Liste des hôtes statiques" #: ../ui/tcosmonitor-staticwindow.ui:17 msgid "Static Hosts list" msgstr "Liste des hôtes statiques" #: ../ui/tcosmonitor-staticwindow.ui:80 msgid "Add" msgstr "Ajouter" #: ../ui/tcosmonitor-staticwindow.ui:128 msgid "Modify" msgstr "Modifier" #: ../ui/tcosmonitor-staticwindow.ui:176 msgid "Delete" msgstr "Effacer" #: ../ui/tcosmonitor-staticwindow.ui:225 msgid "Get from connected" msgstr "Obtenir depuis les connectés" #: ../ui/tcospersonalize.ui:34 msgid "unknow host" msgstr "hôte inconnu" #: ../ui/tcospersonalize.ui:74 msgid "Disable Ctrl + Alt + Backspace (for kill Xorg)" msgstr "Désactiver Ctrl+Alt+Retour-arrière (pour arrêter Xorg)" #: ../ui/tcospersonalize.ui:211 msgid "Get avalaible drivers" msgstr "Obtenir les pilotes disponibles" #: ../ui/tcospersonalize.ui:248 msgid "Display Settings" msgstr "Réglages d'affichage" #: ../ui/tcospersonalize.ui:333 ../ui/tcosmonitor-prefwindow.ui:670 msgid "Advanced" msgstr "Avancé" #: ../ui/tcospersonalize.ui:351 msgid "Default boot kernel" msgstr "Noyau de démarrage par défaut" #: ../ui/tcospersonalize.ui:376 msgid "PXE Boot options" msgstr "Options de Boot PXE" #: ../ui/tcospersonalize.ui:391 msgid "Default boot method" msgstr "Méthode de démarrage par défaut" #: ../ui/tcospersonalize.ui:419 msgid "Command line" msgstr "Ligne de commande" #: ../ui/tcospersonalize.ui:507 msgid "Boot options" msgstr "Options de démarrage" #: ../ui/tcospersonalize.ui:551 msgid "Delete Config" msgstr "Effacer la configuration" #: ../ui/tcosmonitor-askwindow.ui:8 msgid "Question" msgstr "Question" #: ../ui/tcosmonitor-askwindow.ui:50 msgid "You can drag and drop launcher file to this box" msgstr "Vous pouvez glisser déposer le fichier de lancement dans cette boîte" #: ../ui/tcosmonitor-askwindow.ui:61 msgid "Run app in unknow host" msgstr "Exécuter l'application sur l'hôte inconnu" #: ../ui/tcosmonitor-prefwindow.ui:62 msgid "Show host list on startup" msgstr "Afficher la liste des hôtes au démarrage" #: ../ui/tcosmonitor-prefwindow.ui:80 msgid "Scan network method" msgstr "Méthode de balayage du réseau" #: ../ui/tcosmonitor-prefwindow.ui:91 msgid "" "Network interface\n" "(thin client)" msgstr "" "Interface réseau\n" "(client léger)" #: ../ui/tcosmonitor-prefwindow.ui:127 msgid "Show system process" msgstr "Afficher les processus du système" #: ../ui/tcosmonitor-prefwindow.ui:144 msgid "Don't do actions when running TcosMonitor in thin client" msgstr "" "Ne pas effectuer les actions lors du l'exécution de TcosMonitor sur un " "client léger" #: ../ui/tcosmonitor-prefwindow.ui:163 msgid "List of hosts" msgstr "Liste des hôtes" #: ../ui/tcosmonitor-prefwindow.ui:200 msgid "Open static host list" msgstr "Ouvrir la liste des hôtes statiques" #: ../ui/tcosmonitor-prefwindow.ui:225 msgid "Only show hosts running tcosxmlrpc (8998 port)" msgstr "N'afficher que les hôtes exécutant tcosxmlrpc (port 8998)" #: ../ui/tcosmonitor-prefwindow.ui:242 msgid "Only do all actions on selected hosts (requires restart TcosMonitor)" msgstr "" "Ne lancer que l'ensemble des actions sur les hôtes sélectionnés (nécessite " "le redémarrage de TcosMonitor)" #: ../ui/tcosmonitor-prefwindow.ui:259 msgid "Enable SSL connections to XMLRPC clients" msgstr "Activer les connexions SSL vers les clients XMLRPC" #: ../ui/tcosmonitor-prefwindow.ui:278 msgid "Host list mode" msgstr "Mode liste d'hôte" #: ../ui/tcosmonitor-prefwindow.ui:302 msgid "Show right menu with groups (NEW)" msgstr "Afficher les groupes dans le menu de droite (nouveau)" #: ../ui/tcosmonitor-prefwindow.ui:319 msgid "Don't show thin client if TcosMonitor is running there" msgstr "" "Ne pas afficher le client léger si TcosMonitor y est en cours d'exécution" #: ../ui/tcosmonitor-prefwindow.ui:336 msgid "Enable ConsoleKit to search users and times (experimental)" msgstr "" "Activez ConsoleKit pour chercher des utilisateurs et des périodes " "(expérimental)" #: ../ui/tcosmonitor-prefwindow.ui:368 msgid "Settings" msgstr "Réglages" #: ../ui/tcosmonitor-prefwindow.ui:393 msgid "Update host list every (seg)" msgstr "Mettre à jour la liste des hôtes chaque (seg)" #: ../ui/tcosmonitor-prefwindow.ui:406 msgid "" "Update host list every selected seconds.\n" "\n" "Value=0 disable update." msgstr "" "Mettre à jour la liste des hôtes chaque x secondes sélectionnée.\n" "\n" "Valeur = 0 désactive la mise à jour" #: ../ui/tcosmonitor-prefwindow.ui:422 msgid "Cache timeout (seg)" msgstr "Expiration du cache (seg)" #: ../ui/tcosmonitor-prefwindow.ui:436 msgid "" "Cache some data and connection status during selected seconds.\n" "\n" "Value=0 disable cache." msgstr "" "Mettre en cache des données et le statut de la connexion pendant la durée " "(en secondes) sélectionnée.\n" "\n" "Valeur = 0 désactive la mise en cache." #: ../ui/tcosmonitor-prefwindow.ui:454 msgid "Screenshot size:" msgstr "Taille de la capture d'écran : " #: ../ui/tcosmonitor-prefwindow.ui:467 ../ui/tcosmonitor-prefwindow.ui:496 msgid "% Size of screnshot." msgstr "% Taille de la capture d'écran." #: ../ui/tcosmonitor-prefwindow.ui:483 msgid "Mini screenshot size:" msgstr "Taille minimum de la capture d'écran : " #: ../ui/tcosmonitor-prefwindow.ui:512 msgid "Timeout actions (seg)" msgstr "Expiration des actions (seg)" #: ../ui/tcosmonitor-prefwindow.ui:525 msgid "" "Timeout in seg for actions\n" "\n" "Value=0 default" msgstr "" "Délai en secondes pour les actions\n" "\n" "Valeur = 0 par défaut" #: ../ui/tcosmonitor-prefwindow.ui:543 msgid "SSH remote username" msgstr "Nom d'utilisateur distant pour SSH" #: ../ui/tcosmonitor-prefwindow.ui:570 msgid "VLC method to send" msgstr "Méthode VLC à envoyer" #: ../ui/tcosmonitor-prefwindow.ui:595 msgid "" "Experimental: Thread Controller\n" "( if you have problems, disable it )" msgstr "" "Expérimental : contrôleur de processus \n" "(si vous rencontrez des problèmes, désactivez-le)" #: ../ui/tcosmonitor-prefwindow.ui:608 msgid "Actions controlled" msgstr "Actions contrôlées" #: ../ui/tcosmonitor-prefwindow.ui:628 msgid "Block ports: (80,8080... etc)" msgstr "Ports bloqués : (80, 8080, etc.)" #: ../ui/tcosmonitor-prefwindow.ui:697 msgid "TcosXmlRpc username" msgstr "Nom d'utilisateur pour TcosXmlRpc" #: ../ui/tcosmonitor-prefwindow.ui:723 msgid "TcosXmlRpc password" msgstr "Mot de passe pour TcosXmlRpc" #: ../ui/tcosmonitor-prefwindow.ui:752 msgid "" "NOTE:\n" "Default user is root and default password is root.\n" "\n" "For thin clients change TCOS_ROOT_PASSWD or use TcosConfig and " "regenerate boot images again.\n" "\n" "For standalone users you can use a system account (root) but this is " "not recomended. Install tcos-standalone and start it by root. Set user and " "password, this will create a /etc/tcospasswd file only used by TCOS " "and your root acount will be secure." msgstr "" "NOTE :\n" "Le nom d'utilisateur par défaut est root et le mot de passe par " "défaut est root.\n" "\n" "Pour les clients légers changez TCOS_ROOT_PASSWD ou utilisez " "TcosConfig et régénérez les images de démarrage à nouveau.\n" "\n" "Pour les utilisateurs autonomes vous pouvez utiliser un compte " "système (superutilisateur) mais ce n'est pas recommandé. Veuillez installer " "tcos-standalone et démarrez le comme superutilisateur. Créez l'utilisateur " "et le mot de passe, cela créera un fichier /etc/tcospasswd qui sera " "utilisé seulement par TCOS et votre compte superutilisateur sera sécurisé." #: ../ui/tcosmonitor-prefwindow.ui:789 msgid "Authentication " msgstr "Authentification" #: ../ui/tcosmonitor-prefwindow.ui:812 msgid "Info avalaible from tcosxmlrpc" msgstr "informations disponibles à propos de tcosxmlrpc" #: ../ui/tcosmonitor-prefwindow.ui:823 msgid "Tcos general info" msgstr "Informations générales à propos de Tcos" #: ../ui/tcosmonitor-prefwindow.ui:838 msgid "Cpu info" msgstr "Informations à propos du processeur" #: ../ui/tcosmonitor-prefwindow.ui:853 msgid "Kernel and modules info" msgstr "Informations à propos du noyau et des modules" #: ../ui/tcosmonitor-prefwindow.ui:868 msgid "PCI bus info" msgstr "Informations à propos du bus PCI" #: ../ui/tcosmonitor-prefwindow.ui:883 msgid "Ram and swap info" msgstr "Informations à propos de la RAM et de la partition d'échange" #: ../ui/tcosmonitor-prefwindow.ui:898 msgid "Process info" msgstr "Informations à propos des processus" #: ../ui/tcosmonitor-prefwindow.ui:913 msgid "Network info" msgstr "Informations à propos du réseau" #: ../ui/tcosmonitor-prefwindow.ui:943 msgid "Sound server info" msgstr "Informations à propos du serveur de son" #: ../ui/tcosmonitor-prefwindow.ui:979 msgid "Avalaible info" msgstr "Informations disponibles" #: ../ui/tcosmonitor-prefwindow.ui:1002 msgid "Show / hide menu items" msgstr "Afficher/cacher les entrées du menu" #: ../ui/tcosmonitor-prefwindow.ui:1020 msgid "Lock and unlock screen" msgstr "Verrouiller et déverrouiller l'écran" #: ../ui/tcosmonitor-prefwindow.ui:1036 msgid "Remote SSH shell" msgstr "Terminal SSH distant" #: ../ui/tcosmonitor-prefwindow.ui:1054 msgid "Configure Xorg settings" msgstr "Configurer les paramètres de Xorg" #: ../ui/tcosmonitor-prefwindow.ui:1083 ../ui/tcosmonitor-prefwindow.ui:1444 msgid "Exe app on user display" msgstr "Exécuter une application sur l'affichage de l'utilisateur" #: ../ui/tcosmonitor-prefwindow.ui:1099 ../ui/tcosmonitor-prefwindow.ui:1458 msgid "Send a text message" msgstr "Envoyer un message texte" #: ../ui/tcosmonitor-prefwindow.ui:1117 msgid "Show running apps" msgstr "Afficher les applications en cours" #: ../ui/tcosmonitor-prefwindow.ui:1133 ../ui/tcosmonitor-prefwindow.ui:1474 msgid "Send video broadcast" msgstr "Envoyer la diffusion vidéo" #: ../ui/tcosmonitor-prefwindow.ui:1167 msgid "Demo mode" msgstr "Mode démonstration" #: ../ui/tcosmonitor-prefwindow.ui:1196 msgid "Wake on LAN" msgstr "Réveil par le réseau" #: ../ui/tcosmonitor-prefwindow.ui:1212 msgid "Audio conference mode" msgstr "Mode conférence audio" #: ../ui/tcosmonitor-prefwindow.ui:1230 msgid "Screenshots" msgstr "Captures d'écran" #: ../ui/tcosmonitor-prefwindow.ui:1246 msgid "Reboot and poweroff" msgstr "Redémarrer et éteindre" #: ../ui/tcosmonitor-prefwindow.ui:1260 msgid "Lock and unlock internet" msgstr "Bloquer et débloquer la connexion Internet" #: ../ui/tcosmonitor-prefwindow.ui:1276 msgid "DPMS monitor on/off" msgstr "Allumage et extinction du moniteur par DPMS" #: ../ui/tcosmonitor-prefwindow.ui:1294 msgid "Connect using VNC" msgstr "Se connecter en utilisant VNC" #: ../ui/tcosmonitor-prefwindow.ui:1310 msgid "Connect using iTALC" msgstr "Se connecter en utilisant iTALC" #: ../ui/tcosmonitor-prefwindow.ui:1325 msgid "Restart session with new settings" msgstr "Redémarrer la session avec les nouveaux réglages" #: ../ui/tcosmonitor-prefwindow.ui:1402 msgid "Menus" msgstr "Menus" #: ../ui/tcosmonitor-prefwindow.ui:1425 msgid "Show / hide menu buttons" msgstr "Afficher/cacher les boutons du menu" #: ../ui/tcosmonitor-prefwindow.ui:1508 msgid "Audio conference" msgstr "Conférence audio" #: ../ui/tcosmonitor-prefwindow.ui:1542 msgid "Audio Chat control" msgstr "Commandes pour le dialogue en ligne audio" #: ../ui/tcosmonitor-prefwindow.ui:1586 msgid "Menu buttons" msgstr "Boutons du menu" #: ../ui/tcosmonitor-chatwindow.ui:8 msgid "Chat emission list" msgstr "Liste des émissions pour les dialogues en ligne" #: ../ui/tcosmonitor-chatwindow.ui:17 msgid "Chat emission list" msgstr "" "Liste des émissions pour les dialogues en ligne" #: ../ui/tcosmonitor-chatwindow.ui:80 msgid "Connect" msgstr "Connecter" #: ../ui/tcosmonitor-chatwindow.ui:128 msgid "Disconnect" msgstr "Déconnecter" #: ../ui/tcosmonitor-chatwindow.ui:176 msgid "Exit" msgstr "Sortie" #~ msgid "Send files disabled. rsync not configured." #~ msgstr "L'envoi de fichiers est désactivé. Rsync n'est pas configuré." #~ msgid "" #~ "TcosMonitor need special configuration for rsync daemon to send files.\n" #~ "\n" #~ "Please read configuration requeriments in:\n" #~ "/usr/share/doc/tcosmonitor/README.rsync" #~ msgstr "" #~ "TcosMonitor a besoin d'une configuration spécifique du démon rsync pour " #~ "envoyer des fichiers.\n" #~ "\n" #~ "Veuillez lire le nécessaire à configurer dans :\n" #~ "/usr/share/doc/tcosmonitor/README.rsync" tcosmonitor/po/es.po0000664000000000000000000026217612260544373011737 0ustar # Spanish translations for tcosmonitor package # Traducciones al español para el paquete tcosmonitor. # Copyright (C) 2006 THE tcosmonitor'S COPYRIGHT HOLDER # This file is distributed under the same license as the tcosmonitor package. # , 2006. # , 2006. # Mario Izquierdo (mariodebian) , 2010. msgid "" msgstr "" "Project-Id-Version: tcosmonitor 0.0.1\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-03-18 15:48+0100\n" "PO-Revision-Date: 2010-03-18 15:48+0100\n" "Last-Translator: Mario Izquierdo (mariodebian) \n" "Language-Team: Spanish >\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: ../tcosmonitor.py:129 #, python-format msgid "" "The user \"%s\" must be member of the group \"tcos\" to exec tcosmonitor.\n" "\n" "If you are system administrator, add your user to tcos group." msgstr "" "El usuario \"%s\" debe ser pertenecer del grupo \"tcos\" para ejecutar " "tcosmonitor.\n" "\n" "Si usted es administrador del sistema, añada su usuario al grupo tcos." #: ../tcosmonitor.py:247 msgid "Send files disabled. rsync not configured." msgstr "El envío de archivos está deshabilitado, rsync no está configurado." #: ../tcosmonitor.py:329 ../tcospersonalize.py:562 #: ../tcos-volume-manager.py:378 msgid "Exiting" msgstr "Saliendo" #: ../tcos-devices-ng.py:188 #, python-format msgid "Rebooting in %s seconds" msgstr "El equipo se reiniciará en %s segundos" #: ../tcos-devices-ng.py:190 #, python-format msgid "Shutting down in %s seconds" msgstr "El equipo se apagará en %s segundos" #: ../tcos-devices-ng.py:206 ../tcos-devices-ng.py:209 #, python-format msgid "" "ERROR during action %(action)s:\n" "%(errortxt)s" msgstr "" "ERROR realizando acción %(action)s:\n" "%(errortxt)s" #: ../tcos-devices-ng.py:239 msgid "Tcos device daemon" msgstr "Gestor de dispositivos TCOS" #: ../tcos-devices-ng.py:283 ../tcos-volume-manager.py:143 #, python-format msgid "Error connecting with TcosXmlRpc in %s." msgstr "Error conectando con tcosxmlrpc en %s" #: ../tcos-devices-ng.py:314 #, python-format msgid "Cdrom device %s" msgstr "Dispositivo cdrom %s" #: ../tcos-devices-ng.py:317 msgid "Mount Cdrom" msgstr "Montar cdrom" #: ../tcos-devices-ng.py:318 msgid "Umount Cdrom" msgstr "Desmontar cdrom" #: ../tcos-devices-ng.py:340 #, python-format msgid "Disk partition %s" msgstr "Partición del disco %s" #: ../tcos-devices-ng.py:343 msgid "Mount disk partition" msgstr "Montar partición" #: ../tcos-devices-ng.py:344 msgid "Umount disk partition" msgstr "Desmontar partición" #: ../tcos-devices-ng.py:356 msgid "No floppy detected" msgstr "No se ha detectado disquete" #: ../tcos-devices-ng.py:368 ../tcos-devices-ng.py:674 #: ../tcos-devices-ng.py:680 ../tcos-devices-ng.py:686 msgid "Floppy" msgstr "Disquete" #: ../tcos-devices-ng.py:371 msgid "Mount Floppy" msgstr "Montar disquete" #: ../tcos-devices-ng.py:372 msgid "Umount Floppy" msgstr "Desmontar disquete" #: ../tcos-devices-ng.py:382 msgid "Floppy mounted. Ready for use." msgstr "Disquete montado. Listo para usar." #: ../tcos-devices-ng.py:384 msgid "Floppy umounted. You can extract it." msgstr "Disquete desmontado. Ahora puede extraerlo." #: ../tcos-devices-ng.py:400 msgid "Hard disk partition mounted. Ready for use." msgstr "Partición montada. Lista para usar." #: ../tcos-devices-ng.py:403 msgid "Hard disk partition umounted." msgstr "Partición desmontada." #: ../tcos-devices-ng.py:425 msgid "Audio cdrom mounted., you can listen music opening wav files." msgstr "" "Cdrom de música montado, ahora puedes escucharlo abriendo los archivos wav." #: ../tcos-devices-ng.py:427 msgid "Cdrom mounted. Ready for use." msgstr "Cdrom montado. Listo para usar." #: ../tcos-devices-ng.py:430 msgid "Cdrom umounted. You can extract it." msgstr "Cdrom desmontado. Ahora puede extraerlo." #: ../tcos-devices-ng.py:529 #, python-format msgid "" "Mounting device %s\n" "Please wait..." msgstr "" "Montando dispositivo %s.\n" "Por favor, espere..." #: ../tcos-devices-ng.py:578 msgid "Error mounting LTSPFS, check versions of LTSPFS packages" msgstr "Error montando LTSPFS, compruebe las versiones de los paquetes LTSPFS" #: ../tcos-devices-ng.py:604 #, python-format msgid "" "Umounting device %s.\n" "Please wait..." msgstr "" "Desmontando dispositivo %s.\n" "Por favor, espere..." #: ../tcos-devices-ng.py:651 msgid "usbdisk" msgstr "disco-usb" #: ../tcos-devices-ng.py:653 msgid "firewiredisk" msgstr "disco-firewire" #: ../tcos-devices-ng.py:678 msgid "Can't mount floppy" msgstr "No se pudo montar el disquete" #: ../tcos-devices-ng.py:689 msgid "Can't umount floppy" msgstr "No se pudo desmontar el disquete" #: ../tcos-devices-ng.py:702 ../tcos-devices-ng.py:712 #: ../tcos-devices-ng.py:723 ../tcos-devices-ng.py:836 #: ../tcos-devices-ng.py:848 ../tcos-devices-ng.py:867 #: ../tcos-devices-ng.py:879 ../tcos-devices-ng.py:911 #, python-format msgid "Cdrom_%s" msgstr "Cdrom_%s" #: ../tcos-devices-ng.py:710 msgid "Can't mount cdrom" msgstr "No se pudo montar el cdrom" #: ../tcos-devices-ng.py:726 msgid "Can't umount cdrom" msgstr "No se pudo desmontar el cdrom" #: ../tcos-devices-ng.py:742 ../tcos-devices-ng.py:752 #: ../tcos-devices-ng.py:763 #, python-format msgid "Disk_%s" msgstr "Disco_%s" #: ../tcos-devices-ng.py:750 msgid "Can't mount hard disk partition" msgstr "No se pudo montar la partición" #: ../tcos-devices-ng.py:766 msgid "Can't umount hard disk partition" msgstr "No se pudo desmontar la partición" #: ../tcos-devices-ng.py:807 #, python-format msgid "" "From terminal %(host)s.\n" "Connected CDROM USB device %(device)s\n" "%(vendor)s %(model)s" msgstr "" "Desde el terminal %(host)s.\n" "Dispositivo CDROM USB conectado %(device)s\n" "%(vendor)s %(model)s" #: ../tcos-devices-ng.py:811 #, python-format msgid "CDROM USB device %s" msgstr "Dispositivo CDROM USB %s" #: ../tcos-devices-ng.py:814 #, python-format msgid "Mount CDROM USB device %s" msgstr "Montar dispositivo CDROM USB %s" #: ../tcos-devices-ng.py:815 #, python-format msgid "Umount CDROM USB device %s" msgstr "Desmontar dispositivo CDROM USB %s" #: ../tcos-devices-ng.py:840 ../tcos-devices-ng.py:871 #: ../tcos-devices-ng.py:1001 ../tcos-devices-ng.py:1012 #: ../tcos-devices-ng.py:1058 ../tcos-devices-ng.py:1138 #: ../tcos-devices-ng.py:1149 ../tcos-devices-ng.py:1195 #, python-format msgid "Error, can't mount device %s" msgstr "Error, no se pudo montar el dispositivo %s" #: ../tcos-devices-ng.py:898 #, python-format msgid "" "From terminal %(host)s.\n" "Disconnected CDROM USB device %(device)s\n" "%(vendor)s %(model)s" msgstr "" "Desde el terminal %(host)s.\n" "Dispositivo CDROM USB desconectado %(device)s\n" "%(vendor)s %(model)s" #: ../tcos-devices-ng.py:926 #, python-format msgid "Can't umount cdrom usb %s" msgstr "No se pudo desmontar el cdrom usb" #: ../tcos-devices-ng.py:951 #, python-format msgid "" "From terminal %(host)s.\n" "Connected USB device %(device)s\n" "%(vendor)s %(model)s" msgstr "" "Desde el terminal %(host)s.\n" "Dispositivo USB conectado %(device)s\n" "%(vendor)s %(model)s" #: ../tcos-devices-ng.py:954 #, python-format msgid "" "From terminal %(host)s.\n" "Disconnected USB device %(device)s\n" "%(vendor)s %(model)s" msgstr "" "Desde el terminal %(host)s.\n" "Dispositivo USB desconectado %(device)s\n" "%(vendor)s %(model)s" #: ../tcos-devices-ng.py:982 #, python-format msgid "USB device %s" msgstr "Dispositivo USB %s" #: ../tcos-devices-ng.py:985 #, python-format msgid "Mount USB device %s" msgstr "Montar dispositivo USB %s" #: ../tcos-devices-ng.py:986 #, python-format msgid "Umount USB device %s" msgstr "Desmontar dispositivo USB %s" #: ../tcos-devices-ng.py:1088 #, python-format msgid "" "From terminal %(host)s.\n" "Connected Firewire device %(device)s\n" "%(vendor)s %(model)s" msgstr "" "Desde el terminal %(host)s.\n" "Dispositivo Firewire conectado %(device)s\n" "%(vendor)s %(model)s" #: ../tcos-devices-ng.py:1091 #, python-format msgid "" "From terminal %(host)s.\n" "Disconnected Firewire device %(device)s\n" "%(vendor)s %(model)s" msgstr "" "Desde el terminal %(host)s.\n" "Dispositivo Firewire desconectado %(device)s\n" "%(vendor)s %(model)s" #: ../tcos-devices-ng.py:1119 #, python-format msgid "Firewire device %s" msgstr "Dispositivo Firewire %s" #: ../tcos-devices-ng.py:1122 #, python-format msgid "Mount Firewire device %s" msgstr "Montar dispositivo Firewire %s" #: ../tcos-devices-ng.py:1123 #, python-format msgid "Umount Firewire device %s" msgstr "Desmontar dispositivo Firewire %s" #: ../tcos-devices-ng.py:1206 #, python-format msgid "CDROM USB device %s umounted. You can extract it." msgstr "Dispositivo CDROM USB %s desmontado. Ahora puede extraerlo." #: ../tcos-devices-ng.py:1209 #, python-format msgid "CDROM USB device %s mounted. Ready for use." msgstr "Dispositivo CDROM USB %s montado.Listo para usar." #: ../tcos-devices-ng.py:1247 #, python-format msgid "USB device %s umounted. You can extract it." msgstr "Dispositivo USB %s desmontado. Ahora puede extraerlo." #: ../tcos-devices-ng.py:1250 #, python-format msgid "USB device %s mounted. Ready for use." msgstr "Dispositivo USB %s montado.Listo para usar." #: ../tcos-devices-ng.py:1286 #, python-format msgid "Firewire device %s umounted. You can extract it." msgstr "Dispositivo Firewire %s desmontado. Ahora puede extraerlo." #: ../tcos-devices-ng.py:1289 #, python-format msgid "Firewire device %s mounted. Ready for use." msgstr "Dispositivo Firewire %s montado.Listo para usar." #: ../tcospersonalize.py:115 msgid "" "Need a host to configure!!!\n" "Try exec:\n" " tcospersonalize --host=XXX.XXX.XXX.XXX" msgstr "" "¡Se necesita una dirección de equipo a configurar!\n" "Pruebe a ejecutar:\n" " tcospersonalize --host=XXX.XXX.XXX.XXX" #: ../tcospersonalize.py:190 msgid "host: " msgstr "equipo: " #: ../tcospersonalize.py:454 msgid "Host down, can't connect to tcosxmlrpc." msgstr "Equipo inaccesible, no se pudo conectar a tcosxmlrpc." #: ../tcospersonalize.py:462 #, python-format msgid "New %d drivers loaded from terminal." msgstr "Cargados %d drivers desde el terminal." #: ../tcospersonalize.py:521 #, python-format msgid "Really delete config of %s?" msgstr "¿Borrar archivo de configuración de %s?" #: ../tcospersonalize.py:524 msgid "Deleted!" msgstr "¡Borrado!" #: ../tcos-volume-manager.py:101 ../tcos-volume-manager.py:113 #, python-format msgid "" "Tcos Sound levels on:\n" "%s" msgstr "" "Niveles de volumen TCOS en equipo:\n" "%s" #: ../tcos-volume-manager.py:121 #, python-format msgid "ERROR: It appears that TcosXmlRpc is not running on %s." msgstr "ERROR: Parece que tcosxmlrpc no se está ejecutando en %s" #: ../tcos-volume-manager.py:217 msgid "Loading channels info..." msgstr "Cargando información de canales..." #: ../tcos-volume-manager.py:230 msgid "Error loading channels info (xauth error)" msgstr "Error cargando información de canales (error de xauth)" #: ../tcos-volume-manager.py:233 ../ui/tcos-volume-manager.ui:8 msgid "Tcos Volume Manager" msgstr "Monitor de volumen TCOS" #: ../tcos-volume-manager.py:234 #, python-format msgid "Sound mixer of %s host" msgstr "Mezclador de audio del equipo %s" #: ../tcos-volume-manager.py:300 ../tcosmonitor/extensions/info.py:442 msgid "Mute" msgstr "Mudo" #: ../tcos-volume-manager.py:319 msgid "Main controls ready" msgstr "Controles principales cargados" #: ../tcos-volume-manager.py:323 msgid "All remote controls loaded." msgstr "Todos los controles remotos cargados." #: ../tcos-volume-manager.py:332 ../tcosmonitor/extensions/info.py:557 #, python-format msgid "Changing value of %(channel)s channel, to %(value)s%%..." msgstr "Cambiando valor del canal %(channel)s, a %(value)s%%..." #: ../tcos-volume-manager.py:339 ../tcosmonitor/extensions/info.py:564 #, python-format msgid "Changed value of %(channel)s channel, to %(value)s" msgstr "Valor cambiado del canal %(channel)s, a %(value)s" #: ../tcos-volume-manager.py:346 ../tcosmonitor/extensions/info.py:571 #, python-format msgid "Unmuting %s channel..." msgstr "Quitando enmudecido al canal %s..." #: ../tcos-volume-manager.py:351 ../tcosmonitor/extensions/info.py:576 #, python-format msgid "Muting %s channel..." msgstr "Enmudeciendo canal %s..." #: ../tcos-volume-manager.py:354 ../tcosmonitor/extensions/info.py:579 #, python-format msgid "Status of %(channel)s channel, is \"%(newvalue)s\"" msgstr "Estado del canal %(channel)s es \"%(newvalue)s\"" #: ../tcosmonitor/TcosDBus.py:94 msgid "TcosDBus not allowed in local display" msgstr "TcosDBus no permitido en pantalla local." #: ../tcosmonitor/TcosDBus.py:122 #, python-format msgid "Seems that tcosxmlrpc isn't running on host=\"%s\"" msgstr "Parece que tcosxmlrpc no se está ejecutando en equipo=\"%s\"" #: ../tcosmonitor/TcosDBus.py:143 msgid "tcosxmlrpc ERROR conection unavalaible." msgstr "tcosxmlrpc ERROR conexión no disponible" #: ../tcosmonitor/TcosDBus.py:159 msgid "ERROR conecting to tcosxmlrpc, check username and password." msgstr "" "No se puede conectar a tcosxmlrpc, verifique el usuario y la contraseña." #: ../tcosmonitor/TcosDBus.py:251 msgid "Message from admin" msgstr "Mensaje del administrador" #: ../tcosmonitor/TcosDBus.py:341 ../tcosmonitor/TcosDBus.py:357 #: ../tcosmonitor/TcosDBus.py:375 ../tcosmonitor/TcosDBus.py:393 msgid "User not allowed to run this dbus call." msgstr "Su usuario no tiene permitidas estas llamadas dbus." #: ../tcosmonitor/TcosStaticHosts.py:163 ../tcosmonitor/TcosListView.py:70 msgid "IP address" msgstr "Dirección IP" #: ../tcosmonitor/TcosStaticHosts.py:169 #: ../ui/tcosmonitor-staticwindownew.ui:68 msgid "MAC address" msgstr "Dirección MAC" #: ../tcosmonitor/TcosStaticHosts.py:279 msgid "No hosts found, please click on Refresh button using another method." msgstr "" "No se han encontrado equipos, por favor, pulse el botón Actualizar usando " "otro método." #: ../tcosmonitor/shared.py:108 msgid "Traditional list only" msgstr "Lista tradicional sólo" #: ../tcosmonitor/shared.py:109 msgid "Icons only" msgstr "Sólo iconos" #: ../tcosmonitor/shared.py:110 msgid "Simulate classroom" msgstr "Simular aula" #: ../tcosmonitor/shared.py:111 msgid "Lists, icons and classroom with tabs" msgstr "Lista, iconos y modo aula con pestañas" #: ../tcosmonitor/shared.py:270 ../tcosmonitor/shared.py:312 #: ../tcosmonitor/TcosMenus.py:35 msgid "Terminal actions" msgstr "Acciones para el terminal/equipo" #: ../tcosmonitor/shared.py:271 ../tcosmonitor/shared.py:313 #: ../tcosmonitor/TcosMenus.py:36 msgid "User actions" msgstr "Acciones para el usuario" #: ../tcosmonitor/shared.py:272 ../tcosmonitor/shared.py:314 #: ../tcosmonitor/TcosMenus.py:37 msgid "Audio, video and files" msgstr "Sonido, vídeo y archivos" #: ../tcosmonitor/shared.py:279 ../tcosmonitor/extensions/info.py:47 msgid "Refresh terminal info" msgstr "Actualizar información del terminal" #: ../tcosmonitor/shared.py:280 ../tcosmonitor/extensions/clean.py:40 #: ../tcosmonitor/extensions/clean.py:41 msgid "Clean info about terminal" msgstr "Limpiar información del terminal" #: ../tcosmonitor/shared.py:281 ../tcosmonitor/TcosTrayIcon.py:54 #: ../tcosmonitor/extensions/reboot.py:40 ../tcosmonitor/TcosTrayIcon2.py:58 msgid "Reboot" msgstr "Reiniciar" #: ../tcosmonitor/shared.py:282 ../tcosmonitor/TcosTrayIcon.py:55 #: ../tcosmonitor/extensions/reboot.py:42 ../tcosmonitor/TcosTrayIcon2.py:59 msgid "Poweroff" msgstr "Apagar" #: ../tcosmonitor/shared.py:283 ../tcosmonitor/extensions/lockscreen.py:40 msgid "Lock screen" msgstr "Bloquear pantalla" #: ../tcosmonitor/shared.py:284 ../tcosmonitor/extensions/lockscreen.py:42 msgid "Unlock screen" msgstr "Desbloquear pantalla" #: ../tcosmonitor/shared.py:285 ../tcosmonitor/extensions/italc.py:43 msgid "Connect to remote screen (iTALC)" msgstr "Conectar a la pantalla remota (iTALC)" #: ../tcosmonitor/shared.py:286 ../tcosmonitor/extensions/vnc.py:54 msgid "Connect to remote screen (VNC)" msgstr "Conectar a la pantalla remota (VNC)" #: ../tcosmonitor/shared.py:287 ../tcosmonitor/extensions/screenshot.py:45 msgid "Screenshot" msgstr "Captura de pantalla" #: ../tcosmonitor/shared.py:288 ../tcosmonitor/extensions/remotessh.py:40 msgid "Give a remote xterm" msgstr "Ejecutar un terminal xterm en el cliente" #: ../tcosmonitor/shared.py:289 #: ../tcosmonitor/extensions/tcospersonalize.py:40 #: ../ui/tcosmonitor-prefwindow.ui:1324 msgid "Configure this host" msgstr "Configurar este equipo" #: ../tcosmonitor/shared.py:290 ../tcosmonitor/extensions/logout.py:40 msgid "Logout client" msgstr "Desconectar cliente" #: ../tcosmonitor/shared.py:291 ../tcosmonitor/extensions/restartxorg.py:41 msgid "Restart X session with new settings" msgstr "Reiniciar sesión X con la nueva configuración" #: ../tcosmonitor/shared.py:292 ../tcosmonitor/extensions/appsmsg.py:52 msgid "Exec app on user display" msgstr "Ejecutar aplicación en pantalla de usuario" #: ../tcosmonitor/shared.py:293 ../tcosmonitor/extensions/appsmsg.py:53 msgid "Send a text message to user" msgstr "Enviar un mensaje de texto al usuario" #: ../tcosmonitor/shared.py:294 ../tcosmonitor/extensions/viewproc.py:41 msgid "Show running apps of this client" msgstr "Mostrar aplicaciones ejecutadas por este cliente" #: ../tcosmonitor/shared.py:295 ../tcosmonitor/shared.py:332 msgid "Audio/Video broadcast" msgstr "Difusión de audio/vídeo" #: ../tcosmonitor/shared.py:296 ../tcosmonitor/shared.py:333 #: ../tcosmonitor/extensions/sendfiles.py:49 #: ../tcosmonitor/extensions/sendfiles.py:50 #: ../ui/tcosmonitor-prefwindow.ui:1134 ../ui/tcosmonitor-prefwindow.ui:1475 #: ../ui/tcosmonitor-mainwindow.ui:387 msgid "Send files" msgstr "Enviar archivos" #: ../tcosmonitor/shared.py:297 ../tcosmonitor/extensions/vnc.py:55 msgid "Demo mode (from this host)" msgstr "Modo demo (desde este equipo)" #: ../tcosmonitor/shared.py:298 ../tcosmonitor/extensions/wakeonlan.py:41 msgid "Boot client (WakeOnLan)" msgstr "Arrancar cliente (WakeOnLan)" #: ../tcosmonitor/shared.py:299 #: ../tcosmonitor/extensions/tcosnetcontroller.py:38 msgid "Lock internet" msgstr "Bloquear internet" #: ../tcosmonitor/shared.py:300 #: ../tcosmonitor/extensions/tcosnetcontroller.py:39 msgid "Unlock internet" msgstr "Desbloquear internet" #: ../tcosmonitor/shared.py:301 ../tcosmonitor/extensions/dpms.py:40 msgid "DPMS Power off monitor" msgstr "DPMS apagar monitor" #: ../tcosmonitor/shared.py:302 ../tcosmonitor/extensions/dpms.py:42 msgid "DPMS Power on monitor" msgstr "DPMS encender monitor" #: ../tcosmonitor/shared.py:303 msgid "Send MIC audio (from this host)" msgstr "Enviar sonido del micrófono (desde este equipo)" #: ../tcosmonitor/shared.py:321 ../tcosmonitor/extensions/reboot.py:41 msgid "Reboot all clients" msgstr "Reiniciar todos los clientes" #: ../tcosmonitor/shared.py:322 ../tcosmonitor/extensions/reboot.py:43 msgid "Poweroff all clients" msgstr "Apagar todos los clientes" #: ../tcosmonitor/shared.py:323 ../tcosmonitor/extensions/lockscreen.py:41 msgid "Lock all screens" msgstr "Bloquear todas las pantallas" #: ../tcosmonitor/shared.py:324 ../tcosmonitor/extensions/lockscreen.py:43 msgid "Unlock all screens" msgstr "Desbloquear todas las pantallas" #: ../tcosmonitor/shared.py:325 ../tcosmonitor/extensions/logout.py:41 msgid "Logout clients" msgstr "Desconectar todos los clientes" #: ../tcosmonitor/shared.py:326 ../tcosmonitor/extensions/restartxorg.py:42 msgid "Restart X session of all clients" msgstr "Reiniciar sesión X de todos los clientes" #: ../tcosmonitor/shared.py:327 ../tcosmonitor/extensions/appsmsg.py:55 msgid "Exec same app in all connected users" msgstr "Ejecutar misma aplicación en todos los usuarios conectados" #: ../tcosmonitor/shared.py:328 ../tcosmonitor/extensions/appsmsg.py:56 msgid "Send a text message to all connected users" msgstr "Enviar un mensaje de texto a todos los usuarios conectados" #: ../tcosmonitor/shared.py:329 ../tcosmonitor/extensions/vnc.py:57 msgid "Enter demo mode, all connected users see my screen" msgstr "Entrar en modo demostración, todos los usuarios ven mi pantalla" #: ../tcosmonitor/shared.py:330 msgid "Enter conference mode, all connected users can hear me" msgstr "Entrar en modo conferencia, todos los usuarios pueden escucharme" #: ../tcosmonitor/shared.py:331 ../tcosmonitor/extensions/screenshot.py:46 msgid "Capture All clients screens" msgstr "Capturar todas las pantallas" #: ../tcosmonitor/shared.py:334 ../tcosmonitor/extensions/wakeonlan.py:42 msgid "Boot All clients (WakeOnLan)" msgstr "Arrancar todos los clientes (WakeOnLan)" #: ../tcosmonitor/shared.py:335 #: ../tcosmonitor/extensions/tcosnetcontroller.py:41 msgid "Lock internet in all connected users" msgstr "Bloquear internet a todos los usuarios conectados" #: ../tcosmonitor/shared.py:336 #: ../tcosmonitor/extensions/tcosnetcontroller.py:42 msgid "Unlock internet in all connected users" msgstr "Desbloquear internet a todos los usuarios conectados" #: ../tcosmonitor/shared.py:337 ../tcosmonitor/extensions/dpms.py:41 msgid "DPMS Power off monitors" msgstr "DPMS apagar todos los monitores" #: ../tcosmonitor/shared.py:338 ../tcosmonitor/extensions/dpms.py:43 msgid "DPMS Power on monitors" msgstr "DPMS encender todos los monitores" #: ../tcosmonitor/shared.py:339 msgid "Chat audio conference" msgstr "Chat audio conferencia" #: ../tcosmonitor/shared.py:340 ../tcosmonitor/extensions/livevnc.py:51 #: ../ui/tcosmonitor-prefwindow.ui:1342 msgid "Live view screens with VNC" msgstr "Ver pantallas en directo con VNC" #: ../tcosmonitor/shared.py:538 #, python-format msgid "QUESTION: %(txt)s, RESPONSE %(response)s" msgstr "PREGUNTA: %(txt)s, RESPUESTA %(response)s" #: ../tcosmonitor/shared.py:555 ../tcosmonitor/shared.py:566 #, python-format msgid "INFO: %s" msgstr "INFO: %s" #: ../tcosmonitor/shared.py:577 #, python-format msgid "ERROR: %s" msgstr "ERROR: %s" #: ../tcosmonitor/TcosClassView.py:50 ../tcosmonitor/TcosIconView.py:47 msgid "IP" msgstr "IP" #: ../tcosmonitor/TcosClassView.py:51 ../tcosmonitor/TcosIconView.py:48 #: ../tcosmonitor/TcosListView.py:64 msgid "Hostname" msgstr "Equipo" #: ../tcosmonitor/TcosClassView.py:52 ../tcosmonitor/TcosIconView.py:49 #: ../tcosmonitor/TcosListView.py:76 msgid "Username" msgstr "Usuario" #: ../tcosmonitor/TcosClassView.py:53 ../tcosmonitor/TcosIconView.py:50 #: ../tcosmonitor/TcosListView.py:87 msgid "Logged" msgstr "Logueado" #: ../tcosmonitor/TcosClassView.py:54 ../tcosmonitor/TcosIconView.py:51 #: ../tcosmonitor/TcosListView.py:103 msgid "Time log in" msgstr "Tiempo dentro" #: ../tcosmonitor/TcosClassView.py:55 ../tcosmonitor/TcosIconView.py:52 msgid "Screen locked" msgstr "Pantalla bloqueada" #: ../tcosmonitor/TcosClassView.py:56 ../tcosmonitor/TcosIconView.py:53 msgid "Network locked" msgstr "Red bloqueada" #: ../tcosmonitor/TcosClassView.py:58 msgid "" "Place mouse on any computer to see brief info about it.\n" "You can select and unselect multiple host clicking on every one.\n" "Drag and drop hosts to positions and save clicking on right mouse button." msgstr "" "Mueva el ratón sobre cada equipo para obtener una breve información de cada " "uno.\n" "Puede seleccionar y deseleccionar varios pulsando en cada uno.\n" "Arrastre y suelte los equipos a las posiciones y guárdelas pulsando con el " "botón derecho." #: ../tcosmonitor/TcosClassView.py:179 msgid "Positions reset to defaults." msgstr "Posiciones reseteadas por defecto." #: ../tcosmonitor/TcosClassView.py:197 msgid "Positions saved." msgstr "Posiciones guardadas." #: ../tcosmonitor/TcosClassView.py:323 #, python-format msgid "%s is not a valid file to exe or send" msgstr "%s no es un archivo válido para ejecutar o enviar" #: ../tcosmonitor/TcosClassView.py:409 ../tcosmonitor/TcosIconView.py:156 msgid "yes" msgstr "sí" #: ../tcosmonitor/TcosClassView.py:411 ../tcosmonitor/TcosIconView.py:158 msgid "no" msgstr "no" #: ../tcosmonitor/TcosTrayIcon.py:49 ../tcosmonitor/extensions/vnc.py:298 #: ../tcosmonitor/TcosTrayIcon2.py:53 ../ui/tcosmonitor-mainwindow.ui:23 msgid "Quit" msgstr "Salir" #: ../tcosmonitor/TcosTrayIcon.py:65 msgid "TcosDevices" msgstr "Dispositivos TCOS" #: ../tcosmonitor/TcosTrayIcon.py:172 ../tcosmonitor/TcosTrayIcon.py:186 #: ../tcosmonitor/TcosTrayIcon2.py:67 msgid "Tcos Devices" msgstr "Dispositivos TCOS" #: ../tcosmonitor/TcosTrayIcon.py:232 ../tcosmonitor/TcosTrayIcon2.py:351 msgid "Usb flash" msgstr "Memoria USB flash" #: ../tcosmonitor/TcosTrayIcon.py:234 ../tcosmonitor/TcosTrayIcon2.py:353 msgid "Mount USB1" msgstr "Montar USB1" #: ../tcosmonitor/TcosTrayIcon.py:235 ../tcosmonitor/TcosTrayIcon2.py:354 msgid "Umount USB1" msgstr "Desmontar USB1" #: ../tcosmonitor/extensions/lockscreen.py:49 #: ../tcosmonitor/extensions/lockscreen.py:57 msgid "" "Can't connect to tcosxmlrpc.\n" "Please verify user and password in prefences!" msgstr "" "No se puede conectar a tcosxmlrpc.\n" "Por favor verifique el usuario y la contraseña en las preferencias." #: ../tcosmonitor/extensions/lockscreen.py:81 #, python-format msgid "Do you want to lock the following screens: %s?" msgstr "¿Quiere bloquear las siguientes pantallas: %s ?" #: ../tcosmonitor/extensions/lockscreen.py:90 #, python-format msgid "Do you want to unlock the following screens: %s?" msgstr "¿Quiere desbloquear las siguinetes pantallas: %s ?" #: ../tcosmonitor/extensions/appsmsg.py:64 msgid "Clients not connected" msgstr "No hay usuarios conectados" #: ../tcosmonitor/extensions/appsmsg.py:87 #, python-format msgid "" "Exec app in user(s) screen(s)\n" "or open web address to:\n" "%s" msgstr "" "Ejecutar aplicación en pantalla\n" "de usuario(s) o abrir dirección web:\n" "%s" #: ../tcosmonitor/extensions/appsmsg.py:89 #, python-format msgid "" "Send a message to:\n" "%s" msgstr "" "Enviar mensaje a:\n" "%s" #: ../tcosmonitor/extensions/appsmsg.py:122 #: ../tcosmonitor/extensions/appsmsg.py:163 msgid "Can't exec application, user is not logged" msgstr "No se pueden ejecutar aplicaciones, el usuario no está conectado" #: ../tcosmonitor/extensions/appsmsg.py:141 #: ../tcosmonitor/extensions/appsmsg.py:152 #, python-format msgid "%s is not a valid application" msgstr "%s no es una aplicación válida" #: ../tcosmonitor/extensions/appsmsg.py:172 msgid "Can't send message, user is not logged" msgstr "No se pueden enviar mensajes, el usuario no está conectado" #: ../tcosmonitor/extensions/appsmsg.py:289 #: ../tcosmonitor/extensions/appsmsg.py:298 #, python-format msgid "%s is not application" msgstr "%s no es una aplicación" #: ../tcosmonitor/extensions/appsmsg.py:353 #, python-format msgid "" "Error while exec remote app:\n" "Reason: %s" msgstr "" "Error cuando se ejecutaba aplicación remota:\n" "Razón: %s" #: ../tcosmonitor/extensions/appsmsg.py:360 #, python-format msgid "" "Error while send message:\n" "Reason: %s" msgstr "" "Error cuando se enviaba mensaje:\n" "Razón: %s" #: ../tcosmonitor/extensions/remotessh.py:47 msgid "Enter password of remote thin client (if asked for it)" msgstr "Introduzca contraseña del cliente remoto (si preguntase)" #: ../tcosmonitor/extensions/dpms.py:79 #, python-format msgid "Do you want to switch off the following monitors: %s?" msgstr "¿Quiere apagar los monitores de los siguientes equipos: %s?" #: ../tcosmonitor/extensions/dpms.py:88 #, python-format msgid "Do you want to switch on the following monitors: %s?" msgstr "¿Quiere encender los monitores de los siguientes equipos: %s?" #: ../tcosmonitor/extensions/screenshot.py:66 #: ../tcosmonitor/extensions/screenshot.py:83 #, python-format msgid "Can't make screenshot, error: %s" msgstr "No se pudo hacer una captura de pantalla, error: %s" #: ../tcosmonitor/extensions/screenshot.py:75 msgid "Trying to order terminal to do a screenshot..." msgstr "Intentando mandar al terminal que se haga una captura de pantalla" #: ../tcosmonitor/extensions/screenshot.py:87 msgid "Get another screenshot" msgstr "Hacer otra captura de pantalla" #: ../tcosmonitor/extensions/screenshot.py:102 #, python-format msgid "Screenshot of %s" msgstr "Captura de pantalla de %s" #: ../tcosmonitor/extensions/screenshot.py:125 #, python-format msgid "Screenshot of %s, done." msgstr "Captura de pantalla de %s hecha." #: ../tcosmonitor/extensions/screenshot.py:139 msgid "Save Screenshot" msgstr "Guardar captura de pantalla" #: ../tcosmonitor/extensions/screenshot.py:151 msgid "Select file to save screenshot..." msgstr "Seleccionar archivo para guardar captura de pantalla..." #: ../tcosmonitor/extensions/screenshot.py:155 #, python-format msgid "screenshot_of_%(hostname)s_date_%(date)s.png" msgstr "captura_de_%(hostname)s_fecha_%(date)s.png" #: ../tcosmonitor/extensions/screenshot.py:159 msgid "Image Files ( *.png, *.jpg)" msgstr "Archivos de imagen (*.png, *.jpg)" #: ../tcosmonitor/extensions/screenshot.py:169 msgid "File must be png or jpg." msgstr "El archivo debe ser png o jpg." #: ../tcosmonitor/extensions/screenshot.py:192 msgid "Screenshots of all hosts" msgstr "Captura de pantalla de todos los equipos" #: ../tcosmonitor/extensions/screenshot.py:208 #, python-format msgid "Screenshot of %s" msgstr "Captura de pantalla de %s" #: ../tcosmonitor/extensions/sendfiles.py:62 #: ../tcosmonitor/extensions/sendfiles.py:120 msgid "Can't send files, user is not logged" msgstr "No se pueden enviar archivos, el usuario no está conectado" #: ../tcosmonitor/extensions/sendfiles.py:66 #: ../tcosmonitor/extensions/sendfiles.py:142 #: ../tcosmonitor/extensions/sendfiles.py:237 msgid "" "TcosMonitor need special configuration for rsync daemon to send files.\n" "\n" "Please read configuration requeriments in:\n" "/usr/share/doc/tcosmonitor/README.rsync" msgstr "" "TcosMonitor necesita una configuración especial del demonio rsync para envio " "de ficheros.\n" "\n" "Lea la configuración requerida en:\n" "/usr/share/doc/tcosmonitor/README.rsync" #: ../tcosmonitor/extensions/sendfiles.py:84 #: ../tcosmonitor/extensions/sendfiles.py:176 #: ../tcosmonitor/extensions/sendfiles.py:270 msgid "Waiting for send files..." msgstr "Esperando al envío de archivos..." #: ../tcosmonitor/extensions/sendfiles.py:93 #: ../tcosmonitor/extensions/sendfiles.py:95 #: ../tcosmonitor/extensions/sendfiles.py:99 #: ../tcosmonitor/extensions/sendfiles.py:108 #: ../tcosmonitor/extensions/sendfiles.py:189 #: ../tcosmonitor/extensions/sendfiles.py:191 #: ../tcosmonitor/extensions/sendfiles.py:195 #: ../tcosmonitor/extensions/sendfiles.py:204 #: ../tcosmonitor/extensions/sendfiles.py:283 #: ../tcosmonitor/extensions/sendfiles.py:285 #: ../tcosmonitor/extensions/sendfiles.py:289 #: ../tcosmonitor/extensions/sendfiles.py:298 msgid "Teacher" msgstr "Profesor" #: ../tcosmonitor/extensions/sendfiles.py:95 #: ../tcosmonitor/extensions/sendfiles.py:108 #: ../tcosmonitor/extensions/sendfiles.py:191 #: ../tcosmonitor/extensions/sendfiles.py:204 #: ../tcosmonitor/extensions/sendfiles.py:285 #: ../tcosmonitor/extensions/sendfiles.py:298 #, python-format msgid "" "Teacher has sent some files to %(teacher)s folder:\n" "\n" "%(basenames)s" msgstr "" "El profesor le ha enviado varios archivos a la carpeta %(teacher)s:\n" "\n" "%(basenames)s" #: ../tcosmonitor/extensions/sendfiles.py:104 #: ../tcosmonitor/extensions/sendfiles.py:200 #: ../tcosmonitor/extensions/sendfiles.py:294 #: ../tcosmonitor/extensions/reboot.py:108 #: ../tcosmonitor/extensions/videolan.py:194 #: ../tcosmonitor/extensions/videolan.py:389 #: ../tcosmonitor/extensions/videolan.py:629 #, python-format msgid "" "Error while exec remote app:\n" "Reason:%s" msgstr "" "Error cuando se ejecutaba aplicación remota:\n" "Razón: %s" #: ../tcosmonitor/extensions/sendfiles.py:105 #: ../tcosmonitor/extensions/sendfiles.py:201 #: ../tcosmonitor/extensions/sendfiles.py:295 msgid "Error creating destination folder." msgstr "Error creando directorio destino." #: ../tcosmonitor/extensions/sendfiles.py:110 #: ../tcosmonitor/extensions/sendfiles.py:205 #: ../tcosmonitor/extensions/sendfiles.py:300 msgid "Files sent." msgstr "Archivos enviados." #: ../tcosmonitor/extensions/sendfiles.py:125 #: ../tcosmonitor/extensions/sendfiles.py:220 msgid "Select file or files..." msgstr "Seleccionar archivo o archivos..." #: ../tcosmonitor/extensions/sendfiles.py:178 #: ../tcosmonitor/extensions/sendfiles.py:272 msgid "Do you want open file(s) on client?" msgstr "¿Quiere abrir el fichero(s) en el cliente?" #: ../tcosmonitor/extensions/sendfiles.py:215 #: ../tcosmonitor/extensions/tcosnetcontroller.py:113 #: ../tcosmonitor/extensions/tcosnetcontroller.py:155 #: ../tcosmonitor/extensions/videolan.py:457 #: ../tcosmonitor/extensions/vnc.py:68 ../tcosmonitor/extensions/vnc.py:112 #: ../tcosmonitor/extensions/vnc.py:422 #: ../tcosmonitor/extensions/audiortp.py:229 #: ../tcosmonitor/extensions/audiortp.py:275 #: ../tcosmonitor/extensions/audiortp.py:373 #: ../tcosmonitor/extensions/audiortp.py:407 #: ../tcosmonitor/extensions/audiortp.py:460 msgid "No users logged." msgstr "No hay usuarios conectados." #: ../tcosmonitor/extensions/info.py:91 #, python-format msgid "Connecting with %s to retrieve some info..." msgstr "Conectando a %s para recibir información..." #: ../tcosmonitor/extensions/info.py:117 msgid "Tcos info" msgstr "Información de Tcos" #: ../tcosmonitor/extensions/info.py:120 msgid "PXES info" msgstr "Información de PXES" #: ../tcosmonitor/extensions/info.py:123 msgid "LTSP info" msgstr "Información de LTSP" #: ../tcosmonitor/extensions/info.py:126 msgid "Standalone info" msgstr "Información del equipo autónomo" #: ../tcosmonitor/extensions/info.py:129 msgid "Unknow client info" msgstr "Información de cliente desconocido" #: ../tcosmonitor/extensions/info.py:135 ../tcosmonitor/LocalData.py:43 #: ../tcosmonitor/LocalData.py:62 ../tcosmonitor/TcosCommon.py:182 #: ../tcosmonitor/TcosCommon.py:190 ../tcosmonitor/TcosCommon.py:206 #: ../tcosmonitor/TcosCommon.py:209 msgid "unknow" msgstr "desconocido" #: ../tcosmonitor/extensions/info.py:138 msgid "Hostname: " msgstr "Equipo: " #: ../tcosmonitor/extensions/info.py:139 msgid "Ip address: " msgstr "Dirección IP: " #: ../tcosmonitor/extensions/info.py:140 msgid "TcosXmlRpc version: " msgstr "Versión de TcosXmlRpc: " #: ../tcosmonitor/extensions/info.py:149 msgid "Tcos image version: " msgstr "Versión de la imagen TCOS: " #: ../tcosmonitor/extensions/info.py:150 msgid "Tcos image date: " msgstr "Fecha de la imagen TCOS: " #: ../tcosmonitor/extensions/info.py:151 msgid "Date of thin client: " msgstr "Fecha y hora del cliente ligero: " #: ../tcosmonitor/extensions/info.py:152 msgid "Uptime: " msgstr "Tiempo encendido: " #: ../tcosmonitor/extensions/info.py:163 msgid "Kernel info" msgstr "Información del kernel" #: ../tcosmonitor/extensions/info.py:172 msgid "Force download and mount all modules" msgstr "Forzar descarga y montaje de todos los módulos" #: ../tcosmonitor/extensions/info.py:183 msgid "None" msgstr "Ninguno" #: ../tcosmonitor/extensions/info.py:186 msgid "Kernel version: " msgstr "Versión del kernel: " #: ../tcosmonitor/extensions/info.py:187 msgid "Kernel complete version: " msgstr "Versión completa del kernel: " #: ../tcosmonitor/extensions/info.py:188 msgid "Loaded Modules: " msgstr "Módulos cargados: " #: ../tcosmonitor/extensions/info.py:189 msgid "Modules not found: " msgstr "Módulos no encontrados: " #: ../tcosmonitor/extensions/info.py:205 msgid "Cpu info: " msgstr "Información de la CPU: " #: ../tcosmonitor/extensions/info.py:212 msgid "Cpu model: " msgstr "Modelo de CPU: " #: ../tcosmonitor/extensions/info.py:213 msgid "Cpu vendor: " msgstr "Fabricante de CPU: " #: ../tcosmonitor/extensions/info.py:214 msgid "Cpu speed: " msgstr "Velocidad de CPU: " #: ../tcosmonitor/extensions/info.py:225 msgid "PCI buses: " msgstr "Buses PCI: " #: ../tcosmonitor/extensions/info.py:254 msgid "Process running: " msgstr "Procesos ejecutándose" #: ../tcosmonitor/extensions/info.py:267 msgid "Ram info: " msgstr "Información de la ram:" #: ../tcosmonitor/extensions/info.py:274 msgid "Total Ram: " msgstr "RAM total: " #: ../tcosmonitor/extensions/info.py:275 msgid "Free RAM: " msgstr "RAM libre: " #: ../tcosmonitor/extensions/info.py:276 msgid "Active RAM: " msgstr "RAM activa: " #: ../tcosmonitor/extensions/info.py:279 msgid "Swap info: " msgstr "Información de la swap: " #: ../tcosmonitor/extensions/info.py:285 msgid "Swap enabled: " msgstr "Swap activada: " #: ../tcosmonitor/extensions/info.py:286 msgid "Total Swap: " msgstr "Swap total: " #: ../tcosmonitor/extensions/info.py:287 msgid "Used Swap: " msgstr "Swap usada: " #: ../tcosmonitor/extensions/info.py:297 msgid "Network info: " msgstr "Información de la red:" #: ../tcosmonitor/extensions/info.py:307 msgid "Network hostname: " msgstr "Nombre de máquina: " #: ../tcosmonitor/extensions/info.py:308 msgid "Network IP: " msgstr "Dirección ip: " #: ../tcosmonitor/extensions/info.py:309 msgid "Network MASK: " msgstr "Máscara de red: " #: ../tcosmonitor/extensions/info.py:310 msgid "Network MAC: " msgstr "Número de MAC: " #: ../tcosmonitor/extensions/info.py:311 msgid "Data received(rx): " msgstr "Datos recibidos(rx): " #: ../tcosmonitor/extensions/info.py:312 msgid "Data send(tx): " msgstr "Datos enviados(tx): " #: ../tcosmonitor/extensions/info.py:322 ../ui/tcosmonitor-prefwindow.ui:911 msgid "Xorg info" msgstr "Información de Xorg" #: ../tcosmonitor/extensions/info.py:348 msgid "enabled" msgstr "activado" #: ../tcosmonitor/extensions/info.py:350 msgid "disabled" msgstr "desactivado" #: ../tcosmonitor/extensions/info.py:353 ../ui/tcospersonalize.ui:159 msgid "X Session Type" msgstr "Tipo de sessión gráfica" #: ../tcosmonitor/extensions/info.py:355 ../ui/tcospersonalize.ui:201 msgid "Xorg Driver" msgstr "Driver de Xorg" #: ../tcosmonitor/extensions/info.py:357 ../ui/tcospersonalize.ui:94 msgid "Xorg Resolution" msgstr "Resolución de Xorg" #: ../tcosmonitor/extensions/info.py:359 ../ui/tcospersonalize.ui:133 msgid "Xorg Color depth" msgstr "Profundidad de color de Xorg" #: ../tcosmonitor/extensions/info.py:361 ../ui/tcospersonalize.ui:179 msgid "DPMS energy monitor control" msgstr "Control de energía del monitor DPMS" #: ../tcosmonitor/extensions/info.py:363 msgid "Disable kill X with Ctrl+Alt+Backspace" msgstr "Deshabilitar matar Xorg con Ctrl+Alt+Backspace" #: ../tcosmonitor/extensions/info.py:365 ../ui/tcospersonalize.ui:57 msgid "Enable mouse wheel" msgstr "Activar rueda del ratón" #: ../tcosmonitor/extensions/info.py:367 msgid "Refresh rate" msgstr "Tasa de Refresco" #: ../tcosmonitor/extensions/info.py:369 msgid "Xorg font server" msgstr "Servidor de fuentes de Xorg" #: ../tcosmonitor/extensions/info.py:371 msgid "Mouse device" msgstr "Dispositivo del ratón" #: ../tcosmonitor/extensions/info.py:373 msgid "Mouse protocol" msgstr "Protocolo del ratón" #: ../tcosmonitor/extensions/info.py:375 ../ui/tcospersonalize.ui:273 msgid "X Horiz sync" msgstr "Sincronización horizontal" #: ../tcosmonitor/extensions/info.py:377 ../ui/tcospersonalize.ui:284 msgid "X Vert sync" msgstr "Sincronización vertical" #: ../tcosmonitor/extensions/info.py:390 msgid "PulseAudio Sound server is running" msgstr "El servidor PulseAudio está funcionando" #: ../tcosmonitor/extensions/info.py:408 msgid "Remote Sound Mixer" msgstr "Mezclador de sonido remoto" #: ../tcosmonitor/extensions/info.py:480 msgid "PulseAudio Control" msgstr "Control de PulseAudio" #: ../tcosmonitor/extensions/info.py:485 msgid "PulseAudio Meter" msgstr "Niveles de PulseAudio " #: ../tcosmonitor/extensions/info.py:490 msgid "PulseAudio Manager" msgstr "Gestor de PulseAudio" #: ../tcosmonitor/extensions/info.py:494 msgid "PulseAudio utils: " msgstr "Utilidades de PulseAudio: " #: ../tcosmonitor/extensions/info.py:500 msgid "PulseAudio stats" msgstr "Estadísticas de PulseAudio: " #: ../tcosmonitor/extensions/info.py:512 msgid "Currently in use" msgstr "Actualmente en uso" #: ../tcosmonitor/extensions/info.py:513 msgid "Allocated during whole lifetime" msgstr "Asignado durante ejecución" #: ../tcosmonitor/extensions/info.py:514 msgid "Sample cache size" msgstr "Tamaño de la caché" #: ../tcosmonitor/extensions/info.py:515 msgid "User name" msgstr "Nombre de usuario" #: ../tcosmonitor/extensions/info.py:516 msgid "Host Name" msgstr "Nombre del equipo" #: ../tcosmonitor/extensions/info.py:517 msgid "Server Name" msgstr "Nombre del servidor" #: ../tcosmonitor/extensions/info.py:518 msgid "Server Version" msgstr "Versión del servidor pulseaudio" #: ../tcosmonitor/extensions/info.py:519 msgid "Default Sample Specification" msgstr "Especificación de la muestra" #: ../tcosmonitor/extensions/info.py:520 msgid "Default Sink" msgstr "Salida de audio por defecto" #: ../tcosmonitor/extensions/info.py:521 msgid "Default Source" msgstr "Entrada de audio por defecto" #: ../tcosmonitor/extensions/info.py:522 msgid "Cookie" msgstr "Cookie" #: ../tcosmonitor/extensions/info.py:528 msgid "Sound server is not running" msgstr "El servidor PulseAudio no está funcionando" #: ../tcosmonitor/extensions/info.py:589 ../tcosmonitor/extensions/info.py:597 #: ../tcosmonitor/extensions/info.py:605 msgid "PulseAudio apps need /dev/shm." msgstr "PulseAudio necesita /dev/shm" #: ../tcosmonitor/extensions/logout.py:48 #: ../tcosmonitor/extensions/logout.py:71 msgid "User not logged" msgstr "Usuario no conectado" #: ../tcosmonitor/extensions/logout.py:51 #, python-format msgid "Do you want to logout user: %s?" msgstr "¿Quiere desconectar al usuario \"%s\"?" #: ../tcosmonitor/extensions/logout.py:55 #: ../tcosmonitor/extensions/logout.py:77 #, python-format msgid "Session will close in %s seconds" msgstr "La sesión se cerrará en %s segundos" #: ../tcosmonitor/extensions/logout.py:73 #, python-format msgid "Do you want to logout the following users: %s?" msgstr "¿Quiere desconectar a los siguientes usuarios: %s ?" #: ../tcosmonitor/extensions/reboot.py:48 #, python-format msgid "Do you want to reboot: %s?" msgstr "¿Quiere reiniciar el equipo %s ?" #: ../tcosmonitor/extensions/reboot.py:51 #: ../tcosmonitor/extensions/reboot.py:61 #, python-format msgid "Pc will reboot in %s seconds" msgstr "El equipo se reiniciará en %s segundos" #: ../tcosmonitor/extensions/reboot.py:58 #, python-format msgid "Do you want to reboot the following clients: %s?" msgstr "¿Quiere reiniciar los siguientes equipos: %s ?" #: ../tcosmonitor/extensions/reboot.py:67 #, python-format msgid "Do you want to poweroff: %s?" msgstr "¿Quiere apagar el equipo %s?" #: ../tcosmonitor/extensions/reboot.py:70 #: ../tcosmonitor/extensions/reboot.py:80 #, python-format msgid "Pc will shutdown in %s seconds" msgstr "El equipo se apagará en %s segundos" #: ../tcosmonitor/extensions/reboot.py:77 #, python-format msgid "Do you want to poweroff the following clients: %s?" msgstr "¿Quiere apagar los siguientes equipos: %s?" #: ../tcosmonitor/extensions/tcosnetcontroller.py:50 #: ../tcosmonitor/extensions/tcosnetcontroller.py:109 msgid "Internet connection has been disabled" msgstr "El acceso a internet ha sido deshabilitado" #: ../tcosmonitor/extensions/tcosnetcontroller.py:54 msgid "Can't disable internet, user is not logged" msgstr "No se puede deshabilitar internet, el usuario no está conectado" #: ../tcosmonitor/extensions/tcosnetcontroller.py:59 #: ../tcosmonitor/extensions/tcosnetcontroller.py:85 #: ../tcosmonitor/extensions/tcosnetcontroller.py:103 #: ../tcosmonitor/extensions/tcosnetcontroller.py:147 #, python-format msgid "" "In order to lock and unlock internet you need to be in 'tcos' group.\n" "\n" "Exe by root: adduser %s tcos" msgstr "" "Para poder bloquear y desbloquear internet necesita pertenecer al grupo " "'tcos'.\n" "\n" "Ejecute como root: adduser %s tcos" #: ../tcosmonitor/extensions/tcosnetcontroller.py:77 #: ../tcosmonitor/extensions/tcosnetcontroller.py:151 msgid "Internet connection has been enabled" msgstr "El acceso a internet ha sido habilitado" #: ../tcosmonitor/extensions/tcosnetcontroller.py:81 msgid "Can't enable internet, user is not logged" msgstr "No se puede habilitar internet, el usuario no está conectado" #: ../tcosmonitor/extensions/tcosnetcontroller.py:116 #, python-format msgid "Do you want disable internet to following users: %s?" msgstr "¿Quiere deshabilitar internet a los siguientes usuarios: %s ?" #: ../tcosmonitor/extensions/tcosnetcontroller.py:158 #, python-format msgid "Do you want enable internet to following users:%s?" msgstr "¿Quiere habilitar internet a los siguientes usuarios: %s ?" #: ../tcosmonitor/extensions/videolan.py:48 #: ../tcosmonitor/extensions/videolan.py:49 msgid "Send Audio/Video broadcast" msgstr "Difusión de audio/vídeo" #: ../tcosmonitor/extensions/videolan.py:65 #: ../tcosmonitor/extensions/videolan.py:219 msgid "Can't send video broadcast, user is not logged" msgstr "No se puede enviar la difusión de vídeo, el usuario no está conectado" #: ../tcosmonitor/extensions/videolan.py:149 #: ../tcosmonitor/extensions/videolan.py:347 #: ../tcosmonitor/extensions/videolan.py:578 #, python-format msgid "" "Not allowed white spaces in \"%s\".\n" "Please rename it." msgstr "" "No se permiten espacios en \"%s\".\n" "Por favor, renómbrelo." #: ../tcosmonitor/extensions/videolan.py:159 #: ../tcosmonitor/extensions/videolan.py:359 #: ../tcosmonitor/extensions/videolan.py:594 msgid "Waiting for start video transmission..." msgstr "Esperando arranque del modo difusión de vídeo..." #: ../tcosmonitor/extensions/videolan.py:167 #: ../tcosmonitor/extensions/videolan.py:367 #: ../tcosmonitor/extensions/videolan.py:602 #: ../tcosmonitor/extensions/vnc.py:98 ../tcosmonitor/extensions/vnc.py:407 msgid "Error while exec app" msgstr "Error cuando se ejecutaba la aplicación" #: ../tcosmonitor/extensions/videolan.py:199 #: ../tcosmonitor/extensions/videolan.py:393 #: ../tcosmonitor/extensions/videolan.py:634 msgid "Running in broadcast video transmission." msgstr "Modo difusión de vídeo activo." #: ../tcosmonitor/extensions/videolan.py:208 #: ../tcosmonitor/extensions/videolan.py:402 #, python-format msgid "" "Running in broadcast video transmission to user %(host)s. Broadcast Nº %" "(count)s" msgstr "" "Ejecutándose en modo de difusión de vídeo al cliente %(host)s. Broadcast Nº %" "(count)s" #: ../tcosmonitor/extensions/videolan.py:311 #: ../tcosmonitor/extensions/videolan.py:541 msgid "Select audio/video file.." msgstr "Seleccionar archivo de audio/vídeo..." #: ../tcosmonitor/extensions/videolan.py:314 #: ../tcosmonitor/extensions/videolan.py:544 msgid "Play DVD" msgstr "Reproducir DVD" #: ../tcosmonitor/extensions/videolan.py:315 #: ../tcosmonitor/extensions/videolan.py:545 msgid "Play SVCD/VCD" msgstr "Reproducir SVCD/VCD" #: ../tcosmonitor/extensions/videolan.py:316 #: ../tcosmonitor/extensions/videolan.py:546 msgid "Play AudioCD" msgstr "Reproducir AudioCD" #: ../tcosmonitor/extensions/videolan.py:361 #: ../tcosmonitor/extensions/videolan.py:596 msgid "" "First select the DVD chapter or play movie\n" "then press enter to send clients..." msgstr "" "Primero seleccione el capítulo del DVD o reproduzca el vídeo\n" "después, presione «enter» para enviarlo a los clientes..." #: ../tcosmonitor/extensions/videolan.py:370 msgid "Lock keyboard and mouse on client?" msgstr "¿Bloquear teclado y ratón del cliente?" #: ../tcosmonitor/extensions/videolan.py:444 msgid "Video broadcast stopped." msgstr "Difusión de vídeo parada." #: ../tcosmonitor/extensions/videolan.py:605 msgid "Lock keyboard and mouse on clients?" msgstr "¿Bloquear teclado y ratón en los clientes?" #: ../tcosmonitor/extensions/videolan.py:643 #, python-format msgid "Running in broadcast video transmission. Broadcast Nº %s" msgstr "Ejecutándose en modo difusión de vídeo. Broadcast Nº %s" #: ../tcosmonitor/extensions/restartxorg.py:51 #, python-format msgid "Restart X session of %s with new config?" msgstr "¿Reiniciar sesión X de %s con la nueva configuración?" #: ../tcosmonitor/extensions/restartxorg.py:64 #, python-format msgid "%s is not supported to restart Xorg!" msgstr "¡%s no permite reiniciar Xorg!" #: ../tcosmonitor/extensions/restartxorg.py:78 msgid "No thin clients found." msgstr "No se encontraron clientes ligeros." #: ../tcosmonitor/extensions/restartxorg.py:81 #, python-format msgid "Do you want to restart X screens (only thin clients):%s?" msgstr "" "¿Quiere reiniciar las sesiones X de los siguientes equipos (sólo clientes " "ligeros): %s?" #: ../tcosmonitor/extensions/italc.py:51 ../tcosmonitor/extensions/vnc.py:135 msgid "No user logged." msgstr "Usuario no conectado." #: ../tcosmonitor/extensions/italc.py:75 msgid "Can't start IVS, please add iTALC support" msgstr "No se puede arrancar el proceso IVS. Añada soporte para iTALC" #: ../tcosmonitor/extensions/tcospersonalize.py:54 #, python-format msgid "%s is not supported to personalize!" msgstr "¡%s no está soportado para personalizar!" #: ../tcosmonitor/extensions/vnc.py:71 #, python-format msgid "Do you want to start demo mode the following users: %s?" msgstr "¿Quiere iniciar modo demostración a los siguientes usuarios: %s ?" #: ../tcosmonitor/extensions/vnc.py:83 msgid "Waiting for start demo mode..." msgstr "Esperando al arranque del modo demostración..." #: ../tcosmonitor/extensions/vnc.py:116 ../tcosmonitor/extensions/vnc.py:426 #, python-format msgid "Running in demo mode with %s clients." msgstr "Ejecutándose en modo demostración con %s equipos." #: ../tcosmonitor/extensions/vnc.py:127 #, python-format msgid "Running in demo mode from server. Demo Nº %s" msgstr "" "Ejecutándose en modo demostración desde el servidor. Demostración Nº %s" #: ../tcosmonitor/extensions/vnc.py:149 ../tcosmonitor/extensions/vnc.py:369 #, python-format msgid "Connecting with %s to start VNC support" msgstr "Conectando a %s para arrancar soporte VNC" #: ../tcosmonitor/extensions/vnc.py:178 #, python-format msgid "" "Can't start VNC, error:\n" "%s" msgstr "" "No se pudo arrancar VNC, error:\n" "%s" #: ../tcosmonitor/extensions/vnc.py:182 msgid "Waiting for start of VNC server..." msgstr "Esperando a que comience el servidor VNC..." #: ../tcosmonitor/extensions/vnc.py:211 msgid "Can't start VNC, please add X11VNC support" msgstr "No se pudo arrancar VNC, por favor añada soporte para X11VNC." #: ../tcosmonitor/extensions/vnc.py:237 msgid "Switch to view only" msgstr "Cambiar a sólo ver" #: ../tcosmonitor/extensions/vnc.py:242 ../tcosmonitor/extensions/vnc.py:273 msgid "Switch to full control" msgstr "Activar control remoto" #: ../tcosmonitor/extensions/vnc.py:269 #, python-format msgid "VNC host %s" msgstr "Equipo VNC %s" #: ../tcosmonitor/extensions/vnc.py:281 msgid "Switch to fullscreen" msgstr "Pantalla completa" #: ../tcosmonitor/extensions/vnc.py:290 #: ../tcosmonitor/extensions/livevnc.py:72 #: ../tcosmonitor/TcosPreferences.py:539 ../tcosmonitor/TcosExtensions.py:338 msgid "Stop" msgstr "Parar" #: ../tcosmonitor/extensions/vnc.py:342 msgid "Can't start demo mode, user is not logged" msgstr "" "No se pudo arrancar modo demostración,\n" "el usuario no está conectado" #: ../tcosmonitor/extensions/vnc.py:345 #, python-format msgid "Do you want demo mode from user %s?" msgstr "¿Quiere iniciar el modo demostración desde el cliente %s?" #: ../tcosmonitor/extensions/vnc.py:392 #, python-format msgid "Waiting for start demo mode from user %s..." msgstr "Esperando al arranque del modo demostración desde el cliente %s..." #: ../tcosmonitor/extensions/vnc.py:446 #, python-format msgid "Running in demo mode from user %(host)s. Demo Nº %(count)s" msgstr "" "Ejecutándose en modo demostración desde el cliente %(host)s. Demostración Nº " "%(count)s" #: ../tcosmonitor/extensions/vnc.py:501 msgid "Demo mode off." msgstr "Modo demostración desactivado." #: ../tcosmonitor/extensions/wakeonlan.py:50 #: ../tcosmonitor/extensions/wakeonlan.py:75 msgid "" "Wake On Lan only works with static list.\n" "\n" "Enable scan method \"static\" in Preferences\n" "and (wake on lan) support in bios of clients." msgstr "" "Arrancar por red sólo funciona con lista estática.\n" "\n" "Activar método escaneo \"static\" en Preferencias\n" "y soporte (wake on lan) en la configuración bios de los clientes." #: ../tcosmonitor/extensions/wakeonlan.py:54 #, python-format msgid "Do you want boot %s client?" msgstr "¿Quiere arrancar el cliente %s ?" #: ../tcosmonitor/extensions/wakeonlan.py:67 #: ../tcosmonitor/extensions/wakeonlan.py:91 #, python-format msgid "No register MAC address for ip: \"%s\"" msgstr "Dirección MAC no registrada para la IP: \"%s\"" #: ../tcosmonitor/extensions/wakeonlan.py:71 #: ../tcosmonitor/extensions/wakeonlan.py:98 #, python-format msgid "Not valid MAC address: \"%s\"" msgstr "Dirección MAC no válida: \"%s\"" #: ../tcosmonitor/extensions/wakeonlan.py:79 msgid "Do you want boot all clients?" msgstr "¿Quiere arrancar todos los clientes?" #: ../tcosmonitor/extensions/livevnc.py:76 msgid "Live view of all hosts" msgstr "Ver en directo todos los equipos" #: ../tcosmonitor/extensions/livevnc.py:194 msgid "Running in LiveView mode" msgstr "Ejecutándose en modo LiveView" #: ../tcosmonitor/extensions/viewproc.py:48 msgid "Can't show runnings apps, user is not logged" msgstr "" "No se pueden ver las aplicaciones ejecutadas,\n" "el usuario no está conectado." #: ../tcosmonitor/extensions/viewproc.py:58 msgid "User not connected, no processes." msgstr "Usuario no conectado, no existen procesos." #: ../tcosmonitor/extensions/viewproc.py:76 #, python-format msgid "Running processes for user \"%s\": " msgstr "Procesos ejecutados por el usuario \"%s\":" #: ../tcosmonitor/extensions/viewproc.py:80 msgid "" "ALERT: There are some system process hidden. Enable it in Preferences dialog." msgstr "" "AVISO: Hay varios procesos del sistema ocultos. Puede activarlos en la " "ventana de Preferencias." #: ../tcosmonitor/extensions/viewproc.py:85 msgid "Pid" msgstr "Pid" #: ../tcosmonitor/extensions/viewproc.py:86 msgid "Process command" msgstr "Comando del proceso" #: ../tcosmonitor/extensions/viewproc.py:91 msgid "Kill this process" msgstr "Matar este proceso" #: ../tcosmonitor/extensions/viewproc.py:127 msgid "Are you sure you want to stop this process?" msgstr "¿Está seguro que quiere parar este proceso?" #: ../tcosmonitor/extensions/viewproc.py:136 #, python-format msgid "" "Error while killing app:\n" "Reason: %s" msgstr "" "Error cuando se cerraba aplicación:\n" "Razón: %s" #: ../tcosmonitor/extensions/audiortp.py:49 #: ../ui/tcosmonitor-mainwindow.ui:163 msgid "Send audio conference" msgstr "Enviar conferencia de audio" #: ../tcosmonitor/extensions/audiortp.py:50 #: ../ui/tcosmonitor-prefwindow.ui:1507 msgid "Audio chat conference" msgstr "Audio chat conferencia" #: ../tcosmonitor/extensions/audiortp.py:51 #: ../ui/tcosmonitor-mainwindow.ui:275 msgid "Audio chat list" msgstr "Lista de audio chat" #: ../tcosmonitor/extensions/audiortp.py:52 msgid "Send audio conference (from this host)" msgstr "Enviar audio conferencia (desde este equipo)" #: ../tcosmonitor/extensions/audiortp.py:73 msgid "Emission" msgstr "Emisión" #: ../tcosmonitor/extensions/audiortp.py:79 msgid "State" msgstr "Estado" #: ../tcosmonitor/extensions/audiortp.py:83 msgid "Channel" msgstr "Canal" #: ../tcosmonitor/extensions/audiortp.py:235 #: ../tcosmonitor/extensions/audiortp.py:322 #: ../tcosmonitor/extensions/audiortp.py:413 msgid "" "Your pulseaudio server is too old.\n" "Is required pulseaudio version >= 0.9.10" msgstr "" "Su servidor de pulseaudio es antiguo.\n" "Se requiere una versión de pulseaudio >= 0.9.10" #: ../tcosmonitor/extensions/audiortp.py:238 #, python-format msgid "Do you want to start audio conference to the following users: %s?" msgstr "¿Quiere iniciar conferencia de audio a los siguientes usuarios: %s ?" #: ../tcosmonitor/extensions/audiortp.py:243 msgid "You have entered in audio conference" msgstr "Ha entrado en conferencia de audio" #: ../tcosmonitor/extensions/audiortp.py:267 msgid "Waiting for start audio conference..." msgstr "Esperando al arranque de la conferencia de audio..." #: ../tcosmonitor/extensions/audiortp.py:295 #: ../tcosmonitor/extensions/audiortp.py:390 #, python-format msgid "Running in audio conference with %s clients." msgstr "Ejecutándose en conferencia de audio con %s clientes." #: ../tcosmonitor/extensions/audiortp.py:305 #, python-format msgid "Running in audio conference from server. Conference Nº %s" msgstr "" "Ejecutándose en conferencia de audio desde el servidor. Conferencia Nº %s" #: ../tcosmonitor/extensions/audiortp.py:316 msgid "Can't start conference mode, user is not logged" msgstr "" "No se pudo arrancar el modo conferencia,\n" "el usuario no está conectado" #: ../tcosmonitor/extensions/audiortp.py:325 #, python-format msgid "Do you want audio conference from user %s?" msgstr "¿Quiere iniciar conferencia de audio desde el cliente %s?" #: ../tcosmonitor/extensions/audiortp.py:331 #, python-format msgid "You have entered in audio conference from user %s" msgstr "Ha entrado en conferencia de audio desde el cliente %s" #: ../tcosmonitor/extensions/audiortp.py:359 #, python-format msgid "Waiting for start audio conference from user %s..." msgstr "" "Esperando al arranque de la conferencia de audio desde el cliente %s..." #: ../tcosmonitor/extensions/audiortp.py:400 #, python-format msgid "Running in audio conference from user %(host)s. Conference Nº %(count)s" msgstr "" "Ejecutándose en conferencia de audio desde el cliente %(host)s. Conferencia " "Nº %(count)s" #: ../tcosmonitor/extensions/audiortp.py:416 #, python-format msgid "Do you want to start audio chat conference to the following users: %s?" msgstr "" "¿Quiere iniciar conferencia de audio chat a los siguientes usuarios: %s ?" #: ../tcosmonitor/extensions/audiortp.py:421 #, python-format msgid "You have entered in audio chat conference. Participants: %s" msgstr "Ha entrado en conferencia de audio chat. Participantes: %s" #: ../tcosmonitor/extensions/audiortp.py:443 msgid "Waiting for start audio chat conference..." msgstr "Esperando al arranque de la conferencia de audio chat..." #: ../tcosmonitor/extensions/audiortp.py:449 msgid "Do you want to connect to this audio chat conference now?" msgstr "¿Quiere conectarse ahora a ésta conferencia de audio chat?" #: ../tcosmonitor/extensions/audiortp.py:483 #, python-format msgid "Running in audio chat conference with %s clients." msgstr "Ejecutándose en conferencia de audio chat con %s clientes." #: ../tcosmonitor/extensions/audiortp.py:495 #, python-format msgid "Running in audio chat conference. Conference Nº %s" msgstr "Ejecutándose en conferencia de audio chat. Conferencia Nº %s" #: ../tcosmonitor/extensions/audiortp.py:521 msgid "Conference mode off." msgstr "Modo conferencia desactivado." #: ../tcosmonitor/extensions/audiortp.py:540 msgid "Audio chat conference off." msgstr "Audio chat conferencia apagada." #: ../tcosmonitor/TcosXmlRpc.py:85 msgid "" "Username or password are empty,\n" "please edit in preferences dialog!" msgstr "" "El usuario o la contraseña están vacíos,\n" "por favor, verifique el dialogo de preferencias" #: ../tcosmonitor/TcosIconView.py:55 msgid "Place mouse on any computer to see brief info about it." msgstr "" "Pase el ratón por encima de cada equipo para obtener una descripción mas " "detallada." #: ../tcosmonitor/TcosListView.py:82 msgid "Active" msgstr "Activo" #: ../tcosmonitor/TcosListView.py:92 msgid "Screen Blocked" msgstr "Bloqueado" #: ../tcosmonitor/TcosListView.py:97 msgid "Num of process" msgstr "Núm. de procesos" #: ../tcosmonitor/TcosListView.py:112 msgid "Sel" msgstr "Sel" #: ../tcosmonitor/TcosListView.py:148 #, python-format msgid "Error connecting to tcosxmlrpc in %s" msgstr "Error conectando a tcosxmlrpc en %s" #: ../tcosmonitor/TcosTrayIcon2.py:154 #, python-format msgid "Floppy: %s" msgstr "Disquete: %s" #: ../tcosmonitor/TcosTrayIcon2.py:156 #, python-format msgid "CDROM: %s" msgstr "CDROM: %s" #: ../tcosmonitor/TcosTrayIcon2.py:158 #, python-format msgid "USB: %s" msgstr "USB: %s" #: ../tcosmonitor/TcosTrayIcon2.py:160 #, python-format msgid "HDD partition: %s" msgstr "Partición: %s" #: ../tcosmonitor/TcosTrayIcon2.py:162 #, python-format msgid "Unknow: %s" msgstr "Desconocido: %s" #: ../tcosmonitor/Initialize.py:217 msgid "GPL-2 license file not found" msgstr "El archivo de licencia GPL-2 no se ha encontrado" #: ../tcosmonitor/LocalData.py:212 #, python-format msgid "Selected network inteface (%s) don't have IP address" msgstr "El interfaz de red seleccionado (%s) no tiene dirección IP" #: ../tcosmonitor/LocalData.py:260 ../tcosmonitor/ping.py:108 #: ../tcosmonitor/ping.py:171 msgid "Testing if found clients have 8998 or 8999 port open..." msgstr "" "Comprobando si los clientes encontrados tienen el puerto 8998 o 8999 " "abierto..." #: ../tcosmonitor/LocalData.py:282 msgid "" "Static list method configured but no hosts in list.\n" "\n" "Please, open preferences, click on 'Open Static Host list' and add some " "hosts." msgstr "" "Está seleccionado el método lista estática de equipos pero\n" "no hay equipos configurados.\n" "\n" "Por favor, abra las preferencias, pulse en 'Lista de equipos' y añada alguno." #: ../tcosmonitor/TcosPreferences.py:264 msgid "" "You have select more than 5 button menus.\n" "Only allowed to select a maximum of 5 buttons." msgstr "" "Ha seleccionado más de 5 botones de menus.\n" "Sólo está permitido seleccionar máximo 5 botones." #: ../tcosmonitor/TcosPreferences.py:275 msgid "New settings saved." msgstr "Configuración guardada." #: ../tcosmonitor/TcosMenus.py:102 ../tcosmonitor/TcosMenus.py:114 #, python-format msgid "Actions for %s" msgstr "Acciones para %s" #: ../tcosmonitor/TcosMenus.py:107 msgid "Actions for selected host" msgstr "Acciones para el equipo seleccionado" #: ../tcosmonitor/TcosMenus.py:168 ../tcosmonitor/TcosMenus.py:299 #, python-format msgid "%d hidden actions" msgstr "%d acciones ocultas" #: ../tcosmonitor/TcosMenus.py:243 ../tcosmonitor/TcosMenus.py:245 msgid "Actions for selected hosts" msgstr "Acciones para los equipos seleccionados" #: ../tcosmonitor/TcosMenus.py:247 msgid "Actions for all hosts" msgstr "Acciones para todos los equipos" #: ../tcosmonitor/TcosMenus.py:304 msgid "Save hosts positions" msgstr "Guardar posiciones de los equipos" #: ../tcosmonitor/TcosMenus.py:312 msgid "Reset hosts positions" msgstr "Resetear posiciones de los equipos" #: ../tcosmonitor/ping.py:80 #, python-format msgid "Ping to %s..." msgstr "Haciendo ping a %s..." #: ../tcosmonitor/ping.py:89 msgid "Waiting for pings..." msgstr "Esperando a los pings..." #: ../tcosmonitor/ping.py:127 ../tcosmonitor/ping.py:192 #: ../tcosmonitor/TcosActions.py:185 ../tcosmonitor/TcosActions.py:264 msgid "Not connected hosts found." msgstr "No se encontraron equipos conectados." #: ../tcosmonitor/ping.py:134 ../tcosmonitor/ping.py:197 #: ../tcosmonitor/TcosActions.py:187 ../tcosmonitor/TcosActions.py:259 #, python-format msgid "Found %d hosts" msgstr "Encontrados %d equipos" #: ../tcosmonitor/TcosActions.py:162 ../tcosmonitor/TcosActions.py:241 msgid "Searching for connected hosts..." msgstr "Buscando equipos conectados..." #: ../tcosmonitor/TcosActions.py:1019 msgid "Searching info of hosts..." msgstr "Buscando información de equipos..." #: ../tcosmonitor/TcosActions.py:1058 #, python-format msgid "Connecting to %s..." msgstr "Conectando a %s..." #: ../tcosmonitor/TcosExtensions.py:41 msgid "Exception:" msgstr "Excepción:" #: ../tcosmonitor/TcosExtensions.py:77 msgid "Error: no IP!" msgstr "Error: No se ha indicado dirección IP." #: ../tcosmonitor/TcosExtensions.py:154 msgid "No clients connected, press refresh button." msgstr "No se encontraron clientes, pulse el botón actualizar." #: ../tcosmonitor/TcosExtensions.py:251 ../tcosmonitor/TcosExtensions.py:253 #, python-format msgid "Can't exec this action at '%s' because you are connected at this host!" msgstr "" "No se puede ejecutar esta acción para '%s' porque está conectado desde él." #: ../tcosmonitor/TcosExtensions.py:267 #, python-format msgid "Doing action \"%(action)s\" in %(ip)s..." msgstr "Realizando acción \"%(action)s\" en equipo %(ip)s..." #: ../tcosmonitor/TcosExtensions.py:285 #, python-format msgid "Done action \"%(action)s\" in %(ip)s" msgstr "Acción \"%(action)s\" terminada en %(ip)s" #: ../tcosmonitor/TcosCommon.py:89 #, python-format msgid "" "ThreadController: Found error executing %(cmd)s\n" "\n" "If problem persist, disable Thread Controller\n" "in Preferences and report bug.\n" "Error=%(error)s" msgstr "" "ThreadController: Se encontró un error al ejecutar %(cmd)s\n" "\n" "Si el problema persiste, desactive Thread Controller\n" "en Preferencias y reporte el bug.\n" "Error=%(error)s" #: ../ui/tcosmonitor-prefwindow.ui:35 ../ui/tcospersonalize.ui:7 #: ../ui/tcosmonitor-mainwindow.ui:36 msgid "Preferences" msgstr "Preferencias" #: ../ui/tcosmonitor-prefwindow.ui:62 msgid "Show host list on startup" msgstr "Mostrar lista de equipos al arranque" #: ../ui/tcosmonitor-prefwindow.ui:80 msgid "Scan network method" msgstr "Método de escaneo de equipos" #: ../ui/tcosmonitor-prefwindow.ui:91 msgid "" "Network interface\n" "(thin client)" msgstr "" "Interface de red\n" "(clientes ligeros)" #: ../ui/tcosmonitor-prefwindow.ui:127 msgid "Show system process" msgstr "Mostrar procesos del sistema" #: ../ui/tcosmonitor-prefwindow.ui:144 msgid "Don't do actions when running TcosMonitor in thin client" msgstr "No ejecutar acciones cuando TcosMonitor se ejecute desde un terminal." #: ../ui/tcosmonitor-prefwindow.ui:163 msgid "List of hosts" msgstr "Lista de equipos" #: ../ui/tcosmonitor-prefwindow.ui:200 msgid "Open static host list" msgstr "Abrir lista fija de equipos" #: ../ui/tcosmonitor-prefwindow.ui:225 msgid "Only show hosts running tcosxmlrpc (8998 port)" msgstr "Sólo mostrar equipos con tcosmxlrpc (puerto 8998)" #: ../ui/tcosmonitor-prefwindow.ui:242 msgid "Only do all actions on selected hosts (requires restart TcosMonitor)" msgstr "" "Sólo hacer acciones para equipos seleccionados \n" "(necesita reiniciar TcosMonitor)" #: ../ui/tcosmonitor-prefwindow.ui:259 msgid "Enable SSL connections to XMLRPC clients" msgstr "Usar conexiones SSL a los clientes XMLRPC" #: ../ui/tcosmonitor-prefwindow.ui:278 msgid "Host list mode" msgstr "Modo de lista de equipos" #: ../ui/tcosmonitor-prefwindow.ui:302 msgid "Show right menu with groups (NEW)" msgstr "Mostrar menú por categorías (NUEVO)" #: ../ui/tcosmonitor-prefwindow.ui:319 msgid "Don't show thin client if TcosMonitor is running there" msgstr "No mostrar equipo si TcosMonitor se ejecuta desde el." #: ../ui/tcosmonitor-prefwindow.ui:351 msgid "Settings" msgstr "Configuración" #: ../ui/tcosmonitor-prefwindow.ui:376 msgid "Update host list every (seg)" msgstr "Actualizar interfaz cada (seg)" #: ../ui/tcosmonitor-prefwindow.ui:389 msgid "" "Update host list every selected seconds.\n" "\n" "Value=0 disable update." msgstr "" "Actualizar lista de equipos cada número\n" "de segundos seleccionado.\n" "\n" "Valor=0 deshabilitar actualización." #: ../ui/tcosmonitor-prefwindow.ui:405 msgid "Cache timeout (seg)" msgstr "Tiempo de vida de la cache (seg)" #: ../ui/tcosmonitor-prefwindow.ui:419 msgid "" "Cache some data and connection status during selected seconds.\n" "\n" "Value=0 disable cache." msgstr "" "Cachear datos y estado de conexiones durante el número\n" "de segundos seleccionado.\n" "\n" "Valor=0 deshabilitar cache." #: ../ui/tcosmonitor-prefwindow.ui:437 msgid "Screenshot size:" msgstr "Tamaño de captura de pantalla" #: ../ui/tcosmonitor-prefwindow.ui:450 ../ui/tcosmonitor-prefwindow.ui:479 msgid "% Size of screnshot." msgstr "%s de tamaño de captura de pantalla" #: ../ui/tcosmonitor-prefwindow.ui:466 msgid "Mini screenshot size:" msgstr "Tamaño de mini capturas de pantalla" #: ../ui/tcosmonitor-prefwindow.ui:495 msgid "Timeout actions (seg)" msgstr "Tiempo de espera para acciones (seg)" #: ../ui/tcosmonitor-prefwindow.ui:508 msgid "" "Timeout in seg for actions\n" "\n" "Value=0 default" msgstr "" "Tiempo de espera para acciones\n" "\n" "por defecto 0" #: ../ui/tcosmonitor-prefwindow.ui:526 msgid "SSH remote username" msgstr "Usuario remoto SSH" #: ../ui/tcosmonitor-prefwindow.ui:553 msgid "VLC method to send" msgstr "VLC método de envio" #: ../ui/tcosmonitor-prefwindow.ui:578 msgid "" "Experimental: Thread Controller\n" "( if you have problems, disable it )" msgstr "" "Experimental: Control de Threads\n" "( Si tiene problemas, desactivelo )" #: ../ui/tcosmonitor-prefwindow.ui:591 msgid "Actions controlled" msgstr "Acciones controladas" #: ../ui/tcosmonitor-prefwindow.ui:611 msgid "Block ports: (80,8080... etc)" msgstr "Bloquear puertos: (80,8080... etc)" #: ../ui/tcosmonitor-prefwindow.ui:653 ../ui/tcospersonalize.ui:333 msgid "Advanced" msgstr "Avanzado" #: ../ui/tcosmonitor-prefwindow.ui:680 msgid "TcosXmlRpc username" msgstr "Usuario TcosXmlRpc" #: ../ui/tcosmonitor-prefwindow.ui:706 msgid "TcosXmlRpc password" msgstr "Contraseña TcosXmlRpc" #: ../ui/tcosmonitor-prefwindow.ui:735 msgid "" "NOTE:\n" "Default user is root and default password is root.\n" "\n" "For thin clients change TCOS_ROOT_PASSWD or use TcosConfig and " "regenerate boot images again.\n" "\n" "For standalone users you can use a system account (root) but this is " "not recomended. Install tcos-standalone and start it by root. Set user and " "password, this will create a /etc/tcospasswd file only used by TCOS " "and your root acount will be secure." msgstr "" "NOTA:\n" "El usuario por defecto es root y la contraseña es root.\n" "\n" "Para terminales ligeros puedes modificar TCOS_ROOT_PASSWD o usar " "TcosConfig yregenerar las imágenes de arranque de nuevo.\n" "\n" "Para equipos autónomos(standalone) puedes usar la cuenta del sistema " "(root) pero esto no es recomandable. Instala el paquete tcos-standalone " "ejecútalo como administrador y configura un usuario y una cuenta.La " "contraseña se guardará en /etc/tcospasswd, archivo que sólo lo " "necesita TCOS por lo que tu cuenta de root estará a salvo." #: ../ui/tcosmonitor-prefwindow.ui:772 msgid "Authentication " msgstr "Autenticación" #: ../ui/tcosmonitor-prefwindow.ui:795 msgid "Info avalaible from tcosxmlrpc" msgstr "Información disponible de tcosxmlrpc" #: ../ui/tcosmonitor-prefwindow.ui:806 msgid "Tcos general info" msgstr "Información general de Tcos" #: ../ui/tcosmonitor-prefwindow.ui:821 msgid "Cpu info" msgstr "Información de la CPU" #: ../ui/tcosmonitor-prefwindow.ui:836 msgid "Kernel and modules info" msgstr "Información del kernel y módulos" #: ../ui/tcosmonitor-prefwindow.ui:851 msgid "PCI bus info" msgstr "Información bus PCI" #: ../ui/tcosmonitor-prefwindow.ui:866 msgid "Ram and swap info" msgstr "Información de la RAM y SWAP" #: ../ui/tcosmonitor-prefwindow.ui:881 msgid "Process info" msgstr "Información de procesos" #: ../ui/tcosmonitor-prefwindow.ui:896 msgid "Network info" msgstr "Información de la red" #: ../ui/tcosmonitor-prefwindow.ui:926 msgid "Sound server info" msgstr "Información del servidor de sonido" #: ../ui/tcosmonitor-prefwindow.ui:962 msgid "Avalaible info" msgstr "Información disponible" #: ../ui/tcosmonitor-prefwindow.ui:985 msgid "Show / hide menu items" msgstr "Mostrar / ocultar menús de la aplicación" #: ../ui/tcosmonitor-prefwindow.ui:1003 msgid "Lock and unlock screen" msgstr "Bloquear y desbloquear pantallas" #: ../ui/tcosmonitor-prefwindow.ui:1019 msgid "Remote SSH shell" msgstr "Consola SSH remota" #: ../ui/tcosmonitor-prefwindow.ui:1037 msgid "Configure Xorg settings" msgstr "Configurar Xorg" #: ../ui/tcosmonitor-prefwindow.ui:1066 ../ui/tcosmonitor-prefwindow.ui:1427 msgid "Exe app on user display" msgstr "Ejecutar aplicaciones" #: ../ui/tcosmonitor-prefwindow.ui:1082 ../ui/tcosmonitor-prefwindow.ui:1441 msgid "Send a text message" msgstr "Enviar un mensaje de texto" #: ../ui/tcosmonitor-prefwindow.ui:1100 msgid "Show running apps" msgstr "Ver aplicaciones ejecutadas" #: ../ui/tcosmonitor-prefwindow.ui:1116 ../ui/tcosmonitor-prefwindow.ui:1457 msgid "Send video broadcast" msgstr "Enviar audio/vídeo" #: ../ui/tcosmonitor-prefwindow.ui:1150 msgid "Demo mode" msgstr "Modo demostración" #: ../ui/tcosmonitor-prefwindow.ui:1179 msgid "Wake on LAN" msgstr "Wake on LAN" #: ../ui/tcosmonitor-prefwindow.ui:1195 msgid "Audio conference mode" msgstr "Modo audio conferencia" #: ../ui/tcosmonitor-prefwindow.ui:1213 msgid "Screenshots" msgstr "Capturas de pantalla" #: ../ui/tcosmonitor-prefwindow.ui:1229 msgid "Reboot and poweroff" msgstr "Apagar y reiniciar" #: ../ui/tcosmonitor-prefwindow.ui:1243 msgid "Lock and unlock internet" msgstr "Bloquear y desbloquear internet" #: ../ui/tcosmonitor-prefwindow.ui:1259 msgid "DPMS monitor on/off" msgstr "DPMS control energía monitores" #: ../ui/tcosmonitor-prefwindow.ui:1277 msgid "Connect using VNC" msgstr "Conectar usando VNC" #: ../ui/tcosmonitor-prefwindow.ui:1293 msgid "Connect using iTALC" msgstr "Conectar usando iTALC" #: ../ui/tcosmonitor-prefwindow.ui:1308 msgid "Restart session with new settings" msgstr "Reiniciar con la nueva configuración" #: ../ui/tcosmonitor-prefwindow.ui:1385 msgid "Menus" msgstr "Menús" #: ../ui/tcosmonitor-prefwindow.ui:1408 msgid "Show / hide menu buttons" msgstr "Mostrar / ocultar botones de menús" #: ../ui/tcosmonitor-prefwindow.ui:1491 msgid "Audio conference" msgstr "Audio conferencia" #: ../ui/tcosmonitor-prefwindow.ui:1525 msgid "Audio Chat control" msgstr "Control de audio chat" #: ../ui/tcosmonitor-prefwindow.ui:1569 msgid "Menu buttons" msgstr "Botones de menús" #: ../ui/tcosmonitor-abouttcos.ui:6 msgid "About TCOS" msgstr "Acerca de TCOS" #: ../ui/tcosmonitor-abouttcos.ui:19 msgid "TcosMonitor" msgstr "TcosMonitor" #: ../ui/tcosmonitor-abouttcos.ui:62 msgid "Version:" msgstr "Versión:" #: ../ui/tcosmonitor-abouttcos.ui:90 msgid "" "Thin client and standalone\n" "monitoring tool." msgstr "" "Herramienta de monitorización\n" "de clientes ligeros e instalados." #: ../ui/tcosmonitor-abouttcos.ui:131 msgid "Project web site" msgstr "Página web del proyecto" #: ../ui/tcosmonitor-abouttcos.ui:178 msgid "About" msgstr "Acerca de" #: ../ui/tcosmonitor-abouttcos.ui:212 msgid "License" msgstr "Licencia" #: ../ui/tcosmonitor-abouttcos.ui:230 msgid "" "Main developers:\n" " * Mario Izquierdo \n" " * Ignacio Vidal \n" "\n" "Contributors:\n" " * Andrés Jimenez\n" " * Quirón\n" "\n" "Special thanks to:\n" " Comunidad de Madrid, MaX group (Spain)" msgstr "" "Desarrolladores principales:\n" " * Mario Izquierdo \n" " * Ignacio Vidal \n" "\n" "Han contribuido:\n" " * Andrés Jimenez\n" " * Quirón\n" "\n" "Muy en especial gracias a:\n" " Comunidad de Madrid, grupo MaX (España)" #: ../ui/tcosmonitor-abouttcos.ui:259 msgid "Authors" msgstr "Autores" #: ../ui/tcosmonitor-abouttcos.ui:275 msgid "Translated to your language by:" msgstr "Traducido a su idioma por:" #: ../ui/tcosmonitor-abouttcos.ui:287 msgid "Mario Izquierdo " msgstr "Mario Izquierdo " #: ../ui/tcosmonitor-abouttcos.ui:307 msgid "Translators" msgstr "Traductores" #: ../ui/tcosmonitor-abouttcos.ui:324 msgid "" "TCOS is a free software project that need a lot of work to be the best thin " "client plataform.\n" "\n" "We work every day a lot of hours to make changes and support more devices " "and features.\n" "\n" "We want to continue developing this software but need your help, if you use, " "sell or hack TCOS pehaps you could donate some money to project.\n" "\n" "Click on next url to get some info." msgstr "" "TCOS es un proyecto libre que necesita mucho trabajo para intentar ser la " "mejor plataforma de clientes ligeros.\n" "\n" "Trabajamos cada día muchas horas para hacer cambios y soportar más " "dispositivos y características.\n" "\n" "Queremos continuar haciéndolo pero necesitamos tu ayuda, si usas, vendes o " "modificas TCOS, quizás puedas donar algo de dinero al proyecto.\n" "\n" "Pulsa en el enlace inferior para obtener más información." #: ../ui/tcosmonitor-abouttcos.ui:370 msgid "http://wiki.tcosproject.org/TcosProject:Site_support" msgstr "http://wiki.tcosproject.org/TcosProject:Site_support/es" #: ../ui/tcosmonitor-abouttcos.ui:392 msgid "Don't show donations message on start." msgstr "No mostrar este mensaje al inicio." #: ../ui/tcosmonitor-abouttcos.ui:415 msgid "Donate" msgstr "Donaciones" #: ../ui/tray.ui:20 msgid "TCOS devices" msgstr "Dispositivos TCOS" #: ../ui/tray.ui:57 msgid "Hide" msgstr "Ocultar" #: ../ui/tcos-volume-manager.ui:39 msgid "Restart sound" msgstr "Reiniciar sonido" #: ../ui/tcos-volume-manager.ui:54 msgid "Sound levels" msgstr "Niveles de volumen" #: ../ui/tcos-volume-manager.ui:90 msgid "Main Channels" msgstr "Canales principales" #: ../ui/tcos-volume-manager.ui:113 msgid "Secondary Channels" msgstr "Canales secundarios" #: ../ui/tcosmonitor-chatwindow.ui:8 msgid "Chat emission list" msgstr "Lista de emisión chat" #: ../ui/tcosmonitor-chatwindow.ui:17 msgid "Chat emission list" msgstr "Lista de emisión chat" #: ../ui/tcosmonitor-chatwindow.ui:80 msgid "Connect" msgstr "Conectar" #: ../ui/tcosmonitor-chatwindow.ui:128 msgid "Disconnect" msgstr "Desconectar" #: ../ui/tcosmonitor-chatwindow.ui:176 msgid "Exit" msgstr "Cerrar" #: ../ui/tcosmonitor-staticwindow.ui:8 msgid "Static hosts list" msgstr "Lista de equipos" #: ../ui/tcosmonitor-staticwindow.ui:17 msgid "Static Hosts list" msgstr "Lista de equipos" #: ../ui/tcosmonitor-staticwindow.ui:80 msgid "Add" msgstr "Añadir" #: ../ui/tcosmonitor-staticwindow.ui:128 msgid "Modify" msgstr "Modificar" #: ../ui/tcosmonitor-staticwindow.ui:176 msgid "Delete" msgstr "Borrar" #: ../ui/tcosmonitor-staticwindow.ui:225 msgid "Get from connected" msgstr "Tomar desde conectados" #: ../ui/tcosmonitor-staticwindow.ui:292 ../ui/tcosmonitor-mainwindow.ui:771 #: ../ui/tcosmonitor-staticwindownew.ui:150 msgid "Cancel" msgstr "Cancelar" #: ../ui/tcosmonitor-staticwindow.ui:340 #: ../ui/tcosmonitor-staticwindownew.ui:198 msgid "Save" msgstr "Guardar" #: ../ui/tcospersonalize.ui:34 msgid "unknow host" msgstr "equipo desconocido" #: ../ui/tcospersonalize.ui:74 msgid "Disable Ctrl + Alt + Backspace (for kill Xorg)" msgstr "Deshabilitar Ctrl+Alt+Backspace (cerrar Xorg)" #: ../ui/tcospersonalize.ui:211 msgid "Get avalaible drivers" msgstr "Cargar drivers disponibles" #: ../ui/tcospersonalize.ui:248 msgid "Display Settings" msgstr "Configuración gráfica" #: ../ui/tcospersonalize.ui:351 msgid "Default boot kernel" msgstr "Kernel por defecto" #: ../ui/tcospersonalize.ui:376 msgid "PXE Boot options" msgstr "Opciones de arranque PXE" #: ../ui/tcospersonalize.ui:391 msgid "Default boot method" msgstr "Método de arranque por defecto" #: ../ui/tcospersonalize.ui:419 msgid "Command line" msgstr "Línea de arranque" #: ../ui/tcospersonalize.ui:507 msgid "Boot options" msgstr "Opciones de arranque" #: ../ui/tcospersonalize.ui:551 msgid "Delete Config" msgstr "Borrar configuración" #: ../ui/tcosmonitor-mainwindow.ui:8 msgid "TcosMonitor" msgstr "TcosMonitor" #: ../ui/tcosmonitor-mainwindow.ui:22 msgid "Exit TcosMonitor" msgstr "Salir de TcosMonitor" #: ../ui/tcosmonitor-mainwindow.ui:35 msgid "Open preferences dialog" msgstr "Abrir diálogo de preferencias" #: ../ui/tcosmonitor-mainwindow.ui:48 msgid "Update host list" msgstr "Actualizar lista de equipos" #: ../ui/tcosmonitor-mainwindow.ui:49 msgid "Refresh" msgstr "Actualizar" #: ../ui/tcosmonitor-mainwindow.ui:71 msgid "All Hosts" msgstr "Todos" #: ../ui/tcosmonitor-mainwindow.ui:99 msgid "Find" msgstr "Buscar" #: ../ui/tcosmonitor-mainwindow.ui:111 msgid "About this app" msgstr "Acerca de esta aplicación" #: ../ui/tcosmonitor-mainwindow.ui:219 msgid "Start audio chat" msgstr "Iniciar audio chat" #: ../ui/tcosmonitor-mainwindow.ui:331 msgid "Send audio/video" msgstr "Enviar audio/vídeo" #: ../ui/tcosmonitor-mainwindow.ui:443 msgid "Exe app" msgstr "Ejecutar aplicación" #: ../ui/tcosmonitor-mainwindow.ui:499 msgid "Send message" msgstr "Enviar mensaje de texto" #: ../ui/tcosmonitor-mainwindow.ui:581 msgid "List view" msgstr "Vista lista de equipos" #: ../ui/tcosmonitor-mainwindow.ui:629 msgid "Icon view" msgstr "Vista iconos" #: ../ui/tcosmonitor-mainwindow.ui:689 msgid "Simulate my classroom" msgstr "Simular aula" #: ../ui/tcosmonitor-staticwindownew.ui:8 msgid "New or edit hosts" msgstr "Nuevo o editar lista de equipos" #: ../ui/tcosmonitor-staticwindownew.ui:32 msgid "" "You can add a simple host, \n" " example: 192.168.0.100\n" "\n" "or range of hosts, \n" " example: 192.168.0.100-120\n" "\n" "MAC address is optional" msgstr "" "Puede añadir un equipo,\n" " ejemplo: 192.168.0.100\n" "\n" "o un rango, \n" " ejemplo: 192.168.0.100-120\n" "\n" "la dirección MAC es opcional" #: ../ui/tcosmonitor-staticwindownew.ui:57 msgid "IP address *" msgstr "Dirección IP *" #: ../ui/tcosmonitor-askwindow.ui:8 msgid "Question" msgstr "Pregunta" #: ../ui/tcosmonitor-askwindow.ui:50 msgid "You can drag and drop launcher file to this box" msgstr "Puedes arrastrar y soltar un lanzador a esta caja" #: ../ui/tcosmonitor-askwindow.ui:61 msgid "Run app in unknow host" msgstr "Ejecutar aplicación en equipo desconicido" #~ msgid "Lliurex Lab" #~ msgstr "Lliurex Lab" #~ msgid "" #~ "Cloning client, please wait.\n" #~ "Poweroff button has been temporaly disabled..." #~ msgstr "" #~ "Clonado cliente, por favor espere.\n" #~ "El botón de apagado se ha deshabilitado temporalmente." #~ msgid "Client successfully cloned!!. Please restart client." #~ msgstr "Cliente clonado correctamente. Por favor reinicie." #~ msgid "Cloning has failed!!" #~ msgstr "¡El clonado falló!" #~ msgid "Normal" #~ msgstr "Normal" #~ msgid "Quit from TcosMonitor" #~ msgstr "Salir de TcosMonitor" #~ msgid "Salir de Lliurex Lab" #~ msgstr "Salir de Llirex Lab" #~ msgid "Lliurex Lab" #~ msgstr "Lliurex Lab" #~ msgid "About Lliurex Lab" #~ msgstr "Acerca de Llirex Lab" #~ msgid "Clonning clients...." #~ msgstr "Clonando clientes..." #~ msgid "Open share" #~ msgstr "Abrir compartido" #~ msgid "Program mode" #~ msgstr "Modo de programa" #~ msgid "Clone clients" #~ msgstr "Clonar clientes" #~ msgid "Can't move icon, another host is near." #~ msgstr "No se puede mover el icono, hay un equipo cerca." #~ msgid "" #~ "Error getting Xorg info:\n" #~ "%s" #~ msgstr "" #~ "Error obteniendo información de Xorg:\n" #~ "%s" #~ msgid "Send my MIC audio" #~ msgstr "Enviar el sonido del micrófono" #~ msgid "Chat conference mode off." #~ msgstr "Modo conferencia chat desactivado." #~ msgid "No host found" #~ msgstr "No se han encontrado equipos" #, fuzzy #~ msgid "label4" #~ msgstr "Dispositivos TCOS" #, fuzzy #~ msgid "button1" #~ msgstr "Botones de menús" #~ msgid "Do you want to start conference mode the following users: %s?" #~ msgstr "¿Quiere iniciar modo conferencia a los siguientes usuarios: %s ?" #~ msgid "Waiting for start conference mode..." #~ msgstr "Esperando al arranque del modo conferencia..." #~ msgid "Running in conference mode with %s clients." #~ msgstr "Ejecutandose en modo conferencia con %s equipos." #~ msgid "" #~ "Running in broadcast video transmission to host %(host)s. Broadcast Nº %" #~ "(count)d" #~ msgstr "" #~ "Ejecutándose en modo de difusión de vídeo al equipo %(host)s. Broadcast " #~ "Nº %(count)d" #~ msgid "" #~ "Special characters used in \"%s\".\n" #~ "Please rename it." #~ msgstr "" #~ "Se han usado caracteres especiales en \"%s\"\n" #~ "Por favor, renómbrelo." #~ msgid "No clients selected, do you want to select all?" #~ msgstr "No se han seleccionado equipos, ¿quiere seleccionar todos?" #~ msgid "Running in broadcast video transmission" #~ msgstr "Ejecutándose el modo difusión de vídeo." #~ msgid "Conference chat mode off." #~ msgstr "Conferencia chat desactivado." #~ msgid "Can't exec this action because you are connected at this host!" #~ msgstr "" #~ "¡No se puede ejecutar esta acción porque está conectado desde ese equipo!" #~ msgid "Audio RTP" #~ msgstr "RTP de audio" #~ msgid "Can't logout, user is not logged" #~ msgstr "No se pudo desconectar al usuario, no está conectado" #~ msgid "Waiting for screenshots..." #~ msgstr "Esperando a las capturas..." #~ msgid "Work as cyber mode (not work yet)" #~ msgstr "Trabajar en modo cyber (no disponible)" #~ msgid "Extra modules" #~ msgstr "Módulos extra" #~ msgid "Kernel modules" #~ msgstr "Módulos del kernel" #~ msgid "Extra modules avalaible" #~ msgstr "Módulos extra disponibles" #~ msgid "Add X11vnc support" #~ msgstr "Añadir soporte X11vnc" #~ msgid "Add iTALC support" #~ msgstr "Añadir soporte iTALC" #~ msgid "Add FreeNX support" #~ msgstr "Añadir soporte FreeNX" #~ msgid "Addons" #~ msgstr "Añadidos" #~ msgid "Doing action %(action)s in %(timeout)s seconds" #~ msgstr "Realizando acción %(action)s en %(ip)s segundos" #~ msgid "General settings" #~ msgstr "Configuración general" #~ msgid "Advanced Settings" #~ msgstr "Configuración Avanzada" #~ msgid "" #~ "NOTE:\n" #~ "This values are needed to do some actions\n" #~ "on thin client, if you don't use \n" #~ "update-tcospasswd app, default\n" #~ "user is root and default password is root.\n" #~ "\n" #~ "To change it you have to edit /etc/tcos/tcos.conf and change\n" #~ "TCOS_ROOT_PASSWD var value. Then regenerate images with\n" #~ "gentcos or tcosconfig.\n" #~ "\n" #~ "Using TcosMonitor in PXES or LTSP networks require to use\n" #~ "update-tcospasswd script, run it as root, and follow\n" #~ "instructions. This will generate a tcospasswd file with asked data.\n" #~ msgstr "" #~ "NOTA:\n" #~ "Estos valores se necesitan para realizar ciertas acciones\n" #~ "en el cliente ligero, si no ha usado aún la aplicación\n" #~ "update-tcospasswd los valores por defecto son, \n" #~ "usuario: root contraseña:root.\n" #~ "\n" #~ "Para cambiarlos, edite el archivo /etc/tcos/tcos.conf editando\n" #~ "la variable TCOS_ROOT_PASSWD y regenere la\n" #~ "imagen de arranque con gentcos o use tcosconfig.\n" #~ "\n" #~ "Si está usando TcosMonitor en una red PXES o LTSP, necesita usar\n" #~ "el script update-tcospasswd, ejecútelo como root, y siga\n" #~ "las instrucciones. Esto generará un archivo tcospasswd con los datos " #~ "preguntados.\n" #~ msgid "" #~ "TcosMonitor need special configuration for rsync daemon.\n" #~ "\n" #~ "Please read configuration requeriments in:\n" #~ "/usr/share/doc/tcosmonitor/README.rsync" #~ msgstr "" #~ "TcosMonitor necesita una configuración especial del demonio rsync.\n" #~ "\n" #~ "Lea la configuración requerida en:\n" #~ "/usr/share/doc/tcosmonitor/README.rsync" #~ msgid "no standalone user connected" #~ msgstr "Usuario standalone no conectado." #~ msgid "VLC audio codec" #~ msgstr "Codec de audio para VLC" #~ msgid "VLC video codec" #~ msgstr "Codec de video para VLC" #~ msgid "" #~ "First create /tmp/tcos_share folder,\n" #~ "and restart rsync daemon\n" #~ "/etc/init.d/rsync restart" #~ msgstr "" #~ "Primero debe crear el directorio /tmp/tcos_share,\n" #~ "y después reiniciar el servicio rsync\n" #~ "/etc/init.d/rsync restart" #~ msgid "GNU/GPL" #~ msgstr "GNU/GPL" #~ msgid "A thin client network monitor" #~ msgstr "Un monitor de clientes ligeros" #~ msgid "translator-credits" #~ msgstr "" #~ "Mario Izquierdo (mariodebian)\n" #~ "" #~ msgid "About TCOS" #~ msgstr "Acerca de TCOS" #~ msgid "TcosMonitor web page" #~ msgstr "Página web de TcosMonitor" #~ msgid "Search for hostname, ip address or username" #~ msgstr "Buscar por nombre de equipo, dirección ip, o nombre de usuario" #~ msgid "Search" #~ msgstr "Buscar" #~ msgid "TCOS project needs your help" #~ msgstr "El proyecto TCOS necesita tu ayuda" #~ msgid "" #~ "Mounting device %(device)s in \n" #~ "%(mnt_point)s\n" #~ "Please wait..." #~ msgstr "" #~ "Montando dispositivo %(device)s en\n" #~ "%(mnt_point)s\n" #~ "Por favor, espere..." #~ msgid "Timeout" #~ msgstr "" #~ "Tiempo de \n" #~ "espera" #~ msgid "Your user isn't in fuse group, ask your system administrator." #~ msgstr "Su usuario no pertenece al grupo fuse, pregunte a su administrador." #~ msgid "Flash device mounted. Ready for use." #~ msgstr "Dispositivo flash montado.Listo para usar." #~ msgid "Flash device umounted. You can extract it." #~ msgstr "Dispositivo flash desmontado. Ahora puede extraerlo." #~ msgid "Can't mount device %s" #~ msgstr "No se pudo montar el dispositivo %s" #~ msgid "Can't umount device %s" #~ msgstr "No se pudo desmontar el dispositivo %s" #~ msgid "Umount %s remote device" #~ msgstr "Desmontar dispositivo %s remoto" #~ msgid "" #~ "Mounting device %(device)s in \n" #~ "%(mnt_point)s\n" #~ "Please wait...\n" #~ "Click on Desktop icon to secure umount." #~ msgstr "" #~ "Montando dispositivo %(device)s en\n" #~ "%(mnt_point)s\n" #~ "Por favor, espere\n" #~ "Pulse en el icono del escritorio para extracción segura." #~ msgid "Tcos Devices daemon on host %s" #~ msgstr "Gestor de dispositivos TCOS en equipo %s" #~ msgid "Tcos Devices on %s host" #~ msgstr "Gestor de dispositivos TCOS en equipo %s" #~ msgid "No support for more than one cdrom, first detected will be used" #~ msgstr "No hay soporte para más de un cdrom, se usará el primero." #~ msgid "Cdrom" #~ msgstr "Cdrom" #~ msgid "Umounting %s, please wait..." #~ msgstr "Desmontando %s, por favor, espere..." #~ msgid "Floppy status:" #~ msgstr "Estado del disquete:" #~ msgid "CDROM status:" #~ msgstr "Estado del CDROM:" #~ msgid "Mount CDROM" #~ msgstr "Montar CDROM" #~ msgid "Umount CDROM" #~ msgstr "Desmontar CDROM" #~ msgid "Do you want to restart Xorg of %s?" #~ msgstr "¿Quiere reiniciar Xorg del equipo %s?" tcosmonitor/po/pt_BR.po0000664000000000000000000024552012260544373012330 0ustar # translation of tcosmonitor. # Copyright (C) 2009 THE tcosmonitor'S COPYRIGHT HOLDER # This file is distributed under the same license as the tcosmonitor package. # <>, 2009. # , fuzzy # <>, 2009. # # msgid "" msgstr "" "Project-Id-Version: tcosmonitor 0.2.19\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-03-18 15:48+0100\n" "PO-Revision-Date: 2009-07-16 16:26-0300\n" "Last-Translator: Aécio dos Santos Pires \n" "Language-Team: Portuguese/Brazil \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../tcosmonitor.py:129 #, python-format msgid "" "The user \"%s\" must be member of the group \"tcos\" to exec tcosmonitor.\n" "\n" "If you are system administrator, add your user to tcos group." msgstr "" "O usuário \"%s\" deve ser membro do grupo \"tcos\" para executar o " "TcosMonitor.\n" "\n" "Se você é o administrador do sistema, adicione esse usuário ao grupo tcos." #: ../tcosmonitor.py:247 msgid "Send files disabled. rsync not configured." msgstr "Envio de arquivos desabilitado. O rsync.não foi configurado." #: ../tcosmonitor.py:329 ../tcospersonalize.py:562 #: ../tcos-volume-manager.py:378 msgid "Exiting" msgstr "Saindo" #: ../tcos-devices-ng.py:188 #, python-format msgid "Rebooting in %s seconds" msgstr "O terminal será reiniciado em %s segundos." #: ../tcos-devices-ng.py:190 #, python-format msgid "Shutting down in %s seconds" msgstr "O terminal será desligado em %s segundos." #: ../tcos-devices-ng.py:206 ../tcos-devices-ng.py:209 #, python-format msgid "" "ERROR during action %(action)s:\n" "%(errortxt)s" msgstr "" "Erro ao executar a ação %(action)s:\n" "%(errortxt)s" #: ../tcos-devices-ng.py:239 msgid "Tcos device daemon" msgstr "Tcos device daemon" #: ../tcos-devices-ng.py:283 ../tcos-volume-manager.py:143 #, python-format msgid "Error connecting with TcosXmlRpc in %s." msgstr "ERRO! Conectando ao TcosXmlRpc em %s segundos." #: ../tcos-devices-ng.py:314 #, python-format msgid "Cdrom device %s" msgstr "Dispositivo CD-ROM %s" #: ../tcos-devices-ng.py:317 msgid "Mount Cdrom" msgstr "Montar CD-ROM" #: ../tcos-devices-ng.py:318 msgid "Umount Cdrom" msgstr "Desmontar CD-ROM" #: ../tcos-devices-ng.py:340 #, python-format msgid "Disk partition %s" msgstr "Partição do disco %s" #: ../tcos-devices-ng.py:343 msgid "Mount disk partition" msgstr "Montar partição" #: ../tcos-devices-ng.py:344 msgid "Umount disk partition" msgstr "Desmontar partição" #: ../tcos-devices-ng.py:356 msgid "No floppy detected" msgstr "O disquete não foi detectado." #: ../tcos-devices-ng.py:368 ../tcos-devices-ng.py:674 #: ../tcos-devices-ng.py:680 ../tcos-devices-ng.py:686 msgid "Floppy" msgstr "Disquete" #: ../tcos-devices-ng.py:371 msgid "Mount Floppy" msgstr "Montar disquete" #: ../tcos-devices-ng.py:372 msgid "Umount Floppy" msgstr "Desmontar disquete" #: ../tcos-devices-ng.py:382 msgid "Floppy mounted. Ready for use." msgstr "O disquete foi montado. Agora pode usá-lo." #: ../tcos-devices-ng.py:384 msgid "Floppy umounted. You can extract it." msgstr "O disquete foi desmontado. Agora pode removê-lo." #: ../tcos-devices-ng.py:400 msgid "Hard disk partition mounted. Ready for use." msgstr "A partição foi montada. Agora pode usá-la." #: ../tcos-devices-ng.py:403 msgid "Hard disk partition umounted." msgstr "A partição foi desmontada." #: ../tcos-devices-ng.py:425 msgid "Audio cdrom mounted., you can listen music opening wav files." msgstr "" "CD-ROM com músicas montado. Agora você pode ouví-las abrindo os arquivos *." "wav." #: ../tcos-devices-ng.py:427 msgid "Cdrom mounted. Ready for use." msgstr "O CD-ROM foi montado. Agora pode usá-lo." #: ../tcos-devices-ng.py:430 msgid "Cdrom umounted. You can extract it." msgstr "O CD-ROM foi desmontado. Agora pode removê-lo." #: ../tcos-devices-ng.py:529 #, python-format msgid "" "Mounting device %s\n" "Please wait..." msgstr "" "Montando o dispositivo %s.\n" "Por favor, espere..." #: ../tcos-devices-ng.py:578 msgid "Error mounting LTSPFS, check versions of LTSPFS packages" msgstr "" "Erro ao montar o LTSPFS.\n" "Verifique as versões dos pacotes do LTSPFS." #: ../tcos-devices-ng.py:604 #, python-format msgid "" "Umounting device %s.\n" "Please wait..." msgstr "" "Desmontando o dispositivo %s.\n" "Por favor, espere..." #: ../tcos-devices-ng.py:651 msgid "usbdisk" msgstr "Disco USB" #: ../tcos-devices-ng.py:653 msgid "firewiredisk" msgstr "Disco Firewire" #: ../tcos-devices-ng.py:678 msgid "Can't mount floppy" msgstr "Não foi possível montar o disquete." #: ../tcos-devices-ng.py:689 msgid "Can't umount floppy" msgstr "Não foi possível desmontar o disquete." #: ../tcos-devices-ng.py:702 ../tcos-devices-ng.py:712 #: ../tcos-devices-ng.py:723 ../tcos-devices-ng.py:836 #: ../tcos-devices-ng.py:848 ../tcos-devices-ng.py:867 #: ../tcos-devices-ng.py:879 ../tcos-devices-ng.py:911 #, python-format msgid "Cdrom_%s" msgstr "CD-ROM_%s" #: ../tcos-devices-ng.py:710 msgid "Can't mount cdrom" msgstr "Não foi possível montar o CD-ROM." #: ../tcos-devices-ng.py:726 msgid "Can't umount cdrom" msgstr "Não foi possível desmontar o CD-ROM." #: ../tcos-devices-ng.py:742 ../tcos-devices-ng.py:752 #: ../tcos-devices-ng.py:763 #, python-format msgid "Disk_%s" msgstr "Disco_%s" #: ../tcos-devices-ng.py:750 msgid "Can't mount hard disk partition" msgstr "Não foi possível montar a partição." #: ../tcos-devices-ng.py:766 msgid "Can't umount hard disk partition" msgstr "Não foi possível desmontar a partição." #: ../tcos-devices-ng.py:807 #, python-format msgid "" "From terminal %(host)s.\n" "Connected CDROM USB device %(device)s\n" "%(vendor)s %(model)s" msgstr "" "A partir do terminal %(host)s,\n" "o dispositivo CD-ROM USB %(device)s\n" "%(vendor)s %(model)s foi conectado." #: ../tcos-devices-ng.py:811 #, python-format msgid "CDROM USB device %s" msgstr "Dispositivo CD-ROM/USB %s" #: ../tcos-devices-ng.py:814 #, python-format msgid "Mount CDROM USB device %s" msgstr "Montar o dispositivo CD-ROM/ USB %s" #: ../tcos-devices-ng.py:815 #, python-format msgid "Umount CDROM USB device %s" msgstr "Desmontar o dispositivo CD-ROM/USB %s" #: ../tcos-devices-ng.py:840 ../tcos-devices-ng.py:871 #: ../tcos-devices-ng.py:1001 ../tcos-devices-ng.py:1012 #: ../tcos-devices-ng.py:1058 ../tcos-devices-ng.py:1138 #: ../tcos-devices-ng.py:1149 ../tcos-devices-ng.py:1195 #, python-format msgid "Error, can't mount device %s" msgstr "Erro! Não foi possível montar o dispositivo %s" #: ../tcos-devices-ng.py:898 #, python-format msgid "" "From terminal %(host)s.\n" "Disconnected CDROM USB device %(device)s\n" "%(vendor)s %(model)s" msgstr "" "A partir do terminal %(host)s,\n" "o dispositivo CD-ROM USB %(device)s\n" "%(vendor)s %(model)s foi desconectado." #: ../tcos-devices-ng.py:926 #, python-format msgid "Can't umount cdrom usb %s" msgstr "Não foi possível desmontar o CD-ROM/USB %s." #: ../tcos-devices-ng.py:951 #, python-format msgid "" "From terminal %(host)s.\n" "Connected USB device %(device)s\n" "%(vendor)s %(model)s" msgstr "" "A partir do terminal %(host)s,\n" "o dispositivo USB %(device)s\n" "%(vendor)s %(model)s foi conectado." #: ../tcos-devices-ng.py:954 #, python-format msgid "" "From terminal %(host)s.\n" "Disconnected USB device %(device)s\n" "%(vendor)s %(model)s" msgstr "" "A partir do terminal %(host)s,\n" "o dispositivo USB %(device)s\n" "%(vendor)s %(model)s foi desconectado." #: ../tcos-devices-ng.py:982 #, python-format msgid "USB device %s" msgstr "Dispositivo USB %s" #: ../tcos-devices-ng.py:985 #, python-format msgid "Mount USB device %s" msgstr "Montar o dispositivo USB %s" #: ../tcos-devices-ng.py:986 #, python-format msgid "Umount USB device %s" msgstr "Desmontar o dispositivo USB %s" #: ../tcos-devices-ng.py:1088 #, python-format msgid "" "From terminal %(host)s.\n" "Connected Firewire device %(device)s\n" "%(vendor)s %(model)s" msgstr "" "A partir do terminal %(host)s,\n" "o dispositivo firewire %(device)s\n" "\"%(vendor)s %(model)s foi conectado." #: ../tcos-devices-ng.py:1091 #, python-format msgid "" "From terminal %(host)s.\n" "Disconnected Firewire device %(device)s\n" "%(vendor)s %(model)s" msgstr "" "A partir do terminal %(host)s,\n" "o dispositivo firewire %(device)s\n" "%(vendor)s %(model)s foi desconectado." #: ../tcos-devices-ng.py:1119 #, python-format msgid "Firewire device %s" msgstr "Dispositivo Firewire %s" #: ../tcos-devices-ng.py:1122 #, python-format msgid "Mount Firewire device %s" msgstr "Montar o dispositivo Firewire %s" #: ../tcos-devices-ng.py:1123 #, python-format msgid "Umount Firewire device %s" msgstr "Desmontar o dispositivo Firewire %s" #: ../tcos-devices-ng.py:1206 #, python-format msgid "CDROM USB device %s umounted. You can extract it." msgstr "" "O dispositivo CD-ROM USB %s foi desmontado.\n" "Agora você pode removê-lo." #: ../tcos-devices-ng.py:1209 #, python-format msgid "CDROM USB device %s mounted. Ready for use." msgstr "" "O dispositivo CD-ROM USB %s foi montado.\n" "Agora você pode usá-lo." #: ../tcos-devices-ng.py:1247 #, python-format msgid "USB device %s umounted. You can extract it." msgstr "" "O dispositivo USB %s foi desmontado.\n" "Agora você pode removê-lo." #: ../tcos-devices-ng.py:1250 #, python-format msgid "USB device %s mounted. Ready for use." msgstr "" "O dispositivo USB %s foi montado.\n" "Agora você pode usá-lo." #: ../tcos-devices-ng.py:1286 #, python-format msgid "Firewire device %s umounted. You can extract it." msgstr "" "O dispositivo Firewire %s foi desmontado.\n" "Agora você pode removê-lo." #: ../tcos-devices-ng.py:1289 #, python-format msgid "Firewire device %s mounted. Ready for use." msgstr "" "O dispositivo Firewire %s foi montado\n" "Agora você pode usá-lo." #: ../tcospersonalize.py:115 msgid "" "Need a host to configure!!!\n" "Try exec:\n" " tcospersonalize --host=XXX.XXX.XXX.XXX" msgstr "" "Necessita configurar um terminal?\n" "Então, execute:\n" "tcospersonalize --host=XXX.XXX.XXX.XXX" #: ../tcospersonalize.py:190 msgid "host: " msgstr "terminal: " #: ../tcospersonalize.py:454 msgid "Host down, can't connect to tcosxmlrpc." msgstr "Terminal inacessível, não foi possível conectar ao TcosXmlRpc." #: ../tcospersonalize.py:462 #, python-format msgid "New %d drivers loaded from terminal." msgstr "" "%d novos drivers foram carregados\n" "à partir do terminal." #: ../tcospersonalize.py:521 #, python-format msgid "Really delete config of %s?" msgstr "Quer apagar o arquivo de configuração de %s?" #: ../tcospersonalize.py:524 msgid "Deleted!" msgstr "Deletado!" #: ../tcos-volume-manager.py:101 ../tcos-volume-manager.py:113 #, python-format msgid "" "Tcos Sound levels on:\n" "%s" msgstr "" "Níveis de som TCOS em:\n" "\"%s" #: ../tcos-volume-manager.py:121 #, python-format msgid "ERROR: It appears that TcosXmlRpc is not running on %s." msgstr "Erro! O TcosXmlRpc não está sendo executado em %s" #: ../tcos-volume-manager.py:217 msgid "Loading channels info..." msgstr "Carregando as informações dos canais ..." #: ../tcos-volume-manager.py:230 msgid "Error loading channels info (xauth error)" msgstr "Erro ao Carregar as informações de canais (erro de xauth)." #: ../tcos-volume-manager.py:233 ../ui/tcos-volume-manager.ui:8 msgid "Tcos Volume Manager" msgstr "Gerenciador de volume TCOS" #: ../tcos-volume-manager.py:234 #, python-format msgid "Sound mixer of %s host" msgstr "Mixador de áudio do terminal %s" #: ../tcos-volume-manager.py:300 ../tcosmonitor/extensions/info.py:442 msgid "Mute" msgstr "Mudo" #: ../tcos-volume-manager.py:319 msgid "Main controls ready" msgstr "Controles principais carregados" #: ../tcos-volume-manager.py:323 msgid "All remote controls loaded." msgstr "Todos os controles remotos foram carregados." #: ../tcos-volume-manager.py:332 ../tcosmonitor/extensions/info.py:557 #, python-format msgid "Changing value of %(channel)s channel, to %(value)s%%..." msgstr "Alterando o valor do canal de %(channel)s, para %(value)s%% ..." #: ../tcos-volume-manager.py:339 ../tcosmonitor/extensions/info.py:564 #, python-format msgid "Changed value of %(channel)s channel, to %(value)s" msgstr "Valor alterado do canal de %(channel)s, para %(value)s" #: ../tcos-volume-manager.py:346 ../tcosmonitor/extensions/info.py:571 #, python-format msgid "Unmuting %s channel..." msgstr "Desativando o mudo do canal %s ..." #: ../tcos-volume-manager.py:351 ../tcosmonitor/extensions/info.py:576 #, python-format msgid "Muting %s channel..." msgstr "Ativando o mudo no canal %s ..." #: ../tcos-volume-manager.py:354 ../tcosmonitor/extensions/info.py:579 #, python-format msgid "Status of %(channel)s channel, is \"%(newvalue)s\"" msgstr "O estado atual do canal %(channel)s é: \"%(newvalue)s\"" #: ../tcosmonitor/TcosDBus.py:94 msgid "TcosDBus not allowed in local display" msgstr "Não é permitido usar o TcosDBus localmente." #: ../tcosmonitor/TcosDBus.py:122 #, python-format msgid "Seems that tcosxmlrpc isn't running on host=\"%s\"" msgstr "O tcosxmlrpc não está sendo executado no terminal = \"%s\"" #: ../tcosmonitor/TcosDBus.py:143 msgid "tcosxmlrpc ERROR conection unavalaible." msgstr "ERRO! Não há conexão com o tcosxmlrpc." #: ../tcosmonitor/TcosDBus.py:159 msgid "ERROR conecting to tcosxmlrpc, check username and password." msgstr "" "ERRO! Não foi possível conectar ao tcosxmlrpc. Verifique o usuário e a senha." #: ../tcosmonitor/TcosDBus.py:251 msgid "Message from admin" msgstr "Mensagem do administrador" #: ../tcosmonitor/TcosDBus.py:341 ../tcosmonitor/TcosDBus.py:357 #: ../tcosmonitor/TcosDBus.py:375 ../tcosmonitor/TcosDBus.py:393 msgid "User not allowed to run this dbus call." msgstr "Este usuário não tem permissões para executar chamadas dbus." #: ../tcosmonitor/TcosStaticHosts.py:163 ../tcosmonitor/TcosListView.py:70 msgid "IP address" msgstr "Endereço IP" #: ../tcosmonitor/TcosStaticHosts.py:169 #: ../ui/tcosmonitor-staticwindownew.ui:68 msgid "MAC address" msgstr "Endereço MAC" #: ../tcosmonitor/TcosStaticHosts.py:279 msgid "No hosts found, please click on Refresh button using another method." msgstr "" "Nenhum terminal foi encontrado. Por favor\n" "clique no botão atualizar para usar outro método." #: ../tcosmonitor/shared.py:108 msgid "Traditional list only" msgstr "Somente a Listagem Tradicional" #: ../tcosmonitor/shared.py:109 msgid "Icons only" msgstr "Somente ícones" #: ../tcosmonitor/shared.py:110 msgid "Simulate classroom" msgstr "Simule uma sala de aula" #: ../tcosmonitor/shared.py:111 msgid "Lists, icons and classroom with tabs" msgstr "Listas, ícones e sala de aula" #: ../tcosmonitor/shared.py:270 ../tcosmonitor/shared.py:312 #: ../tcosmonitor/TcosMenus.py:35 msgid "Terminal actions" msgstr "Ações do Terminal" #: ../tcosmonitor/shared.py:271 ../tcosmonitor/shared.py:313 #: ../tcosmonitor/TcosMenus.py:36 msgid "User actions" msgstr "Ações do usuário" #: ../tcosmonitor/shared.py:272 ../tcosmonitor/shared.py:314 #: ../tcosmonitor/TcosMenus.py:37 msgid "Audio, video and files" msgstr "Áudio, vídeo e arquivos" #: ../tcosmonitor/shared.py:279 ../tcosmonitor/extensions/info.py:47 msgid "Refresh terminal info" msgstr "Atualizar as informações do terminal" #: ../tcosmonitor/shared.py:280 ../tcosmonitor/extensions/clean.py:40 #: ../tcosmonitor/extensions/clean.py:41 msgid "Clean info about terminal" msgstr "Limpar as informações do terminal" #: ../tcosmonitor/shared.py:281 ../tcosmonitor/TcosTrayIcon.py:54 #: ../tcosmonitor/extensions/reboot.py:40 ../tcosmonitor/TcosTrayIcon2.py:58 msgid "Reboot" msgstr "Reiniciar" #: ../tcosmonitor/shared.py:282 ../tcosmonitor/TcosTrayIcon.py:55 #: ../tcosmonitor/extensions/reboot.py:42 ../tcosmonitor/TcosTrayIcon2.py:59 msgid "Poweroff" msgstr "Desligar" #: ../tcosmonitor/shared.py:283 ../tcosmonitor/extensions/lockscreen.py:40 msgid "Lock screen" msgstr "Bloquear a tela" #: ../tcosmonitor/shared.py:284 ../tcosmonitor/extensions/lockscreen.py:42 msgid "Unlock screen" msgstr "Desbloquear a tela" #: ../tcosmonitor/shared.py:285 ../tcosmonitor/extensions/italc.py:43 msgid "Connect to remote screen (iTALC)" msgstr "Conectar a uma tela remota (iTALC)" #: ../tcosmonitor/shared.py:286 ../tcosmonitor/extensions/vnc.py:54 msgid "Connect to remote screen (VNC)" msgstr "Conectar a uma tela remota (VNC)" #: ../tcosmonitor/shared.py:287 ../tcosmonitor/extensions/screenshot.py:45 msgid "Screenshot" msgstr "Captura de tela" #: ../tcosmonitor/shared.py:288 ../tcosmonitor/extensions/remotessh.py:40 msgid "Give a remote xterm" msgstr "Executar um xterm remoto" #: ../tcosmonitor/shared.py:289 #: ../tcosmonitor/extensions/tcospersonalize.py:40 #: ../ui/tcosmonitor-prefwindow.ui:1324 msgid "Configure this host" msgstr "Configurar este terminal" #: ../tcosmonitor/shared.py:290 ../tcosmonitor/extensions/logout.py:40 msgid "Logout client" msgstr "Encerrar a sessão do usuário" #: ../tcosmonitor/shared.py:291 ../tcosmonitor/extensions/restartxorg.py:41 msgid "Restart X session with new settings" msgstr "Reiniciar a sessão gráfica com as novas configuraçãos" #: ../tcosmonitor/shared.py:292 ../tcosmonitor/extensions/appsmsg.py:52 msgid "Exec app on user display" msgstr "Executar uma aplicação na sessão do usuário" #: ../tcosmonitor/shared.py:293 ../tcosmonitor/extensions/appsmsg.py:53 msgid "Send a text message to user" msgstr "Enviar uma mensagem de texto ao usuário" #: ../tcosmonitor/shared.py:294 ../tcosmonitor/extensions/viewproc.py:41 msgid "Show running apps of this client" msgstr "Mostrar as aplicações executadas neste terminal" #: ../tcosmonitor/shared.py:295 ../tcosmonitor/shared.py:332 msgid "Audio/Video broadcast" msgstr "Difusão de áudio/vídeo" #: ../tcosmonitor/shared.py:296 ../tcosmonitor/shared.py:333 #: ../tcosmonitor/extensions/sendfiles.py:49 #: ../tcosmonitor/extensions/sendfiles.py:50 #: ../ui/tcosmonitor-prefwindow.ui:1134 ../ui/tcosmonitor-prefwindow.ui:1475 #: ../ui/tcosmonitor-mainwindow.ui:387 msgid "Send files" msgstr "Enviar arquivos" #: ../tcosmonitor/shared.py:297 ../tcosmonitor/extensions/vnc.py:55 msgid "Demo mode (from this host)" msgstr "Modo demostração (a partir deste terminal)" #: ../tcosmonitor/shared.py:298 ../tcosmonitor/extensions/wakeonlan.py:41 msgid "Boot client (WakeOnLan)" msgstr "Inicializar o terminal (WakeOnLan)" #: ../tcosmonitor/shared.py:299 #: ../tcosmonitor/extensions/tcosnetcontroller.py:38 msgid "Lock internet" msgstr "Bloquear o acesso a Internet" #: ../tcosmonitor/shared.py:300 #: ../tcosmonitor/extensions/tcosnetcontroller.py:39 msgid "Unlock internet" msgstr "Desbloquear o acesso a Internet" #: ../tcosmonitor/shared.py:301 ../tcosmonitor/extensions/dpms.py:40 msgid "DPMS Power off monitor" msgstr "Desligar o DPMS no monitor" #: ../tcosmonitor/shared.py:302 ../tcosmonitor/extensions/dpms.py:42 msgid "DPMS Power on monitor" msgstr "Ligar o DPMS no monitor" #: ../tcosmonitor/shared.py:303 msgid "Send MIC audio (from this host)" msgstr "Enviar o áudio do microfone (à partir deste terminal)" #: ../tcosmonitor/shared.py:321 ../tcosmonitor/extensions/reboot.py:41 msgid "Reboot all clients" msgstr "Reiniciar todos os terminais" #: ../tcosmonitor/shared.py:322 ../tcosmonitor/extensions/reboot.py:43 msgid "Poweroff all clients" msgstr "Desligar todos os terminais" #: ../tcosmonitor/shared.py:323 ../tcosmonitor/extensions/lockscreen.py:41 msgid "Lock all screens" msgstr "Bloquear todas as telas" #: ../tcosmonitor/shared.py:324 ../tcosmonitor/extensions/lockscreen.py:43 msgid "Unlock all screens" msgstr "Desbloquear todas as telas" #: ../tcosmonitor/shared.py:325 ../tcosmonitor/extensions/logout.py:41 msgid "Logout clients" msgstr "Encerrar as sessões dos usuários" #: ../tcosmonitor/shared.py:326 ../tcosmonitor/extensions/restartxorg.py:42 msgid "Restart X session of all clients" msgstr "Reiniciar a sessão gráfica de todos os usuários" #: ../tcosmonitor/shared.py:327 ../tcosmonitor/extensions/appsmsg.py:55 msgid "Exec same app in all connected users" msgstr "" "Executar a mesma aplicação em todas\n" "as sessões dos usuários conectados" #: ../tcosmonitor/shared.py:328 ../tcosmonitor/extensions/appsmsg.py:56 msgid "Send a text message to all connected users" msgstr "Enviar uma mensagem de texto a todos os usuários conectados" #: ../tcosmonitor/shared.py:329 ../tcosmonitor/extensions/vnc.py:57 msgid "Enter demo mode, all connected users see my screen" msgstr "Iniciar modo de demostração. Todos os usuários verão a minha tela" #: ../tcosmonitor/shared.py:330 msgid "Enter conference mode, all connected users can hear me" msgstr "Iniciar o modo conferência. Todos os usuários poderão me ouvir" #: ../tcosmonitor/shared.py:331 ../tcosmonitor/extensions/screenshot.py:46 msgid "Capture All clients screens" msgstr "Capturar todas as telas" #: ../tcosmonitor/shared.py:334 ../tcosmonitor/extensions/wakeonlan.py:42 msgid "Boot All clients (WakeOnLan)" msgstr "Inicializar todos os terminais (WakeOnLan)" #: ../tcosmonitor/shared.py:335 #: ../tcosmonitor/extensions/tcosnetcontroller.py:41 msgid "Lock internet in all connected users" msgstr "Bloquear o acesso a Internet de todos os usuários conectados" #: ../tcosmonitor/shared.py:336 #: ../tcosmonitor/extensions/tcosnetcontroller.py:42 msgid "Unlock internet in all connected users" msgstr "Desbloquear o acesso a Internet de todos os usuários conectados" #: ../tcosmonitor/shared.py:337 ../tcosmonitor/extensions/dpms.py:41 msgid "DPMS Power off monitors" msgstr "Desligar o DPMS nos monitores" #: ../tcosmonitor/shared.py:338 ../tcosmonitor/extensions/dpms.py:43 msgid "DPMS Power on monitors" msgstr "Ligar o DPMS nos monitores" #: ../tcosmonitor/shared.py:339 msgid "Chat audio conference" msgstr "Chat de audioconferência" #: ../tcosmonitor/shared.py:340 ../tcosmonitor/extensions/livevnc.py:51 #: ../ui/tcosmonitor-prefwindow.ui:1342 msgid "Live view screens with VNC" msgstr "" #: ../tcosmonitor/shared.py:538 #, python-format msgid "QUESTION: %(txt)s, RESPONSE %(response)s" msgstr "PERGUNTA: %(txt)s, RESPOSTA %(response)s" #: ../tcosmonitor/shared.py:555 ../tcosmonitor/shared.py:566 #, python-format msgid "INFO: %s" msgstr "INFORMAÇÂO: %s" #: ../tcosmonitor/shared.py:577 #, python-format msgid "ERROR: %s" msgstr "ERRO: %s" #: ../tcosmonitor/TcosClassView.py:50 ../tcosmonitor/TcosIconView.py:47 msgid "IP" msgstr "IP" #: ../tcosmonitor/TcosClassView.py:51 ../tcosmonitor/TcosIconView.py:48 #: ../tcosmonitor/TcosListView.py:64 msgid "Hostname" msgstr "Nome do Terminal" #: ../tcosmonitor/TcosClassView.py:52 ../tcosmonitor/TcosIconView.py:49 #: ../tcosmonitor/TcosListView.py:76 msgid "Username" msgstr "Usuário" #: ../tcosmonitor/TcosClassView.py:53 ../tcosmonitor/TcosIconView.py:50 #: ../tcosmonitor/TcosListView.py:87 msgid "Logged" msgstr "Logado" #: ../tcosmonitor/TcosClassView.py:54 ../tcosmonitor/TcosIconView.py:51 #: ../tcosmonitor/TcosListView.py:103 msgid "Time log in" msgstr "Tempo Ligado" #: ../tcosmonitor/TcosClassView.py:55 ../tcosmonitor/TcosIconView.py:52 msgid "Screen locked" msgstr "Tela bloqueada" #: ../tcosmonitor/TcosClassView.py:56 ../tcosmonitor/TcosIconView.py:53 msgid "Network locked" msgstr "Rede bloqueada" #: ../tcosmonitor/TcosClassView.py:58 msgid "" "Place mouse on any computer to see brief info about it.\n" "You can select and unselect multiple host clicking on every one.\n" "Drag and drop hosts to positions and save clicking on right mouse button." msgstr "" "Ao passar o mouse sobre qualquer terminal, você verá uma\n" "breve descrição. Para mudá-lo de lugar, selecione um terminal\n" "clicando com botão esquerdo do mouse, arraste e solte para \n" "salvar a nova localização." #: ../tcosmonitor/TcosClassView.py:179 msgid "Positions reset to defaults." msgstr "Restaurar a posição padrão" #: ../tcosmonitor/TcosClassView.py:197 msgid "Positions saved." msgstr "Posição salva" #: ../tcosmonitor/TcosClassView.py:323 #, python-format msgid "%s is not a valid file to exe or send" msgstr "%s este não é um arquivo válido para ser executado/enviado" #: ../tcosmonitor/TcosClassView.py:409 ../tcosmonitor/TcosIconView.py:156 msgid "yes" msgstr "sim" #: ../tcosmonitor/TcosClassView.py:411 ../tcosmonitor/TcosIconView.py:158 msgid "no" msgstr "não" #: ../tcosmonitor/TcosTrayIcon.py:49 ../tcosmonitor/extensions/vnc.py:298 #: ../tcosmonitor/TcosTrayIcon2.py:53 ../ui/tcosmonitor-mainwindow.ui:23 msgid "Quit" msgstr "Sair" #: ../tcosmonitor/TcosTrayIcon.py:65 msgid "TcosDevices" msgstr "TcosDevices" #: ../tcosmonitor/TcosTrayIcon.py:172 ../tcosmonitor/TcosTrayIcon.py:186 #: ../tcosmonitor/TcosTrayIcon2.py:67 msgid "Tcos Devices" msgstr "Dispositivos TCOS" #: ../tcosmonitor/TcosTrayIcon.py:232 ../tcosmonitor/TcosTrayIcon2.py:351 msgid "Usb flash" msgstr "Memória flash USB" #: ../tcosmonitor/TcosTrayIcon.py:234 ../tcosmonitor/TcosTrayIcon2.py:353 msgid "Mount USB1" msgstr "Montar USB1" #: ../tcosmonitor/TcosTrayIcon.py:235 ../tcosmonitor/TcosTrayIcon2.py:354 msgid "Umount USB1" msgstr "Desmontar USB1" #: ../tcosmonitor/extensions/lockscreen.py:49 #: ../tcosmonitor/extensions/lockscreen.py:57 msgid "" "Can't connect to tcosxmlrpc.\n" "Please verify user and password in prefences!" msgstr "" "Não foi possível se conectar ao TcosXmlRpc.\n" "Por favor verifique o usuário e a senha no menu preferências." #: ../tcosmonitor/extensions/lockscreen.py:81 #, python-format msgid "Do you want to lock the following screens: %s?" msgstr "Quer bloquear a tela dos seguintes terminais: %s?" #: ../tcosmonitor/extensions/lockscreen.py:90 #, python-format msgid "Do you want to unlock the following screens: %s?" msgstr "Quer desbloquear a tela dos seguintes terminais: %s?" #: ../tcosmonitor/extensions/appsmsg.py:64 msgid "Clients not connected" msgstr "Não há usuários conectados." #: ../tcosmonitor/extensions/appsmsg.py:87 #, python-format msgid "" "Exec app in user(s) screen(s)\n" "or open web address to:\n" "%s" msgstr "" "Executar a aplicação na sessão do(s) \n" "usuário(s) ou abrir endereço Web:%s" #: ../tcosmonitor/extensions/appsmsg.py:89 #, python-format msgid "" "Send a message to:\n" "%s" msgstr "" "Enviar uma mensagem a:\n" "%s" #: ../tcosmonitor/extensions/appsmsg.py:122 #: ../tcosmonitor/extensions/appsmsg.py:163 msgid "Can't exec application, user is not logged" msgstr "" "Não foi possível executar a aplicação,\n" "o usuário não está logado" #: ../tcosmonitor/extensions/appsmsg.py:141 #: ../tcosmonitor/extensions/appsmsg.py:152 #, python-format msgid "%s is not a valid application" msgstr "%s não é uma aplicação válida." #: ../tcosmonitor/extensions/appsmsg.py:172 msgid "Can't send message, user is not logged" msgstr "" "Não foi possível enviar as mensagens,\n" "o usuário não está conectado." #: ../tcosmonitor/extensions/appsmsg.py:289 #: ../tcosmonitor/extensions/appsmsg.py:298 #, python-format msgid "%s is not application" msgstr "%s não é uma aplicação." #: ../tcosmonitor/extensions/appsmsg.py:353 #, python-format msgid "" "Error while exec remote app:\n" "Reason: %s" msgstr "" "Erro ao executar a aplicação remota:\n" "Motivo: %s" #: ../tcosmonitor/extensions/appsmsg.py:360 #, python-format msgid "" "Error while send message:\n" "Reason: %s" msgstr "" "Erro ao enviar a mensagem:\n" "Motivo: %s" #: ../tcosmonitor/extensions/remotessh.py:47 msgid "Enter password of remote thin client (if asked for it)" msgstr "Informe a senha do terminal remoto (se for solicitado)" #: ../tcosmonitor/extensions/dpms.py:79 #, python-format msgid "Do you want to switch off the following monitors: %s?" msgstr "Quer desligar os monitores dos seguintes terminais: %s?" #: ../tcosmonitor/extensions/dpms.py:88 #, python-format msgid "Do you want to switch on the following monitors: %s?" msgstr "Quer ligar os monitores dos seguintes terminais: %s?" #: ../tcosmonitor/extensions/screenshot.py:66 #: ../tcosmonitor/extensions/screenshot.py:83 #, python-format msgid "Can't make screenshot, error: %s" msgstr "Não pôde fazer uma captura de tela, erro: %s" #: ../tcosmonitor/extensions/screenshot.py:75 msgid "Trying to order terminal to do a screenshot..." msgstr "Tentando capturar a tela do terminal..." #: ../tcosmonitor/extensions/screenshot.py:87 msgid "Get another screenshot" msgstr "Capturar outra tela" #: ../tcosmonitor/extensions/screenshot.py:102 #, python-format msgid "Screenshot of %s" msgstr "Captura de tela de %s" #: ../tcosmonitor/extensions/screenshot.py:125 #, python-format msgid "Screenshot of %s, done." msgstr "Tela do %s capturada." #: ../tcosmonitor/extensions/screenshot.py:139 msgid "Save Screenshot" msgstr "Captura de tela salva" #: ../tcosmonitor/extensions/screenshot.py:151 msgid "Select file to save screenshot..." msgstr "Selecionar a captura de tela salva" #: ../tcosmonitor/extensions/screenshot.py:155 #, python-format msgid "screenshot_of_%(hostname)s_date_%(date)s.png" msgstr "tela de %(hostname)s data %(date)s.png" #: ../tcosmonitor/extensions/screenshot.py:159 msgid "Image Files ( *.png, *.jpg)" msgstr "Arquivos de imagem (*.png, *.jpg)" #: ../tcosmonitor/extensions/screenshot.py:169 msgid "File must be png or jpg." msgstr "O arquivo deve ser no formato png or jpg." #: ../tcosmonitor/extensions/screenshot.py:192 msgid "Screenshots of all hosts" msgstr "Captura de tela de todos os terminais" #: ../tcosmonitor/extensions/screenshot.py:208 #, python-format msgid "Screenshot of %s" msgstr "Captura de tela de %s" #: ../tcosmonitor/extensions/sendfiles.py:62 #: ../tcosmonitor/extensions/sendfiles.py:120 msgid "Can't send files, user is not logged" msgstr "Não foi possível enviar os arquivos, o usuário não está logado." #: ../tcosmonitor/extensions/sendfiles.py:66 #: ../tcosmonitor/extensions/sendfiles.py:142 #: ../tcosmonitor/extensions/sendfiles.py:237 msgid "" "TcosMonitor need special configuration for rsync daemon to send files.\n" "\n" "Please read configuration requeriments in:\n" "/usr/share/doc/tcosmonitor/README.rsync" msgstr "" "O TcosMonitor necessita de uma configuraçao especial\n" "no daemon rsync para o envio de arquivos.\n" "\n" "Leia a configuração requerida em:\n" "/usr/share/doc/tcosmonitor/README.rsync" #: ../tcosmonitor/extensions/sendfiles.py:84 #: ../tcosmonitor/extensions/sendfiles.py:176 #: ../tcosmonitor/extensions/sendfiles.py:270 msgid "Waiting for send files..." msgstr "Aguardando o envio dos arquivos..." #: ../tcosmonitor/extensions/sendfiles.py:93 #: ../tcosmonitor/extensions/sendfiles.py:95 #: ../tcosmonitor/extensions/sendfiles.py:99 #: ../tcosmonitor/extensions/sendfiles.py:108 #: ../tcosmonitor/extensions/sendfiles.py:189 #: ../tcosmonitor/extensions/sendfiles.py:191 #: ../tcosmonitor/extensions/sendfiles.py:195 #: ../tcosmonitor/extensions/sendfiles.py:204 #: ../tcosmonitor/extensions/sendfiles.py:283 #: ../tcosmonitor/extensions/sendfiles.py:285 #: ../tcosmonitor/extensions/sendfiles.py:289 #: ../tcosmonitor/extensions/sendfiles.py:298 msgid "Teacher" msgstr "Professor" #: ../tcosmonitor/extensions/sendfiles.py:95 #: ../tcosmonitor/extensions/sendfiles.py:108 #: ../tcosmonitor/extensions/sendfiles.py:191 #: ../tcosmonitor/extensions/sendfiles.py:204 #: ../tcosmonitor/extensions/sendfiles.py:285 #: ../tcosmonitor/extensions/sendfiles.py:298 #, python-format msgid "" "Teacher has sent some files to %(teacher)s folder:\n" "\n" "%(basenames)s" msgstr "" "O professor enviou vários arquivos a pasta %(teacher)s:\n" "\n" "%(basenames)s" #: ../tcosmonitor/extensions/sendfiles.py:104 #: ../tcosmonitor/extensions/sendfiles.py:200 #: ../tcosmonitor/extensions/sendfiles.py:294 #: ../tcosmonitor/extensions/reboot.py:108 #: ../tcosmonitor/extensions/videolan.py:194 #: ../tcosmonitor/extensions/videolan.py:389 #: ../tcosmonitor/extensions/videolan.py:629 #, python-format msgid "" "Error while exec remote app:\n" "Reason:%s" msgstr "" "Erro ao executar a aplicação remota:\n" "Motivo: %s" #: ../tcosmonitor/extensions/sendfiles.py:105 #: ../tcosmonitor/extensions/sendfiles.py:201 #: ../tcosmonitor/extensions/sendfiles.py:295 msgid "Error creating destination folder." msgstr "Erro ao criar o diretório destino." #: ../tcosmonitor/extensions/sendfiles.py:110 #: ../tcosmonitor/extensions/sendfiles.py:205 #: ../tcosmonitor/extensions/sendfiles.py:300 msgid "Files sent." msgstr "Arquivos enviados." #: ../tcosmonitor/extensions/sendfiles.py:125 #: ../tcosmonitor/extensions/sendfiles.py:220 msgid "Select file or files..." msgstr "Selecionar os arquivos..." #: ../tcosmonitor/extensions/sendfiles.py:178 #: ../tcosmonitor/extensions/sendfiles.py:272 msgid "Do you want open file(s) on client?" msgstr "Você quer abrir o(s) arquivo(s) no terminal?" #: ../tcosmonitor/extensions/sendfiles.py:215 #: ../tcosmonitor/extensions/tcosnetcontroller.py:113 #: ../tcosmonitor/extensions/tcosnetcontroller.py:155 #: ../tcosmonitor/extensions/videolan.py:457 #: ../tcosmonitor/extensions/vnc.py:68 ../tcosmonitor/extensions/vnc.py:112 #: ../tcosmonitor/extensions/vnc.py:422 #: ../tcosmonitor/extensions/audiortp.py:229 #: ../tcosmonitor/extensions/audiortp.py:275 #: ../tcosmonitor/extensions/audiortp.py:373 #: ../tcosmonitor/extensions/audiortp.py:407 #: ../tcosmonitor/extensions/audiortp.py:460 msgid "No users logged." msgstr "Não há usuários logados." #: ../tcosmonitor/extensions/info.py:91 #, python-format msgid "Connecting with %s to retrieve some info..." msgstr "Conectando a %s para obter alguma informação..." #: ../tcosmonitor/extensions/info.py:117 msgid "Tcos info" msgstr "Informação do TCOS" #: ../tcosmonitor/extensions/info.py:120 msgid "PXES info" msgstr "Informação do PXE" #: ../tcosmonitor/extensions/info.py:123 msgid "LTSP info" msgstr "Informação do LTSP" #: ../tcosmonitor/extensions/info.py:126 msgid "Standalone info" msgstr "Informação do Standalone " #: ../tcosmonitor/extensions/info.py:129 msgid "Unknow client info" msgstr "Informação desconhecida do terminal" #: ../tcosmonitor/extensions/info.py:135 ../tcosmonitor/LocalData.py:43 #: ../tcosmonitor/LocalData.py:62 ../tcosmonitor/TcosCommon.py:182 #: ../tcosmonitor/TcosCommon.py:190 ../tcosmonitor/TcosCommon.py:206 #: ../tcosmonitor/TcosCommon.py:209 msgid "unknow" msgstr "desconhecido" #: ../tcosmonitor/extensions/info.py:138 msgid "Hostname: " msgstr "Nome do Terminal: " #: ../tcosmonitor/extensions/info.py:139 msgid "Ip address: " msgstr "Endereço IP: " #: ../tcosmonitor/extensions/info.py:140 msgid "TcosXmlRpc version: " msgstr "Versão do TcosXmlRpc: " #: ../tcosmonitor/extensions/info.py:149 msgid "Tcos image version: " msgstr "Versão da imagem TCOS: " #: ../tcosmonitor/extensions/info.py:150 msgid "Tcos image date: " msgstr "Data da imagem Tcos: " #: ../tcosmonitor/extensions/info.py:151 msgid "Date of thin client: " msgstr "Data e hora do terminal: " #: ../tcosmonitor/extensions/info.py:152 msgid "Uptime: " msgstr "Tempo ligado: " #: ../tcosmonitor/extensions/info.py:163 msgid "Kernel info" msgstr "Informação do kernel" #: ../tcosmonitor/extensions/info.py:172 msgid "Force download and mount all modules" msgstr "Forçar o download e a montagem de todos os módulos" #: ../tcosmonitor/extensions/info.py:183 msgid "None" msgstr "Nenhum" #: ../tcosmonitor/extensions/info.py:186 msgid "Kernel version: " msgstr "Versão do kernel: " #: ../tcosmonitor/extensions/info.py:187 msgid "Kernel complete version: " msgstr "Versão completa do kernel: " #: ../tcosmonitor/extensions/info.py:188 msgid "Loaded Modules: " msgstr "Módulos carregados: " #: ../tcosmonitor/extensions/info.py:189 msgid "Modules not found: " msgstr "Módulos não encontrados: " #: ../tcosmonitor/extensions/info.py:205 msgid "Cpu info: " msgstr "Informação do procesador: " #: ../tcosmonitor/extensions/info.py:212 msgid "Cpu model: " msgstr "Modelo do processador: " #: ../tcosmonitor/extensions/info.py:213 msgid "Cpu vendor: " msgstr "Fabricante do processador: " #: ../tcosmonitor/extensions/info.py:214 msgid "Cpu speed: " msgstr "Velocidade do processador: " #: ../tcosmonitor/extensions/info.py:225 msgid "PCI buses: " msgstr "Dispositivos PCI: " #: ../tcosmonitor/extensions/info.py:254 msgid "Process running: " msgstr "Processos em execução: " #: ../tcosmonitor/extensions/info.py:267 msgid "Ram info: " msgstr "Informação da memória RAM: " #: ../tcosmonitor/extensions/info.py:274 msgid "Total Ram: " msgstr "Memória RAM total: " #: ../tcosmonitor/extensions/info.py:275 msgid "Free RAM: " msgstr "Memória RAM disponível: " #: ../tcosmonitor/extensions/info.py:276 msgid "Active RAM: " msgstr "Memória RAM ativa: " #: ../tcosmonitor/extensions/info.py:279 msgid "Swap info: " msgstr "Informação da memória Swap: " #: ../tcosmonitor/extensions/info.py:285 msgid "Swap enabled: " msgstr "Memória Swap habilitada: " #: ../tcosmonitor/extensions/info.py:286 msgid "Total Swap: " msgstr "Total da memória Swap: " #: ../tcosmonitor/extensions/info.py:287 msgid "Used Swap: " msgstr "Memória Swap usada: " #: ../tcosmonitor/extensions/info.py:297 msgid "Network info: " msgstr "Informação de rede: " #: ../tcosmonitor/extensions/info.py:307 msgid "Network hostname: " msgstr "Rede do terminal: " #: ../tcosmonitor/extensions/info.py:308 msgid "Network IP: " msgstr "Endereço IP" #: ../tcosmonitor/extensions/info.py:309 msgid "Network MASK: " msgstr "Máscara de sub-rede: " #: ../tcosmonitor/extensions/info.py:310 msgid "Network MAC: " msgstr "Endereço MAC: " #: ../tcosmonitor/extensions/info.py:311 msgid "Data received(rx): " msgstr "Dados recebidos(rx): " #: ../tcosmonitor/extensions/info.py:312 msgid "Data send(tx): " msgstr "Dados enviados(tx): " #: ../tcosmonitor/extensions/info.py:322 ../ui/tcosmonitor-prefwindow.ui:911 msgid "Xorg info" msgstr "Informação do Xorg" #: ../tcosmonitor/extensions/info.py:348 msgid "enabled" msgstr "habilitado" #: ../tcosmonitor/extensions/info.py:350 msgid "disabled" msgstr "desabilitado" #: ../tcosmonitor/extensions/info.py:353 ../ui/tcospersonalize.ui:159 msgid "X Session Type" msgstr "Tipo de sessão gráfica" #: ../tcosmonitor/extensions/info.py:355 ../ui/tcospersonalize.ui:201 msgid "Xorg Driver" msgstr "Driver do Xorg" #: ../tcosmonitor/extensions/info.py:357 ../ui/tcospersonalize.ui:94 msgid "Xorg Resolution" msgstr "Resolução do Xorg" #: ../tcosmonitor/extensions/info.py:359 ../ui/tcospersonalize.ui:133 msgid "Xorg Color depth" msgstr "Qualidade das cores do Xorg" #: ../tcosmonitor/extensions/info.py:361 ../ui/tcospersonalize.ui:179 msgid "DPMS energy monitor control" msgstr "Controle de energia do monitor DPMS" #: ../tcosmonitor/extensions/info.py:363 msgid "Disable kill X with Ctrl+Alt+Backspace" msgstr "Desabilitar a \"morte\" do Xorg com Ctrl+Alt+Backspace" #: ../tcosmonitor/extensions/info.py:365 ../ui/tcospersonalize.ui:57 msgid "Enable mouse wheel" msgstr "Ativar o botão scroll do mouse" #: ../tcosmonitor/extensions/info.py:367 msgid "Refresh rate" msgstr "Taxa de atualização" #: ../tcosmonitor/extensions/info.py:369 msgid "Xorg font server" msgstr "Servidor de fontes do Xorg" #: ../tcosmonitor/extensions/info.py:371 msgid "Mouse device" msgstr "Dispositivo do mouse" #: ../tcosmonitor/extensions/info.py:373 msgid "Mouse protocol" msgstr "Protocolo do mouse: " #: ../tcosmonitor/extensions/info.py:375 ../ui/tcospersonalize.ui:273 msgid "X Horiz sync" msgstr "Sincronização Horizontal" #: ../tcosmonitor/extensions/info.py:377 ../ui/tcospersonalize.ui:284 msgid "X Vert sync" msgstr "Sincronização Vertical" #: ../tcosmonitor/extensions/info.py:390 msgid "PulseAudio Sound server is running" msgstr "O servidor de som PulseAudio está funcionando." #: ../tcosmonitor/extensions/info.py:408 msgid "Remote Sound Mixer" msgstr "Mixador de som remoto" #: ../tcosmonitor/extensions/info.py:480 msgid "PulseAudio Control" msgstr "Controle do PulseAudio" #: ../tcosmonitor/extensions/info.py:485 msgid "PulseAudio Meter" msgstr "Níveis do PulseAudio " #: ../tcosmonitor/extensions/info.py:490 msgid "PulseAudio Manager" msgstr "Gerenciador do PulseAudio" #: ../tcosmonitor/extensions/info.py:494 msgid "PulseAudio utils: " msgstr "Utilitários do PulseAudio: " #: ../tcosmonitor/extensions/info.py:500 msgid "PulseAudio stats" msgstr "Estatísticas do PulseAudio" #: ../tcosmonitor/extensions/info.py:512 msgid "Currently in use" msgstr "Atualmente em uso" #: ../tcosmonitor/extensions/info.py:513 msgid "Allocated during whole lifetime" msgstr "Atribuída durante toda vida" #: ../tcosmonitor/extensions/info.py:514 msgid "Sample cache size" msgstr "Tamanho do cache" #: ../tcosmonitor/extensions/info.py:515 msgid "User name" msgstr "Nome do usuário" #: ../tcosmonitor/extensions/info.py:516 msgid "Host Name" msgstr "Nome do Terminal" #: ../tcosmonitor/extensions/info.py:517 msgid "Server Name" msgstr "Nome do servidor" #: ../tcosmonitor/extensions/info.py:518 msgid "Server Version" msgstr "Versão do servidor" #: ../tcosmonitor/extensions/info.py:519 msgid "Default Sample Specification" msgstr "Especificação padrão" #: ../tcosmonitor/extensions/info.py:520 msgid "Default Sink" msgstr "Saída padrão" #: ../tcosmonitor/extensions/info.py:521 msgid "Default Source" msgstr "Entrada padrão" #: ../tcosmonitor/extensions/info.py:522 msgid "Cookie" msgstr "Cookie" #: ../tcosmonitor/extensions/info.py:528 msgid "Sound server is not running" msgstr "O servidor de som não está funcionando." #: ../tcosmonitor/extensions/info.py:589 ../tcosmonitor/extensions/info.py:597 #: ../tcosmonitor/extensions/info.py:605 msgid "PulseAudio apps need /dev/shm." msgstr "O PulseAudio precisa do /dev/shm." #: ../tcosmonitor/extensions/logout.py:48 #: ../tcosmonitor/extensions/logout.py:71 msgid "User not logged" msgstr "Nenhum usuário logado" #: ../tcosmonitor/extensions/logout.py:51 #, python-format msgid "Do you want to logout user: %s?" msgstr "Quer desconectar o usuário \"%s\"?" #: ../tcosmonitor/extensions/logout.py:55 #: ../tcosmonitor/extensions/logout.py:77 #, python-format msgid "Session will close in %s seconds" msgstr "A sessão fechará em %s segundos" #: ../tcosmonitor/extensions/logout.py:73 #, python-format msgid "Do you want to logout the following users: %s?" msgstr "Quer desconectar os seguintes usuários: %s?" #: ../tcosmonitor/extensions/reboot.py:48 #, python-format msgid "Do you want to reboot: %s?" msgstr "Quer reinicializar o terminal %s?" #: ../tcosmonitor/extensions/reboot.py:51 #: ../tcosmonitor/extensions/reboot.py:61 #, python-format msgid "Pc will reboot in %s seconds" msgstr "O terminal será reinicializado em %s segundos." #: ../tcosmonitor/extensions/reboot.py:58 #, python-format msgid "Do you want to reboot the following clients: %s?" msgstr "Quer reinicializar os seguintes terminais %s?" #: ../tcosmonitor/extensions/reboot.py:67 #, python-format msgid "Do you want to poweroff: %s?" msgstr "Quer desligar o terminal %s?" #: ../tcosmonitor/extensions/reboot.py:70 #: ../tcosmonitor/extensions/reboot.py:80 #, python-format msgid "Pc will shutdown in %s seconds" msgstr "O terminal será desligado em %s segundos." #: ../tcosmonitor/extensions/reboot.py:77 #, python-format msgid "Do you want to poweroff the following clients: %s?" msgstr "Quer desligar os seguintes terminais: %s?" #: ../tcosmonitor/extensions/tcosnetcontroller.py:50 #: ../tcosmonitor/extensions/tcosnetcontroller.py:109 msgid "Internet connection has been disabled" msgstr "A conexão com a Internet foi desabilitada." #: ../tcosmonitor/extensions/tcosnetcontroller.py:54 msgid "Can't disable internet, user is not logged" msgstr "" "Não foi possível desabilitar a conexão com a Internet.\n" "O usuário não está logado." #: ../tcosmonitor/extensions/tcosnetcontroller.py:59 #: ../tcosmonitor/extensions/tcosnetcontroller.py:85 #: ../tcosmonitor/extensions/tcosnetcontroller.py:103 #: ../tcosmonitor/extensions/tcosnetcontroller.py:147 #, python-format msgid "" "In order to lock and unlock internet you need to be in 'tcos' group.\n" "\n" "Exe by root: adduser %s tcos" msgstr "" "Para bloquear ou desbloquear o acesso a Internet, você necessita\n" "pertencer ao grupo 'tcos'. Para isso, execute o comando, como root:\n" "adduser %s tcos." #: ../tcosmonitor/extensions/tcosnetcontroller.py:77 #: ../tcosmonitor/extensions/tcosnetcontroller.py:151 msgid "Internet connection has been enabled" msgstr "A conexão com a Internet foi habilitada." #: ../tcosmonitor/extensions/tcosnetcontroller.py:81 msgid "Can't enable internet, user is not logged" msgstr "" "Não foi possível habilitar a conexão com a Internet.\n" "O usuário não está logado." #: ../tcosmonitor/extensions/tcosnetcontroller.py:116 #, python-format msgid "Do you want disable internet to following users: %s?" msgstr "Quer desabilitar o acesso a Internet dos seguintes usuários: %s?" #: ../tcosmonitor/extensions/tcosnetcontroller.py:158 #, python-format msgid "Do you want enable internet to following users:%s?" msgstr "Quer habilitar o acesso a Internet dos seguintes usuários: %s?" #: ../tcosmonitor/extensions/videolan.py:48 #: ../tcosmonitor/extensions/videolan.py:49 msgid "Send Audio/Video broadcast" msgstr "Envio de áudio/vídeo em broadcast" #: ../tcosmonitor/extensions/videolan.py:65 #: ../tcosmonitor/extensions/videolan.py:219 msgid "Can't send video broadcast, user is not logged" msgstr "" "Não foi possível enviar o vídeo,\n" "o usuário não está logado." #: ../tcosmonitor/extensions/videolan.py:149 #: ../tcosmonitor/extensions/videolan.py:347 #: ../tcosmonitor/extensions/videolan.py:578 #, python-format msgid "" "Not allowed white spaces in \"%s\".\n" "Please rename it." msgstr "" "Não é permitido usar espaços no nome do arquivo %s.\n" "Por favor, renomei-o." #: ../tcosmonitor/extensions/videolan.py:159 #: ../tcosmonitor/extensions/videolan.py:359 #: ../tcosmonitor/extensions/videolan.py:594 msgid "Waiting for start video transmission..." msgstr "Aguardando o início da transmissão do vídeo..." #: ../tcosmonitor/extensions/videolan.py:167 #: ../tcosmonitor/extensions/videolan.py:367 #: ../tcosmonitor/extensions/videolan.py:602 #: ../tcosmonitor/extensions/vnc.py:98 ../tcosmonitor/extensions/vnc.py:407 msgid "Error while exec app" msgstr "Erro durante a execução da aplicação." #: ../tcosmonitor/extensions/videolan.py:199 #: ../tcosmonitor/extensions/videolan.py:393 #: ../tcosmonitor/extensions/videolan.py:634 msgid "Running in broadcast video transmission." msgstr "Executando a transmissão do vídeo em broadcast." #: ../tcosmonitor/extensions/videolan.py:208 #: ../tcosmonitor/extensions/videolan.py:402 #, python-format msgid "" "Running in broadcast video transmission to user %(host)s. Broadcast Nº %" "(count)s" msgstr "" "Executando, em broadcast, a transmissão do vídeo ao usuário\n" "%(host)s. Broadcast Nº %(count)s" #: ../tcosmonitor/extensions/videolan.py:311 #: ../tcosmonitor/extensions/videolan.py:541 msgid "Select audio/video file.." msgstr "Selecione o arquivo de áudio/vídeo..." #: ../tcosmonitor/extensions/videolan.py:314 #: ../tcosmonitor/extensions/videolan.py:544 msgid "Play DVD" msgstr "Reproduzir o DVD" #: ../tcosmonitor/extensions/videolan.py:315 #: ../tcosmonitor/extensions/videolan.py:545 msgid "Play SVCD/VCD" msgstr "Reproduzir o SVCD/VCD" #: ../tcosmonitor/extensions/videolan.py:316 #: ../tcosmonitor/extensions/videolan.py:546 msgid "Play AudioCD" msgstr "Reproduzir o CD de áudio" #: ../tcosmonitor/extensions/videolan.py:361 #: ../tcosmonitor/extensions/videolan.py:596 msgid "" "First select the DVD chapter or play movie\n" "then press enter to send clients..." msgstr "" "Primeiro selecione o capítulo do DVD ou reproduza o vídeo.\n" "Depois, pressione «enter» para enviá-lo aos terminais..." #: ../tcosmonitor/extensions/videolan.py:370 msgid "Lock keyboard and mouse on client?" msgstr "Bloquear o teclado e mouse do terminal?" #: ../tcosmonitor/extensions/videolan.py:444 msgid "Video broadcast stopped." msgstr "Difusão de vídeo parada." #: ../tcosmonitor/extensions/videolan.py:605 msgid "Lock keyboard and mouse on clients?" msgstr "Bloquear o teclado e mouse nos terminais?" #: ../tcosmonitor/extensions/videolan.py:643 #, python-format msgid "Running in broadcast video transmission. Broadcast Nº %s" msgstr "Executando, em broadcast, a transmissão do vídeo. Broadcast N° %s" #: ../tcosmonitor/extensions/restartxorg.py:51 #, python-format msgid "Restart X session of %s with new config?" msgstr "Reiniciar a sessão gráfica de %s com a nova configuração?" #: ../tcosmonitor/extensions/restartxorg.py:64 #, python-format msgid "%s is not supported to restart Xorg!" msgstr "%s não suporta o reinício do Xorg!" #: ../tcosmonitor/extensions/restartxorg.py:78 msgid "No thin clients found." msgstr "Nenhum thin client foi encontrado." #: ../tcosmonitor/extensions/restartxorg.py:81 #, python-format msgid "Do you want to restart X screens (only thin clients):%s?" msgstr "" "Quer reiniciar as sessões gráficas de\n" "(somente thin clients): %s?" #: ../tcosmonitor/extensions/italc.py:51 ../tcosmonitor/extensions/vnc.py:135 msgid "No user logged." msgstr "Nenhum usuário logado" #: ../tcosmonitor/extensions/italc.py:75 msgid "Can't start IVS, please add iTALC support" msgstr "Não foi possível iniciar o processo IVS. Adicione o suporte ao iTALC." #: ../tcosmonitor/extensions/tcospersonalize.py:54 #, python-format msgid "%s is not supported to personalize!" msgstr "%s não tem suporte a personalização!" #: ../tcosmonitor/extensions/vnc.py:71 #, python-format msgid "Do you want to start demo mode the following users: %s?" msgstr "Quer iniciar o modo demostração aos seguintes usuários: %s ?" #: ../tcosmonitor/extensions/vnc.py:83 msgid "Waiting for start demo mode..." msgstr "Aguardando o início do modo demostração..." #: ../tcosmonitor/extensions/vnc.py:116 ../tcosmonitor/extensions/vnc.py:426 #, python-format msgid "Running in demo mode with %s clients." msgstr "Executando no modo demostração com %s terminal(ais)." #: ../tcosmonitor/extensions/vnc.py:127 #, python-format msgid "Running in demo mode from server. Demo Nº %s" msgstr "" "Executando no modo demostração a partir do servidor.\n" "Demo Nº %s" #: ../tcosmonitor/extensions/vnc.py:149 ../tcosmonitor/extensions/vnc.py:369 #, python-format msgid "Connecting with %s to start VNC support" msgstr "Conectando a %s para iniciar o suporte ao VNC." #: ../tcosmonitor/extensions/vnc.py:178 #, python-format msgid "" "Can't start VNC, error:\n" "%s" msgstr "" "Não foi possível iniciar o VNC, erro:\n" "%s" #: ../tcosmonitor/extensions/vnc.py:182 msgid "Waiting for start of VNC server..." msgstr "Aguardando o início do servidor VNC..." #: ../tcosmonitor/extensions/vnc.py:211 msgid "Can't start VNC, please add X11VNC support" msgstr "" "Não foi possível iniciar o VNC, por favor adicione o suporte ao X11VNC." #: ../tcosmonitor/extensions/vnc.py:237 msgid "Switch to view only" msgstr "" #: ../tcosmonitor/extensions/vnc.py:242 ../tcosmonitor/extensions/vnc.py:273 msgid "Switch to full control" msgstr "" #: ../tcosmonitor/extensions/vnc.py:269 #, python-format msgid "VNC host %s" msgstr "" #: ../tcosmonitor/extensions/vnc.py:281 msgid "Switch to fullscreen" msgstr "" #: ../tcosmonitor/extensions/vnc.py:290 #: ../tcosmonitor/extensions/livevnc.py:72 #: ../tcosmonitor/TcosPreferences.py:539 ../tcosmonitor/TcosExtensions.py:338 msgid "Stop" msgstr "Parar" #: ../tcosmonitor/extensions/vnc.py:342 msgid "Can't start demo mode, user is not logged" msgstr "" "Não foi possível iniciar o modo demostração,\n" "o usuário não está logado." #: ../tcosmonitor/extensions/vnc.py:345 #, python-format msgid "Do you want demo mode from user %s?" msgstr "Quer iniciar o modo demostração do usuário %s?" #: ../tcosmonitor/extensions/vnc.py:392 #, python-format msgid "Waiting for start demo mode from user %s..." msgstr "Aguardando o início da demostração do usuário %s..." #: ../tcosmonitor/extensions/vnc.py:446 #, python-format msgid "Running in demo mode from user %(host)s. Demo Nº %(count)s" msgstr "" "Executando no modo demostração\n" "a partir do usuário %(host)s. Demo Nº %(count)s" #: ../tcosmonitor/extensions/vnc.py:501 msgid "Demo mode off." msgstr "Modo demostração desativado." #: ../tcosmonitor/extensions/wakeonlan.py:50 #: ../tcosmonitor/extensions/wakeonlan.py:75 msgid "" "Wake On Lan only works with static list.\n" "\n" "Enable scan method \"static\" in Preferences\n" "and (wake on lan) support in bios of clients." msgstr "" "Wake on Lan só funciona com IP estático.\n" "\n" "Ative o método busca \"static\" em Preferências\n" "e o suporte (wake on lan) na configuração da BIOS dos terminais." #: ../tcosmonitor/extensions/wakeonlan.py:54 #, python-format msgid "Do you want boot %s client?" msgstr "Quer inicializar o terminal %s ?" #: ../tcosmonitor/extensions/wakeonlan.py:67 #: ../tcosmonitor/extensions/wakeonlan.py:91 #, python-format msgid "No register MAC address for ip: \"%s\"" msgstr "Endereço MAC não registrado para o IP: \"%s\"" #: ../tcosmonitor/extensions/wakeonlan.py:71 #: ../tcosmonitor/extensions/wakeonlan.py:98 #, python-format msgid "Not valid MAC address: \"%s\"" msgstr "Endereço MAC inválido: \"%s\"" #: ../tcosmonitor/extensions/wakeonlan.py:79 msgid "Do you want boot all clients?" msgstr "Quer inicializar todos os terminais?" #: ../tcosmonitor/extensions/livevnc.py:76 #, fuzzy msgid "Live view of all hosts" msgstr "Captura de tela de todos os terminais" #: ../tcosmonitor/extensions/livevnc.py:194 msgid "Running in LiveView mode" msgstr "" #: ../tcosmonitor/extensions/viewproc.py:48 msgid "Can't show runnings apps, user is not logged" msgstr "" "Não foi possível mostrar as aplicações\n" "em execução. O usuário não está logado." #: ../tcosmonitor/extensions/viewproc.py:58 msgid "User not connected, no processes." msgstr "Usuário não conectado, sem processos." #: ../tcosmonitor/extensions/viewproc.py:76 #, python-format msgid "Running processes for user \"%s\": " msgstr "Processos executados pelo usuário \"%s\":" #: ../tcosmonitor/extensions/viewproc.py:80 msgid "" "ALERT: There are some system process hidden. Enable it in Preferences dialog." msgstr "" "AVISO: Há vários processos do sistema que estão ocultos.\n" "Você pode habilitá-los no menu Preferências." #: ../tcosmonitor/extensions/viewproc.py:85 msgid "Pid" msgstr "PID" #: ../tcosmonitor/extensions/viewproc.py:86 msgid "Process command" msgstr "Comando do processo" #: ../tcosmonitor/extensions/viewproc.py:91 msgid "Kill this process" msgstr "Encerrar este processo" #: ../tcosmonitor/extensions/viewproc.py:127 msgid "Are you sure you want to stop this process?" msgstr "Tem certeza de que quer encerrar este processo?" #: ../tcosmonitor/extensions/viewproc.py:136 #, python-format msgid "" "Error while killing app:\n" "Reason: %s" msgstr "" "Erro ao fechar a aplicação:\n" "Motivo: %s" #: ../tcosmonitor/extensions/audiortp.py:49 #: ../ui/tcosmonitor-mainwindow.ui:163 msgid "Send audio conference" msgstr "Enviar audioconferência" #: ../tcosmonitor/extensions/audiortp.py:50 #: ../ui/tcosmonitor-prefwindow.ui:1507 msgid "Audio chat conference" msgstr "Chat de audioconferência" #: ../tcosmonitor/extensions/audiortp.py:51 #: ../ui/tcosmonitor-mainwindow.ui:275 msgid "Audio chat list" msgstr "Lista do chat de áudio" #: ../tcosmonitor/extensions/audiortp.py:52 msgid "Send audio conference (from this host)" msgstr "Enviar o áudio do microfone (à partir deste terminal)" #: ../tcosmonitor/extensions/audiortp.py:73 msgid "Emission" msgstr "Emissão" #: ../tcosmonitor/extensions/audiortp.py:79 msgid "State" msgstr "Estado" #: ../tcosmonitor/extensions/audiortp.py:83 msgid "Channel" msgstr "Canal" #: ../tcosmonitor/extensions/audiortp.py:235 #: ../tcosmonitor/extensions/audiortp.py:322 #: ../tcosmonitor/extensions/audiortp.py:413 msgid "" "Your pulseaudio server is too old.\n" "Is required pulseaudio version >= 0.9.10" msgstr "" "Seu servidor PulseAudio é muito antigo.\n" "É requerida a versão superior a 0.9.10." #: ../tcosmonitor/extensions/audiortp.py:238 #, python-format msgid "Do you want to start audio conference to the following users: %s?" msgstr "Quer iniciar a audioconferência para os seguintes usuários: %s?" #: ../tcosmonitor/extensions/audiortp.py:243 msgid "You have entered in audio conference" msgstr "Você entrou na audioconferência" #: ../tcosmonitor/extensions/audiortp.py:267 msgid "Waiting for start audio conference..." msgstr "Aguardando o início da audioconferência..." #: ../tcosmonitor/extensions/audiortp.py:295 #: ../tcosmonitor/extensions/audiortp.py:390 #, python-format msgid "Running in audio conference with %s clients." msgstr "Executando a audioconferência com %s terminais." #: ../tcosmonitor/extensions/audiortp.py:305 #, python-format msgid "Running in audio conference from server. Conference Nº %s" msgstr "Executando a audioconferência a partir do servidor. Conferência Nº %s" #: ../tcosmonitor/extensions/audiortp.py:316 msgid "Can't start conference mode, user is not logged" msgstr "" "Não foi possível iniciar o modo demostração,\n" "o usuário não está logado." #: ../tcosmonitor/extensions/audiortp.py:325 #, python-format msgid "Do you want audio conference from user %s?" msgstr "Quer iniciar a audioconferência do usuário %s?" #: ../tcosmonitor/extensions/audiortp.py:331 #, python-format msgid "You have entered in audio conference from user %s" msgstr "Você entrou na audioconferência do usuário %s?" #: ../tcosmonitor/extensions/audiortp.py:359 #, python-format msgid "Waiting for start audio conference from user %s..." msgstr "Aguardando o início da audioconferência do usuário %s ..." #: ../tcosmonitor/extensions/audiortp.py:400 #, python-format msgid "Running in audio conference from user %(host)s. Conference Nº %(count)s" msgstr "" "Executando a audioconferência do usuário %(host)s. Conferência Nº %(count)s" #: ../tcosmonitor/extensions/audiortp.py:416 #, python-format msgid "Do you want to start audio chat conference to the following users: %s?" msgstr "" "Você quer iniciar um chat de audioconferência para os seguintes\n" "usuários: %s?" #: ../tcosmonitor/extensions/audiortp.py:421 #, python-format msgid "You have entered in audio chat conference. Participants: %s" msgstr "Você entrou no chat da audioconferência. %s participantes." #: ../tcosmonitor/extensions/audiortp.py:443 msgid "Waiting for start audio chat conference..." msgstr "Aguardando o início do chat de audioconferência..." #: ../tcosmonitor/extensions/audiortp.py:449 msgid "Do you want to connect to this audio chat conference now?" msgstr "Você quer se conectar nesta audioconferência agora?" #: ../tcosmonitor/extensions/audiortp.py:483 #, python-format msgid "Running in audio chat conference with %s clients." msgstr "Executando a audioconferência com %s terminais." #: ../tcosmonitor/extensions/audiortp.py:495 #, python-format msgid "Running in audio chat conference. Conference Nº %s" msgstr "Executando a audioconferência. Conferência N° %s" #: ../tcosmonitor/extensions/audiortp.py:521 msgid "Conference mode off." msgstr "Modo conferência desativado." #: ../tcosmonitor/extensions/audiortp.py:540 msgid "Audio chat conference off." msgstr "Chat de audioconferência desativado" #: ../tcosmonitor/TcosXmlRpc.py:85 msgid "" "Username or password are empty,\n" "please edit in preferences dialog!" msgstr "" "O usuário ou a senha estão vazios,\n" "por favor, edite o menu preferências." #: ../tcosmonitor/TcosIconView.py:55 msgid "Place mouse on any computer to see brief info about it." msgstr "Passe o mouse sobre qualquer terminal para ver uma breve descrição." #: ../tcosmonitor/TcosListView.py:82 msgid "Active" msgstr "Ativo" #: ../tcosmonitor/TcosListView.py:92 msgid "Screen Blocked" msgstr "Tela bloqueada" #: ../tcosmonitor/TcosListView.py:97 msgid "Num of process" msgstr "Num de processos" #: ../tcosmonitor/TcosListView.py:112 msgid "Sel" msgstr "Sel" #: ../tcosmonitor/TcosListView.py:148 #, python-format msgid "Error connecting to tcosxmlrpc in %s" msgstr "Erro! Conectando ao TcosXmlRpc em %s" #: ../tcosmonitor/TcosTrayIcon2.py:154 #, python-format msgid "Floppy: %s" msgstr "Disquete: %s" #: ../tcosmonitor/TcosTrayIcon2.py:156 #, python-format msgid "CDROM: %s" msgstr "CD-ROM: %s" #: ../tcosmonitor/TcosTrayIcon2.py:158 #, python-format msgid "USB: %s" msgstr "USB: %s" #: ../tcosmonitor/TcosTrayIcon2.py:160 #, python-format msgid "HDD partition: %s" msgstr "Partição do HD: %s" #: ../tcosmonitor/TcosTrayIcon2.py:162 #, python-format msgid "Unknow: %s" msgstr "Desconhecido: %s" #: ../tcosmonitor/Initialize.py:217 msgid "GPL-2 license file not found" msgstr "O arquivo da licença GPL-2 não foi encontrado." #: ../tcosmonitor/LocalData.py:212 #, python-format msgid "Selected network inteface (%s) don't have IP address" msgstr "A interface de rede selecionada (%s) não possui endereço IP." #: ../tcosmonitor/LocalData.py:260 ../tcosmonitor/ping.py:108 #: ../tcosmonitor/ping.py:171 msgid "Testing if found clients have 8998 or 8999 port open..." msgstr "" "Verificando se os terminais encontrados possuem as\n" "portas 8998 ou 8999 abertas..." #: ../tcosmonitor/LocalData.py:282 msgid "" "Static list method configured but no hosts in list.\n" "\n" "Please, open preferences, click on 'Open Static Host list' and add some " "hosts." msgstr "" "Está selecionado o método lista estática dos terminais,\n" "mas não há terminais configurados.\n" "\n" "Por favor, acesse o menu preferências,\n" "Clique em 'Abrir lista fixa dos terminais' e adicione\n" "pelo menos um." #: ../tcosmonitor/TcosPreferences.py:264 msgid "" "You have select more than 5 button menus.\n" "Only allowed to select a maximum of 5 buttons." msgstr "" "Você selecionou mais que 5 botões de menu.\n" "São permitidos selecionar apenas 5 botões." #: ../tcosmonitor/TcosPreferences.py:275 msgid "New settings saved." msgstr "Novas configurações salvas." #: ../tcosmonitor/TcosMenus.py:102 ../tcosmonitor/TcosMenus.py:114 #, python-format msgid "Actions for %s" msgstr "Ações para %s" #: ../tcosmonitor/TcosMenus.py:107 msgid "Actions for selected host" msgstr "Ações para o terminal selecionado" #: ../tcosmonitor/TcosMenus.py:168 ../tcosmonitor/TcosMenus.py:299 #, python-format msgid "%d hidden actions" msgstr "%d ações ocultas" #: ../tcosmonitor/TcosMenus.py:243 ../tcosmonitor/TcosMenus.py:245 msgid "Actions for selected hosts" msgstr "Ações para todos os terminais selecionados" #: ../tcosmonitor/TcosMenus.py:247 msgid "Actions for all hosts" msgstr "Ações para todos os terminais" #: ../tcosmonitor/TcosMenus.py:304 msgid "Save hosts positions" msgstr "Posições dos terminais salvas" #: ../tcosmonitor/TcosMenus.py:312 msgid "Reset hosts positions" msgstr "Resetar as posições dos terminais" #: ../tcosmonitor/ping.py:80 #, python-format msgid "Ping to %s..." msgstr "Ping para %s..." #: ../tcosmonitor/ping.py:89 msgid "Waiting for pings..." msgstr "Aguardando as repostas dos pings..." #: ../tcosmonitor/ping.py:127 ../tcosmonitor/ping.py:192 #: ../tcosmonitor/TcosActions.py:185 ../tcosmonitor/TcosActions.py:264 msgid "Not connected hosts found." msgstr "Nenhum terminal conectado foi encontrado" #: ../tcosmonitor/ping.py:134 ../tcosmonitor/ping.py:197 #: ../tcosmonitor/TcosActions.py:187 ../tcosmonitor/TcosActions.py:259 #, python-format msgid "Found %d hosts" msgstr "Encontrado %d terminais" #: ../tcosmonitor/TcosActions.py:162 ../tcosmonitor/TcosActions.py:241 msgid "Searching for connected hosts..." msgstr "Procurando por terminais conectados..." #: ../tcosmonitor/TcosActions.py:1019 msgid "Searching info of hosts..." msgstr "Procurando por informações dos terminais..." #: ../tcosmonitor/TcosActions.py:1058 #, python-format msgid "Connecting to %s..." msgstr "Conectando a %s..." #: ../tcosmonitor/TcosExtensions.py:41 msgid "Exception:" msgstr "Excessão:" #: ../tcosmonitor/TcosExtensions.py:77 msgid "Error: no IP!" msgstr "Erro: sem IP!" #: ../tcosmonitor/TcosExtensions.py:154 msgid "No clients connected, press refresh button." msgstr "Não há terminais conectados, clique no botão atualizar." #: ../tcosmonitor/TcosExtensions.py:251 ../tcosmonitor/TcosExtensions.py:253 #, python-format msgid "Can't exec this action at '%s' because you are connected at this host!" msgstr "" "Não foi possível executar esta ação em: '%s', porque você já está conectado " "nele!" #: ../tcosmonitor/TcosExtensions.py:267 #, python-format msgid "Doing action \"%(action)s\" in %(ip)s..." msgstr "Realizando a ação \"%(action)s\" em %(ip)s ..." #: ../tcosmonitor/TcosExtensions.py:285 #, python-format msgid "Done action \"%(action)s\" in %(ip)s" msgstr "Ação \"%(action)s\" realizada em %(ip)s" #: ../tcosmonitor/TcosCommon.py:89 #, python-format msgid "" "ThreadController: Found error executing %(cmd)s\n" "\n" "If problem persist, disable Thread Controller\n" "in Preferences and report bug.\n" "Error=%(error)s" msgstr "" "ThreadController: Encontrou um erro ao executar %(cmd)s\n" "\n" "Se o problema persistir, desative Thread Controller\n" "no menu Preferências e reporte o bug.\n" "Error=%(error)s" #: ../ui/tcosmonitor-prefwindow.ui:35 ../ui/tcospersonalize.ui:7 #: ../ui/tcosmonitor-mainwindow.ui:36 msgid "Preferences" msgstr "Preferências" #: ../ui/tcosmonitor-prefwindow.ui:62 msgid "Show host list on startup" msgstr "Exibir a lista de terminais no startup" #: ../ui/tcosmonitor-prefwindow.ui:80 msgid "Scan network method" msgstr "Método de busca dos terminais" #: ../ui/tcosmonitor-prefwindow.ui:91 msgid "" "Network interface\n" "(thin client)" msgstr "" "Interface de rede\n" "(thin clients)" #: ../ui/tcosmonitor-prefwindow.ui:127 msgid "Show system process" msgstr "Mostrar os processos do sistema" #: ../ui/tcosmonitor-prefwindow.ui:144 msgid "Don't do actions when running TcosMonitor in thin client" msgstr "" "Não executar ações quando o TcosMonitor\n" "for executado a partir de um terminal." #: ../ui/tcosmonitor-prefwindow.ui:163 msgid "List of hosts" msgstr "Lista de terminais" #: ../ui/tcosmonitor-prefwindow.ui:200 msgid "Open static host list" msgstr "Abrir lista fixa dos terminais" #: ../ui/tcosmonitor-prefwindow.ui:225 msgid "Only show hosts running tcosxmlrpc (8998 port)" msgstr "" "Só mostre os terminais que estão\n" "executando o TcosMxlRpc (porta 8998)" #: ../ui/tcosmonitor-prefwindow.ui:242 msgid "Only do all actions on selected hosts (requires restart TcosMonitor)" msgstr "" "Só realizar as ações para os terminais selecionados \n" "(precisa reiniciar TcosMonitor)." #: ../ui/tcosmonitor-prefwindow.ui:259 msgid "Enable SSL connections to XMLRPC clients" msgstr "Habilitar SSL nas conexões XMLRPC com os terminais" #: ../ui/tcosmonitor-prefwindow.ui:278 msgid "Host list mode" msgstr "Modo Lista" #: ../ui/tcosmonitor-prefwindow.ui:302 msgid "Show right menu with groups (NEW)" msgstr "Mostrar os menus em grupo (NOVO)" #: ../ui/tcosmonitor-prefwindow.ui:319 #, fuzzy msgid "Don't show thin client if TcosMonitor is running there" msgstr "" "Não executar ações quando o TcosMonitor\n" "for executado a partir de um terminal." #: ../ui/tcosmonitor-prefwindow.ui:351 msgid "Settings" msgstr "Configurações" #: ../ui/tcosmonitor-prefwindow.ui:376 msgid "Update host list every (seg)" msgstr "Atualizar a lista de terminais a cada (segundos)" #: ../ui/tcosmonitor-prefwindow.ui:389 msgid "" "Update host list every selected seconds.\n" "\n" "Value=0 disable update." msgstr "" "Atualiza a lista de terminais a cada número\n" "de segundos selecionado\n" "\n" "Valor=0 desabilita a atualização." #: ../ui/tcosmonitor-prefwindow.ui:405 msgid "Cache timeout (seg)" msgstr "Tempo de vida do cache (seg)" #: ../ui/tcosmonitor-prefwindow.ui:419 msgid "" "Cache some data and connection status during selected seconds.\n" "\n" "Value=0 disable cache." msgstr "" "Fazer o cache dos dados e do estado das conexões durante o número\n" "de segundos selecionado.\n" "\n" "Valor=0 desabilita o cache." #: ../ui/tcosmonitor-prefwindow.ui:437 msgid "Screenshot size:" msgstr "Tamanho da captura de tela" #: ../ui/tcosmonitor-prefwindow.ui:450 ../ui/tcosmonitor-prefwindow.ui:479 msgid "% Size of screnshot." msgstr "%s do tamanho da captura de tela" #: ../ui/tcosmonitor-prefwindow.ui:466 msgid "Mini screenshot size:" msgstr "Tamanho das mini-capturas de tela" #: ../ui/tcosmonitor-prefwindow.ui:495 msgid "Timeout actions (seg)" msgstr "Tempo de espera para ações (seg)" #: ../ui/tcosmonitor-prefwindow.ui:508 msgid "" "Timeout in seg for actions\n" "\n" "Value=0 default" msgstr "" "Tempo de espera para ações\n" "\n" "O padrão é 0." #: ../ui/tcosmonitor-prefwindow.ui:526 msgid "SSH remote username" msgstr "Usuário remoto SSH" #: ../ui/tcosmonitor-prefwindow.ui:553 msgid "VLC method to send" msgstr "VLC método de envio" #: ../ui/tcosmonitor-prefwindow.ui:578 msgid "" "Experimental: Thread Controller\n" "( if you have problems, disable it )" msgstr "" "Experimente usar o\n" "Controle de Threads\n" "( Se tiver problemas, desative-o )." #: ../ui/tcosmonitor-prefwindow.ui:591 msgid "Actions controlled" msgstr "Ações controladas" #: ../ui/tcosmonitor-prefwindow.ui:611 msgid "Block ports: (80,8080... etc)" msgstr "Portas bloqueadas: (80,8080... etc)" #: ../ui/tcosmonitor-prefwindow.ui:653 ../ui/tcospersonalize.ui:333 msgid "Advanced" msgstr "Avançado" #: ../ui/tcosmonitor-prefwindow.ui:680 msgid "TcosXmlRpc username" msgstr "Usuário do TcosXmlRpc" #: ../ui/tcosmonitor-prefwindow.ui:706 msgid "TcosXmlRpc password" msgstr "Senha do TcosXmlRpc" #: ../ui/tcosmonitor-prefwindow.ui:735 msgid "" "NOTE:\n" "Default user is root and default password is root.\n" "\n" "For thin clients change TCOS_ROOT_PASSWD or use TcosConfig and " "regenerate boot images again.\n" "\n" "For standalone users you can use a system account (root) but this is " "not recomended. Install tcos-standalone and start it by root. Set user and " "password, this will create a /etc/tcospasswd file only used by TCOS " "and your root acount will be secure." msgstr "" "NOTA:\n" "Para administrar os terminais, o usuário padrão é root\n" "e a senha é root.\n" " \n" "Você pode modificá-los com o TCOS_ROOT_PASSWD ou com\n" "TcosConfig e depois gerar as imagens de inicialização novamente.\n" "\n" "Para os terminais autonomos(standalone) pode usar a conta do sistema\n" "(root), mas isto não é recomendável, instale o pacote tcos-standalone, " "execute-o como administrador e configure um usuário. A senha será\n" "armazenada em /etc/tcospasswd, arquivo que só precisa do TCOS,\n" "porque a sua conta de root estará a salva." #: ../ui/tcosmonitor-prefwindow.ui:772 msgid "Authentication " msgstr "Autenticação" #: ../ui/tcosmonitor-prefwindow.ui:795 msgid "Info avalaible from tcosxmlrpc" msgstr "Informações disponíveis do TcosXmlRpc" #: ../ui/tcosmonitor-prefwindow.ui:806 msgid "Tcos general info" msgstr "Informações gerais do TCOS" #: ../ui/tcosmonitor-prefwindow.ui:821 msgid "Cpu info" msgstr "Informações da CPU" #: ../ui/tcosmonitor-prefwindow.ui:836 msgid "Kernel and modules info" msgstr "Informações do Kernel e dos módulos" #: ../ui/tcosmonitor-prefwindow.ui:851 msgid "PCI bus info" msgstr "Informações dos dispositivos PCI" #: ../ui/tcosmonitor-prefwindow.ui:866 msgid "Ram and swap info" msgstr "Informações da memória RAM e SWAP" #: ../ui/tcosmonitor-prefwindow.ui:881 msgid "Process info" msgstr "Informações do processo" #: ../ui/tcosmonitor-prefwindow.ui:896 msgid "Network info" msgstr "Informações da rede" #: ../ui/tcosmonitor-prefwindow.ui:926 msgid "Sound server info" msgstr "Informações do servidor de som" #: ../ui/tcosmonitor-prefwindow.ui:962 msgid "Avalaible info" msgstr "Informações disponíveis" #: ../ui/tcosmonitor-prefwindow.ui:985 msgid "Show / hide menu items" msgstr "Mostrar/ocultar os itens do menu" #: ../ui/tcosmonitor-prefwindow.ui:1003 msgid "Lock and unlock screen" msgstr "Bloquear/desbloquear a tela" #: ../ui/tcosmonitor-prefwindow.ui:1019 msgid "Remote SSH shell" msgstr "Shell SSH remoto" #: ../ui/tcosmonitor-prefwindow.ui:1037 msgid "Configure Xorg settings" msgstr "Configurações do Xorg" #: ../ui/tcosmonitor-prefwindow.ui:1066 ../ui/tcosmonitor-prefwindow.ui:1427 msgid "Exe app on user display" msgstr "Executar uma aplicação" #: ../ui/tcosmonitor-prefwindow.ui:1082 ../ui/tcosmonitor-prefwindow.ui:1441 msgid "Send a text message" msgstr "Enviar menssagem de texto" #: ../ui/tcosmonitor-prefwindow.ui:1100 msgid "Show running apps" msgstr "Mostrar as aplicações em execução" #: ../ui/tcosmonitor-prefwindow.ui:1116 ../ui/tcosmonitor-prefwindow.ui:1457 msgid "Send video broadcast" msgstr "Enviar um vídeo em broadcast" #: ../ui/tcosmonitor-prefwindow.ui:1150 msgid "Demo mode" msgstr "Modo demonstração" #: ../ui/tcosmonitor-prefwindow.ui:1179 msgid "Wake on LAN" msgstr "Wake on LAN" #: ../ui/tcosmonitor-prefwindow.ui:1195 msgid "Audio conference mode" msgstr "Modo de audioconferência" #: ../ui/tcosmonitor-prefwindow.ui:1213 msgid "Screenshots" msgstr "Capturas de tela" #: ../ui/tcosmonitor-prefwindow.ui:1229 msgid "Reboot and poweroff" msgstr "Reinicializar ou desligar" #: ../ui/tcosmonitor-prefwindow.ui:1243 msgid "Lock and unlock internet" msgstr "Bloquear/desbloquear o acesso a Internet" #: ../ui/tcosmonitor-prefwindow.ui:1259 msgid "DPMS monitor on/off" msgstr "Ligar/desligar o DPMS no monitor" #: ../ui/tcosmonitor-prefwindow.ui:1277 msgid "Connect using VNC" msgstr "Conectar usando o VNC" #: ../ui/tcosmonitor-prefwindow.ui:1293 msgid "Connect using iTALC" msgstr "Conectar usando o iTALC" #: ../ui/tcosmonitor-prefwindow.ui:1308 msgid "Restart session with new settings" msgstr "Reiniciar a sessão com as novas configurações" #: ../ui/tcosmonitor-prefwindow.ui:1385 msgid "Menus" msgstr "Menus" #: ../ui/tcosmonitor-prefwindow.ui:1408 msgid "Show / hide menu buttons" msgstr "Mostrar/ocultar os menus da aplicação" #: ../ui/tcosmonitor-prefwindow.ui:1491 msgid "Audio conference" msgstr "Audioconferência" #: ../ui/tcosmonitor-prefwindow.ui:1525 msgid "Audio Chat control" msgstr "Controle de Chat de Áudio" #: ../ui/tcosmonitor-prefwindow.ui:1569 msgid "Menu buttons" msgstr "Menu Botões" #: ../ui/tcosmonitor-abouttcos.ui:6 msgid "About TCOS" msgstr "Sobre o TCOS" #: ../ui/tcosmonitor-abouttcos.ui:19 msgid "TcosMonitor" msgstr "TcosMonitor" #: ../ui/tcosmonitor-abouttcos.ui:62 msgid "Version:" msgstr "Versão:" #: ../ui/tcosmonitor-abouttcos.ui:90 msgid "" "Thin client and standalone\n" "monitoring tool." msgstr "" "Ferramenta de monitoramento\n" "dos terminais." #: ../ui/tcosmonitor-abouttcos.ui:131 msgid "Project web site" msgstr "Site do projeto" #: ../ui/tcosmonitor-abouttcos.ui:178 msgid "About" msgstr "Sobre" #: ../ui/tcosmonitor-abouttcos.ui:212 msgid "License" msgstr "Licença" #: ../ui/tcosmonitor-abouttcos.ui:230 msgid "" "Main developers:\n" " * Mario Izquierdo \n" " * Ignacio Vidal \n" "\n" "Contributors:\n" " * Andrés Jimenez\n" " * Quirón\n" "\n" "Special thanks to:\n" " Comunidad de Madrid, MaX group (Spain)" msgstr "" "Desenvolvedores principais :\n" " * Mario Izquierdo \n" " * Ignacio Vidal \n" "\n" "Colaboradores:\n" " * Andrés Jimenez\n" " * Quirón\n" "\n" "Agradescimento especial a:\n" " Comunidade de Madri, Grupo MaX(Espanha)" #: ../ui/tcosmonitor-abouttcos.ui:259 msgid "Authors" msgstr "Autores:" #: ../ui/tcosmonitor-abouttcos.ui:275 msgid "Translated to your language by:" msgstr "" "Traduzido por:\n" "Aécio dos Santos Pires \n" "\n" "Luis Méndez Alejo\n" "\n" "\n" "Maria del Mar Alejo Campos\n" "" #: ../ui/tcosmonitor-abouttcos.ui:287 msgid "Mario Izquierdo " msgstr "Mario Izquierdo " #: ../ui/tcosmonitor-abouttcos.ui:307 msgid "Translators" msgstr "Tradutores" #: ../ui/tcosmonitor-abouttcos.ui:324 msgid "" "TCOS is a free software project that need a lot of work to be the best thin " "client plataform.\n" "\n" "We work every day a lot of hours to make changes and support more devices " "and features.\n" "\n" "We want to continue developing this software but need your help, if you use, " "sell or hack TCOS pehaps you could donate some money to project.\n" "\n" "Click on next url to get some info." msgstr "" "O TCOS é um projeto de Software Livre que precisa\n" "de muito trabalho para tentar ser a melhor\n" "plataforma para o uso de thin clients.\n" "\n" "Diariamente, trabalhamos durante muitas horas\n" "para fazer modificações e suportar mais dispositivos\n" "e características.\n" "\n" "Queremos continuar fazendo isto, mas precisamos\n" "da sua ajuda. Se você usar, vender ou modificar o TCOS,\n" "talvez possa doar algum dinheiro ao projeto.\n" "\n" "Clique no botão 'Doações' para obter mais informações." #: ../ui/tcosmonitor-abouttcos.ui:370 msgid "http://wiki.tcosproject.org/TcosProject:Site_support" msgstr "http://wiki.tcosproject.org/TcosProject:Site_support/es" #: ../ui/tcosmonitor-abouttcos.ui:392 msgid "Don't show donations message on start." msgstr "Não mostrar a mensagem de doação no início." #: ../ui/tcosmonitor-abouttcos.ui:415 msgid "Donate" msgstr "Doações" #: ../ui/tray.ui:20 msgid "TCOS devices" msgstr "Dispositivos TCOS" #: ../ui/tray.ui:57 msgid "Hide" msgstr "Ocultar" #: ../ui/tcos-volume-manager.ui:39 msgid "Restart sound" msgstr "Reiniciar o som" #: ../ui/tcos-volume-manager.ui:54 msgid "Sound levels" msgstr "Níveis de som" #: ../ui/tcos-volume-manager.ui:90 msgid "Main Channels" msgstr "Canais de som principais" #: ../ui/tcos-volume-manager.ui:113 msgid "Secondary Channels" msgstr "Canais de som secundários" #: ../ui/tcosmonitor-chatwindow.ui:8 msgid "Chat emission list" msgstr "Lista de emissão do chat" #: ../ui/tcosmonitor-chatwindow.ui:17 msgid "Chat emission list" msgstr "Lista de Emissão do Chat" #: ../ui/tcosmonitor-chatwindow.ui:80 msgid "Connect" msgstr "Conectar" #: ../ui/tcosmonitor-chatwindow.ui:128 msgid "Disconnect" msgstr "Desconectar" #: ../ui/tcosmonitor-chatwindow.ui:176 msgid "Exit" msgstr "Sair" #: ../ui/tcosmonitor-staticwindow.ui:8 msgid "Static hosts list" msgstr "Lista Fixa de Terminais" #: ../ui/tcosmonitor-staticwindow.ui:17 msgid "Static Hosts list" msgstr "Lista Fixa de Terminais" #: ../ui/tcosmonitor-staticwindow.ui:80 msgid "Add" msgstr "Adicionar" #: ../ui/tcosmonitor-staticwindow.ui:128 msgid "Modify" msgstr "Modificar" #: ../ui/tcosmonitor-staticwindow.ui:176 msgid "Delete" msgstr "Deletar" #: ../ui/tcosmonitor-staticwindow.ui:225 msgid "Get from connected" msgstr "Obter a partir dos conectados" #: ../ui/tcosmonitor-staticwindow.ui:292 ../ui/tcosmonitor-mainwindow.ui:771 #: ../ui/tcosmonitor-staticwindownew.ui:150 msgid "Cancel" msgstr "Cancelar" #: ../ui/tcosmonitor-staticwindow.ui:340 #: ../ui/tcosmonitor-staticwindownew.ui:198 msgid "Save" msgstr "Salvar" #: ../ui/tcospersonalize.ui:34 msgid "unknow host" msgstr "terminal desconhecido" #: ../ui/tcospersonalize.ui:74 msgid "Disable Ctrl + Alt + Backspace (for kill Xorg)" msgstr "Desabilitar Ctrl+Alt+Backspace (para matar o Xorg)" #: ../ui/tcospersonalize.ui:211 msgid "Get avalaible drivers" msgstr "Carregar os drivers disponíveis" #: ../ui/tcospersonalize.ui:248 msgid "Display Settings" msgstr "Configuração Gráfica" #: ../ui/tcospersonalize.ui:351 msgid "Default boot kernel" msgstr "Kernel de inicialização padrão" #: ../ui/tcospersonalize.ui:376 msgid "PXE Boot options" msgstr "Opções de inicialização via PXE" #: ../ui/tcospersonalize.ui:391 msgid "Default boot method" msgstr "Método de inicialização padrão" #: ../ui/tcospersonalize.ui:419 msgid "Command line" msgstr "Linha de comando" #: ../ui/tcospersonalize.ui:507 msgid "Boot options" msgstr "Opções de inicialização" #: ../ui/tcospersonalize.ui:551 msgid "Delete Config" msgstr "Apagar as configurações" #: ../ui/tcosmonitor-mainwindow.ui:8 msgid "TcosMonitor" msgstr "TcosMonitor" #: ../ui/tcosmonitor-mainwindow.ui:22 msgid "Exit TcosMonitor" msgstr "Sair do TcosMonitor" #: ../ui/tcosmonitor-mainwindow.ui:35 msgid "Open preferences dialog" msgstr "Abrir o menu Prefêrencias" #: ../ui/tcosmonitor-mainwindow.ui:48 msgid "Update host list" msgstr "Atualizar a lista de terminais" #: ../ui/tcosmonitor-mainwindow.ui:49 msgid "Refresh" msgstr "Atualizar" #: ../ui/tcosmonitor-mainwindow.ui:71 msgid "All Hosts" msgstr "Todos os terminais" #: ../ui/tcosmonitor-mainwindow.ui:99 msgid "Find" msgstr "Pesquisar" #: ../ui/tcosmonitor-mainwindow.ui:111 msgid "About this app" msgstr "Sobre esta aplicação" #: ../ui/tcosmonitor-mainwindow.ui:219 msgid "Start audio chat" msgstr "Iniciar chat de áudio" #: ../ui/tcosmonitor-mainwindow.ui:331 msgid "Send audio/video" msgstr "Enviar áudio/vídeo" #: ../ui/tcosmonitor-mainwindow.ui:443 msgid "Exe app" msgstr "Executar aplicação" #: ../ui/tcosmonitor-mainwindow.ui:499 msgid "Send message" msgstr "Enviar mensagem" #: ../ui/tcosmonitor-mainwindow.ui:581 msgid "List view" msgstr "Visualizar lista" #: ../ui/tcosmonitor-mainwindow.ui:629 msgid "Icon view" msgstr "Visualizar ícone" #: ../ui/tcosmonitor-mainwindow.ui:689 msgid "Simulate my classroom" msgstr "Simule minha sala de aula" #: ../ui/tcosmonitor-staticwindownew.ui:8 msgid "New or edit hosts" msgstr "Novo ou editar terminal" #: ../ui/tcosmonitor-staticwindownew.ui:32 msgid "" "You can add a simple host, \n" " example: 192.168.0.100\n" "\n" "or range of hosts, \n" " example: 192.168.0.100-120\n" "\n" "MAC address is optional" msgstr "" "Você pode adicionar um terminal.\n" " Exemplo: 192.168.0.100\n" "\n" "Ou adicionar uma faixa de rede. \n" " Exemplo: 192.168.0.100-120\n" "\n" "O endereço MAC é opcional." #: ../ui/tcosmonitor-staticwindownew.ui:57 msgid "IP address *" msgstr "Endereço IP *" #: ../ui/tcosmonitor-askwindow.ui:8 msgid "Question" msgstr "Pergunta" #: ../ui/tcosmonitor-askwindow.ui:50 msgid "You can drag and drop launcher file to this box" msgstr "Pode arrastar e soltar um lançador nesta caixa" #: ../ui/tcosmonitor-askwindow.ui:61 msgid "Run app in unknow host" msgstr "Executar as aplicações no terminal desconhecido" #~ msgid "Lliurex Lab" #~ msgstr "Laboratório Lliurex" #~ msgid "" #~ "Cloning client, please wait.\n" #~ "Poweroff button has been temporaly disabled..." #~ msgstr "" #~ "Clonando o terminal, por favor espere.\n" #~ "O botão desligar foi temporariamente desabilitado..." #~ msgid "Client successfully cloned!!. Please restart client." #~ msgstr "Terminal clonado com sucesso!! Por favor reinicie-o." #~ msgid "Cloning has failed!!" #~ msgstr "Falha ao clonar!!" #~ msgid "Normal" #~ msgstr "Normal" #~ msgid "Quit from TcosMonitor" #~ msgstr "Sair do TcosMonitor" #~ msgid "Salir de Lliurex Lab" #~ msgstr "Sair do laboratório Lliurex" #~ msgid "Lliurex Lab" #~ msgstr "TcosMonitor" #~ msgid "About Lliurex Lab" #~ msgstr "Sobre o laboratório Lliurex" #~ msgid "Clonning clients...." #~ msgstr "Clonando terminais..." #~ msgid "Open share" #~ msgstr "Abrir compartilhamento" #~ msgid "Program mode" #~ msgstr "Modo programa" #~ msgid "Clone clients" #~ msgstr "Clonar terminais" #~ msgid "Can't move icon, another host is near." #~ msgstr "Não pôde mover o ícone. Outro terminal etá ocupando esta posição" #~ msgid "" #~ "Error getting Xorg info:\n" #~ "%s" #~ msgstr "" #~ "Erro ao obter a informação do Xorg:\n" #~ "%s" #~ msgid "Send my MIC audio" #~ msgstr "Enviar meu áudio do microfone" #~ msgid "Chat conference mode off." #~ msgstr "Chat de conferência desativada." #~ msgid "No host found" #~ msgstr "Nenhum terminal foi encontrado" tcosmonitor/po/Makefile0000664000000000000000000000300712260544373012412 0ustar LANGUAGES=es pt_BR ca ca@valencia gl fr all: gmo clean: @echo " **CLEAN**" @rm -rf *.mo *~ tmp/ @for lang in $(LANGUAGES); do \ echo " **CLEANDIR** $$lang"; \ rm -rf $$lang;\ done files: # find ../ -name "*.ui" -o -name "*.py" | grep -v WakeOnLan > FILES pot: find ../ -name "*.ui" | grep -v WakeOnLan > FILES.ui.txt find ../ -name "*.py" | grep -v WakeOnLan > FILES.py.txt # xgettext --add-comments -o tcosmonitor.pot --files-from=FILES xgettext -o tcosmonitor.py.pot --files-from=FILES.py.txt --language=Python xgettext -o tcosmonitor.ui.pot --files-from=FILES.ui.txt --language=Glade msgcat -o tcosmonitor.pot tcosmonitor.py.pot tcosmonitor.ui.pot rm -f tcosmonitor.py.pot tcosmonitor.ui.pot FILES.ui.txt FILES.py.txt po: @for lang in $(LANGUAGES); do \ echo " **PO** $$lang"; \ if [ ! -f $$lang.po ]; then \ msginit --input tcosmonitor.pot -o $$lang-old.po;\ else \ mv $$lang.po $$lang-old.po; \ fi ; \ msgmerge -o $$lang.po $$lang-old.po tcosmonitor.pot; \ rm -f $$lang-old.po; \ done gmo: @echo " **COMPILING** languages: $(LANGUAGES)" @for lang in $(LANGUAGES); do \ echo " **COMPILEMO** $$lang" ; \ mkdir -p $$lang/LC_MESSAGES/; \ msgfmt --verbose -o $$lang/LC_MESSAGES/tcosmonitor.mo $$lang.po; \ done install: @echo " **INSTALL** languages: $(LANGUAGES)" @for lang in $(LANGUAGES); do \ echo " **INSTALLMO** $$lang" ; \ mkdir -p $(DESTDIR)/usr/share/locale/$$lang/LC_MESSAGES/; \ msgfmt -o $(DESTDIR)/usr/share/locale/$$lang/LC_MESSAGES/tcosmonitor.mo $$lang.po; \ done tcosmonitor/po/qcv.po0000664000000000000000000024473212260544373012117 0ustar # translation of devhelp.po to # Devhelp translation to Catalan. # Copyright © 2003, 2008 Free Software Foundation, Inc. # Aleix Badia , 2003. # Raül Cambeiro , 2003. # Jordi Mallach , 2003. # # msgid "" msgstr "" "Project-Id-Version: qcv\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-02-09 20:04+0100\n" "PO-Revision-Date: 2008-10-30 18:05+0100\n" "Last-Translator: Pilar Embid Giner \n" "Language-Team: Valencian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: ../tcosmonitor.py:127 #, python-format msgid "" "The user \"%s\" must be member of the group \"tcos\" to exec tcosmonitor.\n" "\n" "If you are system administrator, add your user to tcos group." msgstr "" "L'usuari \"%s\" ha de ser membre del grup \"tcos\".\n" "\n" "Si sou administrador del sistema, afegiu l'usuari al grup tcos." #: ../tcosmonitor.py:144 ../tcosmonitor/shared.py:116 msgid "Lliurex Lab" msgstr "Lliurex Lab" #: ../tcosmonitor.py:255 msgid "Send files disabled. rsync not configured." msgstr "L'enviament de fitxer està inhabilitat. No està configutat rsync." #: ../tcosmonitor.py:340 ../tcospersonalize.py:552 #: ../tcos-volume-manager.py:374 msgid "Exiting" msgstr "S'està eixint" #: ../tcos-devices-ng.py:189 #, python-format msgid "Rebooting in %s seconds" msgstr "L'equip es reiniciarà en %s segons" #: ../tcos-devices-ng.py:191 #, python-format msgid "Shutting down in %s seconds" msgstr "L'equip s'apagarà en %s segons" #: ../tcos-devices-ng.py:207 ../tcos-devices-ng.py:210 #, python-format msgid "" "ERROR during action %(action)s:\n" "%(errortxt)s" msgstr "" "S'ha produït un ERROR mentres es realitzava l'acció %(action)s:\n" "%(errortxt)s" #: ../tcos-devices-ng.py:240 msgid "Tcos device daemon" msgstr "Dimoni de dispositius TCOS" #: ../tcos-devices-ng.py:284 ../tcos-volume-manager.py:143 #, python-format msgid "Error connecting with TcosXmlRpc in %s." msgstr "S'ha produït un error mentres es connectava amb tcosxmlrpc en %s" #: ../tcos-devices-ng.py:308 #, python-format msgid "Cdrom device %s" msgstr "Dispositiu cdrom %s" #: ../tcos-devices-ng.py:311 msgid "Mount Cdrom" msgstr "Munta el cdrom" #: ../tcos-devices-ng.py:312 msgid "Umount Cdrom" msgstr "Desmunta el cdrom" #: ../tcos-devices-ng.py:334 #, python-format msgid "Disk partition %s" msgstr "Partición del disc %s" #: ../tcos-devices-ng.py:337 msgid "Mount disk partition" msgstr "Munta la partició del disc" #: ../tcos-devices-ng.py:338 msgid "Umount disk partition" msgstr "Desmunta la partició del disc" #: ../tcos-devices-ng.py:350 msgid "No floppy detected" msgstr "No s'ha detectat cap disquet" #: ../tcos-devices-ng.py:362 ../tcos-devices-ng.py:683 #: ../tcos-devices-ng.py:689 ../tcos-devices-ng.py:695 msgid "Floppy" msgstr "Disquet" #: ../tcos-devices-ng.py:365 msgid "Mount Floppy" msgstr "Munta el disquet" #: ../tcos-devices-ng.py:366 msgid "Umount Floppy" msgstr "Desmunta el disquet" #: ../tcos-devices-ng.py:376 msgid "Floppy mounted. Ready for use." msgstr "Disquet muntat. Preparat per a usar." #: ../tcos-devices-ng.py:378 msgid "Floppy umounted. You can extract it." msgstr "Disquet desmuntat. Ara pot extraure'l." #: ../tcos-devices-ng.py:394 msgid "Hard disk partition mounted. Ready for use." msgstr "Partició muntada del disc dur. Preparat per a usar." #: ../tcos-devices-ng.py:397 msgid "Hard disk partition umounted." msgstr "Partició desmuntada del disc dur." #: ../tcos-devices-ng.py:419 msgid "Audio cdrom mounted., you can listen music opening wav files." msgstr "Cdrom d'àudio muntat., ara podeu obrir els fitxers de música wav." #: ../tcos-devices-ng.py:421 msgid "Cdrom mounted. Ready for use." msgstr "Cdrom muntat. Preparat per a usar." #: ../tcos-devices-ng.py:424 msgid "Cdrom umounted. You can extract it." msgstr "Cdrom desmuntat. Ara podeu extraure'l." #: ../tcos-devices-ng.py:448 msgid "" "Cloning client, please wait.\n" "Poweroff button has been temporaly disabled..." msgstr "" #: ../tcos-devices-ng.py:453 msgid "Client successfully cloned!!. Please restart client." msgstr "" #: ../tcos-devices-ng.py:458 msgid "Cloning has failed!!" msgstr "" #: ../tcos-devices-ng.py:538 #, python-format msgid "" "Mounting device %s\n" "Please wait..." msgstr "" "S'està muntant el dispositiu %s\n" "Per favor, espere..." #: ../tcos-devices-ng.py:587 msgid "Error mounting LTSPFS, check versions of LTSPFS packages" msgstr "" "S'ha produït un error mentres es muntava LTSPFS, comproveu les versions dels " "paquets LTSPFS" #: ../tcos-devices-ng.py:613 #, python-format msgid "" "Umounting device %s.\n" "Please wait..." msgstr "" "S'està desmuntant el dispositiu %s.\n" "Per favor, espere..." #: ../tcos-devices-ng.py:660 msgid "usbdisk" msgstr "disc-usb" #: ../tcos-devices-ng.py:662 msgid "firewiredisk" msgstr "disc-firewire" #: ../tcos-devices-ng.py:687 msgid "Can't mount floppy" msgstr "No es pot muntar el disquet" #: ../tcos-devices-ng.py:698 msgid "Can't umount floppy" msgstr "No es pot desmuntar el disquet" #: ../tcos-devices-ng.py:711 ../tcos-devices-ng.py:721 #: ../tcos-devices-ng.py:732 ../tcos-devices-ng.py:847 #: ../tcos-devices-ng.py:859 ../tcos-devices-ng.py:878 #: ../tcos-devices-ng.py:890 ../tcos-devices-ng.py:922 #, python-format msgid "Cdrom_%s" msgstr "Cdrom_%s" #: ../tcos-devices-ng.py:719 msgid "Can't mount cdrom" msgstr "No es pot muntar el cdrom" #: ../tcos-devices-ng.py:735 msgid "Can't umount cdrom" msgstr "No es pot desmuntar el cdrom" #: ../tcos-devices-ng.py:753 ../tcos-devices-ng.py:763 #: ../tcos-devices-ng.py:774 #, python-format msgid "Disk_%s" msgstr "Disc_%s" #: ../tcos-devices-ng.py:761 msgid "Can't mount hard disk partition" msgstr "No es pot muntar la partició del disc dur" #: ../tcos-devices-ng.py:777 msgid "Can't umount hard disk partition" msgstr "No es pot desmuntar la partició del disc dur" #: ../tcos-devices-ng.py:818 #, python-format msgid "" "From terminal %(host)s.\n" "Connected CDROM USB device %(device)s\n" "%(vendor)s %(model)s" msgstr "" "Des del terminal %(host)s.\n" "Dispositiu CDROM USB connectat %(device)s\n" "%(vendor)s %(model)s" #: ../tcos-devices-ng.py:822 #, python-format msgid "CDROM USB device %s" msgstr "Dispositiu CDROM USB %s" #: ../tcos-devices-ng.py:825 #, python-format msgid "Mount CDROM USB device %s" msgstr "Munta el dispositiu CDROM USB %s" #: ../tcos-devices-ng.py:826 #, python-format msgid "Umount CDROM USB device %s" msgstr "Desmunta el dispositiu CDROM USB %s" #: ../tcos-devices-ng.py:851 ../tcos-devices-ng.py:882 #: ../tcos-devices-ng.py:1012 ../tcos-devices-ng.py:1023 #: ../tcos-devices-ng.py:1069 ../tcos-devices-ng.py:1149 #: ../tcos-devices-ng.py:1160 ../tcos-devices-ng.py:1206 #, python-format msgid "Error, can't mount device %s" msgstr "S'ha produït un error, no es pot muntar el dispositiu %s" #: ../tcos-devices-ng.py:909 #, python-format msgid "" "From terminal %(host)s.\n" "Disconnected CDROM USB device %(device)s\n" "%(vendor)s %(model)s" msgstr "" "Des del terminal %(host)s.\n" "Dispositiu CDROM USB desconnectat %(device)s\n" "%(vendor)s %(model)s" #: ../tcos-devices-ng.py:937 #, python-format msgid "Can't umount cdrom usb %s" msgstr "No es pot desmuntar el cdrom usb %s" #: ../tcos-devices-ng.py:962 #, python-format msgid "" "From terminal %(host)s.\n" "Connected USB device %(device)s\n" "%(vendor)s %(model)s" msgstr "" "Des del terminal %(host)s.\n" "Dispositiu USB connectat %(device)s\n" "%(vendor)s %(model)s" #: ../tcos-devices-ng.py:965 #, python-format msgid "" "From terminal %(host)s.\n" "Disconnected USB device %(device)s\n" "%(vendor)s %(model)s" msgstr "" "Des del terminal %(host)s.\n" "Dispositiu USB desconnectat %(device)s\n" "%(vendor)s %(model)s" #: ../tcos-devices-ng.py:993 #, python-format msgid "USB device %s" msgstr "Dispositiu USB %s" #: ../tcos-devices-ng.py:996 #, python-format msgid "Mount USB device %s" msgstr "Munta el dispositiu USB %s" #: ../tcos-devices-ng.py:997 #, python-format msgid "Umount USB device %s" msgstr "Desmunta el dispositiu USB %s" #: ../tcos-devices-ng.py:1099 #, python-format msgid "" "From terminal %(host)s.\n" "Connected Firewire device %(device)s\n" "%(vendor)s %(model)s" msgstr "" "Des del terminal %(host)s.\n" "Dispositiu Firewire connectat %(device)s\n" "%(vendor)s %(model)s" #: ../tcos-devices-ng.py:1102 #, python-format msgid "" "From terminal %(host)s.\n" "Disconnected Firewire device %(device)s\n" "%(vendor)s %(model)s" msgstr "" "Des del terminal %(host)s.\n" "Dispositiu Firewire desconnectat %(device)s\n" "%(vendor)s %(model)s" #: ../tcos-devices-ng.py:1130 #, python-format msgid "Firewire device %s" msgstr "Dispositiu Firewire %s" #: ../tcos-devices-ng.py:1133 #, python-format msgid "Mount Firewire device %s" msgstr "Munta el dispositiu Firewire %s" #: ../tcos-devices-ng.py:1134 #, python-format msgid "Umount Firewire device %s" msgstr "Desmunta el dispositiu Firewire %s" #: ../tcos-devices-ng.py:1217 #, python-format msgid "CDROM USB device %s umounted. You can extract it." msgstr "Dispositiu CDROM USB %s desmuntat. Ara podeu extraure'l." #: ../tcos-devices-ng.py:1220 #, python-format msgid "CDROM USB device %s mounted. Ready for use." msgstr "Dispositiu CDROM USB %s muntat. Preparat per a usar." #: ../tcos-devices-ng.py:1258 #, python-format msgid "USB device %s umounted. You can extract it." msgstr "Dispositiu USB %s desmuntat. Ara podeu extraure'l." #: ../tcos-devices-ng.py:1261 #, python-format msgid "USB device %s mounted. Ready for use." msgstr "Dispositiu USB %s muntat. Preparat per a usar." #: ../tcos-devices-ng.py:1297 #, python-format msgid "Firewire device %s umounted. You can extract it." msgstr "Dispositiu Firewire %s desmuntat. Ara podeu extraure'l." #: ../tcos-devices-ng.py:1300 #, python-format msgid "Firewire device %s mounted. Ready for use." msgstr "Dispositiu Firewire %s muntat. Preparat per a usar." #: ../tray.glade:38 msgid "TCOS devices" msgstr "" #: ../tray.glade:105 msgid "Hide" msgstr "" #: ../tcospersonalize.glade:8 ../tcosmonitor.glade:60 #: ../tcosmonitor.glade:1405 msgid "Preferences" msgstr "Preferències" #: ../tcospersonalize.glade:57 msgid "unknow host" msgstr "equip desconegut" #: ../tcospersonalize.glade:103 ../tcosmonitor/extensions/info.py:365 msgid "Enable mouse wheel" msgstr "Activa la roda del ratolí" #: ../tcospersonalize.glade:125 msgid "Disable Ctrl + Alt + Backspace (for kill Xorg)" msgstr "Inhabilita Ctrl+Alt+Backspace (per a tancar l'Xorg)" #: ../tcospersonalize.glade:146 ../tcosmonitor/extensions/info.py:357 msgid "Xorg Resolution" msgstr "Resolució de l'Xorg" #: ../tcospersonalize.glade:208 ../tcosmonitor/extensions/info.py:359 msgid "Xorg Color depth" msgstr "Profunditat de color de l'Xorg" #: ../tcospersonalize.glade:253 ../tcosmonitor/extensions/info.py:353 msgid "X Session Type" msgstr "Tipus de sessió X" #: ../tcospersonalize.glade:299 ../tcosmonitor/extensions/info.py:361 msgid "DPMS energy monitor control" msgstr "Control d'energia del monitor DPMS" #: ../tcospersonalize.glade:326 ../tcosmonitor/extensions/info.py:355 msgid "Xorg Driver" msgstr "Controlador d'Xorg" #: ../tcospersonalize.glade:352 msgid "Get avalaible drivers" msgstr "Carrega els controladors disponibles" #: ../tcospersonalize.glade:383 msgid "Display Settings" msgstr "Configuració de la pantalla" #: ../tcospersonalize.glade:426 ../tcosmonitor/extensions/info.py:375 msgid "X Horiz sync" msgstr "Sincronització horitzontal X" #: ../tcospersonalize.glade:454 ../tcosmonitor/extensions/info.py:377 msgid "X Vert sync" msgstr "Sincronització vertical X" #: ../tcospersonalize.glade:541 ../tcosmonitor.glade:2500 msgid "Advanced" msgstr "Avançat" #: ../tcospersonalize.glade:573 msgid "Default boot kernel" msgstr "Nucli d'arrancada per defecte" #: ../tcospersonalize.glade:617 msgid "PXE Boot options" msgstr "Opcions d'arrancada de PXE" #: ../tcospersonalize.glade:645 msgid "Default boot method" msgstr "Mètode d'arrancada per defecte" #: ../tcospersonalize.glade:690 msgid "Command line" msgstr "Línia d'ordes" #: ../tcospersonalize.glade:801 msgid "Boot options" msgstr "Opcions d'arrancada" #: ../tcospersonalize.glade:915 msgid "Delete Config" msgstr "Elimina la configuració" #: ../tcos-volume-manager.glade:9 ../tcos-volume-manager.py:229 msgid "Tcos Volume Manager" msgstr "Gestor de volum del TCOS" #: ../tcos-volume-manager.glade:67 msgid "Restart sound" msgstr "" #: ../tcos-volume-manager.glade:90 msgid "Sound levels" msgstr "Nivells de volum" #: ../tcos-volume-manager.glade:152 msgid "Main Channels" msgstr "Canals principals" #: ../tcos-volume-manager.glade:194 msgid "Secondary Channels" msgstr "Canals secundaris" #: ../tcospersonalize.py:115 msgid "" "Need a host to configure!!!\n" "Try exec:\n" " tcospersonalize --host=XXX.XXX.XXX.XXX" msgstr "" "Es necessita una adreça d'equip a configurar!!!\n" "Proveu a executar:\n" " tcospersonalize --host=XXX.XXX.XXX.XXX" #: ../tcospersonalize.py:180 msgid "host: " msgstr "equip: " #: ../tcospersonalize.py:444 msgid "Host down, can't connect to tcosxmlrpc." msgstr "L'equip és inaccessible, no es pot connectar a tcosxmlrpc." #: ../tcospersonalize.py:452 #, python-format msgid "New %d drivers loaded from terminal." msgstr "S'han carregat %d controladors des del terminal." #: ../tcospersonalize.py:511 #, python-format msgid "Really delete config of %s?" msgstr "Esteu segur que voleu eliminar la configuració de %s?" #: ../tcospersonalize.py:514 msgid "Deleted!" msgstr "Esborrat!" #: ../tcos-volume-manager.py:101 ../tcos-volume-manager.py:113 #, python-format msgid "" "Tcos Sound levels on:\n" "%s" msgstr "" "Nivells de volum del TCOS en:\n" "%s" #: ../tcos-volume-manager.py:121 #, python-format msgid "ERROR: It appears that TcosXmlRpc is not running on %s." msgstr "ERROR: Sembla que el tcosxmlrpc no està en execució en %s" #: ../tcos-volume-manager.py:213 msgid "Loading channels info..." msgstr "S'està carregant la informació dels canals..." #: ../tcos-volume-manager.py:226 msgid "Error loading channels info (xauth error)" msgstr "" "S'ha produït un error en carregar la informació de canals (error de xauth)" #: ../tcos-volume-manager.py:230 #, python-format msgid "Sound mixer of %s host" msgstr "Mesclador d'àudio de l'equip %s" #: ../tcos-volume-manager.py:296 ../tcosmonitor/extensions/info.py:442 msgid "Mute" msgstr "Sense so" #: ../tcos-volume-manager.py:315 msgid "Main controls ready" msgstr "Els controls principals estan preparats" #: ../tcos-volume-manager.py:319 msgid "All remote controls loaded." msgstr "Tots els controls remots estan carregats." #: ../tcos-volume-manager.py:328 ../tcosmonitor/extensions/info.py:557 #, python-format msgid "Changing value of %(channel)s channel, to %(value)s%%..." msgstr "S'està canviant el valor del canal %(channel)s, a %(value)s%%..." #: ../tcos-volume-manager.py:335 ../tcosmonitor/extensions/info.py:564 #, python-format msgid "Changed value of %(channel)s channel, to %(value)s" msgstr "S'ha canviat el valor del canal %(channel)s, a %(value)s" #: ../tcos-volume-manager.py:342 ../tcosmonitor/extensions/info.py:571 #, python-format msgid "Unmuting %s channel..." msgstr "S'està eliminant l'emmudiment al canal %s..." #: ../tcos-volume-manager.py:347 ../tcosmonitor/extensions/info.py:576 #, python-format msgid "Muting %s channel..." msgstr "S'està emmudint el canal %s..." #: ../tcos-volume-manager.py:350 ../tcosmonitor/extensions/info.py:579 #, python-format msgid "Status of %(channel)s channel, is \"%(newvalue)s\"" msgstr "L'estat del canal %(channel)s és \"%(newvalue)s\"" #: ../tcosmonitor/TcosDBus.py:86 msgid "TcosDBus not allowed in local display" msgstr "El TcosDBus no està permés en pantalla local." #: ../tcosmonitor/TcosDBus.py:114 #, python-format msgid "Seems that tcosxmlrpc isn't running on host=\"%s\"" msgstr "Sembla que el tcosxmlrpc no s'està executant en l'equip=\"%s\"" #: ../tcosmonitor/TcosDBus.py:135 msgid "tcosxmlrpc ERROR conection unavalaible." msgstr "S'ha produït un ERROR del tcosxmlrpc la connexió no està disponible" #: ../tcosmonitor/TcosDBus.py:151 msgid "ERROR conecting to tcosxmlrpc, check username and password." msgstr "" "No es pot connectar a tcosxmlrpc, comproveu el nom d'usuari i la contrasenya." #: ../tcosmonitor/TcosDBus.py:243 msgid "Message from admin" msgstr "Missatge de l'administrador" #: ../tcosmonitor/TcosDBus.py:333 ../tcosmonitor/TcosDBus.py:349 #: ../tcosmonitor/TcosDBus.py:367 ../tcosmonitor/TcosDBus.py:385 msgid "User not allowed to run this dbus call." msgstr "L'usuari no té permeses estes telefonades dbus." #: ../tcosmonitor/TcosStaticHosts.py:154 ../tcosmonitor/TcosListView.py:69 msgid "IP address" msgstr "Adreça IP" #: ../tcosmonitor/TcosStaticHosts.py:160 ../tcosmonitor.glade:4775 msgid "MAC address" msgstr "Adreça MAC" #: ../tcosmonitor/TcosStaticHosts.py:270 msgid "No hosts found, please click on Refresh button using another method." msgstr "" "No s'han trobat equips, per favor, premeu el botó Actualitza usant un altre " "mètode." #: ../tcosmonitor/shared.py:109 msgid "Traditional list only" msgstr "Només la llista tradicional" #: ../tcosmonitor/shared.py:110 msgid "Icons only" msgstr "Només icones" #: ../tcosmonitor/shared.py:111 msgid "Simulate classroom" msgstr "Simula una aula" #: ../tcosmonitor/shared.py:112 msgid "Lists, icons and classroom with tabs" msgstr "Llistes, icones i aula amb pestanyes" #: ../tcosmonitor/shared.py:117 msgid "Normal" msgstr "Normal" #: ../tcosmonitor/shared.py:276 ../tcosmonitor/shared.py:319 #: ../tcosmonitor/TcosMenus.py:35 msgid "Terminal actions" msgstr "Accions per al terminal" #: ../tcosmonitor/shared.py:277 ../tcosmonitor/shared.py:320 #: ../tcosmonitor/TcosMenus.py:36 msgid "User actions" msgstr "Accions per a l'usuari" #: ../tcosmonitor/shared.py:278 ../tcosmonitor/shared.py:321 #: ../tcosmonitor/TcosMenus.py:37 msgid "Audio, video and files" msgstr "Fitxers d'àudio i vídeo" #: ../tcosmonitor/shared.py:285 ../tcosmonitor/extensions/info.py:47 msgid "Refresh terminal info" msgstr "Actualitza la informació del terminal" #: ../tcosmonitor/shared.py:286 ../tcosmonitor/extensions/clean.py:40 #: ../tcosmonitor/extensions/clean.py:41 msgid "Clean info about terminal" msgstr "Neteja la informació del terminal" #: ../tcosmonitor/shared.py:287 ../tcosmonitor/TcosTrayIcon.py:54 #: ../tcosmonitor/extensions/reboot.py:40 ../tcosmonitor/TcosTrayIcon2.py:58 msgid "Reboot" msgstr "Reinicia" #: ../tcosmonitor/shared.py:288 ../tcosmonitor/TcosTrayIcon.py:55 #: ../tcosmonitor/extensions/reboot.py:42 ../tcosmonitor/TcosTrayIcon2.py:59 msgid "Poweroff" msgstr "Apaga" #: ../tcosmonitor/shared.py:289 ../tcosmonitor/extensions/lockscreen.py:40 msgid "Lock screen" msgstr "Bloqueja la pantalla" #: ../tcosmonitor/shared.py:290 ../tcosmonitor/extensions/lockscreen.py:42 msgid "Unlock screen" msgstr "Desbloqueja la pantalla" #: ../tcosmonitor/shared.py:291 ../tcosmonitor/extensions/italc.py:43 msgid "Connect to remote screen (iTALC)" msgstr "Connecta a la pantalla remota (iTALC)" #: ../tcosmonitor/shared.py:292 ../tcosmonitor/extensions/vnc.py:49 msgid "Connect to remote screen (VNC)" msgstr "Connecta a la pantalla remota (VNC)" #: ../tcosmonitor/shared.py:293 ../tcosmonitor/extensions/screenshot.py:45 msgid "Screenshot" msgstr "Captura de pantalla" #: ../tcosmonitor/shared.py:294 ../tcosmonitor/extensions/remotessh.py:40 msgid "Give a remote xterm" msgstr "Executa un terminal xterm remot" #: ../tcosmonitor/shared.py:295 #: ../tcosmonitor/extensions/tcospersonalize.py:40 msgid "Configure this host" msgstr "Configura este equip" #: ../tcosmonitor/shared.py:296 ../tcosmonitor/extensions/logout.py:40 msgid "Logout client" msgstr "Desconnecta el client" #: ../tcosmonitor/shared.py:297 ../tcosmonitor/extensions/restartxorg.py:41 msgid "Restart X session with new settings" msgstr "Reinicia la sessió X amb la nova configuració" #: ../tcosmonitor/shared.py:298 ../tcosmonitor/extensions/appsmsg.py:53 msgid "Exec app on user display" msgstr "Executa l'aplicació en la pantalla d'usuari" #: ../tcosmonitor/shared.py:299 ../tcosmonitor/extensions/appsmsg.py:54 msgid "Send a text message to user" msgstr "Envia un missatge de text a l'usuari" #: ../tcosmonitor/shared.py:300 ../tcosmonitor/extensions/viewproc.py:41 msgid "Show running apps of this client" msgstr "Mostra les aplicacions en execució d'este client" #: ../tcosmonitor/shared.py:301 ../tcosmonitor/shared.py:339 msgid "Audio/Video broadcast" msgstr "Difusió d'àudio/vídeo" #: ../tcosmonitor/shared.py:302 ../tcosmonitor/shared.py:340 #: ../tcosmonitor/extensions/sendfiles.py:49 #: ../tcosmonitor/extensions/sendfiles.py:50 ../tcosmonitor.glade:627 #: ../tcosmonitor.glade:3205 ../tcosmonitor.glade:3653 msgid "Send files" msgstr "Envia els fitxers" #: ../tcosmonitor/shared.py:303 ../tcosmonitor/extensions/vnc.py:50 msgid "Demo mode (from this host)" msgstr "Mode de demostració (des d'este equip)" #: ../tcosmonitor/shared.py:304 ../tcosmonitor/extensions/wakeonlan.py:41 msgid "Boot client (WakeOnLan)" msgstr "Arranca el client (WakeOnLan)" #: ../tcosmonitor/shared.py:305 #: ../tcosmonitor/extensions/tcosnetcontroller.py:38 msgid "Lock internet" msgstr "Bloqueja Internet" #: ../tcosmonitor/shared.py:306 #: ../tcosmonitor/extensions/tcosnetcontroller.py:39 msgid "Unlock internet" msgstr "Desbloqueja Internet" #: ../tcosmonitor/shared.py:307 ../tcosmonitor/extensions/dpms.py:40 msgid "DPMS Power off monitor" msgstr "Desactiva el DPMS per al monitor (control d'energia del monitor)" #: ../tcosmonitor/shared.py:308 ../tcosmonitor/extensions/dpms.py:42 msgid "DPMS Power on monitor" msgstr "Activa el DPMS per al monitor (control d'energia del monitor)" #: ../tcosmonitor/shared.py:309 msgid "Send MIC audio (from this host)" msgstr "Envia àudio MIC (des d'este equip)" #: ../tcosmonitor/shared.py:328 ../tcosmonitor/extensions/reboot.py:41 msgid "Reboot all clients" msgstr "Reinicia tots els clients" #: ../tcosmonitor/shared.py:329 ../tcosmonitor/extensions/reboot.py:43 msgid "Poweroff all clients" msgstr "Apaga tots els clients" #: ../tcosmonitor/shared.py:330 ../tcosmonitor/extensions/lockscreen.py:41 msgid "Lock all screens" msgstr "Bloqueja totes les pantalles" #: ../tcosmonitor/shared.py:331 ../tcosmonitor/extensions/lockscreen.py:43 msgid "Unlock all screens" msgstr "Desbloqueja totes les pantalles" #: ../tcosmonitor/shared.py:332 ../tcosmonitor/extensions/logout.py:41 msgid "Logout clients" msgstr "Desconnecta tots els clients" #: ../tcosmonitor/shared.py:333 ../tcosmonitor/extensions/restartxorg.py:42 msgid "Restart X session of all clients" msgstr "Reinicia la sessió X de tots els clients" #: ../tcosmonitor/shared.py:334 ../tcosmonitor/extensions/appsmsg.py:56 msgid "Exec same app in all connected users" msgstr "Executa la mateixa aplicació en tots els usuaris connectats" #: ../tcosmonitor/shared.py:335 ../tcosmonitor/extensions/appsmsg.py:57 msgid "Send a text message to all connected users" msgstr "Envia un missatge de text a tots els usuaris connectats" #: ../tcosmonitor/shared.py:336 ../tcosmonitor/extensions/vnc.py:52 msgid "Enter demo mode, all connected users see my screen" msgstr "Entra en mode de demostració, tots els usuaris veuen la meua pantalla" #: ../tcosmonitor/shared.py:337 msgid "Enter conference mode, all connected users can hear me" msgstr "Entra en mode conferència, tots els usuaris poden escoltar-me" #: ../tcosmonitor/shared.py:338 ../tcosmonitor/extensions/screenshot.py:46 msgid "Capture All clients screens" msgstr "Captura totes les pantalles dels clients" #: ../tcosmonitor/shared.py:341 ../tcosmonitor/extensions/wakeonlan.py:42 msgid "Boot All clients (WakeOnLan)" msgstr "Arranca tots els clients (WakeOnLan)" #: ../tcosmonitor/shared.py:342 #: ../tcosmonitor/extensions/tcosnetcontroller.py:41 msgid "Lock internet in all connected users" msgstr "Bloqueja Internet a tots els usuaris connectats" #: ../tcosmonitor/shared.py:343 #: ../tcosmonitor/extensions/tcosnetcontroller.py:42 msgid "Unlock internet in all connected users" msgstr "Desbloqueja Internet a tots els usuaris connectats" #: ../tcosmonitor/shared.py:344 ../tcosmonitor/extensions/dpms.py:41 msgid "DPMS Power off monitors" msgstr "Desactiva el DPMS per als monitors (control d'energia del monitor)" #: ../tcosmonitor/shared.py:345 ../tcosmonitor/extensions/dpms.py:43 msgid "DPMS Power on monitors" msgstr "Activa el DPMS per als monitors (control d'energia del monitor)" #: ../tcosmonitor/shared.py:346 msgid "Chat audio conference" msgstr "Audioconferència" #: ../tcosmonitor/shared.py:541 #, python-format msgid "QUESTION: %(txt)s, RESPONSE %(response)s" msgstr "PREGUNTA: %(txt)s, RESPOSTA %(response)s" #: ../tcosmonitor/shared.py:558 ../tcosmonitor/shared.py:569 #, python-format msgid "INFO: %s" msgstr "INFO: %s" # FIXME: handleme #: ../tcosmonitor/shared.py:580 #, python-format msgid "ERROR: %s" msgstr "ERROR: %s" #: ../tcosmonitor/TcosClassView.py:50 ../tcosmonitor/TcosIconView.py:46 msgid "IP" msgstr "IP" #: ../tcosmonitor/TcosClassView.py:51 ../tcosmonitor/TcosIconView.py:47 #: ../tcosmonitor/TcosListView.py:63 msgid "Hostname" msgstr "Nom de l'ordinador" #: ../tcosmonitor/TcosClassView.py:52 ../tcosmonitor/TcosIconView.py:48 #: ../tcosmonitor/TcosListView.py:75 msgid "Username" msgstr "Nom d'usuari" #: ../tcosmonitor/TcosClassView.py:53 ../tcosmonitor/TcosIconView.py:49 #: ../tcosmonitor/TcosListView.py:86 msgid "Logged" msgstr "Connectat" #: ../tcosmonitor/TcosClassView.py:54 ../tcosmonitor/TcosIconView.py:50 #: ../tcosmonitor/TcosListView.py:102 msgid "Time log in" msgstr "Temps de connexió" #: ../tcosmonitor/TcosClassView.py:55 ../tcosmonitor/TcosIconView.py:51 msgid "Screen locked" msgstr "Pantalla bloquejada" #: ../tcosmonitor/TcosClassView.py:56 ../tcosmonitor/TcosIconView.py:52 msgid "Network locked" msgstr "Xarxa bloquejada" #: ../tcosmonitor/TcosClassView.py:58 msgid "" "Place mouse on any computer to see brief info about it.\n" "You can select and unselect multiple host clicking on every one.\n" "Drag and drop hosts to positions and save clicking on right mouse button." msgstr "" "Moveu el ratolí sobre cada equip per a obtindre una informació breu de cada " "un.\n" "Podeu seleccionar i desseleccionar múltiples equips fent clic en cadascun.\n" "Arrossegueu i deixeu anar els equips a les posicions i guardeu-les fent clic " "amb el botó dret." #: ../tcosmonitor/TcosClassView.py:176 msgid "Positions reset to defaults." msgstr "Posicions reinicialitzades per defecte." #: ../tcosmonitor/TcosClassView.py:194 msgid "Positions saved." msgstr "Posicions guardades." #: ../tcosmonitor/TcosClassView.py:314 #, python-format msgid "%s is not a valid file to exe or send" msgstr "%s no és un fitxer vàlid per a executar-lo o enviar-lo" #: ../tcosmonitor/TcosClassView.py:400 ../tcosmonitor/TcosIconView.py:155 msgid "yes" msgstr "sí" #: ../tcosmonitor/TcosClassView.py:402 ../tcosmonitor/TcosIconView.py:157 msgid "no" msgstr "no" #: ../tcosmonitor/TcosTrayIcon.py:49 ../tcosmonitor/TcosTrayIcon2.py:53 #: ../tcosmonitor.glade:43 msgid "Quit" msgstr "Ix" #: ../tcosmonitor/TcosTrayIcon.py:65 msgid "TcosDevices" msgstr "Dispositius TCOS" #: ../tcosmonitor/TcosTrayIcon.py:172 ../tcosmonitor/TcosTrayIcon.py:186 #: ../tcosmonitor/TcosTrayIcon2.py:67 msgid "Tcos Devices" msgstr "Dispositius TCOS" #: ../tcosmonitor/TcosTrayIcon.py:232 ../tcosmonitor/TcosTrayIcon2.py:344 msgid "Usb flash" msgstr "Memòria USB flash" #: ../tcosmonitor/TcosTrayIcon.py:234 ../tcosmonitor/TcosTrayIcon2.py:346 msgid "Mount USB1" msgstr "Munta USB1" #: ../tcosmonitor/TcosTrayIcon.py:235 ../tcosmonitor/TcosTrayIcon2.py:347 msgid "Umount USB1" msgstr "Desmunta USB1" #: ../tcosmonitor/extensions/lockscreen.py:49 #: ../tcosmonitor/extensions/lockscreen.py:57 msgid "" "Can't connect to tcosxmlrpc.\n" "Please verify user and password in prefences!" msgstr "" "No es pot connectar a tcosxmlrpc.\n" "Per favor verifiqueu l'usuari i la contrasenya en les preferències." #: ../tcosmonitor/extensions/lockscreen.py:81 #, python-format msgid "Do you want to lock the following screens: %s?" msgstr "Voleu bloquejar la pantalla dels següents equips: %s?" #: ../tcosmonitor/extensions/lockscreen.py:90 #, python-format msgid "Do you want to unlock the following screens: %s?" msgstr "Voleu desbloquejar la pantalla dels següents equips: %s?" #: ../tcosmonitor/extensions/appsmsg.py:65 msgid "Clients not connected" msgstr "No hi ha clients connectats" #: ../tcosmonitor/extensions/appsmsg.py:88 #, python-format msgid "" "Exec app in user(s) screen(s)\n" "or open web address to:\n" "%s" msgstr "" "Executa l'aplicació en la pantalla(s) d'usuari(s)\n" "o obri l'adreça web a:\n" "%s" #: ../tcosmonitor/extensions/appsmsg.py:90 #, python-format msgid "" "Send a message to:\n" "%s" msgstr "" "Envia un missatge a:\n" "%s" #: ../tcosmonitor/extensions/appsmsg.py:123 #: ../tcosmonitor/extensions/appsmsg.py:164 msgid "Can't exec application, user is not logged" msgstr "No es poden executar aplicacions, l'usuari no està connectat" #: ../tcosmonitor/extensions/appsmsg.py:142 #: ../tcosmonitor/extensions/appsmsg.py:153 #, python-format msgid "%s is not a valid application" msgstr "%s no és una aplicació vàlida" #: ../tcosmonitor/extensions/appsmsg.py:173 msgid "Can't send message, user is not logged" msgstr "No es poden enviar missatges, l'usuari no està connectat" #: ../tcosmonitor/extensions/appsmsg.py:288 #: ../tcosmonitor/extensions/appsmsg.py:297 #, python-format msgid "%s is not application" msgstr "%s no és una aplicació" #: ../tcosmonitor/extensions/appsmsg.py:354 #, python-format msgid "" "Error while exec remote app:\n" "Reason: %s" msgstr "" "S'ha produït un error quan s'executava aplicació remota:\n" "Raó: %s" #: ../tcosmonitor/extensions/appsmsg.py:361 #, python-format msgid "" "Error while send message:\n" "Reason: %s" msgstr "" "S'ha produït un error quan s'enviava un missatge:\n" "Raó: %s" #: ../tcosmonitor/extensions/remotessh.py:47 msgid "Enter password of remote thin client (if asked for it)" msgstr "Introduïu la contrasenya del client lleuger (si es demanara)" #: ../tcosmonitor/extensions/dpms.py:79 #, python-format msgid "Do you want to switch off the following monitors: %s?" msgstr "Voleu desconnectar els monitors següents: %s?" #: ../tcosmonitor/extensions/dpms.py:88 #, python-format msgid "Do you want to switch on the following monitors: %s?" msgstr "Voleu connectar els monitors següents: %s?" #: ../tcosmonitor/extensions/screenshot.py:66 #: ../tcosmonitor/extensions/screenshot.py:83 #, python-format msgid "Can't make screenshot, error: %s" msgstr "No es pot fer una captura de pantalla, error: %s" #: ../tcosmonitor/extensions/screenshot.py:75 msgid "Trying to order terminal to do a screenshot..." msgstr "S'està intentant manar al terminal que faça una captura de pantalla..." #: ../tcosmonitor/extensions/screenshot.py:87 msgid "Get another screenshot" msgstr "Fes una altra captura de pantalla" #: ../tcosmonitor/extensions/screenshot.py:102 #, python-format msgid "Screenshot of %s" msgstr "Captura de pantalla de %s" #: ../tcosmonitor/extensions/screenshot.py:125 #, python-format msgid "Screenshot of %s, done." msgstr "La captura de pantalla de %s està feta." #: ../tcosmonitor/extensions/screenshot.py:132 msgid "Save Screenshot" msgstr "Guarda la captura de pantalla" #: ../tcosmonitor/extensions/screenshot.py:144 msgid "Select file to save screenshot..." msgstr "Seleccioneu el fitxer per a guardar la captura de pantalla..." #: ../tcosmonitor/extensions/screenshot.py:148 #, python-format msgid "screenshot_of_%(hostname)s_date_%(date)s.png" msgstr "screenshot_of_%(hostname)s_date_%(date)s.png" #: ../tcosmonitor/extensions/screenshot.py:152 msgid "Image Files ( *.png, *.jpg)" msgstr "Fitxers d'imatge (*.png, *.jpg)" #: ../tcosmonitor/extensions/screenshot.py:162 msgid "File must be png or jpg." msgstr "El fitxer ha de ser png o jpg." #: ../tcosmonitor/extensions/screenshot.py:185 msgid "Screenshots of all hosts" msgstr "Captura de pantalla de tots els equips" #: ../tcosmonitor/extensions/screenshot.py:201 #, python-format msgid "Screenshot of %s" msgstr "Captura de pantalla de %s" #: ../tcosmonitor/extensions/sendfiles.py:62 #: ../tcosmonitor/extensions/sendfiles.py:120 msgid "Can't send files, user is not logged" msgstr "No es poden enviar fitxers, l'usuari no està connectat" #: ../tcosmonitor/extensions/sendfiles.py:66 #: ../tcosmonitor/extensions/sendfiles.py:142 #: ../tcosmonitor/extensions/sendfiles.py:237 msgid "" "TcosMonitor need special configuration for rsync daemon to send files.\n" "\n" "Please read configuration requeriments in:\n" "/usr/share/doc/tcosmonitor/README.rsync" msgstr "" "El TcosMonitor necessita una configuració especial del dimoni rsync per a " "enviar fitxers.\n" "\n" "Llegiu la configuració requerida en:\n" "/usr/share/doc/tcosmonitor/README.rsync" #: ../tcosmonitor/extensions/sendfiles.py:84 #: ../tcosmonitor/extensions/sendfiles.py:176 #: ../tcosmonitor/extensions/sendfiles.py:270 msgid "Waiting for send files..." msgstr "S'està esperant l'enviament de fitxers..." #: ../tcosmonitor/extensions/sendfiles.py:93 #: ../tcosmonitor/extensions/sendfiles.py:95 #: ../tcosmonitor/extensions/sendfiles.py:99 #: ../tcosmonitor/extensions/sendfiles.py:108 #: ../tcosmonitor/extensions/sendfiles.py:189 #: ../tcosmonitor/extensions/sendfiles.py:191 #: ../tcosmonitor/extensions/sendfiles.py:195 #: ../tcosmonitor/extensions/sendfiles.py:204 #: ../tcosmonitor/extensions/sendfiles.py:283 #: ../tcosmonitor/extensions/sendfiles.py:285 #: ../tcosmonitor/extensions/sendfiles.py:289 #: ../tcosmonitor/extensions/sendfiles.py:298 msgid "Teacher" msgstr "Mestre" #: ../tcosmonitor/extensions/sendfiles.py:95 #: ../tcosmonitor/extensions/sendfiles.py:108 #: ../tcosmonitor/extensions/sendfiles.py:191 #: ../tcosmonitor/extensions/sendfiles.py:204 #: ../tcosmonitor/extensions/sendfiles.py:285 #: ../tcosmonitor/extensions/sendfiles.py:298 #, python-format msgid "" "Teacher has sent some files to %(teacher)s folder:\n" "\n" "%(basenames)s" msgstr "" "El professor ha enviat diversos fitxers a la carpeta %(teacher)s:\n" "\n" "%(basenames)s" #: ../tcosmonitor/extensions/sendfiles.py:104 #: ../tcosmonitor/extensions/sendfiles.py:200 #: ../tcosmonitor/extensions/sendfiles.py:294 #: ../tcosmonitor/extensions/reboot.py:108 #: ../tcosmonitor/extensions/videolan.py:194 #: ../tcosmonitor/extensions/videolan.py:389 #: ../tcosmonitor/extensions/videolan.py:629 #, python-format msgid "" "Error while exec remote app:\n" "Reason:%s" msgstr "" "S'ha produït un error quan s'executava l'aplicació remota:\n" "Raó: %s" #: ../tcosmonitor/extensions/sendfiles.py:105 #: ../tcosmonitor/extensions/sendfiles.py:201 #: ../tcosmonitor/extensions/sendfiles.py:295 msgid "Error creating destination folder." msgstr "S'ha produït un error en crear el directori destinació." #: ../tcosmonitor/extensions/sendfiles.py:110 #: ../tcosmonitor/extensions/sendfiles.py:205 #: ../tcosmonitor/extensions/sendfiles.py:300 msgid "Files sent." msgstr "Fitxers enviats." #: ../tcosmonitor/extensions/sendfiles.py:125 #: ../tcosmonitor/extensions/sendfiles.py:220 msgid "Select file or files..." msgstr "Seleccioneu el fitxer o fitxers..." #: ../tcosmonitor/extensions/sendfiles.py:178 #: ../tcosmonitor/extensions/sendfiles.py:272 msgid "Do you want open file(s) on client?" msgstr "Voleu obrir el fitxer(s) en el client?" #: ../tcosmonitor/extensions/sendfiles.py:215 #: ../tcosmonitor/extensions/tcosnetcontroller.py:113 #: ../tcosmonitor/extensions/tcosnetcontroller.py:155 #: ../tcosmonitor/extensions/videolan.py:457 #: ../tcosmonitor/extensions/vnc.py:61 ../tcosmonitor/extensions/vnc.py:105 #: ../tcosmonitor/extensions/vnc.py:298 #: ../tcosmonitor/extensions/audiortp.py:224 #: ../tcosmonitor/extensions/audiortp.py:270 #: ../tcosmonitor/extensions/audiortp.py:368 #: ../tcosmonitor/extensions/audiortp.py:402 #: ../tcosmonitor/extensions/audiortp.py:455 msgid "No users logged." msgstr "No hi ha usuaris connectats." #: ../tcosmonitor/extensions/info.py:91 #, python-format msgid "Connecting with %s to retrieve some info..." msgstr "S'està connectant a %s per a rebre informació..." #: ../tcosmonitor/extensions/info.py:117 msgid "Tcos info" msgstr "Informació de Tcos" #: ../tcosmonitor/extensions/info.py:120 msgid "PXES info" msgstr "Informació de PXES" #: ../tcosmonitor/extensions/info.py:123 msgid "LTSP info" msgstr "Informació d'LTSP" #: ../tcosmonitor/extensions/info.py:126 msgid "Standalone info" msgstr "Informació de l'equip autònom" #: ../tcosmonitor/extensions/info.py:129 msgid "Unknow client info" msgstr "Informació de client desconegut" #: ../tcosmonitor/extensions/info.py:135 ../tcosmonitor/LocalData.py:43 #: ../tcosmonitor/LocalData.py:62 ../tcosmonitor/TcosCommon.py:163 #: ../tcosmonitor/TcosCommon.py:171 ../tcosmonitor/TcosCommon.py:187 #: ../tcosmonitor/TcosCommon.py:190 msgid "unknow" msgstr "desconegut" #: ../tcosmonitor/extensions/info.py:138 msgid "Hostname: " msgstr "Equip: " #: ../tcosmonitor/extensions/info.py:139 msgid "Ip address: " msgstr "Adreça IP: " #: ../tcosmonitor/extensions/info.py:140 msgid "TcosXmlRpc version: " msgstr "Versió de TcosXmlRpc: " #: ../tcosmonitor/extensions/info.py:149 msgid "Tcos image version: " msgstr "Versió de la imatge del TCOS: " #: ../tcosmonitor/extensions/info.py:150 msgid "Tcos image date: " msgstr "Data de la imatge del TCOS: " #: ../tcosmonitor/extensions/info.py:151 msgid "Date of thin client: " msgstr "Data del client lleuger: " #: ../tcosmonitor/extensions/info.py:152 msgid "Uptime: " msgstr "Temps encés: " #: ../tcosmonitor/extensions/info.py:163 msgid "Kernel info" msgstr "Informació del nucli" #: ../tcosmonitor/extensions/info.py:172 msgid "Force download and mount all modules" msgstr "Força la baixada i munta tots els mòduls" # Mozilla 1.3->groupByNone.label #: ../tcosmonitor/extensions/info.py:183 msgid "None" msgstr "Cap" #: ../tcosmonitor/extensions/info.py:186 msgid "Kernel version: " msgstr "Versió del nucli: " #: ../tcosmonitor/extensions/info.py:187 msgid "Kernel complete version: " msgstr "Versió completa del nucli: " #: ../tcosmonitor/extensions/info.py:188 msgid "Loaded Modules: " msgstr "Mòduls carregats: " #: ../tcosmonitor/extensions/info.py:189 msgid "Modules not found: " msgstr "Mòduls no trobats: " #: ../tcosmonitor/extensions/info.py:205 msgid "Cpu info: " msgstr "Informació de la CPU: " #: ../tcosmonitor/extensions/info.py:212 msgid "Cpu model: " msgstr "Model de CPU: " #: ../tcosmonitor/extensions/info.py:213 msgid "Cpu vendor: " msgstr "Venedor de la CPU: " #: ../tcosmonitor/extensions/info.py:214 msgid "Cpu speed: " msgstr "Velocitat de la CPU: " #: ../tcosmonitor/extensions/info.py:225 msgid "PCI buses: " msgstr "Busos PCI: " #: ../tcosmonitor/extensions/info.py:254 msgid "Process running: " msgstr "Processos en execució:" #: ../tcosmonitor/extensions/info.py:267 msgid "Ram info: " msgstr "Informació de la ram:" #: ../tcosmonitor/extensions/info.py:274 msgid "Total Ram: " msgstr "RAM total: " #: ../tcosmonitor/extensions/info.py:275 msgid "Free RAM: " msgstr "RAM lliure: " #: ../tcosmonitor/extensions/info.py:276 msgid "Active RAM: " msgstr "RAM activa: " #: ../tcosmonitor/extensions/info.py:279 msgid "Swap info: " msgstr "Informació de la SWAP:" #: ../tcosmonitor/extensions/info.py:285 msgid "Swap enabled: " msgstr "Swap activada: " #: ../tcosmonitor/extensions/info.py:286 msgid "Total Swap: " msgstr "Swap total: " #: ../tcosmonitor/extensions/info.py:287 msgid "Used Swap: " msgstr "Swap usada: " #: ../tcosmonitor/extensions/info.py:297 msgid "Network info: " msgstr "Informació de la xarxa:" #: ../tcosmonitor/extensions/info.py:307 msgid "Network hostname: " msgstr "Nom de màquina de xarxa: " #: ../tcosmonitor/extensions/info.py:308 msgid "Network IP: " msgstr "Adreça IP: " #: ../tcosmonitor/extensions/info.py:309 msgid "Network MASK: " msgstr "Màscara de xarxa: " #: ../tcosmonitor/extensions/info.py:310 msgid "Network MAC: " msgstr "Xarxa de MAC: " #: ../tcosmonitor/extensions/info.py:311 msgid "Data received(rx): " msgstr "Dades rebudes(rx): " #: ../tcosmonitor/extensions/info.py:312 msgid "Data send(tx): " msgstr "Dades enviades(tx): " #: ../tcosmonitor/extensions/info.py:322 ../tcosmonitor.glade:2896 msgid "Xorg info" msgstr "Informació de l'Xorg" #: ../tcosmonitor/extensions/info.py:348 msgid "enabled" msgstr "activat" #: ../tcosmonitor/extensions/info.py:350 msgid "disabled" msgstr "desactivat" #: ../tcosmonitor/extensions/info.py:363 msgid "Disable kill X with Ctrl+Alt+Backspace" msgstr "Inhabilita matar l'X amb Ctrl+Alt+Backspace" #: ../tcosmonitor/extensions/info.py:367 msgid "Refresh rate" msgstr "Taxa de refresc" #: ../tcosmonitor/extensions/info.py:369 msgid "Xorg font server" msgstr "Servidor de tipus de lletra de l'Xorg" #: ../tcosmonitor/extensions/info.py:371 msgid "Mouse device" msgstr "Dispositiu del ratolí" #: ../tcosmonitor/extensions/info.py:373 msgid "Mouse protocol" msgstr "Protocol del ratolí" #: ../tcosmonitor/extensions/info.py:390 msgid "PulseAudio Sound server is running" msgstr "El servidor PulseAudio està en funcionament" #: ../tcosmonitor/extensions/info.py:408 msgid "Remote Sound Mixer" msgstr "Mesclador de so remot" #: ../tcosmonitor/extensions/info.py:480 msgid "PulseAudio Control" msgstr "Control de PulseAudio" #: ../tcosmonitor/extensions/info.py:485 msgid "PulseAudio Meter" msgstr "Comptador de PulseAudio " #: ../tcosmonitor/extensions/info.py:490 msgid "PulseAudio Manager" msgstr "Gestor de PulseAudio" #: ../tcosmonitor/extensions/info.py:494 msgid "PulseAudio utils: " msgstr "Utilitats de PulseAudio: " #: ../tcosmonitor/extensions/info.py:500 msgid "PulseAudio stats" msgstr "Estadístiques de PulseAudio: " #: ../tcosmonitor/extensions/info.py:512 msgid "Currently in use" msgstr "Actualment en ús" #: ../tcosmonitor/extensions/info.py:513 msgid "Allocated during whole lifetime" msgstr "S'ha assignat per sempre" #: ../tcosmonitor/extensions/info.py:514 msgid "Sample cache size" msgstr "Mida de la memòria cau de mostra" #: ../tcosmonitor/extensions/info.py:515 msgid "User name" msgstr "Nom d'usuari" #: ../tcosmonitor/extensions/info.py:516 msgid "Host Name" msgstr "Nom de l'ordinador" #: ../tcosmonitor/extensions/info.py:517 msgid "Server Name" msgstr "Nom del servidor" #: ../tcosmonitor/extensions/info.py:518 msgid "Server Version" msgstr "Versió del servidor" #: ../tcosmonitor/extensions/info.py:519 msgid "Default Sample Specification" msgstr "Especificació de la mostra per defecte" #: ../tcosmonitor/extensions/info.py:520 msgid "Default Sink" msgstr "Eixida d'àudio per defecte" #: ../tcosmonitor/extensions/info.py:521 msgid "Default Source" msgstr "Entrada d'àudio per defecte" #: ../tcosmonitor/extensions/info.py:522 msgid "Cookie" msgstr "Galleta" #: ../tcosmonitor/extensions/info.py:528 msgid "Sound server is not running" msgstr "El servidor de so no està en funcionament" #: ../tcosmonitor/extensions/info.py:589 ../tcosmonitor/extensions/info.py:597 #: ../tcosmonitor/extensions/info.py:605 msgid "PulseAudio apps need /dev/shm." msgstr "L'aplicació PulseAudio necessita /dev/shm" #: ../tcosmonitor/extensions/logout.py:48 #: ../tcosmonitor/extensions/logout.py:71 msgid "User not logged" msgstr "L'usuari no està connectat." #: ../tcosmonitor/extensions/logout.py:51 #, python-format msgid "Do you want to logout user: %s?" msgstr "Voleu desconnectar l'usuari: %s?" #: ../tcosmonitor/extensions/logout.py:55 #: ../tcosmonitor/extensions/logout.py:77 #, python-format msgid "Session will close in %s seconds" msgstr "La sessió es tancarà en %s segons" #: ../tcosmonitor/extensions/logout.py:73 #, python-format msgid "Do you want to logout the following users: %s?" msgstr "Voleu desconnectar els següents usuaris: %s?" #: ../tcosmonitor/extensions/reboot.py:48 #, python-format msgid "Do you want to reboot: %s?" msgstr "Voleu tornar a arracar: %s?" #: ../tcosmonitor/extensions/reboot.py:51 #: ../tcosmonitor/extensions/reboot.py:61 #, python-format msgid "Pc will reboot in %s seconds" msgstr "L'equip es reiniciarà en %s segons" #: ../tcosmonitor/extensions/reboot.py:58 #, python-format msgid "Do you want to reboot the following clients: %s?" msgstr "Voleu tornar a arracar els clients següents: %s?" #: ../tcosmonitor/extensions/reboot.py:67 #, python-format msgid "Do you want to poweroff: %s?" msgstr "Voleu apagar l'equip: %s?" #: ../tcosmonitor/extensions/reboot.py:70 #: ../tcosmonitor/extensions/reboot.py:80 #, python-format msgid "Pc will shutdown in %s seconds" msgstr "L'equip s'apagarà en %s segons" #: ../tcosmonitor/extensions/reboot.py:77 #, python-format msgid "Do you want to poweroff the following clients: %s?" msgstr "Voleu apagar els clients següents: %s?" #: ../tcosmonitor/extensions/tcosnetcontroller.py:50 #: ../tcosmonitor/extensions/tcosnetcontroller.py:109 msgid "Internet connection has been disabled" msgstr "La connexió a Internet s'ha inhabilitat" #: ../tcosmonitor/extensions/tcosnetcontroller.py:54 msgid "Can't disable internet, user is not logged" msgstr "No es pot inhabilitar Internet, l'usuari no està connectat" #: ../tcosmonitor/extensions/tcosnetcontroller.py:59 #: ../tcosmonitor/extensions/tcosnetcontroller.py:85 #: ../tcosmonitor/extensions/tcosnetcontroller.py:103 #: ../tcosmonitor/extensions/tcosnetcontroller.py:147 #, python-format msgid "" "In order to lock and unlock internet you need to be in 'tcos' group.\n" "\n" "Exe by root: adduser %s tcos" msgstr "" "Per a bloquejar i desbloquejar internet heu de estar en el grup 'tcos'.\n" "\n" "Executeu com a root: adduser %s tcos" #: ../tcosmonitor/extensions/tcosnetcontroller.py:77 #: ../tcosmonitor/extensions/tcosnetcontroller.py:151 msgid "Internet connection has been enabled" msgstr "La connexió a Internet s'ha habilitat" #: ../tcosmonitor/extensions/tcosnetcontroller.py:81 msgid "Can't enable internet, user is not logged" msgstr "No es pot habilitar Internet, l'usuari no està connectat" #: ../tcosmonitor/extensions/tcosnetcontroller.py:116 #, python-format msgid "Do you want disable internet to following users: %s?" msgstr "Voleu inhabilitar Internet als següents usuaris: %s?" #: ../tcosmonitor/extensions/tcosnetcontroller.py:158 #, fuzzy, python-format msgid "Do you want enable internet to following users:%s?" msgstr "Voleu habilitar Internet als següents usuaris: %s?" #: ../tcosmonitor/extensions/videolan.py:48 #: ../tcosmonitor/extensions/videolan.py:49 msgid "Send Audio/Video broadcast" msgstr "Envia difusió d'àudio/vídeo" #: ../tcosmonitor/extensions/videolan.py:65 #: ../tcosmonitor/extensions/videolan.py:219 msgid "Can't send video broadcast, user is not logged" msgstr "No es pot enviar la difusió de vídeo, l'usuari no està connectat" #: ../tcosmonitor/extensions/videolan.py:149 #: ../tcosmonitor/extensions/videolan.py:347 #: ../tcosmonitor/extensions/videolan.py:578 #, python-format msgid "" "Not allowed white spaces in \"%s\".\n" "Please rename it." msgstr "" "No es permeten espais en \"%s\".\n" "Reanomeneu-lo." #: ../tcosmonitor/extensions/videolan.py:159 #: ../tcosmonitor/extensions/videolan.py:359 #: ../tcosmonitor/extensions/videolan.py:594 msgid "Waiting for start video transmission..." msgstr "S'està esperant per a arrancar la transmissió de vídeo..." #: ../tcosmonitor/extensions/videolan.py:167 #: ../tcosmonitor/extensions/videolan.py:367 #: ../tcosmonitor/extensions/videolan.py:602 #: ../tcosmonitor/extensions/vnc.py:91 ../tcosmonitor/extensions/vnc.py:283 msgid "Error while exec app" msgstr "S'ha produït un error quan s'executava l'aplicació" #: ../tcosmonitor/extensions/videolan.py:199 #: ../tcosmonitor/extensions/videolan.py:393 #: ../tcosmonitor/extensions/videolan.py:634 msgid "Running in broadcast video transmission." msgstr "S'està executant en mode de difusió de vídeo." #: ../tcosmonitor/extensions/videolan.py:208 #: ../tcosmonitor/extensions/videolan.py:402 #, python-format msgid "" "Running in broadcast video transmission to user %(host)s. Broadcast Nº %" "(count)s" msgstr "" "S'està executant en mode de difusió de vídeo a l'usuari %(host)s. Difusió " "núm. %(count)s" #: ../tcosmonitor/extensions/videolan.py:311 #: ../tcosmonitor/extensions/videolan.py:541 msgid "Select audio/video file.." msgstr "Selecciona el fitxer d'àudio/vídeo..." #: ../tcosmonitor/extensions/videolan.py:314 #: ../tcosmonitor/extensions/videolan.py:544 msgid "Play DVD" msgstr "Reproduïx el DVD" #: ../tcosmonitor/extensions/videolan.py:315 #: ../tcosmonitor/extensions/videolan.py:545 msgid "Play SVCD/VCD" msgstr "Reproduïx el SVCD/VCD" #: ../tcosmonitor/extensions/videolan.py:316 #: ../tcosmonitor/extensions/videolan.py:546 msgid "Play AudioCD" msgstr "Reproduïx l'àudioCD" #: ../tcosmonitor/extensions/videolan.py:361 #: ../tcosmonitor/extensions/videolan.py:596 msgid "" "First select the DVD chapter or play movie\n" "then press enter to send clients..." msgstr "" "Primer seleccioneu el capítol del DVD o reproduïu la pel·lícula\n" "després, premeu retorn per a enviar-ho als clients..." #: ../tcosmonitor/extensions/videolan.py:370 msgid "Lock keyboard and mouse on client?" msgstr "Voleu bloquejar el teclat i el ratolí del client?" #: ../tcosmonitor/extensions/videolan.py:444 msgid "Video broadcast stopped." msgstr "La difusió de vídeo està parada." #: ../tcosmonitor/extensions/videolan.py:605 msgid "Lock keyboard and mouse on clients?" msgstr "Voleu bloquejar el teclat i el ratolí en els clients?" #: ../tcosmonitor/extensions/videolan.py:643 #, python-format msgid "Running in broadcast video transmission. Broadcast Nº %s" msgstr "S'està executant en mode de difusió de vídeo. Difusió núm. %s" #: ../tcosmonitor/extensions/restartxorg.py:51 #, python-format msgid "Restart X session of %s with new config?" msgstr "Voleu reiniciar la sessió X de %s amb la nova configuració?" #: ../tcosmonitor/extensions/restartxorg.py:64 #, python-format msgid "%s is not supported to restart Xorg!" msgstr "%s no permet reiniciar l'Xorg!" #: ../tcosmonitor/extensions/restartxorg.py:78 msgid "No thin clients found." msgstr "No s'han trobat clients lleugers." #: ../tcosmonitor/extensions/restartxorg.py:81 #, python-format msgid "Do you want to restart X screens (only thin clients):%s?" msgstr "" "Voleu reiniciar les sessions X dels següents equips (només clients lleugers):" "%s?" #: ../tcosmonitor/extensions/italc.py:51 ../tcosmonitor/extensions/vnc.py:128 msgid "No user logged." msgstr "L'usuari no està connectat." #: ../tcosmonitor/extensions/italc.py:75 msgid "Can't start IVS, please add iTALC support" msgstr "No es pot arrancar el procés IVS. Afegiu el suport per a iTALC" #: ../tcosmonitor/extensions/tcospersonalize.py:54 #, python-format msgid "%s is not supported to personalize!" msgstr "%s no permet personalitzar!" #: ../tcosmonitor/extensions/vnc.py:64 #, python-format msgid "Do you want to start demo mode the following users: %s?" msgstr "Voleu iniciar en mode demostració els següents usuaris: %s?" #: ../tcosmonitor/extensions/vnc.py:76 msgid "Waiting for start demo mode..." msgstr "S'està esperant l'arrancada del mode demostració..." #: ../tcosmonitor/extensions/vnc.py:109 ../tcosmonitor/extensions/vnc.py:302 #, python-format msgid "Running in demo mode with %s clients." msgstr "S'està executant en mode demostració amb %s equips." #: ../tcosmonitor/extensions/vnc.py:120 #, python-format msgid "Running in demo mode from server. Demo Nº %s" msgstr "" "S'està executant en mode demostració des del servidor. Demostració núm. %s" #: ../tcosmonitor/extensions/vnc.py:142 ../tcosmonitor/extensions/vnc.py:245 #, python-format msgid "Connecting with %s to start VNC support" msgstr "S'està connectant a %s per a arrancar el suport per a VNC" #: ../tcosmonitor/extensions/vnc.py:171 #, python-format msgid "" "Can't start VNC, error:\n" "%s" msgstr "" "S'ha produït un error, no es pot arrancar el VNC:\n" "%s" #: ../tcosmonitor/extensions/vnc.py:175 msgid "Waiting for start of VNC server..." msgstr "S'està esperant que comence el servidor VNC..." #: ../tcosmonitor/extensions/vnc.py:202 msgid "Can't start VNC, please add X11VNC support" msgstr "No es pot arrancar el VNC, per favor afegiu el suport per a X11VNC." #: ../tcosmonitor/extensions/vnc.py:218 msgid "Can't start demo mode, user is not logged" msgstr "No es pot arrancar el mode demostració, l'usuari no està connectat" #: ../tcosmonitor/extensions/vnc.py:221 #, python-format msgid "Do you want demo mode from user %s?" msgstr "Voleu iniciar el mode demostració des de l'usuari %s?" #: ../tcosmonitor/extensions/vnc.py:268 #, python-format msgid "Waiting for start demo mode from user %s..." msgstr "S'està esperant l'arrancada del mode demostració des de l'usuari %s..." #: ../tcosmonitor/extensions/vnc.py:317 #, python-format msgid "Running in demo mode from user %(host)s. Demo Nº %(count)s" msgstr "" "S'està executant en mode demostració des de l'usuari %(host)s. Demostració " "núm. %(count)s" #: ../tcosmonitor/extensions/vnc.py:354 msgid "Demo mode off." msgstr "El mode demostració està desactivat." #: ../tcosmonitor/extensions/wakeonlan.py:50 #: ../tcosmonitor/extensions/wakeonlan.py:75 msgid "" "Wake On Lan only works with static list.\n" "\n" "Enable scan method \"static\" in Preferences\n" "and (wake on lan) support in bios of clients." msgstr "" "L'arrancada per xarxa només funciona amb llista estática.\n" "\n" "Activa el mètode d'escaneig \"static\" en Preferències\n" "i el suport (wake on lan) en la bios dels clients." #: ../tcosmonitor/extensions/wakeonlan.py:54 #, python-format msgid "Do you want boot %s client?" msgstr "Voleu arrancar el client %s ?" #: ../tcosmonitor/extensions/wakeonlan.py:67 #: ../tcosmonitor/extensions/wakeonlan.py:91 #, python-format msgid "No register MAC address for ip: \"%s\"" msgstr "No hi ha cao adreça MAC per a l'IP: \"%s\"" #: ../tcosmonitor/extensions/wakeonlan.py:71 #: ../tcosmonitor/extensions/wakeonlan.py:98 #, python-format msgid "Not valid MAC address: \"%s\"" msgstr "L'adreça MAC no és vàlida: \"%s\"" #: ../tcosmonitor/extensions/wakeonlan.py:79 msgid "Do you want boot all clients?" msgstr "Voleu arrancar tots els clients?" #: ../tcosmonitor/extensions/viewproc.py:48 msgid "Can't show runnings apps, user is not logged" msgstr "" "No es poden veure les aplicacions en execució, l'usuari no està connectat." #: ../tcosmonitor/extensions/viewproc.py:58 msgid "User not connected, no processes." msgstr "L'usuari no està connectat, no existixen processos." #: ../tcosmonitor/extensions/viewproc.py:76 #, python-format msgid "Running processes for user \"%s\": " msgstr "S'estan executant els processos per a l'usuari \"%s\":" #: ../tcosmonitor/extensions/viewproc.py:80 msgid "" "ALERT: There are some system process hidden. Enable it in Preferences dialog." msgstr "" "AVÍS: Hi ha diversos processos del sistema ocults. Podeu activar-los en la " "finestra de Preferències." # Projecte_Gnome_2.2 [libgtop.libgtop-GNOME-2-0-port.ca.po] #: ../tcosmonitor/extensions/viewproc.py:85 msgid "Pid" msgstr "Identificador de procés" #: ../tcosmonitor/extensions/viewproc.py:86 msgid "Process command" msgstr "Orde del procés" #: ../tcosmonitor/extensions/viewproc.py:91 msgid "Kill this process" msgstr "Mata este procés" #: ../tcosmonitor/extensions/viewproc.py:127 msgid "Are you sure you want to stop this process?" msgstr "Esteu segur que voleu parar este procés?" #: ../tcosmonitor/extensions/viewproc.py:136 #, python-format msgid "" "Error while killing app:\n" "Reason: %s" msgstr "" "S'ha produït un error quan es tancava l'aplicació:\n" "Raó: %s" #: ../tcosmonitor/extensions/audiortp.py:49 ../tcosmonitor.glade:255 msgid "Send audio conference" msgstr "Envia audioconferència" #: ../tcosmonitor/extensions/audiortp.py:50 ../tcosmonitor.glade:3697 msgid "Audio chat conference" msgstr "Xat d'audioconferència" #: ../tcosmonitor/extensions/audiortp.py:51 ../tcosmonitor.glade:441 msgid "Audio chat list" msgstr "Llista de xats d'àudio" #: ../tcosmonitor/extensions/audiortp.py:52 msgid "Send audio conference (from this host)" msgstr "Envia audioconferència (des d'este equip)" #: ../tcosmonitor/extensions/audiortp.py:68 msgid "Emission" msgstr "Emissió" #: ../tcosmonitor/extensions/audiortp.py:74 msgid "State" msgstr "Estat" # Winrar 2.9->Dialog Box Control:rarlng.dll #: ../tcosmonitor/extensions/audiortp.py:78 msgid "Channel" msgstr "Canal" #: ../tcosmonitor/extensions/audiortp.py:230 #: ../tcosmonitor/extensions/audiortp.py:317 #: ../tcosmonitor/extensions/audiortp.py:408 msgid "" "Your pulseaudio server is too old.\n" "Is required pulseaudio version >= 0.9.10" msgstr "" "El vostre servidor de pulseaudio és molt antic.\n" "Es requerix una versió de pulseaudio >= 0.9.10" #: ../tcosmonitor/extensions/audiortp.py:233 #, python-format msgid "Do you want to start audio conference to the following users: %s?" msgstr "Voleu iniciar el mode d'audioconferència als usuaris següents: %s?" #: ../tcosmonitor/extensions/audiortp.py:238 msgid "You have entered in audio conference" msgstr "Heu entrat en audioconferència" #: ../tcosmonitor/extensions/audiortp.py:262 msgid "Waiting for start audio conference..." msgstr "S'està esperant l'arrancada de l'audioconferència..." #: ../tcosmonitor/extensions/audiortp.py:290 #: ../tcosmonitor/extensions/audiortp.py:385 #, python-format msgid "Running in audio conference with %s clients." msgstr "S'està executant en mode audioconferència amb %s clients." #: ../tcosmonitor/extensions/audiortp.py:300 #, python-format msgid "Running in audio conference from server. Conference Nº %s" msgstr "" "S'està executant en mode audioconferència des del servidor. Conferència núm. " "%s" #: ../tcosmonitor/extensions/audiortp.py:311 msgid "Can't start conference mode, user is not logged" msgstr "No es pot arrancar el mode conferència, l'usuari no està connectat" #: ../tcosmonitor/extensions/audiortp.py:320 #, python-format msgid "Do you want audio conference from user %s?" msgstr "Voleu iniciar el mode audioconferència des de l'usuari %s?" #: ../tcosmonitor/extensions/audiortp.py:326 #, python-format msgid "You have entered in audio conference from user %s" msgstr "Heu entrat en l'audioconferència des de l'usuari %s" #: ../tcosmonitor/extensions/audiortp.py:354 #, python-format msgid "Waiting for start audio conference from user %s..." msgstr "" "S'està esperant l'arrancada de l'audioconferència des de l'usuari %s..." #: ../tcosmonitor/extensions/audiortp.py:395 #, python-format msgid "Running in audio conference from user %(host)s. Conference Nº %(count)s" msgstr "" "S'està executant en mode audioconferència des de l'usuari %(host)s. " "Conferència núm. %(count)s" #: ../tcosmonitor/extensions/audiortp.py:411 #, python-format msgid "Do you want to start audio chat conference to the following users: %s?" msgstr "Voleu iniciar el mode xat d'audioconferència als usuaris següents: %s?" #: ../tcosmonitor/extensions/audiortp.py:416 #, python-format msgid "You have entered in audio chat conference. Participants: %s" msgstr "Heu entrat en el xat d'audioconferència. Participants: %s" #: ../tcosmonitor/extensions/audiortp.py:438 msgid "Waiting for start audio chat conference..." msgstr "S'està esperant l'arrancada del xat d'audioconferència..." #: ../tcosmonitor/extensions/audiortp.py:444 msgid "Do you want to connect to this audio chat conference now?" msgstr "Voleu connectar-vos a este xat d'audioconferecia ara?" #: ../tcosmonitor/extensions/audiortp.py:478 #, python-format msgid "Running in audio chat conference with %s clients." msgstr "S'està executant en mode xat d'audioconferència amb %s clients." #: ../tcosmonitor/extensions/audiortp.py:490 #, python-format msgid "Running in audio chat conference. Conference Nº %s" msgstr "S'està executant en mode xat d'audioconferència. Conferència núm. %s" #: ../tcosmonitor/extensions/audiortp.py:516 msgid "Conference mode off." msgstr "El mode conferència està desactivat." #: ../tcosmonitor/extensions/audiortp.py:535 msgid "Audio chat conference off." msgstr "Xat d'audioconferència desactivat." #: ../tcosmonitor/TcosXmlRpc.py:83 msgid "" "Username or password are empty,\n" "please edit in preferences dialog!" msgstr "" "L'usuari o la contrasenya estan buits,\n" "per favor, editeu el diàleg de preferències" #: ../tcosmonitor/TcosIconView.py:54 msgid "Place mouse on any computer to see brief info about it." msgstr "" "Moveu el ratolí per damunt de cada equip per a obtindre una descripció més " "detallada." #: ../tcosmonitor/TcosListView.py:81 msgid "Active" msgstr "Actiu" #: ../tcosmonitor/TcosListView.py:91 msgid "Screen Blocked" msgstr "Pantalla bloquejada" #: ../tcosmonitor/TcosListView.py:96 msgid "Num of process" msgstr "Nombre de processos" #: ../tcosmonitor/TcosListView.py:111 msgid "Sel" msgstr "Selecciona" #: ../tcosmonitor/TcosListView.py:147 #, python-format msgid "Error connecting to tcosxmlrpc in %s" msgstr "S'ha produït un error en connectar a tcosxmlrpc en %s" #: ../tcosmonitor/TcosTrayIcon2.py:148 #, fuzzy, python-format msgid "Floppy: %s" msgstr "Disquet" # FIXME: handleme #: ../tcosmonitor/TcosTrayIcon2.py:150 #, fuzzy, python-format msgid "CDROM: %s" msgstr "ERROR: %s" #: ../tcosmonitor/TcosTrayIcon2.py:152 #, fuzzy, python-format msgid "USB: %s" msgstr "Dispositiu USB %s" #: ../tcosmonitor/TcosTrayIcon2.py:154 #, fuzzy, python-format msgid "HDD partition: %s" msgstr "Partición del disc %s" #: ../tcosmonitor/TcosTrayIcon2.py:156 #, fuzzy, python-format msgid "Unknow: %s" msgstr "desconegut" #: ../tcosmonitor/Initialize.py:111 #, fuzzy msgid "Quit from TcosMonitor" msgstr "Ix del TcosMonitor" #: ../tcosmonitor/Initialize.py:191 msgid "Salir de Lliurex Lab" msgstr "Ix de Lliurex Lab" #: ../tcosmonitor/Initialize.py:237 msgid "GPL-2 license file not found" msgstr "El fitxer de llicència GPL-2 no s'ha trobat" #: ../tcosmonitor/Initialize.py:265 msgid "Lliurex Lab" msgstr "Lliurex Lab" #: ../tcosmonitor/Initialize.py:266 msgid "About Lliurex Lab" msgstr "Quant al Lliurex Lab" #: ../tcosmonitor/LocalData.py:212 #, python-format msgid "Selected network inteface (%s) don't have IP address" msgstr "La interfície de xarxa seleccionada (%s) no té adreça IP" #: ../tcosmonitor/LocalData.py:249 ../tcosmonitor/ping.py:98 #: ../tcosmonitor/ping.py:161 msgid "Testing if found clients have 8998 or 8999 port open..." msgstr "" "S'està comprovant si els clients trobats tenen el port 8998 o 8999 obert..." #: ../tcosmonitor/LocalData.py:270 msgid "" "Static list method configured but no hosts in list.\n" "\n" "Please, open preferences, click on 'Open Static Host list' and add some " "hosts." msgstr "" "Està configurat el mètode de llista estàtica d'equips però no hi ha equips " "en la llista.\n" "\n" "Per favor, obriu les preferències, feu clic en 'Obri la llista estàtica " "d'equips' i afegiu-ne alguns." #: ../tcosmonitor/TcosPreferences.py:273 msgid "" "You have select more than 5 button menus.\n" "Only allowed to select a maximum of 5 buttons." msgstr "" "Heu seleccionat més de 5 botons de menús.\n" "Només està permés seleccionar un màxim de 5 botons." #: ../tcosmonitor/TcosPreferences.py:284 msgid "New settings saved." msgstr "Configuració nova guardada." # Netscape_4.7->Dialog Box Control:TEXTIMP.DLL #: ../tcosmonitor/TcosPreferences.py:582 ../tcosmonitor/TcosExtensions.py:365 msgid "Stop" msgstr "Para" #: ../tcosmonitor/TcosMenus.py:98 ../tcosmonitor/TcosMenus.py:110 #, python-format msgid "Actions for %s" msgstr "Accions per a %s" #: ../tcosmonitor/TcosMenus.py:103 msgid "Actions for selected host" msgstr "Accions per a l'equip seleccionat" #: ../tcosmonitor/TcosMenus.py:164 ../tcosmonitor/TcosMenus.py:295 #, python-format msgid "%d hidden actions" msgstr "%d accions ocultes" #: ../tcosmonitor/TcosMenus.py:239 ../tcosmonitor/TcosMenus.py:241 msgid "Actions for selected hosts" msgstr "Accions per als equips seleccionats" #: ../tcosmonitor/TcosMenus.py:243 msgid "Actions for all hosts" msgstr "Accions per a tots els equips" #: ../tcosmonitor/TcosMenus.py:300 msgid "Save hosts positions" msgstr "Guarda les posicions dels equips" #: ../tcosmonitor/TcosMenus.py:308 msgid "Reset hosts positions" msgstr "Reinicialitza les posicions dels equips" #: ../tcosmonitor/ping.py:80 #, python-format msgid "Ping to %s..." msgstr "Ping a %s..." #: ../tcosmonitor/ping.py:89 msgid "Waiting for pings..." msgstr "S'estan esperant els pings..." #: ../tcosmonitor/ping.py:117 ../tcosmonitor/ping.py:182 #: ../tcosmonitor/TcosActions.py:186 ../tcosmonitor/TcosActions.py:272 msgid "Not connected hosts found." msgstr "No s'han trobat equips connectats." #: ../tcosmonitor/ping.py:124 ../tcosmonitor/ping.py:187 #: ../tcosmonitor/TcosActions.py:189 ../tcosmonitor/TcosActions.py:267 #, python-format msgid "Found %d hosts" msgstr "S'han trobat %d equips" #: ../tcosmonitor/TcosActions.py:163 ../tcosmonitor/TcosActions.py:249 msgid "Searching for connected hosts..." msgstr "S'estan buscant equips connectats..." #: ../tcosmonitor/TcosActions.py:1027 msgid "Searching info of hosts..." msgstr "S'està buscant informació d'equips..." #: ../tcosmonitor/TcosActions.py:1066 #, python-format msgid "Connecting to %s..." msgstr "S'està connectant a %s..." #: ../tcosmonitor/TcosExtensions.py:42 msgid "Exception:" msgstr "Excepció:" #: ../tcosmonitor/TcosExtensions.py:75 msgid "Error: no IP!" msgstr "Error: No s'ha indicat cap adreça IP." #: ../tcosmonitor/TcosExtensions.py:152 msgid "No clients connected, press refresh button." msgstr "No hi ha clients connectats, premeu el botó d'actualitzar." #: ../tcosmonitor/TcosExtensions.py:243 ../tcosmonitor/TcosExtensions.py:251 #, fuzzy msgid "Clonning clients...." msgstr "S'està connectant a %s..." #: ../tcosmonitor/TcosExtensions.py:278 ../tcosmonitor/TcosExtensions.py:280 #, python-format msgid "Can't exec this action at '%s' because you are connected at this host!" msgstr "" "No es pot executar esta acció a '%s' perquè esteu connectat a este equip." #: ../tcosmonitor/TcosExtensions.py:294 #, python-format msgid "Doing action \"%(action)s\" in %(ip)s..." msgstr "S'està realitzant l'acció \"%(action)s\" en l'equip %(ip)s..." #: ../tcosmonitor/TcosExtensions.py:312 #, python-format msgid "Done action \"%(action)s\" in %(ip)s" msgstr "L'acció \"%(action)s\" s'ha acabat en %(ip)s" #: ../tcosmonitor/TcosCommon.py:85 #, python-format msgid "" "ThreadController: Found error executing %(cmd)s\n" "\n" "If problem persist, disable Thread Controller\n" "in Preferences and report bug.\n" "Error=%(error)s" msgstr "" "Controlador de fils: S'ha trobat un error en executar %(cmd)s\n" "\n" "Si el problema persistix, desactiveu el Controlador de fils\n" "en Preferències i informeu de l'error.\n" "Error=%(error)s" #: ../tcosmonitor.glade:10 msgid "TcosMonitor" msgstr "TcosMonitor" #: ../tcosmonitor.glade:42 msgid "Exit TcosMonitor" msgstr "Ix del TcosMonitor" #: ../tcosmonitor.glade:59 msgid "Open preferences dialog" msgstr "Obri el diàleg de preferències" #: ../tcosmonitor.glade:76 msgid "Update host list" msgstr "Actualitza la llista d'equips" # Netscape_4.7->Menu:RESDLL.DLL # 3 #: ../tcosmonitor.glade:77 msgid "Refresh" msgstr "Refresca" #: ../tcosmonitor.glade:107 msgid "All Hosts" msgstr "Tots els equips" # Winrar 2.9->Dialog Caption:rarlng.dll #: ../tcosmonitor.glade:151 msgid "Find" msgstr "Busca" #: ../tcosmonitor.glade:167 msgid "About this app" msgstr "Quant a esta aplicació" #: ../tcosmonitor.glade:348 msgid "Start audio chat" msgstr "Inicia el xat d'àudio" #: ../tcosmonitor.glade:534 msgid "Send audio/video" msgstr "Envia el fitxer d'àudio/vídeo" #: ../tcosmonitor.glade:720 msgid "Exe app" msgstr "Executa l'aplicació" #: ../tcosmonitor.glade:813 msgid "Send message" msgstr "Envia el missatge" #: ../tcosmonitor.glade:907 msgid "Open share" msgstr "Obri share" #: ../tcosmonitor.glade:1022 msgid "List view" msgstr "Vista de llista" #: ../tcosmonitor.glade:1100 msgid "Icon view" msgstr "Vista d'icones" #: ../tcosmonitor.glade:1197 msgid "Simulate my classroom" msgstr "Simula la meua aula" # Winrar 2.9->Dialog Box Control:rarlng.dll #: ../tcosmonitor.glade:1321 ../tcosmonitor.glade:4528 #: ../tcosmonitor.glade:4911 msgid "Cancel" msgstr "Cancel·la" #: ../tcosmonitor.glade:1449 msgid "Show host list on startup" msgstr "Mostra la llista d'equips a l'arrancada" #: ../tcosmonitor.glade:1470 msgid "Scan network method" msgstr "Mètode d'escaneig de xarxa" #: ../tcosmonitor.glade:1498 msgid "" "Network interface\n" "(thin client)" msgstr "" "Interfície de xarxa\n" "(clients lleugers)" #: ../tcosmonitor.glade:1586 msgid "Show system process" msgstr "Mostra els processos del sistema" #: ../tcosmonitor.glade:1608 #, fuzzy msgid "Don't do actions when running TcosMonitor in thin client" msgstr "" "No executes accions quan el Lliurex Lab s'execute des d'un client lleuger" #: ../tcosmonitor.glade:1629 msgid "List of hosts" msgstr "Llista d'equips" #: ../tcosmonitor.glade:1699 msgid "Open static host list" msgstr "Obri la llista d'equips estàtics" #: ../tcosmonitor.glade:1739 msgid "Only show hosts running tcosxmlrpc (8998 port)" msgstr "Mostra només els equips que executen amb tcosmxlrpc (port 8998)" #: ../tcosmonitor.glade:1761 #, fuzzy msgid "Only do all actions on selected hosts (requires restart TcosMonitor)" msgstr "" "Fes només les accions per a equips seleccionats (cal reiniciar el Lliurex " "Lab)" #: ../tcosmonitor.glade:1783 msgid "Enable SSL connections to XMLRPC clients" msgstr "Habilita les connexions SSL als clients XMLRPC" #: ../tcosmonitor.glade:1804 msgid "Host list mode" msgstr "Mode llista d'equips" #: ../tcosmonitor.glade:1862 msgid "Show right menu with groups (NEW)" msgstr "Mostra el menú de la dreta amb grups (NOU)" #: ../tcosmonitor.glade:1883 msgid "Program mode" msgstr "Mode de programa" # Winrar 2.9->String:rarlng.dll #: ../tcosmonitor.glade:1969 msgid "Settings" msgstr "Paràmetres" #: ../tcosmonitor.glade:2009 msgid "Update host list every (seg)" msgstr "Actualitza la llista d'equips cada (seg)" #: ../tcosmonitor.glade:2038 msgid "" "Update host list every selected seconds.\n" "\n" "Value=0 disable update." msgstr "" "Actualitza la llista d'equips cada nombre\n" "de segons seleccionat.\n" "Valor=0 inhabilita l'actualització." #: ../tcosmonitor.glade:2062 msgid "Cache timeout (seg)" msgstr "Temps de vida de la memòria cau (seg)" #: ../tcosmonitor.glade:2090 msgid "" "Cache some data and connection status during selected seconds.\n" "\n" "Value=0 disable cache." msgstr "" "Guarda en la memòria cau dades i l'estat de connexió durant el nombre de " "segons seleccionat.\n" "\n" "Valor=0 inhabilita la memòria cau." #: ../tcosmonitor.glade:2114 msgid "Screenshot size:" msgstr "Grandària de captura de pantalla:" #: ../tcosmonitor.glade:2142 ../tcosmonitor.glade:2192 msgid "% Size of screnshot." msgstr "%s de grandària de captura de pantalla." #: ../tcosmonitor.glade:2164 msgid "Mini screenshot size:" msgstr "Grandària de les minicaptures de pantalla:" #: ../tcosmonitor.glade:2214 msgid "Timeout actions (seg)" msgstr "Temps d'espera per a accions (seg)" #: ../tcosmonitor.glade:2242 msgid "" "Timeout in seg for actions\n" "\n" "Value=0 default" msgstr "" "Temps d'espera en segons per a accions\n" "\n" "Valor=per defecte 0" #: ../tcosmonitor.glade:2266 msgid "SSH remote username" msgstr "Usuari remot SSH" #: ../tcosmonitor.glade:2315 msgid "VLC method to send" msgstr "VLC mètode d'enviament" #: ../tcosmonitor.glade:2371 msgid "" "Experimental: Thread Controller\n" "( if you have problems, disable it )" msgstr "" "Experimental: Control de fils\n" "( Si teniu problemes, desactiveu-lo )" #: ../tcosmonitor.glade:2401 msgid "Actions controlled" msgstr "Accions controlades" #: ../tcosmonitor.glade:2422 msgid "Block ports: (80,8080... etc)" msgstr "Bloqueja els ports: (80,8080... etc)" #: ../tcosmonitor.glade:2540 msgid "TcosXmlRpc username" msgstr "Usuari del TcosXmlRpc" #: ../tcosmonitor.glade:2589 msgid "TcosXmlRpc password" msgstr "Contrasenya del TcosXmlRpc" #: ../tcosmonitor.glade:2638 msgid "" "NOTE:\n" "Default user is root and default password is root.\n" "\n" "For thin clients change TCOS_ROOT_PASSWD or use TcosConfig and " "regenerate boot images again.\n" "\n" "For standalone users you can use a system account (root) but this is " "not recomended. Install tcos-standalone and start it by root. Set user and " "password, this will create a /etc/tcospasswd file only used by TCOS " "and your root acount will be secure." msgstr "" "NOTA:\n" "L'usuari per defecte és root i la contrasenya és root.\n" "\n" "Per a clients lleugers canvieu el TCOS_ROOT_PASSWD o utilitzeu el " "TcosConfig i regenereu les imatges d'arrancada de nou.\n" "\n" "Per a equips autònoms(standalone) podeu utilitzar el compte del " "sistema (root) però això no és recomandable. Instal·leu el paquet tcos-" "standalone i executeu-ho com a administrador. Establiu un usuari i una " "contrasenya.La contrasenya es guardarà en /etc/tcospasswd, fitxer que " "només el necessita el TCOS perquè el vostre compte de superusuari (root) " "estiga segur." #: ../tcosmonitor.glade:2700 msgid "Authentication " msgstr "Autenticació" #: ../tcosmonitor.glade:2737 msgid "Info avalaible from tcosxmlrpc" msgstr "Informació disponible de tcosxmlrpc" #: ../tcosmonitor.glade:2763 msgid "Tcos general info" msgstr "Informació general de Tcos" #: ../tcosmonitor.glade:2782 msgid "Cpu info" msgstr "Informació de la CPU" #: ../tcosmonitor.glade:2801 msgid "Kernel and modules info" msgstr "Informació del nucli i els mòduls" #: ../tcosmonitor.glade:2820 msgid "PCI bus info" msgstr "Informació del bus PCI" #: ../tcosmonitor.glade:2839 msgid "Ram and swap info" msgstr "Informació de la RAM i la SWAP" #: ../tcosmonitor.glade:2858 msgid "Process info" msgstr "Informació de processos" #: ../tcosmonitor.glade:2877 msgid "Network info" msgstr "Informació de la xarxa" #: ../tcosmonitor.glade:2915 msgid "Sound server info" msgstr "Informació del servidor de so" #: ../tcosmonitor.glade:2966 msgid "Avalaible info" msgstr "Informació disponible" #: ../tcosmonitor.glade:3003 msgid "Show / hide menu items" msgstr "Mostra / oculta elements de menú" #: ../tcosmonitor.glade:3038 msgid "Lock and unlock screen" msgstr "Bloqueja i desbloqueja pantalles" #: ../tcosmonitor.glade:3060 msgid "Remote SSH shell" msgstr "Intèrpret d'ordes SSH remot" #: ../tcosmonitor.glade:3082 msgid "Configure Xorg settings" msgstr "Configura els paràmetres de l'Xorg" #: ../tcosmonitor.glade:3117 ../tcosmonitor.glade:3587 msgid "Exe app on user display" msgstr "Executa l'aplicació en la pantalla de l'usuari" #: ../tcosmonitor.glade:3139 ../tcosmonitor.glade:3609 msgid "Send a text message" msgstr "Envia un missatge de text" #: ../tcosmonitor.glade:3161 msgid "Show running apps" msgstr "Mostra les aplicacions en execució" #: ../tcosmonitor.glade:3183 ../tcosmonitor.glade:3631 msgid "Send video broadcast" msgstr "Envia la difusió del vídeo" #: ../tcosmonitor.glade:3227 msgid "Demo mode" msgstr "Mode demostració" #: ../tcosmonitor.glade:3262 msgid "Wake on LAN" msgstr "Desperta per xarxa" #: ../tcosmonitor.glade:3284 msgid "Audio conference mode" msgstr "Mode àudio conferència" #: ../tcosmonitor.glade:3306 msgid "Screenshots" msgstr "Captures de pantalla" #: ../tcosmonitor.glade:3328 msgid "Reboot and poweroff" msgstr "Apaga i reinicia" #: ../tcosmonitor.glade:3350 msgid "Lock and unlock internet" msgstr "Bloqueja i desbloqueja Internet" #: ../tcosmonitor.glade:3372 msgid "DPMS monitor on/off" msgstr "Control DPMS del monitor" #: ../tcosmonitor.glade:3394 msgid "Connect using VNC" msgstr "Connecta usant el VNC" #: ../tcosmonitor.glade:3415 msgid "Connect using iTALC" msgstr "Connecta usant l'iTALC" #: ../tcosmonitor.glade:3436 #, fuzzy msgid "Clone clients" msgstr "S'està connectant a %s..." #: ../tcosmonitor.glade:3458 msgid "Restart session with new settings" msgstr "Reinicia la sessió amb la nova configuració" #: ../tcosmonitor.glade:3515 msgid "Menus" msgstr "Menús" #: ../tcosmonitor.glade:3552 msgid "Show / hide menu buttons" msgstr "Mostra / oculta els botons del menú" #: ../tcosmonitor.glade:3675 msgid "Audio conference" msgstr "Audioconferència" #: ../tcosmonitor.glade:3719 msgid "Audio Chat control" msgstr "Control de xat d'àudio" #: ../tcosmonitor.glade:3776 msgid "Menu buttons" msgstr "Botons de menú" #: ../tcosmonitor.glade:3864 msgid "Question" msgstr "Pregunta" #: ../tcosmonitor.glade:3939 msgid "You can drag and drop launcher file to this box" msgstr "Podeu arrossegar i deixar anar un llançador a esta caixa" #: ../tcosmonitor.glade:3964 msgid "Run app in unknow host" msgstr "Executa l'aplicació en un equip desconegut" #: ../tcosmonitor.glade:4058 msgid "Static hosts list" msgstr "Llista d'equips estàtics" #: ../tcosmonitor.glade:4081 msgid "Static Hosts list" msgstr "Llista d'equips estàtics" # Winrar 2.9->Dialog Box Control:rarlng.dll #: ../tcosmonitor.glade:4190 msgid "Add" msgstr "Afegix" # Projecte_Mandrake [tm-mandrake.po] #: ../tcosmonitor.glade:4268 msgid "Modify" msgstr "Modifica" #: ../tcosmonitor.glade:4346 msgid "Delete" msgstr "Esborra" #: ../tcosmonitor.glade:4425 msgid "Get from connected" msgstr "Pren des dels connectats" #: ../tcosmonitor.glade:4606 ../tcosmonitor.glade:4989 msgid "Save" msgstr "Guarda" #: ../tcosmonitor.glade:4652 msgid "New or edit hosts" msgstr "Nou o edita la llista d'equips" #: ../tcosmonitor.glade:4706 msgid "" "You can add a simple host, \n" " example: 192.168.0.100\n" "\n" "or range of hosts, \n" " example: 192.168.0.100-120\n" "\n" "MAC address is optional" msgstr "" "Podeu afegir un únic equip,\n" " exemple: 192.168.0.100\n" "\n" "o un rang d'equips, \n" " exemple: 192.168.0.100-120\n" "\n" "l'adreça MAC és opcional" #: ../tcosmonitor.glade:4747 msgid "IP address *" msgstr "Adreça IP *" #: ../tcosmonitor.glade:5033 msgid "About TCOS" msgstr "Quant al TCOS" #: ../tcosmonitor.glade:5056 msgid "TcosMonitor" msgstr "TcosMonitor" #: ../tcosmonitor.glade:5129 msgid "Version:" msgstr "Versió:" #: ../tcosmonitor.glade:5186 msgid "" "Thin client and standalone\n" "monitoring tool." msgstr "" #: ../tcosmonitor.glade:5254 msgid "Project web site" msgstr "Pàgina web del projecte" #: ../tcosmonitor.glade:5332 msgid "About" msgstr "Quant a" #: ../tcosmonitor.glade:5390 msgid "License" msgstr "Llicència" #: ../tcosmonitor.glade:5423 msgid "" "Main developers:\n" " * Mario Izquierdo \n" " * Ignacio Vidal \n" "\n" "Contributors:\n" " * Andrés Jimenez\n" " * Quirón\n" "\n" "Special thanks to:\n" " Comunidad de Madrid, MaX group (Spain)" msgstr "" "Programadors principals:\n" " * Mario Izquierdo \n" " * Ignacio Vidal \n" "\n" "Han contribuït:\n" " * Andrés Jimenez\n" " * Quirón\n" "\n" "Molt especialment gràcies a:\n" " Comunitat de Madrid, grup MaX (Espanya)" #: ../tcosmonitor.glade:5467 msgid "Authors" msgstr "Autors" #: ../tcosmonitor.glade:5496 msgid "Translated to your language by:" msgstr "Traduït al vostre idioma per:" #: ../tcosmonitor.glade:5521 msgid "Mario Izquierdo " msgstr "Pilar Embid (Lliurex) " #: ../tcosmonitor.glade:5556 msgid "Translators" msgstr "Traductors" #: ../tcosmonitor.glade:5585 msgid "" "TCOS is a free software project that need a lot of work to be the best thin " "client plataform.\n" "\n" "We work every day a lot of hours to make changes and support more devices " "and features.\n" "\n" "We want to continue developing this software but need your help, if you use, " "sell or hack TCOS pehaps you could donate some money to project.\n" "\n" "Click on next url to get some info." msgstr "" "El TCOS és un projecte lliure que necessita molt de treball per a intentar " "ser la millor plataforma de clients lleugers.\n" "\n" "Treballem cada dia moltes hores per fer canvis i admetre més dispositius i " "característiques.\n" "\n" "Volem continuar fent-ho però necessitem la vostra ajuda, si utilitzeu, veneu " "o modifiqueu el TCOS, potser podreu donar alguns diners al projecte.\n" "\n" "Feu clic en l'url següent per a obtindre més informació." #: ../tcosmonitor.glade:5657 msgid "http://wiki.tcosproject.org/TcosProject:Site_support" msgstr "http://wiki.tcosproject.org/TcosProject:Site_support/es" #: ../tcosmonitor.glade:5695 msgid "Don't show donations message on start." msgstr "No mostres este missatge de donacions a l'inici." #: ../tcosmonitor.glade:5719 msgid "Donate" msgstr "Donacions" #: ../tcosmonitor.glade:5756 msgid "Chat emission list" msgstr "Llista d'emissió de xat" #: ../tcosmonitor.glade:5779 msgid "Chat emission list" msgstr "Emissió de xat" # Translators: Menu item Verb/Connect #: ../tcosmonitor.glade:5888 msgid "Connect" msgstr "Connecta" # Translators: Menu item Verb/Branch/Separate/Separate/Disconnect #: ../tcosmonitor.glade:5966 msgid "Disconnect" msgstr "Desconnecta" #: ../tcosmonitor.glade:6044 msgid "Exit" msgstr "Ix" #~ msgid "" #~ "Lliurex Lab is a customized program\n" #~ "based on Mario Izquierdo TcosMonitor\n" #~ "and Tcos monitoring tool." #~ msgstr "" #~ "El programa Lliurex Lab és una adaptació\n" #~ "basada en el programa de seguiment\n" #~ "TcosMonitor i Tcos de Mario Izquierdo." #, fuzzy #~ msgid "Clone clients (from this host)" #~ msgstr "Mode de demostració (des d'este equip)" #, fuzzy #~ msgid "No clients to clone." #~ msgstr "No s'han trobat clients lleugers." #, fuzzy #~ msgid "Do you want to clone the following clients: %s?" #~ msgstr "Voleu apagar els clients següents: %s?" #, fuzzy #~ msgid "Waiting for start clone mode..." #~ msgstr "S'està esperant l'arrancada del mode demostració..." #, fuzzy #~ msgid "Select image file to clone.." #~ msgstr "Seleccioneu el fitxer o fitxers..." #, fuzzy #~ msgid "Running in clone mode with %s clients." #~ msgstr "S'està executant en mode demostració amb %s equips." #, fuzzy #~ msgid "Running in clone mode from server. Clone Nº %s" #~ msgstr "" #~ "S'està executant en mode demostració des del servidor. Demostració núm. %s" #, fuzzy #~ msgid "Do you want to clone from client %s?" #~ msgstr "Voleu iniciar el mode demostració des de l'usuari %s?" #, fuzzy #~ msgid "Do you want only create a image from host %s?" #~ msgstr "Voleu iniciar el mode demostració des de l'usuari %s?" #, fuzzy #~ msgid "Waiting for start clone mode from client %s..." #~ msgstr "" #~ "S'està esperant l'arrancada del mode demostració des de l'usuari %s..." #, fuzzy #~ msgid "Select file to save clone image..." #~ msgstr "Seleccioneu el fitxer per a guardar la captura de pantalla..." #, fuzzy #~ msgid "Running in clone mode from client %(host)s. Clone Nº %(count)s" #~ msgstr "" #~ "S'està executant en mode demostració des de l'usuari %(host)s. " #~ "Demostració núm. %(count)s" #, fuzzy #~ msgid "Clone mode off." #~ msgstr "El mode conferència està desactivat." tcosmonitor/debian/0000775000000000000000000000000012260545022011546 5ustar tcosmonitor/debian/source/0000775000000000000000000000000012260544373013056 5ustar tcosmonitor/debian/source/format0000664000000000000000000000001512260544373014265 0ustar 3.0 (native) tcosmonitor/debian/copyright0000664000000000000000000000710412260544373013513 0ustar Format: http://dep.debian.net/deps/dep5 Upstream-Name: tcosmonitor Source: http://tcosproject.org/cgit/tcosmonitor.git Files: tcosmonitor/TcosDbus.py Comment: based on dbus bindings of Student-Control-Center-0.1 Copyright: 2005 Oliver Grawert License: GPL-2.0+ Files: tcosmonitor/WakeOnLan.py Copyright: 2002 by Micro Systems, Marc Balmer, marc@msys.ch License: GPL-1.0 Files: tcosmonitor/htmltextview.py Copyright: 2005 Gustavo J. A. M. Carneiro License: GPL-2.0+ Files: tcosmonitor/ftps_server.py tcosmonitor/counter.py Comment: medusa demo from python-m2xrypto sources http://svn.osafoundation.org/m2crypto/trunk/demo/medusa/ftps_server.py Copyright: 1999-2003 Ng Pheng Siong. All rights reserved. 2004-2006 Open Source Applications Foundation. 2005-2006 Vrije Universiteit Amsterdam. License: BSD-style (python-m2crypto) Permission to use, copy, modify, and distribute this software and its documentation for any purpose and without fee is hereby granted, provided that the above copyright notice appear in all copies and that both that copyright notice and this permission notice appear in supporting documentation. . THE AUTHOR PROVIDES THIS SOFTWARE ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. Files: * Copyright: 2005-2011 Mario Izquierdo (mariodebian) License: GPL-2.0+ Files: debian/* Copyright: 2005-2011 Mario Izquierdo (mariodebian) License: GPL-2.0+ License: GPL-2.0+ This package is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. . This package is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. . You should have received a copy of the GNU General Public License along with this program. If not, see . On Debian systems, the complete text of the GNU General Public License version 2 can be found in "/usr/share/common-licenses/GPL-2". License: GPL-1.0 This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 1, or (at your option) any later version. . This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. . You should have received a copy of the GNU General Public License along with this program; if not, see . On Debian systems, the complete text of the GNU General Public License version 1 can be found in "/usr/share/common-licenses/GPL-1". tcosmonitor/debian/tcosmonitor-common.docs0000664000000000000000000000007212260544373016275 0ustar README AUTHORS TODO README.server-utils README.standalone tcosmonitor/debian/tcosmonitor.manpages0000664000000000000000000000016012260544373015650 0ustar man/tcosmonitor.1 man/tcos-devices-ng.1 man/tcos-volume-manager.1 man/tcospersonalize.1 man/tcos-server-utils.1 tcosmonitor/debian/changelog0000664000000000000000000025236512260544775013453 0ustar tcosmonitor (0.2.49) unstable; urgency=low * Remove python-eggtrayicon, (closes: #702104) * Add msg if FTP fail -- Mario Izquierdo (mariodebian) Mon, 07 Oct 2013 15:43:20 +0200 tcosmonitor (0.2.48) unstable; urgency=low * Add French translation (closes: #678235) Thanks to Julien Patriarca -- Mario Izquierdo (mariodebian) Fri, 22 Jun 2012 13:33:28 +0200 tcosmonitor (0.2.47) unstable; urgency=low * tcosmonitor/TcosCommon.py: - Fix print_debug() typo in lookup() - Do a revlookup() in all nameservers -- Mario Izquierdo (mariodebian) Sun, 05 Feb 2012 21:57:29 +0100 tcosmonitor (0.2.46) unstable; urgency=low * tcosmonitor/TcosCommon.py: - Ask all nameservers and init server list in lookup() -- Mario Izquierdo (mariodebian) Sun, 05 Feb 2012 21:56:40 +0100 tcosmonitor (0.2.45) unstable; urgency=low * tcos-devices-ng.py: fix remove_duplicates() inliner -- Mario Izquierdo (mariodebian) Wed, 25 Jan 2012 11:59:16 +0100 tcosmonitor (0.2.44) unstable; urgency=low * Change Priority to extra, we depend on some extra packages * Fix spelling errors in manual pages * README: Remove hex2ascii.c (is in tcos-core package) * README.standalone: Update ports info * Remove rsync doc * Switch from CDBS to dh7 format -- Mario Izquierdo (mariodebian) Mon, 02 Jan 2012 17:08:18 +0100 tcosmonitor (0.2.43) unstable; urgency=low * Promoted by "Antonio Pérez-Aranda " from Yaco Sistemas SL * Remove 'op' Depends (breaks nmap mode) -- Mario Izquierdo (mariodebian) Tue, 06 Sep 2011 17:02:52 +0200 tcosmonitor (0.2.42) unstable; urgency=low * tcosmonitor/extensions/info.py: show Pulseaudio mixer if standalone without pingport() * debian/copyright: Machine readable debian/copyright format * update debian/copyright * global license headers fix * Add Avahi mDNS for discover thin clients * tcosmonitor/shared.py: add isIPAddr method * tcosmonitor/TcosCommon.py: don't make a gethostbyaddr() * initial multiseat support -- Mario Izquierdo (mariodebian) Sun, 12 Jun 2011 13:48:09 +0200 tcosmonitor (0.2.41) unstable; urgency=low * tcosmonitor/TcosActions.py: fix compare groupexclude, debian/control: update versions * tcosmonitor/TcosActions.py: fix exclude typo and print debug messages when asking for exclude user * tcosmonitor/__init__.py: redirect errors to stderr and check for TCOSMONITOR_NO_EXTENSIONS for not loading extensions dir * debian/control: change GIT URL and remove obsolete python-2.4-dbus -- Mario Izquierdo (mariodebian) Thu, 25 Nov 2010 13:29:44 +0100 tcosmonitor (0.2.40.1) unstable; urgency=low * tcosmonitor/TcosDBus.py: really fix fucking dbus issue -- Mario Izquierdo (mariodebian) Thu, 11 Nov 2010 22:06:24 +0100 tcosmonitor (0.2.40) unstable; urgency=low * debian/control: move python-ipaddr, python-ipy to tcosmonitor-common * tcosmonitor/TcosDBus.py: fix sendfiles in thin client and standalone at the same time ;) -- Mario Izquierdo (mariodebian) Thu, 11 Nov 2010 20:44:23 +0100 tcosmonitor (0.2.39) unstable; urgency=low * tcosmonitor/extensions/sendfiles.py: fix wrong number of arguments in xmlrpc.DBus() * New pref variable 'consolekit' to disable Sessions() search * Move TcosXmlRcp to tcosmonitor-common and move xlib to tcosmonitor- common Depends * debian/control update Conclicts versions * tcosmonitor/LocalData.py: import Connections when search method is consolekit * tcosmonitor/TcosDBus.py: split dbus.Array instead of a string -- Mario Izquierdo (mariodebian) Thu, 11 Nov 2010 18:19:54 +0100 tcosmonitor (0.2.38) unstable; urgency=low * tcos-devices-ng.py: use exception in get_desktop_path() pt_BR Desktop path have spaces * tcos-devices-ng.py: use $HOME instead of Desktop -- Mario Izquierdo (mariodebian) Fri, 05 Nov 2010 16:23:18 +0100 tcosmonitor (0.2.37) unstable; urgency=low * debian/control: add consolekit as Depends * tcosmonitor/LocalData.py: - Add Sessions.Connections() [consolekit] to search thin clients - Check for dbus gdm.conf instead of dbus exception * tcosmonitor/TcosPreferences.py: - Use a better method to save scan_network_method var * tcosmonitor/extensions/vnc.py: - Use threads lock when starting VNC window. -- Mario Izquierdo (mariodebian) Fri, 15 Oct 2010 16:47:31 +0200 tcosmonitor (0.2.36) unstable; urgency=low * tcosmonitor/shared.py: don't run if ipstr is empty and clean old code * tcosmonitor/LocalData.py tcosmonitor/Sessions.py: use GDM and ConsoleKit dbus to read users and time (instead of wtmp) * tcos-devices-ng.py: fix newcdrom call, and eject when umounting * Allow to call shared.py to parse IP's, redirect debug to stderr * dbus/81tcos-utils: call shared.py instead of importing modules -- Mario Izquierdo (mariodebian) Sun, 03 Oct 2010 17:11:34 +0200 tcosmonitor (0.2.35) unstable; urgency=low * tcosmonitor/shared.py: fix some :0.0 values in parseIPAddress() * tcosmonitor/shared.py: support ssh -X connections 'localhost:10.0' -- Mario Izquierdo (mariodebian) Fri, 10 Sep 2010 19:53:04 +0200 tcosmonitor (0.2.34) unstable; urgency=low * tcospersonalize.py, fix print_debug and comment glade calls * remove glade references * tcosmonitor/LocalData.py: fix in_group function * tcos-devices-ng.py: automount CDROM/DVD events generated by new tcos cdrom-mount -- Mario Izquierdo (mariodebian) Tue, 13 Jul 2010 12:05:05 +0200 tcosmonitor (0.2.33) unstable; urgency=low [ Mario Izquierdo (mariodebian) ] * tcosmonitor/LocalData.py: fix typo mitad1 => half1 [ Ignacio Vidal ] * debian/control: add python-m2crypto python-medusa to Depends and move op from one package to other * debian/tcosmonitor-common.install debian/tcosmonitor.install: install new files and move nmap-tcos.conf op * rename lintian file * tcos-devices-ng.py: add a error message if user is not in fuse group and use get-xdg-desktop instead of rsync-controller * tcosmonitor/ping.py: parse XML output of nmap * tcosmonitor/LocalData.py: return if newhost fail * tcosmonitor/extensions/tcosnetcontroller.py: Add space in message * tcosmonitor/extensions/screenshot.py: Set hostname if NO_LOGIN_MSG * tcosmonitor/extensions/livevnc.py: Set hostname if NO_LOGIN_MSG * tcosmonitor/TcosActions.py: continue if newhost fail * tcosmonitor/TcosDBus.py: Add new method to sendfiles * tcosmonitor/TcosStaticHosts.py: continue if newhost fail * tcosmonitor/extensions/sendfiles.py: Change rsync with FTP+SSL * tcosmonitor.py: Start FTP+SSL server * tcosmonitor/counter.py: Counter of hosts * tcosmonitor/ftps_server.py: FTP+SSL server with medusa and python- M2Crypto [ Mario Izquierdo (mariodebian) ] * Release 0.2.33 -- Mario Izquierdo (mariodebian) Fri, 30 Apr 2010 15:54:01 +0200 tcosmonitor (0.2.32) unstable; urgency=low [ Mario Izquierdo (mariodebian) ] * tcosmonitor/shared.py: refactorize parseIPAddress, detect hostnames in binary format * remove glade files * include all packages in DEB_PACKAGES, fix dh_pysupport call in tcosmonitor-common * refactorize some code, and use pylint to fix some warnings [ Ignacio Vidal ] * tcos-volume-manager.py tcospersonalize.py: delete gtk.glade import * tcosmonitor/shared.py: add nmap to scan_methods and vboxnet as hidden ifaces * tcosmonitor.py if uid is 0 set user in group to True * install nmap-tcos in op.d dir with 0600 perms * debian/control: add nmap and op to tcosmonitor-common deps * debian/rules: exclude op.d/nmap-tcos.conf in fixperms * debian/tcosmonitor-common.install: install /etc/op/op.d/nmap- tcos.conf * debian/tcosmonitor.install: remove glade files * tcosmonitor/shared.py: add forgoten coma * tcosmonitor/ping.py: Add new nmap functions * tcosmonitor/extensions/audiortp.py: fix this extension with format=s16be and rename var ip=ip_simple * tcosmonitor/TcosPreferences.py: add nmap method after ping * tcosmonitor/TcosActions.py: Add nmap method and create 2 new vars, lenclients and excludes * tcosmonitor/LocalData.py: replace in_group_tcos function and split uthost in half to compare it [ Mario Izquierdo (mariodebian) ] * Release 0.2.32 -- Mario Izquierdo (mariodebian) Fri, 23 Apr 2010 17:59:22 +0200 tcosmonitor (0.2.31) unstable; urgency=low * tcosmonitor/shared.py: fix NoneType when looking at ipv4_mapped object * tcosmonitor/ping.py: don't fail if we can start ping thread * tcosmonitor/LocalData.py tcosmonitor/TcosExtensions.py tcosmonitor/ping.py: use parseIPAddress instead of spliting DISPLAY * Release 0.2.31 -- Mario Izquierdo (mariodebian) Sat, 17 Apr 2010 16:01:55 +0200 tcosmonitor (0.2.30) unstable; urgency=low * tcosmonitor/shared.py: return hostname if ipstr is a string * dbus/tcos-dbus-client.py convert IP to string * tcos-devices-ng.py: convert IP to string * tcosmonitor/LocalData.py: convert IP to string * tcosmonitor/TcosCommon.py: convert IP to string * tcosmonitor/TcosXauth.py: convert IP to string * tcosmonitor/shared.py: parse IPV6 xauth in Debian lenny [::ffff:x.x.x.x]:0 -- Mario Izquierdo (mariodebian) Wed, 31 Mar 2010 15:59:34 +0200 tcosmonitor (0.2.29) unstable; urgency=low * clean a lot of old code and fix aboutdialog i18n * add more hidden process and new method parseIPAddress that supports IPV6 strings * dbus/tcos-dbus-client.py: use new shared.parseIPAddress * tcos-devices-ng.py: use new shared.parseIPAddress * tcos-volume-manager.py: use new shared.parseIPAddress * tcosmonitor/LocalData.py: use shared.parseIPAddress * tcosmonitor/TcosCommon.py: use shared.parseIPAddress * tcosmonitor/extensions/viewproc.py: replace & => & * tcosmonitor/TcosXauth.py: use python-xlib and shared.parseIPAddress to get xauth cookies and IPs * debian/control: add new depends python-xlib python-ipaddr python-ipy * tcosmonitor/shared.py: give better exception info * dbus/81tcos-utils: use python to get DISPLAY -- Mario Izquierdo (mariodebian) Tue, 30 Mar 2010 17:45:42 +0200 tcosmonitor (0.2.28) unstable; urgency=low * tcos-devices-ng.py: fix udev_daemon loop * tcos-devices-ng.py: fix typo get_desktop_patch => get_desktop_path * tcos-devices-ng.py: detect kde if kwin is running and launch dolphin if avalaible * tcos-devices-ng.py TcosCommon.py: fix IOError and OSError in python2.6 * tcos-devices-ng.py: stop app using Ctrl+C quiting mainloop * change glade to gtkbuilder * update translations * install ui files instead of glade * update standards to 3.8.4 * remove obsolete install target in Makefile -- Mario Izquierdo (mariodebian) Thu, 18 Mar 2010 16:01:05 +0100 tcosmonitor (0.2.27) unstable; urgency=low * hide all menus with new pref checkboxes except info, and fix tcos- server-utils.py tipo * allow more than one VNC window * debian/copyright: change (C) with © * Fix description of packages * debian/tcosmonitor.dirs: remove empty dir * tcos-devices-ng.py tcos-volume-manager.py tcosmonitor/TcosXmlRpc.py: use new XMLRPC method => config to start or not if TCOS var is enabled -- Mario Izquierdo (mariodebian) Fri, 18 Dec 2009 19:15:21 +0100 tcosmonitor (0.2.26) unstable; urgency=low * fix typo in Spanish translation * new checkbox in preferences ck_notshowwhentcosmonitor, don't show thin client if tcosmonitor is running there * add click support to livevnc, thanks to Fernando Lisón for asking for it * add actions menu when right clicking on screenshots -- Mario Izquierdo (mariodebian) Sun, 08 Nov 2009 14:52:11 +0100 tcosmonitor (0.2.25) unstable; urgency=low * add support for new gtk.Tooltip() and show hostname in ClassView in standalone * disable set_tooltip_text, freeze the GUI -- Mario Izquierdo (mariodebian) Tue, 13 Oct 2009 11:59:16 +0200 tcosmonitor (0.2.24) unstable; urgency=low * tcosmonitor/TcosTrayIcon2.py: Fix crash of tcos-devices-ng, generate menu in save thread -- Mario Izquierdo (mariodebian) Thu, 01 Oct 2009 16:05:28 +0200 tcosmonitor (0.2.23) unstable; urgency=low * add support for scaling VNC on client in LiveView, add stop and fullscreen buttons * Update translation and Spanish template -- Mario Izquierdo (mariodebian) Thu, 01 Oct 2009 01:27:14 +0200 tcosmonitor (0.2.22) unstable; urgency=low * tcosmonitor/extensions/livevnc.py: - New extension to view all thin clients with python-gtk-vnc * tcosmonitor/extensions/vnc.py: - Change vncviewer external command with gtkvnc widget in a Window. * python-gnome2-extras is deprecated, use: python-eggtrayicon | python-gnome2-extras -- Mario Izquierdo (mariodebian) Fri, 25 Sep 2009 23:50:36 +0200 tcosmonitor (0.2.21+1) UNRELEASED; urgency=low * tcosmonitor/TcosDBus.py tcosmonitor/TcosCommon.py: - in Ubuntu, with NetworkManager need to wait and rescan local IP address in a loop, tcos-dbus-client starts before network is up. -- Mario Izquierdo (mariodebian) Wed, 09 Sep 2009 16:10:44 +0200 tcosmonitor (0.2.21) unstable; urgency=low * Remove obsolete patch targets * Add xres 1440x900 * Add karmic patch -- Mario Izquierdo (mariodebian) Sat, 05 Sep 2009 15:55:17 +0200 tcosmonitor (0.2.20) unstable; urgency=low * Create setup.py to build and install package * Clean some deprecated code in debian/rules * Bump Standard version to 3.8.0, compat to 7 and debhelper to 7.0.0 -- Mario Izquierdo (mariodebian) Tue, 01 Sep 2009 18:08:40 +0200 tcosmonitor (0.2.19+2) unstable; urgency=low * tcosmonitor/TcosXmlRpc.py: - Change *args with args='' - Debug arguments of vnc() * tcosmonitor/LocalData.py: - Disable too much verbose debug -- Mario Izquierdo (mariodebian) Mon, 31 Aug 2009 11:45:52 +0200 tcosmonitor (0.2.19+1) unstable; urgency=low * Update pt_BR translation (thanks Aecio) -- Mario Izquierdo (mariodebian) Thu, 16 Jul 2009 21:47:36 +0200 tcosmonitor (0.2.19) unstable; urgency=low * Fix Ubuntu jaunty modules install (use dist instead of site) * Replace comparations of type() with isinstance() * TcosClassView: - Fix icons size and names * Add pan0 as hidden network interface * tcos-devices-ng.py: - Call filemanager with subprocess instead of os.system() -- Mario Izquierdo (mariodebian) Mon, 01 Jun 2009 16:31:10 +0200 tcosmonitor (0.2.18-1) unstable; urgency=low * New big version * A lot of patches by Ignacio Vidal (merge Lliurex Lab, not all) * Merge to master * Add patch_lenny target -- Mario Izquierdo (mariodebian) Sun, 15 Feb 2009 19:33:24 +0100 tcosmonitor (0.2.17~rc12) unstable; urgency=low * man/tcos-volume-manager.1 tcos-volume-manager.glade tcos-volume- manager.py tcosmonitor/TcosXmlRpc.py - New button to restart remote PulseAudio -- Mario Izquierdo (mariodebian) Wed, 04 Feb 2009 13:11:41 +0100 tcosmonitor (0.2.17~rc11) unstable; urgency=low * Update Vcs- debian/control headers to new GIT repos * tcospersonalize.desktop: - Don't show in any desktop -- Mario Izquierdo (mariodebian) Tue, 03 Feb 2009 18:38:38 +0100 tcosmonitor (0.2.17~rc10) unstable; urgency=low * server-utils/tcos-server-utils.py: - Fix confusion between allclients and alltcosclients * Makefile: - Clean all ~ temp files -- Mario Izquierdo (mariodebian) Mon, 26 Jan 2009 17:11:21 +0100 tcosmonitor (0.2.17~rc9) unstable; urgency=low * Update pt_BR translation. * tcosmonitor/extensions/wakeonlan.py - Fix call to WakeOnLan class (remove double call) -- Mario Izquierdo (mariodebian) Tue, 20 Jan 2009 18:55:56 +0100 tcosmonitor (0.2.17~rc8) unstable; urgency=low * tcosmonitor/__init__.py: - Don't load extensions when DISPLAY is not set * tcosmonitor/TcosTrayIcon2.py tcos-devices-ng.py: - Change device information * server-utils/tcos-server-utils.py: - Fix minor typos * Update translations -- Mario Izquierdo (mariodebian) Sun, 11 Jan 2009 23:50:22 +0100 tcosmonitor (0.2.17~rc7) unstable; urgency=low * tcosmonitor/TcosCommon.py tcosmonitor/TcosXauth.py - Fix normal lookup for IP from hostname * tcos-devices-ng.py tray.glade images/eject.png tcosmonitor/TcosTrayIcon2.py - New TrayIcon Class, with a popup window and eject buttons -- Mario Izquierdo (mariodebian) Tue, 06 Jan 2009 00:38:06 +0100 tcosmonitor (0.2.17~rc6) unstable; urgency=low * tcosmonitor.glade tcosmonitor.py - Reduce mainwindow size if running in low res screen (< 1024x768) * setup.py: - Don't build if target is clean * tcosmonitor/TcosCommon.py tcosmonitor/LocalData.py debian/control - Add python-dns support (reduce dns timeouts) * Makefile: - Fix shared.py path -- Mario Izquierdo (mariodebian) Wed, 31 Dec 2008 17:22:10 +0100 tcosmonitor (0.2.17~rc5) unstable; urgency=low * Big changes by Vidal: - New chat center - Improved chat support - New quick buttons toolbar to exec 5 usual actions - Add some images of new toolbar * tcosmonitor/TcosClassView.py: - Set iconview size in old versions of GTK+ (< 2.10.0) for Debian etch - Fix icons names -- Mario Izquierdo (mariodebian) Sun, 12 Oct 2008 22:38:05 +0200 tcosmonitor (0.2.17~rc4) unstable; urgency=low * debian/tcosmonitor.install debian/tcosmonitor-common.install: - Install ping.py in tcomsonitor-common package (TcosDBus need it) * tcosmonitor/TcosDBus.py tcosmonitor/extensions/appsmsg.py - Use xml.sax.saxutils.escape to escape pynotify text messages. * tcosmonitor/extensions/appsmsg.py - Convert elif => if -- Mario Izquierdo (mariodebian) Mon, 06 Oct 2008 14:43:53 +0200 tcosmonitor (0.2.17~rc3) unstable; urgency=low * Remove tree from Build-Depends and remove debug code in debian/rules -- Mario Izquierdo (mariodebian) Sun, 05 Oct 2008 17:57:58 +0200 tcosmonitor (0.2.17~rc2) unstable; urgency=low [ Mario Izquierdo (mariodebian) ] * tcosmonitor/TcosConf.py - Really close file descriptor (thanks Vidal) [ Ignacio Vidal ] * tcosmonitor/TcosDBus.py - Fix import * tcosmonitor/extensions/restartxorg.py - Update change lockscreen -- Ignacio Vidal Fri, 03 Oct 2008 14:36:01 +0200 tcosmonitor (0.2.17~rc1) unstable; urgency=low * Split package in tcosmonitor and tcosmonitor-common - tcos-standalone will depend on tcosmonitor-common package (less files) * debian/rules, debian/control: - Switch package to CDBS * Move Python code into tcosmonitor and tcosmonitor/extensions dirs * Create setup.py (Python distutils): - Install in Python path as module (import tcosmonitor) - Edit all init scripts to import correct tcosmonitor modules * Remove old LTSP and PXES code and Makefiles * tcosmonitor/__init__.py tcosmonitor/extensions/__init__.py: - Load all modules in __all__ list * Forget to readd debian/rules to SVN * tcosmonitor/TcosExtensions.py: - call xmlrpc.newhost before real_action (fix icons change) * tcosmonitor/*.py: - import ping package from tcosmonitor -- Mario Izquierdo (mariodebian) Thu, 02 Oct 2008 10:35:36 +0200 tcosmonitor (0.2.16~rc9) unstable; urgency=low [ Mario Izquierdo (mariodebian) ] * tcospersonalize.desktop - Hide menu (not very ussesfull without host IP) * htmltextview.py extensions/screenshot.py - Add onclick tag on img code and show a 'Save Screenshot' menu when user clicks on image * Update translations (spanish and template) [ Ignacio Vidal ] * TcosXmlRpc.py extensions/* shared.py: - Add conference chat mode between clients - Add send Mic audio from client - On exec apps in clients allow send web address * tcos-volume-manager.py: - Update get sound channels on refresh * po/* - Update translations (spanish and template) * TcosPreferences.py: - Show menus compatibility with old user conf * TcosConf.py: - Create conf file if is empy to avoid problems [ Mario Izquierdo (mariodebian) ] * Fix __import__ in python < 2.5 * Fix props.has_tooltip in gtk old versions -- Ignacio Vidal Thu, 25 Sep 2008 15:19:54 +0200 tcosmonitor (0.2.16~rc8) unstable; urgency=low [ Mario Izquierdo (mariodebian) ] * Use PyLint to strace/fix all warnings and errors [ Ignacio Vidal ] * TcosXmlRpc.py shared.py tcosmonitor.py LocalData.py tcosmonitor.conf: - Allow net-lock block only ports * TcosActions.py TcosClassView.py extensions/* TcosMenus.py TcosExtensions.py TcosIconView.py TcosPreferences.py: - Fix show enabled/disabled menu items - Fix change state of screens -- Ignacio Vidal Thu, 18 Sep 2008 12:12:04 +0200 tcosmonitor (0.2.16~rc7) unstable; urgency=low [ Ignacio Vidal ] * TcosPreferences.py: - Fix show visible menus in first run * TcosActions.py extensions/videolan.py LocalData.py: - Add support for ip-multicast route [ Mario Izquierdo (mariodebian) ] * TcosActions.py - If scan method == ping call all view classes to clean (not use self.model) -- Mario Izquierdo (mariodebian) Thu, 11 Sep 2008 15:21:33 +0200 tcosmonitor (0.2.16~rc6) unstable; urgency=low The extensions pre release * Move a lot of code from TcosActions.py to extensions/*.py * New class TcosExtensions.py (every extension heredate from it) * This release is not finished !!!! * TODO: - Make extensions preferences (register/load/save) - Rewrite some code to make TcosExtensions.py smaller - Fix Menus Show function - Move doaction_onthisclient() TcosActions.py => TcosExtensions.py - New view mode VNC icons (using python-vnc) ???? * Create more extensions: - viewproc.py videolan.py sendfiles.py wakeonlan.py - Delete some old code from TcosActions.py * Update translations template and spanish po file * Add Ubuntu intrepid target in Makefile * Makefile - Replace seds with a shell for loop to replace version in py files -- Mario Izquierdo (mariodebian) Fri, 05 Sep 2008 16:02:16 +0200 tcosmonitor (0.2.16~rc5) unstable; urgency=low * ping.py TcosCommon.py debian/control: - Replace old code to get interfaces and IP addr with python-netifaces (in TCOS mirror) -- Mario Izquierdo (mariodebian) Thu, 07 Aug 2008 14:58:45 +0200 tcosmonitor (0.2.16~rc4) unstable; urgency=low * Makefile: - Forgot to install TcosMenus.py new class -- Mario Izquierdo (mariodebian) Wed, 06 Aug 2008 21:01:36 +0200 tcosmonitor (0.2.16~rc3) unstable; urgency=low * New class: TcosListView.py: - Move some code from TcosActions.py (code to work with list view mode) * New class: TcosMenus.py: - Move some code from TcosActions.py to generate menus and capture events * Delete deprecated and comented gtk.gdk.threads_*() calls * Update template and spanish translation -- Mario Izquierdo (mariodebian) Wed, 06 Aug 2008 19:51:37 +0200 tcosmonitor (0.2.16~rc2) unstable; urgency=low The Class Simulator mode pre release. * New class: TcosClassView.py - Based on gtk.Fixed with drag&drop support and position save&restore (from MenuAll) * TcosActions.py shared.py TcosPreferences.py: - Add new setting: menugroup to show menus without groups (like old versions) -- Mario Izquierdo (mariodebian) Fri, 01 Aug 2008 20:18:57 +0200 tcosmonitor (0.2.16~rc1) unstable; urgency=low Icons rules pre-release: * Add TcosIconView.py and modify GUI to show list and iconview * shared.py TcosActions.py TcosPreferences.py - Add new var listmode * TcosActions.py TcosCommon.py: - When drag launcher use glob.glob and use gconf to read GNOME Icon theme * LocalData.py: - New function (not used yet) get_arptable( IP, MAC and ifaces) * Update templates and Spanish translation -- Mario Izquierdo (mariodebian) Fri, 01 Aug 2008 00:12:11 +0200 tcosmonitor (0.2.15.3) unstable; urgency=low * TcosActions.py TcosXmlRpc.py shared.py tcos-volume-manager.glade tcos-volume-manager.py - Use new tmixer API to get all sound channels at the same time and use mute switch when avalaible. -- Mario Izquierdo (mariodebian) Wed, 30 Jul 2008 19:17:29 +0200 tcosmonitor (0.2.15.2) unstable; urgency=low * TcosActions.py tcos-devices-ng.py TcosXmlRpc.py - Remove .replace('\n','') tcosxmlrpc don't return '\n' anymore * TcosActions.py shared.py - Create Menu groups * tcosmonitor.glade TcosActions.py shared.py: - Add DPMS menu action (switch on/off monitor energy saving) * Update translations template and spanish es.po -- Mario Izquierdo (mariodebian) Mon, 28 Jul 2008 11:46:32 +0200 tcosmonitor (0.2.15.1) unstable; urgency=low * LocalData.py TcosDBus.py - Fix typos * Fix translation problem -- Ignacio Vidal Tue, 22 Jul 2008 13:56:32 +0200 tcosmonitor (0.2.15) unstable; urgency=low * New release 0.2.15 -- Mario Izquierdo (mariodebian) Sat, 19 Jul 2008 20:37:45 +0200 tcosmonitor (0.2.14.9) unstable; urgency=low * Update pt_BR translation, thanks to Aécio dos Santos Pires * tcosmonitor.glade: - Disable homogeneous table size in advanced preferences -- Mario Izquierdo (mariodebian) Wed, 16 Jul 2008 20:31:32 +0200 tcosmonitor (0.2.14.8) unstable; urgency=low * Update translation -- Ignacio Vidal Tue, 01 Jul 2008 14:47:01 +0200 tcosmonitor (0.2.14.7) unstable; urgency=low [ Mario Izquierdo (mariodebian) ] * tcosmonitor.conf shared.py tcosmonitor.py - Read tcosmonitor.conf for group and exclude vars * Update translation [ Ignacio Vidal ] * Add valencian translation by Lliurex -- Ignacio Vidal Mon, 30 Jun 2008 09:58:31 +0200 tcosmonitor (0.2.14.6) unstable; urgency=low * TcosPersonalize: - Add new tab to configure boot options * Update translation template and spanish po file -- Mario Izquierdo (mariodebian) Mon, 09 Jun 2008 09:49:38 +0200 tcosmonitor (0.2.14.5) unstable; urgency=low * TcosActions.py - Fix restart xorg with ssl enabled -- Ignacio Vidal Tue, 03 Jun 2008 15:08:29 +0200 tcosmonitor (0.2.14.4) unstable; urgency=low * TcosActions.py ping.py TcosXmlRpc.py LocalData.py - Fix use xmlrpc and port listening with ssl port -- Ignacio Vidal Mon, 02 Jun 2008 15:26:26 +0200 tcosmonitor (0.2.14.3) unstable; urgency=low * LocalData.py - Fix Getlast break * TcosActions.py ping.py TcosXmlRpc.py LocalData.py - Fix use xmlrpc with ssl port * TcosActions.py - Fix aspect ratio problem in certain videos and fullscreen in standalone -- Ignacio Vidal Thu, 29 May 2008 17:44:47 +0200 tcosmonitor (0.2.14.2) unstable; urgency=low [ Mario Izquierdo (mariodebian) ] * TcosActions.py TcosXmlRpc.py LocalData.py htmltextview.py - Fix Getlast() using while 1 loop - Add warning about not in group tcos * Update translations (1 new string) [ Ignacio Vidal ] * TcosActions.py - Fix reset localdata.newhost before probe IsStandalone,IsLogged..etc with old cache - Fix vnc typo * LocalData.py - Fix Getlast() with method last and users much time logged -- Ignacio Vidal Tue, 27 May 2008 14:19:44 +0200 tcosmonitor (0.2.14.1) unstable; urgency=low * Change translation model (obtained from private/tcosmonitor) * Add translation pt_BR: (thanks Maria del Mar Alejo Campos (mymalejo) and Luis Méndez Alejo (gnumax)) -- Mario Izquierdo (mariodebian) Sat, 24 May 2008 19:41:29 +0200 tcosmonitor (0.2.14) unstable; urgency=low [ Mario Izquierdo (mariodebian) ] * TcosActions.py TcosXmlRpc.py tcosmonitor.glade shared.py LocalData.py TcosPreferences.py images/active_ssl.png - Enable SSL connections between TcosMonitor and XMLRPC daemon - Show SSL icon in active column - Only show running hosts in static method * Update transaltions * TcosXmlRpc.py - Reset self.sslconnection to False when newhost is called * TcosActions.py: - Revert last change unaccent => clean_string.sh * TcosXmlRpc.py: - Add more debug info and change Server() => ServerProxy() * tcos-devices-ng.py - Fix reboot and poweroff notification [ Ignacio Vidal ] * TcosActions.py TcosXmlRpc.py shared.py LocalData.py - Add support for lock/unlock internet in clients - If we are member of group tcos, not need to be root to execute tcospersonalize * TcosPreferences.py TcosConf.py shared.py - config_file_secrets, user and password generic for all tcosmonitor users (in group tcos) * debian/* - Fix postrm and prerm -- Ignacio Vidal Fri, 23 May 2008 10:50:52 +0200 tcosmonitor (0.2.13) unstable; urgency=low [ Mario Izquierdo (mariodebian) ] * Add support to reboot&poweroff to tcos-devices-ng * Fix IsNew and empty menus first time * Update translations * server-utils/tcos-server-utils.py: - Fix init in TcosDBusActions (need self.main param) * Put icons in preferences tabs (better look&feel) [ Ignacio Vidal ] * tcos-devices-ng.py: - Need fix gettext - Use down-controller with timeout instead sleep * shared.py: - Some thin clients like etc2500 only have "Master Front" audio * tcosmonitor.py shared.py - Enable/disable check if user are in allowed group to use Tcosmonitor - Fix mkdir /tmp/tcos_share * TcosConf.py: - Update chmod * Localdata.py - Getlast: use who instead last method * TcosActions.py TcosXmlRpc.py shared.py LocalData.py - Vlc not recognize module cdda:// - vncviewer in server show mouse of client - Exclude control in Tcosmonitor over users in blacklist group, specified in shared.py - Update translation Pulseaudio not running -- Ignacio Vidal Wed, 07 May 2008 23:16:11 +0200 tcosmonitor (0.2.12) unstable; urgency=low * TcosActions.py htmltextview.py TcosXmlRpc.py - Use tcos.getscreenshot() to retrieve Base64 screenshots * debian/control - Depends on tcos-core >= 0.89~rc0 and Conclicts with << 0.88.16 * Update translations * README.rsync - Fix typo in rsync configuration file -- Mario Izquierdo (mariodebian) Sun, 13 Apr 2008 11:41:48 +0200 tcosmonitor (0.2.11) unstable; urgency=low [ Mario Izquierdo (mariodebian) ] * TcosActions.py: - Fix for loop (self.main.config.vars can have 2 or 3 items) [ Ignacio Vidal ] * TcosActions.py: - Fix pulseaudio info * LocalData.py: - Fix getlast() [ Mario Izquierdo (mariodebian) ] * TcosActions.py htmltextview.py TcosXmlRpc.py -- Mario Izquierdo (mariodebian) Sat, 12 Apr 2008 12:03:51 +0200 tcosmonitor (0.2.10) unstable; urgency=low [ Mario Izquierdo (mariodebian) ] * tcosmonitor.glade: - Edit Preferences window, add new tab (Advanced settings) - Window is now more simple and smaller [ Ignacio Vidal ] * TcosActions.py ping.py TcosXmlRpc.py tcosmonitor.py TcosCommon.py TcosDBus.py - Update popen actions to avoid defuncts /bin/sh (experimental) * TcosActions.py: - Add Conference Mode, now mic in server can share and users hear - Translate pulseaudio info * TcosXmlRpc.py: - Add support for rtp sound * tcosmonitor.glade: - Add checkbox for enable/disable experimental Thread Controller * shared.py: - In some cases need headphone volume control if exists [ Mario Izquierdo (mariodebian) ] * tcosmonitor.glade shared.py TcosConf.py TcosPreferences.py - Create new tab on preferences window to show/hide menus - Reload menus when preferences are saved. * tcosmonitor.py - Disable menu creation on start, build it in TcosPreferences * ping.py - Catch wait() exception * TcosXmlRpc.py - Comment IsLive function (seem to be not used, mark as removable) * po/tcosmonitor.pot po/es.po - Update translations -- Mario Izquierdo (mariodebian) Fri, 04 Apr 2008 20:14:00 +0200 tcosmonitor (0.2.9) unstable; urgency=low * TcosActions.py - Improve control of actions for thin clients and standalones * Update translations -- Ignacio Vidal Wed, 19 Mar 2008 17:42:46 +0100 tcosmonitor (0.2.8) unstable; urgency=low [ Ignacio Vidal ] * TcosActions.py - Update video broadcast for thin clients multitask, now scan a valid ip for broadcast - Add http send video/audio to support distributions with ffmpeg codecs-less - Fix audio problem for video broadcast * shared.py TcosPreferences.py - Change initializations * Update translations [ Mario Izquierdo (mariodebian) ] * shared.py - Show progressbutton only if exists * LocalData.py - Exec write_into_statusbar only if exists -- Mario Izquierdo (mariodebian) Sun, 16 Mar 2008 12:32:00 +0100 tcosmonitor (0.2.7.1) unstable; urgency=low * LocalData.py - Fix GetLast, in Debian etch or old versions need to compare with hostname too -- Mario Izquierdo (mariodebian) Thu, 6 Mar 2008 18:45:04 +0100 tcosmonitor (0.2.7) unstable; urgency=low [ Mario Izquierdo (mariodebian) ] * LocalData.py debian/control tcos-last: - Use python-utmp to search username and time logged instead of last * LocalData.py tcos-last - Add pid to dictionary and copy code to last-tcos to not use external modules (work without DISPLAY) * Move tcos-last to tcos-core package * LocalData.py WakeOnLan.py ping.py TcosActions.py - Add error checking in WakeOnLan and show error in TcosActions - Use absoulte module name in WakeOnLan - Write message in statusbar to show while scanning of xmlrpc port [ Ignacio Vidal ] * TcosActions.py TcosPreferences.py - Activate always static host list [ Mario Izquierdo (mariodebian) ] * LocalData.py - Fix time diff in GetLast() -- Mario Izquierdo (mariodebian) Wed, 05 Mar 2008 11:54:13 +0100 tcosmonitor (0.2.6) unstable; urgency=low [ Mario Izquierdo (mariodebian) ] * TcosActions.py - Fix freeze bug - Fix double call to common.thread_enter() [ Ignacio Vidal ] * TcosActions.py - Fix actions poweroff, reboot and poweroff with timeout - In video difussion unmute,restore volume audio and fix keyboard and mouse lock - In actions demo mode and video broadcast deactivate screensaver - Add option to boot clients with wake on lan (pre added by mariodebian in initramfs-tools-tcos) * TcosXmlRpc.py - Define vlc method * shared.py - Add menu item wake on lan * Update translations * debian/control - Add etherwake depend [ Mario Izquierdo (mariodebian) ] * Remove etherwake depend and add WakeOnLan.py (with python is very simple to create magic broadcast package) * tcosmonitor.py Initialize.py tcosmonitor.glade - Enable again searchtxt and searchbutton * Initialize.py tcosmonitor.glade - Delete about dialog and create new dialog (KDE like) - Delete Donations window and button (now donate is on abouttcos dialog) * Update tcos-logo.png (add tcosproject text) -- Mario Izquierdo (mariodebian) Sat, 23 Feb 2008 12:56:12 +0100 tcosmonitor (0.2.5) unstable; urgency=low * TcosActions.py ping.py TcosXmlRpc.py tcosmonitor.py TcosCommon.py LocalData.py - Change gtk.gdk.threads_* calls to self.main.common.threads_* With this we can search for parallel calls to threads locks * Initialize.py tcosmonitor.glade - Delete search box and button and add donate window * Update translations -- Mario Izquierdo (mariodebian) Sun, 17 Feb 2008 19:00:32 +0100 tcosmonitor (0.2.4) unstable; urgency=low [ Ignacio Vidal ] * tcos-devices-ng.py - Update support cdrom usb - Add support for Firewire external disks - Fix dont try to mount swap or extended partitions in usb/firewire disks [ Mario Izquierdo (mariodebian) ] * server-utils/tcos-server-utils.py: - Import TcosCommon module (thanks pelox for bug report) -- Mario Izquierdo (mariodebian) Thu, 14 Feb 2008 16:43:04 +0100 tcosmonitor (0.2.3) unstable; urgency=low * ping.py README.standalone TcosXmlRpc.py tcosmonitor.glade shared.py LocalData.py po/tcosmonitor.pot po/es.po - Change XMLRPC port from 8080 to 8998 * debian/control - Conflicts with initramfs-tools-tcos <= 0.88.14.10 -- Mario Izquierdo (mariodebian) Mon, 11 Feb 2008 12:09:49 +0100 tcosmonitor (0.2.2) unstable; urgency=low * TcosActions.py - Change screenshot type to jpg (less filesize) -- Mario Izquierdo (mariodebian) Sat, 09 Feb 2008 13:05:45 +0100 tcosmonitor (0.2.1) unstable; urgency=low [ Mario Izquierdo (mariodebian) ] * New in 0.2 version: - Don't call newhost and PingPort with same IP address many times - Call reboot and poweroff with configurable timeout - Move common functions to TcosCommon - Remove old tcos-devices - Move Preferences code to TcosPreferences class * Check GetVersion() instead of connected while discovering tcos clients * hidden_network_ifaces array with hidden ifaces * fix typo self.main.xmlrpc.Getversion => self.main.xmlrpc.GetVersion * TcosXauth.py: - Use IP address instead of hostname * tcos-devices-ng.py (Not mount twice BUG): - When usb add event only mount_remote - When usb mount event mount local - In USB menus add key FORCE_MOUNT to call mounter_remote without add event - Move mounting notification to mounter_remote * Update translations (notifications) * TcosXmlRpc.py - Add a semaphore function (wait) to not allow concurrent GetDevicesInfo connections * tcos-devices-ng.py - Fix some functions to allow usb disk with part > 1 * tcos-devices-ng.py - Fix umount USB devices, one by one. * TcosActions.py - Add vlc audio codec - Add ssh remote username - Update translations [ Ignacio Vidal ] * TcosActions.py - Complete support vlc audio codec * tcos-devices-ng.py - Add support for external devices CDROM-USB [ Mario Izquierdo (mariodebian) ] * tcosmonitor.glade: - Convert invisible_chars to * (dapper don't support big dots) -- Mario Izquierdo (mariodebian) Wed, 06 Feb 2008 13:35:29 +0100 tcosmonitor (0.2.0~rc1.2) unstable; urgency=low [ Ignacio Vidal ] * TcosActions.py: - Update methods poweroff and reboot with messages and timeout in clients - Add in preferences timeout for actions - Avoid use dangeorous commands like rm, cp or mv in exec app - Send multicast in video difussion only to network interface configured in preferences - Video difusion allow lock keyboard and mouse in clients - Update some translations * TcosXmlRpc.py: - Add lock keyboard and mouse * shared.py: - Define time in seg for timeout in actions * TcosPreferences.py: - Define new vars [ Mario Izquierdo (mariodebian) ] * Merge tags/tcosmonitor-0.2.0~rc1 translations and templates * Fix Makefile target po_files (add glade files) -- Mario Izquierdo (mariodebian) Wed, 26 Dec 2007 11:54:25 +0100 tcosmonitor (0.2.0~rc1.1) unstable; urgency=low * TcosXauth.py - Load TcosCommon in __init__ (not break tcospersonalize.py) -- Mario Izquierdo (mariodebian) Wed, 19 Dec 2007 20:24:36 +0100 tcosmonitor (0.2.0~rc1) unstable; urgency=low * tcos-devices-ng.py - Use self.host (fix typo) * TcosActions.py - Fix stupid typos self.main.main => self.main * Add TcosPAM.py TcosMonitorDaemon.py classes -- Mario Izquierdo (mariodebian) Wed, 19 Dec 2007 09:17:45 +0100 tcosmonitor (0.2.0~rc0) unstable; urgency=low * ########################################################### * # This is a EXPERIMENTAL RELEASE !!! use at your own risk # * ########################################################### * New way of menus, methods and classes, mayor rewrite of some of old classes * Remove old tcos-devices (tcos-devices-ng is very better) * New classes TcosCommon.py TcosPreferences.py * Move some TcosActions code to TcosCommon * Lost of undocumented changes (I will document next days) * Initial extensions support (not work yet) * TcosPreferences.py: - Call Setvar in TcosConf class * tcosmonitor.py: - delete subprocess import * tcos-devices-ng.py -- Mario Izquierdo (mariodebian) Wed, 19 Dec 2007 09:16:23 +0100 tcosmonitor (0.1.25.7) unstable; urgency=low * tcos-devices-ng.py: - Check for output of mounter_local and show error if can't mount * tcos-volume-manager.glade: - Set height to 300px -- Mario Izquierdo (mariodebian) Sun, 16 Dec 2007 16:09:49 +0100 tcosmonitor (0.1.25.6) unstable; urgency=low [ Ignacio Vidal ] * tcos-devices-ng.py: - Fix typos [ Mario Izquierdo (mariodebian) ] * TcosDBus.py: - Use IP address instead of hostname in tcos-dbus-client standalone mode -- Mario Izquierdo (mariodebian) Wed, 12 Dec 2007 16:34:18 +0100 tcosmonitor (0.1.25.5) unstable; urgency=low * tcos-devices-ng.py: - Umount ltspfs by userid or username -- Mario Izquierdo (mariodebian) Sun, 09 Dec 2007 16:12:03 +0100 tcosmonitor (0.1.25.4) unstable; urgency=low * TcosActions.py: - Fix minor typos * po/es.po: - Fix translations -- Ignacio Vidal Fri, 7 Dec 2007 14:56:46 +0100 tcosmonitor (0.1.25.3) unstable; urgency=low * LocalData.py: - Use last|grep still to get connected users for thin clients * TcosXmlRpc.py: - Fix debug info * po/tcosmonitor.po po/es.po: - Update translations and template -- Mario Izquierdo (mariodebian) Wed, 05 Dec 2007 16:37:17 +0100 tcosmonitor (0.1.25.2) unstable; urgency=low * Patches by Ignacio Vidal * shared.py - Update icons * TcosActions.py - Replace popen2.Popen3 with modern subprocess.Popen in some actions and redefined execution commands to obtain real pid of process - In some cases need SIGKILL to kill vnc or vlc processes that not want to die - Var newallclients pass as arg allclients in progressbox, in demo mode or video, only contain users for this action - On click progressbox button for demo mode and video broadcast only kill processes in clients associated to this action and not in users logged after or not in selected hosts - Kill actions by pid in server, not need killall in each action and permits silmutaneous modes - Fix add_progressbox button, stock "gtk-cancel" override our configuration, only show in label button Cancel, not our string "Stop" and icon personalized - Add support in demo mode from not teacher host for selectedhosts - Update some progressbox messages - Add checks like is user logged or app running in some actions - Show user and host in some messages instad only ip * TcosActions.py VNC: - Wait thin client close x11vnc. -- Mario Izquierdo (mariodebian) Wed, 05 Dec 2007 00:15:55 +0100 tcosmonitor (0.1.25.1) unstable; urgency=low * tcos-devices.py tcos-devices-ng.py: - Read ~/Desktop dir with rsync-controller (support translated xdg-user-dirs) * TcosActions.py Initialize.py tcosmonitor.glade: - Make one stop button and label for every action, now is posible to run more than one action and can stop it. - Kill PID, if posible, if not, use killall - Remove rsync code, now code go to initramfs-tools-tcos/bin/rsync-controller -- Mario Izquierdo (mariodebian) Sun, 02 Dec 2007 11:12:49 +0100 tcosmonitor (0.1.24.14) unstable; urgency=low * In selected hosts if not select all try to continue and no return * Not change image logged instead image blocked in lockscreen -- Ignacio Vidal Fri, 30 Nov 2007 10:28:05 +0100 tcosmonitor (0.1.24.13) unstable; urgency=low * TcosActions.py Initialize.py tcosmonitor.glade: - Fix new label location in glade and not show in send messages -- Ignacio Vidal Mon, 26 Nov 2007 13:24:28 +0100 tcosmonitor (0.1.24.12) unstable; urgency=low * TcosActions.py - Fix again unicast * tcosmonitor.glade: - Add label with info about new drag and drop * Update spanish translation and template -- Mario Izquierdo (mariodebian) Sun, 25 Nov 2007 22:15:37 +0100 tcosmonitor (0.1.24.11) unstable; urgency=low [ vidal ] * TcosActions.py: - Fix unicast diffusion not work in thin client - Add scape special characters in video and send files - Add preserve existing files and more timeout in send files actions [ Mario Izquierdo (mariodebian) ] * TcosActions.py Initialize.py tcosmonitor.glade: - Add drag and drop support (patch by vidal, thanks) - Fix again vlc commands * Update spanish translations and template * TcosActions.py: - If no selected clients ask for select all * Initialize.py: - Remove activatable column (ugly warnings) -- Mario Izquierdo (mariodebian) Sat, 24 Nov 2007 12:14:27 +0100 tcosmonitor (0.1.24.10) unstable; urgency=low * dbus/81tcos-utils: - Remove session-script (launched from /etc/xdg/autostart) -- Mario Izquierdo (mariodebian) Mon, 19 Nov 2007 23:09:58 +0100 tcosmonitor (0.1.24.9) unstable; urgency=low * TcosActions.py: - Fix send files with special character in filenames - Change multicast to unicast in video difussion menu one, dont need saturate network with multicast to one client and enables multistreaming difussion. - Not work correctly send video or files in standalone -- Ignacio Vidal Mon, 19 Nov 2007 14:59:54 +0100 tcosmonitor (0.1.24.8) unstable; urgency=low * TcosActions.py: - Use new session-cmd tool to logout users thanks to vidal and Lliurex team). * TcosActions.py Initialize.py shared.py TcosConf.py tcosmonitor.glade: - Add new opcion (make actions only on selected hosts) - New column with a checkbox called: Sel * Update template and spanish translation with new strings * dbus/81tcos-utils: - Add session-cmd stsrt script -- Mario Izquierdo (mariodebian) Sat, 17 Nov 2007 19:19:17 +0100 tcosmonitor (0.1.24.7) unstable; urgency=low * TcosActions.py Initialize.py - Fix some problems with vnc startserver (thanks to vidal for testing and patch) - Remove stop_vnc and stop_broadcast functions, now use on_progressstop_click and 2 global vars -- Mario Izquierdo (mariodebian) Wed, 07 Nov 2007 15:55:14 +0100 tcosmonitor (0.1.24.6) unstable; urgency=low * shared.py, images/* - Add icons to vidal menus -- Mario Izquierdo (mariodebian) Tue, 06 Nov 2007 23:21:44 +0100 tcosmonitor (0.1.24.5) unstable; urgency=low * Patch send by vidal_joshur at gva dot es - Remove Stop broadcast menu, use new progress button and text - Options to play DVD, SVCD, VCD or AudioCD in broadcast * Update spanish translation (new strings) -- Mario Izquierdo (mariodebian) Fri, 02 Nov 2007 18:31:13 +0100 tcosmonitor (0.1.24.4) unstable; urgency=low * ping.py LocalData.py - Make sure don't show hosts with 8080 port open and not tcosxmlrpc * TcosActions.py - Get server IP in every vnc hosts call (different networks) * TcosActions.py Initialize.py tcosmonitor.glade - Move progressstop (and create progresstext) to new bottom bar -- Mario Izquierdo (mariodebian) Fri, 02 Nov 2007 16:55:13 +0100 tcosmonitor (0.1.24.3) unstable; urgency=low * TcosActions.py shared.py Initialize.py tcosmonitor.glade: - Remove stop demo mode, add progress stop button - New individual action Demo mode from thin client / standalone host * TcosActions.py - Modify to use new tcos vnc-controller * LocalData.py: - Change GetTimeLogged with new last command * TcosXmlRpc.py: - Fix new tcos.vnc calls to correct number of arguments -- Mario Izquierdo (mariodebian) Thu, 01 Nov 2007 19:07:53 +0100 tcosmonitor (0.1.24.2) unstable; urgency=low * Fix get_time in standalone and thin client mode (who => last) -- Mario Izquierdo (mariodebian) Mon, 29 Oct 2007 09:36:17 +0100 tcosmonitor (0.1.24.1) unstable; urgency=low * tcosmonitor.py, tcospersonalize.py, tcos-devices.py, tcos-volume-manager.py - Rename exit function salirse -> quitapp * tcosmonitor.py: - Create and delete /tmp/tcos_share * TcosActions.py: - Make vnc (server and client) to use random password - Use new method tcos.xmlrpc.vnc and a wrapper vnc-controller.sh * TcosStaticHosts.py: - Support new scan method (static list) * Option to not show host not running tcosxmlrpc (port 8080) -- Mario Izquierdo (mariodebian) Sat, 27 Oct 2007 23:29:21 +0200 tcosmonitor (0.1.23.5) unstable; urgency=low * tcos-devices-ng.py: - Use DEVPATH instead of DEVNAME in cdrom mount/umount events -- Mario Izquierdo (mariodebian) Thu, 11 Oct 2007 10:35:14 +0200 tcosmonitor (0.1.23.4) unstable; urgency=low * Fix typo dependency notification-daemon * Enable tcos-devices-ng by default -- Mario Izquierdo (mariodebian) Sun, 07 Oct 2007 10:41:12 +0200 tcosmonitor (0.1.23.3) unstable; urgency=low * TcosActions.py: - Init xmlrpc connection before getStandalone() * tcos-devices-ng*: - Allow to configure options for all users, new file: /etc/tcos/tcos-devices-ng.conf - Update man page. -- Mario Izquierdo (mariodebian) Sat, 06 Oct 2007 20:29:02 +0200 tcosmonitor (0.1.23.2) unstable; urgency=low * Move dbus/tcosmonitor.conf to initramfs-tools-tcos package * Make lintian clean: - Fix typos in man pages - Add tcos-server-utils man page - *desktop remove Encoding line and fix Category in tcosmonitor - Move python && python-support to Build-Depends-Indep -- Mario Izquierdo (mariodebian) Mon, 24 Sep 2007 13:39:31 +0200 tcosmonitor (0.1.23.1) unstable; urgency=low * Important move of code: - Move xmlrpc code to initramfs-tools-tcos - Move lockscreen to initramfs-tools-tcos - Move udev to initramfs-tools-tcos - Move hooks-addons to initramfs-tools-tcos * Change tcosmonitor package arquitecture to all instead of any * Remove obsolete code (httpd, and busybox) * tcospersonalize.py: - Allow to edit XhorizSync and XVertSync (put disable and configurexorg will coment code) * TcosActions.py: - Import socket module * Adjust depends and build-depends with only python package * Change Architecture from any to all (not bins). -- Mario Izquierdo (mariodebian) Fri, 21 Sep 2007 23:11:27 +0200 tcosmonitor (0.1.22.3) unstable; urgency=low * xmlrpc/exe.c: - Don't use get_full_path if command start with / - Fix bug in get_full_path (remove snprintf BSIZE) * TcosActions.py: - Make escape spaces work with 2 or more files -- Mario Izquierdo (mariodebian) Thu, 20 Sep 2007 14:58:27 +0200 tcosmonitor (0.1.22.2) unstable; urgency=low * TcosActions.py: - Escape spaces in rsync commands * xmlrpc/*.[ch] - Change strcpy => strncpy or sprintf => snprintf * xmlrpc/validate-tcos.c: - Initialize and get mem in struct info *login and free when unused. * xmlrpc/Makefile: - Compiles with -O2 flags -- Mario Izquierdo (mariodebian) Wed, 19 Sep 2007 22:55:32 +0200 tcosmonitor (0.1.22.1.0) unstable; urgency=low * xmlrpc/validate* - Compile validate-tcos as standalone app -- Mario Izquierdo (mariodebian) Wed, 19 Sep 2007 12:13:58 +0200 tcosmonitor (0.1.22.1) unstable; urgency=low * TcosXmlrpc.py, TcosXauth.py: - Encapsulate self.tc.tcos into try...except to avoid problems with host with 8080 port listening * ping.py: - Encapsulate get_server_ips with try...except to avoid problems with ifaces not configured. * TcosActions.py: - Fixed important bug, exec dbus apps number_of_clients^2 times :( - Fix minor typos in vidal_joshur code -- Mario Izquierdo (mariodebian) Fri, 14 Sep 2007 19:57:45 +0200 tcosmonitor (0.1.21.5) unstable; urgency=low * Added option for no exec dangerous actions if TcosMonitor run in a thin client DISPLAY (Closes: #4) * Update spanish translation * Fix no space in rsync command (patch by vidal_joshur at gva dot es) -- Mario Izquierdo (mariodebian) Tue, 11 Sep 2007 21:14:23 +0200 tcosmonitor (0.1.21.4) unstable; urgency=low * tcosmonitor.glade AUTHORS: - Add contributors info -- Mario Izquierdo (mariodebian) Fri, 07 Sep 2007 11:56:02 +0200 tcosmonitor (0.1.21.3) unstable; urgency=low * ping.py: - Add get_server_ips method to not ping server ips * TcosActions.py shared.py: - Add video broadcast and send files to onehost_menu (patched by vidal_joshur at gva dot es) * udev/tcos-udevd.sh: - no generate events in /dev/loop or /dev/ram devices -- Mario Izquierdo (mariodebian) Thu, 06 Sep 2007 15:43:53 +0200 tcosmonitor (0.1.21.2) unstable; urgency=low * *.py: - Remove wrong copyright line, thanks to Quiron. * xmlrpc/login.c: - Compare with strcmp instead of == -- Mario Izquierdo (mariodebian) Tue, 04 Sep 2007 11:05:01 +0200 tcosmonitor (0.1.21.1) unstable; urgency=low * Fix some call to get_filesystem * udev/listener-daemon.sh udev/mount_listener.c: - propagate kernel mount/umount events not more avalaible in kernel >= 2.6.22 * tcos-devices-ng.py: - Add CD-AUDIO support -- Mario Izquierdo (mariodebian) Sun, 02 Sep 2007 17:56:20 +0200 tcosmonitor (0.1.20.1) unstable; urgency=low * Delete all standalone screenshots on tcos-standalone stop * udev/tcos-udevd.sh: - Call get_filesystem with --only argument * xmlrpc/tcosxmlrpc.c xmlrpc/Makefile: - Update to build with new 1.06 libxmlrpc headers -- Mario Izquierdo (mariodebian) Fri, 24 Aug 2007 17:35:08 +0200 tcosmonitor (0.1.19.1) unstable; urgency=low * Join all packages in one: tcosmonitor * xmlrpc/*: - Add new method: dbus * *.py: - Add dbus support (not work at 100% yet) - Fix some minor bugs * debian/tcos-standalone.init: - Don't fail at stop * README.standalone - Add some standalone info * More changes to support standalone mode * README.rsync: - Add some info to standalone users to make work rsync file tranfers * Many patches of vidal_joshur at gva dot es -- Mario Izquierdo (mariodebian) Tue, 31 Jul 2007 18:13:04 +0200 tcosmonitor (0.1.18.1) unstable; urgency=low * Move dbus conf file and tcos-dbus-client to tcos-tcosmonitor * xmlrpc/lockscreen.c: - Exe lockscreen in PATH -- Mario Izquierdo (mariodebian) Mon, 09 Jul 2007 22:16:25 +0200 tcosmonitor (0.1.18.0) unstable; urgency=low * Remove pyexamples dir * xmlrpc/sh/restartx.sh: - call restartxorg instead of killing X * tcos-devices-ng: - Allot to disable floppy cdroms or hdd from conf file (disable_floppy=1, disable_cdroms=1, disable_hdd=1) * xmlrpc/*: - Add tcos.who method to retrieve username connected at :0 -- Mario Izquierdo (mariodebian) Sat, 07 Jul 2007 13:28:15 +0200 tcosmonitor (0.1.17.2) unstable; urgency=low * xmlrpc/Makefile xmlrpc/var/etc/abyss.conf: - Set correct paths for tcos-standalone and tcos thin client -- Mario Izquierdo (mariodebian) Wed, 27 Jun 2007 23:54:22 +0200 tcosmonitor (0.1.17.1) unstable; urgency=low * New package tcos-standalone (Use tcosmonitor with not standalone hosts) * xmlrpc/*.h: - Add TCOS_PATH define to tcosxmlrpc, to allow running external tools from other paths * xmlrpc/sh/*: - Ad conditions to exec or not some tools. * TcosTrayIcon.py: - Remove StatusIcon declaration (break at gtk < 2.10) * Add support of standalone mode in TcoaActions.py * TcosActions.py: - patch to start/stop video broadcast (vidal_joshur at gva dot es) - patch to send files with rsync (vidal_joshur at gva dot es) -- Mario Izquierdo (mariodebian) Wed, 27 Jun 2007 20:10:18 +0200 tcosmonitor (0.1.16.2) unstable; urgency=low * udev/tcos-udevd.sh: - Force udev to save ID_FS_TYPE in disk, not only partitions -- Mario Izquierdo (mariodebian) Wed, 20 Jun 2007 21:18:12 +0200 tcosmonitor (0.1.16.1) unstable; urgency=low * xmlrpc/sh/devicesctl.sh: - Add support to mount NTFS with ntfs-3g driver * tcos-devices-ng.py: - Mount ntfs-3g in a thread (fuse mounts exec a process) * TcosXmlRpc.py: - Don't fail in GetDevicesInfo (use try--except) -- Mario Izquierdo (mariodebian) Wed, 20 Jun 2007 15:14:16 +0200 tcosmonitor (0.1.16) unstable; urgency=low * xmlrpc/sh/devicesctl.sh: - Fix typo in include header * images/*cdrom* - new image based on gnome theme * tcos-devices-ng.py: - Fix translation strings (vars go outside _('%s')%var ) - Add umount_all function called from exit - Fix USB device remount - Allow to specify mounts points with a new conf file ~/.tcos-devices-ng.conf * Add new man page: man/tcos-devices-ng.1 -- Mario Izquierdo (mariodebian) Tue, 19 Jun 2007 18:34:18 +0200 tcosmonitor (0.1.15.5) unstable; urgency=low * xmlrpc/sh/devicesctl.sh: - Option gethdd now returns all type disk except swap or iso9660 -- Mario Izquierdo (mariodebian) Tue, 19 Jun 2007 12:40:51 +0200 tcosmonitor (0.1.15.4) unstable; urgency=low * xmlrpc/sh/devicesctl.sh: - Add --gethdd param and return ext3 or vfat devices in /etc/fstab * tcos-devices-ng.py: - Read hdd device partitions in thin client and put in menu * images/hdd_*mount.png: - Add hdd icons * po/*: - Update translations (new hdd strings) -- Mario Izquierdo (mariodebian) Mon, 18 Jun 2007 18:52:00 +0200 tcosmonitor (0.1.15.3) unstable; urgency=low * lockscreen/* : - Change copyright header - Compile with imlib-config flags and libs * dbus/81tcos-utils: - Start tcos-devices --daemon and tcos-devices --hidden * tcos-devices-ng.py: - Don't use shared vars before importing module shared -- Mario Izquierdo (mariodebian) Mon, 18 Jun 2007 11:06:10 +0200 tcosmonitor (0.1.15.2) unstable; urgency=low * conf/tcos.conf man/* : - fix some english typos (close ticket #3) thanks to Andres Jimenez again * lockscreen/*: - Add support to put a png/jpg, xpm, etc... image in lockscreen - Default image locked.png * tcos-devices-ng.py: - Clean code and remote extra comments * pyexamples: - Add some python examples -- Mario Izquierdo (mariodebian) Sun, 17 Jun 2007 17:01:00 +0200 tcosmonitor (0.1.15.1) unstable; urgency=low * shared.py: - Remove some ugly debug info * xmlrpc/sh/devicesctl.sh: - Add --exists parameter to know if a file (or device) exists * xmlrpc/sh/soundctl.sh: - Exis if not soundcard found * xmlrpc/xauth.c: - Compare local hostname with cookie hostname. * tcos-devices.py: - Exit if X cookie don't match * images/*: - Add some tcos-devices-ng.py images * TcosTrayIcon.py: - New Tcos class (used to build systray menu) * tcos-devices-ng.py: - New and more powerfull remote device manager * Rename dbus/81tcos-dbus-client to dbus/81tcos-utils and start tcos-devices from there * po/*: - Update spanish translation -- Mario Izquierdo (mariodebian) Thu, 14 Jun 2007 21:15:15 +0200 tcosmonitor (0.1.14.4) unstable; urgency=low * TcosXauth.py: - Read DISPLAY info and search for hostname and IP address -- Mario Izquierdo (mariodebian) Sat, 9 Jun 2007 19:33:04 +0200 tcosmonitor (0.1.14.3) unstable; urgency=low * tcos-devices.py, tcos-volume-manager.py: - If gtk version is greater than 2.10 use gtk.statusicon instead of egg.trayicon -- Mario Izquierdo (mariodebian) Sat, 09 Jun 2007 17:11:33 +0200 tcosmonitor (0.1.14.2) unstable; urgency=low * TcosXauth.py: - Read xauth cookie with -n param to not resolve hostname - Try (with try: except: to get hostname with socket) not xauth locks -- Mario Izquierdo (mariodebian) Fri, 08 Jun 2007 22:15:23 +0200 tcosmonitor (0.1.14.1) unstable; urgency=low * Initialize.py: - Fix AboutDialog, close and destry button for gtk > 2.10 * Change default Homepage to http://www.tcosproject.org * Remove some old packages info in debian/* * Fix some package info -- Mario Izquierdo (mariodebian) Mon, 04 Jun 2007 11:56:56 +0200 tcosmonitor (0.1.14) unstable; urgency=low * Makefile: - Patch ubuntu feisty tcos-devices.py to use python2.5 * tcos-volume-manager.py tcos-devices.py: - Add support for close clicking on systray. -- Mario Izquierdo (mariodebian) Sat, 02 Jun 2007 20:26:52 +0200 tcosmonitor (0.1.13) unstable; urgency=low * TcosXauth.py: - If DISPLAY is local not get hostname * Makefile shared.py: - Generate version from Makefile precompile patch -- Mario Izquierdo (mariodebian) Fri, 01 Jun 2007 21:00:52 +0200 tcosmonitor (0.1.12) unstable; urgency=low * TcosXauth.py: - Read cookie based on DISPLAY (hostname or IP address) -- Mario Izquierdo (mariodebian) Fri, 01 Jun 2007 16:44:53 +0200 tcosmonitor (0.1.11) unstable; urgency=low * LocalData.py: - Fix GetUsername search function (using IP add : not space) * TcosActions.py: - get vncviewer version to use diferent arguments * TcosDBus.py: - Parse dbus.String to str before calling tcosxmlrpc * debian/control: - Add python2.4-dbus alternative to python-dbus (for Ubuntu dapper) -- Mario Izquierdo (mariodebian) Fri, 01 Jun 2007 12:34:55 +0200 tcosmonitor (0.1.10) unstable; urgency=low * Remove gentcos depends -- Mario Izquierdo (mariodebian) Thu, 31 May 2007 17:17:54 +0200 tcosmonitor (0.1.9) unstable; urgency=low * xmlrpc/sh/soundctl.sh: - Remove FORCE of aumix and OSS, use amixer if available - Make a more robust and better script * hooks-addons/tcosmonitor: - Move start scripts from 15,16 to 45,46 (startx before) -- Mario Izquierdo (mariodebian) Sat, 26 May 2007 18:36:19 +0200 tcosmonitor (0.1.8) unstable; urgency=low * dbus/tcos-dbus-client.py: - Add getopt support (enable exec with debug info) -- Mario Izquierdo (mariodebian) Sun, 08 Apr 2007 23:07:02 +0200 tcosmonitor (0.1.7) unstable; urgency=low * Change username method (use pwd class) -- Mario Izquierdo (mariodebian) Tue, 03 Apr 2007 14:54:06 +0200 tcosmonitor (0.1.6) unstable; urgency=low * Add some man pages trying to make a lintian clean package. * Add tcos.conf to sources to not dependes on initramfs-tools-tcos -- Mario Izquierdo (mariodebian) Sun, 11 Mar 2007 19:04:29 +0100 tcosmonitor (0.1.5) unstable; urgency=low * LocalData.py: - Fix some sort functions params -- Mario Izquierdo (mariodebian) Wed, 7 Mar 2007 23:41:54 +0100 tcosmonitor (0.1.4) unstable; urgency=low * LocalData.py: - Sort alphanumeric hostnames -- Mario Izquierdo (mariodebian) Tue, 6 Mar 2007 11:12:20 +0100 tcosmonitor (0.1.3) unstable; urgency=low * xmlrpc/sh/soundctl.sh: - make compatible with aumix and amixer (OSS compability) * shared.py: - add OSS sound channel names into sound_only_channels list * LocalData.py: - use socket.gethostbyaddr('xx.xx.xx.xx') to retrieve hostname before searching in /etc/hosts or /etc/dhcp3/dhcpd.conf -- Mario Izquierdo (mariodebian) Sat, 3 Mar 2007 16:13:48 +0100 tcosmonitor (0.1.2) unstable; urgency=low * TcosXmlrpc.py: - minimize socket timeout (2 secs) when connecting in newhost function * shared.py: - Add rDesktop protocol in TcosPersonalize -- Mario Izquierdo (mariodebian) Sun, 25 Feb 2007 22:19:05 +0100 tcosmonitor (0.1.1) unstable; urgency=low * xmlrpc/sh/update-tcospasswd.sh (bashism) - Change /bin/sh to /bin/bash and remove == -- Mario Izquierdo (mariodebian) Sat, 24 Feb 2007 10:35:15 +0100 tcosmonitor (0.1.0) unstable; urgency=low * Not build LTSP or PXES packages anymore (not clean, not debian) * Not get busybox-static * Use python-support to bytecompile packages * Update debhelper Build-dep * Move TcosMonitor desktop icon to Admin menu * Hide tcospersonalize menu * Not ignore debhelper in tcos-tcosmonitor.postinst * Change tcospersonalize config dir to new /var/lib/tcos/tftp/config -- Mario Izquierdo (mariodebian) Sun, 18 Feb 2007 13:36:53 +0100 tcosmonitor (0.0.19.1) unstable; urgency=low * xmlrpc/*: - Change #ifdef DEBUG for a new function dbgtcos(); read TCOS_DEBUG env var -- Mario Izquierdo (mariodebian) Thu, 8 Feb 2007 18:33:04 +0100 tcosmonitor (0.0.18.2) unstable; urgency=low * Downgrade initramfs-tools-tcos dependencies to >= 0.59 tcosmonitor must be installed before initramfs-tools-tcos 0.60 -- Mario Izquierdo (mariodebian) Sun, 4 Feb 2007 22:04:25 +0100 tcosmonitor (0.0.18.1) unstable; urgency=low * hooks-addons/tcosmonitor: - remove copy od seq (fixed in initramfs-tools-tcos 0.60) * debian/control: - update version depends * Remove hex2ascii bin => initramfs-tools-tcos -- Mario Izquierdo (mariodebian) Sat, 3 Feb 2007 20:39:01 +0100 tcosmonitor (0.0.17.1) unstable; urgency=low * xmlrpc/*.c: - Remove tcosxmlrpc verbose messages * debian/control, hooks-addons/tcosmonitor: - Add /usr/bin/eject and eject cdrom from TcosDevices (daemon) * tcos-devices.py: - Remove sys.exit(1) from tcos-devices (retry cookie don't match) * xmlrpc/sh/devicesctl.sh - Add --eject method -- Mario Izquierdo (mariodebian) Mon, 29 Jan 2007 16:13:43 +0100 tcosmonitor (0.0.16.2) unstable; urgency=low * Change /bin/sh to /bin/bash (solve ubuntu dash problems) -- Mario Izquierdo (mariodebian) Mon, 29 Jan 2007 16:02:30 +0100 tcosmonitor (0.0.16.1) unstable; urgency=low * New stable release. * Add vertical label in all screenshots. * Add uptime var (readed in TCOS general info) * Change preferences minicrot_size default (20) and step (1) * Change version string in shared.py (in future read from debian/changelog when building package) * Fix typo in tcos-server-utils.py -- Mario Izquierdo (mariodebian) Tue, 26 Dec 2006 23:35:11 +0100 tcosmonitor (0.0.15.14) unstable; urgency=low * Add New toolbar button (All Hosts) that show all_actions_menu * Add new global action: "Capture all hosts screenshots" * New Preferences var: miniscrot_size (default 15%) * tcos-volume-manager: - add refresh button to reload all sliders values. -- Mario Izquierdo (mariodebian) Sat, 23 Dec 2006 21:10:31 +0100 tcosmonitor (0.0.15.13) unstable; urgency=low * Fix typo on on_another_screenshot() Worker => Workers -- Mario Izquierdo (mariodebian) Mon, 11 Dec 2006 16:12:48 +0100 tcosmonitor (0.0.15.12) unstable; urgency=low * Add set_sensitive() to TreeView before/after updating list or connecting to thin client. * Fix app/msg dialog, print hostname/username in new lines. -- Mario Izquierdo (mariodebian) Mon, 4 Dec 2006 09:46:20 +0100 tcosmonitor (0.0.15.11) unstable; urgency=low * Fix LocalData.py who |grep "%s " (add space after %s) -- Mario Izquierdo (mariodebian) Wed, 29 Nov 2006 19:07:45 +0100 tcosmonitor (0.0.15.10) unstable; urgency=low * Put 1d if hours connected < 0 (connected yesterday) -- Mario Izquierdo (mariodebian) Wed, 29 Nov 2006 18:46:20 +0100 tcosmonitor (0.0.15.9) unstable; urgency=low * Fix minor problem in import headers in shared.py file. * Fix version retrieve error (disable split in mayor, med and minor) * Update web and translation. -- Mario Izquierdo (mariodebian) Tue, 28 Nov 2006 21:36:10 +0100 tcosmonitor (0.0.15.8) unstable; urgency=low * xmlrpc/Makefile -DVERSION=\"fooo\" not use "'foo'" * LocalData.py Add print_debug in version get * shared.py Add some hidden process to list ( xauth, tcos-devices, tcos-volume-manager, notification-daemon, bash ) -- Mario Izquierdo (mariodebian) Sun, 19 Nov 2006 20:14:59 +0100 tcosmonitor (0.0.15.7) unstable; urgency=low * allow to enable/disable tcos-devices and tcos-volume-manager from a new conf file: /etc/tcos/tcosmonitor.conf in runtime. -- Mario Izquierdo (mariodebian) Wed, 8 Nov 2006 13:11:41 +0100 tcosmonitor (0.0.15.6) unstable; urgency=low * tcos-volume-manager.py, tcos-volume-manager.glade, tcos-volume-manager.desktop - iconize in systray tcos-volume-manager - new systray icon for tcos-volume-manager - add xdg/autostart tcos-volume-manager (desktop file) - exit if xauth dont match - mainwindow hide by default in glade file -- Mario Izquierdo (mariodebian) Sat, 28 Oct 2006 15:38:06 +0200 tcosmonitor (0.0.15.5) unstable; urgency=low * tcos-devices.py - fix get_value(), DEVICE is not a udev var, varname is DEVNAME - fix get_local_mountpoint() fslabel and fsvendor -- Mario Izquierdo (mariodebian) Sat, 28 Oct 2006 11:54:13 +0200 tcosmonitor (0.0.15.4) unstable; urgency=low * tcos-devices.py, udev/tcos-udevd.sh , udev/050_tcos_devices.rules - Change udev to control all SUBSYSTEM=="block" events - Delete duplicate events, kernel do 4 umount and 1 mount event for mounting a floppy -- Mario Izquierdo (mariodebian) Wed, 25 Oct 2006 17:24:14 +0200 tcosmonitor (0.0.15.3) unstable; urgency=low * TcosPersonalize: run as root only * TcosActions: fix update info bug * TcosXmlRpc, TcosXauth, TcosConf, ping: import gtk modules if env var DISPLAY is set -- Mario Izquierdo (mariodebian) Fri, 13 Oct 2006 00:09:47 +0200 tcosmonitor (0.0.15.2) unstable; urgency=low * Stable release. -- Mario Izquierdo (mariodebian) Sun, 8 Oct 2006 20:16:03 +0200 tcosmonitor (0.0.15.1) unstable; urgency=low * Fix empty password freeze bug. * Add tcos-server-utils python script to make some admin tags (reboot, poweroff, restartx) in all connected TCOS clients. -- Mario Izquierdo (mariodebian) Sun, 8 Oct 2006 10:59:52 +0200 tcosmonitor (0.0.15-1) unstable; urgency=low * New stable release. -- Mario Izquierdo (mariodebian) Fri, 6 Oct 2006 09:34:03 +0200 tcosmonitor (0.0.14pre1.7) unstable; urgency=low * Change gtk.threads_*() for gtk.gdk.threads_*() -- Mario Izquierdo (mariodebian) Sun, 1 Oct 2006 22:42:57 +0200 tcosmonitor (0.0.14pre1.6) unstable; urgency=low * Use /usr/lib/tcos to put scripts and bins ==> $TCOS_BINS * tcos-devices.py Don't exist if cookie test error. -- Mario Izquierdo (mariodebian) Thu, 28 Sep 2006 11:12:29 +0200 tcosmonitor (0.0.14pre1.5) unstable; urgency=low * Add Xauth authentication method in tcosxmlrpc and tcos-devices.py tcos-devices send a MIT-MAGIC-COOKIE-1 to tcosxmlrpc in terminal, terminal try to use this temp cookie to self connect to his Xorg, if can't connect don't allow to use remote devices (udev, USB, floppy, cdrom...) * New class TcosXauth, that allows to send cookie to tcosxmlrpc. * Add -lX11 flag to tcosxmlrpc Makefile (now depends on libX11.so) -- Mario Izquierdo (mariodebian) Sun, 24 Sep 2006 21:16:53 +0200 tcosmonitor (0.0.14pre1.4) unstable; urgency=low * tcos-devices.py - allow mount usbdisk with more than one partition (like gnome-volume-manager) - run daemon actions in threads, if crash only crash thread not daemon. - save mounted usb partitions in a dictionary (umount watching at this dictionary) - change notifications term: Device => Partition. * Remove old shell launchers from svn. -- Mario Izquierdo (mariodebian) Sat, 23 Sep 2006 15:00:48 +0200 tcosmonitor (0.0.14pre1.3) unstable; urgency=low * Work in tcospersonalize.py, now it's possible to configure xdriver as auto mode or retrieve a list of avalaible drivers in tcos image with XMLRPC. * Recomended to delete all personalized settings in /tftpboot/tcos/conf/, auto mode works fine. -- Mario Izquierdo (mariodebian) Fri, 22 Sep 2006 11:58:15 +0200 tcosmonitor (0.0.14pre1.2) unstable; urgency=low * Add remote devices support with LTSPFS and FUSE: - tcos-devices --daemon ( scan USB udev events in terminal and mount/umount) - tcos-devices --hidden ( make a systray icon, to show tcos-devices) - tcos-devices ( show floppy and cdrom and allow to mount and umount) * Add xmlrpc/devices.[ch] and tcosxmlrpc method tcos.devices() * Add xmlrpc/sh/devicesctl.sh to allow tcosxmlrpc to work with devices * Change dbus bus name to com.consoltux.TcosMonitor * Add TcosGetDevices() in TcosXmlRpc class. * Add python-notify debian depends -- Mario Izquierdo (mariodebian) Wed, 20 Sep 2006 22:01:41 +0200 tcosmonitor (0.0.14pre1.1) unstable; urgency=low * Split Initialize.py code and add TcosActions with button events and many functions. * Use shared.Workers in many sites to thread friendly and add a watch-dog to it * Minor fixes * Add Demo mode (all users see the teacher screen) -- Mario Izquierdo (mariodebian) Mon, 18 Sep 2006 15:54:49 +0200 tcosmonitor (0.0.12+p1.4) unstable; urgency=low * Add many sound info and actions (XMLRPC mixer included) * Add support for local images, buttons, sliders and checkboxes in HtmlTextView class. * tcosxmlrpc, add sound.[ch] and tcos.sound method with soundctl.sh script. * Add tcos-volume-manager (small gui to change volume and mute levels with XMLRPC) -- Mario Izquierdo (mariodebian) Sat, 16 Sep 2006 23:13:23 +0200 tcosmonitor (0.0.12.3) unstable; urgency=low * Add HtmlTextView class to draw datatxt more easy (html) * Fix Localdata::GetUserName() no need to cache !! * Export some vars in 81tcos-dbus-client based on DISPLAY empty status (for PulseAudio) * Load spanish kbmap in 81tcos-dbus-client (FIXME add new var TCOS_KBMAP and load during start) * Start to clean code (need very much) * Change gtk.main() for gobject.mainloop() -- Mario Izquierdo (mariodebian) Thu, 14 Sep 2006 11:55:03 +0200 tcosmonitor (0.0.12.2) unstable; urgency=low * Reconfigure socket.defaulttimeout just before using it in PinPort class. * Launch tcos-dbus-client from /etc/X11/Xsesssion.d/81tcos-dbus-client * Add more hidden apps to shared.system_process (need KDE related, don't know, because I don't use it) -- Mario Izquierdo (mariodebian) Mon, 11 Sep 2006 13:22:32 +0200 tcosmonitor (0.0.12.1) unstable; urgency=low * Use LC_ALL=C for console commands. * Minor fixes. * Set more socket.defaulttimeout for downloading screenshots. * Minor changes on tcos-dbus-client -- Mario Izquierdo (mariodebian) Sun, 10 Sep 2006 19:13:07 +0200 tcosmonitor (0.0.12) unstable; urgency=low * Make populate_datatxt() python-thread friend * Add a new menu option to show running user processes (in X session not thin client) * Some minor bugs * Change python encoding from UTF8 to UTF-8 * Update translations and fix some _("%s" %var ) ERRORS * Use New class PingPort based on sockets and remove echoping dependency * Know bugs: if call 2 threads at same time (afeter first ends get async errors) * Experimental support with DBUS, based on some ideas and code from student-control-panel from Ubuntu. * Thanks of DBUS, new menu option: Send a text message to user. * More small fixes. * Update pot file (template) and Spanish translation. * Update dependencies (add dbus and python-dbus) * New files (tcos-dbus-client , 81tcos-dbus-client (for X11 startup) and dbus spec) * Remove bash launchers (do a sys.path.append() if necesary) * Add ESTABLISHED option to netstat scan (only running connections, no timeout) * Add GNU/GPL headers at many files (*.py *.h *.c) -- Mario Izquierdo (mariodebian) Sun, 10 Sep 2006 10:58:25 +0200 tcosmonitor (0.0.11.pre2) unstable; urgency=low * Fix a small bug in TcosXmlRpc.py in Exe user, pass params function * Show passwords if tcosxmlrpc is compiled with -DVISIBLE_PASSWD=1 * Add hex2ascci a simple C app to process xx:xx:xx:xx:xx and returns a string -- Mario Izquierdo (mariodebian) Tue, 5 Sep 2006 23:12:21 +0200 tcosmonitor (0.0.11.pre1) unstable; urgency=low * Pre release. -- Mario Izquierdo (mariodebian) Tue, 22 Aug 2006 15:19:17 +0200 tcosmonitor (0.0.10.b5) unstable; urgency=low * Rewrite auth method, new 3 methods avalaible in this order: - /etc/tcospasswd - /etc/shadow - /etc/passwd * New root script: update-tcospasswd to change LTSP, PXES or TCOS user and pass * Fix new discover not found modules in script: xmlrpc/sh/getinfo.sh * Revert kernel default version 2.6.16-1-486 (2.6.16-2-** don't work on my laptop) * Add xmlrcp/sh/useallmodules.sh that download allmodules-$(uname -r).squashfs and mount it to know what modules need the thin client througt tcosmonitor * When read username get only first line (head -1) Localdata.py * Split defines and functions in .h and .c files in xmlrpc/ dir -- Mario Izquierdo (mariodebian) Mon, 21 Aug 2006 17:51:53 +0200 tcosmonitor (0.0.10.b4) unstable; urgency=low * Change echo close | telnet IP PORT ==> echoping -h / IP:PORT 2>&1 (more speed) * Add window icons from python code (glade window icon seem to not work) * Change tcosxmlrpc auth method, use pass/shadow info. * No create temp file for tcosxmlrpc login, send user/pass in every action * Change method to get info (auth classes work with 4 params) -- Mario Izquierdo (mariodebian) Wed, 16 Aug 2006 18:56:39 +0200 tcosmonitor (0.0.10.b3) unstable; urgency=low * Revised Makefiles, split ltsp, pxes and tcos in targets * Make preferences chache_timeout work * Delete Logout user action => Restart Xorg * Search for errors while exec iTALC or X11vnc sessions * Allow tcospersonalize only in TCOS, pxes and LTSP require more work. * Add refresh_client_info after some actions * Add 32x32 icon * Write some info in INSTALL * Clean Treeview if no host * Fix Makefile targz target * Change load /conf/tcos-functions by /conf/tcos-run-functions (initramfs-tools-tcos >= 0.49) -- Mario Izquierdo (mariodebian) Sat, 15 Jul 2006 22:28:47 +0200 tcosmonitor (0.0.10.b2) unstable; urgency=low * Fix ping method, now is very usable * Add a cancel button to progress (stop thread) * Make thread work into shared.Workers class * Add process info in xmlrpc/info.h and xmlrpc/getinfo.sh (need some gui work) * Add all clients actions -- Mario Izquierdo (mariodebian) Sat, 15 Jul 2006 00:08:20 +0200 tcosmonitor (0.0.10.b1) unstable; urgency=low * Add a progressbar during host discovery * Re enable cache * Delete start/stop button * Add code to work searchtxt and searchbutton * Change /bin/start-stop-daemon for /sbin/start-stop-daemon in LTSP and TCOS (PXES is the same bin or sbin) -- Mario Izquierdo (mariodebian) Wed, 12 Jul 2006 23:05:52 +0200 tcosmonitor (0.0.10) unstable; urgency=low * Semi-stable release, work with tcos, pxes and ltsp * Some jobs is do in threads. * Beter gui (with some icons) * Packages: - tcosmonitor (the gui) - tcos-tcosmonitor - pxes-1.0-tcosmonitor - pxes-1.1-tcosmonitor - pxes-1.2-tcosmonitor - ltsp-tcosmonitor -- Mario Izquierdo (mariodebian) Wed, 12 Jul 2006 15:53:12 +0200 tcosmonitor (0.0.9.b6) unstable; urgency=low * Add /etc/busybox.conf (for busybox-static) in LTSP/PXES environment * Fix import os in tcosmonitor.py -- Mario Izquierdo (mariodebian) Mon, 10 Jul 2006 10:21:41 +0200 tcosmonitor (0.0.9.b5) unstable; urgency=low * First initial support of LTSP. * Need busybox static to work on PXES / LTSP ??? -- Mario Izquierdo (mariodebian) Mon, 10 Jul 2006 09:51:52 +0200 tcosmonitor (0.0.9.b4) unstable; urgency=low * Add screenshot PXES support (add -ac to X options and add 8081 httpd server) * Copy scrot and libs into pxes-1.2 and pxes-1.2 dirs -- Mario Izquierdo (mariodebian) Sat, 8 Jul 2006 17:00:34 +0200 tcosmonitor (0.0.9.b3) unstable; urgency=low * Fix dependencies, only python2.4, not python|python2.4 -- Mario Izquierdo (mariodebian) Fri, 7 Jul 2006 16:43:19 +0200 tcosmonitor (0.0.9.b2) unstable; urgency=low * First initial support of PXES. - split package: - pxes-1.1-tcosmonitor for pxes 1.1 version - pxes-1.2-tcosmonitor for pxes 1.2 version * Change all icons to Tango icon theme, right click menu have icons too -- Mario Izquierdo (mariodebian) Fri, 7 Jul 2006 13:59:00 +0200 tcosmonitor (0.0.9.b1) unstable; urgency=low * Hide tcos exe, not avalaible yet * Fix shell scripts launchers -- Mario Izquierdo (mariodebian) Tue, 4 Jul 2006 14:03:50 +0200 tcosmonitor (0.0.8) unstable; urgency=low * Add tcospersonalize python and glade (personalize thin client xorg settings) * Add right menu a new action: "Restart Xorg with new personalize settings" -- Mario Izquierdo (mariodebian) Tue, 4 Jul 2006 12:13:25 +0200 tcosmonitor (0.0.7) unstable; urgency=low * Add Config support with preferences dialog. * Add kernel methods in xmlrpc/info.h * Add a lot of actions in host right click. * Add new method to discover host on lan (netstat and ping) * Fix many small bugs -- Mario Izquierdo (mariodebian) Tue, 4 Jul 2006 12:13:07 +0200 tcosmonitor (0.0.6) unstable; urgency=low * Allow to run TcosMonitor any user, tcosmonitor.sh. -- Mario Izquierdo (mariodebian) Thu, 29 Jun 2006 10:15:39 +0200 tcosmonitor (0.0.5) unstable; urgency=low * Remove RemoteXml class * Clean Localdata and Initialize classes * add crono function to stat time. -- Mario Izquierdo (mariodebian) Thu, 29 Jun 2006 10:03:33 +0200 tcosmonitor (0.0.4) unstable; urgency=low * New beta release. * All code is bassed now in tcosxmlrpc, webserver.sh deprecated !!! * Support to retrieve pci and modules info throught xmlrpc/pci.h and xmlrpc/info.h * Add lockscreen (rename of iTALC screenlock project, to avoid conflict binaries) -- Mario Izquierdo (mariodebian) Mon, 26 Jun 2006 18:18:47 +0200 tcosmonitor (0.0.3) unstable; urgency=low * xmlrpc/tcosxmlrpc semi functional: - Auth support ( for each method login first ) - Read username and password from /etc/tcospasswd (password in md5) * xmlrpc/tcosmd5, small app to create md5 of a passed string. * New python classes: - LocalData: read connected hosts and his statistics - TcosXmlRpc: connect to tcosxmlrpc and get info - RemoteXml: download system-info.xml and parse it. -- Mario Izquierdo (mariodebian) Wed, 21 Jun 2006 19:58:39 +0200 tcosmonitor (0.0.2) unstable; urgency=low * Very much work on xmlrpc/tcosxmlrpc.c, not yet finish!!! * Initial mockup of TcosMonitor python glade gui. * Add hooks and scripts to /etc/tcos/ * Add exejobs.sh script (abyss server run in nobody mode) * Add webserver.sh script * Update tcosxmlrpc methods -- Mario Izquierdo (mariodebian) Tue, 20 Jun 2006 17:00:53 +0200 tcosmonitor (0.0.1) unstable; urgency=low * Initial release. -- Mario Izquierdo (mariodebian) Wed, 14 Jun 2006 18:10:47 +0200 tcosmonitor/debian/control0000664000000000000000000000342012260544542013156 0ustar Source: tcosmonitor Section: gnome Priority: extra Maintainer: Mario Izquierdo (mariodebian) Build-Depends: debhelper (>= 7.0.50~), python-all (>=2.6.6-3~) Standards-Version: 3.9.2 Vcs-Git: http://tcosproject.org/git/tcosmonitor.git Vcs-Browser: http://tcosproject.org/cgit/tcosmonitor.git/ Homepage: http://www.tcosproject.org Package: tcosmonitor Architecture: all Depends: python, tcosmonitor-common ( >= 0.2.39), python-gtk-vnc, gksu | kdebase-bin, nmap, ${misc:Depends}, ${shlibs:Depends}, ${python:Depends} Breaks: initramfs-tools-tcos (<= 0.88.16) Description: Thin client monitor for TCOS TCOS, thin Client Operating System is a method to create small embedded os based on Debian/Ubuntu with normal Debian kernel's. . tcosmonitor is a small pygtk app to monitor thin clients Package: tcosmonitor-common Architecture: all Depends: python, python-utmp, python-dbus, python-gtk2, python-dns, python-netifaces, python-notify, python-xlib, python-ipaddr, python-ipy, python-dateutil, zenity, dbus, x11vnc, lsb-base (>= 3.0-6), notification-daemon | xfce4-notifyd, libnotify-bin, python-m2crypto, python-medusa, tcos-core ( >= 0.89.44), consolekit, ${misc:Depends}, ${shlibs:Depends}, ${python:Depends} Breaks: initramfs-tools-tcos (<= 0.88.16), tcosmonitor (<=0.2.39) Description: Thin client monitor for TCOS (common files) TCOS, thin Client Operating System is a method to create small embedded os based on Debian/Ubuntu with normal Debian kernel's. . This package contains common files of tcosmonitor (for standalone) tcosmonitor/debian/tcosmonitor-common.manpages0000664000000000000000000000002712260544373017140 0ustar man/tcos-dbus-client.1 tcosmonitor/debian/tcosmonitor.dirs0000664000000000000000000000012212260544373015014 0ustar usr/bin usr/share/tcosmonitor usr/share/tcosmonitor/images usr/share/applications tcosmonitor/debian/tcosmonitor-common.dirs0000664000000000000000000000005512260544373016307 0ustar usr/bin etc/X11/Xsession.d usr/share/pixmaps tcosmonitor/debian/rules0000775000000000000000000000103012260544373012630 0ustar #!/usr/bin/make -f %: dh $@ --with python2 override_dh_auto_clean: dh_auto_clean cd po && make clean .PHONY: override_dh_auto_clean #install/tcosmonitor:: # @if [ `find $(CURDIR)/debian/tmp/ -name "*.py" | xargs grep __VERSION__ | wc -l` != 0 ]; then \ # echo "__VERSION__ unparsed"; \ # find *.py | xargs grep __VERSION__;\ # exit 1; \ # fi # # #binary-predeb/tcosmonitor-common:: # # link doc # rm -rf debian/tcosmonitor/usr/share/doc/tcosmonitor # ln -s tcosmonitor-common debian/tcosmonitor/usr/share/doc/tcosmonitor # tcosmonitor/debian/tcosmonitor.install0000664000000000000000000000253512260544373015533 0ustar debian/tmp/etc/tcos/tcosmonitor.conf debian/tmp/etc/tcos/tcos-devices-ng.conf debian/tmp/usr/share/tcosmonitor/images/* debian/tmp/usr/share/tcosmonitor/ui/* debian/tmp/usr/share/applications/tcosmonitor.desktop debian/tmp/usr/share/applications/tcospersonalize.desktop debian/tmp/usr/bin/tcosmonitor debian/tmp/usr/bin/tcospersonalize debian/tmp/usr/bin/tcos-volume-manager debian/tmp/usr/bin/tcos-devices-ng debian/tmp/usr/bin/tcos-server-utils usr/sbin/ debian/tmp/usr/lib/python*/*/tcosmonitor/htmltextview.py debian/tmp/usr/lib/python*/*/tcosmonitor/Initialize.py debian/tmp/usr/lib/python*/*/tcosmonitor/TcosActions.py debian/tmp/usr/lib/python*/*/tcosmonitor/TcosClassView.py debian/tmp/usr/lib/python*/*/tcosmonitor/TcosExtensions.py debian/tmp/usr/lib/python*/*/tcosmonitor/TcosIconView.py debian/tmp/usr/lib/python*/*/tcosmonitor/TcosListView.py debian/tmp/usr/lib/python*/*/tcosmonitor/TcosMenus.py debian/tmp/usr/lib/python*/*/tcosmonitor/TcosPreferences.py debian/tmp/usr/lib/python*/*/tcosmonitor/TcosStaticHosts.py debian/tmp/usr/lib/python*/*/tcosmonitor/TcosTrayIcon.py debian/tmp/usr/lib/python*/*/tcosmonitor/TcosTrayIcon2.py debian/tmp/usr/lib/python*/*/tcosmonitor/WakeOnLan.py debian/tmp/usr/lib/python*/*/tcosmonitor/counter.py debian/tmp/usr/lib/python*/*/tcosmonitor/ftps_server.py debian/tmp/usr/lib/python*/*/tcosmonitor/extensions/*.py tcosmonitor/debian/compat0000664000000000000000000000000212260544373012754 0ustar 7 tcosmonitor/debian/tcosmonitor-common.install0000664000000000000000000000126312260544373017016 0ustar debian/tmp/etc/X11/Xsession.d/81tcos-utils debian/tmp/usr/bin/tcos-dbus-client debian/tmp/usr/share/locale/* debian/tmp/usr/lib/python*/*/tcosmonitor/TcosConf.py debian/tmp/usr/lib/python*/*/tcosmonitor/TcosDBus.py debian/tmp/usr/lib/python*/*/tcosmonitor/ping.py debian/tmp/usr/lib/python*/*/tcosmonitor/shared.py debian/tmp/usr/lib/python*/*/tcosmonitor/Sessions.py debian/tmp/usr/lib/python*/*/tcosmonitor/TcosCommon.py debian/tmp/usr/lib/python*/*/tcosmonitor/LocalData.py debian/tmp/usr/lib/python*/*/tcosmonitor/TcosXauth.py debian/tmp/usr/lib/python*/*/tcosmonitor/TcosXmlRpc.py debian/tmp/usr/lib/python*/*/tcosmonitor/__init__.py debian/tmp/usr/share/pixmaps/tcos-icon-32x32.png tcosmonitor/tcos-devices-ng.py0000775000000000000000000020055212260544373013707 0ustar #!/usr/bin/env python # -*- coding: UTF-8 -*- # TcosMonitor version __VERSION__ # # Copyright (c) 2006-2011 Mario Izquierdo # # This package is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # # This package is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. import os, sys import gobject import getopt from gettext import gettext as _ import time import socket CONF_FILE="~/.tcos-devices-ng.conf" ALL_CONF_FILE="/etc/tcos/tcos-devices-ng.conf" import pygtk pygtk.require('2.0') import gtk from tcosmonitor import shared # check for local DISPLAY remotehost=display="" if "DISPLAY" in os.environ and os.environ['DISPLAY'] != '': remotehost=str(shared.parseIPAddress(os.environ["DISPLAY"])) action = "" if remotehost == "": print ("tcos-devices-ng: Not allowed to run in local DISPLAY") sys.exit(0) # load conf file and exit if not active if not shared.test_start("tcos-devices-ng") : print ("tcos-devices-ng disabled at %s" % (shared.module_conf_file)) sys.exit(1) from tcosmonitor.TcosTrayIcon2 import TcosTrayIcon import threading import pynotify import pwd # tell gtk we use threads gtk.gdk.threads_init() def usage(): print ("tcos-devices-ng help:") print ("") print (" tcos-devices-ng -d [--debug] (write debug data to stdout)") print (" tcos-devices-ng -h [--help] (this help)") try: opts, args = getopt.getopt(sys.argv[1:], ":hd", ["help", "debug" ]) except getopt.error, msg: print (msg) print ("for command line options use tcos-devices-ng --help") sys.exit(2) # process options for o, a in opts: if o in ("-d", "--debug"): shared.debug = True if o in ("-h", "--help"): usage() sys.exit() def log( message ): print ( "%d %s" % (os.getpid(), message) ) def print_debug(txt): if shared.debug: print >>sys.stderr, "%d %s::%s" % (os.getpid(), "tcos-devices-ng", txt) #print("%d %s::%s" % (os.getpid(), "tcos-devices-ng", txt), file=sys.stderr) class TcosDevicesNG: def __init__(self): self.host=None self.hostname=None self.name="TcosDevicesNG" self.mounted={} self.mntconf={} self.username=None self.loadconf(CONF_FILE) self.loadconf(ALL_CONF_FILE) ######## Create icon ############# disable_quit=self.mntconf.has_key("disable_quit") and self.mntconf['disable_quit'] == "1" enable_reboot_and_poweroff=self.mntconf.has_key("enable_reboot_poweroff") and self.mntconf['enable_reboot_poweroff'] == "1" self.systray=TcosTrayIcon(disable_quit=disable_quit, allow_reboot_poweroff=enable_reboot_and_poweroff) self.systray.status=True self.initremote() self.desktop=self.get_desktop() ######## read floppys ############# if self.mntconf.has_key("disable_floppy") and self.mntconf['disable_floppy'] == "1" : print_debug("__init__() floppy disabled from CONF_FILE") else: self.getremote_floppy() ######## read cdroms ############# if self.mntconf.has_key("disable_cdroms") and self.mntconf['disable_cdroms'] == "1" : print_debug("__init__() cdroms disabled from CONF_FILE") else: self.getremote_cdroms() ######## read hard disk ############# if self.mntconf.has_key("disable_hdd") and self.mntconf['disable_hdd'] == "1" : print_debug("__init__() hdd disabled from CONF_FILE") else: self.getremote_hdd() self.quitting=False # register quit event if not disable_quit: self.systray.register_action("quit", lambda w: self.exit() ) # register reboot and poweroff if enable_reboot_and_poweroff: self.systray.register_action("reboot", self.menu_remote_reboot_poweroff, 'reboot' ) self.systray.register_action("poweroff", self.menu_remote_reboot_poweroff, 'poweroff' ) self.udev_events={ "insert": {"ID_BUS": "usb", "ACTION":"add"}, "remove": {"ID_BUS": "usb", "ACTION":"remove"}, "insert-firewire":{"ID_BUS": "ieee1394", "ACTION":"add"}, "remove-firewire":{"ID_BUS": "ieee1394", "ACTION":"remove"}, "mount-floppy": {"DEVPATH": "/block/fd0", "ACTION":"mount"}, "umount-floppy": {"DEVPATH": "/block/fd0", "ACTION":"umount"}, "mount-cdrom": {"DEVPATH": "/block/hd*", "ACTION":"mount"}, "umount-cdrom": {"DEVPATH": "/block/hd*", "ACTION":"umount"}, "mount-flash": {"DEVPATH": "/block/sd*", "ACTION":"mount"}, "umount-flash": {"DEVPATH": "/block/sd*", "ACTION":"umount"}, "newcdrom": {"ID_FS_TYPE":"iso9660", "ACTION":"add"} } def menu_remote_reboot_poweroff(self, *args): try: action=args[0][0] except Exception, err: print_debug("menu_remote_reboot_poweroff() Exception, error=%s"%err) return remote_hostname=self.xauth.get_hostname() xauth_cookie=self.xauth.get_cookie() if self.mntconf.has_key("reboot_poweroff_timeout"): timeout=self.mntconf['reboot_poweroff_timeout'] else: timeout="5" if action == "reboot": self.show_notification( _("Rebooting in %s seconds") %(timeout) ) elif action == "poweroff": self.show_notification( _("Shutting down in %s seconds") %(timeout) ) else: # unknow signal return print_debug("remote_reboot_poweroff() action=%s, remote_hostname=%s, xauth_cookie=%s"%(action, remote_hostname, xauth_cookie)) cmd=threading.Thread(target=self.remote_reboot_poweroff, args=[action, timeout, xauth_cookie, remote_hostname] ) cmd.start() return def remote_reboot_poweroff(self, action, timeout, xauth_cookie, remote_hostname): print_debug("remote_reboot_poweroff() waiting %s seconds"%timeout) #time.sleep(int(timeout)) try: result=self.xmlrpc.tc.tcos.rebootpoweroff( action, timeout, xauth_cookie, remote_hostname) print_debug("remote_reboot_poweroff() result=%s"%result.strip()) if result.startswith("error"): self.show_notification( _("ERROR during action %(action)s:\n%(errortxt)s") %{"action":action, "errortxt":result.replace('error: ','')} ) except Exception, err: print_debug("remote_reboot_poweroff() Exception: %s"%err) self.show_notification( _("ERROR during action %(action)s:\n%(errortxt)s") %{"action":action, "errortxt":err} ) return def loadconf(self, conffile): print_debug ( "loadconf() __init__ conffile=%s" %conffile ) conf=os.path.expanduser(conffile) if os.path.isfile(conf): print_debug ("loadconf() found conf file %s" %conf) f=open(conf, "r") data=f.readlines() f.close() for line in data: if line == '\n': continue if line.find('#') == 0: continue line=line.replace('\n', '') if "=" in line: try: self.mntconf["%s"%line.split('=')[0]] = line.split('=')[1] except Exception, err: print_debug("loadconf() Exception, error=%s"%err) pass print_debug( "loadconf mntconf=%s" %self.mntconf ) return def show_notification(self, msg, urgency=pynotify.URGENCY_CRITICAL, timeout=20000): pynotify.init("tcos-devices-ng") if os.path.isfile("/usr/share/pixmaps/tcos-icon-32x32-custom.png"): image_uri="file://usr/share/pixmaps/tcos-icon-32x32-custom.png" else: image_uri="file://" + os.path.abspath(shared.IMG_DIR) + "/tcos-devices-32x32.png" n = pynotify.Notification( _("Tcos device daemon") , msg, image_uri ) n.set_urgency(urgency) # don't attach to status icon with multiple notifications #if hasattr(pynotify.Notification, 'attach_to_status_icon'): # n.attach_to_status_icon(self.systray.statusIcon) n.set_category("device") n.set_timeout(timeout) # 15 sec if not n.show(): print_debug ("show_notification() Failed to send notification") def initremote(self): # get all devices import tcosmonitor.TcosXmlRpc import tcosmonitor.TcosConf import tcosmonitor.TcosCommon import tcosmonitor.TcosXauth self.xauth=tcosmonitor.TcosXauth.TcosXauth(self) self.xauth.init_standalone() self.common=tcosmonitor.TcosCommon.TcosCommon(self) print_debug ( "loading config class..." ) self.config=tcosmonitor.TcosConf.TcosConf(self, openfile=False) self.xmlrpc=tcosmonitor.TcosXmlRpc.TcosXmlRpc(self) self.username=self.common.get_username() self.host=self.common.get_display(ip_mode=True) self.hostname=self.common.get_display(ip_mode=False) print_debug("initremote() username=%s host=%s hostname=%s"%(self.username, self.host, self.hostname)) if not self.common.user_in_group("fuse"): print ("tcos-devices-ng: ERROR: User not in group fuse") shared.error_msg(_("TCOS_DEVICES: Your user is not in group fuse and you can not use USB devices. Please contact with your administrator.")) sys.exit(1) nossl=True # make a test and exit if no cookie match if not self.xauth.test_auth(nossl): print ("tcos-devices-ng: ERROR: Xauth cookie don't match") sys.exit(1) self.xmlrpc.newhost(self.host, nossl) if not self.xmlrpc.connected: print ( _("Error connecting with TcosXmlRpc in %s.") %(self.host) ) sys.exit(1) # check for enabled devices disable_usb=self.xmlrpc.IsEnabled("TCOS_DISABLE_USB") disable_ide=self.xmlrpc.IsEnabled("TCOS_DISABLE_IDE") if disable_usb or disable_ide: print ("tcos-devices-ng: TCOS_DISABLE_USB or TCOS_DISABLE_IDE enabled, exiting...") sys.exit(0) def get_desktop_path(self): try: desktop=self.common.exe_cmd("/usr/lib/tcos/get-xdg-desktop", verbose=1, background=False, lines=0, cthreads=0) except: desktop=os.path.expanduser("~/") if not os.path.isdir(desktop): desktop=os.path.expanduser("~/") return desktop def getremote_cdroms(self): self.cdrom_devices=self.xmlrpc.GetDevicesInfo(device="", mode="--getcdrom").split('|') self.cdrom_devices=self.cdrom_devices[0:-1] print_debug ( "get_data() cdroms=%s" %(self.cdrom_devices) ) for cdrom in self.cdrom_devices: # get device status cdrom_status= self.xmlrpc.GetDevicesInfo(device="/dev/%s" %cdrom, mode="--getstatus") if cdrom_status == "0": mount=True umount=False else: mount=False umount=True cdrom_desc = self.xmlrpc.GetDevicesInfo(device="/dev/%s" %cdrom, mode="--getid") self.systray.register_device("cdrom_%s"%cdrom, _("Cdrom device %s" ) %cdrom, "cdrom.png", True, { "cdrom_%s_mount" %cdrom: [ _("Mount Cdrom"), "cdrom_mount.png", mount, None, "/dev/%s"%cdrom], "cdrom_%s_umount"%cdrom: [ _("Umount Cdrom"), "cdrom_umount.png", umount, None, "/dev/%s"%cdrom] }, "/dev/%s"%(cdrom), cdrom_desc) self.systray.register_action("cdrom_%s_mount" %cdrom, self.cdrom, "mount", cdrom ) self.systray.register_action("cdrom_%s_umount" %cdrom, self.cdrom, "umount", cdrom ) def getremote_hdd(self): self.hdd_devices=self.xmlrpc.GetDevicesInfo(device="", mode="--gethdd").split('|') self.hdd_devices=self.hdd_devices[0:-1] print_debug ( "getremote_hdd() hdd=%s" %(self.hdd_devices) ) for hdd in self.hdd_devices: # get device status hdd_status= self.xmlrpc.GetDevicesInfo(device="/dev/%s" %hdd, mode="--getstatus") if hdd_status == "0": mount=True umount=False else: mount=False umount=True hdd_desc = self.xmlrpc.GetDevicesInfo(device="/dev/%s" %hdd[0:3], mode="--getid") self.systray.register_device("hdd_%s"%hdd, _("Disk partition %s") %hdd, "hdd_mount.png", True, { "hdd_%s_mount" %hdd: [ _("Mount disk partition"), "hdd_mount.png", mount, None, "/dev/%s"%hdd], "hdd_%s_umount"%hdd: [ _("Umount disk partition"), "hdd_umount.png", umount, None, "/dev/%s"%hdd] }, "/dev/%s"%(hdd), hdd_desc) self.systray.register_action("hdd_%s_mount" %hdd, self.hdd, "mount", hdd ) self.systray.register_action("hdd_%s_umount" %hdd, self.hdd, "umount", hdd ) def getremote_floppy(self): have_floppy=self.xmlrpc.GetDevicesInfo(device="/dev/fd0", mode="--exists") if have_floppy == "0": print_debug ( _("No floppy detected") ) return floppy_status=self.xmlrpc.GetDevicesInfo(device="/dev/fd0", mode="--getstatus") if floppy_status == "0": mount=True n=1 self.systray.status=False else: mount=False n=2 self.systray.status=True self.systray.register_device("floppy", _("Floppy"), "floppy%s.png"%n, True, { "floppy_mount": [ _("Mount Floppy"), "floppy_mount.png", mount, None, "/dev/fd0"], "floppy_umount": [ _("Umount Floppy"), "floppy_umount.png", not mount, None, "/dev/fd0"] }, "/dev/fd0") self.systray.register_action("floppy_mount" , self.floppy, "mount" ) self.systray.register_action("floppy_umount" , self.floppy, "umount" ) return def update_floppy(self, *args): if len(args) > 0: if args[0] == "mount": self.show_notification ( _("Floppy mounted. Ready for use.") ) elif args[0] == "umount": self.show_notification ( _("Floppy umounted. You can extract it.") ) floppy_status=self.xmlrpc.GetDevicesInfo(device="/dev/fd0", mode="--getstatus") if floppy_status == "0": ismounted=False n=1 else: ismounted=True n=2 print_debug ("update_floppy() floppy ismounted=%s" %ismounted) self.systray.items["floppy"][1]="floppy%s.png"%n self.systray.update_status("floppy", "floppy_mount", not ismounted) self.systray.update_status("floppy", "floppy_umount", ismounted) def update_hdd(self, *args): if len(args) > 0: if args[0] == "mount": self.show_notification ( _("Hard disk partition mounted. Ready for use.") ) return elif args[0] == "umount": self.show_notification ( _("Hard disk partition umounted.") ) return else: dev=args[0] hdd_status=self.xmlrpc.GetDevicesInfo(device="/dev/%s"%dev, mode="--getstatus") if hdd_status == "0": ismounted=False n=1 else: ismounted=True n=2 print_debug ("update_hdd() hdd ismounted=%s" %ismounted) self.systray.update_status("hdd_%s"%dev, "hdd_%s_mount"%dev, not ismounted) self.systray.update_status("hdd_%s"%dev, "hdd_%s_umount"%dev, ismounted) def update_cdrom(self, dev, action=None): if action == "mount" or action == "umount": devtype=self.xmlrpc.GetDevicesInfo(device=dev, mode="--cdaudio") if action == "mount": if devtype == "1": self.show_notification ( _("Audio cdrom mounted., you can listen music opening wav files.") ) else: self.show_notification ( _("Cdrom mounted. Ready for use.") ) return elif action == "umount": self.show_notification ( _("Cdrom umounted. You can extract it.") ) return cdrom_status=self.xmlrpc.GetDevicesInfo(device="/dev/%s"%dev, mode="--getstatus") if cdrom_status == "0": ismounted=False n=1 else: ismounted=True n=2 print_debug ("update_cdrom() cdrom ismounted=%s" %ismounted) self.systray.update_status("cdrom_%s"%dev, "cdrom_%s_mount"%dev, not ismounted) self.systray.update_status("cdrom_%s"%dev, "cdrom_%s_umount"%dev, ismounted) def udev_daemon(self): start1=time.time() print_debug ("udev_daemon() starting...") udev=self.xmlrpc.GetDevicesInfo(device="", mode="--getudev").split('|') print_debug("udev_daemon GetDevicesInfo time=%f" %(time.time() - start1) ) if "error" in " ".join(udev): return udev=udev[:-1] if len(udev) < 1 or udev[0] == "unknow": return udev=self.remove_dupes(udev) for line in udev: data={} tmp=line.split('#') for i in tmp: if '=' in i: data[i.split("=")[0]]=i.split("=")[1] for event in self.udev_events: action_found=False #print_debug ( " UDEV=> checking for event %s" %event ) # check for all events for udev_var in self.udev_events[event]: #print_debug ( " UDEV=> checking for udev_var %s value=%s" %(udev_var, self.udev_events[event]["%s"%udev_var]) ) if not data.has_key(udev_var): action_found=False break if "*" in self.udev_events["%s"%event]["%s"%udev_var]: even=self.udev_events["%s"%event]["%s"%udev_var].replace('*','') if even in data["%s"%udev_var]: action_found=True else: action_found=False break else: if self.udev_events["%s"%event]["%s"%udev_var] == data["%s"%udev_var]: action_found=True else: action_found=False break if action_found: self.worker_running=False worker=shared.Workers(self, target=self.do_udev_event, args=[data], dog=False) worker.start() print_debug("end of udev_daemon time=%f" %(time.time() - start1) ) return def do_udev_event(self, *args): data=args[0] #print_debug ("do_udev_event() data=%s" %data) if data.has_key("ID_FS_TYPE") and data['ID_FS_TYPE'] == "iso9660": # newcdrom ADD (mount it) if data['ACTION'] == "add": self.cdrom( ('mount', data["DEVPATH"].split("/")[2]), ) else: if data['ACTION'] == "mount": # check if CDROM is automonted before if self.xmlrpc.GetDevicesInfo(device=data["DEVPATH"], mode="--getstatus") == "1": return self.cdrom( (data['ACTION'], data["DEVPATH"].split("/")[2]), ) if data.has_key("ID_BUS") and data["ID_BUS"] == "usb": if data.has_key("DEVPATH") and "/block/sr" in data["DEVPATH"]: self.cdrom_usb(data) else: self.usb(data) if data.has_key("ID_BUS") and data["ID_BUS"] == "ieee1394": self.firewire(data) if data.has_key("DEVPATH") and "/block/hd" in data["DEVPATH"]: if len(data["DEVPATH"].split('/')) > 3: # we have a hdd self.update_hdd(data["ACTION"]) else: # we have a cdrom self.update_cdrom("/dev/" + data["DEVPATH"].split("/")[2], action=data["ACTION"]) if data.has_key("DEVPATH") and "/block/fd" in data["DEVPATH"]: self.update_floppy(data["ACTION"]) if data.has_key("DEVPATH") and data["ID_BUS"] == "ieee1394" and "/block/sd" in data["DEVPATH"]: # FIXME SATA devices not detected as HDD self.update_firewire(data) elif data.has_key("DEVPATH") and "/block/sd" in data["DEVPATH"]: self.update_usb(data) def mounter_remote(self, device, fstype, mode="--mount"): print_debug ( "mounter_remote() device=%s fstype=%s" %(device, fstype) ) if device == None: return False mnt_point="/mnt/%s" %(device[5:]) if mode == "--mount": # send notification self.show_notification( _("Mounting device %s\nPlease wait..." ) %(device), urgency=pynotify.URGENCY_NORMAL ) print_debug ( "mount_remote() mounting device=%s fstype=%s mnt_point=%s" %(device, fstype, mnt_point) ) elif mode == "--umount": print_debug ( "mount_remote() umounting device=%s fstype=%s mnt_point=%s" %(device, fstype, mnt_point) ) # set socket timeout bigger (floppy can take some time) socket.setdefaulttimeout(15) if fstype != "vfat": # if we know that device is vfat dont try to get type again dtype=self.xmlrpc.GetDevicesInfo(device=device, mode="--gettype") if dtype == "ntfs-3g" and mode == "--mount": print_debug ( "mounter_remote() Ummm mounting a NTFS-3G, creating a thread" ) # create a thread try: ntfs_3g=threading.Thread(target=self.xmlrpc.GetDevicesInfo, args=(device,mode) ) ntfs_3g.start() return True except Exception, err: print_debug("ntfs-3g thread Exception, error=%s"%err) return True # set socket timeout bigger (floppy can take some time) socket.setdefaulttimeout(15) mount=self.xmlrpc.GetDevicesInfo(device=device, mode=mode) if mount != mnt_point: print_debug ( "mounter_remote() mount failed, retry with filesystem") print_debug ( "mounter_remote() FIRST ERROR mount='%s' mnt_point='%s'" %(mount, mnt_point)) return False """ # try to mount with filesystem mount=self.xmlrpc.GetDevicesInfo(device="%s %s" %(device, fstype), mode=mode) if mount != mnt_point: print_debug ("mounter_remote() SECOND ERROR mount='%s' mnt_point='%s'" %(mount, mnt_point)) return False """ print_debug("mounter_remote(device=%s fstype=%s) mount OK"%(device, fstype)) return True def mounter_local(self, local_mount_point, remote_mnt, device="", label="", mode="mount"): if mode == "mount": if not os.path.isdir(local_mount_point): os.mkdir (local_mount_point) # wait until appear in desktop icon folder time.sleep(2) output=self.common.exe_cmd("ltspfs %s:%s %s 2>&1" %(self.host, remote_mnt, local_mount_point), verbose=1, background=False, lines=0, cthreads=0) if "ERROR" in output: self.show_notification( _("Error mounting LTSPFS, check versions of LTSPFS packages"), urgency=pynotify.URGENCY_CRITICAL) return False """ # DISABLED: too late to show notification better in mounter_remote # send notification self.show_notification( _("Mounting device %(device)s in \n%(mnt_point)s\nPlease wait..." )\ %{"device":device, "mnt_point":local_mount_point}, urgency=pynotify.URGENCY_NORMAL ) """ if mode == "umount": if os.path.isdir(local_mount_point): print_debug ( "mounter_local() umounting %s" %(local_mount_point) ) self.common.exe_cmd("fusermount -u %s" %(local_mount_point), verbose=1, background=False, lines=0, cthreads=0 ) self.common.exe_cmd("fusermount -uz %s 2>/dev/null" %(local_mount_point), verbose=1, background=False, lines=0, cthreads=0 ) print_debug ( "mounter_local() removing dir %s" %(local_mount_point) ) try: os.rmdir(local_mount_point) except Exception, err: print_debug("mounter_local(umount %s) Exception, error %s"%(local_mount_point, err)) mydevice="" for dev in self.mounted: if local_mount_point == self.mounted[dev]: mydevice=device self.show_notification( _("Umounting device %s.\nPlease wait..." ) %(mydevice)\ , urgency=pynotify.URGENCY_NORMAL ) return True def get_local_mountpoint(self, data): desktop=self.get_desktop_path() #fslabel=self.get_value(data, "ID_FS_LABEL") #fsvendor=self.get_value(data, "ID_VENDOR") if data.has_key("ID_FS_LABEL"): fslabel=data['ID_FS_LABEL'] else: fslabel="" if data.has_key("ID_VENDOR"): fsvendor=data['ID_VENDOR'] else: fsvendor="" counter=1 if fslabel != "": print_debug ( "get_local_mountpoint() have label...." ) if not os.path.isdir(desktop + "/" + fslabel): print_debug ( "get_local_mountpoint() %s dir not exists, returning..." %(desktop + "/" + fslabel) ) return desktop + "/" + fslabel else: print_debug ( "get_local_mountpoint() %s dir exists, searching for numbered dirs..." %(desktop + "/" + fslabel) ) while True: if not os.path.isdir(desktop + "/" + fslabel + "-" + str(counter) ): print_debug ( "get_local_mountpoint() %s dir not exists, returning..." %(desktop + "/" + fslabel + "-" + str(counter)) ) return desktop + "/" + fslabel + "-" + str(counter) counter+=1 if fsvendor != "": print_debug ( "get_local_mountpoint() have vendor not label...." ) if not os.path.isdir(desktop + "/" + fsvendor): print_debug ( "get_local_mountpoint() %s dir not exists, returning..." %(desktop + "/" + fsvendor) ) return desktop + "/" + fsvendor else: print_debug ( "get_local_mountpoint() %s dir exists, searching for numbered dirs..." %(desktop + "/" + fsvendor) ) while True: if not os.path.isdir(desktop + "/" + fsvendor + "-" + str(counter) ): print_debug ( "get_local_mountpoint() %s dir not exists, returning..." %(desktop + "/" + fsvendor + "-" + str(counter)) ) return desktop + "/" + fsvendor + "-" + str(counter) counter+=1 else: if data.has_key("ID_BUS") and data["ID_BUS"] == "usb": mnt=_("usbdisk") else: mnt=_("firewiredisk") print_debug ( "get_local_mountpoint() don't have label or vendor" ) if not os.path.isdir(desktop + "/" + mnt): print_debug ( "get_local_mountpoint() %s dir not exists, returning..." %(desktop + "/" + mnt) ) return desktop + "/" + mnt else: print_debug ( "get_local_mountpoint() %s dir exists, searching for numbered dirs..." %(desktop + "/" + mnt) ) while True: if not os.path.isdir(desktop + "/" + mnt + "-" + str(counter) ): print_debug ( "get_local_mountpoint() %s dir not exists, returning..." %(desktop + "/" + mnt + "-" + str(counter)) ) return desktop + "/" + mnt + "-" + str(counter) counter+=1 def floppy(self, action): action=action[0] print_debug("floppy call %s" %action) desktop=self.get_desktop_path() if self.mntconf.has_key("fd0"): local_mount_point=os.path.join(desktop, self.mntconf['fd0'] ) else: local_mount_point=os.path.join(desktop, _("Floppy") ) if action == "mount": if not self.mounter_remote("/dev/fd0", "", mode="--mount"): self.show_notification ( _("Can't mount floppy") ) return if not self.mounter_local(local_mount_point, "/mnt/fd0", device="/dev/fd0", label=_("Floppy"), mode="mount"): return self.launch_desktop_filemanager(local_mount_point) self.update_floppy() return if action == "umount": self.mounter_local(local_mount_point, "/mnt/fd0", device="/dev/fd0", label=_("Floppy"), mode="umount") if not self.mounter_remote("/dev/fd0", "", mode="--umount"): self.show_notification ( _("Can't umount floppy") ) return self.update_floppy() def cdrom(self, *args): action=args[0][0] cdrom_device=args[0][1] desktop=self.get_desktop_path() if self.mntconf.has_key(cdrom_device): local_mount_point=os.path.join(desktop, self.mntconf[cdrom_device] ) else: local_mount_point=os.path.join(desktop, _("Cdrom_%s") %cdrom_device ) absdev="/dev/%s"%cdrom_device if action == "mount": print_debug ( "cdrom() remote_mnt=%s device=%s" %("/mnt/%s"%cdrom_device, cdrom_device) ) if not self.mounter_remote(absdev, "", mode="--mount"): self.show_notification ( _("Can't mount cdrom") ) return if not self.mounter_local(local_mount_point, "/mnt/%s"%cdrom_device, device=absdev, label=_("Cdrom_%s") %cdrom_device, mode="mount"): return # change status self.update_cdrom(cdrom_device) self.launch_desktop_filemanager(local_mount_point) return if action == "umount": print_debug ( "cdrom() remote_mnt=%s device=%s" %("/mnt/%s"%cdrom_device, cdrom_device) ) self.mounter_local(local_mount_point, "/mnt/%s"%cdrom_device, device=absdev, label=_("Cdrom_%s") %cdrom_device, mode="umount") if not self.mounter_remote(absdev, "", mode="--umount"): self.show_notification ( _("Can't umount cdrom") ) return # change status self.update_cdrom(cdrom_device) # eject CDROM self.xmlrpc.GetDevicesInfo(device=cdrom_device, mode="--eject") return def hdd(self, *args): action=args[0][0] hdd_device=args[0][1] desktop=self.get_desktop_path() if self.mntconf.has_key(hdd_device): local_mount_point=os.path.join(desktop, self.mntconf[hdd_device] ) else: local_mount_point=os.path.join(desktop, _("Disk_%s") %hdd_device ) absdev="/dev/%s"%hdd_device if action == "mount": print_debug ( "hdd() remote_mnt=%s device=%s" %("/mnt/%s"%hdd_device, hdd_device) ) if not self.mounter_remote(absdev, "", mode="--mount"): self.show_notification ( _("Can't mount hard disk partition") ) return if not self.mounter_local(local_mount_point, "/mnt/%s"%hdd_device, device=absdev, label=_("Disk_%s") %hdd_device, mode="mount"): return # change status self.update_hdd(hdd_device) self.launch_desktop_filemanager(local_mount_point) return if action == "umount": print_debug ( "hdd() remote_mnt=%s device=%s" %("/mnt/%s"%hdd_device, hdd_device) ) self.mounter_local(local_mount_point, "/mnt/%s"%hdd_device, device=absdev, label=_("Disk_%s") %hdd_device, mode="umount") if not self.mounter_remote(absdev, "", mode="--umount"): self.show_notification ( _("Can't umount hard disk partition") ) return # change status self.update_hdd(hdd_device) return def cdrom_usb(self, *args): data=args[0] if isinstance(data, tuple): data=args[0][0] print_debug("cdrom_usb() data=%s" %data) if data.has_key('DEVPATH'): device="/dev/"+data["DEVPATH"].split('/')[2] else: device=data['DEVNAME'] action=data['ACTION'] devid=device.split('/')[2] remote_mnt="/mnt/%s" %(devid) usb_status=self.xmlrpc.GetDevicesInfo(device=device, mode="--getstatus") if usb_status == "0": mount=True n=1 else: mount=False n=2 if action == "add": if not data.has_key('ID_VENDOR'): vendor="" else: vendor=data['ID_VENDOR'] if not data.has_key('ID_MODEL'): model="" else: model=data['ID_MODEL'] if not data.has_key('ID_FS_TYPE'): fstype="" else: fstype=data['ID_FS_TYPE'] self.show_notification( _("From terminal %(host)s.\nConnected CDROM USB device %(device)s\n%(vendor)s %(model)s" ) \ %{"host":self.hostname, "device":device, "vendor":vendor, "model":model } ) ########### add USB CDROM device ############ self.systray.register_device("usb_%s"%devid, _("CDROM USB device %s") %devid, "usb%s.png"%n, True, { "usb_%s_mount" %devid: [ _("Mount CDROM USB device %s") %(devid), "usb_mount.png", mount, None, device], "usb_%s_umount" %devid: [ _("Umount CDROM USB device %s") %(devid), "usb_umount.png", not mount, None, device] }, device, "%s %s"%(vendor, model)) self.systray.register_action("usb_%s_mount" %devid , self.cdrom_usb, { "DEVNAME": device, "ACTION": "mount", "ID_FS_TYPE": fstype, "FORCE_MOUNT":True } ) self.systray.register_action("usb_%s_umount" %devid , self.cdrom_usb, { "DEVNAME": device, "ACTION": "umount", "ID_FS_TYPE": fstype, "FORCE_MOUNT":True } ) ############################################### # We can have only a cdrom connected without cd inserted if fstype != "": desktop=self.get_desktop_path() if self.mntconf.has_key(devid): local_mount_point=os.path.join(desktop, self.mntconf[devid] ) else: local_mount_point=os.path.join(desktop, _("Cdrom_%s") %devid ) print_debug ( "cdrom_usb() remote_mnt=%s device=%s" %(remote_mnt, devid) ) if not self.mounter_remote(device, fstype, mode="--mount"): self.show_notification ( _("Error, can't mount device %s") %(device) ) return if device in self.mounted: data['ID_FS_LABEL']=os.path.basename(self.mounted[device]) data['ID_VENDOR']=os.path.basename(self.mounted[device]) # remote device is mounted, mount_local and launch filemanager if not self.mounter_local(local_mount_point, remote_mnt, device=device, label=_("Cdrom_%s") %devid, mode="mount"): return self.launch_desktop_filemanager(local_mount_point) self.mounted[device]=local_mount_point # change status self.update_cdrom_usb(devid, action) return elif action == "mount": if not data.has_key('ID_FS_TYPE'): fstype="" else: fstype=data['ID_FS_TYPE'] desktop=self.get_desktop_path() if self.mntconf.has_key(devid): local_mount_point=os.path.join(desktop, self.mntconf[devid] ) else: local_mount_point=os.path.join(desktop, _("Cdrom_%s") %devid ) print_debug ( "cdrom_usb() remote_mnt=%s device=%s" %(remote_mnt, devid) ) if not self.mounter_remote(device, fstype, mode="--mount"): self.show_notification ( _("Error, can't mount device %s") %(device) ) return if device in self.mounted: data['ID_FS_LABEL']=os.path.basename(self.mounted[device]) data['ID_VENDOR']=os.path.basename(self.mounted[device]) # remote device is mounted, mount_local and launch filemanager if not self.mounter_local(local_mount_point, remote_mnt, device=device, label=_("Cdrom_%s") %devid, mode="mount"): return # change status self.update_cdrom_usb(devid, action) self.launch_desktop_filemanager(local_mount_point) self.mounted[device]=local_mount_point return elif action == "remove" or action == "umount": if action == "remove": if not data.has_key('ID_VENDOR'): vendor="" else: vendor=data['ID_VENDOR'] if not data.has_key('ID_MODEL'): model="" else: model=data['ID_MODEL'] self.show_notification( _("From terminal %(host)s.\nDisconnected CDROM USB device %(device)s\n%(vendor)s %(model)s" ) \ %{"host":self.hostname, "device":device, "vendor":vendor, "model":model } ) print_debug ("cdrom_usb() UNREGISTER SERVICE") self.systray.unregister_device("usb_%s"%devid) if device in self.mounted: local_mount_point=self.mounted[device] else: print_debug ( "remove_cdrom_usb() device %s not found in self.mounted" %(device) ) return # umount local fuse # check if fuse is mounted status=self.common.exe_cmd("mount |grep -c %s" %(local_mount_point), verbose=1, background=False, lines=0, cthreads=0 ) if int(status) != 0: self.mounter_local(local_mount_point, remote_mnt, device=device, label=_("Cdrom_%s") %devid, mode="umount") # umount remote device # check if remote is mounted (user can umount before from desktop icon) print_debug("cdrom_usb() GETSTATUS device=%s"%device) status=self.xmlrpc.GetDevicesInfo(device=device, mode="--getstatus") try: status=int(status) if status == 0: print_debug ( "remove_cdrom_usb() device=%s seems not mounted" %(device) ) self.systray.update_status("usb_%s"%devid, "usb_%s_mount"%devid, True) self.systray.update_status("usb_%s"%devid, "usb_%s_umount"%devid, False) else: if not self.mounter_remote(device, "", mode="--umount"): self.show_notification ( _("Can't umount cdrom usb %s") %(device) ) return self.update_cdrom_usb(devid, action) except Exception, err: print_debug ( "cdrom_usb() Exception error %s"%err ) def usb(self, *args): data=args[0] if isinstance(data, tuple): data=args[0][0] print_debug("usb() data=%s" %data) device=data['DEVNAME'] action=data['ACTION'] if not data.has_key('ID_FS_TYPE'): # we don't have a filesystem only a full device (ex: /dev/sda) if not data.has_key('ID_VENDOR'): vendor="" else: vendor=data['ID_VENDOR'] if not data.has_key('ID_MODEL'): model="" else: model=data['ID_MODEL'] if action == "add": self.show_notification( _("From terminal %(host)s.\nConnected USB device %(device)s\n%(vendor)s %(model)s" ) \ %{"host":self.hostname, "device":device, "vendor":vendor, "model":model } ) if action == "remove": self.show_notification( _("From terminal %(host)s.\nDisconnected USB device %(device)s\n%(vendor)s %(model)s" ) \ %{"host":self.hostname, "device":device, "vendor":vendor, "model":model } ) return else: # we have a filesystem ex: /dev/sda1 if not data.has_key('ID_FS_TYPE'): fstype="" else: fstype=data['ID_FS_TYPE'] if fstype == "swap" or fstype == "extended": return usb_status=self.xmlrpc.GetDevicesInfo(device=device, mode="--getstatus") if usb_status == "0": mount=True n=1 else: mount=False n=2 # add to menu devid=device.split('/')[2] remote_mnt="/mnt/%s" %(devid) if action == "add" or action == "mount": if action == "add": ########### add USB device ############ self.systray.register_device("usb_%s"%devid, _("USB device %s") %devid, "usb%s.png"%n, True, { "usb_%s_mount" %devid: [ _("Mount USB device %s") %(devid), "usb_mount.png", mount, None, device], "usb_%s_umount" %devid: [ _("Umount USB device %s") %(devid), "usb_umount.png", not mount, None, device] }, device) self.systray.register_action("usb_%s_mount" %devid , self.usb, { "DEVNAME": device, "ACTION": "mount", "ID_FS_TYPE": fstype, "FORCE_MOUNT":True } ) self.systray.register_action("usb_%s_umount" %devid , self.usb, { "DEVNAME": device, "ACTION": "umount", "ID_FS_TYPE": fstype, "FORCE_MOUNT":True } ) ############################################### if not self.mounter_remote(device, fstype, "--mount"): self.show_notification ( _("Error, can't mount device %s") %(device) ) return if device in self.mounted: data['ID_FS_LABEL']=os.path.basename(self.mounted[device]) data['ID_VENDOR']=os.path.basename(self.mounted[device]) if action == "mount": # mount from menu and wait for udev mount event if data.has_key("FORCE_MOUNT") and data["FORCE_MOUNT"]: if not self.mounter_remote(device, fstype, "--mount"): self.show_notification ( _("Error, can't mount device %s") %(device) ) return # remote device is mounted, mount_local and launch filemanager local_mount_point = self.get_local_mountpoint(data) label = os.path.basename(local_mount_point) # mount with fuse and ltspfs if not self.mounter_local(local_mount_point, remote_mnt, device=device, label=label, mode="mount"): return # launch desktop filemanager self.launch_desktop_filemanager(local_mount_point) self.mounted[device]=local_mount_point ########################################## elif action == "remove" or action == "umount": if action == "remove": print_debug ("usb() UNREGISTER SERVICE") self.systray.unregister_device("usb_%s"%devid) if device in self.mounted: local_mount_point=self.mounted[device] label = os.path.basename(local_mount_point) else: print_debug ( "remove_usb() device %s not found in self.mounted" %(device) ) return # umount local fuse # check if fuse is mounted status=self.common.exe_cmd("mount |grep -c %s" %(local_mount_point), verbose=1, background=False, lines=0, cthreads=0 ) if int(status) != 0: self.mounter_local(local_mount_point, remote_mnt, device=device, label=label, mode="umount") # umount remote device # check if remote is mounted (user can umount before from desktop icon) print_debug("usb() GETSTATUS device =%s"%device) status=self.xmlrpc.GetDevicesInfo(device=device, mode="--getstatus") try: status=int(status) if status == 0: print_debug ( "remove_usb() device=%s seems not mounted" %(device) ) self.systray.update_status("usb_%s"%devid, "usb_%s_mount"%devid, True) self.systray.update_status("usb_%s"%devid, "usb_%s_umount"%devid, False) else: if not self.mounter_remote(device, fstype, "--umount"): self.show_notification ( _("Error, can't mount device %s") %(device) ) return except Exception, err: print_debug ( "usb() Exception error %s"%err ) #if device in self.mounted: # del self.mounted[device] #else: # print_debug ( "remove_usb() devive=%s not in self.mounted dictionary" ) def firewire(self, *args): data=args[0] if isinstance(data, tuple): data=args[0][0] print_debug("firewire() data=%s" %data) device=data['DEVNAME'] action=data['ACTION'] if not data.has_key('ID_FS_TYPE'): # we don't have a filesystem only a full device (ex: /dev/sda) if not data.has_key('ID_VENDOR'): vendor="" else: vendor=data['ID_VENDOR'] if not data.has_key('ID_MODEL'): model="" else: model=data['ID_MODEL'] if action == "add": self.show_notification( _("From terminal %(host)s.\nConnected Firewire device %(device)s\n%(vendor)s %(model)s" ) \ %{"host":self.hostname, "device":device, "vendor":vendor, "model":model } ) if action == "remove": self.show_notification( _("From terminal %(host)s.\nDisconnected Firewire device %(device)s\n%(vendor)s %(model)s" ) \ %{"host":self.hostname, "device":device, "vendor":vendor, "model":model } ) return else: # we have a filesystem ex: /dev/sda1 if not data.has_key('ID_FS_TYPE'): fstype="" else: fstype=data['ID_FS_TYPE'] if fstype == "swap" or fstype == "extended": return usb_status=self.xmlrpc.GetDevicesInfo(device=device, mode="--getstatus") if usb_status == "0": mount=True n=1 else: mount=False n=2 # add to menu devid=device.split('/')[2] remote_mnt="/mnt/%s" %(devid) if action == "add" or action == "mount": if action == "add": ########### add Firewire device ############ self.systray.register_device("usb_%s"%devid, _("Firewire device %s") %devid, "usb%s.png"%n, True, { "usb_%s_mount" %devid: [ _("Mount Firewire device %s") %(devid), "usb_mount.png", mount, None, device], "usb_%s_umount" %devid: [ _("Umount Firewire device %s") %(devid), "usb_umount.png", not mount, None, device] }, device) self.systray.register_action("usb_%s_mount" %devid , self.firewire, { "DEVNAME": device, "ACTION": "mount", "ID_FS_TYPE": fstype, "FORCE_MOUNT":True } ) self.systray.register_action("usb_%s_umount" %devid , self.firewire, { "DEVNAME": device, "ACTION": "umount", "ID_FS_TYPE": fstype, "FORCE_MOUNT":True } ) ############################################### if not self.mounter_remote(device, fstype, "--mount"): self.show_notification ( _("Error, can't mount device %s") %(device) ) return if device in self.mounted: data['ID_FS_LABEL']=os.path.basename(self.mounted[device]) data['ID_VENDOR']=os.path.basename(self.mounted[device]) if action == "mount": # mount from menu and wait for udev mount event if data.has_key("FORCE_MOUNT") and data["FORCE_MOUNT"]: if not self.mounter_remote(device, fstype, "--mount"): self.show_notification ( _("Error, can't mount device %s") %(device) ) return # remote device is mounted, mount_local and launch filemanager local_mount_point = self.get_local_mountpoint(data) label = os.path.basename(local_mount_point) # mount with fuse and ltspfs if not self.mounter_local(local_mount_point, remote_mnt, device=device, label=label, mode="mount"): return # launch desktop filemanager self.launch_desktop_filemanager(local_mount_point) self.mounted[device]=local_mount_point ########################################## elif action == "remove" or action == "umount": if action == "remove": print_debug ("firewire() UNREGISTER SERVICE") self.systray.unregister_device("usb_%s"%devid) if device in self.mounted: local_mount_point=self.mounted[device] label = os.path.basename(local_mount_point) else: print_debug ( "remove_firewire() device %s not found in self.mounted" %(device) ) return # umount local fuse # check if fuse is mounted status=self.common.exe_cmd("mount |grep -c %s" %(local_mount_point), verbose=1, background=False, lines=0, cthreads=0 ) if int(status) != 0: self.mounter_local(local_mount_point, remote_mnt, device=device, label=label, mode="umount") # umount remote device # check if remote is mounted (user can umount before from desktop icon) print_debug("firewire() GETSTATUS device =%s"%device) status=self.xmlrpc.GetDevicesInfo(device=device, mode="--getstatus") try: status=int(status) if status == 0: print_debug ( "remove_firewire() device=%s seems not mounted" %(device) ) self.systray.update_status("usb_%s"%devid, "usb_%s_mount"%devid, True) self.systray.update_status("usb_%s"%devid, "usb_%s_umount"%devid, False) else: if not self.mounter_remote(device, fstype, "--umount"): self.show_notification ( _("Error, can't mount device %s") %(device) ) return except Exception, err: print_debug ( "firewire() Exception error %s"%err ) def update_cdrom_usb(self, devid, action=None): #print_debug ("update_cdrom_usb()") device="/dev/%s" %devid if action == "umount": self.show_notification ( _("CDROM USB device %s umounted. You can extract it.") %(devid) ) if action == "mount" or action == "add": self.show_notification ( _("CDROM USB device %s mounted. Ready for use.") %(devid) ) print_debug("update_cdrom_usb() GETSTATUS device=%s action=%s"%(device, action) ) usb_status=self.xmlrpc.GetDevicesInfo(device, mode="--getstatus") if usb_status == "0": ismounted=False n=1 else: ismounted=True n=2 print_debug ("update_cdrom_usb() usb devid=%s ismounted=%s" %(devid, ismounted) ) #self.systray.items["usb_"%devid][1]="usb%s.png"%n self.systray.update_status("usb_%s"%devid, "usb_%s_mount"%devid, not ismounted) self.systray.update_status("usb_%s"%devid, "usb_%s_umount"%devid, ismounted) def update_usb(self, *args): #print_debug ("update_usb()") data=args[0] action=data['ACTION'] if not data.has_key("ID_FS_TYPE"): # don't update if we have disk (only partititions) return if data["ID_FS_TYPE"] == "" or data["ID_FS_TYPE"] == "swap" or data["ID_FS_TYPE"] == "extended": # don't update if fstype is empty (devicesctl.sh and udev put FILESYSTEM always) return device="/dev/%s" %data['DEVPATH'].split('/')[2] if( len( data['DEVPATH'].split('/') ) ) > 3: devid=data['DEVPATH'].split('/')[3] else: devid=data['DEVPATH'].split('/')[2] if action == "umount": self.show_notification ( _("USB device %s umounted. You can extract it.") %(devid) ) if action == "mount": self.show_notification ( _("USB device %s mounted. Ready for use.") %(devid) ) print_debug("update_usb() GETSTATUS device=%s data=%s"%(device, data) ) usb_status=self.xmlrpc.GetDevicesInfo(data['DEVNAME'], mode="--getstatus") if usb_status == "0": ismounted=False n=1 else: ismounted=True n=2 print_debug ("update_usb() usb devid=%s ismounted=%s" %(devid, ismounted) ) #self.systray.items["usb_"%devid][1]="usb%s.png"%n self.systray.update_status("usb_%s"%devid, "usb_%s_mount"%devid, not ismounted) self.systray.update_status("usb_%s"%devid, "usb_%s_umount"%devid, ismounted) def update_firewire(self, *args): #print_debug ("update_firewire()") data=args[0] action=data['ACTION'] if not data.has_key("ID_FS_TYPE"): # don't update if we have disk (only partititions) return if data["ID_FS_TYPE"] == "" or data["ID_FS_TYPE"] == "swap" or data["ID_FS_TYPE"] == "extended": # don't update if fstype is empty (devicesctl.sh and udev put FILESYSTEM always) return device="/dev/%s" %data['DEVPATH'].split('/')[2] if( len( data['DEVPATH'].split('/') ) ) > 3: devid=data['DEVPATH'].split('/')[3] else: devid=data['DEVPATH'].split('/')[2] if action == "umount": self.show_notification ( _("Firewire device %s umounted. You can extract it.") %(devid) ) if action == "mount": self.show_notification ( _("Firewire device %s mounted. Ready for use.") %(devid) ) print_debug("update_firewire() GETSTATUS device=%s data=%s"%(device, data) ) usb_status=self.xmlrpc.GetDevicesInfo(data['DEVNAME'], mode="--getstatus") if usb_status == "0": ismounted=False n=1 else: ismounted=True n=2 print_debug ("update_firewire() usb devid=%s ismounted=%s" %(devid, ismounted) ) #self.systray.items["usb_"%devid][1]="usb%s.png"%n self.systray.update_status("usb_%s"%devid, "usb_%s_mount"%devid, not ismounted) self.systray.update_status("usb_%s"%devid, "usb_%s_umount"%devid, ismounted) def remove_dupes(self, mylist): """ check for duplicate events, kernel sometimes create 3-4 umount events before mounting a device the events are created and diff at max 1 second """ if len(mylist) != 1: have_umount=False have_mount=False umount_index=None nodupes=[] try: nodupes=list(set(mylist)) except: pass # if have ACTION=umount and ACTION=mount and # DEVPATH is the same remove ACTION=umount for event in nodupes: action=self.get_value(event.split('#'), "ACTION") if action == "umount": have_umount=True umount_index=event if action == "mount": have_mount=True if have_mount and have_umount: for i in range(len(nodupes)): if self.get_value(nodupes[i].split('#'), "ACTION") == "umount": #print_debug ( "remove_dupes() Deleting umount ACTION: %s" %nodupes[i] ) del nodupes[i] break mylist=nodupes return mylist def get_value(self, data, key=None): """ returns value of given key, example: data=["ID_BUS=usb", "DEVICE=/dev/sda", "FSTYPE=vfat"] if key="DEVICE" returns "/dev/sda" udev current avalaible keys: "ID_BUS" "DEVNAME" "ACTION" "ID_FS_LABEL" "ID_FS_TYPE" "ID_VENDOR" "ID_MODEL" "DEVPATH" """ #print_debug ( "::==> get_value() searching for \"%s\"" %key ) for uvar in data: if uvar.split('=')[0] == key: print_debug ( "::==> get_value() FOUND key=%s value=%s" %(key, uvar.split('=')[1]) ) return uvar.split('=')[1] # return empty string if not found return "" def get_desktop(self): is_gnome=self.common.exe_cmd("ps ux |grep gnome-panel |grep -c -v grep", verbose=1, background=False, lines=0, cthreads=0 ) is_kde = self.common.exe_cmd("ps ux |grep -e startkde -e kwin |grep -c -v grep", verbose=1, background=False, lines=0, cthreads=0 ) is_xfce= self.common.exe_cmd("ps ux |grep xfce4-panel |grep -c -v grep", verbose=1, background=False, lines=0, cthreads=0 ) try: if int(is_gnome) > 0: return "gnome" elif int(is_kde) > 0: return "kde" elif int(is_xfce) > 0: return "xfce4" except Exception, e: print_debug("Can't read desktop type, error: %s"%e) return "" def launch_desktop_filemanager(self, path=""): if self.desktop == "gnome": cmd="nautilus %s" %(path) elif self.desktop == "kde": if os.path.isfile("/usr/bin/dolphin"): cmd="dolphin %s" %(path) else: cmd="konqueror %s" %(path) elif self.desktop == "xfce4": cmd="Thunar %s" %(path) else: print_debug ( "launch_desktop_filemanager() unknow desktop, not launching filemanager" ) return # exe filemanager in a new thread to not freeze status icon filemanager=threading.Thread(target=self.exec_filemanager, args=[cmd] ) filemanager.start() return def exec_filemanager(self, *args): print_debug("exec_filemanager() args='%s'" %(args[0]) ) self.common.exe_cmd(args[0], verbose=1, background=False, lines=0, cthreads=0 ) def umount_all(self): mounted=self.common.exe_cmd("grep ^ltspfs /proc/mounts |grep -e \"user_id=%s\" -e \"user=%s\" | awk '{print $2}'" %(os.getuid(), pwd.getpwuid(os.getuid())[0]), verbose=1, background=False, lines=0, cthreads=0 ) if isinstance(mounted, str): mounted=[mounted] for mount in mounted: print_debug( "umount_all() umounting %s..." %mount ) self.common.exe_cmd("fusermount -u %s 2>&1" %mount, verbose=1, background=False, lines=0, cthreads=0) self.common.exe_cmd("fusermount -uz %s 2>/dev/null" %mount, verbose=1, background=False, lines=0, cthreads=0) # delete dir try: os.rmdir(mount) except Exception, err: print_debug("umount_all() Exception, error %s"%err) def exit(self): # say udev_daemon loop to quit self.quitting=True self.umount_all() self.mainloop.quit() def run (self): self.mainloop = gobject.MainLoop() try: self.mainloop.run() except KeyboardInterrupt: # listen Ctrl+C self.exit() if __name__ == "__main__": # init app app=TcosDevicesNG() # start gui in a thread tcosdevices=threading.Thread(target=app.run ) tcosdevices.start() # start udev loop while True: try: if app.quitting: break if app.desktop == "": app.desktop=app.get_desktop() app.udev_daemon() time.sleep(3) except KeyboardInterrupt: print ("Get KeyboardInterrupt (udev loop), existing...") app.quitting=True app.mainloop.quit() break # join gui thread tcosdevices.join() sys.exit(0) tcosmonitor/TODO0000664000000000000000000000026112260544373011023 0ustar Todo file for TcosMonitor * Write man pages Obsolete PXES LTSP support * Make better PXES LTSP scripts * avoid using busybox-static in PXES/LTSP (awk, httpd, seq...)