Используем Gmail в качестве внешнего фильтра для корпоративной почты Виктор Венявский info, Алексей, Федоров, password1 dns, Константин, Сергеев, password2 tar -xzvf fetchmail-xx.tgz cd fetchmail-xx ./configure make make install poll pop3-servername proto protocol: user "pop username" password "password" options ssl to local_username here nokeep set syslog poll pop.gmail.com proto pop3: user "info@domain.tld" password "password1" options ssl to info here poll pop.gmail.com proto pop3: user "dns@domain.tld" password "password2" options ssl to dns here #!/bin/sh # chkconfig: 2345 55 25 # description: fetchmail daemon case "$1" in start) echo -n "Starting: fetchmail" /usr/bin/fetchmail -f /etc/fetchmailrc -D domain_name -d interval -v echo "." ;; stop) echo -n "Stopping service: fetchmail" killall fetchmail echo "." ;; restart) $0 stop sleep 2 $0 start ;; *) echo "Usage: /etc/init.d/fetchmail {start|stop|restart}" >&2 exit 1 ;; esac exit 0 /etc/init.d/fetchmail start chkconfig fetchmail on IN MX 1 ASPMX.L.GOOGLE.COM. IN MX 5 ALT1.ASPMX.L.GOOGLE.COM. IN MX 5 ALT2.ASPMX.L.GOOGLE.COM. IN MX 10 ASPMX2.GOOGLEMAIL.COM. IN MX 10 ASPMX3.GOOGLEMAIL.COM. IN MX 10 ASPMX4.GOOGLEMAIL.COM. IN MX 10 ASPMX5.GOOGLEMAIL.COM. #!/usr/bin/perl use strict; my $local_domain = 'domain.tld'; my @emails; open(F, "users.csv") || die "can not open users.csv"; my @emails=; chomp(@emails); close(F); foreach my $i(@emails) { my ($email,$fname,$lname,$password) = split(/\,/,$i); open(M, "| mail -s gmail-test $email\@$local_domain"); print M "gmail-test\n"; close(M); } 01. #!/usr/bin/perl 02. use Net::POP3; 03. use strict; 04. my $pop3_host = 'pop3.domain.tld'; 05. my $local_domain = 'domain.tld'; 06. my @emails; 07. open(F, "users-list.csv") || die "can not open users-list.csv"; 08. my @emails=; 09. chomp(@emails); 10. close(F); 11. foreach my $i(@emails) 12. { 13. my ($email,$fname,$lname,$password) = split(/\,/,$i); 14. my $pop_username=$email; 15. $pop_username .= '@' . $local_domain; 16. print "testing $email with $password\n"; 17. my $pop = Net::POP3->new($pop3_host, Timeout => 60); 18. if ($pop->login($pop_username, $password) > 0) 19. { 20. my $msgnums = $pop->list; 21. foreach my $msgnum (keys %$msgnums) 22. { 23. my $msg = $pop->get($msgnum); 24. if(grep /test/, @$msg){ 25. print "email $email is fine\n"; 26. } 27. else{ 28. print "email $email is bad\n"; 29. } 30. } 31. } 32. else{ 33. print "failed to login to pop3 using $pop_username with password $password\n"; 34. } 35. $pop->quit; 36. } webmail IN CNAME dhs.google.com #!/usr/bin/perl use Net::Ping; use IO::Socket::SSL; use Mail::POP3Client; use strict; my $gmail_host='pop.gmail.com'; my $gmail_port=995; my $attempts=3; my $sleep_between_attempts=60*60; my $domain='domain.tld'; my $admin_email = 'admin@domain.tld'; my $p = Net::Ping->new('icmp'); if(!$p->ping($gmail_host)) { print "Failed to ping $gmail_host\n"; print "Exiting\n"; exit; } my @emails; open(F, "users-list.csv") || die "can not open users-list.csv"; my @emails=; chomp(@emails); close(F); foreach my $i(@emails) { my ($email,$fname,$lname,$password) = split(/\,/,$i); my $succesful=1; foreach(my $j=0;$j<$attempts;$j++) { if(test_pop3account("$email\@$domain",$password)) { $succesful=1; #successful, lets test next last; } else # failed for now, lets do it again a bit later { print "failed to connect to gmail for $email\@$domain.\n"; print "Sleeping for $sleep_between_attempts seconds\n"; sleep($sleep_between_attempts); } } # sending alert to admin if the test has failed # completelly if(!$succesful) { print "Completelly failed for $email\@$domain\n"; open (MAIL, '|/usr/sbin/sendmail -t ') || die "Can't open sendmail service"; print MAIL "To: $admin_email\n"; print MAIL "From: $admin_email\n"; print MAIL "Alert! gmail pop3 is bad for $email\@$domain\n"; print MAIL "\n\nAlert! gmail pop3 is bad for $email\@$domain\n\n"; print MAIL "Please verify\n\n"; close MAIL; } else{ print "Testing for $email\@$domain was successful\n"; } } sub test_pop3account { my ($email, $password) = @_; my $socket = IO::Socket::SSL->new( PeerAddr => $gmail_host, PeerPort => $gmail_port, Proto => 'tcp') || die "No socket!"; my $pop = Mail::POP3Client->new(); $pop->User($email); $pop->Pass($password); $pop->Socket($socket); return $pop->Connect(); } «v=spf1 a:10.10.10.15 include:aspmx.googlemail.com ~all» ----------------------------------------------------------------------------------------------------------------- AXIGEN Mail Server – подходящий почтовый сервер для малого офиса Сергей Яремчук $ tar xzvf axigen-4.0.1.i386.ubuntu.tar.gz $ sudo dpkg -i axigen-4.0.1/axigen_4.0.1-1ubuntu1_i386.deb $ dpkg –iG axigen_4.0.1-1ubuntu1_i386.deb $ sudo /opt/axigen/bin/axigen-cfg-wizard $ sudo /etc/init.d/axigen start $ sudo apt-get install clamav-daemon $ sudo apt-get -f install $ sudo cp /usr/share/doc/clamav-base/examples/clamd.conf /etc/clamav/axigen.conf LogFile /var/log/clamd.axigen PidFile /var/run/clamd.axigen/clamd.pid LocalSocket /var/run/clamd.axigen/clamd.sock User axigen $ sudo ln -s /usr/sbin/clamd /usr/sbin/clamd.axigen $ sudo mkdir -p /var/run/clamd.axigen $ sudo chown axigen:axigen /var/run/clamd.axigen $ sudo cp /etc/init.d/clamav-daemon /etc/init.d/clamd.axigen $ sudo ln -s /etc/init.d/clamd.axigen /etc/rc3.d/S20clamd.axigen # Комментируем строку #. /etc/clamav/clamav-base.init CLAMD_SERVICE=axigen [ ! -d /var/run/clamd.axigen ] && mkdir /var/run/clamd.axigen || true DAEMON=/usr/sbin/clamd.axigen NAME="clamd.axigen" DESC="ClamAV daemon" CLAMAVCONF=/etc/clamav/axigen.conf SUPERVISOR=/usr/bin/daemon SUPERVISORNAME=daemon SUPERVISORPIDFILE="/var/run/clamav/daemon-clamd.pid" $ sudo /etc/init.d/clamd.axigen start $ sudo apt-get install spamassassin ----------------------------------------------------------------------------------------------------------------- Создаем кластер на платформе FalconStor iSCSI Storage Server Геннадий Дмитриев Source = 192.168.131.11 Target = 192.168.131.10 ----------------------------------------------------------------------------------------------------------------- Оцениваем возможности mod_python и mod_perl Алексей Мичурин if (grep {$_ eq 'z'} @a) { if 'z' in a: ----------------------------------------------------------------------------------------------------------------- Библиотека Prototype – ваш путь в Web 2.0 Часть 2: практика Кирилл Сухов Окошки
open window
var Window = Class.create(); Window.prototype = {initialize: function() { var optionIndex = 0; if (arguments.length > 0) { if (typeof arguments[0] == "string" ) { id = arguments[0]; optionIndex = 1; } else id = arguments[0] ? arguments[0].id : null; } ............... if (!id) id = "window_" + new Date().getTime(); this.options = Object.extend({ className: "dialog", blurClassName: null, minWidth: 100, minHeight: 20, resizable: true, closable: true, minimizable: true, maximizable: true, draggable: true, userData: null, showEffect: (Window.hasEffectLib ? Effect.Appear : Element.show), hideEffect: (Window.hasEffectLib ? Effect.Fade : Element.hide), showEffectOptions: {}, hideEffectOptions: {}, effectOptions: null, parent: document.body, title: " ", url: null, onload: Prototype.emptyFunction, width: 200, height: 300, opacity: 1, recenterAuto: true, wiredDrag: false, closeCallback: null, destroyOnClose: false, gridX: 1, gridY: 1 }, arguments[optionIndex] || {}); if (this.options.parent != document.body) this.options.parent = $(this.options.parent); this.element = this._createWindow(id); this.element.win = this; if (this.width && this.height) this.setSize(this.options.width, this.options.height); this.setTitle(this.options.title) Windows.register(this); }, _createWindow: function(id) { var className = this.options.className; var win = document.createElement("div"); win.setAttribute('id', id); win.className = "dialog"; var content; if (this.options.url) content= ""; else content ="
"; var closeDiv = this.options.closable ? "
" : ""; var minDiv = this.options.minimizable ? "
" : ""; var maxDiv = this.options.maximizable ? "
" : ""; var seAttributes = this.options.resizable ? "class='" + className + "_sizer' id='" + id + "_sizer'" : "class='" + className + "_se'"; var blank = "../themes/default/blank.gif"; win.innerHTML = closeDiv + minDiv + maxDiv + "\ \ \ \ \ \ \
"+ this.options.title +"
\ \ \ \ \ \ \
" + content + "
\ \ \ \ \ \ \
\ "; Event.observe($(id + "_content"), "load", this.options.onload); return win; }, var Windows = { windows: [], observers: [], focusedWindow: null, maxZIndex: 0, overlayShowEffectOptions: {duration: 0.5}, overlayHideEffectOptions: {duration: 0.5}, addObserver: function(observer) { this.removeObserver(observer); this.observers.push(observer); }, removeObserver: function(observer) { this.observers = this.observers.reject( function(o) { return o==observer }); }, ... } notify: function(eventName, win) { this.observers.each( function(o) {if(o[eventName]) o[eventName](eventName, win);}); }, getWindow: function(id) { return this.windows.detect(function(d) { return d.getId() ==id }); },notify: function(eventName, win) { this.observers.each( function(o) {if(o[eventName]) o[eventName](eventName, win);}); }, getWindow: function(id) { return this.windows.detect(function(d) { return d.getId() ==id }); }, this.eventMouseDown = this._initDrag.bindAsEventListener(this); this.eventMouseUp = this._endDrag.bindAsEventListener(this); this.eventMouseMove = this._updateDrag.bindAsEventListener(this); this.eventOnLoad = this._getWindowBorderSize.bindAsEventListener(this); this.eventMouseDownContent = this.toFront.bindAsEventListener(this); this.eventResize = this._recenter.bindAsEventListener(this); this.topbar = $(this.element.id + "_top"); this.bottombar = $(this.element.id + "_bottom"); this.content = $(this.element.id + "_content"); Event.observe(this.topbar, "mousedown", this.eventMouseDown); Event.observe(this.bottombar, "mousedown", this.eventMouseDown); Event.observe(this.content, "mousedown", this.eventMouseDownContent); Event.observe(window, "load", this.eventOnLoad); Event.observe(window, "resize", this.eventResize); Event.observe(window, "scroll", this.eventResize); Event.observe(this.options.parent, "scroll", this.eventResize); minimize: function(id, event) { var win = this.getWindow(id) if (win && win.visible) win.minimize(); Event.stop(event); }, minimize: function() { if (this.resizing) return; var r2 = $(this.getId() + "_row2"); if (!this.minimized) { this.minimized = true; var dh = r2.getDimensions().height; this.r2Height = dh; var h = this.element.getHeight() - dh; if (! this.useTop) { var bottom = parseFloat(this.element.getStyle('bottom')); this.element.setStyle({bottom: (bottom + dh) + 'px'}); } } else { this.minimized = false; var dh = this.r2Height; this.r2Height = null; if (this.useLeft && this.useTop && Window.hasEffectLib && Effect.ResizeWindow) { new Effect.ResizeWindow(this, null, null, null, this.height + dh, {duration: Window.resizeEffectDuration}); } else { var h = this.element.getHeight() + dh; this.height += dh; this.element.setStyle({height: h + "px"}) r2.show(); } if (! this.useTop) { var bottom = parseFloat(this.element.getStyle('bottom')); this.element.setStyle({bottom: (bottom - dh) + 'px'}); } this.toFront(); } }, function open_window(id){ win1 = new Window(id, {className: "alphacube", title: "Window1", width:200, height:150, top:200, left:100}); win1.getContent().innerHTML = "

Preved

"; win1.show(); } function next_window(){ win2 = new Window( {className: "spread", title: "Window2",opacity:0.5, width:200, height:150, top:200, left:100}); win2.getContent().innerHTML = "

Preved

"; win2.show(); } win2 = new Window( {className: "spread", title: "samag",opacity:0.5, width:200, height:150, top:200, left:100, url=”http://samag.ru”}); ----------------------------------------------------------------------------------------------------------------- Панель управления хостингом SysCP Сергей Яремчук $ wget –c http://debian.syscp.de/etch/syscp_1.2.16_all.deb $ sudo dpkg-deb --info ./syscp_1.2.16_all.deb $ sudo apt-get apache2-mpm-prefork libapache2-mod-php5 mysql-server postfix-mysql proftpd-mysql libsasl2 courier-authlib courier-authlib-mysql courier-base courier-pop-ssl bind9 php5 php5-mysql php5-cli webalizer $ a2enmod php5 $ cd /var/www $ sudo tar -xzvf syscp-1.2.16.tar.gz $ chown www-data:www-data syscp/lib/userdata.inc.php $ chmod 777 syscp/lib/userdata.inc.php $ sudo echo -e "\nInclude /etc/apache2/sites-available/99_syscp_vhosts.conf" >> /etc/apache2/httpd.conf $ sudo touch /etc/apache2/sites-available/99_syscp_vhosts.conf $ sudo mkdir -p /var/kunden/webs/ $ sudo /etc/init.d/apache2 restart $ sudo touch /etc/bind/syscp_bind.conf $ sudo echo "include \"/etc/bind/syscp_bind.conf\";" >> /etc/bind/named.conf $TTL 1W @ IN SOA ns root ( 2004060501 ; serial 8H ; refresh 2H ; retry 1W ; expiry 11h) ; minimum IN NS ns IN NS ns1.provider.com. IN NS ns2.provider.com. IN MX 10 mail IN A 127.0.0.1 IN MX 10 mail * IN A 127.0.0.1 IN MX 10 mail ns IN A 127.0.0.1 mail IN A 127.0.0.1 IN MX 10 mail $ sudo /etc/init.d/bind9 restart ModulePath /usr/lib/proftpd ModuleControlsACLs insmod,rmmod allow user root ModuleControlsACLs lsmod allow user * #LoadModule mod_ctrls_admin.c LoadModule mod_tls.c LoadModule mod_sql.c LoadModule mod_ldap.c LoadModule mod_sql_mysql.c LoadModule mod_quotatab.c LoadModule mod_quotatab_file.c LoadModule mod_quotatab_ldap.c LoadModule mod_quotatab_sql.c LoadModule mod_radius.c LoadModule mod_wrap.c LoadModule mod_rewrite.c LoadModule mod_ifsession.c DelayEngine off Include /etc/proftpd/modules.conf ServerName "grinder.com FTP Server" ServerType standalone DeferWelcome off MultilineRFC2228 on DefaultServer on ShowSymlinks on AllowOverwrite on TimeoutNoTransfer 600 TimeoutStalled 600 TimeoutIdle 1200 DisplayLogin welcome.msg DisplayFirstChdir .message ListOptions "-l" DenyFilter \*.*/ Port 21 MaxInstances 30 User nobody Group nogroup Umask 022 022 AllowOverwrite on DefaultRoot ~ RequireValidShell off SQLAuthTypes Crypt Plaintext SQLAuthenticate users* groups* # здесь меняем MYSQL_PASSWORD на пароль SQLConnectInfo syscp@127.0.0.1 syscp MYSQL_PASSWORD SQLUserInfo ftp_users username password uid gid homedir shell SQLGroupInfo ftp_groups groupname gid members SQLUserWhereClause "login_enabled = 'y'" SQLLog PASS login SQLNamedQuery login UPDATE "last_login=now(), login_count=login_count+1 WHERE username='%u'" ftp_users SQLLog RETR download SQLNamedQuery download UPDATE "down_count=down_count+1, down_bytes=down_bytes+%b WHERE username='%u'" ftp_users SQLLog STOR upload SQLNamedQuery upload UPDATE "up_count=up_count+1, up_bytes=up_bytes+%b WHERE username='%u'" ftp_users $ sudo /etc/init.d/proftpd restart $ sudo mkdir -p /etc/postfix/sasl $ sudo mkdir -p /var/spool/postfix/etc/pam.d $ sudo mkdir -p /var/spool/postfix/var/run/mysqld $ sudo groupadd -g 2000 vmail $ sudo useradd -u 2000 -g vmail vmail $ sudo mkdir -p /var/kunden/mail/ $ sudo chown -R vmail:vmail /var/kunden/mail/ smtpd_banner = $myhostname ESMTP $mail_name (Ubuntu) biff = no append_dot_mydomain = no myhostname = grinder.com mydomain = grinder.com myorigin = $myhostname mydestination = $myhostname $mydomain localhost localhost.$mydomain mynetworks = 127.0.0.0/8 alias_maps = $alias_database smtpd_recipient_restrictions = permit_mynetworks permit_sasl_authenticated reject_unauth_destination virtual_mailbox_base = /var/kunden/mail/ virtual_mailbox_maps = mysql:/etc/postfix/mysql-virtual_mailbox_maps.cf virtual_mailbox_domains = mysql:/etc/postfix/mysql-virtual_mailbox_domains.cf virtual_alias_domains = virtual_alias_maps = mysql:/etc/postfix/mysql-virtual_alias_maps.cf virtual_uid_maps = static:2000 virtual_gid_maps = static:2000 smtpd_sasl_auth_enable = yes smtpd_sasl_local_domain = $myhostname smtpd_sasl_security_options = noanonymous broken_sasl_auth_clients = yes $ sudo cat > /etc/postfix/mysql-virtual_alias_maps.cf user = syscp # меняем MYSQL_PASSWORD на пароль password = MYSQL_PASSWORD dbname = syscp table = mail_virtual select_field = destination where_field = email additional_conditions = and destination <> '' and destination <> ' ' hosts = 127.0.0.1 $ sudo cat > /etc/postfix/mysql-virtual_mailbox_domains.cf user = syscp # меняем MYSQL_PASSWORD на пароль password = MYSQL_PASSWORD dbname = syscp table = panel_domains select_field = domain where_field = domain additional_conditions = and isemaildomain = '1' hosts = 127.0.0.1 $ sudo cat > /etc/postfix/mysql-virtual_mailbox_maps.cf user = syscp # меняем MYSQL_PASSWORD на пароль password = MYSQL_PASSWORD dbname = syscp table = mail_users select_field = maildir where_field = email hosts = 127.0.0.1 $ sudo cat > /etc/postfix/sasl/smtpd.conf pwcheck_method: auxprop auxprop_plugin: sql mech_list: plain login cram-md5 digest-md5 sql_engine: mysql sql_hostnames: 127.0.0.1 sql_user: syscp # меняем MYSQL_PASSWORD на пароль sql_passwd: MYSQL_PASSWORD sql_database: syscp sql_select: select password from mail_users where username='%u@%r' $ sudo /etc/init.d/postfix restart authmodulelist="authmysql" authmodulelistorig="authcustom authcram authuserdb authldap authmysql authpam" daemons=5 version="" authdaemonvar=/var/run/courier/authdaemon # и на всякий случай? Потом можно будет перевести в 0 DEBUG_LOGIN=1 MYSQL_SERVER 127.0.0.1 MYSQL_USERNAME syscp # меняем MYSQL_PASSWORD на пароль MYSQL_PASSWORD MYSQL_PASSWORD MYSQL_PORT 0 MYSQL_DATABASE syscp MYSQL_USER_TABLE mail_users MYSQL_CRYPT_PWFIELD password_enc MYSQL_UID_FIELD uid MYSQL_GID_FIELD gid MYSQL_LOGIN_FIELD username MYSQL_HOME_FIELD homedir MYSQL_MAILDIR_FIELD maildir $ sudo /etc/init.d/courier-authdaemon restart $ sudo /etc/init.d/courier-pop restart $ sudo echo "*/5 * * * * root /usr/bin/php –q /var/www/syscp/scripts/cronscript.php " >> /etc/crontab $ sudo /etc/init.d/cron restart ----------------------------------------------------------------------------------------------------------------- Создаём COM-компоненты с помощью VBScript Иван Коробко restart.wsc /action:restart Set obj=CreateObject("Detect.Domain") Set obj=CreateObject("Detect.Domain") Obj.Domain = InputBox("Введите имя домена \n (LDAP://DC=Micrisoft.COM)") : Это комментарий файла Это комментарий файла Tlbimp.exe scriptlet.tlb regsvr32.exe /s Set obj = GetObject("script:C:\Example\DDN.wsc") Wscript.Echo obj.LongToDNS("DN=Microsoft,DN=Com" Set obj=createobject("Detect.Domain") Wscript.Echo obj.LongToDNS("DN=Microsoft,DN=Com") -----------------------------------------------------------------------------------------------------------------