Nie jesteś zalogowany.
Jeśli nie posiadasz konta, zarejestruj je już teraz! Pozwoli Ci ono w pełni korzystać z naszego serwisu. Spamerom dziękujemy!
Prosimy o pomoc dla małej Julki — przekaż 1% podatku na Fundacji Dzieciom zdazyć z Pomocą.
Więcej informacji na dug.net.pl/pomagamy/.
cześć,
ostatnio zafascynował mnie protokół xmpp:) i dzisiaj wpadłem na taki pomysł, żeby spróbować zrobić sobie takie coś, co informowałoby mnie o różnych zdarzeniach w systemie właśnie poprzez ten protokół. Bardzo fajna sprawa, może przydatna bardziej dla serwerów, ale z czystej ciekawości chciałbym wiedzieć jak takie coś zrobić :)
Dajmy na to: w momencie, gdy ktoś loguje się na roota na moim systemie to na moje konto jabber wysyłana jest wiadomość o tym logowaniu. Siedzę na innym komputerze, zalogowany do jabbera, i przychodzi mi wiadomość o tym, że ktoś się zalogował na tamten pierwszy komputer.
Można by wstawić linijkę w .bashrc. Tylko jak wysłać samą wiadomość, no bo tak z basha to chyba nie bardzo :> Czy musiałbym pisać jakiegoś bota ? Może jest jakieś gotowe rozwiązanie? Właściwie to chyba to musiałoby być cały czas podłączone do sieci jabbera, tak, żeby nie łączyło się od nowa dla każdego komunikatu. Nie mam pojęcia jak się do tego zabrać, a na forum jest tyle mądrych głów, także liczę, że coś podpowiecie:)
pozdrawiam!
Ostatnio edytowany przez johny (2010-07-27 17:56:44)
Offline
[deb]sendxmpp[/deb]
Offline
No super, coś takiego chciałem :) dzięki
Offline
ewentualnie napisanie bota jabberowego w rubym - 5 linijek na krzyż :) Sam takiego "stworzyłem" w dowolnym momencie mogę go odpytać o stan serwera i kilka innych pierdołek ;)
Offline
a mógłbyś pokazać kod?
Offline
python:
#!/usr/bin/python # -*- coding: UTF-8 -*- import xmpp import dns import urllib import re import codecs from os import system from sys import argv user_jabbera='BOT JID' pass_jabbera='PASS' kodow='UTF-8' zasob='powiadom' jid=xmpp.JID(user_jabbera) user,server,password=jid.getNode(),jid.getDomain(),pass_jabbera conn=xmpp.Client(server,debug=[]) conres=conn.connect() authres=conn.auth(user,password,zasob) conn.sendInitPresence() conn.send(xmpp.Message("ADRESAT",argv[1],typ="chat"))
albo tak jak kto woli :)
Ostatnio edytowany przez Graffi (2010-07-26 15:44:25)
Offline
#!/usr/bin/env ruby require 'rubygems' require 'jabber/bot' # Tworzenie nowego publicznego Jabber::Bot bot = Jabber::Bot.new( :jabber_id => 'jid@domena', :password => 'secret', :master => 'master1@domena', :master => 'master2@domena', :master => 'master3@domena', :is_public => true ) #Dodanie kilku polecen bot.add_command( :syntax => 'info', :description => 'Wyswietl informacje o pamieci oraz czasie zycia', :regex => /^info$/ ){info()} #bot.add_command( # :syntax => 'pilnuj', # :description => 'Wyswietl informacje o pamieci oraz czasie zycia', # :regex => /^pilnuj$/ #){pilnuj()} bot.add_command( :syntax => 'kill PID', :description => 'Zabij proces o podanym PID', :regex => /^kill\s+.+$/, :alias => [ :syntax => 'k PID', :regex => /^k\s+.+$/ ] )do |sender, pid| #system("kill -9 '#{pid}'") mms="Ale zabijanie nie dziala :P" "'#{mms}' Zabilem proces o ID: '#{pid}'" end bot.add_command( :syntax => 'topm <n>', :description => 'Pokaz n procesów zajmujących najwiecej pamięci', :regex => /^topm\s+.+$/, :alias => [ :syntax => 'm <n>', :regex => /^m\s+.+$/ ] )do |sender, count| "'#{topm(count.to_i+1)}'" end bot.add_command( :syntax => 'topc <n>', :description => 'Pokaz n procesow najbardziej obciążających procesor', :regex => /^topc\s+.+$/, :alias => [ :syntax => 'c <n>', :regex => /^c\s+.+$/ ] )do |sender, count| "'#{topm(count.to_i+1)}'" end bot.add_command( :syntax => 'status', :description => 'Pokaż status najważniejszych usług', :regex => /^status$/, :alias => [ :syntax => 's', :regex => /^s$/ ] ){status()} bot.add_command( :syntax => 'who', :description => 'Pokaż zalogowanych uzytkownikow', :regex => /^who$/, :alias => [ :syntax => 'w', :regex => /^w$/ ] ){who()} bot.add_command( :syntax => 'apacz', :description => 'Restart Apache2', :regex => /^apacz$/, :is_public => true ){apacz()} bot.add_command( :syntax => 'last LOGIN', :description => 'Pokaż ostatnie logowania podanego uzytkownia. Aby wyswietlić informacje o wszystkich uzytkownikach jako login należy podać ALL', :regex => /^last\s+.+$/, :is_public => true, :alias => [ :syntax => 'l LOGIN', :regex => /^l\s+.+$/ ] )do |sender, user| "'#{rlast(user)}'" end bot.add_command( :syntax => 'restart USŁUGA', :description => 'Zrestartuj podaną uslugę. Dostępne usługi: httpd, mysql, pgslq, clam, antyspam, ssh, mail, jabber (UWAGA! Przy wyborze opcji jabber utracisz połączenie ze mną!)', :regex => /^restart\s+.+$/, :alias => [ :syntax => 'r USŁUGA', :regex => /^r\s+.+$/ ] )do |sender, user| "" end #### kilka przydatnych i uzywanych funkcji. # N procesow najmocniej obciazajacych procesor def topc(n) return `echo"";ps axo pid,user,size,time,state,cstime,pcpu,cmd --sort=-pcpu |head -n #{n}` end # N procesow zajmujacych najwiecej pamieci def topm(n) return `echo"";ps axo pid,user,size,time,state,cstime,pcpu,cmd --sort=-size |head -n #{n}` end # Status najwazniejszych uslug def status() mysql_status = `/etc/init.d/mysql status` pgsql_status = `/etc/init.d/postgresql-8.3 status` if `ps -C apache2 -o pid= |wc -l`.to_i >=1 httpd_status = "OK" else httpd_status = "Nie dziła" end if `ps -C clamd -o pid=`.to_i > 0 and `ps -C freshclam -o pid=`.to_i > 0 av_status = "OK" else av_status = "Nie dziła" end if `ps -C master -o pid=`.to_i > 0 and `ps -C dovecot -o pid=`.to_i > 0 mail_status = "OK" else mail_status = "Nie działa" end if `ps -C amavisd-new -o pid=`.split.length > 0 antyspam_status = "OK" else antyspam_status = "Nie działa" end if pgsql_status.split[3] == "online" and !mysql_status.split.eql?("MySQLisstopped..") db_status = "OK" else db_status = "Nie działają" end return "HTTP - '#{httpd_status}'\nBazy danych - '#{db_status}'\nAntywirus - '#{av_status}'\nPoczta - '#{mail_status}'\nAntyspam - '#{antyspam_status}'" end def apacz() system("/etc/init.d/apache2 restart") return "Czerwonoskóre byle zrestartowane" end # Najważniejsze informacje o systemie - uptime i zasoby pamięci def info() return `echo"";uptime;free -tom` end # Pokaż zalogowanych użytkowników def who() return `echo"";w` end # ostatnie logowanie użytkownika. def rlast(uzytkownik) if uzytkownik == "ALL" return `echo"";last` else return `echo"";last #{uzytkownik}` end end def restart(usluga) case '#{usluga}' when "ssh" then system("/etc/init.d/ssh restart") when "mysql" then system("/etc/init.d/mysql restart") when "pgsql" then system("/etc/init.d/postgresql-8.3 restart") when "httpd" then system("/etc/init.d/apache2 restart") when "clam" then system("/etc/init.d/clamav-daemon restart") system("/etc/init.d/clamav-freshclam restart") when "antyspam" then system("/etc/init.d/amavis restart") when "mail" then system("/etc/init.d/postfix restart") system("/etc/init.d/dovecot restart") when "jabber" then system("/etc/init.d/ejabberd restart"); end end def pilnuj() for i in 0..2 if i < 1 then if status().split.include?("Nie") then return "Sprawdź czy wysztkie usługi działają. Wydaje mi się że conajmniej jedna nie odpowiada" next end sleep(1) redo end end end # Bring your new bot to life bot.connect
Offline
ok coś sobie z tego wykminie, ewentualnie zostanę przy sendxmpp :)
ps. właśnie postawiłem swój pierwszy serwer ejabberd:) Najwięcej męczyłem się nad podpięciem tego do mysql. Całość stoi na virtualboxie, ale zawsze to ta satysfakcja, że się udało:)
Ostatnio edytowany przez johny (2010-07-27 18:01:01)
Offline
Niech będzie - Górnik się kłania z tej strony ;)
Tlen i Gmail mają takie fajne powiadomienia o poczcie, ktore wyświetlają sie jako pasek z wiadomością lub przez notify, ale nie otwierają okna komunikatora.
Właśnie o taką formę powiadomień mi chodzi.
Jak coś takiego wysyłać, i czy ewentualnie jest jakiś mod/skrypt do Postfixa lub Qmaila, który coś takiego potrafi?
Pozdrawiam
;-)
Offline
Time (s) | Query |
---|---|
0.00013 | SET CHARSET latin2 |
0.00003 | SET NAMES latin2 |
0.00109 | SELECT u.*, g.*, o.logged FROM punbb_users AS u INNER JOIN punbb_groups AS g ON u.group_id=g.g_id LEFT JOIN punbb_online AS o ON o.ident='18.221.167.11' WHERE u.id=1 |
0.00065 | REPLACE INTO punbb_online (user_id, ident, logged) VALUES(1, '18.221.167.11', 1732679377) |
0.00039 | SELECT * FROM punbb_online WHERE logged<1732679077 |
0.00065 | DELETE FROM punbb_online WHERE ident='3.12.34.209' |
0.00050 | SELECT topic_id FROM punbb_posts WHERE id=152693 |
0.00004 | SELECT id FROM punbb_posts WHERE topic_id=17284 ORDER BY posted |
0.00084 | SELECT t.subject, t.closed, t.num_replies, t.sticky, f.id AS forum_id, f.forum_name, f.moderators, fp.post_replies, 0 FROM punbb_topics AS t INNER JOIN punbb_forums AS f ON f.id=t.forum_id LEFT JOIN punbb_forum_perms AS fp ON (fp.forum_id=f.id AND fp.group_id=3) WHERE (fp.read_forum IS NULL OR fp.read_forum=1) AND t.id=17284 AND t.moved_to IS NULL |
0.00007 | SELECT search_for, replace_with FROM punbb_censoring |
0.00183 | SELECT u.email, u.title, u.url, u.location, u.use_avatar, u.signature, u.email_setting, u.num_posts, u.registered, u.admin_note, p.id, p.poster AS username, p.poster_id, p.poster_ip, p.poster_email, p.message, p.hide_smilies, p.posted, p.edited, p.edited_by, g.g_id, g.g_user_title, o.user_id AS is_online FROM punbb_posts AS p INNER JOIN punbb_users AS u ON u.id=p.poster_id INNER JOIN punbb_groups AS g ON g.g_id=u.group_id LEFT JOIN punbb_online AS o ON (o.user_id=u.id AND o.user_id!=1 AND o.idle=0) WHERE p.topic_id=17284 ORDER BY p.id LIMIT 0,25 |
0.00076 | UPDATE punbb_topics SET num_views=num_views+1 WHERE id=17284 |
Total query time: 0.00698 s |