Giter VIP home page Giter VIP logo

cordial's People

Contributors

gvastel avatar pgalbavy avatar pgalbavy-itrs avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar

cordial's Issues

Issue with `geneos init` command for fileagent

Cordial release v1.3.2.
When running geneos init /opt/itrs, the geneos utility creates a directory structure under /opt/itrs with a directory for fa2 (FIX Analyser 2) but not for fileagent (agent used to monitor FIX log fles).

$ pwd
/opt/itrs
$ ls -l
total 0
$ geneos init /opt/itrs
 ls -l
total 0
drwxrwxr-x. 3 itrs itrs 18 Nov  7 11:18 fa2
drwxrwxr-x. 6 itrs itrs 83 Nov  7 11:18 gateway
drwxrwxr-x. 2 itrs itrs  6 Nov  7 11:18 hosts
drwxrwxr-x. 3 itrs itrs 19 Nov  7 11:18 licd
drwxrwxr-x. 3 itrs itrs 23 Nov  7 11:18 netprobe
drwxrwxr-x. 8 itrs itrs 94 Nov  7 11:18 packages
drwxrwxr-x. 4 itrs itrs 35 Nov  7 11:18 san
drwxrwxr-x. 3 itrs itrs 24 Nov  7 11:18 webserver
$

Looks like support for fileagent in geneos init command is either missing or not working.

"geneos init" command not returning a descriptive error message when using an invalid password

I tried running the "geneos init demo -u [email protected]" command with an incorrect password but the error message returned was not suggestive of that error otherwise. Please see screenshot below:

user@server_hostname:~$ geneos init demo -u *@.com
Password:
gateway "Demo Gateway" added, port 7039
netprobe "localhost" added, port 7036
2023-05-02T05:01:45Z FATAL: tools/geneos/cmd/add.go:154 cmd.addInstance() > error="chdir /home/sysad1/geneos/packages/webserver/active_prod/config: no such file or directory"

Request related to remote commands

Cordial v1.3.2.

geneos support for running commands on remote hosts require to have passwordless ssh.
Many ITRS customers will not allow passwordless ssh in their network. To get around this while maintaining support for remote commands, could geneos be enhanced to support host passwords in config files (preferably stored as aes encoded) or passwords to be entered manually by the user at runtime.

Question about `geneos aes decode`

What is the use of arguments TYPE & NAME in the geneos aes decode command?

Tried to have those defined and not define a keyfile (option -k) and got this.

]$ geneos aes ls netprobe
Type      Name      Host       Keyfile          CRC32     Modtime
netprobe  np_testA  localhost  /tmp/qwerty.aes  C335601C  2022-11-17T10:02:04Z
netprobe  np_testZ  localhost  /tmp/xyz.aes     4048B1FF  2022-11-17T09:37:38Z
$ geneos aes decode netprobe -p F491228D21B4E42E159016BA719DFA8A -k /tmp/xyz.aes
decoded: abcxyz
$
$ geneos aes decode netprobe -p F491228D21B4E42E159016BA719DFA8A
$
$ geneos aes decode netprobe np_testZ -p F491228D21B4E42E159016BA719DFA8A
2022-11-18T02:57:44Z ERROR: tools/geneos/internal/instance/config.go:386 instance.ReadConfig() > connection to PsApac-GvDev02 failed
$
$ geneos aes decode netprobe -p F491228D21B4E42E159016BA719DFA8A -k /tmp/qwerty.aes
Error: decode failed with key file(s) provided

Issue with remote commands

Cordial v1.3.2.

With

  • passwordless ssh enabled,
  • gw_test1 defined as a gateway owned by user itrs & hosted on zzz.zzz.zzz.zzz,
  • PsApac-GV-Dev-02 defined on zzz.zzz.zzz.zzz as a host whose address is xxx.xxx.xxx.xxx,
    when running commands geneos ps gw_test1 & geneos ls gw_test1 on host 'zzz.zzz.zzz.zzzunder useritrs, connection to PsApac-GV-Dev-02` errors message are seen.

This does not look right.

[itrs@ip-zzz-zzz-zzz-zzz ~]$ ssh xxx.xxx.xxx.xxx
Last login: Fri Nov 11 05:37:52 2022 from singnet.com.sg
[[email protected] ~]$ exit
logout
Connection to xxx.xxx.xxx.xxx closed.
[itrs@ip-zzz-zzz-zzz-zzz ~]$ geneos ps gw_test1
2022-11-11T05:38:33Z ERROR: tools/geneos/internal/instance/config.go:381 instance.ReadConfig() > connection to PsApac-GV-Dev-02 failed
Type  Name  Host  PID  Ports  User  Group  Starttime  Version  Home
[itrs@ip-zzz-zzz-zzz-zzz ~]$ geneos ls gw_test1
2022-11-11T05:41:35Z ERROR: tools/geneos/internal/instance/config.go:381 instance.ReadConfig() > connection to PsApac-GV-Dev-02 failed
Type     Name      Host       Port  Version            Home
gateway  gw_test1  localhost  7102  active_prod:6.0.0  /opt/itrs/gateway/gateways/gw_test1
[itrs@ip-zzz-zzz-zzz-zzz ~]$

Issue with `-H` for `geneos aes new`

According to the documentation, when using option -H HOST with geneos aes new, is should "Import only to named host".
When I tried it, I got the following.

$ geneos aes new -k /tmp/abc.xyz -I -H PsApac-GvDev02
/tmp/abc.xyz created, checksum AA173C7F
2022-11-17T08:54:39Z ERROR: tools/geneos/cmd/aesImport.go:123 cmd.aesImportSave() > host PsApac-GvDev02, component gateway error="dial tcp :0: connect: connection refused"
2022-11-17T08:54:39Z ERROR: tools/geneos/cmd/aesImport.go:123 cmd.aesImportSave() > host PsApac-GvDev02, component netprobe error="dial tcp :0: connect: connection refused"
2022-11-17T08:54:39Z ERROR: tools/geneos/cmd/aesImport.go:123 cmd.aesImportSave() > host PsApac-GvDev02, component san error="dial tcp :0: connect: connection refused"
gateway "gw_test1" keyfile AA173C7F.aes set, existing keyfile moved to prevkeyfile
gateway "ip-xxx-xxx-xxx-xxx.ap-southeast-1.compute.internal" keyfile AA173C7F.aes set, existing keyfile moved to prevkeyfile

which shows a connection error and the fact that the newly created .aes file was imported to gateway instance only.

Is this behaviour expected? and why?
Does not seem to match the documentation.

Issue with running 'sudo geneos init'

Version v1.3.1, cordial / tools / geneos /

When running sudo geneos init itrs /opt/itrs, the directory structure under /opt/itrs is created, but not the configuration file /home/itrs/.config/geneos/geneos.json.
In this case, the configuration file is also not found in the root user's home directory.

When running geneos init /opt/itrs as user itrs, both the directory structure under /opt/itrs & the configuration file /home/itrs/.config/geneos/geneos.json are created.

Looks like there is an issue with the command run as sudo.

Consolidate remote host commands under a 'host' sub-command

The commands:

geneos add host
geneos ls host
etc.

do not fit in with the sub-system style commands for aes, tls and so on.

Add a geneos host sub-command, put all the commands in there and alias the old ones to these.

Fix documentation

Issue with command `geneos aes set` and option `-C`

When using -C with geneos aes set, the keyfile is apparently not found.

$ ls -l /opt/itrs/gateway/gateway_shared/keyfiles/
total 8
-rw-------. 1 itrs itrs 106 Nov 17 09:37 4048B1FF.aes
-rw-------. 1 itrs itrs 106 Nov 17 09:35 90C23114.aes
$ geneos aes set gateway gw_test1 -C 90C23114
2022-11-17T09:39:48Z ERROR: tools/geneos/internal/instance/config.go:386 instance.ReadConfig() > connection to PsApac-GvDev02 failed
Error: stat /home/itrs/.config/geneos/keyfile.aes: no such file or directory

Issue with `geneos add host`

Cordial v1.3.2.

Always getting error Error: cannot open /etc/os-release or /usr/lib/os-release.
Passwordless ssh works ok.

What is the syntax / format of the `-e <string>` argument for `geneos aes decode`?

Format / syntax is not all that clear.
The last command below seems to accept the argument, but fails to decode.

$ geneos aes decode -e "F491228D21B4E42E159016BA719DFA8A"
Error: invalid arguments: expandable string must be of the form '${enc:keyfile:ciphertext}'
$ geneos aes decode -e ${enc:/tmp/xyz.aes:F491228D21B4E42E159016BA719DFA8A}
Error: flag needs an argument: 'e' in -e
$ geneos aes decode -e "${enc:/tmp/xyz.aes:F491228D21B4E42E159016BA719DFA8A}"
Error: invalid arguments
$ geneos aes decode -e '${enc:/tmp/xyz.aes:F491228D21B4E42E159016BA719DFA8A}'

Minor issue with `geneos copy`

Current version in main branch.

When copying a netprobe instance - whether that instance is running or not - copies the log file as-is.
As a result, the log file in the new instance (dstinnation of the copy) has a log file with an inaccurate content. This log file should rather be empty.

LatestRelease() doesn't work as expected

The LatestRelease function doesn't do the right thing with files, such as local downloads. This probably broke when the function was used for extra work.

It should be able to cope with both bare versions and also release archives files.

`geneos aes decode` vs `geneos aes decode`

When using geneos aes encode withough defining TYPE & NAME, I get 1 encoded output for each keyfile configured in the instance json config file of gateways, netprobes & sans (parameter keyfile).
However when I use geneos aes decode without defining TYPE & NAME, decoding id done only with the keyfiles condifured for gateway instances. I get the exact same behavior if I use geneos aes decode gateway.
Also if I use geneos aes decode netprobe, I get no respose eventhough there are keyfiles defined in the netprobe instance json config files.

Is this an expected behaviour?

About `host` parameters

geneos has a geneos set host command to set host parameters, but has no geneos show host command to view the host parameters.
Host parameters can be viewed by reading file ~/.config/geneos/hosts.json, but ...

Having a geneos show host command would be good to have.

Issue with `geneos show`

When running a geneos show INSTANCE command, the instance configuration is shown as the exact content of the instance's .json config file. However no indication is given as to whether the instance is disabled or not. This is an important configuration info related to the instance and should be somehow reflected.

Findings on `geneos init san`

  • Running geneos init san itrs /opt/itrs -g gw_test1:7102 -a ATTR_1=VAL_1 -e ENV_VAR_1=ENV_VAL_1 -t TYPE_1 -v VAR_1=abc -v TYPE:VAR_2=xyz, I got the following error.
    {"level":"error","time":"2022-11-18T09:10:45Z","message":"invalid type \"TYPE\" for variable"}
    Error: invalid argument "TYPE:VAR_2=xyz" for "-v, --variable" flag: invalid arguments
  • Running geneos init san itrs /opt/itrs -g gw_test1:7102 -a ATTR_1=VAL_1 -e ENV_VAR_1=ENV_VAL_1 -t TYPE_1 -v VAR_1=abc, command worked, but cannot see the attribute, type, variable, environment is the san setup
    $ ls -l /opt/itrs/san/sans/san_test/
    total 8
    -rw-rw----. 1 itrs itrs 718 Nov  9 13:12 netprobe.setup.xml
    -rw-r--r--. 1 itrs itrs 713 Nov 16 07:04 san.json
    $ egrep "ATTR_1|VAL_1|ENV_VAR_1|ENV_VAL_1|TYPE_1|VAR_1|abc" /opt/itrs/san/sans/san_test/*
    
    This is unexpected.

Unexpected connection error encountered when running `geneos ps <instance_name>`

Cordial v1.3.2.

After successfully adding a host named PsApac-GV-Dev-02, I tried running geneos ps <instance_name>, and got an error as
2022-11-10T10:59:32Z ERROR: tools/geneos/internal/instance/config.go:381 instance.ReadConfig() > connection to PsApac-GV-Dev-02 failed.

However, I can successfully passwordless ssh to the IP address as defined in ~/.config/geneos-hosts.json for host PsApac-GV-Dev-02.

Minor issue with `geneos enable`

Documentation stated that "Only those instances that were disabled are started when the -S flag is used", however testing shows that when using option -S all instances are started even if they were not disabled.

This is a mismatch between the documentation & the actual behaviour of the command.

Support for AD/LDAP accounts

Cordial does not seem to work on an environment using an AD account for sign-in.

Example:

[rcanillas@mnlcsgen01 ~]$ geneos init
2023-02-15T14:18:10+08:00 ERROR: tools/geneos/cmd/root.go:203 cmd.initConfig() > cannot get user details error="user: unknown userid 1743258809"
2023-02-15T14:18:10+08:00 ERROR: tools/geneos/cmd/init.go:258 cmd.initProcessArgs() > cannot get user details error="user: unknown userid 1743258809"
2023-02-15T14:18:10+08:00 FATAL: tools/geneos/internal/geneos/geneos.go:88 geneos.Init() > error="mkdir /geneos: permission denied"

This is a Linux system in a domain and not a WSL instance.

Issue with `geneos set global`

When trying to use geneos set global, it looks like the value specified is not set anywhere.
Looked for it in ~/.config/geneos/geneos.json and /opt/itrs/*/*s/*/* (also /etc/geneos/geneos.json), but could not find any trace of the values set. Same behaviour applies to supported parameters & non-supported parameters.

On the other hand changes made with geneos set user get reflected in ~/.config/geneos/geneos.json.

Am I missing something?

Issue with running a remote install

After creating a host, failed to perform a remote install with command geneos install netprobe -d -H PsApac-GvDev02 -u [email protected].

$ geneos install netprobe -d -H PsApac-GvDev02 -u [email protected]
2022-11-16T09:32:27Z DEBUG: tools/geneos/cmd/parseargs.go:47 cmd.parseArgs() > rawargs: [netprobe]
2022-11-16T09:32:27Z DEBUG: tools/geneos/cmd/parseargs.go:63 cmd.parseArgs() > rawargs [netprobe], params [], ct
2022-11-16T09:32:27Z DEBUG: tools/geneos/cmd/parseargs.go:170 cmd.parseArgs() > ct netprobe, args [], params []
2022-11-16T09:32:27Z DEBUG: tools/geneos/cmd/parseargs.go:214 cmd.cmdArgs() > map[args:null ct:netprobe params:null wildcard:false] <nil>
Password:
2022-11-16T09:32:33Z DEBUG: tools/geneos/cmd/install.go:131 cmd.glob..func23() > installing "latest" version of netprobe to PsApac-GvDev02 host(s)
2022-11-16T09:32:33Z DEBUG: tools/geneos/internal/geneos/component.go:181 geneos.MakeComponentDirs() > mkdirall /opt/itrs/packages/netprobe
2022-11-16T09:32:33Z DEBUG: tools/geneos/internal/host/ssh.go:121 host.(*Host).Dial() > ssh connect to : as
2022-11-16T09:32:33Z DEBUG: tools/geneos/internal/host/ssh.go:32 host.readSSHkeys() > trying to read private key /home/itrs/.ssh/id_rsa
2022-11-16T09:32:33Z DEBUG: tools/geneos/internal/host/ssh.go:37 host.readSSHkeys() > read ok, parsing...
2022-11-16T09:32:33Z DEBUG: tools/geneos/internal/host/ssh.go:43 host.readSSHkeys() > loaded private key from /home/itrs/.ssh/id_rsa
2022-11-16T09:32:33Z DEBUG: tools/geneos/internal/host/ssh.go:32 host.readSSHkeys() > trying to read private key /home/itrs/.ssh/id_ecdsa
2022-11-16T09:32:33Z DEBUG: tools/geneos/internal/host/ssh.go:32 host.readSSHkeys() > trying to read private key /home/itrs/.ssh/id_ecdsa_sk
2022-11-16T09:32:33Z DEBUG: tools/geneos/internal/host/ssh.go:32 host.readSSHkeys() > trying to read private key /home/itrs/.ssh/id_ed25519
2022-11-16T09:32:33Z DEBUG: tools/geneos/internal/host/ssh.go:32 host.readSSHkeys() > trying to read private key /home/itrs/.ssh/id_ed25519_sk
2022-11-16T09:32:33Z DEBUG: tools/geneos/internal/host/ssh.go:32 host.readSSHkeys() > trying to read private key /home/itrs/.ssh/id_dsa
2022-11-16T09:32:33Z DEBUG: tools/geneos/internal/host/ssh.go:32 host.readSSHkeys() > trying to read private key
2022-11-16T09:32:33Z DEBUG: tools/geneos/internal/host/ssh.go:75 host.sshConnect() > added 1 private key(s) to auth methods
2022-11-16T09:32:33Z DEBUG: tools/geneos/internal/host/ssh.go:124 host.(*Host).Dial() > error="dial tcp :0: connect: connection refused"
Error: dial tcp :0: connect: connection refused

rethink set / set user / set global

There is confusion over what geneos set and geneos set user do differently. Perhaps instead use geneos set-user as a single sub-command, and similar for show and global versions of them?

Connectivity issues with remote hosts

When running a number of command, I get error similar to the one below, although the command seems to get execute ok.
2022-11-18T02:45:04Z ERROR: tools/geneos/internal/instance/config.go:386 instance.ReadConfig() > connection to PsApac-GvDev02 failed

Seen this with:

  • $ geneos aes encode gateway gw_test1
  • $ geneos aes ls gateway gw_test1
  • $ geneos aes set -k /tmp/def.aes netpobe np_test4
  • $ geneos clean netprobe np_test4
  • $ geneos disable np_testA
  • $ geneos enable np_test4
  • $ geneos set netprobe np_testZ param=value
  • $ geneos show np_testA
  • $ geneos start np_test4

Question about global & user parameters

The geneos set commands allow to set:

  • global parameters which are found in /etc/geneos/geneos.json (file owned by root),
  • user parameters which are found in ~/.config/geneos.json.

That raises a few questions ...

  1. What is the role of these 2 sets of variables?
  2. What is the relationship between global & user variables?
    (e.g. do global params act as a reference when creating a user setup, do global params act as default values for user params, ...)
  3. Given that the global params are stored in a file owned by root, how and when are they created?
    Presumably this is done when running a sudo geneos set global command.
  4. Is there more to it than that?

Issue with `geneos install fileagent`

Cordial release v1.3.2.
When running geneos install fileagent -d -u <username>, the fileagent software package cannot be installed.
Error is as follows.

[itrs@ip-172-31-0-160 itrs]$ geneos install fileagent -d -u [email protected]
2022-11-07T11:26:29Z DEBUG: tools/geneos/cmd/parseargs.go:47 cmd.parseArgs() > rawargs: [fileagent]
2022-11-07T11:26:29Z DEBUG: tools/geneos/cmd/parseargs.go:63 cmd.parseArgs() > rawargs [fileagent], params [], ct
2022-11-07T11:26:29Z DEBUG: tools/geneos/cmd/parseargs.go:214 cmd.cmdArgs() > map[args:["fileagent"] ct: params:null wildcard:false] <nil>
Password:
2022-11-07T11:26:34Z DEBUG: tools/geneos/internal/geneos/component.go:174 geneos.MakeComponentDirs() > mkdirall /opt/itrs/packages/downloads
2022-11-07T11:26:34Z DEBUG: tools/geneos/internal/geneos/component.go:174 geneos.MakeComponentDirs() > mkdirall /opt/itrs/hosts
2022-11-07T11:26:34Z ERROR: tools/geneos/cmd/install.go:169 cmd.install() > error="stat fileagent: no such file or directory"
Error: stat fileagent: no such file or directory
$

Looks like support for fileagent in geneos install is either missing or not working.

Error encountered when copying an instance to a remote host

This is what I got.
According to the doc, "Moving across hosts is supported".

$ geneos copy netprobe np_test5 np_testZ@PsApac-GvDev02
2022-11-18T02:30:37Z ERROR: tools/geneos/internal/instance/config.go:386 instance.ReadConfig() > connection to PsApac-GvDev02 failed
2022-11-18T02:30:37Z ERROR: tools/geneos/internal/instance/config.go:311 instance.writeConfig() > error="dial tcp :0: connect: connection refused"
2022-11-18T02:30:37Z ERROR: tools/geneos/internal/instance/config.go:328 instance.writeConfig() > error="dial tcp :0: connect: connection refused"
panic: runtime error: invalid memory address or nil pointer dereference
[signal SIGSEGV: segmentation violation code=0x1 addr=0x80 pc=0x86fe90]

goroutine 1 [running]:
github.com/pkg/sftp.(*Client).nextID(...)
        /home/itrs/go/pkg/mod/github.com/pkg/[email protected]/client.go:264
github.com/pkg/sftp.(*Client).open(0x0, {0xc000201c80, 0x33}, 0x1a)
        /home/itrs/go/pkg/mod/github.com/pkg/[email protected]/client.go:581 +0x30
github.com/pkg/sftp.(*Client).OpenFile(0xc0000b1220?, {0xc000201c80?, 0x9e6a6f?}, 0x9e6a6f?)
        /home/itrs/go/pkg/mod/github.com/pkg/[email protected]/client.go:577 +0x85
github.com/spf13/afero/sftpfs.Fs.OpenFile({0x9e6a6f?}, {0xc000201c80?, 0x0?}, 0xc0000b1260?, 0x0?)
        /home/itrs/go/pkg/mod/github.com/spf13/[email protected]/sftpfs/sftp.go:100 +0x26
github.com/spf13/viper.(*Viper).writeConfig(0xc00029b380, {0xc000201c80, 0x33}, 0x1)
        /home/itrs/go/pkg/mod/github.com/spf13/[email protected]/viper.go:1674 +0x363
github.com/spf13/viper.(*Viper).WriteConfigAs(...)
        /home/itrs/go/pkg/mod/github.com/spf13/[email protected]/viper.go:1635
github.com/itrs-group/cordial/tools/geneos/internal/instance.writeConfig({0xac6408, 0xc00021cbe0})
        /home/itrs/cordial/tools/geneos/internal/instance/config.go:333 +0x36f
github.com/itrs-group/cordial/tools/geneos/internal/instance.Migrate({0xac6408, 0xc00021cbe0})
        /home/itrs/cordial/tools/geneos/internal/instance/config.go:434 +0x125
github.com/itrs-group/cordial/tools/geneos/internal/instance.WriteConfig({0xac6408, 0xc00021cbe0})
        /home/itrs/cordial/tools/geneos/internal/instance/config.go:298 +0x25
github.com/itrs-group/cordial/tools/geneos/internal/instance.CopyInstance(0xddb460, {0xc00015a4d8, 0x8}, {0xc000027f80, 0x17}, 0x0)
        /home/itrs/cordial/tools/geneos/internal/instance/copy.go:166 +0x14a5
github.com/itrs-group/cordial/tools/geneos/cmd.glob..func11(0xde07e0?, {0xc000128930?, 0x3?, 0x3?})
        /home/itrs/cordial/tools/geneos/cmd/copy.go:70 +0x165
github.com/spf13/cobra.(*Command).execute(0xde07e0, {0xc000128900, 0x3, 0x3})
        /home/itrs/go/pkg/mod/github.com/spf13/[email protected]/command.go:916 +0x862
github.com/spf13/cobra.(*Command).ExecuteC(0xde2d40)
        /home/itrs/go/pkg/mod/github.com/spf13/[email protected]/command.go:1044 +0x3bd
github.com/spf13/cobra.(*Command).Execute(...)
        /home/itrs/go/pkg/mod/github.com/spf13/[email protected]/command.go:968
github.com/itrs-group/cordial/tools/geneos/cmd.Execute()
        /home/itrs/cordial/tools/geneos/cmd/root.go:146 +0x25
main.main()
        /home/itrs/cordial/tools/geneos/main.go:46 +0x8d

Question about `geneos restart`

In the legacy control scripts, there was a waiting time between the instance stop and the instance start.

  • Is there any such wait / delay in geneos restart?
    Looks like this is not the case, but lets make sure. ๐Ÿ˜
  • If there is a wait/delay, can it be controlled by the user?

Unexpected behaviour of `geneos home gateway`

Here are a few examples of geneos home commands.

$ geneos home netprobe
/opt/itrs/netprobe/netprobes/localhost
$ geneos home gateway
/opt/itrs/gateway/gateways/gw_test1
$ geneos home netprobe np_testA
/opt/itrs/netprobe/netprobes/np_testA
$ geneos home gw_test1
/opt/itrs/gateway/gateways/gw_test1

From the above, it seems that geneos home TYPE give the home directory of the 1st instance found. This is a little surprising. Is it expected? Why?

Use alpine in Dockerfile for builds

Using debian (buster or bullseye) golang images for builds causes issues for older Linux environments and GLIBC versioning.

Using alpine works, but special handling is required for libemail (build-base), musl dependencies and future CGO builds.

Something looks strange with `geneos aes ls`

It looks like geneos aes ls does not list all aes files configured.

$ geneos show gateway | egrep "name|key"
    "name": "gw_test1",
        "gatewayname": "gw_test1",
        "keyfile": "/opt/itrs/gateway/gateway_shared/keyfiles/4048B1FF.aes",
        "name": "gw_test1",
        "prevkeyfile": "/opt/itrs/gateway/gateway_shared/keyfiles/90C23114.aes",
    "name": "ip-xxx-xxx-xxx-xxx.ap-southeast-1.compute.internal",
        "gatewayname": "ip-xxx-xxx-xxx-xxx.ap-southeast-1.compute.internal",
        "keyfile": "/opt/itrs/gateway/gateway_shared/keyfiles/AA173C7F.aes",
        "name": "ip-xxx-xxx-xxx-xxx.ap-southeast-1.compute.internal",
        "prevkeyfile": "gateway.aes",
[itrs@ip-xxx-xxx-xxx-xxx ~]$ geneos aes ls gateway
gateway "ip-xxx-xxx-xxx-xxx.ap-southeast-1.compute.internal": stat /opt/itrs/gateway/gateway_shared/keyfiles/AA173C7F.aes: no such file or directory
Type     Name      Host       Keyfile                                                 CRC32     Modtime
gateway  gw_test1  localhost  /opt/itrs/gateway/gateway_shared/keyfiles/4048B1FF.aes  4048B1FF  2022-11-17T09:37:50Z
[itrs@ip-xxx-xxx-xxx-xxx ~]$ geneos aes ls
gateway "ip-xxx-xxx-xxx-xxx.ap-southeast-1.compute.internal": stat /opt/itrs/gateway/gateway_shared/keyfiles/AA173C7F.aes: no such file or directory
Type     Name      Host       Keyfile                                                 CRC32     Modtime
gateway  gw_test1  localhost  /opt/itrs/gateway/gateway_shared/keyfiles/4048B1FF.aes  4048B1FF  2022-11-17T09:37:50Z

Consolidate release download management under one sub-command

The existing commands:

geneos install
geneos update
geneos update ls

can be confusing, and with a new uninstall command it will be more so.

Somehow consolidate these into a new sub-command with more "obvious" behaviours.

Choices range over:

geneos release ...
geneos package ...
geneos component ...
(what else?)

The chosen sub-command would also have it's own action sub-sub-commands, and these would be aliased from the existing one if functionality can be maintained.

Issue with using syntax INSTANCE@REMOTE

Cordial v1.3.2.

Tried to create a gateway on a remote host with geneos add gateway gw_test2@PsApac-GV-Dev-02 -d and this failed due to a connection refused error, despite passwordless ssh being enabled.

$ geneos add gateway gw_test2@PsApac-GV-Dev-02 -d
2022-11-11T06:02:33Z DEBUG: tools/geneos/cmd/parseargs.go:47 cmd.parseArgs() > rawargs: [gateway gw_test2@PsApac-GV-Dev-02]
2022-11-11T06:02:33Z DEBUG: tools/geneos/cmd/parseargs.go:63 cmd.parseArgs() > rawargs [gateway gw_test2@PsApac-GV-Dev-02], params [], ct
2022-11-11T06:02:33Z DEBUG: tools/geneos/cmd/parseargs.go:170 cmd.parseArgs() > ct gateway, args [gw_test2@PsApac-GV-Dev-02], params []
2022-11-11T06:02:33Z DEBUG: tools/geneos/internal/instance/instance.go:68 instance.ReservedName() > checking "gw_test2@PsApac-GV-Dev-02"
2022-11-11T06:02:33Z DEBUG: tools/geneos/cmd/parseargs.go:214 cmd.cmdArgs() > map[args:["gw_test2@PsApac-GV-Dev-02"] ct:gateway params:null wildcard:false] <nil>
2022-11-11T06:02:33Z DEBUG: tools/geneos/internal/geneos/component.go:181 geneos.MakeComponentDirs() > mkdirall /opt/itrs/packages/gateway
Error: dial tcp :0: connect: connection refused
$

Enhancement request related to `geneos ls` & `geneos ps`

Currently, there is a command to list all instances (geneos ls) and a command to list all running instances (geneos ps).
It'd be nice to have a command showing the status of instances (enabled / disabled, not-running / running details if running, ...). In short something like a combination of ls & ps, with the disabled status in addition.

Issue with `geneos copy`

Cordial v1.3.2.

When running geneos copy netprobe np_test1 np_test2 while np_test1 is running, it looks like what is done is:

  • Stop instance np_test1
  • Copy instance working directory (incl. log file)
  • Update the in stance config file with
    • Change of the home directory (parameter home)
    • Remove the port number (parameter port)
    • Remove the user (parameter user)
  • Start instance np_test2

The above-mentioned sequence of actions - if accurate - does not seem logical.
Flaws are:

  • Stopping the source instance without restarting it.
    Actually do we need to stop the source instance? I suspect we do not.
  • Copying the source instance directory including the log file.
    To avoid any confusion, the destination instance should have no log file or an empty one.
    Actually, this could be done by copying the instance working directory & then running a full clean on the destination instance.
  • Removing the port number without assigning a new one and without providing a warning message about the absence of a port number may lead to errors.
  • Starting the destination instance in not the best idea as this instance will likely need configuration rework.
  • Starting the destination instance cannot work because the port number has been removed.

I did not test this with other component types, but suspect the behavior should be the same.

geneos start overrides a netprobe instance's collection-agent.yml

I am trying to deploy a statsd plugin for the Collection Agent. The netprobe is run through the geneos start command. If I follow the docs and add the statsd plugin configuration to /path/to/netprobe/instance/collection-agent.yml, starting the netprobe overrides the file back to the default state.

Here is the .yml file:

[geneosuser@cen7gen01 np-6.1.1-cordial]$ cat collection-agent.yml

plugin-directory: ${env:CA_PLUGIN_DIR}

monitoring:
  reporting-interval: 10000
  health-probe:
    enabled: true
    listen-port: ${env:HEALTH_CHECK_PORT}
  self-metrics:
    enabled: true
    dimensions:
      app: collection-agent


reporters:
  - type: tcp
    name: tcp
    hostname: localhost
    port: ${env:TCP_REPORTER_PORT}

workflow:
  store-directory: .
  metrics:
    reporter: tcp
    processors:
    - type: plugin
      name: geneos-workflow
      class-name: GeneosProcessor
  attributes:
    reporter: tcp
  events:
    reporter: tcp
  logs:
    reporter: tcp
  traces:
    enabled: false


#### statsd plugin for collection agent
# From https://docs.itrsgroup.com/docs/geneos/6.1.0/data-collection/statsd.htm#Configure_Geneos_to_deploy_StatsD

collectors:
  - name: statsd
    type: plugin
    class-name: StatsdServer

    # Transport protocol.  Can be udp (default) or tcp.
    transport-protocol: udp

    # Number of milliseconds between reporting intervals.  All metrics are aggregated and windowed per interval.
    # Defaults to 10 seconds.
    reporting-interval: 10000

    # Listen port.  Defaults to 8125.
    listen-port: 8125

    # Size (in bytes) of the listening socket's receive buffer.  If configured, an attempt will be made to re-size the
    # buffer, but it is not guaranteed to take the configured size.
    # Defaults to 5MB.
    receive-buffer-size: 5242880

    # Maximum supported message size (in bytes).  Messages over this size are dropped.
    # Should be configured in correlation with the statsd client max message size.
    # Defaults to 1432 for UDP and 4096 for TCP.
    max-message-size: 1432

    # Number of milliseconds after which a metric will be purged if no updates have been received.
    # Defaults to 24 hours.
    stale-metrics-threshold: 86400000


    # Optional settings for metric derived from collected metrics.
    derived-metrics:
      timers:
       # Defaults to false.
        enabled: false

        # Optional custom percentiles to publish. Default values shown.
        percentiles:
          - 99
          - 95
          - 90
          - 75
          - 50

I start all my instances (netprobe marked by ***):

[geneosuser@cen7gen01 np-6.1.1-cordial]$ geneos start
gateway "gw-6.1.1-cordial" started with PID 5439
licd "licd-6.1.0-cordial" started with PID 5440
netprobe "np-6.1.1-cordial" started with PID 5441               ***
webserver "ws-6.1.1-cordial" started with PID 5442

Double-check that netprobe is running:

[geneosuser@cen7gen01 np-6.1.1-cordial]$ geneos ps np-6.1.1-cordial
Type      Name              Host       PID   Ports        User        Group       Starttime                  Version            Home
netprobe  np-6.1.1-cordial  localhost  5441  [7036 9137]  geneosuser  geneosuser  2023-01-17T16:10:52+08:00  active_prod:6.1.1  /home/geneosuser/geneos/netprobe/netprobes/np-6.1.1-cordial

Double-check the collection-agent.yml:

[geneosuser@cen7gen01 np-6.1.1-cordial]$ cat collection-agent.yml

plugin-directory: ${env:CA_PLUGIN_DIR}

monitoring:
  reporting-interval: 10000
  health-probe:
    enabled: true
    listen-port: ${env:HEALTH_CHECK_PORT}
  self-metrics:
    enabled: true
    dimensions:
      app: collection-agent


reporters:
  - type: tcp
    name: tcp
    hostname: localhost
    port: ${env:TCP_REPORTER_PORT}

workflow:
  store-directory: .
  metrics:
    reporter: tcp
    processors:
    - type: plugin
      name: geneos-workflow
      class-name: GeneosProcessor
  attributes:
    reporter: tcp
  events:
    reporter: tcp
  logs:
    reporter: tcp
  traces:
    enabled: false

I am unsure if I am configuring the statsd plugin on the wrong configuration file, or if geneos start rewrites the instance's collection-agent.yml file every time.

Issue with `geneos update`

According to the documentation, the geneos update command should stop matching instances before updating the symlink, and restart them after the update is done.
Based on a test today, this is apparently not the case.
Test was done with netprobe and it was observed that the pid of netrobe processes was the same before & after the geneos update command was run. At the same time, the symlink (active_prod) had been changed.

Add login/logout for downloads

Add login and logout commands, similar to docker etc., and store credentials to download sites in AES encoded form for the user. Default AES key will be created if it doesn't already exist.

`geneos add host -I` fails to create directory structure on the remote host

Cordial v1.3.2.

When running geneos add host PsApac-GV-Dev-02 ssh://xxx.xxx.xxx.xxx -d -I under user itrs on host zzz.zzz.zzz.zzz where the geneos base directory is /opt/itrs, no directory structure is created on hos xxx.xxx.xxx.xxx under '/opt/itrs`.

[[email protected] ~]$ geneos add host PsApac-GV-Dev-02 ssh://xxx.xxx.xxx.xxx -d -I
2022-11-10T10:36:38Z DEBUG: tools/geneos/cmd/parseargs.go:47 cmd.parseArgs() > rawargs: [PsApac-GV-Dev-02 ssh://xxx.xxx.xxx.xxx]
2022-11-10T10:36:38Z DEBUG: tools/geneos/cmd/parseargs.go:63 cmd.parseArgs() > rawargs [PsApac-GV-Dev-02 ssh://xxx.xxx.xxx.xxx], params [], ct
2022-11-10T10:36:38Z DEBUG: tools/geneos/cmd/parseargs.go:214 cmd.cmdArgs() > map[args:["PsApac-GV-Dev-02","ssh://xxx.xxx.xxx.xxx"] ct: params:null wildcard:false] <nil>
2022-11-10T10:36:38Z DEBUG: tools/geneos/internal/host/ssh_linux.go:14 host.sshConnectAgent() > connecting to agent on /tmp/ssh-mvNTZvIeUK8C/agent.4566
2022-11-10T10:36:38Z DEBUG: tools/geneos/internal/host/ssh.go:104 host.(*Host).Dial() > host opened PsApac-GV-Dev-02 xxx.xxx.xxx.xxx:22 itrs
2022-11-10T10:36:38Z DEBUG: tools/geneos/internal/host/ssh.go:144 host.(*Host).DialSFTP() > remote opened PsApac-GV-Dev-02
2022-11-10T10:36:38Z DEBUG: tools/geneos/internal/geneos/component.go:181 geneos.MakeComponentDirs() > mkdirall /opt/itrs/packages/downloads
2022-11-10T10:36:38Z DEBUG: tools/geneos/internal/geneos/component.go:181 geneos.MakeComponentDirs() > mkdirall /opt/itrs/hosts
2022-11-10T10:36:38Z DEBUG: tools/geneos/internal/geneos/component.go:181 geneos.MakeComponentDirs() > mkdirall /opt/itrs/packages/fileagent
2022-11-10T10:36:38Z DEBUG: tools/geneos/internal/geneos/component.go:181 geneos.MakeComponentDirs() > mkdirall /opt/itrs/fileagent/fileagents
2022-11-10T10:36:38Z DEBUG: tools/geneos/internal/geneos/component.go:181 geneos.MakeComponentDirs() > mkdirall /opt/itrs/packages/downloads
2022-11-10T10:36:38Z DEBUG: tools/geneos/internal/geneos/component.go:181 geneos.MakeComponentDirs() > mkdirall /opt/itrs/hosts
2022-11-10T10:36:38Z DEBUG: tools/geneos/internal/geneos/component.go:181 geneos.MakeComponentDirs() > mkdirall /opt/itrs/packages/gateway
2022-11-10T10:36:38Z DEBUG: tools/geneos/internal/geneos/component.go:181 geneos.MakeComponentDirs() > mkdirall /opt/itrs/gateway/gateways
2022-11-10T10:36:38Z DEBUG: tools/geneos/internal/geneos/component.go:181 geneos.MakeComponentDirs() > mkdirall /opt/itrs/gateway/gateway_shared
2022-11-10T10:36:38Z DEBUG: tools/geneos/internal/geneos/component.go:181 geneos.MakeComponentDirs() > mkdirall /opt/itrs/gateway/gateway_config
2022-11-10T10:36:38Z DEBUG: tools/geneos/internal/geneos/component.go:181 geneos.MakeComponentDirs() > mkdirall /opt/itrs/gateway/templates
2022-11-10T10:36:38Z DEBUG: tools/geneos/internal/geneos/component.go:181 geneos.MakeComponentDirs() > mkdirall /opt/itrs/packages/netprobe
2022-11-10T10:36:38Z DEBUG: tools/geneos/internal/geneos/component.go:181 geneos.MakeComponentDirs() > mkdirall /opt/itrs/netprobe/netprobes
2022-11-10T10:36:38Z DEBUG: tools/geneos/internal/geneos/component.go:181 geneos.MakeComponentDirs() > mkdirall /opt/itrs/packages/fa2
2022-11-10T10:36:38Z DEBUG: tools/geneos/internal/geneos/component.go:181 geneos.MakeComponentDirs() > mkdirall /opt/itrs/fa2/fa2s
2022-11-10T10:36:38Z DEBUG: tools/geneos/internal/geneos/component.go:181 geneos.MakeComponentDirs() > mkdirall /opt/itrs/packages/netprobe
2022-11-10T10:36:38Z DEBUG: tools/geneos/internal/geneos/component.go:181 geneos.MakeComponentDirs() > mkdirall /opt/itrs/san/sans
2022-11-10T10:36:38Z DEBUG: tools/geneos/internal/geneos/component.go:181 geneos.MakeComponentDirs() > mkdirall /opt/itrs/san/templates
2022-11-10T10:36:38Z DEBUG: tools/geneos/internal/geneos/component.go:181 geneos.MakeComponentDirs() > mkdirall /opt/itrs/packages/licd
2022-11-10T10:36:38Z DEBUG: tools/geneos/internal/geneos/component.go:181 geneos.MakeComponentDirs() > mkdirall /opt/itrs/licd/licds
2022-11-10T10:36:38Z DEBUG: tools/geneos/internal/geneos/component.go:181 geneos.MakeComponentDirs() > mkdirall /opt/itrs/packages/webserver
2022-11-10T10:36:38Z DEBUG: tools/geneos/internal/geneos/component.go:181 geneos.MakeComponentDirs() > mkdirall /opt/itrs/webserver/webservers
[itrs@ip-zzz-zzz-zzz-zzz ~]$
[[email protected] ~]$ ls -ltra /opt/itrs/
total 0
drwxr-xr-x. 4 root root 32 Nov  9 09:08 ..
drwxr-xr-x. 2 itrs itrs  6 Nov  9 09:08 .
[[email protected] ~]$ ls -ltra /opt/
total 0
dr-xr-xr-x. 18 root root 236 Sep 23  2019 ..
drwxr-xr-x.  2 itrs itrs   6 Nov  9 09:08 itrs
drwxr-xr-x.  4 root root  32 Nov  9 09:08 .
[[email protected] ~]$

Start component based on port number

It is sometimes easier to say "start the component that listens on port 7123" for example, and it should be straight forward to look this up. Support for remotes is also straight forward, e.g. "7123@hostname"

Minor error on `geneos disable`

When running a geneos disable command on a protected instance, error message indicates cannot stop a protected instance, which seems to be the exact same error message as that used for geneos stop.
This is not quite correct or accurate, and should rather be "cannot disable a protected instance", or maybe have a common message, something like "cannot stop or disable a protected instance" or "operation cannot be performed on a protected instance".

geneos ps reports incorrect port for Web Servers

[geneosuser@cen7gen01 ws-6.1.1-cordial]$ geneos --version
geneos version v1.4.2

I added and started a Web Server instance.

[geneosuser@cen7gen01 ~]$ geneos add webserver ws-6.1.1-cordial
imported "config.xml.min.tmpl" to localhost:/home/geneosuser/geneos/webserver/webservers/ws-6.1.1-cordial/config/config.xml
imported "log4j.properties" to localhost:/home/geneosuser/geneos/webserver/webservers/ws-6.1.1-cordial/config/log4j.properties
imported "log4j2.properties" to localhost:/home/geneosuser/geneos/webserver/webservers/ws-6.1.1-cordial/config/log4j2.properties
imported "logging.properties" to localhost:/home/geneosuser/geneos/webserver/webservers/ws-6.1.1-cordial/config/logging.properties
imported "login.conf" to localhost:/home/geneosuser/geneos/webserver/webservers/ws-6.1.1-cordial/config/login.conf
imported "security.properties" to localhost:/home/geneosuser/geneos/webserver/webservers/ws-6.1.1-cordial/config/security.properties
imported "security.xml" to localhost:/home/geneosuser/geneos/webserver/webservers/ws-6.1.1-cordial/config/security.xml
imported "sso.properties" to localhost:/home/geneosuser/geneos/webserver/webservers/ws-6.1.1-cordial/config/sso.properties
imported "users.properties" to localhost:/home/geneosuser/geneos/webserver/webservers/ws-6.1.1-cordial/config/users.properties
webserver "ws-6.1.1-cordial" added, port 8080

The port that got assigned was 8080, and this is reflected in geneos show:

...
            "logfile": "webdashboard.log",
            "maxmem": "1024m",
            "name": "ws-6.1.1-cordial",
            "port": 8080,
            "program": "/home/geneosuser/geneos/packages/webserver/active_prod/JRE/bin/java",
...

But geneos ps reports a different port:

Type       Name              Host       PID   Ports   User        Group       Starttime                  Version            Home
webserver  ws-6.1.1-cordial  localhost  5442  [7042]  geneosuser  geneosuser  2023-01-17T16:10:52+08:00  active_prod:6.1.1  /home/geneosuser/geneos/webserver/webservers/ws-6.1.1-cordial

Could cause confusion for when users try to access the Web Dashboard on a web browser. Unless I am misunderstanding which port exactly is being shown through geneos ps

Questions about `geneos aes encode`

The following behaviour seem rather unexpected. Are they correct?

  • geneos aes encode netprobe -k /tmp/qwerty.aes prompts for a password (with need for 2 matching password entries) but returns nothing.
    On the other hand geneos aes encode -k /tmp/qwerty.aes -o prompts for a password (with only 1 entry) and returns an encoded password.
  • When specifying a TYPE in geneos aes encode, the command does not return anything if the TYPE is netprobe, but does it TYPE is gateway.
    For the former (netprobe), keyfiles exist in the component's shared directory.
    For the latter (gateway), keyfiles used are those listed in the keyfile parameter from gateway.json of each instance.

Concern with config file generated by `geneos add`

Cordial v1.3.2.

After running geneos add host PsApac-GV-Dev-02 ssh://xxx.xxx.xxx.xxx -d -I under user itrs on host zzz.zzz.zzz.zzz where the geneos base directory is /opt/itrs, it appears that:

  • On host zzz.zzz.zzz.zzz, nothing is written to /opt/itrs/hosts.
    [itrs@ip-zzz-zzz-zzz-zzz ~]$ ls -ltra /opt/itrs/hosts/
    total 0
    drwxrwxr-x.  2 itrs itrs   6 Nov  9 09:39 .
    drwxr-xr-x. 11 itrs itrs 134 Nov  9 09:39 ..
    [itrs@ip-zzz-zzz-zzz-zzz ~]$
    
  • On host zzz.zzz.zzz.zzz, a file geneos-hosts.json has been created in /home/itrs/.config instead of in /home/itrs/.config/geneos as expected.
    [itrs@ip-zzz-zzz-zzz-zzz ~]$ pwd
    /home/itrs
    [itrs@ip-zzz-zzz-zzz-zzz ~]$ ls -ltra ~/.config/
    total 8
    drwxr-xr-x.  2 itrs itrs   25 Nov  3 03:02 geneos
    drwx------. 15 itrs itrs 4096 Nov 10 06:32 ..
    -rw-r--r--.  1 itrs itrs  942 Nov 10 10:36 geneos-hosts.json
    drwxr-xr-x.  3 itrs itrs   45 Nov 10 10:36 .
    [itrs@ip-zzz-zzz-zzz-zzz ~]$ ls -ltra ~/.config/geneos
    total 4
    drwxr-xr-x. 2 itrs itrs   25 Nov  3 03:02 .
    -rw-r--r--. 1 itrs itrs 1158 Nov  9 09:39 geneos.json
    drwxr-xr-x. 3 itrs itrs   45 Nov 10 10:36 ..
    [itrs@ip-zzz-zzz-zzz-zzz ~]$
    

Question about `geneos set`

Cordial v1.3.2.

When running a geneos set command to add a dummy parameter (called rubbish) for an instance, that parameter gets written to the instance's json configuration file despite it not correspond to anything and not being used.
Is that behaviour expected?
If yes, it may be good to have a warning message highlighting that the newly set parameter is for info and not used // supported by the geneos utility.

$ geneos home gw_test1
/opt/itrs/gateway/gateways/gw_test1
$ grep "rubbish" /opt/itrs/gateway/gateways/gw_test1/gateway.json
$ geneos set gateway gw_test1 rubbish=junk -e ENV_TEST_1=TEST_VALUE_1
$ egrep "rubbish|ENV_TEST_1" /opt/itrs/gateway/gateways/gw_test1/gateway.json
    "ENV_TEST_1=TEST_VALUE_1"
  "rubbish": "junk",
$

New issue on `geneos init san` after #57 & #61

Commands with USERNAME & DIRECTORY provided are now marked as error, despite them following the documented syntax.
Also the 2nd example below used to execute before #61 was applied.

$ geneos init san itrs /opt/itrs -g gw_test1:7102 -a ATTR_1=VAL_1 -e ENV_VAR_1=ENV_VAL_1 -t TYPE_1 -v VAR_1=abc -v string:VAR_2=xyz
2022-11-22T02:41:11Z FATAL: tools/geneos/cmd/init.go:273 cmd.initProcessArgs() > too many args: [itrs /opt/itrs]

and also

$ geneos init san itrs /opt/itrs -g gw_test1:7102 -a ATTR_1=VAL_1 -e ENV_VAR_1=ENV_VAL_1 -t TYPE_1 -v VAR_1=abc
2022-11-22T02:42:43Z FATAL: tools/geneos/cmd/init.go:273 cmd.initProcessArgs() > too many args: [itrs /opt/itrs]

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.