duncs / clusterssh Goto Github PK
View Code? Open in Web Editor NEWCluster SSH - Cluster Admin Via SSH
Home Page: https://github.com/duncs/clusterssh/wiki
Cluster SSH - Cluster Admin Via SSH
Home Page: https://github.com/duncs/clusterssh/wiki
It would be great if there was a place (perhaps somewhere under the Hosts
menu) where I could see simple counts of the total number of sessions, number of active sessions and number of inactive sessions.
My setup is such that I need to connect to many different servers, and the number of servers changes every once-in-a-while. I usually update my clusters config file whenever the number of servers changes, but on one occasion I forgot to do that. This meant that I performed some updates on 15 servers, whereas I should have done it on 20.
Now, every time I launch cssh
and add a cluster, I find myself manually counting the number of sessions under the Hosts
menu, and checking that all of them are active. For added safety, I also count the terminal windows to ensure that I have the correct number of windows open.
If cssh
itself would just tell me these numbers somehow, it would save me a lot of time and effort.
Hi Duncs -
The text box seems to be locking up making the clusterssh functionality unusable. Its not an immediate thing and acts like there is slowness in the terminal. The terminals spawned by the process work fine.
There are 2 tests that fails due to a locale problem (I'm Italian):
Build test --test-files t/30cluster.t
Generating: ccon
Generating: crsh
Generating: cssh
Generating: ctel
t/30cluster.t .. 1/?
# Failed test 'Error on reading an existing file ok'
# at t/30cluster.t line 91.
# got: 'Unable to read file /home/work/clusterssh/t/30cluster.cannot_read: Permesso negato'
# expected: 'Unable to read file /home/work/clusterssh/t/30cluster.cannot_read: Permission denied'
# Looks like you failed 1 test of 71.
t/30cluster.t .. Dubious, test returned 1 (wstat 256, 0x100)
Failed 1/71 subtests
Test Summary Report
-------------------
t/30cluster.t (Wstat: 256 Tests: 71 Failed: 1)
Failed test: 9
Non-zero exit status: 1
Files=1, Tests=71, 0 wallclock secs ( 0.07 usr 0.01 sys + 0.45 cusr 0.10 csys = 0.63 CPU)
Result: FAIL
Failed 1/1 test programs. 1/71 subtests failed.
and:
Build test --test-files t/15config.t
Generating: ccon
Generating: crsh
Generating: cssh
Generating: ctel
t/15config.t .. 1/?
# Failed test 'got correct error message'
# at t/15config.t line 156.
# got: 'Unable to read file /home/work/clusterssh/t/15config.t.doesntexist: File o directory non esistente
# '
# expected: 'Unable to read file /home/work/clusterssh/t/15config.t.doesntexist: No such file or directory
# '
# Failed test 'die message correct'
# at t/15config.t line 424.
# got: 'Unable to create directory $HOME/.clusterssh: File già esistente
# '
# expected: 'Unable to create directory $HOME/.clusterssh: File exists
# '
# Failed test 'die message correct'
# at t/15config.t line 443.
# got: 'Unable to write default $HOME/.clusterssh/config: È una directory
# '
# expected: 'Unable to write default $HOME/.clusterssh/config: Is a directory
# '
# Failed test 'Expecting no STDERR'
# at t/15config.t line 463.
# got: 'Unable to create directory $HOME/.clusterssh: File già esistente
#
# '
# expected: 'Unable to create directory $HOME/.clusterssh: File exists
#
# '
# Failed test 'Expected die msg '
# at t/15config.t line 485.
# got: 'Unable to create directory $HOME/.clusterssh: Permesso negato
# '
# expected: 'Unable to create directory $HOME/.clusterssh: Permission denied
# '
# Failed test 'Expecting no STDERR'
# at t/15config.t line 503.
# got: 'Unable to write default $HOME/.clusterssh/config: È una directory
#
# '
# expected: 'Unable to write default $HOME/.clusterssh/config: Is a directory
#
# '
# Looks like you failed 6 tests of 155.
t/15config.t .. Dubious, test returned 6 (wstat 1536, 0x600)
Failed 6/155 subtests
Test Summary Report
-------------------
t/15config.t (Wstat: 1536 Tests: 155 Failed: 6)
Failed tests: 12, 127, 134, 141, 146, 151
Non-zero exit status: 6
Files=1, Tests=155, 1 wallclock secs ( 0.09 usr 0.02 sys + 0.42 cusr 0.05 csys = 0.58 CPU)
Result: FAIL
Failed 1/1 test programs. 6/155 subtests failed.
I think you can test them with: LANG=it_IT Build test
The good news is that I've worked for you and I think that to avoid these problems is sufficient to add:
use POSIX qw(setlocale locale_h);
....
setlocale(LC_ALL, "C");
within these scripts.
Best regards,
Emanuele
Hi,
Could you please add in the sources the bash completion script you wrote (http://sourceforge.net/p/clusterssh/feature-requests/13/#4c46)? That would allow to keep it up to date and ease contributions.
Thanks,
Accordingly to the manpage, there is an extra_tag_file
configure option in the config file. Unfortunately this seems not to work actually:
$ cssh -v
Version: 4.03_06
$ cssh foo
Unknown configuration parameters: extra_tag_file
$ grep extra_tag_file ~/.clusterssh/config
extra_tag_file = /home/waja/.clusterssh/tags
$ man cssh | grep -1 extra_tag_file
Extra tag files may be specified either as an option (see "tag-file") or within the user's
$HOME/.clusterssh/config file (see "extra_tag_file" configuration option).
Many thanks for looking into it.
I changed window_tiling_direction in the config file and now all the windows are piled on top of each other in the top left corner. Setting it back to default works.
On 4.03_06 on cygwin
Hello,
I'm using cssh to manage several machines on which I run long-running algorithms. Often, my connections are disconnected after some time of inaction. If something went wrong, I need to be able to check it in the current connection. Is there anyway to handle longer keep alive ?
Thanks
After building the latest release App-ClusterSSH-4.03_06 on up-to-date Arch Linux system, ccon and ctel ends with the same message:
~]$ ccon --version
Version: 4.03_06
~]$ ccon
Can't locate object method "options" via package "App::ClusterSSH::Getopt" at /usr/share/perl5/vendor_perl/App/ClusterSSH.pm line 1943.
which seems not to be the expected behavior.
Package details can be found here: clusterssh in testing repo
And a link to the PKGBUILD instruction.
Regards.
Running linux arch here and cssh has run succesfully for over a year - however a recent update must mean that something has changed in the /etc/clusters file, as I'm getting the error once I run. I've edited down my /etc/clusters to be as simple as possible (with only one server to simplify the issue) and it looks like this:
clusters = ubuntu
ubuntu = my.server.here
then running it, I get:
[adam@hark .clusterssh]$ cssh -l adam ubuntu
Opening to: = my.server.here
Unable to parse hostname from ""
Any ideas?
I often connect to groups of hosts whose membership is created from scripts and reports. Because the groups of hosts are dynamic, it doesn't make sense to put them into the .clusterssh/clusters file. I've gotten tired of typing cssh $(cat hosts.txt)
and want something that's less work to type and will work with my bash completion.
I'm going to add a feature to my local copy of ClusterSSH that will have it connect to a list of hosts in a text file (one host name per line). I'd be happy to submit a pull request if you're interested. If so, do you have a recommendation for the command line switches to use? I was planning on using --hosts
and -H
(taking it away from the --man
option).
1ebf8b0 is not a hash at /usr/lib64/perl5/vendor_perl/Tk/MainWindow.pm line 53.
Aborted (core dumped)
I just built ClusterSSH on RHEL 7 with the Mate desktop. I have tried ClusterSSH including 4.03_03, and 3.28. Note, if I am running the Gnome desktop (i.e. Gnome Classic), everything works fine. But each time I try to bring up ClusterSSH under Mate, I receive the above error (although the initial hash value changes each time).
Add version number of GPL license to readme as it does not specify which version. GPL-2.0, GPL-3.0? GPL-2.0+ etc?
I've created a patch that seems to work to resolved the, quite common among KDE5 users, problem of using cssh and then having unmoveable windows. Although I'm not convinced the issue is with cssh, this workaround seems to fix the glitch until the KDE side can fix it. It also, doesn't seem to, cause any problems. I cannot seem to attach in this bug report, however, it is a small patch, so I'll add it inline here:
From 395f9ab3f6e9b97ffca6403cdf693582ddd2079e Mon Sep 17 00:00:00 2001
From: Brandon Perkins <[email protected]>
Date: Fri, 6 Nov 2015 16:19:03 -0500
Subject: [PATCH] Remove 'time' key from the event hash.
---
lib/App/ClusterSSH.pm | 2 --
1 file changed, 2 deletions(-)
diff --git a/lib/App/ClusterSSH.pm b/lib/App/ClusterSSH.pm
index 50bb8e8..179d3b8 100644
--- a/lib/App/ClusterSSH.pm
+++ b/lib/App/ClusterSSH.pm
@@ -572,7 +572,6 @@ sub send_text($@) {
'name' => $event,
'detail' => $code,
'state' => $state,
- 'time' => time(),
'event' => $servers{$svr}{wid},
'root' => $xdisplay->root(),
'same_screen' => 1,
@@ -1689,7 +1688,6 @@ sub key_event {
'name' => $event,
'detail' => $keycode,
'state' => $state,
- 'time' => time(),
'event' => $servers{$_}{wid},
'root' => $xdisplay->root(),
'same_screen' => 1,
--
2.5.0
There are a number of related bugs around, I'll list a few here:
https://bugs.kde.org/show_bug.cgi?id=348569
https://bugzilla.redhat.com/show_bug.cgi?id=1254254
https://bugs.kde.org/show_bug.cgi?id=351490
https://bugreports.qt.io/browse/QTBUG-28398
https://bugs.launchpad.net/ubuntu/+source/qt4-x11/+bug/479740
https://bugs.gentoo.org/show_bug.cgi?id=276527
http://comments.gmane.org/gmane.network.vnc.tigervnc.user/631
https://bugzilla.redhat.com/show_bug.cgi?id=1235024
https://bugzilla.redhat.com/show_bug.cgi?id=1253496
With a German locale (LC_ALL=de_DE.UTF-8 or de_DE.ISO8859-1):
# Failed test 'Error on reading an existing file ok'
# at t/30cluster.t line 89.
# got: 'Unable to read file /usr/home/eserte/.cpan/build/2015112115/App-ClusterSSH-4.04_01-KtBzuO/t/30cluster.cannot_read: Zugriff verweigert'
# expected: 'Unable to read file /usr/home/eserte/.cpan/build/2015112115/App-ClusterSSH-4.04_01-KtBzuO/t/30cluster.cannot_read: Permission denied'
# Looks like you failed 1 test of 77.
t/30cluster.t .....
Dubious, test returned 1 (wstat 256, 0x100)
Failed 1/77 subtests
I have two monitors. Whenever I run cssh
it always opens the windows on the left hand (primary) monitor, even if I run the command from the right hand workspace. It should probably default to using the window it was run from.
For modern desktop environments that can be quite annoying.
Cheers,
James
Hi, @duncs.
When compiling ClusterSSH 3.x, I could set a prefix installation directory with something like this:
# ./configure --prefix=/usr
# make
# make install DESTDIR=$PKG
How can I get the same with the new 4.x build process? This is particularly useful to make packages good for distros.
Hello,
This issue was reported in 2011 against the Debian release :
https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=635513
I hit the same bug with the Ubuntu package clusterssh v4.03.06-1
When using foreign keyboard layouts (German QWERTZ for the Debian bug's issuer, and French AZERTY for me), some specials characters being pasted into clusterssh result in a perl error, while typing them directly in the clusterssh window works.
Additional info is available in the Debian bug report, including workarounds for QWERTZ and AZERTY keyboards.
Let me know if more debug info is needed.
Sylvain
Hi Duncan,
If I type this from the command line:
cssh devstack0{1..5} &
it works as expected, i.e. it opens 5 xterm sessions to devstack01, 02, 03, 04 and 05.
But if I put something simlar in ~/.clusterssh/clusters
devstack devstack0{1..5}
When I run
cssh devstack
from the prompt, all I get is:
Opening to: devstack0{1..5}
Unable to parse hostname from "devstack0{1..5}"
$
What is the correct way to define a name range in the clusters file?
Thanks in advance
Loris
It would be great if there was a way to pick the working dir to start in for each terminal.
Tests like including:
--action 'screen -xRR'
work just fine, but things like:
--action 'cd /tmp && screen -xRR'
don't work at all... Not sure why actually.
It would expand upon the functionality added to the other tools in this commit:
purpleidea/oh-my-vagrant@ed32d70
Thanks in advance for any suggestions and fixes!
I just installed ClusterSSH and fired it up. The OS is CentOS 6.6 and the perl version id 5.10.1.
Here is the final few messages with --debug set to a value of 4
Any ideas?
TIA
Terry
Resolving cluster names: completed
create_windows: started
REAPER currently returns: -1
Running tags through external command
External command:
Args -L
Running -L
Command value = -L
Result:
Return code: 72057594037927935
Exiting via normal routine
Exiting via normal routine
Exiting via normal routine
Exiting via normal routine
Exiting via normal routine
Exiting via normal routine
Exiting via normal routine
Installation on cygwin
followed these instructions basically http://lifeofageekadmin.com/how-to-install-clusterssh-on-cygwin/
Using version 4.03_06
I had a few issues. I got past everything but these are the problems I had.
Hi - as the Debian package maintainer for clusterssh, I'm forwarding a bug report regarding have Control-q as the default for key_quit. At least one user has been caught off-guard by this, after using Control-s to pause terminal output, that user was unable to resume.
I'm considering patching the Debian packaging to either use a different key combination for key_quit, or to not configure it by default, but thought that I would bring up the question here. The Debian bug report is #805868.
Thank you for considering it.
the -A / use_all_a_records option is not functional in 4.02_03. Have not tested earlier versions.
I suspect this is because the code starting at ClusterSSH.pm line 402 does not repopulate @tag_list with the expanded results. Adding:
@tag_list = $self->cluster->get_tag($dirty);
as in the following diff causes the feature to start working.
--- App-ClusterSSH-4.02_03/lib/App/ClusterSSH.pm 2014-01-31 08:34:42.000000000 +0000
+++ App-ClusterSSH-4.02_03.new/lib/App/ClusterSSH.pm 2014-05-01 11:14:45.501281229 +0100
@@ -410,6 +410,7 @@
$self->cluster->register_tag( $dirty, @alladdrs );
logmsg( 3, 'Expanded to ',
$self->cluster->get_tag($dirty) );
@tag_list = $self->cluster->get_tag($dirty);
}
else {
logmsg( 3, 'Only one A record' );
Hi,
If I look at the repo here on GitHub in the header there a link to the Cluster SSH project on SourceForge. However, the README
says that the website is GitHub and points to GitHub for code and issues. At the same time, the SourceForge project list as project website the wiki here on GitHub. Finally if I look at the releases on GitHub and on SourceForge they are respectively v. 4.03_03
(Sept 2014) and v. 4.07
(Apr 2016)¸ so it seems that the most up-to-date release is available through SourceForge.
This situation is a little bit confusing.
Maybe is worth specifying in the README:
Thanks!
When I upgraded from 4.02 to 4.04(on arch) I got the following error:
Can't locate object method "options" via package "App::ClusterSSH::Getopt" at /usr/share/perl5/vendor_perl/App/ClusterSSH.pm line 1988.
else {
$self->config->{ssh_args} = $self->options->options
if ( $self->options->options );
Commenting these 2 lines at 1988/1989 makes it work again but I'm not sure what it does. My perl skills are not good enough :(.
Hello, is there a way to connect to tunneled hosts (by passing the -t option )?
for example
ssh -t server -Pxxxx -t ssh node1 -Pyyyy
Hi Duncs - I use a clusterssh fork you probably know called csshX on mac osx. I really like how cleanly hotkeys work with the interface and how easy it is to control window placement. I don't know if this is due to the underlying mac implementation of the terminal app - I'm not an expert in this area. The only clunky thing with that implementation is the Control-A activation sequence which is used for many other things, but is in fact configurable. Without know what it would take - would you ever consider moving in this direction?
'man cssh' and 'cssh --help' report:
--autoclose,-A
Number of seconds to wait before closing finished terminal windows.
and later:
--use_all_a_records,-A
duplicating the -A. Seems this is purely a documentation error, though, as @options_spec in ClusterSSH.pm says autoclose uses -K on line 112:
'autoclose|K=i',
ClusterSSH connects to hosts in sorted order, but the sort is ASCII-betical. It would be very helpful if the sort was in natural order.
For servers with names "server1" through "server12", and "SERVER5" in uppercase, I get the following connection and window order:
SERVER5
server1
server10
server11
server12
server2
server3
server4
server6
server7
server8
server9
Expected result:
server1
server2
server3
server4
SERVER5
server6
server7
server8
server9
server10
server11
server12
Hey is it currently possible to log the output of your terminal sessions when using CSSH? What would be the arguments used? I cannot find anything in the documentation.
Hi @duncs,
I'm trying to compile the new 4.03_02. When running the test, I get this:
# LANG=en_US.UTF-8 ./Build test
Generating: ccon
Generating: crsh
Generating: cssh
Generating: ctel
t/00-load.t ....... ok
t/01l10n.t ........ ok
t/02base.t ........ ok
t/05getopts.t ..... ok
t/10host.t ........ ok
t/15config.t ...... 1/?
# Failed test 'died ok'
# at t/15config.t line 479.
# got: 'return'
# expected: 'die'
# Failed test 'Expecting no STDERR'
# at t/15config.t line 482.
# got: 'Moved $HOME/.csshrc to $HOME/.csshrc.DISABLED
# Created new configuration file within $HOME/.clusterssh/
# '
# expected: ''
# Failed test 'Expected die msg Moved $HOME/.csshrc to $HOME/.csshrc.DISABLED
# Created new configuration file within $HOME/.clusterssh/
# '
# at t/15config.t line 483.
# got: undef
# expected: 'Unable to create directory $HOME/.clusterssh: Permission denied
# '
# Looks like you failed 3 tests of 155.
t/15config.t ...... Dubious, test returned 3 (wstat 768, 0x300)
Failed 3/155 subtests
t/20helper.t ...... ok
t/30cluster.t ..... ok
t/80clusterssh.t .. ok
t/boilerplate.t ... ok
t/changes.t ....... ok
t/manifest.t ...... ok
t/pod-coverage.t .. ok
t/pod.t ........... ok
Test Summary Report
-------------------
t/15config.t (Wstat: 768 Tests: 155 Failed: 3)
Failed tests: 142, 145-146
Non-zero exit status: 3
Files=14, Tests=1566, 4 wallclock secs ( 0.45 usr 0.04 sys + 3.78 cusr 0.26 csys = 4.53 CPU)
Result: FAIL
Failed 1/14 test programs. 3/1566 subtests failed.
I'm running these as root, so the permission denied seems to be bogus.
Hi!
Whenever I start cluster ssh, the window tiling does not really tile the windows.
Rather I have two stacks with windows overlapping each other on two monitors.
I attached a screenshot.
On the left, there are 7 windows over each other, and on the right as well. So my first step is always to tile the windows manually.
I am using Ubuntu 14.04, Gnome-Shell.
I have set window_tiling = yes
in ~/.clusterssh/config
.
Please tell me, if you need further info.
As the title says, if you send the remote host name to two xterms open to the same host, one receives a '1' suffixed to the host name.
On my freebsd smokers t/30cluster.t
fails:
/bin/bash: not found
# Failed test 'glob1 expansion, words'
# at t/30cluster.t line 268.
# Structures begin differing at:
# $got->[0] = Does not exist
# $expected->[0] = 'aa'
/bin/bash: not found
# Failed test 'glob2 expansion, words'
# at t/30cluster.t line 274.
# Structures begin differing at:
# $got->[0] = Does not exist
# $expected->[0] = 'ax'
... etc. ...
Maybe the failure is related to the error message about bash not eing found. bash is installed on this system, but in the location /usr/local/bin/bash
(like probably on most non-linux systems). And bash is not part of a default freebsd install, so it may be missing completely (like probably on other non-linux systems, too). Maybe better to use /bin/sh
instead?
Hi!
./Build test
passes fine when running as a normal user, but
sudo ./Build test
gives me this:
Generating: ccon
Generating: crsh
Generating: cssh
Generating: ctel
t/00-load.t ....... ok
t/01l10n.t ........ ok
t/02base.t ........ ok
t/05getopts.t ..... ok
t/10host.t ........ ok
t/15config.t ...... 1/?
# Failed test 'died ok'
# at t/15config.t line 479.
# got: 'return'
# expected: 'die'
# Failed test 'Expecting no STDERR'
# at t/15config.t line 482.
# got: 'Moved $HOME/.csshrc to $HOME/.csshrc.DISABLED
# Created new configuration file within $HOME/.clusterssh/
# '
# expected: ''
# Failed test 'Expected die msg Moved $HOME/.csshrc to $HOME/.csshrc.DISABLED
# Created new configuration file within $HOME/.clusterssh/
# '
# at t/15config.t line 483.
# got: undef
# expected: 'Unable to create directory $HOME/.clusterssh: Permission denied
# '
# Looks like you failed 3 tests of 155.
t/15config.t ...... Dubious, test returned 3 (wstat 768, 0x300)
Failed 3/155 subtests
t/20helper.t ...... ok
t/30cluster.t ..... ok
t/80clusterssh.t .. ok
t/boilerplate.t ... ok
t/changes.t ....... ok
t/manifest.t ...... ok
t/pod-coverage.t .. ok
t/pod.t ........... ok
Test Summary Report
-------------------
t/15config.t (Wstat: 768 Tests: 155 Failed: 3)
Failed tests: 142, 145-146
Non-zero exit status: 3
Files=14, Tests=1566, 3 wallclock secs ( 0.18 usr 0.01 sys + 2.04 cusr 0.11 csys = 2.34 CPU)
Result: FAIL
Failed 1/14 test programs. 3/1566 subtests failed.
Here is a bit more verbose output, calling t/15config.t
directly:
ok 1 - use App::ClusterSSH::Config;
ok 2 - An object of class 'App::ClusterSSH::Config' isa 'App::ClusterSSH::Config'
ok 3 - default config is correct
ok 4 - An object of class 'App::ClusterSSH::Exception::Config' isa 'App::ClusterSSH::Exception::Config'
ok 5 - got correct error message
ok 6 - Picked up unknown config array
ok 7 - An object of class 'App::ClusterSSH::Config' isa 'App::ClusterSSH::Config'
ok 8 - validated ok
ok 9 - An object of class 'App::ClusterSSH::Config' isa 'App::ClusterSSH::Config'
ok 10 - default config is correct
ok 11 - An object of class 'App::ClusterSSH::Exception::LoadFile' isa 'App::ClusterSSH::Exception::LoadFile'
ok 12 - got correct error message
# using /mnt/gyalu/slackbuilds/tmp/App-ClusterSSH-4.03_02/t/15config.t.file1
ok 13 - returned ok
ok 14 - returned ok
ok 15 - An object of class 'App::ClusterSSH::Config' isa 'App::ClusterSSH::Config'
ok 16 - Expecting no STDOUT
ok 17 - Expecting no STDERR
ok 18 - amended config is correct
# using /mnt/gyalu/slackbuilds/tmp/App-ClusterSSH-4.03_02/t/15config.t.file2
ok 19 - died ok
ok 20 - An object of class 'App::ClusterSSH::Exception::Config' isa 'App::ClusterSSH::Exception::Config'
ok 21 - die message correct
ok 22 - An object of class 'App::ClusterSSH::Config' isa 'App::ClusterSSH::Config'
ok 23 - Expecting no STDOUT
ok 24 - Expecting no STDERR
ok 25 - amended config is correct
# using /mnt/gyalu/slackbuilds/tmp/App-ClusterSSH-4.03_02/t/15config.t.file3
ok 26 - returned ok
ok 27 - returned ok
ok 28 - An object of class 'App::ClusterSSH::Config' isa 'App::ClusterSSH::Config'
ok 29 - Expecting no STDOUT
ok 30 - Expecting no STDERR
# find_binary tests
ok 31 - died ok
ok 32 - An object of class 'App::ClusterSSH::Exception::Config' isa 'App::ClusterSSH::Exception::Config'
ok 33 - An object of class 'App::ClusterSSH::Config' isa 'App::ClusterSSH::Config'
ok 34 - die message correct
ok 35 - An object of class 'App::ClusterSSH::Config' isa 'App::ClusterSSH::Config'
ok 36 - Expecting no STDOUT
ok 37 - Expecting no STDERR
ok 38 - amended config is correct
ok 39 - died ok
ok 40 - An object of class 'App::ClusterSSH::Exception::Config' isa 'App::ClusterSSH::Exception::Config'
ok 41 - An object of class 'App::ClusterSSH::Config' isa 'App::ClusterSSH::Config'
ok 42 - die message correct
ok 43 - An object of class 'App::ClusterSSH::Config' isa 'App::ClusterSSH::Config'
ok 44 - Expecting no STDOUT
ok 45 - Expecting no STDERR
ok 46 - amended config is correct
ok 47 - returned ok
ok 48 - An object of class 'App::ClusterSSH::Config' isa 'App::ClusterSSH::Config'
ok 49 - An object of class 'App::ClusterSSH::Config' isa 'App::ClusterSSH::Config'
ok 50 - Expecting no STDOUT
ok 51 - Expecting no STDERR
ok 52 - amended config is correct
ok 53 - Found correct path to "ls"
ok 54 - returned ok
ok 55 - An object of class 'App::ClusterSSH::Config' isa 'App::ClusterSSH::Config'
ok 56 - An object of class 'App::ClusterSSH::Config' isa 'App::ClusterSSH::Config'
ok 57 - Expecting no STDOUT
ok 58 - Expecting no STDERR
ok 59 - amended config is correct
ok 60 - Found correct path to "ls"
ok 61 - No change made from find_binary
ok 62 - returned ok
ok 63 - An object of class 'App::ClusterSSH::Config' isa 'App::ClusterSSH::Config'
ok 64 - An object of class 'App::ClusterSSH::Config' isa 'App::ClusterSSH::Config'
ok 65 - Expecting no STDOUT
ok 66 - Expecting no STDERR
ok 67 - amended config is correct
ok 68 - Found correct path to "ls"
ok 69 - No change made from find_binary
# Checks on loading configs
# empty dir
ok 70 - returned ok
ok 71 - An object of class 'App::ClusterSSH::Config' isa 'App::ClusterSSH::Config'
ok 72 - An object of class 'App::ClusterSSH::Config' isa 'App::ClusterSSH::Config'
ok 73 - die message correct
ok 74 - Expecting no STDOUT
ok 75 - Got correct STDERR output for .csshrc
ok 76 - .clusterssh dir exists
ok 77 - .clusterssh config file exists
ok 78 - amended config is correct
# .csshrc warning
ok 79 - returned ok
ok 80 - An object of class 'App::ClusterSSH::Config' isa 'App::ClusterSSH::Config'
ok 81 - An object of class 'App::ClusterSSH::Config' isa 'App::ClusterSSH::Config'
ok 82 - die message correct
ok 83 - Expecting no STDOUT
ok 84 - Got correct STDERR output for .csshrc
ok 85 - .clusterssh dir exists
ok 86 - .clusterssh config file exists
ok 87 - amended config is correct
# .csshrc warning and .clusterssh dir plus config
ok 88 - returned ok
ok 89 - An object of class 'App::ClusterSSH::Config' isa 'App::ClusterSSH::Config'
ok 90 - An object of class 'App::ClusterSSH::Config' isa 'App::ClusterSSH::Config'
ok 91 - die message correct
ok 92 - Expecting no STDOUT
ok 93 - Got correct STDERR output for .csshrc
ok 94 - .clusterssh dir exists
ok 95 - .clusterssh config file exists
ok 96 - amended config is correct
# no .csshrc warning and .clusterssh dir
ok 97 - returned ok
ok 98 - An object of class 'App::ClusterSSH::Config' isa 'App::ClusterSSH::Config'
ok 99 - An object of class 'App::ClusterSSH::Config' isa 'App::ClusterSSH::Config'
ok 100 - die message correct
ok 101 - Expecting no STDOUT
ok 102 - Expecting no STDERR
ok 103 - .clusterssh dir exists
ok 104 - .clusterssh config file exists
ok 105 - amended config is correct
# no .csshrc warning, .clusterssh dir plus config + extra config
ok 106 - returned ok
ok 107 - An object of class 'App::ClusterSSH::Config' isa 'App::ClusterSSH::Config'
ok 108 - An object of class 'App::ClusterSSH::Config' isa 'App::ClusterSSH::Config'
ok 109 - die message correct
ok 110 - Expecting no STDOUT
ok 111 - Expecting no STDERR
ok 112 - .clusterssh dir exists
ok 113 - .clusterssh config file exists
ok 114 - amended config is correct
# no .csshrc warning, .clusterssh dir plus config + more extra configs
ok 115 - returned ok
ok 116 - An object of class 'App::ClusterSSH::Config' isa 'App::ClusterSSH::Config'
ok 117 - An object of class 'App::ClusterSSH::Config' isa 'App::ClusterSSH::Config'
ok 118 - die message correct
ok 119 - Expecting no STDOUT
ok 120 - Expecting no STDERR
ok 121 - .clusterssh dir exists
ok 122 - .clusterssh config file exists
ok 123 - amended config is correct
# check .clusterssh file is an error
ok 124 - died ok
ok 125 - An object of class 'App::ClusterSSH::Exception::Config' isa 'App::ClusterSSH::Exception::Config'
ok 126 - An object of class 'App::ClusterSSH::Config' isa 'App::ClusterSSH::Config'
ok 127 - die message correct
ok 128 - An object of class 'App::ClusterSSH::Config' isa 'App::ClusterSSH::Config'
ok 129 - Expecting no STDOUT
ok 130 - Expecting no STDERR
# check failure to write default config is caught
ok 131 - died ok
ok 132 - An object of class 'App::ClusterSSH::Exception::Config' isa 'App::ClusterSSH::Exception::Config'
ok 133 - An object of class 'App::ClusterSSH::Config' isa 'App::ClusterSSH::Config'
ok 134 - die message correct
ok 135 - An object of class 'App::ClusterSSH::Config' isa 'App::ClusterSSH::Config'
ok 136 - Expecting no STDOUT
ok 137 - Expecting no STDERR
# check .clusterssh errors via load_configs are not fatal
ok 138 - died ok
ok 139 - An object of class 'App::ClusterSSH::Config' isa 'App::ClusterSSH::Config'
ok 140 - Expecting no STDOUT
ok 141 - Expecting no STDERR
# move of .csshrc failure
not ok 142 - died ok
# Failed test 'died ok'
# at 15config.t line 479.
# got: 'return'
# expected: 'die'
ok 143 - An object of class 'App::ClusterSSH::Config' isa 'App::ClusterSSH::Config'
ok 144 - Expecting no STDOUT
not ok 145 - Expecting no STDERR
# Failed test 'Expecting no STDERR'
# at 15config.t line 482.
# got: 'Moved $HOME/.csshrc to $HOME/.csshrc.DISABLED
# Created new configuration file within $HOME/.clusterssh/
# '
# expected: ''
not ok 146 - Expected die msg Moved $HOME/.csshrc to $HOME/.csshrc.DISABLED
# Created new configuration file within $HOME/.clusterssh/
#
# Failed test 'Expected die msg Moved $HOME/.csshrc to $HOME/.csshrc.DISABLED
# Created new configuration file within $HOME/.clusterssh/
# '
# at 15config.t line 483.
# got: undef
# expected: 'Unable to create directory $HOME/.clusterssh: Permission denied
# '
# check failure to write default config is caught
ok 147 - returned ok
ok 148 - An object of class 'App::ClusterSSH::Config' isa 'App::ClusterSSH::Config'
ok 149 - An object of class 'App::ClusterSSH::Config' isa 'App::ClusterSSH::Config'
ok 150 - Expecting no STDOUT
ok 151 - Expecting no STDERR
# Checking dump
ok 152 - An object of class 'App::ClusterSSH::Config' isa 'App::ClusterSSH::Config'
ok 153 - die message correct
ok 154 - Expecting no STDOUT
ok 155 - Expecting no STDERR
1..155
# Looks like you failed 3 tests of 155.
Daniel
"Set All Active" and "Set Half Active" don't work since logmsg has been removed. They produce an error on the console and have no effect:
Tk::Error: Undefined subroutine &App::ClusterSSH::logmsg called at /usr/local/share/perl/5.18.2/App/ClusterSSH.pm line 1167.
Tk callback for .#menu.#menu#hosts
Tk::__ANON__ at /usr/lib/perl5/Tk.pm line 251
Tk::Menu::Invoke at /usr/lib/perl5/Tk/Menu.pm line 532
<ButtonRelease>
(command bound to event)
Hi all,
I'm trying to install clusterssh 4.04 on a RHEL 6 server, with
perl-Tk-804.028-12.el6.x86_64
perl-X11-Protocol-0.56-4.el6.noarch
I connect via PuTTY.
xterm on its own starts ok.
cssh -e devjenkins01 seems to complete ok.
cssh -u gets me a Segmentation Fault
$ cssh --debug 4 -u
Loading in config file: /home/lserena/.clusterssh/config
Loading in config file: /home/lserena/.clusterssh/config
Looking for xterm
Looking for xterm in /usr/local/bin
Looking for xterm in /bin
Looking for xterm in /usr/bin
Found at /usr/bin/xterm
VERSION: 4.04
Fetching font size
Done with font size
Loading keymaps and keycodes
Unknown keycode 16785456
Unknown keycode 16785482
Unknown keycode 5053
Unknown keycode 5052
Unknown keycode 16785456
Unknown keycode 16777618
Unknown keycode 269024801
Unknown keycode 269024769
Unknown keycode 269024770
Unknown keycode 269024771
Unknown keycode 269024772
Unknown keycode 269024773
Unknown keycode 269024774
Unknown keycode 269024775
Unknown keycode 269024776
Unknown keycode 269024777
Unknown keycode 269024778
Unknown keycode 269024803
Unknown keycode 269024802
Unknown keycode 269024779
Unknown keycode 269024780
Unknown keycode 269024800
Loading in clusters from: /etc/clusters
Reading clusters from file /etc/clusters
No file found to read
Loading in clusters from: /home/lserena/.clusterssh/clusters
Reading clusters from file /home/lserena/.clusterssh/clusters
Loading in config file: /home/lserena/.clusterssh/clusters
two=dc1xjmp02 devjenkins01
Registering tag two: dc1xjmp02 devjenkins01
Loading in tags from: /etc/tags
Reading tags from file /etc/tags
No file found to read
Loading in tags from: /home/lserena/.clusterssh/tags
Reading tags from file /home/lserena/.clusterssh/tags
No file found to read
Tag default is not registered
create_windows: started
Segmentation fault
$
cssh devjenkins01 also gets me a Segmentation Fault
$ cssh --debug 4 devjenkins01
Loading in config file: /home/lserena/.clusterssh/config
Loading in config file: /home/lserena/.clusterssh/config
Looking for xterm
Looking for xterm in /usr/local/bin
Looking for xterm in /bin
Looking for xterm in /usr/bin
Found at /usr/bin/xterm
VERSION: 4.04
Fetching font size
Done with font size
Loading keymaps and keycodes
Unknown keycode 16785456
Unknown keycode 16785482
Unknown keycode 5053
Unknown keycode 5052
Unknown keycode 16785456
Unknown keycode 16777618
Unknown keycode 269024801
Unknown keycode 269024769
Unknown keycode 269024770
Unknown keycode 269024771
Unknown keycode 269024772
Unknown keycode 269024773
Unknown keycode 269024774
Unknown keycode 269024775
Unknown keycode 269024776
Unknown keycode 269024777
Unknown keycode 269024778
Unknown keycode 269024803
Unknown keycode 269024802
Unknown keycode 269024779
Unknown keycode 269024780
Unknown keycode 269024800
Loading in clusters from: /etc/clusters
Reading clusters from file /etc/clusters
No file found to read
Loading in clusters from: /home/lserena/.clusterssh/clusters
Reading clusters from file /home/lserena/.clusterssh/clusters
Loading in config file: /home/lserena/.clusterssh/clusters
two=dc1xjmp02 devjenkins01
Registering tag two: dc1xjmp02 devjenkins01
Loading in tags from: /etc/tags
Reading tags from file /etc/tags
No file found to read
Loading in tags from: /home/lserena/.clusterssh/tags
Reading tags from file /home/lserena/.clusterssh/tags
No file found to read
Resolving cluster names: started
Checking tag devjenkins01
Tag devjenkins01 is not registered
leaving with devjenkins01
Resolving cluster names: completed
create_windows: started
Segmentation fault
$
Can you please advise how to troubleshoot this further?
Thanks a mill
Loris
All seems ok:
$> LANG=C Build test
Generating: ccon
Generating: crsh
Generating: cssh
Generating: ctel
t/00-load.t ....... ok
t/01l10n.t ........ ok
t/02base.t ........ ok
t/05getopts.t ..... ok
t/10host.t ........ ok
t/15config.t ...... ok
t/20helper.t ...... ok
t/30cluster.t ..... ok
t/80clusterssh.t .. ok
t/boilerplate.t ... ok
t/changes.t ....... ok
t/manifest.t ...... ok
t/pod-coverage.t .. ok
t/pod.t ........... ok
All tests successful.
Files=14, Tests=1561, 9 wallclock secs ( 0.75 usr 0.08 sys + 5.28 cusr 0.55 csys = 6.66 CPU)
Result: PASS
But when I run cssh:
cssh
Created new configuration file within $HOME/.clusterssh/
Can't exec "-L": File o directory non esistente at /home/work/perl5/bin/../lib/perl5/App/ClusterSSH/Cluster.pm line 84.
Use of uninitialized value $result in scalar chomp at /home/work/perl5/bin/../lib/perl5/App/ClusterSSH/Cluster.pm line 87.
Use of uninitialized value $result in concatenation (.) or string at /home/work/perl5/bin/../lib/perl5/App/ClusterSSH/Cluster.pm line 89.
External command failure.
Command: -L
Return Code: 72057594037927935
Some infos:
commit: b37475412969bac6f85e976b05fe589735198c40
cssh -v
Version: 4.03_01
Best regards,
Emanuele
I tried and failed to build clusterssh from the master branch today. I use perlbrew to manage a perl installed into my home directory. I attempted to build clusterssh with that perl.
"perl Build.PL" completes successfully, but "./Build" fails and produces output that looks like it's using the system perl in /usr/bin/perl.
mperry2@devserver:~/dev/cssh/clusterssh-master$ perl Build.PL
Created MYMETA.yml and MYMETA.json
Creating new 'Build' script for 'App-ClusterSSH' version '4.03_03'
mperry2@devserver:~/dev/cssh/clusterssh-master$ ./Build
Building App-ClusterSSH
Generating: ccon
Can't locate Exception/Class.pm in @INC (@INC contains: /home/mperry2/dev/cssh/clusterssh-master/bin_PL/../lib/perl5 /home/mperry2/dev/cssh/clusterssh-master/bin_PL/../lib /home/mperry2/dev/cssh/clusterssh-master/_build/lib /usr/local/lib64/perl5 /usr/local/share/perl5 /usr/lib64/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/share/perl5 .) at /home/mperry2/dev/cssh/clusterssh-master/bin_PL/../lib/App/ClusterSSH/Base.pm line 17.
BEGIN failed--compilation aborted at /home/mperry2/dev/cssh/clusterssh-master/bin_PL/../lib/App/ClusterSSH/Base.pm line 17.
Compilation failed in require at (eval 6) line 3.
...propagated at /usr/share/perl5/base.pm line 94.
BEGIN failed--compilation aborted at /home/mperry2/dev/cssh/clusterssh-master/bin_PL/../lib/App/ClusterSSH.pm line 10.
Compilation failed in require at ./ccon line 8.
BEGIN failed--compilation aborted at ./ccon line 8.
Failed to generate pod at bin_PL/_build_docs line 36.
bin_PL/_build_docs failed at /home/mperry2/perl5/perlbrew/perls/perl-5.18.1-cssh/lib/5.18.1/Module/Build/Base.pm line 2963.
Exception::Class is installed.
mperry2@devserver:~/dev/cssh/clusterssh-master$ perl -MException::Class -E 'say "OK"'
OK
Here's my @inc which doesn't match what ./Build is looking for.
mperry2@devserver:~/dev/cssh/clusterssh-master$ perl -e 'print join "\n", @INC'
/home/mperry2/perl5/perlbrew/perls/perl-5.18.1-cssh/lib/site_perl/5.18.1/x86_64-linux
/home/mperry2/perl5/perlbrew/perls/perl-5.18.1-cssh/lib/site_perl/5.18.1
/home/mperry2/perl5/perlbrew/perls/perl-5.18.1-cssh/lib/5.18.1/x86_64-linux
/home/mperry2/perl5/perlbrew/perls/perl-5.18.1-cssh/lib/5.18.1
Hi,
I am unable to build sources. I faced following error:
pwd
/home/pcvancar/App-ClusterSSH-4.03_03
perl Build.PL
Creating custom builder _build/lib/Module/Build/Custom.pm in _build/lib/Module/Build
Can't locate CPAN/Changes.pm in @inc (@inc contains: /home/pcvancar/App-ClusterSSH-4.03_03/_build/lib /usr/local/lib64/perl5 /usr/local/share/perl5 /usr/lib64/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/share/perl5 .) at /home/pcvancar/App-ClusterSSH-4.03_03/_build/lib/Module/Build/Custom.pm line 16.
BEGIN failed--compilation aborted at /home/pcvancar/App-ClusterSSH-4.03_03/_build/lib/Module/Build/Custom.pm line 16.
Compilation failed in require at (eval 23) line 2.
BEGIN failed--compilation aborted at (eval 23) line 2.
Thanks
Petr
Tests failing in t/10host.t when building App-ClusterSSH-4.03_06. I've replaced my own domain name with "example.com" in the output below.
$ ./Build test
Generating: ccon
Generating: crsh
Generating: cssh
Generating: ctel
t/00-load.t ....... ok
t/01l10n.t ........ ok
t/02base.t ........ ok
t/05getopts.t ..... ok
t/10host.t ........ 1/?
# Failed test 'realname set'
# at t/10host.t line 28.
# got: 'hostname.example.com'
# expected: 'hostname'
# Failed test 'realname set'
# at t/10host.t line 97.
# got: 'hostname.example.com'
# expected: 'hostname'
# Failed test 'realname set'
# at t/10host.t line 121.
# got: 'hostname.example.com'
# expected: 'hostname'
# Failed test 'realname set'
# at t/10host.t line 147.
# got: 'hostname.example.com'
# expected: 'hostname'
# Failed test 'realname set'
# at t/10host.t line 165.
# got: 'hostname.example.com'
# expected: 'hostname'
# Failed test 'user@hostname realname: hostname'
# at t/10host.t line 725.
# got: 'hostname.example.com'
# expected: 'hostname'
# Failed test 'user@hostname:3232=1x1+1+1 realname: hostname'
# at t/10host.t line 725.
# got: 'hostname.example.com'
# expected: 'hostname'
# Failed test 'hostname:2323 realname: hostname'
# at t/10host.t line 725.
# got: 'hostname.example.com'
# expected: 'hostname'
# Failed test 'hostname realname: hostname'
# at t/10host.t line 725.
# got: 'hostname.example.com'
# expected: 'hostname'
# Failed test 'hostname:3232=1x1+1+1 realname: hostname'
# at t/10host.t line 725.
# got: 'hostname.example.com'
# expected: 'hostname'
# Failed test 'user@hostname:2323 realname: hostname'
# at t/10host.t line 725.
# got: 'hostname.example.com'
# expected: 'hostname'
t/10host.t ........ 703/? # Looks like you failed 11 tests of 960.
t/10host.t ........ Dubious, test returned 11 (wstat 2816, 0xb00)
Failed 11/960 subtests
t/15config.t ...... ok
t/20helper.t ...... ok
t/30cluster.t ..... ok
t/80clusterssh.t .. ok
t/boilerplate.t ... ok
t/changes.t ....... ok
t/manifest.t ...... ok
t/perltidy.t ...... ok
t/pod-coverage.t .. ok
t/pod.t ........... ok
Test Summary Report
-------------------
t/05getopts.t (Wstat: 0 Tests: 171 Failed: 0)
TODO passed: 160-163, 168-171
t/10host.t (Wstat: 2816 Tests: 960 Failed: 11)
Failed tests: 8, 54, 67, 80, 88, 243, 310, 427, 479, 689
702
Non-zero exit status: 11
Files=15, Tests=1604, 10 wallclock secs ( 0.16 usr 0.16 sys + 8.11 cusr 0.84 csys = 9.27 CPU)
Result: FAIL
Failed 1/15 test programs. 11/1604 subtests failed.
It would be nice if support was added for the XDG_CONFIG_HOME location as defined in the XDG Base Directory Specification which should default to $HOME/.config/
if not set.
Basically, the program should be looking for $XDG_CONFIG_HOME/clusterssh/
before looking for ~/.clusterssh/
(or not looking for this file at all).
The File::BaseDir module can help with this.
After launching cssh, a number of hotkeys stop working in my plasma 5 desktop.
Things like Alt+mouse drag do drag windows or Alt + right mouse button drag to resize windows does not work anymore after starting cssh.
As per: https://metacpan.org/release/DUNCS/App-ClusterSSH-4.03_06
Issue tracker refers to http://sourceforge.net/tracker/?group_id=89139
This URL redirects to https://sourceforge.net/p/legacy_/tracker/?group_id=89139
And then throws a 404
I would however be completely complacent with the bug tracker moving to github =). SourceForge is not the respected protector of OpenSource it once was.
Can I assign one log file for my all cluster terminals?
How can do it?
Thanks in advance.
Hi,
I have following problem when running cssh on FreeBSD 9.3:
cssh localhost
Assertion failed: (font != NULL), function IA__FcFontRenderPrepare, file fcmatch.c, line 453.
Abort (core dumped)
cssh -v
Version: 4.03_03
I found some information that maybe this is related to fontconfig changes (which should be reflected in clusterssh code?)
FWIW, I wrote a wrapper that glues cssh into vagrant. It is located here: https://github.com/purpleidea/oh-my-vagrant/blob/master/extras/vagrant.bashrc#L88
Feel free to mention it in your docs if you have some!
I didn't know how better to notify your community than to open this issue ticket.
Cheers!
James
While trying to build and test App-ClusterSSH-4.04 with CPAN.pm and a custom perl:
Output from './Build':
Building App-ClusterSSH
Generating: ccon
Can't locate Exception/Class.pm in @INC (@INC contains: /tmpfs/.cpan-build/2015110321/App-ClusterSSH-4.04-__BeMt/bin_PL/../lib/perl5 /tmpfs/.cpan-build/2015110321/App-ClusterSSH-4.04-__BeMt/bin_PL/../lib /tmpfs/.cpan-build/2015110321/App-ClusterSSH-4.04-__BeMt/_build/lib /etc/perl /usr/local/lib/perl/5.14.2 /usr/local/share/perl/5.14.2 /usr/lib/perl5 /usr/share/perl5 /usr/lib/perl/5.14 /usr/share/perl/5.14 /usr/local/lib/site_perl .) at /tmpfs/.cpan-build/2015110321/App-ClusterSSH-4.04-__BeMt/bin_PL/../lib/App/ClusterSSH/Base.pm line 17.
BEGIN failed--compilation aborted at /tmpfs/.cpan-build/2015110321/App-ClusterSSH-4.04-__BeMt/bin_PL/../lib/App/ClusterSSH/Base.pm line 17.
Compilation failed in require at (eval 2) line 2.
...propagated at /usr/share/perl/5.14/base.pm line 93.
BEGIN failed--compilation aborted at /tmpfs/.cpan-build/2015110321/App-ClusterSSH-4.04-__BeMt/bin_PL/../lib/App/ClusterSSH.pm line 10.
Compilation failed in require at ./ccon line 8.
BEGIN failed--compilation aborted at ./ccon line 8.
Failed to generate pod at bin_PL/_build_docs line 37.
bin_PL/_build_docs failed at /opt/perl-5.18.2t/lib/site_perl/5.18.2/Module/Build/Base.pm line 2930.
The existence of /etc/perl
in @INC
suggests that somewhere the system perl (i.e. /usr/bin/perl
) is used, not the perl currently used in the build. Usually such a problem may be be fixed by using $^X
.
Hi,
after upgrading the ssh_args
value is no longer taken from my configfile; the default is always used.
cssh --options="..." ...
does work, though.
Is there some easy fix?
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.