Code Monkey home page Code Monkey logo

ezservermonitor-web's Introduction

eZ Server Monitor (eSM) is a script for monitoring Linux servers. It is available in Bash version and Web application.

eZ Server Monitor `Web

In its Web version eSM is a PHP script that displays on a Web page information such as:

  • System : hostname, OS, kernel version, uptime, last boot date, number of current user(s), server datetime
  • Load average : gauges showing the CPU load with the percentage (1 minute, 5 minutes et 15 minutes)
  • Network usage : displaying the IP address of each network interface with the data transmitted and received
  • CPU : model, frequency, cores number, cache L2, bogomips, temperature
  • Disk usage : table of each mount point with the space available, used and total
  • Memory : table containing the available used and total of RAM
  • Swap : table containing the available used and total of Swap
  • Last login : display last 5 user connections
  • Ping : ping the hosts defined in the configuration file
  • Services : displays the status (up or down) services defined in the configuration file

Several themes are available !

Each block can be reloaded manually.

You can download the last version here. The requirements are simple : a Linux environment, a web server (Apache2, Lighttpd, Nginx, ...) and PHP.

The documentation explains all the parameters of esm.config.json.

Changelog is available here.

View more information on the official website.

ezservermonitor-web's People

Contributors

hbadertscher avatar hutchison avatar nicolas01 avatar shevabam avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

ezservermonitor-web's Issues

Possible login

Hi,
Besides the web interface working perfectly I dont want to make these informations aviable in public. Is there a possibility you can make this accessible only through some kind of login?

~Flam

Auto-refresh

Hello

Is it possible to autorefresh the ezservermonitor-web page?

Cant get it work, just refresh

Hi, is this need php command like exec() ?
because i cant get it work, it just showing service status but not the other status.
thanks!

PHP Notice: A non well formed numeric value

Hi,

I'm getting this in nginx log.

PHP message: PHP Notice: A non well formed numeric value encountered in /home/www/ezservermonitor/libs/swap.php on line 22 PHP message: PHP Notice: A non well formed numeric value encountered in /home/www/ezservermonitor/libs/swap.php on line 27 PHP message: PHP Notice: A non well formed numeric value encountered in /home/www/ezservermonitor/libs/swap.php on line 28" while reading response header from upstream, client: 2.85.5.141, server: domain.com, request: "GET /ezservermonitor/libs/swap.php HTTP/2.0", upstream: "fastcgi://unix:/run/php/php7.2-fpm.sock:", host: "domain.com",

Malformed config file detection

Hello,

Just had a problem with a malformed config file and it took me time to understand why the loaded config was empty.
Maybe you could add an error message if config is empty after loading. You could use the "json_last_error_msg" function to get the problem description.

Thanks for this app anyway.

Add mobile css

I created a file web/css/mobile.css

@media screen and (max-width:1040px) {
    .column-right,.column-left{ float: none; width: 100%; }
}
@media screen and (max-width:500px) {
    .box-content > div { float: none; width: 100%}
}

And added the corresponding reference on the index.php.
Before:
before

After:
after

network mount point

Hi, It's a very good web interface, but I've a little problem.
The network mounts are not displayed.
Is it possible to display the network mount on diskusage?
ex : //192.168.1.1/nas mounted on /mnt/nas/ ?

Thanks

Feature Request

Maybe add a html link to the actual service in each item in the "Services Status" box (if it is a web service)? A quick and dirty hack of "js/esm.js" can implement this for web based services as in the diff below

269c269
<     
---
> 
274c274
<         var $ip = location.host;
---
> 
279c279
<           
---
> 
283c283
<             html += '<td>'+'<a href="http://'+$ip+':'+data[line].port+'">'+data[line].name+'</a></td>';
---
>             html += '<td>'+data[line].name+'</td>';

This can link to web based services running on non-service ports like so:

Screenshot from 2020-07-24 12-24-07

Maybe add a boolean entry in config json for each service that decides whether to include the link or not?

add new feature

running processes and what they are using like ram cpu etc

PHP timezone warning

PHP adds a warning message before the system info JSON, making the System section unable to display.

Warning: date(): It is not safe to rely on the system's timezone settings. You are required to use the date.timezone setting or the date_default_timezone_set() function. In case you used any of those methods and you are still getting this warning, you most likely misspelled the timezone identifier. We selected the timezone 'UTC' for now, but please set date.timezone to select your timezone. in /path/to/ezservermonitor-web/libs/system.php on line 45

Mobile view of "Load Average" panel does not show correctly

The view of the Load panel in the upper-most-right corner does not load as expected when viewing on a mobile device.

Example: I have an iPhone 5S and the numbers beneath the graphs do not show as they should. Not sure how to fix this yet so until I can figure it out I at least wanted to report it. Images attached for reference.


OS Type in eSM`Web

Hi
After I updated my raspberry to the last version it shows N.A instead of OS type in system section.
Regards,

Historical data graphs

Please provide graphs for historical data, like CPU and memory usage over the last minute/hour/day. The monitoring agent could keep running a background process. To make it lightweight, it could use SQLite or a flat file database.

Change language

we should not do so that people can change languages. ???
I like to translate the Danish part

Problem with long filesystem name in disk usage

Hello,
I've noticed that the disk usage cannot display information for some filesystem that are using LVM in my case.
In fact the problem is coming from the df command for which the display is on seperated lines.
Exemple
df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/vg_bigbrother-lv_root
50G 2,0G 45G 5% /
tmpfs 911M 0 911M 0% /dev/shm
/dev/sda1 477M 62M 390M 14% /boot
/dev/mapper/vg_bigbrother-lv_home
94G 60M 89G 1% /home

To resolve this problem I've modified the disk.php file, replacing the line using awk
if (!(exec('/bin/df -T | awk -v c=/bin/df -T | grep -bo "Type" | awk -F: \'{print $2}\' '{print substr($0,c);}' | tail -n +2 | awk '{print $1","$2","$3","$4","$5","$6","$7}'', $df)))
by something using perl
if (!(exec('/bin/df -T --exclude-type=nfs --exclude-type=tmpfs | tail -n +2 | perl -lne 'if (/^\s+(.+?)\s+(.+?)\s+(.+?)\s+(.+?)\s+(.+?%)\s+(.+)\s_/) {print "$mnt,$1,$2,$3,$4,$5,$6"} elsif (/^(.+?)\s+(.+?)\s+(.+?)\s+(.+?)\s+(.+?)\s+(.+?%)\s+(.+)\s_/) {print "$1,$2,$3,$4,$5,$6,$7"} elsif (/^(.+?)\s*$/) { $mnt=$1 }'', $df)))

It can certainly be done by awk but as I don't know ...
Hoping it can help. Anyway thank you for this nice tool that I use since some years now.

Error 404 Not Found

Hi!
I followed the installation protocol, but when I go to http: // {my-ip} / eZServerMonitor I get a 404 error.
Someone to help me?
Thank you

no information populating

I'm running a raspian jessie on a raspi 2 B+. I placed the ezserver files in /var/www/html, with ownership set to root:root. index.php loads when I go to the raspi's ip address but no information is populated in the displays. Any ideas?

Network not displayed

Network interfaces and stats aren't displayed. It seems that the web server requires a login shell which I would avoid to run ifconfig and probably other commands.
Do you think this could be replaced by something else?

I tested as root on Arch Linux to run:

su User -c "php libs/network.php" --> working, result: [{"interface":"eth0","ip":"x.x.x.x","transmit":"197.78 MB","receive":"2.36 GB"},{"interface":"lo","ip":"127.0.0.1","transmit":"97.88 MB","receive":"97.88 MB"}]

su http -c "php libs/network.php" --> not working, returns nothing but exit code 1.

Wrong disk usage

Hi,

The disk usage has some boggus values because I'm using LVM.
First, I had to change the tail command from "tail -n +2" to "tail -n +3" but even after that, the display is wrong :
disk_usage

Here is the result of df command :
df_result

The problem is caused by the "/" mount point having no name ...

Thanks

EDIT : My bad, the problem layed in the df command ... the name of the / mount is displayed on a separate line.

How about Core temperature

Thanks for the last update - favicon looks nice ;)

A core temperature read out in the CPU-panel would be nice
or a separate/coloured temperature panel would be awesome

Have a nice day!

Nginx and Php 7 error

Hello all work fine but i have this error in nginx log. How can we solve this ?

FastCGI sent in stderr: "PHP message: PHP Notice: fwrite(): send of 3 bytes failed with errno=1 Operation not permitted in /var/www/html/ezservermonitor/libs/Utils/Misc.php on line 185" while reading response header from upstream, client:xxxxxxx , server: xxxxxxx, request: "GET /libs/services.php HTTP/2.0", upstream: "fastcgi://unix:/run/php/php7.0-fpm.sock:", host: "xxxxxxxxxxxxx", referrer: "https://xxxxxxxxxx/index.php"

Thanks for all

Ajax reload lot times is loading high CPU

Hi guys,

I'm testing web version of this and I liked a lot, but have one problem, If you press to ajax reload all widgets, causes high load avg on server, similar a DoS, then I think that is good idea to have flag to prevent this.

I tested this on my vps with htop on terminal and web and avg values is correct, then isn't web bug.

Thanks

Floating point error? Possibly?

I'm not much of a php guy, but the lighttpd error log keeps showing this error:

(mod_fastcgi.c.2543) FastCGI-stderr: PHP Notice: A non well formed numeric value encountered in /var/www/ ... /ezservermonitor/libs/memory.php on line 27

Line 27 on memory.php is:

// Percent used
$percent_used = 0;
if ($total > 0)
$percent_used = 100 - (round($free / $total * 100));

Assuming that floating point arithmetic works on php just like any high level dynamically typed programming language, this looks right. So what seems to be the problem???

Closing tcp connection

In script libs/Utils/Misc.php, the scanPort function when protocol = tcp never calls fclose on $handle. It does however do it when protocol is udp.

Shouldn't fclose always be called?

load avg

in load_average.php you are dividing load with number of cores. You shouldn't do that because load avg is not calculated only by cpu usage, but includes many factors. On servers with more than 1 cpu you will get inaccurate value. test it and you will see.

Number of updates available

Is there a possibility of adding the number of package updates available in eSM'Web?
These updates are the ones you see when you do an "apt-get update".

Major CSS code issues

Long story short, the whole CSS is formatting whole tags instead of using classes.

This for example enforces <a> tag to be formatted with display: inline-block; instead of correctly inheriting the parent, etc etc...

Downloading an octect-stream type file instead of displaying

Ok, erm, i guess it should be a 'noob issue' but here's the problem:
I just set up my server (i meaning my dear friend bloginabox. So with nginx, thing that i'm not familiar with...), installed a plugin to show some connections stats but also wanted to have something for the server status (such as cpu/ram/network load, ...). Aaaand here's the prob: whenever i try to access the web interface, i'm tuck on my 404 blog page and asking me if i wanna download an 'octet-stream' type file which seems to conatin the php code........All i wanted was to display the esm'web when i search 'myurl/monit/', simple thing,huh?

It's a success with the shell version but, yknow, web is prettier :D
I know the issue is not really your project but my configs. The thing is i messed up the nginx files a bit too much and i'm lost :(
Have any idea?
ty

Exclude devices from disk view

I've been using esm for quite some time now and it's been really handy. Last week I upgrade to Ubuntu 18.04 and set up Canonical Live Patching. This required me to install snapd. Now snapd has made some virutual disks called /dev/loop0 /dev/loop1 etc. How can I exclude these from displaying in esm?
diskusage

Fatal error: Uncaught LogicException: Failed to parse config file 'esm.config.json'

I get this error,
"Fatal error: Uncaught LogicException: Failed to parse config file 'esm.config.json'. Error: 'State mismatch (invalid or malformed JSON)' in \eZServerMonitor-2.5\libs\Utils\Config.php:27 Stack trace: #0 \eZServerMonitor-2.5\libs\Utils\Config.php(17): Config->_readFile() #1 \eZServerMonitor-2.5\index.php(3): Config->__construct() #2 {main} thrown in \eZServerMonitor-2.5\libs\Utils\Config.php on line 27"

after i made the esm.config.json to this, someone now why. ??

{
    "esm": {
        "version": "2.5",
        "website": "http://www.ezservermonitor.com",
        "check_updates": true,
        "auto_refresh": 0,
        "theme": "dark",
        "custom_title": ""
    },
    
    "cpu": {
        "enable_temperature": true
    },
    
    "disk": {
        "show_tmpfs": false,
        "show_loop": false,
        "show_filesystem": true,
        "ignore_mounts": []
    },
    
    "ping": {
        "hosts": [
            "facebook.com",
            "google.com",
            "yahoo.com"
        ]
    },
    
    "last_login": {
        "enable": true,
        "max": 5
    },
    
    "services": {
        "show_port": true,
        "list": [
            {
                "name": "Pi00 - SSH",
                "host": "192.168.0.4",
                "port": 22,
                "protocol": "tcp"
            },
            {
                "name": "Pi00 - Web Server",
                "host": "192.168.0.4",
                "port": 80,
                "protocol": "tcp"
            },
            {
                "name": "Pi00 - Desktop Remote",
                "host": "192.168.0.4",
                "port": 3389,
                "protocol": "tcp"
        ]
    },
    
    "pi01services": {
        "show_port": true,
        "list": [
            {
                "name": "Pi01 - SSH",
                "host": "192.168.0.5",
                "port": 23,
                "protocol": "tcp"
            },
            {
                "name": "Pi01 - Maria SQL",
                "host": "192.168.0.5",
                "port": 3306,
                "protocol": "tcp"
            },
            {
                "name": "Pi01 - Desktop Remote",
                "host": "192.168.0.5",
                "port": 3390,
                "protocol": "tcp"
            }
        ]
    }
}

My esm.js i have remember to set this line to

esm.pi01getServices = function() {

    var module = 'pi01services';
    
    esm.reloadBlock_spin(module);

    $.get('libs/'+module+'.php', function(data) {

        var $box = $('.box#esm-'+module+' .box-content tbody');
        $box.empty();

        for (var line in data)
        {
            var label_color  = data[line].status == 1 ? 'success' : 'error';
            var label_status = data[line].status == 1 ? 'online' : 'offline';

            var html = '';
            html += '<tr>';
            html += '<td class="w15p"><span class="label '+label_color+'">'+label_status+'</span></td>';
            html += '<td>'+data[line].name+'</td>';
            html += '<td class="w15p">'+data[line].port+'</td>';
            html += '</tr>';

            $box.append(html);
        }
    
        esm.reloadBlock_spin(module);

    }, 'json');

}

and

    esm.pi01getServices();

and

    pi01services: esm.pi01getServices

My pi01service.php

<?php
require '../autoload.php';
$Config = new Config();


$datas = array();

$available_protocols = array('tcp', 'udp');

$show_port = $Config->get('pi01services:show_port');

if (count($Config->get('pi01services:list')) > 0)
{
    foreach ($Config->get('pi01services:list') as $pi01service)
    {
        $host     = $pi01service['host'];
        $port     = $pi01service['port'];
        $name     = $pi01service['name'];
        $protocol = isset($pi01service['protocol']) && in_array($pi01service['protocol'], $available_protocols) ? $pi01service['protocol'] : 'tcp';

        if (Misc::scanPort($host, $port, $protocol))
            $status = 1;
        else
            $status = 0;

        $datas[] = array(
            'port'      => $show_port === true ? $port : '',
            'name'      => $name,
            'status'    => $status,
        );
    }
}


echo json_encode($datas);

and i have made this ind index.php

        <div class="box column-right column-33" id="esm-services">
            <div class="box-header">
                <h1>PI01 Services status</h1>
                <ul>
                    <li><a href="#" class="reload" onclick="esm.reloadBlock('pi01services');"><span class="icon-cycle"></span></a></li>
                </ul>
            </div>

            <div class="box-content">
                <table>
                    <tbody></tbody>
                </table>
            </div>
        </div>

Hope someone can help me :-)

iperf3 Bandwidth Test Module?

If I write a module which used iperf3 to test the bandwidth from the server to a remote server, would you take pull request?

Database online status

Great project!

But, if we use MariaDB with "skip-networking" in "my.cnf" (only local) - daemon in "SRVICES STATUS" allways offline. Have this in config this: {"name": "MariaDB (mysql)", "host": "localhost", "port": 3306}.

Can you fix this?

Sequence of CPU load from mobile

The sequence of CPU load from mobile seems to be 1 min, 15 min and 5 min which is different from what seen on a desktop browser. I tried both Chrome and Firefox on Android. In the desktop, the sequence is 1 min, 5 min and 15 min which makes more sense.

Example: Screenshot hosted in Imgur.

Displaying SMART data

I just download the new 2.5 version.
So, I have a suggestion. Why do not display SMART data like disk temperature ?

thank for your work

CPU Temperature, Network usage and Ping not working

Debian 8, PHP 5.6.38, Apache 2.4.10, sensors 3.3.5 with libsensors 3.3.5

Like the title says, my CPU Temp, Network usage and Ping sections are not working.

However on eSM'sh they all work fine. Also sensors are configured and work fine in terminal.

temp
network usage
ping

sh
temp
sensors

Not sure where I should start debugging this...

Parsing issue from ifconfig with eth0:0

Hello,

On the web page I have no network interface listed (N/A).

Here the result of "ifconfig" command (without lo) on my Ubuntu 12.04.

eth0 Link encap:Ethernet HWaddr 00:00:00:00:00:00
inet adr:195.154.xxx.yy Bcast:195.154.252.255 Masque:255.255.255.0
adr inet6: zzzz::zzz:zzzz:zzzz:zzzz/zz Scope:Lien
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
Packets reçus:6681 erreurs:0 :173814 overruns:0 frame:0
TX packets:3879 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 lg file transmission:1000
Octets reçus:567985 (567.9 KB) Octets transmis:2054790 (2.0 MB)
Interruption:16 Mémoire:da000000-da012800

eth0:0 Link encap:Ethernet HWaddr 00:00:00:00:00:00
inet adr:88.190.xx.yy Bcast:0.0.0.0 Masque:255.255.255.255
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
Interruption:16 Mémoire:da000000-da012800

PHP Warning

Hi,
The page is working well, but nginx report some no blocking errors and warnings.

2017/10/06 15:41:23 [error] 2330#2330: *7674 FastCGI sent in stderr: "PHP message: PHP Notice:  A non well formed numeric value encountered in ./libs/load_average.php on line 17" while reading response header from upstream, client: 128.***.***.***, server: azlux.fr, request: "GET /****/libs/load_average.php HTTP/2.0", upstream: "fastcgi./unix:/run/php/php7.1-fpm.sock:", host: "azlux.fr", referrer: "https./azlux.fr/******/"
2017/10/06 15:41:23 [error] 2330#2330: *7674 FastCGI sent in stderr: "PHP message: PHP Notice:  A non well formed numeric value encountered in ./libs/cpu.php on line 59" while reading response header from upstream, client: 128.***.***.***, server: azlux.fr, request: "GET /****/libs/cpu.php HTTP/2.0", upstream: "fastcgi./unix:/run/php/php7.1-fpm.sock:", host: "azlux.fr", referrer: "https./azlux.fr/******/"
2017/10/06 15:41:23 [error] 2330#2330: *7674 FastCGI sent in stderr: "PHP message: PHP Notice:  A non well formed numeric value encountered in ./libs/memory.php on line 22
PHP message: PHP Notice:  A non well formed numeric value encountered in ./libs/memory.php on line 27
PHP message: PHP Notice:  A non well formed numeric value encountered in ./libs/memory.php on line 33" while reading response header from upstream, client: 128.***.***.***, server:azlux.fr, request: "GET /****/libs/memory.php HTTP/2.0", upstream: "fastcgi./unix:/run/php/php7.1-fpm.sock:", host: "azlux.fr", referrer: "https./azlux.fr/******/"
2017/10/06 15:41:23 [error] 2330#2330: *7674 FastCGI sent in stderr: "PHP message: PHP Notice:  A non well formed numeric value encountered in ./libs/swap.php on line 17
PHP message: PHP Notice:  A non well formed numeric value encountered in ./libs/swap.php on line 17
PHP message: PHP Notice:  A non well formed numeric value encountered in ./libs/swap.php on line 27
PHP message: PHP Notice:  A non well formed numeric value encountered in ./libs/swap.php on line 28" while reading response header from upstream, client: 128.***.***.***, server: azlux.fr, request: "GET /****/libs/swap.php HTTP/2.0", upstream: "fastcgi./unix:/run/php/php7.1-fpm.sock:", host: "azlux.fr", referrer: "https./azlux.fr/******/"
2017/10/06 15:41:23 [error] 2330#2330: *7674 FastCGI sent in stderr: "PHP message: PHP Notice:  A non well formed numeric value encountered in ./libs/Utils/Misc.php on line 92
PHP message: PHP Notice:  A non well formed numeric value encountered in ./libs/Utils/Misc.php on line 92
PHP message: PHP Notice:  A non well formed numeric value encountered in ./libs/Utils/Misc.php on line 101" while reading response header from upstream, client: 128.***.***.***, server: azlux.fr, request: "GET /****/libs/system.php HTTP/2.0", upstream: "fastcgi./unix:/run/php/php7.1-fpm.sock:", host: "azlux.fr", referrer: "https./azlux.fr/******/"

I use :

  • nginx version: nginx/1.10.3
  • php-fpm 7.1.70-1

Az

Truncated /bin/df gives 0

Great work here but found that if disk mounts have long names, the case of LVM's the output is zero.

In order to fix the correct output I add '--portability' to the df command in disk.php.

From Man Page:

-P' --portability'
Use the POSIX output format. This is like the default format
except for the following:

   1. The information about each filesystem is always printed on
      exactly one line; a mount device is never put on a line by
      itself.  This means that if the mount device name is more
      than 20 characters long (e.g., for some network mounts), the
      columns are misaligned.

   2. The labels in the header output line are changed to conform
      to POSIX.

Ubuntu 16.04 support

I just upgraded from 14.04 to 16.04 tonight and realized that ESM doesn't seem to load on it. I'm greeted with a completely blank page.

At first I thought it must be php7.4 that is packaged with 16.04, so I removed it and added php5.6 through a repository, with no changes.

I have grown quite attached to using this page as a quick monitoring tool and am curious how I can help to expedite support!

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.