|
Home | Switchboard | Unix Administration | Red Hat | TCP/IP Networks | Neoliberalism | Toxic Managers |
(slightly skeptical) Educational society promoting "Back to basics" movement against IT overcomplexity and bastardization of classic Unix |
News | See also | Recommended Links | logger | Messages Classification | Configuration examples | Etc |
Event correlation | Tips | Horror Stories | Random Findings | Humor | Etc |
|
You could get your syslog.conf to point to a pipe instead of the messages file and then have a job running that reads from the pipe greps out any messages you dont want and then writes any other messages to the messages file! eg :
|
*.info
|/var/adm/syslog.pipe
#!/bin/ksh
cat /var/adm/syslog.pipe | grep -v "denied update from" | while read LINE
do
echo $LINE >>/var/adm/denied_update.log
done
syslog-ng has slightly different sysntax but similar capabilities
On Mon, Dec 20, 1999 at 02:05:47PM -0800, Chris Scheller wrote:
> is it possible to do a destination such as
> destination d {file("| some_script"); }; ?
destination d_prg { program("somescript"); };
or
destination d_pipe { pipe("pipe"); };
and read the messages from the given named pipe.
Martijn Lievaart <[email protected]> writes: > Using Linux syslog, I have the possibility to write the output to a pipe. > I then can read this pipe from a program. > > My question is, what happens when there is no one reading from the pipe. > Informal testing shows that when I write to the pipe myself, it stalls > until the pipe is read. Yet syslog seems to be chucking along. Does it set > some flags on the pipe? Does it increase the buffer? (At least in Debian) the Linux syslogd sets O_NONBLOCK on named pipes and ignores both EAGAIN and short writes. > The main point is, even though it seems to work, syslogging to > files/remote servers continues even when the pipe is not read, would > it stall syslogging in the longer run? So how safe is it to use this > feature? syslogd should not wedge but you will have missing and/or mangled messages if they arrive faster than you can process them. I don't think this is a very reliable way of reading syslog messages unless you have a guarantee the rate will be low enough; tailing a disk file would be safer. -- http://www.greenend.org.uk/rjk/
03-05-05 12:47 PM
Re: Pipes and syslogHello,
Using Linux syslog, I have the possibility to write the output to a pipe.
I then can read this pipe from a program.My question is, what happens when there is no one reading from the pipe.
Informal testing shows that when I write to the pipe myself, it stalls
until the pipe is read. Yet syslog seems to be chucking along. Does it set
some flags on the pipe? Does it increase the buffer?The main point is, even though it seems to work, syslogging to
files/remote servers continues even when the pipe is not read, would it
stall syslogging in the longer run? So how safe is it to use this feature?TIA,
M4
--
Redundancy is a great way to introduce more single points of failure.
Martijn Lievaart <[email protected]> writes: > Using Linux syslog, I have the possibility to write the output to a pipe. > I then can read this pipe from a program. > > My question is, what happens when there is no one reading from the pipe. > Informal testing shows that when I write to the pipe myself, it stalls > until the pipe is read. Yet syslog seems to be chucking along. Does it set > some flags on the pipe? Does it increase the buffer? (At least in Debian) the Linux syslogd sets O_NONBLOCK on named pipes and ignores both EAGAIN and short writes. > The main point is, even though it seems to work, syslogging to > files/remote servers continues even when the pipe is not read, would > it stall syslogging in the longer run? So how safe is it to use this > feature? syslogd should not wedge but you will have missing and/or mangled messages if they arrive faster than you can process them. I don't think this is a very reliable way of reading syslog messages unless you have a guarantee the rate will be low enough; tailing a disk file would be safer. -- http://www.greenend.org.uk/rjk/
Date: Sun, 9 Feb 1997 23:26:46 -0800 (PST)
From: Ian Main, [email protected]
Hi, just going through issue #14 of the linux gazzette, and I noticed the tip on logging *.* to a file
so you can read it in an rxvt in X. I do a similar thing here, but rather than logging to a file, I log
to a pipe (ah ha! Why didn't I think of that? :-) ).Works really well. No disk space used, and you can just use cat to view it, and it scrolls along
nicely.To make a named pipe (FIFO) in /var/log/message-pipe:
mknod -p /var/log/message-pipe
and add this to your /etc/syslog.conf (note the pipe symbol there.) :
*.* |/var/log/message-pipe
and finally, just type:
cat /var/log/message-pipe
Or of course.. you can stick it in a shells script or as the command rxvt runs when it starts.. whatever
you like.Hope you find it useful,
Ian
Named Pipes
This version of syslogd(8) has support for logging output
to named pipes (fifos). A fifo or named pipe can be used
as a destination for log messages by prepending a pipe
symbol (``|'') to the name of the file. This is handy for
debugging. Note that the fifo must be created with the
mkfifo(1) command before syslogd(8) is started.
Subject: Syslog output to a named pipe.
To: None <[email protected]>
From: Dave Burgess <[email protected]>
List: current-users
Date: 07/26/1998 16:51:06I had a requirement for a mkfifo pipe as the input for a program I'm working on. I noticed that our syslogd did not work well with pipes. The program will just hang when trying to open the pipe. I hacked syslogd to be able to use pipes. The fix isn't very robust, does little to no error checking, but it was easy and didn't break syslogd in an appreciable way. One question I have is, is there any interest in such a beast? I'm using it for a 'authlog' scanner for hacker monitoring without having to go through the trouble of keeping the file state available all the time. The other question, of course, is "was there a better way to do it?" -- Dave Burgess Network Engineer - Nebraska On-Ramp, Inc. *bsd FAQ Maintainer / SysAdmin for the NetBSD system in my spare bedroom "Just because something is stupid doesn't mean there isn't someone that doesn't want to do it...."
One of my customers recently had a serious performance issue with one of his installations. Surprisingly, it wasn't even the real applications software itself that had performance issues, but the mechanism used for logging from this application.
So I started to think about the way logging ususally works within a linux-based system.
The server applications can be divided within two groups. One of them logs via syslog(), the other logs directly to it's own files. The logging itself happens synchronously, i.e. blocking the normal code flow until the log line was written. In the case of syslog, it might block because the syslog pipe is full - in case of standalone files, the file/io might take some time to complete.
Even in a multi-threaded or forked model of a network server program, this might pose considerable problems with regard to threads waiting for their log i/o to complete.
Syslog itself might not be as bad, especially since the 2.6.x pipe implementation works with only the minimal necessary amoutn of copying, and supports larger pipe sizes to avoid writer blocking.
Some people however tend to use something like syslogger in order to redirect the log output from programs with no syslog support also into syslog. This means that you have one pipe between your application and syslogger, and another pipe between syslogger and your real syslog daemon.
Comparing this issue with networking is actually not too problematic. In networking, we have packets that are passed from one process to another... with logging it's not a packet but usually one or more lines of text (that is, about 60 to 240 characters per entry).
You don't want to copy this data around and around... and in a lot of installations you'd rather want to use a couple of log lines than to slow down your application just for some statistics that you might collect.
Of course, you don't want to modify any of the existing applications, too - they should just be able to use syslog() calls as usual. OF course you could load a LD_LIBRARY_PRELOAD lib and redirect the syslog() calls, if needed.
So what I came up with, is something like a partially mmap()able pipe. The logging process would log to that pipe like it would with any other file descriptor. Internally, that 'pipe' has a ring buffer of configurable size. The pipe-reader could now mmap() this ring buffer into his address space in order to read the log.
This scheme should have the advantage of not blocking the writer if the pipe is full (it would just wrap around the ring buffer), and it avoids copying the data from some in-kernel pipe buffer into the userspace of the pipe reader.
Did you notice, this now looks perfectly like the DMA ring buffer of your ethernet device and the linux softirq handler ;)
Anyway, as I didn't do any vm / vfs hacking in linux so far, this is not a trivial thing to implement. And I have lots of other work at this point. However, I'd certainly like to investigate the possible performance gains [losses?] of this idea. Comments welcome.
The syslog daemon typically shipped with Unix systems is somewhat inflexible, only providing for logging to text files on the drive. Syslog-ng, as it's name implies, is the "next generation" of syslog daemons. Two of the concepts in syslog-ng that you'll be using are 'templates' for your data, and extremely flexible 'destination' configuration.First, you need to modify the syslog-ng.conf (usually in /etc/syslog-ng or /usr/local/etc/syslog-ng). Add the destination and the template for the Postgres database:
destination d_pgsql { pipe("/tmp/.syslogd.pipe" template("INSERT INTO syslog (ip, facility, priority, level, tag, date,time, program, msg) VALUES ( '$HOST', '$FACILITY', '$PRIORITY', '$LEVEL', '$TAG','$YEAR-$MONTH- $DAY', '$HOUR:$MIN:$SEC', '$PROGRAM', '$MSG' );\n") template-escape(yes) owner("root") group("c-syslog") perm(0660)); };
Keep in mind that this can be used with any SQL client that is available on the system on which you've configured syslog-ng, so make sure that your SQL is valid for that particular RDBMS.
Next, configure the source/destination of the syslog to allow traffic via the network:
source net { udp(); };
Configure this to go to the previously configured destination:
log { source(net); destination(d_pgsql); };
Don't start or restart your running syslog-ng yet.
Script Configuration
On Unix systems, the fifo file type provides a way to ensure that the first amount of data sent into the file comes out first and so on. In this section, you'll create a fifo that will be writable via the syslog-ng process, running as root, and readable by a user in a group to send the syslog data to your RDBMS.Create a user on your system (usually adduser or useradd) and call it c-syslog. It's not absolutely necessary to give the user a password-if no password is set, nobody can log in as that user. Also create a syslog group, and put the c-syslog user into the syslog group.
To create a fifo, use the mkfifo command and run mkfifo /tmp/.syslogd.pipe. Set permissions on the fifo by using chmod 660 /tmp/.syslogd.pipe, then set chown root:syslog /tmp/.syslogd.pipe. Finally, type ls-al /tmp/.syslogd.pipe to make sure it was created properly:
prw-rw---- 1 root c-syslog 0 May 4 13:20 /tmp/.syslogd.pipe
Next, you'll need a simple looping script. Cut and paste these contents and create a file in /usr/local/bin, call it syslog-db.sh, save it, and run chmod 755 syslog-db.sh:
#!/bin/bash PIPE="/tmp/.syslogd.pipe"; if [ -e ${PIPE} ]; then while [ -e ${PIPE} ] do # Edit this line to work with your sql client of choice. /usr/local/pgsql/bin/psql -q -h
syslog < ${PIPE} > /dev/null 2>&1 done else # Since some systems clean out /tmp on bootup, you would # probably want to include the steps to automatically re-create # the fifo here, but since those steps vary a bit, i haven't # included them. Assuming you followed my instructions above # they'd look like this: # mkfifo /tmp/.syslogd.pipe # chmod 660 /tmp/.syslogd.pipe # chown root:syslog /tmp/.syslogd.pipe echo "ERROR: fifo not created in ${PIPE}. Please create." exit(1) fi Change <dbhost> to reflect the host on your network running Postgres. It's important to not restart syslog-ng or start running the looping script mentioned aboveuntil everything is ready.
Stephan Hendl [email protected]
Fri, 02 Jul 2004 08:10:20 +0200
Hi Clayton, wie use ist in slyghtly other way and it writes several gigabytes per dy = in our mysql database. 1) the syslog-ng configuration destination d_ToSysLogDB { pipe("/tmp/syslog.pipe" owner("root") group("root") perm(0640) template("insert into syslog(host,facility,priority,level,tag,date,time,p= rogra m,msg) values ('$HOST','$FACILITY', '$PRIORITY', '$LEVEL', '$TAG','$YEAR-$M= ONTH- $DAY', '$HOUR:$MIN:$SEC', '$PROGRAM', '$MSG' );\n") template-escape(yes)); }; log { source(loghost); destination(d_ToSysLogDB); }; =20 2) there is a script running that takes the data from the pipe and writes = them into the databse #!/bin/bash # if [ -e /tmp/syslog.pipe ]; then while [ -e /tmp/syslog.pipe ] do mysql -u syslog --password=3D<password> syslog -h syslog < /tmp/syslo= g.pipe done else mkfifo /tmp/syslog.pipe while [ -e /tmp/syslog.pipe ] do mysql -u syslog --password=3D<password> -h syslog < /tmp/syslog.pipe done fi 3) Keep in mind that a tail -f on a pipe will take all data out of the = pipe and you cannot write them into a database. Stephan Dr. Stephan Hendl Systemmanagement ----------------------------------- Landesbetrieb f=FCr Datenverarbeitung und Statistik Land Brandenburg Adresse: 14467 Potsdam, Dortustr. 46 Telefon: +49-(0)331 39-471 Fax: +49-(0)331 27548-1187 Mobil: +49-(0)160 90 645 893 EMail: [email protected]=20 Internet: http://www.lds-bb.de=20 >>> [email protected] 01.07.2004 20:02:57 >>> Hi all, I seem to be having trouble getting a mysql pipe working and thought I = would enlist your help. Here's my config: options { use_fqdn(no); keep_hostname(yes); use_dns(no); long_hostnames(off); sync(0); log_fifo_size(1000); # The default action of syslog-ng 1.6.0 is to log a STATS line # to the file every 10 minutes. That's pretty ugly after a while. # Change it to every 12 hours so you get a nice daily update of # how many messages syslog-ng missed (0). stats(43200); }; ############################ # Set up Sources ############################ source src { unix-dgram("/dev/log"); internal(); }; source net { udp(); }; source s_jffnms { unix-dgram("/dev/log"); internal(); udp(); }; # MySQL Logs destination d_jffnms { pipe("/tmp/mysql.pipe" template("INSERT INTO syslog (date, date_logged, host, message) VALUES ('$YEAR-$MONTH-$DAY $HOUR:$MIN:$SEC', NOW\(\), '$FULLHOST', '$MSG');\n") template-escape(yes)); }; destination jffnms_processing { program ("mysql -u jffnms -pjffnms jffnms < /tmp/mysql.pipe"); }; log { source (s_jffnms); #filter (f_jffnms); #if you use it destination (d_jffnms); }; # End When I restart syslog-ng and tail -f /tmp/mysql.pipe nothing comes in (nor are there any database inserts happening). When I do a tcpdump, I do see the event coming into my server, but it = seems as though syslog-ng is just dropping the packet...? Regards, Clayton Dukes CCNA, CCDA, CCNP, CCDP Sr. Network Engineer E Solutions Corp. http://www.esnet.com=20 813.301.2620 (o) 813.545.7373 (c) =20 _______________________________________________ syslog-ng maillist - [email protected]=20 https://lists.balabit.hu/mailman/listinfo/syslog-ng=20 Frequently asked questions at http://www.campin.net/syslog-ng/faq.html=20
It should be ok to run all the time as it will only be avtive when there is
something going out to the pipe file. We have a script running on one of our
very busy boxes to capture certain messages and it does not seem to affect the
box.Gordon.
"TJS52... via solaris-l" <[email protected]> on 01/07/2003 15:14:37
Please respond to [email protected]
To: Gordon Bloxham/HAV/SSE@SSE
cc:Subject: [solaris-l] Re: syslog to ignore certain msg
Archive Page - http://unix.ittoolbox.com/groups/groups.asp?v=solaris-l
I like this programming better than my idea (more sleek and efficient),
however is it necessary to always have it running. Couldn't/Shouldn't you
"cron"
it nightly to remove the "offending" entries (especially if you have fairly
large activity being captured to syslog). This may be a better conversation of
system resources. Thoughts?Thomas Stoffa
> Archive Page - http://unix.ittoolbox.com/groups/groups.asp?v=solaris-l
> You could get your syslog.conf to point to a pipe instead of the messages
> file
> and then have a job running that reads from the pipe greps out any messages
> you
> dont want and then writes any other messages to the messages file!
>
> eg :-
>
> syslog.conf points to /var/adm/syslog.pipe
>
> you do mkfifo -p /var/adm/syslog.pipe
>
> script to always run
>
> #!/bin/ksh
>
> cat /var/adm/syslog.pipe | grep -v "denied update from" | while read LINE
> do
> echo $LINE >>/var/adm/messages done
>
>
> Gordon.
>
>
>
>
> "Ubiquitous Geebles via solaris-l" <[email protected]> on 01/07/2003
> 14:39:13
>
> Please respond to [email protected]
>
> To: Gordon Bloxham/HAV/SSE@SSE
> cc:
>
> Subject: [solaris-l] syslog to ignore certain msg
>
>
>
> Archive Page - http://unix.ittoolbox.com/groups/groups.asp?v=solaris-l
> Morning All!
>
> How can I configure syslog.conf to track 'regular' named messages, but
> ignore one particular one? The
> (*&#$ AD servers and workstations keep trying to update the BIND server,
> and I want syslogd to ignore JUST the:
>
> named: [PID} denied update from (ip.IP.Ip.IP)
>
> messages, which number in the hundreds and thousands of lines in
> /var/adm/messages every day.
>
> Other than downloading logger or checklogs or one of the other logging
> programs, is there a way to do this with syslog.conf?
>
> Thanks in advance.
>
>
> (Yes, I know the ultimate answer. And I have spoken to the AD guys, they
> are updating the builds, but it's going to be months before they clean them
> ALL up...)
>
>
> Ubi Geebles
> Net Goddess (yeah, I trip over my robe sometimes, but remember Goddesses
> have the power to let you live in an eternal migrating puddle of goo, so be
> nice to me! )
>
> _________________________________________________________________
> Add photos to your messages with MSN 8. Get 2 months FREE*.
> http://join.msn.com/?page=features/featuredemail
>
>
> ************ASICs-The Future of Security Technology************
> Make security your strength-with WatchGuard(R)
> http://www.ITtoolbox.com/r/rd.asp?i=249
> ***************************************************************
> *Archives: http://www.OpenITx.com/g/solaris-l.asp
> *Unsubscribe: mailto:[email protected]
> *Terms of Use: http://www.ittoolbox.com/help/termsofuse.htm
> *Copyright (c) ITtoolbox and message author. No redistribution.
Google matched content |
Centralized Syslog Server Using syslog-NG with web Interface using ...
Secure Logging Over a Network Linux Journal
[PDF] An intrusion detection system based in the gathering of Linux ...www.vermeer.org: Centralized syslog-ng to Mysql;
Ensure Network Safety with Centralized Logging
Syslog-ng faqНа сервере с которого поытаем логи (/etc/syslog.conf): mail.* /var/log/maillog mail.* @loger.host.ru На удаленном FreeBSD сервере, принимающем логи syslog должен запускаться без опции -s (для некоторых версий нужно указать опцию -r), удаленные хоcты ограничиваем через "-a ip1 -a ip2", рекомендую прикрыть доступ к 514 UDP порту пакетным фильтром. Пример /etc/syslog.conf: mail.* /var/log/maillog_all # логи со всех серверов +@ # +@ - выборка только для локального хоста mail.* /var/log/maillog +relay1.host.ru mail.* /var/log/maillog_relay1 +relay2.host.ru mail.* /var/log/maillog_relay2 +* # +* - отмена привязки к хосту !popa3d # далее по логи по масте программы. *.* /var/log/pop3log
На Cisco: router(config)# logging x.x.x.x router(config)# logging source-interface fastethernet 0/0 router(config)# logging facility local0 В syslog.conf (syslogd нужно запускать с ключем -r): local0.* /var/log/cisco.log
Society
Groupthink : Two Party System as Polyarchy : Corruption of Regulators : Bureaucracies : Understanding Micromanagers and Control Freaks : Toxic Managers : Harvard Mafia : Diplomatic Communication : Surviving a Bad Performance Review : Insufficient Retirement Funds as Immanent Problem of Neoliberal Regime : PseudoScience : Who Rules America : Neoliberalism : The Iron Law of Oligarchy : Libertarian Philosophy
Quotes
War and Peace : Skeptical Finance : John Kenneth Galbraith :Talleyrand : Oscar Wilde : Otto Von Bismarck : Keynes : George Carlin : Skeptics : Propaganda : SE quotes : Language Design and Programming Quotes : Random IT-related quotes : Somerset Maugham : Marcus Aurelius : Kurt Vonnegut : Eric Hoffer : Winston Churchill : Napoleon Bonaparte : Ambrose Bierce : Bernard Shaw : Mark Twain Quotes
Bulletin:
Vol 25, No.12 (December, 2013) Rational Fools vs. Efficient Crooks The efficient markets hypothesis : Political Skeptic Bulletin, 2013 : Unemployment Bulletin, 2010 : Vol 23, No.10 (October, 2011) An observation about corporate security departments : Slightly Skeptical Euromaydan Chronicles, June 2014 : Greenspan legacy bulletin, 2008 : Vol 25, No.10 (October, 2013) Cryptolocker Trojan (Win32/Crilock.A) : Vol 25, No.08 (August, 2013) Cloud providers as intelligence collection hubs : Financial Humor Bulletin, 2010 : Inequality Bulletin, 2009 : Financial Humor Bulletin, 2008 : Copyleft Problems Bulletin, 2004 : Financial Humor Bulletin, 2011 : Energy Bulletin, 2010 : Malware Protection Bulletin, 2010 : Vol 26, No.1 (January, 2013) Object-Oriented Cult : Political Skeptic Bulletin, 2011 : Vol 23, No.11 (November, 2011) Softpanorama classification of sysadmin horror stories : Vol 25, No.05 (May, 2013) Corporate bullshit as a communication method : Vol 25, No.06 (June, 2013) A Note on the Relationship of Brooks Law and Conway Law
History:
Fifty glorious years (1950-2000): the triumph of the US computer engineering : Donald Knuth : TAoCP and its Influence of Computer Science : Richard Stallman : Linus Torvalds : Larry Wall : John K. Ousterhout : CTSS : Multix OS Unix History : Unix shell history : VI editor : History of pipes concept : Solaris : MS DOS : Programming Languages History : PL/1 : Simula 67 : C : History of GCC development : Scripting Languages : Perl history : OS History : Mail : DNS : SSH : CPU Instruction Sets : SPARC systems 1987-2006 : Norton Commander : Norton Utilities : Norton Ghost : Frontpage history : Malware Defense History : GNU Screen : OSS early history
Classic books:
The Peter Principle : Parkinson Law : 1984 : The Mythical Man-Month : How to Solve It by George Polya : The Art of Computer Programming : The Elements of Programming Style : The Unix Hater’s Handbook : The Jargon file : The True Believer : Programming Pearls : The Good Soldier Svejk : The Power Elite
Most popular humor pages:
Manifest of the Softpanorama IT Slacker Society : Ten Commandments of the IT Slackers Society : Computer Humor Collection : BSD Logo Story : The Cuckoo's Egg : IT Slang : C++ Humor : ARE YOU A BBS ADDICT? : The Perl Purity Test : Object oriented programmers of all nations : Financial Humor : Financial Humor Bulletin, 2008 : Financial Humor Bulletin, 2010 : The Most Comprehensive Collection of Editor-related Humor : Programming Language Humor : Goldman Sachs related humor : Greenspan humor : C Humor : Scripting Humor : Real Programmers Humor : Web Humor : GPL-related Humor : OFM Humor : Politically Incorrect Humor : IDS Humor : "Linux Sucks" Humor : Russian Musical Humor : Best Russian Programmer Humor : Microsoft plans to buy Catholic Church : Richard Stallman Related Humor : Admin Humor : Perl-related Humor : Linus Torvalds Related humor : PseudoScience Related Humor : Networking Humor : Shell Humor : Financial Humor Bulletin, 2011 : Financial Humor Bulletin, 2012 : Financial Humor Bulletin, 2013 : Java Humor : Software Engineering Humor : Sun Solaris Related Humor : Education Humor : IBM Humor : Assembler-related Humor : VIM Humor : Computer Viruses Humor : Bright tomorrow is rescheduled to a day after tomorrow : Classic Computer Humor
The Last but not Least Technology is dominated by two types of people: those who understand what they do not manage and those who manage what they do not understand ~Archibald Putt. Ph.D
Copyright © 1996-2021 by Softpanorama Society. www.softpanorama.org was initially created as a service to the (now defunct) UN Sustainable Development Networking Programme (SDNP) without any remuneration. This document is an industrial compilation designed and created exclusively for educational use and is distributed under the Softpanorama Content License. Original materials copyright belong to respective owners. Quotes are made for educational purposes only in compliance with the fair use doctrine.
FAIR USE NOTICE This site contains copyrighted material the use of which has not always been specifically authorized by the copyright owner. We are making such material available to advance understanding of computer science, IT technology, economic, scientific, and social issues. We believe this constitutes a 'fair use' of any such copyrighted material as provided by section 107 of the US Copyright Law according to which such material can be distributed without profit exclusively for research and educational purposes.
This is a Spartan WHYFF (We Help You For Free) site written by people for whom English is not a native language. Grammar and spelling errors should be expected. The site contain some broken links as it develops like a living tree...
|
You can use PayPal to to buy a cup of coffee for authors of this site |
Disclaimer:
The statements, views and opinions presented on this web page are those of the author (or referenced source) and are not endorsed by, nor do they necessarily reflect, the opinions of the Softpanorama society. We do not warrant the correctness of the information provided or its fitness for any purpose. The site uses AdSense so you need to be aware of Google privacy policy. You you do not want to be tracked by Google please disable Javascript for this site. This site is perfectly usable without Javascript.
Last modified: March 12, 2019