Git Product home page Git Product logo

foreman's Introduction

Foreman cookbook

Cookbook Version Build Status OpenCollective OpenCollective License

Trying to reproduce puppet-foreman_proxy and puppet-foreman with Chef cookbooks.

Installs and configures Foreman and Foreman-smartproxy.

It can:

  • Install and configure Foreman Web ui
  • Install and configure a Foreman Smartproxy with dhcp, bmc, tftp, ...
  • Register smartproxies

Requirements

This cookbook depends on theses external cookbooks:

  • apt
  • apache2
  • ark
  • bind
  • database
  • dhcp
  • git
  • hostname
  • hostsfile
  • mysql
  • postgresql
  • tftp

and requires:

  • Chef > 12
  • Ruby > 1.9

Platform

Currently testing on Ubuntu, Debian.

Usage

Foreman web ui

include_recipe 'foreman'

Install foreman smart proxy

Don't forget to edit attributes to be sure oauth have the same parameters and value as the foreman.

include_recipe 'foreman::proxy'

Attributes

foreman::default

Key Type Description Default
['foreman']['path'] String Foreman installation path /usr/share/foreman
['foreman']['version'] String Foreman version stable
['foreman']['config_path'] String Configuration path /etc/foreman
['foreman']['config']['init'] String Init config path /etc/default/foreman
['foreman']['config']['init_tpl'] String Init config template foreman.default.erb
['foreman']['use_repo'] Boolean Use Foreman repository true
['foreman']['repo']['uri'] String Repository uri http://deb.theforeman.org/
['foreman']['repo']['components'] Array Repository components [stable]
['foreman']['repo']['key'] String Repository key http://deb.theforeman.org/foreman.asc
['foreman']['plugins'] Array Plugins installed via the package manager [foreman-libvirt, ruby-foreman-chef]
['foreman']['server_name'] String Server name to use for apache and fqdn foreman.example
['foreman']['environment'] String Foreman environment production
['foreman']['admin']['username'] String Admin username admin
['foreman']['admin']['password'] String Admin password changeme
['foreman']['admin']['first_name'] String Admin first name nil
['foreman']['admin']['last_name'] String Admin last name nil
['foreman']['admin']['email'] String Admin email nil
['foreman']['initial_organisation'] String Admin organisation nil
['foreman']['initial_location'] String Admin location nil
['foreman']['user'] String System user foreman
['foreman']['group'] String System group foreman
['foreman']['group_users'] Array System groups for foreman user []
['foreman']['db']['manage'] Boolean Manage the database true
['foreman']['db']['install'] Boolean Install the database true
['foreman']['db']['host'] String Database host nil
['foreman']['db']['port'] String Database port nil
['foreman']['db']['adapter'] String Database adapter postgresql
['foreman']['db']['real_adapter'] String Ruby adapter name postgresql
['foreman']['db']['ssl_mode'] Boolean Database in ssl nil
['foreman']['db']['database'] String Database name foreman
['foreman']['db']['username'] String Database username foreman
['foreman']['passenger']['install'] Boolean Install apache passenger mod true
['foreman']['passenger']['high_performance'] Boolean Mod passenger high performance true
['foreman']['passenger']['rack_autodetect'] Boolean Mod passenger rack autodetect false
['foreman']['passenger']['max_pool_size'] Integer Mod passenger max pool size nil
['foreman']['passenger']['pool_idle_time'] Integer Mod passenger pool idle time nil
['foreman']['passenger']['max_requests'] Integer Mod passenger max requests nil
['foreman']['passenger']['stat_throttle_rate'] Integer Mod passenger stat throttle rate nil
['foreman']['passenger']['use_global_queue'] Boolean Mod passenger global queue nil
['foreman']['passenger']['default_ruby'] String Mod passenger default ruby nil
['foreman']['passenger']['prestart'] Boolean Mod passenger prestart true
['foreman']['passenger']['min_instances'] Integer Mod passenger minimum instances 1
['foreman']['passenger']['start_timeout'] Integer Mod passenger start tiemout 600
['foreman']['passenger']['ruby'] String Mod passenger ruby path /usr/bin/ruby
['foreman']['passenger']['package'] String Mod passenger package libapache2-mod-passenger
['foreman']['ssl'] Boolean Foreman in Ssl true
['foreman']['ssl'] Boolean Foreman in Ssl true
['foreman']['ssl_dir'] String Ssl directory /etc/foreman/certs
['foreman']['ssl_ca_file'] String Ssl ca file /etc/foreman/certs/ca.crt
['foreman']['ssl_ca_key_file'] String Ssl ca key file /etc/foreman/certs/ca.key
['foreman']['ssl_cert_file'] String Ssl cert file /etc/foreman/certs/server.crt
['foreman']['ssl_cert_key_file'] String Ssl cert key file /etc/foreman/certs/server.key
['foreman']['ssl_cert_csr_file'] String Ssl cert csr file /etc/foreman/certs/server.csr
['foreman']['unattended'] Boolean Foreman unattented true
['foreman']['authentication'] Boolean Foreman authentication true
['foreman']['locations_enabled'] Boolean Foreman enable locations false
['foreman']['organizations_enabled'] Boolean Foreman enable organizations false
['foreman']['oauth_active'] Boolean Foreman oauth true
['foreman']['oauth_map_users'] Boolean Foreman oauth map users false
['foreman']['oauth_consumer_key'] String Foreman oauth consumer key Random string
['foreman']['oauth_consumer_secret'] String Foreman oauth consumer secret Random string
['foreman']['websockets_encrypt'] Boolean Foreman encrypt websockets true
['foreman']['websockets_ssl_key'] Boolean Foreman websockets ssl key /etc/ssl/certs/foreman.example.pem
['foreman']['websockets_ssl_cert'] Boolean Foreman websockets ssl cert /etc/ssl/privates_keys/foreman.example.pem

foreman::foreman_proxy

Key Type Description Default
['foreman-proxy']['version'] String Foreman proxy version stable
['foreman-proxy']['register'] Boolean Register foreman proxy in foreman true
['foreman-proxy']['config_path'] String Foreman proxy config path /etc/foreman-proxy
['foreman-proxy']['daemon'] Boolean Foreman proxy daemon true
['foreman-proxy']['user'] String Foreman proxy user foreman-proxy
['foreman-proxy']['group'] String Foreman proxy group foreman-proxy
['foreman-proxy']['group_users'] Array System groups for foreman-proxy user []
['foreman-proxy']['plugins'] Array Plugins installed via the package manager for the smartproxy [ruby-smart-proxy-chef]
['foreman-proxy']['log_file'] String Log file /var/log/foreman-proxy/proxy.log
['foreman-proxy']['log_level'] String Log level ERROR
['foreman-proxy']['puppetrun'] Boolean Puppetrun false
['foreman-proxy']['puppetrun_listen_on'] String Puppetrun listen on https
['foreman-proxy']['puppetca'] Boolean Puppetca false
['foreman-proxy']['puppetca_listen_on'] String Puppetca listen on https
['foreman-proxy']['puppet'] Boolean Puppet false
['foreman-proxy']['puppet_home'] String Puppet home directory /var/lib/puppet
['foreman-proxy']['puppet_url'] String Puppet url https://foreman.example:8140
['foreman-proxy']['puppet_use_environement_api'] Boolean Puppet environment api nil
['foreman-proxy']['puppet_autosign_location'] String Puppet autosign location /etc/puppet/autosign.conf
['foreman-proxy']['puppet_group'] String Puppet group puppet
['foreman-proxy']['puppet_ssl_dir'] String Puppet ssl directory /var/lib/puppet/ssl
['foreman-proxy']['puppetssh_sudo'] Boolean Puppet ssh use sudo false
['foreman-proxy']['puppetssh_command'] String Puppet ssh command /usr/bin/puppet agent --ontine --no-usecacheonfailure
['foreman-proxy']['puppetssh_user'] String Puppet ssh user root
['foreman-proxy']['puppetssh_keyfile'] String Puppet ssh key file /etc/foreman-proxy/id_rsa
['foreman-proxy']['puppetssh_wait'] Boolean Puppet ssh wait false
['foreman-proxy']['http'] Boolean Foreman http false
['foreman-proxy']['http_port'] String Foreman http port 8000
['foreman-proxy']['ssl'] Boolean Foreman use ssl true
['foreman-proxy']['https_port'] String Foreman ssl port 8443
['foreman-proxy']['ssl_ca_file'] String Foreman ssl ca file /etc/foreman/certs/ca.crt
['foreman-proxy']['ssl_cert_file'] String Foreman ssl cert file /etc/foreman/certs/server.crt
['foreman-proxy']['ssl_cert_key_file'] String Foreman ssl cert key file /etc/foreman/certs/server.key
['foreman-proxy']['registered_name'] String Foreman proxy registered name foreman.example
['foreman-proxy']['registered_proxy_url'] String Foreman proxy registered url https://foreman.example:8443
['foreman-proxy']['foreman_base_url'] String Foreman base url https://foreman.example
['foreman-proxy']['foreman_ssl_ca'] String Foreman ssl ca /etc/foreman/certs/ca.crt
['foreman-proxy']['foreman_ssl_cert'] String Foreman ssl cert /etc/foreman/certs/server.crt
['foreman-proxy']['foreman_ssl_key'] String Foreman ssl key /etc/foreman/certs/server.key
['foreman-proxy']['trusted_hosts'] Array Foreman proxy trusted hosts [foreman.example]
['foreman-proxy']['api_package'] String Apipie bindings ruby package ruby-apipie-bindings
['foreman-proxy']['dns'] Boolean Install dns server true
['foreman-proxy']['dns_listen_on'] String Dns listen on https
['foreman-proxy']['dns_managed'] Boolean Dns is managed by Chef true
['foreman-proxy']['dns_provider'] String Dns provider nsupdate
['foreman-proxy']['dns_interface'] String Dns interface eth0
['foreman-proxy']['dns_ttl'] String Dns ttl 86400
['foreman-proxy']['dns_server'] String Dns server 127.0.0.1
['foreman-proxy']['dns_realm'] String Dns realm FOREMAN.EXAMPLE
['foreman-proxy']['dns_tsig_keytab'] String Dns tsig keytab /etc/foreman-proxy/dns.keytab
['foreman-proxy']['dns_tsig_principal'] String Dns tsig princial foremanproxy/[email protected]
['foreman-proxy']['dns_keyfile'] String Dns key file /etc/bind/rndc.key
['foreman-proxy']['dns_nsupdate'] String Dns nsupdate dnsutils
['foreman-proxy']['dhcp'] Boolean Proxy use dhcp true
['foreman-proxy']['dhcp_managed'] Boolean Install dhcp server true
['foreman-proxy']['dhcp_key_name'] String Dhcp key name nil
['foreman-proxy']['dhcp_key_secret'] String Dhcp key secret nil
['foreman-proxy']['dhcp_vendor'] String Dhcp vendor isc
['foreman-proxy']['dhcp_config'] String Dhcp config file node['dhcp']['config_file']
['foreman-proxy']['dhcp_leases'] String Dhcp leases files /var/lib/dhcp/dhcpd.leases
['foreman-proxy']['dhcp_interface'] String Dhcp interface eth0
['foreman-proxy']['dhcp_subnet'] String Dhcp subnet Ohai subnet
['foreman-proxy']['dhcp_netmask'] String Dhcp netmask Ohai netmask
['foreman-proxy']['dhcp_broadcast'] String Dhcp broadcast Ohai broadcast
['foreman-proxy']['dhcp_range'] Array Dhcp range []
['foreman-proxy']['dhcp_routers'] Array Dhcp routers [Ohai router]
['foreman-proxy']['dhcp_options'] Array Dhcp options ...
['foreman-proxy']['virsh_network'] String Virsh network default
['foreman-proxy']['bmc'] Boolean As bmc false
['foreman-proxy']['bmc_listen_on'] String Bmc listen on https
['foreman-proxy']['bmc_default_provider'] String Bmc default provider ipmitool
['foreman-proxy']['syslinux']['version'] String Syslinux version 6.03
['foreman-proxy']['syslinux']['url'] String Syslinux url ...
['foreman-proxy']['tftp'] Boolean As TFTP true
['foreman-proxy']['tftp_listen_on'] String TFTP listen on https
['foreman-proxy']['tftp_syslinux_root'] String TFTP syslinux root nil
['foreman-proxy']['tftp_root'] String TFTP root node['tftp']['directory']
['foreman-proxy']['tftp_dirs'] Array TFTP directories [pxelinux.cfg, boot]
['foreman-proxy']['servername'] String TFTP servername nil
['foreman-proxy']['realm'] Boolean As Realm false
['foreman-proxy']['real_listen_on'] String Realm listen on https
['foreman-proxy']['real_provider'] String Realm provider freeipa
['foreman-proxy']['real_keytab'] String Realm keytab /etc/foreman-proxy/freeipa.keytab
['foreman-proxy']['real_principal'] String Realm principal [email protected]
['foreman-proxy']['freeipa_remove_dns'] Boolean Freeipa remove dns true
['foreman-proxy']['oauth_effective_user'] String Oauth effective user admin
['foreman-proxy']['oauth_effective_user'] String Oauth effective user admin
['foreman-proxy']['oauth_consumer_key'] String Oauth consumer key Random password
['foreman-proxy']['oauth_consumer_secret'] String Oauth consumer secret Random password
['foreman-proxy']['templates'] Boolean As templates false
['foreman-proxy']['templates_listen_on'] String Templates listen on https
['foreman-proxy']['chef'] Boolean As Chef true
['foreman-proxy']['chef_authenticate_nodes'] Boolean Use Chef authenticate nodes true
['foreman-proxy']['chef_server_url'] String Chef server url https://chef.example.net
['foreman-proxy']['chef_smartproxy_clientname'] String Chef client name host.example.net
['foreman-proxy']['chef_smartproxy_privatekey'] String Chef client private key /etc/chef/client.pem
['foreman-proxy']['chef_ssl_verify'] Boolean Verify chef ssl connection true
['foreman-proxy']['chef_ssl_pem_file'] String Chef ssl pem file /etc/chef/chef.example.com.pem

Resrouces/Providers

foreman_smartproxy

This LWRP provides and easy way to register or unregister a smartproxy into foreman.

Actions

  • :create, register the smartproxy
  • :remove, unregister the smartproxy

Parameters

  • smartproxy_name: Name of the smartproxy
  • base_url: Base url of foreman web api
  • effective_user: Foreman user
  • consumer_key: Oauth key
  • consumer_secret: Oauth secret
  • url: Url of the smartproxy
  • timeout: Request timeout

foreman_rake

This LWRP reproduces the foreman-rake cli command.

Actions

  • :run, run foreman-rake command

Parameters

  • rake_task: Rake task name
  • environement: Environement variables
  • timeout: Request timeout

foreman_proxy_settings_file

This LWRP enable or disable proxy settings files.

Actions

  • :enable, enable setting file
  • :disable, disable setting file

Parameters

  • module: Module name
  • listen_on: Module listen on which protocol
  • cookbook: Cookbook where is stored the template file
  • path: Path where the file will be created
  • owner: File owner
  • group: File group
  • mode: File mode
  • template_path: Template file path

Authors

Contributors

This project exists thanks to all the people who contribute.

Backers

Thank you to all our backers!

https://opencollective.com/sous-chefs#backers

Sponsors

Support this project by becoming a sponsor. Your logo will show up here with a link to your website.

https://opencollective.com/sous-chefs/sponsor/0/website https://opencollective.com/sous-chefs/sponsor/1/website https://opencollective.com/sous-chefs/sponsor/2/website https://opencollective.com/sous-chefs/sponsor/3/website https://opencollective.com/sous-chefs/sponsor/4/website https://opencollective.com/sous-chefs/sponsor/5/website https://opencollective.com/sous-chefs/sponsor/6/website https://opencollective.com/sous-chefs/sponsor/7/website https://opencollective.com/sous-chefs/sponsor/8/website https://opencollective.com/sous-chefs/sponsor/9/website

foreman's People

Contributors

axelrtgs avatar damacus avatar frzb avatar guilhem avatar kitchen-porter avatar pierrerambaud avatar ramereth avatar renovate[bot] avatar shortdudey123 avatar tas50 avatar xorima avatar xorimabot avatar

Stargazers

 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

foreman's Issues

Missing bind file when using foreman::proxy recipe

Here is the issue:

================================================================================
           Error executing action `run` on resource 'execute[named-checkconf]'
           ================================================================================

           Mixlib::ShellOut::ShellCommandFailed
           ------------------------------------
           Expected process to exit with [0], but received '1'
           ---- Begin output of /usr/sbin/named-checkconf -z /etc/bind/named.conf ----
           STDOUT: zone localhost.localdomain/IN: loaded serial 0
           zone localhost/IN: loaded serial 0
           zone 1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa/IN: loaded serial 0
           zone 1.0.0.127.in-addr.arpa/IN: loaded serial 0
           zone 0.in-addr.arpa/IN: loaded serial 0
       zone foreman.example/IN: loading from master file master/db.foreman.example failed: file not found
           zone foreman.example/IN: not loaded due to errors.
           STDERR: _default/foreman.example/in: file not found
       ---- End output of /usr/sbin/named-checkconf -z /etc/bind/named.conf ----
           Ran /usr/sbin/named-checkconf -z /etc/bind/named.conf returned 1

           Resource Declaration:
           ---------------------
           # In /tmp/kitchen/cache/cookbooks/bind/recipes/default.rb

       121: execute 'named-checkconf' do
           122:   command "/usr/sbin/named-checkconf -z #{node['bind']['conf_file']}"

       124:   notifies :enable, 'service[bind]', :immediately
           125:   notifies :start, 'service[bind]', :immediately
           126:   only_if { ::File.exist?('/usr/sbin/named-checkconf') }
           127: end
           128:

           Compiled Resource:
           ------------------
           # Declared in /tmp/kitchen/cache/cookbooks/bind/recipes/default.rb:121:in `from_file'

           execute("named-checkconf") do
             action [:nothing]
             retries 0
             retry_delay 2
             default_guard_interpreter :execute
             command "/usr/sbin/named-checkconf -z /etc/bind/named.conf"
             backup 5
             returns 0
             declared_type :execute
             cookbook_name "bind"
             recipe_name "default"
         only_if { #code block }
           end

       Recipe: tftp::server
         * service[tftpd-hpa] action restart
       - restart service service[tftpd-hpa]
       Recipe: dhcp::_service
         * service[isc-dhcp-server] action restart

           ================================================================================
       Error executing action `restart` on resource 'service[isc-dhcp-server]'
           ================================================================================

           Mixlib::ShellOut::ShellCommandFailed
           ------------------------------------
           Expected process to exit with [0], but received '1'



           ---- End output of /sbin/start isc-dhcp-server ----
           Ran /sbin/start isc-dhcp-server returned 1

           Resource Declaration:
           ---------------------
           # In /tmp/kitchen/cache/cookbooks/dhcp/recipes/_service.rb

             3: service node['dhcp']['service_name'] do
             4:   supports restart: true, status: true, reload: true
             5:   action [:enable]
         6:   # use upstart on ubuntu > 9.10
         7:   case node['platform']
             8:   when 'ubuntu'
             9:     if node['platform_version'].to_f >= 9.10
        10:       provider Chef::Provider::Service::Upstart
            11:     end
            12:   end

           Compiled Resource:
           ------------------
           # Declared in /tmp/kitchen/cache/cookbooks/dhcp/recipes/_service.rb:3:in `from_file'

           service("isc-dhcp-server") do
         provider Chef::Provider::Service::Upstart
             action [:enable]
         supports {:restart=>true, :status=>true, :reload=>true}
             retries 0
             retry_delay 2
             default_guard_interpreter :default
         service_name "isc-dhcp-server"
             enabled true
         pattern "isc-dhcp-server"
         declared_type :service
             cookbook_name "dhcp"

       end

       Recipe: bind::default
         * service[bind] action reload
           - reload service service[bind]

       Running handlers:
       [2015-12-01T23:08:07+00:00] ERROR: Running exception handlers
       Running handlers complete
       [2015-12-01T23:08:07+00:00] ERROR: Exception handlers complete
       Chef Client failed. 63 resources updated in 07 minutes 17 seconds
       [2015-12-01T23:08:07+00:00] FATAL: Stacktrace dumped to /tmp/kitchen/cache/chef-stacktrace.out
       [2015-12-01T23:08:07+00:00] ERROR: Chef::Exceptions::MultipleFailures
       [2015-12-01T23:08:08+00:00] FATAL: Chef::Exceptions::ChildConvergeError: Chef run process exited unsuccessfully (exit code 1)

Judging from the bind cookbook this cookbook is using, we are missing a template file:

https://github.com/DennisBP/cookbook-bind/blob/master/recipes/default.rb#L121-L134

It's expecting example.org.erb to be present, but it's not present in either cookbook.

Registering Smart-Proxy fails on initial run by using an outdated value as URL

Given this ressource at recipes/proxy_register.rb:

foreman_smartproxy node['foreman-proxy']['registered_name'] do
  base_url node['foreman-proxy']['foreman_base_url']
  consumer_key node['foreman-proxy']['oauth_consumer_key']
  consumer_secret node['foreman-proxy']['oauth_consumer_secret']
  effective_user node['foreman-proxy']['oauth_effective_user']
  url node['foreman-proxy']['registered_proxy_url']
  only_if { node['foreman-proxy']['register'] }
  retries 3
  retry_delay 5
  action :create

This resource currently can not succeed on the first run because url is referring to a derived attribute which is changed after compile time.

Looking at attributes/foreman_proxy.rb shows that:

default['foreman-proxy']['registered_proxy_url'] = "http#{'s' if node['foreman-proxy']['ssl']}://#{node['foreman-proxy']['registered_name']}:#{registered_port}" referred by url is derived from:

default['foreman-proxy']['registered_name'] = node['fqdn']

This node attribute node[fqdn] is changed by the included hostname cookbook during the (initial) run.

I guess a possible solution could be to leverage lazy evaluation of attributes.

Still WIP?

Hi,
just a question, this cookbook is still in work in progress state?

Fix all checks so they pass

๐Ÿ—ฃ๏ธ Foreword

Thank for taking the time to fill this bug report fully. Without it we may not be able to fix the bug, and the issue may be closed without resolution.

๐Ÿ‘ป Brief Description

The checks are not passing.

๐Ÿฅž Cookbook version

Version of the cookbook where you are encountering the issue.

๐Ÿ‘ฉโ€๐Ÿณ Chef-Infra Version

Version of chef-client in your environment.

๐ŸŽฉ Platform details

Operating system distribution and release version. Cloud provider if running in the cloud.

Steps To Reproduce

Steps to reproduce the behavior:

  1. Go to '...'
  2. Click on '....'
  3. Scroll down to '....'
  4. See error

๐Ÿš“ Expected behavior

All of the checks including integration tests pass.

โž• Additional context

Add any other context about the problem here. e.g. related issues or existing pull requests.

Dependency Dashboard

This issue lists Renovate updates and detected dependencies. Read the Dependency Dashboard docs to learn more.

This repository currently has no open or pending branches.

Detected dependencies

github-actions
.github/workflows/ci.yml
  • sous-chefs/.github 3.1.1
  • actions/checkout v4
  • actionshub/chef-install 3.0.0
  • actionshub/test-kitchen 3.0.0
.github/workflows/stale.yml
  • actions/stale v9

  • Check this box to trigger a request for Renovate to run again on this repository

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.