2
0
mirror of https://github.com/xcat2/confluent.git synced 2026-09-29 08:41:00 +00:00

Compare commits

...

1145 Commits

Author SHA1 Message Date
Jarrod Johnson ce1d89c741 Set nodename as hostname prior to post for el class distros 2021-11-04 07:56:04 -04:00
Jarrod Johnson cbee00d3bb Fix initial collective join
Initial collective join combined
with the orderly collective startup
hit a chicken and egg problem.

Disable initting on first enrollment
to let enrollment drive
that specific initialization to
restore behavior.
2021-07-19 10:26:05 -04:00
Jarrod Johnson 14bb841b2d Fix nodebmcreset partial success
The error handling is improved, to
catch both noderange global issues as well
as partial completions.
2021-06-08 09:13:56 -04:00
Jarrod Johnson 03a75ec67d Error if noderange includes too many )
By default, pyparsing consumes only as much of the
input as matches the grammar. Tell it to consume all
of the noderange and error if there's more string than
matches our grammar.
2021-06-04 14:21:45 -04:00
Jarrod Johnson 269300119a Skip newer agent behaviors with incompatible old ssh
The previous attempt to support older ssh failed to completely
enact old behavior when needed.
2021-06-04 13:41:47 -04:00
Jarrod Johnson a2edf46b8a Improve ctrl-c and other behaviors of osdeploy import
More reliably delete an import attempt to avoid odd behaviors.
2021-05-27 16:10:55 -04:00
Jarrod Johnson 74e011e964 Implement node name subtitution in nodeshell
If wanting to ssh to 'altenative interfaces', provide -s to facilitate that
behavior, with added flexibility
compared to previous incarnations.
2021-05-25 15:46:49 -04:00
Jarrod Johnson 66372bea0c Fix hang on ctrl-e,c,p,o
Leave the function to
consume termdata if data
is available.
2021-05-25 14:27:37 -04:00
Jarrod Johnson d250a3e850 Fix typo in confetty 2021-05-25 11:58:01 -04:00
Jarrod Johnson 49b69a2e19 Explicitly provide content-length 0 on 204
For some vintages of eventlet+apache, this is required
to avoid invalid responses from the server.
2021-05-25 10:19:11 -04:00
Jarrod Johnson 93d4847763 Conditionally apply agent to sshutil
Older OSes (RHEL7/SLES12) cannot
do ssh-keygen with an agent.

Degrade to classic confluent behavior when that happens.
2021-05-18 12:28:42 -04:00
Jarrod Johnson b283b50cc6 Improve error on nodeconfig parse errors
The current error is vague and confusing, clarify with
more data showing what went wrong.
2021-05-18 10:34:09 -04:00
Jarrod Johnson 1f320af8e5 Add error message for long profile names
If a profile name pushes the filename field of dhcp
beyond what it can support, log an event and
do not offer a corrupted
dhcp offer packet.
2021-05-18 09:44:27 -04:00
Jarrod Johnson 5fea265dc8 Change CSV to have unix style line endings
The excel dialog has nice minimal quoting, but DOS line endings.

Unix dialog has good line endings, but excessive quoting.

Create a hybrid dialect and use it for nodesensors output.
2021-05-13 10:39:03 -04:00
Jarrod Johnson b74d648e7f Fix refactored inline command run
This addresses the mistake in
refactoring the inline command
shortcut
2021-05-12 13:49:06 -04:00
Jarrod Johnson 380f21853c Merge branch 'master' into 3.2 2021-05-11 08:10:41 -04:00
Jarrod Johnson 9900d76b0c Merge remote-tracking branch 'lenovo/master' 2021-05-11 08:09:57 -04:00
Jarrod Johnson aa7701ea3c More usefully indicate unfound interfaces
Rather than no data, provide
not found error when requesting a currently unsupported name.
2021-05-11 08:02:19 -04:00
Jarrod Johnson 3044c662ad Merge pull request #55 from vmaneagit/patch-45
Update nodesupport.ronn
2021-05-11 07:59:24 -04:00
Jarrod Johnson 7e02d1d008 Merge pull request #57 from vmaneagit/patch-43
Update collective.ronn
2021-05-11 07:56:55 -04:00
Jarrod Johnson f321e06e6e Merge pull request #51 from vmaneagit/patch-49
Update nodersync.ronn
2021-05-11 07:50:47 -04:00
Jarrod Johnson 5c0af9ebc7 Merge pull request #50 from vmaneagit/patch-50
Update nodersync.ronn
2021-05-11 07:50:18 -04:00
Jarrod Johnson c146b50b5b Merge pull request #49 from vmaneagit/patch-51
Update nodereseat.ronn
2021-05-11 07:49:37 -04:00
Jarrod Johnson cae8b2d0f8 Merge pull request #48 from vmaneagit/patch-52
Update noderemove.ronn
2021-05-11 07:49:24 -04:00
Jarrod Johnson 2664adefa4 Merge pull request #47 from vmaneagit/patch-53
Update nodepower.ronn
2021-05-11 07:49:10 -04:00
Jarrod Johnson c5f03ee62d Merge pull request #46 from vmaneagit/patch-54
Update nodelicense.ronn
2021-05-11 07:49:00 -04:00
Jarrod Johnson a932e91b17 Merge pull request #45 from vmaneagit/patch-56
Update nodegroupattrib.ronn.tmpl
2021-05-11 07:48:45 -04:00
Jarrod Johnson 1c00aa3c4e Merge pull request #44 from vmaneagit/patch-57
Update confetty.ronn
2021-05-11 07:48:35 -04:00
Jarrod Johnson bd889f4c78 Merge pull request #43 from vmaneagit/patch-58
Update collate.ronn
2021-05-11 07:48:17 -04:00
Jarrod Johnson 409a0796a1 Merge pull request #42 from vmaneagit/patch-59
Update nodesupport.ronn
2021-05-11 07:48:04 -04:00
Jarrod Johnson 70ffef6b06 Merge pull request #41 from vmaneagit/patch-55
Update nodelicense.ronn
2021-05-11 07:47:53 -04:00
Jarrod Johnson 77a043faa6 Change apiclient to append if outputting to existing file 2021-05-05 17:45:39 -04:00
Jarrod Johnson d69eb6ef12 Change apiclient to append if outputting to existing file 2021-05-05 17:45:04 -04:00
Jarrod Johnson 984c3044fe Invalidate sealed token on new token
If a new token grant occurs, do not
retain stale token sealed, as it can be misleading.
2021-05-05 09:18:28 -04:00
Jarrod Johnson 8543129fb9 Invalidate sealed token on new token
If a new token grant occurs, do not
retain stale token sealed, as it can be misleading.
2021-05-05 09:17:42 -04:00
Jarrod Johnson 257edff3a7 Redo ssh certs on firstboot for SUSE
For whatever reason, SUSE loses the certificate during firstboot.
2021-05-03 16:47:24 -04:00
Jarrod Johnson 763feda63b Fix missed references to old variable names 2021-05-03 15:54:39 -04:00
Jarrod Johnson 508e5b4a46 Fix suse run_remote_parts
Behave more consistently
2021-05-03 15:36:27 -04:00
Jarrod Johnson 7676c4fd26 Restore EL8 treatment
The changes caused EL8 to lose some required special treatment.
2021-05-03 15:18:33 -04:00
Jarrod Johnson c3b954a743 Move suse15 to log like rhel 2021-05-03 14:50:04 -04:00
Jarrod Johnson a94a341582 Fix ansible path compatibility. 2021-05-03 14:31:28 -04:00
Jarrod Johnson 08dfd55ea0 Rename variables in the ubuntu initramfs portion 2021-05-03 13:28:28 -04:00
Jarrod Johnson cf6975ded3 Fix python2/3 handling in el8 pre.sh 2021-05-03 13:11:52 -04:00
Jarrod Johnson d17b1d060c Prepend confluent_ to vars and switch to explicitly requesting directory
The 'profile' variable notably induces dracut to be excruciatingly slow,
mitigate chance by putting confluent before apikey, mgr, and profile.

Further, it has been requested to have the scripts use same name on
server for directory moving forward. Implement this request while
allowing existing OS profiles to keep working.
2021-05-03 12:48:08 -04:00
Jarrod Johnson fcb4b33e8e Include stderr in the script execution logs 2021-05-03 08:57:59 -04:00
Jarrod Johnson 121e0727cf Add Rocky linux recognition 2021-05-03 08:36:57 -04:00
Jarrod Johnson b5b9631b3f Correct typo in pre script 2021-04-30 16:27:16 -04:00
Jarrod Johnson c09f96b8c9 Remove pivot_root from genesis
It is not used (if we did use something, it would be switch_root).
2021-04-30 16:20:58 -04:00
Jarrod Johnson 196ed31bee Retry node api token retrieval, with message 2021-04-30 15:17:02 -04:00
Jarrod Johnson bb05f72583 Add source_remote_parts
This function will enable a script to invoke multiple
pieces in same variable/function context
2021-04-30 14:33:02 -04:00
Jarrod Johnson 68b4f83627 Have firstboot script be logged better
Also show on screen firstboot script execution.
2021-04-30 14:08:42 -04:00
Jarrod Johnson 672bc4f754 Amend postscript logging strategy
This adjusts to avoid hangs in
anaconda
2021-04-30 13:38:31 -04:00
Jarrod Johnson 4df3fda8ea Change logging/display for RH oses
The pre and post phases are
desirable to see both in logs and consoles.

Unfortunately, anaconda cheaps out by using communicate(), which means
the logs are unwritten until the end.

Change by using bash's redirectiors
to create a dynamically updated logfile
and tail -f that.
2021-04-30 09:39:00 -04:00
Jarrod Johnson f32619aa3e Allow firstboot to reboot in RH postscripts
Sometimes firstboot scripts want to reboot.

In such a case, start firstboot once, and if reboot prevents completion,
then next boot will updatestatus, but not run firstboot scripts and
deregister itself.
2021-04-29 09:20:24 -04:00
Jarrod Johnson dd7b9f0244 Bump genesis version 2021-04-28 16:44:24 -04:00
Jarrod Johnson def534e73f Fixes for boot by DHCP and by MAC 2021-04-28 16:43:11 -04:00
Jarrod Johnson 2cb641e734 Fix PXE based on mac
We normally use UUID, on a broken platform with bad UUID,
user may need to use hwaddr.  This was supposed to work, but
didn't. Fix it to work correctly.
2021-04-28 15:36:12 -04:00
Jarrod Johnson ca78b664c9 Get rid of minor warning about RSAAuthentication 2021-04-28 14:06:57 -04:00
Jarrod Johnson 0e55d390e3 Fix up post output to console 2021-04-28 13:46:26 -04:00
Jarrod Johnson 002146b2f7 Try to output pre/post content to console during install 2021-04-28 13:27:34 -04:00
Jarrod Johnson 917a51a406 Error if bind to privileged port fails 2021-04-28 08:37:23 -04:00
Jarrod Johnson d3fa08d78b Amend syncfiles to handle directory targets better
Rather than using symlinks for directories, recursively recreate tree
and symlink only the non-directory
entries.

This improves mixing and matching
files and directories to target a directory.
2021-04-27 12:48:27 -04:00
Jarrod Johnson 38eb88249e Permit wildcard in syncfiles
This was a supported and used feature in xCAT
syncfiles, carry it into confluent syncfiles.
2021-04-27 09:12:11 -04:00
Jarrod Johnson c333c3eb9c Fix missing data on XCC discovery
The XCC scan now calls the
imm scan to fill out the lost data.
2021-04-26 08:57:52 -04:00
Jarrod Johnson f32a9a2f08 Rework inline command handling
Previously, if hotkey entry
had text data come in, it
would corrupt the state of
the client.

Minimize the corruption and request the server to pause.
2021-04-23 14:22:24 -04:00
Jarrod Johnson f584b9bc11 Protect against binary sealed data
It was detected that binary sealed data
could happen. Ensure that it is str
before passing to configuration.
2021-04-23 14:17:54 -04:00
Jarrod Johnson affbbcc89b Fix syncfiles for el7 2021-04-23 12:27:42 -04:00
Jarrod Johnson 45cc4b7788 Add documentation syncfiles examples
Also, check to make sure a syncfiles has actual
work to do before triggering a greenthread and
the client to start polling.
2021-04-23 11:09:35 -04:00
Jarrod Johnson 945f108548 Fix inconsistencies between el7 and el8
While there are still differences, minimize
the ones that aren't for specific reasons
2021-04-23 09:08:50 -04:00
Jarrod Johnson 1f9c440525 Handle non-utf8 console data
Sometimes console uses non-utf8.

Fallback to cp437 when utf8 fails us.
2021-04-22 15:14:52 -04:00
Jarrod Johnson 8397c5defc Only close datfile if datfile is a file
If going by filename alone, there will be
no file handle to close. Correct by not
attempting a close in such a case.
2021-04-22 13:55:10 -04:00
Jarrod Johnson b7af6b5c27 Add model name to discovery info
Sometimes the model name is
useful criteria for evaluating systems,
and the model number isn't
quite that handy.

For XCC, we can provide this data too. Provide it in xcc scan
method and then offer it up to clients.
2021-04-22 13:38:51 -04:00
Jarrod Johnson c38aac88df Avoid overwriting customized installdisk or partitioning 2021-04-22 12:12:58 -04:00
Jarrod Johnson 6d1348f5fa Add pre.d to EL8 profiles 2021-04-22 12:08:25 -04:00
Jarrod Johnson c05f18d865 Remove abortive custom names for pre.sh.custom 2021-04-22 11:48:05 -04:00
Jarrod Johnson bf00c75f43 Specify supported protocols to be confluent.console
Eventlet will return no supported protocols if
none are specified. Firefox doesn't care, but
chrome rejects such a reply.
2021-04-22 07:44:18 -04:00
Jarrod Johnson 2e04647c95 Add xz to confluent genesis
xz provides better compression than gzip, handy
to have as an option.
2021-04-21 16:59:33 -04:00
Jarrod Johnson 479ddd582e Induce python2 to unicode
eventlet will treat str as binary,
correct by forcing unicode.

For python3, it is a no-op, but
python2 needs it to pass the 'text_type' check in eventlet.
2021-04-21 15:33:27 -04:00
Jarrod Johnson d82690f0d9 Fix python3-ism
python2 doesn't understand how to return
an iterator from within an iterator.
2021-04-21 13:31:11 -04:00
Jarrod Johnson 34cfd99fd8 Periodic reassimilation
Have leader periodically try to
assimilate offline members.

This will recover from some scenarios
where a rogue non-quorum collective
or a stray non-collective state
persists.
2021-04-21 10:30:54 -04:00
Jarrod Johnson 9009f63b2d Implement websocket based terminal access 2021-04-20 15:49:07 -04:00
Jarrod Johnson ab6bf82da6 Begin draft work to support websocket
First use case will be consoles.

Then we can consider the async case
for smoother async operation as well
though that is less critical.
2021-04-19 17:04:26 -04:00
Jarrod Johnson 0fae615756 Have nodediscover properly set exitcode
It was not propogating error to the caller in script context
2021-04-19 08:58:08 -04:00
Jarrod Johnson 37dca72579 Allow managercandidates to limit switch interrogation
If a switch is a node and has denoted allowed managers,
do not interrogate that switch if this member is not
permitted.
2021-04-16 14:19:51 -04:00
Jarrod Johnson 1aea406852 Restore error handling to SNMP
Properly carry and reconstitute exceptions
used to drive the specific errors.
2021-04-16 14:09:44 -04:00
Jarrod Johnson 374b87e2d7 Offload macmap SNMP activity to an auxillary process
This doesn't make the code more efficient, but it
keeps it from slowing down the main process
and allows it to leverage an additional core
to do the work.

Still needs work to restore the error reporting.
2021-04-15 17:22:15 -04:00
Jarrod Johnson 3469c8ab2b Fix affluent communication
Affluent would hang on error, particularly
certificate problem.  Fix by catching and being
explicit about the error, and generically
fixing the arguments for 'get' to have
the inntended timeout.
2021-04-14 15:51:18 -04:00
Jarrod Johnson e08ca5fb7e Have confetty show correct trace more easily
In some scenarios, the quitconfetty will overwrite the
stack trace.

Get the relevant trace before trying the quitconfetty, then print
the saved trace.
2021-04-14 10:10:44 -04:00
Jarrod Johnson 23dffe882e Do a keepalive to track idle, but alive collective
When relaying a command, use a keepalive to indicate that
the connection is alive, just not sending data.
2021-04-09 17:27:00 -04:00
Jarrod Johnson b6fb91b228 Have follower thread avoid killing self 2021-04-09 15:36:35 -04:00
Jarrod Johnson ac4d1fa8e1 More collective startup/recovery cleanup
If assimilated during startup, stop doing startup.
2021-04-09 13:32:32 -04:00
Jarrod Johnson 1d902c4d90 Backoff if trying to find a currently live server 2021-04-09 11:49:56 -04:00
Jarrod Johnson f11687998f Fix typo in cosmetic message 2021-04-08 20:48:46 -04:00
Jarrod Johnson 153956b2cd Further refine collective startup behavior 2021-04-08 18:26:59 -04:00
Jarrod Johnson 64d5081be3 Fix collective retry logic
It erroneously treated a thread as a bool, need
to check if None to know if it is scheduled.
2021-04-08 15:56:33 -04:00
Jarrod Johnson 8d16b412ae Further refine collective start process
Serialize assimilation, do not induce activity that may have been
aborted by an earlier chain.

Further, accelerate initial startup by making potential timeouts
occur concurrently, rather than sequentially.
2021-04-08 13:44:20 -04:00
Jarrod Johnson c5ec34d5a5 Actually hook in new assimilation behavior
Additionally, use collective member name as
tiebreaker if txcount and follower count is
identical.
2021-04-07 13:15:36 -04:00
Jarrod Johnson 6a4086679c Rework collective assimilation logic
Followers will only depart if their current leader
is assimilated.

Leaders with quorum will refuse assimilation and instruct
member trying to assimilate to join it.

Leaders without quorum will either follow the assimilation leader
or refuse, depending on who has highest transaction count, and if
a tie, which has the larger set of followers
2021-04-07 13:05:02 -04:00
Jarrod Johnson 3d2422ded3 Coerce iterator to list for length check 2021-04-07 08:40:18 -04:00
Jarrod Johnson 7d0f47bbcb Correct syntax for measuring collective size 2021-04-07 08:31:29 -04:00
Jarrod Johnson 9a779f2dd2 Improve collective startup behavior
Have confluent focus on establishing quorum before
initiating headless console and discovery activity.
2021-04-07 07:58:10 -04:00
Jarrod Johnson 4724d9e45b Eliminate one source of stale data leaking
If nodes are swapped, then clearing the attributes
did not clear some mappings.
2021-04-06 18:19:13 -04:00
Jarrod Johnson 8404ddf3a2 Fix import of sortutil 2021-04-06 10:43:37 -04:00
Jarrod Johnson 872a13589c Sort collective members
Improve consistency of output by sorting the output.
2021-04-06 09:35:34 -04:00
Jarrod Johnson 433a22e6e7 Finish rename of variable 2021-04-06 08:22:51 -04:00
Jarrod Johnson 1f238a3f8b Fix variable that was not declared after refactor 2021-04-06 08:20:10 -04:00
Jarrod Johnson 670fc87e1d Address several collective issues
When a stream has been deleted from cfgstreams, contiue exception
handling since the desired result.

For connections to a manager, institute a 15 second socket level timeout.
This avoids an abandoned server conversation from locking a colleective member startup.

When scheduling the failover check, first block any redundant attempts to schedule.

Wrap the collective startup in an exception
handler, so that a retry is
more well guaranteed.
2021-04-05 16:39:41 -04:00
Jarrod Johnson 3be3d4a588 Always send null byte out stdout
If the buffer doesn't exist or if it does,
either way make sure to write out a null
byte to let the caller know that it
is done.
2021-04-02 14:01:25 -04:00
Jarrod Johnson 14d13749ad Guarantee consoleserver init before use
During a restart, a client may aggressively trigger
console reconnect before the consoleserver starts.

Make sure that the daemon is running and globals
ready before API could possible ask for console.
2021-04-02 13:57:45 -04:00
Jarrod Johnson 92a10ede11 Pull in tmt fixes from Martin Hughes fork
Fix SGR being applied and fix default fg/bg color situation.
2021-04-02 13:13:19 -04:00
Jarrod Johnson d9051e80d3 Fix console buffer interaction
In some environments, the read method on the pipe object fails
to work, os.read should be the same, but seems to work better and
is happy to perform the opportunisticly large reads I want.
2021-04-02 12:29:41 -04:00
Jarrod Johnson 2d43fac1b5 Add a contingency for temporary read error 2021-04-02 11:54:38 -04:00
Jarrod Johnson 4a0d419f85 Improve behavior on python2 systems 2021-04-02 11:47:14 -04:00
Jarrod Johnson 7fb5f9756d Explictly request newer C version
C99 is needed for tmt, might as well go GNU11
2021-04-02 10:36:56 -04:00
Jarrod Johnson b482410072 Have server pull in vtbufferd 2021-04-01 17:31:52 -04:00
Jarrod Johnson 4d47f58e53 Make tar creation less verbose 2021-04-01 17:22:10 -04:00
Jarrod Johnson c5bb55e8f2 Fix name in the rpm spec 2021-04-01 17:21:33 -04:00
Jarrod Johnson 2320718618 Fix build issues with the vtbuffer daemon 2021-04-01 17:17:34 -04:00
Jarrod Johnson d64b3e6a4e Fix up build process for vtbufferd 2021-04-01 17:15:35 -04:00
Jarrod Johnson 637e0f0a81 Draft RPM spec for vtbufferd component 2021-04-01 16:44:40 -04:00
Jarrod Johnson e26218eb92 Implement SGR recreation and fix ECH
The tmt library had a bug with ECH with cursor position.

Flesh out the dump_vt to translate the attributes to VT codes
for the buffer to look the same as the attributes indicate.
2021-04-01 16:28:28 -04:00
Jarrod Johnson 03eb026b61 Improve VT dump behavior
Ensure the resultant dump has consistently long lines.  This
will matter when we start rendering attributes on blanks.

Additionally, simplify the code
significantly taking advantage
of first loop.
2021-04-01 12:51:32 -04:00
Jarrod Johnson beab6a3c02 Migrate VT buffering to c
C implementation to improve memory and cpu utilization.

Forked off to further move the work off the main process.

Still needs attribute rendition and packaging before merging to main
branch.
2021-03-31 17:28:26 -04:00
Jarrod Johnson 5e0ebce300 Add logs for offering boot
Make it easier to debug a failure
to boot due to misconfiguration.
2021-03-29 16:58:03 -04:00
Jarrod Johnson 85c4ec5654 Skip fqdn in cert generation
There are scenarios where getqfdn can induce a hang.
The certificate having FQDN isn't that useful anyway,
since confluent never uses it and external use of it
may need more carefully crafted certificate to have
a good chance of matching it anyway.

Also, the chances a user would import our cert as a
CA to something like a browser are low.
2021-03-29 14:29:42 -04:00
Jarrod Johnson 7957a6abd4 Add invoking syncfile activity to the default profiles 2021-03-29 14:03:11 -04:00
Jarrod Johnson 39a7d8d131 Move the syncfileclient into scripts
This does not need to be in initramfs,
so do not grow addons.cpio.
2021-03-29 13:55:44 -04:00
Jarrod Johnson 54c5bf128e Finish syncflieclient 2021-03-29 13:50:07 -04:00
Jarrod Johnson ca0c592044 Commence work on syncfileclient
This will be used to wait for deployer
to finish, then execute handlers
for 'MERGE' entries.
2021-03-25 16:55:56 -04:00
Jarrod Johnson 829d1316b2 Remove 'APPEND:'
If possible, we wannt to stick to 'MERGE', since the handlers
are designed to make that
idempotent for repeat.

APPEND: would not be idempotent...
2021-03-25 12:37:21 -04:00
Jarrod Johnson c2c1c85651 Increase verbosity of syncfiles 2021-03-25 08:59:16 -04:00
Jarrod Johnson c5833f1417 Reserve some characters for special syntax
May need to modify some behaviors in future, provide
a healthy supply of reserved characters toward that end.
2021-03-25 08:57:48 -04:00
Jarrod Johnson 07ae3593c3 Syncfiles fixes 2021-03-24 17:33:26 -04:00
Jarrod Johnson 8ab35b11cd Add -a notation about syncfiles relevance 2021-03-24 16:01:48 -04:00
Jarrod Johnson 35ef6170ba Implement syncfiles server side 2021-03-24 16:00:54 -04:00
Jarrod Johnson d650f11255 Begin work on syncfiles concept for confluent 2021-03-23 17:32:45 -04:00
Jarrod Johnson b4926b39fe Fix CA in installer env in ubuntu 2021-03-22 12:16:32 -04:00
Jarrod Johnson 53ccee734f Add more lvm dependencies 2021-03-22 11:00:21 -04:00
Jarrod Johnson fe9d0e84d3 Ubuntu firstboot ansible and scripts directory support 2021-03-22 10:36:14 -04:00
Jarrod Johnson 4e7e12f90f Add ansible to ubuntu post and scripts/post.d 2021-03-22 10:35:11 -04:00
Jarrod Johnson 8ae68cd34a Merge pull request #40 from vmaneagit/patch-60
Update nodesetboot.ronn
2021-03-22 08:05:59 -04:00
vmaneagit 607d69b1e1 Update nodesetboot.ronn
Changes made for Option chapter:
 - updated -m command
 - added -h command

Description chapter was updated
2021-03-22 13:47:04 +02:00
vmaneagit 75e13239c2 Update nodesupport.ronn 2021-03-22 13:40:49 +02:00
vmaneagit c88d8d047a Update collate.ronn
OPTIONS chapter has been updated to match the output from confetty -h
2021-03-22 13:38:13 +02:00
vmaneagit 304fbba2bb Update confetty.ronn
OPTIONS chapter has been updated to match the output from confetty -h
2021-03-22 13:31:54 +02:00
vmaneagit d2f35ccbde Update nodegroupattrib.ronn.tmpl
Changes made for Option chapter:
 - added -h command
2021-03-22 12:40:46 +02:00
vmaneagit 273c32d4a7 Update nodelicense.ronn
Changes made for Option chapter:
 - updated -m command
 - added -h command

Update typo in Description chapter: "Using delete will remove the specified license name from  th eBMC."
2021-03-22 12:38:55 +02:00
vmaneagit 1616999cb9 Update nodelicense.ronn
Changes made for Option chapter:
 - updated -m command
 - added -h command
2021-03-22 12:36:24 +02:00
vmaneagit 195db5c6e8 Update nodepower.ronn
Changes made for Option chapter:
 - added -m command
2021-03-22 12:34:23 +02:00
vmaneagit fa0e216c7e Update noderemove.ronn
Changes made for Option chapter:
 - updated -m command
 - added -h command
2021-03-22 12:29:35 +02:00
vmaneagit 1605169b92 Update nodereseat.ronn
Changes made for Option chapter:
 - updated -m command
 - added -h command
2021-03-22 12:28:17 +02:00
vmaneagit 7fa0016536 Update nodersync.ronn
Changes made for Option chapter:
 - updated -m command
 - added -h command
2021-03-22 12:26:51 +02:00
vmaneagit b4d26c3c4e Update nodersync.ronn
Changes made for Option chapter:
 - updated -m command
 - added -h command
2021-03-22 12:21:28 +02:00
vmaneagit 7470d9b55c Update nodesupport.ronn
Changes made for Option chapter:
 - updated -m command
 - added -h command
2021-03-22 12:06:57 +02:00
vmaneagit aaf1fb8c94 Update collective.ronn
Changes made for Option chapter:
 - added -h command
2021-03-22 12:01:24 +02:00
Jarrod Johnson 50e62c7b73 Bump release to pick up new lvm content 2021-03-19 19:24:31 -04:00
Jarrod Johnson 363eff831f Add devicemapper modules to genesis
This enables at least common lvm access for rescue purposes.
2021-03-19 18:52:18 -04:00
Jarrod Johnson 31820ddfd7 Fix ansible support of suse15
Must install python3 and we must have the python apiclient
intact with appropriate CA certs to proceed
2021-03-19 16:07:59 -04:00
Jarrod Johnson 153749aebe Change ssh duringe suse 15 post
Have port 22 be inside the target environment, and
2222 point to the installer. This improves ansible
experience.
2021-03-19 15:13:37 -04:00
Jarrod Johnson 7c5dd85e74 Copy in ansible to genesis profiles
Make it clearer that there could be ansible support in genesis
2021-03-19 13:09:21 -04:00
Jarrod Johnson 7a5bf8a06f Merge pull request #23 from vmaneagit/patch-25
Update noderun.ronn
2021-03-19 11:04:28 -04:00
Jarrod Johnson 9c05057deb Merge pull request #24 from vmaneagit/patch-26
Update nodemedia.ronn
2021-03-19 11:04:22 -04:00
Jarrod Johnson 8b1902601f Merge pull request #28 from vmaneagit/patch-30
Update nodepower.ronn
2021-03-19 11:04:17 -04:00
Jarrod Johnson d94d9d0a78 Merge pull request #32 from vmaneagit/patch-35
Update nodefirmware.ronn
2021-03-19 11:04:09 -04:00
Jarrod Johnson 457b0851c9 Merge pull request #33 from vmaneagit/patch-36
Update nodeeventlog.ronn
2021-03-19 11:04:05 -04:00
Jarrod Johnson d2cae9faca Merge pull request #34 from vmaneagit/patch-37
Update nodedeploy.ronn
2021-03-19 11:02:24 -04:00
Jarrod Johnson e27739eafd Merge pull request #37 from vmaneagit/patch-40
Update nodebmcreset.ronn
2021-03-19 11:02:16 -04:00
Jarrod Johnson 874302537d Merge pull request #36 from vmaneagit/patch-39
Update nodeboot.ronn
2021-03-19 11:01:56 -04:00
Jarrod Johnson cd3b67d4cc Merge pull request #38 from vmaneagit/patch-41
Update nodeattrib.ronn.tmpl
2021-03-19 11:01:41 -04:00
Jarrod Johnson 7aacac2fb7 Merge pull request #39 from vmaneagit/patch-42
Update confluentdbutil.ronn
2021-03-19 11:01:27 -04:00
Jarrod Johnson a69fb3fec3 Merge pull request #35 from vmaneagit/patch-38
Update nodeconfig.ronn
2021-03-19 11:01:13 -04:00
Jarrod Johnson 2d9cbe4f33 Merge pull request #22 from vmaneagit/patch-24
Update nodesupport
2021-03-19 11:00:57 -04:00
vmaneagit e33ed0afc8 Update confluentdbutil.ronn
Changes made for Option chapter:
 - added -h command
2021-03-19 16:55:09 +02:00
vmaneagit ace6544444 Update nodeattrib.ronn.tmpl
Changes made for Option chapter:
 - updated -m command
 - added -h command
2021-03-19 16:50:59 +02:00
vmaneagit 1468c56e1f Update nodebmcreset.ronn
Changes made for Option chapter:
 - updated -m command
 - added -h command
2021-03-19 16:48:40 +02:00
vmaneagit b36756ebbc Update nodeboot.ronn
Changes made for Option chapter:
 - updated -m command
 - added -h command

Synopsis chapter was reduced to single line
2021-03-19 15:28:33 +02:00
vmaneagit a8f378deb7 Update nodeconfig.ronn
Changes made for Option chapter:
 - updated -m command
 - added -h command

Synopsis chapter was reduced to single line
2021-03-19 15:22:14 +02:00
vmaneagit cb4e53c459 Update nodedeploy.ronn
Changes made for Option chapter:
 - updated -m command
 - added -h command

Synopsis chapter was reduced to single line
2021-03-19 15:20:08 +02:00
vmaneagit 3e0b283593 Update nodeeventlog.ronn
Changes made for Option chapter:
 - updated -m command
 - added -h command

Synopsis chapter was reduced to single line
2021-03-19 15:17:41 +02:00
vmaneagit 3b4e9fd2e4 Update nodefirmware.ronn
Changes made for Option chapter:
 - updated -m command
 - added -h command

Synopsis chapter was reduced to the same line as the usage:

nodefirmware <noderange> [list][update [--backup <file>]]|[<components>]
2021-03-19 15:06:14 +02:00
vmaneagit 6af6195798 Update nodepower.ronn
Changes made for Option chapter:

 - added -h command
2021-03-19 14:22:47 +02:00
vmaneagit a8d1f484b5 Update nodemedia.ronn
Changes made for Option chapter:
 - added -h command
- removed -c command
2021-03-19 13:17:30 +02:00
vmaneagit 619c60533d Update noderun.ronn
Changes made for Option chapter:
 - added -h command
 - updated -m command
2021-03-19 13:13:03 +02:00
vmaneagit c6fd760006 Update nodesupport
Updated line 119 with to show  "<filename or directory>"
2021-03-19 11:49:46 +02:00
Jarrod Johnson 03f88c6e3e Swap ssh during post phase to installed image
Preserve installer access on 2222

This enables easier ansible usage.
2021-03-18 15:53:30 -04:00
Jarrod Johnson 697b33ae80 Put a lower bound on autocons geometry
If some glitch happens during the read, do not end up with
absurdly low geometry.
2021-03-18 15:48:25 -04:00
Jarrod Johnson 79ef1c4811 Correct typo in functions update 2021-03-18 14:58:53 -04:00
Jarrod Johnson f442e949aa Add firstboot/post ansible play support to SUSE15 2021-03-18 14:37:54 -04:00
Jarrod Johnson 8050d3f69a Add playbook examples for default genesis 2021-03-18 14:30:18 -04:00
Jarrod Johnson 66efa1da5c Implement remote config for EL8 2021-03-18 14:12:19 -04:00
Jarrod Johnson df97e808c6 Wire up client retrieval of remoteconfig
remoteconfig can now watch for completion and return
data to client
2021-03-17 17:46:27 -04:00
Jarrod Johnson 98d14344ce Have runansible complete execution
It now completes runs and stores results for retrieval by deploying node.
2021-03-17 16:54:37 -04:00
Jarrod Johnson a149b0bcd0 Merge branch 'master' into ansibleplay 2021-03-17 10:25:57 -04:00
Jarrod Johnson 0be1e350e9 Merge pull request #21 from vmaneagit/patch-23
Update stats
2021-03-17 10:24:41 -04:00
Jarrod Johnson 4818bd57bb Advance state of runansible
Begin work to wire the results back to the supervisor and ultimately
back to the node affected.
2021-03-16 17:19:23 -04:00
Jarrod Johnson 7763327a63 Skip confluent import on exec
In main context, we don't need
sshutil, and python path is not
cooperative, so just skip it.
2021-03-16 16:23:27 -04:00
Jarrod Johnson dac957364f Merge branch 'master' into ansibleplay 2021-03-16 14:54:53 -04:00
Jarrod Johnson 528dd4c3e8 Merge branch '3.1' 2021-03-16 14:54:42 -04:00
Jarrod Johnson e40c362743 Fix network configuration changes through collective 2021-03-16 14:54:26 -04:00
Jarrod Johnson 7fdb4dccca Fix network configuration changes through collective 2021-03-16 14:53:55 -04:00
Jarrod Johnson a3c8c305c1 Add ansible supervisory code 2021-03-16 14:19:44 -04:00
Jarrod Johnson aeb1b704b3 Add mechanism to supply data from argv
Some POST calls may want body from CLI, make this
easier by no longer requiring a file to do so.
2021-03-16 11:18:46 -04:00
Jarrod Johnson f2cb6ea535 Merge branch 'master' into ansibleplay 2021-03-16 10:46:54 -04:00
Jarrod Johnson 5a81279b9d Fix servicedata fetch
In the new framework with
filehandle passing, the provided
callback must accept a data
argument.  get_diags can't
actually use it, but does have
to accept a token value.
2021-03-15 16:45:43 -04:00
vmaneagit 9954bf5b51 Update stats
Updated stats script with lines 40-41

Added:

if gui and mpl.get_backend() == 'agg':
        sys.stderr.write('Error: No GUI backend available and -g specified!\n')
2021-03-15 13:57:29 +02:00
Jarrod Johnson 309ea00f10 Merge branch 'master' into ansibleplay 2021-03-13 12:54:01 -05:00
Jarrod Johnson cafbc1d1c2 Have tty2 also run a shell
Some may find switching VTs to be more intuitive
than tmux session management. Provide one extra
on tty2 for such a scenario.
2021-03-13 12:50:44 -05:00
Jarrod Johnson 797e197bc7 Have tmux keep reattaching
If someone accidentally detaches, then intervene and
reattach.
2021-03-13 12:50:37 -05:00
Jarrod Johnson 19d4a3a83f Have autocons attempt sizing of serial console
If a terminal is open during autocons, that terminal
will be the size of the console.

Otherwise, fallback to 100x31.
2021-03-13 12:50:21 -05:00
Jarrod Johnson df328d6812 Have tty2 also run a shell
Some may find switching VTs to be more intuitive
than tmux session management. Provide one extra
on tty2 for such a scenario.
2021-03-13 12:49:26 -05:00
Jarrod Johnson 7da0dfa0bb Have tmux keep reattaching
If someone accidentally detaches, then intervene and
reattach.
2021-03-13 12:47:48 -05:00
Jarrod Johnson d3a699a8fb Have autocons attempt sizing of serial console
If a terminal is open during autocons, that terminal
will be the size of the console.

Otherwise, fallback to 100x31.
2021-03-13 12:33:53 -05:00
Jarrod Johnson 82598d02d8 Merge branch 'master' into ansibleplay 2021-03-12 13:56:02 -05:00
Jarrod Johnson 874947076d Fix local console behavior in genesis
This will have the vga console be less concerning.
2021-03-12 13:55:33 -05:00
Jarrod Johnson 8032ea36be Fix local console behavior in genesis
This will have the vga console be less concerning.
2021-03-12 13:55:14 -05:00
Jarrod Johnson 8ad130e14c Fix local console behavior in genesis
This will have the vga console be less concerning.
2021-03-12 13:54:36 -05:00
Jarrod Johnson ffe0754dd9 Fix typo in confluent profile.yaml
The quiet argument was missed due to typo in parameter name.
2021-03-12 12:44:19 -05:00
Jarrod Johnson 5aa6fbc019 Fix typo in confluent profile.yaml
The quiet argument was missed due to typo in parameter name.
2021-03-12 12:42:57 -05:00
Jarrod Johnson 7026fdfa3a WIP change to enhance selfservice api for ansible
Begin work on extending selfservice to allow nodes
to request the deployer run ansible plays.
2021-03-12 12:23:58 -05:00
Jarrod Johnson 9dbecd4c95 Merge branch 'master' into ansibleplay 2021-03-12 12:23:48 -05:00
Jarrod Johnson d85219d5fa Merge branch 'master' of github.com:lenovo/confluent 2021-03-12 12:22:20 -05:00
Jarrod Johnson bbb8e50c3e Fix configbmc gateway check
It erroneously linked to prefix to check gateway or not.
2021-03-11 16:28:01 -05:00
Jarrod Johnson 26782811d6 Fix configbmc gateway check
It erroneously linked to prefix to check gateway or not.
2021-03-11 16:27:17 -05:00
Jarrod Johnson e38dbc4470 Pull in the automation key into default profiles 2021-03-10 15:41:01 -05:00
Jarrod Johnson a26624a614 Use ssh-agent to store keys
Also add the 'automation' key for ansible to
take advantage of.
2021-03-10 15:41:01 -05:00
Jarrod Johnson 4f246e6a41 Fix compatibility with some switch configurations
While some implementations mess up portid and need portdescr instead, others are
just the opposite.

Tolerate match either by description or name.
2021-03-10 13:41:59 -05:00
Jarrod Johnson c53e758170 Workaround non-cisco switch crash
Querying Cisco MIB on certain
firmware levels of non-cisco switches
causes a crash.  Tolerate and
wait a bit to give SNMP a chance to restart.
2021-03-10 13:41:52 -05:00
Jarrod Johnson 1a7c238b54 Handle malformed json data more gracefully 2021-03-10 13:41:45 -05:00
Jarrod Johnson 6a88f35fc2 Fix compatibility with some switch configurations
While some implementations mess up portid and need portdescr instead, others are
just the opposite.

Tolerate match either by description or name.
2021-03-10 13:40:47 -05:00
Jarrod Johnson 7a27fba94b Workaround non-cisco switch crash
Querying Cisco MIB on certain
firmware levels of non-cisco switches
causes a crash.  Tolerate and
wait a bit to give SNMP a chance to restart.
2021-03-10 09:51:05 -05:00
Jarrod Johnson 94a4a7e20b Fix missing exit code in nomededia
nodemedia was not setting return code on exit properly.
2021-03-08 08:01:30 -05:00
Jarrod Johnson 2a87c32800 Handle malformed json data more gracefully 2021-03-08 02:55:58 -05:00
Jarrod Johnson d99bc37ed3 Fix missing exit code in nomededia
nodemedia was not setting return code on exit properly.
2021-03-08 08:01:19 -05:00
Jarrod Johnson 2c40d2fd0d Merge pull request #14 from vmaneagit/patch-22
Update nodesupport.ronn
2021-03-08 07:49:13 -05:00
Jarrod Johnson 611927d2ff Merge pull request #15 from vmaneagit/patch-16
Update nodelicense.ronn
2021-03-08 07:49:03 -05:00
Jarrod Johnson eb9ae61e75 Merge pull request #16 from vmaneagit/patch-17
Update noderemove.ronn
2021-03-08 07:48:51 -05:00
Jarrod Johnson 4ae102018a Merge pull request #17 from vmaneagit/patch-18
Update nodereseat.ronn
2021-03-08 07:48:42 -05:00
Jarrod Johnson 4f01545328 Merge pull request #18 from vmaneagit/patch-19
Update nodersync.ronn
2021-03-08 07:48:25 -05:00
Jarrod Johnson 762fb8259d Merge pull request #19 from vmaneagit/patch-20
Update noderun.ronn
2021-03-08 07:48:00 -05:00
Jarrod Johnson 2ca146c1aa Merge pull request #20 from vmaneagit/patch-21
Update nodesetboot.ronn
2021-03-08 07:47:38 -05:00
vmaneagit 16f40efb69 Update nodesupport.ronn
OPTIONS section has been added to match the output from nodesupport -h
2021-03-08 10:46:37 +02:00
vmaneagit a51a428761 Update nodesetboot.ronn
OPTIONS section has been updated to match the output from nodesetboot -h
2021-03-08 10:30:21 +02:00
vmaneagit a5261cc1da Update noderun.ronn
OPTIONS section has been added to match the output from noderun -h
2021-03-08 10:23:47 +02:00
vmaneagit c8166b7cce Update nodersync.ronn
OPTIONS section has updated to match the output from nodersync -h
2021-03-08 10:14:17 +02:00
vmaneagit a11317c994 Update nodereseat.ronn
OPTIONS section has been added to match the output from nodereseat -h
2021-03-08 10:06:08 +02:00
vmaneagit 279f622026 Update noderemove.ronn
OPTIONS section has been updated to match the output from noderemove -h
2021-03-08 09:58:33 +02:00
vmaneagit 32fa07d9ce Update nodelicense.ronn
OPTIONS section has been addeed to match the output from nodelicense -h
2021-03-08 09:51:42 +02:00
Jarrod Johnson c9157b90eb Close other places that may be false negative
Have checks for neightable be preceeded by an attempt to refresh,
to mitigate false negatives.
2021-03-05 13:15:37 -05:00
Jarrod Johnson 2e63ff3aca Close other places that may be false negative
Have checks for neightable be preceeded by an attempt to refresh,
to mitigate false negatives.
2021-03-05 13:14:41 -05:00
Jarrod Johnson 5d0423c38b Attempt refresh of neigh table on miss
When an address is new it may not be in the last
captured neighbor table. Induce refresh before deciding
that neighbor is unavailable.
2021-03-05 13:09:54 -05:00
Jarrod Johnson e3c17491e5 Attempt refresh of neigh table on miss
When an address is new it may not be in the last
captured neighbor table. Induce refresh before deciding
that neighbor is unavailable.
2021-03-05 13:08:25 -05:00
Jarrod Johnson da7b7c8923 Add a script to filter passwd/shadow/group for replication 2021-03-05 10:52:25 -05:00
Jarrod Johnson 5861af799c Merge pull request #13 from vmaneagit/patch-13
Update nodegroupattrib.ronn.tmpl
2021-03-05 09:21:33 -05:00
Jarrod Johnson 2b0353c771 Merge pull request #12 from vmaneagit/patch-12
Update nodefirmware.ronn
2021-03-05 09:21:16 -05:00
Jarrod Johnson bc6c3c5e68 Merge pull request #11 from vmaneagit/patch-11
Update nodeeventlog.ronn
2021-03-05 09:20:53 -05:00
Jarrod Johnson 37ec16058f Merge pull request #10 from vmaneagit/patch-10
Update nodedeploy.ronn
2021-03-05 09:20:32 -05:00
Jarrod Johnson b3efd2f31d Merge pull request #9 from vmaneagit/patch-9
Update nodeconfig.ronn
2021-03-05 09:20:16 -05:00
Jarrod Johnson 357ebfca3f Merge pull request #8 from vmaneagit/patch-8
Update nodeboot.ronn
2021-03-05 09:19:52 -05:00
vmaneagit 7e0cd9d709 Update nodegroupattrib.ronn.tmpl
OPTIONS section has been updated to match the output from nodegroupattrib -h
2021-03-05 15:56:27 +02:00
vmaneagit ba321551e4 Update nodefirmware.ronn
OPTIONS section has been added to match the output from nodefirmware -h
2021-03-05 15:51:52 +02:00
vmaneagit d96026ef5f Update nodeeventlog.ronn
OPTIONS section has been added to match the output from nodeeventlog -h
2021-03-05 15:46:11 +02:00
vmaneagit 08aa667b13 Update nodedeploy.ronn
OPTIONS chapter has been updated to match the output from nodedeploy -h
2021-03-05 11:49:24 +02:00
vmaneagit 0cb93c4bea Update nodeconfig.ronn
OPTIONS chapter has been updated to match the output from nodeconfig -h
2021-03-05 11:44:02 +02:00
vmaneagit 7b3ecc6e4f Update nodeboot.ronn
OPTIONS chapter has been updated to match the output from nodeboot -h
2021-03-05 11:37:42 +02:00
Jarrod Johnson 5a5b3f9927 Correct incorrect function call on image import 2021-03-04 16:55:26 -05:00
Jarrod Johnson 4455226ee0 Merge pull request #7 from vmaneagit/patch-7
Update nodebmcreset.ronn
2021-03-04 16:25:36 -05:00
Jarrod Johnson 0881d74731 Merge pull request #6 from vmaneagit/patch-6
Update nodeattrib.ronn.tmpl
2021-03-04 16:25:26 -05:00
Jarrod Johnson 55d7191573 Merge pull request #5 from vmaneagit/patch-5
Update confluentdbutil.ronn
2021-03-04 16:25:19 -05:00
Jarrod Johnson bc9d0a9d3b Merge remote-tracking branch 'lenovo/master' 2021-03-04 14:05:48 -05:00
Jarrod Johnson 866f138652 Fix mistakes in sample mofed post script 2021-03-04 13:30:00 -05:00
vmaneagit ee8ad66959 Update nodebmcreset.ronn
OPTIONS chapter has been added to match the output from nodebmcreset -h
2021-03-04 18:52:10 +02:00
vmaneagit be0e47142b Update nodeattrib.ronn.tmpl
OPTIONS chapter has been updated to match the output from nodeattrib -h
2021-03-04 18:45:29 +02:00
vmaneagit 4131f1ba4f Update confluentdbutil.ronn
OPTIONS chapter has been updated to match the output from confluentdbutil -h
2021-03-04 18:36:48 +02:00
Jarrod Johnson f2966bfeaf Merge pull request #4 from vmaneagit/patch-4
Update confetty.ronn
2021-03-04 11:16:38 -05:00
Jarrod Johnson eee6330aaf Merge pull request #3 from vmaneagit/patch-3
Update collective.ronn
2021-03-04 11:15:52 -05:00
Jarrod Johnson aa9ece529f Merge pull request #2 from vmaneagit/patch-2
Update collate.ronn
2021-03-04 11:15:36 -05:00
Jarrod Johnson 865d18d367 Back off progress update on file copy
The output was too frenzied, cool it down to fewer
updates.
2021-03-04 11:01:17 -05:00
Jarrod Johnson e583d34555 Fix nic index map with bonding
The assumption that /sys/class/net is interfaces is incorrect,
when encountering entries that are not interfaces, do not
mess up the call.
2021-03-04 10:49:23 -05:00
Jarrod Johnson b27d07f304 Fix nic index map with bonding
The assumption that /sys/class/net is interfaces is incorrect,
when encountering entries that are not interfaces, do not
mess up the call.
2021-03-04 10:47:28 -05:00
vmaneagit 50e60a5a17 Update confetty.ronn
OPTIONS chapter has been added to match the output from confetty -h
2021-03-04 17:33:59 +02:00
vmaneagit 8bf7e045d5 Update collective.ronn
SYNOPSIS chapter has been updated to match the output from collective -h
2021-03-04 17:05:50 +02:00
vmaneagit f0f4427dc3 Update collate.ronn
SYNOPSIS and OPTIONS chapters have been updated to match the output from collate -h
2021-03-04 16:52:30 +02:00
Jarrod Johnson b1f1f15ba8 Fix filecopy and enhnance
shutil was copying from wrong
index. Stop using shutil and
bring it in, and instrument the
percentage.
2021-03-04 09:29:31 -05:00
Jarrod Johnson 09ca449eab Fix iso import distinfo.yaml
If a copy method (e.g. ubuntu) is used, then distinfo.yaml is not
written. Fix by not overwriting the directory name.
2021-03-04 09:02:43 -05:00
Jarrod Johnson d08ce9e563 Correct fd used in libarchive
Actually use the cloned file descriptors
2021-03-04 08:43:17 -05:00
Jarrod Johnson ce92ea4084 Separate buffered and raw operation on filehandle
python and libarchive need different seek behaviors
with default file objects.
2021-03-04 08:30:05 -05:00
Jarrod Johnson 0695f8e827 Change seek method
The wrapper around seek would sometimes change offsets before
passing to lseek.  Directly call lseek since python appears
to be making some sort of mistake in some cases.
2021-03-04 07:55:18 -05:00
Jarrod Johnson 7609a46594 Merge remote-tracking branch 'lenovo/master' 2021-03-03 14:46:51 -05:00
Jarrod Johnson 247838f70c Redirect non-enclosure reseat to nodes
This allows new PSU AC cycle functionality to work.
2021-03-03 13:01:25 -05:00
Jarrod Johnson 594d419ca0 Merge pull request #1 from vmaneagit/patch-1
Update nodeshell.ronn
2021-03-02 15:57:09 -05:00
vmaneagit da0c83513a Update nodeshell.ronn
Updated SYNOPSIS and OPTIONS chapters
2021-03-02 22:51:48 +02:00
Jarrod Johnson 5ed0b50110 Fix non-client fallback
If client doesn't provide file,
then we need to open by name.
2021-03-02 15:15:54 -05:00
Jarrod Johnson e01a7cf4fb Merge branch 'master' into passfilehandle 2021-03-02 14:05:54 -05:00
Jarrod Johnson ad92ab13f3 Correct mistake in nodediscover correction 2021-03-02 14:05:28 -05:00
Jarrod Johnson 236e5466cb Merge branch 'master' into passfilehandle 2021-03-02 13:22:16 -05:00
Jarrod Johnson cc16e58c3a Merge branch '3.1' 2021-03-02 11:13:44 -05:00
Jarrod Johnson 0ff9d5dc7e Merge branch 'master' into passfilehandle 2021-03-01 10:32:39 -05:00
Jarrod Johnson 95466392f9 Fix typo in confluentdbutil
The restore function would fail
to chown directories due to typo
2021-03-01 10:32:13 -05:00
Jarrod Johnson b3857f8d33 Fix chained discovery of DWC SMMv2
SMMv2 for DWC has more ports. Make the code
not care about which port is which for checking
for matching smm fingerprints.
2021-03-01 10:32:05 -05:00
Jarrod Johnson f176ebe4c2 Fix typo in confluentdbutil
The restore function would fail
to chown directories due to typo
2021-03-01 10:31:28 -05:00
Jarrod Johnson e24852c480 Fix chained discovery of DWC SMMv2
SMMv2 for DWC has more ports. Make the code
not care about which port is which for checking
for matching smm fingerprints.
2021-02-27 20:53:33 -05:00
Jarrod Johnson 008089c4c0 license install through passed fd
Allow install of licenses that confluent cannot read.
2021-02-26 16:37:34 -05:00
Jarrod Johnson f34e184d31 Restore libc access to sockapi
Cleanup went too for in python2 port.
2021-02-26 16:25:51 -05:00
Jarrod Johnson 814257fbf8 Fix leaking file descriptors
When passing a filehandle for update, clean it up on end
of the update/upload.
2021-02-26 16:18:58 -05:00
Jarrod Johnson 83d92ecfcc Make file descriptor passing python2 friendly
python 2 did not have recvmsg/sendmsg,
so have to use ctypes to access
them through the c library.
2021-02-26 16:17:43 -05:00
Jarrod Johnson 7eb06f2722 Improve concurrency of SLP
During a scan, unicast TCP
interrogation of candidates
was done serially. Do this
concurrently so that poorly
behaving targets do not prolong
a scan.
2021-02-26 13:31:07 -05:00
Jarrod Johnson 0fbe39690e Improve concurrency of SLP
During a scan, unicast TCP
interrogation of candidates
was done serially. Do this
concurrently so that poorly
behaving targets do not prolong
a scan.
2021-02-26 13:30:36 -05:00
Jarrod Johnson ec2ad9861a Improve concurrency of SLP
During a scan, unicast TCP
interrogation of candidates
was done serially. Do this
concurrently so that poorly
behaving targets do not prolong
a scan.
2021-02-26 12:39:13 -05:00
Jarrod Johnson 16096ad745 FD passing for firmware and media upload
Extend use of client side file descriptors to
media and firmmware upload.
2021-02-25 12:55:38 -05:00
Jarrod Johnson 481a70c304 Fix traceback when multiple criteria have no matches
When a parent criteria has no match, then the api
returns a 404 as there is no parent.  Handle this
by only listing positively matched items.
2021-02-24 16:39:01 -05:00
Jarrod Johnson facd501100 Merge branch 'master' into passfilehandle 2021-02-19 15:44:55 -05:00
Jarrod Johnson 4c6f41ffb2 Have nodeconfig error on missing attributes per node 2021-02-19 14:36:51 -05:00
Jarrod Johnson 3e93ab1966 Have OS import work for unreadable input 2021-02-18 16:33:14 -05:00
Jarrod Johnson 0b5c4f6f0f Progress client managed filedescriptor 2021-02-18 14:58:45 -05:00
Jarrod Johnson e8778cb992 Merge branch 'master' into passfilehandle 2021-02-18 10:57:25 -05:00
Jarrod Johnson 2fae35b2c4 Be more consistent between man page and -h 2021-02-18 10:56:37 -05:00
Jarrod Johnson 08c7bd4e42 Merge branch 'master' into passfilehandle 2021-02-18 10:52:09 -05:00
Jarrod Johnson 1a17bf8fbb Further correct formatting discrepency 2021-02-18 10:51:30 -05:00
Jarrod Johnson f21b0570e8 Further amend formatting discrepencies 2021-02-18 10:50:21 -05:00
Jarrod Johnson 9cac77cac7 Correct minor formatting discrepency 2021-02-18 10:49:17 -05:00
Jarrod Johnson 3831d409f5 Merge branch 'master' into passfilehandle 2021-02-18 10:48:09 -05:00
Jarrod Johnson 10fcb5fa6d Add missing options to nodestorage man page 2021-02-18 10:35:37 -05:00
Jarrod Johnson ff00f48e58 Add missing [options] from -h on nodestorage 2021-02-18 10:31:54 -05:00
Jarrod Johnson 225a49f05e Merge branch 'master' into passfilehandle 2021-02-18 09:12:47 -05:00
Jarrod Johnson d3c9c90f35 Implement simple address scanning for SLP 2021-02-18 09:04:46 -05:00
Jarrod Johnson 78592bfe2a Merge branch 'master' into passfilehandle 2021-02-18 07:46:47 -05:00
Jarrod Johnson 1b2f5b6019 Add a misc slpscan.py 2021-02-18 07:35:11 -05:00
Jarrod Johnson 3c6511a0e7 Actually have a file handle pass
Rely upon python 3 for now. When the dust settles, either convert to
python 2 friendly use of ctypes, or alternatively just block using
the pass filehandle function in older python.
2021-02-17 17:04:16 -05:00
Jarrod Johnson c525a08c17 Correct a number of mistakes in the draft commit 2021-02-17 14:34:45 -05:00
Jarrod Johnson edaaafa059 Begin work on passing filehandles for local cli
This would enable files to be uploaded/downloaded
using the client filehandles, overcoming awkward
difference in file privilege between client and
server.
2021-02-17 13:54:18 -05:00
Jarrod Johnson f16e84de32 Fix group display of crypted attributes 2021-02-12 13:32:36 -05:00
Jarrod Johnson 4c99bc142b Bump genesis build number 2021-02-11 16:43:01 -05:00
Jarrod Johnson 8e4f5fcae6 Register sftp in genesis by default 2021-02-11 16:42:30 -05:00
Jarrod Johnson c4d3cb409d Also add sftp, to make ansible not complain 2021-02-11 16:41:24 -05:00
Jarrod Johnson 9eed1378f6 Enable ansible to target genesis 2021-02-11 16:39:17 -05:00
Jarrod Johnson 5f282dd40a Attempt removing needless cache from python
Try to shrink image by removing duplicate
cached modules.
2021-02-11 15:39:25 -05:00
Jarrod Johnson 6e88a44399 Update name of tpm2 utility
pcrlist became pcrread
2021-02-11 15:37:38 -05:00
Jarrod Johnson 94e731274a Add debug in case where ESXi has no network
Do away with appearance of mysterious hang
2021-02-11 11:44:53 -05:00
Jarrod Johnson 50c150f4b4 Fixup issues in esxi deployment
When installer boots, the autonic behavior it tries is discarded
by default. Explicitly preserve the autonic behavior into
the install phase and the installed system.
2021-02-11 11:06:02 -05:00
Jarrod Johnson a46810ca29 Merge branch '3.1' 2021-02-08 09:39:55 -05:00
Jarrod Johnson 76cdd958ec Add AlmaLinux recognition
This imports ALmaLinux
2021-02-08 09:24:46 -05:00
Jarrod Johnson e72292f989 Update status at end of esxi install 2021-02-05 14:03:41 -05:00
Jarrod Johnson 8cf264602d Update status at end of esxi install 2021-02-05 14:02:28 -05:00
Jarrod Johnson a2f5b11185 Add Usb to nodesetboot
Particularly for redfish, this is a more specific target
2021-02-01 08:43:47 -05:00
Jarrod Johnson ed4db91383 Add Usb to nodesetboot
Particularly for redfish, this is a more specific target
2021-02-01 08:42:35 -05:00
Jarrod Johnson a9e39eab96 Fix path mistake in mofed.post script
mofed.post had incorrect path to mofed.tgz after
fetch. Correct the path mistake.
2021-01-28 16:50:50 -05:00
Jarrod Johnson 209430ed35 Fix path mistake in mofed.post script
mofed.post had incorrect path to mofed.tgz after
fetch. Correct the path mistake.
2021-01-28 16:45:39 -05:00
Jarrod Johnson d29d2bf683 Implement workaround for install over infiniband
8.3 implemented networkmanager to manage the install time
networking, but didn't correctly generate infiniband
network manager configuration.

Workaround by checking for infiniband install, and
then checking if the configuration is wrong, and
adding an infiniband section if missing.
2021-01-28 13:49:10 -05:00
Jarrod Johnson 3d2b579f1a Implement workaround for install over infiniband
8.3 implemented networkmanager to manage the install time
networking, but didn't correctly generate infiniband
network manager configuration.

Workaround by checking for infiniband install, and
then checking if the configuration is wrong, and
adding an infiniband section if missing.
2021-01-28 13:47:28 -05:00
Jarrod Johnson c99ab2ac73 Improve nodestorage local documentation.
Include clearer information about the `diskset` facility
in particular in usage and man page.
2021-01-27 13:02:57 -05:00
Jarrod Johnson e4591eaf57 Update nodeconfig man page with more information 2021-01-27 09:04:24 -05:00
Jarrod Johnson 695bb3757b Merge pull request #111 from brianfinley/osdeploy-list
Add 'list' option to osdeploy command
2021-01-27 08:55:17 -05:00
Jarrod Johnson 4e2767ce9d Update osdeploy 2021-01-27 08:51:03 -05:00
Brian Elliott Finley 8cdc9c9479 Add 'list' option to osdeploy command 2021-01-26 16:17:56 -06:00
Jarrod Johnson 6458eac93b Tolerate multiple forms of 'stringy'
The fromstring needs to accept either, so
amend it to do so.
2021-01-22 12:43:15 -05:00
Jarrod Johnson 8df15b3a54 Tolerate different SR635/SR655 response
Some SR635/SR655 behave differently.  Adjust by adapting as possible,
but never making an assumption about data being present.
2021-01-22 10:30:19 -05:00
Jarrod Johnson b4f9bb78ae Address irrelavent call to yaml.load 2021-01-21 17:48:56 -05:00
Jarrod Johnson c8e1efecdb Mitigate XML parse risks
The intended xml never has !entity tags and
thus we can reject any such XML outright and
avoid billion laughs and similar abuses.
2021-01-21 17:46:21 -05:00
Jarrod Johnson 22dc852277 Remove now redundent errors
printerror now searches for deeper errors,
no longer need to call it as much.
2021-01-21 16:38:35 -05:00
Jarrod Johnson 784ac5ecba Fix gitignore to track ronn files 2021-01-21 11:52:22 -05:00
Jarrod Johnson 66c9777b3c Add man page for stats command 2021-01-21 11:36:08 -05:00
Jarrod Johnson dba4c40f0e Fix collective join with empty config
Collective join without a key set would fail on
first try.
2021-01-21 11:19:13 -05:00
Jarrod Johnson 6997508a0c Fallback to forced utf8 on unicodeerror
If LC_ALL is set to C, then unicode can be a problem.
2021-01-21 08:41:35 -05:00
Jarrod Johnson 203253e05f Fix mispelling of exception name in confetty 2021-01-20 11:19:24 -05:00
Jarrod Johnson edc4804146 Discover larger SMMv2 based chassis
SMMv2 can support 12 servers, so increase the limit.
2021-01-20 09:08:56 -05:00
Jarrod Johnson 7cfdf11bf2 Fix collective name return
It inadvertently would return None when
rereading from file.
2021-01-19 17:34:28 -05:00
Jarrod Johnson a3bd21d605 Cleanup confetty/nodeconsole exit
Unexpected exit from nodeconsole/confetty is now
handled better for feedback and terminal usefulness
2021-01-19 16:24:36 -05:00
Jarrod Johnson 6d8474a16a Fix node errors being swalled by print_error
Node specific errors were not processed, correct
that oversight.
2021-01-19 12:16:22 -05:00
Jarrod Johnson 5736c41daa Add more data to discovery
Some applications may
want to source more information
from systems to help
identify things, particularly with
partially preconfigured systems.
2021-01-15 10:34:43 -05:00
Jarrod Johnson a5c4b64c60 Have Genesis better work with BMC install
In a BMC install, the certificate may fail and we may
have ability to port forward 3389 but not 22.

Support normal and enhanced certificate behavior
when possible, but degrade to cert-less ssh and
also port 3389
2021-01-15 08:25:12 -05:00
Jarrod Johnson f7a940227d Move sixel under opportunistic import
Do not require sixel
to run stats.
2021-01-14 15:49:30 -05:00
Jarrod Johnson ebf50359f0 Fix file descriptor leak by web forwarder
It failed to close the two sockets when a socket was
done.
2021-01-13 16:50:17 -05:00
Jarrod Johnson 5160023cc4 Update nodedeploy error message
We can't tell which argument was omitted,
so warn that both are needed.
2021-01-13 16:43:41 -05:00
Jarrod Johnson a738b761b4 Fix XCC discovery with Whitley changes 2021-01-12 11:47:02 -05:00
Jarrod Johnson d27ef81e32 Fix PXE handling of candidate managers 2021-01-11 13:33:26 -05:00
Jarrod Johnson f5344fabaa Correct typo in new attribute text 2021-01-11 13:13:03 -05:00
Jarrod Johnson fa1c2f5c1e Only offer deployment if a candidate manager
If candidate managers are defined, and this node is not in
that set, ignore PXE and SSDP requests to opt out of
deployment.
2021-01-08 16:32:41 -05:00
Jarrod Johnson 25c3f40559 Cache manager name
Since the get_myname() may be called much much more
frequently now that it is in the deployment flow,
have it cache results to save a lot of disk I/O
2021-01-08 16:30:51 -05:00
Jarrod Johnson 5812a0eef6 Have a rebalance shortly after becoming leader
This will handle startup and takeover when the current leader dies.
2021-01-08 16:15:11 -05:00
Jarrod Johnson 086ce9823b First phase of collective manager candidate implementation
This implements recovery on loss of collective member to
the least loaded candidates for the node.
2021-01-08 16:00:24 -05:00
Jarrod Johnson 2d6bdffebe Finalize the ssh.trustnodes facility
This is the confluent approach to handling the same
problem that xCAT SSH Zones do.
2021-01-08 14:05:37 -05:00
Jarrod Johnson efdbeeae0d Fix SNMPv2 on non-cisco switches
The cisco change was causing problems elsewhere.
2021-01-08 09:16:40 -05:00
Jarrod Johnson a2a1142f18 Draft implementation of ssh trust segmentation
Have equiv optionally be restricted to a subset of nodes
so that node to node ssh may be enabled within subsets
without enabling across the board.

This is akin to 'zones' in xCAT, albeit a bit more flexible
and covering both users and administrative access.
2021-01-06 11:52:43 -05:00
Jarrod Johnson 8c89deaa95 Further defer use of deploycfg as normal
In ESXi flow, it is highly likely that IPv4 cannot
be ready yet, delay a bit more.
2021-01-05 15:32:46 -05:00
Jarrod Johnson 1ec5231ebe Do not reply to mismatched IP in confluent search
If an OS queries for confluent, but will not have a viable address,
avoid replying to let more usable network paths prevail.

For example, one OS was coming up with 169.254 with no dhcp server,
and being told it could do well to talk to 172.29, which obviously
would not work.
2021-01-05 15:17:23 -05:00
Jarrod Johnson 674e2887f3 Fix ESXi deployment without working DHCP
apiclient was instructing itself to use IPv4 prematurely. Change
the dcuiweasel hook to delay that change until after all data has been
fetched.
2021-01-05 11:55:30 -05:00
Jarrod Johnson 4768bc257a Handle API change for setting user name
The web api now requires the word Administrator instead of
the number 4.
2020-12-15 16:44:55 -05:00
Jarrod Johnson 7610f9b963 Clean out .gitignore files
Don't leave them laying around installed package.
2020-12-15 15:53:41 -05:00
Jarrod Johnson b29e7bc94a Add new requirement in newer ESXi versions
New ESXi versions use a new efi executable during
boot.
2020-12-15 14:39:15 -05:00
Jarrod Johnson 04d63a269d Fix detection of CentOS 8.3
They changed their package name to be consistent with
their focal shift.
2020-12-15 12:59:48 -05:00
Jarrod Johnson e1bf22911b Try to have example directories obvious
git can't do empty directories, try a .gitignore
to have directories appear in the profiles
2020-12-15 12:52:57 -05:00
Jarrod Johnson d6642f1bde Fix omitted directory for firstboot
firstboot being in /opt requires a mkdir
2020-12-15 12:51:16 -05:00
Jarrod Johnson 36f027ac71 Implement support for Cisco switches
Cisco bridge mib requires to be instanced by vlan.
Detect through proprietary mibs and use it to
guide bridge mib walking.
2020-12-15 10:46:14 -05:00
Jarrod Johnson c025f4d2fc Fix firstboot.sh with selinux enabled 2020-12-14 15:06:04 -05:00
Jarrod Johnson 1238babe60 Notate future development requirements 2020-12-14 13:09:02 -05:00
Jarrod Johnson f9a82bde00 Fix arch detection in CentOS stream 2020-12-14 10:42:52 -05:00
Jarrod Johnson 48c868e935 Detect architecture for CentOS stream
CentOS stream changed the release rpm to be noarch.
2020-12-14 10:23:05 -05:00
Jarrod Johnson caf9115439 Fix CentOS stream support 2020-12-14 10:04:31 -05:00
Jarrod Johnson 8b11acbcf2 Recognize CentOS Stream
Allow installation of CentOS stream as a profile.
2020-12-14 09:47:56 -05:00
Jarrod Johnson db0f91c160 Comment to show how to opt out of UEK
For users that use the distribution with UEK, but do
not want UEK at all.
2020-12-14 08:33:58 -05:00
Jarrod Johnson cbb46dec3a Allow firstboot to run with root access
Being it /etc is unusual, and restorecon treats it
as such. Manually use chcon to explicitly allow
it in /etc/
2020-12-12 14:57:02 -05:00
Jarrod Johnson 0afa4c217c Add directory based post/firstboot capability
el8 profiles gain post.d/firstboot.d capability
2020-12-11 16:29:12 -05:00
Jarrod Johnson 47f04c8462 Provide guidance if the user tries to use defaults
Default username/password is no longer a
viable long term credentiol for XCC, have user
clearly be told to change and that they
shouldn't have to worry about the default
user and password.
2020-12-11 10:37:00 -05:00
Jarrod Johnson 5b0e23b8d4 Provide better feedback on XCC security lockouts
Rather than 'NoneType' error about grab_json_response,
provide actual recognizable feedback
2020-12-11 10:21:21 -05:00
Jarrod Johnson 14d9284cc5 Fix older Oracle Linux 7
Older OL has another release file thtat
was tripping the fingerprinting code.
2020-12-10 13:48:51 -05:00
Jarrod Johnson cd251fa5d6 Add support for OL7 and older other EL7 flavors
Older EL7 didn't have platform-python in installer,
change to fallback to old /usr/bin/python if
needed.
2020-12-10 10:54:30 -05:00
Jarrod Johnson 8d47395e53 Add fetch of '<script>.d' scripts
This can be used by firstboot/post scripts to
get modularized scripts.
2020-12-09 16:46:58 -05:00
Jarrod Johnson d19b5e4376 Have apiclient preserve server response verbatim
Do not add extra \n to output that server would
have already terminated.
2020-12-09 16:37:12 -05:00
Jarrod Johnson 7a9276300a Have apiclient reach out to deploycfg server
If we already have deploycfg, use that to indicate the
target server rather than copernicus data.
2020-12-09 16:20:02 -05:00
Jarrod Johnson 87ef68e26a Add 'memory' console.logging
If console.logging is not desired, but reconstituting the screen is,
provide 'memory' as a method to do that.

On slow disks this can significantly improve performance.
2020-12-09 13:47:46 -05:00
Jarrod Johnson 55b97793fd Lower concurrency limit of ipmi actions
IPMI actions can be a bit sensitive. Introduce some serialization
for improved robustness in liue of better parallelism.

The ideal would be to have 128 per core/process in the end, but for now,
a pool for 128 concurrent operations in flight at a time.
2020-12-08 18:23:13 -05:00
Jarrod Johnson fa823510b6 Pretty-ify Oracle Linux name in profile.yaml
Give it a nicer looking automatic label when
Oracle Linux is detected.
2020-12-07 15:09:30 -05:00
Jarrod Johnson 99609aa669 Add Oracle Linux signature check to osimage
Oracle Linux was being misidenntified as RHEL,
fix so that oracle linux is treated differently.
2020-12-07 15:08:28 -05:00
Jarrod Johnson 906011a80b Support 8.3 install
In 8.3, they refactored how network configuration is
managed early in install. Fix by detecting the presence
of the nm-lib and calling it's function again to
re-read the new cmdline.
2020-12-07 12:35:33 -05:00
Jarrod Johnson ff7f5daac6 Parallelize and timeout ssdp queries
Badly behaving 'desc.tmpl' servers exist in the world,
do not get tripped up or slowed down too much by
having aggressive timeout and making it parallel.
2020-12-04 17:14:35 -05:00
Jarrod Johnson 2d58741f15 Fix PXE/HTTP boot UUID and Mac case sensitivity
Like the SSDP code, PXE too had case sensitivity issues
2020-12-04 12:42:14 -05:00
Jarrod Johnson 57b74d59af Force uuid to lowercase in uuid mapping
Most of the codebase presumes lower case uuid, but
the uuid mapping was preserving whatever case the
attribute was in, making it case sensitive.

In the normal discovery process, this was filled in
as lower case. However if id.uuid is filled in manually
with uppercase, this broke the node lookup by uuid.
2020-12-04 07:41:40 -05:00
Jarrod Johnson 191cd8192a Add example installedargs to new ubuntu profiles 2020-12-03 10:55:39 -05:00
Jarrod Johnson 475eaca56b Add installedargs support to ubuntu profiles 2020-12-03 10:44:14 -05:00
Jarrod Johnson f33ddf3ab9 Move fetch of profile.yaml
Need to use thte copernicus network setup,
as the 'final' setup will depend on subsequent autoyast
activity.

Therefore, move it up to when mgr is probably IPv6
2020-12-02 09:12:14 -05:00
Jarrod Johnson 3422f3cdc5 Add and comment use of the installedargs in SUSE
With the support in addons, hook it in the
profile.
2020-12-02 09:05:36 -05:00
Jarrod Johnson 4c74581f0c Try to add installedargs to suse profiles 2020-12-01 16:57:26 -05:00
Jarrod Johnson 674d32e9e5 Correct mistake in previous pre scripts 2020-12-01 12:55:41 -05:00
Jarrod Johnson 666059c8bf Ignore more extraneous material 2020-12-01 12:55:26 -05:00
Jarrod Johnson 0137f99636 Add installedargs to rhel family
Provide a profile.yaml line that can be used to add arguments to
installed kernel as well as install kernel.
2020-12-01 10:53:26 -05:00
Jarrod Johnson 0c66021d3e Add tagged vlan support to el8 deployment 2020-11-30 08:16:04 -05:00
Jarrod Johnson 014727d355 Label boot.img with profile name
This allows for easier
search should an image want it
2020-11-09 15:45:44 -05:00
Jarrod Johnson dc262c366c Fix false positive in affluent detection
Make sure we don't receive
a redirect or other
when asking for mac tables.
2020-11-09 11:23:54 -05:00
Jarrod Johnson 8f99d87fda Reduce calls to update_neigh
On a mostly stable system, update_neigh will
continue to drive a significant portion of
background activity. Mitigate to only call if
circumstances suggest a need, or once every
30 seconds.
2020-11-09 09:00:57 -05:00
Jarrod Johnson edaaa2393d Hook up apiclient to TPM2 persistence, when available 2020-11-06 16:38:05 -05:00
Jarrod Johnson 1ecef6f251 Be a bit paranoid about string boundary 2020-11-06 13:57:35 -05:00
Jarrod Johnson 31c2c5f6f7 Fix errors in the TPM2 support 2020-11-06 13:38:37 -05:00
Jarrod Johnson c8747ac369 Merge branch '3.0' 2020-11-06 12:51:15 -05:00
Jarrod Johnson f7e7d05729 Add TPM2 support to node api key handling
This is an optional capability that image payloads may use
to use the TPM2 to protect an apikey as an alternative to
arming a weak authentication invocation
2020-11-06 10:00:36 -05:00
Jarrod Johnson 40c74699f0 Check for some issues in a manual assign request
One is to provide clear feedback when a nodename is requested
that was not previously defined, to make it more clear that
it is a requirement and/or guard against going too far while
the config function will be missing data it needs to complete
onboarding.

Another is to break if the request is trying to assign a node
to a different definition when it already exists under a different
name.
2020-11-03 09:32:55 -05:00
Jarrod Johnson 3903cda789 Do not clear the entire nodes lookup on remap
remap may only amend part of the map,
do not cause that to clear out the good data.
2020-11-03 09:32:48 -05:00
Jarrod Johnson 72049657d7 Fix issues with leftover ssh sessions
Upon connection loss, even though confluent internally
decides it is done with it, it fails to close the session.

Catch a number of these scenarios and ensure the connection closes.
2020-11-02 13:20:55 -05:00
Jarrod Johnson 71cc0adadd Bump genesis to build more packages
Also notate src.rpm retrieval procedure
2020-10-30 12:34:42 -04:00
Jarrod Johnson b4e6e7caa8 Check for some issues in a manual assign request
One is to provide clear feedback when a nodename is requested
that was not previously defined, to make it more clear that
it is a requirement and/or guard against going too far while
the config function will be missing data it needs to complete
onboarding.

Another is to break if the request is trying to assign a node
to a different definition when it already exists under a different
name.
2020-10-30 08:18:27 -04:00
Jarrod Johnson 10ac1756f1 Do not clear the entire nodes lookup on remap
remap may only amend part of the map,
do not cause that to clear out the good data.
2020-10-29 15:49:31 -04:00
Jarrod Johnson 95659db00a Stop trying to use generic cookie parsing
Trying to do so while guarding against errors and sanitizing input was more code and slower
than targeting the one possible cookie we might care about.

So the code is simpler and
the performance is better, and the effect of stray cookies are mitigated.
2020-10-29 11:36:26 -04:00
Jarrod Johnson bddbc37e8e Fix incorrect length of random strings 2020-10-29 10:57:49 -04:00
Jarrod Johnson 7a2b295945 Change default label for ESXi to be more clear 2020-10-26 12:35:37 -04:00
Jarrod Johnson af8429ebf9 Fix esxi updateboot
Updateboot was confounded by a normal of 'file exists'
problems.
2020-10-26 12:22:56 -04:00
Jarrod Johnson 3ac6677d2d Sanitize cookies
If an invalid cookie from another site breaks the cookie jar,
then sanitize it.

https://bugs.python.org/issue31456

Performance enhancement through setting a header in javascript in
lieu of cookie parsing seems a wise move for the future.
2020-10-24 11:10:52 -04:00
Jarrod Johnson 8b5744b7eb Drop attempts to restore cursor key mode
It would corrupt F1 setup menu. This may cause problems for
ESXi TUI, but F1 in UEFI is more commonly on serial
2020-10-23 15:32:16 -04:00
Jarrod Johnson 7fcfc05205 Fix syntax problem in processing common nameserver 2020-10-22 12:48:01 -04:00
Jarrod Johnson 4b42bbda7e Fix spelling error
firmware is now spelled correctly
2020-10-22 12:11:10 -04:00
Jarrod Johnson ed41d93de5 Add remote authentication configuration
While our security guidelines preclude allowing host to know the password,
it is considered acceptable to do the out-of-band authentication configuration.

Have configbmc request a unicast remote configuration. This should handle authentication
as well as ensuring ongoing consistency between out of band and in-band configuration
methods.
2020-10-20 15:51:46 -04:00
Jarrod Johnson d36712d014 Refactor scripting to custom for suse
This makes it marginally easier to modify safely.

Further, it moves progress to after custom scripting
2020-10-16 11:34:43 -04:00
Jarrod Johnson 21cc9d66db Correct execution of post.sh
post.sh was not retrieved correctly, workaround
by prefecting it to the expected place rather than
letting yast do it.
2020-10-16 11:07:35 -04:00
Jarrod Johnson 4508cfa364 Update suse15 message with fixed autocons 2020-10-16 09:04:14 -04:00
Jarrod Johnson 05e84f2a7c Fix double-console out in genesis
With fixed autocons,
genesis was double outputting to serial console.

Let rungenesis pick
the console instead.
2020-10-14 16:49:10 -04:00
Jarrod Johnson 184727408a Have configbmc wait for settings to complete
There has been some confusion when configbmc changes
are deferred until later.

Reduce confusion by waiting for the settings to take effect,
but avoiding checking each parameter
to preserve most of the speedup.
2020-10-13 12:24:04 -04:00
Jarrod Johnson e7fbbe2737 Fix issues with leftover ssh sessions
Upon connection loss, even though confluent internally
decides it is done with it, it fails to close the session.

Catch a number of these scenarios and ensure the connection closes.
2020-10-12 09:47:24 -04:00
Jarrod Johnson 9a0c4ce4ce Fix function handling of subdirs of scripts 2020-10-09 14:07:58 -04:00
Jarrod Johnson 247a7f5d8a Fix problem when domain was not set
domain was checked even if domain not defined,
make sure domain is defined before trying
to use it.
2020-10-08 13:38:43 -04:00
Jarrod Johnson 745b82a603 Add examples for MOFED in EL7 distros 2020-10-08 13:37:19 -04:00
Jarrod Johnson 504bee2d2a Fix problem when domain was not set
domain was checked even if domain not defined,
make sure domain is defined before trying
to use it.
2020-10-08 10:39:29 -04:00
Jarrod Johnson 8285f2a3de Incorporate convenience for Mellanox OFED install 2020-10-07 15:27:06 -04:00
Jarrod Johnson cfa97f7a9a Cover Mellanox ethernet adapters for mofed
Some elect to use MOFED with ethernet as well
2020-10-07 14:27:11 -04:00
Jarrod Johnson cbf42469c3 Add a sample script to install mofed
This is an example install script to use in post.custom for mofed
2020-10-07 14:12:31 -04:00
Jarrod Johnson 61f793040e Avoid setting uuid and mac in pxe if already set
Notably the uuid change can end up recursing. Fix the behavior that will cause never ending
loops, which in some IO situations
can end in recursion limits.
2020-10-06 17:14:48 -04:00
Jarrod Johnson 8dd66211b7 Avoid setting uuid and mac in pxe if already set
Notably the uuid change can end up recursing. Fix the behavior that will cause never ending
loops, which in some IO situations
can end in recursion limits.
2020-10-06 17:14:20 -04:00
Jarrod Johnson 5a24619560 Recognize a different m.2 name 2020-10-06 10:37:20 -04:00
Jarrod Johnson d466595828 Recognize a different m.2 name 2020-10-06 09:36:12 -04:00
Jarrod Johnson b0b965db98 Use newer functions in genesis and el7 2020-10-05 16:57:46 -04:00
Jarrod Johnson 9e73979b5b Enhance the EL script enhancements
Make them easier to use ad-hoc and add some capability
2020-10-05 16:55:37 -04:00
Jarrod Johnson f4395abade Deprecate attempts to use default password with SMM
This is removed in some level of the product
2020-10-05 16:54:58 -04:00
Jarrod Johnson a194e2293e Fix syntax error on discovery core 2020-10-02 15:35:14 -04:00
Jarrod Johnson d27577d2b7 Fix missing close parenthesis 2020-10-02 14:57:59 -04:00
Jarrod Johnson 1113c2a849 Improve duplicate switch attribute errors 2020-10-02 13:36:45 -04:00
Jarrod Johnson 587197e934 Refresh chained SMM discovery for SMMv2
Additionally, amend overall
discovery to force chain validation
rather than theoretically
accepting a low mac count match.
2020-10-02 11:45:50 -04:00
Jarrod Johnson ef901f64af Merge branch '3.0' 2020-09-30 10:04:21 -04:00
Jarrod Johnson 2ba05fb7b1 Enable IPMI on SMMv2 2020-09-29 11:21:53 -04:00
Jarrod Johnson e186eb7319 Fix problem with autocons
autocons needed to open the devnode earlier
to have the correct name. Fixes TSM autocons
behavior
2020-09-24 08:31:20 -04:00
Jarrod Johnson a263851614 Fix problem with autocons
autocons needed to open the devnode earlier
to have the correct name. Fixes TSM autocons
behavior
2020-09-24 08:26:37 -04:00
Jarrod Johnson 4b7d042f2d Have a clause for redfish not yet ready
We need redfish, but redfish is slow to boot on TSM..
2020-09-23 08:24:18 -04:00
Jarrod Johnson 99f533b4cb Implement redfish resilient discovery for TSM
TSM redfish stack has an issue where it refuses to recognize any
non-redfish password change. Use redfish to change.

Regretably, it takes about 10 seconds for that change to propogate
to the practical API, so we have a discovery delay now.
2020-09-23 08:24:07 -04:00
Jarrod Johnson eeb3a3fa65 Have a clause for redfish not yet ready
We need redfish, but redfish is slow to boot on TSM..
2020-09-22 14:33:58 -04:00
Jarrod Johnson 56f8ca0982 Implement redfish resilient discovery for TSM
TSM redfish stack has an issue where it refuses to recognize any
non-redfish password change. Use redfish to change.

Regretably, it takes about 10 seconds for that change to propogate
to the practical API, so we have a discovery delay now.
2020-09-22 14:31:28 -04:00
Jarrod Johnson 8f94149627 Have batch files optionally not need quotes 2020-09-22 12:25:25 -04:00
Jarrod Johnson ed842fcc1a Add mods to adapt an xcat stateless image to a confluennt payload 2020-09-17 14:23:37 -04:00
Jarrod Johnson 9828ea5898 Fix chained smm discovery on cumulus 2020-09-14 11:02:00 -04:00
Jarrod Johnson 7bdf7afb80 Fix another mistake in chained SMM discovery 2020-09-14 08:04:41 -04:00
Jarrod Johnson cd20a69eb6 Fix typo in function name in chained smm discovery 2020-09-14 08:03:18 -04:00
Jarrod Johnson c3d14977f2 Update attributes documentation 2020-09-11 09:56:35 -04:00
Jarrod Johnson 31d19e9398 Fix deployment.useinsecureprotocols
If explicitly set to 'never', it would behave as 'firmware'.
2020-09-11 09:44:09 -04:00
Jarrod Johnson ea533e64c6 Fix more issues found in configbmc 2020-09-09 13:01:01 -04:00
Jarrod Johnson 4fe84ca6dc Fix various issues in 3.0.0 release
If the kernel is new enough to do SKU, but the firmware doesn't have it,
fallback to model.

Fix outright mistakes in the config_port_tsm code

Up mac count from 2 to 3. If querying cumulus switches using SNMP
the switch will add its own mac to the list bringing the
total for a shared port to 3.
2020-09-09 10:58:37 -04:00
Jarrod Johnson 6f55a4ffe0 Python 3.7 fix for ipv6 lla handling
Python 3.7 changes behavior of recfrom (because.. why not apparently...)
Use getnameinfo to normalize the printable version.
2020-09-02 12:12:10 -04:00
Jarrod Johnson 5e01d9c97b Handle unresolvable switches gracecfully
Rather than a trace log,
keep it to only the event log.
2020-09-02 11:50:50 -04:00
Jarrod Johnson 46396247bb Fix remote passphrase authentication
For python 3 platforms, the
db hosted hash
needed the str changed
to bytes explictly.
2020-09-02 08:54:29 -04:00
Jarrod Johnson b9fffad1f8 Fix post.sh comment documentation 2020-08-28 17:08:36 -04:00
Jarrod Johnson 37f60ea647 fix wrap on osdeploy man page 2020-08-28 16:38:28 -04:00
Jarrod Johnson a72ff7a0b0 Add osdeploy man page. 2020-08-28 12:52:42 -04:00
Jarrod Johnson c955b714a5 Add a nodedeploy man page 2020-08-28 12:48:05 -04:00
Jarrod Johnson a737ee7622 Correct incorrect quotes 2020-08-28 10:45:54 -04:00
Jarrod Johnson 971187b006 Handle 'unknown' health
Sometimes health may be 'unknown' and warrants more investigation.
2020-08-28 10:21:02 -04:00
Jarrod Johnson 616d0bd23e Amend language of attribute help 2020-08-28 09:49:25 -04:00
Jarrod Johnson b8ffdfbf74 Add more text to deployment.encryptboot 2020-08-28 09:45:55 -04:00
Jarrod Johnson f6c144ae16 Amend to work more cleanly installed after xCAT
xCAT intervenes on tftp a lot, so we need to stay away
and clearly indicate that we are.
2020-08-28 09:43:21 -04:00
Jarrod Johnson 6ab57b8669 Add a friendlier message if tftp service is running
The socket activation may fail due to tftp already running.
2020-08-28 09:38:10 -04:00
Jarrod Johnson ffe0144b2c Amend osdeploy missing tftp warning 2020-08-28 09:19:38 -04:00
Jarrod Johnson 2aa2402b73 Change to emprint from raise
The exception stack trace is offputting.
2020-08-28 07:18:07 -04:00
Jarrod Johnson 49eccaf68b Fix behavior on existing directory 2020-08-27 17:06:10 -04:00
Jarrod Johnson e8eaddf375 Fix for HTTP API browser
Python 3 had data coming in as bytes.
2020-08-27 13:11:21 -04:00
Jarrod Johnson bf1019c497 Have -p by itself not generate new site cpio
It is not needed for just -p
2020-08-27 11:43:55 -04:00
Jarrod Johnson aaff8d281c Add warning if someone tries to -n without a profile name. 2020-08-26 16:10:59 -04:00
Jarrod Johnson 24a3cbc133 Fix non-collective quorum check 2020-08-26 13:54:18 -04:00
Jarrod Johnson 46fc4d626d Fix quorum check in configmanager.py 2020-08-26 13:35:19 -04:00
Jarrod Johnson b12a5f6ec6 Fix osdeploy local on older system
Also add short name to principals if user has used FQDN as their name.
2020-08-26 13:04:12 -04:00
Jarrod Johnson c3403f339e Per request, change -p
The request was for -p to modify -n behavior rather than replace it. New
syntax always needs -n to
do deploymennt, with -p opting out of BMC interaction.
2020-08-26 12:04:00 -04:00
Jarrod Johnson 463584f301 Warn that -n and -p are exclusive 2020-08-26 11:05:27 -04:00
Jarrod Johnson 4348d9160b Provide ability for config file to specify cipher list
The default set of TLS 1.3 and TLS1.2 restricted ciphers are
generally considered strong today, but for future or special
circumstances, provide ability to override the defaults.
2020-08-26 09:43:55 -04:00
Jarrod Johnson 53f317fc09 Enhance nodedeploy status text 2020-08-25 16:01:50 -04:00
Jarrod Johnson 4b75f958ff Add function of nodedeploy to query current profile. 2020-08-25 15:47:44 -04:00
Jarrod Johnson 264b0be853 Use correct argument parsing 2020-08-25 14:29:23 -04:00
Jarrod Johnson ff0955d6be Final fix for nodedeploy without profile 2020-08-25 14:28:14 -04:00
Jarrod Johnson 14767e2909 Fix nodedeploy -c 2020-08-25 14:05:43 -04:00
Jarrod Johnson f5f7643734 Change -c to a store_true 2020-08-25 09:58:58 -04:00
Jarrod Johnson 3256899acf Add a nodedeploy clear
This will allow a pendingprofile to be cleared.
2020-08-24 16:05:58 -04:00
Jarrod Johnson e52556affb Fix certificate watch hang
If no certificate present, then once a day confluent could hang. Fix by
doing a non-blocking
read on the watcher.
2020-08-24 14:00:47 -04:00
Jarrod Johnson 59e739a143 Further tweaks to postscript library functions 2020-08-21 17:42:02 -04:00
Jarrod Johnson 2e2a34b470 Reduce curl verbosity
Hard to follow with so much extra output
2020-08-21 17:07:02 -04:00
Jarrod Johnson b8aa54fb8e Make output consistent for shell/python remote exec 2020-08-21 17:03:12 -04:00
Jarrod Johnson 67920980c8 Fix syntax error in functions library for pre/post/firstboot scripts 2020-08-21 16:39:37 -04:00
Jarrod Johnson d6158c9061 Add support for a future SMM to discovery 2020-08-21 16:09:05 -04:00
Jarrod Johnson e9dabdf51b Add clearer delineation between scripts in output 2020-08-21 10:35:28 -04:00
Jarrod Johnson 18f4c76730 Fix end code for run_remote
Output was missing due to shift. Save cmdline before
shifting and use it on way out.
2020-08-21 10:33:56 -04:00
Jarrod Johnson 13636097f5 Add more verbosity to remote functions 2020-08-20 16:20:02 -04:00
Jarrod Johnson 814857a706 Update client side aliases to match configmanager 2020-08-20 10:53:21 -04:00
Jarrod Johnson 5b0389000e Fix handling of password through TLS socket 2020-08-20 08:28:06 -04:00
Jarrod Johnson 77adcde52f Change version of confluent genesis. 2020-08-19 13:19:27 -04:00
Jarrod Johnson 22171828a7 Add nvme to genesis 2020-08-19 13:08:10 -04:00
Jarrod Johnson b847aacfc0 Add more documentation to deployment.apiarmed
Since nodedeploy is expected to be used to make
it less annoying, mention the expectation of nodedeploy
in its documentation.
2020-08-19 10:30:23 -04:00
Jarrod Johnson 1eb4b0f682 Copy all of scripts for genesis init 2020-08-18 17:25:15 -04:00
Jarrod Johnson 6c2cde7924 Give up on linking configbmc, just copy it for now 2020-08-18 15:53:04 -04:00
Jarrod Johnson 46ca9115a0 Fix configbmc in genesis 2020-08-18 15:43:23 -04:00
Jarrod Johnson 97b8beee76 Expound upon crypted.rootpassword documentation 2020-08-18 15:01:59 -04:00
Jarrod Johnson d956893104 Have EL8 ifup wait for tentative to go away 2020-08-17 15:06:38 -04:00
Jarrod Johnson 5bdd59bc67 Add configbmc to el8 and genesis script examples 2020-08-17 14:23:21 -04:00
Jarrod Johnson 584f6dc458 Handle no-argument invocation
apiclient is used to process confluent.info
2020-08-17 13:40:00 -04:00
Jarrod Johnson 53363905dd Add ability to call apiclient to configbmc
Next to put it into various profiles
and genesis.
2020-08-17 12:33:13 -04:00
Jarrod Johnson 1e445ad526 Have configbmc actually consume bmcconfig data
/usr/libexec/platform-python /opt/confluent/bin/apiclient /confluent-api/self/bmcconfig -j > /tmp/whatever.json
/usr/libexec/platform-python configbmc.py -i /tmp/whatever.json
2020-08-14 17:42:49 -04:00
Jarrod Johnson a126270570 Fix scope of hm attributes in bmcconfig 2020-08-14 16:05:46 -04:00
Jarrod Johnson dd4d7ded74 Fix syntax error in attributes.py 2020-08-14 15:48:52 -04:00
Jarrod Johnson 997b43045a Make preparations for a configbmc for inband config 2020-08-14 15:29:55 -04:00
Jarrod Johnson 1e59a710e7 Add json to genesis python 2020-08-14 14:55:22 -04:00
Jarrod Johnson e6b134419b Add argparse to genesis 2020-08-14 10:09:02 -04:00
Jarrod Johnson ece6903a04 Add fcntl to genesis python 2020-08-14 08:26:00 -04:00
Jarrod Johnson ec42a2aad8 Fix confluentdbrestore in non-root environments 2020-08-14 07:16:04 -04:00
Jarrod Johnson aab27ccc4b Fix typo in osdeploy code 2020-08-13 15:29:45 -04:00
Jarrod Johnson 5e33e45dbd Notes on a strategy to retrieve the appropriate src.rpms 2020-08-13 07:55:28 -04:00
Jarrod Johnson d0b0306eb2 Add floppy to man page synopsis for nodesetboot 2020-08-12 11:15:34 -04:00
Jarrod Johnson 64945662ac Add local CA to curl trust in genesis 2020-08-12 09:43:29 -04:00
Jarrod Johnson c02a482601 Add serial hint to console=ttyS users 2020-08-12 09:35:24 -04:00
Jarrod Johnson 823c9656ac Fix target path of osdeploy initialize -g 2020-08-12 09:26:04 -04:00
Jarrod Johnson d4b21ed5b9 Be sure to updateboot on g
If not generating a new site
archive, generate a new boot.img anyway for genesis.
2020-08-12 09:12:29 -04:00
Jarrod Johnson 6bbbf92613 Add genesis initialize to osdeploy 2020-08-12 08:59:25 -04:00
Jarrod Johnson 866cd85bd0 Add a profile description to genesis 2020-08-12 07:51:38 -04:00
Jarrod Johnson d88e33677e Fix typo in confluent in rungenesis 2020-08-11 18:40:57 -04:00
Jarrod Johnson 43ce1b17a7 Rework genesis with more output and an onboot.sh 2020-08-11 18:11:48 -04:00
Jarrod Johnson 1ceb588ad4 Just wait for ssh-keygen, just in case 2020-08-11 17:09:31 -04:00
Jarrod Johnson e2ff9163bc Remove the wait for ssh-keygen
By this point, it should be done and we accidentally wait on wrong
thing.
2020-08-11 17:08:00 -04:00
Jarrod Johnson 060d8093e6 Fix sshd_config generation 2020-08-11 16:51:42 -04:00
Jarrod Johnson 679f2cbf1c Extend timeout waiting for 'right' device
Some devices come up very slowly.
2020-08-11 16:29:30 -04:00
Jarrod Johnson 4cd7714099 Modify apiclient to rewrite ifidx if stale 2020-08-11 15:41:44 -04:00
Jarrod Johnson 32fe6b2fff Fix 'matchesnodename' behavior if ip manually specified 2020-08-11 15:34:55 -04:00
Jarrod Johnson bae4e448d9 Load umad driver 2020-08-11 15:19:09 -04:00
Jarrod Johnson 9d55d413fd Do not put fabric managers into genesis
It's getting too crowded...
2020-08-11 15:03:51 -04:00
Jarrod Johnson 3dd7611dc2 Try to enable high speed fabrics during genesis start 2020-08-11 15:00:41 -04:00
Jarrod Johnson 9291037e87 Add libibverbs dependencies 2020-08-11 14:51:11 -04:00
Jarrod Johnson 4404a1bed2 Put in more infiniband stack pieces 2020-08-11 14:44:58 -04:00
Jarrod Johnson 74e85289ac Add ib diag utilities 2020-08-11 14:28:05 -04:00
Jarrod Johnson 95f9854630 Fix missing data for apiclient 2020-08-11 13:40:55 -04:00
Jarrod Johnson f6343a1aa6 Fix the static ip configuration in genesis 2020-08-11 13:37:16 -04:00
Jarrod Johnson db8047318e Add missing dependencies for socket getaddrinfo 2020-08-11 13:23:31 -04:00
Jarrod Johnson 8b1193a6ff Setup authorized_keys in a useful way 2020-08-11 12:24:01 -04:00
Jarrod Johnson 8277679be4 Add spec file to git tracking 2020-08-11 12:11:48 -04:00
Jarrod Johnson 2132ae7003 Fixes for issues in genesis addons 2020-08-11 12:08:02 -04:00
Jarrod Johnson 9c758dafbf Add mlx5 drivers to genesis 2020-08-11 12:07:49 -04:00
Jarrod Johnson f8f1350403 Add ascii codec
A python without ascii could be of limited use
2020-08-11 12:06:28 -04:00
Jarrod Johnson 0960a23765 Change location of rungenesis
The bin as a directory conflicts with
bin as a symlink, keep to opt to avoid the whole mess
2020-08-11 11:17:46 -04:00
Jarrod Johnson 6aaeb9b910 Have a genesis profile to latch onto 2020-08-11 10:14:34 -04:00
Jarrod Johnson 644433fa5d Refactor genesis to have addons.cpio
This makes an easier division between pure CentOS
contributions and 'genesis-scripts' type output.
Do so in a manner consistent with how 'real'
operating systems get this added.
2020-08-11 09:54:53 -04:00
Jarrod Johnson 31dcea46af Fix permissions on dracut installkernel script 2020-08-10 14:49:30 -04:00
Jarrod Johnson 7fc2786ba5 Add TPM2 support to confluent genesis 2020-08-10 11:39:03 -04:00
Jarrod Johnson bd7d0ba42c Add updateboot to osdeploy command 2020-08-07 14:12:13 -04:00
Jarrod Johnson 468f9758e5 Fix update boot
update boot would leave
leftover content, truncate to
get rid of it.
2020-08-07 13:45:10 -04:00
Jarrod Johnson 022ba77298 Fix dhcp configuration
dhcp method was not accurately fed into os deployment
2020-08-07 11:42:13 -04:00
Jarrod Johnson 1d6a5fc329 Have add_local_repositories by python2/3 agnostic
RHEL7 is still python2
2020-08-07 09:55:37 -04:00
Jarrod Johnson d08ca5a114 Add local repositories to EL7 installs 2020-08-07 08:29:20 -04:00
Jarrod Johnson d12272eccc Support current directory in repo path 2020-08-07 08:26:42 -04:00
Jarrod Johnson 86c0d79d73 Fix RHEL 7 support
It was not correctly fingerprinting RHEL 7.
2020-08-06 20:40:31 -04:00
Jarrod Johnson 8aabdcc454 Fix name of rpm gpg keys 2020-08-06 19:32:47 -04:00
Jarrod Johnson 9c079a4203 Generate ifidx file
Use apiclient to generate ifidx for nmcli c u
2020-08-06 18:56:23 -04:00
Jarrod Johnson f55dc8104b Bring up the nic correctly during pre
nmcli can bring up the link with proper lla like confluent.info
indicates.
2020-08-06 18:15:27 -04:00
Jarrod Johnson 3812fc93ff Have EL8 family add repositories manually 2020-08-06 16:37:18 -04:00
Jarrod Johnson 972dc9780c Fix creation of distinfo.yaml 2020-08-06 09:07:41 -04:00
Jarrod Johnson 1d436d68ee Fix initprofile
initprofile was not being pointed to the specific
directory, which is required
for multi-disk sets like
older SUSE.
2020-08-06 08:43:11 -04:00
Jarrod Johnson 8d48fc3273 Fix osdeploy initialize in no-domain environment
If no domain is defined, then do not try to append
2020-08-05 16:31:08 -04:00
Jarrod Johnson 0a3936164e Fix role management for users and groups 2020-08-05 15:02:30 -04:00
Jarrod Johnson a9497b16e8 Fix handling of unset crypted attributes 2020-08-05 14:17:58 -04:00
Jarrod Johnson c8cda426be Fix crossed wires between user and usergroup
The requests were not being routed correctly
2020-08-05 12:57:35 -04:00
Jarrod Johnson 2b963ce854 Address typo in RHVH 4.3 support
This prevented 4.3 from deploying
2020-08-05 12:35:16 -04:00
Jarrod Johnson ae7ce2033b Handle more differences between 4.3 and 4.4 2020-08-05 12:14:29 -04:00
Jarrod Johnson aed96a2711 Add RHV4.4 support to RHV4
Again, we need to handle the drastic differences
in python between *minor* versions of RHVH
2020-08-05 09:45:38 -04:00
Jarrod Johnson b796d19a4c Add ifidx to bash path
The shell based apiclient alternative should write ifidx
as well.
2020-08-05 09:21:16 -04:00
Jarrod Johnson 55a6e3a1e2 Support RHV 4.4
Unfortunately, RHV considers rebasing from RHEL7 to RHEL8
to be a 'minor' change. So we have to have a sloppily
complicated iniqueue to serve either RHEL7 or RHEL8.
2020-08-05 09:15:02 -04:00
Jarrod Johnson bf706f82cf Fix a typo in httpapi 2020-08-05 08:28:30 -04:00
Jarrod Johnson b2731325f6 Refactor image copy
Break up image import into three phases, for breaking out the separate
phases to indpendent commands.
2020-08-04 13:09:34 -04:00
Jarrod Johnson 2e8d002876 Preserve distribution fingerprint
Useful for breaking out the
profile copy over stage.
2020-08-03 14:21:30 -04:00
Jarrod Johnson 8fca5d23c0 Correct scope of ipmethod
ipmethod was trying to be set outside the useful scope.
2020-08-03 12:01:40 -04:00
Jarrod Johnson 704e8379f0 Have firmwaredhcp become static to OS 2020-08-03 11:43:22 -04:00
Jarrod Johnson 585988b22a Add firmwaredhcp method
In a case where static is
desired for the OS, but
PXE or HTTP boot will
receive an IP address from
a DHCP server, offer firmwaredhcp.

This tells confluent to refrain from offering an IP during firmware, but still telling the OS to use static.
2020-08-03 11:42:27 -04:00
Jarrod Johnson c7b8d05930 Fik initialize -k without other actions 2020-08-03 11:06:45 -04:00
Jarrod Johnson 0758611481 Add '-l' to interactive initialize 2020-08-03 09:34:18 -04:00
Jarrod Johnson 755e97ca9a Fix SELinux context on local init
Files generated during osdeploy -l need to have correct context.
2020-07-30 15:41:27 -04:00
Jarrod Johnson 2ade557b3e Amend local osdeploy initialize behavior
Do not bother the site cpio and correctly avoid duplicate config lines.
2020-07-30 15:20:53 -04:00
Jarrod Johnson ac19f093fd Fixes to the previous draaft 2020-07-30 15:03:36 -04:00
Jarrod Johnson 2f4f9a39a6 Add osdeploy function to trust nodes
osdeploy initialize -l will
endeavor to do to the local
management node the same thing the deployment does to the nodes.
2020-07-30 14:44:02 -04:00
Jarrod Johnson d204eedb76 Have osdeploy -p enable tftp
This makes the procedure shorter.
2020-07-30 13:57:42 -04:00
Jarrod Johnson fa934ce334 Fix insertion of manager
The manager insertion failed
with the domain from nodes removed.
2020-07-29 13:52:28 -04:00
Jarrod Johnson dd91213969 Fix mistakes in the hostname support 2020-07-29 13:39:48 -04:00
Jarrod Johnson e93c3241ed Provide for more hostnames
This permits ssh infrastructure
to have multihomed nodes
handled more effeectively.
2020-07-29 13:08:03 -04:00
Jarrod Johnson b4d7812926 Add some likely customizations examples
RedHat family is likely to be customized with firewall and selinux,
use those as examples to get things going for users.
2020-07-29 12:19:44 -04:00
Jarrod Johnson c75a433ff8 Reduce trace activity around common connectivity issue
If the target has a resolution or other common socket issues,
do not make large trace logs.
2020-07-29 08:49:42 -04:00
Jarrod Johnson 56a6f24350 Merge branch '2.5' 2020-07-28 11:16:54 -04:00
Jarrod Johnson 908c566b73 Allow deletion of blank volume names 2020-07-28 11:16:38 -04:00
Jarrod Johnson 8225a2297e Add '..' to range operators
The perl-style range operator exists in some tools, we
might as well support that alongside the usual '-'
operator and ':' python style operator.
2020-07-27 11:54:24 -04:00
Jarrod Johnson b09631fcbf Correct mistake in chcon path 2020-07-24 16:07:15 -04:00
Jarrod Johnson eb7791b884 Add missing example custom files 2020-07-24 16:00:16 -04:00
Jarrod Johnson cbc25c17c4 Revise customization across RH family 2020-07-24 15:45:19 -04:00
Jarrod Johnson 235c07063c Adjust SELinux context on remote exec
To facilitate firstboot, context must be changed
before execing remote content.
2020-07-24 15:32:13 -04:00
Jarrod Johnson 9304b41a12 Generic tab completion after generic noderange
Commands that go further than the noderange should
switch to generic completion for lack of a better
idea.
2020-07-24 14:35:54 -04:00
Jarrod Johnson d2f1ea6cec Tweak the customizations. 2020-07-24 11:10:01 -04:00
Jarrod Johnson d7c219f2a8 Add a new strategy for custom content
This allows a profile to more easily isolate customizations
from the base profile
2020-07-24 10:59:15 -04:00
Jarrod Johnson eabb212e58 Fix setupssh.sh without ssh_config.d
It was modifying the installer ssh_config
rather than the target ssh_config
2020-07-24 08:12:53 -04:00
Jarrod Johnson 33dd5e8315 Remove redundant call to nodectl 2020-07-23 15:10:30 -04:00
Jarrod Johnson 02ba6df421 Do not try to sign unsupported key 2020-07-23 14:41:59 -04:00
Jarrod Johnson e28f6b87fc Fix RHVH apikey location 2020-07-23 14:39:17 -04:00
Jarrod Johnson bbab1cb949 Adjust EL7 package list
Packages in EL8 do not apply to EL7
2020-07-23 13:05:24 -04:00
Jarrod Johnson 232e6c34c5 Add el7 to build 2020-07-23 12:42:34 -04:00
Jarrod Johnson ac622d84b2 Add EL7 support 2020-07-23 12:29:43 -04:00
Jarrod Johnson c81daba66f Merge branch '2.5' 2020-07-22 15:12:52 -04:00
Jarrod Johnson 2483f07c89 Add tar dependency for osdeploy 2020-07-22 15:11:58 -04:00
Jarrod Johnson 5f1ba49a12 Fix behavior with unspecified domain name
Ensure string is only checked if it is a string.
2020-07-22 13:56:55 -04:00
Jarrod Johnson 92018c725f Fix ssdp python3 issue
Attempt to use str to split bytes.
2020-07-17 13:58:00 -04:00
Jarrod Johnson fd46bae24f Fix for removing groups providing multiple values
I don't know how this was missed for so long,
but removing a group providing multiple values would produce an error and fail.
2020-07-17 11:48:49 -04:00
Jarrod Johnson 9f429f5af9 Adapt EL8 change to RHVH 2020-07-16 15:23:45 -04:00
Jarrod Johnson ded4762baf Go to internalizing driver disk load
Trying to let the dd happen naturally was evidently a mistake,
load the drivers manually.
2020-07-16 15:09:24 -04:00
Jarrod Johnson de7b83cbb4 Correct the spec file
It incorrectly omitted correct license.
2020-07-16 08:25:15 -04:00
Jarrod Johnson 767e65455f Apply reset of cmdline to RHVH 2020-07-15 17:24:19 -04:00
Jarrod Johnson 9661d4d6fb Clear cmdline between runs 2020-07-15 17:13:07 -04:00
Jarrod Johnson 8fc475a678 Fix mistakes in the initqueue hooks
Syntax errors were present.
2020-07-15 15:55:29 -04:00
Jarrod Johnson 99cb4748a7 Also amend the RHVH4 dracut hook
In addition to RHEL8, also have RHVH4 have the workaround.
2020-07-15 15:29:30 -04:00
Jarrod Johnson d49f018981 Correct functions in profiles
Use functions correectly.
2020-07-15 15:22:27 -04:00
Jarrod Johnson 6dadac498f Try another strategy for confluent initqueue
We want to have each iteration try not much.

But we also want to have a 'good' (primary network) match
supersede a less successful guess.

But we also want to keep guessing.

So the first 'vague' guess gets to run full hook.

If a future good guess happens, rerun the hook to update the data.
2020-07-15 15:20:17 -04:00
Jarrod Johnson ac308fbd9c Fix python3 issues in ssdp code
In the ssdp code, there were python3 specific issues.
2020-07-15 13:06:54 -04:00
Jarrod Johnson d792822f4b Go back to copy
tftp tends to chroot itself, making symlinks out of
the tftp data directory infeasible.
2020-07-15 12:53:41 -04:00
Jarrod Johnson dfc289b154 Allow osdeploy initialize -p by itself
It seems a rational thing to do.
2020-07-15 11:12:27 -04:00
Jarrod Johnson 77cfa7b45c Revise tftp initialization
For one, if the xCAT /tftpboot is present, roll with that.

For another, use a symlink to /opt instead of copy, to make upgrades
easier.
2020-07-15 10:59:30 -04:00
Jarrod Johnson 81835d66be Fix ssh disconnect handling in python 3
In python 3, '' will never match b''. Just
use the value as a boolean to catch either ''
or b''.
2020-07-15 10:33:28 -04:00
Jarrod Johnson 3b121cdb4b Have initqueue hook give up faster
Since the hook itself will get retried, we can be more aggressive
in giving up in each individual attempt.
2020-07-15 08:45:41 -04:00
Jarrod Johnson fba82f9379 Change el8 addons to retry confluent handler
If DD is in play, drivers may appear later, and
we have to wait for them in a future invocation.
2020-07-14 16:43:37 -04:00
Jarrod Johnson dad68bdf63 Conditionally include clevis-dracut
If not using LUKS, don't bother with clevis-dracut.

In 8.1, clevis-dracut will cause problems with network
in initrd time.
2020-07-14 14:40:05 -04:00
Jarrod Johnson 74af077651 Fix python3 problem with backspace
In python3, a single element reference of a bytes
is an int, not equal to a b'' of the same length and
value. Change to use slices to have python2 and python3
act the same.
2020-07-14 09:03:38 -04:00
Jarrod Johnson 910490cc74 Add arguments to the run_remote functions
This will help provide flexibility in invoking remote scripts
without hardcoding arguments into the scripts
2020-07-13 17:08:38 -04:00
Jarrod Johnson 2ec0c1366e Fix a couple of genesis issues 2020-07-10 10:06:35 -04:00
Jarrod Johnson 7f044c45de Revert "Have osdeploy require apache/ssl and provide config"
This reverts commit ea6155b2a1.

This rpm is built under centos7 for maximum C compatibility
of the addon utility. For now move the dependency back
to lenovo-confluent
2020-07-10 09:27:38 -04:00
Jarrod Johnson 1d596736f3 Tolerate : without a space
E.g. grep does not space delimit.
2020-07-10 08:53:57 -04:00
Jarrod Johnson 4a23ca3db1 Have blank values end with :
This is a bit more obvious for grep.
2020-07-10 08:28:28 -04:00
Jarrod Johnson b112cb0f16 Have unset and blank values look similar
This looks weird in collate otherwise
2020-07-09 17:00:44 -04:00
Jarrod Johnson eb8144214f Add NTP to RHVH profile 2020-07-09 16:02:53 -04:00
Jarrod Johnson 64f57dceaf Fix ubuntu NTP configuration 2020-07-09 15:51:19 -04:00
Jarrod Johnson 5051ab4bf5 Add NTP support to ubuntu profile 2020-07-09 15:21:48 -04:00
Jarrod Johnson 439859e4fc Implement suse ntp and correct redhat ntp 2020-07-09 15:05:20 -04:00
Jarrod Johnson b42e447e34 Fix NTPCFG replacement in suse pre.sh 2020-07-09 14:13:46 -04:00
Jarrod Johnson d2c999b01c Add NTP to suse15 profile 2020-07-09 13:37:50 -04:00
Jarrod Johnson 50661b7dee Fix multiple ntp servers in EL8 profile 2020-07-09 13:30:13 -04:00
Jarrod Johnson ea6155b2a1 Have osdeploy require apache/ssl and provide config
Have osdeploy pull in requirements itself
2020-07-09 13:18:42 -04:00
Jarrod Johnson f8affe99db Add ntp to EL8 profile prescript 2020-07-09 12:11:32 -04:00
Jarrod Johnson ca9655cd5e Cover the more common use case
With confluent running as non-root, it is now very much more
likely that it is a directory permission issue.

Since the root user is commonly asking a lesser privileged service to do the operation.
2020-07-09 11:46:06 -04:00
Jarrod Johnson 2bfbfeb4d3 Add ntp to deploycfg data 2020-07-09 11:35:11 -04:00
Jarrod Johnson 771c3a2984 Rework error message to look nicer 2020-07-09 11:12:00 -04:00
Jarrod Johnson 55ee203974 Improve error handling in pxe
If a name resolution error happens,
put an event in events for the
cleaner error.
2020-07-09 10:56:09 -04:00
Jarrod Johnson d5ff9b4cb5 Add missing traceback import to pxe
This concludes fixing the
susceptability to total
loss of pxe thread.
2020-07-09 10:44:05 -04:00
Jarrod Johnson 48804ed23f Initialize needed tracelog
pxe was trying to use tracelog
without actually initializing it
2020-07-09 10:25:28 -04:00
Jarrod Johnson d80a58304c Fix incorrect indentation
The exception was incorrectly
over indented.
2020-07-09 10:10:20 -04:00
Jarrod Johnson 994c53191c Improve resience of snoop threads
slp could crash in active_scan,
removing it's ability to passively scan.

pxe snoop could crash and go away persistently.
2020-07-09 09:53:25 -04:00
Jarrod Johnson 68c4652662 Fix per-collective globals
set_global is explicitly not
collective enabled, however
collective was causing partial
propagation.

Fix by removing the global carry over and having
commit_clear restore the non-key globals.
2020-07-09 09:10:24 -04:00
Jarrod Johnson 2c151caae7 Add a sample script for making uefi netboot entries
This may be handy for manually configuring uefi network
boot entries locally
2020-07-08 16:01:27 -04:00
Jarrod Johnson c9e1ecb616 Fix use of touch when touch is not present 2020-07-02 16:34:50 -04:00
Jarrod Johnson 4ecae144d9 Attempt to have both short and long names
In ssh, long or short name may matter and user may use short
or long names as node names.

Try to make ssh equipped to be apathetic about the choice.
2020-07-02 12:40:30 -04:00
Jarrod Johnson f70a3daf9a Clear both appropriate profile attributes
When setting a pending profile. clear any staged or established profile.
2020-07-01 15:39:12 -04:00
Jarrod Johnson fa6d42b1b3 Clear stagedprofile
staged profile should be cleared on completion.
2020-07-01 15:35:17 -04:00
Jarrod Johnson 2c30d4069c Correct syntax error in selfservice 2020-07-01 15:20:06 -04:00
Jarrod Johnson 2481759d44 Correct syntax error in nodedeploy 2020-07-01 15:16:39 -04:00
Jarrod Johnson f157ab1ef3 Use the 'staged' profile in some linux
The staged was added to control netboot mostly,
and is mostly optional but change some default
profiles to use it.
2020-07-01 14:20:40 -04:00
Jarrod Johnson 78e5d343e7 Implement a 'staged' phase of profile
This allows a limbo where remote deployment is blocked
but final deployment is not yet flagged.
2020-07-01 14:01:28 -04:00
Jarrod Johnson 22085e38f5 Change bound to 'tpm2'.
This is a bit more logical and flexible for the future.
2020-07-01 13:33:59 -04:00
Jarrod Johnson 8976ed9625 chmod is not available in rhvh initramfs 2020-07-01 12:26:02 -04:00
Jarrod Johnson c28578caf7 Fix variable name in RHV-H initramfs 2020-07-01 12:12:54 -04:00
Jarrod Johnson 649299fa82 Fix SUSE prechroot script 2020-07-01 11:38:33 -04:00
Jarrod Johnson 9d806010c8 Further fix issues with RHV-H deployment 2020-07-01 11:36:25 -04:00
Jarrod Johnson 004e609635 Fix apikey strip for python2
Strip after any conversions, whether it is bytes or str.
2020-07-01 11:29:31 -04:00
Jarrod Johnson 85241a488a Fix up RHVH support 2020-07-01 11:13:14 -04:00
Jarrod Johnson 3fdcecb8c6 Suppress spurious error output
Have the process start cleaner in EL8 deployments
2020-07-01 10:43:24 -04:00
Jarrod Johnson b372a15c33 Strip newline after decode
strip on bytes in python3 does not remove newlines.
Call after decode to have strip handle the newline.
2020-07-01 10:32:11 -04:00
Jarrod Johnson dfa636ac4c Coerce binary to text
In subprocess, since we get binary, need to
coerce to text.
2020-07-01 10:15:35 -04:00
Jarrod Johnson e863edfe3f Correct a number of mistakes 2020-07-01 09:52:17 -04:00
Jarrod Johnson 159d01b690 Update client for floppy
Update documentation and tab completion.
2020-07-01 09:00:33 -04:00
Jarrod Johnson b407fef988 Normalize path to confluent files
After going through tmp and etc, settle on /etc/confluent/
as the generally relevant directory when possible.

Additionally, move apikey and ifidx logic into apiclient where
possible
2020-07-01 08:57:08 -04:00
Jarrod Johnson 4cf34056e4 Correct mistakes in previous commit 2020-06-30 19:34:13 -04:00
Jarrod Johnson 32ba37a858 Extract default nic to the index in el8 2020-06-30 19:30:09 -04:00
Jarrod Johnson 0c3888441d Add the check for primary nic to suse 2020-06-30 18:48:10 -04:00
Jarrod Johnson 27a2a58ea1 Try more aggressively to get to 'default' network.
If a 'default' network is going to eventually link up,
wait for it.
2020-06-30 18:39:29 -04:00
Jarrod Johnson 8f9e4ea205 Build confluent CA cert for EL8 2020-06-30 17:02:21 -04:00
Jarrod Johnson 94f2b618bd Also copy api key to usable location. 2020-06-30 16:59:52 -04:00
Jarrod Johnson 8d3374b1e7 Move confluent.info to correct location 2020-06-30 16:55:01 -04:00
Jarrod Johnson 1e6f5c6da2 Update Ubuntu with the extendined info changes 2020-06-30 16:15:01 -04:00
Jarrod Johnson ea54007806 Have SuSE use extended info
SuSE does not have python this early, so use
shell utilities instead.
2020-06-30 16:00:47 -04:00
Jarrod Johnson 2f4dd240dd Change EL8 initramfs to use apiclient
This is a richer client that provides
the extended information required
for more accurate network autodetect.
2020-06-30 15:02:10 -04:00
Jarrod Johnson 1a664f669c Use client provided hint for net selection
More precise then trying to do by IP subnet
2020-06-30 14:58:04 -04:00
Jarrod Johnson 8ab9c14d45 Do not surpress if scope index is distinct
This allows vetting multiple peers when vlan tagging
is used with LLA.
2020-06-30 14:18:54 -04:00
Jarrod Johnson 03008f76e5 Remove stale copy of apiclient 2020-06-26 16:24:35 -04:00
Jarrod Johnson b4e8daaebe Incorporate common copy of apiclient into build 2020-06-26 16:23:51 -04:00
Jarrod Johnson 3733057852 Move apiclient to common location 2020-06-26 16:22:27 -04:00
Jarrod Johnson 7b21cc829f Incoporate extended info to apiclient 2020-06-26 16:21:48 -04:00
Jarrod Johnson 31aeb2552c Have copernicus outut extended info
This will help profiles select
the most appropriate interface.
2020-06-26 16:13:15 -04:00
Jarrod Johnson df503464d7 Tighten permissions on /etc/confluent on deployed target 2020-06-26 15:50:15 -04:00
Jarrod Johnson cadb222904 Add missing bit from last commit 2020-06-26 15:21:00 -04:00
Jarrod Johnson 3fed7ea075 Implement more context data in discovery
Let the client know the management
interface and whether that subnet has the nicest match
for a primary network.
2020-06-26 15:15:13 -04:00
Jarrod Johnson 86e944b3a4 Correct typo in function call 2020-06-26 14:11:50 -04:00
Jarrod Johnson 05fb763200 Try to auto-restart httpd on initialize
During setup process, restart
the service on behalf of user
if appropriate service file is found.
2020-06-26 12:49:28 -04:00
Jarrod Johnson 1896b51f82 Add emphasis to the HTTPS cert
This is a particularly significant
step that warrants highlighting.
2020-06-26 12:40:07 -04:00
Jarrod Johnson a704c0cdab Be more verbose in osdeploy initialize
Output was a tad terse.
2020-06-26 08:19:22 -04:00
Jarrod Johnson 283cd6318e Fix osdeploy -u
If running osdeploy -u by itself,
we did in fact do something.
2020-06-26 08:11:30 -04:00
Jarrod Johnson 7ec7dd4449 Add ssl module to python in confluent genesis concept 2020-06-25 12:50:45 -04:00
Jarrod Johnson 98008e409f Fix osdeploy tab completion 2020-06-25 10:41:58 -04:00
Jarrod Johnson 250a39bfef Change name of libarchive dependency
SLES12 builds without the '2', and other distros provide
both.
2020-06-25 10:29:27 -04:00
Jarrod Johnson 8fc3cc586d Begin work on a genesis for confluent
Have a genesis edition for confluent os deploy. While the need
for genesis is mitigated and many functions should be available
through pre script, provide a more assured environmennt as a
fallback, if the OS isn't going to be imported or using something
like ESXi.
2020-06-23 17:02:48 -04:00
Jarrod Johnson c7a8f524bd Add -s to nodesensors man page 2020-06-22 13:29:27 -04:00
Jarrod Johnson 32dff34f29 Add floppy to setboot options
'floppy' is used for small
hard disk boot in some scenarios.
2020-06-22 12:13:14 -04:00
Jarrod Johnson 6a272d17c5 Amend python2 dependencies for osdeploy
We use yaml and libarchive-c, have python2 rpms also pull them in.
2020-06-22 09:14:32 -04:00
Jarrod Johnson 785d8a7c1c Fix a couple of problems
In RHV, tmux was unable to attach because of TMUX variable.
Unset it to allow tmux to work normally.

Clortho didn't specify family, which worked in linux but not
in ESXi.
2020-06-19 10:24:51 -04:00
Jarrod Johnson fd82c584d3 Rename osimage in template to osdeploy 2020-06-19 09:24:26 -04:00
Jarrod Johnson 6c920206e7 Fixup image retrieval code for RHV-H 2020-06-19 09:13:19 -04:00
Jarrod Johnson e8d00bf229 Rename osimage command to osdeploy
Do not imply 'imaging' when it's a more generic deployment
facility, that might not even implement imaging.
2020-06-19 08:43:28 -04:00
Jarrod Johnson d86aaaf013 Add required nodectl init
Documentation states this is required.
2020-06-19 08:32:12 -04:00
Jarrod Johnson 03e3497d20 Use the image rpm for install
The image must be extracted from an rpm, for
some reason or another.
2020-06-19 08:28:25 -04:00
Jarrod Johnson 17ec74dcf8 Add binary output to apiclient
It is convenient to use apiclient as
a downloader, it's shorter and to the point
than curl.
2020-06-19 07:49:05 -04:00
Jarrod Johnson e7b93dba50 Have apiclient use first rather than last
apiclient was preferring the slowest rather than
the fastest respondant, inconsistent with intent
and everything else.
2020-06-19 07:29:14 -04:00
Jarrod Johnson 5bc9cb57d1 Amend RH initqueue
We may be called before drivers have manifested interfaces.
On each iteration make sure all nics are up before proceeding.
2020-06-18 16:45:24 -04:00
Jarrod Johnson 889b6a9930 Keep yum repo away from RHV
It must not think it has a yum repo to consider
2020-06-18 15:33:38 -04:00
Jarrod Johnson 5b605aa9d7 Further address EL7/RHV peculiarities
EL7 tends to skip the initqueue. Hook finished to
prevent that.
2020-06-18 15:26:35 -04:00
Jarrod Johnson ad5faf144e Fix more RHV4 issues with the profile 2020-06-18 14:28:44 -04:00
Jarrod Johnson b6c017ef1a Adjust some paths for compatibility
The profile expectations were not being met
2020-06-18 13:50:27 -04:00
Jarrod Johnson 095a831c0b Fix source of abnormal console exit
If using ctrl-e, c, then a delay while
there is console output to do,
console would crash.

Fix by catching the flush problem
and ignoring it.
2020-06-18 13:09:48 -04:00
Jarrod Johnson 9cc5b5f98c Add rhvh4 to profile list 2020-06-18 12:49:05 -04:00
Jarrod Johnson ac2e41bd78 First pass at RHV4 support
Derive from EL8 with some EL7 vintage accomodations
2020-06-18 12:36:00 -04:00
Jarrod Johnson d40426ff54 More cleanly error on unknown media
Rather than raise ugly unexpected
errors and pollute trace log,
cleanly handle the likelihood
of unknown media.
2020-06-18 11:11:53 -04:00
Jarrod Johnson 1c579723cc Check current SMM IP before pushing config
If the user requests the same ip address that
is already present, leave the network configuration
alone.
2020-06-18 09:02:09 -04:00
Jarrod Johnson e1270b2926 Do not seal to PCR 7
At least without secureboot, PCR 7 is not defined.

This would potentially be worth a conditional to
check on secureboot.
2020-06-17 16:23:13 -04:00
Jarrod Johnson d4736e0aad Do not respond to deployment calls without quorum 2020-06-17 11:09:05 -04:00
Jarrod Johnson 86de9ce276 Do not answer deploy solicit without quorum
If we are not in quorum, we cannot provide
credible answers to deployment.
2020-06-17 11:07:54 -04:00
Jarrod Johnson 231582dd0f Workaround mtools on cluster fs
When a lock is acquired by mtools,
it does not ensure it releases the
lock before exit.

Workaround this by doing a blocking
lock and unlock after any
invocation of mtools.
2020-06-16 16:36:02 -04:00
Jarrod Johnson 895430a89c Remove systemd management of /var/lib/confluent
systemd was too easily confused by the state
directory, remove it.
2020-06-16 09:16:01 -04:00
Jarrod Johnson e1de56f19b Correct typo in osimage.py
Wrong variable name...
2020-06-12 14:43:00 -04:00
Jarrod Johnson fc7ad4b028 Generate different boot.cfg for esxi
media boot and pxe boot need
two different strategies for module
location. Print the two cfg files
with the respectively useful
values.
2020-06-12 14:27:37 -04:00
Jarrod Johnson ab04ad85e8 Correct filename typo 2020-06-12 12:13:31 -04:00
Jarrod Johnson cb19425435 Import media world-readable
In the absence of extensions,
libarchive assumes ISO content
is private. Always make content
world readable for the sake of
confluent-public serving.
2020-06-12 11:54:37 -04:00
Jarrod Johnson b8dcfbae45 Move esxi customization back to include
This makes modding the template a bit safer and
more powerful.

It seems it was incorrect that the issue in esxi6
was not due to %include and is just a fact of life.
2020-06-12 11:36:56 -04:00
Jarrod Johnson 92913e1119 Fix path to kernel in boot.cfg
esxi was pointed to the wrong
location.
2020-06-12 11:12:57 -04:00
Jarrod Johnson 76f256a344 Fix missing quote that broke build 2020-06-12 10:36:06 -04:00
Jarrod Johnson 207065aab3 Fix more permission problems
Some ESXi contents that need to
be world readable are fixed.
2020-06-12 09:55:25 -04:00
Jarrod Johnson 5129b9fe9b Write more useful boot.cfg
ESXi should access using relative
path, rather than going to root
for everything.
2020-06-12 09:34:52 -04:00
Jarrod Johnson 458d6284d1 Dulpicate esxi7 to esxi6 2020-06-11 17:18:28 -04:00
Jarrod Johnson db7c5adf8d Add PXE to esxi os images
This will attempt to use
ipxe correctly when PXE
initiates the deployment.
2020-06-11 17:14:14 -04:00
Jarrod Johnson 68f000838e Relocate boot.ipxe
It looks a bit weird in the linux and outright bizarre
in the vmware case.
2020-06-11 15:28:45 -04:00
Jarrod Johnson 0849f20d60 Add stub initprofile.sh
While not needed, stub it out for code to
be extended if needed.
2020-06-11 13:58:01 -04:00
Jarrod Johnson 85b01ccec5 Switch to overwrite vmfs
esxi installs frequently fail unless overwritevmfs is
specified
2020-06-11 13:45:07 -04:00
Jarrod Johnson 198d6a795f Add runweasel to esxi
Early boot behavior is influenced by the
real kernel command line. Without /bootmodules things
fail.
2020-06-11 13:33:15 -04:00
Jarrod Johnson 09db9f5a25 Pull ks.cfg manipulation into scripts
This make it easier to customize rather than being
in addons.tgz
2020-06-11 10:29:22 -04:00
Jarrod Johnson 654932efb6 Modify the correct line for ks manipulation 2020-06-11 10:26:16 -04:00
Jarrod Johnson f78b358cd7 Try to adapt for esxi6.7
ESXi 6.7 had further restrictions
2020-06-11 09:26:40 -04:00
Jarrod Johnson 8e203723ef Further tweak esxi deployment support
Try removing the exec, as memory seems
constrained in exec case for some reason.

Specify behavior when dealing with existing
vmfs.
2020-06-10 14:01:07 -04:00
Jarrod Johnson 0a1409ffcf Amend esxi update
Some mistakes were made in the profile
2020-06-10 12:34:46 -04:00
Jarrod Johnson 873190cae9 Fix tgz generation
Previous attempt was duplicating files in the
archive, which caused vmware kernel to
fail to unpack them.
2020-06-10 12:17:51 -04:00
Jarrod Johnson 783c6ce7b6 Revise the esxi tar strategy
Finally, it has been ascertained
that ESXi rejecting the tar
was due to not having directories
explicitly listed, not because of
forbidding new paths or compression.
2020-06-10 10:37:14 -04:00
Jarrod Johnson facba645c5 Revert "Switch to tar"
This reverts commit c6d0c121d4.
2020-06-10 10:17:54 -04:00
Jarrod Johnson c6d0c121d4 Switch to tar
esxi seems to be inconsistent with working with
gz compressed tar, see if plain tar fares better
2020-06-10 09:44:44 -04:00
Jarrod Johnson d4f46a53e0 Fix tar generation of site
site content was nat being
correctly packed to tgz.
2020-06-10 09:42:44 -04:00
Jarrod Johnson 3b940b6194 Rename site contents in tgz
This moves location of site data for esxi
2020-06-09 16:40:29 -04:00
Jarrod Johnson ca91e10941 Numerous changes to esxi deployment 2020-06-09 16:12:22 -04:00
Jarrod Johnson 32ff75c86a Add profile to esxi 2020-06-09 10:28:16 -04:00
Jarrod Johnson 006db24591 Fix more mistakes in the esxi deploy 2020-06-09 09:51:48 -04:00
Jarrod Johnson 6bbe1a49e0 Fix typo in spec file 2020-06-09 08:50:54 -04:00
Jarrod Johnson 197f9950cb Add ESXi contents to OS deploy 2020-06-08 17:24:48 -04:00
Jarrod Johnson 0bd6aae76f Construct tgz for site
This is needed for vmware
deployment support.
2020-06-08 14:03:58 -04:00
Jarrod Johnson fa9f9c1d99 Tolerate certain HTTP clients
Some HTTP clients put the port
number into the host header.
We don't care about port number.
2020-06-08 11:29:31 -04:00
Jarrod Johnson 0a2ab341a8 Increase root directory size
ESXi demands a lot of files, increase
the root directory by a large amount
to fit esxi.
2020-06-04 15:16:45 -04:00
Jarrod Johnson 58e7a1f0b4 Recognize ESXi media
Fingerprint ESXi media, at
least tested with ESXi 7 media.
2020-06-04 14:58:52 -04:00
Jarrod Johnson 0016c31fef Fix encrypted boot on 8.1
8.1 requires -f or it will fail.
2020-06-04 13:41:00 -04:00
Jarrod Johnson f505b3ad16 Fix grub hash bytes
In python3, need to coerce the strings
to str or else end up with invalid grub password.
2020-06-04 10:27:55 -04:00
Jarrod Johnson d17a2054d4 Add warning about encryptboot to Ubuntu 2020-06-03 16:22:41 -04:00
Jarrod Johnson 97e7dbc936 Improve the SUSE encryption error 2020-06-03 16:18:24 -04:00
Jarrod Johnson 7da29c17e1 Try to add error on encryptboot for SUSE
We don't support under suse, so let the user know if they try.
2020-06-03 15:33:10 -04:00
Jarrod Johnson 942685b48d Amend confetty fix
shlex.join is not widely
available, switch to just
skipping the split if pre-split
by the calling process.
2020-06-03 14:58:30 -04:00
Jarrod Johnson 21e97689bc Fix handling of complex embedded args
If pulling from argv, it has already been
shell split. Use shlex to join to correctly
requote anything that needs quoting.
2020-06-03 13:52:14 -04:00
Jarrod Johnson 8ddcdf625b Fix SSDP issue in python3
A bytes was split by str, fix this.
2020-06-03 13:05:40 -04:00
Jarrod Johnson 427a518673 Fix Ubuntu prescript
Forgot a hyphen
2020-06-03 11:26:34 -04:00
Jarrod Johnson 8797189d5c Reduce sensing responses
Do not respond to a node
if we do not have any expectation
of deploying to that system.
Mitigates troubles of having multiple
confluent servers with the same
nodes.
2020-06-03 10:11:46 -04:00
Jarrod Johnson 762685459c Add confluent CA to installed EL8
Needed to continue boot process during install
2020-06-02 17:44:19 -04:00
Jarrod Johnson f86429c83c Fix credserver
The grubhash should only fill in if there is a value to fill in.
2020-06-02 16:47:50 -04:00
Jarrod Johnson 82ab56ebb4 Add boot encryption support to EL8
The stock profile should now encrypt if requested
2020-06-02 16:05:44 -04:00
Jarrod Johnson 9f4c02dc83 Fix grub hash storage of password 2020-06-02 12:47:47 -04:00
Jarrod Johnson 033903f712 Fix typo in configmanager 2020-06-02 11:38:03 -04:00
Jarrod Johnson cf9f4a9691 Add grub password to attributes
This permits opting into using
a password to block editing
of grub configuration.
2020-06-02 10:59:30 -04:00
Jarrod Johnson 77586c7f4d Add comment to SUSE 2020-06-01 16:03:53 -04:00
Jarrod Johnson 886aade5dc Refactor SUSE installs
Apply same comment principles to suse as was
applied to redhat.
2020-06-01 16:01:26 -04:00
Jarrod Johnson d8266ea6c9 Update firstboot to have some comments
Make it clearer how it would be edited.
2020-06-01 12:25:30 -04:00
Jarrod Johnson e326671057 Add python3-yaml to requires
Ensure yaml support installs in EL8.
2020-06-01 12:02:21 -04:00
Jarrod Johnson 700afc6606 Fix function definition
Sourcing the functions was causing a hang.
2020-06-01 11:12:28 -04:00
Jarrod Johnson e7cb3f9a0c Add the refactored files
The refactoring put the files in new places,
add those to tracking.
2020-06-01 10:52:38 -04:00
Jarrod Johnson 0254963432 Add some commentary to help users
Embed comments to help users understand
how to customize a bit better.
2020-06-01 10:52:01 -04:00
Jarrod Johnson 110fb27b2a Refactor the kickstart for EL8 a bit
Based on early feedback, working towards a less
intimidating script set for the sake of not
needing a 'postscripts' facility.
2020-06-01 09:08:41 -04:00
Jarrod Johnson 116682082a Fix reply on nonfunctional nic
If a nic was up but without IPv4,
do not reply even if the kernel is
'helping' us to be in the ballpark.
2020-05-29 17:32:45 -04:00
Jarrod Johnson 2c1ca170e5 Fix python3 issues in ssdp
In python2, they are already bytes.

In python 3, we need to check and convert if not already bytes.
2020-05-29 16:12:23 -04:00
Jarrod Johnson e648c9c065 Fix typo in pxe handler 2020-05-29 12:58:14 -04:00
Jarrod Johnson c1576e9787 Handle blank lines without error
Do not trigger syntax error on a blank expression.
2020-05-29 12:23:57 -04:00
Jarrod Johnson 6ee9ccbc27 Fix python3 idxtoname
python3 needs it to be str, not
bytes as C would return.
Accomodate only for python3, leave
python2 the same.
2020-05-29 12:06:00 -04:00
Jarrod Johnson 2a9d4e8079 Avoid breaking net config with '' DNS server
The node is probably misconfigured, but tolerate it
and carry on so that networking will at least
come up.
2020-05-29 08:58:33 -04:00
Jarrod Johnson 335d06ea4c Default to US if management node is n/a
localectl can be n/a for some scenarios,
default to US for such cases.
2020-05-28 17:07:17 -04:00
Jarrod Johnson 17b8000c0f Fix ethernet support
In accomodating the 20 byte
IB hwaddr, it could no longer
accept the 6 byte.

Adapt to all destination addresses up to 20.
2020-05-28 16:49:59 -04:00
Jarrod Johnson 5f170585c5 Adjust SUSE logic to work
Finding the apache configured
TLS cert location now works in
an easy configuration.
2020-05-28 16:47:36 -04:00
Jarrod Johnson 356de251ee Boot over IB support
IB is a bit different in broadcast
and certainly address length. Be
adaptive for those values.

Further, OPA port addr can get
mangled in the middle of a
transaction, recognize both the
full and mangled variant.
2020-05-28 15:37:30 -04:00
Jarrod Johnson 405bd84ce2 OS import fixes for python 2
Python 2 does not have some
of the tricks we were using, replace with python 2 friendly tricks.
2020-05-28 11:09:24 -04:00
Jarrod Johnson e9a14bd180 Have PXE content adapt to OS
Detect the respective paths
of tftp servers in the three supported distributions.
2020-05-27 17:05:04 -04:00
Jarrod Johnson c3fedf7309 Fix missing import isn osimage 2020-05-27 12:16:24 -04:00
Jarrod Johnson da8baa2ccb Fix missing libarchive dep
confluent now requires
libarchive to run.
2020-05-27 11:46:54 -04:00
Jarrod Johnson 4480d0418e Fix permissions of SSH CA key
It was creating CA as root, which
blocked confluent functionality.
2020-05-27 08:58:10 -04:00
Jarrod Johnson 987ac22b4e Fix permission issues with sshutil
uid management was done incorrectly
2020-05-22 18:13:00 -04:00
Jarrod Johnson 6471599bb2 Fix public/os permissions
When using osimage import,
the permissions on os directory
were too strict. Relax permissions
on public/os
2020-05-22 17:55:22 -04:00
Jarrod Johnson 05983201ee Fix mistaken use of $proto variable
Always use https to fetch the script
2020-05-22 15:59:19 -04:00
Jarrod Johnson b20517bd82 Add missing mtools dependency 2020-05-22 15:47:57 -04:00
Jarrod Johnson 4e8e44605a Merge branch 'master' into osdeploy 2020-05-22 15:47:04 -04:00
Jarrod Johnson b4374817f5 Move getinstalldisk into profiles 2020-05-22 15:27:25 -04:00
Jarrod Johnson 968400d72b Update ssh known hosts and tftp
This is also required to get install going.
2020-05-22 15:03:56 -04:00
Jarrod Johnson 88436ff129 Merge branch 'master' into osdeploy 2020-05-22 13:56:59 -04:00
Jarrod Johnson eabf2073c1 Fix construction of site cpio
It must include directory names in correct
order for it to unpack correctly
2020-05-22 12:49:33 -04:00
Jarrod Johnson 906855ecf7 Fix cpio generation
It needed to be relative path, and also
fix use of bytes fed into cpio.
2020-05-22 11:40:54 -04:00
Jarrod Johnson 59e9ef2215 Create initramfs.cpio
This actually enables the site for
booting with site addons.

Use of a temporary name mitigates
problem if multiple collective members
try to init at same time.
2020-05-22 11:05:35 -04:00
Jarrod Johnson 021591017c Fix osimagetab completion 2020-05-22 09:03:02 -04:00
Jarrod Johnson ba0d600bf7 Prepare osimage initialize
Provide a helper for the various
setup steps required for
getting ready for OS deployment.
2020-05-21 17:07:58 -04:00
Jarrod Johnson eda645b792 Freshen up ssh and tls helpers
TLS will now work from scratch

SSH user key management updated to final design
2020-05-21 16:26:01 -04:00
Jarrod Johnson 8ce8f18f56 Change certutil to be a module
This allows it to be used from within
osimage command.
2020-05-21 15:56:16 -04:00
Jarrod Johnson 0af9db5eb7 Autodetect TLS key/cert locations
This facilitates easier getting started when possible.
2020-05-21 15:55:22 -04:00
Jarrod Johnson 22d5da3ae9 Rename certs to pem
There are contexts where the .cert name is not
recognized, go for .pem name instead.
2020-05-21 14:37:17 -04:00
Jarrod Johnson 6246d9e0a4 Default to never allowing insecure protocol
It erroneously used http rather than https
without user intervention.
2020-05-21 14:29:58 -04:00
Jarrod Johnson 726cb198c1 Actually list partitions in the HPC template
Without listing, autoyast fails to honor the disk somehow.
This causes disk to be honored. Additionally, use xfs instead of
btrfs and get rid of /home.
2020-05-21 10:57:19 -04:00
Jarrod Johnson b34f308c8a Merge branch 'master' into osdeploy 2020-05-21 08:48:27 -04:00
Jarrod Johnson 51bc7dc88f Add nodedeploy command
This is akin to rinstall, but with
better tab completion and such
2020-05-20 16:21:08 -04:00
Jarrod Johnson 76952e774b Add more verbose autoconsole text
Point users towards screendump for Ubuntu and
SuSE.
2020-05-20 14:46:26 -04:00
Jarrod Johnson 8bff5c272b Actually modify meaningful grub config 2020-05-20 14:26:22 -04:00
Jarrod Johnson c587cd34ac Check correct location for deploycfg
This should fix the autocons behavior in
ubuntu.
2020-05-20 14:10:06 -04:00
Jarrod Johnson f8b27f1f8d Add autoconsole to ubunntu install
Have the installed system use serial console.
2020-05-20 13:24:05 -04:00
Jarrod Johnson 60453973cb Actually use the domain name in rhel deploy 2020-05-20 12:48:05 -04:00
Jarrod Johnson c48b023236 Inject DNS domain to suse deploy 2020-05-20 12:20:58 -04:00
Jarrod Johnson c0bd9f8bfb Insert domain into EL deploy
This hopefully sets search path up well.
2020-05-20 12:08:05 -04:00
Jarrod Johnson c4379e3fd2 Null domain becomes blank for ubuntu 2020-05-20 09:40:16 -04:00
Jarrod Johnson b0be352134 Correct target for TLS certs in ubuntu 2020-05-20 09:33:38 -04:00
Jarrod Johnson 7d4ce55127 Fix firstboot on Ubuntu
Correctly update deployment attributes upon completion.
2020-05-19 17:38:25 -04:00
Jarrod Johnson 9506817a00 Add DNS to DOMAINSEARCH, as ubuntu igores domain.. 2020-05-19 17:09:26 -04:00
Jarrod Johnson 0a79307cc5 Fix scope of keymap 2020-05-19 17:05:43 -04:00
Jarrod Johnson 442902ecd8 Fix mistake in selfservice api 2020-05-19 16:49:07 -04:00
Jarrod Johnson 5540896ab1 Convert Ubuntu to netconf syntax
The ipconfig syntax can't take domain. See how
it works using the same hooks that dhcp would have.
2020-05-19 16:23:36 -04:00
Jarrod Johnson e696566b42 Add dns domain to deployment
This permits the deployment profiles
to pull in specified DNS domain.
2020-05-19 15:07:10 -04:00
Jarrod Johnson eec7236110 Rename dns server attribute 2020-05-19 14:45:06 -04:00
Jarrod Johnson ebd41d3e53 Merge branch 'master' into osdeploy 2020-05-19 14:19:26 -04:00
Jarrod Johnson 26caffab76 Have Ubuntu report deployment completion 2020-05-19 13:36:49 -04:00
Jarrod Johnson 9093a6e80a Rework ubuntu profile to break scripts into profile
This makes the pre/post/firstboot scripts more accessible
and consistent with the other distributions.
2020-05-19 12:22:46 -04:00
Jarrod Johnson 66f0e8225e Tighten permissions on confluent config files
Prior to copying them, make sure only root can interact.
The directory should protect them as well, but best to
not have anything controversial.
2020-05-19 10:51:32 -04:00
Jarrod Johnson 5f63875cae Finally fix SuSE certificate handling
It was targeting a symlink that went out of chroot,
target the underlying directory instead.
2020-05-19 10:38:31 -04:00
Jarrod Johnson 92f8acab7a Fix target path of tls anchors 2020-05-18 22:07:03 -04:00
Jarrod Johnson 540d0e1795 Fix SUSE certificate handling
SUSE requires things go through update-ca-certificates,
update the generated certs and the post to do that.
2020-05-18 19:37:54 -04:00
Jarrod Johnson b9cdf0d941 Move TLS certs into correct locations for SuSE 2020-05-18 17:00:05 -04:00
Jarrod Johnson dcb9f60ade Modify suse autocons logic 2020-05-18 16:13:16 -04:00
Jarrod Johnson d12ac8a1ba Try to adjust suse autoconsole behavior 2020-05-18 16:07:38 -04:00
Jarrod Johnson 14ba48da1f Add keymap to EL install 2020-05-18 14:55:35 -04:00
Jarrod Johnson ceefb936c2 Add keymap from donor system
RHEL requires this to autoinstall graphically.
2020-05-18 14:17:57 -04:00
Jarrod Johnson 9caf8056ec Correct split
bytes need bytes to split
2020-05-18 13:50:48 -04:00
Jarrod Johnson 317a1c572b Fix startswith parameter
Needed to be bytes for subprocess
2020-05-18 13:30:22 -04:00
Jarrod Johnson 2b39b9b5a6 Correct string in locale defaulting 2020-05-18 13:02:50 -04:00
Jarrod Johnson 5dee338d50 Fix lang in EL8 install
While text mode does not care, if user goes down graphical
path, it pauses installer.
2020-05-18 12:52:31 -04:00
Jarrod Johnson c459990457 Change EL8 to use autoconsole less 2020-05-18 11:46:47 -04:00
Jarrod Johnson 485b5e0dce Add textconsole to deploycfg
It turns out that the SPCR is
not automatically populated.
Provide a hint via deploycfg
as to whether the user has
configured confluent for text
console access.
2020-05-18 10:41:04 -04:00
Jarrod Johnson 188467ccf0 Correct order of EL post script
Actually try to fetch the file before copying it.
2020-05-16 12:12:30 -04:00
Jarrod Johnson dcda6a1080 Fix EL host based authentication 2020-05-16 11:43:38 -04:00
Jarrod Johnson 0c575456e3 Fix SuSE host authentication
curl was failing to get allnodes
2020-05-16 11:42:19 -04:00
Jarrod Johnson 2211755bf7 Have SUSE profile work for LEAP and SLE
Add a directive to comment out the superfluous autoyast
content from SLE when dealing with the more
straightforward LEAP.
2020-05-16 10:14:23 -04:00
Jarrod Johnson bf5727cab1 Disable yast self-update in suse
It slows down installs and shouldn't be needed.
2020-05-16 10:04:44 -04:00
Jarrod Johnson a05bfcec80 Fix suse15 firstboot
It was not using correct CA path nor was it filling in
authentication headers.
2020-05-15 20:13:06 -04:00
Jarrod Johnson 5ebe127db2 Fix Suse deployment
It missed the rename of the deploy_server attribute.
2020-05-15 19:11:22 -04:00
Jarrod Johnson b67140248e Change ipv4_server to deploy_server
Use a more neutral name for the deployment server target.
It is still ipv4 only for the moment, but easier to pull in
ipv6 support when not having to change paths that don't care.
2020-05-15 16:06:57 -04:00
Jarrod Johnson a5adcbd496 Add firstboot to EL
Also add 'mgt_server' rather than 'ipv4_server'. Will move to this.
The server should be able to dictate the right address without the
deploymennt image having to keep track.
2020-05-15 16:03:25 -04:00
Jarrod Johnson cab2310f35 Fix SLES Full Media
SLES can have Full media set,
support that as well as the
Installer/Packages split.
2020-05-15 14:54:34 -04:00
Jarrod Johnson 4d5ec98525 Correct SELinux context for firstboot
This permits the script to actually run at firstboot, even
if SELinux is on.
2020-05-14 18:24:35 -04:00
Jarrod Johnson 008bf33be3 Fix el8 prescript retrieval
Mistakenly was using the deployer
ip as profile.
2020-05-14 17:16:26 -04:00
Jarrod Johnson b52568dc10 Refactor RedHat/CentOS class profile
Again, break things up for more approachable layout.
2020-05-14 15:47:08 -04:00
Jarrod Johnson 24288f988a Call updatestatus upon completion of suse install 2020-05-14 14:49:53 -04:00
Jarrod Johnson 408d0a8673 Refactor SUSE to have external scripts
Try to improve readability of portions of install by
refactoring.
2020-05-14 13:36:23 -04:00
Jarrod Johnson 579e05972f Rename 'default' to hpc for suse
Since the profile is oriented toward installing
HPC template, name it more appropriately.
2020-05-14 13:05:38 -04:00
Jarrod Johnson f85693b7e3 Fix Headers in new replies
Needs to be a nested tuple.
2020-05-13 16:53:36 -04:00
Jarrod Johnson 7dcad26002 Add hook for registering install completion
This will allow watching the
profile for changes to know
when install is utterly complete.
2020-05-13 16:29:10 -04:00
Jarrod Johnson 393c3ac38e Fix distribution link for SUSE
SUSE needs to be pointed at the
parent directory, not the media
specific path.
2020-05-12 15:51:08 -04:00
Jarrod Johnson b73c561ca9 Support relative path import
Have osimage import correct to absolute
path for import.
2020-05-12 15:02:18 -04:00
Jarrod Johnson 1ba2386b82 Provide keyname to importer
This allows client to reliably make association
between import request and tracking
the import activity.
2020-05-12 14:47:00 -04:00
Jarrod Johnson 8a48909ae3 Relax permissions on osimage
Public content has to be world
readable for the web server
to provide it. Mitigate by only
temporarily relaxing umask.

Note that the known sensitive
portions are already doing an
explicit specification of permissions, so umask
relaxing won't affect those.
2020-05-12 13:41:54 -04:00
Jarrod Johnson 0b01ca59d2 Add osimage script to package 2020-05-12 12:14:27 -04:00
Jarrod Johnson 69d14564b0 Stop trying to modify the confluent lib
The confluent lib may be shared and not modifiable. This is fine.
2020-05-12 11:58:18 -04:00
Jarrod Johnson ccd94fb0cf Actually fix centos profiles 2020-05-12 11:50:45 -04:00
Jarrod Johnson bd91c58768 Fix CentOS profile generation
CentOS checker did not provide
category for profile population.
2020-05-12 11:26:04 -04:00
Jarrod Johnson 72c22939ad Merge branch 'master' into osdeploy 2020-05-12 10:32:40 -04:00
Jarrod Johnson 1beed070fd Add help text to usage 2020-05-12 09:53:46 -04:00
Jarrod Johnson 5addc7519d Rename osdeploy to osimage 2020-05-12 09:48:57 -04:00
Jarrod Johnson 7a68d1444b Extend osdeploy to have a config 2020-05-12 09:48:27 -04:00
Jarrod Johnson b5ccf9446a Fix importing task on existing folder
Allow deletion of a failed task.
2020-05-11 16:37:21 -04:00
Jarrod Johnson 807c68890d Fix import error
Attempted to make the same
directory twice.
2020-05-08 14:43:54 -04:00
Jarrod Johnson ee2f80b5d2 Merge branch 'master' into osdeploy 2020-05-08 14:27:25 -04:00
Jarrod Johnson a017c5460f Have confluent server able to import OS media
This wires up osimage to the API
such that it can work.
2020-05-08 14:27:04 -04:00
Jarrod Johnson b7c830b041 Fix mistake in listing profiles
Additionally, remove redundant
function definition.
2020-05-07 17:06:23 -04:00
Jarrod Johnson 853318feba Merge branch 'master' into osdeploy 2020-05-07 16:27:12 -04:00
Jarrod Johnson 6fa863e8f9 Begin wiring up osimage to core 2020-05-07 16:26:27 -04:00
Jarrod Johnson d90e87e153 Fix backup/restore with python3
backup/restore with password
was having problems with python3
2020-05-07 16:22:56 -04:00
Jarrod Johnson b80647a36e Move osimport and tidy up
Tidy up a few issues with
osimage as it gets moved into place.
2020-05-07 14:08:38 -04:00
Jarrod Johnson 2c74cb18b0 Fix stray letter in file 2020-05-07 13:42:10 -04:00
Jarrod Johnson 8fe1cea2ed Quote sed argument 2020-05-07 12:13:44 -04:00
Jarrod Johnson 471f3bd1cf Fix ubuntu profile name
It was erroneously changed by
initprofile.sh
2020-05-07 12:10:27 -04:00
Jarrod Johnson f10bbdc33d Fix ubuntu missing osprofile
osprofile argument needed to
find path to install image.
2020-05-07 11:57:52 -04:00
Jarrod Johnson d6df9db229 Change efi/boot to lowercase
Consitently use lowercase for
efi/boot for easier grub handling.
2020-05-07 11:12:24 -04:00
Jarrod Johnson d5cab22f41 Add boot configuration generation
On osimport prototype, generate
boot media and config file
2020-05-07 11:08:28 -04:00
Jarrod Johnson 72d52c56b7 Fix build problem for osdeploy
addons.cpio was erroneously
stepping on itself.
2020-05-07 09:35:32 -04:00
Jarrod Johnson 4f2d4a7709 Move media content out of subdirectory
This paves the way for a consistent organization of boot
media
and network based boot.
2020-05-07 09:32:11 -04:00
Jarrod Johnson dcdd453112 Delete trailing whitespace 2020-05-07 09:30:31 -04:00
Jarrod Johnson 5a22168657 Touch up profile label for SUSE 2020-05-07 08:57:15 -04:00
Jarrod Johnson e18ca3dd94 Merge branch 'master' into osdeploy 2020-05-07 08:31:50 -04:00
Jarrod Johnson 3e02e8bf85 Fix LEAP media detection
LEAP was incorrectly detected as SLE.
2020-05-06 16:56:35 -04:00
Jarrod Johnson cda0f439d3 Fix name replacement of Red Hat distributions 2020-05-06 15:55:31 -04:00
Jarrod Johnson e4bea785c3 Fix RHEL osimport init script 2020-05-06 15:31:29 -04:00
Jarrod Johnson 404041e226 Bring over disk boot content
This allows construction of remote media and httpboot payloads.
2020-05-06 14:33:45 -04:00
Jarrod Johnson 9180bab761 Example for XCC cert scripting 2020-05-06 14:23:54 -04:00
Jarrod Johnson 6d2918ed45 Extend osimport
Prepare osimport for inclusion in confluent server,
by making it break off intense activity to a subprocess.

Additionally, get it ready to track long running
task in a way that can map to api.

Finally, have it combine osdeploy
stock profiles with image
into install profiles.
2020-05-06 14:22:25 -04:00
Jarrod Johnson dd2dca5837 Add more profile contents
More parts of OS image profiles.
2020-05-06 14:03:53 -04:00
Jarrod Johnson 16b3bc44a0 Fix filename in ubuntu osdeploy 2020-05-05 09:53:03 -04:00
Jarrod Johnson e1e34f9f31 Adjust ubuntu architecture name
x86_64 is the confluent  convention
for 64 bit x86.
2020-05-05 09:26:42 -04:00
Jarrod Johnson e4a4bdf317 Fix clortho mistake
In attempting to correct clortho,
a mistake was made in the printf
formats.
2020-05-04 17:27:22 -04:00
Jarrod Johnson a4f9fdec3d Correctly target profile content in osdeploy build 2020-05-04 15:57:11 -04:00
Jarrod Johnson c3b295a4a2 Fix omitted prefix on variable 2020-05-04 15:55:22 -04:00
Jarrod Johnson 5539a6a1e8 Fix mistakes in the rpm template file 2020-05-04 15:53:29 -04:00
Jarrod Johnson bdd982e2ed Correct incorrect rpm build in osdeploy 2020-05-04 15:51:05 -04:00
Jarrod Johnson 1db9282058 Fix buildrpm script 2020-05-04 15:49:46 -04:00
Jarrod Johnson f7dcabc1ab Add buildrpm script to confluent_osdeploy 2020-05-04 15:47:39 -04:00
Jarrod Johnson efe936a93d Further build process for confluent_osdeploy 2020-05-04 15:45:35 -04:00
Jarrod Johnson 4619c466e5 Further rearrange osdeploy content 2020-05-04 15:25:04 -04:00
Jarrod Johnson 65797abfbb Move ubuntu into the deploy directory
Also get started on a spec file
2020-05-04 13:49:48 -04:00
Jarrod Johnson 2929e18413 Organize SUSE15 content 2020-05-04 12:53:05 -04:00
Jarrod Johnson cae75dbccf Rearrange EL8 content
Sort the samples into appropriate
locations.
2020-05-04 11:15:44 -04:00
Jarrod Johnson de201c9a3b Add clean to makefile
Additionally correct a small mistake
in copernicus.c
2020-05-04 10:39:07 -04:00
Jarrod Johnson f619b5933c Add makefile for compilation
The C utilities are easy enough to build
with a Makefile.
2020-05-04 10:22:59 -04:00
Jarrod Johnson cb1d5ebd13 Move compiled utilities and fix clortho
clortho had a number of compiler
warnings, make it compile cleanly.
2020-05-04 10:22:04 -04:00
Jarrod Johnson bbb4f5a0ec Add Ubuntu media to osimport 2020-05-03 19:18:12 -04:00
Jarrod Johnson 14192a6c21 Disable cloud-init and remove double-console line 2020-05-02 11:55:37 -04:00
Jarrod Johnson 530be7a508 Setup host based authentication in ssh in ubuntu 2020-05-02 10:58:06 -04:00
Jarrod Johnson 00eb72a627 Have ssh_known_hosts ready post install for ubuntu 2020-05-01 22:17:27 -04:00
Jarrod Johnson fa40793dfa Add install disk detection to ubuntu 2020-05-01 22:04:32 -04:00
Jarrod Johnson 3f8d825540 Add hook for installing disk
This will be used by pre.sh and getinstalldisk
to direct the install.
2020-05-01 19:33:47 -04:00
Jarrod Johnson 924102fa32 Add the cloud-init script
Still needs storage section, but surprisingly
not going to use much of this and instead lean
in on the scripts.
2020-05-01 16:47:07 -04:00
Jarrod Johnson f3747025ff Further the ubuntu prototype
Switch to using firstboot mechanism as cloud-init
fights us too hard on ssh keys and root password.
2020-05-01 16:41:01 -04:00
Jarrod Johnson 2ac139934e Add console to ubuntu 2020-05-01 10:10:31 -04:00
Jarrod Johnson b3b68774ab Add prototype ubuntu initrd additions
This sets the stage for Ubuntu deployment
2020-04-30 17:28:40 -04:00
Jarrod Johnson f27e6dfdda Rearrange OS content in a more orderly fashion 2020-04-30 17:27:25 -04:00
Jarrod Johnson 45eba14b10 Add some content from exploring suse15/el8 install 2020-04-28 19:43:47 -04:00
Jarrod Johnson 3437b8b03c Actually write out dhcp conf in initquee
dhcp was not written out during initqueue phase
2020-04-27 16:08:05 -04:00
Jarrod Johnson 68251ffbb8 Fix dhcp mistake in the rhel initqueue
This prevented dhcp from ever being attempted
2020-04-22 16:12:33 -04:00
Jarrod Johnson 051b8259fd Update certutil to update site tls
This puts the certificate in a location
to be picked up by installers,
complete with subject_hash
so that SuSE can easily pull
them in.
2020-04-22 13:33:31 -04:00
Jarrod Johnson d691bcd306 Merge branch 'master' into osdeploy 2020-04-22 09:47:32 -04:00
Jarrod Johnson 36911c0d2e Merge branch 'master' into osdeploy 2020-04-22 09:01:02 -04:00
Jarrod Johnson 59aabb0e69 Fix apikey storage
Adapt to how crypted. values are handled.
2020-04-21 09:01:42 -04:00
Jarrod Johnson 931c7f25d1 Change apikey to crypted
Since it will be crypted, makes sense
for it to be presented same way as rootpassword.
2020-04-21 08:24:01 -04:00
Jarrod Johnson 149e41c33c Add DNS information
Enable setting DNS servers in
the deployment.
2020-04-20 14:27:14 -04:00
Jarrod Johnson 21327af140 Fix typo in the iniqueue script
gateway was not being honored.
2020-04-20 13:05:10 -04:00
Jarrod Johnson c21ae64f06 Fix PXE with static gateway
It was not working when gateway was set.
2020-04-20 12:45:13 -04:00
Jarrod Johnson eb2301b22e Add nodelist to selfservice
This permits a node to get list of nodes,
for example to build shosts.equiv
2020-04-20 11:11:29 -04:00
Jarrod Johnson 06d0e05dbb Set rootfs to have ssh ready
Get the CA and user key into the
right places to use in the target system.
2020-04-20 09:39:36 -04:00
Jarrod Johnson bfac51ba12 Prototype getinstalldisk
This script supersedes the bash script, hopefull
2020-04-17 16:37:04 -04:00
Jarrod Johnson 49a523ca5e Add timezone to deploycfg
This is generally needed to install
an operating system.
2020-04-17 13:21:15 -04:00
Jarrod Johnson 6798e4e848 Increase precision of copernicus time
While it is going to be off by some number of milliseconds,
it's better than being off by 250ms on average.
2020-04-17 12:07:48 -04:00
Jarrod Johnson 690c871d29 Merge branch 'master' into osdeploy 2020-04-17 10:01:55 -04:00
Jarrod Johnson 198b26245b Move hashing before collective
This results in consistent hash
using the initial random, rather
than equivalent, but odd looking
crypted hashes across collective.
2020-04-16 20:51:14 -04:00
Jarrod Johnson 4fb7924015 Fix invalid salts
base64 standard alphabet doesn't
quite map to salt alphabet.  Use
. and / instead.
2020-04-16 20:11:17 -04:00
Jarrod Johnson e4a9216683 Add root password to selfservice
This allows installers to set the
requested root password, or
not.
2020-04-16 17:07:31 -04:00
Jarrod Johnson dc2df09c4e Fix for crypted handling
Crypted attributes were not
handled well, fix the mistakes.
2020-04-16 16:54:59 -04:00
Jarrod Johnson 16667ed41c Add SSH cert to self api
This allows nodes to get a cert from
confluent.
2020-04-16 13:11:05 -04:00
Jarrod Johnson b37c034d6f Also carry in confluent.info
The installer needs this information to continue.
2020-04-16 12:40:35 -04:00
Jarrod Johnson 32038baa75 Carry deploycfg into installer 2020-04-16 12:23:45 -04:00
Jarrod Johnson dcdc8e4d5a Merge branch 'master' into osdeploy 2020-04-16 12:10:03 -04:00
Jarrod Johnson 4e8cc3d801 Carry API key past initramfs
This enables api calls during
the installer.
2020-04-16 11:54:40 -04:00
Jarrod Johnson 86a68bf7f9 Rework CA layout to file-per-CA
Have the deployed system combine
into known_hosts.  This simplifies
potential contention.
2020-04-16 10:08:27 -04:00
Jarrod Johnson 84988031a2 Move sshutil to a more practical place
This makes the keysigning function available to the server.
2020-04-16 09:49:30 -04:00
Jarrod Johnson 211b8ab7e8 Actually print message to serial
When console detected, actually notify
the relevant console.
2020-04-15 18:25:16 -04:00
Jarrod Johnson 23e8642950 Improve autocons
Provide more feedback and have
a proper cmdline style argument
2020-04-15 17:27:52 -04:00
Jarrod Johnson 76f7c12ca5 Incorporate autocons
This should permit skipping
it on kernel command line.
2020-04-15 16:50:33 -04:00
Jarrod Johnson e2aaa2afb4 Support proper readback of crypted
crypted attributes should be
treated about the same as
passwords.
2020-04-15 16:34:54 -04:00
Jarrod Johnson 890793068c Have prepivot stage accounts
Carry forward the ssh key and
disable passwords so that ssh
may safely be enabled during
install.
2020-04-15 16:19:23 -04:00
Jarrod Johnson 09700626b5 Add attribute to store root password
We want a non-recoverable form,
so hard code it to force it that way.
2020-04-15 16:18:39 -04:00
Jarrod Johnson 709ace4c92 Fix CA bundle in install
Once transitioning to install,
the CA bundle was lost, because
the symlink lead out of sysroot.

Fix by prepending sysroot if symlink
2020-04-15 13:30:47 -04:00
Jarrod Johnson 2c1ddabf32 Rename api.* attributes
Gather them into the deployment
category.
2020-04-15 11:50:10 -04:00
Jarrod Johnson 24bc1210d0 Numerous fixes to the OS deploy
Most notably, change to safe_dump for yaml.

For the various initrd items, changes
to actually trigger the relevant bits
of the RH installer.
2020-04-14 16:34:50 -04:00
Jarrod Johnson 276e01434d Remove example output from script 2020-04-10 16:49:14 -04:00
Jarrod Johnson 58fd760698 Implement begins of self api
This paves the way to get deployment started
in earnest.
2020-04-10 16:46:41 -04:00
Jarrod Johnson c76a0cfa16 Merge branch 'master' into osdeploy 2020-04-10 12:12:31 -04:00
Jarrod Johnson 2575e32209 Fix another python3 syntax problem
async can't even be a member of
a class, evidently.
2020-04-10 12:11:45 -04:00
Jarrod Johnson 989ae614c9 Merge branch 'master' into osdeploy 2020-04-10 12:09:41 -04:00
Jarrod Johnson 814209385c Fix another use of async name
For better python 3 compatibility,
stop using async as a variable name.
2020-04-10 12:08:55 -04:00
Jarrod Johnson 3b3475e073 Merge branch 'master' into osdeploy 2020-04-10 11:59:04 -04:00
Jarrod Johnson 331d10140a Fix httpapi with python3
async is now particularly special,
rename variable to fix it
2020-04-10 11:57:59 -04:00
Jarrod Johnson 2bd2946e9f Add time sync option to copernicus
Since we are dealing in TLS certificates,
the easiest thing is to have copernicus sync
time.  It is not as robust as ntp,
but it'll do as a stopgap
until the real time utilities
kick in.
2020-04-10 11:23:12 -04:00
Jarrod Johnson a3f7fc12b5 Include fe80 in cert
fe80 is needed and a valid
thing to assert.
2020-04-10 09:59:53 -04:00
Jarrod Johnson 5fb4f2b36c Add CAs from site to install
Preserve the CA situation into the installer
2020-04-09 16:18:39 -04:00
Jarrod Johnson 3ddeb4bcd0 A basic hook to force network bringup
initqueue must be satisfied by a udev rule.  We don't
know which network until iniqueue phase, but the hook
needs to install earlier.  This change induces
udev rule generation.
2020-04-09 16:14:30 -04:00
Jarrod Johnson 1722ad941b Add a starting sample of initqueue dracut hook
For rhel8, this initqueu hook is useful
2020-04-09 16:13:33 -04:00
Jarrod Johnson d18c0a576d Fix ProxyDHCP reply
Use the memoryview instead
of the bytearray for correct
use.
2020-04-09 09:20:34 -04:00
Jarrod Johnson acda061710 Merge branch 'master' into osdeploy 2020-04-09 08:21:24 -04:00
Jarrod Johnson fdd9c0953c Fix numerous python2 issues
python2 needs tobytes rather
than bytes of a memoryview.
2020-04-08 17:28:29 -04:00
Jarrod Johnson 137e35217b Implement UDP checksum
Properly implement checksum
on ACK.
2020-04-07 17:36:51 -04:00
Jarrod Johnson fe3d9da5aa Have a workable static PXE behavior
All but the checksum is now
functioning.
2020-04-07 17:07:07 -04:00
Jarrod Johnson d76c576b4e Merge branch 'master' into osdeploy 2020-04-07 11:35:03 -04:00
Jarrod Johnson f58b943cfe Fix mistakes in pxe handler
stringify was passed a string, fix
that input.

Fix mispelling of isinstance.
2020-04-06 17:11:23 -04:00
Jarrod Johnson 86628929de Merge branch 'master' into osdeploy 2020-04-06 14:51:01 -04:00
Jarrod Johnson b0a0bad635 Merge branch 'master' into osdeploy 2020-04-03 12:34:05 -04:00
Jarrod Johnson 1cfeed3f9d Merge branch 'master' into osdeploy 2020-04-03 11:02:14 -04:00
Jarrod Johnson 061e12beeb Merge branch 'master' into osdeploy 2020-04-02 11:43:32 -04:00
Jarrod Johnson 323be19f21 Fix typo in the legacy boot support 2020-04-02 11:34:42 -04:00
Jarrod Johnson 0983cacb20 Merge branch 'master' into osdeploy 2020-04-02 11:01:57 -04:00
Jarrod Johnson b3c878462f Integrate attributes into man pages 2020-04-02 11:00:45 -04:00
Jarrod Johnson 8e8e17a34e Merge branch 'master' into osdeploy 2020-04-02 10:26:28 -04:00
Jarrod Johnson e78b4e9f17 Merge branch 'master' into osdeploy 2020-04-02 10:18:11 -04:00
Jarrod Johnson ea537b1a1f Add branch to support legacy
Legacy boot gets into ipxe
through a kkpxe executable.
2020-04-02 09:41:17 -04:00
Jarrod Johnson bc7dc50388 Switch filename for iPXE
This offers the real iPXE script to
ipxe.
2020-04-01 17:19:23 -04:00
Jarrod Johnson 2da5bebf46 Fix iPXE recognition of our offer
iPXE requires that next-server
be set, unlike UEFI firmware
which did not care.
2020-04-01 16:59:43 -04:00
Jarrod Johnson 0fe136d4ee Extend a proxydhcpack
This is one stage of actually
providing download over
PXE.
2020-04-01 16:40:47 -04:00
Jarrod Johnson b573ffa897 Reduce log noise
Stop logging frequently occuring
events that are generally ignored.
2020-04-01 10:33:42 -04:00
Jarrod Johnson 0986853e6e Merge branch 'master' into osdeploy 2020-03-30 10:59:56 -04:00
Jarrod Johnson 96b5d3aa91 Actually populate the file field
Thankfully, it turns out that HTTPBoot carries the same flexibility
as PXE with respect to no-ip answer being merged with an IP answer.

As a bonus, it actually is simpler than PXE, allowing skipping of udp
port 4011.  Of course, we still want to support PXE boot, so that will
need to be implemented.
2020-03-27 16:17:51 -04:00
Jarrod Johnson 6cc0fd20a0 Merge branch 'master' into osdeploy 2020-03-27 12:14:56 -04:00
Jarrod Johnson 85c648925f Merge branch 'master' into osdeploy 2020-03-27 11:05:38 -04:00
Jarrod Johnson 44836cabbe Prepare for http boot
HTTP boot does not seem to support proxy dhcp.
2020-03-27 10:56:38 -04:00
Jarrod Johnson 92e657b987 Fix UDP checksum of odd-length packets
Odd length packets were incorrectly handled, fix
the packet construction.
2020-03-26 16:59:58 -04:00
Jarrod Johnson 16209bc3d6 Merge branch 'master' into osdeploy 2020-03-26 14:11:03 -04:00
Jarrod Johnson 41aa9e1cd2 Optimize chown
chown does not need to be called recursively every update/install.
2020-03-24 18:08:34 -04:00
Jarrod Johnson 0c96882fda Restore Python 3 compatibility for pxe
The changes accidentally broke python 3, make a
bytes explicit to fix.
2020-03-24 17:54:07 -04:00
Jarrod Johnson 00681489c7 Add python2 compatibility to pxe
Various facets of pxe.py were python3-only,
make it compatible with python2 for now.
2020-03-24 17:26:39 -04:00
Jarrod Johnson 8c2336b8fa Implemennt static when no DHCP
This permits an offer for a nominally static
node, unless it either doesn't map to an IP or
has dhcp method explicitly declared.
2020-03-24 15:09:28 -04:00
Jarrod Johnson a1bb603570 Fix multinet support and prefix 2020-03-24 10:31:19 -04:00
Jarrod Johnson 96cbfa5568 Prepare get_nic_config for servicing pxe
Ability to retrieve node network information according to context
of interface index that receives the packet.
2020-03-23 17:18:17 -04:00
Jarrod Johnson f0e5572b05 Remove filename from DHCP reply
filename is ignored if pxeclient anyway.  This will provide a
consistent approach for boot file for dhcp-elsewhere and
fixed ip clients alike.

Also add some TODO about how to enable DHCPREQUEST
processing when the time comes, as today the code skipping
option parsing for DISCOVER packets trips up the ability
to continue.  We must make sure we don't call discovery
handler again for REQUEST after doing so for DISCOVER.
2020-03-20 17:57:04 -04:00
Jarrod Johnson 895216d94f Setting PXEClient in option 60
This trigges the proxyDHCP sequence to follow up.
2020-03-20 17:40:29 -04:00
Jarrod Johnson 1c7c897267 Add option 97 (UUID) to OFFER
Per PXE specification, this is among the required fields.
2020-03-20 17:23:33 -04:00
Jarrod Johnson 20a26e6fdb Implement the UDP checksum
As long as we are doing UDP and IP in house, might as well do the
optional UDP checksum.
2020-03-20 16:55:20 -04:00
Jarrod Johnson 433f67730c Add RAW capability to the service
This is required for the new PXE support
2020-03-20 14:59:30 -04:00
Jarrod Johnson fcd73399fa Add IP and UDP header to OFFER attempt
It d oesn't quite work, but it looks convincing.  UDP checksum may
need to be added, and beyond that explore changes to the payload since
it is likely not enough DHCP was provided.
2020-03-19 18:39:32 -04:00
Jarrod Johnson b7d85b2166 Switch to ctypes for sendto
First, IP level sendto doesn't give the freedom to send 25.255.255.255
out of the interface desired.  So have to go link layer.

Second, while python can do sendto, we have the interface index number
from recvmsg (which was ctypes).  python expects the name instead
(wwhich it promptly turns... back into the index we start with).  I
could have added code to get the name using some syscalls which would
have been work and produced more system calls, or added the code to
directly use sendto, which would also be efficient at runtime.

So I chose to use ctypes for both recvmsg and sendto here.
2020-03-19 16:20:47 -04:00
Jarrod Johnson 22de1153c2 Continue draft of PXE support
It is able to vaguely construct a DHCPOFFER now, though it doesn't go
the right way for starters.
2020-03-18 17:12:26 -04:00
Jarrod Johnson e0223706b0 Add a sample CentOS/RH handler snippet
Begin work to prepare profiles for booting.
2020-03-16 18:03:07 -04:00
Jarrod Johnson 451ff6b5a3 Fix geometry in dir2img
The geometry was incorrect in dir2img, ensure the file is
a multiple of 512 bytes.
2020-03-16 14:47:21 -04:00
Jarrod Johnson b3c49c532c Rewrite dir2img in python
It is a good measure to prep for more heavy usage in
OS deployment.

While changes were being made anyway, also cut time to make
an image in half.
2020-03-16 12:52:18 -04:00
Jarrod Johnson 8fb206b1f7 Fix cert util on pythoen3
python 3 had bytes and not str and need to be
decoded before string operations.
2020-03-16 09:27:34 -04:00
Jarrod Johnson 1bf7c6970f Merge branch 'master' into osdeploy 2020-03-13 11:06:26 -04:00
Jarrod Johnson 6ade0952c7 Workaround incorrect TLS clients
Standards compliant TLS clients require
that IP addresses be compared against
IP type SAN fields.

However, some firmware ignores IP fields and only checks DNS fields.

Workaround and provide compatibility
by duplicating the IP as DNS and IP fields.

Also, clean up the temporary config file when done.
2020-03-12 19:06:05 -04:00
Jarrod Johnson 517101f596 Reduce spurious logging
When ignoring DHCPREQUEST,
do not log, since DISCOVER
was enough logging.
2020-03-12 18:08:48 -04:00
Jarrod Johnson 1bfc949466 Add message when insecure is needed
Practically speaking, this will be only choice for most people, but we
must make sure that the user acknowledges the risk.
2020-03-12 17:42:56 -04:00
Jarrod Johnson e97214ca50 Merge branch 'master' into osdeploy 2020-03-12 16:05:08 -04:00
Jarrod Johnson 57ff9808c4 Fix infinite loop in DHCP parsing
Accidentally failed to actually traverse
the data.
2020-03-11 15:43:34 -04:00
Jarrod Johnson 0f67f5c382 Draft attempt at refactoring PXE
The plan is to have 'discovery'
data only on DISCOVER, but
still parse and be able to react to
REQUEST packets.

Additionally add the attributes
to control deployment state and
permissible protocols.
2020-03-11 15:22:45 -04:00
Jarrod Johnson b789252c9c Merge branch 'master' into osdeploy 2020-03-11 14:00:52 -04:00
Jarrod Johnson d38b06224c Merge branch 'master' into osdeploy 2020-03-11 09:30:18 -04:00
Jarrod Johnson 9ea9188fdf Get closer to replying to PXE
Monitor and maintain a uuid and
mac map to node in preparation for
efficient handling of
DISCOVERs/REQUESTS from
ONIE and/or PXE.
2020-03-10 11:16:59 -04:00
Jarrod Johnson 597393842a Add transaction ID to the carried information
The ability to extend an OFFER requires that we also keep track
of the transaction id.
2020-03-09 15:30:26 -04:00
Jarrod Johnson b9fc9b3c19 Put the recvmsg info into the handler payload
This allows the rest of the discovery infrastructure to operate
with this data.
2020-03-09 15:14:05 -04:00
Jarrod Johnson 49b8e12a01 Update TODO
We have now done IP_PKTINFO, but there is a potential TODO
if wanting to properly honor unicast request.

For now, will just do always-broadcast as the options to do unicast
are more complex to do (either construct the packets or inject neigh
entry manually)
2020-03-09 15:05:19 -04:00
Jarrod Johnson f20fb70336 Have the peer and target info on DHCP receive
This has the data that will be handy in formulating a reply.
2020-03-09 14:39:53 -04:00
Jarrod Johnson 934f8f0f20 Use recvmsg for PXE
Switch to recvmsg in preparation for getting more
data for forming replies.
2020-03-09 11:25:38 -04:00
Jarrod Johnson 945b8f2b4a Rename to reflect more function than CA 2020-03-09 08:52:29 -04:00
Jarrod Johnson 82921fb53d Add function to sign SSH key
This will enable the known_hosts
to work.

shosts.equiv and sshd and ssh client
config will be handled elsewhere.
shosts.equiv will just be everything.
2020-03-06 16:55:06 -05:00
Jarrod Johnson 59a0b00208 Flesh out the SSH code more
Notably add user key management
and start poking things in
/var/lib/confluent
2020-03-06 16:17:53 -05:00
Jarrod Johnson 34f2f6e359 Add a sample for doing SSH CA
This will explore the concept for the
backend of the get certificate api.
2020-03-06 13:43:54 -05:00
Jarrod Johnson 7fe47baab3 Fix another python 3 expectation
python3 needs this stringified from socket that
provides bytes.
2020-03-02 16:42:42 -05:00
Jarrod Johnson 3c1453c16b Actually use the de-lla address
After removing the %, actually use the trimmed address.
2020-03-02 16:23:18 -05:00
Jarrod Johnson 4529924cce Fix credserver python3 and LLA support
Both client and server had an issue with LLA, along with the
usual python3-isms.
2020-03-02 16:06:07 -05:00
Jarrod Johnson 97ddd59dbd Merge branch 'osdeploy' of github.com:jjohnson42/confluent into osdeploy 2020-03-02 14:55:11 -05:00
Jarrod Johnson b7b2522f6b Fix python3 compatibility of ssdp
The ssdp module in osdeploy was not reacting
adequately to copernicus.  fix the assumptions about bytes
versus str.
2020-03-02 14:54:23 -05:00
Jarrod Johnson bd0e187525 Merge branch 'master' into osdeploy 2020-03-02 13:15:22 -05:00
Jarrod Johnson 455b637c48 Merge branch 'master' into osdeploy 2020-03-02 11:30:30 -05:00
Jarrod Johnson e257d526c3 Have ip_on_same_subnet normalize ::ffff: addresses
This will cause the ips to count as equivalent rather than giving up
on them.
2020-02-27 17:03:12 -05:00
Jarrod Johnson a066f061c7 Remove IPv6 portion of IPv4 address
If it is presented as an IPv6 compatible IPv4 address,
make it a normal IP address.
2020-02-27 16:59:32 -05:00
Jarrod Johnson 29b4045817 Omit TRANS.TBL files from osimport
Avoid clutter of TRANS.TBL files while importing an ISO
2020-02-27 16:36:47 -05:00
Jarrod Johnson f798239f90 Switch to using the standard confluent port for credserver
Also add a check and only accept API arming
requests from local ips
2020-02-27 16:36:16 -05:00
Jarrod Johnson f955086cc3 Create an alternative api.armed behavior
Move from a clock based expiration to a simpler 'once' versus
'continous' model.  'once' is intended to be used generally, 'continuous'
for stateless without benefit of TPM.  The goal would be to use TPM
to seal a key to avoid continuous.
2020-02-27 13:33:05 -05:00
Jarrod Johnson cd20a23626 Merge branch 'master' into osdeploy 2020-02-27 07:20:20 -05:00
Jarrod Johnson 54be209f4e Merge branch 'nodesearch' into osdeploy 2020-02-24 16:26:07 -05:00
Jarrod Johnson 114324f513 Add CA to self signed cert constraints
Some applications require this be set for it to work
as an enrolled certificate.  Notably UEFI
requires this.
2020-02-24 15:34:55 -05:00
Jarrod Johnson d2de4ffa14 Fix single file OS image osimport 2020-02-21 14:25:18 -05:00
Jarrod Johnson d4483bb59f Polish up the osimport concept more 2020-02-21 14:18:15 -05:00
Jarrod Johnson 90bec92d1f Fix python3 for os import
Need to be explicit about binary data with python 3.
2020-02-21 09:34:49 -05:00
Jarrod Johnson 4b3541e21d Suppress libarchive logging
libarchive ffi goes crazy logging at *import* time.  Pre-empt
use of the logging with a null handler prior to import.
2020-02-21 08:46:42 -05:00
Jarrod Johnson 737e7a440f Add a prototype for imageimporter
This is a sample of fingerprinting, covering rhel/centos 7/8
and suse enterprise 12/15 and cumulus.

Mainly to run the gamut of detection schemes.

The schemes are for iso images, try to be very careful and adaptive.

Otherwise, go for a quick sum to see if we have a shot and a long checksum to confirm.
2020-02-20 23:24:42 -05:00
Jarrod Johnson 24874bb4be Merge branch 'master' into nodesearch 2020-02-20 20:37:23 -05:00
Jarrod Johnson 45c13a3d46 Merge branch 'master' into nodesearch 2019-10-17 13:46:23 -04:00
Jarrod Johnson a04eea6927 Merge branch 'master' into nodesearch 2019-10-17 09:31:01 -04:00
Jarrod Johnson f46939b7ec Add missing comma to api attributes 2019-10-16 13:50:23 -04:00
Jarrod Johnson 17a8ab3211 Use python3 explicitly for building source
The source distrobution on CentOS7 does not work well
with python2.  Using python3 to build the dist for python2
and python3 fixes issues with extra data being missed in
packaging.
2019-10-16 13:25:21 -04:00
Jarrod Johnson 0fd4c3b2f7 Merge branch 'master' into nodesearch 2019-10-16 13:24:11 -04:00
Jarrod Johnson 829a5b08c1 Merge branch 'master' into nodesearch 2019-09-06 10:09:48 -04:00
Jarrod Johnson aa059c6a4d Amend some formatting 2019-08-12 16:19:35 -04:00
Jarrod Johnson 2e03b662ea Add a credential server implelmentation
This implements the api.armed logic and storing key when
using the clortho credential agent.
2019-08-12 15:31:24 -04:00
Jarrod Johnson 55a0aab548 Add node api key and arming
This is the groundwork for having node authentication.
The intent is for calling code to modify api.armed if
the administrator wants to opt into a one-time set of
credential.

This design as is currently does not fit a stateless
deploy model.  That may suggest an additional manual step
for a fully stateless model.  Alternatively adding support
for credential persistence through sealing to a node's TPM,
which would allow more freely retrievable node credentials.
2019-08-12 15:28:00 -04:00
Jarrod Johnson aaf5aebff7 Fix for tokens with null bytes
Since the server may employ the full range of byte values
in the echo token, use that length and the buffer to avoid
nulls truncating the token.
2019-08-12 15:24:51 -04:00
Jarrod Johnson c1abeaff04 Convert concept to IP based
This leaves the door open for routing if supported.

The server shall restrict IP_TTL to denote
acceptable distance from the manager to accept.
2019-08-09 16:43:48 -04:00
Jarrod Johnson 37d4543d24 Merge branch 'master' into nodesearch 2019-08-08 16:18:21 -04:00
Jarrod Johnson d13e286609 Merge branch 'master' into nodesearch 2019-07-30 14:46:43 -04:00
Jarrod Johnson a7c93627e2 Merge branch 'master' into nodesearch 2019-07-23 08:18:44 -04:00
Jarrod Johnson 6e5cfe69a8 Merge branch 'master' into nodesearch 2019-07-22 09:41:45 -04:00
Jarrod Johnson 626f1c16e2 Merge branch 'nodesearch' of github.com:jjohnson42/confluent into nodesearch 2019-07-19 14:10:13 -04:00
Jarrod Johnson 43480c2e3b Fix nodesensors -n with csv 2019-07-19 14:09:51 -04:00
Jarrod Johnson b91693a973 Merge branch 'master' into nodesearch 2019-07-17 13:05:20 -04:00
Jarrod Johnson da8b4d00d8 Merge branch 'master' into nodesearch 2019-07-16 18:46:52 -04:00
Jarrod Johnson b7b7fd82eb ECHO a packet back to manager
In a later phase, we will want assurances
that the neighbor table was populated.
Since here we have the sockaddr handy,
it makes a lot of sense to take the
opportunity to blind fire a packet back.
No reply is expected, just enough to
trigger arp/neighbor solicitation.
2019-07-16 07:51:24 -04:00
Jarrod Johnson 3789e43f35 Merge branch 'master' into nodesearch 2019-07-16 07:32:00 -04:00
Jarrod Johnson a325dcb423 Merge branch 'nodesearch' of github.com:jjohnson42/confluent into nodesearch 2019-07-15 11:09:29 -04:00
Jarrod Johnson c8d0009dac Avoid copernicus printout of more duplicate data
Separate v4 and v6 results for better chance of success in
dropping duplicate packets.
2019-07-15 11:09:20 -04:00
Jarrod Johnson 79f5dce6dc Implement node search for confluent
This is a viable client to find and get ones node identity.

Node credentials are a separate concern, to be handled later.
2019-07-15 11:09:20 -04:00
Jarrod Johnson 54f36e259f Avoid copernicus printout of more duplicate data
Separate v4 and v6 results for better chance of success in
dropping duplicate packets.
2019-07-15 10:30:36 -04:00
Jarrod Johnson acf67a6c81 Implement node search for confluent
This is a viable client to find and get ones node identity.

Node credentials are a separate concern, to be handled later.
2019-07-12 17:04:14 -04:00
260 changed files with 15320 additions and 1033 deletions
+3
View File
@@ -1,4 +1,7 @@
*.pyc
.*.
confluent_client/man/man*
.vscode
.*.sw*
.sw*
.idea/*
+6 -3
View File
@@ -88,15 +88,18 @@ while fullline:
for line in fullline.split('\n'):
if not line:
continue
if ': ' not in line:
if ':' not in line:
line = 'UNKNOWN: ' + line
if options.log:
node, output = line.split(': ', 1)
node, output = line.split(':', 1)
output = output.lstrip()
currlog = options.log.format(node=node, nodename=node)
with open(currlog, mode='a') as log:
log.write(output + '\n')
continue
grouped.add_line(*line.split(': ', 1))
node, output = line.split(':', 1)
output = output.lstrip()
grouped.add_line(node, output)
if options.watch:
if not holdoff:
holdoff = os.times()[4] + 0.250
+108 -82
View File
@@ -292,6 +292,8 @@ def rcompleter(text, state):
def parse_command(command):
if isinstance(command, list):
return command
try:
args = shlex.split(command, posix=True)
except ValueError as ve:
@@ -371,7 +373,7 @@ def do_command(command, server):
if argv[0] == 'exit':
if os.environ.get('TERM', '') not in ('linux'):
sys.stdout.write('\x1b]0;\x07')
raise Bailout()
raise BailOut()
elif argv[0] in ('help', '?'):
return print_help()
elif argv[0] == 'cd':
@@ -661,6 +663,28 @@ def get_session_node(shellargs):
return None
def run_inline_command(path, arg, completion, **kwargs):
tlvdata.send(session.connection, {'operation': 'pause',
'path': currconsole})
buffdata = ''
while select.select((session.connection,), (), (), 0)[0]:
buffdata += consume_termdata(session.connection, bufferonly=True)
rc = session.simple_noderange_command(consolename, path, arg, **kwargs)
tlvdata.send(session.connection, {'operation': 'resume',
'path': currconsole})
sys.stdout.write(completion)
sys.stdout.flush()
if buffdata:
try:
sys.stdout.write(buffdata)
except UnicodeEncodeError:
sys.stdout.buffer.write(buffdata.encode('utf8'))
except IOError: # Some times circumstances are bad
# resort to byte at a time...
for d in buffdata:
sys.stdout.write(d)
return rc
def conserver_command(filehandle, localcommand):
# x - conserver has that as 'show baud', I am inclined to replace that with
# 'request exclusive'
@@ -696,13 +720,13 @@ def conserver_command(filehandle, localcommand):
localcommand = get_command_bytes(filehandle, localcommand, cmdlen)
if localcommand[1] == 'o': # off
print("powering off...")
session.simple_noderange_command(consolename, '/power/state', 'off')
print("complete]\r")
sys.stdout.write("powering off...")
sys.stdout.flush()
run_inline_command('/power/state', 'off', 'complete]')
elif localcommand[1] == 's': # shutdown
print("shutting down...")
session.simple_noderange_command(consolename, '/power/state', 'shutdown')
print("complete]\r")
sys.stdout.write("shutting down...")
sys.stdout.flush()
run_inline_command('/power/state', 'shutdown', 'complete]')
elif localcommand[1] == 'b': # boot
cmdlen += 1
localcommand = get_command_bytes(filehandle, localcommand, cmdlen)
@@ -713,59 +737,46 @@ def conserver_command(filehandle, localcommand):
bootmode = 'uefi'
bootdev = 'setup'
rc = session.simple_noderange_command(consolename, '/boot/nextdevice', bootdev, bootmode=bootmode)
rc = run_inline_command('/boot/nextdevice', bootdev, '', bootmode=bootmode)
if rc:
print("Error]\r")
else:
rc = session.simple_noderange_command(consolename, '/power/state', 'boot')
rc = run_inline_command('/power/state', 'boot', 'complete]')
if rc:
print("Error]\r")
else:
print("complete]\r")
print("Error]")
elif localcommand[2] == 'n': # boot to network
print("booting to network...")
sys.stdout.write("booting to network...")
sys.stdout.flush()
bootmode = 'uefi'
bootdev = 'network'
rc = session.simple_noderange_command(consolename, '/boot/nextdevice', bootdev, bootmode=bootmode)
rc = run_inline_command('/boot/nextdevice', bootdev, '', bootmode=bootmode)
if rc:
print("Error]\r")
else:
rc = session.simple_noderange_command(consolename, '/power/state', 'boot')
rc = run_inline_command('/power/state', 'boot', 'complete]')
if rc:
print("Error]\r")
else:
print("complete]\r")
elif localcommand[2] == '\x0d': # boot to default
print("booting to default...")
bootmode = 'uefi'
bootdev = 'default'
rc = session.simple_noderange_command(consolename, '/boot/nextdevice', bootdev, bootmode=bootmode)
rc = run_inline_command('/boot/nextdevice', bootdev, '', bootmode=bootmode)
if rc:
print("Error]\r")
else:
rc = session.simple_noderange_command(consolename, '/power/state', 'boot')
rc = run_inline_command('/power/state', 'boot', 'complete]')
if rc:
print("Error]\r")
else:
print("complete]\r")
else:
print("Unknown boot state.]\r")
else:
print("Unknown power state.]\r")
check_power_state()
elif localcommand[0] == 'r':
sys.stdout.write('\x1b7\x1b[999;999H\x1b[6n')
@@ -912,8 +923,7 @@ def main():
do_command("start /nodes/%s/console/session" % session_node, netserver)
doexit = True
elif shellargs:
command = " ".join(shellargs)
do_command(command, netserver)
do_command(shellargs, netserver)
quitconfetty(fullexit=True, fixterm=False)
powerstate = None
@@ -928,57 +938,7 @@ def main():
rdylist = ()
for fh in rdylist:
if fh == session.connection:
# this only should get called in the
# case of a console session
# each command should slurp up all relevant
# recv potential
#fh.read()
try:
data = tlvdata.recv(fh)
except Exception:
data = None
if type(data) == dict:
updatestatus(data)
continue
if data is not None:
data = client.stringify(data)
if clearpowermessage:
sys.stdout.write("\x1b[2J\x1b[;H")
clearpowermessage = False
try:
sys.stdout.write(data)
except IOError: # Some times circumstances are bad
# resort to byte at a time...
for d in data:
sys.stdout.write(d)
now = time.time()
if ('showtime' not in laststate or
(now // 60) != laststate['showtime'] // 60):
# don't bother churning if minute does not change
laststate['showtime'] = now
updatestatus()
sys.stdout.flush()
else:
deadline = 5
connected = False
while not connected and deadline > 0:
try:
server_connect()
connected = True
except Exception:
pass
if not connected:
time.sleep(1)
deadline -=1
if connected:
do_command(
"start /nodes/%s/console/session skipreplay=True" % consolename,
netserver)
else:
doexit = True
inconsole = False
sys.stdout.write("\r\n[remote disconnected]\r\n")
break
consume_termdata(fh)
else:
try:
myinput = fh.read()
@@ -1004,6 +964,64 @@ def main():
sys.stdout.write('Lost connection to server')
quitconfetty(fullexit=True)
def consume_termdata(fh, bufferonly=False):
global clearpowermessage
try:
data = tlvdata.recv(fh)
except Exception:
data = None
if type(data) == dict:
updatestatus(data)
return
if data is not None:
data = client.stringify(data)
if clearpowermessage:
sys.stdout.write("\x1b[2J\x1b[;H")
clearpowermessage = False
if bufferonly:
return data
try:
sys.stdout.write(data)
except UnicodeEncodeError:
sys.stdout.buffer.write(data.encode('utf8'))
except IOError: # Some times circumstances are bad
# resort to byte at a time...
for d in data:
sys.stdout.write(d)
now = time.time()
if ('showtime' not in laststate or
(now // 60) != laststate['showtime'] // 60):
# don't bother churning if minute does not change
laststate['showtime'] = now
updatestatus()
try:
sys.stdout.flush()
except Exception:
# EWOULDBLOCK causes this to raise, ignore
# this scenario comfortable that it
# will come out soon enough
pass
else:
deadline = 5
connected = False
while not connected and deadline > 0:
try:
server_connect()
connected = True
except Exception:
pass
if not connected:
time.sleep(1)
deadline -=1
if connected:
do_command(
"start /nodes/%s/console/session skipreplay=True" % consolename,
netserver)
else:
doexit = True
inconsole = False
sys.stdout.write("\r\n[remote disconnected]\r\n")
if __name__ == '__main__':
errcode = 0
deadline = 0
@@ -1013,6 +1031,14 @@ if __name__ == '__main__':
main()
except BailOut as e:
errcode = e.errorcode
except Exception as e:
import traceback
excinfo = traceback.print_exc()
try:
quitconfetty()
except Exception:
pass
print(excinfo)
finally:
if deadline and os.times()[4] < deadline:
sys.stderr.write('[Exited early, hit enter to continue]')
+58 -16
View File
@@ -1,19 +1,61 @@
#!/bin/sh
#!/usr/bin/python
# This will take a given directory and make a 'big floppy image'
# out of it, suitable for nodemedia upload.
if [ -z "$1" -o -z "$2" ]; then
echo "Usage: $0 <directory> <imagefile>"
exit 1
fi
# Get the needed payload side
SIZE=$(du -sB 512 $1|awk '{print $1}')
ENTRIES=$(find $1 |wc -l)
# Also, each file and directory has overhead, pad size by 32kb per file,
# which should be overkill but other values proved to be inadequate
# A deeper understanding of VFAT would probably allow for more precise value
SIZE=$((SIZE + ENTRIES * 64))
dd if=/dev/zero of=$2 bs=512 count=$SIZE
# Make a big single sided floppy with many many tracks, saves on complex math
mformat -i $2 -d 1 -t $SIZE -s 1 -h 1 ::
mcopy -i $2 -s $1/* ::
import fcntl
import glob
import os
import subprocess
import sys
def create_image(directory, image, label=None):
ents = 0
datasz = 512
for dir in os.walk(sys.argv[1]):
ents += 1
for filen in dir[2]:
ents += 1
filename = os.path.join(dir[0], filen)
currsz = os.path.getsize(filename)
# assuming up to 65k cluster
currsz = (currsz // 512 +1) * 512
datasz += currsz
datasz += ents * 32768
datasz = datasz // 512 + 1
with open(image, 'wb') as imgfile:
imgfile.seek(datasz * 512 - 1)
imgfile.write(b'\x00')
if label:
subprocess.check_call(['mformat', '-i', image, '-v', label,
'-r', '16', '-d', '1', '-t', str(datasz),
'-s', '1','-h', '1', '::'])
else:
subprocess.check_call(['mformat', '-i', image, '-r', '16', '-d', '1', '-t',
str(datasz), '-s', '1','-h', '1', '::'])
# Some clustered filesystems will have the lock from mformat
# linger after close (mformat doesn't unlock)
# do a blocking wait for shared lock and then explicitly
# unlock between calls to mtools
with open(image, 'rb') as imgfile:
fcntl.flock(imgfile.fileno(), fcntl.LOCK_SH)
fcntl.flock(imgfile.fileno(), fcntl.LOCK_UN)
cpycmd = ['mcopy', '-i', image, '-s']
cpycmd.extend(glob.glob('{0}/*'.format(directory)))
cpycmd.append('::')
subprocess.check_call(cpycmd)
# though not necessary for us, make sure dir2img doesn't have a lingering
# flock from mcopy for any subsequent commands
with open(image, 'rb') as imgfile:
fcntl.flock(imgfile.fileno(), fcntl.LOCK_SH)
fcntl.flock(imgfile.fileno(), fcntl.LOCK_UN)
if __name__ == '__main__':
if len(sys.argv) < 3:
sys.stderr.write("Usage: {0} <directory> <imagefile>".format(
sys.argv[0]))
sys.exit(1)
label = None
if len(sys.argv) > 3:
label = sys.argv[3]
create_image(sys.argv[1], sys.argv[2], label)
+2 -2
View File
@@ -47,14 +47,14 @@ exitcode = 0
errorNodes = set([])
session.stop_if_noderange_over(noderange, options.maxnodes)
success = session.simple_noderange_command(noderange, 'configuration/management_controller/reset', 'reset', key='state', errnodes=errorNodes) # = 0 if successful
if success != 0:
sys.exit(success)
# Determine which nodes were successful and print them
allNodes = set([])
for node in session.read('/noderange/{0}/nodes/'.format(noderange)):
if 'error' in node and success != 0:
sys.exit(success)
allNodes.add(node['item']['href'].replace("/", ""))
goodNodes = allNodes - errorNodes
+12 -7
View File
@@ -134,9 +134,10 @@ def _assign_value():
assignment[key] = value
def parse_config_line(arguments):
def parse_config_line(arguments, single=False):
global setmode, printallbmc, forceset, key, value, needval, candidate, path, attrib
for param in arguments:
for pidx in range(0, len(arguments)):
param = arguments[pidx]
if param == 'show':
continue # forgive muscle memory of pasu users
if param == 'set':
@@ -146,14 +147,19 @@ def parse_config_line(arguments):
if needval:
key = needval
needval = None
value = param
if single:
value = ' '.join(arguments[pidx:])
_assign_value()
break
else:
value = param
_assign_value()
continue
if '=' in param or param[-1] == ':' or forceset:
if setmode is None:
setmode = True
if setmode != True:
bailout('Cannot do set and query in same command')
bailout('Cannot do set and query in same command: Query detected but "{0}" appears to be set'.format(param))
if '=' in param:
key, _, value = param.partition('=')
_assign_value()
@@ -165,7 +171,7 @@ def parse_config_line(arguments):
if setmode is None:
setmode = False
if setmode != False:
bailout('Cannot do set and query in same command')
bailout('Cannot do set and query in same command: Set mode detected but "{0}" appears to be a query'.format(param))
if '.' not in param:
if param == 'bmc':
printallbmc = True
@@ -215,7 +221,7 @@ if options.batch:
pass
argset = argset.strip()
if argset:
parse_config_line(shlex.split(argset))
parse_config_line(shlex.split(argset), single=True)
argset = argfile.readline()
else:
parse_config_line(args[1:])
@@ -272,7 +278,6 @@ if setmode:
rcode |= client.printerror(fr)
for node in fr.get('databynode', []):
r = fr['databynode'][node]
rcode |= client.printerror(r, node)
if 'value' not in r:
continue
keyval = r['value']
+141
View File
@@ -0,0 +1,141 @@
#!/usr/bin/python3
import argparse
import os
import sys
path = os.path.dirname(os.path.realpath(__file__))
path = os.path.realpath(os.path.join(path, '..', 'lib', 'python'))
if path.startswith('/opt'):
sys.path.append(path)
import confluent.client as client
import confluent.sortutil as sortutil
def cleararm(nr, cli):
nodes = set([])
for rsp in cli.read('/noderange/{0}/attributes/current'.format(nr)):
for node in rsp.get('databynode', {}):
nodeinfo = rsp['databynode'][node]
for attr in nodeinfo:
if attr == 'deployment.apiarmed':
curr = nodeinfo[attr].get('value', '')
if curr == 'continuous':
nodes.add(node)
noderange = nr
if nodes:
noderange += ',-({0})'.format(','.join(nodes))
for rsp in cli.update('/noderange/{0}/attributes/current'.format(noderange),
{'deployment.apiarmed': ''}):
pass
def armonce(nr, cli):
nodes = set([])
for rsp in cli.read('/noderange/{0}/attributes/current'.format(nr)):
for node in rsp.get('databynode', {}):
nodeinfo = rsp['databynode'][node]
for attr in nodeinfo:
if attr == 'deployment.apiarmed':
curr = nodeinfo[attr].get('value', '')
if curr == 'continuous':
nodes.add(node)
noderange = nr
if nodes:
noderange += ',-({0})'.format(','.join(nodes))
for rsp in cli.update('/noderange/{0}/attributes/current'.format(noderange),
{'deployment.apiarmed': 'once'}):
pass
def setpending(nr, profile, cli):
args = {'deployment.pendingprofile': profile}
if not profile.startswith('genesis-'):
args['deployment.stagedprofile'] = ''
args['deployment.profile'] = ''
for rsp in cli.update('/noderange/{0}/attributes/current'.format(nr),
args):
pass
def clearpending(nr, cli):
for rsp in cli.update('/noderange/{0}/attributes/current'.format(nr),
{'deployment.pendingprofile': ''}):
pass
def main(args):
ap = argparse.ArgumentParser(description='Deploy OS to nodes')
ap.add_argument('-c', '--clear', help='Clear any pending deployment action', action='store_true')
ap.add_argument('-n', '--network', help='Initiate deployment over PXE/HTTP', action='store_true')
ap.add_argument('-p', '--prepareonly', help='Prepare only, skip any interaction with a BMC associated with this deployment action', action='store_true')
ap.add_argument('-m', '--maxnodes', help='Specifiy a maximum nodes to be deployed')
ap.add_argument('noderange', help='Set of nodes to deploy')
ap.add_argument('profile', nargs='?', help='Profile name to deploy')
args, extra = ap.parse_known_args(args)
if args.profile is None and len(extra) == 1:
args.profile = extra[0]
extra = extra[1:]
if args.profile and not args.network:
sys.stderr.write('-n is a required argument currently to perform an install, optionally with -p\n')
return 1
if not args.profile and args.network:
sys.stderr.write('Both noderange and a profile name are required arguments to request a network deployment\n')
return 1
if extra:
sys.stderr.write('Unrecognized arguments: ' + repr(extra) + '\n')
c = client.Command()
c.stop_if_noderange_over(args.noderange, args.maxnodes)
if args.clear:
cleararm(args.noderange, c)
clearpending(args.noderange, c)
elif args.profile:
armonce(args.noderange, c)
setpending(args.noderange, args.profile, c)
else:
databynode = {}
for r in c.read('/noderange/{0}/attributes/current'.format(args.noderange)):
dbn = r.get('databynode', {})
for node in dbn:
if node not in databynode:
databynode[node] = {}
for attr in dbn[node]:
if attr in ('deployment.pendingprofile', 'deployment.apiarmed', 'deployment.stagedprofile', 'deployment.profile'):
databynode[node][attr] = dbn[node][attr].get('value', '')
for node in sortutil.natural_sort(databynode):
profile = databynode[node].get('deployment.pendingprofile', '')
if profile:
profile = 'pending: {}'.format(profile)
else:
profile = databynode[node].get('deployment.stagedprofile', '')
if profile:
profile = 'staged: {}'.format(profile)
else:
profile = databynode[node].get('deployment.profile', '')
if profile:
profile = 'completed: {}'.format(profile)
else:
profile= 'No profile pending or applied'
armed = databynode[node].get('deployment.apiarmed', '')
if armed in ('once', 'continuous'):
armed = ' (node authentication armed)'
else:
armed = ''
print('{0}: {1}{2}'.format(node, profile, armed))
sys.exit(0)
errnodes = set([])
if args.network and not args.prepareonly:
rc = c.simple_noderange_command(args.noderange, '/boot/nextdevice', 'network',
bootmode='uefi',
persistent=False,
errnodes=errnodes)
if errnodes:
sys.stderr.write(
'Unable to set boot device for following nodes: {0}\n'.format(
','.join(errnodes)))
return 1
rc |= c.simple_noderange_command(args.noderange, '/power/state', 'boot')
return rc
return 0
if __name__ == '__main__':
sys.exit(main(sys.argv[1:]))
+17 -1
View File
@@ -34,6 +34,7 @@ defcolumns = ['Node', 'Model', 'Serial', 'UUID', 'Mac Address', 'Type',
columnmapping = {
'Node': 'nodename',
'Model': 'modelnumber',
'Model Name': 'modelname',
'Serial': 'serialnumber',
'UUID': 'uuid',
'Type': 'types',
@@ -148,6 +149,7 @@ unique_fields = frozenset(['serial', 'mac', 'uuid'])
def import_csv(options, session):
nodedata = []
unique_data = {}
exitcode = 0
with open(options.importfile, 'r') as datasrc:
records = csv.reader(datasrc)
fields = process_header(next(records))
@@ -188,6 +190,7 @@ def import_csv(options, session):
for res in session.create('/nodes/', datum):
if 'error' in res:
sys.stderr.write(res['error'] + '\n')
exitcode |= res.get('errorcode', 1)
continue
elif 'created' in res:
print('Defined ' + res['created'])
@@ -198,11 +201,14 @@ def import_csv(options, session):
{'node': nodename}):
if 'error' in res:
sys.stderr.write(res['error'] + '\n')
exitcode |= res.get('errorcode', 1)
continue
elif 'assigned' in res:
print('Discovered ' + res['assigned'])
else:
print(repr(res))
if exitcode:
sys.exit(exitcode)
def list_discovery(options, session):
@@ -263,7 +269,11 @@ def list_matching_macs(options, session, node=None, checknode=True):
return [options.mac.replace(':', '-')]
else:
path += 'by-mac/'
return [x['item']['href'] for x in session.read(path)]
ret = []
for x in session.read(path):
if 'item' in x and 'href' in x['item']:
ret.append(x['item']['href'])
return ret
def assign_discovery(options, session, needid=True):
abort = False
@@ -287,12 +297,18 @@ def assign_discovery(options, session, needid=True):
if not matches:
sys.stderr.write("No matching discovery candidates found\n")
sys.exit(1)
exitcode = 0
for res in session.update('/discovery/by-mac/{0}'.format(matches[0]),
{'node': options.node}):
if 'assigned' in res:
print('Assigned: {0}'.format(res['assigned']))
elif 'error' in res:
sys.stderr.write('Error: {0}\n'.format(res['error']))
exitcode |= res.get('errorcode', 1)
else:
print(repr(res))
if exitcode:
sys.exit(exitcode)
def blocking_scan(session):
list(session.update('/discovery/rescan', {'rescan': 'start'}))
+6 -1
View File
@@ -109,6 +109,12 @@ def update_firmware(session, filename):
if options.backup:
upargs['bank'] = 'backup'
noderrs = {}
if session.unixdomain:
of = open(filename, 'rb')
try:
session.add_file(filename, of.fileno(), 'rb')
except Exception:
pass
for res in session.create(resource, upargs):
if 'created' not in res:
for nodename in res.get('databynode', ()):
@@ -149,7 +155,6 @@ def show_firmware(session):
if 'databynode' not in res:
continue
for node in res['databynode']:
exitcode |= client.printerror(res['databynode'][node], node)
if 'firmware' not in res['databynode'][node]:
continue
for inv in res['databynode'][node]['firmware']:
+1
View File
@@ -50,6 +50,7 @@ codemappings = {
'warning': 1,
'critical': 2,
'failed': 2,
'unknown': 2,
}
def main():
+6
View File
@@ -69,6 +69,12 @@ def install_license(session, filename):
'management_controller/licenses/'.format(noderange)
filename = os.path.abspath(filename)
instargs = {'filename': filename}
if session.unixdomain:
of = open(filename, 'rb')
try:
session.add_file(filename, of.fileno(), 'rb')
except Exception:
pass
for res in session.create(resource, instargs):
for node in res.get('databynode', []):
if 'error' in res['databynode'][node]:
+8
View File
@@ -111,6 +111,12 @@ def upload_media(noderange, media):
resource = '/noderange/{0}/media/uploads/'.format(noderange)
upargs = {'filename': filename}
noderrs = {}
if session.unixdomain:
of = open(filename, 'rb')
try:
session.add_file(filename, of.fileno(), 'rb')
except Exception:
pass
nodeurls = {}
for res in session.create(resource, upargs):
if 'created' not in res:
@@ -187,5 +193,7 @@ def main():
argparser.print_help()
sys.exit(1)
handler(noderange, media)
if __name__ == '__main__':
main()
sys.exit(exitcode)
+8 -1
View File
@@ -32,6 +32,13 @@ path = os.path.realpath(os.path.join(path, '..', 'lib', 'python'))
if path.startswith('/opt'):
sys.path.append(path)
class hybridcsv(csv.excel):
lineterminator = '\n'
csv.register_dialect('hybrid', hybridcsv)
import confluent.client as client
sensorcollections = {
@@ -209,7 +216,7 @@ def main():
headernames.append(headername)
if options.csv:
linebyline = False
csvwriter = csv.writer(sys.stdout)
csvwriter = csv.writer(sys.stdout, dialect='hybrid')
if options.interval:
csvwriter.writerow(['time', 'node'] + headernames)
else:
+1 -1
View File
@@ -32,7 +32,7 @@ if path.startswith('/opt'):
import confluent.client as client
argparser = optparse.OptionParser(
usage='Usage: %prog [options] noderange [default|cd|network|setup|hd]')
usage='Usage: %prog [options] noderange [default|cd|network|setup|hd|usb|floppy]')
argparser.add_option('-b', '--bios', dest='biosmode',
action='store_true', default=False,
help='Request BIOS style boot (rather than UEFI)')
+19 -3
View File
@@ -48,10 +48,12 @@ def run():
help='Do not prefix output with node names')
argparser.add_option('-p', '--port', type='int', default=0,
help='Specify a custom port for ssh')
argparser.add_option('-s', '--substitutename',
help='Use a different name other than the nodename for ssh')
argparser.add_option('-m', '--maxnodes', type='int',
help='Specify a maximum number of '
'nodes to run remote ssh command to, '
'prompting if over the threshold')
'prompting if over the threshold')
# among other things, FD_SETSIZE limits. Besides, spawning too many
# processes can be unkind for the unaware on memory pressure and such...
argparser.disable_interspersed_args()
@@ -71,6 +73,19 @@ def run():
exitcode = 0
c.stop_if_noderange_over(args[0], options.maxnodes)
nodemap = {}
if options.substitutename:
subname = options.substitutename
if '{' not in subname:
subname = '{node}' + subname
for exp in c.create('/noderange/{0}/attributes/expression'.format(args[0]),
{'expression': subname}):
if 'error' in exp:
sys.stderr.write(exp['error'] + '\n')
exitcode |= exp.get('errorcode', 1)
ex = exp.get('databynode', ())
for node in ex:
nodemap[node] = ex[node]['value']
for exp in c.create('/noderange/{0}/attributes/expression'.format(args[0]),
{'expression': cmdstr}):
if 'error' in exp:
@@ -79,12 +94,13 @@ def run():
ex = exp.get('databynode', ())
for node in ex:
cmd = ex[node]['value']
sshnode = nodemap.get(node, node)
if not isinstance(cmd, str) and not isinstance(cmd, bytes):
cmd = cmd.encode('utf-8')
if options.port:
cmdv = ['ssh', '-p', '{0}'.format(options.port), node, cmd]
cmdv = ['ssh', '-p', '{0}'.format(options.port), sshnode, cmd]
else:
cmdv = ['ssh', node, cmd]
cmdv = ['ssh', sshnode, cmd]
if currprocs < concurrentprocs:
currprocs += 1
run_cmdv(node, cmdv, all, pipedesc)
+1 -1
View File
@@ -186,7 +186,7 @@ funmap = {
def main():
argparser = OptParser(
usage='Usage: %prog <noderange> [show|create|delete|diskset]',
usage='Usage: %prog <noderange> [show|create|delete|diskset] [hotspare|jbod|unconfigured] [options]',
epilog='',
)
argparser.add_option('-r', '--raidlevel', type='int',
+1 -1
View File
@@ -116,7 +116,7 @@ class OptParser(optparse.OptionParser):
def main():
argparser = OptParser(
usage="Usage: %prog <noderange> servicedata "
"<filename>",
"<directory or filename>",
epilog='\nservicedata will save service data to the given '
'directory. It is saved to the location on the relevant '
'management server (the confluent server if running remote, '
+10 -4
View File
@@ -22,17 +22,23 @@ import io
import numpy as np
import os
import sixel
import subprocess
import sys
class DumbWriter(sixel.SixelWriter):
def restore_position(self, output):
return
try:
import sixel
class DumbWriter(sixel.SixelWriter):
def restore_position(self, output):
return
except ImportError:
pass
def plot(gui, output, plotdata, bins):
import matplotlib as mpl
if gui and mpl.get_backend() == 'agg':
sys.stderr.write('Error: No GUI backend available and -g specified!\n')
if not gui:
mpl.use('Agg')
import matplotlib.pyplot as plt
+62 -13
View File
@@ -36,7 +36,9 @@ SO_PASSCRED = 16
_attraliases = {
'bmc': 'hardwaremanagement.manager',
'bmcuser': 'secret.hardwaremanagementuser',
'switchuser': 'secret.hardwaremanagementuser',
'bmcpass': 'secret.hardwaremanagementpassword',
'switchpass': 'secret.hardwaremanagementpassword',
}
try:
@@ -44,6 +46,13 @@ try:
except NameError:
pass
class NestedDict(dict):
def __missing__(self, key):
value = self[key] = type(self)()
return value
def stringify(instr):
# Normalize unicode and bytes to 'str', correcting for
# current python version
@@ -109,6 +118,12 @@ def printerror(res, node=None):
exitcode = 0
if 'errorcode' in res:
exitcode = res['errorcode']
for node in res.get('databynode', {}):
exitcode = res['databynode'][node].get('errorcode', exitcode)
if 'error' in res['databynode'][node]:
sys.stderr.write('{0}: {1}\n'.format(node, res['databynode'][node]['error']))
if exitcode == 0:
exitcode = 1
if 'error' in res:
if node:
sys.stderr.write('{0}: {1}\n'.format(node, res['error']))
@@ -146,6 +161,7 @@ class Command(object):
self._prevkeyname = None
self.connection = None
self._currnoderange = None
self.unixdomain = False
if server is None:
if 'CONFLUENT_HOST' in os.environ:
self.serverloc = os.environ['CONFLUENT_HOST']
@@ -155,11 +171,13 @@ class Command(object):
self.serverloc = server
if os.path.isabs(self.serverloc) and os.path.exists(self.serverloc):
self._connect_unix()
self.unixdomain = True
elif self.serverloc == '/var/run/confluent/api.sock':
raise Exception('Confluent service is not available')
else:
self._connect_tls()
tlvdata.recv(self.connection)
self.protversion = int(tlvdata.recv(self.connection).split(
b'--')[1].strip()[1:])
authdata = tlvdata.recv(self.connection)
if authdata['authpassed'] == 1:
self.authenticated = True
@@ -170,6 +188,13 @@ class Command(object):
passphrase = os.environ['CONFLUENT_PASSPHRASE']
self.authenticate(username, passphrase)
def add_file(self, name, handle, mode):
if self.protversion < 3:
raise Exception('Not supported with connected confluent server')
if not self.unixdomain:
raise Exception('Can only add a file to a unix domain connection')
tlvdata.send(self.connection, {'filename': name, 'mode': mode}, handle)
def authenticate(self, username, password):
tlvdata.send(self.connection,
{'username': username, 'password': password})
@@ -409,7 +434,7 @@ def send_request(operation, path, server, parameters=None):
result = tlvdata.recv(server)
def attrrequested(attr, attrlist, seenattributes):
def attrrequested(attr, attrlist, seenattributes, node=None):
for candidate in attrlist:
truename = candidate
if candidate.startswith('hm'):
@@ -417,10 +442,16 @@ def attrrequested(attr, attrlist, seenattributes):
if candidate in _attraliases:
candidate = _attraliases[candidate]
if fnmatch.fnmatch(attr.lower(), candidate.lower()):
seenattributes.add(truename)
if node is None:
seenattributes.add(truename)
else:
seenattributes[node][truename] = True
return True
elif attr.lower().startswith(candidate.lower() + '.'):
seenattributes.add(truename)
if node is None:
seenattributes.add(truename)
else:
seenattributes[node][truename] = 1
return True
return False
@@ -436,13 +467,15 @@ def _sort_attrib(k):
def print_attrib_path(path, session, requestargs, options, rename=None, attrprefix=None):
exitcode = 0
seenattributes = set([])
seenattributes = NestedDict()
allnodes = set([])
for res in session.read(path):
if 'error' in res:
sys.stderr.write(res['error'] + '\n')
exitcode = 1
continue
for node in sorted(res['databynode']):
allnodes.add(node)
for attr, val in sorted(res['databynode'][node].items(), key=_sort_attrib):
if attr == 'error':
sys.stderr.write('{0}: Error: {1}\n'.format(node, val))
@@ -450,7 +483,7 @@ def print_attrib_path(path, session, requestargs, options, rename=None, attrpref
if attr == 'errorcode':
exitcode |= val
continue
seenattributes.add(attr)
seenattributes[node][attr] = True
if rename:
printattr = rename.get(attr, attr)
else:
@@ -458,14 +491,14 @@ def print_attrib_path(path, session, requestargs, options, rename=None, attrpref
if attrprefix:
printattr = attrprefix + printattr
currattr = res['databynode'][node][attr]
if show_attr(attr, requestargs, seenattributes, options):
if show_attr(attr, requestargs, seenattributes, options, node):
if 'value' in currattr:
if currattr['value'] is not None:
val = currattr['value']
if isinstance(val, list):
val = ','.join(val)
attrout = '{0}: {1}: {2}'.format(
node, printattr, val)
node, printattr, val).strip()
else:
attrout = '{0}: {1}:'.format(node, printattr)
elif 'isset' in currattr:
@@ -539,23 +572,39 @@ def print_attrib_path(path, session, requestargs, options, rename=None, attrpref
except TypeError:
pass
cprint(attrout)
somematched = set([])
printmissing = set([])
badnodes = NestedDict()
if not exitcode:
if requestargs:
for attr in requestargs:
if attr not in seenattributes:
sys.stderr.write('Error: {0} not a valid attribute\n'.format(attr))
exitcode = 1
for node in allnodes:
if attr in seenattributes[node]:
somematched.add(attr)
else:
badnodes[node][attr] = True
exitcode = 1
for node in sortutil.natural_sort(badnodes):
for attr in badnodes[node]:
if attr in somematched:
sys.stderr.write(
'Error: {0} matches no valid value for {1}\n'.format(
attr, node))
else:
printmissing.add(attr)
for missing in printmissing:
sys.stderr.write('Error: {0} not a valid attribute\n'.format(attr))
return exitcode
def show_attr(attr, requestargs, seenattributes, options):
def show_attr(attr, requestargs, seenattributes, options, node):
try:
reverse = options.exclude
except AttributeError:
reverse = False
if requestargs is None or requestargs == []:
return True
processattr = attrrequested(attr, requestargs, seenattributes)
processattr = attrrequested(attr, requestargs, seenattributes, node)
if reverse:
processattr = not processattr
return processattr
+1 -1
View File
@@ -17,4 +17,4 @@
class Types(object):
text, json = range(2)
text, json, filehandle = range(3)
+130 -10
View File
@@ -15,9 +15,15 @@
# See the License for the specific language governing permissions and
# limitations under the License.
import array
import ctypes
import ctypes.util
import confluent.tlv as tlv
import eventlet.green.socket as socket
import eventlet.green.select as select
from datetime import datetime
import json
import os
import struct
try:
@@ -30,6 +36,72 @@ try:
except NameError:
pass
class iovec(ctypes.Structure): # from uio.h
_fields_ = [('iov_base', ctypes.c_void_p),
('iov_len', ctypes.c_size_t)]
iovec_ptr = ctypes.POINTER(iovec)
class cmsghdr(ctypes.Structure): # also from bits/socket.h
_fields_ = [('cmsg_len', ctypes.c_size_t),
('cmsg_level', ctypes.c_int),
('cmsg_type', ctypes.c_int)]
@classmethod
def init_data(cls, cmsg_len, cmsg_level, cmsg_type, cmsg_data):
Data = ctypes.c_ubyte * ctypes.sizeof(cmsg_data)
class _flexhdr(ctypes.Structure):
_fields_ = cls._fields_ + [('cmsg_data', Data)]
datab = Data(*bytearray(cmsg_data))
return _flexhdr(cmsg_len=cmsg_len, cmsg_level=cmsg_level,
cmsg_type=cmsg_type, cmsg_data=datab)
def CMSG_LEN(length):
sizeof_cmshdr = ctypes.sizeof(cmsghdr)
return ctypes.c_size_t(CMSG_ALIGN(sizeof_cmshdr).value + length)
SCM_RIGHTS = 1
class msghdr(ctypes.Structure): # from bits/socket.h
_fields_ = [('msg_name', ctypes.c_void_p),
('msg_namelen', ctypes.c_uint),
('msg_iov', ctypes.POINTER(iovec)),
('msg_iovlen', ctypes.c_size_t),
('msg_control', ctypes.c_void_p),
('msg_controllen', ctypes.c_size_t),
('msg_flags', ctypes.c_int)]
def CMSG_ALIGN(length): # bits/socket.h
ret = (length + ctypes.sizeof(ctypes.c_size_t) - 1
& ~(ctypes.sizeof(ctypes.c_size_t) - 1))
return ctypes.c_size_t(ret)
def CMSG_SPACE(length): # bits/socket.h
ret = CMSG_ALIGN(length).value + CMSG_ALIGN(ctypes.sizeof(cmsghdr)).value
return ctypes.c_size_t(ret)
class ClientFile(object):
def __init__(self, name, mode, fd):
self.fileobject = os.fdopen(fd, mode)
self.filename = name
libc = ctypes.CDLL(ctypes.util.find_library('c'))
recvmsg = libc.recvmsg
recvmsg.argtypes = [ctypes.c_int, ctypes.POINTER(msghdr), ctypes.c_int]
recvmsg.restype = ctypes.c_int
sendmsg = libc.sendmsg
sendmsg.argtypes = [ctypes.c_int, ctypes.POINTER(msghdr), ctypes.c_int]
sendmsg.restype = ctypes.c_size_t
def decodestr(value):
ret = None
try:
@@ -65,7 +137,7 @@ def _unicode_list(currlist):
_unicode_list(currlist[i])
def send(handle, data):
def send(handle, data, filehandle=None):
if isinstance(data, unicode):
try:
data = data.encode('utf-8')
@@ -93,9 +165,27 @@ def send(handle, data):
if tl > 16777215:
raise Exception("JSON data exceeds protocol limits")
# xor in the type (0b1 << 24)
tl |= 16777216
handle.sendall(struct.pack("!I", tl))
handle.sendall(sdata)
if filehandle is None:
tl |= 16777216
handle.sendall(struct.pack("!I", tl))
handle.sendall(sdata)
else:
tl |= (2 << 24)
handle.sendall(struct.pack("!I", tl))
cdtype = ctypes.c_ubyte * len(sdata)
cdata = cdtype.from_buffer(bytearray(sdata))
ciov = iovec(iov_base=ctypes.addressof(cdata),
iov_len=ctypes.c_size_t(ctypes.sizeof(cdata)))
fd = ctypes.c_int(filehandle)
cmh = cmsghdr.init_data(
cmsg_len=CMSG_LEN(
ctypes.sizeof(fd)), cmsg_level=socket.SOL_SOCKET,
cmsg_type=SCM_RIGHTS, cmsg_data=fd)
mh = msghdr(msg_name=None, msg_len=0, msg_iov=iovec_ptr(ciov),
msg_iovlen=1, msg_control=ctypes.addressof(cmh),
msg_controllen=ctypes.c_size_t(ctypes.sizeof(cmh)))
sendmsg(handle.fileno(), mh, 0)
def recvall(handle, size):
rd = handle.recv(size)
@@ -125,12 +215,42 @@ def recv(handle):
datatype = (tl & 2130706432) >> 24 # grab 7 bits from near beginning
if dlen == 0:
return None
data = handle.recv(dlen)
while len(data) < dlen:
ndata = handle.recv(dlen - len(data))
if not ndata:
raise Exception("Error reading data")
data += ndata
if datatype == tlv.Types.filehandle:
filehandles = array.array('i')
rawbuffer = bytearray(2048)
pkttype = ctypes.c_ubyte * 2048
data = pkttype.from_buffer(rawbuffer)
cmsgsize = CMSG_SPACE(ctypes.sizeof(ctypes.c_int)).value
cmsgarr = bytearray(cmsgsize)
cmtype = ctypes.c_ubyte * cmsgsize
cmsg = cmtype.from_buffer(cmsgarr)
cmsg.cmsg_level = socket.SOL_SOCKET
cmsg.cmsg_type = SCM_RIGHTS
cmsg.cmsg_len = CMSG_LEN(ctypes.sizeof(ctypes.c_int))
iov = iovec()
iov.iov_base = ctypes.addressof(data)
iov.iov_len = 2048
msg = msghdr()
msg.msg_iov = ctypes.pointer(iov)
msg.msg_iovlen = 1
msg.msg_control = ctypes.addressof(cmsg)
msg.msg_controllen = ctypes.sizeof(cmsg)
select.select([handle], [], [])
i = recvmsg(handle.fileno(), ctypes.pointer(msg), 0)
cdata = cmsgarr[CMSG_LEN(0).value:]
data = rawbuffer[:i]
if cmsg.cmsg_level == socket.SOL_SOCKET and cmsg.cmsg_type == SCM_RIGHTS:
filehandles.fromstring(bytes(
cdata[:len(cdata) - len(cdata) % filehandles.itemsize]))
data = json.loads(bytes(data))
return ClientFile(data['filename'], data['mode'], filehandles[0])
else:
data = handle.recv(dlen)
while len(data) < dlen:
ndata = handle.recv(dlen - len(data))
if not ndata:
raise Exception("Error reading data")
data += ndata
if datatype == tlv.Types.text:
return data
elif datatype == tlv.Types.json:
+1 -1
View File
@@ -7,7 +7,7 @@ Name: %{name}
Version: %{version}
Release: %{release}
Source0: %{name}-%{version}.tar.gz
License: UNKNOWN
License: Apache2
Group: Development/Libraries
BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-buildroot
Prefix: %{_prefix}
+37 -1
View File
@@ -19,6 +19,7 @@ alias nodebmcreset='CURRENT_CMDLINE=$(HISTTIMEFORMAT= builtin history 1); export
alias nodeboot='CURRENT_CMDLINE=$(HISTTIMEFORMAT= builtin history 1); export CURRENT_CMDLINE; nodeboot'
alias nodeconfig='CURRENT_CMDLINE=$(HISTTIMEFORMAT= builtin history 1); export CURRENT_CMDLINE; nodeconfig'
alias nodeconsole='CURRENT_CMDLINE=$(HISTTIMEFORMAT= builtin history 1); export CURRENT_CMDLINE; nodeconsole'
alias nodedeploy='CURRENT_CMDLINE=$(HISTTIMEFORMAT= builtin history 1); export CURRENT_CMDLINE; nodedeploy'
alias nodedefine='CURRENT_CMDLINE=$(HISTTIMEFORMAT= builtin history 1); export CURRENT_CMDLINE; nodedefine'
alias nodeeventlog='CURRENT_CMDLINE=$(HISTTIMEFORMAT= builtin history 1); export CURRENT_CMDLINE; nodeeventlog'
alias nodefirmware='CURRENT_CMDLINE=$(HISTTIMEFORMAT= builtin history 1); export CURRENT_CMDLINE; nodefirmware'
@@ -90,7 +91,7 @@ _confluent_nodeidentify_completion()
_confluent_nodesetboot_completion()
{
COMP_CANDIDATES=("default,cd,network,setup,hd -h -b -p")
COMP_CANDIDATES=("default,cd,network,setup,hd,floppy,usb -h -b -p")
_confluent_generic_completion
}
@@ -137,6 +138,37 @@ _confluent_nodefirmware_completion()
fi
}
_confluent_osimage_completion()
{
_confluent_get_args
if [ $NUMARGS == 2 ]; then
COMPREPLY=($(compgen -W "initialize import updateboot" -- ${COMP_WORDS[COMP_CWORD]}))
return
elif [ ${CMPARGS[1]} == 'initialize' ]; then
COMPREPLY=($(compgen -W "-h -u -s -t -i" -- ${COMP_WORDS[COMP_CWORD]}))
elif [ ${CMPARGS[1]} == 'import' ]; then
compopt -o default
COMPREPLY=()
return
elif [ ${CMPARGS[1]} == 'updateboot' ]; then
COMPREPLY=($(compgen -W "-n $(confetty show /deployment/profiles|sed -e 's/\///')" -- "${COMP_WORDS[COMP_CWORD]}"))
return
fi
}
_confluent_nodedeploy_completion()
{
_confluent_get_args
if [ $NUMARGS -gt 2 ]; then
COMPREPLY=($(compgen -W "-n $(confetty show /deployment/profiles|sed -e 's/\///')" -- "${COMP_WORDS[COMP_CWORD]}"))
return
fi
if [ $NUMARGS -lt 3 ]; then
_confluent_nr_completion
return;
fi
}
_confluent_nodeshell_completion()
{
_confluent_get_args
@@ -226,6 +258,8 @@ _confluent_nr_completion()
CMPARGS=($COMP_LINE)
_confluent_get_args
if [ $NUMARGS -gt 2 ]; then
compopt -o default
COMPREPLY=()
return;
fi
INPUT=${COMP_WORDS[COMP_CWORD]}
@@ -266,6 +300,8 @@ complete -F _confluent_nr_completion nodeconfig
complete -F _confluent_nn_completion nodeconsole
complete -F _confluent_nr_completion nodeeventlog
complete -F _confluent_nodefirmware_completion nodefirmware
complete -F _confluent_nodedeploy_completion nodedeploy
complete -F _confluent_osimage_completion osdeploy
complete -F _confluent_ng_completion nodegroupattrib
complete -F _confluent_ng_completion nodegroupremove
complete -F _confluent_nr_completion nodehealth
+22 -11
View File
@@ -3,7 +3,7 @@ collate(1) -- Organize text input by node
## SYNOPSIS
`<other command> | collate [-a] [-d] [-w] [-s] [-c] [-r] [-l lognametemplate]`
`<other command> | collate [-a] [-b] [-d] [-w] [-g] [-s] [-c] [-r] [-l lognametemplate]`
## DESCRIPTION
@@ -21,30 +21,41 @@ node and group names sorted alphanumerically.
when output differs along a telling group boundary. For example, if
output suggests a large number of nodes are unreachable, abbreviate
showing 'rack1' as being unreachable may make more obvious a possible cause.
* `-b BASE`, `--base=BASE`:
Use given node as reference for comparison when using
-d, instead of using the most common result
* `-d`, `--diff`:
Express all but the most common result group in terms of diff from
the most common result group
* `-l`, `--log`:
Save output per node to individual log files, replacing {node} in the name
with the nodename of each
* `-w`, `--watch`:
Update results dynamically as data becomes available, rather than
waiting for the command to fully complete.
* `-g`, `--groupcount`:
Show count of output groups rather than the actual
output
* `-s`, `--skipcommon`:
Suppress printing of the most common result text group. This is used to
focus on stray output against a well known and expected result.
* `-c`, `--count`:
Print a count of the number of nodes in an output group under the
noderange.
noderange.
* `-r`, `--reverse`:
Rather than starting with most common to least common, start with
the least common and print the most common last.
* `-r`, `--reverse`:
Rather than starting with most common to least common, start with
the least common and print the most common last.
* `-l LOG`, `--log=LOG`:
Save output per node to individual log files, replacing {node} in the name
with the nodename of each
* `-h`, `--help`:
Show help message and exit
## EXAMPLES
* Organizing power state of multiple nodes:
+5 -1
View File
@@ -6,7 +6,8 @@ collective(1) -- Check and manage a confluent collective
`collective invite <server>`
`collective join <server> [-i TOKEN]`
`collective show`
`collective gencert`
`collective gencert`
`collective delete`
## DESCRIPTION
@@ -36,6 +37,9 @@ on circumstances.
* `-i`:
Provide the token as an argument rather than interactively.
* `-h`, `--help`:
Show help message and exit
## EXAMPLES
* Inviting a server called mgt2:
+15
View File
@@ -15,6 +15,21 @@ be mostly an aid for developing client software, with
day to day administration generally being easier with
the various function specific commands.
## OPTIONS
* `-s SERVER:PORT`, `--server=SERVER:PORT`:
Confluent instance to connect to
* `-c PATH`, `--control=PATH`:
Path to offer terminal control
* `-m MINTIME`, `--mintime=MINTIME`:
Minimum time to run or else pause for input (used to
keep a terminal from closing quickly on error)
* `-h`, `--help`:
Show help message and exit
## COMMANDS
The CLI may be navigated by shell commands and some other
+19 -3
View File
@@ -3,8 +3,7 @@ confluentdbutil(8) -- Backup or restore confluent database
## SYNOPSIS
`confluentdbutil [options] <dump|restore> <path>`
`confluentdbutil [options] [dump|restore] <path>`
## DESCRIPTION
@@ -19,8 +18,25 @@ the json files (password protected, removed from the files, or unprotected).
* `-p`, `--password`:
If specified, information such as usernames and passwords will be encrypted
using the given password.
* `-i`, `--interactivepassword`:
Prompt for password.
* `-r`, `--redact`:
Indicates to replace usernames and passwords with a dummy string rather
than included.
* `-u`, `--unprotected`:
The keys.json file will include the encryption keys without any protection.
The keys.json file will include the encryption keys without any protection.
* `-s`, `--skipkeys`:
This specifies to dump the encrypted data without
dumping the keys needed to decrypt it. This is
suitable for an automated incremental backup, where an
earlier password protected dump has a protected
keys.json file, and only the protected data is needed.
keys do not change and as such they do not require
incremental backup.
* `-h`, `--help`:
Show help message and exit
+16 -3
View File
@@ -40,12 +40,25 @@ See nodegroupattrib(8) command on how to manage attributes on a group level.
* `-b`, `--blame`:
Annotate inherited and expression based attributes to show their base value.
* `-c`, `--clear`:
Clear specified nodeattributes
Clear specified nodeattributes.
* `-e`, `--environment`:
Set specified attributes based on exported environment variable of matching name. Environment variable names may be lower case or all upper case. Replace . with _ as needed (e.g. info.note may be specified as either $info_note or $INFO_NOTE
Set specified attributes based on exported environment variable of matching name.
Environment variable names may be lower case or all upper case.
Replace . with _ as needed (e.g. info.note may be specified as either $info_note or $INFO_NOTE
* `-p`, `--prompt`:
Request interactive prompting to provide values rather than the command line or environment variables.
Request interactive prompting to provide values rather than the command line
or environment variables.
* `-m MAXNODES`, `--maxnodes=MAXNODES`:
Prompt if trying to set attributes on more than
specified number of nodes.
* `-h`, `--help`:
Show help message and exit
## EXAMPLES
* Listing matching nodes of a simple noderange:
@@ -9,6 +9,15 @@ nodebmcreset(8) -- Reset management controller
`nodebmcreset` allows you to reset the management controller of the specified noderange
## OPTIONS
* `-m MAXNODES`, `--maxnodes=MAXNODES`:
Number of nodes to affect before prompting for
confirmation
* `-h`, `--help`:
Show help message and exit
## EXAMPLES:
* Reset the management controller for nodes n1 through n4:
+8 -2
View File
@@ -3,8 +3,7 @@ nodeboot(8) -- Reboot a confluent node to a specific device
## SYNOPSIS
`nodeboot <noderange>`
`nodeboot [options] <noderange>` [default|cd|network|setup|hd]
`nodeboot [options] <noderange> [default|cd|network|setup|hd]`
## DESCRIPTION
@@ -25,6 +24,13 @@ device without inducing a reboot, see the `nodesetboot` command.
* `-p`, `--persist`:
For a system that supports it, mark the boot override to persist rather than
be a one time change. Many systems do not support this functionality.
* `-m MAXNODES`, `--maxnodes=MAXNODES`:
Specify a maximum number of nodes to boot, prompting
if over the threshold
* `-h`, `--help`:
Show help message and exit
* `default`:
Request a normal default boot with no particular device override
+23 -8
View File
@@ -3,8 +3,7 @@ nodeconfig(8) -- Show or change node configuration
## SYNOPSIS
`nodeconfig <noderange> [options] [<configuration>..]`
`nodeconfig <noderange> [options] [<configuration=value>..]`
`nodeconfig [options] <noderange> [setting|setting=value]`
## DESCRIPTION
@@ -14,6 +13,12 @@ running configuration on the node firmware. Calling without '=' will show the
current value, and '=' will change the value. Network information can be
given as a node expression, as documented in the man page for nodeattribexpressions(5).
Note that when using nodeconfig to submit changes, it will exit when the change
is accepted, but the endpoint may not have fully processed it. Doing a show
immediately after doing a set may reflect older information. Also, if changing
BIOS/UEFI settings, the change may appear in output, but generally won't
actually be in effect until a reboot.
## OPTIONS
* `-c`, `--comparedefault`:
@@ -21,6 +26,13 @@ given as a node expression, as documented in the man page for nodeattribexpressi
no configuration values are specified, it will show only those that differ.
If combined with `-x`, will show all differing values except those indicated
by `-x`
* `-b`, `--batch`:
Provide arguments as lines of a file, rather than the command line.
* `-d`, `--detail`:
Provide detailed data as available. This can include help text and valid
values for a setting.
* `-e`, `--extra`:
Read settings that are generally not needed, but may be slow to retrieve.
@@ -31,18 +43,21 @@ given as a node expression, as documented in the man page for nodeattribexpressi
Rather than listing only the specified configuration parameters, list all
attributes except for the specified ones
* `-d`, `--detail`:
Provide detailed data as available. This can include help text and valid
values for a setting.
* `-a`, `--advanced`:
Include advanced settings, which are normally not intended to be used
without direction from the relevant server vendor.
* `-r`, `--restoredefault`:
Request that the specified component of the targeted nodes will have its
configuration reset to default. Currently the only component implemented
is uefi.
* `-b`, '--batch':
Provide arguments as lines of a file, rather than the command line.
* `-m MAXNODES`, `--maxnodes=MAXNODES`:
Specify a maximum number of nodes to configure, prompting if over
the threshold
* `-h`, `--help`:
Show help message and exit
## EXAMPLES
* Showing the current IP configuration of noderange BMC/IMM/XCC:
+46
View File
@@ -0,0 +1,46 @@
nodedeploy(8) -- Request preparation and/or initiating a node deployment
=========================================================================
## SYNOPSIS
`nodedeploy [-h] [-c] [-n] [-p] [-m MAXNODES] <noderange> [profile]`
## DESCRIPTION
**nodedeploy** configures attributes and interacts with BMC devices as appropriate
to change the operating system on the noderange to that indicated by `profile`. Tab completion
is supported under bash to help list and select a profile name. `-n` indicates that it
will be a network based deployment (either HTTP or PXE) and `-p` suppresses any activity
that requires the BMC (e.g. setting the next boot device and rebooting the system). Currently
**nodedeploy** only supports `-n` style deployment flows. Without options it shows the current
deployment status.
## OPTIONS
* `-c`, `--clear`:
Remove any pending deployment action
* `-n`, `--network`:
Prepare for either an HTTP or PXE based deployment, setting boot device to network and rebooting unless `-p` is specified.
* `-p`, `--prepareonly`:
Prepare the network services for deployment, but do not interact with BMCs. This is intended for scenarios where
the boot device control and server restart will be handled outside of confluent.
* `-m MAXNODES`, `--maxnodes=MAXNODES`:
Specifiy a maximum nodes to be deployed.
* `-h`, `--help`:
Show help message and exit
## EXAMPLES
* Begin the instalalation of a profile of CentOS 8.2:
`# nodedeploy d4 -n centos-8.2-x86_64-default`
`d4: network`
`d4: reset`
* Check current deployment state of nodes:
`# nodedeploy d4`
`d4: pending: centos-8.2-x86_64-default (node authentication armed)`
+10 -2
View File
@@ -3,14 +3,22 @@ nodeeventlog(8) -- Pull eventlog from confluent nodes
## SYNOPSIS
`nodeeventlog <noderange>`
`nodeeventlog <noderange> [clear]`
`nodeeventlog [options] <noderange> [clear]`
## DESCRIPTION
`nodeeventlog` pulls and optionally clears the event log from the requested
noderange.
## OPTIONS
* `-m MAXNODES`, `--maxnodes=MAXNODES`:
Specify a maximum number of nodes to clear if clearing log, prompting if
over the threshold
* `-h`, `--help`:
Show help message and exit
## EXAMPLES
* Pull the event log from n2 and n3:
`# nodeeventlog n2,n3`
+13 -3
View File
@@ -3,9 +3,7 @@ nodefirmware(8) -- Report firmware information on confluent nodes
## SYNOPSIS
`nodefirmware <noderange>`
`nodefirmware <noderange> list|<components>|core`
`nodefirmware <noderange> update [--backup] <filename>`
`nodefirmware <noderange> [list][update [--backup <file>]]|[<components>]`
## DESCRIPTION
@@ -26,6 +24,18 @@ the out of band facilities. Firmware updates can end in one of three states:
* `pending`: The firmware update process has completed, but the firmware will not be active until the relevant component next resets. Generally speaking, for UEFI update the system will need a reboot, and for BMC updates, the `nodebmcreset` command will begin the process to activate the firmware.
* `complete`: The firmware update process has completed and activation has proceeded. Note that while the activation process has commenced, the component may still be in the process of rebooting when nodefirmware exits.
## OPTIONS
* `-b`, `--backup`:
Target a backup bank rather than primary
* `-m MAXNODES`, `--maxnodes=MAXNODES`:
When updating, prompt if more than the specified number of servers will
be affected
* `-h`, `--help`:
Show help message and exit
## EXAMPLES
* Pull firmware from a node:
@@ -25,8 +25,20 @@ the attributes are set on the node versus a group to which a node belongs.
## OPTIONS
* `-b`, `--blame`:
Show information about how attributes inherited
* `-e`, `--environment`:
Set attributes, but from environment variable of same name
* `-c`, `--clear`:
Clear specified nodeattributes.
* `-p`, `--prompt`:
Prompt for attribute values interactively
* `-h`, `--help`:
Show help message and exit
## EXAMPLES
+8 -1
View File
@@ -9,9 +9,16 @@ nodelicense(8) -- Manage license keys on BMC
`nodelicense` manages license keys on supported BMCs. Without an argument, the command
lists currently installed license. Using `delete` will remove the specified license name
from th eBMC. The `save` subcommand will take the passed directory (which may be in the form
from the BMC. The `save` subcommand will take the passed directory (which may be in the form
of /path/to/{node}/ to have the node name substituted for each node) and back up installed licenses
to that directory. The `install` command will take the specified filename and install. The filename
argument may be of the form xcc_fod_0034_7X21{id.serial}.key to have the serial number substituted
to allow unique licenses to be specified in a single command.
## OPTIONS
* `-m MAXNODES`, `--maxnodes=MAXNODES`:
Specify a maximum number of nodes to delete licenses from, prompting if over the threshold
* `-h`, `--help`:
Show help message and exit
+2 -2
View File
@@ -34,8 +34,8 @@ the host platform attempts.
## OPTIONS
* `-c`:
Specify the maximum number of instances to run concurrently.
* `-h`, `--help`:
Show help message and exit
## EXAMPLES
* Listing currently mounted media:
+7
View File
@@ -30,6 +30,13 @@ off will not react to this request.
* `-p`, '--showprevious':
Show previous power state for all directives that may change power state.
* `-m MAXNODES`, `--maxnodes=MAXNODES`:
Specify a maximum number of nodes to change power state, prompting if
over the threshold
* `-h`, `--help`:
Show help message and exit
## EXAMPLES
* Get power state of nodes n1 through n4:
+8 -1
View File
@@ -9,6 +9,14 @@ noderemove(8) -- Remove nodes from the confluent management service
`noderemove` simply removes the given noderange from the confluent database.
## OPTIONS
* `-m MAXNODES`, `--maxnodes=MAXNODES`:
Specify a maximum number of nodes to delete, prompting if over the
threshold
* `-h`, `--help`:
Show help message and exit
## EXAMPLES
@@ -22,4 +30,3 @@ noderemove(8) -- Remove nodes from the confluent management service
`r2u3: deleted`
`r2u2: deleted`
`r2u1: deleted`
+8 -1
View File
@@ -11,9 +11,16 @@ nodereseat(8) -- Request a reseat of a node
node's slot. This should be equivalent to removing the system entirely from
the chassis and putting it back in, but without actually having to do so.
## OPTIONS
* `-m MAXNODES`, `--maxnodes=MAXNODES`:
Specify a maximum number of nodes to reseat, prompting if over the threshold
* `-h`, `--help`:
Show help message and exit
## EXAMPLES
* Reseating the node `s1`:
`# nodereseat s1`
`s1: Reseat successful`
+9 -5
View File
@@ -12,10 +12,14 @@ noderange. This will present progress as percentage for all nodes.
## OPTIONS
* `-m`:
Specify maximum number of nodes for noderange max.
* `-c`:
* `-c`, `-f`, `--count`:
Specify how many rsync executions to do concurrently. If noderange
exceeds the count, then excess nodes will wait until one of the
active count completes.
active count completes.
* `-m MAXNODES`, `--maxnodes=MAXNODES`:
Specify a maximum number of nodes to run rsync to, prompting if over the
threshold
* `-h`, `--help`:
Show help message and exit
+15
View File
@@ -13,6 +13,21 @@ nodeattribexpressions(5) are expanded prior to execution of the command. For
noderun, the commands are locally executed. To execute commands on the nodes
themselves, see nodeshell(8).
## OPTIONS
* `-f`, `-c`, `--count`:
Number of commands to run at a time
* `-n`, `--nonodeprefix`:
Do not prefix output with node names
* `-m MAXNODES`, `--maxnodes=MAXNODES`:
Specify a maximum number of nodes to run the command with, prompting if over
the threshold
* `-h`, `--help`:
Show help message and exit
## EXAMPLES
* Run ping against nodes n1 through n4:
@@ -29,6 +29,10 @@ interval of 1 second is used.
Perform the specified number of readings, waiting `-i` indicated interval or 1 second if not
otherwise indicated.
* `-s`, `--skipnumberless`:
Return only sensors that provide numeric data (e.g. temperature, fanspeed),
ignoring sensors that do not provide numeric data.
## EXAMPLES
* Retrieving all temperature related sensors from one system
`# nodesensors n1 temperature`
+19 -3
View File
@@ -2,9 +2,8 @@ nodesetboot(8) -- Check or set next boot device for noderange
====================================================
## SYNOPSIS
`nodesetboot <noderange>`
`nodesetboot [options] <noderange> [default|cd|network|setup|hd]`
`nodesetboot [options] <noderange> [default|cd|network|setup|hd|usb|floppy]`
## DESCRIPTION
@@ -21,6 +20,8 @@ to use `nodesetboot <noderange> setup` and then initiate a reboot from within
the operating system with ssh or similar rather than using the remote hardware
control.
Running the command with no target queries the current setting.
## OPTIONS
* `-b`, `--bios`:
@@ -33,6 +34,13 @@ control.
* `-u`, `--uefi`:
This flag does nothing, it is for command compatibility with xCAT's rsetboot
* `-m MAXNODES`, `--maxnodes=MAXNODES`:
Specify a maximum number of nodes to modify next boot device, prompting if
over the threshold
* `-h`, `--help`:
Show help message and exit
* `default`:
Request a normal default boot with no particular device override
@@ -42,6 +50,14 @@ control.
remote media mounted as CD/DVD, and detachable hard disks drives such as usb
key devices.
* `floppy`:
Request boot from floppy. Generally speaking firmware uses this to mean a USB
flash drive or similar (whether virtual or physical).
* `usb`:
Request boot from usb. Generally speaking firmware uses this to mean a USB
flash drive or similar (whether virtual or physical).
* `network`:
Request boot to network
+20 -3
View File
@@ -3,7 +3,7 @@ nodeshell(8) -- Execute command on many nodes in a noderange through ssh
## SYNOPSIS
`nodeshell <noderange> [options] <command to execute on each node>`
`nodeshell [options] <noderange> <command to execute on each node>`
## DESCRIPTION
@@ -13,9 +13,26 @@ nodeattribexpressions(5). `nodeshell` provides stdout as stdout and stderr
as stderr, unlike psh which combines all stdout and stderr into stdout.
## OPTIONS
* `-c COUNT`, `-f COUNT`, `--count=COUNT`
Specify the maximum number of instances to run concurrently
* `-c`:
Specify the maximum number of instances to run concurrently.
* `-m MAXNODES`, `--maxnodes=MAXNODES`
Specify a maximum number of nodes to run remote ssh command to, prompting
if over the threshold
* `-n`, `--nonodeprefix`
Do not prefix output with node names
* `-p PORT`, `--port=PORT`
Specify a custom port for ssh
* `-s SUBSTITUTION`, `--substitutename=SUBSTITITUTION`
Specify a substitution name instead of the nodename. If no {} are in the substitution,
it is considered to be an append. For example, '-s -ib' would produce 'node1-ib' from 'node1'.
Full expression syntax is supported, in which case the substitution is considered to be the entire
new name. {node}-ib would be equivalent to -ib. For example, nodeshell -s {bmc} node1
would ssh to the BMC instead of the node.
## EXAMPLES
+14 -2
View File
@@ -3,12 +3,15 @@ nodestorage(8) -- Examine/Modify storage configuration of a node
## SYNOPSIS
`nodestorage <noderange> [show|create|delete] [options]`
`nodestorage <noderange> [show|create|delete|diskset] [hotspare|jbod|unconfigured] [options]`
## DESCRIPTION
`nodestorage` provides access to the remote storage configuration of
the noderange.
the noderange. The `show` subcommand will show current storage configuration,
`create` can be used to create new arrays or volumes, `delete` can be used to
remove volumes and arrays, and `diskset` can modify the usage of disks
indicated by `-d` to either be `unconfigured`, `jbod`, or `hotspare`.
## OPTIONS
* `-r` **RAIDLEVEL**, `--raidlevel`=**RAIDLEVEL**:
@@ -29,6 +32,15 @@ the noderange.
volumes, or selecting a volume for delete. Default
behavior is to use implementation provided default
* `-z` **STRIPSIZES**, `--stripsizes`=**STRIPSIZES**:
Comma separated list of stripsizes to use when creating volumes.
This value is in kilobytes. The default behavior is to allow the
storage controller to decide
* `-m` **MAXNODES**, `--maxnodes`=**MAXNODES**:
Specify a maximum number of nodes to configure storage on, prompting
if over the threshold
## EXAMPLES
* Deleting the volume `somedata`:
@@ -19,6 +19,15 @@ running in collective mode.
Note that due to vendor filename requirements, any filename may have vendor
specific suffixes added to any file produced.
## OPTIONS
* `-m MAXNODES`, `--maxnodes=MAXNODES`:
Specify a maximum number of nodes to download diagnostic data from, prompting
if over the threshold
* `-h`, `--help`:
Show help message and exit
## EXAMPLES
* Download support data from a single node to a specific filename
+17
View File
@@ -0,0 +1,17 @@
osdeploy(8) --- Configure general OS deployment facilities of confluent
==========================================================================
## SYNOPSIS
`osdeploy import <iso>`
`osdeploy updateboot <profile>`
`osdeploy initialize [-h] [-g] [-u] [-s] [-k] [-t] [-p] [-i] [-l] [-a]`
## DESCRIPTION
**osdeploy** manages the facilities and os deployment content of a confluent server. The
`import` subcommand will generate profiles from an iso image. `updateboot` will take any
changes in the specified update that need to be pushed into boot configuration and/or images
and ensure those needed changes are performed. `initialize` provides assistance in setting
up the most commonly required facilities. Run `osdeploy initialize -h` for more detail
on the options offered by `osdeploy initialize`
+49
View File
@@ -0,0 +1,49 @@
stats(8) -- Common basic statistics on typical numeric data in output
==============================
## SYNOPSIS
`<other command> | stats [-c N] [-d D] [-x|-g|-t|-o image.png] [-s N] [-v] [-b N]
## DESCRIPTION
The **stats** command helps analyze common numerical data such as performance numbers
or temperatures or any other numerical value.
By default it looks for the last numerical output on the first line to identify the numerical column
and analyze that number. This can be overriden by **-c COLUMN** to indicate a column. By default,
whitespace and commas are treated to delimit columns, and **-d DELIMITER** can be used to override.
By default it outputs basic statistics, but a histogram is available either text or through X11 output
or sixel or output to an image file depending on whether **-x**, **-g**, **-t*, or **-o image.png** is
used.
## OPTIONS
* `-c N`:
Select column number. Defaults to last column that appears numeric
* `-d D`:
Specify a custom column delimiter
* `-x`:
Output in Sixel format (supported by mlterm and PuTTY, among others)
* `-g`:
Try to open histogram as an X window
* `-t`:
Output histogram as bars rendered by =
* `-o image.png`:
Write graphical histogram to image.png.
* `-s N`:
Ignore specified number of lines as header content before processing numbers
* `-v`:
Treat value before : on each line as a label, and show which labels belong to which histogram buckets.
* `-b N`:
Specify a custom number of buckets for histogram. The default is 10.
+11
View File
@@ -0,0 +1,11 @@
VERSION=`git describe|cut -d- -f 1`
NUMCOMMITS=`git describe|cut -d- -f 2`
if [ "$NUMCOMMITS" != "$VERSION" ]; then
VERSION=$VERSION.dev$NUMCOMMITS.g`git describe|cut -d- -f 3`
fi
sed -e "s/#VERSION#/$VERSION/" confluent_osdeploy.spec.tmpl > confluent_osdeploy.spec
cd ..
tar Jcvf confluent_osdeploy.tar.xz confluent_osdeploy
mv confluent_osdeploy.tar.xz ~/rpmbuild/SOURCES/
cd -
rpmbuild -ba confluent_osdeploy.spec
@@ -0,0 +1,163 @@
#!/usr/bin/python
try:
import http.client as client
except ImportError:
import httplib as client
import os
import socket
import subprocess
import ssl
import sys
def get_apikey(nodename, mgr):
sealnew = True
if os.path.exists('/etc/confluent/confluent.apikey'):
return open('/etc/confluent/confluent.apikey').read().strip()
apikey = subprocess.check_output(['/opt/confluent/bin/clortho', nodename, mgr])
if not isinstance(apikey, str):
apikey = apikey.decode('utf8')
if apikey.startswith('SEALED:'):
sealnew = False
with open('/etc/confluent/confluent.sealedapikey', 'w+') as apiout:
apiout.write(apikey[7:])
with open('/etc/confluent/confluent.sealedapikey') as inp:
sp = subprocess.Popen(['/usr/bin/clevis-decrypt-tpm2'],
stdin=inp, stdout=subprocess.PIPE)
apikey = sp.communicate()[0]
if not isinstance(apikey, str):
apikey = apikey.decode('utf8')
with open('/etc/confluent/confluent.apikey', 'w+') as apiout:
apiout.write(apikey)
if sealnew and os.path.exists('/usr/bin/clevis-encrypt-tpm2'):
try:
with open('/etc/confluent/confluent.apikey') as apin:
sealed = subprocess.check_output(
['/usr/bin/clevis-encrypt-tpm2', '{}'], stdin=apin)
print(HTTPSClient().grab_url('/confluent-api/self/saveapikey', sealed).decode())
except Exception:
sys.stderr.write('Unable to persist API key through TPM2 sealing\n')
apikey = apikey.strip()
os.chmod('/etc/confluent/confluent.apikey', 0o600)
return apikey
class HTTPSClient(client.HTTPConnection, object):
def __init__(self, json=False, port=443):
self.stdheaders = {}
info = open('/etc/confluent/confluent.info').read().split('\n')
host = None
mgtiface = None
havedefault = '0'
for line in info:
if line.startswith('NODENAME:'):
node = line.split(' ')[1]
self.stdheaders['CONFLUENT_NODENAME'] = node
if line.startswith('MANAGER:') and not host:
host = line.split(' ')[1]
if line.startswith('EXTMGRINFO:'):
extinfo = line.split(' ')[1]
extinfo = extinfo.split('|')
if not mgtiface:
host, mgtiface, havedefault = extinfo[:3]
if havedefault == '0' and extinfo[2] == '1':
host, mgtiface, havedefault = extinfo[:3]
if '%' in host:
ifidx = host.split('%', 1)[1]
with open('/tmp/confluent.ifidx', 'w+') as ifout:
ifout.write(ifidx)
if json:
self.stdheaders['ACCEPT'] = 'application/json'
try:
info = open('/etc/confluent/confluent.deploycfg').read().split('\n')
except Exception:
info = None
if info:
for line in info:
if line.startswith('deploy_server: '):
host = line.split(': ', 1)[1]
break
self.stdheaders['CONFLUENT_APIKEY'] = get_apikey(node, host)
if mgtiface:
self.stdheaders['CONFLUENT_MGTIFACE'] = mgtiface
client.HTTPConnection.__init__(self, host, port)
self.connect()
def set_header(self, key, val):
self.stdheaders[key] = val
def connect(self):
addrinf = socket.getaddrinfo(self.host, self.port)[0]
psock = socket.socket(addrinf[0])
psock.connect(addrinf[4])
ctx = ssl.SSLContext(ssl.PROTOCOL_SSLv23)
ctx.load_verify_locations('/etc/confluent/ca.pem')
host = self.host.split('%', 1)[0]
if '[' not in host and ':' in host:
self.stdheaders['Host'] = '[{0}]'.format(host)
else:
self.stdheaders['Host'] = '{0}'.format(host)
ctx.verify_mode = ssl.CERT_REQUIRED
ctx.check_hostname = True
self.sock = ctx.wrap_socket(psock, server_hostname=host)
def grab_url(self, url, data=None, returnrsp=False):
return self.grab_url_with_status(url, data, returnrsp)[1]
def grab_url_with_status(self, url, data=None, returnrsp=False):
if data:
method = 'POST'
else:
method = 'GET'
self.request(method, url, data, headers=self.stdheaders)
rsp = self.getresponse()
if rsp.status >= 200 and rsp.status < 300:
if returnrsp:
return rsp.status, rsp
else:
return rsp.status, rsp.read()
raise Exception(rsp.read())
if __name__ == '__main__':
data = None
json = False
if '-j' in sys.argv:
json = True
if len(sys.argv) == 1:
HTTPSClient()
sys.exit(0)
try:
outbin = sys.argv.index('-o')
sys.argv.pop(outbin)
outbin = sys.argv.pop(outbin)
except ValueError:
outbin = None
try:
waitfor = sys.argv.index('-w')
sys.argv.pop(waitfor)
waitfor = int(sys.argv.pop(waitfor))
except ValueError:
waitfor = None
try:
data = sys.argv.index('-d')
sys.argv.pop(data)
data = sys.argv.pop(data)
except ValueError:
data = None
if outbin:
with open(outbin, 'ab+') as outf:
reader = HTTPSClient(json=json).grab_url(
sys.argv[1], data, returnrsp=True)
chunk = reader.read(16384)
while chunk:
outf.write(chunk)
chunk = reader.read(16384)
sys.exit(0)
if len(sys.argv) > 2 and os.path.exists(sys.argv[-1]):
data = open(sys.argv[-1]).read()
if waitfor:
client = HTTPSClient(json=json)
status = 201
while status != waitfor:
status, rsp = client.grab_url_with_status(sys.argv[1], data)
sys.stdout.write(rsp.decode())
else:
sys.stdout.write(HTTPSClient(json=json).grab_url(sys.argv[1], data).decode())
@@ -0,0 +1,60 @@
Name: confluent_osdeploy-x86_64
Version: #VERSION#
Release: 1
Summary: OS Deployment support for confluent
License: Apache2
URL: http://hpc.lenovo.com/
Source0: confluent_osdeploy.tar.xz
BuildArch: noarch
Requires: confluent_ipxe mtools tar
BuildRoot: /tmp
%description
This contains support utilities for enabling deployment of x86_64 architecture systems
%define debug_package %{nil}
%prep
%setup -n confluent_osdeploy
%build
mkdir -p opt/confluent/bin
cd utils
make all
cp copernicus clortho autocons ../opt/confluent/bin
cd ..
for os in rhvh4 el7 genesis el8 suse15 ubuntu20.04; do
mkdir ${os}out
cd ${os}out
cp -a ../opt .
cp -a ../${os}/initramfs/* .
cp -a ../common/* .
find . | cpio -H newc -o > ../addons.cpio
mv ../addons.cpio .
cd ..
done
mkdir esxi7out
cd esxi7out
cp -a ../opt .
cp -a ../esxi7/initramfs/* .
cp -a ../common/* .
chmod +x bin/* opt/confluent/bin/*
tar zcvf ../addons.tgz *
mv ../addons.tgz .
cd ..
cp -a esxi7out esxi6out
cp -a esxi7 esxi6
%install
for os in rhvh4 el7 el8 genesis suse15 ubuntu20.04 esxi6 esxi7; do
mkdir -p %{buildroot}/opt/confluent/lib/osdeploy/$os/initramfs
mkdir -p %{buildroot}/opt/confluent/lib/osdeploy/$os/profiles
cp ${os}out/addons.* %{buildroot}/opt/confluent/lib/osdeploy/$os/initramfs
cp -a $os/profiles/* %{buildroot}/opt/confluent/lib/osdeploy/$os/profiles
find %{buildroot}/opt/confluent/lib/osdeploy/$os/profiles -name .gitignore -exec rm -f {} +
done
%files
/opt/confluent/lib/osdeploy
@@ -0,0 +1,18 @@
#!/bin/bash
echo -n "" >> /tmp/net.ifaces
cat /tls/*.0 >> /etc/pki/tls/certs/ca-bundle.crt
if ! grep console= /proc/cmdline >& /dev/null; then
autocons=$(/opt/confluent/bin/autocons)
if [ -n "$autocons" ]; then
echo console=$autocons |sed -e 's!/dev/!!' >> /tmp/01-autocons.conf
autocons=${autocons%,*}
echo $autocons > /tmp/01-autocons.devnode
echo "Detected firmware specified console at $(cat /tmp/01-autocons.conf)" > $autocons
echo "Initializing auto detected console when installer starts" > $autocons
fi
fi
if grep console=ttyS /proc/cmdline >& /dev/null; then
echo "Serial console has been requested in the kernel arguments, the local video may not show progress" > /dev/tty1
fi
. /lib/anaconda-lib.sh
wait_for_kickstart
@@ -0,0 +1,98 @@
#!/bin/sh
[ -e /tmp/confluent.initq ] && return 0
if [ -f /tmp/dd_disk ]; then
for dd in $(cat /tmp/dd_disk); do
if [ -e $dd ]; then
driver-updates --disk $dd $dd
fi
done
fi
mkdir -p /etc/confluent
cat /tls/*.pem > /etc/confluent/ca.pem
TRIES=0
echo -n > /etc/confluent/confluent.info
cd /sys/class/net
while ! awk -F'|' '{print $3}' /etc/confluent/confluent.info |grep 1 >& /dev/null && [ "$TRIES" -lt 60 ]; do
TRIES=$((TRIES + 1))
for currif in *; do
ip link set $currif up
done
/opt/confluent/bin/copernicus -t > /etc/confluent/confluent.info
done
cd /
grep ^EXTMGRINFO: /etc/confluent/confluent.info || return 0 # Do absolutely nothing if no data at all yet
echo -n "" > /tmp/confluent.initq
# restart cmdline
echo -n "" > /etc/cmdline.d/01-confluent.conf
nodename=$(grep ^NODENAME /etc/confluent/confluent.info|awk '{print $2}')
#TODO: blkid --label <whatever> to find mounted api
oum=$(umask)
python /opt/confluent/bin/apiclient /confluent-api/self/deploycfg > /etc/confluent/confluent.deploycfg
ifidx=$(cat /tmp/confluent.ifidx)
ifname=$(ip link |grep ^$ifidx:|awk '{print $2}')
ifname=${ifname%:}
echo $ifname > /tmp/net.ifaces
dnsdomain=$(grep ^dnsdomain: /etc/confluent/confluent.deploycfg)
dnsdomain=${dnsdomain#dnsdomain: }
hostname=$nodename
if [ ! -z "$dnsdomain" ] && [ "$dnsdomain" != "null" ]; then
hostname=$hostname.$dnsdomain
fi
mgr=$(grep ^deploy_server: /etc/confluent/confluent.deploycfg)
mgr=${mgr#deploy_server: }
profilename=$(grep ^profile: /etc/confluent/confluent.deploycfg)
profilename=${profilename#profile: }
proto=$(grep ^protocol: /etc/confluent/confluent.deploycfg)
proto=${proto#protocol: }
textconsole=$(grep ^textconsole: /etc/confluent/confluent.deploycfg)
textconsole=${textconsole#textconsole: }
if [ "$textconsole" = "true" ] && ! grep console= /proc/cmdline > /dev/null; then
autocons=$(cat /tmp/01-autocons.devnode)
if [ ! -z "$autocons" ]; then
echo Auto-configuring installed system to use text console
echo Auto-configuring installed system to use text console > $autocons
cp /tmp/01-autocons.conf /etc/cmdline.d/
else
echo "Unable to automatically detect requested text console"
fi
fi
echo inst.repo=$proto://$mgr/confluent-public/os/$profilename/distribution >> /etc/cmdline.d/01-confluent.conf
echo inst.ks=$proto://$mgr/confluent-public/os/$profilename/kickstart >> /etc/cmdline.d/01-confluent.conf
kickstart=$proto://$mgr/confluent-public/os/$profilename/kickstart
root=anaconda-net:$proto://$mgr/confluent-public/os/$profilename/distribution
export kickstart
export root
autoconfigmethod=$(grep ipv4_method /etc/confluent/confluent.deploycfg)
autoconfigmethod=${autoconfigmethod#ipv4_method: }
if [ "$autoconfigmethod" = "dhcp" ]; then
echo ip=$ifname:dhcp >> /etc/cmdline.d/01-confluent.conf
else
v4addr=$(grep ^ipv4_address: /etc/confluent/confluent.deploycfg)
v4addr=${v4addr#ipv4_address: }
v4gw=$(grep ^ipv4_gateway: /etc/confluent/confluent.deploycfg)
v4gw=${v4gw#ipv4_gateway: }
if [ "$v4gw" = "null" ]; then
v4gw=""
fi
v4nm=$(grep ipv4_netmask: /etc/confluent/confluent.deploycfg)
v4nm=${v4nm#ipv4_netmask: }
echo ip=$v4addr::$v4gw:$v4nm:$hostname:$ifname:none >> /etc/cmdline.d/01-confluent.conf
fi
nameserversec=0
while read -r entry; do
if [ $nameserversec = 1 ]; then
if [[ $entry == "-"* ]] && [[ $entry != "- ''" ]]; then
echo nameserver=${entry#- } >> /etc/cmdline.d/01-confluent.conf
continue
fi
fi
nameserversec=0
if [ "${entry%:*}" = "nameservers" ]; then
nameserversec=1
continue
fi
done < /etc/confluent/confluent.deploycfg
@@ -0,0 +1 @@
[ -e /tmp/confluent.initq ]
@@ -0,0 +1,21 @@
#!/bin/bash
BUNDLENAME=/sysroot/etc/pki/tls/certs/ca-bundle.crt
while [ -h $BUNDLENAME ]; do
BUNDLENAME=/sysroot/$(readlink $BUNDLENAME)
done
cat /etc/pki/tls/certs/ca-bundle.crt > $BUNDLENAME
mkdir -p /sysroot/etc/confluent/
cp -a /tls /sysroot/etc/confluent
cp -a /etc/confluent/* /sysroot/etc/confluent/
sed -i 's/install::/install:*:/' /sysroot/etc/shadow
sed -i 's/root::/root:*:/' /sysroot/etc/shadow
mkdir -p /sysroot/root/.ssh
#chmod 700 /sysroot/root/.ssh
cat /ssh/*pubkey > /sysroot/root/.ssh/authorized_keys
#chmod 600 /sysroot/root/.ssh/authorized_keys
mkdir -p /sysroot/etc/ssh/
for i in /ssh/*.ca; do
echo '@cert-authority *' $(cat $i) >> /sysroot/etc/ssh/ssh_known_hosts
done
cp /opt/confluent/bin/apiclient /sysroot/etc/confluent
@@ -0,0 +1,25 @@
Ansible playbooks ending in .yml or .yaml that are placed into this directory will be executed at the
appropriate phase of the install process.
The 'hosts' may be omitted, and if included will be ignored, replaced with the host that is specifically
requesting the playbooks be executed.
Also, the playbooks will be executed on the deployment server. Hence it may be slower in aggregate than
running content under scripts/ which ask much less of the deployment server
Here is an example of what a playbook would look like broadly:
- name: Example
gather_facts: no
tasks:
- name: Example1
lineinfile:
path: /etc/hosts
line: 1.2.3.4 test1
create: yes
- name: Example2
lineinfile:
path: /etc/hosts
line: 1.2.3.5 test2
create: yes
@@ -0,0 +1,25 @@
Ansible playbooks ending in .yml or .yaml that are placed into this directory will be executed at the
appropriate phase of the install process.
The 'hosts' may be omitted, and if included will be ignored, replaced with the host that is specifically
requesting the playbooks be executed.
Also, the playbooks will be executed on the deployment server. Hence it may be slower in aggregate than
running content under scripts/ which ask much less of the deployment server
Here is an example of what a playbook would look like broadly:
- name: Example
gather_facts: no
tasks:
- name: Example1
lineinfile:
path: /etc/hosts
line: 1.2.3.4 test1
create: yes
- name: Example2
lineinfile:
path: /etc/hosts
line: 1.2.3.5 test2
create: yes
@@ -0,0 +1,7 @@
#!/bin/sh
sed -i 's/centos/CentOS/; s/rhel/Red Hat Enterprise Linux/; s/oraclelinux/Oracle Linux/; s/alma/AlmaLinux/' $2/profile.yaml
ln -s $1/images/pxeboot/vmlinuz $2/boot/kernel && \
ln -s $1/images/pxeboot/initrd.img $2/boot/initramfs/distribution
mkdir -p $2/boot/efi/boot && \
ln -s $1/EFI/BOOT/BOOTX64.EFI $1/EFI/BOOT/grubx64.efi $2/boot/efi/boot/
@@ -0,0 +1,82 @@
# In this OS profile, data is largely filled in during the %pre
# phase, rather than the kickstart actually having the content.
# None of the files shall be replaced during an upgrade in
# /var/lib/confluent/public/os/<profile>, so customization should
# be done by modifying files in /var/lib/confluent/public/os/<profile>
# /tmp/rootpw will provide a 'rootpw' line, either locking password if not configured
# or the crypted form.
%include /tmp/rootpw
# timezone is fetched from confluent server, which provides the
# timezone that the management server itself is in by default.
%include /tmp/timezone
# similar to timezone, confluent is asked to provide the
# deployment servers language info and replicate that
# to the deployment target.
%include /tmp/langinfo
# bootloader may be specified if crypted.grubpassword is set on
# a node. This will become a bootloader line if a password
# was specified
%include /tmp/grubpw
# The default partition scheme is applied to a single drive, using
# the getinstalldisk script to make a best guess as to the most
# appropriate device. See pre.sh and getinstalldisk to customize
# the automatic behavior, or comment out/delete the
# following line and provide your own manual partition plan
# instead
%include /tmp/partitioning
reboot
%packages
#-kernel-uek # This can opt out of the UEK for the relevant distribution
chrony
rsync
python
tar
pciutils
%include /tmp/addonpackages
%end
# A kickstart.custom file is provided to enable easily adding
# kickstart content without modifying the stock file.
# While the stock file may be safely modified, using the .custom
# files may allow for more easily rebasing custom profiles to newer
# stock profiles
%include /tmp/kickstart.custom
%pre
confluent_profile=$(grep ^profile: /etc/confluent/confluent.deploycfg |awk '{print $2}')
confluent_mgr=$(grep deploy_server /etc/confluent/confluent.deploycfg |awk '{print $2}')
curl -f https://$confluent_mgr/confluent-public/os/$confluent_profile/scripts/pre.sh > /tmp/preinst.sh
. /tmp/preinst.sh
%end
%post --nochroot
mkdir -p /mnt/sysimage/etc/confluent
confluent_profile=$(grep ^profile: /etc/confluent/confluent.deploycfg |awk '{print $2}')
confluent_mgr=$(grep deploy_server /etc/confluent/confluent.deploycfg |awk '{print $2}')
curl -f https://$confluent_mgr/confluent-public/os/$confluent_profile/scripts/prechroot.sh > /tmp/postinst.sh
. /tmp/postinst.sh
# Hook firstboot.sh
curl -f https://$confluent_mgr/confluent-public/os/$confluent_profile/scripts/firstboot.service > /mnt/sysimage/etc/systemd/system/firstboot.service
mkdir -p /mnt/sysimage/opt/confluent/bin
curl -f https://$confluent_mgr/confluent-public/os/$confluent_profile/scripts/firstboot.sh > /mnt/sysimage/opt/confluent/bin/firstboot.sh
chmod +x /mnt/sysimage/opt/confluent/bin/firstboot.sh
%end
%post
cat /etc/confluent/tls/*.pem >> /etc/pki/tls/certs/ca-bundle.crt
systemctl enable firstboot
chgrp ssh_keys /etc/ssh/ssh*key
restorecon /etc/ssh/ssh*key /root/.shosts /etc/ssh/shosts.equiv /etc/ssh/ssh_config.d/* /opt/confluent/bin/firstboot.sh
confluent_profile=$(grep ^profile: /etc/confluent/confluent.deploycfg |awk '{print $2}')
confluent_mgr=$(grep deploy_server /etc/confluent/confluent.deploycfg |awk '{print $2}')
curl -f https://$confluent_mgr/confluent-public/os/$confluent_profile/scripts/post.sh > /tmp/postinst.sh
. /tmp/postinst.sh
%end
@@ -0,0 +1,7 @@
# Any custom kickstart additions may go here. It may be required to
# modify base kickstart file to change certain portions, but adding
# custom content to this file allows for most convenient way to
# refresh to a newer base profile if desired.
# Two common example customizations are provided:
#firewall --disabled
#selinux --disabled
@@ -0,0 +1,3 @@
label: %%DISTRO%% %%VERSION%% %%ARCH%% (Default Profile)
kernelargs: quiet # These arguments are passed to the installer
#installedargs: example # These arguments would be added to the installed system
@@ -0,0 +1,43 @@
try:
import configparser
except ImportError:
import ConfigParser as configparser
import cStringIO
import imp
import sys
apiclient = imp.load_source('apiclient', '/etc/confluent/apiclient')
repo = None
server = None
profile = None
with open('/etc/confluent/confluent.deploycfg') as dplcfgfile:
lines = dplcfgfile.read().split('\n')
for line in lines:
if line.startswith('deploy_server:'):
_, server = line.split(' ', 1)
if line.startswith('profile: '):
_, profile = line.split(' ', 1)
path = '/confluent-public/os/{0}/distribution/'.format(profile)
clnt = apiclient.HTTPSClient()
cfgdata = clnt.grab_url(path + '.treeinfo').decode()
c = configparser.ConfigParser()
try:
c.read_string(cfgdata)
except AttributeError:
f = cStringIO.StringIO(cfgdata)
c.readfp(f)
for sec in c.sections():
if sec.startswith('variant-'):
try:
repopath = c.get(sec, 'repository')
except Exception:
continue
_, varname = sec.split('-', 1)
reponame = '/etc/yum.repos.d/local-{0}.repo'.format(varname.lower())
with open(reponame, 'w') as repout:
repout.write('[local-{0}]\n'.format(varname.lower()))
repout.write('name=Local install repository for {0}\n'.format(varname))
if repopath[0] == '.':
repopath = repopath[1:]
repout.write('baseurl=https://{}/confluent-public/os/{}/distribution/{}\n'.format(server, profile, repopath))
repout.write('enabled=1\n')
@@ -0,0 +1,414 @@
# Copyright 2017 Lenovo
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
import argparse
import ctypes
import fcntl
import json
from select import select
import socket
import struct
import os
import subprocess
import sys
import time
if os.path.exists('/opt/confluent/bin/apiclient'):
apiclient = '/opt/confluent/bin/apiclient'
elif os.path.exists('/etc/confluent/apiclient'):
apiclient = '/etc/confluent/apiclient'
class IpmiMsg(ctypes.Structure):
_fields_ = [('netfn', ctypes.c_ubyte),
('cmd', ctypes.c_ubyte),
('data_len', ctypes.c_short),
('data', ctypes.POINTER(ctypes.c_ubyte))]
class IpmiSystemInterfaceAddr(ctypes.Structure):
_fields_ = [('addr_type', ctypes.c_int),
('channel', ctypes.c_short),
('lun', ctypes.c_ubyte)]
class IpmiRecv(ctypes.Structure):
_fields_ = [('recv_type', ctypes.c_int),
('addr', ctypes.POINTER(IpmiSystemInterfaceAddr)),
('addr_len', ctypes.c_uint),
('msgid', ctypes.c_long),
('msg', IpmiMsg)]
class IpmiReq(ctypes.Structure):
_fields_ = [('addr', ctypes.POINTER(IpmiSystemInterfaceAddr)),
('addr_len', ctypes.c_uint),
('msgid', ctypes.c_long),
('msg', IpmiMsg)]
_IONONE = 0
_IOWRITE = 1
_IOREAD = 2
IPMICTL_SET_MY_ADDRESS_CMD = (
_IOREAD << 30 | ctypes.sizeof(ctypes.c_uint) << 16
| ord('i') << 8 | 17) # from ipmi.h
IPMICTL_SEND_COMMAND = (
_IOREAD << 30 | ctypes.sizeof(IpmiReq) << 16
| ord('i') << 8 | 13) # from ipmi.h
# next is really IPMICTL_RECEIVE_MSG_TRUNC, but will only use that
IPMICTL_RECV = (
(_IOWRITE | _IOREAD) << 30 | ctypes.sizeof(IpmiRecv) << 16
| ord('i') << 8 | 11) # from ipmi.h
BMC_SLAVE_ADDR = ctypes.c_uint(0x20)
CURRCHAN = 0xf
ADDRTYPE = 0xc
class Session(object):
def __init__(self, devnode='/dev/ipmi0'):
"""Create a local session inband
:param: devnode: The path to the ipmi device
"""
self.ipmidev = open(devnode, 'r+')
fcntl.ioctl(self.ipmidev, IPMICTL_SET_MY_ADDRESS_CMD, BMC_SLAVE_ADDR)
# the interface is initted, create some reusable memory for our session
self.databuffer = ctypes.create_string_buffer(4096)
self.req = IpmiReq()
self.rsp = IpmiRecv()
self.addr = IpmiSystemInterfaceAddr()
self.req.msg.data = ctypes.cast(
ctypes.addressof(self.databuffer),
ctypes.POINTER(ctypes.c_ubyte))
self.rsp.msg.data = self.req.msg.data
self.userid = None
self.password = None
def await_reply(self):
rd, _, _ = select((self.ipmidev,), (), (), 1)
while not rd:
rd, _, _ = select((self.ipmidev,), (), (), 1)
def pause(self, seconds):
time.sleep(seconds)
@property
def parsed_rsp(self):
response = {'netfn': self.rsp.msg.netfn, 'command': self.rsp.msg.cmd,
'code': bytearray(self.databuffer.raw)[0],
'data': bytearray(
self.databuffer.raw[1:self.rsp.msg.data_len])}
return response
def await_config(s, bmccfg, channel):
vlan = bmccfg.get('bmcvlan', None)
ipv4 = bmccfg.get('bmcipv4', None)
prefix = bmccfg.get('prefixv4', None)
gw = bmccfg.get('bmcgw', None)
def raw_command(self,
netfn,
command,
data=(),
bridge_request=None,
retry=True,
delay_xmit=None,
timeout=None,
waitall=False, rslun=0):
self.addr.channel = CURRCHAN
self.addr.addr_type = ADDRTYPE
self.addr.lun = rslun
self.req.addr_len = ctypes.sizeof(IpmiSystemInterfaceAddr)
self.req.addr = ctypes.pointer(self.addr)
self.req.msg.netfn = netfn
self.req.msg.cmd = command
if data:
data = memoryview(bytearray(data))
try:
self.databuffer[:len(data)] = data[:len(data)]
except ValueError:
self.databuffer[:len(data)] = data[:len(data)].tobytes()
self.req.msg.data_len = len(data)
fcntl.ioctl(self.ipmidev, IPMICTL_SEND_COMMAND, self.req)
self.await_reply()
self.rsp.msg.data_len = 4096
self.rsp.addr = ctypes.pointer(self.addr)
self.rsp.addr_len = ctypes.sizeof(IpmiSystemInterfaceAddr)
fcntl.ioctl(self.ipmidev, IPMICTL_RECV, self.rsp)
return self.parsed_rsp
def _is_tsm(model):
return model in ('7y00', '7z01', '7y98', '7y99')
def set_port(s, port, vendor, model):
oport = port
if vendor not in ('IBM', 'Lenovo'):
raise Exception('{0} not implemented'.format(vendor))
if _is_tsm(model):
return set_port_tsm(s, port, model)
else:
set_port_xcc(s, port, model)
return 1
def set_port_tsm(s, port, model):
oport = port
sys.stdout.write('Setting TSM port to "{}"...'.format(oport))
sys.stdout.flush()
if port == 'ocp':
s.raw_command(0x32, 0x71, b'\x00\x01\x00')
elif port == 'dedicated':
s.raw_command(0x32, 0x71, b'\x00\x00\x00')
else:
raise Exception("Unsupported port for TSM")
timer = 15
while timer:
timer = timer - 1
time.sleep(1.0)
sys.stdout.write('.')
sys.stdout.flush()
if port == 'ocp':
iface = 0
s.raw_command(0x32, 0x71, b'\x00\x00\x03')
elif port == 'dedicated':
iface = 1
s.raw_command(0x32, 0x71, b'\x00\x01\x03')
rsp = s.raw_command(0x32, 0x72, bytearray([4, iface, 0]))
print('Complete')
return int(rsp['data'][0])
def set_port_xcc(s, port, model):
oport = port
if port.lower() == 'dedicated':
port = b'\x01'
elif port.lower() in ('ml2', 'ocp'):
port = b'\x02\x00'
elif port.lower() == 'lom':
if model == '7x58':
port = b'\x00\x02'
else:
port = b'\x00\x00'
else:
port = port.split(' ')
port = bytes(bytearray([int(x) for x in port]))
currport = bytes(s.raw_command(0xc, 2, b'\x01\xc0\x00\x00')['data'][1:])
if port == currport:
sys.stdout.write('XCC port already set to "{}"\n'.format(oport))
return
sys.stdout.write('Setting XCC port to "{}"...'.format(oport))
sys.stdout.flush()
s.raw_command(0xc, 1, b'\x01\xc0' + port)
tries = 60
while currport != port and tries:
tries -= 1
time.sleep(0.5)
sys.stdout.write('.')
sys.stdout.flush()
currport = bytes(s.raw_command(0xc, 2, b'\x01\xc0\x00\x00')['data'][1:])
if not tries:
raise Exception('Timeout attempting to set port')
sys.stdout.write('Complete\n')
def check_vlan(s, vlan, channel):
if vlan == 'off':
vlan = b'\x00\x00'
else:
vlan = int(vlan)
if vlan:
vlan = vlan | 32768
vlan = struct.pack('<H', vlan)
currvlan = bytes(s.raw_command(0xc, 2, bytearray([channel, 0x14 ,0, 0]))['data'][1:])
if bytearray(currvlan)[1] & 0b10000000 == 0:
currvlan = b'\x00\x00'
return currvlan == vlan
def set_vlan(s, vlan, channel):
ovlan = vlan
if vlan == 'off':
vlan = b'\x00\x00'
else:
vlan = int(vlan)
if vlan:
vlan = vlan | 32768
vlan = struct.pack('<H', vlan)
if check_vlan(s, ovlan, channel):
sys.stdout.write('VLAN already configured to "{0}"\n'.format(ovlan))
return False
rsp = s.raw_command(0xc, 1, bytearray([channel, 0x14]) + vlan)
if rsp.get('code', 1) == 0:
print('VLAN configured to "{}"'.format(ovlan))
else:
print('Error setting vlan: ' + repr(rsp))
return True
def get_lan_channel(s):
for chan in range(1, 16):
rsp = s.raw_command(6, 0x42, bytearray([chan]))['data']
if not rsp:
continue
medtype = int(rsp[1]) & 0b1111111
if medtype not in (4, 6):
continue
rsp = s.raw_command(0xc, 2, bytearray([2, chan, 5, 0, 0]))
if rsp.get('code', 1) == 0:
return chan
return 1
def check_ipv4(s, ipaddr, channel):
ipaddr = bytearray(socket.inet_aton(ipaddr))
rsp = s.raw_command(0xc, 2, bytearray([channel, 3, 0, 0]))['data'][-4:]
return rsp == ipaddr
def set_ipv4(s, ipaddr, channel):
oipaddr = ipaddr
ipaddr = bytearray(socket.inet_aton(ipaddr))
if check_ipv4(s, oipaddr, channel):
print('IP Address already set to {}'.format(oipaddr))
return False
rsp = int(s.raw_command(0xc, 2, bytearray([channel, 4, 0, 0]))['data'][1]) & 0b1111
if rsp != 1:
sys.stdout.write("Changing configuration to static...")
sys.stdout.flush()
resp = s.raw_command(0xc, 1, bytearray([channel, 4, 1]))
tries = 0
while rsp != 1 and tries < 30:
sys.stdout.write('.')
sys.stdout.flush()
tries += 1
time.sleep(0.5)
rsp = int(s.raw_command(0xc, 2, bytearray([channel, 4, 0, 0]))['data'][1]) & 0b1111
sys.stdout.write('Complete\n')
sys.stdout.flush()
print('Setting IP to {}'.format(oipaddr))
s.raw_command(0xc, 1, bytearray([channel, 3]) + ipaddr)
return True
def check_subnet(s, prefix, channel):
prefix = int(prefix)
mask = bytearray(struct.pack('!I', (2**32 - 1) ^ (2**(32 - prefix) - 1)))
rsp = s.raw_command(0xc, 2, bytearray([channel, 6, 0, 0]))['data'][-4:]
return rsp == mask
def set_subnet(s, prefix, channel):
oprefix = prefix
prefix = int(prefix)
mask = bytearray(struct.pack('!I', (2**32 - 1) ^ (2**(32 - prefix) - 1)))
if check_subnet(s, prefix, channel):
print('Subnet Mask already set to /{}'.format(oprefix))
return False
print('Setting subnet mask to /{}'.format(oprefix))
s.raw_command(0xc, 1, bytearray([channel, 6]) + mask)
return True
def check_gateway(s, gw, channel):
gw = bytearray(socket.inet_aton(gw))
rsp = s.raw_command(0xc, 2, bytearray([channel, 12, 0, 0]))['data'][-4:]
return rsp == gw
def set_gateway(s, gw, channel):
ogw = gw
gw = bytearray(socket.inet_aton(gw))
rsp = s.raw_command(0xc, 2, bytearray([channel, 12, 0, 0]))['data'][-4:]
if check_gateway(s, ogw, channel):
print('Gateway already set to {}'.format(ogw))
return False
print('Setting gateway to {}'.format(ogw))
s.raw_command(0xc, 1, bytearray([channel, 12]) + gw)
return True
def dotwait():
sys.stdout.write('.')
sys.stdout.flush()
time.sleep(0.5)
def main():
a = argparse.ArgumentParser(description='Locally configure a BMC device')
a.add_argument('-v', help='vlan id or off to disable vlan tagging')
a.add_argument('-p', help='Which port to use (dedicated, lom, ocp, ml2)')
a.add_argument('-i', help='JSON configuration file to read for '
'configuration')
a.add_argument('-c', help='Use Confluent API to direct BMC configuration',
action='store_true')
args = a.parse_args()
if args.i:
bmccfg = json.load(open(args.i))
elif args.c:
bmccfgsrc = subprocess.check_output(
[sys.executable, apiclient, '/confluent-api/self/bmcconfig', '-j'])
bmccfg = json.loads(bmccfgsrc)
else:
bmccfg = {}
if args.p is not None:
bmccfg['bmcport'] = args.p
if args.v is not None:
bmccfg['bmcvlan'] = args.v
vendor = open('/sys/devices/virtual/dmi/id/sys_vendor').read()
vendor = vendor.strip()
try:
model = open('/sys/devices/virtual/dmi/id/product_sku').read().strip()
if model == 'none':
raise Exception('No SKU')
except Exception:
model = open('/sys/devices/virtual/dmi/id/product_name').read()
if vendor in ('Lenovo', 'IBM'):
if '[' in model and ']' in model:
model = model.split('[')[1].split(']')[0]
model = model[:4].lower()
s = Session('/dev/ipmi0')
if not bmccfg:
print("No BMC configuration specified, exiting.")
return
if bmccfg.get('bmcport', None):
channel = set_port(s, bmccfg['bmcport'], vendor, model)
else:
channel = get_lan_channel(s)
awaitvlan = False
awaitip = False
awaitprefix = False
awaitgw = False
if bmccfg.get('bmcvlan', None):
awaitvlan = set_vlan(s, bmccfg['bmcvlan'], channel)
if bmccfg.get('bmcipv4', None):
awaitip = set_ipv4(s, bmccfg['bmcipv4'], channel)
if bmccfg.get('prefixv4', None):
awaitprefix = set_subnet(s, bmccfg['prefixv4'], channel)
if bmccfg.get('bmcgw', None):
awaitgw = set_gateway(s, bmccfg['bmcgw'], channel)
sys.stdout.write('Waiting for changes to take effect...')
sys.stdout.flush()
while awaitvlan and not check_vlan(s, bmccfg['bmcvlan'], channel):
dotwait()
while awaitip and not check_ipv4(s, bmccfg['bmcipv4'], channel):
dotwait()
while awaitprefix and not check_subnet(s, bmccfg['prefixv4'], channel):
dotwait()
while awaitprefix and not check_gateway(s, bmccfg['bmcgw'], channel):
dotwait()
sys.stdout.write('done\n')
sys.stdout.flush()
#await_config(s, bmccfg, channel)
if __name__ == '__main__':
main()
@@ -0,0 +1,4 @@
. /etc/confluent/functions
# This is a convenient place to keep customizations separate from modifying the stock scripts
# While modification of the stock scripts is fine, it may be easier to rebase to a newer
# stock profile if the '.custom' files are used.
@@ -0,0 +1,11 @@
[Unit]
Description=First Boot Process
Requires=network-online.target
After=network-online.target
[Service]
ExecStart=/opt/confluent/bin/firstboot.sh
[Install]
WantedBy=multi-user.target
@@ -0,0 +1,36 @@
#!/bin/sh
# This script is executed on the first boot after install has
# completed. It is best to edit the middle of the file as
# noted below so custom commands are executed before
# the script notifies confluent that install is fully complete.
nodename=$(grep ^NODENAME /etc/confluent/confluent.info|awk '{print $2}')
confluent_apikey=$(cat /etc/confluent/confluent.apikey)
confluent_mgr=$(grep deploy_server /etc/confluent/confluent.deploycfg|awk '{print $2}')
confluent_profile=$(grep ^profile: /etc/confluent/confluent.deploycfg|awk '{print $2}')
export nodename confluent_mgr confluent_profile
. /etc/confluent/functions
exec >> /var/log/confluent/confluent-firstboot.log
exec 2>> /var/log/confluent/confluent-firstboot.log
tail -f /var/log/confluent/confluent-firstboot.log > /dev/console &
logshowpid=$!
if [ ! -f /etc/confluent/firstboot.ran ]; then
touch /etc/confluent/firstboot.ran
cat /etc/confluent/tls/*.pem >> /etc/pki/tls/certs/ca-bundle.crt
run_remote firstboot.custom
# Firstboot scripts may be placed into firstboot.d, e.g. firstboot.d/01-firstaction.sh, firstboot.d/02-secondaction.sh
run_remote_parts firstboot.d
# Induce execution of remote configuration, e.g. ansible plays in ansible/firstboot.d/
run_remote_config firstboot.d
fi
curl -X POST -d 'status: complete' -H "CONFLUENT_NODENAME: $nodename" -H "CONFLUENT_APIKEY: $confluent_apikey" https://$confluent_mgr/confluent-api/self/updatestatus
systemctl disable firstboot
rm /etc/systemd/system/firstboot.service
rm /etc/confluent/firstboot.ran
kill $logshowpid
@@ -0,0 +1,133 @@
function set_confluent_vars() {
if [ -z "$confluent_mgr" ]; then
confluent_mgr=$(grep ^deploy_server: /etc/confluent/confluent.deploycfg | sed -e 's/[^ ]*: //')
fi
if [ -z "$confluent_profile" ]; then
confluent_profile=$(grep ^profile: /etc/confluent/confluent.deploycfg | sed -e 's/[^ ]*: //')
fi
}
fetch_remote() {
curlargs=""
if [ -f /etc/confluent/ca.pem ]; then
curlargs=" --cacert /etc/confluent/ca.pem"
fi
set_confluent_vars
mkdir -p $(dirname $1)
curl -f -sS $curlargs https://$confluent_mgr/confluent-public/os/$confluent_profile/scripts/$1 > $1
if [ $? != 0 ]; then echo $1 failed to download; return 1; fi
}
source_remote_parts() {
confluentscripttmpdir=$(mktemp -d)
scriptlist=$(/usr/libexec/platform-python /etc/confluent/apiclient /confluent-api/self/scriptlist/$1|sed -e 's/^- //')
for script in $scriptlist; do
source_remote $1/$script
done
unset confluentscripttmpdir
}
run_remote_parts() {
confluentscripttmpdir=$(mktemp -d)
scriptlist=$(/usr/libexec/platform-python /etc/confluent/apiclient /confluent-api/self/scriptlist/$1|sed -e 's/^- //')
for script in $scriptlist; do
run_remote $1/$script
done
unset confluentscripttmpdir
}
source_remote() {
set_confluent_vars
echo
echo '---------------------------------------------------------------------------'
echo Sourcing $1 from https://$confluent_mgr/confluent-public/os/$confluent_profile/scripts/
if [ -z "$confluentscripttmpdir" ]; then
confluentscripttmpdir=$(mktemp -d)
fi
echo Sourcing from $confluentscripttmpdir
cd $confluentscripttmpdir
fetch_remote $1
if [ $? != 0 ]; then echo $1 failed to download; return 1; fi
chmod +x $1
cmd=$1
shift
source $cmd
cd - > /dev/null
return $retcode
}
run_remote() {
requestedcmd="'$*'"
set_confluent_vars
echo
echo '---------------------------------------------------------------------------'
echo Running $requestedcmd from https://$confluent_mgr/confluent-public/os/$confluent_profile/scripts/
if [ -z "$confluentscripttmpdir" ]; then
confluentscripttmpdir=$(mktemp -d)
fi
echo Executing in $confluentscripttmpdir
cd $confluentscripttmpdir
fetch_remote $1
if [ $? != 0 ]; then echo $requestedcmd failed to download; return 1; fi
chmod +x $1
cmd=$1
if [ -x /usr/bin/chcon ]; then
chcon system_u:object_r:bin_t:s0 $cmd
fi
shift
./$cmd $*
retcode=$?
if [ $retcode -ne 0 ]; then
echo "$requestedcmd exited with code $retcode"
fi
cd - > /dev/null
return $retcode
}
run_remote_python() {
echo
set_confluent_vars
if [ -f /etc/confluent/ca.pem ]; then
curlargs=" --cacert /etc/confluent/ca.pem"
fi
echo '---------------------------------------------------------------------------'
echo Running python script "'$*'" from https://$confluent_mgr/confluent-public/os/$confluent_profile/scripts/
tmpdir=$(mktemp -d)
echo Executing in $tmpdir
cd $tmpdir
mkdir -p $(dirname $1)
curl -f -sS $curlargs https://$confluent_mgr/confluent-public/os/$confluent_profile/scripts/$1 > $1
if [ $? != 0 ]; then echo "'$*'" failed to download; return 1; fi
if [ -x /usr/libexec/platform-python ]; then
/usr/libexec/platform-python $*
else
/usr/bin/python $*
fi
retcode=$?
echo "'$*' exited with code $retcode"
cd - > /dev/null
return $retcode
}
run_remote_config() {
echo
set_confluent_vars
apiclient=/opt/confluent/bin/apiclient
if [ -f /etc/confluent/apiclient ]; then
apiclient=/etc/confluent/apiclient
fi
echo '---------------------------------------------------------------------------'
echo Requesting to run remote configuration for "'$*'" from $confluent_mgr under profile $confluent_profile
if [ -x /usr/libexec/platform-python ]; then
/usr/libexec/platform-python $apiclient /confluent-api/self/remoteconfig/"$*" -d {}
/usr/libexec/platform-python $apiclient /confluent-api/self/remoteconfig/status -w 204
else
/usr/bin/python $apiclient /confluent-api/self/remoteconfig/"$*" -d {}
/usr/bin/python $apiclient /confluent-api/self/remoteconfig/status -w 204
fi
echo
echo 'Completed remote configuration'
echo '---------------------------------------------------------------------------'
return
}
@@ -0,0 +1,88 @@
import subprocess
import os
class DiskInfo(object):
def __init__(self, devname):
self.name = devname
self.wwn = None
self.path = None
self.model = ''
self.size = 0
self.driver = None
self.mdcontainer = ''
devnode = '/dev/{0}'.format(devname)
qprop = subprocess.check_output(
['udevadm', 'info', '--query=property', devnode])
if not isinstance(qprop, str):
qprop = qprop.decode('utf8')
for prop in qprop.split('\n'):
if '=' not in prop:
continue
k, v = prop.split('=', 1)
if k == 'DEVTYPE' and v != 'disk':
raise Exception('Not a disk')
elif k == 'DM_NAME':
raise Exception('Device Mapper')
elif k == 'ID_MODEL':
self.model = v
elif k == 'DEVPATH':
self.path = v
elif k == 'ID_WWN':
self.wwn = v
elif k == 'MD_CONTAINER':
self.mdcontainer = v
attrs = subprocess.check_output(['udevadm', 'info', '-a', devnode])
if not isinstance(attrs, str):
attrs = attrs.decode('utf8')
for attr in attrs.split('\n'):
if '==' not in attr:
continue
k, v = attr.split('==', 1)
k = k.strip()
if k == 'ATTRS{size}':
self.size = v.replace('"', '')
elif (k == 'DRIVERS' and not self.driver
and v not in ('"sd"', '""')):
self.driver = v.replace('"', '')
if not self.driver and 'imsm' not in self.mdcontainer:
raise Exception("No driver detected")
@property
def priority(self):
if self.model.lower() in ('thinksystem_m.2_vd', 'thinksystem m.2', 'thinksystem_m.2'):
return 0
if 'imsm' in self.mdcontainer:
return 1
if self.driver == 'ahci':
return 2
if self.driver.startswith('megaraid'):
return 3
if self.driver.startswith('mpt'):
return 4
return 99
def __repr__(self):
return repr({
'name': self.name,
'path': self.path,
'wwn': self.wwn,
'driver': self.driver,
'size': self.size,
'model': self.model,
})
def main():
disks = []
for disk in sorted(os.listdir('/sys/class/block')):
try:
disk = DiskInfo(disk)
disks.append(disk)
except Exception as e:
print("Skipping {0}: {1}".format(disk, str(e)))
nd = [x.name for x in sorted(disks, key=lambda x: x.priority)]
if nd:
open('/tmp/installdisk', 'w').write(nd[0])
if __name__ == '__main__':
main()
@@ -0,0 +1,19 @@
# To use this script, rename or copy the mofed image to either ofed.tgz or ofed.iso
# and modify the script below if wanting to use the iso instead of tgz
# It checks for mellanox devices and opts not to install, so this script could be added
# to a general profile without causing mofed to install on non-mellanox systems
. /etc/confluent/functions
if lspci -d 15b3:: -n |grep 15b3 > /dev/null; then
# Uncomment the following three lines and comment out the next
# two lines to use the .iso instead of the tgz packaging
#fetch_remote infiniband/mofed.iso
#mkdir MLNX_OFED
#mount -o loop infiniband/mofed.iso MLNX_OFED
fetch_remote infiniband/mofed.tgz
tar xf infiniband/mofed.tgz
# The rest is common between tar and iso
cd MLNX_OFED*
./mlnxofedinstall --force
fi
@@ -0,0 +1,10 @@
# Add needed base packages to the install
cat << EOF >> /tmp/addonpackages
perl
pkgconf-pkg-config
tcsh
lsof
tk
gcc-gfortran
tcl
EOF
@@ -0,0 +1,7 @@
. /etc/confluent/functions
# This is a convenient place to keep customizations separate from modifying the stock scripts
# While modification of the stock scripts is fine, it may be easier to rebase to a newer
# stock profile if the '.custom' files are used.
# An example for installing OFED for infiniband follows (see the file for more detail):
#run_remote infiniband/mofed.post
@@ -0,0 +1,49 @@
#!/bin/sh
mkdir -p /var/log/confluent
exec >> /var/log/confluent/confluent-post.log
exec 2>> /var/log/confluent/confluent-post.log
tail -f /var/log/confluent/confluent-post.log > /dev/tty &
logshowpid=$!
nodename=$(grep ^NODENAME /etc/confluent/confluent.info|awk '{print $2}')
apikey=$(cat /etc/confluent/confluent.apikey)
chmod 700 /etc/confluent
chmod og-rwx /etc/confluent/*
export confluent_mgr confluent_profile nodename
. /etc/confluent/functions
if [ -f /tmp/cryptboot ]; then
run_remote tpm_luks.sh
fi
# By default, the install repository is ignored, change
# this by manually adding local repositories
rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-*
run_remote_python add_local_repositories
# This script will execute in the installed system, but using the installer kernel prior to reboot.
# This is an appropriate place to run post install activities that do not require the actual installed
# kernel to run. For example adding drivers that would be needed for first boot to run cleanly.
# If, for example, there is a post script that has a dependency on a driver or filesystem that
# cannot work until booting into the installer, use firstboot.sh instead
# run_remote will download and execute from /var/lib/confluent/public/os/<profile>/scripts/ directory
# run_remote_python will use the appropriate python interpreter path to run the specified script
# A post.custom is provided to more conveniently hold customizations, see the post.custom file.
# This will induce server side processing of the syncfile contents if
# present
run_remote_python syncfileclient
# run_remote example.sh
# run_remote_python example.py
run_remote post.custom
# Also, scripts may be placed into 'post.d', e.g. post.d/01-runfirst.sh, post.d/02-runsecond.sh
run_remote_parts post.d
# Induce execution of remote configuration, e.g. ansible plays in ansible/post.d/
run_remote_config post.d
curl -sf -X POST -d 'status: staged' -H "CONFLUENT_NODENAME: $nodename" -H "CONFLUENT_APIKEY: $apikey" https://$confluent_mgr/confluent-api/self/updatestatus
kill $logshowpid
@@ -0,0 +1,13 @@
. /tmp/functions
# This is a convenient place to keep customizations separate from modifying the stock scripts
# While modification of the stock scripts is fine, it may be easier to rebase to a newer
# stock profile if the '.custom' files are used.
#
#Here is an example to locally configure the platform BMC according
#to confluent configuration so that the BMC would be on the correct
#network:
#run_remote_python configbmc -c
#Some addons improve efficiency by adding dependencies during install
#here is an example for adding OFED install prereqs to the install
#run_remote infiniband/mofed.pre
@@ -0,0 +1,82 @@
#!/bin/sh
# This runs prior to the installer beginning. This is used to rewrite the
# scripted install file, merging data from confluent and identifying
# the most appropriate install source.
# If you want to use a more custom partition plan, the easiest
# method is to edit the kicktstart file and comment out or
# delete %include /tmp/partitioning
if [ -f "/run/install/cmdline.d/01-autocons.conf" ]; then
consoledev=$(cat /run/install/cmdline.d/01-autocons.conf | sed -e 's!console=!/dev/!' -e 's/,.*//')
TMUX= tmux a <> $consoledev >&0 2>&1 &
fi
exec >> /tmp/confluent-pre.log
exec 2>> /tmp/confluent-pre.log
tail -f /tmp/confluent-pre.log > /dev/tty &
logshowpid=$!
nodename=$(grep ^NODENAME /etc/confluent/confluent.info|awk '{print $2}')
locale=$(grep ^locale: /etc/confluent/confluent.deploycfg)
locale=${locale#locale: }
keymap=$(grep ^keymap: /etc/confluent/confluent.deploycfg)
keymap=${keymap#keymap: }
echo lang $locale > /tmp/langinfo
echo keyboard --vckeymap=$keymap >> /tmp/langinfo
tz=$(grep ^timezone: /etc/confluent/confluent.deploycfg)
tz=${tz#timezone: }
ntpsrvs=""
if grep ^ntpservers: /etc/confluent/confluent.deploycfg > /dev/null; then
ntpsrvs="--ntpservers="$(sed -n '/^ntpservers:/,/^[^-]/p' /etc/confluent/confluent.deploycfg|sed 1d|sed '$d' | sed -e 's/^- //' | paste -sd,)
fi
echo timezone $ntpsrvs $tz --utc > /tmp/timezone
rootpw=$(grep ^rootpassword /etc/confluent/confluent.deploycfg | awk '{print $2}')
if [ "$rootpw" = null ]; then
echo "rootpw --lock" > /tmp/rootpw
else
echo "rootpw --iscrypted $rootpw" > /tmp/rootpw
fi
curl -sf https://$confluent_mgr/confluent-public/os/$confluent_profile/profile.yaml > /tmp/instprofile.yaml
blargs=$(grep ^installedargs: /tmp/instprofile.yaml | sed -e 's/#.*//' -e 's/^installedargs: //')
if [ ! -z "$blargs" ]; then
blargs=' --append="'$blargs'"'
fi
grubpw=$(grep ^grubpassword /etc/confluent/confluent.deploycfg | awk '{print $2}')
if [ "$grubpw" = "null" ]; then
touch /tmp/grubpw
else
blargs=" --iscrypted --password=$grubpw $blargs"
fi
if [ ! -z "$blargs" ]; then
echo "bootloader $blargs" > /tmp/grubpw
fi
ssh-keygen -A
for pubkey in /etc/ssh/ssh_host*key.pub; do
certfile=${pubkey/.pub/-cert.pub}
curl -sf -X POST -H "CONFLUENT_NODENAME: $nodename" -H "CONFLUENT_APIKEY: $(cat /etc/confluent/confluent.apikey)" -d @$pubkey https://$confluent_mgr/confluent-api/self/sshcert > $certfile
echo HostCertificate $certfile >> /etc/ssh/sshd_config.anaconda
done
/usr/sbin/sshd -f /etc/ssh/sshd_config.anaconda
cryptboot=$(grep ^encryptboot: /etc/confluent/confluent.deploycfg | awk '{print $2}')
LUKSPARTY=''
touch /tmp/addonpackages
if [ "$cryptboot" == "tpm2" ]; then
LUKSPARTY="--encrypted --passphrase=$(cat /etc/confluent/confluent.apikey)"
echo $cryptboot >> /tmp/cryptboot
fi
export confluent_mgr confluent_profile nodename
curl -sf https://$confluent_mgr/confluent-public/os/$confluent_profile/scripts/functions > /tmp/functions
. /tmp/functions
run_remote pre.custom
run_remote_parts pre.d
if [ ! -e /tmp/installdisk ]; then
run_remote_python getinstalldisk
fi
if [ -e /tmp/installdisk -a ! -e /tmp/partitioning ]; then
echo clearpart --all --initlabel >> /tmp/partitioning
echo ignoredisk --only-use $(cat /tmp/installdisk) >> /tmp/partitioning
echo autopart --nohome $LUKSPARTY >> /tmp/partitioning
fi
python /etc/confluent/apiclient /confluent-public/os/$confluent_profile/kickstart.custom -o /tmp/kickstart.custom
kill $logshowpid
@@ -0,0 +1,31 @@
#!/bin/sh
# This script runs after install is complete, but inside the installer
# environment. This is useful for carrying work done in pre/during the
# installer into the installed environment.
# It is almost certainly more useful to use post.sh or firstboot.sh
# for customization, which will run in a more normal mechanism
nodename=$(grep ^NODENAME /etc/confluent/confluent.info|awk '{print $2}')
export confluent_mgr confluent_profile nodename
cp -a /etc/confluent /mnt/sysimage/etc
chmod -R og-rwx /mnt/sysimage/etc/confluent
cp /tmp/functions /mnt/sysimage/etc/confluent/
hostnamectl set-hostname $nodename
cp /etc/hostname /mnt/sysimage/etc/hostname
. /tmp/functions
if [ -f /tmp/cryptboot ]; then
cp /tmp/cryptboot /mnt/sysimage/tmp/
fi
mkdir -p /mnt/sysimage/var/log/confluent
mv /tmp/confluent-pre.log /mnt/sysimage/var/log/confluent
echo Port 2222 >> /etc/ssh/sshd_config.anaconda
echo Match LocalPort 22 >> /etc/ssh/sshd_config.anaconda
echo " ChrootDirectory /mnt/sysimage" >> /etc/ssh/sshd_config.anaconda
kill -HUP $(cat /run/sshd.pid)
# Preserve the ssh setup work done for the installer
# by copying into the target system and setting up
# host based authentication
run_remote setupssh.sh
@@ -0,0 +1,23 @@
#!/bin/sh
grep HostCert /etc/ssh/sshd_config.anaconda >> /mnt/sysimage/etc/ssh/sshd_config
echo HostbasedAuthentication yes >> /mnt/sysimage/etc/ssh/sshd_config
echo HostbasedUsesNameFromPacketOnly yes >> /mnt/sysimage/etc/ssh/sshd_config
echo IgnoreRhosts no >> /mnt/sysimage/etc/ssh/sshd_config
sshconf=/mnt/sysimage/etc/ssh/ssh_config
if [ -d /mnt/sysimage/etc/ssh/ssh_config.d/ ]; then
sshconf=/mnt/sysimage/etc/ssh/ssh_config.d/01-confluent.conf
fi
echo 'Host *' >> $sshconf
echo ' HostbasedAuthentication yes' >> $sshconf
echo ' EnableSSHKeysign yes' >> $sshconf
echo ' HostbasedKeyTypes *ed25519*' >> $sshconf
cp /etc/ssh/ssh_host_* /mnt/sysimage/etc/ssh/
mkdir /mnt/sysimage/root/.ssh/
chmod 700 /mnt/sysimage/root/.ssh/
cp /root/.ssh/authorized_keys /mnt/sysimage/root/.ssh/
chmod 600 /mnt/sysimage/root/.ssh/authorized_keys
cp /etc/ssh/ssh_known_hosts /mnt/sysimage/etc/ssh/
curl -f -H "CONFLUENT_NODENAME: $nodename" -H "CONFLUENT_APIKEY: $(cat /etc/confluent/confluent.apikey)" https://$confluent_mgr/confluent-api/self/nodelist > /tmp/allnodes
cp /tmp/allnodes /mnt/sysimage/etc/ssh/shosts.equiv
cp /tmp/allnodes /mnt/sysimage/root/.shosts
@@ -0,0 +1,225 @@
#!/usr/bin/python
import importlib
import tempfile
import json
import os
import shutil
try:
from importlib.machinery import SourceFileLoader
def load_source(mod, path):
return SourceFileLoader(mod, path).load_module()
except ImportError:
from imp import load_source
try:
apiclient = load_source('apiclient', '/opt/confluent/bin/apiclient')
except IOError:
apiclient = load_source('apiclient', '/etc/confluent/apiclient')
def partitionhostsline(line):
comment = ''
try:
cmdidx = line.index('#')
comment = line[cmdidx:]
line = line[:cmdidx].strip()
except ValueError:
pass
if not line:
return '', [], comment
ipaddr, names = line.split(maxsplit=1)
names = names.split()
return ipaddr, names, comment
class HostMerger:
def __init__(self):
self.byip = {}
self.byname = {}
self.sourcelines = []
self.targlines = []
def read_source(self, sourcefile):
with open(sourcefile, 'r') as hfile:
self.sourcelines = hfile.read().split('\n')
while not self.sourcelines[-1]:
self.sourcelines = self.sourcelines[:-1]
for x in range(len(self.sourcelines)):
line = self.sourcelines[x]
currip, names, comment = partitionhostsline(line)
if currip:
self.byip[currip] = x
for name in names:
self.byname[name] = x
def read_target(self, targetfile):
with open(targetfile, 'r') as hfile:
lines = hfile.read().split('\n')
if not lines[-1]:
lines = lines[:-1]
for y in range(len(lines)):
line = lines[y]
currip, names, comment = partitionhostsline(line)
if currip in self.byip:
x = self.byip[currip]
if self.sourcelines[x] is None:
# have already consumed this enntry
continue
self.targlines.append(self.sourcelines[x])
self.sourcelines[x] = None
continue
for name in names:
if name in self.byname:
x = self.byname[name]
if self.sourcelines[x] is None:
break
self.targlines.append(self.sourcelines[x])
self.sourcelines[x] = None
break
else:
self.targlines.append(line)
def write_out(self, targetfile):
while not self.targlines[-1]:
self.targlines = self.targlines[:-1]
while not self.sourcelines[-1]:
self.sourcelines = self.sourcelines[:-1]
with open(targetfile, 'w') as hosts:
for line in self.targlines:
hosts.write(line + '\n')
for line in self.sourcelines:
if line is not None:
hosts.write(line + '\n')
class CredMerger:
def __init__(self):
try:
with open('/etc/login.defs', 'r') as ldefs:
defs = ldefs.read().split('\n')
except FileNotFoundError:
defs = []
lkup = {}
self.discardnames = {}
self.shadowednames = {}
for line in defs:
try:
line = line[:line.index('#')]
except ValueError:
pass
keyval = line.split()
if len(keyval) < 2:
continue
lkup[keyval[0]] = keyval[1]
self.uidmin = int(lkup.get('UID_MIN', 1000))
self.uidmax = int(lkup.get('UID_MAX', 60000))
self.gidmin = int(lkup.get('GID_MIN', 1000))
self.gidmax = int(lkup.get('GID_MAX', 60000))
self.shadowlines = None
def read_passwd(self, source, targfile=False):
self.read_generic(source, self.uidmin, self.uidmax, targfile)
def read_group(self, source, targfile=False):
self.read_generic(source, self.gidmin, self.gidmax, targfile)
def read_generic(self, source, minid, maxid, targfile):
if targfile:
self.targdata = []
else:
self.sourcedata = []
with open(source, 'r') as inputfile:
for line in inputfile.read().split('\n'):
try:
name, _, uid, _ = line.split(':', 3)
uid = int(uid)
except ValueError:
continue
if targfile:
if uid <= minid or uid >= maxid:
self.targdata.append(line)
else:
self.discardnames[name] = 1
else:
if uid >= minid and uid <= maxid:
self.sourcedata.append(line)
def read_shadow(self, source):
self.shadowlines = []
try:
with open(source, 'r') as inshadow:
for line in inshadow.read().split('\n'):
try:
name, _ = line.split(':' , 1)
except ValueError:
continue
if name in self.discardnames:
continue
self.shadowednames[name] = 1
self.shadowlines.append(line)
except FileNotFoundError:
return
def write_out(self, outfile):
with open(outfile, 'w') as targ:
for line in self.targdata:
targ.write(line + '\n')
for line in self.sourcedata:
targ.write(line + '\n')
if outfile == '/etc/passwd':
if self.shadowlines is None:
self.read_shadow('/etc/shadow')
with open('/etc/shadow', 'w') as shadout:
for line in self.shadowlines:
shadout.write(line + '\n')
for line in self.sourcedata:
name, _ = line.split(':', 1)
if name in self.shadowednames:
continue
shadout.write(name + ':!:::::::\n')
if outfile == '/etc/group':
if self.shadowlines is None:
self.read_shadow('/etc/gshadow')
with open('/etc/gshadow', 'w') as shadout:
for line in self.shadowlines:
shadout.write(line + '\n')
for line in self.sourcedata:
name, _ = line.split(':' , 1)
if name in self.shadowednames:
continue
shadout.write(name + ':!::\n')
def synchronize():
tmpdir = tempfile.mkdtemp()
try:
ac = apiclient.HTTPSClient()
data = json.dumps({'merge': tmpdir})
status, rsp = ac.grab_url_with_status('/confluent-api/self/remotesyncfiles', data)
if status == 202:
while status != 204:
status, rsp = ac.grab_url_with_status('/confluent-api/self/remotesyncfiles')
if not isinstance(rsp, str):
rsp = rsp.decode('utf8')
pendpasswd = os.path.join(tmpdir, 'etc/passwd')
if os.path.exists(pendpasswd):
cm = CredMerger()
cm.read_passwd(pendpasswd, targfile=False)
cm.read_passwd('/etc/passwd', targfile=True)
cm.write_out('/etc/passwd')
pendgroup = os.path.join(tmpdir, 'etc/group')
if os.path.exists(pendgroup):
cm = CredMerger()
cm.read_group(pendgroup, targfile=False)
cm.read_group('/etc/group', targfile=True)
cm.write_out('/etc/group')
pendhosts = os.path.join(tmpdir, 'etc/hosts')
if os.path.exists(pendhosts):
cm = HostMerger()
cm.read_source(pendhosts)
cm.read_target('/etc/hosts')
cm.write_out('/etc/hosts')
finally:
shutil.rmtree(tmpdir)
if __name__ == '__main__':
synchronize()
@@ -0,0 +1,4 @@
#!/bin/sh
cryptdisk=$(blkid -t TYPE="crypto_LUKS"|sed -e s/:.*//)
clevis luks bind -f -d $cryptdisk -k - tpm2 '{}' < /etc/confluent/confluent.apikey
cryptsetup luksRemoveKey $cryptdisk < /etc/confluent/confluent.apikey
@@ -0,0 +1,13 @@
# This file lists files to synchronize or merge to the deployed systems from the deployment server
# To specify taking /some/path/hosts on the deploymennt server and duplicating it to /etc/hosts:
# /some/path/hosts -> /etc/hosts
# If wanting to simply use the same path for source and destinaiton, the -> may be skipped:
# /etc/hosts
# Entries under MERGE will attempt to be intelligently merged. This supports /etc/group and /etc/passwd
# Any supporting entries in /etc/shadow or /etc/gshadow are added automatically, with password disabled
# It also will not inject 'system' ids (under 1,000 usually) as those tend to be local and rpm managed.
MERGE:
# /etc/passwd
# /etc/group
@@ -0,0 +1,18 @@
#!/bin/bash
echo -n "" >> /tmp/net.ifaces
cat /tls/*.0 >> /etc/pki/tls/certs/ca-bundle.crt
if ! grep console= /proc/cmdline >& /dev/null; then
autocons=$(/opt/confluent/bin/autocons)
if [ -n "$autocons" ]; then
echo console=$autocons |sed -e 's!/dev/!!' >> /tmp/01-autocons.conf
autocons=${autocons%,*}
echo $autocons > /tmp/01-autocons.devnode
echo "Detected firmware specified console at $(cat /tmp/01-autocons.conf)" > $autocons
echo "Initializing auto detected console when installer starts" > $autocons
fi
fi
if grep console=ttyS /proc/cmdline >& /dev/null; then
echo "Serial console has been requested in the kernel arguments, the local video may not show progress" > /dev/tty1
fi
. /lib/anaconda-lib.sh
wait_for_kickstart
@@ -0,0 +1,121 @@
#!/bin/sh
[ -e /tmp/confluent.initq ] && return 0
if [ -f /tmp/dd_disk ]; then
for dd in $(cat /tmp/dd_disk); do
if [ -e $dd ]; then
driver-updates --disk $dd $dd
fi
done
fi
vlaninfo=$(getarg vlan)
if [ ! -z "$vlaninfo" ]; then
vldev=${vlaninfo#*:}
vlid=${vlaninfo#*.}
vlid=${vlid%:*}
ip link add link $vldev name $vldev.$vlid type vlan id $vlid
fi
TRIES=0
oum=$(umask)
umask 0077
mkdir -p /etc/confluent
echo -n > /etc/confluent/confluent.info
umask $oum
cd /sys/class/net
while ! grep ^EXTMGRINFO: /etc/confluent/confluent.info | awk -F'|' '{print $3}' | grep 1 >& /dev/null && [ "$TRIES" -lt 60 ]; do
TRIES=$((TRIES + 1))
for currif in *; do
ip link set $currif up
done
/opt/confluent/bin/copernicus -t > /etc/confluent/confluent.info
done
cd /
grep ^EXTMGRINFO: /etc/confluent/confluent.info || return 0 # Do absolutely nothing if no data at all yet
echo -n "" > /tmp/confluent.initq
# restart cmdline
echo -n "" > /etc/cmdline.d/01-confluent.conf
nodename=$(grep ^NODENAME /etc/confluent/confluent.info|awk '{print $2}')
#TODO: blkid --label <whatever> to find mounted api
cat /tls/*.pem > /etc/confluent/ca.pem
/usr/libexec/platform-python /opt/confluent/bin/apiclient /confluent-api/self/deploycfg > /etc/confluent/confluent.deploycfg
ifidx=$(cat /tmp/confluent.ifidx)
ifname=$(ip link |grep ^$ifidx:|awk '{print $2}')
ifname=${ifname%:}
ifname=${ifname%@*}
echo $ifname > /tmp/net.ifaces
dnsdomain=$(grep ^dnsdomain: /etc/confluent/confluent.deploycfg)
dnsdomain=${dnsdomain#dnsdomain: }
hostname=$nodename
if [ ! -z "$dnsdomain" ] && [ "$dnsdomain" != "null" ]; then
hostname=$hostname.$dnsdomain
fi
mgr=$(grep ^deploy_server: /etc/confluent/confluent.deploycfg)
mgr=${mgr#deploy_server: }
profilename=$(grep ^profile: /etc/confluent/confluent.deploycfg)
profilename=${profilename#profile: }
proto=$(grep ^protocol: /etc/confluent/confluent.deploycfg)
proto=${proto#protocol: }
textconsole=$(grep ^textconsole: /etc/confluent/confluent.deploycfg)
textconsole=${textconsole#textconsole: }
if [ "$textconsole" = "true" ] && ! grep console= /proc/cmdline > /dev/null; then
autocons=$(cat /tmp/01-autocons.devnode)
if [ ! -z "$autocons" ]; then
echo Auto-configuring installed system to use text console
echo Auto-configuring installed system to use text console > $autocons
cp /tmp/01-autocons.conf /etc/cmdline.d/
else
echo "Unable to automatically detect requested text console"
fi
fi
echo inst.repo=$proto://$mgr/confluent-public/os/$profilename/distribution >> /etc/cmdline.d/01-confluent.conf
echo inst.ks=$proto://$mgr/confluent-public/os/$profilename/kickstart >> /etc/cmdline.d/01-confluent.conf
kickstart=$proto://$mgr/confluent-public/os/$profilename/kickstart
root=anaconda-net:$proto://$mgr/confluent-public/os/$profilename/distribution
export kickstart
export root
autoconfigmethod=$(grep ipv4_method /etc/confluent/confluent.deploycfg)
autoconfigmethod=${autoconfigmethod#ipv4_method: }
if [ "$autoconfigmethod" = "dhcp" ]; then
echo ip=$ifname:dhcp >> /etc/cmdline.d/01-confluent.conf
else
v4addr=$(grep ^ipv4_address: /etc/confluent/confluent.deploycfg)
v4addr=${v4addr#ipv4_address: }
v4gw=$(grep ^ipv4_gateway: /etc/confluent/confluent.deploycfg)
v4gw=${v4gw#ipv4_gateway: }
if [ "$v4gw" = "null" ]; then
v4gw=""
fi
v4nm=$(grep ipv4_netmask: /etc/confluent/confluent.deploycfg)
v4nm=${v4nm#ipv4_netmask: }
echo ip=$v4addr::$v4gw:$v4nm:$hostname:$ifname:none >> /etc/cmdline.d/01-confluent.conf
fi
nameserversec=0
while read -r entry; do
if [ $nameserversec = 1 ]; then
if [[ $entry == "-"* ]] && [[ $entry != "- ''" ]]; then
echo nameserver=${entry#- } >> /etc/cmdline.d/01-confluent.conf
continue
fi
fi
nameserversec=0
if [ "${entry%:*}" = "nameservers" ]; then
nameserversec=1
continue
fi
done < /etc/confluent/confluent.deploycfg
if [ -e /lib/nm-lib.sh ]; then
. /lib/nm-lib.sh
nm_generate_connections
if [[ "$ifname" == ib* ]]; then
sed -i s/type=ethernet/type=infiniband/ /run/NetworkManager/system-connections/$ifname.nmconnection
if ! grep '\[infiniband\]' /run/NetworkManager/system-connections/$ifname.nmconnection > /dev/null; then
echo >> /run/NetworkManager/system-connections/$ifname.nmconnection
echo '[infiniband]' >> /run/NetworkManager/system-connections/$ifname.nmconnection
echo transport-mode=datagram >> /run/NetworkManager/system-connections/$ifname.nmconnection
fi
fi
fi
@@ -0,0 +1,22 @@
#!/bin/bash
BUNDLENAME=/sysroot/etc/pki/tls/certs/ca-bundle.crt
while [ -h $BUNDLENAME ]; do
BUNDLENAME=/sysroot/$(readlink $BUNDLENAME)
done
cat /etc/pki/tls/certs/ca-bundle.crt > $BUNDLENAME
mkdir -p /sysroot/etc/confluent/
chmod 700 /sysroot/etc/confluent
cp -a /tls /sysroot/etc/confluent
cp /etc/confluent/* /sysroot/etc/confluent
sed -i 's/install::/install:*:/' /sysroot/etc/shadow
sed -i 's/root::/root:*:/' /sysroot/etc/shadow
mkdir -p /sysroot/root/.ssh
chmod 700 /sysroot/root/.ssh
cat /ssh/*pubkey > /sysroot/root/.ssh/authorized_keys
chmod 600 /sysroot/root/.ssh/authorized_keys
mkdir -p /sysroot/etc/ssh/
for i in /ssh/*.ca; do
echo '@cert-authority *' $(cat $i) >> /sysroot/etc/ssh/ssh_known_hosts
done
cp /opt/confluent/bin/apiclient /sysroot/etc/confluent
@@ -0,0 +1,25 @@
Ansible playbooks ending in .yml or .yaml that are placed into this directory will be executed at the
appropriate phase of the install process.
The 'hosts' may be omitted, and if included will be ignored, replaced with the host that is specifically
requesting the playbooks be executed.
Also, the playbooks will be executed on the deployment server. Hence it may be slower in aggregate than
running content under scripts/ which ask much less of the deployment server
Here is an example of what a playbook would look like broadly:
- name: Example
gather_facts: no
tasks:
- name: Example1
lineinfile:
path: /etc/hosts
line: 1.2.3.4 test1
create: yes
- name: Example2
lineinfile:
path: /etc/hosts
line: 1.2.3.5 test2
create: yes
@@ -0,0 +1,25 @@
Ansible playbooks ending in .yml or .yaml that are placed into this directory will be executed at the
appropriate phase of the install process.
The 'hosts' may be omitted, and if included will be ignored, replaced with the host that is specifically
requesting the playbooks be executed.
Also, the playbooks will be executed on the deployment server. Hence it may be slower in aggregate than
running content under scripts/ which ask much less of the deployment server
Here is an example of what a playbook would look like broadly:
- name: Example
gather_facts: no
tasks:
- name: Example1
lineinfile:
path: /etc/hosts
line: 1.2.3.4 test1
create: yes
- name: Example2
lineinfile:
path: /etc/hosts
line: 1.2.3.5 test2
create: yes
@@ -0,0 +1,7 @@
#!/bin/sh
sed -i 's/centos/CentOS/; s/rhel/Red Hat Enterprise Linux/; s/oraclelinux/Oracle Linux/; s/alma/AlmaLinux/' $2/profile.yaml
ln -s $1/images/pxeboot/vmlinuz $2/boot/kernel && \
ln -s $1/images/pxeboot/initrd.img $2/boot/initramfs/distribution
mkdir -p $2/boot/efi/boot && \
ln -s $1/EFI/BOOT/BOOTX64.EFI $1/EFI/BOOT/grubx64.efi $2/boot/efi/boot/
@@ -0,0 +1,84 @@
# In this OS profile, data is largely filled in during the %pre
# phase, rather than the kickstart actually having the content.
# None of the files shall be replaced during an upgrade in
# /var/lib/confluent/public/os/<profile>, so customization should
# be done by modifying files in /var/lib/confluent/public/os/<profile>
# /tmp/rootpw will provide a 'rootpw' line, either locking password if not configured
# or the crypted form.
%include /tmp/rootpw
# timezone is fetched from confluent server, which provides the
# timezone that the management server itself is in by default.
%include /tmp/timezone
# similar to timezone, confluent is asked to provide the
# deployment servers language info and replicate that
# to the deployment target.
%include /tmp/langinfo
# bootloader may be specified if crypted.grubpassword is set on
# a node. This will become a bootloader line if a password
# was specified
%include /tmp/grubpw
# The default partition scheme is applied to a single drive, using
# the getinstalldisk script to make a best guess as to the most
# appropriate device. See pre.sh and getinstalldisk to customize
# the automatic behavior, or comment out/delete the
# following line and provide your own manual partition plan
# instead
%include /tmp/partitioning
reboot
%packages
@^minimal-environment
#-kernel-uek # This can opt out of the UEK for the relevant distribution
chrony
rsync
python3
tar
pciutils
%include /tmp/addonpackages
%include /tmp/cryptpkglist
%end
# A kickstart.custom file is provided to enable easily adding
# kickstart content without modifying the stock file.
# While the stock file may be safely modified, using the .custom
# files may allow for more easily rebasing custom profiles to newer
# stock profiles
%include /tmp/kickstart.custom
%pre
confluent_profile=$(grep ^profile: /etc/confluent/confluent.deploycfg |awk '{print $2}')
confluent_mgr=$(grep deploy_server /etc/confluent/confluent.deploycfg |awk '{print $2}')
curl -f https://$confluent_mgr/confluent-public/os/$confluent_profile/scripts/pre.sh > /tmp/preinst.sh
. /tmp/preinst.sh
%end
%post --nochroot
mkdir -p /mnt/sysimage/etc/confluent
confluent_profile=$(grep ^profile: /etc/confluent/confluent.deploycfg |awk '{print $2}')
confluent_mgr=$(grep deploy_server /etc/confluent/confluent.deploycfg |awk '{print $2}')
curl -f https://$confluent_mgr/confluent-public/os/$confluent_profile/scripts/prechroot.sh > /tmp/postinst.sh
. /tmp/postinst.sh
# Hook firstboot.sh
curl -f https://$confluent_mgr/confluent-public/os/$confluent_profile/scripts/firstboot.service > /mnt/sysimage/etc/systemd/system/firstboot.service
mkdir -p /mnt/sysimage/opt/confluent/bin
curl -f https://$confluent_mgr/confluent-public/os/$confluent_profile/scripts/firstboot.sh > /mnt/sysimage/opt/confluent/bin/firstboot.sh
chmod +x /mnt/sysimage/opt/confluent/bin/firstboot.sh
%end
%post
cat /etc/confluent/tls/*.pem >> /etc/pki/tls/certs/ca-bundle.crt
systemctl enable firstboot
chgrp ssh_keys /etc/ssh/ssh*key
restorecon /etc/ssh/ssh*key /root/.shosts /etc/ssh/shosts.equiv /etc/ssh/ssh_config.d/* /opt/confluent/bin/firstboot.sh
confluent_profile=$(grep ^profile: /etc/confluent/confluent.deploycfg |awk '{print $2}')
confluent_mgr=$(grep deploy_server /etc/confluent/confluent.deploycfg |awk '{print $2}')
curl -f https://$confluent_mgr/confluent-public/os/$confluent_profile/scripts/post.sh > /tmp/postinst.sh
. /tmp/postinst.sh
%end
@@ -0,0 +1,7 @@
# Any custom kickstart additions may go here. It may be required to
# modify base kickstart file to change certain portions, but adding
# custom content to this file allows for most convenient way to
# refresh to a newer base profile if desired.
# Two common example customizations are provided:
#firewall --disabled
#selinux --disabled
@@ -0,0 +1,3 @@
label: %%DISTRO%% %%VERSION%% %%ARCH%% (Default Profile)
kernelargs: quiet # These arguments are passed to the installer
#installedargs: example # These arguments would be added to the installed system
@@ -0,0 +1,43 @@
try:
import configparser
except ImportError:
import ConfigParser as configparser
import cStringIO
import imp
import sys
apiclient = imp.load_source('apiclient', '/etc/confluent/apiclient')
repo = None
server = None
profile = None
with open('/etc/confluent/confluent.deploycfg') as dplcfgfile:
lines = dplcfgfile.read().split('\n')
for line in lines:
if line.startswith('deploy_server:'):
_, server = line.split(' ', 1)
if line.startswith('profile: '):
_, profile = line.split(' ', 1)
path = '/confluent-public/os/{0}/distribution/'.format(profile)
clnt = apiclient.HTTPSClient()
cfgdata = clnt.grab_url(path + '.treeinfo').decode()
c = configparser.ConfigParser()
try:
c.read_string(cfgdata)
except AttributeError:
f = cStringIO.StringIO(cfgdata)
c.readfp(f)
for sec in c.sections():
if sec.startswith('variant-'):
try:
repopath = c.get(sec, 'repository')
except Exception:
continue
_, varname = sec.split('-', 1)
reponame = '/etc/yum.repos.d/local-{0}.repo'.format(varname.lower())
with open(reponame, 'w') as repout:
repout.write('[local-{0}]\n'.format(varname.lower()))
repout.write('name=Local install repository for {0}\n'.format(varname))
if repopath[0] == '.':
repopath = repopath[1:]
repout.write('baseurl=https://{}/confluent-public/os/{}/distribution/{}\n'.format(server, profile, repopath))
repout.write('enabled=1\n')
@@ -0,0 +1,414 @@
# Copyright 2017 Lenovo
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
import argparse
import ctypes
import fcntl
import json
from select import select
import socket
import struct
import os
import subprocess
import sys
import time
if os.path.exists('/opt/confluent/bin/apiclient'):
apiclient = '/opt/confluent/bin/apiclient'
elif os.path.exists('/etc/confluent/apiclient'):
apiclient = '/etc/confluent/apiclient'
class IpmiMsg(ctypes.Structure):
_fields_ = [('netfn', ctypes.c_ubyte),
('cmd', ctypes.c_ubyte),
('data_len', ctypes.c_short),
('data', ctypes.POINTER(ctypes.c_ubyte))]
class IpmiSystemInterfaceAddr(ctypes.Structure):
_fields_ = [('addr_type', ctypes.c_int),
('channel', ctypes.c_short),
('lun', ctypes.c_ubyte)]
class IpmiRecv(ctypes.Structure):
_fields_ = [('recv_type', ctypes.c_int),
('addr', ctypes.POINTER(IpmiSystemInterfaceAddr)),
('addr_len', ctypes.c_uint),
('msgid', ctypes.c_long),
('msg', IpmiMsg)]
class IpmiReq(ctypes.Structure):
_fields_ = [('addr', ctypes.POINTER(IpmiSystemInterfaceAddr)),
('addr_len', ctypes.c_uint),
('msgid', ctypes.c_long),
('msg', IpmiMsg)]
_IONONE = 0
_IOWRITE = 1
_IOREAD = 2
IPMICTL_SET_MY_ADDRESS_CMD = (
_IOREAD << 30 | ctypes.sizeof(ctypes.c_uint) << 16
| ord('i') << 8 | 17) # from ipmi.h
IPMICTL_SEND_COMMAND = (
_IOREAD << 30 | ctypes.sizeof(IpmiReq) << 16
| ord('i') << 8 | 13) # from ipmi.h
# next is really IPMICTL_RECEIVE_MSG_TRUNC, but will only use that
IPMICTL_RECV = (
(_IOWRITE | _IOREAD) << 30 | ctypes.sizeof(IpmiRecv) << 16
| ord('i') << 8 | 11) # from ipmi.h
BMC_SLAVE_ADDR = ctypes.c_uint(0x20)
CURRCHAN = 0xf
ADDRTYPE = 0xc
class Session(object):
def __init__(self, devnode='/dev/ipmi0'):
"""Create a local session inband
:param: devnode: The path to the ipmi device
"""
self.ipmidev = open(devnode, 'r+')
fcntl.ioctl(self.ipmidev, IPMICTL_SET_MY_ADDRESS_CMD, BMC_SLAVE_ADDR)
# the interface is initted, create some reusable memory for our session
self.databuffer = ctypes.create_string_buffer(4096)
self.req = IpmiReq()
self.rsp = IpmiRecv()
self.addr = IpmiSystemInterfaceAddr()
self.req.msg.data = ctypes.cast(
ctypes.addressof(self.databuffer),
ctypes.POINTER(ctypes.c_ubyte))
self.rsp.msg.data = self.req.msg.data
self.userid = None
self.password = None
def await_reply(self):
rd, _, _ = select((self.ipmidev,), (), (), 1)
while not rd:
rd, _, _ = select((self.ipmidev,), (), (), 1)
def pause(self, seconds):
time.sleep(seconds)
@property
def parsed_rsp(self):
response = {'netfn': self.rsp.msg.netfn, 'command': self.rsp.msg.cmd,
'code': bytearray(self.databuffer.raw)[0],
'data': bytearray(
self.databuffer.raw[1:self.rsp.msg.data_len])}
return response
def await_config(s, bmccfg, channel):
vlan = bmccfg.get('bmcvlan', None)
ipv4 = bmccfg.get('bmcipv4', None)
prefix = bmccfg.get('prefixv4', None)
gw = bmccfg.get('bmcgw', None)
def raw_command(self,
netfn,
command,
data=(),
bridge_request=None,
retry=True,
delay_xmit=None,
timeout=None,
waitall=False, rslun=0):
self.addr.channel = CURRCHAN
self.addr.addr_type = ADDRTYPE
self.addr.lun = rslun
self.req.addr_len = ctypes.sizeof(IpmiSystemInterfaceAddr)
self.req.addr = ctypes.pointer(self.addr)
self.req.msg.netfn = netfn
self.req.msg.cmd = command
if data:
data = memoryview(bytearray(data))
try:
self.databuffer[:len(data)] = data[:len(data)]
except ValueError:
self.databuffer[:len(data)] = data[:len(data)].tobytes()
self.req.msg.data_len = len(data)
fcntl.ioctl(self.ipmidev, IPMICTL_SEND_COMMAND, self.req)
self.await_reply()
self.rsp.msg.data_len = 4096
self.rsp.addr = ctypes.pointer(self.addr)
self.rsp.addr_len = ctypes.sizeof(IpmiSystemInterfaceAddr)
fcntl.ioctl(self.ipmidev, IPMICTL_RECV, self.rsp)
return self.parsed_rsp
def _is_tsm(model):
return model in ('7y00', '7z01', '7y98', '7y99')
def set_port(s, port, vendor, model):
oport = port
if vendor not in ('IBM', 'Lenovo'):
raise Exception('{0} not implemented'.format(vendor))
if _is_tsm(model):
return set_port_tsm(s, port, model)
else:
set_port_xcc(s, port, model)
return 1
def set_port_tsm(s, port, model):
oport = port
sys.stdout.write('Setting TSM port to "{}"...'.format(oport))
sys.stdout.flush()
if port == 'ocp':
s.raw_command(0x32, 0x71, b'\x00\x01\x00')
elif port == 'dedicated':
s.raw_command(0x32, 0x71, b'\x00\x00\x00')
else:
raise Exception("Unsupported port for TSM")
timer = 15
while timer:
timer = timer - 1
time.sleep(1.0)
sys.stdout.write('.')
sys.stdout.flush()
if port == 'ocp':
iface = 0
s.raw_command(0x32, 0x71, b'\x00\x00\x03')
elif port == 'dedicated':
iface = 1
s.raw_command(0x32, 0x71, b'\x00\x01\x03')
rsp = s.raw_command(0x32, 0x72, bytearray([4, iface, 0]))
print('Complete')
return int(rsp['data'][0])
def set_port_xcc(s, port, model):
oport = port
if port.lower() == 'dedicated':
port = b'\x01'
elif port.lower() in ('ml2', 'ocp'):
port = b'\x02\x00'
elif port.lower() == 'lom':
if model == '7x58':
port = b'\x00\x02'
else:
port = b'\x00\x00'
else:
port = port.split(' ')
port = bytes(bytearray([int(x) for x in port]))
currport = bytes(s.raw_command(0xc, 2, b'\x01\xc0\x00\x00')['data'][1:])
if port == currport:
sys.stdout.write('XCC port already set to "{}"\n'.format(oport))
return
sys.stdout.write('Setting XCC port to "{}"...'.format(oport))
sys.stdout.flush()
s.raw_command(0xc, 1, b'\x01\xc0' + port)
tries = 60
while currport != port and tries:
tries -= 1
time.sleep(0.5)
sys.stdout.write('.')
sys.stdout.flush()
currport = bytes(s.raw_command(0xc, 2, b'\x01\xc0\x00\x00')['data'][1:])
if not tries:
raise Exception('Timeout attempting to set port')
sys.stdout.write('Complete\n')
def check_vlan(s, vlan, channel):
if vlan == 'off':
vlan = b'\x00\x00'
else:
vlan = int(vlan)
if vlan:
vlan = vlan | 32768
vlan = struct.pack('<H', vlan)
currvlan = bytes(s.raw_command(0xc, 2, bytearray([channel, 0x14 ,0, 0]))['data'][1:])
if bytearray(currvlan)[1] & 0b10000000 == 0:
currvlan = b'\x00\x00'
return currvlan == vlan
def set_vlan(s, vlan, channel):
ovlan = vlan
if vlan == 'off':
vlan = b'\x00\x00'
else:
vlan = int(vlan)
if vlan:
vlan = vlan | 32768
vlan = struct.pack('<H', vlan)
if check_vlan(s, ovlan, channel):
sys.stdout.write('VLAN already configured to "{0}"\n'.format(ovlan))
return False
rsp = s.raw_command(0xc, 1, bytearray([channel, 0x14]) + vlan)
if rsp.get('code', 1) == 0:
print('VLAN configured to "{}"'.format(ovlan))
else:
print('Error setting vlan: ' + repr(rsp))
return True
def get_lan_channel(s):
for chan in range(1, 16):
rsp = s.raw_command(6, 0x42, bytearray([chan]))['data']
if not rsp:
continue
medtype = int(rsp[1]) & 0b1111111
if medtype not in (4, 6):
continue
rsp = s.raw_command(0xc, 2, bytearray([2, chan, 5, 0, 0]))
if rsp.get('code', 1) == 0:
return chan
return 1
def check_ipv4(s, ipaddr, channel):
ipaddr = bytearray(socket.inet_aton(ipaddr))
rsp = s.raw_command(0xc, 2, bytearray([channel, 3, 0, 0]))['data'][-4:]
return rsp == ipaddr
def set_ipv4(s, ipaddr, channel):
oipaddr = ipaddr
ipaddr = bytearray(socket.inet_aton(ipaddr))
if check_ipv4(s, oipaddr, channel):
print('IP Address already set to {}'.format(oipaddr))
return False
rsp = int(s.raw_command(0xc, 2, bytearray([channel, 4, 0, 0]))['data'][1]) & 0b1111
if rsp != 1:
sys.stdout.write("Changing configuration to static...")
sys.stdout.flush()
resp = s.raw_command(0xc, 1, bytearray([channel, 4, 1]))
tries = 0
while rsp != 1 and tries < 30:
sys.stdout.write('.')
sys.stdout.flush()
tries += 1
time.sleep(0.5)
rsp = int(s.raw_command(0xc, 2, bytearray([channel, 4, 0, 0]))['data'][1]) & 0b1111
sys.stdout.write('Complete\n')
sys.stdout.flush()
print('Setting IP to {}'.format(oipaddr))
s.raw_command(0xc, 1, bytearray([channel, 3]) + ipaddr)
return True
def check_subnet(s, prefix, channel):
prefix = int(prefix)
mask = bytearray(struct.pack('!I', (2**32 - 1) ^ (2**(32 - prefix) - 1)))
rsp = s.raw_command(0xc, 2, bytearray([channel, 6, 0, 0]))['data'][-4:]
return rsp == mask
def set_subnet(s, prefix, channel):
oprefix = prefix
prefix = int(prefix)
mask = bytearray(struct.pack('!I', (2**32 - 1) ^ (2**(32 - prefix) - 1)))
if check_subnet(s, prefix, channel):
print('Subnet Mask already set to /{}'.format(oprefix))
return False
print('Setting subnet mask to /{}'.format(oprefix))
s.raw_command(0xc, 1, bytearray([channel, 6]) + mask)
return True
def check_gateway(s, gw, channel):
gw = bytearray(socket.inet_aton(gw))
rsp = s.raw_command(0xc, 2, bytearray([channel, 12, 0, 0]))['data'][-4:]
return rsp == gw
def set_gateway(s, gw, channel):
ogw = gw
gw = bytearray(socket.inet_aton(gw))
rsp = s.raw_command(0xc, 2, bytearray([channel, 12, 0, 0]))['data'][-4:]
if check_gateway(s, ogw, channel):
print('Gateway already set to {}'.format(ogw))
return False
print('Setting gateway to {}'.format(ogw))
s.raw_command(0xc, 1, bytearray([channel, 12]) + gw)
return True
def dotwait():
sys.stdout.write('.')
sys.stdout.flush()
time.sleep(0.5)
def main():
a = argparse.ArgumentParser(description='Locally configure a BMC device')
a.add_argument('-v', help='vlan id or off to disable vlan tagging')
a.add_argument('-p', help='Which port to use (dedicated, lom, ocp, ml2)')
a.add_argument('-i', help='JSON configuration file to read for '
'configuration')
a.add_argument('-c', help='Use Confluent API to direct BMC configuration',
action='store_true')
args = a.parse_args()
if args.i:
bmccfg = json.load(open(args.i))
elif args.c:
bmccfgsrc = subprocess.check_output(
[sys.executable, apiclient, '/confluent-api/self/bmcconfig', '-j'])
bmccfg = json.loads(bmccfgsrc)
else:
bmccfg = {}
if args.p is not None:
bmccfg['bmcport'] = args.p
if args.v is not None:
bmccfg['bmcvlan'] = args.v
vendor = open('/sys/devices/virtual/dmi/id/sys_vendor').read()
vendor = vendor.strip()
try:
model = open('/sys/devices/virtual/dmi/id/product_sku').read().strip()
if model == 'none':
raise Exception('No SKU')
except Exception:
model = open('/sys/devices/virtual/dmi/id/product_name').read()
if vendor in ('Lenovo', 'IBM'):
if '[' in model and ']' in model:
model = model.split('[')[1].split(']')[0]
model = model[:4].lower()
s = Session('/dev/ipmi0')
if not bmccfg:
print("No BMC configuration specified, exiting.")
return
if bmccfg.get('bmcport', None):
channel = set_port(s, bmccfg['bmcport'], vendor, model)
else:
channel = get_lan_channel(s)
awaitvlan = False
awaitip = False
awaitprefix = False
awaitgw = False
if bmccfg.get('bmcvlan', None):
awaitvlan = set_vlan(s, bmccfg['bmcvlan'], channel)
if bmccfg.get('bmcipv4', None):
awaitip = set_ipv4(s, bmccfg['bmcipv4'], channel)
if bmccfg.get('prefixv4', None):
awaitprefix = set_subnet(s, bmccfg['prefixv4'], channel)
if bmccfg.get('bmcgw', None):
awaitgw = set_gateway(s, bmccfg['bmcgw'], channel)
sys.stdout.write('Waiting for changes to take effect...')
sys.stdout.flush()
while awaitvlan and not check_vlan(s, bmccfg['bmcvlan'], channel):
dotwait()
while awaitip and not check_ipv4(s, bmccfg['bmcipv4'], channel):
dotwait()
while awaitprefix and not check_subnet(s, bmccfg['prefixv4'], channel):
dotwait()
while awaitprefix and not check_gateway(s, bmccfg['bmcgw'], channel):
dotwait()
sys.stdout.write('done\n')
sys.stdout.flush()
#await_config(s, bmccfg, channel)
if __name__ == '__main__':
main()
@@ -0,0 +1,4 @@
. /etc/confluent/functions
# This is a convenient place to keep customizations separate from modifying the stock scripts
# While modification of the stock scripts is fine, it may be easier to rebase to a newer
# stock profile if the '.custom' files are used.
@@ -0,0 +1,11 @@
[Unit]
Description=First Boot Process
Requires=network-online.target
After=network-online.target
[Service]
ExecStart=/opt/confluent/bin/firstboot.sh
[Install]
WantedBy=multi-user.target
@@ -0,0 +1,36 @@
#!/bin/sh
# This script is executed on the first boot after install has
# completed. It is best to edit the middle of the file as
# noted below so custom commands are executed before
# the script notifies confluent that install is fully complete.
nodename=$(grep ^NODENAME /etc/confluent/confluent.info|awk '{print $2}')
confluent_apikey=$(cat /etc/confluent/confluent.apikey)
confluent_mgr=$(grep deploy_server /etc/confluent/confluent.deploycfg|awk '{print $2}')
confluent_profile=$(grep ^profile: /etc/confluent/confluent.deploycfg|awk '{print $2}')
export nodename confluent_mgr confluent_profile
. /etc/confluent/functions
exec >> /var/log/confluent/confluent-firstboot.log
exec 2>> /var/log/confluent/confluent-firstboot.log
tail -f /var/log/confluent/confluent-firstboot.log > /dev/console &
logshowpid=$!
if [ ! -f /etc/confluent/firstboot.ran ]; then
touch /etc/confluent/firstboot.ran
cat /etc/confluent/tls/*.pem >> /etc/pki/tls/certs/ca-bundle.crt
run_remote firstboot.custom
# Firstboot scripts may be placed into firstboot.d, e.g. firstboot.d/01-firstaction.sh, firstboot.d/02-secondaction.sh
run_remote_parts firstboot.d
# Induce execution of remote configuration, e.g. ansible plays in ansible/firstboot.d/
run_remote_config firstboot.d
fi
curl -X POST -d 'status: complete' -H "CONFLUENT_NODENAME: $nodename" -H "CONFLUENT_APIKEY: $confluent_apikey" https://$confluent_mgr/confluent-api/self/updatestatus
systemctl disable firstboot
rm /etc/systemd/system/firstboot.service
rm /etc/confluent/firstboot.ran
kill $logshowpid
@@ -0,0 +1,133 @@
function set_confluent_vars() {
if [ -z "$confluent_mgr" ]; then
confluent_mgr=$(grep ^deploy_server: /etc/confluent/confluent.deploycfg | sed -e 's/[^ ]*: //')
fi
if [ -z "$confluent_profile" ]; then
confluent_profile=$(grep ^profile: /etc/confluent/confluent.deploycfg | sed -e 's/[^ ]*: //')
fi
}
fetch_remote() {
curlargs=""
if [ -f /etc/confluent/ca.pem ]; then
curlargs=" --cacert /etc/confluent/ca.pem"
fi
set_confluent_vars
mkdir -p $(dirname $1)
curl -f -sS $curlargs https://$confluent_mgr/confluent-public/os/$confluent_profile/scripts/$1 > $1
if [ $? != 0 ]; then echo $1 failed to download; return 1; fi
}
source_remote_parts() {
confluentscripttmpdir=$(mktemp -d)
scriptlist=$(/usr/libexec/platform-python /etc/confluent/apiclient /confluent-api/self/scriptlist/$1|sed -e 's/^- //')
for script in $scriptlist; do
source_remote $1/$script
done
unset confluentscripttmpdir
}
run_remote_parts() {
confluentscripttmpdir=$(mktemp -d)
scriptlist=$(/usr/libexec/platform-python /etc/confluent/apiclient /confluent-api/self/scriptlist/$1|sed -e 's/^- //')
for script in $scriptlist; do
run_remote $1/$script
done
unset confluentscripttmpdir
}
source_remote() {
set_confluent_vars
echo
echo '---------------------------------------------------------------------------'
echo Sourcing $1 from https://$confluent_mgr/confluent-public/os/$confluent_profile/scripts/
if [ -z "$confluentscripttmpdir" ]; then
confluentscripttmpdir=$(mktemp -d)
fi
echo Sourcing from $confluentscripttmpdir
cd $confluentscripttmpdir
fetch_remote $1
if [ $? != 0 ]; then echo $1 failed to download; return 1; fi
chmod +x $1
cmd=$1
shift
source $cmd
cd - > /dev/null
return $retcode
}
run_remote() {
requestedcmd="'$*'"
set_confluent_vars
echo
echo '---------------------------------------------------------------------------'
echo Running $requestedcmd from https://$confluent_mgr/confluent-public/os/$confluent_profile/scripts/
if [ -z "$confluentscripttmpdir" ]; then
confluentscripttmpdir=$(mktemp -d)
fi
echo Executing in $confluentscripttmpdir
cd $confluentscripttmpdir
fetch_remote $1
if [ $? != 0 ]; then echo $requestedcmd failed to download; return 1; fi
chmod +x $1
cmd=$1
if [ -x /usr/bin/chcon ]; then
chcon system_u:object_r:bin_t:s0 $cmd
fi
shift
./$cmd $*
retcode=$?
if [ $retcode -ne 0 ]; then
echo "$requestedcmd exited with code $retcode"
fi
cd - > /dev/null
return $retcode
}
run_remote_python() {
echo
set_confluent_vars
if [ -f /etc/confluent/ca.pem ]; then
curlargs=" --cacert /etc/confluent/ca.pem"
fi
echo '---------------------------------------------------------------------------'
echo Running python script "'$*'" from https://$confluent_mgr/confluent-public/os/$confluent_profile/scripts/
tmpdir=$(mktemp -d)
echo Executing in $tmpdir
cd $tmpdir
mkdir -p $(dirname $1)
curl -f -sS $curlargs https://$confluent_mgr/confluent-public/os/$confluent_profile/scripts/$1 > $1
if [ $? != 0 ]; then echo "'$*'" failed to download; return 1; fi
if [ -x /usr/libexec/platform-python ]; then
/usr/libexec/platform-python $*
else
/usr/bin/python $*
fi
retcode=$?
echo "'$*' exited with code $retcode"
cd - > /dev/null
return $retcode
}
run_remote_config() {
echo
set_confluent_vars
apiclient=/opt/confluent/bin/apiclient
if [ -f /etc/confluent/apiclient ]; then
apiclient=/etc/confluent/apiclient
fi
echo '---------------------------------------------------------------------------'
echo Requesting to run remote configuration for "'$*'" from $confluent_mgr under profile $confluent_profile
if [ -x /usr/libexec/platform-python ]; then
/usr/libexec/platform-python $apiclient /confluent-api/self/remoteconfig/"$*" -d {}
/usr/libexec/platform-python $apiclient /confluent-api/self/remoteconfig/status -w 204
else
/usr/bin/python $apiclient /confluent-api/self/remoteconfig/"$*" -d {}
/usr/bin/python $apiclient /confluent-api/self/remoteconfig/status -w 204
fi
echo
echo 'Completed remote configuration'
echo '---------------------------------------------------------------------------'
return
}
@@ -0,0 +1,88 @@
import subprocess
import os
class DiskInfo(object):
def __init__(self, devname):
self.name = devname
self.wwn = None
self.path = None
self.model = ''
self.size = 0
self.driver = None
self.mdcontainer = ''
devnode = '/dev/{0}'.format(devname)
qprop = subprocess.check_output(
['udevadm', 'info', '--query=property', devnode])
if not isinstance(qprop, str):
qprop = qprop.decode('utf8')
for prop in qprop.split('\n'):
if '=' not in prop:
continue
k, v = prop.split('=', 1)
if k == 'DEVTYPE' and v != 'disk':
raise Exception('Not a disk')
elif k == 'DM_NAME':
raise Exception('Device Mapper')
elif k == 'ID_MODEL':
self.model = v
elif k == 'DEVPATH':
self.path = v
elif k == 'ID_WWN':
self.wwn = v
elif k == 'MD_CONTAINER':
self.mdcontainer = v
attrs = subprocess.check_output(['udevadm', 'info', '-a', devnode])
if not isinstance(attrs, str):
attrs = attrs.decode('utf8')
for attr in attrs.split('\n'):
if '==' not in attr:
continue
k, v = attr.split('==', 1)
k = k.strip()
if k == 'ATTRS{size}':
self.size = v.replace('"', '')
elif (k == 'DRIVERS' and not self.driver
and v not in ('"sd"', '""')):
self.driver = v.replace('"', '')
if not self.driver and 'imsm' not in self.mdcontainer:
raise Exception("No driver detected")
@property
def priority(self):
if self.model.lower() in ('thinksystem_m.2_vd', 'thinksystem m.2', 'thinksystem_m.2'):
return 0
if 'imsm' in self.mdcontainer:
return 1
if self.driver == 'ahci':
return 2
if self.driver.startswith('megaraid'):
return 3
if self.driver.startswith('mpt'):
return 4
return 99
def __repr__(self):
return repr({
'name': self.name,
'path': self.path,
'wwn': self.wwn,
'driver': self.driver,
'size': self.size,
'model': self.model,
})
def main():
disks = []
for disk in sorted(os.listdir('/sys/class/block')):
try:
disk = DiskInfo(disk)
disks.append(disk)
except Exception as e:
print("Skipping {0}: {1}".format(disk, str(e)))
nd = [x.name for x in sorted(disks, key=lambda x: x.priority)]
if nd:
open('/tmp/installdisk', 'w').write(nd[0])
if __name__ == '__main__':
main()

Some files were not shown because too many files have changed in this diff Show More