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/.
Użytkownik

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






Admin łajza







Offline
Użytkownik

No super, coś takiego chciałem :) dzięki
Offline




złodziej wirków ]:->
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
Użytkownik

a mógłbyś pokazać kod?
Offline



Użytkownik
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




złodziej wirków ]:->
#!/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.connectOffline
Użytkownik

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







Podobno człowiek...;)








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