GithubHelp home page GithubHelp logo

puppetlabs / puppetlabs-windows_env Goto Github PK

View Code? Open in Web Editor NEW
14.0 38.0 21.0 272 KB

Puppet module for managing Windows environment variables.

Home Page: https://forge.puppet.com/puppet/windows_env

License: Apache License 2.0

Ruby 100.00%
puppet windows-puppet-module hacktoberfest supported module

puppetlabs-windows_env's Introduction

windows_env

Donated by Vox Pupuli

This module manages (system and user) Windows environment variables.

Installation

Install from puppet forge:

puppet module install puppet/windows_env

Install from git (do this in your modulepath):

git clone https://github.com/puppetlabs/puppetlabs-windows_env windows_env

Changes

CHANGELOG.md

Compatibility

This module is currently tested against Puppet 4.10 and latest Puppet 5 releases. You can see the range of supported Puppet versions in the metadata.json.

Usage

Parameters

ensure

Standard ensure, valid values are absent or present. Defaults to present.

variable (namevar)

The name of the environment variable. This will be inferred from the title if not given explicitly. The title can be of either the form {variable}={value} (the fields will be split on the first =) or just {variable}.

value (namevar)

The value of the environment variable. How this will treat existing content depends on mergemode.

user (namevar)

The user whose environment will be modified. Default is undef, i.e. system environment. The user can be local or domain, as long as they have a local profile (typically C:\users\{username} on Vista+). There is no awareness of network profiles in this module; knowing how changes to the local profile will affect a distributed profile is up to you.

separator

How to split entries in environment variables with multiple values (such as PATH or PATHEXT) . Default is ';'.

mergemode

Specifies how to treat content already in the environment variable, and how to handle deletion of variables. Default is insert.

Valid values:

  • clobber
    • When ensure => present, creates a new variable (if necessary) and sets its value. If the variable already exists, its value will be overwritten.
    • When ensure => absent, the environment variable will be deleted entirely.
  • insert
    • When ensure => present, creates a new variable (if necessary) and sets its value. If the variable already exists, the puppet resource provided content will be merged with the existing content. The puppet provided content will be placed at the end, and separated from existing entries with separator. If the specified value is already somewhere in the variable, no change will occur.
    • When ensure => absent, the value provided by the puppet resource will be removed from the environment variable. Other content will be left unchanged. The environment variable will not be removed, even if its contents are blank.
  • prepend
    • Same as insert, except Puppet will ensure the value appears first. If the specified value is already in the variable, but not at the beginning, it will be moved to the beginning. In the case of multiple resources in prepend mode managing the same variable, the values will be inserted in the order of evaluation (the last to run will be listed first in the variable). Note that with multiple prepends on the same resource, there will be shuffling around on every puppet run, since each resource will place its own value at the front of the list when it is run. Alternatively, an array can be provided to value. The relative ordering of the array items will be maintained when they are inserted into the variable, and the shuffling will be avoided.
  • append
    • Same as prepend, except the new value will be placed at (or be moved to) the end of the variable's existing contents rather than the beginning.

type

The type of registry value to use. Default is undef for existing keys (i.e. don't change the type) and REG_SZ when creating new keys.

Valid values:

  • REG_SZ
    • This is a regular registry string item with no substitution.
  • REG_EXPAND_SZ
    • Values of this type will expand '%' enclosed strings (e.g. %SystemRoot%) derived from other environment variables. If you're on a 64-bit system and running 32-bit puppet, be careful here; registry writes may be subject to WoW64 registry redirection shenanigans. This module writes keys with the KEY_WOW64_64KEY flag, which on Windows 7+ (Server 2008 R2) systems will disable value rewriting. Older systems will rewrite certain values. The gory details can be found here: http://msdn.microsoft.com/en-us/library/windows/desktop/aa384232%28v=vs.85%29.aspx .

broadcast_timeout

Specifies how long (in ms) to wait (per window) for refreshes to go through when environment variables change. Default is 100ms. This probably doesn't need changing unless you're having issues with the refreshes taking a long time (they generally happen nearly instantly). Note that this only works for the user that initiated the puppet run; if puppet runs in the background, updates to the environment will not propagate to logged in users until they log out and back in or refresh their environment by some other means.

Examples

    # Title type #1. Variable name and value are extracted from title, splitting on '='.
    # Default 'insert' mergemode is selected and default 'present' ensure is selected,
    # so this will add 'C:\code\bin' to PATH, merging it neatly with existing content.
    windows_env { 'PATH=C:\code\bin': }

    # Title type #2. Variable name is derived from the title, but not value (because there is no '=').
    # This will remove the environment variable 'BADVAR' completely.
    windows_env { 'BADVAR':
      ensure    => absent,
      mergemode => clobber,
    }

    # Title type #3. Title doesn't set parameters (because both 'variable' and 'value' have
    # been supplied manually).
    # This will create a new environment variable 'MyVariable' and set its value to 'stuff'.
    # If the variable already exists, its value will be replaced with 'stuff'.
    windows_env {'random_title':
      ensure    => present,
      variable  => 'MyVariable',
      value     => 'stuff',
      mergemode => clobber,
    }

    # Variables with type => 'REG_EXPAND_SZ' allow other environment variables to be used
    # by enclosing them in percent symbols.
    windows_env { 'JAVA_HOME=%ProgramFiles%\Java\jdk1.6.0_02':
      type => 'REG_EXPAND_SZ',
    }

    # Create an environment variable for 'Administrator':
    windows_env { 'KOOLVAR':
      value => 'hi',
      user  => 'Administrator',
    }

    # Create an environment variable for 'Domain\FunUser':
    windows_env { 'Funvar':
      value => 'Funval',
      user  => 'Domain\FunUser',
    }

    # Creates (if needed) an enviroment variable 'VAR', and sticks 'VAL:VAL2' at
    # the beginning. Separates with : instead of ;. The broadcast_timeout change
    # probably won't make any difference.
    windows_env { 'title':
      ensure            => present,
      mergemode         => prepend,
      variable          => 'VAR',
      value             => ['VAL', 'VAL2'],
      separator         => ':',
      broadcast_timeout => 2000,
    }

    # Exec doStuff.bat whenever environment variable KOOLVAR changes.
    # Note that if you have multiple windows_env resources managing one
    # variable, you'll need to either subscribe to all of them or combine
    # the windows_env resources into one (by passing an array to 'value')
    # and subscribing to that one resource.
    exec { 'C:\doStuff.bat':
      subscribe   => Windows_env['KOOLVAR'],
      refreshonly => true,
    }

Facts

windows_env

A structured fact which lists the following Windows environment variables

  • ALLUSERSPROFILE
  • APPDATA
  • COMMONPROGRAMFILES
  • COMMONPROGRAMFILES(X86)
  • HOME
  • HOMEDRIVE
  • HOMEPATH
  • LOCALAPPDATA
  • PATHEXT
  • PROCESSOR_IDENTIFIER
  • PROCESSOR_LEVEL
  • PROCESSOR_REVISION
  • PROGRAMDATA
  • PROGRAMFILES
  • PROGRAMFILES(X86)
  • PSMODULEPATH
  • PUBLIC
  • SYSTEMDRIVE
  • SYSTEMROOT
  • TEMP
  • TMP
  • USERPROFILE
  • WINDIR

Note that the names will appear as uppercase in the fact, for example the windir environment variable will appears as WINDIR in the fact

Examples

    $app_data = $facts['windows_env']['APPDATA']

    # Output the AppData path in the puppet log
    notify { $app_data: }

Acknowledgements

The puppet-windows-path module by Bastian Krol was the starting point for this module. puppetlabs-windows_env got migrated from badgerious to Vox Pupuli.

License

This codebase is licensed under the Apache2.0 licensing, however due to the nature of the codebase the open source dependencies may also use a combination of AGPL, BSD-2, BSD-3, GPL2.0, LGPL, MIT and MPL Licensing.

Transfer notice

This module was previously maintained by Vox Pupuli. It was migrated to Puppet/Perforce in 2023.

puppetlabs-windows_env's People

Contributors

badgerious avatar bastelfreak avatar cmchoi2000 avatar dhoppe avatar domcleal avatar ekohl avatar ghoneycutt avatar glennsarti avatar igalic avatar jordanbreen28 avatar juniorsysadmin avatar kenyon avatar llowder avatar lucywyman avatar malikparvez avatar maxadamo avatar natemccurdy avatar petems avatar rajat-puppet avatar ramesh7 avatar sandra-thieme avatar skrysmanski avatar tragiccode avatar treydock avatar vinzent avatar wyardley avatar

Stargazers

 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  avatar  avatar  avatar  avatar

puppetlabs-windows_env's Issues

Puppet approved

@badgerious ,

I am reaching out to you on behalf of Puppet in regards to your Puppet Approved module puppet-windows-env on the Puppet Forge. The Puppet Approved criteria is based on the following tenets; quality composition, reliable operation, and active development. Your module has not been updated on the Puppet Forge for over a year, are there any plans to release a new version of the module?

There seems to be a few open pull requests that could be merged. If there has not been a new release of the module on the Puppet Forge or a response in the following 3 months, we may have to revoke your Puppet Approved status. If you are not interested in continuing maintenance of the module, you may consider contacting the open source Puppet community Vox Pupuli. They are always interested in adopting modules. There is more information here https://voxpupuli.org/docs/#migrating-a-module-to-voxpupuli.

I look forward to your response, or a new release on the Puppet Forge.

Regards,
TP Honey
Senior Software Engineer
Puppet Modules Team

Type needs to be enclosed in single quotes to work.

Hello and thank you for this module.

As shown in the examples type is not enclosed in quotes:

windows_env { 'JAVA_HOME=%ProgramFiles%\Java\jdk1.6.0_02':
      type => REG_EXPAND_SZ,
    }

However this throws an error: Evaluation Error: Resource type not found: REG_EXPAND_SZ

Enclosing 'REG_EXPAND_SZ' in quotes works properly.

windows_env { 'JAVA_HOME=%ProgramFiles%\Java\jdk1.6.0_02':
      type => 'REG_EXPAND_SZ',
    }

"Fixes to prevent autoloading on master from failing" don't work

Hi,

running Puppet 3.7.4 as the master, I see messages like the following every now and then, even with v2.2.1:

Error: Could not retrieve catalog from remote server: Error 400 on SERVER: Could not autoload puppet/type/windows_env: Could not autoload puppet/provider/windows_env/windows_env: can't convert Symbol into String.
Could not open library 'libUser32.so': libUser32.so: cannot open shared object file: No such file or directory on node

Prepend, type REG_EXPAND_SZ seems to constantly add to PATH

Greetings-

Thank you for this module! There are a few things though I find troublesome.

First when using the mergemode => prepend, and type REG_EXPAND_SZ. It works find on the initial run. However on subsequent runs this module will continually prepend to variable if it doesn't detect the variable already there, when in reality it was put there on the prior run.

I've got this code

#Add to %JAVA_HOME% to Windows 'Machine' environment
windows_env { 'set_java_home_to_system_default_symlink':
  mergemode => 'clobber',
  variable  => 'JAVA_HOME',
  value     => "$java_base\\${distribution}",
  ensure    => present,
 }

#if (!($::path =~ /%JAVA_HOME\%\\bin/g)) {
windows_env { 'set_system_path_to_java_home':
  mergemode   => prepend,
  variable    => 'PATH',
  type        => 'REG_EXPAND_SZ',
  value       => '%JAVA_HOME%\bin',
  ensure      => present,
  }
#}

I've tried a few alternatives none of which seem to prevent it fun running on future runs if the variable is already there, however they've all been moot.

It seems when the module goes and looks at the PATH in this particular instance, %JAVA_HOME% is expanded and thus this will never be true and never not run. If one was to look puppet node fact $::path %JAVA_HOME% is there unexpanded.

Second/third, is there a reason why this module doesn't honor the puppet standard, 'refreshonly => true, subscribe => Exec['some_previous_class']

Thanks for any input you can provide

Here is the PATH after a few hours of puppet trying to keep things true:

%JAVA_HOME%\bin;C:\JAVA\jdk\bin;C:\JAVA\jdk\bin;C:\JAVA\jdk\bin;C:\JAVA\jdk\bin;C:\JAVA\jdk\bin;C:\JAVA\jdk\bin;C:\JAVA\jdk\bin;C:\JAVA\jdk\bin;C:\JAVA\jdk\bin;C:\JAVA\jdk\bin;C:\JAVA\jdk\bin;C:\JAVA\jdk\bin;C:\JAVA\jdk\bin;C:\JAVA\jdk\bin;C:\JAVA\jdk\bin;C:\JAVA\jdk\bin;C:\JAVA\jdk\bin;C:\JAVA\jdk\bin;C:\JAVA\jdk\bin;C:\JAVA\jdk\bin;C:\JAVA\jdk\bin;C:\JAVA\jdk\bin;C:\JAVA\jdk\bin;C:\JAVA\jdk\bin;C:\JAVA\jdk\bin;C:\JAVA\jdk\bin;C:\JAVA\jdk\bin;C:\JAVA\jdk\bin;C:\JAVA\jdk\bin;C:\JAVA\jdk\bin;C:\JAVA\jdk\bin;C:\JAVA\jdk\bin;C:\JAVA\jdk\bin;C:\JAVA\jdk\bin;C:\JAVA\jdk\bin;C:\JAVA\jdk\bin;C:\JAVA\jdk\bin;C:\JAVA\jdk\bin;C:\JAVA\jdk\bin;C:\JAVA\jdk\bin;C:\JAVA\jdk\bin;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Program Files\Microsoft SQL Server\120\Tools\Binn\;C:\Program Files\Microsoft SQL Server\Client SDK\ODBC\110\Tools\Binn\;C:\Program Files (x86)\Microsoft SQL Server\120\Tools\Binn\;C:\Program Files\Microsoft SQL Server\120\DTS\Binn\;C:\Program Files (x86)\Microsoft SQL Server\120\Tools\Binn\ManagementStudio\;C:\Program Files (x86)\Microsoft SQL Server\120\DTS\Binn\;C:\Program Files\Amazon\cfn-bootstrap\;C:\Program Files\Puppet Labs\Puppet\bin

unable to resolve type 'byte when ensuring absent

Hi,

I've tried different code snippets to see whether this module can remove env variables, but atm, it's getting 'unable to resolve type 'byte' over and over

Error: Could not set 'absent' on ensure: unable to resolve type 'byte' at 89:/etc/puppet/environments/ce_qt/modules/qt5/manifests/windows.pp

So, I've tried even with: https://github.com/voxpupuli/puppet-windows-env/blob/master/tests/init.pp#L73-L77 but still same issue.

Current setup:

  • puppet version: 3.6.2
  • ruby version: ruby 1.8.7 (2013-06-27 patchlevel 374) [i386-mingw32]
  • facter version: 2.0.2
  • OS: Windows 7

Further details:

Debug: Windows_env[REMOVEQTDIR](provider=windows_env): Removing value from environment variable 'QTDIR', or removing variable itself
Error: Could not set 'absent' on ensure: unable to resolve type 'byte' at 89:/etc/puppet/environments/ce_qt/modules/qt5/manifests/windows.pp
Error: Could not set 'absent' on ensure: unable to resolve type 'byte' at 89:/etc/puppet/environments/ce_qt/modules/qt5/manifests/windows.pp
Wrapped exception:
unable to resolve type 'byte'
Error: /Stage[main]/Qt5::Windows/Windows_env[REMOVEQTDIR]/ensure: change from present to absent failed: Could not set 'absent' on ensure: unable to resolve type 'byte' at 89:/etc/puppet/environments/ce_qt/modules/qt5/manifests/windows.pp

Any ideas what's going on?

Cheers

Module does not work under Ruby 2.5

Affected Puppet, Ruby, OS and module versions/distributions

  • Puppet: 6.4.2
  • Ruby: 2.5.3
  • Distribution: (not sure what his means)
  • Module version: mod 'puppet-windows_env', '3.2.0'

How to reproduce (e.g Puppet code you use)

Seemingly any use of the windows_env module; specific example is:

  windows_env { 'CBI_ENV':
    ensure    => present,
    variable  => 'CBI_ENV',
    value     => $domain,
    mergemode => insert,
  }

What are you seeing

errors in the output log (see below)

What behaviour did you expect instead

expect environment variable to be set/updated per standard windows_env functionality

Output log

change from 'absent' to 'present' failed: Could not set 'present' on ensure: uninitialized constant Win32::Registry::KEY_WOW64_64KEY

Did you mean? KEY_WOW64_64KEY (file: /etc/puppetlabs/code/environments/dev/modules/imx_puppet/manifests/imx_apg_app.pp, line: 17)

Source:	/Stage[main]/Imx_puppet::Imx_apg_app/Windows_env[CBI_ENV]/ensureFile:	/etc/puppetlabs/code/environments/dev/modules/imx_puppet/manifests/imx_apg_app.ppLine:	17

Any additional information you'd like to impart

This change in behavior seems consistent with information from the following blog. We actually do have servers with ruby 2.4 where this module is correctly working; the issue appears to be isolated to servers with ruby 2.5

https://blog.bigbinary.com/2017/10/18/ruby-2.5-has-removed-top-level-constant-lookup.html

Inconsistent behavior for duplicate values

Affected Puppet, Ruby, OS and module versions/distributions

  • Puppet: 4.2.1
  • Ruby: ruby 2.1.6p336 (2015-04-13 revision 50298) [x64-mingw32]
  • Distribution: open source
  • Module version: 2.3.0

How to reproduce (e.g Puppet code you use)

When ensure=present, if the variable meets the criteria, i.e., value exists (insert), exists in the beggining (prepend) or exists in the end (append), duplicates won't be removed even if they are present. E.g.:

ensure=present
value=d
mergemode=insert:  VAR="a;d;b;d;c"   => VAR="a;d;b;d;c"
mergemode=prepend: VAR="d;a;d;b;d;c" => VAR="d;a;d;b;d;c"
mergemode=append:  VAR="a;d;b;d;c;d" => VAR="a;d;b;d;c;d"

Duplicates will only be removed if the variable doesn't meet the criteria and its content needs to be re-written, such as in

ensure=present
value=d
mergemode=prepend: VAR="a;d;b;d;c" => VAR="d;a;b;c"
mergemode=append:  VAR="a;d;b;d;c" => VAR="a;b;c;d"

What are you seeing

The module behaviors according to the variable contents, so we never know the outcome for a given client.

What behaviour did you expect instead

I expected it to behave the same way, no matter what the variable content is. It should either keep all duplicates, just changing places as needed for append/prepend; OR always eliminate them.

As we have problems with duplicated paths in PATH, we would love to eliminate duplicates. A parameter that dictates the behavior may also be a solution.

Output log

Any additional information you'd like to impart

User variables

Just started to use your plugin and love it. I am wondering if an enhancement could be done to create/manipulate user variables?

Redefined constant warning from loading 'puppet/util/windows/sid'

Affected Puppet, Ruby, OS and module versions/distributions

  • Puppet: 7.3.0
  • Ruby: 2.7.1
  • Distribution: CentOS 7
  • Module version: 4.0.1

How to reproduce (e.g Puppet code you use)

bolt module add puppet-windows_env

What are you seeing

[root@jewelled-sod ~]# bolt module add puppet-windows_env
Adding module puppet-windows_env to project

  → Resolving module dependencies, this might take a moment

  → Updating project configuration file at /root/bolt-project.yaml

  → Writing Puppetfile at /root/Puppetfile

  → Syncing modules from /root/Puppetfile to /root/.modules

  → Generating type references

The a2mod provider is deprecated, please use apache::mod instead
/opt/puppetlabs/bolt/lib/ruby/gems/2.7.0/gems/puppet-7.4.1/lib/puppet/util/windows/sid.rb:9: warning: already initialized constant Puppet::Util::Windows::SID::ERROR_NONE_MAPPED
/opt/puppetlabs/bolt/lib/ruby/gems/2.7.0/gems/puppet-7.4.1/lib/puppet/util/windows/sid.rb:9: warning: previous definition of ERROR_NONE_MAPPED was here
/opt/puppetlabs/bolt/lib/ruby/gems/2.7.0/gems/puppet-7.4.1/lib/puppet/util/windows/sid.rb:10: warning: already initialized constant Puppet::Util::Windows::SID::ERROR_INVALID_SID_STRUCTURE
/opt/puppetlabs/bolt/lib/ruby/gems/2.7.0/gems/puppet-7.4.1/lib/puppet/util/windows/sid.rb:10: warning: previous definition of ERROR_INVALID_SID_STRUCTURE was here
/opt/puppetlabs/bolt/lib/ruby/gems/2.7.0/gems/puppet-7.4.1/lib/puppet/util/windows/sid.rb:13: warning: already initialized constant Puppet::Util::Windows::SID::Null
/opt/puppetlabs/bolt/lib/ruby/gems/2.7.0/gems/puppet-7.4.1/lib/puppet/util/windows/sid.rb:13: warning: previous definition of Null was here
/opt/puppetlabs/bolt/lib/ruby/gems/2.7.0/gems/puppet-7.4.1/lib/puppet/util/windows/sid.rb:14: warning: already initialized constant Puppet::Util::Windows::SID::Nobody
/opt/puppetlabs/bolt/lib/ruby/gems/2.7.0/gems/puppet-7.4.1/lib/puppet/util/windows/sid.rb:14: warning: previous definition of Nobody was here
/opt/puppetlabs/bolt/lib/ruby/gems/2.7.0/gems/puppet-7.4.1/lib/puppet/util/windows/sid.rb:15: warning: already initialized constant Puppet::Util::Windows::SID::World
/opt/puppetlabs/bolt/lib/ruby/gems/2.7.0/gems/puppet-7.4.1/lib/puppet/util/windows/sid.rb:15: warning: previous definition of World was here
/opt/puppetlabs/bolt/lib/ruby/gems/2.7.0/gems/puppet-7.4.1/lib/puppet/util/windows/sid.rb:16: warning: already initialized constant Puppet::Util::Windows::SID::Everyone
/opt/puppetlabs/bolt/lib/ruby/gems/2.7.0/gems/puppet-7.4.1/lib/puppet/util/windows/sid.rb:16: warning: previous definition of Everyone was here
/opt/puppetlabs/bolt/lib/ruby/gems/2.7.0/gems/puppet-7.4.1/lib/puppet/util/windows/sid.rb:17: warning: already initialized constant Puppet::Util::Windows::SID::Local
/opt/puppetlabs/bolt/lib/ruby/gems/2.7.0/gems/puppet-7.4.1/lib/puppet/util/windows/sid.rb:17: warning: previous definition of Local was here
/opt/puppetlabs/bolt/lib/ruby/gems/2.7.0/gems/puppet-7.4.1/lib/puppet/util/windows/sid.rb:18: warning: already initialized constant Puppet::Util::Windows::SID::Creator
/opt/puppetlabs/bolt/lib/ruby/gems/2.7.0/gems/puppet-7.4.1/lib/puppet/util/windows/sid.rb:18: warning: previous definition of Creator was here
/opt/puppetlabs/bolt/lib/ruby/gems/2.7.0/gems/puppet-7.4.1/lib/puppet/util/windows/sid.rb:19: warning: already initialized constant Puppet::Util::Windows::SID::CreatorOwner
/opt/puppetlabs/bolt/lib/ruby/gems/2.7.0/gems/puppet-7.4.1/lib/puppet/util/windows/sid.rb:19: warning: previous definition of CreatorOwner was here
/opt/puppetlabs/bolt/lib/ruby/gems/2.7.0/gems/puppet-7.4.1/lib/puppet/util/windows/sid.rb:20: warning: already initialized constant Puppet::Util::Windows::SID::CreatorGroup
/opt/puppetlabs/bolt/lib/ruby/gems/2.7.0/gems/puppet-7.4.1/lib/puppet/util/windows/sid.rb:20: warning: previous definition of CreatorGroup was here
/opt/puppetlabs/bolt/lib/ruby/gems/2.7.0/gems/puppet-7.4.1/lib/puppet/util/windows/sid.rb:21: warning: already initialized constant Puppet::Util::Windows::SID::CreatorOwnerServer
/opt/puppetlabs/bolt/lib/ruby/gems/2.7.0/gems/puppet-7.4.1/lib/puppet/util/windows/sid.rb:21: warning: previous definition of CreatorOwnerServer was here
/opt/puppetlabs/bolt/lib/ruby/gems/2.7.0/gems/puppet-7.4.1/lib/puppet/util/windows/sid.rb:22: warning: already initialized constant Puppet::Util::Windows::SID::CreatorGroupServer
/opt/puppetlabs/bolt/lib/ruby/gems/2.7.0/gems/puppet-7.4.1/lib/puppet/util/windows/sid.rb:22: warning: previous definition of CreatorGroupServer was here
/opt/puppetlabs/bolt/lib/ruby/gems/2.7.0/gems/puppet-7.4.1/lib/puppet/util/windows/sid.rb:23: warning: already initialized constant Puppet::Util::Windows::SID::NonUnique
/opt/puppetlabs/bolt/lib/ruby/gems/2.7.0/gems/puppet-7.4.1/lib/puppet/util/windows/sid.rb:23: warning: previous definition of NonUnique was here
/opt/puppetlabs/bolt/lib/ruby/gems/2.7.0/gems/puppet-7.4.1/lib/puppet/util/windows/sid.rb:24: warning: already initialized constant Puppet::Util::Windows::SID::Nt
/opt/puppetlabs/bolt/lib/ruby/gems/2.7.0/gems/puppet-7.4.1/lib/puppet/util/windows/sid.rb:24: warning: previous definition of Nt was here
/opt/puppetlabs/bolt/lib/ruby/gems/2.7.0/gems/puppet-7.4.1/lib/puppet/util/windows/sid.rb:25: warning: already initialized constant Puppet::Util::Windows::SID::Dialup
/opt/puppetlabs/bolt/lib/ruby/gems/2.7.0/gems/puppet-7.4.1/lib/puppet/util/windows/sid.rb:25: warning: previous definition of Dialup was here
/opt/puppetlabs/bolt/lib/ruby/gems/2.7.0/gems/puppet-7.4.1/lib/puppet/util/windows/sid.rb:26: warning: already initialized constant Puppet::Util::Windows::SID::Network
/opt/puppetlabs/bolt/lib/ruby/gems/2.7.0/gems/puppet-7.4.1/lib/puppet/util/windows/sid.rb:26: warning: previous definition of Network was here
/opt/puppetlabs/bolt/lib/ruby/gems/2.7.0/gems/puppet-7.4.1/lib/puppet/util/windows/sid.rb:27: warning: already initialized constant Puppet::Util::Windows::SID::Batch
/opt/puppetlabs/bolt/lib/ruby/gems/2.7.0/gems/puppet-7.4.1/lib/puppet/util/windows/sid.rb:27: warning: previous definition of Batch was here
/opt/puppetlabs/bolt/lib/ruby/gems/2.7.0/gems/puppet-7.4.1/lib/puppet/util/windows/sid.rb:28: warning: already initialized constant Puppet::Util::Windows::SID::Interactive
/opt/puppetlabs/bolt/lib/ruby/gems/2.7.0/gems/puppet-7.4.1/lib/puppet/util/windows/sid.rb:28: warning: previous definition of Interactive was here
/opt/puppetlabs/bolt/lib/ruby/gems/2.7.0/gems/puppet-7.4.1/lib/puppet/util/windows/sid.rb:29: warning: already initialized constant Puppet::Util::Windows::SID::Service
/opt/puppetlabs/bolt/lib/ruby/gems/2.7.0/gems/puppet-7.4.1/lib/puppet/util/windows/sid.rb:29: warning: previous definition of Service was here
/opt/puppetlabs/bolt/lib/ruby/gems/2.7.0/gems/puppet-7.4.1/lib/puppet/util/windows/sid.rb:30: warning: already initialized constant Puppet::Util::Windows::SID::Anonymous
/opt/puppetlabs/bolt/lib/ruby/gems/2.7.0/gems/puppet-7.4.1/lib/puppet/util/windows/sid.rb:30: warning: previous definition of Anonymous was here
/opt/puppetlabs/bolt/lib/ruby/gems/2.7.0/gems/puppet-7.4.1/lib/puppet/util/windows/sid.rb:31: warning: already initialized constant Puppet::Util::Windows::SID::Proxy
/opt/puppetlabs/bolt/lib/ruby/gems/2.7.0/gems/puppet-7.4.1/lib/puppet/util/windows/sid.rb:31: warning: previous definition of Proxy was here
/opt/puppetlabs/bolt/lib/ruby/gems/2.7.0/gems/puppet-7.4.1/lib/puppet/util/windows/sid.rb:32: warning: already initialized constant Puppet::Util::Windows::SID::EnterpriseDomainControllers
/opt/puppetlabs/bolt/lib/ruby/gems/2.7.0/gems/puppet-7.4.1/lib/puppet/util/windows/sid.rb:32: warning: previous definition of EnterpriseDomainControllers was here
/opt/puppetlabs/bolt/lib/ruby/gems/2.7.0/gems/puppet-7.4.1/lib/puppet/util/windows/sid.rb:33: warning: already initialized constant Puppet::Util::Windows::SID::PrincipalSelf
/opt/puppetlabs/bolt/lib/ruby/gems/2.7.0/gems/puppet-7.4.1/lib/puppet/util/windows/sid.rb:33: warning: previous definition of PrincipalSelf was here
/opt/puppetlabs/bolt/lib/ruby/gems/2.7.0/gems/puppet-7.4.1/lib/puppet/util/windows/sid.rb:34: warning: already initialized constant Puppet::Util::Windows::SID::AuthenticatedUsers
/opt/puppetlabs/bolt/lib/ruby/gems/2.7.0/gems/puppet-7.4.1/lib/puppet/util/windows/sid.rb:34: warning: previous definition of AuthenticatedUsers was here
/opt/puppetlabs/bolt/lib/ruby/gems/2.7.0/gems/puppet-7.4.1/lib/puppet/util/windows/sid.rb:35: warning: already initialized constant Puppet::Util::Windows::SID::RestrictedCode
/opt/puppetlabs/bolt/lib/ruby/gems/2.7.0/gems/puppet-7.4.1/lib/puppet/util/windows/sid.rb:35: warning: previous definition of RestrictedCode was here
/opt/puppetlabs/bolt/lib/ruby/gems/2.7.0/gems/puppet-7.4.1/lib/puppet/util/windows/sid.rb:36: warning: already initialized constant Puppet::Util::Windows::SID::TerminalServerUsers
/opt/puppetlabs/bolt/lib/ruby/gems/2.7.0/gems/puppet-7.4.1/lib/puppet/util/windows/sid.rb:36: warning: previous definition of TerminalServerUsers was here
/opt/puppetlabs/bolt/lib/ruby/gems/2.7.0/gems/puppet-7.4.1/lib/puppet/util/windows/sid.rb:37: warning: already initialized constant Puppet::Util::Windows::SID::LocalSystem
/opt/puppetlabs/bolt/lib/ruby/gems/2.7.0/gems/puppet-7.4.1/lib/puppet/util/windows/sid.rb:37: warning: previous definition of LocalSystem was here
/opt/puppetlabs/bolt/lib/ruby/gems/2.7.0/gems/puppet-7.4.1/lib/puppet/util/windows/sid.rb:38: warning: already initialized constant Puppet::Util::Windows::SID::NtLocal
/opt/puppetlabs/bolt/lib/ruby/gems/2.7.0/gems/puppet-7.4.1/lib/puppet/util/windows/sid.rb:38: warning: previous definition of NtLocal was here
/opt/puppetlabs/bolt/lib/ruby/gems/2.7.0/gems/puppet-7.4.1/lib/puppet/util/windows/sid.rb:39: warning: already initialized constant Puppet::Util::Windows::SID::NtNetwork
/opt/puppetlabs/bolt/lib/ruby/gems/2.7.0/gems/puppet-7.4.1/lib/puppet/util/windows/sid.rb:39: warning: previous definition of NtNetwork was here
/opt/puppetlabs/bolt/lib/ruby/gems/2.7.0/gems/puppet-7.4.1/lib/puppet/util/windows/sid.rb:40: warning: already initialized constant Puppet::Util::Windows::SID::BuiltinAdministrators
/opt/puppetlabs/bolt/lib/ruby/gems/2.7.0/gems/puppet-7.4.1/lib/puppet/util/windows/sid.rb:40: warning: previous definition of BuiltinAdministrators was here
/opt/puppetlabs/bolt/lib/ruby/gems/2.7.0/gems/puppet-7.4.1/lib/puppet/util/windows/sid.rb:41: warning: already initialized constant Puppet::Util::Windows::SID::BuiltinUsers
/opt/puppetlabs/bolt/lib/ruby/gems/2.7.0/gems/puppet-7.4.1/lib/puppet/util/windows/sid.rb:41: warning: previous definition of BuiltinUsers was here
/opt/puppetlabs/bolt/lib/ruby/gems/2.7.0/gems/puppet-7.4.1/lib/puppet/util/windows/sid.rb:42: warning: already initialized constant Puppet::Util::Windows::SID::Guests
/opt/puppetlabs/bolt/lib/ruby/gems/2.7.0/gems/puppet-7.4.1/lib/puppet/util/windows/sid.rb:42: warning: previous definition of Guests was here
/opt/puppetlabs/bolt/lib/ruby/gems/2.7.0/gems/puppet-7.4.1/lib/puppet/util/windows/sid.rb:43: warning: already initialized constant Puppet::Util::Windows::SID::PowerUsers
/opt/puppetlabs/bolt/lib/ruby/gems/2.7.0/gems/puppet-7.4.1/lib/puppet/util/windows/sid.rb:43: warning: previous definition of PowerUsers was here
/opt/puppetlabs/bolt/lib/ruby/gems/2.7.0/gems/puppet-7.4.1/lib/puppet/util/windows/sid.rb:44: warning: already initialized constant Puppet::Util::Windows::SID::AccountOperators
/opt/puppetlabs/bolt/lib/ruby/gems/2.7.0/gems/puppet-7.4.1/lib/puppet/util/windows/sid.rb:44: warning: previous definition of AccountOperators was here
/opt/puppetlabs/bolt/lib/ruby/gems/2.7.0/gems/puppet-7.4.1/lib/puppet/util/windows/sid.rb:45: warning: already initialized constant Puppet::Util::Windows::SID::ServerOperators
/opt/puppetlabs/bolt/lib/ruby/gems/2.7.0/gems/puppet-7.4.1/lib/puppet/util/windows/sid.rb:45: warning: previous definition of ServerOperators was here
/opt/puppetlabs/bolt/lib/ruby/gems/2.7.0/gems/puppet-7.4.1/lib/puppet/util/windows/sid.rb:46: warning: already initialized constant Puppet::Util::Windows::SID::PrintOperators
/opt/puppetlabs/bolt/lib/ruby/gems/2.7.0/gems/puppet-7.4.1/lib/puppet/util/windows/sid.rb:46: warning: previous definition of PrintOperators was here
/opt/puppetlabs/bolt/lib/ruby/gems/2.7.0/gems/puppet-7.4.1/lib/puppet/util/windows/sid.rb:47: warning: already initialized constant Puppet::Util::Windows::SID::BackupOperators
/opt/puppetlabs/bolt/lib/ruby/gems/2.7.0/gems/puppet-7.4.1/lib/puppet/util/windows/sid.rb:47: warning: previous definition of BackupOperators was here
/opt/puppetlabs/bolt/lib/ruby/gems/2.7.0/gems/puppet-7.4.1/lib/puppet/util/windows/sid.rb:48: warning: already initialized constant Puppet::Util::Windows::SID::Replicators
/opt/puppetlabs/bolt/lib/ruby/gems/2.7.0/gems/puppet-7.4.1/lib/puppet/util/windows/sid.rb:48: warning: previous definition of Replicators was here
/opt/puppetlabs/bolt/lib/ruby/gems/2.7.0/gems/puppet-7.4.1/lib/puppet/util/windows/sid.rb:49: warning: already initialized constant Puppet::Util::Windows::SID::AllAppPackages
/opt/puppetlabs/bolt/lib/ruby/gems/2.7.0/gems/puppet-7.4.1/lib/puppet/util/windows/sid.rb:49: warning: previous definition of AllAppPackages was here
/opt/puppetlabs/bolt/lib/ruby/gems/2.7.0/gems/puppet-7.4.1/lib/puppet/util/windows/sid.rb:150: warning: already initialized constant Puppet::Util::Windows::SID::MAXIMUM_SID_STRING_LENGTH
/opt/puppetlabs/bolt/lib/ruby/gems/2.7.0/gems/puppet-7.4.1/lib/puppet/util/windows/sid.rb:150: warning: previous definition of MAXIMUM_SID_STRING_LENGTH was here
Successfully synced modules from /root/Puppetfile to /root/.modules

puppetlabs/bolt#2694 Includes the output in more detail

What behavior did you expect instead

Since this is running on a CentOS machine, this file should not be loaded.

Upcoming Puppet 4 / Ruby 2.1.5 Registry compatibility changes

As part of making Puppet 4 compatible with Ruby 2.1.5, we have discovered a couple of bugs inside Ruby that will affect your module. The two primary issues are:

  • When enumerating keys with #each_key / #keys or values with #each_value / #values, Ruby will take a UTF-16LE string and roundtrip it through the local codepage unnecessarily, which may cause encoding exceptions. Our prime example of this is when a Unicode en-dash U+2013 appears in a registry value, and the local codepage is IBM437, which has no equivalent character. This is just one of many potential examples that may trigger this behavior. NOTE: Normal registry reads of a value at a particular key are not problematic - the bad behavior is only triggered during enumeration. We have not yet filed this bug with Ruby.
  • When using the #delete_key and #delete_value methods, Ruby is passing wide character UTF-16LE strings to ANSI APIs. We have filed this bug with Ruby at https://bugs.ruby-lang.org/issues/10820

There are additional technical details that can be found in PUP-3837, the ticket we're using to track changes that we've made to Puppet. Our resolution for these issues was merged to Puppet at puppetlabs/puppet@c610cd0

We don't have Puppet 4 builds released yet, but keep an eye on https://groups.google.com/forum/#!forum/puppet-announce

I have identified issues with the code in this module that will require some updating to ensure it maintains compatibility with both existing Puppet releases and the upcoming releases. I'm getting in touch with you now, so that you're not caught off guard, and so that your module is ready to go by the time 4.0 ships.

Issues:

We will be making an announcement to the puppet-dev list shortly mentioning some of these upcoming changes.
https://groups.google.com/forum/#!forum/puppet-dev

Let me know if you have any questions.

Thanks!

Ensure relative ordering when 'mergemode => insert'

When several items need to remain in a certain order relative to each other, they can be passed as an array to the 'value' parameter. If the values don't already exist, they will be inserted in the correct order. If all of the values are already present however, their order will not be fixed (because 'exists?' will return true).

How to avoid duplicates?

How can I avoid duplicates on prepend?

        `# Adds %M2_HOME%\bin to the PATH
        windows_env {'addmavenpath':
            ensure      => present,
            mergemode   => prepend,
            variable    => 'PATH',
            value       => '%M2_HOME%\bin',
        }    `

C:\Users\Administrator>echo %PATH% C:\PROGRA~1\apache-maven-3x\bin;C:\PROGRA~1\Java\jdk1.8.0_40\bin;C:\PROGRA~1\apache-maven-3x\bin;C:\PROGRA~1\apache-maven-3x\bin;C:\PROGRA~1\apache-maven-3x\bin;C:\PROGRA~1\ap ache-maven-3x\bin;C:\ProgramData\Oracle\Java\javapath;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Program Files\Pupp et Labs\Puppet\bin;C:\Program Files (x86)\Dell\Enterprise Manager\msagui

Issue with setting env variables that have multiple values separated by ";"

Affected Puppet, Ruby, OS and module versions/distributions

  • Puppet: v4.7.0
  • Ruby: 2.1.9
  • Distribution:
  • Module version: 2.2.2

How to reproduce (e.g Puppet code you use)

windows_env { 'CMS_STORAGE_CONNECTION_STRING':
ensure => present,
variable => 'CMS_STORAGE_CONNECTION_STRING',
value => 'DefaultEndpointsProtocol=https;AccountName=produssccms01;AccountKey=7pAHD8y',
mergemode => clobber,
}

What are you seeing

The multiple values separated by the ";" is causing the puppet to set the env variable on EVERY run.

What behaviour did you expect instead

Puppet should set the value ONLY once.

Output log

2017-03-24
14:18 Z
notice
created
Source: /Stage[main]/Profile::Windows::Set_cms_storage_conn_string_env/Windows_env[CMS_STORAGE_CONNECTION_STRING]/ensureFile: /etc/puppetlabs/code/environments/intjp/modules/profile/manifests/windows/set_cms_storage_conn_string_env.ppLine: 13

Any additional information you'd like to impart

";" is causing the issue and it is a bug in the module.

Prevent shuffling with mergemode prepend or append

As noted in the README, if multiple puppet resources manage the same variable and are all in prepend/append mode, each will promote its value to the beginning/end when it is evaluated (this will happen on every puppet run). This can be solved by using an array of values in a single resource, but this doesn't work well for multiple third party modules that want to prepend/append independently.

Possible solutions:

  1. A prependonce and appendonce option that will prepend/append if the value does not appear, but will leave the value where it is if it does. Leave prepend and append as is for backward compatibility.
  2. A priority option that allows an order to be specified among the resources (a la puppet firewall rules). Same priority resources would be allowed in any order. Some potentially odd edge cases (value => 'x', priority => 2 for one resource and value => ['x', 'y'], priority => 1 for another).

To anyone who uses this module and cares about this, please comment. I'll not make the time to look into this unless I hear feedback.

Unexpected symbol/character added to end of variable value when mergemode => clobber

Describe the Bug

When declaring a variable using mergemode clobber, the value in the registry has the following character appended at the end:

倀

For example, value data would show as:

C:\software\tomcat倀

Expected Behavior

The registry value data should display as:

C:\software\tomcat

Steps to Reproduce

Declare resource as follows:

windows_env {'CATALINA_HOME':
  ensure    => present,
  variable  => 'CATALINA_HOME',
  value     => 'C:\software\tomcat',
  mergemode => clobber,
}

After puppet run, go to registry location below to view applied values for variable:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment

Environment

  • Puppet Agent Version: 8.4.0
  • Platform: Windows Server 2016

Additional Context

Screenshot of the issue:

image

Could not autoload puppet/type/windows_env

I'm not certain if this issue is specific to this module - but I get the below error intermittently on puppet 3.7.1 on win2008r2.

Could not retrieve catalog from remote server: Error 400 on SERVER: Could not autoload puppet/type/windows_env: Could not autoload puppet/provider/windows_env/windows_env: can't convert Symbol into String. Could not open library 'libUser32.so': libUser32.so: cannot open shared object file: No such file or directory on node shslabppt04.shslab.local

Add a set of domain related facts

This issue to track an idea for a set of facts that I would like to contribute.

Currently information about the domain your machine is running in is difficult to get if you need anything other than the FQDN of the domain. The FQDN is not always usable because in some cases it's really the NETBIOS name that the user needs. Doing a substring on FQDN could get complicated ifa user is running in a subdomain or with a non standard tld like test.corp.internaltest. Whereas in PowerShell or possible even ruby, getting the NETBIOS is easy.

So this issue is track both my intention to do a PR to add the NETBIOS fact, and to take input about what other facts about the domain environment might be useful to surface while I'm at it.

Thanks,
Bill

License - What type is it?

Hi,

I've just noticed the lack of a license file, which OSS license does the project use?

Cheers,

Tom

issue with REG_SZ and REG_EXPAND_SZ on Windows 2012R2

We use this module with PuppetEnterprise 3.8 and Win2008R2 with no issues, but when I run it in our devlab (puppet 4.2 and win 2012R2) I get the following error

Parameter type failed on Windows_env[PATH=%ProgramFiles(x86)%\Java\jre1.8.0_72\bin]:
Invalid value "Reg_expand_sz[]". Valid values are REG_SZ, REG_EXPAND_SZ.

Even though my type is set to REG_EXPAND_SZ -- have you tested this on 2012R2 ? Possible incompatibility ?

Values with trailing slash do not include trailing slash

Hi! I'm pretty new to systems administration on windows. Your module has been a great help so far and I wanted to thank you for that!

I need to set an environment variable so that a bat file provided by Visual Studio 2008 can run. This bat script relies on the VS90COMNTOOLS value being set correctly. This configuration should work correctly, but doesn't.

  windows_env { 'visual studio environment variables':
    ensure    => present,
    variable  => 'VS90COMNTOOLS',
    value     => 'C:\\Program Files (x86)\\Microsoft Visual Studio 9.0\\Common7\\Tools\\',
    mergemode => 'clobber'
  }~>

Where I expect %VS90COMNTOOLS% to equal C:\Program Files (x86)\Microsoft Visual Studio 9.0\Common7\Tools\, it is instead C:\Program Files (x86)\Microsoft Visual Studio 9.0\Common7\Tools (note the missing trailing slash). I may also be escaping the puppet string incorrectly, but I'm not sure.

Thanks for your time!

Unable to Remove Entire Variable

I'm testing out using version 4.0.1 of the module against Puppet 6.17.0 on a Windows 10 device (Version 1909 Build 18363.10.16), and am unable to completely remove an environment variable.

This successfully creates the variable:

    windows_env { 'VariableX':
      ensure    => present,
      mergemode => clobber,
      value     => 'some value here'
    }

However, this fails to remove the variable:

    windows_env { 'VariableX':
      ensure    => absent,
      mergemode => clobber
    }

I can see the 'VariableX' entry at HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment, and have restarted at different points in my testing. All with the same result. I can remove the Value of the variable, but not the entire variable itself (even though the ReadMe states the above command should remove the variable completely).

Is this a bug?

Variable continues to re-apply on every Puppet run

Affected Puppet, Ruby, OS and module versions/distributions

  • Puppet: 2019.0.1
  • Ruby: 2.6.5
  • Distribution: Open Source
  • Module version: 3.2.0

How to reproduce (e.g Puppet code you use)

windows_env { 'ProgramLicense' :
  ensure    => present,
  value    => true,
  mergemode => clobber,
}

What are you seeing

Puppet reapplies the manifest on every run if the value is set to boolean

What behaviour did you expect instead

Should not re-apply on every run

Output log

/etc/puppetlabs/code/environments/test/site/profile/manifests/server.pp Event: Corrective change Changed From: absent Changed to: present

Any additional information you'd like to impart

If the value is set to a string, it does not reapply the variable

windows_env { 'ProgramLicense' :
  ensure    => present,
  value     => 'true',
  mergemode => clobber,
}

Upcoming Puppet 3.7 / PE 3.4 x64 compatibility changes

As part of making Puppet compatible with Windows x64 / Ruby 2, we have had to make a number of changes to our included gems, and have removed sys-admin, windows-pr, win32-api and windows-api. Other gems have been upgraded to versions that require FFI and are compatible with x64.

We don't have builds released yet, but keep an eye on https://groups.google.com/forum/#!forum/puppet-announce

I have identified a number of issues with the code in this module that will require some updating to ensure it maintains compatibility with both existing Puppet releases and the upcoming releases. I'm getting in touch with you now, so that you're not caught off guard, and so that your module is ready to go by the time 3.7 ships.

Issues:

  • Uses constant Windows::Error::ERROR_FILE_NOT_FOUND, which now is in Puppet::Util::Windows::Error::ERROR_FILE_NOT_FOUND. You can either define that constant within your Ruby code, or provide a graceful fallback type solution through a locally named variable like:
ERROR_FILE_NOT_FOUND = 2
  • Uses API Puppet::Util::Windows::Security.name_to_sid which now lives at Puppet::Util::Windows::SID.name_to_sid. You can fix this by storing off the method reference in a variable by doing something like
name_to_sid = Puppet::Util::Windows::SID.constants.include?(:name_to_sid) ? Puppet::Util::Windows::SID.name_to_sid : Puppet::Util::Windows::Security.name_to_sid
  • Defines SendMessageTimeout, RegLoadKey, RegUnLoadKey API calls using Ruby's Win32API class, which won't work on x64 due to incorrect definitions for variables that have a platform specific width (such as HANDLE). These API calls should use FFI definitions, so that they are properly defined on both x86 and x64. Many examples exist in the Puppet codebase now in the lib/puppet/util/windows folder, such as https://github.com/puppetlabs/puppet/blob/master/lib/puppet/util/windows/process.rb#L214

We will be making an announcement to the puppet-dev list shortly mentioning some of these upcoming changes.
https://groups.google.com/forum/#!forum/puppet-dev

Let me know if you have any questions.

Thanks!

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.