1 package App::KeyMangler;
9 our $Tcl_Data ||= do { local $/; my $data = <DATA>; close(DATA); $data };
10 $self->tcl->Eval($Tcl_Data);
14 my ($self, @args) = @_;
16 my $res = $self->tcl->call(km => @args);
27 rule dot_ssh_on { A D } {
29 directory_in H '.ssh' D
33 rule authorized_keys_on { A F } {
35 file_in D 'authorized_keys' F
39 rule key_installed_on { A K } {
40 authorized_keys_on A F
44 rule key_not_installed_on { A K } {
45 authorized_keys_on A F
49 rule my_config_dir D {
51 directory_in H '.keymangler' D
54 rule my_config_file { C F } {
59 rule config_contains_line { C L } {
64 rule config_not_contains_line { C L } {
69 rule known_account A { config_contains_line 'accounts' A }
70 rule known_key K { config_contains_line 'keys' K }
71 rule known_dead D { config_contains_line 'keys.dead' D }
73 rule not_known_account A { config_not_contains_line 'accounts' A }
74 rule not_known_key K { config_not_contains_line 'keys' K }
75 rule not_known_dead D { config_not_contains_line 'keys.dead' D }
77 rule all_known_installed_on A {
78 foreach K { known_key K } { key_installed_on A K }
81 rule all_dead_not_installed_on A {
82 foreach K { known_dead K } { key_not_installed_on A K }
85 rule account_synchronized A {
86 all_known_installed_on A
87 all_dead_not_installed_on A
90 rule all_synchronized {} {
91 foreach A { known_account A } { account_synchronized A }
94 rule unknown_installed_on { A K } {
100 rule known_installed_on { A K } {
105 rule dead_installed_on { A K } {
110 oo::class create ConfigSet {
112 namespace import ::DX::*
113 variable type $mytype
117 ensure "known_$type {'$V'}"
121 ensure "not_known_$type {'$V'}"
125 query* "known_$type V" {puts $V}
129 oo::class create KeyMangler {
131 namespace import ::DX::*
132 ConfigSet create key key
133 ConfigSet create dead dead
134 ConfigSet create account account
138 method key args { key {*}$args }
139 method dead args { dead {*}$args }
140 method account args { account {*}$args }
145 findall Known K { known_installed_on A K }
146 findall Unknown U { unknown_installed_on A U }
147 findall Dead D { dead_installed_on A D }
150 foreach k $Known { puts " Known: [lindex $k 2]" }
151 foreach u $Unknown { puts " Unknown: [lindex $u 2]" }
152 foreach d $Dead { puts " Dead: [lindex $d 2]" }
164 method sync {{account -}} {
166 if {"$account" eq "-"} {
167 $mode { all_synchronized }
169 $mode "account_synchronized {'$account'}"