mirror of
https://github.com/Matir/skel.git
synced 2026-05-26 13:35:42 -07:00
Compare commits
696 Commits
v0.2
...
49a314e388
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
49a314e388 | ||
|
|
41293eb788 | ||
|
|
05798dcb67 | ||
|
|
4e1b263170 | ||
|
|
46c00c61be | ||
|
|
ce973d5bbf | ||
|
|
f326992306 | ||
|
|
7f76b24cb9 | ||
|
|
a5b08680c5 | ||
|
|
2510f1ad87 | ||
|
|
b6af18017b | ||
|
|
829f7ae1de | ||
|
|
6fd9769ccc | ||
|
|
758c59bc8e | ||
|
|
39e003f666 | ||
|
|
5b1bb1c233 | ||
|
|
2e0ebb4d6f | ||
|
|
31aeca1b73 | ||
|
|
7006974bb3 | ||
|
|
92fb8cb47d | ||
|
|
a46ee1f24c | ||
|
|
c1b565f2c5 | ||
|
|
0ded57fa46 | ||
|
|
f1495add30 | ||
|
|
a6146c2763 | ||
|
|
60f68f11a2 | ||
|
|
a1262e9fba | ||
|
|
d5a3ed41c6 | ||
|
|
295ef071ee | ||
|
|
313c16bdc9 | ||
|
|
fad65e2aaa | ||
|
|
00696b23fa | ||
|
|
1c0c5dd32b | ||
|
|
8cac819127 | ||
|
|
0ebc32e30a | ||
|
|
a0378fb583 | ||
|
|
3cad40f858 | ||
|
|
6bda0bb639 | ||
|
|
c1d0045f44 | ||
|
|
f50edc1fa6 | ||
|
|
9ab1f9c298 | ||
|
|
cdbc40d1e8 | ||
|
|
487dbe3751 | ||
|
|
aea7b0927e | ||
|
|
645b631afc | ||
|
|
b631471b0c | ||
|
|
fb7636f5f1 | ||
|
|
20a5885031 | ||
|
|
21b24b2c2f | ||
|
|
122dc2075b | ||
|
|
c0fd99afd6 | ||
|
|
0ebb331cb3 | ||
|
|
bddd4ed107 | ||
|
|
a92b05a51c | ||
|
|
5a49dd95b2 | ||
|
|
d9223c92dc | ||
|
|
4c9038c33d | ||
|
|
9a04b847ec | ||
|
|
c1ef9f5e7a | ||
|
|
5a4d04ea43 | ||
|
|
f4e3447eb7 | ||
|
|
ff0a7d150d | ||
|
|
657d30c381 | ||
|
|
5cc08e472e | ||
|
|
89ae97145e | ||
|
|
d50faa1ec6 | ||
|
|
243da55c86 | ||
|
|
0e491395da | ||
|
|
b7cbf90ac7 | ||
|
|
9e1ad38f94 | ||
|
|
821c2f8b80 | ||
|
|
4e3b466044 | ||
|
|
fe5b74511f | ||
|
|
f80b029ae3 | ||
|
|
d4a4d8ee19 | ||
|
|
375ff434f2 | ||
|
|
e270bac5f2 | ||
|
|
2b31d4d5d2 | ||
|
|
91920fef0e | ||
|
|
f2faccd93f | ||
|
|
dea3f289c2 | ||
|
|
61d00103bf | ||
|
|
2122c88e03 | ||
|
|
7064a5d5a1 | ||
|
|
ae344d6dba | ||
|
|
d7b6095c47 | ||
|
|
c7777ede0b | ||
|
|
6c2c12faeb | ||
|
|
7e9a87afdd | ||
|
|
d6cd16e9f0 | ||
|
|
3548113a7d | ||
|
|
f3e82690f8 | ||
|
|
d596d10678 | ||
|
|
0406395ea0 | ||
|
|
c9ed72a5a6 | ||
|
|
5e65608c39 | ||
|
|
acb13c6908 | ||
|
|
9b9330db45 | ||
|
|
4743b635aa | ||
|
|
bbeb451251 | ||
|
|
5057ab890b | ||
|
|
ee7f78e99c | ||
|
|
0b5ca1cefc | ||
|
|
ab2f62345f | ||
|
|
05df603332 | ||
|
|
ca71dea284 | ||
|
|
00bbe65691 | ||
|
|
de8d2cf608 | ||
|
|
a81e6e9e8d | ||
|
|
52d05c400d | ||
|
|
83b7adf1ca | ||
|
|
f6d7f22a77 | ||
|
|
746653d28d | ||
|
|
695cef6cb3 | ||
|
|
e0eebe2641 | ||
|
|
d5024a536d | ||
|
|
d10f82d088 | ||
|
|
6ffae42e33 | ||
|
|
5658c61627 | ||
|
|
e227b65d6d | ||
|
|
569199a280 | ||
|
|
61e81f33c8 | ||
|
|
422c56139f | ||
|
|
15c118583a | ||
|
|
31c2783286 | ||
|
|
1131b46e44 | ||
|
|
fecdf1f67e | ||
|
|
38c21397cf | ||
|
|
b2eff8284c | ||
|
|
ef902daa1c | ||
|
|
42361045bc | ||
|
|
a45afefca4 | ||
|
|
d40eb6b0a7 | ||
|
|
2c26051817 | ||
|
|
b7b16e20a6 | ||
|
|
f6573e30b2 | ||
|
|
43e8661036 | ||
|
|
55823417eb | ||
|
|
eab08b1c95 | ||
|
|
560f803455 | ||
|
|
c6fe0ff1c8 | ||
|
|
05c910e675 | ||
|
|
efe093471c | ||
|
|
e99d20e47e | ||
|
|
a3fb4c5e66 | ||
|
|
f9a48c70c4 | ||
|
|
d072e3a5dd | ||
|
|
ce13fbc610 | ||
|
|
45be3e45f1 | ||
|
|
442127f7c1 | ||
|
|
87797ca803 | ||
|
|
7c1c5cfbd7 | ||
|
|
6a9358cd21 | ||
|
|
a195f0310d | ||
|
|
11ecbdaf04 | ||
|
|
bc9150b592 | ||
|
|
f81410cfc0 | ||
|
|
87239b2034 | ||
|
|
50011b1675 | ||
|
|
eb3392966a | ||
|
|
3188effbd3 | ||
|
|
80b119f6ad | ||
|
|
e87b4cb3d4 | ||
|
|
0c08d4ebe7 | ||
|
|
a7d59e971f | ||
|
|
233b3e7a7b | ||
|
|
691f64a477 | ||
|
|
670875f227 | ||
|
|
e90c014d88 | ||
|
|
d76a278a95 | ||
|
|
8eff002d55 | ||
|
|
3015e7a1c0 | ||
|
|
a286795570 | ||
|
|
99e8ff6f2b | ||
|
|
4a77c0e900 | ||
|
|
35f494c3d4 | ||
|
|
f650d12efb | ||
|
|
2c67b58ba6 | ||
|
|
ba9534577a | ||
|
|
193b22e0d1 | ||
|
|
b7353bd34e | ||
|
|
12b2ed211b | ||
|
|
ee5a78b578 | ||
|
|
25a9194480 | ||
|
|
f4ea05681c | ||
|
|
eb193fe1de | ||
|
|
e02dc0be80 | ||
|
|
6c3dea3721 | ||
|
|
cb3ba03c49 | ||
|
|
d7cc6fd508 | ||
|
|
b628453b10 | ||
|
|
157e6ee20e | ||
|
|
e375d7f472 | ||
|
|
373189f440 | ||
|
|
a719ca9972 | ||
|
|
4937a98ccc | ||
|
|
81093ab3d6 | ||
|
|
ab85cb5ecf | ||
|
|
cbb580fcdf | ||
|
|
aea9e50141 | ||
|
|
10ce6ff7f6 | ||
|
|
cd9bb5d6cc | ||
|
|
5cfbc4e88a | ||
|
|
44d981e3c3 | ||
|
|
3f509e17c1 | ||
|
|
af3365ad8e | ||
|
|
6888e8503f | ||
|
|
e52af2d21a | ||
|
|
a5a5c7d5df | ||
|
|
aca274d7df | ||
|
|
70cdfcdc07 | ||
|
|
9a38b456d7 | ||
|
|
a4196d7bc1 | ||
|
|
cbcc6e6fb6 | ||
|
|
f2ca693f7b | ||
|
|
da43e7533d | ||
|
|
9c9c56b030 | ||
|
|
747bc7becd | ||
|
|
c3c9714b8d | ||
|
|
5865f5130f | ||
|
|
6803ac2ce2 | ||
|
|
c512401acd | ||
|
|
dae254e240 | ||
|
|
2ab9bd3452 | ||
|
|
b68c1e2c65 | ||
|
|
3c8d8ca5e1 | ||
|
|
f6e6c42b26 | ||
|
|
7165e7c93f | ||
|
|
63f401c84b | ||
|
|
dea863ee35 | ||
|
|
d01a320de7 | ||
|
|
0564dbbb3d | ||
|
|
1efa61a9f4 | ||
|
|
77a01d2fda | ||
|
|
71711a5cc0 | ||
|
|
a49474fe60 | ||
|
|
2217cfb47b | ||
|
|
75b0c5db9e | ||
|
|
50174a4f72 | ||
|
|
04470627c6 | ||
|
|
e6318c4cc1 | ||
|
|
15b575c34d | ||
|
|
2db123c772 | ||
|
|
2de511f5f3 | ||
|
|
890a24ec07 | ||
|
|
a3aaed6c0c | ||
|
|
9f4fbfb06a | ||
|
|
273d6b495f | ||
|
|
d41703820d | ||
|
|
5748d014f1 | ||
|
|
2779322b24 | ||
|
|
50948acee4 | ||
|
|
670cf5c8dc | ||
|
|
d213b3b234 | ||
|
|
37d606cc49 | ||
|
|
8f57fad78c | ||
|
|
f8ddb56b02 | ||
|
|
1f59627da9 | ||
|
|
2c88a59188 | ||
|
|
9ec67f4c1c | ||
|
|
db3193e0bc | ||
|
|
9c83b8fc40 | ||
|
|
3da887ffad | ||
|
|
f56b7d0b7b | ||
|
|
e18e66391b | ||
|
|
8b66586fe8 | ||
|
|
ac4109cee6 | ||
|
|
99af2287c5 | ||
|
|
6adaaffabd | ||
|
|
c6f217d47c | ||
|
|
733093ee7a | ||
|
|
441a533e2a | ||
|
|
8d30879224 | ||
|
|
f94a4dc67c | ||
|
|
0bb950b053 | ||
|
|
4ec8f22ab8 | ||
|
|
ba0c734b06 | ||
|
|
f24e3ebb24 | ||
|
|
4af40de24b | ||
|
|
351b136cbc | ||
|
|
a5b0677903 | ||
|
|
ebf5c1cd22 | ||
|
|
94abfa2fe2 | ||
|
|
15f5f91e2a | ||
|
|
2b6229acc3 | ||
|
|
e05a6aa473 | ||
|
|
673fca3c05 | ||
|
|
f6a7b372b7 | ||
|
|
685fb22dd3 | ||
|
|
e788dedf69 | ||
|
|
a482092fdb | ||
|
|
b3eb8a8e44 | ||
|
|
3afee0505b | ||
|
|
50b74fc06e | ||
|
|
74bf253950 | ||
|
|
434120cc90 | ||
|
|
97e23b3669 | ||
|
|
f9f3dd05c8 | ||
|
|
6e095d9fbc | ||
|
|
c25540a398 | ||
|
|
fae178e8ac | ||
|
|
15ea12d54b | ||
|
|
291de7b2c1 | ||
|
|
bbba28e166 | ||
|
|
27dc8fb22c | ||
|
|
a5f55034fa | ||
|
|
062da36145 | ||
|
|
9e3b929a4b | ||
|
|
3170a41c4b | ||
|
|
b37f95383c | ||
|
|
e6e66b0d05 | ||
|
|
6e6b63cb28 | ||
|
|
20bb942ac6 | ||
|
|
d256cdf12b | ||
|
|
c20739472f | ||
|
|
66e6833623 | ||
|
|
bc5f9a2741 | ||
|
|
04d4ab4d25 | ||
|
|
ce1d4780b6 | ||
|
|
8e79910857 | ||
|
|
999ef09790 | ||
|
|
2f9841e2ac | ||
|
|
2879f63aff | ||
|
|
79a3e1f46c | ||
|
|
62392e3712 | ||
|
|
9717fef420 | ||
|
|
3c83cb1761 | ||
|
|
2a71557663 | ||
|
|
b6a2b65704 | ||
|
|
398e39b9eb | ||
|
|
f6b5cd90fc | ||
|
|
1d14f294eb | ||
|
|
f3cb3607db | ||
|
|
d117ee6b2e | ||
|
|
7e249843a6 | ||
|
|
465bfd37f1 | ||
|
|
5ad1ad4616 | ||
|
|
e82cad68e1 | ||
|
|
5e372e2b35 | ||
|
|
9e392af7d1 | ||
|
|
68bcf536cb | ||
|
|
698f2defa9 | ||
|
|
a42128f5c9 | ||
|
|
6559acbf90 | ||
|
|
a654a7747c | ||
|
|
d158a0a373 | ||
|
|
229d5353e3 | ||
|
|
20389cba90 | ||
|
|
aaf56b794d | ||
|
|
827665279a | ||
|
|
8467bfce20 | ||
|
|
116ae13896 | ||
|
|
0f08f9710a | ||
|
|
9c147af8c1 | ||
|
|
5e498f9bcd | ||
|
|
1cab41bfd5 | ||
|
|
3e225ae2ab | ||
|
|
cc15b17e28 | ||
|
|
7aa9e57a59 | ||
|
|
530b205b3d | ||
|
|
0bed0a80a3 | ||
|
|
244c5da0e7 | ||
|
|
e885afbff9 | ||
|
|
8a0e4cd774 | ||
|
|
5cf313140c | ||
|
|
f0c3ab8753 | ||
|
|
8cd3682a23 | ||
|
|
ee83a40686 | ||
|
|
7f9a3774ae | ||
|
|
8d7c76b227 | ||
|
|
0a92dd0ed7 | ||
|
|
eae69fe414 | ||
|
|
dcef7445b2 | ||
|
|
11d1086a68 | ||
|
|
a88d120b3c | ||
|
|
15479f3829 | ||
|
|
9178794de5 | ||
|
|
fc120b66fe | ||
|
|
57b181bd74 | ||
|
|
aa6a2e806d | ||
|
|
eec3c9ba7a | ||
|
|
d67b18f2ea | ||
|
|
72b82ff2e3 | ||
|
|
6492beb726 | ||
|
|
08142409f8 | ||
|
|
8225785dcc | ||
|
|
c7c97b84c5 | ||
|
|
f9ce8b3df8 | ||
|
|
69c1184b58 | ||
|
|
7e432287ac | ||
|
|
50cb109c99 | ||
|
|
c915b20450 | ||
|
|
f3ea935dd5 | ||
|
|
a6414425b7 | ||
|
|
ad73f12103 | ||
|
|
7d35ace5bb | ||
|
|
e4f2cc94b5 | ||
|
|
fcbe2e781b | ||
|
|
7a5abd73cb | ||
|
|
07926d6673 | ||
|
|
24690e8399 | ||
|
|
2232dce811 | ||
|
|
f6de62700a | ||
|
|
01272f4474 | ||
|
|
e176b0c136 | ||
|
|
67fad831e5 | ||
|
|
048d7fb1ba | ||
|
|
24c1c8edfb | ||
|
|
614adeed08 | ||
|
|
12a92703f0 | ||
|
|
288a9c3a7e | ||
|
|
2419693164 | ||
|
|
b8607f4bdc | ||
|
|
5c2289e283 | ||
|
|
deb8b62c12 | ||
|
|
8e984d3c3b | ||
|
|
eb0206575a | ||
|
|
44d273dd7c | ||
|
|
8029afc15a | ||
|
|
f5766e7661 | ||
|
|
88c096cd95 | ||
|
|
3005abff34 | ||
|
|
8b9c9581e4 | ||
|
|
9d85ae77fa | ||
|
|
693b349024 | ||
|
|
a82e0cdb37 | ||
|
|
80d0b2844e | ||
|
|
7f40245bb0 | ||
|
|
157fa34915 | ||
|
|
2a359f1a02 | ||
|
|
c3f41435da | ||
|
|
aa3a1e0237 | ||
|
|
68e53c426b | ||
|
|
fcb04c0ae7 | ||
|
|
b096fd2a24 | ||
|
|
cc94650bad | ||
|
|
1b2f75ca47 | ||
|
|
55064a548d | ||
|
|
cb051b8686 | ||
|
|
fae0e69619 | ||
|
|
d21e21ebf6 | ||
|
|
ff14dcaf56 | ||
|
|
83645e39ee | ||
|
|
73f4cdfb20 | ||
|
|
ec06c2fcb2 | ||
|
|
6c49de9512 | ||
|
|
ef16b33fd8 | ||
|
|
ba56fb89b3 | ||
|
|
395297e08b | ||
|
|
a20636347c | ||
|
|
170c3f0e9f | ||
|
|
b45f977de9 | ||
|
|
df4e87fdf2 | ||
|
|
40fa505146 | ||
|
|
9076b9f07e | ||
|
|
ac2b8650b8 | ||
|
|
5353336b9d | ||
|
|
78a9dc5835 | ||
|
|
57fff46dd8 | ||
|
|
59cc1e6ed9 | ||
|
|
748b113fe9 | ||
|
|
b920e94cc5 | ||
|
|
ea63773f4f | ||
|
|
4bea5020b1 | ||
|
|
0c5a5e6fc9 | ||
|
|
6b659ac9a9 | ||
|
|
b30b40f259 | ||
|
|
43680df2e2 | ||
|
|
dc621af59d | ||
|
|
5ea16b8ace | ||
|
|
b800b624ae | ||
|
|
9364e70986 | ||
|
|
4b03c7d9e0 | ||
|
|
937328a833 | ||
|
|
699fc2ac66 | ||
|
|
803712f0db | ||
|
|
2dbc8f33ea | ||
|
|
e2361baa37 | ||
|
|
1ec5aa8056 | ||
|
|
863e985bc6 | ||
|
|
b40cbc1811 | ||
|
|
5913bbb4c7 | ||
|
|
fc621bb31a | ||
|
|
d620566562 | ||
|
|
4d2d8c89f6 | ||
|
|
e325cc3b93 | ||
|
|
a5dc656656 | ||
|
|
b1799197fe | ||
|
|
4b37169735 | ||
|
|
2531595828 | ||
|
|
9394758ff9 | ||
|
|
713e59fb32 | ||
|
|
f0641f4113 | ||
|
|
7739339515 | ||
|
|
af556f0a75 | ||
|
|
90a87e0e93 | ||
|
|
ccb6bcb616 | ||
|
|
460163089b | ||
|
|
448b7a6c4d | ||
|
|
24c7171a73 | ||
|
|
379ab1c375 | ||
|
|
968c9529c8 | ||
|
|
f96ad7773f | ||
|
|
03a12e509e | ||
|
|
19d78117cb | ||
|
|
1a592beaea | ||
|
|
05c2ef7848 | ||
|
|
17c2767de5 | ||
|
|
006188e07d | ||
|
|
322358b0f0 | ||
|
|
3db0742889 | ||
|
|
d2849bfe9e | ||
|
|
ac8fae69c6 | ||
|
|
1881916c8e | ||
|
|
08952e7f22 | ||
|
|
eb0d0ebfc1 | ||
|
|
33d9e53327 | ||
|
|
53fa86ba4a | ||
|
|
b135ee423b | ||
|
|
25fb3cc6a0 | ||
|
|
b073e7d61c | ||
|
|
781142e8f2 | ||
|
|
3e87044901 | ||
|
|
cb01867ba6 | ||
|
|
1fcdb910a2 | ||
|
|
cb5df8e7e6 | ||
|
|
815cf0a6e4 | ||
|
|
72914aa6e1 | ||
|
|
404c9592ec | ||
|
|
c2371d29a6 | ||
|
|
25c03b677a | ||
|
|
b9c2e6afb9 | ||
|
|
3f29a03ba4 | ||
|
|
b4db394761 | ||
|
|
a85a9c52be | ||
|
|
6be3fde55c | ||
|
|
161028537c | ||
|
|
426fdbd7ee | ||
|
|
90060a290e | ||
|
|
b4c462a66c | ||
|
|
18d5697827 | ||
|
|
75d0943548 | ||
|
|
78b9efc04b | ||
|
|
6c2bb3ded8 | ||
|
|
312036587e | ||
|
|
0f97610473 | ||
|
|
c825c6af28 | ||
|
|
394eb7996c | ||
|
|
c7619f93dc | ||
|
|
ee67442965 | ||
|
|
f70488eab7 | ||
|
|
4cb51c3bba | ||
|
|
d77d76f184 | ||
|
|
b3224e9ad3 | ||
|
|
6bd457700e | ||
|
|
4b189b73dd | ||
|
|
c86050bc3b | ||
|
|
10cd949696 | ||
|
|
81d4dbbdba | ||
|
|
14197fe6c0 | ||
|
|
5cda2fc25b | ||
|
|
8b0c4dd29a | ||
|
|
2ab99dd2b4 | ||
|
|
3f69a044d3 | ||
|
|
76d0078497 | ||
|
|
523f272c58 | ||
|
|
475e347fe6 | ||
|
|
2bd6d63fe4 | ||
|
|
db14ac6e06 | ||
|
|
584678d67e | ||
|
|
503bba6516 | ||
|
|
815dc47846 | ||
|
|
e52cf7ae00 | ||
|
|
eb2d6e776f | ||
|
|
af85d6f81f | ||
|
|
d84ee23039 | ||
|
|
ea1d3f669b | ||
|
|
47b4248de2 | ||
|
|
33e9188612 | ||
|
|
2f6c9c8c0a | ||
|
|
7128789d48 | ||
|
|
19068da3f8 | ||
|
|
10851db1a9 | ||
|
|
1b8d6b85db | ||
|
|
653fa39cf7 | ||
|
|
7b0713675c | ||
|
|
52ed3913c8 | ||
|
|
6d23e72bd7 | ||
|
|
da545f0de7 | ||
|
|
8d9cf14608 | ||
|
|
bdc1551122 | ||
|
|
ba497cd5bf | ||
|
|
ca63946c5e | ||
|
|
0b6fa6b0fa | ||
|
|
12247790a6 | ||
|
|
4d245198a8 | ||
|
|
8f4e4fe77b | ||
|
|
1cafe1cf7a | ||
|
|
ba546d478e | ||
|
|
08d9567bdf | ||
|
|
a460ee3bb4 | ||
|
|
f005bae9e6 | ||
|
|
3279d52505 | ||
|
|
939c604381 | ||
|
|
d2061e29ef | ||
|
|
de62342054 | ||
|
|
2cf2aa4e78 | ||
|
|
672767d758 | ||
|
|
96c2c37eb8 | ||
|
|
ffb5d753cd | ||
|
|
7a7340ef1d | ||
|
|
b1bea45a48 | ||
|
|
01432d1f41 | ||
|
|
d6800370de | ||
|
|
8f547abf93 | ||
|
|
a02825fb1f | ||
|
|
5e3d133f8b | ||
|
|
48477290f0 | ||
|
|
6bf68dfb2e | ||
|
|
590a1a2fa0 | ||
|
|
697db6ca24 | ||
|
|
f028c2f320 | ||
|
|
32a1c18c5d | ||
|
|
4ec3fa1e22 | ||
|
|
26685dfadb | ||
|
|
0b327577e7 | ||
|
|
373f6c31c6 | ||
|
|
4f7d98930d | ||
|
|
1aa256252f | ||
|
|
5705cb59c8 | ||
|
|
c8b33e39c7 | ||
|
|
a9012bebea | ||
|
|
6100557a2b | ||
|
|
5709d8fbb0 | ||
|
|
5dc84926be | ||
|
|
b303c1b5c5 | ||
|
|
dfd2b48b94 | ||
|
|
0e1370a93f | ||
|
|
4ebf519af7 | ||
|
|
1386dc49d0 | ||
|
|
360aa1c8ec | ||
|
|
8e8d220539 | ||
|
|
9b7561ce8f | ||
|
|
c9c65e10d7 | ||
|
|
61b4dbe963 | ||
|
|
20a8db806c | ||
|
|
be1bca8dbe | ||
|
|
9c3ad64036 | ||
|
|
d392eb8dfc | ||
|
|
6f15f7096a | ||
|
|
c7e40f1321 | ||
|
|
376fbb9f73 | ||
|
|
769989127b | ||
|
|
4091cc3f03 | ||
|
|
82c2833490 | ||
|
|
634f031c56 | ||
|
|
7564acc939 | ||
|
|
bfaabd18d0 | ||
|
|
286eb02f4b | ||
|
|
5a9e0b6578 | ||
|
|
f77ed125de | ||
|
|
24676d6a87 | ||
|
|
d08af13a1c | ||
|
|
8c9627caa1 | ||
|
|
40485f10f0 | ||
|
|
b5ef3c37e4 | ||
|
|
874750f22b | ||
|
|
89f555cdcb | ||
|
|
4a7b263a9e | ||
|
|
753035cc57 | ||
|
|
32275ca788 | ||
|
|
58f63a17dc | ||
|
|
f355fe84d2 | ||
|
|
f3125f7cd7 | ||
|
|
6894dc9214 | ||
|
|
a59cbf1e41 | ||
|
|
d43bbcfae9 | ||
|
|
00cf4d1577 | ||
|
|
143e6e1e74 | ||
|
|
8f6127d19d | ||
|
|
7c5a617897 | ||
|
|
696cc9c6cd | ||
|
|
2c2ac626e5 | ||
|
|
0431c83423 | ||
|
|
d9ae2ca974 | ||
|
|
db007ad604 | ||
|
|
89ee4ce390 | ||
|
|
48fb9289b4 | ||
|
|
430bb6e7b9 | ||
|
|
bf81c13d47 | ||
|
|
bda75033a0 | ||
|
|
53f7bc9fe3 | ||
|
|
a2acbeb8b5 | ||
|
|
de89e88c90 | ||
|
|
87fd3193e0 | ||
|
|
d96a41aeaf |
6
.Brewfile.ignore
Normal file
6
.Brewfile.ignore
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
# Add package names here to ignore them in Brewfile updates.
|
||||||
|
# One package per line.
|
||||||
|
# Example:
|
||||||
|
# iterm2
|
||||||
|
# wget
|
||||||
|
orbstack
|
||||||
5
.gemini/settings.json
Normal file
5
.gemini/settings.json
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
{
|
||||||
|
"context": {
|
||||||
|
"fileName": "AGENTS.md"
|
||||||
|
}
|
||||||
|
}
|
||||||
3
.git-crypt/.gitattributes
vendored
3
.git-crypt/.gitattributes
vendored
@@ -1,3 +0,0 @@
|
|||||||
# Do not edit this file. To specify the files to encrypt, create your own
|
|
||||||
# .gitattributes file in the directory where your files are.
|
|
||||||
* !filter !diff
|
|
||||||
Binary file not shown.
1
.gitattributes
vendored
1
.gitattributes
vendored
@@ -1 +0,0 @@
|
|||||||
private_dotfiles/** filter=git-crypt diff=git-crypt
|
|
||||||
|
|||||||
80
.githooks/githooks.sh
Executable file
80
.githooks/githooks.sh
Executable file
@@ -0,0 +1,80 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
# --- 1. Identity Resolution ---
|
||||||
|
# Finds the physical location of this script, regardless of symlinks
|
||||||
|
REAL_PATH=$(realpath "$0")
|
||||||
|
REAL_NAME=$(basename "$REAL_PATH")
|
||||||
|
HOOKS_DIR=$(dirname "$REAL_PATH")
|
||||||
|
CALLED_AS=$(basename "$0")
|
||||||
|
|
||||||
|
# --- 2. Self-Installation / Sync Logic ---
|
||||||
|
if [ "$CALLED_AS" == "$REAL_NAME" ]; then
|
||||||
|
echo "🔧 Synchronizing Git Hook Dispatcher..."
|
||||||
|
|
||||||
|
# Point Git to this directory
|
||||||
|
git config core.hooksPath "$HOOKS_DIR"
|
||||||
|
|
||||||
|
# Create symlinks for any [hook-name].d directories found
|
||||||
|
for d in "$HOOKS_DIR"/*.d/; do
|
||||||
|
[ -d "$d" ] || continue
|
||||||
|
HOOK_NAME=$(basename "$d" .d)
|
||||||
|
TARGET="$HOOKS_DIR/$HOOK_NAME"
|
||||||
|
|
||||||
|
if [ ! -L "$TARGET" ]; then
|
||||||
|
ln -sf "$REAL_NAME" "$TARGET"
|
||||||
|
chmod +x "$TARGET"
|
||||||
|
echo " ✨ Linked: $HOOK_NAME"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
# Cleanup: Remove symlinks that no longer have a matching .d directory
|
||||||
|
for link in "$HOOKS_DIR"/*; do
|
||||||
|
if [ -L "$link" ] && [ "$(basename "$link")" != "$REAL_NAME" ]; then
|
||||||
|
if [ ! -d "${link}.d" ]; then
|
||||||
|
rm "$link"
|
||||||
|
echo " 🗑️ Removed: $(basename "$link")"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
echo "✅ Done."
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
# --- 3. Selective Stdin Buffering ---
|
||||||
|
# Buffer stdin only for hooks that expect it to prevent hanging/performance hits
|
||||||
|
STDIN_DATA=""
|
||||||
|
case "$CALLED_AS" in
|
||||||
|
pre-push|post-rewrite|pre-receive|post-receive|reference-transaction)
|
||||||
|
# Check if stdin has data (is not a terminal)
|
||||||
|
if [ ! -t 0 ]; then
|
||||||
|
STDIN_DATA=$(cat)
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
# --- 4. Dispatch Logic ---
|
||||||
|
SUB_HOOK_DIR="${HOOKS_DIR}/${CALLED_AS}.d"
|
||||||
|
|
||||||
|
if [ -d "$SUB_HOOK_DIR" ]; then
|
||||||
|
# Sort files naturally so 01- runs before 02-
|
||||||
|
for script in $(ls "$SUB_HOOK_DIR" | sort); do
|
||||||
|
FULL_PATH="$SUB_HOOK_DIR/$script"
|
||||||
|
[ -x "$FULL_PATH" ] || continue
|
||||||
|
|
||||||
|
# Replay stdin if we captured it, otherwise execute normally
|
||||||
|
if [ -n "$STDIN_DATA" ]; then
|
||||||
|
echo "$STDIN_DATA" | "$FULL_PATH" "$@"
|
||||||
|
else
|
||||||
|
"$FULL_PATH" "$@"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Exit immediately if any sub-script fails
|
||||||
|
EXIT_CODE=$?
|
||||||
|
if [ $EXIT_CODE -ne 0 ]; then
|
||||||
|
echo "❌ Hook '$CALLED_AS' failed at: $script"
|
||||||
|
exit $EXIT_CODE
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
|
||||||
|
exit 0
|
||||||
1
.githooks/pre-commit
Symbolic link
1
.githooks/pre-commit
Symbolic link
@@ -0,0 +1 @@
|
|||||||
|
githooks.sh
|
||||||
20
.githooks/pre-commit.d/05-check-brewfile
Executable file
20
.githooks/pre-commit.d/05-check-brewfile
Executable file
@@ -0,0 +1,20 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
# Check if Brewfile needs updating
|
||||||
|
if [[ "$(uname)" != "Darwin" ]]; then
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
# We use the script we just created
|
||||||
|
UPDATE_SCRIPT="bin/macos/update_brewfile"
|
||||||
|
|
||||||
|
if [[ -x "$UPDATE_SCRIPT" ]]; then
|
||||||
|
# Run in dry-run mode and see if there's output
|
||||||
|
DIFF_OUTPUT=$("$UPDATE_SCRIPT" --dry-run 2>/dev/null)
|
||||||
|
if [[ "$DIFF_OUTPUT" == *"Changes detected"* ]]; then
|
||||||
|
echo "⚠️ Brewfile is out of sync with your installed packages."
|
||||||
|
echo " Run '$UPDATE_SCRIPT' to synchronize it."
|
||||||
|
echo ""
|
||||||
|
# We don't fail the commit, just warn.
|
||||||
|
fi
|
||||||
|
fi
|
||||||
4
.gitignore
vendored
4
.gitignore
vendored
@@ -1,5 +1,9 @@
|
|||||||
installed-prefs
|
installed-prefs
|
||||||
|
.installed-prefs
|
||||||
*.swp
|
*.swp
|
||||||
*~
|
*~
|
||||||
*.bak
|
*.bak
|
||||||
local_dotfiles
|
local_dotfiles
|
||||||
|
dotfile_overlays/*
|
||||||
|
!dotfile_overlays/.keep
|
||||||
|
!dotfile_overlays/README
|
||||||
|
|||||||
1
.gitmodules
vendored
Normal file
1
.gitmodules
vendored
Normal file
@@ -0,0 +1 @@
|
|||||||
|
|
||||||
70
AGENTS.md
Normal file
70
AGENTS.md
Normal file
@@ -0,0 +1,70 @@
|
|||||||
|
## Installation and Environment
|
||||||
|
|
||||||
|
This is a set of dotfiles and utilities for setting up my personal environment
|
||||||
|
on POSIX-style environments. It is cloned from github and installed from the
|
||||||
|
`install.sh` script.
|
||||||
|
|
||||||
|
It mostly relies on symlinking dotfiles and other resources into the appropriate
|
||||||
|
locations, but also installs dependencies in various ways.
|
||||||
|
|
||||||
|
I primarily target Debian Linux-based (Debian, Ubuntu, and Kali Linux) systems
|
||||||
|
as well as MacOS. Other platforms are lower priorities. Shell scripts ending
|
||||||
|
in `.sh` should use only POSIX features unless there is a shebang line at the
|
||||||
|
beginning suggesting a different shell will be used. In particular, those
|
||||||
|
in directories with names like bash might use those shells.
|
||||||
|
|
||||||
|
`zsh` and `fish` are the key interactive shells to be configured, but `bash`
|
||||||
|
may also be used at times.
|
||||||
|
|
||||||
|
## Project Structure
|
||||||
|
|
||||||
|
* `bin/`: Contains executable scripts symlinked to `~/bin/`. Subdirectories like `macos/`, `restic/`, and `setup/` are included.
|
||||||
|
* `dotfiles/`: Contains configuration files (dotfiles) symlinked to the home directory.
|
||||||
|
* `dotfile_overlays/`: Each directory within is symlinked to the home directory, allowing for modular or git-submodule-based configurations.
|
||||||
|
* `local_dotfiles/`: If present, its contents are symlinked to the home directory (ignored by git).
|
||||||
|
* `packages/`: Contains lists of packages (one per line) for different environments or toolsets.
|
||||||
|
* `keys/`: Contains SSH keys (`ssh/`), GPG keys (`gpg/`), and a `known_hosts` file to be installed/merged.
|
||||||
|
* `skeltools/`: Internal utilities used by the installation scripts.
|
||||||
|
* `sysctl/` and `udev/`: Linux system configuration files.
|
||||||
|
* `Brewfile`: Homebrew package list for macOS environments.
|
||||||
|
* `install.sh`: The primary installation script for symlinking and basic setup.
|
||||||
|
|
||||||
|
## Notes on Security Issues
|
||||||
|
|
||||||
|
It is safe to have scripts and tools re-invoke themselves with sudo when they
|
||||||
|
require elevated privileges, as these are my own. Do not attempt to remove
|
||||||
|
these use cases.
|
||||||
|
|
||||||
|
## Making Changes
|
||||||
|
|
||||||
|
**IMPORTANT**: Only make those changes which are explicitly requested. If you
|
||||||
|
identify other issues, notify me about them, but do not suggest changes until I
|
||||||
|
ask for them.
|
||||||
|
|
||||||
|
When making large changes, explain your chain of thought transparently and
|
||||||
|
explain solution design.
|
||||||
|
|
||||||
|
If making changes that affects how the user installs the tools, update
|
||||||
|
`README.md` accordingly.
|
||||||
|
|
||||||
|
### Adding a new dotfile
|
||||||
|
|
||||||
|
1. Place the new dotfile in the `dotfiles/` directory.
|
||||||
|
2. Alternatively, use `dotfile_overlays/` if the dotfile belongs to a specific group or submodule.
|
||||||
|
3. The `install.sh` script will automatically symlink it to the home directory.
|
||||||
|
|
||||||
|
### Adding a new script to `bin/`
|
||||||
|
|
||||||
|
1. Add the new script to the `bin/` directory (or an appropriate subdirectory).
|
||||||
|
2. Ensure the script is executable (`chmod +x`).
|
||||||
|
|
||||||
|
### Adding a new package
|
||||||
|
|
||||||
|
1. Identify the appropriate package list in the `packages/` directory (e.g., `packages/cli`, `packages/kali`).
|
||||||
|
2. Add the new package name to the list (one per line).
|
||||||
|
3. If a new package set is required, create a new file in the `packages/` directory.
|
||||||
|
4. For macOS-specific packages, also consider adding them to the `Brewfile`.
|
||||||
|
|
||||||
|
### Platform-specific changes
|
||||||
|
|
||||||
|
When making changes that are specific to a platform (e.g., Debian vs. macOS), please check for existing conventions in the `install.sh` script or other files. Use conditional logic (e.g., checking `uname`) to apply platform-specific settings.
|
||||||
106
Brewfile
Normal file
106
Brewfile
Normal file
@@ -0,0 +1,106 @@
|
|||||||
|
tap "dart-lang/dart"
|
||||||
|
tap "sass/sass"
|
||||||
|
brew "ack"
|
||||||
|
brew "acme.sh"
|
||||||
|
brew "age"
|
||||||
|
brew "autoconf"
|
||||||
|
brew "automake"
|
||||||
|
brew "b2-tools"
|
||||||
|
brew "bat"
|
||||||
|
brew "cask"
|
||||||
|
brew "ccache"
|
||||||
|
brew "certbot"
|
||||||
|
brew "cmake"
|
||||||
|
brew "colima"
|
||||||
|
brew "devcontainer"
|
||||||
|
brew "difftastic"
|
||||||
|
brew "dfu-util"
|
||||||
|
brew "direnv"
|
||||||
|
brew "duck"
|
||||||
|
brew "earthly"
|
||||||
|
brew "esptool"
|
||||||
|
brew "gh"
|
||||||
|
brew "ghidra", link: false
|
||||||
|
brew "git"
|
||||||
|
brew "git-delta"
|
||||||
|
brew "git-lfs"
|
||||||
|
brew "gnupg"
|
||||||
|
brew "go"
|
||||||
|
brew "gradle"
|
||||||
|
brew "htop"
|
||||||
|
brew "httpie"
|
||||||
|
brew "huggingface-cli"
|
||||||
|
brew "hugo"
|
||||||
|
brew "imagemagick"
|
||||||
|
brew "john-jumbo"
|
||||||
|
brew "jq"
|
||||||
|
brew "lima"
|
||||||
|
brew "mise"
|
||||||
|
brew "mosh"
|
||||||
|
brew "neovim"
|
||||||
|
brew "ninja"
|
||||||
|
brew "nmap"
|
||||||
|
brew "protobuf"
|
||||||
|
brew "p7zip"
|
||||||
|
brew "pipenv"
|
||||||
|
brew "pipx"
|
||||||
|
brew "pkgconf"
|
||||||
|
brew "pwgen"
|
||||||
|
brew "pwntools"
|
||||||
|
brew "qemu"
|
||||||
|
brew "restic"
|
||||||
|
brew "ripgrep"
|
||||||
|
brew "ruby"
|
||||||
|
brew "ruby@3.3"
|
||||||
|
brew "rustup"
|
||||||
|
brew "scroll-reverser"
|
||||||
|
brew "shellcheck"
|
||||||
|
brew "smartmontools"
|
||||||
|
brew "starship"
|
||||||
|
brew "tmux"
|
||||||
|
brew "uv"
|
||||||
|
brew "virtualenvwrapper"
|
||||||
|
brew "wget"
|
||||||
|
brew "yt-dlp"
|
||||||
|
brew "zlib"
|
||||||
|
brew "zsh-syntax-highlighting"
|
||||||
|
brew "sass/sass/migrator"
|
||||||
|
brew "sass/sass/sass"
|
||||||
|
cask "codeql"
|
||||||
|
cask "cyberduck"
|
||||||
|
cask "font-fira-code-nerd-font"
|
||||||
|
cask "font-fira-mono-nerd-font"
|
||||||
|
cask "font-go-mono-nerd-font"
|
||||||
|
cask "font-hack-nerd-font"
|
||||||
|
cask "font-inconsolata-nerd-font"
|
||||||
|
cask "font-symbols-only-nerd-font"
|
||||||
|
cask "font-terminess-ttf-nerd-font"
|
||||||
|
cask "ghidra"
|
||||||
|
cask "gimp"
|
||||||
|
cask "github"
|
||||||
|
cask "iterm2"
|
||||||
|
cask "macfuse"
|
||||||
|
cask "meld"
|
||||||
|
cask "mitmproxy"
|
||||||
|
cask "raycast"
|
||||||
|
cask "rectangle"
|
||||||
|
cask "scroll-reverser"
|
||||||
|
cask "temurin"
|
||||||
|
cask "veracrypt"
|
||||||
|
cask "zulu@17"
|
||||||
|
|
||||||
|
def is_corp?
|
||||||
|
# Check for MDM enrollment (Enrolled via DEP: Yes)
|
||||||
|
`profiles status -type enrollment 2>/dev/null`.include?("Enrolled via DEP: Yes")
|
||||||
|
end
|
||||||
|
|
||||||
|
# non-corp
|
||||||
|
if !is_corp?
|
||||||
|
brew "bazel"
|
||||||
|
brew "openssh"
|
||||||
|
cask "claude-code"
|
||||||
|
cask "cryptomator"
|
||||||
|
cask "gcloud-cli"
|
||||||
|
cask "google-cloud-sdk"
|
||||||
|
cask "orbstack"
|
||||||
|
end
|
||||||
75
README.md
75
README.md
@@ -1,39 +1,86 @@
|
|||||||
|
|
||||||
### About ###
|
### About ###
|
||||||
|
|
||||||
This is a repository of configuration files that I like to have on all the
|
This is a repository of configuration files that I like to have on all the
|
||||||
machines that I use. I can just clone the repository and run "repo/setup.sh"
|
machines that I use. For new systems, you can bootstrap by running the
|
||||||
and get most things setup the way I like them.
|
included `clone.sh` script:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
curl -L https://raw.githubusercontent.com/Matir/skel/master/clone.sh | bash
|
||||||
|
```
|
||||||
|
|
||||||
|
Alternatively, you can manually clone the repository and run `./install.sh`.
|
||||||
|
|
||||||
This started just as dotfiles, but expanded to include SSH keys, GPG keys,
|
This started just as dotfiles, but expanded to include SSH keys, GPG keys,
|
||||||
packages I like installed, and an ever-growing setup script. There are various
|
and an ever-growing setup script. There are various
|
||||||
options to install just parts of it, such as on a machine where I only have a
|
options to install just parts of it, such as on a machine where I only have a
|
||||||
user account but no root.
|
user account but no root.
|
||||||
|
|
||||||
This now uses [git-crypt](https://github.com/AGWA/git-crypt) to protect
|
This environment supports using `dotfile_overlays/` or `local_dotfiles/` to
|
||||||
`private_dotfiles` for things I don't want to splash all over the internet. :)
|
manage machine-specific or private configurations. You can use
|
||||||
|
[git-crypt](https://github.com/AGWA/git-crypt) on these overlay directories
|
||||||
|
for things you don't want to splash all over the internet. :)
|
||||||
I still wouldn't check in anything terribly sensitive, like private keys.
|
I still wouldn't check in anything terribly sensitive, like private keys.
|
||||||
|
|
||||||
### Usefulness ###
|
### Usefulness ###
|
||||||
|
|
||||||
Mostly I post this to github so I can quickly grab the things I want, but it
|
Mostly I post this to github so I can quickly grab the things I want, but it
|
||||||
might also be useful to others. Feel free to raise an issue if you have any
|
might also be useful to others. Feel free to raise an issue if you have any
|
||||||
questions. I don't anticipating taking merge requests -- make your own
|
questions. I don't anticipating taking merge requests -- make your own
|
||||||
dotfiles. ;)
|
dotfiles. ;)
|
||||||
|
|
||||||
### Options ###
|
### Options ###
|
||||||
|
|
||||||
|
### macOS-like Copy/Paste ###
|
||||||
|
|
||||||
|
To address keyboard shortcut conflicts between operating systems, this environment
|
||||||
|
now supports using `Alt+C` for copy and `Alt+V` for paste, similar to macOS.
|
||||||
|
This functionality is context-aware: it will automatically use `Ctrl+Shift+C/V`
|
||||||
|
in terminals and `Ctrl+C/V` in all other applications.
|
||||||
|
|
||||||
|
This feature requires the following packages to be installed:
|
||||||
|
|
||||||
|
- `xbindkeys`: To listen for the keyboard shortcuts.
|
||||||
|
- `xdotool`: To send the appropriate keypresses.
|
||||||
|
|
||||||
|
On Debian-based systems (like Ubuntu or Kali), you can install them with:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
sudo apt-get update
|
||||||
|
sudo apt-get install xbindkeys xdotool
|
||||||
|
```
|
||||||
|
|
||||||
|
After installation, the functionality will be enabled automatically on your
|
||||||
|
next login.
|
||||||
|
|
||||||
|
On macOS, you can install the recommended packages using the included `Brewfile`:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
brew bundle install
|
||||||
|
```
|
||||||
|
|
||||||
|
### Packages ###
|
||||||
|
|
||||||
|
The `packages/` directory contains lists of recommended packages. You can
|
||||||
|
manually install a set (e.g., on a Debian-based system) using:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
grep -v "^#" packages/cli | xargs sudo apt-get install -y
|
||||||
|
```
|
||||||
|
|
||||||
```
|
```
|
||||||
BASEDIR: Where the skel framework is installed. Defaults to $HOME/.skel
|
BASEDIR: Where the skel framework is installed. Defaults to $HOME/.skel
|
||||||
MINIMAL: Don't do things that require git clones or installation of anything
|
MINIMAL: Don't do things that require git clones or installation of anything
|
||||||
not included in my .skel. (Defaults to 0, installs everything.)
|
not included in my .skel. (e.g., skips vim-plug, TPM) (Defaults to 0)
|
||||||
INSTALL_KEYS: Install GnuPG and SSH keys. SSH keys are placed in
|
INSTALL_KEYS: Install GnuPG and SSH keys. SSH keys are placed in
|
||||||
authorized_keys. (Defaults to 1, installs keys.)
|
authorized_keys. (Defaults to 1, installs keys.)
|
||||||
TRUST_ALL_KEYS: Allow all keys to be used for SSH login, versus a small subset.
|
TRUST_ALL_KEYS: Allow all keys to be used for SSH login, versus a small subset.
|
||||||
INSTALL_PKGS: Install common packages, if on a Debian-like system.
|
VERBOSE: Enable verbose output during installation. (Defaults to 0)
|
||||||
(Defaults to opposite of $MINIMAL.)
|
SAVE: Save the install options to ${BASEDIR}/.installed-prefs
|
||||||
SAVE: Save the install options to ${BASEDIR}/installed-prefs
|
|
||||||
```
|
```
|
||||||
|
|
||||||
### TODO ###
|
### TODO ###
|
||||||
|
|
||||||
[ ] Re-do the installation of packages.
|
- [X] Re-do the installation of packages.
|
||||||
[ ] Make manual installation of sets easy/possible.
|
- [X] Make manual installation of sets easy/possible.
|
||||||
[ ] Make missing packages not cause a full set failure.
|
- [X] Make missing packages not cause a full set failure.
|
||||||
[X] Allow comments and blank lines.
|
- [X] Allow comments and blank lines. in packages
|
||||||
|
|||||||
70
bin/add_hosts_entry
Normal file
70
bin/add_hosts_entry
Normal file
@@ -0,0 +1,70 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
|
# vim: set ft=python:
|
||||||
|
|
||||||
|
import datetime
|
||||||
|
import ipaddress
|
||||||
|
import os
|
||||||
|
import sys
|
||||||
|
import sys.path
|
||||||
|
|
||||||
|
|
||||||
|
def generate_hosts_entry(ip_address_str, hostnames):
|
||||||
|
"""
|
||||||
|
Generates a string formatted for /etc/hosts after validating the IP address.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
ip_address_str (str): The IP address string.
|
||||||
|
hostnames (list): A list of hostname strings.
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
str: A formatted string for /etc/hosts, or None if validation fails.
|
||||||
|
"""
|
||||||
|
try:
|
||||||
|
# Validate the IP address
|
||||||
|
ip = ipaddress.ip_address(ip_address_str)
|
||||||
|
except ValueError:
|
||||||
|
print(f"Error: '{ip_address_str}' is not a valid IP address.", file=sys.stderr)
|
||||||
|
return None
|
||||||
|
|
||||||
|
# Join hostnames with spaces
|
||||||
|
hostnames_str = " ".join(hostnames)
|
||||||
|
|
||||||
|
# Return the formatted line
|
||||||
|
return f"{ip} {hostnames_str}"
|
||||||
|
|
||||||
|
|
||||||
|
def append_hosts_entry(entry, hosts_file="/etc/hosts"):
|
||||||
|
when = datetime.datetime.now().strftime("%Y-%m-%d %H:%M")
|
||||||
|
try:
|
||||||
|
with open(hosts_file, "a") as fp:
|
||||||
|
fp.write(f"# Added by add_hosts_entry {when}\n{entry}\n")
|
||||||
|
return True
|
||||||
|
except PermissionError:
|
||||||
|
if os.geteuid() == 0:
|
||||||
|
print(f"Error: failed opening {hosts_file} for writing.",
|
||||||
|
file=sys.stderr)
|
||||||
|
return False
|
||||||
|
return relaunch_with_sudo()
|
||||||
|
|
||||||
|
|
||||||
|
def relaunch_with_sudo():
|
||||||
|
script_abspath = os.path.abspath(sys.argv[0])
|
||||||
|
os.execvp("sudo", [script_abspath] + sys.argv[1:])
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
# Check for correct number of arguments
|
||||||
|
if len(sys.argv) < 3:
|
||||||
|
print("Usage: python3 generate_hosts_entry.py <ip_address> <hostname1> [hostname2 ...]", file=sys.stderr)
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
ip_to_add = sys.argv[1]
|
||||||
|
hostnames_to_add = sys.argv[2:]
|
||||||
|
|
||||||
|
# Generate the entry
|
||||||
|
entry = generate_hosts_entry(ip_to_add, hostnames_to_add)
|
||||||
|
if not entry:
|
||||||
|
sys.exit(1)
|
||||||
|
if not append_hosts_entry(entry):
|
||||||
|
sys.exit(1)
|
||||||
@@ -3,6 +3,11 @@
|
|||||||
set -o nounset
|
set -o nounset
|
||||||
set -o errexit
|
set -o errexit
|
||||||
|
|
||||||
|
if [ "$(uname)" != "Linux" ]; then
|
||||||
|
echo "Error: This backup script is only intended for use on Linux." >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
DEFAULT=`echo /media/${USER}/[bB]ackup/${USER}/`
|
DEFAULT=`echo /media/${USER}/[bB]ackup/${USER}/`
|
||||||
DEST="${1:-${DEFAULT}}"
|
DEST="${1:-${DEFAULT}}"
|
||||||
|
|
||||||
@@ -26,5 +31,8 @@ function verify_dest {
|
|||||||
|
|
||||||
verify_dest "$DEST"
|
verify_dest "$DEST"
|
||||||
|
|
||||||
rsync -Hax --delete --exclude-from="$HOME/.rsync_ignore" \
|
time nice rsync -Hax --delete --exclude-from="$HOME/.rsync_ignore" \
|
||||||
--delete-excluded "${HOME}/" "$DEST"
|
--delete-excluded "${HOME}/" "$DEST"
|
||||||
|
echo "Backup completed..."
|
||||||
|
time sync
|
||||||
|
echo "Run finished, safe to unmount."
|
||||||
|
|||||||
@@ -835,14 +835,14 @@ case "$1" in
|
|||||||
fi
|
fi
|
||||||
cd /proc
|
cd /proc
|
||||||
N=$2
|
N=$2
|
||||||
if [ -d $N ] ; then
|
if [ -d "$N" ] ; then
|
||||||
# read permissions?
|
# read permissions?
|
||||||
if [ ! -r $N/exe ] ; then
|
if [ ! -r "$N/exe" ] ; then
|
||||||
if !(root_privs) ; then
|
if !(root_privs) ; then
|
||||||
printf "\033[31mNo read permissions for '/proc/$N/exe' (run as root).\033[m\n\n"
|
printf "\033[31mNo read permissions for '/proc/%s/exe' (run as root).\033[m\n\n" "$N"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
if [ ! `readlink $N/exe` ] ; then
|
if [ ! "$(readlink "$N/exe")" ] ; then
|
||||||
printf "\033[31mPermission denied. Requested process ID belongs to a kernel thread.\033[m\n\n"
|
printf "\033[31mPermission denied. Requested process ID belongs to a kernel thread.\033[m\n\n"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
@@ -860,9 +860,9 @@ case "$1" in
|
|||||||
printf "\033[31mError: libc not found.\033[m\n\n"
|
printf "\033[31mError: libc not found.\033[m\n\n"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
printf "* Process name (PID) : %s (%d)\n" `head -1 $N/status | cut -b 7-` $N
|
printf "* Process name (PID) : %s (%d)\n" "$(head -1 "$N/status" | cut -b 7-)" "$N"
|
||||||
FS_chk_func_libc=( $(readelf -s $FS_libc | grep _chk@@ | awk '{ print $8 }' | cut -c 3- | sed -e 's/_chk@.*//') )
|
FS_chk_func_libc=( $(readelf -s "$FS_libc" | grep _chk@@ | awk '{ print $8 }' | cut -c 3- | sed -e 's/_chk@.*//') )
|
||||||
FS_functions=( $(readelf -s $2/exe | awk '{ print $8 }' | sed 's/_*//' | sed -e 's/@.*//') )
|
FS_functions=( $(readelf -s "$2/exe" | awk '{ print $8 }' | sed 's/_*//' | sed -e 's/@.*//') )
|
||||||
|
|
||||||
FS_libc_check
|
FS_libc_check
|
||||||
FS_binary_check
|
FS_binary_check
|
||||||
|
|||||||
148
bin/cloudy.sh
Executable file
148
bin/cloudy.sh
Executable file
@@ -0,0 +1,148 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
set -ueo pipefail
|
||||||
|
shopt -s extglob
|
||||||
|
|
||||||
|
# get libraries
|
||||||
|
. ${HOME}/.local/lib/bash/tui.sh
|
||||||
|
|
||||||
|
COMMANDS=(
|
||||||
|
gctx
|
||||||
|
kctx
|
||||||
|
)
|
||||||
|
|
||||||
|
_make_extglob() {
|
||||||
|
local IFS='|'
|
||||||
|
echo "@($*)"
|
||||||
|
}
|
||||||
|
|
||||||
|
CMD_PATTERN=$(_make_extglob "${COMMANDS[@]}")
|
||||||
|
|
||||||
|
usage() {
|
||||||
|
echo "Available Subcommands:"
|
||||||
|
printf " - %-10s\n" "${COMMANDS[@]}"
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
|
||||||
|
_gctx_set() {
|
||||||
|
gcloud config configurations activate "${1}" </dev/null
|
||||||
|
}
|
||||||
|
|
||||||
|
_gctx_choose() {
|
||||||
|
local lines=()
|
||||||
|
local default=''
|
||||||
|
local maxnamelen=0
|
||||||
|
local active name description
|
||||||
|
while IFS=$'\t' read -r active name description ; do
|
||||||
|
(( maxnamelen = ( ${#name} > maxnamelen ) ? ${#name} : maxnamelen ))
|
||||||
|
if [[ "$active" == "True" ]] ; then
|
||||||
|
default="${name}"
|
||||||
|
fi
|
||||||
|
lines+=("${name}" "${description}")
|
||||||
|
done < <(gcloud config configurations list \
|
||||||
|
--format='value(is_active, name, format("{} (as {})", properties.core.project, properties.core.account))')
|
||||||
|
local choice
|
||||||
|
if choice=$(printf "%-${maxnamelen}s %s\n" "${lines[@]}" | select_entry "gcloud config" "$default") ; then
|
||||||
|
_gctx_set "${choice}"
|
||||||
|
else
|
||||||
|
echo "No option selected, leaving unchanged."
|
||||||
|
fi
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
_gctx_new() {
|
||||||
|
local cname="${1:-}"
|
||||||
|
if test -z "${cname}" ; then
|
||||||
|
echo "Usage: gctx new <new name>" >&2
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
gcloud config configurations create "${cname}"
|
||||||
|
}
|
||||||
|
|
||||||
|
_gctx_name() {
|
||||||
|
gcloud info --format='value(config.active_config_name)'
|
||||||
|
}
|
||||||
|
|
||||||
|
_gctx_clone() {
|
||||||
|
# save old config
|
||||||
|
local oldconfig=()
|
||||||
|
local line
|
||||||
|
while IFS= read -r line ; do
|
||||||
|
old_config+=("$line")
|
||||||
|
done < <(gcloud config configurations describe "$(_gctx_name)" --format='multi(properties:format="flattened[separator=\" \"]")')
|
||||||
|
|
||||||
|
# create new
|
||||||
|
_gctx_new "${1:-}"
|
||||||
|
|
||||||
|
# set config
|
||||||
|
for line in "${oldconfig[@]}" ; do
|
||||||
|
local keyname="${line%% *}"
|
||||||
|
local keypath="${keyname//\.//}"
|
||||||
|
local value="${line#* }"
|
||||||
|
gcloud config set "${keypath}" "${value}"
|
||||||
|
done
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
gctx() {
|
||||||
|
local subcmd="${1:-}"
|
||||||
|
shift || true
|
||||||
|
case "${subcmd}" in
|
||||||
|
clone)
|
||||||
|
_gctx_clone "$@"
|
||||||
|
return
|
||||||
|
;;
|
||||||
|
new)
|
||||||
|
_gctx_new "$@"
|
||||||
|
return
|
||||||
|
;;
|
||||||
|
show)
|
||||||
|
gcloud config configurations list --filter="is_active=True" \
|
||||||
|
--format='table(name, properties.core.account, properties.core.project, properties.compute.zone:label=COMPUTE_DEFAULT_ZONE, properties.compute.region:label=COMPUTE_DEFAULT_REGION)' \
|
||||||
|
"$@"
|
||||||
|
;;
|
||||||
|
list)
|
||||||
|
gcloud config configurations list "$@"
|
||||||
|
return
|
||||||
|
;;
|
||||||
|
activate)
|
||||||
|
_gctx_set "$@"
|
||||||
|
return
|
||||||
|
;;
|
||||||
|
""|choose)
|
||||||
|
_gctx_choose
|
||||||
|
return
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
if _gctx_set "${subcmd}" 2>/dev/null ; then
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
echo "Usage: gctx [show|list|new|choose|clone|<name>]" >&2
|
||||||
|
return 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
}
|
||||||
|
|
||||||
|
kctx() {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
INVOKED_AS=$(basename "$0")
|
||||||
|
# shellcheck disable=SC2053
|
||||||
|
if [[ "$INVOKED_AS" == $CMD_PATTERN ]] ; then
|
||||||
|
CMD="${INVOKED_AS}"
|
||||||
|
else
|
||||||
|
CMD="${1:-}"
|
||||||
|
shift || usage
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
# shellcheck disable=SC2254
|
||||||
|
case "${CMD}" in
|
||||||
|
${CMD_PATTERN})
|
||||||
|
"${CMD}" "$@"
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
usage
|
||||||
|
;;
|
||||||
|
esac
|
||||||
@@ -1,3 +1,11 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
exec xdg-open $(dirname $0)/cyberchef.html
|
set -u
|
||||||
|
|
||||||
|
CHEF_FILE=${HOME}/tools/cyberchef/cyberchef.html
|
||||||
|
|
||||||
|
if [ ! -f ${CHEF_FILE} ] ; then
|
||||||
|
${HOME}/bin/install_tool cyberchef
|
||||||
|
fi
|
||||||
|
|
||||||
|
exec xdg-open ${CHEF_FILE}
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
8
bin/darwin-env.sh
Executable file
8
bin/darwin-env.sh
Executable file
@@ -0,0 +1,8 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
env > ${TMPDIR}/env-pre
|
||||||
|
. ${HOME}/.shenv
|
||||||
|
env > ${TMPDIR}/env-post
|
||||||
|
for VAR in $(env | cut -d'=' -f1) ; do
|
||||||
|
/bin/launchctl setenv "${VAR}" "$(eval echo \$${VAR})"
|
||||||
|
done
|
||||||
22
bin/disk-benchmark
Executable file
22
bin/disk-benchmark
Executable file
@@ -0,0 +1,22 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
set -ue
|
||||||
|
|
||||||
|
FILENAME=${1}
|
||||||
|
BENCHMARK_SIZE=${BENCHMARK_SIZE:-1000m}
|
||||||
|
|
||||||
|
if [ -f ${FILENAME} ] ; then
|
||||||
|
echo "File ${FILENAME} already exists!" >/dev/stderr
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
trap "test -f ${FILENAME} && rm -f ${FILENAME}" EXIT
|
||||||
|
|
||||||
|
fio --loops=5 --size=${BENCHMARK_SIZE} --filename=${FILENAME} \
|
||||||
|
--stonewall --ioengine=libaio --direct=1 \
|
||||||
|
--name=Seqread --bs=1m --rw=read \
|
||||||
|
--name=Seqwrite --bs=1m --rw=write \
|
||||||
|
--name=512Kread --bs=512k --rw=randread \
|
||||||
|
--name=512Kwrite --bs=512k --rw=randwrite \
|
||||||
|
--name=4kQD32read --bs=4k --iodepth=32 --rw=randread \
|
||||||
|
--name=4kQD32write --bs=4k --iodepth=32 --rw=randwrite
|
||||||
93
bin/fix-broken-symlinks.sh
Executable file
93
bin/fix-broken-symlinks.sh
Executable file
@@ -0,0 +1,93 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# A script to find and remove broken symbolic links in a directory.
|
||||||
|
#
|
||||||
|
# OPTIONS:
|
||||||
|
# -y: Automatically remove all broken links without confirmation.
|
||||||
|
# -q: Quiet mode. Suppress all non-error output.
|
||||||
|
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
|
# --- Default settings ---
|
||||||
|
FORCE_DELETE=0
|
||||||
|
QUIET=0
|
||||||
|
TARGET_DIR="."
|
||||||
|
|
||||||
|
# --- Helper function for logging ---
|
||||||
|
log() {
|
||||||
|
if [ "${QUIET}" -eq 0 ]; then
|
||||||
|
echo "$@"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# --- Usage function ---
|
||||||
|
usage() {
|
||||||
|
echo "Usage: $0 [-y] [-q] [TARGET_DIRECTORY]"
|
||||||
|
echo " -y: Yes. Automatically remove broken symlinks without confirmation."
|
||||||
|
echo " -q: Quiet. Suppress all output except for errors."
|
||||||
|
echo " TARGET_DIRECTORY: The directory to scan. Defaults to the current directory."
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
|
||||||
|
# --- Parse command-line options ---
|
||||||
|
while getopts "yq" opt; do
|
||||||
|
case ${opt} in
|
||||||
|
y)
|
||||||
|
FORCE_DELETE=1
|
||||||
|
;;
|
||||||
|
q)
|
||||||
|
QUIET=1
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
usage
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
shift $((OPTIND - 1)) # Remove the parsed options
|
||||||
|
|
||||||
|
# --- Set target directory ---
|
||||||
|
# Use the first remaining argument as the target directory.
|
||||||
|
if [ -n "$1" ]; then
|
||||||
|
TARGET_DIR="$1"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ ! -d "${TARGET_DIR}" ]; then
|
||||||
|
echo "Error: Directory '${TARGET_DIR}' not found." >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
log "Searching for broken symlinks in '${TARGET_DIR}'..."
|
||||||
|
|
||||||
|
# --- Main logic ---
|
||||||
|
# Find broken symlinks and process them.
|
||||||
|
find "${TARGET_DIR}" -type l ! -exec test -e {} \; -print0 | while IFS= read -r -d '' link; do
|
||||||
|
if [ "${FORCE_DELETE}" -eq 1 ]; then
|
||||||
|
# No confirmation needed, just delete.
|
||||||
|
if rm "${link}"; then
|
||||||
|
log "Removed '${link}'."
|
||||||
|
else
|
||||||
|
# Errors should still be reported.
|
||||||
|
echo "Failed to remove '${link}'." >&2
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
# If in quiet mode but not force mode, we can't prompt, so we skip.
|
||||||
|
if [ "${QUIET}" -eq 1 ]; then
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
# Ask the user for confirmation.
|
||||||
|
read -p "Remove broken symlink '${link}'? [y/N] " -n 1 -r
|
||||||
|
echo # Move to a new line after input.
|
||||||
|
|
||||||
|
if [[ $REPLY =~ ^[Yy]$ ]]; then
|
||||||
|
if rm "${link}"; then
|
||||||
|
log "Removed '${link}'."
|
||||||
|
else
|
||||||
|
echo "Failed to remove '${link}'." >&2
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
log "Skipped '${link}'."
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
log "Cleanup complete."
|
||||||
@@ -1,10 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
CHROME=`which google-chrome`
|
|
||||||
|
|
||||||
if [ `id -u` != "0" ] ; then
|
|
||||||
exec $CHROME "$@"
|
|
||||||
fi
|
|
||||||
|
|
||||||
CMD="${CHROME} --user-data-dir=${HOME}/.chrome-data-dir \"$@\""
|
|
||||||
su -c "${CMD}" chromeuser
|
|
||||||
21
bin/google-chrome-burp
Executable file
21
bin/google-chrome-burp
Executable file
@@ -0,0 +1,21 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
CHROME_BINS="google-chrome-beta google-chrome"
|
||||||
|
for bin in ${CHROME_BINS} ; do
|
||||||
|
if command -v ${bin} >/dev/null 2>&1 ; then
|
||||||
|
CHROME=$(command -v ${bin})
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
if test -z "${CHROME}" ; then
|
||||||
|
echo "Chrome not found!" >/dev/stderr
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Set alternate HOME to use alternate NSS DB
|
||||||
|
export HOME=${HOME}/.chrome-pentest
|
||||||
|
mkdir -p ${HOME}
|
||||||
|
|
||||||
|
# Launch chrome for burp
|
||||||
|
exec ${CHROME} --user-data-dir=${HOME}/chrome-pentest --proxy-server=127.0.0.1:8080
|
||||||
14
bin/google-chrome-noroot
Executable file
14
bin/google-chrome-noroot
Executable file
@@ -0,0 +1,14 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
CHROME=`which google-chrome`
|
||||||
|
|
||||||
|
if [ `id -u` != "0" ] ; then
|
||||||
|
exec "$CHROME" "$@"
|
||||||
|
fi
|
||||||
|
|
||||||
|
args=()
|
||||||
|
for x in "$@"; do
|
||||||
|
args+=("$(printf %q "$x")")
|
||||||
|
done
|
||||||
|
|
||||||
|
su -c "$CHROME --user-data-dir=${HOME}/.chrome-data-dir ${args[*]}" chromeuser
|
||||||
@@ -1,8 +1,11 @@
|
|||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
|
LOCKTIME="${SCREENSAVER_MIN:-5}"
|
||||||
LOCKER="i3lock -c 000000"
|
LOCKER="i3lock -c 000000"
|
||||||
/usr/bin/xss-lock -- "${LOCKER}" &
|
# intentionally want word splitting below
|
||||||
|
# do not quote this
|
||||||
|
/usr/bin/xss-lock -- ${LOCKER} &
|
||||||
exec /usr/bin/xautolock \
|
exec /usr/bin/xautolock \
|
||||||
-time 5 \
|
-time "${LOCKTIME}" \
|
||||||
-detectsleep \
|
-detectsleep \
|
||||||
-locker "${LOCKER}" \
|
-locker "${LOCKER}" \
|
||||||
-notify 30 \
|
-notify 30 \
|
||||||
|
|||||||
137
bin/install_ansible.sh
Executable file
137
bin/install_ansible.sh
Executable file
@@ -0,0 +1,137 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
#
|
||||||
|
# Installs Ansible, trying user-space methods first before falling back to sudo.
|
||||||
|
# This script is designed to be idempotent and safe to run multiple times.
|
||||||
|
|
||||||
|
set -e # Exit immediately if a command exits with a non-zero status.
|
||||||
|
|
||||||
|
# --- Helper Functions ---
|
||||||
|
info() { echo "[INFO] $1"; }
|
||||||
|
warn() { echo "[WARN] $1"; }
|
||||||
|
error() { echo "[ERROR] $1" >&2; exit 1; }
|
||||||
|
|
||||||
|
# --- Main Logic ---
|
||||||
|
|
||||||
|
# 1. Check if Ansible is already installed
|
||||||
|
if command -v ansible >/dev/null 2>&1; then
|
||||||
|
info "Ansible is already installed at $(command -v ansible)."
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
info "Ansible not found. Attempting installation..."
|
||||||
|
|
||||||
|
# 2. Try user-space installation (no sudo)
|
||||||
|
info "--- Attempting user-space installation (no sudo required) ---"
|
||||||
|
|
||||||
|
# Try pipx first, as it's the cleanest user-space method
|
||||||
|
if command -v pipx >/dev/null 2>&1; then
|
||||||
|
info "Found pipx. Trying to install Ansible with it..."
|
||||||
|
if pipx install ansible;
|
||||||
|
then
|
||||||
|
# pipx requires adding ~/.local/bin to PATH, which might not be sourced yet.
|
||||||
|
# Check the executable directly.
|
||||||
|
if [[ -x "${HOME}/.local/bin/ansible" ]]; then
|
||||||
|
info "Ansible installed successfully with pipx."
|
||||||
|
info "Please ensure '${HOME}/.local/bin' is in your PATH."
|
||||||
|
info "You may need to restart your shell or run: export PATH=\"$HOME/.local/bin:$PATH\""
|
||||||
|
exit 0
|
||||||
|
else
|
||||||
|
warn "pipx install seemed to succeed, but ansible executable not found where expected."
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
warn "pipx install ansible failed."
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Try Python's venv module if pipx failed or wasn't present
|
||||||
|
VENV_PATH="${HOME}/.local/share/ansible_venv"
|
||||||
|
# Create a temp path to avoid clobbering a failed install
|
||||||
|
VENV_TEST_PATH="/tmp/ansible_venv_test_$$"
|
||||||
|
if python3 -m venv "${VENV_TEST_PATH}" >/dev/null 2>&1; then
|
||||||
|
rm -rf "${VENV_TEST_PATH}" # Clean up test
|
||||||
|
info "Python's venv module is available. Creating a virtual environment at ${VENV_PATH}..."
|
||||||
|
python3 -m venv "${VENV_PATH}"
|
||||||
|
if "${VENV_PATH}/bin/pip" install --quiet ansible;
|
||||||
|
then
|
||||||
|
info "Ansible installed successfully into a virtual environment."
|
||||||
|
info "To use it, run: '${VENV_PATH}/bin/ansible'"
|
||||||
|
info "To make it available everywhere, add its bin directory to your PATH:"
|
||||||
|
info " echo 'export PATH="${VENV_PATH}/bin:$PATH"' >> ~/.profile"
|
||||||
|
info "(You may need to source ~/.profile or restart your shell)."
|
||||||
|
exit 0
|
||||||
|
else
|
||||||
|
warn "Failed to install ansible into the virtual environment."
|
||||||
|
rm -rf "${VENV_PATH}" # Clean up failed attempt
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
info "Python's venv module not available or failed to create a test environment."
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 3. Fallback to sudo installation
|
||||||
|
info "--- User-space installation failed. Falling back to system-wide installation (sudo required) ---"
|
||||||
|
|
||||||
|
if ! command -v sudo >/dev/null 2>&1; then
|
||||||
|
error "sudo command not found. Cannot attempt system-wide installation. Aborting."
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Prompt for sudo password upfront so it doesn't happen in the middle of the script
|
||||||
|
info "Sudo privileges are required. You may be prompted for your password."
|
||||||
|
if ! sudo -v; then
|
||||||
|
error "Failed to acquire sudo privileges. Aborting."
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Detect package manager and install
|
||||||
|
if command -v apt-get >/dev/null 2>&1; then
|
||||||
|
info "Detected Debian-based system (apt)."
|
||||||
|
sudo apt-get update -y
|
||||||
|
info "Attempting to install 'ansible' package..."
|
||||||
|
if sudo apt-get install -y ansible;
|
||||||
|
then
|
||||||
|
info "System package 'ansible' installed successfully."
|
||||||
|
else
|
||||||
|
warn "Failed to install 'ansible' package directly. Trying to install prerequisites for user-space install..."
|
||||||
|
if sudo apt-get install -y pipx;
|
||||||
|
then
|
||||||
|
info "Installed pipx. Attempting to install Ansible with it..."
|
||||||
|
if pipx install ansible;
|
||||||
|
then
|
||||||
|
info "Ansible installed successfully with pipx."
|
||||||
|
info "Please ensure '${HOME}/.local/bin' is in your PATH."
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
error "Failed to install 'ansible' or 'pipx' via apt. Aborting."
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
elif command -v dnf >/dev/null 2>&1; then
|
||||||
|
info "Detected Red Hat-based system (dnf)."
|
||||||
|
info "Attempting to install 'ansible-core' package..."
|
||||||
|
if ! sudo dnf install -y ansible-core;
|
||||||
|
then
|
||||||
|
error "Failed to install ansible-core via dnf. Aborting."
|
||||||
|
fi
|
||||||
|
elif command -v pacman >/dev/null 2>&1; then
|
||||||
|
info "Detected Arch-based system (pacman)."
|
||||||
|
info "Attempting to install 'ansible' package..."
|
||||||
|
if ! sudo pacman -Syu --noconfirm ansible;
|
||||||
|
then
|
||||||
|
error "Failed to install ansible via pacman. Aborting."
|
||||||
|
fi
|
||||||
|
elif command -v brew >/dev/null 2>&1; then
|
||||||
|
info "Detected macOS (brew)."
|
||||||
|
info "Attempting to install 'ansible' package..."
|
||||||
|
if ! brew install ansible;
|
||||||
|
then
|
||||||
|
error "Failed to install ansible via brew. Aborting."
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
error "Could not detect a known package manager (apt, dnf, pacman, brew). Aborting."
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 4. Final verification
|
||||||
|
info "--- Verifying final installation ---"
|
||||||
|
if command -v ansible >/dev/null 2>&1; then
|
||||||
|
info "Ansible successfully installed at $(command -v ansible)."
|
||||||
|
exit 0
|
||||||
|
else
|
||||||
|
error "Installation attempted but the 'ansible' command is still not available. Please check the output for errors."
|
||||||
|
fi
|
||||||
92
bin/install_package.sh
Normal file
92
bin/install_package.sh
Normal file
@@ -0,0 +1,92 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# Attempt to install packages regardless of OS
|
||||||
|
|
||||||
|
set -ue
|
||||||
|
|
||||||
|
is_sourced() {
|
||||||
|
if [ -n "${ZSH_VERSION:-}" ]; then
|
||||||
|
case $ZSH_EVAL_CONTEXT in *:file:*) return 0;; esac
|
||||||
|
else # Add additional POSIX-compatible shell names here, if needed.
|
||||||
|
case ${0##*/} in dash|-dash|bash|-bash|ksh|-ksh|sh|-sh) return 0;; esac
|
||||||
|
fi
|
||||||
|
return 1 # NOT sourced.
|
||||||
|
}
|
||||||
|
|
||||||
|
# Format is <apt name>:<manager>:<alternate name>
|
||||||
|
# Use "-" for alternate name if not available
|
||||||
|
PACKAGE_ALIASES=$(cat <<'EOF'
|
||||||
|
binfmt-support:brew:-
|
||||||
|
cryptsetup:brew:-
|
||||||
|
lvm2:brew:-
|
||||||
|
EOF
|
||||||
|
)
|
||||||
|
|
||||||
|
package_alias() {
|
||||||
|
local manager="$1"
|
||||||
|
local package="$2"
|
||||||
|
local alias=$(echo "$PACKAGE_ALIASES" | \
|
||||||
|
awk -F: -v manager="${manager}" -v package="${package}" \
|
||||||
|
'$1 == package && $2 == manager { print $3 }' 2>/dev/null)
|
||||||
|
echo "${alias:-${package}}"
|
||||||
|
}
|
||||||
|
|
||||||
|
install_package() {
|
||||||
|
local package="$1"
|
||||||
|
|
||||||
|
# Check for apt-get
|
||||||
|
if command -v apt-get &> /dev/null; then
|
||||||
|
package=$(package_alias apt "${package}")
|
||||||
|
if [ "$package" == "-" ] ; then
|
||||||
|
echo "Package not available on this platform"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
echo "Installing '$package' using apt-get..."
|
||||||
|
sudo apt-get install -y -- "$package"
|
||||||
|
return 0
|
||||||
|
elif command -v yum &> /dev/null; then
|
||||||
|
package=$(package_alias yum "${package}")
|
||||||
|
if [ "$package" == "-" ] ; then
|
||||||
|
echo "Package not available on this platform"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
echo "Installing '$package' using yum..."
|
||||||
|
sudo yum install -y -- "$package"
|
||||||
|
return 0
|
||||||
|
elif command -v pacman &> /dev/null; then
|
||||||
|
package=$(package_alias pacman "${package}")
|
||||||
|
if [ "$package" == "-" ] ; then
|
||||||
|
echo "Package not available on this platform"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
echo "Installing '$package' using pacman..."
|
||||||
|
sudo pacman -S -- "$package"
|
||||||
|
return 0
|
||||||
|
# For macOS, assume Homebrew is installed
|
||||||
|
elif command -v brew &> /dev/null; then
|
||||||
|
package=$(package_alias brew "${package}")
|
||||||
|
if [ "$package" == "-" ] ; then
|
||||||
|
echo "Package not available on this platform"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
echo "Installing '$package' using Homebrew..."
|
||||||
|
brew install -- "$package"
|
||||||
|
return 0
|
||||||
|
else
|
||||||
|
echo "Error: No suitable package manager found."
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
is_sourced || {
|
||||||
|
# Get the package name from the command line argument
|
||||||
|
if [ $# -eq 0 ]; then
|
||||||
|
echo "Usage: $0 <package_name>"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
package_name="$1"
|
||||||
|
|
||||||
|
# Call the install function
|
||||||
|
install_package "$package_name"
|
||||||
|
}
|
||||||
524
bin/install_tool
524
bin/install_tool
@@ -2,10 +2,16 @@
|
|||||||
|
|
||||||
set -ue
|
set -ue
|
||||||
|
|
||||||
|
TMPDIR=$(mktemp -d)
|
||||||
|
trap 'rm -rf -- "${TMPDIR}"' EXIT
|
||||||
|
|
||||||
REINSTALL=0
|
REINSTALL=0
|
||||||
PACKAGES=1
|
PACKAGES=1
|
||||||
|
|
||||||
|
export GO111MODULE=on
|
||||||
|
|
||||||
while getopts -- "-:" a ; do
|
while getopts -- "-:" a ; do
|
||||||
|
# shellcheck disable=SC2154
|
||||||
case "${a}" in
|
case "${a}" in
|
||||||
-)
|
-)
|
||||||
case "${OPTARG}" in
|
case "${OPTARG}" in
|
||||||
@@ -20,37 +26,56 @@ while getopts -- "-:" a ; do
|
|||||||
exit 1
|
exit 1
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
echo "Unknown short option ${OPTARG}" >/dev/stderr
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
esac
|
esac
|
||||||
done
|
done
|
||||||
|
|
||||||
shift $(($OPTIND-1))
|
shift $((OPTIND-1))
|
||||||
|
|
||||||
|
function list_tools {
|
||||||
|
echo "Options:" >/dev/stderr
|
||||||
|
awk 'BEGIN {s=0;FS=")"};/main tool selection/{s=1};/^\s+\w+)$/{if(s==1){print $1}}' "$0" | sort | while read -r opt; do
|
||||||
|
echo -e "\\t${opt}" >/dev/stderr
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
if [ $# -ne 1 ] ; then
|
if [ $# -ne 1 ] ; then
|
||||||
echo "Usage: ${0} <tool>" >/dev/stderr
|
echo "Usage: ${0} <tool>" >/dev/stderr
|
||||||
|
list_tools
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
TOOL=${1}
|
TOOL=${1}
|
||||||
|
|
||||||
|
function die {
|
||||||
|
echo "$@" >/dev/stderr
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
|
||||||
function install_pkgs {
|
function install_pkgs {
|
||||||
if [ ${PACKAGES} -eq 0 ] ; then
|
if [ ${PACKAGES} -eq 0 ] ; then
|
||||||
return 0
|
return 0
|
||||||
fi
|
fi
|
||||||
if [ `id -u` -ne "0" ] ; then
|
# TODO: check if packages are already installed
|
||||||
sudo apt-get -y install $* || (
|
if [ "$(id -u)" -ne "0" ] ; then
|
||||||
|
sudo apt-get -y install "$@" || (
|
||||||
echo -n "Unable to install packages, please ensure these " >/dev/stderr
|
echo -n "Unable to install packages, please ensure these " >/dev/stderr
|
||||||
echo "are installed, then run with --no-packages." >/dev/stderr
|
echo "are installed, then run with --no-packages." >/dev/stderr
|
||||||
echo $*
|
echo "$@"
|
||||||
false )
|
false )
|
||||||
return 0
|
return 0
|
||||||
fi
|
fi
|
||||||
apt-get -y install $*
|
apt-get -y install "$@"
|
||||||
}
|
}
|
||||||
|
|
||||||
function download {
|
function download {
|
||||||
SRC=${1}
|
SRC=${1}
|
||||||
DST=${2}
|
DST=${2}
|
||||||
echo -n "Downloading ${SRC} to ${DST}..." >&2
|
echo -n "Downloading ${SRC} to ${DST}..." >&2
|
||||||
wget --no-server-response -q -O ${DST} --content-disposition ${SRC}
|
curl -fL -o "${DST}" "${SRC}"
|
||||||
echo " done." >&2
|
echo " done." >&2
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -58,126 +83,481 @@ function check_sudo {
|
|||||||
sudo -l >/dev/null
|
sudo -l >/dev/null
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function add_bin_symlink {
|
||||||
|
local TARGET NAME BINDIR
|
||||||
|
TARGET="${1}"
|
||||||
|
NAME="${2:-$(basename "${1}")}"
|
||||||
|
BINDIR="${HOME}/bin/tools/"
|
||||||
|
mkdir -p -- "${BINDIR}"
|
||||||
|
ln -sf "${DESTDIR}/${TARGET}" "${BINDIR}/${NAME}"
|
||||||
|
}
|
||||||
|
|
||||||
|
mkdir -p "${HOME}/tools"
|
||||||
|
|
||||||
DESTDIR="${HOME}/tools/${TOOL}"
|
DESTDIR="${HOME}/tools/${TOOL}"
|
||||||
|
|
||||||
if [ -d ${DESTDIR} ] ; then
|
function makedest {
|
||||||
if [ ${REINSTALL} -eq 1 ] ; then
|
if [ -d "${DESTDIR}" ] ; then
|
||||||
rm -ri ${DESTDIR}
|
if [ "${REINSTALL}" -eq 1 ] ; then
|
||||||
|
rm -ri "${DESTDIR}"
|
||||||
else
|
else
|
||||||
echo "${DESTDIR} exists but not reinstalling." >/dev/stderr
|
echo "${DESTDIR} exists but not reinstalling." >/dev/stderr
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
mkdir -p "${DESTDIR}"
|
||||||
|
}
|
||||||
|
|
||||||
|
function makedest_or_die {
|
||||||
|
makedest || die "Aborting."
|
||||||
|
}
|
||||||
|
|
||||||
|
function deb_only {
|
||||||
|
# Error if not on a debian or derivative
|
||||||
|
if ! test -f /etc/debian_version ; then
|
||||||
|
echo "This tool only available for debian." >&2
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
fi
|
}
|
||||||
|
|
||||||
|
function get_latest_github_release_url {
|
||||||
|
local repo="$1"
|
||||||
|
local glob="$2"
|
||||||
|
curl -s "https://api.github.com/repos/${repo}/releases/latest" | \
|
||||||
|
jq -r ".assets[] | select(.name|test(\"${glob}\")) | .browser_download_url"
|
||||||
|
}
|
||||||
|
|
||||||
|
function require_pipx {
|
||||||
|
command -v pipx >/dev/null 2>&1 || die "Requires pipx"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Begin main tool selection
|
||||||
case ${TOOL} in
|
case ${TOOL} in
|
||||||
john)
|
john)
|
||||||
|
deb_only
|
||||||
|
makedest_or_die
|
||||||
install_pkgs libssl-dev git build-essential yasm libgmp-dev libpcap-dev \
|
install_pkgs libssl-dev git build-essential yasm libgmp-dev libpcap-dev \
|
||||||
pkg-config libbz2-dev libopenmpi-dev openmpi-bin libnss3-dev \
|
pkg-config libbz2-dev libopenmpi-dev openmpi-bin libnss3-dev \
|
||||||
libkrb5-dev libgmp-dev
|
libkrb5-dev libgmp-dev
|
||||||
jtemp=`mktemp -d`
|
jtemp="${TMPDIR}/john"
|
||||||
git clone https://github.com/magnumripper/JohnTheRipper.git ${jtemp}/john
|
mkdir -p "${jtemp}"
|
||||||
cd ${jtemp}/john/src
|
git clone https://github.com/magnumripper/JohnTheRipper.git "${jtemp}/john"
|
||||||
|
cd "${jtemp}/john/src" || exit
|
||||||
./configure && make -sj2
|
./configure && make -sj2
|
||||||
mkdir -p ${DESTDIR}
|
cp -r "${jtemp}"/john/run/* "${DESTDIR}"
|
||||||
cp -r ${jtemp}/john/run/* ${DESTDIR}
|
|
||||||
rm -rf ${jtemp}
|
|
||||||
# Persistent files
|
# Persistent files
|
||||||
mkdir -p ${HOME}/.john
|
mkdir -p "${HOME}/.john"
|
||||||
touch ${HOME}/.john/john.pot
|
touch "${HOME}/.john/john.pot"
|
||||||
ln -sf ${HOME}/.john/* ${DESTDIR}
|
ln -sf "${HOME}/.john/*" "${DESTDIR}"
|
||||||
|
add_bin_symlink john
|
||||||
;;
|
;;
|
||||||
wordlists)
|
wordlists)
|
||||||
mkdir -p ${DESTDIR}
|
makedest
|
||||||
download \
|
download \
|
||||||
http://downloads.skullsecurity.org/passwords/rockyou.txt.bz2 \
|
"http://downloads.skullsecurity.org/passwords/rockyou.txt.bz2" \
|
||||||
${DESTDIR}/rockyou.txt.bz2
|
"${DESTDIR}/rockyou.txt.bz2"
|
||||||
bunzip2 ${DESTDIR}/rockyou.txt.bz2
|
bunzip2 "${DESTDIR}/rockyou.txt.bz2"
|
||||||
download \
|
download \
|
||||||
http://downloads.skullsecurity.org/passwords/phpbb.txt.bz2 \
|
"http://downloads.skullsecurity.org/passwords/phpbb.txt.bz2" \
|
||||||
${DESTDIR}/phpbb.txt.bz2
|
"${DESTDIR}/phpbb.txt.bz2"
|
||||||
bunzip2 ${DESTDIR}/phpbb.txt.bz2
|
bunzip2 "${DESTDIR}/phpbb.txt.bz2"
|
||||||
download \
|
download \
|
||||||
http://downloads.skullsecurity.org/passwords/hak5.txt.bz2 \
|
"http://downloads.skullsecurity.org/passwords/hak5.txt.bz2" \
|
||||||
${DESTDIR}/hak5.txt.bz2
|
"${DESTDIR}/hak5.txt.bz2"
|
||||||
bunzip2 ${DESTDIR}/hak5.txt.bz2
|
bunzip2 "${DESTDIR}/hak5.txt.bz2"
|
||||||
|
;;
|
||||||
|
seclists)
|
||||||
|
git clone https://github.com/danielmiessler/SecLists.git "${DESTDIR}"
|
||||||
|
;;
|
||||||
|
werdlists)
|
||||||
|
git clone --depth 1 https://github.com/decal/werdlists.git "${DESTDIR}"
|
||||||
;;
|
;;
|
||||||
gcloud)
|
gcloud)
|
||||||
mkdir -p ${DESTDIR}
|
makedest_or_die
|
||||||
gtemp=`mktemp -d`
|
|
||||||
gbase="https://dl.google.com/dl/cloudsdk/channels/rapid/downloads/"
|
gbase="https://dl.google.com/dl/cloudsdk/channels/rapid/downloads/"
|
||||||
# TODO: find a way to make this version independent
|
gsdk=$(curl -s https://cloud.google.com/sdk/docs/install-sdk | grep -o "google-cloud-sdk-[0-9.]*-linux-x86_64.tar.gz" | head -n 1)
|
||||||
gsdk="google-cloud-sdk-142.0.0-linux-x86_64.tar.gz"
|
download "${gbase}${gsdk}" "${TMPDIR}/gcloud.tar.gz"
|
||||||
download "${gbase}${gsdk}" /tmp/gcloud.tar.gz
|
tar zxf "${TMPDIR}/gcloud.tar.gz" --strip-components=1 -C "${DESTDIR}"
|
||||||
tar zxf /tmp/gcloud.tar.gz --strip-components=1 -C ${DESTDIR}
|
add_bin_symlink bin/gcloud
|
||||||
rm /tmp/gcloud.tar.gz
|
|
||||||
;;
|
;;
|
||||||
android-sdk)
|
android-sdk)
|
||||||
# TODO: find a way to make this version independent
|
asdk=$(curl -s https://developer.android.com/studio/releases/platform-tools | grep -o "https://dl.google.com/android/repository/platform-tools_r[0-9.]*-linux.zip" | head -n 1)
|
||||||
asdk="https://dl.google.com/android/repository/tools_r25.2.3-linux.zip"
|
download "${asdk}" "${TMPDIR}/android-tools.zip"
|
||||||
download ${asdk} /tmp/android-tools.zip
|
unzip -d "${DESTDIR}" "${TMPDIR}/android-tools.zip"
|
||||||
unzip -d ${DESTDIR} /tmp/android-tools.zip
|
|
||||||
rm /tmp/android-tools.zip
|
|
||||||
# Install components
|
# Install components
|
||||||
${DESTDIR}/tools/bin/sdkmanager "emulator" "platform-tools"
|
"${DESTDIR}/tools/bin/sdkmanager" "emulator" "platform-tools"
|
||||||
;;
|
;;
|
||||||
burp)
|
burp)
|
||||||
# Install latest burp free
|
# Install latest burp free
|
||||||
mkdir -p ${DESTDIR}
|
makedest
|
||||||
download \
|
if ! download \
|
||||||
https://portswigger.net/DownloadUpdate.ashx\?Product\=Free \
|
https://portswigger.net/DownloadUpdate.ashx\?Product=Free \
|
||||||
${DESTDIR}/burp-free.jar
|
"${DESTDIR}/burp-free.jar" ; then
|
||||||
if [ $? -ne 0 ] ; then
|
|
||||||
echo "Download failed." >&2
|
echo "Download failed." >&2
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
if [ -x /usr/bin/jarwrapper ] ; then
|
if [ -x /usr/bin/jarwrapper ] ; then
|
||||||
# We have binfmt support for jar, so add to bin
|
# We have binfmt support for jar, so add to bin
|
||||||
chmod +x ${DESTDIR}/*.jar
|
chmod +x "${DESTDIR}"/*.jar
|
||||||
ln -sf ${DESTDIR}/*.jar ${HOME}/bin/burp
|
ln -sf "${DESTDIR}"/*.jar "${HOME}/bin/burp"
|
||||||
fi
|
fi
|
||||||
;;
|
;;
|
||||||
mitmproxy)
|
mitmproxy)
|
||||||
# Find a better way to get the latest
|
makedest_or_die
|
||||||
src="https://github.com/mitmproxy/mitmproxy/releases/download/v2.0.1/mitmproxy-2.0.1-linux.tar.gz"
|
download \
|
||||||
download ${src} /tmp/mitmproxy.tar.gz
|
"$(get_latest_github_release_url "mitmproxy/mitmproxy" ".*-linux\\.tar\\.gz")" \
|
||||||
mkdir -p ${DESTDIR}
|
"${TMPDIR}/mitmproxy.tar.gz"
|
||||||
tar zx -C ${DESTDIR} -f /tmp/mitmproxy.tar.gz
|
tar zx -C "${DESTDIR}" -f "${TMPDIR}/mitmproxy.tar.gz"
|
||||||
rm /tmp/mitmproxy.tar.gz
|
add_bin_symlink mitmproxy
|
||||||
|
add_bin_symlink mitmweb
|
||||||
|
add_bin_symlink mitmdump
|
||||||
;;
|
;;
|
||||||
esp)
|
esp)
|
||||||
|
makedest_or_die
|
||||||
src="https://dl.espressif.com/dl/xtensa-esp32-elf-linux64-1.22.0-61-gab8375a-5.2.0.tar.gz"
|
src="https://dl.espressif.com/dl/xtensa-esp32-elf-linux64-1.22.0-61-gab8375a-5.2.0.tar.gz"
|
||||||
download ${src} /tmp/esp32.tar.gz
|
download "${src}" "${TMPDIR}/esp32.tar.gz"
|
||||||
mkdir -p ${DESTDIR}
|
tar zx -C "${DESTDIR}" -f "${TMPDIR}/esp32.tar.gz"
|
||||||
tar zx -C ${DESTDIR} -f /tmp/esp32.tar.gz
|
git clone --recursive https://github.com/espressif/esp-idf.git "${DESTDIR}/esp-idf"
|
||||||
rm /tmp/esp32.tar.gz
|
|
||||||
git clone --recursive https://github.com/espressif/esp-idf.git ${DESTDIR}/esp-idf
|
|
||||||
;;
|
;;
|
||||||
dex2jar)
|
dex2jar)
|
||||||
src="https://github.com/pxb1988/dex2jar/releases/download/2.0/dex-tools-2.0.zip"
|
makedest_or_die
|
||||||
download ${src} /tmp/dex2jar.zip
|
src="https://github.com/pxb1988/dex2jar/releases/download/v2.4/dex-tools-v2.4.zip"
|
||||||
tmpd=`mktemp -d`
|
download "${src}" "${TMPDIR}/dex2jar.zip"
|
||||||
unzip -d ${tmpd} /tmp/dex2jar.zip
|
tmpd="${TMPDIR}/dex2jar"
|
||||||
mv ${tmpd}/* ${DESTDIR}
|
mkdir -p "${tmpd}"
|
||||||
rm /tmp/dex2jar.zip
|
unzip -d "${tmpd}" "${TMPDIR}/dex2jar.zip"
|
||||||
rm -rf ${tmpd}
|
mv "${tmpd}"/dex-tools-*/* "${DESTDIR}"
|
||||||
rm ${DESTDIR}/*.bat
|
rm "${DESTDIR}"/*.bat
|
||||||
chmod +x ${DESTDIR}/*.sh
|
chmod +x "${DESTDIR}"/*.sh
|
||||||
;;
|
;;
|
||||||
proxmark3)
|
proxmark3)
|
||||||
|
deb_only
|
||||||
install_pkgs p7zip git build-essential libreadline5 libreadline-dev \
|
install_pkgs p7zip git build-essential libreadline5 libreadline-dev \
|
||||||
libusb-0.1-4 libusb-dev libqt4-dev perl pkg-config wget libncurses5-dev \
|
libusb-0.1-4 libusb-dev libqt4-dev perl pkg-config wget libncurses5-dev \
|
||||||
gcc-arm-none-eabi libstdc++-arm-none-eabi-newlib
|
gcc-arm-none-eabi libstdc++-arm-none-eabi-newlib
|
||||||
src="https://github.com/Proxmark/proxmark3.git"
|
src="https://github.com/Proxmark/proxmark3.git"
|
||||||
git clone ${src} ${DESTDIR}
|
git clone "${src}" "${DESTDIR}"
|
||||||
cd ${DESTDIR}
|
cd "${DESTDIR}" || exit
|
||||||
make -sj2
|
make -sj2
|
||||||
check_sudo && sudo /bin/sh -c \
|
check_sudo && sudo /bin/sh -c \
|
||||||
"cp -rf driver/78-mm-usb-device-blacklist.rules \
|
"cp -rf driver/78-mm-usb-device-blacklist.rules \
|
||||||
/etc/udev/rules.d/77-mm-usb-device-blacklist.rules &&
|
/etc/udev/rules.d/77-mm-usb-device-blacklist.rules &&\
|
||||||
udevadm control --reload-rules"
|
udevadm control --reload-rules"
|
||||||
;;
|
;;
|
||||||
|
pm3iceman)
|
||||||
|
deb_only
|
||||||
|
# arch:
|
||||||
|
# sudo pacman -Syu git base-devel readline bzip2 lz4 arm-none-eabi-gcc arm-none-eabi-newlib qt5-base bluez python gd --needed
|
||||||
|
install_pkgs git ca-certificates build-essential pkg-config \
|
||||||
|
libreadline-dev gcc-arm-none-eabi libnewlib-dev qtbase5-dev \
|
||||||
|
libbz2-dev libbluetooth-dev libpython3-dev libssl-dev
|
||||||
|
src="https://github.com/RfidResearchGroup/proxmark3.git"
|
||||||
|
git clone "${src}" "${DESTDIR}"
|
||||||
|
cd "${DESTDIR}" || exit
|
||||||
|
make clean && make -sj2
|
||||||
|
check_sudo && sudo /bin/sh -c \
|
||||||
|
"cp -rf ./driver/77-pm3-usb-device-blacklist.rules \
|
||||||
|
/etc/udev/rules.d/77-pm3-usb-device-blacklist.rules &&\
|
||||||
|
udevadm control --reload-rules"
|
||||||
|
add_bin_symlink pm3
|
||||||
|
;;
|
||||||
|
cyberchef)
|
||||||
|
makedest
|
||||||
|
cd "${DESTDIR}" || exit
|
||||||
|
download \
|
||||||
|
"$(get_latest_github_release_url "gchq/CyberChef" ".*\\.zip")" \
|
||||||
|
"${DESTDIR}/cyberchef.zip"
|
||||||
|
unzip -d "${DESTDIR}" "${DESTDIR}/cyberchef.zip"
|
||||||
|
ln -sf CyberChef*.html "${DESTDIR}/cyberchef.html"
|
||||||
|
;;
|
||||||
|
apktool)
|
||||||
|
makedest_or_die
|
||||||
|
download \
|
||||||
|
https://raw.githubusercontent.com/iBotPeaches/Apktool/master/scripts/linux/apktool \
|
||||||
|
"${DESTDIR}/apktool"
|
||||||
|
jar_url=$(curl -s https://bitbucket.org/iBotPeaches/apktool/downloads/ | grep -o "/iBotPeaches/apktool/downloads/apktool_[0-9.]*.jar" | head -n 1)
|
||||||
|
download \
|
||||||
|
"https://bitbucket.org${jar_url}" \
|
||||||
|
"${DESTDIR}/apktool.jar"
|
||||||
|
chmod +x "${DESTDIR}/apktool"
|
||||||
|
add_bin_symlink apktool
|
||||||
|
;;
|
||||||
|
ptf)
|
||||||
|
makedest_or_die
|
||||||
|
src="https://github.com/trustedsec/ptf.git"
|
||||||
|
git clone "${src}" "${DESTDIR}"
|
||||||
|
;;
|
||||||
|
pwndbg)
|
||||||
|
if ! command -v gdb > /dev/null 2>&1 ; then
|
||||||
|
echo 'No gdb available!' >/dev/stderr
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
git clone --depth 1 -b stable https://github.com/pwndbg/pwndbg.git "${DESTDIR}"
|
||||||
|
PY_PACKAGES=${DESTDIR}/vendor
|
||||||
|
mkdir -p "${PY_PACKAGES}"
|
||||||
|
PYVER=$(gdb -batch -q --nx -ex 'pi import platform; print(".".join(platform.python_version_tuple()[:2]))')
|
||||||
|
PYTHON=$(gdb -batch -q --nx -ex 'pi import sys; print(sys.executable)')
|
||||||
|
PYTHON="${PYTHON}${PYVER}"
|
||||||
|
"${PYTHON}" -m pip install --target "${PY_PACKAGES}" -Ur "${DESTDIR}/requirements.txt"
|
||||||
|
"${PYTHON}" -m pip install --target "${PY_PACKAGES}" -U capstone unicorn
|
||||||
|
# capstone package is broken, find and copy the library manually
|
||||||
|
capstone_so_path=$(find "${PY_PACKAGES}/usr/lib" -name "libcapstone.so" -type f)
|
||||||
|
if [ -z "${capstone_so_path}" ]; then
|
||||||
|
die "Could not find libcapstone.so for pwndbg."
|
||||||
|
elif [ "$(echo "${capstone_so_path}" | wc -l)" -ne 1 ]; then
|
||||||
|
die "Found multiple libcapstone.so files for pwndbg, aborting."
|
||||||
|
fi
|
||||||
|
cp "${capstone_so_path}" "${PY_PACKAGES}/capstone/"
|
||||||
|
;;
|
||||||
|
gef)
|
||||||
|
makedest_or_die
|
||||||
|
if ! command -v gdb > /dev/null 2>&1 ; then
|
||||||
|
echo 'No gdb available!' >/dev/stderr
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
download \
|
||||||
|
https://github.com/hugsy/gef/raw/master/gef.py \
|
||||||
|
"${DESTDIR}/gef.py"
|
||||||
|
;;
|
||||||
|
aflplusplus)
|
||||||
|
deb_only
|
||||||
|
install_pkgs libtool-bin libglib2.0-dev libpixman-1-dev clang clang-tools \
|
||||||
|
llvm python3-setuptools
|
||||||
|
git clone "https://github.com/vanhauser-thc/AFLplusplus" "${DESTDIR}"
|
||||||
|
make -C "${DESTDIR}" distrib
|
||||||
|
;;
|
||||||
|
exploitdb)
|
||||||
|
if test -d "${DESTDIR}" ; then
|
||||||
|
echo "Already installed, updating instead..." >/dev/stderr
|
||||||
|
"${DESTDIR}/searchsploit" -u
|
||||||
|
else
|
||||||
|
git clone --depth 1 \
|
||||||
|
https://github.com/offensive-security/exploitdb.git \
|
||||||
|
"${DESTDIR}"
|
||||||
|
add_bin_symlink searchsploit
|
||||||
|
cp "${DESTDIR}/.searchsploit_rc" "${HOME}/.searchsploit_rc"
|
||||||
|
sed -i "s|/opt/exploitdb|${DESTDIR}|" "${HOME}/.searchsploit_rc"
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
cura)
|
||||||
|
makedest
|
||||||
|
download \
|
||||||
|
"$(get_latest_github_release_url "Ultimaker/Cura" ".*\\.AppImage")" \
|
||||||
|
"${DESTDIR}/Cura.AppImage"
|
||||||
|
chmod +x "${DESTDIR}/Cura.AppImage"
|
||||||
|
add_bin_symlink "Cura.AppImage" cura
|
||||||
|
;;
|
||||||
|
rr)
|
||||||
|
deb_only
|
||||||
|
check_sudo
|
||||||
|
download \
|
||||||
|
"$(get_latest_github_release_url "mozilla/rr" ".*-Linux-.*\\.deb")" \
|
||||||
|
"${TMPDIR}/rr.deb"
|
||||||
|
sudo dpkg -i "${TMPDIR}/rr.deb"
|
||||||
|
;;
|
||||||
|
nmap-parse-output)
|
||||||
|
git clone --depth 1 \
|
||||||
|
https://github.com/ernw/nmap-parse-output.git \
|
||||||
|
"${DESTDIR}"
|
||||||
|
add_bin_symlink nmap-parse-output
|
||||||
|
cat <<EOF >"${HOME}/.zshrc.d/99-nmap-parse-output.zsh"
|
||||||
|
if test -d ${DESTDIR} ; then
|
||||||
|
autoload bashcompinit
|
||||||
|
bashcompinit
|
||||||
|
source ${DESTDIR}/_nmap-parse-output
|
||||||
|
fi
|
||||||
|
EOF
|
||||||
|
;;
|
||||||
|
logiops)
|
||||||
|
deb_only
|
||||||
|
install_pkgs cmake libevdev-dev libudev-dev libconfig++-dev checkinstall
|
||||||
|
git clone "https://github.com/PixlOne/logiops.git" "${DESTDIR}"
|
||||||
|
mkdir -p "${DESTDIR}/build"
|
||||||
|
cd "${DESTDIR}/build" || exit
|
||||||
|
cmake ..
|
||||||
|
make
|
||||||
|
check_sudo
|
||||||
|
sudo checkinstall --pkgname logiops --maintainer "${USER}" -y
|
||||||
|
;;
|
||||||
|
aws)
|
||||||
|
DN="${TMPDIR}/aws"
|
||||||
|
mkdir -p "${DN}"
|
||||||
|
cd "${DN}" || exit
|
||||||
|
curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "${DN}/awscliv2.zip"
|
||||||
|
unzip "${DN}/awscliv2.zip"
|
||||||
|
mv "${DN}/aws/dist" "${DESTDIR}"
|
||||||
|
add_bin_symlink aws
|
||||||
|
;;
|
||||||
|
tmpmail)
|
||||||
|
install_pkgs curl w3m jq
|
||||||
|
mkdir -p "${DESTDIR}"
|
||||||
|
download "https://git.io/tmpmail" "${DESTDIR}/tmpmail"
|
||||||
|
chmod +x "${DESTDIR}/tmpmail"
|
||||||
|
add_bin_symlink tmpmail
|
||||||
|
;;
|
||||||
|
gf)
|
||||||
|
install_pkgs golang-go silversearcher-ag
|
||||||
|
go install github.com/tomnomnom/gf@latest
|
||||||
|
mkdir -p "${HOME}/.config"
|
||||||
|
if test -d "${HOME}/.config/gf" ; then
|
||||||
|
git -C "${HOME}/.config/gf" pull
|
||||||
|
else
|
||||||
|
git clone https://github.com/Matir/gf-patterns.git "${HOME}/.config/gf"
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
gron)
|
||||||
|
go install github.com/tomnomnom/gron@latest
|
||||||
|
;;
|
||||||
|
httprobe)
|
||||||
|
go install github.com/tomnomnom/httprobe@latest
|
||||||
|
;;
|
||||||
|
ffuf)
|
||||||
|
go install github.com/ffuf/ffuf@latest
|
||||||
|
;;
|
||||||
|
gobuster)
|
||||||
|
go install github.com/OJ/gobuster@latest
|
||||||
|
;;
|
||||||
|
amass)
|
||||||
|
go install github.com/OWASP/Amass/v3/...
|
||||||
|
;;
|
||||||
|
cht.sh)
|
||||||
|
install_pkgs rlwrap
|
||||||
|
mkdir -p "${DESTDIR}"
|
||||||
|
download "https://cht.sh/:cht.sh" "${DESTDIR}/cht.sh"
|
||||||
|
chmod +x "${DESTDIR}/cht.sh"
|
||||||
|
add_bin_symlink cht.sh
|
||||||
|
;;
|
||||||
|
age)
|
||||||
|
go install filippo.io/age/cmd/age@latest
|
||||||
|
go install filippo.io/age/cmd/age-keygen@latest
|
||||||
|
;;
|
||||||
|
docker-compose)
|
||||||
|
mkdir -p "${DESTDIR}"
|
||||||
|
latest_version=$(curl -s "https://api.github.com/repos/docker/compose/releases/latest" | jq -r '.tag_name')
|
||||||
|
curl -L \
|
||||||
|
"https://github.com/docker/compose/releases/download/${latest_version}/docker-compose-$(uname -s)-$(uname -m)" \
|
||||||
|
-o "${DESTDIR}/docker-compose"
|
||||||
|
chmod +x "${DESTDIR}/docker-compose"
|
||||||
|
add_bin_symlink docker-compose
|
||||||
|
;;
|
||||||
|
tldr)
|
||||||
|
require_pipx
|
||||||
|
pipx install tldr
|
||||||
|
;;
|
||||||
|
blint)
|
||||||
|
require_pipx
|
||||||
|
pipx install blint
|
||||||
|
;;
|
||||||
|
dust)
|
||||||
|
if ! command -v cargo >/dev/null 2>&1 ; then
|
||||||
|
echo "This needs cargo (for rust)!" >/dev/stderr
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
cargo install du-dust
|
||||||
|
;;
|
||||||
|
bottom)
|
||||||
|
if ! command -v cargo >/dev/null 2>&1 ; then
|
||||||
|
echo "This needs cargo (for rust)!" >/dev/stderr
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
cargo install bottom
|
||||||
|
;;
|
||||||
|
delta)
|
||||||
|
deb_only
|
||||||
|
if ! check_sudo ; then
|
||||||
|
echo "Must be able to run as sudo."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
dpkg_url=$(get_latest_github_release_url "dandavison/delta" ".*_amd64.deb")
|
||||||
|
dpkg_name="${TMPDIR}/delta_amd64.deb"
|
||||||
|
download "${dpkg_url}" "${dpkg_name}"
|
||||||
|
sudo dpkg -i "${dpkg_name}"
|
||||||
|
;;
|
||||||
|
ropper)
|
||||||
|
deb_only
|
||||||
|
install_pkgs python3-z3
|
||||||
|
pip3 install --user pyvex ropper
|
||||||
|
;;
|
||||||
|
kubeconform)
|
||||||
|
go install github.com/yannh/kubeconform/cmd/kubeconform@latest
|
||||||
|
;;
|
||||||
|
kubectx)
|
||||||
|
git clone https://github.com/ahmetb/kubectx.git "${DESTDIR}"
|
||||||
|
add_bin_symlink kubectx
|
||||||
|
add_bin_symlink kubens
|
||||||
|
COMPDIR="${HOME}/.zshrc.completions"
|
||||||
|
mkdir -p "${COMPDIR}"
|
||||||
|
ln -sf "${DESTDIR}/completion/_kubectx.zsh" "${COMPDIR}"
|
||||||
|
ln -sf "${DESTDIR}/completion/_kubens.zsh" "${COMPDIR}"
|
||||||
|
;;
|
||||||
|
starship)
|
||||||
|
mkdir -p "${DESTDIR}"
|
||||||
|
download \
|
||||||
|
"https://github.com/starship/starship/releases/latest/download/starship-$(uname -m)-unknown-linux-musl.tar.gz" \
|
||||||
|
"${TMPDIR}/starship.tar.gz"
|
||||||
|
tar -C "${DESTDIR}" -zxf "${TMPDIR}/starship.tar.gz" starship
|
||||||
|
add_bin_symlink starship
|
||||||
|
;;
|
||||||
|
arduino-cli)
|
||||||
|
mkdir -p "${DESTDIR}"
|
||||||
|
download \
|
||||||
|
"https://downloads.arduino.cc/arduino-cli/arduino-cli_latest_Linux_64bit.tar.gz" \
|
||||||
|
"${TMPDIR}/arduino-cli.tar.gz"
|
||||||
|
tar -C "${DESTDIR}" -zxf "${TMPDIR}/arduino-cli.tar.gz" arduino-cli
|
||||||
|
add_bin_symlink arduino-cli
|
||||||
|
;;
|
||||||
|
ghidra)
|
||||||
|
zip_url=$(get_latest_github_release_url "NationalSecurityAgency/ghidra" ".*\\.zip")
|
||||||
|
download "${zip_url}" "${TMPDIR}/ghidra.zip"
|
||||||
|
unzip -d "${DESTDIR}" "${TMPDIR}/ghidra.zip"
|
||||||
|
mv "${DESTDIR}"/*/* "${DESTDIR}"
|
||||||
|
add_bin_symlink ghidraRun ghidra
|
||||||
|
;;
|
||||||
|
doctl)
|
||||||
|
# TODO: other architectures
|
||||||
|
tar_url=$(get_latest_github_release_url "digitalocean/doctl" ".*linux-amd64\\.tar\\.gz")
|
||||||
|
download "${tar_url}" "${TMPDIR}/doctl.tar.gz"
|
||||||
|
mkdir -p "${DESTDIR}"
|
||||||
|
tar -C "${DESTDIR}" -zxf "${TMPDIR}/doctl.tar.gz" "doctl"
|
||||||
|
add_bin_symlink doctl
|
||||||
|
;;
|
||||||
|
rustup)
|
||||||
|
rustup_init="${TMPDIR}/rustup-init.sh"
|
||||||
|
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs -o "${rustup_init}"
|
||||||
|
sh "${rustup_init}" --no-modify-path -y
|
||||||
|
;;
|
||||||
|
igrep)
|
||||||
|
if ! command -v cargo >/dev/null 2>&1 ; then
|
||||||
|
echo "This needs cargo (for rust)!" >/dev/stderr
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
cargo install igrep
|
||||||
|
;;
|
||||||
|
unblob)
|
||||||
|
require_pipx
|
||||||
|
pipx install unblob
|
||||||
|
;;
|
||||||
|
fq)
|
||||||
|
go install github.com/wader/fq@latest
|
||||||
|
;;
|
||||||
|
mise)
|
||||||
|
if command -v brew >/dev/null 2>&1; then
|
||||||
|
brew install mise
|
||||||
|
else
|
||||||
|
curl -sSL https://mise.jdx.dev/gpg-key.pub | gpg --import
|
||||||
|
INSTALL_FILE_AND_SIG="${TMPDIR}/install.sh.sig"
|
||||||
|
download "https://mise.jdx.dev/install.sh.sig" "${INSTALL_FILE_AND_SIG}"
|
||||||
|
DECRYPTED_SCRIPT="${TMPDIR}/mise_install.sh"
|
||||||
|
if gpg --assert-signer 24853EC9F655CE80B48E6C3A8B81C9D17413A06D --decrypt -o "${DECRYPTED_SCRIPT}" "${INSTALL_FILE_AND_SIG}" >/dev/null 2>&1; then
|
||||||
|
sh "${DECRYPTED_SCRIPT}"
|
||||||
|
else
|
||||||
|
die "gpg verification or decryption failed for mise installer"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
;;
|
||||||
*)
|
*)
|
||||||
echo "Unknown tool: ${TOOL}" >/dev/stderr
|
echo "Unknown tool: ${TOOL}" >/dev/stderr
|
||||||
|
list_tools
|
||||||
exit 1
|
exit 1
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
|
|||||||
546
bin/macos/chromebundles.py
Executable file
546
bin/macos/chromebundles.py
Executable file
@@ -0,0 +1,546 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
|
import argparse
|
||||||
|
import plistlib
|
||||||
|
import shutil
|
||||||
|
import stat
|
||||||
|
import subprocess
|
||||||
|
import sys
|
||||||
|
import tempfile
|
||||||
|
from pathlib import Path
|
||||||
|
|
||||||
|
from PIL import Image, ImageEnhance
|
||||||
|
|
||||||
|
|
||||||
|
DEFAULT_CHROME_APP = Path("/Applications/Google Chrome.app")
|
||||||
|
DEFAULT_APPS_DIR = Path.home() / "Applications" / "Chrome Containers"
|
||||||
|
|
||||||
|
# Edit this list for your containers.
|
||||||
|
CONTAINERS = [
|
||||||
|
# {
|
||||||
|
# "name": "Chrome Work",
|
||||||
|
# "bundle_id": "com.example.chrome.work",
|
||||||
|
# "mode": "persistent",
|
||||||
|
# "profile_dir": str(Path.home() / ".chrome-work"),
|
||||||
|
# "badge_path": str(Path.home() / ".chrome-container-badges" / "briefcase.svg"),
|
||||||
|
# },
|
||||||
|
{
|
||||||
|
"name": "Chrome Family",
|
||||||
|
"bundle_id": "com.example.chrome.family",
|
||||||
|
"mode": "persistent",
|
||||||
|
"profile_dir": str(Path.home() / ".chrome-family"),
|
||||||
|
"badge_path": str(Path.home() / ".chrome-container-badges" / "family.svg"),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Chrome Research",
|
||||||
|
"bundle_id": "com.example.chrome.research",
|
||||||
|
"mode": "persistent",
|
||||||
|
"profile_dir": str(Path.home() / ".chrome-research"),
|
||||||
|
"badge_path": str(Path.home() / ".chrome-container-badges" / "research.svg"),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Chrome Ephemeral",
|
||||||
|
"bundle_id": "com.example.chrome.ephemeral",
|
||||||
|
"mode": "ephemeral",
|
||||||
|
"profile_dir": None,
|
||||||
|
"badge_path": str(Path.home() / ".chrome-container-badges" / "fire.svg"),
|
||||||
|
},
|
||||||
|
]
|
||||||
|
|
||||||
|
DEFAULT_COLOR_FACTOR = 0.55
|
||||||
|
DEFAULT_BRIGHTNESS_FACTOR = 0.94
|
||||||
|
DEFAULT_CONTRAST_FACTOR = 0.97
|
||||||
|
DEFAULT_BADGE_FRACTION = 0.50
|
||||||
|
DEFAULT_PADDING_FRACTION = 0.03
|
||||||
|
DEFAULT_BADGE_OPACITY = 0.96
|
||||||
|
|
||||||
|
|
||||||
|
def run(cmd, check=True, capture_output=False, text=True):
|
||||||
|
return subprocess.run(cmd, check=check, capture_output=capture_output, text=text)
|
||||||
|
|
||||||
|
|
||||||
|
def require_tool(name: str):
|
||||||
|
if shutil.which(name) is None:
|
||||||
|
print(f"Missing required tool: {name}", file=sys.stderr)
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
|
||||||
|
def parse_icon_size(path: Path):
|
||||||
|
name = path.name
|
||||||
|
if not name.endswith(".png") or not name.startswith("icon_"):
|
||||||
|
return (0, 0)
|
||||||
|
|
||||||
|
stem = name[:-4]
|
||||||
|
rest = stem[len("icon_"):]
|
||||||
|
scale = 1
|
||||||
|
if rest.endswith("@2x"):
|
||||||
|
rest = rest[:-3]
|
||||||
|
scale = 2
|
||||||
|
|
||||||
|
try:
|
||||||
|
left, right = rest.split("x", 1)
|
||||||
|
return (int(left) * scale, int(right) * scale)
|
||||||
|
except Exception:
|
||||||
|
return (0, 0)
|
||||||
|
|
||||||
|
|
||||||
|
def find_source_icns(app_path: Path) -> Path:
|
||||||
|
info_plist = app_path / "Contents" / "Info.plist"
|
||||||
|
resources_dir = app_path / "Contents" / "Resources"
|
||||||
|
|
||||||
|
if not info_plist.exists():
|
||||||
|
raise FileNotFoundError(f"Missing Info.plist: {info_plist}")
|
||||||
|
if not resources_dir.exists():
|
||||||
|
raise FileNotFoundError(f"Missing Resources directory: {resources_dir}")
|
||||||
|
|
||||||
|
with info_plist.open("rb") as f:
|
||||||
|
plist = plistlib.load(f)
|
||||||
|
|
||||||
|
icon_name = plist.get("CFBundleIconFile")
|
||||||
|
if icon_name:
|
||||||
|
if not icon_name.endswith(".icns"):
|
||||||
|
icon_name += ".icns"
|
||||||
|
candidate = resources_dir / icon_name
|
||||||
|
if candidate.exists():
|
||||||
|
return candidate
|
||||||
|
|
||||||
|
chrome_named = sorted(resources_dir.glob("*[Cc]hrome*.icns"))
|
||||||
|
if chrome_named:
|
||||||
|
return chrome_named[0]
|
||||||
|
|
||||||
|
any_icns = sorted(resources_dir.glob("*.icns"))
|
||||||
|
if any_icns:
|
||||||
|
return any_icns[0]
|
||||||
|
|
||||||
|
raise FileNotFoundError(f"No .icns file found in {resources_dir}")
|
||||||
|
|
||||||
|
|
||||||
|
def extract_iconset(icns_path: Path, out_iconset: Path):
|
||||||
|
run(["iconutil", "-c", "iconset", str(icns_path), "-o", str(out_iconset)])
|
||||||
|
|
||||||
|
|
||||||
|
def largest_png(iconset_dir: Path) -> Path:
|
||||||
|
pngs = list(iconset_dir.glob("*.png"))
|
||||||
|
if not pngs:
|
||||||
|
raise FileNotFoundError(f"No PNGs found in {iconset_dir}")
|
||||||
|
pngs.sort(key=lambda p: parse_icon_size(p)[0] * parse_icon_size(p)[1], reverse=True)
|
||||||
|
return pngs[0]
|
||||||
|
|
||||||
|
|
||||||
|
def rasterize_svg(svg_path: Path, out_png: Path, size: int = 1024):
|
||||||
|
# Prefer librsvg if installed.
|
||||||
|
if shutil.which("rsvg-convert"):
|
||||||
|
run([
|
||||||
|
"rsvg-convert",
|
||||||
|
"-w", str(size),
|
||||||
|
"-h", str(size),
|
||||||
|
"-o", str(out_png),
|
||||||
|
str(svg_path),
|
||||||
|
])
|
||||||
|
return
|
||||||
|
|
||||||
|
# Fallback to Inkscape CLI if available.
|
||||||
|
if shutil.which("inkscape"):
|
||||||
|
run([
|
||||||
|
"inkscape",
|
||||||
|
str(svg_path),
|
||||||
|
"--export-type=png",
|
||||||
|
f"--export-filename={out_png}",
|
||||||
|
"-w", str(size),
|
||||||
|
"-h", str(size),
|
||||||
|
])
|
||||||
|
return
|
||||||
|
|
||||||
|
raise RuntimeError(
|
||||||
|
f"SVG badge provided but no SVG rasterizer found for {svg_path}. "
|
||||||
|
"Install librsvg (rsvg-convert) or Inkscape."
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def load_badge_image(badge_path: Path, temp_dir: Path) -> Image.Image | None:
|
||||||
|
if not badge_path.exists():
|
||||||
|
print(f"Warning: badge file not found, skipping overlay: {badge_path}")
|
||||||
|
return None
|
||||||
|
|
||||||
|
suffix = badge_path.suffix.lower()
|
||||||
|
|
||||||
|
if suffix == ".png":
|
||||||
|
return Image.open(badge_path).convert("RGBA")
|
||||||
|
|
||||||
|
if suffix == ".svg":
|
||||||
|
rasterized = temp_dir / f"{badge_path.stem}.png"
|
||||||
|
rasterize_svg(badge_path, rasterized, size=1024)
|
||||||
|
return Image.open(rasterized).convert("RGBA")
|
||||||
|
|
||||||
|
raise RuntimeError(
|
||||||
|
f"Unsupported badge format for {badge_path}. "
|
||||||
|
"Supported formats: .png, .svg"
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def compose_icon(
|
||||||
|
base_png: Path,
|
||||||
|
badge_path: str | None,
|
||||||
|
out_master: Path,
|
||||||
|
color_factor: float,
|
||||||
|
brightness_factor: float,
|
||||||
|
contrast_factor: float,
|
||||||
|
badge_fraction: float,
|
||||||
|
padding_fraction: float,
|
||||||
|
badge_opacity: float,
|
||||||
|
temp_dir: Path,
|
||||||
|
):
|
||||||
|
base = Image.open(base_png).convert("RGBA")
|
||||||
|
|
||||||
|
muted = ImageEnhance.Color(base).enhance(color_factor)
|
||||||
|
muted = ImageEnhance.Brightness(muted).enhance(brightness_factor)
|
||||||
|
muted = ImageEnhance.Contrast(muted).enhance(contrast_factor)
|
||||||
|
|
||||||
|
result = muted.copy()
|
||||||
|
|
||||||
|
if badge_path:
|
||||||
|
badge = load_badge_image(Path(badge_path).expanduser(), temp_dir)
|
||||||
|
if badge is not None:
|
||||||
|
w, h = result.size
|
||||||
|
|
||||||
|
max_badge_w = int(w * badge_fraction)
|
||||||
|
max_badge_h = int(h * badge_fraction)
|
||||||
|
pad = max(4, int(w * padding_fraction))
|
||||||
|
|
||||||
|
bw, bh = badge.size
|
||||||
|
scale = min(max_badge_w / bw, max_badge_h / bh)
|
||||||
|
new_size = (max(1, int(bw * scale)), max(1, int(bh * scale)))
|
||||||
|
badge = badge.resize(new_size, Image.LANCZOS)
|
||||||
|
|
||||||
|
if badge_opacity < 1.0:
|
||||||
|
alpha = badge.getchannel("A")
|
||||||
|
alpha = ImageEnhance.Brightness(alpha).enhance(badge_opacity)
|
||||||
|
badge.putalpha(alpha)
|
||||||
|
|
||||||
|
x = w - badge.width - pad
|
||||||
|
y = h - badge.height - pad
|
||||||
|
result.alpha_composite(badge, (x, y))
|
||||||
|
|
||||||
|
result.save(out_master)
|
||||||
|
|
||||||
|
|
||||||
|
def build_iconset_from_master(master_png: Path, out_iconset: Path):
|
||||||
|
out_iconset.mkdir(parents=True, exist_ok=True)
|
||||||
|
img = Image.open(master_png).convert("RGBA")
|
||||||
|
|
||||||
|
sizes = [
|
||||||
|
("icon_16x16.png", 16),
|
||||||
|
("icon_16x16@2x.png", 32),
|
||||||
|
("icon_32x32.png", 32),
|
||||||
|
("icon_32x32@2x.png", 64),
|
||||||
|
("icon_128x128.png", 128),
|
||||||
|
("icon_128x128@2x.png", 256),
|
||||||
|
("icon_256x256.png", 256),
|
||||||
|
("icon_256x256@2x.png", 512),
|
||||||
|
("icon_512x512.png", 512),
|
||||||
|
("icon_512x512@2x.png", 1024),
|
||||||
|
]
|
||||||
|
|
||||||
|
for filename, size in sizes:
|
||||||
|
resized = img.resize((size, size), Image.LANCZOS)
|
||||||
|
resized.save(out_iconset / filename)
|
||||||
|
|
||||||
|
|
||||||
|
def iconset_to_icns(iconset_dir: Path, out_icns: Path):
|
||||||
|
run(["iconutil", "-c", "icns", str(iconset_dir), "-o", str(out_icns)])
|
||||||
|
|
||||||
|
|
||||||
|
def make_launch_script(chrome_bin: Path, mode: str, profile_dir: str | None) -> str:
|
||||||
|
chrome_bin_escaped = str(chrome_bin).replace("\\", "\\\\").replace('"', '\\"')
|
||||||
|
|
||||||
|
if mode == "persistent":
|
||||||
|
if not profile_dir:
|
||||||
|
raise ValueError("Persistent container requires profile_dir")
|
||||||
|
profile_dir_escaped = profile_dir.replace("\\", "\\\\").replace('"', '\\"')
|
||||||
|
return f"""#!/bin/bash
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
|
CHROME_BIN="{chrome_bin_escaped}"
|
||||||
|
PROFILE_DIR="{profile_dir_escaped}"
|
||||||
|
|
||||||
|
mkdir -p "$PROFILE_DIR"
|
||||||
|
|
||||||
|
exec "$CHROME_BIN" \\
|
||||||
|
--user-data-dir="$PROFILE_DIR" \\
|
||||||
|
--no-first-run \\
|
||||||
|
--no-default-browser-check \\
|
||||||
|
--new-window
|
||||||
|
"""
|
||||||
|
elif mode == "ephemeral":
|
||||||
|
return f"""#!/bin/bash
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
|
CHROME_BIN="{chrome_bin_escaped}"
|
||||||
|
PROFILE_DIR="$(mktemp -d /tmp/chrome-ephemeral-XXXXXX)"
|
||||||
|
|
||||||
|
cleanup() {{
|
||||||
|
rm -rf "$PROFILE_DIR"
|
||||||
|
}}
|
||||||
|
trap cleanup EXIT INT TERM
|
||||||
|
|
||||||
|
exec "$CHROME_BIN" \\
|
||||||
|
--user-data-dir="$PROFILE_DIR" \\
|
||||||
|
--no-first-run \\
|
||||||
|
--no-default-browser-check \\
|
||||||
|
--new-window
|
||||||
|
"""
|
||||||
|
else:
|
||||||
|
raise ValueError(f"Unknown mode: {mode}")
|
||||||
|
|
||||||
|
|
||||||
|
def write_plist(app_name: str, bundle_id: str, plist_path: Path):
|
||||||
|
plist = {
|
||||||
|
"CFBundleDisplayName": app_name,
|
||||||
|
"CFBundleExecutable": "launch",
|
||||||
|
"CFBundleIdentifier": bundle_id,
|
||||||
|
"CFBundleName": app_name,
|
||||||
|
"CFBundlePackageType": "APPL",
|
||||||
|
"CFBundleShortVersionString": "1.0",
|
||||||
|
"CFBundleVersion": "1",
|
||||||
|
"LSMinimumSystemVersion": "12.0",
|
||||||
|
"NSHighResolutionCapable": True,
|
||||||
|
"CFBundleIconFile": "applet",
|
||||||
|
}
|
||||||
|
with plist_path.open("wb") as f:
|
||||||
|
plistlib.dump(plist, f)
|
||||||
|
|
||||||
|
|
||||||
|
def codesign_app(app_dir: Path):
|
||||||
|
try:
|
||||||
|
run(["/usr/bin/codesign", "--force", "--deep", "--sign", "-", str(app_dir)])
|
||||||
|
except subprocess.CalledProcessError as e:
|
||||||
|
print(f"Warning: codesign failed for {app_dir}: {e}")
|
||||||
|
|
||||||
|
|
||||||
|
def sanitize_container(container: dict) -> dict:
|
||||||
|
required = ["name", "bundle_id", "mode"]
|
||||||
|
for key in required:
|
||||||
|
if key not in container or not container[key]:
|
||||||
|
raise ValueError(f"Container missing required key: {key}")
|
||||||
|
|
||||||
|
mode = container["mode"]
|
||||||
|
if mode not in {"persistent", "ephemeral"}:
|
||||||
|
raise ValueError(f"Invalid mode for {container['name']}: {mode}")
|
||||||
|
|
||||||
|
if mode == "persistent" and not container.get("profile_dir"):
|
||||||
|
raise ValueError(f"Persistent container missing profile_dir: {container['name']}")
|
||||||
|
|
||||||
|
return container
|
||||||
|
|
||||||
|
|
||||||
|
def container_matches_filter(name: str, only_names: set[str]) -> bool:
|
||||||
|
if not only_names:
|
||||||
|
return True
|
||||||
|
return name in only_names
|
||||||
|
|
||||||
|
|
||||||
|
def build_icon_for_app(
|
||||||
|
source_icns: Path,
|
||||||
|
badge_path: str | None,
|
||||||
|
out_icns: Path,
|
||||||
|
color_factor: float,
|
||||||
|
brightness_factor: float,
|
||||||
|
contrast_factor: float,
|
||||||
|
badge_fraction: float,
|
||||||
|
padding_fraction: float,
|
||||||
|
badge_opacity: float,
|
||||||
|
):
|
||||||
|
with tempfile.TemporaryDirectory() as tmp:
|
||||||
|
tmpdir = Path(tmp)
|
||||||
|
base_iconset = tmpdir / "base.iconset"
|
||||||
|
new_iconset = tmpdir / "new.iconset"
|
||||||
|
master_png = tmpdir / "master.png"
|
||||||
|
|
||||||
|
extract_iconset(source_icns, base_iconset)
|
||||||
|
base_png = largest_png(base_iconset)
|
||||||
|
size = parse_icon_size(base_png)
|
||||||
|
print(f" Base icon source: {base_png.name} ({size[0]}x{size[1]})")
|
||||||
|
|
||||||
|
compose_icon(
|
||||||
|
base_png=base_png,
|
||||||
|
badge_path=badge_path,
|
||||||
|
out_master=master_png,
|
||||||
|
color_factor=color_factor,
|
||||||
|
brightness_factor=brightness_factor,
|
||||||
|
contrast_factor=contrast_factor,
|
||||||
|
badge_fraction=badge_fraction,
|
||||||
|
padding_fraction=padding_fraction,
|
||||||
|
badge_opacity=badge_opacity,
|
||||||
|
temp_dir=tmpdir,
|
||||||
|
)
|
||||||
|
build_iconset_from_master(master_png, new_iconset)
|
||||||
|
iconset_to_icns(new_iconset, out_icns)
|
||||||
|
|
||||||
|
|
||||||
|
def create_or_update_container(
|
||||||
|
container: dict,
|
||||||
|
apps_dir: Path,
|
||||||
|
chrome_bin: Path,
|
||||||
|
source_icns: Path,
|
||||||
|
force: bool,
|
||||||
|
update_icons_only: bool,
|
||||||
|
codesign: bool,
|
||||||
|
color_factor: float,
|
||||||
|
brightness_factor: float,
|
||||||
|
contrast_factor: float,
|
||||||
|
badge_fraction: float,
|
||||||
|
padding_fraction: float,
|
||||||
|
badge_opacity: float,
|
||||||
|
):
|
||||||
|
app_name = container["name"]
|
||||||
|
bundle_id = container["bundle_id"]
|
||||||
|
mode = container["mode"]
|
||||||
|
profile_dir = container.get("profile_dir")
|
||||||
|
badge_path = container.get("badge_path")
|
||||||
|
|
||||||
|
app_dir = apps_dir / f"{app_name}.app"
|
||||||
|
contents_dir = app_dir / "Contents"
|
||||||
|
macos_dir = contents_dir / "MacOS"
|
||||||
|
resources_dir = contents_dir / "Resources"
|
||||||
|
out_icns = resources_dir / "applet.icns"
|
||||||
|
|
||||||
|
exists = app_dir.exists()
|
||||||
|
|
||||||
|
if update_icons_only:
|
||||||
|
if not exists:
|
||||||
|
print(f"Skipping missing app for icon update: {app_dir}")
|
||||||
|
return
|
||||||
|
print(f"Updating icon only for {app_name}...")
|
||||||
|
resources_dir.mkdir(parents=True, exist_ok=True)
|
||||||
|
build_icon_for_app(
|
||||||
|
source_icns,
|
||||||
|
badge_path,
|
||||||
|
out_icns,
|
||||||
|
color_factor,
|
||||||
|
brightness_factor,
|
||||||
|
contrast_factor,
|
||||||
|
badge_fraction,
|
||||||
|
padding_fraction,
|
||||||
|
badge_opacity,
|
||||||
|
)
|
||||||
|
if codesign:
|
||||||
|
codesign_app(app_dir)
|
||||||
|
print(f" Updated icon: {out_icns}")
|
||||||
|
return
|
||||||
|
|
||||||
|
if exists and not force:
|
||||||
|
print(f"Skipping existing app: {app_dir}")
|
||||||
|
return
|
||||||
|
|
||||||
|
if exists and force:
|
||||||
|
print(f"Recreating existing app: {app_dir}")
|
||||||
|
shutil.rmtree(app_dir)
|
||||||
|
else:
|
||||||
|
print(f"Creating {app_name}...")
|
||||||
|
|
||||||
|
macos_dir.mkdir(parents=True, exist_ok=True)
|
||||||
|
resources_dir.mkdir(parents=True, exist_ok=True)
|
||||||
|
|
||||||
|
write_plist(app_name, bundle_id, contents_dir / "Info.plist")
|
||||||
|
|
||||||
|
launch_script = make_launch_script(chrome_bin, mode, profile_dir)
|
||||||
|
launch_path = macos_dir / "launch"
|
||||||
|
launch_path.write_text(launch_script, encoding="utf-8")
|
||||||
|
launch_path.chmod(launch_path.stat().st_mode | stat.S_IXUSR | stat.S_IXGRP | stat.S_IXOTH)
|
||||||
|
|
||||||
|
if mode == "persistent":
|
||||||
|
Path(profile_dir).expanduser().mkdir(parents=True, exist_ok=True)
|
||||||
|
|
||||||
|
build_icon_for_app(
|
||||||
|
source_icns,
|
||||||
|
badge_path,
|
||||||
|
out_icns,
|
||||||
|
color_factor,
|
||||||
|
brightness_factor,
|
||||||
|
contrast_factor,
|
||||||
|
badge_fraction,
|
||||||
|
padding_fraction,
|
||||||
|
badge_opacity,
|
||||||
|
)
|
||||||
|
|
||||||
|
if codesign:
|
||||||
|
codesign_app(app_dir)
|
||||||
|
|
||||||
|
print(f" Created: {app_dir}")
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
parser = argparse.ArgumentParser(description="Create and manage Chrome container wrapper apps on macOS.")
|
||||||
|
parser.add_argument("--chrome-app", default=str(DEFAULT_CHROME_APP), help="Path to Chrome app bundle")
|
||||||
|
parser.add_argument("--apps-dir", default=str(DEFAULT_APPS_DIR), help="Directory for generated wrapper apps")
|
||||||
|
parser.add_argument("--force", action="store_true", help="Recreate containers even if they already exist")
|
||||||
|
parser.add_argument("--update-icons-only", action="store_true", help="Only rebuild icons for existing containers")
|
||||||
|
parser.add_argument("--no-codesign", action="store_true", help="Skip ad-hoc codesigning")
|
||||||
|
parser.add_argument(
|
||||||
|
"--only",
|
||||||
|
action="append",
|
||||||
|
default=[],
|
||||||
|
help="Limit to specific container name; can be passed multiple times",
|
||||||
|
)
|
||||||
|
parser.add_argument("--color-factor", type=float, default=DEFAULT_COLOR_FACTOR)
|
||||||
|
parser.add_argument("--brightness-factor", type=float, default=DEFAULT_BRIGHTNESS_FACTOR)
|
||||||
|
parser.add_argument("--contrast-factor", type=float, default=DEFAULT_CONTRAST_FACTOR)
|
||||||
|
parser.add_argument("--badge-fraction", type=float, default=DEFAULT_BADGE_FRACTION)
|
||||||
|
parser.add_argument("--padding-fraction", type=float, default=DEFAULT_PADDING_FRACTION)
|
||||||
|
parser.add_argument("--badge-opacity", type=float, default=DEFAULT_BADGE_OPACITY)
|
||||||
|
args = parser.parse_args()
|
||||||
|
|
||||||
|
require_tool("iconutil")
|
||||||
|
|
||||||
|
chrome_app = Path(args.chrome_app).expanduser().resolve()
|
||||||
|
apps_dir = Path(args.apps_dir).expanduser().resolve()
|
||||||
|
chrome_bin = chrome_app / "Contents" / "MacOS" / "Google Chrome"
|
||||||
|
|
||||||
|
if not chrome_bin.exists():
|
||||||
|
print(f"Chrome binary not found: {chrome_bin}", file=sys.stderr)
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
try:
|
||||||
|
import PIL # noqa: F401
|
||||||
|
except ImportError:
|
||||||
|
print("Pillow is required. Install it with:", file=sys.stderr)
|
||||||
|
print(" python3 -m pip install --user pillow", file=sys.stderr)
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
source_icns = find_source_icns(chrome_app)
|
||||||
|
apps_dir.mkdir(parents=True, exist_ok=True)
|
||||||
|
only_names = set(args.only)
|
||||||
|
|
||||||
|
print(f"Using Python: {sys.executable}")
|
||||||
|
print(f"Using Chrome app: {chrome_app}")
|
||||||
|
print(f"Using source icon: {source_icns}")
|
||||||
|
print(f"Apps directory: {apps_dir}")
|
||||||
|
print()
|
||||||
|
|
||||||
|
for raw_container in CONTAINERS:
|
||||||
|
container = sanitize_container(raw_container)
|
||||||
|
if not container_matches_filter(container["name"], only_names):
|
||||||
|
continue
|
||||||
|
|
||||||
|
create_or_update_container(
|
||||||
|
container=container,
|
||||||
|
apps_dir=apps_dir,
|
||||||
|
chrome_bin=chrome_bin,
|
||||||
|
source_icns=source_icns,
|
||||||
|
force=args.force,
|
||||||
|
update_icons_only=args.update_icons_only,
|
||||||
|
codesign=not args.no_codesign,
|
||||||
|
color_factor=args.color_factor,
|
||||||
|
brightness_factor=args.brightness_factor,
|
||||||
|
contrast_factor=args.contrast_factor,
|
||||||
|
badge_fraction=args.badge_fraction,
|
||||||
|
padding_fraction=args.padding_fraction,
|
||||||
|
badge_opacity=args.badge_opacity,
|
||||||
|
)
|
||||||
|
print()
|
||||||
|
|
||||||
|
print("Done.")
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
||||||
156
bin/macos/update_brewfile
Executable file
156
bin/macos/update_brewfile
Executable file
@@ -0,0 +1,156 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
|
import os
|
||||||
|
import subprocess
|
||||||
|
import re
|
||||||
|
import sys
|
||||||
|
import argparse
|
||||||
|
import difflib
|
||||||
|
|
||||||
|
# Regex to match brew/cask/tap/mas lines
|
||||||
|
PKG_RE = re.compile(r'^\s*(brew|cask|tap|mas)\s+["\']([^"\']+)["\'](.*)$')
|
||||||
|
|
||||||
|
def get_repo_root():
|
||||||
|
try:
|
||||||
|
root = subprocess.check_output(['git', 'rev-parse', '--show-toplevel'],
|
||||||
|
stderr=subprocess.STDOUT).decode().strip()
|
||||||
|
return root
|
||||||
|
except subprocess.CalledProcessError:
|
||||||
|
return os.getcwd()
|
||||||
|
|
||||||
|
def get_ignore_list(repo_root):
|
||||||
|
ignore = set()
|
||||||
|
paths = [
|
||||||
|
os.path.join(repo_root, '.Brewfile.ignore'),
|
||||||
|
os.path.expanduser('~/.Brewfile.ignore'),
|
||||||
|
os.path.expanduser('~/.config/homebrew/ignore')
|
||||||
|
]
|
||||||
|
for path in paths:
|
||||||
|
if os.path.exists(path):
|
||||||
|
with open(path) as f:
|
||||||
|
for line in f:
|
||||||
|
line = line.split('#')[0].strip()
|
||||||
|
if line:
|
||||||
|
ignore.add(line)
|
||||||
|
return ignore
|
||||||
|
|
||||||
|
def get_current_packages():
|
||||||
|
"""Runs brew bundle dump and returns lines."""
|
||||||
|
try:
|
||||||
|
output = subprocess.check_output(['brew', 'bundle', 'dump', '--file=-'],
|
||||||
|
stderr=subprocess.DEVNULL).decode()
|
||||||
|
return output.splitlines()
|
||||||
|
except subprocess.CalledProcessError:
|
||||||
|
print("Error: 'brew bundle dump' failed. Is homebrew installed?", file=sys.stderr)
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
def parse_brewfile(content):
|
||||||
|
"""
|
||||||
|
Parses Brewfile content.
|
||||||
|
Returns:
|
||||||
|
- conditional_pkgs: set of (type, name)
|
||||||
|
- preserved_footer: string (everything from first conditional onwards)
|
||||||
|
"""
|
||||||
|
lines = content.splitlines()
|
||||||
|
conditional_pkgs = set()
|
||||||
|
|
||||||
|
# Find the start of the first conditional block
|
||||||
|
first_conditional_idx = -1
|
||||||
|
in_conditional = 0
|
||||||
|
|
||||||
|
for i, line in enumerate(lines):
|
||||||
|
stripped = line.strip()
|
||||||
|
if stripped.startswith(('if ', 'unless ', 'case ')) and not stripped.endswith('; end'):
|
||||||
|
if first_conditional_idx == -1:
|
||||||
|
# Look back for comments that might belong to this block
|
||||||
|
j = i - 1
|
||||||
|
while j >= 0 and (lines[j].strip().startswith('#') or not lines[j].strip()):
|
||||||
|
j -= 1
|
||||||
|
first_conditional_idx = j + 1
|
||||||
|
in_conditional += 1
|
||||||
|
|
||||||
|
if in_conditional > 0:
|
||||||
|
match = PKG_RE.match(line)
|
||||||
|
if match:
|
||||||
|
conditional_pkgs.add((match.group(1), match.group(2)))
|
||||||
|
|
||||||
|
if stripped == 'end' or stripped.endswith('; end'):
|
||||||
|
in_conditional -= 1
|
||||||
|
|
||||||
|
if first_conditional_idx == -1:
|
||||||
|
return set(), ""
|
||||||
|
|
||||||
|
footer = "\n".join(lines[first_conditional_idx:])
|
||||||
|
return conditional_pkgs, footer
|
||||||
|
|
||||||
|
def main(args):
|
||||||
|
repo_root = get_repo_root()
|
||||||
|
brewfile_path = os.path.join(repo_root, 'Brewfile')
|
||||||
|
|
||||||
|
if not os.path.exists(brewfile_path):
|
||||||
|
print(f"Error: Brewfile not found at {brewfile_path}", file=sys.stderr)
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
with open(brewfile_path) as f:
|
||||||
|
old_content = f.read()
|
||||||
|
|
||||||
|
conditional_pkgs, footer = parse_brewfile(old_content)
|
||||||
|
ignore_list = get_ignore_list(repo_root)
|
||||||
|
|
||||||
|
dumped_lines = get_current_packages()
|
||||||
|
|
||||||
|
new_unconditional_lines = []
|
||||||
|
|
||||||
|
for line in dumped_lines:
|
||||||
|
match = PKG_RE.match(line)
|
||||||
|
if match:
|
||||||
|
pkg_type, pkg_name = match.group(1), match.group(2)
|
||||||
|
if pkg_name in ignore_list:
|
||||||
|
continue
|
||||||
|
if (pkg_type, pkg_name) in conditional_pkgs:
|
||||||
|
continue
|
||||||
|
|
||||||
|
# If it's not a package line (e.g. comment from dump), we can skip or keep
|
||||||
|
if line.strip():
|
||||||
|
new_unconditional_lines.append(line)
|
||||||
|
|
||||||
|
# Sort lines by type (tap, brew, cask, mas) then name
|
||||||
|
def sort_key(line):
|
||||||
|
match = PKG_RE.match(line)
|
||||||
|
if not match: return (4, line)
|
||||||
|
order = {'tap': 0, 'brew': 1, 'cask': 2, 'mas': 3}
|
||||||
|
return (order.get(match.group(1), 4), match.group(2))
|
||||||
|
|
||||||
|
new_unconditional_lines.sort(key=sort_key)
|
||||||
|
|
||||||
|
# Build new content
|
||||||
|
new_content = "\n".join(new_unconditional_lines)
|
||||||
|
if footer:
|
||||||
|
if new_unconditional_lines:
|
||||||
|
new_content += "\n\n"
|
||||||
|
new_content += footer.strip() + "\n"
|
||||||
|
else:
|
||||||
|
new_content += "\n"
|
||||||
|
|
||||||
|
if new_content == old_content:
|
||||||
|
print("Brewfile is already up to date.")
|
||||||
|
else:
|
||||||
|
if args.dry_run:
|
||||||
|
print("Changes detected (dry run):")
|
||||||
|
diff = difflib.unified_diff(
|
||||||
|
old_content.splitlines(keepends=True),
|
||||||
|
new_content.splitlines(keepends=True),
|
||||||
|
fromfile='Brewfile (original)',
|
||||||
|
tofile='Brewfile (new)'
|
||||||
|
)
|
||||||
|
sys.stdout.writelines(diff)
|
||||||
|
else:
|
||||||
|
with open(brewfile_path, 'w') as f:
|
||||||
|
f.write(new_content)
|
||||||
|
print("Brewfile updated.")
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
parser = argparse.ArgumentParser(description="Update Brewfile while preserving conditionals.")
|
||||||
|
parser.add_argument("--dry-run", action="store_true", help="Show changes without applying them.")
|
||||||
|
args = parser.parse_args()
|
||||||
|
main(args)
|
||||||
@@ -1,33 +1,13 @@
|
|||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
|
|
||||||
export NAME=$(basename "$0")
|
export NAME=$(basename "$0")
|
||||||
export BASE="/opt/metasploit" # TODO: search this path
|
export BASE="/opt/metasploit-framework" # TODO: search this path
|
||||||
|
unset GEM_PATH
|
||||||
|
|
||||||
# Autogen'd
|
if [ -f "${BASE}/bin/${NAME}" ] ; then
|
||||||
if [ -f "${BASE}/scripts/setenv.sh" ] ; then
|
exec "${BASE}/bin/${NAME}" "$@"
|
||||||
. ${BASE}/scripts/setenv.sh
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Use Pro's bundled gems instead of the gemcache
|
|
||||||
export MSF_BUNDLE_GEMS=0
|
|
||||||
export BUNDLE_GEMFILE=${BASE}/apps/pro/Gemfile
|
|
||||||
|
|
||||||
# Set a flag so Gemfile can limit gems
|
|
||||||
export FRAMEWORK_FLAG=true
|
|
||||||
|
|
||||||
export MSF_DATABASE_CONFIG=${BASE}/apps/pro/ui/config/database.yml
|
|
||||||
export TERMINFO=${BASE}/common/share/terminfo/
|
|
||||||
|
|
||||||
# Check for ruby scripts such as msfconsole directly to avoid having to add
|
|
||||||
# msf3 to the path.
|
|
||||||
if [ -f "${BASE}/apps/pro/msf3/${NAME}" ]; then
|
|
||||||
exec ${BASE}/apps/pro/msf3/${NAME} "$@"
|
|
||||||
fi
|
|
||||||
if [ -f "${BASE}/apps/pro/msf3/tools/exploit/${NAME}.rb" ]; then
|
|
||||||
exec ${BASE}/apps/pro/msf3/tools/exploit/${NAME}.rb "$@"
|
|
||||||
fi
|
|
||||||
|
|
||||||
export BASE="/opt/metasploit-framework"
|
|
||||||
if [ -f "${BASE}/embedded/framework/tools/exploit/${NAME}.rb" ]; then
|
if [ -f "${BASE}/embedded/framework/tools/exploit/${NAME}.rb" ]; then
|
||||||
exec ${BASE}/embedded/bin/ruby \
|
exec ${BASE}/embedded/bin/ruby \
|
||||||
"${BASE}/embedded/framework/tools/exploit/${NAME}.rb" "$@"
|
"${BASE}/embedded/framework/tools/exploit/${NAME}.rb" "$@"
|
||||||
|
|||||||
22
bin/nvidia_hold.sh
Executable file
22
bin/nvidia_hold.sh
Executable file
@@ -0,0 +1,22 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
function list_nvidia_installed {
|
||||||
|
dpkg-query -l '*nvidia*' | grep '^[hi]i' | awk '{print $2}'
|
||||||
|
}
|
||||||
|
|
||||||
|
function hold_or_unhold {
|
||||||
|
list_nvidia_installed | xargs apt-mark "${1:-hold}"
|
||||||
|
}
|
||||||
|
|
||||||
|
case "$1" in
|
||||||
|
hold|h)
|
||||||
|
hold_or_unhold hold
|
||||||
|
;;
|
||||||
|
unhold|u)
|
||||||
|
hold_or_unhold unhold
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
echo "$0 <hold|unhold>" >/dev/stderr
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
46
bin/pactl_helper
Executable file
46
bin/pactl_helper
Executable file
@@ -0,0 +1,46 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
function get_active_sink {
|
||||||
|
pactl list short sinks | grep RUNNING | awk '{print $2}'
|
||||||
|
}
|
||||||
|
|
||||||
|
function get_active_source {
|
||||||
|
pactl list short sources | grep RUNNING | awk '{print $2}'
|
||||||
|
}
|
||||||
|
|
||||||
|
function get_default_sink {
|
||||||
|
pactl info | grep '^Default Sink:' | awk '{print $NF}'
|
||||||
|
}
|
||||||
|
|
||||||
|
function get_default_source {
|
||||||
|
pactl info | grep '^Default Source:' | awk '{print $NF}'
|
||||||
|
}
|
||||||
|
|
||||||
|
function micmute {
|
||||||
|
MODE=${1:-toggle}
|
||||||
|
pactl set-source-mute $(get_default_source) ${MODE}
|
||||||
|
}
|
||||||
|
|
||||||
|
function mute {
|
||||||
|
MODE=${1:-toggle}
|
||||||
|
pactl set-sink-mute $(get_default_sink) ${MODE}
|
||||||
|
}
|
||||||
|
|
||||||
|
function volume {
|
||||||
|
VOL="${1}"
|
||||||
|
if test -z "${VOL}" ; then
|
||||||
|
echo "Need volume spec!"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
pactl set-sink-volume $(get_default_sink) "${VOL}"
|
||||||
|
}
|
||||||
|
|
||||||
|
case "$1" in
|
||||||
|
mute|micmute|volume)
|
||||||
|
"$@"
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
echo "Unknown command!"
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
46
bin/prune-broken-symlinks.sh
Executable file
46
bin/prune-broken-symlinks.sh
Executable file
@@ -0,0 +1,46 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
# shellcheck disable=SC2039,SC2086
|
||||||
|
|
||||||
|
set -o nounset
|
||||||
|
|
||||||
|
prune_broken_symlinks() {
|
||||||
|
ask=1
|
||||||
|
dir="."
|
||||||
|
|
||||||
|
if [ "${1:-}" = "-y" ]; then
|
||||||
|
ask=0
|
||||||
|
shift
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -n "${1:-}" ]; then
|
||||||
|
dir="$1"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Check if there are any broken symlinks first
|
||||||
|
broken_links=$(find -L "$dir" -xdev -type l -print 2>/dev/null)
|
||||||
|
if [ -z "$broken_links" ]; then
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "$ask" -eq 1 ]; then
|
||||||
|
# Print broken links
|
||||||
|
echo "$broken_links"
|
||||||
|
|
||||||
|
printf "Delete these links? [y/N] "
|
||||||
|
read -r reply
|
||||||
|
case "$reply" in
|
||||||
|
[yY]*)
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
echo "Aborted."
|
||||||
|
return 0
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Perform deletion
|
||||||
|
find -L "$dir" -xdev -type l -exec rm -- {} + 2>/dev/null
|
||||||
|
}
|
||||||
|
|
||||||
|
# Execute the function
|
||||||
|
prune_broken_symlinks "$@"
|
||||||
48
bin/qdisc_span.sh
Executable file
48
bin/qdisc_span.sh
Executable file
@@ -0,0 +1,48 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
set -ue
|
||||||
|
|
||||||
|
ACTION="add"
|
||||||
|
|
||||||
|
if [ "${1}" == "-d" ] ; then
|
||||||
|
ACTION="del"
|
||||||
|
shift
|
||||||
|
fi
|
||||||
|
|
||||||
|
BRIDGE="${1}"
|
||||||
|
DEST="${2}"
|
||||||
|
|
||||||
|
function setup_span {
|
||||||
|
if tc qdisc show dev "${1}" | grep -q 'qdisc ingress ffff' ; then
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
tc qdisc add dev "${1}" ingress
|
||||||
|
tc filter add dev "${1}" parent ffff: protocol all u32 match u8 0 0 action mirred egress mirror dev "${DEST}"
|
||||||
|
}
|
||||||
|
|
||||||
|
function del_span {
|
||||||
|
tc qdisc del dev "${1}" ingress
|
||||||
|
}
|
||||||
|
|
||||||
|
function handle_iface {
|
||||||
|
case "${ACTION}" in
|
||||||
|
add)
|
||||||
|
setup_span "${1}"
|
||||||
|
;;
|
||||||
|
del)
|
||||||
|
del_span "${1}"
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
echo "Unknown action!"
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
}
|
||||||
|
|
||||||
|
function get_bridge_ifaces {
|
||||||
|
bridge link | grep "master ${1}" | cut -d: -f2 | cut -d@ -f1
|
||||||
|
}
|
||||||
|
|
||||||
|
get_bridge_ifaces "${BRIDGE}" | while IFS= read -r iface ; do
|
||||||
|
handle_iface "$iface"
|
||||||
|
done
|
||||||
5
bin/remove-wine-associations
Executable file
5
bin/remove-wine-associations
Executable file
@@ -0,0 +1,5 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
rm -f ~/.local/share/applications/wine*.desktop
|
||||||
|
update-desktop-database ~/.local/share/applications
|
||||||
|
rm -f ~/.local/share/mime/packages/x-wine*.xml
|
||||||
|
update-mime-database ~/.local/share/mime
|
||||||
83
bin/resign_for_debug.sh
Executable file
83
bin/resign_for_debug.sh
Executable file
@@ -0,0 +1,83 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# Default values
|
||||||
|
FORCE=false
|
||||||
|
TARGET_PATH=""
|
||||||
|
DEST_PATH=""
|
||||||
|
|
||||||
|
# Parse flags (looking for -f)
|
||||||
|
while getopts "f" opt; do
|
||||||
|
case $opt in
|
||||||
|
f) FORCE=true ;;
|
||||||
|
*) echo "Usage: $0 [-f] <binary_name_or_path> [destination]"; exit 1 ;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
shift $((OPTIND-1))
|
||||||
|
|
||||||
|
# Check for first argument
|
||||||
|
if [ -z "$1" ]; then
|
||||||
|
echo "Error: No binary specified."
|
||||||
|
echo "Usage: $0 [-f] <binary_name_or_path> [destination]"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 1. Resolve the Source Binary
|
||||||
|
if [[ "$1" == *"/"* ]]; then
|
||||||
|
SOURCE_BIN="$1"
|
||||||
|
else
|
||||||
|
SOURCE_BIN=$(command -v "$1")
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ ! -f "$SOURCE_BIN" ]; then
|
||||||
|
echo "Error: Could not find binary at '$1'"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 2. Determine Destination Path
|
||||||
|
if [ -n "$2" ]; then
|
||||||
|
DEST_PATH="$2"
|
||||||
|
# If destination is a directory, append the basename
|
||||||
|
if [ -d "$DEST_PATH" ]; then
|
||||||
|
DEST_PATH="${DEST_PATH%/}/$(basename "$SOURCE_BIN")"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
# No destination given: create a temp directory
|
||||||
|
TMP_DIR=$(mktemp -d -t "debug_unlock_XXXXXX")
|
||||||
|
DEST_PATH="$TMP_DIR/$(basename "$SOURCE_BIN")"
|
||||||
|
echo "Notice: No destination provided. Using temp path: $DEST_PATH"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 3. Check for Collision
|
||||||
|
if [ -f "$DEST_PATH" ] && [ "$FORCE" = false ]; then
|
||||||
|
echo "Error: Destination '$DEST_PATH' already exists. Use -f to overwrite."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 4. Copy and Sign
|
||||||
|
cp -f "$SOURCE_BIN" "$DEST_PATH"
|
||||||
|
chmod +x "$DEST_PATH"
|
||||||
|
|
||||||
|
ENTITLEMENTS_FILE=$(mktemp)
|
||||||
|
cat <<EOF > "$ENTITLEMENTS_FILE"
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||||
|
<plist version="1.0">
|
||||||
|
<dict>
|
||||||
|
<key>com.apple.security.get-task-allow</key>
|
||||||
|
<true/>
|
||||||
|
<key>com.apple.security.cs.disable-library-validation</key>
|
||||||
|
<true/>
|
||||||
|
</dict>
|
||||||
|
</plist>
|
||||||
|
EOF
|
||||||
|
|
||||||
|
echo "Unlocking: $SOURCE_BIN -> $DEST_PATH"
|
||||||
|
codesign -s - --entitlements "$ENTITLEMENTS_FILE" -f "$DEST_PATH" 2>/dev/null
|
||||||
|
|
||||||
|
if [ $? -eq 0 ]; then
|
||||||
|
echo "✅ Success! You can now debug: $DEST_PATH"
|
||||||
|
else
|
||||||
|
echo "❌ Error: Code signing failed."
|
||||||
|
fi
|
||||||
|
|
||||||
|
rm "$ENTITLEMENTS_FILE"
|
||||||
26
bin/restic.sh
Executable file
26
bin/restic.sh
Executable file
@@ -0,0 +1,26 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
#
|
||||||
|
# Script to execute a restic backup script specific to the current hostname.
|
||||||
|
#
|
||||||
|
set -o errexit
|
||||||
|
set -o nounset
|
||||||
|
set -o pipefail
|
||||||
|
|
||||||
|
# Get the current hostname
|
||||||
|
HOSTNAME=$(hostname)
|
||||||
|
|
||||||
|
# Define the directory where hostname-specific scripts are stored
|
||||||
|
RESTIC_SCRIPTS_DIR="${HOME}/bin/restic"
|
||||||
|
|
||||||
|
# Construct the full path to the hostname-specific script
|
||||||
|
HOST_SPECIFIC_SCRIPT="${RESTIC_SCRIPTS_DIR}/${HOSTNAME}"
|
||||||
|
|
||||||
|
# Check if the script exists and is executable
|
||||||
|
if [[ -f "${HOST_SPECIFIC_SCRIPT}" && -x "${HOST_SPECIFIC_SCRIPT}" ]]; then
|
||||||
|
echo "Executing restic script for hostname: ${HOSTNAME}"
|
||||||
|
"${HOST_SPECIFIC_SCRIPT}"
|
||||||
|
else
|
||||||
|
echo "Error: No executable restic script found for hostname '${HOSTNAME}' at '${HOST_SPECIFIC_SCRIPT}'." >&2
|
||||||
|
echo "Please create an executable script at that path if you want to use this functionality." >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
165
bin/restic/baymax
Executable file
165
bin/restic/baymax
Executable file
@@ -0,0 +1,165 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
#
|
||||||
|
# A script to backup a single-user MacBook using restic to either a local
|
||||||
|
# filesystem or Backblaze B2.
|
||||||
|
|
||||||
|
set -o errexit
|
||||||
|
set -o nounset
|
||||||
|
set -o pipefail
|
||||||
|
|
||||||
|
# --- Configuration ---
|
||||||
|
# Directory to be backed up.
|
||||||
|
# For this script, we assume the user's home directory.
|
||||||
|
SOURCE_DIR="${HOME}"
|
||||||
|
|
||||||
|
# Exclude file location. We'll create a default one next to the script.
|
||||||
|
EXCLUDE_FILE="$HOME/.restic_exclude.darwin"
|
||||||
|
|
||||||
|
# --- Functions ---
|
||||||
|
usage() {
|
||||||
|
cat << EOF
|
||||||
|
Usage: $(basename "$0") [-l /path/to/repo | -b [bucket]] [-u UPLOAD_LIMIT]
|
||||||
|
|
||||||
|
A script to backup a single-user MacBook using restic.
|
||||||
|
|
||||||
|
Options:
|
||||||
|
-l <path> Backup to a local filesystem repository at the given path.
|
||||||
|
-b [bucket] Backup to a Backblaze B2 bucket. The bucket name is optional.
|
||||||
|
If not provided, it will be read from the B2_BUCKET_NAME
|
||||||
|
environment variable.
|
||||||
|
-u <limit> Limit the upload speed to the given value in KB/s.
|
||||||
|
-h Show this help message.
|
||||||
|
EOF
|
||||||
|
}
|
||||||
|
|
||||||
|
# --- Main Script ---
|
||||||
|
# Check if restic is installed
|
||||||
|
if ! command -v restic &> /dev/null; then
|
||||||
|
echo "Error: restic command not found." >&2
|
||||||
|
echo "Please install restic first: https://restic.net/" >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ $# -eq 0 ]]; then
|
||||||
|
usage
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
BACKUP_MODE=""
|
||||||
|
REPO=""
|
||||||
|
UPLOAD_LIMIT=""
|
||||||
|
|
||||||
|
while getopts ":l:bu:h" opt; do
|
||||||
|
case ${opt} in
|
||||||
|
l)
|
||||||
|
BACKUP_MODE="local"
|
||||||
|
REPO="${OPTARG}"
|
||||||
|
;;
|
||||||
|
b)
|
||||||
|
BACKUP_MODE="b2"
|
||||||
|
if [[ ${OPTIND} -le $# && "${!OPTIND}" != -* ]]; then
|
||||||
|
REPO="b2:${!OPTIND}:"
|
||||||
|
OPTIND=$((OPTIND + 1))
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
u)
|
||||||
|
UPLOAD_LIMIT="${OPTARG}"
|
||||||
|
;;
|
||||||
|
h)
|
||||||
|
usage
|
||||||
|
exit 0
|
||||||
|
;;
|
||||||
|
\?)
|
||||||
|
echo "Invalid option: -${OPTARG}" >&2
|
||||||
|
usage
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
:)
|
||||||
|
echo "Option -${OPTARG} requires an argument." >&2
|
||||||
|
usage
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
|
# --- Pre-run checks ---
|
||||||
|
if [[ -z "${BACKUP_MODE}" ]]; then
|
||||||
|
echo "Error: You must specify a backup mode (-l or -b)." >&2
|
||||||
|
usage
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ "${BACKUP_MODE}" == "b2" ]]; then
|
||||||
|
if [[ -f "${HOME}/.resticb2" ]] ; then
|
||||||
|
. "${HOME}/.resticb2"
|
||||||
|
fi
|
||||||
|
export B2_ACCOUNT_ID
|
||||||
|
export B2_ACCOUNT_KEY
|
||||||
|
export B2_BUCKET_NAME
|
||||||
|
if [[ -z "${B2_ACCOUNT_ID:-}" || -z "${B2_ACCOUNT_KEY:-}" ]]; then
|
||||||
|
echo "Error: For Backblaze B2 backups, you must set the B2_ACCOUNT_ID and B2_ACCOUNT_KEY environment variables." >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ -z "${REPO:-}" ]]; then
|
||||||
|
if [[ -n "${B2_BUCKET_NAME:-}" ]]; then
|
||||||
|
REPO="b2:${B2_BUCKET_NAME}:"
|
||||||
|
else
|
||||||
|
echo "Error: Backup mode is B2 but no bucket name was provided and the B2_BUCKET_NAME environment variable is not set." >&2
|
||||||
|
usage
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
KEYCHAIN_ENTRY_NAME="restic_repo_password"
|
||||||
|
if security find-generic-password -a "$(whoami)" -s "${KEYCHAIN_ENTRY_NAME}" >/dev/null 2>&1 ; then
|
||||||
|
export RESTIC_PASSWORD_COMMAND="security find-generic-password -a \"$(whoami)\" -s \"${KEYCHAIN_ENTRY_NAME}\" -w"
|
||||||
|
# Source file?
|
||||||
|
elif [[ -f "${HOME}/.resticpass" ]] ; then
|
||||||
|
export RESTIC_PASSWORD_FILE="${HOME}/.resticpass"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# If the repository does not exist, initialize it.
|
||||||
|
# The user will be prompted for a password, which will be required for all
|
||||||
|
# future interactions with the repository.
|
||||||
|
if ! restic -r "${REPO}" snapshots &> /dev/null; then
|
||||||
|
echo "Restic repository not found or not accessible. Initializing..."
|
||||||
|
restic init -r "${REPO}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
# --- Run Backup ---
|
||||||
|
echo "Starting restic backup..."
|
||||||
|
echo "Source: ${SOURCE_DIR}"
|
||||||
|
echo "Repository: ${REPO}"
|
||||||
|
|
||||||
|
BACKUP_CMD="restic backup \
|
||||||
|
--verbose \
|
||||||
|
--repo \"${REPO}\" \
|
||||||
|
--exclude-file \"${EXCLUDE_FILE}\" \
|
||||||
|
--one-file-system \
|
||||||
|
--tag \"macbook-backup\""
|
||||||
|
|
||||||
|
if [[ -n "${UPLOAD_LIMIT}" ]]; then
|
||||||
|
BACKUP_CMD="${BACKUP_CMD} --limit-upload ${UPLOAD_LIMIT}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
BACKUP_CMD="${BACKUP_CMD} \"${SOURCE_DIR}\""
|
||||||
|
|
||||||
|
eval "${BACKUP_CMD}"
|
||||||
|
|
||||||
|
echo "Backup complete."
|
||||||
|
|
||||||
|
# --- Prune old snapshots (optional, but recommended) ---
|
||||||
|
# Keeps the last 7 daily, 4 weekly, and 6 monthly snapshots.
|
||||||
|
echo "Pruning old snapshots..."
|
||||||
|
restic forget \
|
||||||
|
--repo "${REPO}" \
|
||||||
|
--keep-daily 7 \
|
||||||
|
--keep-weekly 4 \
|
||||||
|
--keep-monthly 6 \
|
||||||
|
--prune
|
||||||
|
|
||||||
|
echo "Pruning complete."
|
||||||
|
echo "Restic backup script finished."
|
||||||
37
bin/restic/scar
Executable file
37
bin/restic/scar
Executable file
@@ -0,0 +1,37 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
set -ue
|
||||||
|
|
||||||
|
export RESTIC_DEFAULT_BE="google"
|
||||||
|
export RESTIC_PASSWORD_FILE=${HOME}/.restic-password
|
||||||
|
|
||||||
|
case "${RESTIC_BACKEND:=${RESTIC_DEFAULT_BE}}" in
|
||||||
|
google)
|
||||||
|
export GOOGLE_PROJECT_ID=systemoverlord.com:systemoverlord
|
||||||
|
export GOOGLE_APPLICATION_CREDENTIALS=${HOME}/.config/boto/restic-creds.json
|
||||||
|
export RESTIC_REPOSITORY="gs:systemoverlord-backups-scar-2:/"
|
||||||
|
;;
|
||||||
|
b2)
|
||||||
|
. "${HOME}/.restic-backups-scar-creds"
|
||||||
|
export AWS_ACCESS_KEY_ID
|
||||||
|
export AWS_SECRET_ACCESS_KEY
|
||||||
|
export RESTIC_REPOSITORY="s3:s3.us-west-004.backblazeb2.com/systemoverlord-backups-scar"
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
echo "Unknown restic backend $RESTIC_BACKEND" >&2
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
cd "${HOME}"
|
||||||
|
|
||||||
|
if [ -z "${1}" ] ; then
|
||||||
|
|
||||||
|
restic backup \
|
||||||
|
--files-from "${HOME}/.restic-backup" \
|
||||||
|
--limit-upload 5000 \
|
||||||
|
--limit-download 10000
|
||||||
|
|
||||||
|
else
|
||||||
|
restic "$@"
|
||||||
|
fi
|
||||||
82
bin/screenshot.sh
Executable file
82
bin/screenshot.sh
Executable file
@@ -0,0 +1,82 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# Screenshot tool to try a few different tools
|
||||||
|
|
||||||
|
set -ue
|
||||||
|
|
||||||
|
TOOLS="flameshot scrot"
|
||||||
|
SCREENDIR=${SCREENDIR:-${HOME}/Pictures/Screenshots}
|
||||||
|
SCROT_FORMAT="%F-%T.png"
|
||||||
|
|
||||||
|
function default_screenshot_command {
|
||||||
|
for tool in ${TOOLS} ; do
|
||||||
|
if which "${tool}" >/dev/null 2>&1 ; then
|
||||||
|
echo "${tool}"
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
|
||||||
|
TOOL=${SHOT:-$(default_screenshot_command)}
|
||||||
|
CMD=${1:-region}
|
||||||
|
|
||||||
|
function flameshot_gui_capture {
|
||||||
|
flameshot gui -p "${SCREENDIR}"
|
||||||
|
}
|
||||||
|
|
||||||
|
function flameshot_full_capture {
|
||||||
|
flameshot full -p "${SCREENDIR}"
|
||||||
|
}
|
||||||
|
|
||||||
|
function scrot_region_capture {
|
||||||
|
scrot -s "${SCREENDIR}/${SCROT_FORMAT}"
|
||||||
|
}
|
||||||
|
|
||||||
|
function scrot_window_capture {
|
||||||
|
scrot -u "${SCREENDIR}/${SCROT_FORMAT}"
|
||||||
|
}
|
||||||
|
|
||||||
|
function scrot_full_capture {
|
||||||
|
scrot "${SCREENDIR}/${SCROT_FORMAT}"
|
||||||
|
}
|
||||||
|
|
||||||
|
case "${CMD}" in
|
||||||
|
region|window|full)
|
||||||
|
mkdir -p "${SCREENDIR}"
|
||||||
|
case "${TOOL}" in
|
||||||
|
flameshot)
|
||||||
|
case "${CMD}" in
|
||||||
|
region|window)
|
||||||
|
flameshot_gui_capture
|
||||||
|
;;
|
||||||
|
full)
|
||||||
|
flameshot_full_capture
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
;;
|
||||||
|
scrot)
|
||||||
|
case "${CMD}" in
|
||||||
|
region)
|
||||||
|
scrot_region_capture
|
||||||
|
;;
|
||||||
|
window)
|
||||||
|
scrot_window_capture
|
||||||
|
;;
|
||||||
|
full)
|
||||||
|
scrot_full_capture
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
echo "Error: Unknown or unsupported tool '${TOOL}'" >&2
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
exit $?
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
echo "Usage: $0 [region|window|full]" >/dev/stderr
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
35
bin/setup/apt_proxy.sh
Executable file
35
bin/setup/apt_proxy.sh
Executable file
@@ -0,0 +1,35 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
set -o errexit
|
||||||
|
set -o nounset
|
||||||
|
|
||||||
|
if test -f /etc/apt/apt.conf.d/90-proxy ; then
|
||||||
|
echo "Looks already setup."
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
cat >/etc/apt/proxy-detect <<'EOF'
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
PROXY=192.168.60.10:3142
|
||||||
|
|
||||||
|
if ! test -x /bin/nc ; then
|
||||||
|
echo DIRECT
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
if nc -w 2 -z ${PROXY/:/ } ; then
|
||||||
|
echo ${PROXY}
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo DIRECT
|
||||||
|
EOF
|
||||||
|
|
||||||
|
chmod 755 /etc/apt/proxy-detect
|
||||||
|
|
||||||
|
cat >/etc/apt/apt.conf.d/90-proxy <<'EOF'
|
||||||
|
Acquire::http::Proxy-Auto-Detect "/etc/apt/proxy-detect";
|
||||||
|
EOF
|
||||||
|
|
||||||
|
echo "Setup APT Proxying."
|
||||||
@@ -2,4 +2,4 @@
|
|||||||
|
|
||||||
apt-get install -y \
|
apt-get install -y \
|
||||||
i3 i3lock xss-lock rxvt-unicode-256color fonts-inconsolata scrot \
|
i3 i3lock xss-lock rxvt-unicode-256color fonts-inconsolata scrot \
|
||||||
xautolock xbacklight i3status
|
xautolock xbacklight i3status dex libnotify-bin
|
||||||
33
bin/setup/nerdfonts.sh
Executable file
33
bin/setup/nerdfonts.sh
Executable file
@@ -0,0 +1,33 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
set -ue
|
||||||
|
|
||||||
|
VER="v3.4.0"
|
||||||
|
|
||||||
|
FONTS=(
|
||||||
|
https://github.com/ryanoasis/nerd-fonts/releases/download/${VER}/DejaVuSansMono.zip
|
||||||
|
https://github.com/ryanoasis/nerd-fonts/releases/download/${VER}/FiraCode.zip
|
||||||
|
https://github.com/ryanoasis/nerd-fonts/releases/download/${VER}/FiraMono.zip
|
||||||
|
https://github.com/ryanoasis/nerd-fonts/releases/download/${VER}/Hack.zip
|
||||||
|
https://github.com/ryanoasis/nerd-fonts/releases/download/${VER}/Inconsolata.zip
|
||||||
|
https://github.com/ryanoasis/nerd-fonts/releases/download/${VER}/OpenDyslexic.zip
|
||||||
|
)
|
||||||
|
|
||||||
|
if [ "$(uname)" = "Darwin" ]; then
|
||||||
|
FPATH="${HOME}/Library/Fonts"
|
||||||
|
else
|
||||||
|
FPATH="${HOME}/.local/share/fonts/nerdfonts"
|
||||||
|
fi
|
||||||
|
|
||||||
|
mkdir -p "${FPATH}"
|
||||||
|
cd "${FPATH}"
|
||||||
|
|
||||||
|
for f in "${FONTS[@]}"; do
|
||||||
|
BN=$(basename "$f")
|
||||||
|
wget -O "${FPATH}/${BN}" "$f"
|
||||||
|
unzip -o -d "${FPATH}" "${FPATH}/${BN}"
|
||||||
|
done
|
||||||
|
|
||||||
|
if command -v fc-cache >/dev/null 2>&1; then
|
||||||
|
fc-cache -v
|
||||||
|
fi
|
||||||
18
bin/setup/spicerandr.sh
Normal file
18
bin/setup/spicerandr.sh
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
set -ue
|
||||||
|
|
||||||
|
cat >/usr/local/bin/x-resize <<"EOF"
|
||||||
|
#!/bin/sh
|
||||||
|
PATH=/usr/bin:/bin:/usr/local/bin
|
||||||
|
desktopuser=$(/bin/ps -ef | /bin/grep -oP '^\w+ (?=.*vdagent( |$))') || exit 0
|
||||||
|
export DISPLAY=:0
|
||||||
|
export XAUTHORITY=$(eval echo "~$desktopuser")/.Xauthority
|
||||||
|
/usr/bin/xrandr --output $(/usr/bin/xrandr | awk '/ connected/{print $1; exit; }') --auto
|
||||||
|
EOF
|
||||||
|
chmod 755 /usr/local/bin/x-resize
|
||||||
|
|
||||||
|
cat >/etc/udev/rules.d/50-resize.rules <<"EOF"
|
||||||
|
ACTION=="change",KERNEL=="card0", SUBSYSTEM=="drm", RUN+="/usr/local/bin/x-resize"
|
||||||
|
EOF
|
||||||
|
chmod 644 /etc/udev/rules.d/50-resize.rules
|
||||||
36
bin/smart-copy-paste
Executable file
36
bin/smart-copy-paste
Executable file
@@ -0,0 +1,36 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
#
|
||||||
|
# smart-copy-paste
|
||||||
|
#
|
||||||
|
# This script provides context-aware copy and paste operations, mimicking
|
||||||
|
# macOS behavior (Alt+C/V) while correctly handling terminals that require
|
||||||
|
# the Shift key.
|
||||||
|
|
||||||
|
# Exit silently if xdotool is not installed.
|
||||||
|
if ! command -v xdotool > /dev/null; then
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Get the class name of the currently focused window.
|
||||||
|
# We need to get the window on focus, to avoid issues with transparent terminals.
|
||||||
|
class=$(xdotool getwindowclassname "$(xdotool getwindowfocus)")
|
||||||
|
|
||||||
|
# Semicolon-separated list of terminal class names.
|
||||||
|
terminals='Gnome-terminal;Xfce4-terminal;konsole;xterm;URxvt;Terminator;Alacritty;kitty;wezterm'
|
||||||
|
|
||||||
|
# Determine the keystroke based on the window type and the argument passed.
|
||||||
|
if echo "$terminals" | grep -q "$class"; then
|
||||||
|
# This is a terminal, so use Shift.
|
||||||
|
if [ "$1" = "copy" ]; then
|
||||||
|
xdotool key --clearmodifiers ctrl+shift+c
|
||||||
|
elif [ "$1" = "paste" ]; then
|
||||||
|
xdotool key --clearmodifiers ctrl+shift+v
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
# This is a standard GUI app.
|
||||||
|
if [ "$1" = "copy" ]; then
|
||||||
|
xdotool key --clearmodifiers ctrl+c
|
||||||
|
elif [ "$1" = "paste" ]; then
|
||||||
|
xdotool key --clearmodifiers ctrl+v
|
||||||
|
fi
|
||||||
|
fi
|
||||||
164
bin/ssh-sign
Executable file
164
bin/ssh-sign
Executable file
@@ -0,0 +1,164 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
# A robust wrapper for ssh-keygen to sign and verify files.
|
||||||
|
|
||||||
|
# --- Color Codes for Output ---
|
||||||
|
COLOR_RED='\033[0;31m'
|
||||||
|
COLOR_GREEN='\033[0;32m'
|
||||||
|
COLOR_NONE='\033[0m' # No Color
|
||||||
|
|
||||||
|
# --- Default values ---
|
||||||
|
DEFAULT_SIGNING_KEY="$HOME/.ssh/id_signing"
|
||||||
|
DEFAULT_ALLOWED_SIGNERS="$HOME/.ssh/allowed_signers"
|
||||||
|
DEFAULT_IDENTITY="david@systemoverlord.com"
|
||||||
|
DEFAULT_NAMESPACE="file"
|
||||||
|
|
||||||
|
# --- Usage Message ---
|
||||||
|
usage() {
|
||||||
|
cat << EOF
|
||||||
|
Usage: $(basename "$0") <sign|verify> [OPTIONS] [FILE]
|
||||||
|
|
||||||
|
A wrapper for 'ssh-keygen -Y' to simplify file signing and verification.
|
||||||
|
|
||||||
|
COMMANDS:
|
||||||
|
sign Sign a file. The path to the file to be signed is provided as a positional argument.
|
||||||
|
verify Verify a signature. The original file content is read from stdin.
|
||||||
|
|
||||||
|
OPTIONS:
|
||||||
|
-f <file> For 'sign': Path to the private key for signing.
|
||||||
|
Defaults to '$DEFAULT_SIGNING_KEY' if it exists.
|
||||||
|
For 'verify': Path to the allowed_signers file.
|
||||||
|
Defaults to '$DEFAULT_ALLOWED_SIGNERS'.
|
||||||
|
-n <namespace> Signature namespace.
|
||||||
|
Defaults to '$DEFAULT_NAMESPACE'.
|
||||||
|
-I <identity> For 'verify': The identity to check the signature against.
|
||||||
|
Defaults to '$DEFAULT_IDENTITY'.
|
||||||
|
-s <sig_file> For 'verify': Path to the signature file to verify (e.g., file.sig). REQUIRED for verify.
|
||||||
|
-h, --help Show this help message.
|
||||||
|
|
||||||
|
EXAMPLE USAGE:
|
||||||
|
# Sign a file using the default key
|
||||||
|
$(basename "$0") sign release.tar.gz
|
||||||
|
|
||||||
|
# Sign a file with a specific key
|
||||||
|
$(basename "$0") sign -f ~/.ssh/id_ed25519_my_signing_key release.tar.gz
|
||||||
|
|
||||||
|
# Verify a signature using default allowed_signers and identity
|
||||||
|
cat release.tar.gz | $(basename "$0") verify -s release.tar.gz.sig
|
||||||
|
|
||||||
|
# Verify a signature with a specific allowed_signers file and identity
|
||||||
|
cat release.tar.gz | $(basename "$0") verify -f ./my_signers -I other@example.com -s release.tar.gz.sig
|
||||||
|
|
||||||
|
EOF
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
|
||||||
|
# --- Helper for error messages ---
|
||||||
|
error() {
|
||||||
|
echo -e "${COLOR_RED}Error: $1${COLOR_NONE}" >&2
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
|
||||||
|
# --- Main Script Logic ---
|
||||||
|
|
||||||
|
if [[ "$1" != "sign" && "$1" != "verify" ]]; then
|
||||||
|
usage
|
||||||
|
fi
|
||||||
|
|
||||||
|
SUBCOMMAND=$1
|
||||||
|
shift # Consume the subcommand
|
||||||
|
|
||||||
|
# --- Argument Parsing and Validation ---
|
||||||
|
|
||||||
|
# Separate arguments from the file to be signed
|
||||||
|
declare -a remaining_args
|
||||||
|
file_to_sign=""
|
||||||
|
while [[ "$#" -gt 0 ]]; do
|
||||||
|
# If we see a non-flag argument, assume it's the file to sign.
|
||||||
|
# This works because the file to sign is the only positional argument.
|
||||||
|
if [[ "$1" != -* ]] && [[ -z "$file_to_sign" ]]; then
|
||||||
|
file_to_sign="$1"
|
||||||
|
else
|
||||||
|
remaining_args+=("$1")
|
||||||
|
fi
|
||||||
|
shift
|
||||||
|
done
|
||||||
|
|
||||||
|
# --- Build command based on subcommand ---
|
||||||
|
declare -a CMD_ARGS
|
||||||
|
CMD_ARGS=("ssh-keygen" "-Y" "$SUBCOMMAND")
|
||||||
|
|
||||||
|
# Append all the flag-based arguments (-f, -n, -I, -s)
|
||||||
|
CMD_ARGS+=("${remaining_args[@]}")
|
||||||
|
|
||||||
|
# Scan for provided flags to handle defaults correctly
|
||||||
|
f_provided=false
|
||||||
|
n_provided=false
|
||||||
|
I_provided=false
|
||||||
|
s_provided=false
|
||||||
|
for arg in "${remaining_args[@]}"; do
|
||||||
|
[[ "$arg" == "-f" ]] && f_provided=true
|
||||||
|
[[ "$arg" == "-n" ]] && n_provided=true
|
||||||
|
[[ "$arg" == "-I" ]] && I_provided=true
|
||||||
|
[[ "$arg" == "-s" ]] && s_provided=true
|
||||||
|
done
|
||||||
|
|
||||||
|
if [[ "$SUBCOMMAND" == "sign" ]]; then
|
||||||
|
if [[ -z "$file_to_sign" ]]; then
|
||||||
|
error "Path to file to be signed is required for 'sign' command."
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Set default signing key if -f was not provided
|
||||||
|
if ! $f_provided; then
|
||||||
|
if [[ ! -f "$DEFAULT_SIGNING_KEY" ]]; then
|
||||||
|
error "Default signing key not found at '$DEFAULT_SIGNING_KEY'. Specify one with -f."
|
||||||
|
fi
|
||||||
|
CMD_ARGS+=("-f" "$DEFAULT_SIGNING_KEY")
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Set default namespace if -n was not provided
|
||||||
|
if ! $n_provided; then
|
||||||
|
CMD_ARGS+=("-n" "$DEFAULT_NAMESPACE")
|
||||||
|
fi
|
||||||
|
|
||||||
|
# The file to sign MUST be the last argument for ssh-keygen
|
||||||
|
CMD_ARGS+=("$file_to_sign")
|
||||||
|
|
||||||
|
elif [[ "$SUBCOMMAND" == "verify" ]]; then
|
||||||
|
if [[ -n "$file_to_sign" ]]; then
|
||||||
|
error "The 'verify' command reads from stdin and does not accept a positional file argument. Found '$file_to_sign'."
|
||||||
|
fi
|
||||||
|
if ! $s_provided; then
|
||||||
|
error "Signature file must be provided with -s for 'verify' command."
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Set default allowed_signers if -f was not provided
|
||||||
|
if ! $f_provided; then
|
||||||
|
if [[ ! -f "$DEFAULT_ALLOWED_SIGNERS" ]]; then
|
||||||
|
error "Default allowed signers file not found at '$DEFAULT_ALLOWED_SIGNERS'. Specify one with -f."
|
||||||
|
fi
|
||||||
|
CMD_ARGS+=("-f" "$DEFAULT_ALLOWED_SIGNERS")
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Set default identity if -I was not provided
|
||||||
|
if ! $I_provided; then
|
||||||
|
CMD_ARGS+=("-I" "$DEFAULT_IDENTITY")
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Set default namespace if -n was not provided
|
||||||
|
if ! $n_provided; then
|
||||||
|
CMD_ARGS+=("-n" "$DEFAULT_NAMESPACE")
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
# --- Execute and Report ---
|
||||||
|
|
||||||
|
# We capture the output and stderr to show it to the user
|
||||||
|
if output=$("${CMD_ARGS[@]}" 2>&1); then
|
||||||
|
echo -e "${COLOR_GREEN}Success:${COLOR_NONE}"
|
||||||
|
echo "$output"
|
||||||
|
exit 0
|
||||||
|
else
|
||||||
|
echo -e "${COLOR_RED}Command Failed:${COLOR_NONE}"
|
||||||
|
echo "$output" >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
@@ -7,7 +7,7 @@ fi
|
|||||||
|
|
||||||
if [ `whoami` != "root" ] ; then
|
if [ `whoami` != "root" ] ; then
|
||||||
if which sudo >/dev/null 2>&1 ; then
|
if which sudo >/dev/null 2>&1 ; then
|
||||||
sudo $0 $*
|
sudo "$0" "$@"
|
||||||
exit
|
exit
|
||||||
fi
|
fi
|
||||||
echo "Sorry, this requires root." >&2
|
echo "Sorry, this requires root." >&2
|
||||||
|
|||||||
7
bin/update_skel
Executable file
7
bin/update_skel
Executable file
@@ -0,0 +1,7 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
set -e
|
||||||
|
SKEL_DIR=$(dirname -- "$(readlink -f -- "$HOME/.profile")")
|
||||||
|
cd -- "$SKEL_DIR"
|
||||||
|
cd -- "$(git rev-parse --show-toplevel)"
|
||||||
|
git pull
|
||||||
|
./install.sh
|
||||||
69
clone.sh
Executable file
69
clone.sh
Executable file
@@ -0,0 +1,69 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
set -ue
|
||||||
|
|
||||||
|
# --- Helper function to install git ---
|
||||||
|
install_git() {
|
||||||
|
echo "Git not found. Attempting to install..." >&2
|
||||||
|
case "$(uname)" in
|
||||||
|
Darwin)
|
||||||
|
if command -v brew >/dev/null 2>&1; then
|
||||||
|
echo "Using Homebrew to install git..." >&2
|
||||||
|
brew install git
|
||||||
|
else
|
||||||
|
echo "Error: Homebrew not found on your macOS system." >&2
|
||||||
|
echo "Please install Homebrew first by visiting https://brew.sh/ then run this script again." >&2
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
Linux)
|
||||||
|
if command -v apt-get >/dev/null 2>&1; then
|
||||||
|
echo "Using apt-get to install git..." >&2
|
||||||
|
if [ "${EUID:-$(id -u)}" -ne 0 ]; then
|
||||||
|
sudo apt-get update && sudo apt-get install -y git
|
||||||
|
else
|
||||||
|
apt-get update && apt-get install -y git
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
echo "Error: This script requires 'apt-get' on Linux to install git." >&2
|
||||||
|
echo "Please install git using your system's package manager and run this script again." >&2
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
echo "Error: Unsupported operating system '$(uname)'." >&2
|
||||||
|
echo "Please install git manually and run this script again." >&2
|
||||||
|
return 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
}
|
||||||
|
|
||||||
|
# --- Main script logic ---
|
||||||
|
installer_main() {
|
||||||
|
# 1. Check for git, and try to install it if it's missing.
|
||||||
|
if ! command -v git >/dev/null 2>&1; then
|
||||||
|
install_git
|
||||||
|
# Final check after attempting installation
|
||||||
|
if ! command -v git >/dev/null 2>&1; then
|
||||||
|
echo "ERROR: git installation failed or was not found." >&2
|
||||||
|
echo "Please install git manually and re-run this script." >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 2. Clone the repository if it doesn't exist
|
||||||
|
local dest="${HOME}/.skel"
|
||||||
|
if [ -d "${dest}" ]; then
|
||||||
|
echo "Repository already exists in ${dest}. Skipping clone." >&2
|
||||||
|
else
|
||||||
|
echo "Cloning repository..." >&2
|
||||||
|
git clone --depth 1 https://github.com/Matir/skel.git "${dest}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 3. Run the main installer
|
||||||
|
echo "Running main installer..." >&2
|
||||||
|
"${dest}/install.sh"
|
||||||
|
}
|
||||||
|
|
||||||
|
installer_main
|
||||||
|
|
||||||
10
conf/logid.cfg
Normal file
10
conf/logid.cfg
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
devices: ({
|
||||||
|
name: "Wireless Mouse MX Master 3";
|
||||||
|
|
||||||
|
smartshift: {
|
||||||
|
on: true;
|
||||||
|
threshold: 30;
|
||||||
|
};
|
||||||
|
|
||||||
|
dpi: 1500;
|
||||||
|
});
|
||||||
16
darwin-env.plist
Normal file
16
darwin-env.plist
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||||
|
<plist version="1.0">
|
||||||
|
<dict>
|
||||||
|
<key>Label</key>
|
||||||
|
<string>com.user.loadvars</string>
|
||||||
|
<key>ProgramArguments</key>
|
||||||
|
<array>
|
||||||
|
<string>/bin/sh</string>
|
||||||
|
<string>-c</string>
|
||||||
|
<string>~/bin/darwin-env.sh || true</string>
|
||||||
|
</array>
|
||||||
|
<key>RunAtLoad</key>
|
||||||
|
<true/>
|
||||||
|
</dict>
|
||||||
|
</plist>
|
||||||
1
dotfile_overlays/README
Normal file
1
dotfile_overlays/README
Normal file
@@ -0,0 +1 @@
|
|||||||
|
Each directory in this directory will be symlinked as dotfiles.
|
||||||
1
dotfiles/Xkbmap
Normal file
1
dotfiles/Xkbmap
Normal file
@@ -0,0 +1 @@
|
|||||||
|
-option ctrl:nocaps -option compose:ralt
|
||||||
@@ -3,8 +3,8 @@ Xcursor.size: 16
|
|||||||
!!!
|
!!!
|
||||||
! Xft for fonts
|
! Xft for fonts
|
||||||
!!!
|
!!!
|
||||||
Xft.dpi: 96
|
!Xft.dpi: 144
|
||||||
Xft.antialias: false
|
Xft.antialias: true
|
||||||
Xft.lcdfilter: lcddefault
|
Xft.lcdfilter: lcddefault
|
||||||
Xft.rgba: rgb
|
Xft.rgba: rgb
|
||||||
Xft.hinting: true
|
Xft.hinting: true
|
||||||
@@ -27,21 +27,34 @@ URxvt.lineSpace: 0
|
|||||||
URxvt.iso14755: false
|
URxvt.iso14755: false
|
||||||
|
|
||||||
! Fonts
|
! Fonts
|
||||||
URxvt*font: xft:inconsolata:pixelsize=16
|
URxvt.font: xft:inconsolata:pixelsize=17,xft:monospace:size=12
|
||||||
|
|
||||||
! Fix font space
|
! Fix font space
|
||||||
URxvt*letterSpace: -1
|
URxvt.letterSpace: -1
|
||||||
|
|
||||||
! Scrollbar
|
! Scrollbar and scrolling
|
||||||
URxvt.scrollStyle: rxvt
|
URxvt.scrollStyle: rxvt
|
||||||
URxvt.scrollBar: false
|
URxvt.scrollBar: false
|
||||||
|
! do not scroll with output
|
||||||
|
URxvt.scrollTtyOutput: false
|
||||||
|
! scroll in relation to buffer (with mouse scroll or Shift+Page Up)
|
||||||
|
URxvt.scrollWithBuffer: true
|
||||||
|
! scroll back to the bottom on keypress
|
||||||
|
URxvt.scrollTtyKeypress: true
|
||||||
|
|
||||||
|
! Allow apps to manage their own secondary screen
|
||||||
|
URxvt.secondaryScreen: 1
|
||||||
|
URxvt.secondaryScroll: 0
|
||||||
|
|
||||||
! Perl extensions
|
! Perl extensions
|
||||||
URxvt.perl-ext-common: default,matcher,resize-font
|
URxvt.perl-ext-common: default,matcher,font-size,eval
|
||||||
URxvt.matcher.button: 1
|
URxvt.matcher.button: 1
|
||||||
URxvt.urlLauncher: /usr/bin/xdg-open
|
URxvt.urlLauncher: /usr/bin/xdg-open
|
||||||
URxvt.resize-font.smaller: C-Down
|
URxvt.url-launcher: /usr/bin/xdg-open
|
||||||
URxvt.resize-font.bigger: C-Up
|
|
||||||
|
! Copy/Paste Stuff
|
||||||
|
URxvt.keysym.Shift-Control-V: eval:paste_clipboard
|
||||||
|
URxvt.keysym.Shift-Control-C: eval:selection_to_clipboard
|
||||||
|
|
||||||
! Cursor
|
! Cursor
|
||||||
URxvt.cursorBlink: true
|
URxvt.cursorBlink: true
|
||||||
@@ -50,12 +63,21 @@ URxvt.cursorUnderline: false
|
|||||||
! Pointer
|
! Pointer
|
||||||
URxvt.pointerBlank: true
|
URxvt.pointerBlank: true
|
||||||
|
|
||||||
! Solarized colors begin
|
! Disable printing the terminal contents when pressing PrintScreen.
|
||||||
|
URxvt.print-pipe: "cat > /dev/null"
|
||||||
|
|
||||||
|
!!! Solarized colors begin
|
||||||
|
! base03
|
||||||
URxvt.background: #002b36
|
URxvt.background: #002b36
|
||||||
URxvt.foreground: #657b83
|
! base0
|
||||||
|
URxvt.foreground: #839496
|
||||||
|
! base03
|
||||||
URxvt.fadeColor: #002b36
|
URxvt.fadeColor: #002b36
|
||||||
|
! base1
|
||||||
URxvt.cursorColor: #93a1a1
|
URxvt.cursorColor: #93a1a1
|
||||||
|
! base01
|
||||||
URxvt.pointerColorBackground: #586e75
|
URxvt.pointerColorBackground: #586e75
|
||||||
|
! base1
|
||||||
URxvt.pointerColorForeground: #93a1a1
|
URxvt.pointerColorForeground: #93a1a1
|
||||||
|
|
||||||
!! black dark/light
|
!! black dark/light
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
--follow
|
--follow
|
||||||
--pager=less -LMXRF
|
--pager=less -LMXRF
|
||||||
--smart-case
|
--smart-case
|
||||||
|
--ignore-dir=match:bazel-.*
|
||||||
|
|||||||
@@ -1,20 +1,8 @@
|
|||||||
# General aliases, should only be sourced in interactive shells
|
# General aliases, should only be sourced in interactive shells
|
||||||
|
# Try to keep in sync with ~/.config/fish/conf.d/aliases.fish
|
||||||
# Add an "alert" alias for long running commands. Use like so:
|
|
||||||
# sleep 10; alert
|
|
||||||
alias alert='notify-send --urgency=low -i "$([ $? = 0 ] && echo terminal || echo error)" "$(history|tail -n1|sed -e '\''s/^\s*[0-9]\+\s*//;s/[;&|]\s*alert$//'\'')"'
|
|
||||||
|
|
||||||
# Cryptsetup alias
|
# Cryptsetup alias
|
||||||
alias luksFormat='cryptsetup luksFormat -s 512 -c aes-xts-plain64 -h sha256 -i 15000'
|
alias luksFormat='cryptsetup luksFormat --type=luks2 --pbkdf-memory=2560000 --pbkdf=argon2id -i 15000 -s 512 -h sha256 -c aes-xts-plain64'
|
||||||
|
|
||||||
# Colors
|
|
||||||
alias ls='ls --color=auto'
|
|
||||||
alias grep='grep --color=auto'
|
|
||||||
alias egrep='egrep --color=auto'
|
|
||||||
alias fgrep='fgrep --color=auto'
|
|
||||||
|
|
||||||
# Easy upgrade
|
|
||||||
alias dist-upgrade="sudo sh -c 'apt-get update && apt-get -y dist-upgrade'"
|
|
||||||
|
|
||||||
# Timestamp in a machine-sortable form
|
# Timestamp in a machine-sortable form
|
||||||
alias tstamp="date '+%Y%m%d-%H%M%S'"
|
alias tstamp="date '+%Y%m%d-%H%M%S'"
|
||||||
@@ -25,11 +13,38 @@ alias mdcode="sed 's/^/ /'"
|
|||||||
# Intel format plz
|
# Intel format plz
|
||||||
alias objdump="command objdump -M intel"
|
alias objdump="command objdump -M intel"
|
||||||
|
|
||||||
# Launch chrome for burp
|
|
||||||
alias chrome-for-burp="/usr/bin/google-chrome --ignore-certificate-errors --user-data-dir=${HOME}/.chrome-for-burp --proxy-server=127.0.0.1:8080 >/dev/null 2>&1 &"
|
|
||||||
|
|
||||||
# Useful directory utilities
|
|
||||||
alias dircount="for d in * ; do find \$d -type d | wc -l | tr -d '\n' ; echo ' ' \$d ; done | sort -n"
|
|
||||||
|
|
||||||
# Drop caches for swap issues
|
# Drop caches for swap issues
|
||||||
alias drop_caches="echo 3 | sudo /usr/bin/tee /proc/sys/vm/drop_caches"
|
alias drop_caches="echo 3 | sudo /usr/bin/tee /proc/sys/vm/drop_caches"
|
||||||
|
|
||||||
|
# dump acpi temperature
|
||||||
|
alias gettemp='printf "%02.2f\n" "$(cat /sys/class/thermal/thermal_zone0/temp)e-3"'
|
||||||
|
|
||||||
|
# get git working directory
|
||||||
|
alias gitroot="git rev-parse --show-toplevel"
|
||||||
|
|
||||||
|
# SSH without host key checking
|
||||||
|
alias sshanon="ssh -oUserKnownHostsFile=/dev/null -oStrictHostKeyChecking=no"
|
||||||
|
|
||||||
|
# Straight to ipython
|
||||||
|
alias ipy="ipython3 --no-banner"
|
||||||
|
|
||||||
|
# Skip the header on bc
|
||||||
|
alias bc="command bc -q"
|
||||||
|
|
||||||
|
# Get a decently readable df
|
||||||
|
alias dfh="df -h -x tmpfs -x devtmpfs -x squashfs -x fuse -x efivarfs"
|
||||||
|
|
||||||
|
# Clear the GPG agent
|
||||||
|
alias clear-gpg-agent="echo RELOADAGENT | gpg-connect-agent"
|
||||||
|
|
||||||
|
# Battery details
|
||||||
|
alias bat-details='upower -i $(upower -e | grep battery)'
|
||||||
|
|
||||||
|
# Nvidia refresh rate
|
||||||
|
alias nvidia-refresh-rate='nvidia-settings --display=:0 -q RefreshRate -t'
|
||||||
|
|
||||||
|
# Earthly ssh
|
||||||
|
alias earthly='earthly --ssh-auth-sock ""'
|
||||||
|
|
||||||
|
# to clipboard
|
||||||
|
alias toclip='xclip -selection clipboard'
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
# Load env first
|
# Load env first
|
||||||
if [ -f $HOME/.env ] ; then source $HOME/.env ; fi
|
if [ -f $HOME/.shenv ] ; then source $HOME/.shenv ; fi
|
||||||
|
|
||||||
# History settings
|
# History settings
|
||||||
HISTCONTROL=ignoredups:ignorespace
|
HISTCONTROL=ignoredups:ignorespace
|
||||||
|
|||||||
15
dotfiles/config/Code/User/settings.json
Normal file
15
dotfiles/config/Code/User/settings.json
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
{
|
||||||
|
"editor.accessibilitySupport": "off",
|
||||||
|
"telemetry.telemetryLevel": "off",
|
||||||
|
"dotfiles.repository": "matir/skel",
|
||||||
|
"dotfiles.targetPath": "~/.skel",
|
||||||
|
"remote.defaultExtensionsIfInstalledLocally": [],
|
||||||
|
"mise.configureExtensionsAutomatically": true,
|
||||||
|
"kilo-code.debug": false,
|
||||||
|
"kilo-code.allowedCommands": [
|
||||||
|
"git log",
|
||||||
|
"git diff",
|
||||||
|
"git show"
|
||||||
|
],
|
||||||
|
"kilo-code.deniedCommands": []
|
||||||
|
}
|
||||||
5
dotfiles/config/direnv/lib/mise.sh
Normal file
5
dotfiles/config/direnv/lib/mise.sh
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
if command -v mise ; then
|
||||||
|
use_mise() {
|
||||||
|
eval "$(mise direnv activate)"
|
||||||
|
}
|
||||||
|
fi
|
||||||
16
dotfiles/config/direnv/lib/python.sh
Normal file
16
dotfiles/config/direnv/lib/python.sh
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
layout_python() {
|
||||||
|
local DIR_NAME="$(basename $(pwd))"
|
||||||
|
VIRTUAL_ENV="${VIRTUAL_ENV:-$(pwd)/.venv/${DIR_NAME}}"
|
||||||
|
local PYBIN="$(command -v python 2>/dev/null || command -v python3 2>/dev/null)"
|
||||||
|
if [[ -z "${PYBIN}" ]]; then
|
||||||
|
log_error "No python found!"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
if [[ ! -d $VIRTUAL_ENV ]]; then
|
||||||
|
log_status "No virtual environment exists. Executing \`${PYBIN} -m venv ${VIRTUAL_ENV}\`."
|
||||||
|
"${PYBIN}" -m venv "${VIRTUAL_ENV}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Activate the virtual environment
|
||||||
|
. $VIRTUAL_ENV/bin/activate
|
||||||
|
}
|
||||||
77
dotfiles/config/fish/conf.d/aliases.fish
Normal file
77
dotfiles/config/fish/conf.d/aliases.fish
Normal file
@@ -0,0 +1,77 @@
|
|||||||
|
# Cryptsetup alias
|
||||||
|
alias luksFormat 'cryptsetup luksFormat --type=luks2 --pbkdf-memory=2560000 --pbkdf=argon2id -i 15000 -s 512 -h sha256 -c aes-xts-plain64'
|
||||||
|
|
||||||
|
# Timestamp in a machine-sortable form
|
||||||
|
alias tstamp "date '+%Y%m%d-%H%M%S'"
|
||||||
|
|
||||||
|
# Prepare code for markdown
|
||||||
|
alias mdcode "sed 's/^/ /'"
|
||||||
|
|
||||||
|
# Intel format plz
|
||||||
|
alias objdump "command objdump -M intel"
|
||||||
|
|
||||||
|
# Drop caches for swap issues
|
||||||
|
alias drop_caches "echo 3 | sudo /usr/bin/tee /proc/sys/vm/drop_caches"
|
||||||
|
|
||||||
|
# dump acpi temperature
|
||||||
|
alias gettemp 'printf "%02.2f\n" (cat /sys/class/thermal/thermal_zone0/temp)e-3'
|
||||||
|
|
||||||
|
# get git working directory
|
||||||
|
alias gitroot "git rev-parse --show-toplevel"
|
||||||
|
|
||||||
|
# SSH without host key checking
|
||||||
|
alias sshanon "ssh -oUserKnownHostsFile=/dev/null -oStrictHostKeyChecking=no"
|
||||||
|
|
||||||
|
# Straight to ipython
|
||||||
|
alias ipy "ipython3 --no-banner"
|
||||||
|
|
||||||
|
# Skip the header on bc
|
||||||
|
alias bc "command bc -q"
|
||||||
|
|
||||||
|
# Get a decently readable df
|
||||||
|
alias dfh "df -h -x tmpfs -x devtmpfs -x squashfs -x fuse -x efivarfs"
|
||||||
|
|
||||||
|
# Clear the GPG agent
|
||||||
|
alias clear-gpg-agent "echo RELOADAGENT | gpg-connect-agent"
|
||||||
|
|
||||||
|
# Battery details
|
||||||
|
alias bat-details 'upower -i (upower -e | grep battery)'
|
||||||
|
|
||||||
|
# Nvidia refresh rate
|
||||||
|
alias nvidia-refresh-rate 'nvidia-settings --display=:0 -q RefreshRate -t'
|
||||||
|
|
||||||
|
# Earthly ssh
|
||||||
|
alias earthly 'earthly --ssh-auth-sock ""'
|
||||||
|
|
||||||
|
# to clipboard
|
||||||
|
alias toclip 'xclip -selection clipboard'
|
||||||
|
|
||||||
|
# On some systems, bat is batcat
|
||||||
|
if not command -v bat >/dev/null 2>&1
|
||||||
|
if command -v batcat >/dev/null 2>&1
|
||||||
|
alias bat (command -v batcat)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
# FFUF aliases
|
||||||
|
if command -v ffuf >/dev/null 2>&1
|
||||||
|
if test -d $HOME/tools/seclists
|
||||||
|
alias ffuf-files "ffuf -c -w $HOME/tools/seclists/Discovery/Web-Content/raft-large-files.txt"
|
||||||
|
alias ffuf-dirs "ffuf -c -w $HOME/tools/seclists/Discovery/Web-Content/raft-large-directories.txt"
|
||||||
|
alias ffuf-quick "ffuf -c -w $HOME/tools/seclists/Discovery/Web-Content/quickhits.txt"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
if grep --help 2>/dev/null | grep -q 'color'
|
||||||
|
# Should have a better way to check for GNU versions
|
||||||
|
alias grep 'grep --color=auto'
|
||||||
|
alias egrep 'egrep --color=auto'
|
||||||
|
alias fgrep 'fgrep --color=auto'
|
||||||
|
end
|
||||||
|
|
||||||
|
# Detect which `ls` flavor is in use and use the right flag for colors.
|
||||||
|
if ls --help 2>&1 | grep -q -- '--color'
|
||||||
|
alias ls 'ls --color=auto' # GNU `ls`
|
||||||
|
else if test (uname) = "Darwin"
|
||||||
|
alias ls 'ls -G' # macOS `ls`
|
||||||
|
end
|
||||||
14
dotfiles/config/fish/conf.d/fish_frozen_key_bindings.fish
Normal file
14
dotfiles/config/fish/conf.d/fish_frozen_key_bindings.fish
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
# This file was created by fish when upgrading to version 4.3, to migrate
|
||||||
|
# the 'fish_key_bindings' variable from its old default scope (universal)
|
||||||
|
# to its new default scope (global). We recommend you delete this file
|
||||||
|
# and configure key bindings in ~/.config/fish/config.fish if needed.
|
||||||
|
|
||||||
|
# set --global fish_key_bindings fish_default_key_bindings
|
||||||
|
|
||||||
|
# Prior to version 4.3, fish shipped an event handler that runs
|
||||||
|
# `set --universal fish_key_bindings fish_default_key_bindings`
|
||||||
|
# whenever the fish_key_bindings variable is erased.
|
||||||
|
# This means that as long as any fish < 4.3 is still running on this system,
|
||||||
|
# we cannot complete the migration.
|
||||||
|
# As a workaround, erase the universal variable at every shell startup.
|
||||||
|
set --erase --universal fish_key_bindings
|
||||||
48
dotfiles/config/fish/conf.d/fish_frozen_theme.fish
Normal file
48
dotfiles/config/fish/conf.d/fish_frozen_theme.fish
Normal file
@@ -0,0 +1,48 @@
|
|||||||
|
# This file was created by fish when upgrading to version 4.3, to migrate
|
||||||
|
# theme variables from universal to global scope.
|
||||||
|
# Don't edit this file, as it will be written by the web-config tool (`fish_config`).
|
||||||
|
# To customize your theme, delete this file and see
|
||||||
|
# help interactive#syntax-highlighting
|
||||||
|
# or
|
||||||
|
# man fish-interactive | less +/^SYNTAX.HIGHLIGHTING
|
||||||
|
# for appropriate commands to add to ~/.config/fish/config.fish instead.
|
||||||
|
# See also the release notes for fish 4.3.0 (run `help relnotes`).
|
||||||
|
|
||||||
|
set --global fish_color_autosuggestion 4D5566
|
||||||
|
set --global fish_color_cancel --reverse
|
||||||
|
set --global fish_color_command 39BAE6
|
||||||
|
set --global fish_color_comment 626A73
|
||||||
|
set --global fish_color_cwd 59C2FF
|
||||||
|
set --global fish_color_cwd_root red
|
||||||
|
set --global fish_color_end F29668
|
||||||
|
set --global fish_color_error FF3333
|
||||||
|
set --global fish_color_escape 95E6CB
|
||||||
|
set --global fish_color_history_current --bold
|
||||||
|
set --global fish_color_host normal
|
||||||
|
set --global fish_color_host_remote yellow
|
||||||
|
set --global fish_color_keyword 39BAE6
|
||||||
|
set --global fish_color_match F07178
|
||||||
|
set --global fish_color_normal B3B1AD
|
||||||
|
set --global fish_color_operator E6B450
|
||||||
|
set --global fish_color_option B3B1AD
|
||||||
|
set --global fish_color_param B3B1AD
|
||||||
|
set --global fish_color_quote C2D94C
|
||||||
|
set --global fish_color_redirection FFEE99
|
||||||
|
set --global fish_color_search_match --background=E6B450
|
||||||
|
set --global fish_color_selection --background=E6B450
|
||||||
|
set --global fish_color_status red
|
||||||
|
set --global fish_color_user brgreen
|
||||||
|
set --global fish_color_valid_path --underline
|
||||||
|
set --global fish_pager_color_background
|
||||||
|
set --global fish_pager_color_completion normal
|
||||||
|
set --global fish_pager_color_description B3A06D
|
||||||
|
set --global fish_pager_color_prefix normal --bold --underline
|
||||||
|
set --global fish_pager_color_progress brwhite --background=cyan
|
||||||
|
set --global fish_pager_color_secondary_background
|
||||||
|
set --global fish_pager_color_secondary_completion
|
||||||
|
set --global fish_pager_color_secondary_description
|
||||||
|
set --global fish_pager_color_secondary_prefix
|
||||||
|
set --global fish_pager_color_selected_background --background=E6B450
|
||||||
|
set --global fish_pager_color_selected_completion
|
||||||
|
set --global fish_pager_color_selected_description
|
||||||
|
set --global fish_pager_color_selected_prefix
|
||||||
34
dotfiles/config/fish/config.fish
Normal file
34
dotfiles/config/fish/config.fish
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
if test -x /opt/homebrew/bin/brew
|
||||||
|
/opt/homebrew/bin/brew shellenv fish | source
|
||||||
|
if test -d (brew --prefix)"/share/fish/completions"
|
||||||
|
set -p fish_complete_path (brew --prefix)/share/fish/completions
|
||||||
|
end
|
||||||
|
|
||||||
|
if test -d (brew --prefix)"/share/fish/vendor_completions.d"
|
||||||
|
set -p fish_complete_path (brew --prefix)/share/fish/vendor_completions.d
|
||||||
|
end
|
||||||
|
|
||||||
|
# mise, if installed
|
||||||
|
if type -q mise
|
||||||
|
mise activate fish | source
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
if command -q starship
|
||||||
|
starship init fish --print-full-init | source
|
||||||
|
end
|
||||||
|
|
||||||
|
function install_fisher
|
||||||
|
if not test -e ~/.config/fish/functions/fisher.fish
|
||||||
|
echo "Installing Fisher for fish shell..."
|
||||||
|
curl -sL https://raw.githubusercontent.com/jorgebucaran/fisher/main/functions/fisher.fish | source
|
||||||
|
fisher install jorgebucaran/fisher
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
if status --is-interactive
|
||||||
|
install_fisher
|
||||||
|
end
|
||||||
|
|
||||||
|
# Want this at the bottom to put this path first
|
||||||
|
fish_add_path --move --path {$HOME}/bin
|
||||||
2
dotfiles/config/fish/fish_plugins
Normal file
2
dotfiles/config/fish/fish_plugins
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
jorgebucaran/fisher
|
||||||
|
wfxr/forgit
|
||||||
8
dotfiles/config/fish/functions/cdgr.fish
Normal file
8
dotfiles/config/fish/functions/cdgr.fish
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
# Change to the root of the git repository.
|
||||||
|
# If not in a git repo, do nothing.
|
||||||
|
function cdgr
|
||||||
|
set git_root (git rev-parse --show-toplevel 2>/dev/null)
|
||||||
|
if test -n "$git_root"
|
||||||
|
cd "$git_root"
|
||||||
|
end
|
||||||
|
end
|
||||||
15
dotfiles/config/gemini/settings.json
Normal file
15
dotfiles/config/gemini/settings.json
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
{
|
||||||
|
"editor": {
|
||||||
|
"mode": "vim"
|
||||||
|
},
|
||||||
|
"context": {
|
||||||
|
"includeFiles": [
|
||||||
|
"/usr/local/google/home/davidtomaschik/.skel/GEMINI.md",
|
||||||
|
"/usr/local/google/home/davidtomaschik/.skel/AGENTS.md"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"experimental": {
|
||||||
|
"skills": true,
|
||||||
|
"planMode": true
|
||||||
|
}
|
||||||
|
}
|
||||||
12
dotfiles/config/gh/config.yml
Normal file
12
dotfiles/config/gh/config.yml
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
# What protocol to use when performing git operations. Supported values: ssh, https
|
||||||
|
git_protocol: https
|
||||||
|
# What editor gh should run when creating issues, pull requests, etc. If blank, will refer to environment.
|
||||||
|
editor: !!null vim
|
||||||
|
# When to interactively prompt. This is a global config that cannot be overridden by hostname. Supported values: enabled, disabled
|
||||||
|
prompt: enabled
|
||||||
|
# A pager program to send command output to, e.g. "less". Set the value to "cat" to disable the pager.
|
||||||
|
pager: !!null less -R
|
||||||
|
# Aliases allow you to create nicknames for gh commands
|
||||||
|
aliases:
|
||||||
|
co: pr checkout
|
||||||
|
version: "1"
|
||||||
64
dotfiles/config/htop/htoprc
Normal file
64
dotfiles/config/htop/htoprc
Normal file
@@ -0,0 +1,64 @@
|
|||||||
|
# Beware! This file is rewritten by htop when settings are changed in the interface.
|
||||||
|
# The parser is also very primitive, and not human-friendly.
|
||||||
|
htop_version=3.4.1-3.4.1
|
||||||
|
config_reader_min_version=3
|
||||||
|
fields=0 48 17 18 38 39 40 2 46 47 49 1
|
||||||
|
hide_kernel_threads=1
|
||||||
|
hide_userland_threads=1
|
||||||
|
hide_running_in_container=0
|
||||||
|
shadow_other_users=0
|
||||||
|
show_thread_names=0
|
||||||
|
show_program_path=1
|
||||||
|
highlight_base_name=0
|
||||||
|
highlight_deleted_exe=1
|
||||||
|
shadow_distribution_path_prefix=0
|
||||||
|
highlight_megabytes=1
|
||||||
|
highlight_threads=1
|
||||||
|
highlight_changes=0
|
||||||
|
highlight_changes_delay_secs=5
|
||||||
|
find_comm_in_cmdline=1
|
||||||
|
strip_exe_from_cmdline=1
|
||||||
|
show_merged_command=0
|
||||||
|
header_margin=1
|
||||||
|
screen_tabs=0
|
||||||
|
detailed_cpu_time=0
|
||||||
|
cpu_count_from_one=1
|
||||||
|
show_cpu_usage=1
|
||||||
|
show_cpu_frequency=0
|
||||||
|
show_cpu_temperature=0
|
||||||
|
degree_fahrenheit=0
|
||||||
|
show_cached_memory=1
|
||||||
|
update_process_names=0
|
||||||
|
account_guest_in_cpu_meter=0
|
||||||
|
color_scheme=6
|
||||||
|
enable_mouse=1
|
||||||
|
delay=15
|
||||||
|
hide_function_bar=0
|
||||||
|
header_layout=two_50_50
|
||||||
|
column_meters_0=AllCPUs Memory Swap
|
||||||
|
column_meter_modes_0=1 1 1
|
||||||
|
column_meters_1=Tasks LoadAverage Uptime
|
||||||
|
column_meter_modes_1=2 2 2
|
||||||
|
tree_view=0
|
||||||
|
sort_key=46
|
||||||
|
tree_sort_key=0
|
||||||
|
sort_direction=-1
|
||||||
|
tree_sort_direction=1
|
||||||
|
tree_view_always_by_pid=0
|
||||||
|
all_branches_collapsed=0
|
||||||
|
screen:Main=PID USER PRIORITY NICE M_VIRT M_RESIDENT M_SHARE STATE PERCENT_CPU PERCENT_MEM TIME Command
|
||||||
|
.sort_key=PERCENT_CPU
|
||||||
|
.tree_sort_key=PID
|
||||||
|
.tree_view_always_by_pid=0
|
||||||
|
.tree_view=0
|
||||||
|
.sort_direction=-1
|
||||||
|
.tree_sort_direction=1
|
||||||
|
.all_branches_collapsed=0
|
||||||
|
screen:I/O=PID USER IO_PRIORITY IO_RATE IO_READ_RATE IO_WRITE_RATE PERCENT_SWAP_DELAY PERCENT_IO_DELAY Command
|
||||||
|
.sort_key=IO_RATE
|
||||||
|
.tree_sort_key=PID
|
||||||
|
.tree_view_always_by_pid=0
|
||||||
|
.tree_view=0
|
||||||
|
.sort_direction=-1
|
||||||
|
.tree_sort_direction=1
|
||||||
|
.all_branches_collapsed=0
|
||||||
@@ -87,6 +87,10 @@ bindsym $mod+Shift+8 move container to workspace 8
|
|||||||
bindsym $mod+Shift+9 move container to workspace 9
|
bindsym $mod+Shift+9 move container to workspace 9
|
||||||
bindsym $mod+Shift+0 move container to workspace 10
|
bindsym $mod+Shift+0 move container to workspace 10
|
||||||
|
|
||||||
|
# do some scratchpad
|
||||||
|
bindsym $mod+Shift+minus move scratchpad
|
||||||
|
bindsym $mod+minus scratchpad show
|
||||||
|
|
||||||
# Move workspaces between monitors
|
# Move workspaces between monitors
|
||||||
bindsym $mod+Shift+greater move workspace to output right
|
bindsym $mod+Shift+greater move workspace to output right
|
||||||
bindsym $mod+Shift+less move workspace to output left
|
bindsym $mod+Shift+less move workspace to output left
|
||||||
@@ -130,10 +134,13 @@ bindsym $alt+Control+Left workspace prev
|
|||||||
|
|
||||||
# i3 lock
|
# i3 lock
|
||||||
exec --no-startup-id ~/bin/i3lock.sh &
|
exec --no-startup-id ~/bin/i3lock.sh &
|
||||||
|
exec --no-startup-id xset dpms 600
|
||||||
bindsym $mod+l exec \
|
bindsym $mod+l exec \
|
||||||
bash -c "i3lock -c 000000 -d && (sleep 2 && xset dpms force off) &"
|
bash -c "i3lock -c 000000 && (sleep 2 && xset dpms force off) &"
|
||||||
bindsym $alt+Control+l exec \
|
bindsym $alt+Control+l exec \
|
||||||
bash -c "i3lock -c 000000 -d && (sleep 2 && xset dpms force off) &"
|
bash -c "i3lock -c 000000 && (sleep 2 && xset dpms force off) &"
|
||||||
|
# suspend under systemd
|
||||||
|
bindsym $mod+Control+s exec --no-startup-id systemctl suspend
|
||||||
|
|
||||||
# things to start quickly
|
# things to start quickly
|
||||||
bindsym $mod+g exec /usr/bin/google-chrome-beta --password-store=gnome
|
bindsym $mod+g exec /usr/bin/google-chrome-beta --password-store=gnome
|
||||||
@@ -145,38 +152,33 @@ bindsym --whole-window $mod+button3 floating toggle
|
|||||||
|
|
||||||
# media keys
|
# media keys
|
||||||
# Pulse Audio controls
|
# Pulse Audio controls
|
||||||
bindsym XF86AudioRaiseVolume exec --no-startup-id pactl set-sink-volume 0 +5%
|
bindsym XF86AudioRaiseVolume exec --no-startup-id ~/bin/pactl_helper volume +5%
|
||||||
bindsym XF86AudioLowerVolume exec --no-startup-id pactl set-sink-volume 0 -5%
|
bindsym XF86AudioLowerVolume exec --no-startup-id ~/bin/pactl_helper volume -5%
|
||||||
bindsym XF86AudioMute exec --no-startup-id pactl set-sink-mute 0 toggle
|
bindsym XF86AudioMute exec --no-startup-id ~/bin/pactl_helper mute toggle
|
||||||
|
bindsym XF86AudioMicMute exec --no-startup-id ~/bin/pactl_helper micmute toggle
|
||||||
|
bindsym F13 exec --no-startup-id ~/bin/pactl_helper micmute toggle
|
||||||
# Screen brightness controls
|
# Screen brightness controls
|
||||||
bindsym XF86MonBrightnessUp exec --no-startup-id xbacklight -inc 10
|
bindsym XF86MonBrightnessUp exec --no-startup-id xbacklight -inc 10
|
||||||
bindsym XF86MonBrightnessDown exec --no-startup-id xbacklight -dec 10
|
bindsym XF86MonBrightnessDown exec --no-startup-id xbacklight -dec 10
|
||||||
|
|
||||||
# screenshots
|
# screenshots
|
||||||
set $scrotformat %F-%T.png
|
# region/selection
|
||||||
set $screendir ~/Pictures/Screenshots
|
|
||||||
# whole screen
|
|
||||||
bindsym --release Print exec --no-startup-id \
|
bindsym --release Print exec --no-startup-id \
|
||||||
mkdir -p $screendir && \
|
~/bin/screenshot.sh region
|
||||||
/usr/bin/scrot $screendir/$scrotformat
|
# full screen
|
||||||
# current window
|
|
||||||
bindsym --release Shift+Print exec --no-startup-id \
|
bindsym --release Shift+Print exec --no-startup-id \
|
||||||
mkdir -p $screendir && \
|
~/bin/screenshot.sh full
|
||||||
/usr/bin/scrot -u $screendir/$scrotformat
|
# single window
|
||||||
# selection
|
|
||||||
bindsym --release $alt+Sys_Req exec --no-startup-id \
|
bindsym --release $alt+Sys_Req exec --no-startup-id \
|
||||||
mkdir -p $screendir && \
|
~/bin/screenshot.sh window
|
||||||
/usr/bin/scrot -s $screendir/$scrotformat
|
|
||||||
|
|
||||||
# useful utilities
|
# useful utilities
|
||||||
exec --no-startup-id \
|
|
||||||
(which xss-lock >/dev/null || /usr/bin/cinnamon-settings-daemon) &
|
|
||||||
exec --no-startup-id gnome-keyring-daemon --start --components=pkcs11,secrets
|
exec --no-startup-id gnome-keyring-daemon --start --components=pkcs11,secrets
|
||||||
# Make GTK fonts look great again
|
|
||||||
exec --no-startup-id gnome-settings-daemon
|
|
||||||
exec --no-startup-id (sleep 2; nm-applet) &
|
|
||||||
exec --no-startup-id xset r rate 200 20
|
exec --no-startup-id xset r rate 200 20
|
||||||
exec --no-startup-id ~/bin/autostart.py
|
#exec --no-startup-id ~/bin/autostart.py
|
||||||
|
exec --no-startup-id dex --autostart --environment x-cinnamon
|
||||||
|
# Solaar for mouse
|
||||||
|
exec --no-startup-id sh -c 'command solaar -w hide || true'
|
||||||
|
|
||||||
# customize windows
|
# customize windows
|
||||||
for_window [window_role="pop-up"] floating enable
|
for_window [window_role="pop-up"] floating enable
|
||||||
|
|||||||
@@ -45,6 +45,17 @@ function wireless {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function wired {
|
function wired {
|
||||||
|
local def_iface="$(ip route get 1.1.1.1 2>&1 | grep -oP 'dev \K\S+')"
|
||||||
|
if test -n "${def_iface}" ; then
|
||||||
|
cat <<-EOF
|
||||||
|
ethernet "${def_iface}" {
|
||||||
|
format_up = "E: %ip"
|
||||||
|
format_down = "E: down"
|
||||||
|
}
|
||||||
|
order += "ethernet ${def_iface}"
|
||||||
|
EOF
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
cat <<-EOF
|
cat <<-EOF
|
||||||
ethernet _first_ {
|
ethernet _first_ {
|
||||||
format_up = "E: %ip"
|
format_up = "E: %ip"
|
||||||
|
|||||||
20
dotfiles/config/mise/config.toml
Normal file
20
dotfiles/config/mise/config.toml
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
[settings]
|
||||||
|
experimental = true
|
||||||
|
|
||||||
|
[settings.pipx]
|
||||||
|
uvx = true
|
||||||
|
|
||||||
|
[settings.python]
|
||||||
|
uv_venv_auto = true
|
||||||
|
|
||||||
|
[tools]
|
||||||
|
age = "latest"
|
||||||
|
age-plugin-yubikey = "latest"
|
||||||
|
usage = "latest"
|
||||||
|
uv = "latest"
|
||||||
|
|
||||||
|
[hooks]
|
||||||
|
postinstall = "mise sync python --uv"
|
||||||
|
|
||||||
|
[env]
|
||||||
|
UV_PROJECT_ENVIRONMENT = { value='{% if env.PROJECT_SLUG %}{{ env.HOME}}/.cache/uv-venvs/{{ env.PROJECT_SLUG }}{% endif %}', tools = true }
|
||||||
4
dotfiles/config/nvim/init.vim
Normal file
4
dotfiles/config/nvim/init.vim
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
" nvim config
|
||||||
|
set runtimepath^=~/.vim runtimepath+=~/.vim/after
|
||||||
|
let &packpath = &runtimepath
|
||||||
|
source ~/.vimrc
|
||||||
53
dotfiles/config/starship.toml
Normal file
53
dotfiles/config/starship.toml
Normal file
@@ -0,0 +1,53 @@
|
|||||||
|
"$schema" = 'https://starship.rs/config-schema.json'
|
||||||
|
|
||||||
|
[directory]
|
||||||
|
fish_style_pwd_dir_length = 1
|
||||||
|
truncate_to_repo = false
|
||||||
|
|
||||||
|
[gcloud]
|
||||||
|
symbol = "️🇬️ "
|
||||||
|
format = "on [$symbol$project]($style) "
|
||||||
|
detect_env_vars = ["STARSHIP_SHOW_GCLOUD"]
|
||||||
|
|
||||||
|
[status]
|
||||||
|
disabled = false
|
||||||
|
symbol = "⛌"
|
||||||
|
|
||||||
|
[username]
|
||||||
|
show_always = true
|
||||||
|
|
||||||
|
[ruby]
|
||||||
|
detect_variables = []
|
||||||
|
|
||||||
|
[shell]
|
||||||
|
fish_indicator = '🐟 '
|
||||||
|
zsh_indicator = ''
|
||||||
|
bash_indicator = ''
|
||||||
|
powershell_indicator = '_'
|
||||||
|
unknown_indicator = '??'
|
||||||
|
style = 'cyan bold'
|
||||||
|
disabled = false
|
||||||
|
format = '[$indicator]($style)'
|
||||||
|
|
||||||
|
[pulumi]
|
||||||
|
disabled = true
|
||||||
|
|
||||||
|
[docker_context]
|
||||||
|
# really long paths when DOCKER_HOST is set
|
||||||
|
disabled = true
|
||||||
|
|
||||||
|
[kubernetes]
|
||||||
|
disabled = false
|
||||||
|
detect_folders = ["k8s"]
|
||||||
|
|
||||||
|
[custom.gemini_context]
|
||||||
|
description = "Displays the current Gemini CLI context"
|
||||||
|
when = "test -n \"$GEMINI_CLI_HOME\""
|
||||||
|
command = """
|
||||||
|
context_dir=\"${XDG_CONFIG_HOME:-$HOME/.config}/gemini\"
|
||||||
|
if [[ \"$GEMINI_CLI_HOME\" == $context_dir/* ]]; then
|
||||||
|
basename \"$GEMINI_CLI_HOME\"
|
||||||
|
fi
|
||||||
|
"""
|
||||||
|
style = "bold blue"
|
||||||
|
format = "♊[$output](blue) "
|
||||||
15
dotfiles/config/user-dirs.dirs
Normal file
15
dotfiles/config/user-dirs.dirs
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
# This file is written by xdg-user-dirs-update
|
||||||
|
# If you want to change or add directories, just edit the line you're
|
||||||
|
# interested in. All local changes will be retained on the next run
|
||||||
|
# Format is XDG_xxx_DIR="$HOME/yyy", where yyy is a shell-escaped
|
||||||
|
# homedir-relative path, or XDG_xxx_DIR="/yyy", where /yyy is an
|
||||||
|
# absolute path. No other format is supported.
|
||||||
|
#
|
||||||
|
XDG_DESKTOP_DIR="$HOME/Desktop"
|
||||||
|
XDG_DOWNLOAD_DIR="$HOME/Downloads"
|
||||||
|
XDG_TEMPLATES_DIR="$HOME/"
|
||||||
|
XDG_PUBLICSHARE_DIR="$HOME/Shared"
|
||||||
|
XDG_DOCUMENTS_DIR="$HOME/Documents"
|
||||||
|
XDG_MUSIC_DIR="$HOME/Music"
|
||||||
|
XDG_PICTURES_DIR="$HOME/Pictures"
|
||||||
|
XDG_VIDEOS_DIR="$HOME/Videos"
|
||||||
181
dotfiles/config/wezterm/wezterm.lua
Normal file
181
dotfiles/config/wezterm/wezterm.lua
Normal file
@@ -0,0 +1,181 @@
|
|||||||
|
|
||||||
|
% Total % Received % Xferd Average Speed Time Time Time Current
|
||||||
|
Dload Upload Total Spent Left Speed
|
||||||
|
|
||||||
|
0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0-- https://wezfurlong.org/wezterm/config/files.html
|
||||||
|
-- https://alexplescan.com/posts/2024/08/10/wezterm/
|
||||||
|
-- https://github.com/wez/wezterm/issues/6112
|
||||||
|
-- https://github.com/wez/wezterm/issues/5754
|
||||||
|
local wezterm = require "wezterm"
|
||||||
|
local config = wezterm.config_builder()
|
||||||
|
local action = wezterm.action
|
||||||
|
local mux = wezterm.mux
|
||||||
|
|
||||||
|
config.audible_bell = "Disabled"
|
||||||
|
config.check_for_updates = false -- managed by brew
|
||||||
|
config.set_environment_variables = {
|
||||||
|
PATH = '/opt/homebrew/bin:/usr/local/bin/:' .. os.getenv('PATH')
|
||||||
|
}
|
||||||
|
|
||||||
|
local function scheme_for_appearance(a)
|
||||||
|
return a:find("Dark") and "Catppuccin Macchiato" or "Catppuccin Latte"
|
||||||
|
end
|
||||||
|
|
||||||
|
config.font = wezterm.font { family = 'JetBrains Mono', weight = 'Medium', harfbuzz_features = { 'calt=0', 'clig=0', 'liga=0' } }
|
||||||
|
config.font_size = 15.0
|
||||||
|
config.line_height = 1.0
|
||||||
|
config.bold_brightens_ansi_colors = true
|
||||||
|
config.color_scheme = scheme_for_appearance(wezterm.gui.get_appearance())
|
||||||
|
config.macos_window_background_blur = 20
|
||||||
|
config.window_background_opacity = 0.96
|
||||||
|
|
||||||
|
config.window_decorations = 'RESIZE|INTEGRATED_BUTTONS'
|
||||||
|
config.window_padding = { left = '0.5cell', right = '0.5cell', top = '1.5cell', bottom = '0.5cell' }
|
||||||
|
config.enable_tab_bar = true
|
||||||
|
config.use_fancy_tab_bar = false
|
||||||
|
config.tab_bar_at_bottom = true
|
||||||
|
config.tab_max_width = 32
|
||||||
|
config.show_new_tab_button_in_tab_bar = false
|
||||||
|
-- config.hide_tab_bar_if_only_one_tab = true -- sometimes procude wrong window size on maximize
|
||||||
|
|
||||||
|
config.default_cursor_style = 'BlinkingBar'
|
||||||
|
config.animation_fps = 1
|
||||||
|
config.cursor_blink_rate = 500
|
||||||
|
config.prefer_egl = true
|
||||||
|
config.max_fps = 60
|
||||||
|
|
||||||
|
config.enable_scroll_bar = true
|
||||||
|
config.scrollback_lines = 10000
|
||||||
|
|
||||||
|
-- makes wezterm to work like tmux; see also: https://bower.sh/zmx-session-persistence
|
||||||
|
config.default_gui_startup_args = { 'connect', 'unix' }
|
||||||
|
config.window_close_confirmation = 'NeverPrompt'
|
||||||
|
|
||||||
|
local function maximize_window(window)
|
||||||
|
if not window.gui_window then return end
|
||||||
|
|
||||||
|
local screen = wezterm.gui.screens().active
|
||||||
|
local guiwin = window:gui_window()
|
||||||
|
if not screen or not guiwin then return end
|
||||||
|
|
||||||
|
-- window:gui_window():maximize() -- have long animation
|
||||||
|
guiwin:set_position(screen.x, screen.y)
|
||||||
|
guiwin:set_inner_size(screen.width, screen.height)
|
||||||
|
end
|
||||||
|
|
||||||
|
-- https://github.com/wez/wezterm/issues/3299#issuecomment-2145712082
|
||||||
|
wezterm.on("gui-startup", function(cmd)
|
||||||
|
local tab, pane, window = mux.spawn_window(cmd or {})
|
||||||
|
maximize_window(window)
|
||||||
|
end)
|
||||||
|
|
||||||
|
wezterm.on("gui-attached", function(window)
|
||||||
|
local workspace = mux.get_active_workspace()
|
||||||
|
for _, window in ipairs(mux.all_windows()) do
|
||||||
|
if window:get_workspace() == workspace then
|
||||||
|
maximize_window(window)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end)
|
||||||
|
|
||||||
|
wezterm.on("window-resized", function(window, pane)
|
||||||
|
maximize_window(window)
|
||||||
|
end)
|
||||||
|
|
||||||
|
-- see also https://wezterm.org/config/lua/wezterm/battery_info.html
|
||||||
|
wezterm.on("format-tab-title", function(tab, tabs, panes, config, hover, max_width)
|
||||||
|
local title = (tab.tab_title ~= "" and tab.tab_title) or tab.active_pane.title
|
||||||
|
title = title:lower()
|
||||||
|
|
||||||
|
local prefix = tostring(tab.tab_index + 1) .. ":"
|
||||||
|
local width = math.max(1, max_width - (#prefix + 2))
|
||||||
|
title = wezterm.truncate_right(title, width)
|
||||||
|
|
||||||
|
return " " .. prefix .. title .. " "
|
||||||
|
end)
|
||||||
|
|
||||||
|
-- https://github.com/wezterm/wezterm/issues/1988#issuecomment-2462216249
|
||||||
|
local function search_cmd(window, pane)
|
||||||
|
window:perform_action(action.Search 'CurrentSelectionOrEmptyString', pane)
|
||||||
|
window:perform_action(action.Multiple {
|
||||||
|
action.CopyMode 'ClearPattern',
|
||||||
|
action.CopyMode 'ClearSelectionMode',
|
||||||
|
action.CopyMode 'MoveToScrollbackBottom'
|
||||||
|
}, pane)
|
||||||
|
end
|
||||||
|
|
||||||
|
config.keys = {
|
||||||
|
{ key = 'q', mods = 'CMD', action = wezterm.action.Nop }, -- prevent accidental quit
|
||||||
|
{ key = 't', mods = 'CMD', action = action.SpawnTab 'CurrentPaneDomain' },
|
||||||
|
{ key = 'd', mods = 'CMD', action = action.SplitHorizontal { domain = 'CurrentPaneDomain' } },
|
||||||
|
{ key = 'd', mods = 'CMD|SHIFT', action = action.SplitVertical { domain = 'CurrentPaneDomain' } },
|
||||||
|
{ key = 'k', mods = 'CMD', action = action.ClearScrollback 'ScrollbackAndViewport' },
|
||||||
|
{ key = 'w', mods = 'CMD', action = action.CloseCurrentPane { confirm
|
||||||
|
100 6869 100 6869 0 0 42178 0 --:--:-- --:--:-- --:--:-- 42401
|
||||||
|
= false } },
|
||||||
|
{ key = 'w', mods = 'CMD|SHIFT', action = action.CloseCurrentTab { confirm = false } },
|
||||||
|
{ key = 'a', mods = 'CMD', action = action.SelectTextAtMouseCursor 'SemanticZone', },
|
||||||
|
{ key = 'LeftArrow', mods = 'CMD', action = action.SendKey { key = 'Home' } },
|
||||||
|
{ key = 'RightArrow', mods = 'CMD', action = action.SendKey { key = 'End' } },
|
||||||
|
{ key = 'Backspace', mods = 'CMD', action = action.SendKey({ mods = "CTRL", key = "u" }) },
|
||||||
|
{ key = 'Backspace', mods = 'OPT', action = action.SendKey({ mods = "CTRL", key = "w" }) },
|
||||||
|
{ key = 'P', mods = 'CMD|SHIFT', action = action.ActivateCommandPalette },
|
||||||
|
{ key = 'f', mods = 'CMD', action = wezterm.action_callback(search_cmd) },
|
||||||
|
{ key = ',', mods = 'CMD', action = action.SpawnCommandInNewTab { cwd = wezterm.home_dir, args = { 'code', wezterm.config_file } } },
|
||||||
|
{ key = 'E', mods = 'CMD|SHIFT', action = action.PromptInputLine {
|
||||||
|
description = 'Enter tab title (empty to unset):',
|
||||||
|
action = wezterm.action_callback(function(window, _, line)
|
||||||
|
window:active_tab():set_title(line)
|
||||||
|
end),
|
||||||
|
}},
|
||||||
|
}
|
||||||
|
|
||||||
|
config.mouse_bindings = {
|
||||||
|
{ event = { Up = { streak = 1, button = "Left" } }, mods = "NONE", action = action.Nop },
|
||||||
|
{ event = { Up = { streak = 1, button = "Left" } }, mods = "CMD", action = action.OpenLinkAtMouseCursor },
|
||||||
|
-- Disable CMD + LeftClick window drag (make it behave like normal select)
|
||||||
|
-- { event = { Drag = { streak = 1, button = 'Left' } }, mods = "CMD", action = action.Nop },
|
||||||
|
{ event = { Drag = { streak = 1, button = "Left" } }, mods = "CMD", action = action.ExtendSelectionToMouseCursor("Cell") },
|
||||||
|
}
|
||||||
|
|
||||||
|
-- https://code.visualstudio.com/docs/configure/command-line#_opening-vs-code-with-urls
|
||||||
|
-- path-symbols: [\w@\.\/\-\[\]\(\)]
|
||||||
|
|
||||||
|
local function path_exists(path)
|
||||||
|
local ok, _, _ = wezterm.run_child_process { "test", "-e", path }
|
||||||
|
return ok
|
||||||
|
end
|
||||||
|
|
||||||
|
config.hyperlink_rules = wezterm.default_hyperlink_rules()
|
||||||
|
-- config.hyperlink_rules = {}
|
||||||
|
|
||||||
|
table.insert(config.hyperlink_rules, {
|
||||||
|
regex = [[((?:[\w@\.\/\-\[\]\(\)]+\/)+[\w@\.\/\-\[\]\(\)]+\.\w+)\b]],
|
||||||
|
format = "vscode://file/$PWD/$1",
|
||||||
|
highlight = 1,
|
||||||
|
})
|
||||||
|
|
||||||
|
table.insert(config.hyperlink_rules, {
|
||||||
|
regex = [[((?:[\w@\.\/\-\[\]\(\)]+\/)+[\w@\.\/\-\[\]\(\)]+\.\w+):(\d+):(\d+)]],
|
||||||
|
format = "vscode://file/$PWD/$1:$2:$3",
|
||||||
|
highlight = 1,
|
||||||
|
})
|
||||||
|
|
||||||
|
wezterm.on("open-uri", function(window, pane, uri)
|
||||||
|
if uri:find("$PWD") then
|
||||||
|
local cwd_uri = pane:get_current_working_dir()
|
||||||
|
local before, after = uri:match("^(.-)$PWD/(.+)$")
|
||||||
|
wezterm.log_info(before, after, path_exists(after))
|
||||||
|
if path_exists(after) then
|
||||||
|
uri = before .. after
|
||||||
|
else
|
||||||
|
uri = uri:gsub("$PWD", cwd_uri.file_path)
|
||||||
|
end
|
||||||
|
|
||||||
|
wezterm.log_info(uri)
|
||||||
|
wezterm.open_with(uri)
|
||||||
|
return false
|
||||||
|
end
|
||||||
|
|
||||||
|
return true
|
||||||
|
end)
|
||||||
@@ -0,0 +1,195 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
|
||||||
|
<channel name="xfce4-keyboard-shortcuts" version="1.0">
|
||||||
|
<property name="commands" type="empty">
|
||||||
|
<property name="default" type="empty">
|
||||||
|
<property name="<Alt>F1" type="empty"/>
|
||||||
|
<property name="<Alt>F2" type="empty">
|
||||||
|
<property name="startup-notify" type="empty"/>
|
||||||
|
</property>
|
||||||
|
<property name="<Alt>F3" type="empty">
|
||||||
|
<property name="startup-notify" type="empty"/>
|
||||||
|
</property>
|
||||||
|
<property name="<Primary><Alt>Delete" type="empty"/>
|
||||||
|
<property name="<Primary><Alt>l" type="empty"/>
|
||||||
|
<property name="<Primary><Alt>t" type="empty"/>
|
||||||
|
<property name="XF86Display" type="empty"/>
|
||||||
|
<property name="<Super>p" type="empty"/>
|
||||||
|
<property name="<Primary>Escape" type="empty"/>
|
||||||
|
<property name="XF86WWW" type="empty"/>
|
||||||
|
<property name="HomePage" type="empty"/>
|
||||||
|
<property name="XF86Mail" type="empty"/>
|
||||||
|
<property name="Print" type="empty"/>
|
||||||
|
<property name="<Alt>Print" type="empty"/>
|
||||||
|
<property name="<Shift>Print" type="empty"/>
|
||||||
|
<property name="<Super>e" type="empty"/>
|
||||||
|
<property name="<Primary><Alt>f" type="empty"/>
|
||||||
|
<property name="<Primary><Alt>Escape" type="empty"/>
|
||||||
|
<property name="<Primary><Shift>Escape" type="empty"/>
|
||||||
|
<property name="<Super>r" type="empty">
|
||||||
|
<property name="startup-notify" type="empty"/>
|
||||||
|
</property>
|
||||||
|
<property name="<Alt><Super>s" type="empty"/>
|
||||||
|
</property>
|
||||||
|
<property name="custom" type="empty">
|
||||||
|
<property name="<Alt>F2" type="string" value="xfce4-appfinder --collapsed">
|
||||||
|
<property name="startup-notify" type="bool" value="true"/>
|
||||||
|
</property>
|
||||||
|
<property name="<Super>r" type="string" value="xfce4-appfinder -c">
|
||||||
|
<property name="startup-notify" type="bool" value="true"/>
|
||||||
|
</property>
|
||||||
|
<property name="XF86WWW" type="string" value="exo-open --launch WebBrowser"/>
|
||||||
|
<property name="XF86Mail" type="string" value="exo-open --launch MailReader"/>
|
||||||
|
<property name="<Alt>F3" type="string" value="xfce4-appfinder">
|
||||||
|
<property name="startup-notify" type="bool" value="true"/>
|
||||||
|
</property>
|
||||||
|
<property name="<Primary>Escape" type="string" value="xfdesktop --menu"/>
|
||||||
|
<property name="<Primary><Alt>Delete" type="string" value="xfce4-session-logout"/>
|
||||||
|
<property name="<Primary><Alt>t" type="string" value="exo-open --launch TerminalEmulator"/>
|
||||||
|
<property name="<Primary><Alt>f" type="string" value="thunar"/>
|
||||||
|
<property name="<Primary><Alt>l" type="string" value="xflock4"/>
|
||||||
|
<property name="<Alt>F1" type="string" value="xfce4-popup-applicationsmenu"/>
|
||||||
|
<property name="<Super>p" type="string" value="xfce4-display-settings --minimal"/>
|
||||||
|
<property name="<Primary><Shift>Escape" type="string" value="xfce4-taskmanager"/>
|
||||||
|
<property name="<Super>e" type="string" value="thunar"/>
|
||||||
|
<property name="<Primary><Alt>Escape" type="string" value="xkill"/>
|
||||||
|
<property name="HomePage" type="string" value="exo-open --launch WebBrowser"/>
|
||||||
|
<property name="XF86Display" type="string" value="xfce4-display-settings --minimal"/>
|
||||||
|
<property name="override" type="bool" value="true"/>
|
||||||
|
<property name="<Super>l" type="string" value="xflock4"/>
|
||||||
|
<property name="Print" type="string" value="flameshot gui"/>
|
||||||
|
<property name="<Shift>Print" type="string" value="flameshot full"/>
|
||||||
|
</property>
|
||||||
|
</property>
|
||||||
|
<property name="xfwm4" type="empty">
|
||||||
|
<property name="default" type="empty">
|
||||||
|
<property name="<Alt>Insert" type="empty"/>
|
||||||
|
<property name="Escape" type="empty"/>
|
||||||
|
<property name="Left" type="empty"/>
|
||||||
|
<property name="Right" type="empty"/>
|
||||||
|
<property name="Up" type="empty"/>
|
||||||
|
<property name="Down" type="empty"/>
|
||||||
|
<property name="<Alt>Tab" type="empty"/>
|
||||||
|
<property name="<Alt><Shift>Tab" type="empty"/>
|
||||||
|
<property name="<Alt>Delete" type="empty"/>
|
||||||
|
<property name="<Primary><Alt>Down" type="empty"/>
|
||||||
|
<property name="<Primary><Alt>Left" type="empty"/>
|
||||||
|
<property name="<Shift><Alt>Page_Down" type="empty"/>
|
||||||
|
<property name="<Alt>F4" type="empty"/>
|
||||||
|
<property name="<Alt>F6" type="empty"/>
|
||||||
|
<property name="<Alt>F7" type="empty"/>
|
||||||
|
<property name="<Alt>F8" type="empty"/>
|
||||||
|
<property name="<Alt>F9" type="empty"/>
|
||||||
|
<property name="<Alt>F10" type="empty"/>
|
||||||
|
<property name="<Alt>F11" type="empty"/>
|
||||||
|
<property name="<Alt>F12" type="empty"/>
|
||||||
|
<property name="<Primary><Shift><Alt>Left" type="empty"/>
|
||||||
|
<property name="<Primary><Alt>End" type="empty"/>
|
||||||
|
<property name="<Primary><Alt>Home" type="empty"/>
|
||||||
|
<property name="<Primary><Shift><Alt>Right" type="empty"/>
|
||||||
|
<property name="<Primary><Shift><Alt>Up" type="empty"/>
|
||||||
|
<property name="<Primary><Alt>KP_1" type="empty"/>
|
||||||
|
<property name="<Primary><Alt>KP_2" type="empty"/>
|
||||||
|
<property name="<Primary><Alt>KP_3" type="empty"/>
|
||||||
|
<property name="<Primary><Alt>KP_4" type="empty"/>
|
||||||
|
<property name="<Primary><Alt>KP_5" type="empty"/>
|
||||||
|
<property name="<Primary><Alt>KP_6" type="empty"/>
|
||||||
|
<property name="<Primary><Alt>KP_7" type="empty"/>
|
||||||
|
<property name="<Primary><Alt>KP_8" type="empty"/>
|
||||||
|
<property name="<Primary><Alt>KP_9" type="empty"/>
|
||||||
|
<property name="<Alt>space" type="empty"/>
|
||||||
|
<property name="<Shift><Alt>Page_Up" type="empty"/>
|
||||||
|
<property name="<Primary><Alt>Right" type="empty"/>
|
||||||
|
<property name="<Primary><Alt>d" type="empty"/>
|
||||||
|
<property name="<Primary><Alt>Up" type="empty"/>
|
||||||
|
<property name="<Super>Tab" type="empty"/>
|
||||||
|
<property name="<Primary>F1" type="empty"/>
|
||||||
|
<property name="<Primary>F2" type="empty"/>
|
||||||
|
<property name="<Primary>F3" type="empty"/>
|
||||||
|
<property name="<Primary>F4" type="empty"/>
|
||||||
|
<property name="<Primary>F5" type="empty"/>
|
||||||
|
<property name="<Primary>F6" type="empty"/>
|
||||||
|
<property name="<Primary>F7" type="empty"/>
|
||||||
|
<property name="<Primary>F8" type="empty"/>
|
||||||
|
<property name="<Primary>F9" type="empty"/>
|
||||||
|
<property name="<Primary>F10" type="empty"/>
|
||||||
|
<property name="<Primary>F11" type="empty"/>
|
||||||
|
<property name="<Primary>F12" type="empty"/>
|
||||||
|
<property name="<Super>KP_Left" type="empty"/>
|
||||||
|
<property name="<Super>KP_Right" type="empty"/>
|
||||||
|
<property name="<Super>KP_Down" type="empty"/>
|
||||||
|
<property name="<Super>KP_Up" type="empty"/>
|
||||||
|
<property name="<Super>KP_Page_Up" type="empty"/>
|
||||||
|
<property name="<Super>KP_Home" type="empty"/>
|
||||||
|
<property name="<Super>KP_End" type="empty"/>
|
||||||
|
<property name="<Super>KP_Next" type="empty"/>
|
||||||
|
</property>
|
||||||
|
<property name="custom" type="empty">
|
||||||
|
<property name="<Primary>F12" type="string" value="workspace_12_key"/>
|
||||||
|
<property name="<Alt>F4" type="string" value="close_window_key"/>
|
||||||
|
<property name="<Primary><Alt>KP_3" type="string" value="move_window_workspace_3_key"/>
|
||||||
|
<property name="<Primary><Alt>Down" type="string" value="down_workspace_key"/>
|
||||||
|
<property name="<Primary><Alt>KP_9" type="string" value="move_window_workspace_9_key"/>
|
||||||
|
<property name="<Primary><Alt>End" type="string" value="move_window_next_workspace_key"/>
|
||||||
|
<property name="<Primary><Shift><Alt>Left" type="string" value="move_window_left_key"/>
|
||||||
|
<property name="<Primary><Alt>KP_4" type="string" value="move_window_workspace_4_key"/>
|
||||||
|
<property name="Right" type="string" value="right_key"/>
|
||||||
|
<property name="Down" type="string" value="down_key"/>
|
||||||
|
<property name="<Shift><Alt>Page_Down" type="string" value="lower_window_key"/>
|
||||||
|
<property name="<Alt>Tab" type="string" value="cycle_windows_key"/>
|
||||||
|
<property name="<Primary><Shift><Alt>Right" type="string" value="move_window_right_key"/>
|
||||||
|
<property name="<Primary><Alt>Right" type="string" value="right_workspace_key"/>
|
||||||
|
<property name="<Alt>F6" type="string" value="stick_window_key"/>
|
||||||
|
<property name="<Primary><Alt>KP_5" type="string" value="move_window_workspace_5_key"/>
|
||||||
|
<property name="<Primary>F11" type="string" value="workspace_11_key"/>
|
||||||
|
<property name="<Alt>F10" type="string" value="maximize_window_key"/>
|
||||||
|
<property name="<Alt>Delete" type="string" value="del_workspace_key"/>
|
||||||
|
<property name="<Super>Tab" type="string" value="switch_window_key"/>
|
||||||
|
<property name="<Primary><Alt>d" type="string" value="show_desktop_key"/>
|
||||||
|
<property name="<Super>KP_Page_Up" type="string" value="tile_up_right_key"/>
|
||||||
|
<property name="<Alt>F7" type="string" value="move_window_key"/>
|
||||||
|
<property name="Up" type="string" value="up_key"/>
|
||||||
|
<property name="<Primary><Alt>KP_6" type="string" value="move_window_workspace_6_key"/>
|
||||||
|
<property name="<Alt>F11" type="string" value="fullscreen_key"/>
|
||||||
|
<property name="<Alt>space" type="string" value="popup_menu_key"/>
|
||||||
|
<property name="<Super>KP_Home" type="string" value="tile_up_left_key"/>
|
||||||
|
<property name="Escape" type="string" value="cancel_key"/>
|
||||||
|
<property name="<Primary><Alt>KP_1" type="string" value="move_window_workspace_1_key"/>
|
||||||
|
<property name="<Shift><Alt>Page_Up" type="string" value="raise_window_key"/>
|
||||||
|
<property name="<Primary><Alt>Home" type="string" value="move_window_prev_workspace_key"/>
|
||||||
|
<property name="<Alt><Shift>Tab" type="string" value="cycle_reverse_windows_key"/>
|
||||||
|
<property name="<Primary><Alt>Left" type="string" value="left_workspace_key"/>
|
||||||
|
<property name="<Alt>F12" type="string" value="above_key"/>
|
||||||
|
<property name="<Primary><Shift><Alt>Up" type="string" value="move_window_up_key"/>
|
||||||
|
<property name="<Alt>F8" type="string" value="resize_window_key"/>
|
||||||
|
<property name="<Primary><Alt>KP_7" type="string" value="move_window_workspace_7_key"/>
|
||||||
|
<property name="<Primary><Alt>KP_2" type="string" value="move_window_workspace_2_key"/>
|
||||||
|
<property name="<Super>KP_End" type="string" value="tile_down_left_key"/>
|
||||||
|
<property name="<Primary><Alt>Up" type="string" value="up_workspace_key"/>
|
||||||
|
<property name="<Alt>F9" type="string" value="hide_window_key"/>
|
||||||
|
<property name="Left" type="string" value="left_key"/>
|
||||||
|
<property name="<Primary><Alt>KP_8" type="string" value="move_window_workspace_8_key"/>
|
||||||
|
<property name="<Alt>Insert" type="string" value="add_workspace_key"/>
|
||||||
|
<property name="override" type="bool" value="true"/>
|
||||||
|
<property name="<Super>1" type="string" value="workspace_1_key"/>
|
||||||
|
<property name="<Super>2" type="string" value="workspace_2_key"/>
|
||||||
|
<property name="<Super>3" type="string" value="workspace_3_key"/>
|
||||||
|
<property name="<Super>4" type="string" value="workspace_4_key"/>
|
||||||
|
<property name="<Super>5" type="string" value="workspace_5_key"/>
|
||||||
|
<property name="<Super>6" type="string" value="workspace_6_key"/>
|
||||||
|
<property name="<Super>7" type="string" value="workspace_7_key"/>
|
||||||
|
<property name="<Super>8" type="string" value="workspace_8_key"/>
|
||||||
|
<property name="<Super>9" type="string" value="workspace_9_key"/>
|
||||||
|
<property name="<Super>0" type="string" value="workspace_10_key"/>
|
||||||
|
<property name="<Super>Left" type="string" value="tile_left_key"/>
|
||||||
|
<property name="<Super>Right" type="string" value="tile_right_key"/>
|
||||||
|
<property name="<Super>Up" type="string" value="tile_down_key"/>
|
||||||
|
<property name="<Super>Down" type="string" value="tile_up_key"/>
|
||||||
|
<property name="<Super>Page_Down" type="string" value="tile_down_right_key"/>
|
||||||
|
</property>
|
||||||
|
</property>
|
||||||
|
<property name="providers" type="array">
|
||||||
|
<value type="string" value="xfwm4"/>
|
||||||
|
<value type="string" value="commands"/>
|
||||||
|
</property>
|
||||||
|
</channel>
|
||||||
93
dotfiles/config/xfce4/xfconf/xfce-perchannel-xml/xfwm4.xml
Normal file
93
dotfiles/config/xfce4/xfconf/xfce-perchannel-xml/xfwm4.xml
Normal file
@@ -0,0 +1,93 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
|
||||||
|
<channel name="xfwm4" version="1.0">
|
||||||
|
<property name="general" type="empty">
|
||||||
|
<property name="activate_action" type="string" value="switch"/>
|
||||||
|
<property name="borderless_maximize" type="bool" value="true"/>
|
||||||
|
<property name="box_move" type="bool" value="false"/>
|
||||||
|
<property name="box_resize" type="bool" value="false"/>
|
||||||
|
<property name="button_layout" type="string" value="O|SHMC"/>
|
||||||
|
<property name="button_offset" type="int" value="0"/>
|
||||||
|
<property name="button_spacing" type="int" value="0"/>
|
||||||
|
<property name="click_to_focus" type="bool" value="false"/>
|
||||||
|
<property name="cycle_apps_only" type="bool" value="false"/>
|
||||||
|
<property name="cycle_draw_frame" type="bool" value="true"/>
|
||||||
|
<property name="cycle_raise" type="bool" value="false"/>
|
||||||
|
<property name="cycle_hidden" type="bool" value="true"/>
|
||||||
|
<property name="cycle_minimum" type="bool" value="true"/>
|
||||||
|
<property name="cycle_minimized" type="bool" value="false"/>
|
||||||
|
<property name="cycle_preview" type="bool" value="true"/>
|
||||||
|
<property name="cycle_tabwin_mode" type="int" value="0"/>
|
||||||
|
<property name="cycle_workspaces" type="bool" value="false"/>
|
||||||
|
<property name="double_click_action" type="string" value="maximize"/>
|
||||||
|
<property name="double_click_distance" type="int" value="5"/>
|
||||||
|
<property name="double_click_time" type="int" value="250"/>
|
||||||
|
<property name="easy_click" type="string" value="Alt"/>
|
||||||
|
<property name="focus_delay" type="int" value="316"/>
|
||||||
|
<property name="focus_hint" type="bool" value="true"/>
|
||||||
|
<property name="focus_new" type="bool" value="true"/>
|
||||||
|
<property name="frame_opacity" type="int" value="100"/>
|
||||||
|
<property name="frame_border_top" type="int" value="0"/>
|
||||||
|
<property name="full_width_title" type="bool" value="true"/>
|
||||||
|
<property name="horiz_scroll_opacity" type="bool" value="false"/>
|
||||||
|
<property name="inactive_opacity" type="int" value="100"/>
|
||||||
|
<property name="maximized_offset" type="int" value="0"/>
|
||||||
|
<property name="mousewheel_rollup" type="bool" value="true"/>
|
||||||
|
<property name="move_opacity" type="int" value="100"/>
|
||||||
|
<property name="placement_mode" type="string" value="center"/>
|
||||||
|
<property name="placement_ratio" type="int" value="20"/>
|
||||||
|
<property name="popup_opacity" type="int" value="100"/>
|
||||||
|
<property name="prevent_focus_stealing" type="bool" value="false"/>
|
||||||
|
<property name="raise_delay" type="int" value="250"/>
|
||||||
|
<property name="raise_on_click" type="bool" value="true"/>
|
||||||
|
<property name="raise_on_focus" type="bool" value="false"/>
|
||||||
|
<property name="raise_with_any_button" type="bool" value="true"/>
|
||||||
|
<property name="repeat_urgent_blink" type="bool" value="false"/>
|
||||||
|
<property name="resize_opacity" type="int" value="100"/>
|
||||||
|
<property name="scroll_workspaces" type="bool" value="true"/>
|
||||||
|
<property name="shadow_delta_height" type="int" value="0"/>
|
||||||
|
<property name="shadow_delta_width" type="int" value="0"/>
|
||||||
|
<property name="shadow_delta_x" type="int" value="0"/>
|
||||||
|
<property name="shadow_delta_y" type="int" value="-3"/>
|
||||||
|
<property name="shadow_opacity" type="int" value="50"/>
|
||||||
|
<property name="show_app_icon" type="bool" value="false"/>
|
||||||
|
<property name="show_dock_shadow" type="bool" value="true"/>
|
||||||
|
<property name="show_frame_shadow" type="bool" value="true"/>
|
||||||
|
<property name="show_popup_shadow" type="bool" value="false"/>
|
||||||
|
<property name="snap_resist" type="bool" value="false"/>
|
||||||
|
<property name="snap_to_border" type="bool" value="true"/>
|
||||||
|
<property name="snap_to_windows" type="bool" value="false"/>
|
||||||
|
<property name="snap_width" type="int" value="10"/>
|
||||||
|
<property name="vblank_mode" type="string" value="auto"/>
|
||||||
|
<property name="theme" type="string" value="Default"/>
|
||||||
|
<property name="tile_on_move" type="bool" value="true"/>
|
||||||
|
<property name="title_alignment" type="string" value="center"/>
|
||||||
|
<property name="title_font" type="string" value="Sans Bold 9"/>
|
||||||
|
<property name="title_horizontal_offset" type="int" value="0"/>
|
||||||
|
<property name="titleless_maximize" type="bool" value="false"/>
|
||||||
|
<property name="title_shadow_active" type="string" value="false"/>
|
||||||
|
<property name="title_shadow_inactive" type="string" value="false"/>
|
||||||
|
<property name="title_vertical_offset_active" type="int" value="0"/>
|
||||||
|
<property name="title_vertical_offset_inactive" type="int" value="0"/>
|
||||||
|
<property name="toggle_workspaces" type="bool" value="false"/>
|
||||||
|
<property name="unredirect_overlays" type="bool" value="true"/>
|
||||||
|
<property name="urgent_blink" type="bool" value="false"/>
|
||||||
|
<property name="use_compositing" type="bool" value="true"/>
|
||||||
|
<property name="workspace_count" type="int" value="6"/>
|
||||||
|
<property name="wrap_cycle" type="bool" value="true"/>
|
||||||
|
<property name="wrap_layout" type="bool" value="true"/>
|
||||||
|
<property name="wrap_resistance" type="int" value="10"/>
|
||||||
|
<property name="wrap_windows" type="bool" value="false"/>
|
||||||
|
<property name="wrap_workspaces" type="bool" value="false"/>
|
||||||
|
<property name="zoom_desktop" type="bool" value="true"/>
|
||||||
|
<property name="zoom_pointer" type="bool" value="true"/>
|
||||||
|
<property name="workspace_names" type="array">
|
||||||
|
<value type="string" value="Workspace 1"/>
|
||||||
|
<value type="string" value="Workspace 2"/>
|
||||||
|
<value type="string" value="Workspace 3"/>
|
||||||
|
<value type="string" value="Workspace 4"/>
|
||||||
|
<value type="string" value="Workspace 5"/>
|
||||||
|
<value type="string" value="Workspace 6"/>
|
||||||
|
</property>
|
||||||
|
</property>
|
||||||
|
</channel>
|
||||||
6
dotfiles/config/ycm_extra_conf.py
Normal file
6
dotfiles/config/ycm_extra_conf.py
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
def Settings( **kwargs ):
|
||||||
|
client_data = kwargs[ 'client_data' ]
|
||||||
|
return {
|
||||||
|
'interpreter_path': client_data[ 'g:ycm_python_interpreter_path' ] or '/usr/bin/python3',
|
||||||
|
'sys_path': client_data[ 'g:ycm_python_sys_path' ]
|
||||||
|
}
|
||||||
@@ -1,4 +1,3 @@
|
|||||||
tlsv1
|
tlsv1
|
||||||
user-agent = "Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0 Safari/537.36"
|
|
||||||
create-dirs
|
create-dirs
|
||||||
referer = ";auto"
|
referer = ";auto"
|
||||||
|
|||||||
@@ -1,16 +1,51 @@
|
|||||||
|
# Exact Solarized Dark color theme for the color GNU ls utility.
|
||||||
# Dark 256 color solarized theme for the color GNU ls utility.
|
# Designed for dircolors (GNU coreutils) 5.97
|
||||||
# Used and tested with dircolors (GNU coreutils) 8.5
|
|
||||||
#
|
#
|
||||||
# @author {@link http://sebastian.tramp.name Sebastian Tramp}
|
# This simple theme was simultaneously designed for these terminal color schemes:
|
||||||
# @license http://sam.zoy.org/wtfpl/ Do What The Fuck You Want To Public License (WTFPL)
|
# - Solarized dark (best)
|
||||||
|
# - Solarized light
|
||||||
|
# - default dark
|
||||||
|
# - default light
|
||||||
|
# with a slight optimization for Solarized Dark.
|
||||||
#
|
#
|
||||||
# More Information at
|
# How the colors were selected:
|
||||||
# https://github.com/seebi/dircolors-solarized
|
# - Terminal emulators often have an option typically enabled by default that makes
|
||||||
|
# bold a different color. It is important to leave this option enabled so that
|
||||||
|
# you can access the entire 16-color Solarized palette, and not just 8 colors.
|
||||||
|
# - We favor universality over a greater number of colors. So we limit the number
|
||||||
|
# of colors so that this theme will work out of the box in all terminals,
|
||||||
|
# Solarized or not, dark or light.
|
||||||
|
# - We choose to have the following category of files:
|
||||||
|
# NORMAL & FILE, DIR, LINK, EXEC and
|
||||||
|
# editable text including source, unimportant text, binary docs & multimedia source
|
||||||
|
# files, viewable multimedia, archived/compressed, and unimportant non-text
|
||||||
|
# - For uniqueness, we stay away from the Solarized foreground colors are -- either
|
||||||
|
# base00 (brightyellow) or base0 (brightblue). However, they can be used if
|
||||||
|
# you know what the bg/fg colors of your terminal are, in order to optimize the display.
|
||||||
|
# - 3 different options are provided: universal, solarized dark, and solarized light.
|
||||||
|
# The only difference between the universal scheme and one that's optimized for
|
||||||
|
# dark/light is the color of "unimportant" files, which should blend more with the
|
||||||
|
# background
|
||||||
|
# - We note that blue is the hardest color to see on dark bg and yellow is the hardest
|
||||||
|
# color to see on light bg (with blue being particularly bad). So we choose yellow
|
||||||
|
# for multimedia files which are usually accessed in a GUI folder browser anyway.
|
||||||
|
# And blue is kept for custom use of this scheme's user.
|
||||||
|
# - See table below to see the assignments.
|
||||||
|
|
||||||
# Term Section
|
|
||||||
TERM Eterm
|
# Installation instructions:
|
||||||
|
# This file goes in the /etc directory, and must be world readable.
|
||||||
|
# You can copy this file to .dir_colors in your $HOME directory to override
|
||||||
|
# the system defaults.
|
||||||
|
|
||||||
|
# COLOR needs one of these arguments: 'tty' colorizes output to ttys, but not
|
||||||
|
# pipes. 'all' adds color characters to all output. 'none' shuts colorization
|
||||||
|
# off.
|
||||||
|
COLOR tty
|
||||||
|
|
||||||
|
# Below, there should be one TERM entry for each termtype that is colorizable
|
||||||
TERM ansi
|
TERM ansi
|
||||||
|
TERM color_xterm
|
||||||
TERM color-xterm
|
TERM color-xterm
|
||||||
TERM con132x25
|
TERM con132x25
|
||||||
TERM con132x30
|
TERM con132x30
|
||||||
@@ -28,6 +63,7 @@ TERM cygwin
|
|||||||
TERM dtterm
|
TERM dtterm
|
||||||
TERM dvtm
|
TERM dvtm
|
||||||
TERM dvtm-256color
|
TERM dvtm-256color
|
||||||
|
TERM Eterm
|
||||||
TERM eterm-color
|
TERM eterm-color
|
||||||
TERM fbterm
|
TERM fbterm
|
||||||
TERM gnome
|
TERM gnome
|
||||||
@@ -40,6 +76,7 @@ TERM linux
|
|||||||
TERM linux-c
|
TERM linux-c
|
||||||
TERM mach-color
|
TERM mach-color
|
||||||
TERM mlterm
|
TERM mlterm
|
||||||
|
TERM nxterm
|
||||||
TERM putty
|
TERM putty
|
||||||
TERM putty-256color
|
TERM putty-256color
|
||||||
TERM rxvt
|
TERM rxvt
|
||||||
@@ -63,12 +100,16 @@ TERM screen-bce
|
|||||||
TERM screen-w
|
TERM screen-w
|
||||||
TERM screen.linux
|
TERM screen.linux
|
||||||
TERM screen.xterm-256color
|
TERM screen.xterm-256color
|
||||||
|
TERM screen.xterm-new
|
||||||
TERM st
|
TERM st
|
||||||
TERM st-meta
|
TERM st-meta
|
||||||
TERM st-256color
|
TERM st-256color
|
||||||
TERM st-meta-256color
|
TERM st-meta-256color
|
||||||
|
TERM tmux
|
||||||
|
TERM tmux-256color
|
||||||
TERM vt100
|
TERM vt100
|
||||||
TERM xterm
|
TERM xterm
|
||||||
|
TERM xterm-new
|
||||||
TERM xterm-16color
|
TERM xterm-16color
|
||||||
TERM xterm-256color
|
TERM xterm-256color
|
||||||
TERM xterm-256color-italic
|
TERM xterm-256color-italic
|
||||||
@@ -77,12 +118,13 @@ TERM xterm-color
|
|||||||
TERM xterm-debian
|
TERM xterm-debian
|
||||||
TERM xterm-termite
|
TERM xterm-termite
|
||||||
|
|
||||||
## Documentation
|
# EIGHTBIT, followed by '1' for on, '0' for off. (8-bit output)
|
||||||
#
|
EIGHTBIT 1
|
||||||
# standard colors
|
|
||||||
#
|
#############################################################################
|
||||||
# Below are the color init strings for the basic file types. A color init
|
# Below are the color init strings for the basic file types. A color init
|
||||||
# string consists of one or more of the following numeric codes:
|
# string consists of one or more of the following numeric codes:
|
||||||
|
#
|
||||||
# Attribute codes:
|
# Attribute codes:
|
||||||
# 00=none 01=bold 04=underscore 05=blink 07=reverse 08=concealed
|
# 00=none 01=bold 04=underscore 05=blink 07=reverse 08=concealed
|
||||||
# Text color codes:
|
# Text color codes:
|
||||||
@@ -90,206 +132,349 @@ TERM xterm-termite
|
|||||||
# Background color codes:
|
# Background color codes:
|
||||||
# 40=black 41=red 42=green 43=yellow 44=blue 45=magenta 46=cyan 47=white
|
# 40=black 41=red 42=green 43=yellow 44=blue 45=magenta 46=cyan 47=white
|
||||||
#
|
#
|
||||||
#
|
# NOTES:
|
||||||
# 256 color support
|
# - See http://www.oreilly.com/catalog/wdnut/excerpt/color_names.html
|
||||||
# see here: http://www.mail-archive.com/bug-coreutils@gnu.org/msg11030.html)
|
# - Color combinations
|
||||||
#
|
# ANSI Color code Solarized Notes Universal SolDark SolLight
|
||||||
# Text 256 color coding:
|
# ~~~~~~~~~~~~~~~ ~~~~~~~~~ ~~~~~ ~~~~~~~~~ ~~~~~~~ ~~~~~~~~
|
||||||
# 38;5;COLOR_NUMBER
|
# 00 none NORMAL, FILE <SAME> <SAME>
|
||||||
# Background 256 color coding:
|
# 30 black base02
|
||||||
# 48;5;COLOR_NUMBER
|
# 01;30 bright black base03 bg of SolDark
|
||||||
|
# 31 red red docs & mm src <SAME> <SAME>
|
||||||
## Special files
|
# 01;31 bright red orange EXEC <SAME> <SAME>
|
||||||
|
# 32 green green editable text <SAME> <SAME>
|
||||||
NORMAL 00;38;5;244 # no color code at all
|
# 01;32 bright green base01 unimportant text <SAME>
|
||||||
#FILE 00 # regular file: use no color at all
|
# 33 yellow yellow unclear in light bg multimedia <SAME> <SAME>
|
||||||
RESET 0 # reset to "normal" color
|
# 01;33 bright yellow base00 fg of SolLight unimportant non-text
|
||||||
DIR 00;38;5;33 # directory 01;34
|
# 34 blue blue unclear in dark bg user customized <SAME> <SAME>
|
||||||
LINK 00;38;5;37 # symbolic link. (If you set this to 'target' instead of a
|
# 01;34 bright blue base0 fg in SolDark unimportant text
|
||||||
# numerical value, the color is as for the file pointed to.)
|
# 35 magenta magenta LINK <SAME> <SAME>
|
||||||
MULTIHARDLINK 00 # regular file with more than one link
|
# 01;35 bright magenta violet archive/compressed <SAME> <SAME>
|
||||||
FIFO 48;5;230;38;5;136;01 # pipe
|
# 36 cyan cyan DIR <SAME> <SAME>
|
||||||
SOCK 48;5;230;38;5;136;01 # socket
|
# 01;36 bright cyan base1 unimportant non-text <SAME>
|
||||||
DOOR 48;5;230;38;5;136;01 # door
|
# 37 white base2
|
||||||
BLK 48;5;230;38;5;244;01 # block device driver
|
# 01;37 bright white base3 bg in SolLight
|
||||||
CHR 48;5;230;38;5;244;01 # character device driver
|
# 05;37;41 unclear in Putty dark
|
||||||
ORPHAN 48;5;235;38;5;160 # symlink to nonexistent file, or non-stat'able file
|
|
||||||
SETUID 48;5;160;38;5;230 # file that is setuid (u+s)
|
|
||||||
SETGID 48;5;136;38;5;230 # file that is setgid (g+s)
|
|
||||||
CAPABILITY 30;41 # file with capability
|
|
||||||
STICKY_OTHER_WRITABLE 48;5;64;38;5;230 # dir that is sticky and other-writable (+t,o+w)
|
|
||||||
OTHER_WRITABLE 48;5;235;38;5;33 # dir that is other-writable (o+w) and not sticky
|
|
||||||
STICKY 48;5;33;38;5;230 # dir with the sticky bit set (+t) and not other-writable
|
|
||||||
# This is for files with execute permission:
|
|
||||||
EXEC 00;38;5;64
|
|
||||||
|
|
||||||
## Archives or compressed (violet + bold for compression)
|
|
||||||
.tar 00;38;5;61
|
|
||||||
.tgz 00;38;5;61
|
|
||||||
.arj 00;38;5;61
|
|
||||||
.taz 00;38;5;61
|
|
||||||
.lzh 00;38;5;61
|
|
||||||
.lzma 00;38;5;61
|
|
||||||
.tlz 00;38;5;61
|
|
||||||
.txz 00;38;5;61
|
|
||||||
.zip 00;38;5;61
|
|
||||||
.z 00;38;5;61
|
|
||||||
.Z 00;38;5;61
|
|
||||||
.dz 00;38;5;61
|
|
||||||
.gz 00;38;5;61
|
|
||||||
.lz 00;38;5;61
|
|
||||||
.xz 00;38;5;61
|
|
||||||
.bz2 00;38;5;61
|
|
||||||
.bz 00;38;5;61
|
|
||||||
.tbz 00;38;5;61
|
|
||||||
.tbz2 00;38;5;61
|
|
||||||
.tz 00;38;5;61
|
|
||||||
.deb 00;38;5;61
|
|
||||||
.rpm 00;38;5;61
|
|
||||||
.jar 00;38;5;61
|
|
||||||
.rar 00;38;5;61
|
|
||||||
.ace 00;38;5;61
|
|
||||||
.zoo 00;38;5;61
|
|
||||||
.cpio 00;38;5;61
|
|
||||||
.7z 00;38;5;61
|
|
||||||
.rz 00;38;5;61
|
|
||||||
.apk 00;38;5;61
|
|
||||||
.gem 00;38;5;61
|
|
||||||
|
|
||||||
# Image formats (yellow)
|
|
||||||
.jpg 00;38;5;136
|
|
||||||
.JPG 00;38;5;136 #stupid but needed
|
|
||||||
.jpeg 00;38;5;136
|
|
||||||
.gif 00;38;5;136
|
|
||||||
.bmp 00;38;5;136
|
|
||||||
.pbm 00;38;5;136
|
|
||||||
.pgm 00;38;5;136
|
|
||||||
.ppm 00;38;5;136
|
|
||||||
.tga 00;38;5;136
|
|
||||||
.xbm 00;38;5;136
|
|
||||||
.xpm 00;38;5;136
|
|
||||||
.tif 00;38;5;136
|
|
||||||
.tiff 00;38;5;136
|
|
||||||
.png 00;38;5;136
|
|
||||||
.PNG 00;38;5;136
|
|
||||||
.svg 00;38;5;136
|
|
||||||
.svgz 00;38;5;136
|
|
||||||
.mng 00;38;5;136
|
|
||||||
.pcx 00;38;5;136
|
|
||||||
.dl 00;38;5;136
|
|
||||||
.xcf 00;38;5;136
|
|
||||||
.xwd 00;38;5;136
|
|
||||||
.yuv 00;38;5;136
|
|
||||||
.cgm 00;38;5;136
|
|
||||||
.emf 00;38;5;136
|
|
||||||
.eps 00;38;5;136
|
|
||||||
.CR2 00;38;5;136
|
|
||||||
.ico 00;38;5;136
|
|
||||||
|
|
||||||
# Files of special interest (base1)
|
|
||||||
.tex 00;38;5;245
|
|
||||||
.rdf 00;38;5;245
|
|
||||||
.owl 00;38;5;245
|
|
||||||
.n3 00;38;5;245
|
|
||||||
.ttl 00;38;5;245
|
|
||||||
.nt 00;38;5;245
|
|
||||||
.torrent 00;38;5;245
|
|
||||||
.xml 00;38;5;245
|
|
||||||
*Makefile 00;38;5;245
|
|
||||||
*Rakefile 00;38;5;245
|
|
||||||
*Dockerfile 00;38;5;245
|
|
||||||
*build.xml 00;38;5;245
|
|
||||||
*rc 00;38;5;245
|
|
||||||
*1 00;38;5;245
|
|
||||||
.nfo 00;38;5;245
|
|
||||||
*README 00;38;5;245
|
|
||||||
*README.txt 00;38;5;245
|
|
||||||
*readme.txt 00;38;5;245
|
|
||||||
.md 00;38;5;245
|
|
||||||
*README.markdown 00;38;5;245
|
|
||||||
.ini 00;38;5;245
|
|
||||||
.yml 00;38;5;245
|
|
||||||
.cfg 00;38;5;245
|
|
||||||
.conf 00;38;5;245
|
|
||||||
.c 00;38;5;245
|
|
||||||
.cpp 00;38;5;245
|
|
||||||
.cc 00;38;5;245
|
|
||||||
.sqlite 00;38;5;245
|
|
||||||
.go 00;38;5;245
|
|
||||||
.sql 00;38;5;245
|
|
||||||
|
|
||||||
# "unimportant" files as logs and backups (base01)
|
|
||||||
.log 00;38;5;240
|
|
||||||
.bak 00;38;5;240
|
|
||||||
.aux 00;38;5;240
|
|
||||||
.lof 00;38;5;240
|
|
||||||
.lol 00;38;5;240
|
|
||||||
.lot 00;38;5;240
|
|
||||||
.out 00;38;5;240
|
|
||||||
.toc 00;38;5;240
|
|
||||||
.bbl 00;38;5;240
|
|
||||||
.blg 00;38;5;240
|
|
||||||
*~ 00;38;5;240
|
|
||||||
*# 00;38;5;240
|
|
||||||
.part 00;38;5;240
|
|
||||||
.incomplete 00;38;5;240
|
|
||||||
.swp 00;38;5;240
|
|
||||||
.tmp 00;38;5;240
|
|
||||||
.temp 00;38;5;240
|
|
||||||
.o 00;38;5;240
|
|
||||||
.pyc 00;38;5;240
|
|
||||||
.class 00;38;5;240
|
|
||||||
.cache 00;38;5;240
|
|
||||||
|
|
||||||
# Audio formats (orange)
|
|
||||||
.aac 00;38;5;166
|
|
||||||
.au 00;38;5;166
|
|
||||||
.flac 00;38;5;166
|
|
||||||
.mid 00;38;5;166
|
|
||||||
.midi 00;38;5;166
|
|
||||||
.mka 00;38;5;166
|
|
||||||
.mp3 00;38;5;166
|
|
||||||
.mpc 00;38;5;166
|
|
||||||
.ogg 00;38;5;166
|
|
||||||
.ra 00;38;5;166
|
|
||||||
.wav 00;38;5;166
|
|
||||||
.m4a 00;38;5;166
|
|
||||||
# http://wiki.xiph.org/index.php/MIME_Types_and_File_Extensions
|
|
||||||
.axa 00;38;5;166
|
|
||||||
.oga 00;38;5;166
|
|
||||||
.spx 00;38;5;166
|
|
||||||
.xspf 00;38;5;166
|
|
||||||
|
|
||||||
# Video formats (as audio + bold)
|
|
||||||
.mov 00;38;5;166
|
|
||||||
.MOV 00;38;5;166
|
|
||||||
.mpg 00;38;5;166
|
|
||||||
.mpeg 00;38;5;166
|
|
||||||
.m2v 00;38;5;166
|
|
||||||
.mkv 00;38;5;166
|
|
||||||
.ogm 00;38;5;166
|
|
||||||
.mp4 00;38;5;166
|
|
||||||
.m4v 00;38;5;166
|
|
||||||
.mp4v 00;38;5;166
|
|
||||||
.vob 00;38;5;166
|
|
||||||
.qt 00;38;5;166
|
|
||||||
.nuv 00;38;5;166
|
|
||||||
.wmv 00;38;5;166
|
|
||||||
.asf 00;38;5;166
|
|
||||||
.rm 00;38;5;166
|
|
||||||
.rmvb 00;38;5;166
|
|
||||||
.flc 00;38;5;166
|
|
||||||
.avi 00;38;5;166
|
|
||||||
.fli 00;38;5;166
|
|
||||||
.flv 00;38;5;166
|
|
||||||
.gl 00;38;5;166
|
|
||||||
.m2ts 00;38;5;166
|
|
||||||
.divx 00;38;5;166
|
|
||||||
.webm 00;38;5;166
|
|
||||||
# http://wiki.xiph.org/index.php/MIME_Types_and_File_Extensions
|
|
||||||
.axv 00;38;5;166
|
|
||||||
.anx 00;38;5;166
|
|
||||||
.ogv 00;38;5;166
|
|
||||||
.ogx 00;38;5;166
|
|
||||||
|
|
||||||
|
|
||||||
|
### By file type
|
||||||
|
|
||||||
|
# global default
|
||||||
|
NORMAL 00
|
||||||
|
# normal file
|
||||||
|
FILE 00
|
||||||
|
# directory
|
||||||
|
DIR 34
|
||||||
|
# 777 directory
|
||||||
|
OTHER_WRITABLE 34;40
|
||||||
|
# symbolic link
|
||||||
|
LINK 35
|
||||||
|
|
||||||
|
# pipe, socket, block device, character device (blue bg)
|
||||||
|
FIFO 30;44
|
||||||
|
SOCK 35;44
|
||||||
|
DOOR 35;44 # Solaris 2.5 and later
|
||||||
|
BLK 33;44
|
||||||
|
CHR 37;44
|
||||||
|
|
||||||
|
|
||||||
|
#############################################################################
|
||||||
|
### By file attributes
|
||||||
|
|
||||||
|
# Orphaned symlinks (blinking white on red)
|
||||||
|
# Blink may or may not work (works on iTerm dark or light, and Putty dark)
|
||||||
|
ORPHAN 05;37;41
|
||||||
|
# ... and the files that orphaned symlinks point to (blinking white on red)
|
||||||
|
MISSING 05;37;41
|
||||||
|
|
||||||
|
# files with execute permission
|
||||||
|
EXEC 01;31 # Unix
|
||||||
|
.cmd 01;31 # Win
|
||||||
|
.exe 01;31 # Win
|
||||||
|
.com 01;31 # Win
|
||||||
|
.bat 01;31 # Win
|
||||||
|
.reg 01;31 # Win
|
||||||
|
.app 01;31 # OSX
|
||||||
|
|
||||||
|
#############################################################################
|
||||||
|
### By extension
|
||||||
|
|
||||||
|
# List any file extensions like '.gz' or '.tar' that you would like ls
|
||||||
|
# to colorize below. Put the extension, a space, and the color init string.
|
||||||
|
# (and any comments you want to add after a '#')
|
||||||
|
|
||||||
|
### Text formats
|
||||||
|
|
||||||
|
# Text that we can edit with a regular editor
|
||||||
|
.txt 32
|
||||||
|
.org 32
|
||||||
|
.md 32
|
||||||
|
.mkd 32
|
||||||
|
|
||||||
|
# Source text
|
||||||
|
.h 32
|
||||||
|
.hpp 32
|
||||||
|
.c 32
|
||||||
|
.C 32
|
||||||
|
.cc 32
|
||||||
|
.cpp 32
|
||||||
|
.cxx 32
|
||||||
|
.objc 32
|
||||||
|
.cl 32
|
||||||
|
.sh 32
|
||||||
|
.bash 32
|
||||||
|
.csh 32
|
||||||
|
.zsh 32
|
||||||
|
.el 32
|
||||||
|
.vim 32
|
||||||
|
.java 32
|
||||||
|
.pl 32
|
||||||
|
.pm 32
|
||||||
|
.py 32
|
||||||
|
.rb 32
|
||||||
|
.hs 32
|
||||||
|
.php 32
|
||||||
|
.htm 32
|
||||||
|
.html 32
|
||||||
|
.shtml 32
|
||||||
|
.erb 32
|
||||||
|
.haml 32
|
||||||
|
.xml 32
|
||||||
|
.rdf 32
|
||||||
|
.css 32
|
||||||
|
.sass 32
|
||||||
|
.scss 32
|
||||||
|
.less 32
|
||||||
|
.js 32
|
||||||
|
.coffee 32
|
||||||
|
.man 32
|
||||||
|
.0 32
|
||||||
|
.1 32
|
||||||
|
.2 32
|
||||||
|
.3 32
|
||||||
|
.4 32
|
||||||
|
.5 32
|
||||||
|
.6 32
|
||||||
|
.7 32
|
||||||
|
.8 32
|
||||||
|
.9 32
|
||||||
|
.l 32
|
||||||
|
.n 32
|
||||||
|
.p 32
|
||||||
|
.pod 32
|
||||||
|
.tex 32
|
||||||
|
.go 32
|
||||||
|
.sql 32
|
||||||
|
.csv 32
|
||||||
|
.sv 32
|
||||||
|
.svh 32
|
||||||
|
.v 32
|
||||||
|
.vh 32
|
||||||
|
.vhd 32
|
||||||
|
|
||||||
|
### Multimedia formats
|
||||||
|
|
||||||
|
# Image
|
||||||
|
.bmp 33
|
||||||
|
.cgm 33
|
||||||
|
.dl 33
|
||||||
|
.dvi 33
|
||||||
|
.emf 33
|
||||||
|
.eps 33
|
||||||
|
.gif 33
|
||||||
|
.jpeg 33
|
||||||
|
.jpg 33
|
||||||
|
.JPG 33
|
||||||
|
.mng 33
|
||||||
|
.pbm 33
|
||||||
|
.pcx 33
|
||||||
|
.pdf 33
|
||||||
|
.pgm 33
|
||||||
|
.png 33
|
||||||
|
.PNG 33
|
||||||
|
.ppm 33
|
||||||
|
.pps 33
|
||||||
|
.ppsx 33
|
||||||
|
.ps 33
|
||||||
|
.svg 33
|
||||||
|
.svgz 33
|
||||||
|
.tga 33
|
||||||
|
.tif 33
|
||||||
|
.tiff 33
|
||||||
|
.xbm 33
|
||||||
|
.xcf 33
|
||||||
|
.xpm 33
|
||||||
|
.xwd 33
|
||||||
|
.xwd 33
|
||||||
|
.yuv 33
|
||||||
|
|
||||||
|
# Audio
|
||||||
|
.aac 33
|
||||||
|
.au 33
|
||||||
|
.flac 33
|
||||||
|
.m4a 33
|
||||||
|
.mid 33
|
||||||
|
.midi 33
|
||||||
|
.mka 33
|
||||||
|
.mp3 33
|
||||||
|
.mpa 33
|
||||||
|
.mpeg 33
|
||||||
|
.mpg 33
|
||||||
|
.ogg 33
|
||||||
|
.opus 33
|
||||||
|
.ra 33
|
||||||
|
.wav 33
|
||||||
|
|
||||||
|
# Video
|
||||||
|
.anx 33
|
||||||
|
.asf 33
|
||||||
|
.avi 33
|
||||||
|
.axv 33
|
||||||
|
.flc 33
|
||||||
|
.fli 33
|
||||||
|
.flv 33
|
||||||
|
.gl 33
|
||||||
|
.m2v 33
|
||||||
|
.m4v 33
|
||||||
|
.mkv 33
|
||||||
|
.mov 33
|
||||||
|
.MOV 33
|
||||||
|
.mp4 33
|
||||||
|
.mp4v 33
|
||||||
|
.mpeg 33
|
||||||
|
.mpg 33
|
||||||
|
.nuv 33
|
||||||
|
.ogm 33
|
||||||
|
.ogv 33
|
||||||
|
.ogx 33
|
||||||
|
.qt 33
|
||||||
|
.rm 33
|
||||||
|
.rmvb 33
|
||||||
|
.swf 33
|
||||||
|
.vob 33
|
||||||
|
.webm 33
|
||||||
|
.wmv 33
|
||||||
|
|
||||||
|
### Misc
|
||||||
|
|
||||||
|
# Binary document formats and multimedia source
|
||||||
|
.doc 31
|
||||||
|
.docx 31
|
||||||
|
.rtf 31
|
||||||
|
.odt 31
|
||||||
|
.dot 31
|
||||||
|
.dotx 31
|
||||||
|
.ott 31
|
||||||
|
.xls 31
|
||||||
|
.xlsx 31
|
||||||
|
.ods 31
|
||||||
|
.ots 31
|
||||||
|
.ppt 31
|
||||||
|
.pptx 31
|
||||||
|
.odp 31
|
||||||
|
.otp 31
|
||||||
|
.fla 31
|
||||||
|
.psd 31
|
||||||
|
|
||||||
|
# Archives, compressed
|
||||||
|
.7z 1;35
|
||||||
|
.apk 1;35
|
||||||
|
.arj 1;35
|
||||||
|
.bin 1;35
|
||||||
|
.bz 1;35
|
||||||
|
.bz2 1;35
|
||||||
|
.cab 1;35 # Win
|
||||||
|
.deb 1;35
|
||||||
|
.dmg 1;35 # OSX
|
||||||
|
.gem 1;35
|
||||||
|
.gz 1;35
|
||||||
|
.iso 1;35
|
||||||
|
.jar 1;35
|
||||||
|
.msi 1;35 # Win
|
||||||
|
.rar 1;35
|
||||||
|
.rpm 1;35
|
||||||
|
.tar 1;35
|
||||||
|
.tbz 1;35
|
||||||
|
.tbz2 1;35
|
||||||
|
.tgz 1;35
|
||||||
|
.tx 1;35
|
||||||
|
.war 1;35
|
||||||
|
.xpi 1;35
|
||||||
|
.xz 1;35
|
||||||
|
.z 1;35
|
||||||
|
.Z 1;35
|
||||||
|
.zip 1;35
|
||||||
|
|
||||||
|
# For testing
|
||||||
|
.ANSI-30-black 30
|
||||||
|
.ANSI-01;30-brblack 01;30
|
||||||
|
.ANSI-31-red 31
|
||||||
|
.ANSI-01;31-brred 01;31
|
||||||
|
.ANSI-32-green 32
|
||||||
|
.ANSI-01;32-brgreen 01;32
|
||||||
|
.ANSI-33-yellow 33
|
||||||
|
.ANSI-01;33-bryellow 01;33
|
||||||
|
.ANSI-34-blue 34
|
||||||
|
.ANSI-01;34-brblue 01;34
|
||||||
|
.ANSI-35-magenta 35
|
||||||
|
.ANSI-01;35-brmagenta 01;35
|
||||||
|
.ANSI-36-cyan 36
|
||||||
|
.ANSI-01;36-brcyan 01;36
|
||||||
|
.ANSI-37-white 37
|
||||||
|
.ANSI-01;37-brwhite 01;37
|
||||||
|
|
||||||
|
#############################################################################
|
||||||
|
# Your customizations
|
||||||
|
|
||||||
|
# Unimportant text files
|
||||||
|
# For universal scheme, use brightgreen 01;32
|
||||||
|
# For optimal on light bg (but too prominent on dark bg), use white 01;34
|
||||||
|
.log 01;32
|
||||||
|
*~ 01;32
|
||||||
|
*# 01;32
|
||||||
|
#.log 01;34
|
||||||
|
#*~ 01;34
|
||||||
|
#*# 01;34
|
||||||
|
|
||||||
|
# Unimportant non-text files
|
||||||
|
# For universal scheme, use brightcyan 01;36
|
||||||
|
# For optimal on dark bg (but too prominent on light bg), change to 01;33
|
||||||
|
#.bak 01;36
|
||||||
|
#.BAK 01;36
|
||||||
|
#.old 01;36
|
||||||
|
#.OLD 01;36
|
||||||
|
#.org_archive 01;36
|
||||||
|
#.off 01;36
|
||||||
|
#.OFF 01;36
|
||||||
|
#.dist 01;36
|
||||||
|
#.DIST 01;36
|
||||||
|
#.orig 01;36
|
||||||
|
#.ORIG 01;36
|
||||||
|
#.swp 01;36
|
||||||
|
#.swo 01;36
|
||||||
|
#*,v 01;36
|
||||||
|
.bak 01;33
|
||||||
|
.BAK 01;33
|
||||||
|
.old 01;33
|
||||||
|
.OLD 01;33
|
||||||
|
.org_archive 01;33
|
||||||
|
.off 01;33
|
||||||
|
.OFF 01;33
|
||||||
|
.dist 01;33
|
||||||
|
.DIST 01;33
|
||||||
|
.orig 01;33
|
||||||
|
.ORIG 01;33
|
||||||
|
.swp 01;33
|
||||||
|
.swo 01;33
|
||||||
|
*,v 01;33
|
||||||
|
|
||||||
|
# The brightmagenta (Solarized: purple) color is free for you to use for your
|
||||||
|
# custom file type
|
||||||
|
.gpg 34
|
||||||
|
.gpg 34
|
||||||
|
.pgp 34
|
||||||
|
.asc 34
|
||||||
|
.3des 34
|
||||||
|
.aes 34
|
||||||
|
.enc 34
|
||||||
|
.sqlite 34
|
||||||
|
|||||||
28
dotfiles/env
28
dotfiles/env
@@ -1,28 +0,0 @@
|
|||||||
# Sourced by zshrc as well as bash.
|
|
||||||
|
|
||||||
umask 027
|
|
||||||
ulimit -c unlimited
|
|
||||||
|
|
||||||
# Paths and preferences
|
|
||||||
export PYTHONPATH="$HOME/.python:$PYTHONPATH"
|
|
||||||
export GOPATH="$HOME/Projects/Go"
|
|
||||||
export PATH="$HOME/bin:/sbin:/usr/sbin:$PATH:$GOPATH/bin"
|
|
||||||
export VISUAL=vim
|
|
||||||
export EDITOR=vim
|
|
||||||
export DEBEMAIL="david@systemoverlord.com"
|
|
||||||
export DEBFULLNAME="David Tomaschik"
|
|
||||||
export LESS="-MR"
|
|
||||||
export QUOTING_STYLE="literal" # Coreutils quotes
|
|
||||||
|
|
||||||
# Fix gnome-terminal
|
|
||||||
if [[ $TERM == "xterm" && $COLORTERM == "gnome-terminal" ]] ; then
|
|
||||||
export TERM="xterm-256color"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# For virtualenvwrapper
|
|
||||||
export WORKON_HOME=$HOME/.virtualenvs
|
|
||||||
|
|
||||||
# GPG full key id
|
|
||||||
export GPG_ID=7FD58D9A196DCEEEAD671F94F4D7A7915DEA789B
|
|
||||||
|
|
||||||
if [[ -e $HOME/.localenv ]] ; then source $HOME/.localenv ; fi
|
|
||||||
@@ -26,10 +26,13 @@ end
|
|||||||
python
|
python
|
||||||
import sys
|
import sys
|
||||||
import os.path
|
import os.path
|
||||||
pwndbg = os.path.expanduser('~/.pwndbg/gdbinit.py')
|
gef = os.path.expanduser('~/tools/gef/gef.py')
|
||||||
|
pwndbg = os.path.expanduser('~/tools/pwndbg/gdbinit.py')
|
||||||
peda = os.path.expanduser('~/.peda/peda.py')
|
peda = os.path.expanduser('~/.peda/peda.py')
|
||||||
if os.path.isfile(pwndbg):
|
if os.path.isfile(gef):
|
||||||
sys.path.insert(0, os.path.expanduser('~/.pwndbg/vendor'))
|
gdb.execute('source {}'.format(gef))
|
||||||
|
elif os.path.isfile(pwndbg):
|
||||||
|
sys.path.insert(0, os.path.expanduser('~/tools/pwndbg/vendor'))
|
||||||
gdb.execute('source {}'.format(pwndbg))
|
gdb.execute('source {}'.format(pwndbg))
|
||||||
elif os.path.isfile(peda):
|
elif os.path.isfile(peda):
|
||||||
gdb.execute('source {}'.format(peda))
|
gdb.execute('source {}'.format(peda))
|
||||||
|
|||||||
125
dotfiles/gef.rc
Normal file
125
dotfiles/gef.rc
Normal file
@@ -0,0 +1,125 @@
|
|||||||
|
[context]
|
||||||
|
clear_screen = False
|
||||||
|
enable = True
|
||||||
|
grow_stack_down = False
|
||||||
|
ignore_registers =
|
||||||
|
layout = legend regs stack code args source memory threads trace extra
|
||||||
|
nb_lines_backtrace = 10
|
||||||
|
nb_lines_code = 6
|
||||||
|
nb_lines_code_prev = 3
|
||||||
|
nb_lines_stack = 8
|
||||||
|
nb_lines_threads = -1
|
||||||
|
peek_calls = True
|
||||||
|
peek_ret = True
|
||||||
|
redirect =
|
||||||
|
show_registers_raw = False
|
||||||
|
show_stack_raw = False
|
||||||
|
|
||||||
|
[dereference]
|
||||||
|
max_recursion = 7
|
||||||
|
|
||||||
|
[entry-break]
|
||||||
|
entrypoint_symbols = main _main __libc_start_main __uClibc_main start _start
|
||||||
|
|
||||||
|
[gef-remote]
|
||||||
|
clean_on_exit = False
|
||||||
|
|
||||||
|
[gef]
|
||||||
|
autosave_breakpoints_file =
|
||||||
|
debug = False
|
||||||
|
disable_color = False
|
||||||
|
extra_plugins_dir =
|
||||||
|
follow_child = True
|
||||||
|
readline_compat = False
|
||||||
|
|
||||||
|
[got]
|
||||||
|
function_not_resolved = yellow
|
||||||
|
function_resolved = green
|
||||||
|
|
||||||
|
[heap-analysis-helper]
|
||||||
|
check_double_free = True
|
||||||
|
check_free_null = False
|
||||||
|
check_heap_overlap = True
|
||||||
|
check_uaf = True
|
||||||
|
check_weird_free = True
|
||||||
|
|
||||||
|
[heap-chunks]
|
||||||
|
peek_nb_byte = 16
|
||||||
|
|
||||||
|
[hexdump]
|
||||||
|
always_show_ascii = False
|
||||||
|
|
||||||
|
[highlight]
|
||||||
|
regex = False
|
||||||
|
|
||||||
|
[ida-interact]
|
||||||
|
host = 127.0.0.1
|
||||||
|
port = 1337
|
||||||
|
sync_cursor = False
|
||||||
|
|
||||||
|
[pattern]
|
||||||
|
length = 1024
|
||||||
|
|
||||||
|
[pcustom]
|
||||||
|
struct_path = /tmp/gef/structs
|
||||||
|
|
||||||
|
[process-search]
|
||||||
|
ps_command = /bin/ps auxww
|
||||||
|
|
||||||
|
[syscall-args]
|
||||||
|
path = /tmp/gef/syscall-tables
|
||||||
|
|
||||||
|
[theme]
|
||||||
|
address_code = red
|
||||||
|
address_heap = green
|
||||||
|
address_stack = pink
|
||||||
|
context_title_line = gray
|
||||||
|
context_title_message = cyan
|
||||||
|
default_title_line = gray
|
||||||
|
default_title_message = cyan
|
||||||
|
dereference_base_address = cyan
|
||||||
|
dereference_code = gray
|
||||||
|
dereference_register_value = bold blue
|
||||||
|
dereference_string = yellow
|
||||||
|
disassemble_current_instruction = green
|
||||||
|
registers_register_name = blue
|
||||||
|
registers_value_changed = bold red
|
||||||
|
source_current_line = green
|
||||||
|
table_heading = blue
|
||||||
|
|
||||||
|
[trace-run]
|
||||||
|
max_tracing_recursion = 1
|
||||||
|
tracefile_prefix = ./gef-trace-
|
||||||
|
|
||||||
|
[aliases]
|
||||||
|
pf = print-format
|
||||||
|
status = process-status
|
||||||
|
binaryninja-interact = ida-interact
|
||||||
|
bn = ida-interact
|
||||||
|
binja = ida-interact
|
||||||
|
lookup = scan
|
||||||
|
grep = search-pattern
|
||||||
|
xref = search-pattern
|
||||||
|
flags = edit-flags
|
||||||
|
sc-search = shellcode search
|
||||||
|
sc-get = shellcode get
|
||||||
|
ps = process-search
|
||||||
|
start = entry-break
|
||||||
|
nb = name-break
|
||||||
|
ctx = context
|
||||||
|
telescope = dereference
|
||||||
|
pattern offset = pattern search
|
||||||
|
hl = highlight
|
||||||
|
highlight ls = highlight list
|
||||||
|
hll = highlight list
|
||||||
|
hlc = highlight clear
|
||||||
|
highlight set = highlight add
|
||||||
|
hla = highlight add
|
||||||
|
highlight delete = highlight remove
|
||||||
|
highlight del = highlight remove
|
||||||
|
highlight unset = highlight remove
|
||||||
|
highlight rm = highlight remove
|
||||||
|
hlr = highlight remove
|
||||||
|
fmtstr-helper = format-string-helper
|
||||||
|
screen-setup = tmux-setup
|
||||||
|
|
||||||
22
dotfiles/gemini/settings.json
Normal file
22
dotfiles/gemini/settings.json
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
{
|
||||||
|
"security": {
|
||||||
|
"auth": {
|
||||||
|
"selectedType": "oauth-personal"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"context": {
|
||||||
|
"fileName": [
|
||||||
|
"AGENTS.md",
|
||||||
|
"GEMINI.md"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"selectedAuthType": "gemini-api-key",
|
||||||
|
"general": {
|
||||||
|
"vimMode": true,
|
||||||
|
"sessionRetention": {
|
||||||
|
"enabled": true,
|
||||||
|
"maxAge": "30d",
|
||||||
|
"warningAcknowledged": true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,12 +1,12 @@
|
|||||||
[user]
|
[user]
|
||||||
name = David Tomaschik
|
name = David Tomaschik
|
||||||
email = david@systemoverlord.com
|
useConfigOnly = true
|
||||||
signingKey = 0x5DEA789B
|
|
||||||
|
|
||||||
[core]
|
[core]
|
||||||
excludesfile = ~/.gitignore
|
excludesfile = ~/.gitignore
|
||||||
editor = vim
|
editor = vim
|
||||||
whitespace = trailing-space,space-before-tab
|
whitespace = trailing-space,space-before-tab
|
||||||
|
pager = command -v delta >/dev/null 2>&1 && delta || less -eFiJM~ -j3
|
||||||
|
|
||||||
[color]
|
[color]
|
||||||
diff = auto
|
diff = auto
|
||||||
@@ -14,6 +14,7 @@
|
|||||||
|
|
||||||
[diff]
|
[diff]
|
||||||
tool = vimdiff
|
tool = vimdiff
|
||||||
|
colorMoved = default
|
||||||
|
|
||||||
[difftool]
|
[difftool]
|
||||||
prompt = false
|
prompt = false
|
||||||
@@ -23,9 +24,12 @@
|
|||||||
last = log -1 HEAD
|
last = log -1 HEAD
|
||||||
# Thanks to
|
# Thanks to
|
||||||
# http://durdn.com/blog/2012/11/22/must-have-git-aliases-advanced-examples/
|
# http://durdn.com/blog/2012/11/22/must-have-git-aliases-advanced-examples/
|
||||||
ls = log --pretty=format:"%C(yellow)%h%Cred%d\\ %Creset%s%Cblue\\ [%cn]" --decorate
|
logs = log --pretty=format:"%C(yellow)%h%Cred%d\\ %Creset%s%Cblue\\ [%cn]" --decorate
|
||||||
|
lg = log -p
|
||||||
ll = log --pretty=format:"%C(yellow)%h%Cred%d\\ %Creset%s%Cblue\\ [%cn]" --decorate --numstat
|
ll = log --pretty=format:"%C(yellow)%h%Cred%d\\ %Creset%s%Cblue\\ [%cn]" --decorate --numstat
|
||||||
files = ls-files
|
files = ls-files
|
||||||
|
ls = ls-files
|
||||||
|
lol = log --graph --pretty=format:'%C(yellow)%h%Creset %an: %s - %Creset %C(yellow)%d%Creset %Cblue(%cr)%Creset' --abbrev-commit --date=relative
|
||||||
f = "!git ls-files | grep -i"
|
f = "!git ls-files | grep -i"
|
||||||
logtree = log --graph --oneline --decorate --all
|
logtree = log --graph --oneline --decorate --all
|
||||||
|
|
||||||
@@ -40,10 +44,13 @@
|
|||||||
|
|
||||||
# Site specific config
|
# Site specific config
|
||||||
[url "https://github.com/"]
|
[url "https://github.com/"]
|
||||||
insteadOf = github://
|
insteadOf = "github:"
|
||||||
|
insteadOf = "github://"
|
||||||
|
|
||||||
[url "ssh://git@github.com/"]
|
[url "ssh://git@github.com/"]
|
||||||
pushInsteadOf = github://
|
pushInsteadOf = "github:"
|
||||||
|
pushInsteadOf = "github://"
|
||||||
|
pushInsteadOf = "https://github.com/"
|
||||||
|
|
||||||
[url "git://gist.github.com/"]
|
[url "git://gist.github.com/"]
|
||||||
insteadOf = "gist:"
|
insteadOf = "gist:"
|
||||||
@@ -51,5 +58,42 @@
|
|||||||
[url "git@gist.github.com:"]
|
[url "git@gist.github.com:"]
|
||||||
pushInsteadOf = "gist:"
|
pushInsteadOf = "gist:"
|
||||||
pushInsteadOf = "git://gist.github.com/"
|
pushInsteadOf = "git://gist.github.com/"
|
||||||
|
|
||||||
[credential]
|
[credential]
|
||||||
helper = cache --timeout=36000
|
helper = cache --timeout=36000
|
||||||
|
|
||||||
|
[receive]
|
||||||
|
denyCurrentBranch = updateInstead
|
||||||
|
|
||||||
|
[merge]
|
||||||
|
tool = vimdiff
|
||||||
|
conflictstyle = diff3
|
||||||
|
|
||||||
|
[mergetool]
|
||||||
|
prompt = false
|
||||||
|
|
||||||
|
[pull]
|
||||||
|
rebase = false
|
||||||
|
|
||||||
|
[init]
|
||||||
|
defaultBranch = main
|
||||||
|
|
||||||
|
[interactive]
|
||||||
|
diffFilter = command -v delta >/dev/null 2>&1 && delta || cat
|
||||||
|
|
||||||
|
[delta]
|
||||||
|
navigate = true
|
||||||
|
line-numbers = true
|
||||||
|
|
||||||
|
[filter "lfs"]
|
||||||
|
required = true
|
||||||
|
clean = git-lfs clean -- %f
|
||||||
|
smudge = git-lfs smudge -- %f
|
||||||
|
process = git-lfs filter-process
|
||||||
|
|
||||||
|
[include]
|
||||||
|
path = ~/.gitconfig.d/override
|
||||||
|
path = ~/.gitconfig.d/local
|
||||||
|
|
||||||
|
[includeIf "gitdir:~/personal/"]
|
||||||
|
path = ~/.gitconfig.d/personal
|
||||||
|
|||||||
5
dotfiles/gitconfig.d/override
Normal file
5
dotfiles/gitconfig.d/override
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
[user]
|
||||||
|
email = david@systemoverlord.com
|
||||||
|
|
||||||
|
[github]
|
||||||
|
user = matir
|
||||||
2
dotfiles/gitconfig.d/personal
Normal file
2
dotfiles/gitconfig.d/personal
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
[user]
|
||||||
|
email = david@systemoverlord.com
|
||||||
@@ -17,3 +17,24 @@ Thumbs.db
|
|||||||
# Try to avoid accidentally checking in private keys
|
# Try to avoid accidentally checking in private keys
|
||||||
id_rsa
|
id_rsa
|
||||||
id_ecdsa
|
id_ecdsa
|
||||||
|
id_ed25519
|
||||||
|
|
||||||
|
# Kicad backup files
|
||||||
|
*.kicad_pcb-bak
|
||||||
|
|
||||||
|
# Mypy cache path
|
||||||
|
.mypy_cache
|
||||||
|
|
||||||
|
# These files should basically never be committed
|
||||||
|
.env
|
||||||
|
|
||||||
|
# Mise local
|
||||||
|
mise.local.toml
|
||||||
|
|
||||||
|
# AI Tool Configs
|
||||||
|
.aider/
|
||||||
|
.claude/
|
||||||
|
.continue/
|
||||||
|
.copilot/
|
||||||
|
.cursor/
|
||||||
|
.gemini/
|
||||||
|
|||||||
@@ -1,2 +1 @@
|
|||||||
keyserver hkps://hkps.pool.sks-keyservers.net
|
keyserver hkps://keys.openpgp.org
|
||||||
hkp-cacert ~/.gnupg/sks-keyservers.pem
|
|
||||||
|
|||||||
@@ -2,4 +2,3 @@ default-cache-ttl 7200
|
|||||||
default-cache-ttl-ssh 7200
|
default-cache-ttl-ssh 7200
|
||||||
max-cache-ttl 86400
|
max-cache-ttl 86400
|
||||||
max-cache-ttl-ssh 86400
|
max-cache-ttl-ssh 86400
|
||||||
enable-ssh-support
|
|
||||||
|
|||||||
@@ -1,9 +1,10 @@
|
|||||||
use-agent
|
use-agent
|
||||||
# HKPS requires gnupg-curl for gpg1
|
# HKPS requires gnupg-curl for gpg1
|
||||||
keyserver hkps://hkps.pool.sks-keyservers.net
|
keyserver hkps://keyserver.ubuntu.com
|
||||||
keyserver-options auto-key-retrieve no-honor-keyserver-url
|
keyserver-options auto-key-retrieve no-honor-keyserver-url
|
||||||
auto-key-locate keyserver
|
auto-key-locate keyserver
|
||||||
personal-digest-preferences SHA256
|
personal-digest-preferences SHA256
|
||||||
cert-digest-algo SHA256
|
cert-digest-algo SHA256
|
||||||
default-preference-list SHA512 SHA384 SHA256 SHA224 AES256 AES192 AES CAST5 ZLIB BZIP2 ZIP Uncompressed
|
default-preference-list SHA512 SHA384 SHA256 SHA224 AES256 AES192 AES CAST5 ZLIB BZIP2 ZIP Uncompressed
|
||||||
cipher-algo AES256
|
cipher-algo AES256
|
||||||
|
default-key 7FD58D9A196DCEEEAD671F94F4D7A7915DEA789B
|
||||||
|
|||||||
4
dotfiles/inputrc
Normal file
4
dotfiles/inputrc
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
set editing-mode vi
|
||||||
|
|
||||||
|
set keymap vi
|
||||||
|
set convert-meta on
|
||||||
10
dotfiles/ipython.py
Normal file
10
dotfiles/ipython.py
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
try:
|
||||||
|
import os, IPython
|
||||||
|
from traitlets import config
|
||||||
|
os.environ['PYTHONSTARTUP'] = '' # Prevent running this again
|
||||||
|
cfg = config.Config()
|
||||||
|
cfg.TerminalIPythonApp.display_banner = False
|
||||||
|
IPython.start_ipython(config=cfg)
|
||||||
|
raise SystemExit
|
||||||
|
except ImportError:
|
||||||
|
pass
|
||||||
611
dotfiles/ipython/profile_default/ipython_config.py
Normal file
611
dotfiles/ipython/profile_default/ipython_config.py
Normal file
@@ -0,0 +1,611 @@
|
|||||||
|
# Configuration file for ipython.
|
||||||
|
|
||||||
|
#------------------------------------------------------------------------------
|
||||||
|
# InteractiveShellApp(Configurable) configuration
|
||||||
|
#------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
## A Mixin for applications that start InteractiveShell instances.
|
||||||
|
#
|
||||||
|
# Provides configurables for loading extensions and executing files as part of
|
||||||
|
# configuring a Shell environment.
|
||||||
|
#
|
||||||
|
# The following methods should be called by the :meth:`initialize` method of the
|
||||||
|
# subclass:
|
||||||
|
#
|
||||||
|
# - :meth:`init_path`
|
||||||
|
# - :meth:`init_shell` (to be implemented by the subclass)
|
||||||
|
# - :meth:`init_gui_pylab`
|
||||||
|
# - :meth:`init_extensions`
|
||||||
|
# - :meth:`init_code`
|
||||||
|
|
||||||
|
## Execute the given command string.
|
||||||
|
#c.InteractiveShellApp.code_to_run = ''
|
||||||
|
|
||||||
|
## Run the file referenced by the PYTHONSTARTUP environment variable at IPython
|
||||||
|
# startup.
|
||||||
|
c.InteractiveShellApp.exec_PYTHONSTARTUP = False
|
||||||
|
|
||||||
|
## List of files to run at IPython startup.
|
||||||
|
#c.InteractiveShellApp.exec_files = []
|
||||||
|
|
||||||
|
## lines of code to run at IPython startup.
|
||||||
|
#c.InteractiveShellApp.exec_lines = []
|
||||||
|
|
||||||
|
## A list of dotted module names of IPython extensions to load.
|
||||||
|
#c.InteractiveShellApp.extensions = []
|
||||||
|
|
||||||
|
## dotted module name of an IPython extension to load.
|
||||||
|
#c.InteractiveShellApp.extra_extension = ''
|
||||||
|
|
||||||
|
## A file to be run
|
||||||
|
#c.InteractiveShellApp.file_to_run = ''
|
||||||
|
|
||||||
|
## Enable GUI event loop integration with any of ('glut', 'gtk', 'gtk2', 'gtk3',
|
||||||
|
# 'osx', 'pyglet', 'qt', 'qt4', 'qt5', 'tk', 'wx', 'gtk2', 'qt4').
|
||||||
|
#c.InteractiveShellApp.gui = None
|
||||||
|
|
||||||
|
## Should variables loaded at startup (by startup files, exec_lines, etc.) be
|
||||||
|
# hidden from tools like %who?
|
||||||
|
#c.InteractiveShellApp.hide_initial_ns = True
|
||||||
|
|
||||||
|
## Configure matplotlib for interactive use with the default matplotlib backend.
|
||||||
|
#c.InteractiveShellApp.matplotlib = None
|
||||||
|
|
||||||
|
## Run the module as a script.
|
||||||
|
#c.InteractiveShellApp.module_to_run = ''
|
||||||
|
|
||||||
|
## Pre-load matplotlib and numpy for interactive use, selecting a particular
|
||||||
|
# matplotlib backend and loop integration.
|
||||||
|
#c.InteractiveShellApp.pylab = None
|
||||||
|
|
||||||
|
## If true, IPython will populate the user namespace with numpy, pylab, etc. and
|
||||||
|
# an ``import *`` is done from numpy and pylab, when using pylab mode.
|
||||||
|
#
|
||||||
|
# When False, pylab mode should not import any names into the user namespace.
|
||||||
|
#c.InteractiveShellApp.pylab_import_all = True
|
||||||
|
|
||||||
|
## Reraise exceptions encountered loading IPython extensions?
|
||||||
|
#c.InteractiveShellApp.reraise_ipython_extension_failures = False
|
||||||
|
|
||||||
|
#------------------------------------------------------------------------------
|
||||||
|
# Application(SingletonConfigurable) configuration
|
||||||
|
#------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
## This is an application.
|
||||||
|
|
||||||
|
## The date format used by logging formatters for %(asctime)s
|
||||||
|
#c.Application.log_datefmt = '%Y-%m-%d %H:%M:%S'
|
||||||
|
|
||||||
|
## The Logging format template
|
||||||
|
#c.Application.log_format = '[%(name)s]%(highlevel)s %(message)s'
|
||||||
|
|
||||||
|
## Set the log level by value or name.
|
||||||
|
#c.Application.log_level = 30
|
||||||
|
|
||||||
|
#------------------------------------------------------------------------------
|
||||||
|
# BaseIPythonApplication(Application) configuration
|
||||||
|
#------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
## IPython: an enhanced interactive Python shell.
|
||||||
|
|
||||||
|
## Whether to create profile dir if it doesn't exist
|
||||||
|
#c.BaseIPythonApplication.auto_create = False
|
||||||
|
|
||||||
|
## Whether to install the default config files into the profile dir. If a new
|
||||||
|
# profile is being created, and IPython contains config files for that profile,
|
||||||
|
# then they will be staged into the new directory. Otherwise, default config
|
||||||
|
# files will be automatically generated.
|
||||||
|
#c.BaseIPythonApplication.copy_config_files = False
|
||||||
|
|
||||||
|
## Path to an extra config file to load.
|
||||||
|
#
|
||||||
|
# If specified, load this config file in addition to any other IPython config.
|
||||||
|
#c.BaseIPythonApplication.extra_config_file = ''
|
||||||
|
|
||||||
|
## The name of the IPython directory. This directory is used for logging
|
||||||
|
# configuration (through profiles), history storage, etc. The default is usually
|
||||||
|
# $HOME/.ipython. This option can also be specified through the environment
|
||||||
|
# variable IPYTHONDIR.
|
||||||
|
#c.BaseIPythonApplication.ipython_dir = ''
|
||||||
|
|
||||||
|
## Whether to overwrite existing config files when copying
|
||||||
|
#c.BaseIPythonApplication.overwrite = False
|
||||||
|
|
||||||
|
## The IPython profile to use.
|
||||||
|
#c.BaseIPythonApplication.profile = 'default'
|
||||||
|
|
||||||
|
## Create a massive crash report when IPython encounters what may be an internal
|
||||||
|
# error. The default is to append a short message to the usual traceback
|
||||||
|
#c.BaseIPythonApplication.verbose_crash = False
|
||||||
|
|
||||||
|
#------------------------------------------------------------------------------
|
||||||
|
# TerminalIPythonApp(BaseIPythonApplication,InteractiveShellApp) configuration
|
||||||
|
#------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
## Whether to display a banner upon starting IPython.
|
||||||
|
#c.TerminalIPythonApp.display_banner = True
|
||||||
|
|
||||||
|
## If a command or file is given via the command-line, e.g. 'ipython foo.py',
|
||||||
|
# start an interactive shell after executing the file or command.
|
||||||
|
#c.TerminalIPythonApp.force_interact = False
|
||||||
|
|
||||||
|
## Class to use to instantiate the TerminalInteractiveShell object. Useful for
|
||||||
|
# custom Frontends
|
||||||
|
#c.TerminalIPythonApp.interactive_shell_class = 'IPython.terminal.interactiveshell.TerminalInteractiveShell'
|
||||||
|
|
||||||
|
## Start IPython quickly by skipping the loading of config files.
|
||||||
|
#c.TerminalIPythonApp.quick = False
|
||||||
|
|
||||||
|
#------------------------------------------------------------------------------
|
||||||
|
# InteractiveShell(SingletonConfigurable) configuration
|
||||||
|
#------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
## An enhanced, interactive shell for Python.
|
||||||
|
|
||||||
|
## 'all', 'last', 'last_expr' or 'none', 'last_expr_or_assign' specifying which
|
||||||
|
# nodes should be run interactively (displaying output from expressions).
|
||||||
|
#c.InteractiveShell.ast_node_interactivity = 'last_expr'
|
||||||
|
|
||||||
|
## A list of ast.NodeTransformer subclass instances, which will be applied to
|
||||||
|
# user input before code is run.
|
||||||
|
#c.InteractiveShell.ast_transformers = []
|
||||||
|
|
||||||
|
## Automatically run await statement in the top level repl.
|
||||||
|
#c.InteractiveShell.autoawait = True
|
||||||
|
|
||||||
|
## Make IPython automatically call any callable object even if you didn't type
|
||||||
|
# explicit parentheses. For example, 'str 43' becomes 'str(43)' automatically.
|
||||||
|
# The value can be '0' to disable the feature, '1' for 'smart' autocall, where
|
||||||
|
# it is not applied if there are no more arguments on the line, and '2' for
|
||||||
|
# 'full' autocall, where all callable objects are automatically called (even if
|
||||||
|
# no arguments are present).
|
||||||
|
#c.InteractiveShell.autocall = 0
|
||||||
|
|
||||||
|
## Autoindent IPython code entered interactively.
|
||||||
|
#c.InteractiveShell.autoindent = True
|
||||||
|
|
||||||
|
## Enable magic commands to be called without the leading %.
|
||||||
|
#c.InteractiveShell.automagic = True
|
||||||
|
|
||||||
|
## The part of the banner to be printed before the profile
|
||||||
|
#c.InteractiveShell.banner1 = "Python 3.7.3rc1 (default, Mar 13 2019, 11:01:15) \nType 'copyright', 'credits' or 'license' for more information\nIPython 7.5.0 -- An enhanced Interactive Python. Type '?' for help.\n"
|
||||||
|
|
||||||
|
## The part of the banner to be printed after the profile
|
||||||
|
#c.InteractiveShell.banner2 = ''
|
||||||
|
|
||||||
|
## Set the size of the output cache. The default is 1000, you can change it
|
||||||
|
# permanently in your config file. Setting it to 0 completely disables the
|
||||||
|
# caching system, and the minimum value accepted is 3 (if you provide a value
|
||||||
|
# less than 3, it is reset to 0 and a warning is issued). This limit is defined
|
||||||
|
# because otherwise you'll spend more time re-flushing a too small cache than
|
||||||
|
# working
|
||||||
|
#c.InteractiveShell.cache_size = 1000
|
||||||
|
|
||||||
|
## Use colors for displaying information about objects. Because this information
|
||||||
|
# is passed through a pager (like 'less'), and some pagers get confused with
|
||||||
|
# color codes, this capability can be turned off.
|
||||||
|
#c.InteractiveShell.color_info = True
|
||||||
|
|
||||||
|
## Set the color scheme (NoColor, Neutral, Linux, or LightBG).
|
||||||
|
#c.InteractiveShell.colors = 'Neutral'
|
||||||
|
|
||||||
|
##
|
||||||
|
#c.InteractiveShell.debug = False
|
||||||
|
|
||||||
|
## Don't call post-execute functions that have failed in the past.
|
||||||
|
#c.InteractiveShell.disable_failing_post_execute = False
|
||||||
|
|
||||||
|
## If True, anything that would be passed to the pager will be displayed as
|
||||||
|
# regular output instead.
|
||||||
|
#c.InteractiveShell.display_page = False
|
||||||
|
|
||||||
|
## (Provisional API) enables html representation in mime bundles sent to pagers.
|
||||||
|
#c.InteractiveShell.enable_html_pager = False
|
||||||
|
|
||||||
|
## Total length of command history
|
||||||
|
#c.InteractiveShell.history_length = 10000
|
||||||
|
|
||||||
|
## The number of saved history entries to be loaded into the history buffer at
|
||||||
|
# startup.
|
||||||
|
#c.InteractiveShell.history_load_length = 1000
|
||||||
|
|
||||||
|
##
|
||||||
|
#c.InteractiveShell.ipython_dir = ''
|
||||||
|
|
||||||
|
## Start logging to the given file in append mode. Use `logfile` to specify a log
|
||||||
|
# file to **overwrite** logs to.
|
||||||
|
#c.InteractiveShell.logappend = ''
|
||||||
|
|
||||||
|
## The name of the logfile to use.
|
||||||
|
#c.InteractiveShell.logfile = ''
|
||||||
|
|
||||||
|
## Start logging to the default log file in overwrite mode. Use `logappend` to
|
||||||
|
# specify a log file to **append** logs to.
|
||||||
|
#c.InteractiveShell.logstart = False
|
||||||
|
|
||||||
|
## Select the loop runner that will be used to execute top-level asynchronous
|
||||||
|
# code
|
||||||
|
#c.InteractiveShell.loop_runner = 'IPython.core.interactiveshell._asyncio_runner'
|
||||||
|
|
||||||
|
##
|
||||||
|
#c.InteractiveShell.object_info_string_level = 0
|
||||||
|
|
||||||
|
## Automatically call the pdb debugger after every exception.
|
||||||
|
#c.InteractiveShell.pdb = False
|
||||||
|
|
||||||
|
## Deprecated since IPython 4.0 and ignored since 5.0, set
|
||||||
|
# TerminalInteractiveShell.prompts object directly.
|
||||||
|
#c.InteractiveShell.prompt_in1 = 'In [\\#]: '
|
||||||
|
|
||||||
|
## Deprecated since IPython 4.0 and ignored since 5.0, set
|
||||||
|
# TerminalInteractiveShell.prompts object directly.
|
||||||
|
#c.InteractiveShell.prompt_in2 = ' .\\D.: '
|
||||||
|
|
||||||
|
## Deprecated since IPython 4.0 and ignored since 5.0, set
|
||||||
|
# TerminalInteractiveShell.prompts object directly.
|
||||||
|
#c.InteractiveShell.prompt_out = 'Out[\\#]: '
|
||||||
|
|
||||||
|
## Deprecated since IPython 4.0 and ignored since 5.0, set
|
||||||
|
# TerminalInteractiveShell.prompts object directly.
|
||||||
|
#c.InteractiveShell.prompts_pad_left = True
|
||||||
|
|
||||||
|
##
|
||||||
|
#c.InteractiveShell.quiet = False
|
||||||
|
|
||||||
|
##
|
||||||
|
#c.InteractiveShell.separate_in = '\n'
|
||||||
|
|
||||||
|
##
|
||||||
|
#c.InteractiveShell.separate_out = ''
|
||||||
|
|
||||||
|
##
|
||||||
|
#c.InteractiveShell.separate_out2 = ''
|
||||||
|
|
||||||
|
## Show rewritten input, e.g. for autocall.
|
||||||
|
#c.InteractiveShell.show_rewritten_input = True
|
||||||
|
|
||||||
|
## Enables rich html representation of docstrings. (This requires the docrepr
|
||||||
|
# module).
|
||||||
|
#c.InteractiveShell.sphinxify_docstring = False
|
||||||
|
|
||||||
|
##
|
||||||
|
#c.InteractiveShell.wildcards_case_sensitive = True
|
||||||
|
|
||||||
|
## Switch modes for the IPython exception handlers.
|
||||||
|
#c.InteractiveShell.xmode = 'Context'
|
||||||
|
|
||||||
|
#------------------------------------------------------------------------------
|
||||||
|
# TerminalInteractiveShell(InteractiveShell) configuration
|
||||||
|
#------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
## Set to confirm when you try to exit IPython with an EOF (Control-D in Unix,
|
||||||
|
# Control-Z/Enter in Windows). By typing 'exit' or 'quit', you can force a
|
||||||
|
# direct exit without any confirmation.
|
||||||
|
#c.TerminalInteractiveShell.confirm_exit = True
|
||||||
|
|
||||||
|
## Options for displaying tab completions, 'column', 'multicolumn', and
|
||||||
|
# 'readlinelike'. These options are for `prompt_toolkit`, see `prompt_toolkit`
|
||||||
|
# documentation for more information.
|
||||||
|
#c.TerminalInteractiveShell.display_completions = 'multicolumn'
|
||||||
|
|
||||||
|
## Shortcut style to use at the prompt. 'vi' or 'emacs'.
|
||||||
|
c.TerminalInteractiveShell.editing_mode = 'vi'
|
||||||
|
|
||||||
|
## Set the editor used by IPython (default to $EDITOR/vi/notepad).
|
||||||
|
#c.TerminalInteractiveShell.editor = 'vim'
|
||||||
|
|
||||||
|
## Allows to enable/disable the prompt toolkit history search
|
||||||
|
#c.TerminalInteractiveShell.enable_history_search = True
|
||||||
|
|
||||||
|
## Enable vi (v) or Emacs (C-X C-E) shortcuts to open an external editor. This is
|
||||||
|
# in addition to the F2 binding, which is always enabled.
|
||||||
|
#c.TerminalInteractiveShell.extra_open_editor_shortcuts = False
|
||||||
|
|
||||||
|
## Provide an alternative handler to be called when the user presses Return. This
|
||||||
|
# is an advanced option intended for debugging, which may be changed or removed
|
||||||
|
# in later releases.
|
||||||
|
#c.TerminalInteractiveShell.handle_return = None
|
||||||
|
|
||||||
|
## Highlight matching brackets.
|
||||||
|
#c.TerminalInteractiveShell.highlight_matching_brackets = True
|
||||||
|
|
||||||
|
## The name or class of a Pygments style to use for syntax highlighting. To see
|
||||||
|
# available styles, run `pygmentize -L styles`.
|
||||||
|
#c.TerminalInteractiveShell.highlighting_style = traitlets.Undefined
|
||||||
|
|
||||||
|
## Override highlighting format for specific tokens
|
||||||
|
#c.TerminalInteractiveShell.highlighting_style_overrides = {}
|
||||||
|
|
||||||
|
## Enable mouse support in the prompt (Note: prevents selecting text with the
|
||||||
|
# mouse)
|
||||||
|
#c.TerminalInteractiveShell.mouse_support = False
|
||||||
|
|
||||||
|
## Display the current vi mode (when using vi editing mode).
|
||||||
|
#c.TerminalInteractiveShell.prompt_includes_vi_mode = True
|
||||||
|
|
||||||
|
## Class used to generate Prompt token for prompt_toolkit
|
||||||
|
#c.TerminalInteractiveShell.prompts_class = 'IPython.terminal.prompts.Prompts'
|
||||||
|
|
||||||
|
## Use `raw_input` for the REPL, without completion and prompt colors.
|
||||||
|
#
|
||||||
|
# Useful when controlling IPython as a subprocess, and piping STDIN/OUT/ERR.
|
||||||
|
# Known usage are: IPython own testing machinery, and emacs inferior-shell
|
||||||
|
# integration through elpy.
|
||||||
|
#
|
||||||
|
# This mode default to `True` if the `IPY_TEST_SIMPLE_PROMPT` environment
|
||||||
|
# variable is set, or the current terminal is not a tty.
|
||||||
|
#c.TerminalInteractiveShell.simple_prompt = False
|
||||||
|
|
||||||
|
## Number of line at the bottom of the screen to reserve for the completion menu
|
||||||
|
#c.TerminalInteractiveShell.space_for_menu = 6
|
||||||
|
|
||||||
|
## Automatically set the terminal title
|
||||||
|
#c.TerminalInteractiveShell.term_title = True
|
||||||
|
|
||||||
|
## Customize the terminal title format. This is a python format string.
|
||||||
|
# Available substitutions are: {cwd}.
|
||||||
|
#c.TerminalInteractiveShell.term_title_format = 'IPython: {cwd}'
|
||||||
|
|
||||||
|
## Use 24bit colors instead of 256 colors in prompt highlighting. If your
|
||||||
|
# terminal supports true color, the following command should print 'TRUECOLOR'
|
||||||
|
# in orange: printf "\x1b[38;2;255;100;0mTRUECOLOR\x1b[0m\n"
|
||||||
|
#c.TerminalInteractiveShell.true_color = False
|
||||||
|
|
||||||
|
#------------------------------------------------------------------------------
|
||||||
|
# HistoryAccessor(HistoryAccessorBase) configuration
|
||||||
|
#------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
## Access the history database without adding to it.
|
||||||
|
#
|
||||||
|
# This is intended for use by standalone history tools. IPython shells use
|
||||||
|
# HistoryManager, below, which is a subclass of this.
|
||||||
|
|
||||||
|
## Options for configuring the SQLite connection
|
||||||
|
#
|
||||||
|
# These options are passed as keyword args to sqlite3.connect when establishing
|
||||||
|
# database connections.
|
||||||
|
#c.HistoryAccessor.connection_options = {}
|
||||||
|
|
||||||
|
## enable the SQLite history
|
||||||
|
#
|
||||||
|
# set enabled=False to disable the SQLite history, in which case there will be
|
||||||
|
# no stored history, no SQLite connection, and no background saving thread.
|
||||||
|
# This may be necessary in some threaded environments where IPython is embedded.
|
||||||
|
#c.HistoryAccessor.enabled = True
|
||||||
|
|
||||||
|
## Path to file to use for SQLite history database.
|
||||||
|
#
|
||||||
|
# By default, IPython will put the history database in the IPython profile
|
||||||
|
# directory. If you would rather share one history among profiles, you can set
|
||||||
|
# this value in each, so that they are consistent.
|
||||||
|
#
|
||||||
|
# Due to an issue with fcntl, SQLite is known to misbehave on some NFS mounts.
|
||||||
|
# If you see IPython hanging, try setting this to something on a local disk,
|
||||||
|
# e.g::
|
||||||
|
#
|
||||||
|
# ipython --HistoryManager.hist_file=/tmp/ipython_hist.sqlite
|
||||||
|
#
|
||||||
|
# you can also use the specific value `:memory:` (including the colon at both
|
||||||
|
# end but not the back ticks), to avoid creating an history file.
|
||||||
|
#c.HistoryAccessor.hist_file = ''
|
||||||
|
|
||||||
|
#------------------------------------------------------------------------------
|
||||||
|
# HistoryManager(HistoryAccessor) configuration
|
||||||
|
#------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
## A class to organize all history-related functionality in one place.
|
||||||
|
|
||||||
|
## Write to database every x commands (higher values save disk access & power).
|
||||||
|
# Values of 1 or less effectively disable caching.
|
||||||
|
#c.HistoryManager.db_cache_size = 0
|
||||||
|
|
||||||
|
## Should the history database include output? (default: no)
|
||||||
|
#c.HistoryManager.db_log_output = False
|
||||||
|
|
||||||
|
#------------------------------------------------------------------------------
|
||||||
|
# ProfileDir(LoggingConfigurable) configuration
|
||||||
|
#------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
## An object to manage the profile directory and its resources.
|
||||||
|
#
|
||||||
|
# The profile directory is used by all IPython applications, to manage
|
||||||
|
# configuration, logging and security.
|
||||||
|
#
|
||||||
|
# This object knows how to find, create and manage these directories. This
|
||||||
|
# should be used by any code that wants to handle profiles.
|
||||||
|
|
||||||
|
## Set the profile location directly. This overrides the logic used by the
|
||||||
|
# `profile` option.
|
||||||
|
#c.ProfileDir.location = ''
|
||||||
|
|
||||||
|
#------------------------------------------------------------------------------
|
||||||
|
# BaseFormatter(Configurable) configuration
|
||||||
|
#------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
## A base formatter class that is configurable.
|
||||||
|
#
|
||||||
|
# This formatter should usually be used as the base class of all formatters. It
|
||||||
|
# is a traited :class:`Configurable` class and includes an extensible API for
|
||||||
|
# users to determine how their objects are formatted. The following logic is
|
||||||
|
# used to find a function to format an given object.
|
||||||
|
#
|
||||||
|
# 1. The object is introspected to see if it has a method with the name
|
||||||
|
# :attr:`print_method`. If is does, that object is passed to that method
|
||||||
|
# for formatting.
|
||||||
|
# 2. If no print method is found, three internal dictionaries are consulted
|
||||||
|
# to find print method: :attr:`singleton_printers`, :attr:`type_printers`
|
||||||
|
# and :attr:`deferred_printers`.
|
||||||
|
#
|
||||||
|
# Users should use these dictionaries to register functions that will be used to
|
||||||
|
# compute the format data for their objects (if those objects don't have the
|
||||||
|
# special print methods). The easiest way of using these dictionaries is through
|
||||||
|
# the :meth:`for_type` and :meth:`for_type_by_name` methods.
|
||||||
|
#
|
||||||
|
# If no function/callable is found to compute the format data, ``None`` is
|
||||||
|
# returned and this format type is not used.
|
||||||
|
|
||||||
|
##
|
||||||
|
#c.BaseFormatter.deferred_printers = {}
|
||||||
|
|
||||||
|
##
|
||||||
|
#c.BaseFormatter.enabled = True
|
||||||
|
|
||||||
|
##
|
||||||
|
#c.BaseFormatter.singleton_printers = {}
|
||||||
|
|
||||||
|
##
|
||||||
|
#c.BaseFormatter.type_printers = {}
|
||||||
|
|
||||||
|
#------------------------------------------------------------------------------
|
||||||
|
# PlainTextFormatter(BaseFormatter) configuration
|
||||||
|
#------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
## The default pretty-printer.
|
||||||
|
#
|
||||||
|
# This uses :mod:`IPython.lib.pretty` to compute the format data of the object.
|
||||||
|
# If the object cannot be pretty printed, :func:`repr` is used. See the
|
||||||
|
# documentation of :mod:`IPython.lib.pretty` for details on how to write pretty
|
||||||
|
# printers. Here is a simple example::
|
||||||
|
#
|
||||||
|
# def dtype_pprinter(obj, p, cycle):
|
||||||
|
# if cycle:
|
||||||
|
# return p.text('dtype(...)')
|
||||||
|
# if hasattr(obj, 'fields'):
|
||||||
|
# if obj.fields is None:
|
||||||
|
# p.text(repr(obj))
|
||||||
|
# else:
|
||||||
|
# p.begin_group(7, 'dtype([')
|
||||||
|
# for i, field in enumerate(obj.descr):
|
||||||
|
# if i > 0:
|
||||||
|
# p.text(',')
|
||||||
|
# p.breakable()
|
||||||
|
# p.pretty(field)
|
||||||
|
# p.end_group(7, '])')
|
||||||
|
|
||||||
|
##
|
||||||
|
#c.PlainTextFormatter.float_precision = ''
|
||||||
|
|
||||||
|
## Truncate large collections (lists, dicts, tuples, sets) to this size.
|
||||||
|
#
|
||||||
|
# Set to 0 to disable truncation.
|
||||||
|
#c.PlainTextFormatter.max_seq_length = 1000
|
||||||
|
|
||||||
|
##
|
||||||
|
#c.PlainTextFormatter.max_width = 79
|
||||||
|
|
||||||
|
##
|
||||||
|
#c.PlainTextFormatter.newline = '\n'
|
||||||
|
|
||||||
|
##
|
||||||
|
#c.PlainTextFormatter.pprint = True
|
||||||
|
|
||||||
|
##
|
||||||
|
#c.PlainTextFormatter.verbose = False
|
||||||
|
|
||||||
|
#------------------------------------------------------------------------------
|
||||||
|
# Completer(Configurable) configuration
|
||||||
|
#------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
## Enable unicode completions, e.g. \alpha<tab> . Includes completion of latex
|
||||||
|
# commands, unicode names, and expanding unicode characters back to latex
|
||||||
|
# commands.
|
||||||
|
#c.Completer.backslash_combining_completions = True
|
||||||
|
|
||||||
|
## Enable debug for the Completer. Mostly print extra information for
|
||||||
|
# experimental jedi integration.
|
||||||
|
#c.Completer.debug = False
|
||||||
|
|
||||||
|
## Activate greedy completion PENDING DEPRECTION. this is now mostly taken care
|
||||||
|
# of with Jedi.
|
||||||
|
#
|
||||||
|
# This will enable completion on elements of lists, results of function calls,
|
||||||
|
# etc., but can be unsafe because the code is actually evaluated on TAB.
|
||||||
|
#c.Completer.greedy = False
|
||||||
|
|
||||||
|
## Experimental: restrict time (in milliseconds) during which Jedi can compute
|
||||||
|
# types. Set to 0 to stop computing types. Non-zero value lower than 100ms may
|
||||||
|
# hurt performance by preventing jedi to build its cache.
|
||||||
|
#c.Completer.jedi_compute_type_timeout = 400
|
||||||
|
|
||||||
|
## Experimental: Use Jedi to generate autocompletions. Default to True if jedi is
|
||||||
|
# installed.
|
||||||
|
#c.Completer.use_jedi = True
|
||||||
|
|
||||||
|
#------------------------------------------------------------------------------
|
||||||
|
# IPCompleter(Completer) configuration
|
||||||
|
#------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
## Extension of the completer class with IPython-specific features
|
||||||
|
|
||||||
|
## DEPRECATED as of version 5.0.
|
||||||
|
#
|
||||||
|
# Instruct the completer to use __all__ for the completion
|
||||||
|
#
|
||||||
|
# Specifically, when completing on ``object.<tab>``.
|
||||||
|
#
|
||||||
|
# When True: only those names in obj.__all__ will be included.
|
||||||
|
#
|
||||||
|
# When False [default]: the __all__ attribute is ignored
|
||||||
|
#c.IPCompleter.limit_to__all__ = False
|
||||||
|
|
||||||
|
## Whether to merge completion results into a single list
|
||||||
|
#
|
||||||
|
# If False, only the completion results from the first non-empty completer will
|
||||||
|
# be returned.
|
||||||
|
#c.IPCompleter.merge_completions = True
|
||||||
|
|
||||||
|
## Instruct the completer to omit private method names
|
||||||
|
#
|
||||||
|
# Specifically, when completing on ``object.<tab>``.
|
||||||
|
#
|
||||||
|
# When 2 [default]: all names that start with '_' will be excluded.
|
||||||
|
#
|
||||||
|
# When 1: all 'magic' names (``__foo__``) will be excluded.
|
||||||
|
#
|
||||||
|
# When 0: nothing will be excluded.
|
||||||
|
#c.IPCompleter.omit__names = 2
|
||||||
|
|
||||||
|
#------------------------------------------------------------------------------
|
||||||
|
# ScriptMagics(Magics) configuration
|
||||||
|
#------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
## Magics for talking to scripts
|
||||||
|
#
|
||||||
|
# This defines a base `%%script` cell magic for running a cell with a program in
|
||||||
|
# a subprocess, and registers a few top-level magics that call %%script with
|
||||||
|
# common interpreters.
|
||||||
|
|
||||||
|
## Extra script cell magics to define
|
||||||
|
#
|
||||||
|
# This generates simple wrappers of `%%script foo` as `%%foo`.
|
||||||
|
#
|
||||||
|
# If you want to add script magics that aren't on your path, specify them in
|
||||||
|
# script_paths
|
||||||
|
#c.ScriptMagics.script_magics = []
|
||||||
|
|
||||||
|
## Dict mapping short 'ruby' names to full paths, such as '/opt/secret/bin/ruby'
|
||||||
|
#
|
||||||
|
# Only necessary for items in script_magics where the default path will not find
|
||||||
|
# the right interpreter.
|
||||||
|
#c.ScriptMagics.script_paths = {}
|
||||||
|
|
||||||
|
#------------------------------------------------------------------------------
|
||||||
|
# LoggingMagics(Magics) configuration
|
||||||
|
#------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
## Magics related to all logging machinery.
|
||||||
|
|
||||||
|
## Suppress output of log state when logging is enabled
|
||||||
|
#c.LoggingMagics.quiet = False
|
||||||
|
|
||||||
|
#------------------------------------------------------------------------------
|
||||||
|
# StoreMagics(Magics) configuration
|
||||||
|
#------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
## Lightweight persistence for python variables.
|
||||||
|
#
|
||||||
|
# Provides the %store magic.
|
||||||
|
|
||||||
|
## If True, any %store-d variables will be automatically restored when IPython
|
||||||
|
# starts.
|
||||||
|
#c.StoreMagics.autorestore = False
|
||||||
60
dotfiles/ipython/profile_default/startup/05-venv-manager.py
Normal file
60
dotfiles/ipython/profile_default/startup/05-venv-manager.py
Normal file
@@ -0,0 +1,60 @@
|
|||||||
|
import os
|
||||||
|
import sys
|
||||||
|
from IPython.terminal import prompts
|
||||||
|
|
||||||
|
def _setup_environment():
|
||||||
|
ip = get_ipython()
|
||||||
|
if not ip:
|
||||||
|
return
|
||||||
|
|
||||||
|
# 1. SEARCH LOGIC: Walk up the tree for a venv
|
||||||
|
active_venv_name = None
|
||||||
|
curr = os.getcwd()
|
||||||
|
|
||||||
|
while True:
|
||||||
|
for venv_name in ['.venv', 'env', 'venv']:
|
||||||
|
venv_path = os.path.join(curr, venv_name)
|
||||||
|
if os.path.isdir(venv_path):
|
||||||
|
# Platform-specific site-packages path
|
||||||
|
py_ver = f"python{sys.version_info.major}.{sys.version_info.minor}"
|
||||||
|
site_pkgs = os.path.join(venv_path, 'lib', py_ver, 'site-packages')
|
||||||
|
|
||||||
|
if os.path.exists(site_pkgs):
|
||||||
|
if site_pkgs not in sys.path:
|
||||||
|
sys.path.insert(0, site_pkgs)
|
||||||
|
sys.prefix = venv_path
|
||||||
|
active_venv_name = os.path.basename(venv_path)
|
||||||
|
break
|
||||||
|
|
||||||
|
if active_venv_name or os.path.exists(os.path.join(curr, '.git')):
|
||||||
|
break
|
||||||
|
|
||||||
|
parent = os.path.dirname(curr)
|
||||||
|
if parent == curr:
|
||||||
|
break
|
||||||
|
curr = parent
|
||||||
|
|
||||||
|
# 2. PROMPT LOGIC: Inject venv name into the UI
|
||||||
|
class VenvPrompts(prompts.Prompts):
|
||||||
|
|
||||||
|
_prompts = prompts
|
||||||
|
|
||||||
|
def in_prompt_tokens(self):
|
||||||
|
tokens = []
|
||||||
|
if active_venv_name:
|
||||||
|
tokens.append((self._prompts.Token.Prompt, f'({active_venv_name}) '))
|
||||||
|
|
||||||
|
tokens.extend([
|
||||||
|
(self._prompts.Token.Prompt, 'In ['),
|
||||||
|
(self._prompts.Token.PromptNum, str(self.shell.execution_count)),
|
||||||
|
(self._prompts.Token.Prompt, ']: '),
|
||||||
|
])
|
||||||
|
return tokens
|
||||||
|
|
||||||
|
ip.prompts = VenvPrompts(ip)
|
||||||
|
|
||||||
|
# Execute the setup
|
||||||
|
_setup_environment()
|
||||||
|
|
||||||
|
# cleanup
|
||||||
|
del _setup_environment, prompts
|
||||||
@@ -1,415 +0,0 @@
|
|||||||
servers = (
|
|
||||||
{
|
|
||||||
address = "ircs.overthewire.org";
|
|
||||||
chatnet = "overthewire";
|
|
||||||
port = "6697";
|
|
||||||
use_ssl = "yes";
|
|
||||||
ssl_verify = "no";
|
|
||||||
autoconnect = "yes";
|
|
||||||
},
|
|
||||||
{
|
|
||||||
address = "irc.secfo.org";
|
|
||||||
chatnet = "secfo";
|
|
||||||
port = "7000";
|
|
||||||
use_ssl = "yes";
|
|
||||||
ssl_verify = "no";
|
|
||||||
autoconnect = "yes";
|
|
||||||
},
|
|
||||||
{
|
|
||||||
address = "irc.hackint.eu";
|
|
||||||
chatnet = "hackint";
|
|
||||||
port = "9999";
|
|
||||||
use_ssl = "yes";
|
|
||||||
ssl_verify = "no";
|
|
||||||
autoconnect = "yes";
|
|
||||||
},
|
|
||||||
{
|
|
||||||
address = "irc.geekshed.net";
|
|
||||||
chatnet = "geekshed";
|
|
||||||
port = "6697";
|
|
||||||
use_ssl = "yes";
|
|
||||||
ssl_verify = "no";
|
|
||||||
autoconnect = "no";
|
|
||||||
},
|
|
||||||
{
|
|
||||||
address = "irc.rpis.ec";
|
|
||||||
chatnet = "rpisec";
|
|
||||||
port = "6697";
|
|
||||||
use_ssl = "yes";
|
|
||||||
ssl_verify = "no";
|
|
||||||
autoconnect = "yes";
|
|
||||||
},
|
|
||||||
{
|
|
||||||
address = "chat.freenode.net";
|
|
||||||
chatnet = "freenode";
|
|
||||||
port = "7000";
|
|
||||||
use_ssl = "yes";
|
|
||||||
ssl_cert = "~/.irssi/matir.pem";
|
|
||||||
ssl_verify = "yes";
|
|
||||||
ssl_capath = "/etc/ssl/certs";
|
|
||||||
family = "inet";
|
|
||||||
autoconnect = "yes";
|
|
||||||
}
|
|
||||||
);
|
|
||||||
|
|
||||||
chatnets = {
|
|
||||||
OFTC = {
|
|
||||||
type = "IRC";
|
|
||||||
max_kicks = "1";
|
|
||||||
max_msgs = "3";
|
|
||||||
max_whois = "30";
|
|
||||||
};
|
|
||||||
overthewire = { type = "IRC"; nick = "Matir"; };
|
|
||||||
secfo = { type = "IRC"; };
|
|
||||||
hackint = { type = "IRC"; nick = "Matir"; };
|
|
||||||
freenode = {
|
|
||||||
type = "IRC";
|
|
||||||
nick = "Matir";
|
|
||||||
username = "matir";
|
|
||||||
realname = "Matir";
|
|
||||||
max_kicks = "1";
|
|
||||||
max_msgs = "4";
|
|
||||||
max_modes = "4";
|
|
||||||
max_whois = "1";
|
|
||||||
};
|
|
||||||
geekshed = {
|
|
||||||
type = "IRC";
|
|
||||||
nick = "KF4MDV";
|
|
||||||
username = "kf4mdv";
|
|
||||||
realname = "David";
|
|
||||||
};
|
|
||||||
rpisec = { type = "IRC"; };
|
|
||||||
};
|
|
||||||
|
|
||||||
channels = (
|
|
||||||
{ name = "#kali-linux"; chatnet = "freenode"; autojoin = "yes"; },
|
|
||||||
{ name = "#hak5"; chatnet = "secfo"; autojoin = "yes"; },
|
|
||||||
{ name = "#wargames"; chatnet = "overthewire"; autojoin = "yes"; },
|
|
||||||
{ name = "#social"; chatnet = "overthewire"; autojoin = "yes"; },
|
|
||||||
{ name = "#openvpn"; chatnet = "freenode"; autojoin = "yes"; },
|
|
||||||
{ name = "#amateria"; chatnet = "overthewire"; autojoin = "yes"; },
|
|
||||||
{ name = "#io"; chatnet = "overthewire"; autojoin = "yes"; },
|
|
||||||
{ name = "#radare"; chatnet = "freenode"; autojoin = "yes"; },
|
|
||||||
{ name = "#vulnhub"; chatnet = "freenode"; autojoin = "yes"; },
|
|
||||||
{ name = "#redditnet"; chatnet = "geekshed"; autojoin = "yes"; },
|
|
||||||
{ name = "#rpisec"; chatnet = "rpisec"; autojoin = "yes"; },
|
|
||||||
{ name = "#offsec"; chatnet = "freenode"; autojoin = "yes"; },
|
|
||||||
{ name = "#offtopicsec"; chatnet = "freenode"; autojoin = "yes"; }
|
|
||||||
);
|
|
||||||
|
|
||||||
aliases = {
|
|
||||||
J = "join";
|
|
||||||
WJOIN = "join -window";
|
|
||||||
WQUERY = "query -window";
|
|
||||||
LEAVE = "part";
|
|
||||||
BYE = "quit";
|
|
||||||
EXIT = "quit";
|
|
||||||
SIGNOFF = "quit";
|
|
||||||
DESCRIBE = "action";
|
|
||||||
DATE = "time";
|
|
||||||
HOST = "userhost";
|
|
||||||
LAST = "lastlog";
|
|
||||||
SAY = "msg *";
|
|
||||||
WI = "whois";
|
|
||||||
WII = "whois $0 $0";
|
|
||||||
WW = "whowas";
|
|
||||||
W = "who";
|
|
||||||
N = "names";
|
|
||||||
M = "msg";
|
|
||||||
T = "topic";
|
|
||||||
C = "clear";
|
|
||||||
CL = "clear";
|
|
||||||
K = "kick";
|
|
||||||
KB = "kickban";
|
|
||||||
KN = "knockout";
|
|
||||||
BANS = "ban";
|
|
||||||
B = "ban";
|
|
||||||
MUB = "unban *";
|
|
||||||
UB = "unban";
|
|
||||||
IG = "ignore";
|
|
||||||
UNIG = "unignore";
|
|
||||||
SB = "scrollback";
|
|
||||||
UMODE = "mode $N";
|
|
||||||
WC = "window close";
|
|
||||||
WN = "window new hide";
|
|
||||||
SV = "say Irssi $J ($V) - http://irssi.org/";
|
|
||||||
GOTO = "sb goto";
|
|
||||||
CHAT = "dcc chat";
|
|
||||||
RUN = "SCRIPT LOAD";
|
|
||||||
CALC = "exec - if command -v bc >/dev/null 2>&1\\; then printf '%s=' '$*'\\; echo '$*' | bc -l\\; else echo bc was not found\\; fi";
|
|
||||||
SBAR = "STATUSBAR";
|
|
||||||
INVITELIST = "mode $C +I";
|
|
||||||
Q = "QUERY";
|
|
||||||
"MANUAL-WINDOWS" = "set use_status_window off;set autocreate_windows off;set autocreate_query_level none;set autoclose_windows off;set reuse_unused_windows on;save";
|
|
||||||
EXEMPTLIST = "mode $C +e";
|
|
||||||
ATAG = "WINDOW SERVER";
|
|
||||||
UNSET = "set -clear";
|
|
||||||
RESET = "set -default";
|
|
||||||
};
|
|
||||||
|
|
||||||
statusbar = {
|
|
||||||
# formats:
|
|
||||||
# when using {templates}, the template is shown only if it's argument isn't
|
|
||||||
# empty unless no argument is given. for example {sb} is printed always,
|
|
||||||
# but {sb $T} is printed only if $T isn't empty.
|
|
||||||
|
|
||||||
items = {
|
|
||||||
# start/end text in statusbars
|
|
||||||
barstart = "{sbstart}";
|
|
||||||
barend = "{sbend}";
|
|
||||||
|
|
||||||
topicbarstart = "{topicsbstart}";
|
|
||||||
topicbarend = "{topicsbend}";
|
|
||||||
|
|
||||||
# treated "normally", you could change the time/user name to whatever
|
|
||||||
time = "{sb $Z}";
|
|
||||||
user = "{sb {sbnickmode $cumode}$N{sbmode $usermode}{sbaway $A}}";
|
|
||||||
|
|
||||||
# treated specially .. window is printed with non-empty windows,
|
|
||||||
# window_empty is printed with empty windows
|
|
||||||
window = "{sb $winref:$tag/$itemname{sbmode $M}}";
|
|
||||||
window_empty = "{sb $winref{sbservertag $tag}}";
|
|
||||||
prompt = "{prompt $[.15]itemname}";
|
|
||||||
prompt_empty = "{prompt $winname}";
|
|
||||||
topic = " $topic";
|
|
||||||
topic_empty = " Irssi v$J - http://www.irssi.org";
|
|
||||||
|
|
||||||
# all of these treated specially, they're only displayed when needed
|
|
||||||
lag = "{sb Lag: $0-}";
|
|
||||||
act = "{sb Act: $0-}";
|
|
||||||
more = "-- more --";
|
|
||||||
};
|
|
||||||
|
|
||||||
# there's two type of statusbars. root statusbars are either at the top
|
|
||||||
# of the screen or at the bottom of the screen. window statusbars are at
|
|
||||||
# the top/bottom of each split window in screen.
|
|
||||||
default = {
|
|
||||||
# the "default statusbar" to be displayed at the bottom of the window.
|
|
||||||
# contains all the normal items.
|
|
||||||
window = {
|
|
||||||
disabled = "yes";
|
|
||||||
|
|
||||||
# window, root
|
|
||||||
type = "window";
|
|
||||||
# top, bottom
|
|
||||||
placement = "bottom";
|
|
||||||
# number
|
|
||||||
position = "1";
|
|
||||||
# active, inactive, always
|
|
||||||
visible = "active";
|
|
||||||
|
|
||||||
# list of items in statusbar in the display order
|
|
||||||
items = {
|
|
||||||
barstart = { priority = "100"; };
|
|
||||||
time = { };
|
|
||||||
user = { };
|
|
||||||
window = { };
|
|
||||||
window_empty = { };
|
|
||||||
lag = { priority = "-1"; };
|
|
||||||
more = { priority = "-1"; alignment = "right"; };
|
|
||||||
barend = { priority = "100"; alignment = "right"; };
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
# statusbar to use in inactive split windows
|
|
||||||
window_inact = {
|
|
||||||
type = "window";
|
|
||||||
placement = "bottom";
|
|
||||||
position = "1";
|
|
||||||
visible = "inactive";
|
|
||||||
items = {
|
|
||||||
barstart = { priority = "100"; };
|
|
||||||
window = { };
|
|
||||||
window_empty = { };
|
|
||||||
more = { priority = "-1"; alignment = "right"; };
|
|
||||||
barend = { priority = "100"; alignment = "right"; };
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
# we treat input line as yet another statusbar :) It's possible to
|
|
||||||
# add other items before or after the input line item.
|
|
||||||
prompt = {
|
|
||||||
type = "root";
|
|
||||||
placement = "bottom";
|
|
||||||
# we want to be at the bottom always
|
|
||||||
position = "100";
|
|
||||||
visible = "always";
|
|
||||||
items = {
|
|
||||||
prompt = { priority = "-1"; };
|
|
||||||
prompt_empty = { priority = "-1"; };
|
|
||||||
# treated specially, this is the real input line.
|
|
||||||
input = { priority = "10"; };
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
# topicbar
|
|
||||||
topic = {
|
|
||||||
type = "root";
|
|
||||||
placement = "top";
|
|
||||||
position = "1";
|
|
||||||
visible = "always";
|
|
||||||
items = {
|
|
||||||
topicbarstart = { priority = "100"; };
|
|
||||||
time = { priority = "100"; };
|
|
||||||
topic = { };
|
|
||||||
topic_empty = { };
|
|
||||||
window_empty = { alignment = "right"; };
|
|
||||||
user = { priority = "100"; alignment = "right"; };
|
|
||||||
topicbarend = { priority = "100"; alignment = "right"; };
|
|
||||||
};
|
|
||||||
};
|
|
||||||
placement = { items = { }; disabled = "yes"; };
|
|
||||||
remove = { disabled = "yes"; };
|
|
||||||
awl_0 = {
|
|
||||||
items = {
|
|
||||||
barstart = { priority = "100"; };
|
|
||||||
awl_0 = { };
|
|
||||||
barend = { priority = "100"; alignment = "right"; };
|
|
||||||
};
|
|
||||||
};
|
|
||||||
awl_1 = {
|
|
||||||
items = {
|
|
||||||
barstart = { priority = "100"; };
|
|
||||||
awl_1 = { };
|
|
||||||
barend = { priority = "100"; alignment = "right"; };
|
|
||||||
};
|
|
||||||
};
|
|
||||||
awl_2 = {
|
|
||||||
items = {
|
|
||||||
barstart = { priority = "100"; };
|
|
||||||
awl_2 = { };
|
|
||||||
barend = { priority = "100"; alignment = "right"; };
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
settings = {
|
|
||||||
core = {
|
|
||||||
real_name = "Matir";
|
|
||||||
user_name = "matir";
|
|
||||||
nick = "Matir";
|
|
||||||
log_timestamp = "%Y%m%d %H%M";
|
|
||||||
};
|
|
||||||
"fe-text" = { actlist_sort = "refnum"; };
|
|
||||||
"fe-common/core" = {
|
|
||||||
autolog = "yes";
|
|
||||||
autolog_path = "~/irclogs/%Y/%m/$tag/$0.log";
|
|
||||||
autoclose_query = "1800";
|
|
||||||
autocreate_own_query = "no";
|
|
||||||
show_nickmode_empty = "no";
|
|
||||||
term_charset = "utf-8";
|
|
||||||
};
|
|
||||||
"perl/core/scripts" = {
|
|
||||||
awl_shared_sbar = "OFF";
|
|
||||||
awl_viewer = "no";
|
|
||||||
awl_block = "-15";
|
|
||||||
awl_maxlines = "3";
|
|
||||||
awl_height_adjust = "2";
|
|
||||||
awl_hide_empty = "0";
|
|
||||||
};
|
|
||||||
};
|
|
||||||
windows = {
|
|
||||||
1 = { immortal = "yes"; name = "(status)"; level = "ALL"; };
|
|
||||||
2 = {
|
|
||||||
items = (
|
|
||||||
{
|
|
||||||
type = "CHANNEL";
|
|
||||||
chat_type = "IRC";
|
|
||||||
name = "#kali-linux";
|
|
||||||
tag = "freenode";
|
|
||||||
}
|
|
||||||
);
|
|
||||||
};
|
|
||||||
3 = {
|
|
||||||
items = (
|
|
||||||
{
|
|
||||||
type = "CHANNEL";
|
|
||||||
chat_type = "IRC";
|
|
||||||
name = "#radare";
|
|
||||||
tag = "freenode";
|
|
||||||
}
|
|
||||||
);
|
|
||||||
};
|
|
||||||
4 = {
|
|
||||||
items = (
|
|
||||||
{
|
|
||||||
type = "CHANNEL";
|
|
||||||
chat_type = "IRC";
|
|
||||||
name = "#vulnhub";
|
|
||||||
tag = "freenode";
|
|
||||||
}
|
|
||||||
);
|
|
||||||
};
|
|
||||||
5 = {
|
|
||||||
items = (
|
|
||||||
{
|
|
||||||
type = "CHANNEL";
|
|
||||||
chat_type = "IRC";
|
|
||||||
name = "#openvpn";
|
|
||||||
tag = "freenode";
|
|
||||||
}
|
|
||||||
);
|
|
||||||
};
|
|
||||||
6 = {
|
|
||||||
items = (
|
|
||||||
{
|
|
||||||
type = "CHANNEL";
|
|
||||||
chat_type = "IRC";
|
|
||||||
name = "#wargames";
|
|
||||||
tag = "overthewire";
|
|
||||||
}
|
|
||||||
);
|
|
||||||
};
|
|
||||||
7 = {
|
|
||||||
items = (
|
|
||||||
{
|
|
||||||
type = "CHANNEL";
|
|
||||||
chat_type = "IRC";
|
|
||||||
name = "#social";
|
|
||||||
tag = "overthewire";
|
|
||||||
}
|
|
||||||
);
|
|
||||||
};
|
|
||||||
8 = {
|
|
||||||
items = (
|
|
||||||
{
|
|
||||||
type = "CHANNEL";
|
|
||||||
chat_type = "IRC";
|
|
||||||
name = "#amateria";
|
|
||||||
tag = "overthewire";
|
|
||||||
}
|
|
||||||
);
|
|
||||||
};
|
|
||||||
9 = {
|
|
||||||
items = (
|
|
||||||
{
|
|
||||||
type = "CHANNEL";
|
|
||||||
chat_type = "IRC";
|
|
||||||
name = "#io";
|
|
||||||
tag = "overthewire";
|
|
||||||
}
|
|
||||||
);
|
|
||||||
};
|
|
||||||
10 = {
|
|
||||||
items = (
|
|
||||||
{
|
|
||||||
type = "CHANNEL";
|
|
||||||
chat_type = "IRC";
|
|
||||||
name = "#RedditNet";
|
|
||||||
tag = "geekshed";
|
|
||||||
}
|
|
||||||
);
|
|
||||||
};
|
|
||||||
11 = {
|
|
||||||
items = (
|
|
||||||
{
|
|
||||||
type = "CHANNEL";
|
|
||||||
chat_type = "IRC";
|
|
||||||
name = "#hak5";
|
|
||||||
tag = "secfo";
|
|
||||||
}
|
|
||||||
);
|
|
||||||
};
|
|
||||||
};
|
|
||||||
mainwindows = { 1 = { first_line = "1"; lines = "78"; }; };
|
|
||||||
logs = { };
|
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user