1CTEL(1) User Contributed Perl Documentation CTEL(1)
2
3
4
6 ctel - Cluster administration tool
7
9 This documentation is for version: 4.16
10
12 ctel [-K <seconds>] [-q] [-c '<filename>'] [-x <cols>] [-C
13 '<filename>'] [--debug [[...] || <INTEGER>]] [-d] [-e
14 '<[user@]<host>[:port]>'] [--fillscreen] [-f '<font>'] [-h] [-L
15 '[tag]'] [-H] [-p <port>] [-Q] [-y <rows>] [-s] [-r '<filename>'] [-t
16 '<STRING>'] [-g] [-T '<title>'] [-u] [-?] [-A] [-v]
17
19 Also see the individual man pages for each of these utilities
20
21 ccon - Use 'console' as the communication method
22 crsh - Use 'rsh' as the communication method
23 csftp - Use 'sftp' as the communication method
24 cssh - Use 'ssh' as the communication method
25
27 The command opens an administration console and an xterm to all
28 specified hosts. Any text typed into the administration console is
29 replicated to all windows. All windows may also be typed into
30 directly.
31
32 This tool is intended for (but not limited to) cluster administration
33 where the same configuration or commands must be run on each node
34 within the cluster. Performing these commands all at once via this
35 tool ensures all nodes are kept in sync.
36
37 Connections are opened using telnet which must be correctly installed
38 and configured.
39
40 Extra caution should be taken when editing files as lines may not
41 necessarily be in the same order; assuming line 5 is the same across
42 all servers and modifying that is dangerous. It's better to search for
43 the specific line to be changed and double-check all terminals are as
44 expected before changes are committed.
45
46 Further Notes
47 Please also see "KNOWN BUGS".
48
49 • The dotted line on any sub-menu is a tear-off, i.e. click on it and
50 the sub-menu is turned into its own window.
51
52 • Unchecking a hostname on the Hosts sub-menu will unplug the host
53 from the cluster control window, so any text typed into the console
54 is not sent to that host. Re-selecting it will plug it back in.
55
56 • If your window manager menu bars are obscured by terminal windows
57 see the "screen_reserve_XXXXX" options in the
58 $HOME/.clusterssh/config file (see "FILES").
59
60 • If the terminals overlap too much see the "terminal_reserve_XXXXX"
61 options in the $HOME/.clusterssh/config file (see "FILES").
62
63 • When using ClusterSSH on a large number of systems to connect to a
64 single system using an SSH utility (e.g. you issue a command to to
65 copy a file using scp from the remote computers to a single host)
66 and when these connections require authentication (i.e. you are
67 going to authenticate with a password), the sshd daemon at that
68 location may refuse connections after the number "MaxStartups"
69 limit in sshd_config is exceeded. (If this value is not set, it
70 defaults to 10). This is expected behavior; sshd uses this
71 mechanism to prevent DoS attacks from unauthenticated sources.
72 Please tune sshd_config and reload the SSH daemon, or consider
73 using the ~/.ssh/authorized_keys mechanism for authentication if
74 you encounter this problem.
75
76 • If client windows fail to open, try running:
77
78 "ctel -e {single host name}"
79
80 This will test the mechanisms used to open windows to hosts. This
81 could be due to either the "-xrm" terminal option which enables
82 "AllowSendEvents" (some terminals do not require this option, other
83 terminals have another method for enabling it - see your terminal
84 documentation) or the configuration of "telnet".
85
87 Some of these options may also be defined within the configuration
88 file. Default options are shown as appropriate.
89
90 --autoclose <seconds>, -K <seconds>
91 Number of seconds to wait before closing finished terminal windows.
92
93 --autoquit, -q
94 Toggle automatically quitting after the last client window has
95 closed (overriding the config file).
96
97 --cluster-file '<filename>', -c '<filename>'
98 Use supplied file as additional cluster file (see also "FILES").
99
100 --cols <cols>, -x <cols>
101 Number of columns
102
103 --config-file '<filename>', -C '<filename>'
104 Use supplied file as additional configuration file (see also
105 "FILES").
106
107 --debug [[...] || <INTEGER>]
108 Enable debugging. Either a level can be provided or the option can
109 be repeated multiple times. Maximum level is 9.
110
111 --dump-config, -d
112 Dump the current configuration in the same format used by the
113 $HOME/.clusterssh/config file.
114
115 --evaluate '<[user@]<host>[:port]>', -e '<[user@]<host>[:port]>'
116 Display and evaluate the terminal and connection arguments to
117 display any potential errors. The <hostname> is required to aid
118 the evaluation.
119
120 --fillscreen
121 Resize terminal windows to fill the whole available screen
122
123 --font '<font>', -f '<font>'
124 Specify the font to use in the terminal windows. Use standard X
125 font notation such as "5x8".
126
127 --help, -h
128 Show basic help text and exit
129
130 --list '[tag]', -L '[tag]'
131 List available cluster tags. Tag is optional. If a tag is provided
132 then hosts for that tag are listed. NOTE: format of output changes
133 when using "--quiet" or "-Q" option.
134
135 --man, -H
136 Show full help text (the man page) and exit
137
138 --port <port>, -p <port>
139 Specify an alternate port for connections.
140
141 --quiet, -Q
142 Do not output extra text when using some options
143
144 --rows <rows>, -y <rows>
145 Number of rows
146
147 --show-history, -s
148 Show history within console window.
149
150 --tag-file '<filename>', -r '<filename>'
151 Use supplied file as additional tag file (see also "FILES")
152
153 --term-args '<STRING>', -t '<STRING>'
154 Specify arguments to be passed to terminals being used.
155
156 --tile, -g
157 Toggle window tiling (overriding the config file).
158
159 --title '<title>', -T '<title>'
160 Specify the initial part of the title used in the console and
161 client windows.
162
163 --unique-servers, -u
164 Toggle connecting to each host only once when a hostname has been
165 specified multiple times.
166
167 --usage, -?
168 Show synopsis and exit
169
170 --use-all-a-records, -A
171 If a hostname resolves to multiple IP addresses, toggle whether or
172 not to connect to all of them, or just the first one (see also
173 config file entry).
174
175 --version, -v
176 Show version information and exit
177
179 The following arguments are supported:
180
181 [user@]<hostname>[:port] ...
182 Open an xterm to the given hostname and connect to the
183 administration console. The optional port number can be used if
184 the server is not listening on the standard port.
185
186 <tag> ...
187 Open a series of xterms defined by <tag> in one of the
188 supplementary configuration files (see "FILES").
189
190 Note: specifying a username on a cluster tag will override any
191 usernames defined in the cluster.
192
194 The following key shortcuts are available within the console window,
195 and all of them may be changed via the configuration files.
196
197 Control-Shift-plus
198 Open the 'Add Host(s) or Cluster(s)' dialogue box. Multiple host
199 or cluster names can be entered, separated by spaces.
200
201 Alt-n
202 Paste in the hostname part of the specific connection string to
203 each client, minus any username or port, e.g.
204
205 "scp /etc/hosts server:files/<Alt-n>.hosts"
206
207 would replace the <Alt-n> with the client's name in each window.
208
209 Alt-l
210 Paste in the hostname of the server cssh is being run on
211
212 Alt-q
213 Quit the program and close all connections and windows.
214
215 Alt-r
216 Retile all the client windows.
217
218 Alt-u
219 Paste in the username for the connection
220
221 Alt-1
222 Alt-2
223 Alt-3
224 Alt-4
225 Run the matching user defined macro on the server and send the
226 output to the client
227
229 Open up a session to 3 servers
230 $ ctel server1 server2 server3
231
232 Open up a session to a cluster of servers identified by the tag 'farm1'
233 and give the controlling window a specific title, where the tag is
234 defined in one of the default configuration files
235 $ ctel -T 'Web Farm Cluster 1' farm1
236
237 Connect to different servers using different login names. NOTE: this
238 can also be achieved by setting up appropriate options in the
239 configuration files. Do not close the console when the last terminal
240 exits.
241 $ ctel user1@server1 admin@server2
242
243 Open up a cluster defined in a non-default configuration file
244 $ ctel -c $HOME/cssh.extra_clusters db_cluster
245
246 Override the configured/default port to use 2022 instead
247 $ ctel -p 2022 server1 server2
248
250 /etc/clusters, $HOME/.clusterssh/clusters
251 These files contain a list of tags to server names mappings. When
252 any name is used on the command line it is checked to see if it is
253 a tag. If it is a tag, then the tag is replaced with the list of
254 servers. The format is as follows:
255
256 <tag> [user@]<server>[:port] [user@]<server>[:port] [...]
257
258 e.g.
259
260 # List of servers in live
261 live admin1@server1 admin2@server2:2022 server3 server4
262
263 All comments (marked by a #) and blank lines are ignored. Tags may
264 be nested, but be aware of using recursive tags as they are not
265 checked for.
266
267 Servers can be defined using expansion macros:
268
269 "webservers websvr{a,b,c}"
270
271 would be expanded to
272
273 "webservers websvra websvrb websvrc"
274
275 and
276
277 "webservers websvr{6..9}"
278
279 would be expanded to
280
281 "webservers websvr6 websvr7 websvr8 websvr9"
282
283 Extra cluster files may also be specified either as an option on
284 the command line (see "cluster-file") or in the user's
285 $HOME/.clusterssh/config file (see "extra_cluster_file"
286 configuration option).
287
288 NOTE: the last tag read overwrites any pre-existing tag of that
289 name.
290
291 NOTE: there is a special cluster tag called "default" - any tags or
292 hosts included within this tag will be automatically opened if
293 nothing is specified on the command line.
294
295 /etc/tags, $HOME/.clusterssh/tags
296 Very similar to clusters files but the definition is reversed. The
297 format is:
298
299 <host> <tag> [...]
300
301 This allows one host to be specified as a member of a number of
302 tags. This format can be clearer than using clusters files.
303
304 Extra tag files may be specified either as an option (see
305 "tag-file") or within the user's $HOME/.clusterssh/config file (see
306 "extra_tag_file" configuration option).
307
308 NOTE: All tags are added together
309
310 /etc/csshrc & $HOME/.clusterssh/config
311 This file contains configuration overrides - the defaults are as
312 marked. Default options are overwritten first by the global file,
313 and then by the user file.
314
315 NOTE: values for entries do not need to be quoted unless it is
316 required for passing arguments, e.g.
317
318 "terminal_allow_send_events="-xrm '*.VT100.allowSendEvents:true'""
319
320 should be written as
321
322 "terminal_allow_send_events=-xrm '*.VT100.allowSendEvents:true'"
323
324 auto_close = 5
325 Close terminal window after this many seconds. If set to 0
326 will instead wait on input from the user in each window before
327 closing. See also --autoclose and --no-autoclose
328
329 auto_quit = 1
330 Automatically quit after the last client window closes. Set to
331 0 to disable. See also --autoquit
332
333 auto_wm_decoration_offsets = no
334 Enable or disable alternative algorithm for calculating
335 terminal positioning.
336
337 command_pre =
338 command_post =
339 Add extra commands around the communication method. For
340 example:
341
342 command_pre= . $HOME/virtualenvs/default/bin/active ;
343 command_post= | ct
344
345 would allow for using Python virtual envronments and then
346 piping all shell output through "chromaterm" for syntax
347 highlighting. Note: you must use appropriate command
348 separators/terminators to keep the meaning of the command
349 pipline (such as ";" and "|" between commands).
350
351 These are not put through macro parsing.
352
353 comms = telnet
354 Sets the default communication method (initially taken from the
355 name of the program, but can be overridden here).
356
357 console_position = <null>
358 Set the initial position of the console - if empty then let the
359 window manager decide. Format is '+<x>+<y>', i.e. '+0+0' is
360 top left hand corner of the screen, '+0-70' is bottom left hand
361 side of screen (more or less).
362
363 external_command_mode = 0600
364 File mode bits for the external_command_pipe.
365
366 external_command_pipe = <null>
367 Define the full path to an external command pipe that can be
368 written to for controlling some aspects of ClusterSSH, such as
369 opening sessions to more clusters.
370
371 Commands:
372
373 "open <tag|hostname>" - open new sessions to provided tag or
374 hostname
375
376 "retile" - force window retiling
377
378 e.g.: "echo 'open localhost'" /path/to/external_command_pipe >>
379
380 external_cluster_command = <null>
381 Define the full path to an external command that can be used to
382 resolve tags to host names. This command can be written in any
383 language. The script must accept a list of tags to resolve and
384 output a list of hosts (space separated on a single line). Any
385 tags that cannot be resolved should be returned unchanged.
386
387 A non-0 exit code will be counted as an error, a warning will
388 be printed and output ignored.
389
390 If the external command is given a "-L" option it should output
391 a list of tags (space separated on a single line) it can
392 resolve
393
394 extra_cluster_file = <null>
395 Define an extra cluster file in the format of /etc/clusters.
396 Multiple files can be specified, separated by commas. Both ~
397 and $HOME are acceptable as a reference to the user's home
398 directory, e.g.
399
400 "extra_cluster_file = ~/clusters, $HOME/clus"
401
402 extra_tag_file = <null>
403 Define an extra tag file in the format of /etc/tags. Multiple
404 files can be specified, separated by commas. Both ~ and $HOME
405 are acceptable as a reference to the user's home directory,
406 e.g.
407
408 "extra_tag_file = ~/tags, $HOME/tags"
409
410 key_addhost = Control-Shift-plus
411 Default key sequence to open AddHost menu. See "KEY SHORTCUTS"
412 for more information.
413
414 hide_menu = 0
415 If set to 1, hide the menu bar (File, Hosts, Send, Help) in the
416 console.
417
418 key_clientname = Alt-n
419 Default key sequence to send cssh client names to client. See
420 "KEY SHORTCUTS" for more information.
421
422 key_localname = Alt-l
423 Default key sequence to send hostname of local server to
424 client. See "KEY SHORTCUTS" for more information.
425
426 key_paste = Control-v
427 Default key sequence to paste text into the console window.
428 See "KEY SHORTCUTS" for more information.
429
430 key_quit = Control-q
431 Default key sequence to quit the program (will terminate all
432 open windows). See "KEY SHORTCUTS" for more information.
433
434 key_retilehosts = Alt-r
435 Default key sequence to retile host windows. See "KEY
436 SHORTCUTS" for more information.
437
438 key_username = Alt-u
439 Default key sequence to send username to client. See "KEY
440 SHORTCUTS" for more information.
441
442 key_user_1 = Alt-1
443 key_user_2 = Alt-2
444 key_user_3 = Alt-3
445 key_user_4 = Alt-4
446 Default key sequence to send user defined macros to client. If
447 the matching macro_user_1 macro is undefined, the sequence is
448 passed straight to the terminal. See "KEY SHORTCUTS" for more
449 information.
450
451 macro_servername = %s
452 macro_hostname = %h
453 macro_username = %u
454 macro_newline = %n
455 macro_version = %v
456 macro_user_1 = %1
457 macro_user_2 = %2
458 macro_user_3 = %3
459 macro_user_4 = %4
460 Change the replacement macro used when either using a 'Send'
461 menu item, or when pasting text into the main console.
462
463 macro_user_1_command =
464 macro_user_2_command =
465 macro_user_3_command =
466 macro_user_4_command =
467 User defined macros - the macro is run through the shell on the
468 server and the output is sent to the client. For example,
469
470 "macro_user_1_command=echo echo macro_user_1"
471
472 would send the text C<echo macro_user_1> into the terminal session.
473
474 "macro_user_1_command=env | grep CSSH"
475
476 would send the CSSH environment variables to the client.
477
478 The following environment variables are set in the shell of the
479 macro process
480
481 "CSSH_SERVERNAME"
482 "CSSH_HOSTNAME"
483 "CSSH_USERNAME"
484 "CSSH_CONNECTION_STRING"
485 "CSSH_CONNECTION_PORT"
486 "CSSH_VERSION"
487 macros_enabled = yes
488 Enable or disable macro replacement. Note: this affects all
489 the "macro_*" variables above.
490
491 max_addhost_menu_cluster_items = 6
492 Maximum number of entries in the 'Add Host' menu cluster list
493 before scrollbars are used
494
495 max_host_menu_items = 30
496 Maximum number of hosts to put into the host menu before
497 starting a new column
498
499 menu_host_autotearoff = 0
500 menu_send_autotearoff = 0
501 When set to non-0 will automatically tear-off the host or send
502 menu at program start
503
504 mouse_paste = Button-2 (middle mouse button)
505 Default key sequence to paste text into the console window
506 using the mouse. See "KEY SHORTCUTS" for more information.
507
508 rsh = /path/to/rsh
509 ssh = /path/to/ssh
510 telnet = /path/to/telnet
511 Set the path to the specific binary to use for the
512 communication method, else uses the first match found in $PATH
513
514 rsh_args = <blank>
515 ssh_args = "-x -o ConnectTimeout=10"
516 telnet_args = <blank>
517 Sets any arguments to be used with the communication method
518 (defaults to ssh arguments).
519
520 NOTE: The given defaults are based on OpenSSH, not commercial
521 ssh software.
522
523 NOTE: Any "generic" change to the method (e.g., specifying the
524 ssh port to use) should be done in the medium's own config file
525 (see "ssh_config" and $HOME/.ssh/config).
526
527 screen_reserve_top = 0
528 screen_reserve_bottom = 60
529 screen_reserve_left = 0
530 screen_reserve_right = 0
531 Number of pixels from the screen's side to reserve when
532 calculating screen geometry for tiling. Setting this to
533 something like 50 will help keep cssh from positioning windows
534 over your window manager's menu bar if it draws one at that
535 side of the screen.
536
537 terminal = /path/to/xterm
538 Path to the X-Windows terminal used for the client.
539
540 terminal_args = <blank>
541 Arguments to use when opening terminal windows. Otherwise
542 takes defaults from $HOME/.Xdefaults or $HOME/.Xresources file.
543
544 terminal_chdir = 0
545 When non-0, set the working directory for each terminal as per
546 'terminal_chdir_path'
547
548 terminal_chdir_path = $HOME/.clusterssh/work/%s
549 Path to use as working directory for each terminal when
550 'terminal_chdir' is enabled. The path provided is passed
551 through the macro parser (see the section above on
552 'macros_enabled'.
553
554 terminal_font = 6x13
555 Font to use in the terminal windows. Use standard X font
556 notation.
557
558 terminal_reserve_top = 5
559 terminal_reserve_bottom = 0
560 terminal_reserve_left = 5
561 terminal_reserve_right = 0
562 Number of pixels from the terminal's side to reserve when
563 calculating screen geometry for tiling. Setting these will
564 help keep cssh from positioning windows over your scroll and
565 title bars or otherwise overlapping the windows too much.
566
567 terminal_colorize = 1
568 If set to 1 (the default), then "-bg" and "-fg" arguments will
569 be added to the terminal invocation command-line. The terminal
570 will be colored in a pseudo-random way based on the host name;
571 while the color of a terminal is not easily predicted, it will
572 always be the same color for a given host name. After a while,
573 you will recognize hosts by their characteristic terminal
574 color.
575
576 terminal_bg_style = dark
577 If set to "dark", the terminal background will be set to black
578 and the foreground to the pseudo-random color. If set to
579 "light", then the foreground will be black and the background
580 the pseudo-random color. If terminal_colorize is "zero", then
581 this option has no effect.
582
583 terminal_size = 80x24
584 Initial size of terminals to use. NOTE: the number of lines
585 (24) will be decreased when resizing terminals for tiling, not
586 the number of characters (80).
587
588 terminal_title_opt = -T
589 Option used with "terminal" to set the title of the window
590
591 terminal_allow_send_events = -xrm '*.VT100.allowSendEvents:true'
592 Option required by the terminal to allow XSendEvents to be
593 received
594
595 title = cssh
596 Title of windows to use for both the console and terminals.
597
598 unmap_on_redraw = no
599 Tell Tk to use the UnmapWindow request before redrawing
600 terminal windows. This defaults to "no" as it causes some
601 problems with the FVWM window manager. If you are experiencing
602 problems with redraws, you can set it to "yes" to allow the
603 window to be unmapped before it is repositioned.
604
605 use_all_a_records = 0
606 If a hostname resolves to multiple IP addresses, set to 1 to
607 connect to all of them, not just the first one found. See also
608 "--use-all-a-records"}
609
610 use_hotkeys = 1
611 Setting to 0 will disable all hotkeys.
612
613 use_natural_sort = 0
614 Windows will normally sort in alphabetical order, i.e.: host1,
615 host11, host2. Setting to this 1 will change the sort order,
616 i.e.: host1, host2, host11. NOTE: You must have the perl module
617 Sort::Naturally installed.
618
619 user = $LOGNAME
620 Sets the default user for running commands on clients.
621
622 window_tiling = 1
623 Perform window tiling (set to 0 to disable)
624
625 window_tiling_direction = right
626 Direction to tile windows, where "right" means starting top
627 left and moving right and then down, and anything else means
628 starting bottom right and moving left and then up
629
630 NOTE: The key shortcut modifiers must be in the form "Control",
631 "Alt" or "Shift", e.g. with the first letter capitalised and the
632 rest lower case. Keys may also be disabled individually by setting
633 to the word "null".
634
635 $HOME/.clusterssh/send_menu
636 This (optional) file contains items to populate the send menu. The
637 default entry could be written as:
638
639 <send_menu>
640 <menu title="Use Macros">
641 <toggle/>
642 <accelerator>ALT-p</accelerator>
643 </menu>
644 <menu title="Remote Hostname">
645 <command>%s</command>
646 <accelerator>ALT-n</accelerator>
647 </menu>
648 <menu title="Local Hostname">
649 <command>%s</command>
650 <accelerator>ALT-l</accelerator>
651 </menu>
652 <menu title="Username">
653 <command>%u</command>
654 <accelerator>ALT-u</accelerator>
655 </menu>
656 <menu title="Test Text">
657 <command>echo "ClusterSSH Version: %v%n</command>
658 </menu>
659 </send_menu>
660
661 Submenus can also be specified as follows:
662
663 <send_menu>
664 <menu title="Default Entries">
665 <detach>yes</detach>
666 <menu title="Hostname">
667 <command>%s</command>
668 <accelerator>ALT-n</accelerator>
669 </menu>
670 </menu>
671 </send_menu>
672
673 Caveats:
674
675 There is currently no strict format checking of this file.
676 The format of the file may change in the future
677 If the file exists, the default entry (Hostname) is not added
678
679 The following replacement macros are available (note: these can be
680 changed in the configuration file):
681
682 %s Hostname part of the specific connection string to each client,
683 minus any username or port
684
685 %u Username part of the connection string to each client
686
687 %h Hostname of server where cssh is being run from
688
689 %n "RETURN" code
690
691 NOTE: requires XML::Simple to be installed
692
694 If you have any ideas about how to fix the below bugs, please get in
695 touch and/or provide a patch.
696
697 • Swapping virtual desktops can cause a redraw of all the terminal
698 windows. This is due to a lack of distinction within Tk between
699 switching desktops and minimising/maximising windows. Until Tk can
700 tell the difference between the two events, there is no fix (apart
701 from rewriting everything directly in X).
702
704 If you have issues running ctel, first try:
705
706 "ctel -e [user@]<hostname>[:port]"
707
708 This performs two tests to confirm cssh is able to work properly with
709 the settings provided within the $HOME/.clusterssh/config file (or
710 internal defaults).
711
712 1. Test the terminal window works with the options provided
713
714 2. Test telnet works to a host with the configured arguments
715
716 Configuration options to watch for in ssh are:
717
718 • SSH doesn't understand "-o ConnectTimeout=10" - remove the option
719 from the $HOME/.clusterssh/config file
720
721 • OpenSSH-3.8 using untrusted ssh tunnels - use "-Y" instead of "-X"
722 or use "ForwardX11Trusted yes" in $HOME/.ssh/ssh_config (if you
723 change the default ssh options from "-x" to "-X")
724
726 A web site for comments, requests, bug reports and bug fixes/patches is
727 available at: <https://github.com/duncs/clusterssh>
728
729 If you require support, please run the following commands and create an
730 issue via: <https://github.com/duncs/clusterssh/issues>
731
732 "perl -V"
733
734 "perl -MTk -e 'print $Tk::VERSION,$/'"
735
736 "perl -MX11::Protocol -e 'print $X11::Protocol::VERSION,$/'"
737
738 "cat /etc/csshrc $HOME/.clusterssh/config"
739
740 Using the debug option (--debug) will turn on debugging output. Repeat
741 the option to increase the amount of debug. However, if possible
742 please only use this option with one host at a time, e.g. "cssh --debug
743 <host>" due to the amount of output produced (in both main and child
744 windows).
745
747 <https://github.com/duncs/clusterssh/wiki/>, "ssh", Tk::overview,
748 X11::Protocol, "perl"
749
751 Duncan Ferguson, "<duncan_j_ferguson at yahoo.co.uk>"
752
754 Copyright 1999-2018 Duncan Ferguson.
755
756 This program is free software; you can redistribute it and/or modify it
757 under the terms of either: the GNU General Public License as published
758 by the Free Software Foundation; or the Artistic License.
759
760 See http://dev.perl.org/licenses/ for more information.
761
762
763
764perl v5.38.0 2023-07-19 CTEL(1)