Compare commits
209 Commits
experiment
...
master
| Author | SHA1 | Date | |
|---|---|---|---|
| 549b420df2 | |||
|
edf76874fc
|
|||
|
95ad6b0c6a
|
|||
|
ff36975eb7
|
|||
|
5ae19346d6
|
|||
|
53ee621747
|
|||
|
dd339f2939
|
|||
|
e0fbdf852e
|
|||
|
b5983ed308
|
|||
|
f39af6d446
|
|||
|
8fe3d112ba
|
|||
|
4c81bcea73
|
|||
|
5623d08d85
|
|||
|
0a369efe1b
|
|||
|
1640ebfb45
|
|||
|
d2c561fc28
|
|||
|
a920e48422
|
|||
|
0ed07de2d2
|
|||
|
abad965e9a
|
|||
|
b5b0140e34
|
|||
|
5d75b6f79e
|
|||
|
87fd722509
|
|||
|
eaacecd87a
|
|||
|
4c57a180ac
|
|||
|
96bd945ef2
|
|||
|
49fd27d3be
|
|||
|
3c9f1d71cb
|
|||
|
3a226ed5bb
|
|||
|
fe83b3eb25
|
|||
|
a34dda20c7
|
|||
|
021db1064e
|
|||
|
b70b89433b
|
|||
|
8531543982
|
|||
|
e05b47ae52
|
|||
|
e9a6f4ddda
|
|||
|
cbb493b5c4
|
|||
|
31ddf3a6d2
|
|||
|
47827282a9
|
|||
|
16075cdd61
|
|||
|
29e5c960de
|
|||
|
526dade1f8
|
|||
|
66126167c8
|
|||
|
3696cc06af
|
|||
|
8da2059d1e
|
|||
|
9da84a69f2
|
|||
|
50bd28abe4
|
|||
|
bbbc0de694
|
|||
|
9258398be4
|
|||
|
a60374033c
|
|||
|
bcae2fb4cf
|
|||
|
c808cce9cd
|
|||
|
bacd71304a
|
|||
|
6fee688968
|
|||
|
ebd30c8a50
|
|||
|
c4b2af8073
|
|||
|
45499ca5df
|
|||
|
53d5a31a30
|
|||
|
1e0d54f5d6
|
|||
|
5d3004c87b
|
|||
|
14f3f2caf2
|
|||
|
dc03b5f577
|
|||
|
2af5282e64
|
|||
|
e2c0d1de87
|
|||
|
7bb8a8c839
|
|||
|
bc139e5cc5
|
|||
|
beeb59b1aa
|
|||
|
3249c32cb2
|
|||
|
c18f014119
|
|||
|
d41f6505b9
|
|||
|
c4c7d298e0
|
|||
|
e95ccf042b
|
|||
|
1a912bf645
|
|||
|
1c2abec8a7
|
|||
|
a71b682f49
|
|||
|
df826ba9c9
|
|||
|
737da43522
|
|||
|
890f09b82b
|
|||
|
4b1bd30170
|
|||
|
5842b954e3
|
|||
|
a52ce34748
|
|||
|
024b3311e0
|
|||
|
22d12fd902
|
|||
|
def4f6761a
|
|||
|
ed10ab05d4
|
|||
|
b6817506e0
|
|||
|
479ac2064f
|
|||
|
4014f83402
|
|||
|
bf970f58cd
|
|||
|
7159850e83
|
|||
|
3ef8692684
|
|||
|
efa60f5231
|
|||
|
ee8cbd0fe4
|
|||
|
3c87f837eb
|
|||
|
6d7719d568
|
|||
|
e9638e845c
|
|||
|
b2cf7c154e
|
|||
|
b988524c2d
|
|||
|
a73a442f07
|
|||
|
f9f8f5b2dc
|
|||
|
79db21f336
|
|||
|
bb78d67565
|
|||
|
8b9aecc754
|
|||
|
f3f6e8fd31
|
|||
|
5bf67b1c8e
|
|||
| 9baedd438f | |||
|
49595c7df5
|
|||
|
8ad20ca7fd
|
|||
|
7cc6888cca
|
|||
|
19d9f17f77
|
|||
|
86c7c92ae0
|
|||
|
4670ee9b57
|
|||
|
c261d62b36
|
|||
|
acc7907a72
|
|||
|
ba9c1bf28d
|
|||
|
7fcf9ad9e6
|
|||
|
84822bd7fa
|
|||
|
99ffbf68f8
|
|||
|
a5388f5127
|
|||
|
3339928940
|
|||
|
bc0a2e4426
|
|||
| 805716e9b4 | |||
|
be8d9ab4a6
|
|||
|
3bb7ec3564
|
|||
|
01896666f2
|
|||
|
aaec3096f9
|
|||
|
46ca617c1a
|
|||
|
90dc1b4d8b
|
|||
|
f89b2d946d
|
|||
|
0aac460d63
|
|||
|
aab50b0401
|
|||
|
28692bfcf5
|
|||
|
2d2380fd62
|
|||
|
f20a161373
|
|||
|
3a853564c1
|
|||
|
5abc1c9434
|
|||
|
7136fac018
|
|||
|
7554e57ea4
|
|||
|
e6411438c5
|
|||
|
e86281c967
|
|||
|
04c74e1d00
|
|||
|
5f2d2e2011
|
|||
|
8f2b1fa137
|
|||
|
14e841cc80
|
|||
|
6d7460c5b0
|
|||
|
d262e8f202
|
|||
|
27659f8ad5
|
|||
|
0aec6382bd
|
|||
|
4223f7845d
|
|||
|
accce0dddb
|
|||
|
292e15199c
|
|||
|
acacd1657c
|
|||
|
3c527a8dee
|
|||
|
0e90625d7c
|
|||
|
afbb634566
|
|||
|
bc9eb794a8
|
|||
|
4637b069f9
|
|||
|
05e6b8195b
|
|||
|
8c6a191d61
|
|||
|
b7856f6529
|
|||
|
3e3c03a2e1
|
|||
|
155352f8ad
|
|||
|
14362f6165
|
|||
|
8b809bafca
|
|||
|
40d214e99b
|
|||
|
e4e64a8ab1
|
|||
|
8de641fd68
|
|||
|
32bdf4b44d
|
|||
|
d7d27849a1
|
|||
|
3f08b3ed06
|
|||
|
fc7ff9613a
|
|||
|
41180043ae
|
|||
|
a68074cb01
|
|||
|
91be1a194b
|
|||
|
322239ec1f
|
|||
|
7ddcc73454
|
|||
|
a60d66a84d
|
|||
|
0f118e015e
|
|||
|
af93865525
|
|||
|
8ffc2dfe32
|
|||
|
c1150af922
|
|||
|
7185a3cf7f
|
|||
|
c48971a858
|
|||
|
aaf88521b3
|
|||
|
355953dc35
|
|||
|
43f6c8c9e9
|
|||
|
2c9af9b1c5
|
|||
|
4b677a9ab8
|
|||
|
af2a7f3c80
|
|||
|
d3263e6da5
|
|||
|
bdcd8e6bec
|
|||
|
a6e0696e31
|
|||
|
f61f09b83f
|
|||
|
6bb9442c43
|
|||
|
c54e71d28c
|
|||
|
8d64efba39
|
|||
|
cc2ab13310
|
|||
|
113c1df71b
|
|||
|
24f30e8eff
|
|||
|
bcb1111a0a
|
|||
|
3fa1a4d09d
|
|||
|
6c11b5d76d
|
|||
|
82559869fc
|
|||
|
4677b84a29
|
|||
|
7008ec36b7
|
|||
|
f2d41885af
|
|||
|
9972fc6d9d
|
|||
|
f7ef85aad9
|
|||
|
3043a41365
|
|||
|
47c1e6d40b
|
13
.editorconfig
Normal file
13
.editorconfig
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
root = true
|
||||||
|
|
||||||
|
[*]
|
||||||
|
end_of_line = lf
|
||||||
|
insert_final_newline = true
|
||||||
|
|
||||||
|
[{install/*, uninstall/*, upgrade/*}]
|
||||||
|
indent_style = space
|
||||||
|
indent_size = 4
|
||||||
|
|
||||||
|
[{packs/*, Makefile*}]
|
||||||
|
indent_style = tab
|
||||||
|
indent_size = 4
|
||||||
1
.gitignore
vendored
1
.gitignore
vendored
@@ -1 +1,2 @@
|
|||||||
*.bak
|
*.bak
|
||||||
|
*.log
|
||||||
|
|||||||
13
LICENSE
Normal file
13
LICENSE
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
|
||||||
|
Version 2, December 2004
|
||||||
|
|
||||||
|
Copyright (C) 2022 Антон Аксенов <anthonyaxenov@gmail.com>
|
||||||
|
|
||||||
|
Everyone is permitted to copy and distribute verbatim or modified
|
||||||
|
copies of this license document, and changing it is allowed as long
|
||||||
|
as the name is changed.
|
||||||
|
|
||||||
|
DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
|
||||||
|
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
||||||
|
|
||||||
|
0. You just DO WHAT THE FUCK YOU WANT TO.
|
||||||
331
Makefile
331
Makefile
@@ -1,114 +1,347 @@
|
|||||||
# Autogenerated at 04.07.2022 22:11 using ./gen-makefile.sh
|
# Autogenerated at 10.07.2025 23:45 using ./gen-makefile
|
||||||
|
.DEFAULT_GOAL := help
|
||||||
|
|
||||||
##lamp: Apache + php + mariadb
|
#===============================================
|
||||||
lamp: apache php mariadb
|
# Scripts listed in ./install
|
||||||
##apache: Install apache2 (latest)
|
#===============================================
|
||||||
apache:
|
|
||||||
./install/apache
|
|
||||||
|
|
||||||
##apt: Install bunch of software from apt
|
##apache2: Install apache2 (latest)
|
||||||
|
apache2:
|
||||||
|
@./install/apache2
|
||||||
|
|
||||||
|
##apt: Install software from apt
|
||||||
apt:
|
apt:
|
||||||
./install/apt
|
@./install/apt
|
||||||
|
|
||||||
|
##canon-mg2500: Install Canon Pixma MG2500 + ppa
|
||||||
|
canon-mg2500:
|
||||||
|
@./install/canon-mg2500
|
||||||
|
|
||||||
##chrome: Install google chrome (latest)
|
##chrome: Install google chrome (latest)
|
||||||
chrome:
|
chrome:
|
||||||
./install/chrome
|
@./install/chrome
|
||||||
|
|
||||||
|
##clamav: ClamAV (WIP)
|
||||||
|
clamav:
|
||||||
|
@./install/clamav
|
||||||
|
|
||||||
##composer: Install composer (latest)
|
##composer: Install composer (latest)
|
||||||
composer:
|
composer:
|
||||||
./install/composer
|
@./install/composer
|
||||||
|
|
||||||
##docker: Install docker (latest) + docker-compose (latest) + ppa
|
##docker: Install docker (latest) + ppa
|
||||||
docker:
|
docker:
|
||||||
./install/docker
|
@./install/docker
|
||||||
|
|
||||||
##droidcam: Install droidcam v1.8.2
|
##dots: Install dotfiles
|
||||||
|
dots:
|
||||||
|
@./install/dots
|
||||||
|
|
||||||
|
##droidcam: Install droidcam v1.9.0
|
||||||
droidcam:
|
droidcam:
|
||||||
./install/droidcam
|
@./install/droidcam
|
||||||
|
|
||||||
##droidcam-obs: Install droidcam-obs plugin v1.5.1
|
##droidcam-obs: Install droidcam-obs plugin v1.5.1
|
||||||
droidcam-obs:
|
droidcam-obs:
|
||||||
./install/droidcam-obs
|
@./install/droidcam-obs
|
||||||
|
|
||||||
|
##flameshot: Install flameshot (latest)
|
||||||
|
flameshot:
|
||||||
|
@./install/flameshot
|
||||||
|
|
||||||
|
##frkn.deprecated: Install Wireguard + FRKN
|
||||||
|
frkn.deprecated:
|
||||||
|
@./install/frkn.deprecated
|
||||||
|
|
||||||
##git: Install git (latest)
|
##git: Install git (latest)
|
||||||
git:
|
git:
|
||||||
./install/git
|
@./install/git
|
||||||
|
|
||||||
##golang: Install golang v1.18.3
|
##golang: Install golang v1.21.0
|
||||||
golang:
|
golang:
|
||||||
./install/golang
|
@./install/golang
|
||||||
|
|
||||||
##grubc: Install grub-customizer (latest) + ppa
|
##grub-customizer: Install grub-customizer (latest + ppa)
|
||||||
grubc:
|
grub-customizer:
|
||||||
./install/grubc
|
@./install/grub-customizer
|
||||||
|
|
||||||
|
##jbmono: Install JetBrains Mono fonts
|
||||||
|
jbmono:
|
||||||
|
@./install/jbmono
|
||||||
|
|
||||||
##kde-appmenu: Install KDE Window AppMenu Applet
|
##kde-appmenu: Install KDE Window AppMenu Applet
|
||||||
kde-appmenu:
|
kde-appmenu:
|
||||||
./install/kde-appmenu
|
@./install/kde-appmenu
|
||||||
|
|
||||||
##lite-xl: Install lite-xl v2.0.5 (draft)
|
##kde-backports: Install KDE Backports
|
||||||
|
kde-backports:
|
||||||
|
@./install/kde-backports
|
||||||
|
|
||||||
|
##kde-file-templates: Install file templates (KDE)
|
||||||
|
kde-file-templates:
|
||||||
|
@./install/kde-file-templates
|
||||||
|
|
||||||
|
##kde-portal: Install KDE portal
|
||||||
|
kde-portal:
|
||||||
|
@./install/kde-portal
|
||||||
|
|
||||||
|
##libreoffice: Install libreoffice
|
||||||
|
libreoffice:
|
||||||
|
@./install/libreoffice
|
||||||
|
|
||||||
|
##lite-xl: Install lite-xl v2.1.7
|
||||||
lite-xl:
|
lite-xl:
|
||||||
./install/lite-xl
|
@./install/lite-xl
|
||||||
|
|
||||||
##mariadb: Install mariadb (latest) and php-mysql + phpMyAdmin (if php is installed)
|
##mariadb: Install mariadb (latest) and php-mysql + phpMyAdmin (if php is installed)
|
||||||
mariadb:
|
mariadb:
|
||||||
./install/mariadb
|
@./install/mariadb
|
||||||
|
|
||||||
##nodejs: Install nodejs + npm via nvm
|
##nodejs: Install nodejs + npm via nvm
|
||||||
nodejs:
|
nodejs:
|
||||||
./install/nodejs
|
@./install/nodejs
|
||||||
|
|
||||||
|
##ntfy: Install ntfy (latest) + ppa
|
||||||
|
ntfy:
|
||||||
|
@./install/ntfy
|
||||||
|
|
||||||
|
##nvim: Install nvim + lazyvim
|
||||||
|
nvim:
|
||||||
|
@./install/nvim
|
||||||
|
|
||||||
|
##obs-studio: Install obs-studio (latest snap)
|
||||||
|
obs-studio:
|
||||||
|
@./install/obs-studio
|
||||||
|
|
||||||
|
##omz-clean: Install omz (latest)
|
||||||
|
omz-clean:
|
||||||
|
@./install/omz-clean
|
||||||
|
|
||||||
|
##omz-fancy: Install omz fancy (powerline10k + MesloLGS font)
|
||||||
|
omz-fancy:
|
||||||
|
@./install/omz-fancy
|
||||||
|
|
||||||
|
##openvpn: Install openvpn v2.6.3 (src)
|
||||||
|
openvpn:
|
||||||
|
@./install/openvpn
|
||||||
|
|
||||||
|
##papirus: Install papirus-icon-theme (latest)
|
||||||
|
papirus:
|
||||||
|
@./install/papirus
|
||||||
|
|
||||||
##pgsql: Install postgresql (latest) and php-pgsql (if php is installed)
|
##pgsql: Install postgresql (latest) and php-pgsql (if php is installed)
|
||||||
pgsql:
|
pgsql:
|
||||||
./install/pgsql
|
@./install/pgsql
|
||||||
|
|
||||||
##php: Install php v8.1 + ppa
|
##php: Install php v8.4
|
||||||
php:
|
php:
|
||||||
./install/php
|
@./install/php
|
||||||
|
|
||||||
|
##phpcs: Install phpcs + php-cs-fixer
|
||||||
|
phpcs:
|
||||||
|
@./install/phpcs
|
||||||
|
|
||||||
|
##phpmd: Install phpmd
|
||||||
|
phpmd:
|
||||||
|
@./install/phpmd
|
||||||
|
|
||||||
|
##php-psalm: Install psalm
|
||||||
|
php-psalm:
|
||||||
|
@./install/php-psalm
|
||||||
|
|
||||||
|
##php-spx: Install php-spx
|
||||||
|
php-spx:
|
||||||
|
@./install/php-spx
|
||||||
|
|
||||||
|
##phpstan: Install phpstan
|
||||||
|
phpstan:
|
||||||
|
@./install/phpstan
|
||||||
|
|
||||||
|
##phpunit: Install phpunit
|
||||||
|
phpunit:
|
||||||
|
@./install/phpunit
|
||||||
|
|
||||||
##postman: Install postman (latest)
|
##postman: Install postman (latest)
|
||||||
postman:
|
postman:
|
||||||
./install/postman
|
@./install/postman
|
||||||
|
|
||||||
##rustdesk: Install rustdesk v1.1.8 (deb)
|
##qt5: Install qt5
|
||||||
|
qt5:
|
||||||
|
@./install/qt5
|
||||||
|
|
||||||
|
##rustdesk: Install rustdesk client (flatpak)
|
||||||
rustdesk:
|
rustdesk:
|
||||||
./install/rustdesk
|
@./install/rustdesk
|
||||||
|
|
||||||
|
##rustdesk-deb: Install rustdesk client v1.4.0 (deb)
|
||||||
|
rustdesk-deb:
|
||||||
|
@./install/rustdesk-deb
|
||||||
|
|
||||||
##snap: Install bunch of software from snap
|
##snap: Install bunch of software from snap
|
||||||
snap:
|
snap:
|
||||||
./install/snap
|
@./install/snap
|
||||||
|
|
||||||
|
##sublimemerge: Install Sublime Merge
|
||||||
|
sublimemerge:
|
||||||
|
@./install/sublimemerge
|
||||||
|
|
||||||
|
##sublimetext: Install Sublime Text
|
||||||
|
sublimetext:
|
||||||
|
@./install/sublimetext
|
||||||
|
|
||||||
|
##suld: Samsung Unified Linux Driver repo
|
||||||
|
suld:
|
||||||
|
@./install/suld
|
||||||
|
|
||||||
##syncthing: Install syncthing (latest) + ppa
|
##syncthing: Install syncthing (latest) + ppa
|
||||||
syncthing:
|
syncthing:
|
||||||
./install/syncthing
|
@./install/syncthing
|
||||||
|
|
||||||
##telebit: Install telebit (latest)
|
##telebit: Install telebit (latest)
|
||||||
telebit:
|
telebit:
|
||||||
./install/telebit
|
@./install/telebit
|
||||||
|
|
||||||
|
##telegram: Install telegram (latest)
|
||||||
|
telegram:
|
||||||
|
@./install/telegram
|
||||||
|
|
||||||
##ulauncher: Install ulauncher (latest) + ppa
|
##ulauncher: Install ulauncher (latest) + ppa
|
||||||
ulauncher:
|
ulauncher:
|
||||||
./install/ulauncher
|
@./install/ulauncher
|
||||||
|
|
||||||
##wine: Install wine (latest) + ppa (focal)
|
##vivaldi: Install Vivaldi + ppa
|
||||||
|
vivaldi:
|
||||||
|
@./install/vivaldi
|
||||||
|
|
||||||
|
##vscode: VSCode deb-package
|
||||||
|
vscode:
|
||||||
|
@./install/vscode
|
||||||
|
|
||||||
|
##wine: Install wine (latest) + ppa
|
||||||
wine:
|
wine:
|
||||||
./install/wine
|
@./install/wine
|
||||||
|
|
||||||
|
##youtube-dl: Install youtube-dl (src)
|
||||||
|
youtube-dl:
|
||||||
|
@./install/youtube-dl
|
||||||
|
|
||||||
|
##ytdlcue: Install ytdlcue
|
||||||
|
ytdlcue:
|
||||||
|
@./install/ytdlcue
|
||||||
|
|
||||||
##zint: Install zint (latest)
|
##zint: Install zint (latest)
|
||||||
zint:
|
zint:
|
||||||
./install/zint
|
@./install/zint
|
||||||
|
|
||||||
##zsh: Install zsh + omz (latest)
|
##zsh: Install vanilla zsh
|
||||||
zsh:
|
zsh:
|
||||||
./install/zsh
|
@./install/zsh
|
||||||
|
|
||||||
##help: Show this help message
|
|
||||||
|
#===============================================
|
||||||
|
# Scripts listed in ./packs
|
||||||
|
#===============================================
|
||||||
|
|
||||||
|
##lamp: [PACK] Apache + php + mariadb
|
||||||
|
lamp: apache phpstack mariadb
|
||||||
|
|
||||||
|
##obs: [PACK] Install OBS Studio + droidcam-obs
|
||||||
|
obs: obs-studio droidcam-obs
|
||||||
|
|
||||||
|
##omz: [PACK] zsh + omz + powerline10k + MesloLGS font
|
||||||
|
omz: zsh omz-clean omz-fancy
|
||||||
|
chsh -s /usr/bin/zsh
|
||||||
|
@exec zsh
|
||||||
|
|
||||||
|
##phptools: [PACK] Install only php tooling (composer, phpunit, psalm, phpcs, php-cs-fixer, phpmd)
|
||||||
|
phptools: composer php-psalm phpcs phpmd phpstan phpunit
|
||||||
|
|
||||||
|
##phpstack: [PACK] Install full php stack with tooling
|
||||||
|
phpstack: php phptools
|
||||||
|
|
||||||
|
#===============================================
|
||||||
|
# Scripts listed in ./upgrade
|
||||||
|
#===============================================
|
||||||
|
|
||||||
|
##^omz: Upgrade omz
|
||||||
|
^omz:
|
||||||
|
@./upgrade/omz
|
||||||
|
|
||||||
|
#===============================================
|
||||||
|
# Scripts listed in ./uninstall
|
||||||
|
#===============================================
|
||||||
|
|
||||||
|
##/apache2: Uninstall apache2
|
||||||
|
/apache2:
|
||||||
|
@./uninstall/apache2
|
||||||
|
|
||||||
|
##/canon-mg2500: Uninstall Canon Pixma MG2500 + ppa
|
||||||
|
/canon-mg2500:
|
||||||
|
@./uninstall/canon-mg2500
|
||||||
|
|
||||||
|
##/chrome: Uninstall google chrome
|
||||||
|
/chrome:
|
||||||
|
@./uninstall/chrome
|
||||||
|
|
||||||
|
##/composer: Uninstall composer
|
||||||
|
/composer:
|
||||||
|
@./uninstall/composer
|
||||||
|
|
||||||
|
##/docker: Uninstall docker + ppa
|
||||||
|
/docker:
|
||||||
|
@./uninstall/docker
|
||||||
|
|
||||||
|
##/grub-customizer: Uninstall grub-customizer with ppa
|
||||||
|
/grub-customizer:
|
||||||
|
@./uninstall/grub-customizer
|
||||||
|
|
||||||
|
##/lazynvim: <no description>
|
||||||
|
/lazynvim:
|
||||||
|
@./uninstall/lazynvim
|
||||||
|
|
||||||
|
##/lite-xl: Uninstall lite-xl
|
||||||
|
/lite-xl:
|
||||||
|
@./uninstall/lite-xl
|
||||||
|
|
||||||
|
##/omz: Uninstall omz
|
||||||
|
/omz:
|
||||||
|
@./uninstall/omz
|
||||||
|
|
||||||
|
##/sublimemerge: Uninstall Sublime Merge
|
||||||
|
/sublimemerge:
|
||||||
|
@./uninstall/sublimemerge
|
||||||
|
|
||||||
|
##/sublimetext: Uninstall Sublime Text
|
||||||
|
/sublimetext:
|
||||||
|
@./uninstall/sublimetext
|
||||||
|
|
||||||
|
##/vivaldi: Uninstall vivaldi + ppa
|
||||||
|
/vivaldi:
|
||||||
|
@./uninstall/vivaldi
|
||||||
|
|
||||||
|
##/wine: Uninstall wine
|
||||||
|
/wine:
|
||||||
|
@./uninstall/wine
|
||||||
|
|
||||||
|
#===============================================
|
||||||
|
# Service goals
|
||||||
|
#===============================================
|
||||||
|
|
||||||
|
self:
|
||||||
|
@./gen-makefile
|
||||||
help: Makefile
|
help: Makefile
|
||||||
|
@echo "Ubuntu software installator"
|
||||||
|
@echo
|
||||||
@echo "Usage:"
|
@echo "Usage:"
|
||||||
@echo "\tmake <goal>\n"
|
@echo "\tmake help\t - show this help"
|
||||||
@echo "Available goals:"
|
@echo "\tmake self\t - regenerate Makefile (alias of ./gen-makefile)"
|
||||||
@sed -n 's/^##//p' $< | column -t -s ':' | sed -e "s/^/\t/"
|
@echo "\tmake GOAL\t - install software"
|
||||||
|
@echo "\tmake ^GOAL\t - upgrade software"
|
||||||
##<goal>_: Same as 'cat ./install/<goal>.sh'
|
@echo "\tmake /GOAL\t - uninstall software"
|
||||||
%_:
|
@echo "\nYou can combine GOALs, here are some examples:"
|
||||||
@cat ./install/$*.sh
|
@echo "\tmake /docker docker"
|
||||||
|
@echo "\tmake php /docker ^omz"
|
||||||
|
@echo "\nAvailable GOALs:"
|
||||||
|
@sed -n 's/^##//p' $< | column -ts ':' | sed -e "s/^/\t/"
|
||||||
|
+%:
|
||||||
|
@make
|
||||||
|
|||||||
92
README.md
92
README.md
@@ -1,61 +1,51 @@
|
|||||||
# My Ubuntu environment
|
# My shell environment
|
||||||
|
|
||||||
`make`-ready bunch of scripts for easily installation of different software.
|
`make`-ready bunch of scripts for easily (de)installation of different software and bunch of useful handy functions for custom scripting.
|
||||||
|
|
||||||
## Requirements
|
## Requirements
|
||||||
|
|
||||||
|
* Ubuntu >= 20.04 (not tested with version < 20)
|
||||||
* `bash`, `zsh` or other `sh`-compatible shell
|
* `bash`, `zsh` or other `sh`-compatible shell
|
||||||
* `make` (optional but recommended)
|
* `make` (optional but recommended)
|
||||||
* `wget` (necessary for some scripts)
|
* `wget` (required for some scripts)
|
||||||
* `git` (necessary for some scripts)
|
* `git` (required for some scripts)
|
||||||
|
|
||||||
|
If some dependecies are missed for some of these scripts it is enougth to run `./install/apt` in most cases, otherwise script will suggest (or even install) them.
|
||||||
|
|
||||||
## Usage
|
## Usage
|
||||||
|
|
||||||
### Clone this repo (recommended)
|
|
||||||
|
|
||||||
```shell
|
```shell
|
||||||
# if git is installed
|
# with git
|
||||||
git clone git@git.axenov.dev:anthony/my-env.git --depth=1
|
git clone git@git.axenov.dev:anthony/shell.git --depth=1 --single-branch
|
||||||
|
|
||||||
# if git is not installed
|
# without git
|
||||||
wget -qO - https://git.axenov.dev/anthony/my-env/archive/master.tar.gz | tar -zxf -
|
wget -qO - https://git.axenov.dev/anthony/shell/archive/master.tar.gz | tar -zxf -
|
||||||
|
|
||||||
# switch to repo dir
|
|
||||||
cd my-env
|
|
||||||
|
|
||||||
# get full list of `make` goals
|
# get full list of `make` goals
|
||||||
make help
|
cd shell && make
|
||||||
|
|
||||||
# generate new ./Makefile and get full list of `make` goals
|
|
||||||
./gen-makefile.sh
|
|
||||||
```
|
```
|
||||||
|
|
||||||
### Selective straightforward installation
|
## How to add my script?
|
||||||
|
|
||||||
```shell
|
1. Create a new shell script in `./install`, `./upgrade` or `./uninstall` directory.
|
||||||
# from remote file
|
|
||||||
wget -qO - https://git.axenov.dev/anthony/my-env/raw/branch/master/install/apt.sh | bash
|
|
||||||
|
|
||||||
# from locally cloned repo
|
|
||||||
./install/apt.sh
|
|
||||||
```
|
|
||||||
|
|
||||||
## How to add a new software script?
|
|
||||||
|
|
||||||
1. Create new `./install/*.sh` script.
|
|
||||||
At the beggining of a file you must write these two lines:
|
At the beggining of a file you must write these two lines:
|
||||||
```shell
|
```shell
|
||||||
#!/bin/bash
|
#!/usr/bin/env bash
|
||||||
##makedesc: Your description for Makefile
|
##makedesc: Your description for Makefile
|
||||||
```
|
```
|
||||||
2. Test your script
|
2. Make this script executable, e.g.:
|
||||||
3. Run `./gen-makefile.sh` to generate new `./Makefile`
|
```shell
|
||||||
|
sudo chmod a+x ./install/myscript
|
||||||
|
```
|
||||||
|
3. Test your script
|
||||||
|
4. Run `make self` to generate new `./Makefile`
|
||||||
|
|
||||||
## How to create packs?
|
## How to create a pack?
|
||||||
|
|
||||||
You can create new file inside `./packs` dir.
|
You can create new file inside `./packs` dir.
|
||||||
|
|
||||||
Syntax is same as classic makefile with one important and necessary addition -- a comment started with `##`:
|
Syntax is same as classic makefile.
|
||||||
|
It is important to add a comment with short description:
|
||||||
|
|
||||||
```makefile
|
```makefile
|
||||||
##mypack1: Pack description
|
##mypack1: Pack description
|
||||||
@@ -63,12 +53,42 @@ mypack1: goal1 goal2 goalX ...
|
|||||||
...
|
...
|
||||||
|
|
||||||
##mypackX: Pack description
|
##mypackX: Pack description
|
||||||
mypackY: goalA goalB
|
mypackX: goalA goalB
|
||||||
@cp file1 file2
|
@cp file1 file2
|
||||||
...
|
...
|
||||||
...
|
...
|
||||||
```
|
```
|
||||||
|
|
||||||
where:
|
where:
|
||||||
* `mypack*` is the pack name
|
* `mypack*` is the pack name of your choice
|
||||||
* `goal*` are script names in `./install`
|
* `goal*` are script names in `./install`
|
||||||
|
|
||||||
|
## Useful links and sources used
|
||||||
|
|
||||||
|
* https://gist.github.com/anthonyaxenov/d53c4385b7d1466e0affeb56388b1005
|
||||||
|
* https://gist.github.com/anthonyaxenov/89c99e09ddb195985707e2b24a57257d
|
||||||
|
* ...and other my [gists](https://gist.github.com/anthonyaxenov/) with [SHELL] prefix
|
||||||
|
* https://github.com/nvie/gitflow/blob/develop/gitflow-common (BSD License)
|
||||||
|
* https://github.com/petervanderdoes/gitflow-avh/blob/develop/gitflow-common (FreeBSD License)
|
||||||
|
* https://github.com/vaniacer/bash_color/blob/master/color
|
||||||
|
* https://misc.flogisoft.com/bash/tip_colors_and_formatting
|
||||||
|
* https://www-users.york.ac.uk/~mijp1/teaching/2nd_year_Comp_Lab/guides/grep_awk_sed.pdf
|
||||||
|
* https://www.galago-project.org/specs/notification/
|
||||||
|
* https://laurvas.ru/bash-trap/
|
||||||
|
* https://stackoverflow.com/a/52674277
|
||||||
|
* https://rtfm.co.ua/bash-funkciya-getopts-ispolzuem-opcii-v-skriptax/
|
||||||
|
* https://gist.github.com/jacknlliu/7c51e0ee8b51881dc8fb2183c481992e
|
||||||
|
* https://gist.github.com/anthonyaxenov/d53c4385b7d1466e0affeb56388b1005
|
||||||
|
* https://github.com/nvie/gitflow/blob/develop/gitflow-common
|
||||||
|
* https://github.com/petervanderdoes/gitflow-avh/blob/develop/gitflow-common
|
||||||
|
* https://gitlab.com/kyb/autorsync/-/blob/master/
|
||||||
|
* https://lug.fh-swf.de/vim/vim-bash/StyleGuideShell.en.pdf
|
||||||
|
* https://www.thegeekstuff.com/2010/06/bash-array-tutorial/
|
||||||
|
* https://www.distributednetworks.com/linux-network-admin/module4/ephemeral-reserved-portNumbers.php
|
||||||
|
* https://github.com/community-scripts/ProxmoxVE/tree/main/install
|
||||||
|
* https://github.com/community-scripts/ProxmoxVE/tree/main/misc
|
||||||
|
* https://faculty.cs.niu.edu/~hutchins/csci480/signals.htm
|
||||||
|
|
||||||
|
## License
|
||||||
|
|
||||||
|
[WTFPLv2](LICENSE) but other licences are also possible.
|
||||||
|
|||||||
11
TODO.md
Normal file
11
TODO.md
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
# Todo list
|
||||||
|
|
||||||
|
* tdesktop (https://desktop.telegram.org)
|
||||||
|
* spoofdpi (https://git.axenov.dev/mirrors/SpoofDPI/tags)
|
||||||
|
* lazynvim (https://www.lazyvim.org)
|
||||||
|
* build: [flameshot](https://github.com/flameshot-org/flameshot#compilation)
|
||||||
|
* build: [rustdesk](https://github.com/rustdesk/rustdesk#build)
|
||||||
|
* update scripts (when possible)
|
||||||
|
* uninstall scripts (when possible)
|
||||||
|
* ...
|
||||||
|
|
||||||
158
dotfiles/.bash_aliases
Normal file
158
dotfiles/.bash_aliases
Normal file
@@ -0,0 +1,158 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
# alias bashrc='source ~/.bashrc'
|
||||||
|
alias zshrc='source ~/.zshrc'
|
||||||
|
alias realias='source ~/.bash_aliases'
|
||||||
|
alias reload='exec ${SHELL} -l'
|
||||||
|
alias sudo='sudo ' # enable aliases to be sudo’ed
|
||||||
|
alias g='git'
|
||||||
|
alias hosts="sudo nano /etc/hosts"
|
||||||
|
alias shrug="echo '¯\_(ツ)_/¯' | xclip -selection c"
|
||||||
|
|
||||||
|
alias ..='cd ..' # zsh builtin
|
||||||
|
alias ~='cd ~' # zsh builtin
|
||||||
|
alias -- -='cd -' # zsh builtin
|
||||||
|
|
||||||
|
alias chmod='chmod --preserve-root'
|
||||||
|
alias chown='chown --preserve-root'
|
||||||
|
|
||||||
|
alias free='free -h'
|
||||||
|
alias duh='du -ha --max-depth=1'
|
||||||
|
alias sduh='sudo du -ha --max-depth=1'
|
||||||
|
|
||||||
|
alias l='ls -pCFh --color=auto'
|
||||||
|
alias la='ls -pAFh --color=auto'
|
||||||
|
alias ll='ls -palFh --color=auto'
|
||||||
|
|
||||||
|
alias mkdir='mkdir -pv'
|
||||||
|
alias where='whereis' # zsh builtin
|
||||||
|
|
||||||
|
alias ps='ps auxf'
|
||||||
|
alias psg='ps aux | grep -v grep | grep -i -e VSZ -e'
|
||||||
|
|
||||||
|
alias is='type -a'
|
||||||
|
alias upgrade='sudo apt update && sudo apt upgrade -y && sudo snap refresh'
|
||||||
|
alias untargz='tar -czf'
|
||||||
|
alias mkcd="mkdir -p $1 && cd $1"
|
||||||
|
alias cl='cd $1 && ll'
|
||||||
|
alias myip='curl http://ipecho.net/plain; echo'
|
||||||
|
alias ports='netstat -tulpan'
|
||||||
|
|
||||||
|
alias ssh.pub='cat ~/.ssh/*.pub'
|
||||||
|
alias gpg.new="gpg --full-generate-key"
|
||||||
|
alias gpg.pub="gpg --armor --export $@"
|
||||||
|
alias gpg.list='gpg --list-keys --keyid-format SHORT'
|
||||||
|
|
||||||
|
alias lite-xl="LITE_SCALE=1 lite-xl"
|
||||||
|
alias wine='LANG=ru_RU.utf8 wine'
|
||||||
|
alias docker.prune='docker image prune -f; docker network prune -f; docker container prune -f'
|
||||||
|
|
||||||
|
# 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$//'\'')"'
|
||||||
|
|
||||||
|
# https://obsproject.com/forum/threads/how-to-start-virtual-camera-without-sudo-privileges.139783/
|
||||||
|
alias obscam="sudo modprobe v4l2loopback video_nr=2 card_label='OBS Virtual Camera'"
|
||||||
|
|
||||||
|
# Download music from Youtube or Youtube Music
|
||||||
|
# and save as top quality flac file without video
|
||||||
|
# Playlist and video/track URLs are supported
|
||||||
|
# Usage: $ ytm https://www.youtube.com/watch\?v=dQw4w9WgXcQ
|
||||||
|
# More info: https://github.com/ytdl-org/youtube-dl
|
||||||
|
ytm() {
|
||||||
|
youtube-dl \
|
||||||
|
--extract-audio \
|
||||||
|
--audio-format flac \
|
||||||
|
--audio-quality 0 \
|
||||||
|
--format bestaudio \
|
||||||
|
--write-info-json \
|
||||||
|
--output "${HOME}/Музыка/ytm/%(playlist_title)s/%(channel)s - %(title)s.%(ext)s" \
|
||||||
|
$@
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
docker.ip() {
|
||||||
|
if [ "$1" ]; then
|
||||||
|
if [ "$1" = "-a" ]; then
|
||||||
|
docker ps -aq \
|
||||||
|
| xargs -n 1 docker inspect --format '{{.Name}}{{range .NetworkSettings.Networks}} {{.IPAddress}}{{end}}' \
|
||||||
|
| sed -e 's#^/##' \
|
||||||
|
| column -t
|
||||||
|
elif [ "$1" = "-c" ]; then
|
||||||
|
docker-compose ps -q \
|
||||||
|
| xargs -n 1 docker inspect --format '{{.Name}}{{range .NetworkSettings.Networks}} {{.IPAddress}}{{end}}' \
|
||||||
|
| sed -e 's#^/##' \
|
||||||
|
| column -t
|
||||||
|
else
|
||||||
|
docker inspect --format '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' "$1"
|
||||||
|
docker port "$1"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
docker ps -q \
|
||||||
|
| xargs -n 1 docker inspect --format '{{.Name}}{{range .NetworkSettings.Networks}} {{.IPAddress}}{{end}}' \
|
||||||
|
| sed -e 's#^/##' \
|
||||||
|
| column -t
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#################################################################################
|
||||||
|
|
||||||
|
# $1 -- file/dir path
|
||||||
|
# $2 -- permissions (0644, 0755, etc)
|
||||||
|
# own() { #TODO refactor
|
||||||
|
# [ "$1" ] && PATH="${1/#\~/$HOME}" || {
|
||||||
|
# echo "Error (1): path not provided"
|
||||||
|
# }
|
||||||
|
# echo $PATH
|
||||||
|
|
||||||
|
# [ "$2" ] && PERM="$2" || {
|
||||||
|
# if [ -d $PATH ]; then
|
||||||
|
# PERM="0755"
|
||||||
|
# elif [ -f $PATH ]; then
|
||||||
|
# PERM="0644"
|
||||||
|
# else
|
||||||
|
# echo "Error (2): path not exists"
|
||||||
|
# fi;
|
||||||
|
# }
|
||||||
|
# echo $PERM
|
||||||
|
|
||||||
|
# sudo chmod $PERM -R --preserve-root $PATH
|
||||||
|
# sudo chown $USER. -R --preserve-root $PATH
|
||||||
|
# }
|
||||||
|
|
||||||
|
# function extract {
|
||||||
|
# if [ -z "$1" ]; then
|
||||||
|
# # display usage if no parameters given
|
||||||
|
# echo "Usage: extract <path/file_name>.<zip|rar|bz2|gz|tar|tbz2|tgz|Z|7z|xz|ex|tar.bz2|tar.gz|tar.xz>"
|
||||||
|
# echo " extract <path/file_name_1.ext> [path/file_name_2.ext] [path/file_name_3.ext]"
|
||||||
|
# return 1
|
||||||
|
# else
|
||||||
|
# for n in $@
|
||||||
|
# do
|
||||||
|
# if [ -f "$n" ] ; then
|
||||||
|
# case "${n%,}" in
|
||||||
|
# *.tar.bz2|*.tar.gz|*.tar.xz|*.tbz2|*.tgz|*.txz|*.tar)
|
||||||
|
# tar xvf "$n" ;;
|
||||||
|
# *.lzma) unlzma ./"$n" ;;
|
||||||
|
# *.bz2) bunzip2 ./"$n" ;;
|
||||||
|
# *.rar) unrar x -ad ./"$n" ;;
|
||||||
|
# *.gz) gunzip ./"$n" ;;
|
||||||
|
# *.zip) unzip ./"$n" ;;
|
||||||
|
# *.z) uncompress ./"$n" ;;
|
||||||
|
# *.7z|*.arj|*.cab|*.chm|*.deb|*.dmg|*.iso|*.lzh|*.msi|*.rpm|*.udf|*.wim|*.xar)
|
||||||
|
# 7z x ./"$n" ;;
|
||||||
|
# *.xz) unxz ./"$n" ;;
|
||||||
|
# *.exe) cabextract ./"$n" ;;
|
||||||
|
# *)
|
||||||
|
# echo "extract: '$n' - unknown archive method"
|
||||||
|
# return 1
|
||||||
|
# ;;
|
||||||
|
# esac
|
||||||
|
# else
|
||||||
|
# echo "'$n' - file does not exist"
|
||||||
|
# return 1
|
||||||
|
# fi
|
||||||
|
# done
|
||||||
|
# fi
|
||||||
|
# }
|
||||||
110
dotfiles/.bashrc
Normal file
110
dotfiles/.bashrc
Normal file
@@ -0,0 +1,110 @@
|
|||||||
|
# ~/.bashrc: executed by bash(1) for non-login shells.
|
||||||
|
# see /usr/share/doc/bash/examples/startup-files (in the package bash-doc)
|
||||||
|
# for examples
|
||||||
|
|
||||||
|
# If not running interactively, don't do anything
|
||||||
|
case $- in
|
||||||
|
*i*) ;;
|
||||||
|
*) return;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
# don't put duplicate lines or lines starting with space in the history.
|
||||||
|
# See bash(1) for more options
|
||||||
|
HISTCONTROL=ignoreboth
|
||||||
|
|
||||||
|
# append to the history file, don't overwrite it
|
||||||
|
shopt -s histappend
|
||||||
|
|
||||||
|
# for setting history length see HISTSIZE and HISTFILESIZE in bash(1)
|
||||||
|
HISTSIZE=1000
|
||||||
|
HISTFILESIZE=2000
|
||||||
|
|
||||||
|
# check the window size after each command and, if necessary,
|
||||||
|
# update the values of LINES and COLUMNS.
|
||||||
|
shopt -s checkwinsize
|
||||||
|
|
||||||
|
# If set, the pattern "**" used in a pathname expansion context will
|
||||||
|
# match all files and zero or more directories and subdirectories.
|
||||||
|
#shopt -s globstar
|
||||||
|
|
||||||
|
# make less more friendly for non-text input files, see lesspipe(1)
|
||||||
|
[ -x /usr/bin/lesspipe ] && eval "$(SHELL=/bin/sh lesspipe)"
|
||||||
|
|
||||||
|
# set variable identifying the chroot you work in (used in the prompt below)
|
||||||
|
if [ -z "${debian_chroot:-}" ] && [ -r /etc/debian_chroot ]; then
|
||||||
|
debian_chroot=$(cat /etc/debian_chroot)
|
||||||
|
fi
|
||||||
|
|
||||||
|
# set a fancy prompt (non-color, unless we know we "want" color)
|
||||||
|
case "$TERM" in
|
||||||
|
xterm-color|*-256color) color_prompt=yes;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
# uncomment for a colored prompt, if the terminal has the capability; turned
|
||||||
|
# off by default to not distract the user: the focus in a terminal window
|
||||||
|
# should be on the output of commands, not on the prompt
|
||||||
|
#force_color_prompt=yes
|
||||||
|
|
||||||
|
if [ -n "$force_color_prompt" ]; then
|
||||||
|
if [ -x /usr/bin/tput ] && tput setaf 1 >&/dev/null; then
|
||||||
|
# We have color support; assume it's compliant with Ecma-48
|
||||||
|
# (ISO/IEC-6429). (Lack of such support is extremely rare, and such
|
||||||
|
# a case would tend to support setf rather than setaf.)
|
||||||
|
color_prompt=yes
|
||||||
|
else
|
||||||
|
color_prompt=
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "$color_prompt" = yes ]; then
|
||||||
|
PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '
|
||||||
|
else
|
||||||
|
PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '
|
||||||
|
fi
|
||||||
|
unset color_prompt force_color_prompt
|
||||||
|
|
||||||
|
# If this is an xterm set the title to user@host:dir
|
||||||
|
case "$TERM" in
|
||||||
|
xterm*|rxvt*)
|
||||||
|
PS1="\[\e]0;${debian_chroot:+($debian_chroot)}\u@\h: \w\a\]$PS1"
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
# enable color support of ls and also add handy aliases
|
||||||
|
if [ -x /usr/bin/dircolors ]; then
|
||||||
|
test -r ~/.dircolors && eval "$(dircolors -b ~/.dircolors)" || eval "$(dircolors -b)"
|
||||||
|
alias ls='ls --color=auto'
|
||||||
|
#alias dir='dir --color=auto'
|
||||||
|
#alias vdir='vdir --color=auto'
|
||||||
|
|
||||||
|
alias grep='grep --color=auto'
|
||||||
|
alias fgrep='fgrep --color=auto'
|
||||||
|
alias egrep='egrep --color=auto'
|
||||||
|
fi
|
||||||
|
|
||||||
|
# colored GCC warnings and errors
|
||||||
|
#export GCC_COLORS='error=01;31:warning=01;35:note=01;36:caret=01;32:locus=01:quote=01'
|
||||||
|
|
||||||
|
# Alias definitions.
|
||||||
|
# You may want to put all your additions into a separate file like
|
||||||
|
# ~/.bash_aliases, instead of adding them here directly.
|
||||||
|
# See /usr/share/doc/bash-doc/examples in the bash-doc package.
|
||||||
|
|
||||||
|
if [ -f ~/.bash_aliases ]; then
|
||||||
|
. ~/.bash_aliases
|
||||||
|
fi
|
||||||
|
|
||||||
|
# enable programmable completion features (you don't need to enable
|
||||||
|
# this, if it's already enabled in /etc/bash.bashrc and /etc/profile
|
||||||
|
# sources /etc/bash.bashrc).
|
||||||
|
if ! shopt -oq posix; then
|
||||||
|
if [ -f /usr/share/bash-completion/bash_completion ]; then
|
||||||
|
. /usr/share/bash-completion/bash_completion
|
||||||
|
elif [ -f /etc/bash_completion ]; then
|
||||||
|
. /etc/bash_completion
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
[ -f ~/.profile ] && source ~/.profile
|
||||||
15
dotfiles/.editorconfig
Normal file
15
dotfiles/.editorconfig
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
root = true
|
||||||
|
|
||||||
|
[*]
|
||||||
|
charset = utf-8
|
||||||
|
end_of_line = lf
|
||||||
|
insert_final_newline = true
|
||||||
|
indent_style = space
|
||||||
|
indent_size = 4
|
||||||
|
trim_trailing_whitespace = true
|
||||||
|
|
||||||
|
[*.md]
|
||||||
|
trim_trailing_whitespace = false
|
||||||
|
|
||||||
|
[*.{yml,yaml}]
|
||||||
|
indent_size = 2
|
||||||
143
dotfiles/.git_aliases
Normal file
143
dotfiles/.git_aliases
Normal file
@@ -0,0 +1,143 @@
|
|||||||
|
[alias]
|
||||||
|
a = "add"
|
||||||
|
aa = "add --all" # add all unstaged into index
|
||||||
|
aliases = "config --get-regexp '^alias.*'" # show all aliases
|
||||||
|
amend = "commit --amend --all --no-edit" # add new changes into last commit
|
||||||
|
amendm = "commit --amend --all --message" # amend + edit commit message
|
||||||
|
archive = "!f() { top=$(rev-parse --show-toplevel); cd $top; tar cvzf $top.tar.gz $top ; }; f" # make repo .tar.gz
|
||||||
|
b = "branch" #
|
||||||
|
bm = "branch --merged" # branches whose tips are reachable from commit or HEAD
|
||||||
|
bnm = "branch --no-merged" # branches whose tips are NOT reachable from commit or HEAD
|
||||||
|
br = "branch" #
|
||||||
|
branches = "branch -a"
|
||||||
|
brd = "branch -D" # force delete unmerged branch
|
||||||
|
brod = "!git branch -D "$1"; git push origin :"$1";" # brd + remove it from origin
|
||||||
|
bv = "branch -v" # show branch list with those last commits
|
||||||
|
bvv = "branch -vv" # bv + remote branches tracked by them
|
||||||
|
c = "commit"
|
||||||
|
ca = "commit --all" # stage all changes and make a commit (interative)
|
||||||
|
cam = "commit --all --message" # ca + cm (non-interactive)
|
||||||
|
cf = "!f() { TARGET=$(git rev-parse \"$1\"); git commit --fixup=$TARGET && GIT_EDITOR=true git rebase --interactive --autosquash $TARGET~; }; f" # https://words.filippo.io/git-fixup-amending-an-older-commit/
|
||||||
|
cleaner = "clean -dff"
|
||||||
|
cleanest = "clean -dffx"
|
||||||
|
cleanout = "!git clean -df && git checkout -- ."
|
||||||
|
cloner = "clone --recursive" # clone with submodules
|
||||||
|
cm = "commit --message" # make a commit with message given (non-interactive)
|
||||||
|
co = "checkout"
|
||||||
|
cob = "checkout -b" # create new branch with name given
|
||||||
|
contributors = "shortlog --summary --numbered --no-merges" # users participating in development
|
||||||
|
cp = "cherry-pick"
|
||||||
|
cpa = "cherry-pick --abort" # abort cherry-picking
|
||||||
|
cpc = "cherry-pick --continue" # continue cherry-picking
|
||||||
|
cpn = "cherry-pick --no-commit" # cherry-pick without commit
|
||||||
|
current-branch = "branch --show-current" #rev-parse --abbrev-ref HEAD
|
||||||
|
d = "diff"
|
||||||
|
dc = "diff --cached" # show diff of staged files
|
||||||
|
default-branch = "config init.defaultBranch" # get default branch name
|
||||||
|
dehead = "!BR=$(git branch --show-current); if [ -n "$BR" ]; then echo $BR; else git describe --contains --all HEAD; fi;"
|
||||||
|
dev = "!git checkout dev && git pull" # quick switch on dev branch and update it
|
||||||
|
develop = "!git checkout develop && git pull" # quick switch on develop branch and update it
|
||||||
|
discard = "checkout --" # удаляет изменения в файле
|
||||||
|
dw = "diff --word-diff" # show word diff in unstaged files
|
||||||
|
dwc = "diff --word-diff --cached" # dc + dw
|
||||||
|
empty="!git commit --allow-empty"
|
||||||
|
exec = "!exec"
|
||||||
|
f = "fetch"
|
||||||
|
fa = "fetch --all" # fetch branches from all remotes
|
||||||
|
fuck = "!git checkout $(git default-branch) && git fetch origin --prune && git reset --hard origin/$(git default-branch) && git clean -ffd"
|
||||||
|
guser = "config --global --get-regexp '^user'" # show global user settings
|
||||||
|
gwhoami = "guser"
|
||||||
|
gzip = "!f(){ top=$(rev-parse --show-toplevel); cd $top; tar cvzf $top.tar.gz $top};f" # make repo .tar.gz
|
||||||
|
head = "log -1 HEAD" # показать последний коммит в текущей ветке
|
||||||
|
heads = "log --graph --decorate --simplify-by-decoration --oneline" # show last commit of each branch as tree graph
|
||||||
|
inbound = "!git remote update --prune; git log ..@{upstream}" # get
|
||||||
|
init = "init -q"
|
||||||
|
l = "log"
|
||||||
|
lo = "log --oneline"
|
||||||
|
log-all = "log --graph --decorate --all"
|
||||||
|
log-my = "!git log --author $(git config user.email)"
|
||||||
|
log-small = "log --graph --decorate --all --pretty=format:'%C(bold red)%h%C(reset) %C(bold blue)%an%C(reset) %C(green)%cr%C(reset) [%aD]%d%n%B'"
|
||||||
|
m = "merge"
|
||||||
|
ma = "merge --abort" # abort merging
|
||||||
|
main = "!git checkout main && git pull" # quick switch on main branch and update it
|
||||||
|
master = "!git checkout master && git pull" # quick switch on master branch and update it
|
||||||
|
mc = "merge --continue" # continue merging
|
||||||
|
merged = "bm"
|
||||||
|
mn = "merge --no-commit" # merge without commit
|
||||||
|
optimizer = "!git pruner; git repacker; git prune-packed"
|
||||||
|
orphans = "fsck --full"
|
||||||
|
outbound = "log @{upstream}.."
|
||||||
|
p = "pull"
|
||||||
|
pf = "pull --force" # получить ветку принудительно
|
||||||
|
pft = "pull --force --tags" # получить теги
|
||||||
|
prs = "pull --recurse-submodules" # pull with submodules
|
||||||
|
pruner = "!git prune --expire=now; git reflog expire --expire-unreachable=now --rewrite --all"
|
||||||
|
pullf = "pull --force"
|
||||||
|
pullft = "pull --force --tags"
|
||||||
|
pullt = "pull --tags" # получить теги
|
||||||
|
pushf = "!git push --force" # отправить ветку принудительно
|
||||||
|
pushft = "!git push --tags --force" # отправить теги принудительно
|
||||||
|
pusht = "!git push --tags" # отправить теги
|
||||||
|
r = "reset"
|
||||||
|
rb = "rebase"
|
||||||
|
rba = "rebase --abort"
|
||||||
|
rbc = "rebase --continue"
|
||||||
|
rbi = "rebase --interactive"
|
||||||
|
rbs = "rebase --skip"
|
||||||
|
re = "remote"
|
||||||
|
rea = "remote add"
|
||||||
|
remotes = "remote -v" # показать список удалённых репозиториев
|
||||||
|
rep = "remote prune"
|
||||||
|
repacker = "repack -adf --depth=300 --window=300 --window-memory=1g"
|
||||||
|
repd = "remote prune --dry-run"
|
||||||
|
repo = "rpo"
|
||||||
|
repod = "rpod"
|
||||||
|
repush = "!git push origin :$1 && git push origin $1'" # замена push --force
|
||||||
|
res = "remote show"
|
||||||
|
reso = "remote show origin"
|
||||||
|
reu = "remote update"
|
||||||
|
rev = "remote -v"
|
||||||
|
rh = "reset --hard" # откат коммита с удалением всех изменений на указанный коммит
|
||||||
|
rhh = "reset --hard HEAD" # откат коммита с удалением всех изменений на последний коммит
|
||||||
|
rpo = "remote prune origin" # удалить все мёртвые ссылки на bare-ветки origin
|
||||||
|
rpod = "rpo --dry-run" # удалить все мёртвые ссылки на bare-ветки origin
|
||||||
|
rs = "reset --soft" # откат коммита с сохранением всех изменений на указанный коммит
|
||||||
|
rsh = "reset --soft HEAD" # откат коммита с сохранением всех изменений
|
||||||
|
rso = "remote show origin" # показать состояние локальных веток относительно удалённых на origin bare
|
||||||
|
rv = "revert"
|
||||||
|
rvn = "revert --no-commit"
|
||||||
|
s = "status"
|
||||||
|
sb = "show-branch"
|
||||||
|
st = "status"
|
||||||
|
start = "!git init -q && git commit --allow-empty -m 'Initial commit'"
|
||||||
|
stashes = "stash list" # show stashed changes
|
||||||
|
sub = "submodule"
|
||||||
|
tags = "tag -n1 --list" # shot tag names and commit message
|
||||||
|
targz = "archive"
|
||||||
|
trim = "!DEFAULT=$(git default-branch); git branch --merged ${1-$DEFAULT} | grep -v " ${1-$DEFAULT}$" | xargs git branch -d; git remote prune origin;"
|
||||||
|
uncommit = "rs HEAD~1"
|
||||||
|
undo = "uncommit"
|
||||||
|
unstage = "reset HEAD" # staged file => unstaged
|
||||||
|
upstream-branch = "!git for-each-ref --format='%(upstream:short)' $(git symbolic-ref -q HEAD)"
|
||||||
|
user = "config --local --get-regexp '^user'" # show local user settings (in current repo)
|
||||||
|
vacuum="!git reflog expire --expire-unreachable=now --all; git gc --prune=now"
|
||||||
|
whoami = "user"
|
||||||
|
wip = "!git add . && git commit -am 'WIP'"
|
||||||
|
wipa = "!git add . && git commit --amend -am 'WIP'"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
; branches = "bvv"
|
||||||
|
; cpnx = "cherry-pick --no-commit -x"
|
||||||
|
; last-tag = "describe --tags --abbrev=0"
|
||||||
|
; last-tagged = "!git describe --tags $(git rev-list --tags --max-count=1)"
|
||||||
|
; ploh = "pull origin HEAD" # получить текущую ветку из origin
|
||||||
|
; pr = "!git fetch origin pull/$1/head:pr/$1 && git checkout pr/$1" # github: встать на PR с указанным id
|
||||||
|
; sa = "submodule add"
|
||||||
|
; sdi = "submodule deinit -f"
|
||||||
|
; si = "submodule init"
|
||||||
|
; ss = "submodule summary"
|
||||||
|
; sst = "submodule status"
|
||||||
|
; sup = "submodule update"
|
||||||
|
; sy = "remote update origin --prune"
|
||||||
28
dotfiles/.gitconfig
Normal file
28
dotfiles/.gitconfig
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
[core]
|
||||||
|
editor = nano
|
||||||
|
autocrlf = input
|
||||||
|
[user]
|
||||||
|
# ...
|
||||||
|
# signingkey = <key>
|
||||||
|
# git config user.signingkey ... -- установить ключ
|
||||||
|
# https://help.github.com/articles/signing-commits-using-gpg/
|
||||||
|
[commit]
|
||||||
|
gpgSign = true
|
||||||
|
[tag]
|
||||||
|
gpgSign = true
|
||||||
|
[init]
|
||||||
|
defaultBranch = master
|
||||||
|
[push]
|
||||||
|
default = current
|
||||||
|
followTags = true
|
||||||
|
[pull]
|
||||||
|
default = current
|
||||||
|
rebase = false
|
||||||
|
[diff "bin"]
|
||||||
|
textconv = hexdump -v -C
|
||||||
|
[help]
|
||||||
|
autocorrect = 1
|
||||||
|
[remote "origin"]
|
||||||
|
prune = true
|
||||||
|
[include]
|
||||||
|
path = ~/.git_aliases
|
||||||
5
dotfiles/.gitignore
vendored
Normal file
5
dotfiles/.gitignore
vendored
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
.DS_Store
|
||||||
|
Desktop.ini
|
||||||
|
._*
|
||||||
|
Thumbs.db
|
||||||
|
nbproject/
|
||||||
63
dotfiles/.profile
Normal file
63
dotfiles/.profile
Normal file
@@ -0,0 +1,63 @@
|
|||||||
|
# ~/.profile: executed by the command interpreter for login shells.
|
||||||
|
# This file is not read by bash(1), if ~/.bash_profile or ~/.bash_login
|
||||||
|
# exists.
|
||||||
|
# see /usr/share/doc/bash/examples/startup-files for examples.
|
||||||
|
# the files are located in the bash-doc package.
|
||||||
|
|
||||||
|
# the default umask is set in /etc/profile; for setting the umask
|
||||||
|
# for ssh logins, install and configure the libpam-umask package.
|
||||||
|
#umask 022
|
||||||
|
|
||||||
|
# if running bash
|
||||||
|
if [ -n "$BASH_VERSION" ]; then
|
||||||
|
# include .bashrc if it exists
|
||||||
|
if [ -f "$HOME/.bashrc" ]; then
|
||||||
|
. "$HOME/.bashrc"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
# set PATH so it includes user's private bin if it exists
|
||||||
|
if [ -d "$HOME/bin" ] ; then
|
||||||
|
PATH="$HOME/bin:$PATH"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# set PATH so it includes user's private bin if it exists
|
||||||
|
if [ -d "$HOME/.local/bin" ] ; then
|
||||||
|
PATH="$HOME/.local/bin:$PATH"
|
||||||
|
fi
|
||||||
|
|
||||||
|
### AAA ##########################################
|
||||||
|
|
||||||
|
[ -f ~/.bash_aliases ] && source ~/.bash_aliases
|
||||||
|
[ -f ~/bars/src/lis-docker/.bash_aliases ] && source ~/bars/src/lis-docker/.bash_aliases
|
||||||
|
|
||||||
|
export LITE_SCALE=1 # workaround https://github.com/lite-xl/lite-xl/issues/1173
|
||||||
|
|
||||||
|
export JAVA_HOME="/usr/bin/"
|
||||||
|
export PATH="/opt/nvim-linux64/bin:$PATH"
|
||||||
|
export PATH="$HOME/.local/bin/:$PATH"
|
||||||
|
export PATH="$HOME/.local/share/JetBrains/Toolbox/scripts:$PATH"
|
||||||
|
export PATH="$(composer config -g home)/vendor/bin:$PATH"
|
||||||
|
|
||||||
|
# phpbrew
|
||||||
|
# export PHPBREW_SET_PROMPT=1
|
||||||
|
# export PHPBREW_RC_ENABLE=1
|
||||||
|
# [ -f ~/.phpbrew/bashrc ] && source ~/.phpbrew/bashrc
|
||||||
|
|
||||||
|
# golang
|
||||||
|
export PATH="/usr/local/go/bin:$PATH"
|
||||||
|
export GOPATH="$HOME/.go"
|
||||||
|
|
||||||
|
# rust cargo
|
||||||
|
[ -f ~/.cargo/env ] && source ~/.cargo/env
|
||||||
|
|
||||||
|
# nvm
|
||||||
|
# export NVM_DIR="$HOME/.nvm"
|
||||||
|
# [ -s "$NVM_DIR/nvm.sh" ] && source "$NVM_DIR/nvm.sh" # This loads nvm
|
||||||
|
# [ -s "$NVM_DIR/bash_completion" ] && source "$NVM_DIR/bash_completion" # This loads nvm bash_completion
|
||||||
|
|
||||||
|
# The next line updates PATH for Yandex Cloud CLI.
|
||||||
|
[ -f "$HOME/yandex-cloud/path.bash.inc" ] && source "$HOME/yandex-cloud/path.bash.inc"
|
||||||
|
|
||||||
|
# The next line enables shell command completion for yc.
|
||||||
|
[ -f "$HOME/yandex-cloud/completion.zsh.inc" ] && source "$HOME/yandex-cloud/completion.zsh.inc"
|
||||||
114
dotfiles/.zshrc
Normal file
114
dotfiles/.zshrc
Normal file
@@ -0,0 +1,114 @@
|
|||||||
|
# Enable Powerlevel10k instant prompt. Should stay close to the top of ~/.zshrc.
|
||||||
|
# Initialization code that may require console input (password prompts, [y/n]
|
||||||
|
# confirmations, etc.) must go above this block; everything else may go below.
|
||||||
|
if [[ -r "${XDG_CACHE_HOME:-$HOME/.cache}/p10k-instant-prompt-${(%):-%n}.zsh" ]]; then
|
||||||
|
source "${XDG_CACHE_HOME:-$HOME/.cache}/p10k-instant-prompt-${(%):-%n}.zsh"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# If you come from bash you might have to change your $PATH.
|
||||||
|
# export PATH=$HOME/bin:/usr/local/bin:$PATH
|
||||||
|
|
||||||
|
# Path to your oh-my-zsh installation.
|
||||||
|
export ZSH="$HOME/.oh-my-zsh"
|
||||||
|
|
||||||
|
# Set name of the theme to load --- if set to "random", it will
|
||||||
|
# load a random theme each time oh-my-zsh is loaded, in which case,
|
||||||
|
# to know which specific one was loaded, run: echo $RANDOM_THEME
|
||||||
|
# See https://github.com/ohmyzsh/ohmyzsh/wiki/Themes
|
||||||
|
ZSH_THEME="powerlevel10k/powerlevel10k"
|
||||||
|
|
||||||
|
# Set list of themes to pick from when loading at random
|
||||||
|
# Setting this variable when ZSH_THEME=random will cause zsh to load
|
||||||
|
# a theme from this variable instead of looking in $ZSH/themes/
|
||||||
|
# If set to an empty array, this variable will have no effect.
|
||||||
|
# ZSH_THEME_RANDOM_CANDIDATES=( "robbyrussell" "agnoster" )
|
||||||
|
|
||||||
|
# Uncomment the following line to use case-sensitive completion.
|
||||||
|
# CASE_SENSITIVE="true"
|
||||||
|
|
||||||
|
# Uncomment the following line to use hyphen-insensitive completion.
|
||||||
|
# Case-sensitive completion must be off. _ and - will be interchangeable.
|
||||||
|
# HYPHEN_INSENSITIVE="true"
|
||||||
|
|
||||||
|
# Uncomment one of the following lines to change the auto-update behavior
|
||||||
|
# zstyle ':omz:update' mode disabled # disable automatic updates
|
||||||
|
# zstyle ':omz:update' mode auto # update automatically without asking
|
||||||
|
# zstyle ':omz:update' mode reminder # just remind me to update when it's time
|
||||||
|
|
||||||
|
# Uncomment the following line to change how often to auto-update (in days).
|
||||||
|
# zstyle ':omz:update' frequency 13
|
||||||
|
|
||||||
|
# Uncomment the following line if pasting URLs and other text is messed up.
|
||||||
|
# DISABLE_MAGIC_FUNCTIONS="true"
|
||||||
|
|
||||||
|
# Uncomment the following line to disable colors in ls.
|
||||||
|
# DISABLE_LS_COLORS="true"
|
||||||
|
|
||||||
|
# Uncomment the following line to disable auto-setting terminal title.
|
||||||
|
# DISABLE_AUTO_TITLE="true"
|
||||||
|
|
||||||
|
# Uncomment the following line to enable command auto-correction.
|
||||||
|
# ENABLE_CORRECTION="true"
|
||||||
|
|
||||||
|
# Uncomment the following line to display red dots whilst waiting for completion.
|
||||||
|
# You can also set it to another string to have that shown instead of the default red dots.
|
||||||
|
# e.g. COMPLETION_WAITING_DOTS="%F{yellow}waiting...%f"
|
||||||
|
# Caution: this setting can cause issues with multiline prompts in zsh < 5.7.1 (see #5765)
|
||||||
|
# COMPLETION_WAITING_DOTS="true"
|
||||||
|
|
||||||
|
# Uncomment the following line if you want to disable marking untracked files
|
||||||
|
# under VCS as dirty. This makes repository status check for large repositories
|
||||||
|
# much, much faster.
|
||||||
|
# DISABLE_UNTRACKED_FILES_DIRTY="true"
|
||||||
|
|
||||||
|
# Uncomment the following line if you want to change the command execution time
|
||||||
|
# stamp shown in the history command output.
|
||||||
|
# You can set one of the optional three formats:
|
||||||
|
# "mm/dd/yyyy"|"dd.mm.yyyy"|"yyyy-mm-dd"
|
||||||
|
# or set a custom format using the strftime function format specifications,
|
||||||
|
# see 'man strftime' for details.
|
||||||
|
# HIST_STAMPS="mm/dd/yyyy"
|
||||||
|
|
||||||
|
# Would you like to use another custom folder than $ZSH/custom?
|
||||||
|
# ZSH_CUSTOM=/path/to/new-custom-folder
|
||||||
|
|
||||||
|
# Which plugins would you like to load?
|
||||||
|
# Standard plugins can be found in $ZSH/plugins/
|
||||||
|
# Custom plugins may be added to $ZSH_CUSTOM/plugins/
|
||||||
|
# Example format: plugins=(rails git textmate ruby lighthouse)
|
||||||
|
# Add wisely, as too many plugins slow down shell startup.
|
||||||
|
plugins=(git docker docker-compose composer zsh-autosuggestions zsh-syntax-highlighting)
|
||||||
|
# plugins=(git zsh-autosuggestions zsh-syntax-highlighting)
|
||||||
|
|
||||||
|
source $ZSH/oh-my-zsh.sh
|
||||||
|
|
||||||
|
# User configuration
|
||||||
|
|
||||||
|
# export MANPATH="/usr/local/man:$MANPATH"
|
||||||
|
|
||||||
|
# You may need to manually set your language environment
|
||||||
|
# export LANG=en_US.UTF-8
|
||||||
|
|
||||||
|
# Preferred editor for local and remote sessions
|
||||||
|
# if [[ -n $SSH_CONNECTION ]]; then
|
||||||
|
# export EDITOR='vim'
|
||||||
|
# else
|
||||||
|
# export EDITOR='mvim'
|
||||||
|
# fi
|
||||||
|
|
||||||
|
# Compilation flags
|
||||||
|
# export ARCHFLAGS="-arch x86_64"
|
||||||
|
|
||||||
|
# Set personal aliases, overriding those provided by oh-my-zsh libs,
|
||||||
|
# plugins, and themes. Aliases can be placed here, though oh-my-zsh
|
||||||
|
# users are encouraged to define aliases within the ZSH_CUSTOM folder.
|
||||||
|
# For a full list of active aliases, run `alias`.
|
||||||
|
#
|
||||||
|
# Example aliases
|
||||||
|
# alias zshconfig="mate ~/.zshrc"
|
||||||
|
# alias ohmyzsh="mate ~/.oh-my-zsh"
|
||||||
|
|
||||||
|
# To customize prompt, run `p10k configure` or edit ~/.p10k.zsh.
|
||||||
|
[[ ! -f ~/.p10k.zsh ]] || source ~/.p10k.zsh
|
||||||
|
|
||||||
|
[[ -f ~/.profile ]] && source ~/.profile
|
||||||
2
dotfiles/README.md
Normal file
2
dotfiles/README.md
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
This directory contains files whose names start with a dot.
|
||||||
|
Make sure your file manager displays them here.
|
||||||
15
dotfiles/etc/docker/daemon.json
Normal file
15
dotfiles/etc/docker/daemon.json
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
{
|
||||||
|
"registry-mirrors": [
|
||||||
|
"https://dockerhub.timeweb.cloud",
|
||||||
|
"https://dh-mirror.gitverse.ru",
|
||||||
|
"https://mirror.gcr.io",
|
||||||
|
"https://daocloud.io",
|
||||||
|
"https://c.163.com/",
|
||||||
|
"https://registry.docker-cn.com",
|
||||||
|
"https://huecker.io",
|
||||||
|
"https://public.ecr.aws",
|
||||||
|
"https://quay.io",
|
||||||
|
"https://registry.access.redhat.com",
|
||||||
|
"https://registry.redhat.io"
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
// https://docs.sublimetext.io/reference/commands.html
|
||||||
|
// https://docs.sublimetext.io/reference/key_bindings.html
|
||||||
|
[
|
||||||
|
{ "keys": ["ctrl+k", "ctrl+o"], "command": "prompt_open_folder" },
|
||||||
|
{ "keys": ["ctrl+f2"], "command": "find_all_under"},
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
// https://docs.sublimetext.io/reference/commands.html
|
||||||
|
// https://docs.sublimetext.io/reference/mouse_bindings.html
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"button": "button2", "modifiers": ["ctrl"],
|
||||||
|
"command": "fold",
|
||||||
|
"press_command": "drag_select"
|
||||||
|
},
|
||||||
|
]
|
||||||
@@ -0,0 +1,18 @@
|
|||||||
|
{
|
||||||
|
"bootstrapped": true,
|
||||||
|
"in_process_packages":
|
||||||
|
[
|
||||||
|
],
|
||||||
|
"installed_packages":
|
||||||
|
[
|
||||||
|
"Docker Based Build Systems",
|
||||||
|
"Dockerfile Syntax Highlighting",
|
||||||
|
"LogView",
|
||||||
|
"Markdown Extended",
|
||||||
|
"MarkdownLivePreview",
|
||||||
|
"MarkdownPreview",
|
||||||
|
"Materialize",
|
||||||
|
"Package Control",
|
||||||
|
"phpfmt",
|
||||||
|
],
|
||||||
|
}
|
||||||
@@ -0,0 +1,26 @@
|
|||||||
|
{
|
||||||
|
"ignored_packages":
|
||||||
|
[
|
||||||
|
"Vintage",
|
||||||
|
],
|
||||||
|
"color_scheme": "Packages/Materialize/schemes/Material One Dark.tmTheme",
|
||||||
|
"theme": "Material One Dark.sublime-theme",
|
||||||
|
"index_files": true,
|
||||||
|
"font_face": "JetBrains Mono NL",
|
||||||
|
"font_options": [
|
||||||
|
"dlig",
|
||||||
|
"ss01",
|
||||||
|
"gray_antialias"
|
||||||
|
],
|
||||||
|
"fade_fold_buttons": false,
|
||||||
|
"rulers": [120],
|
||||||
|
"translate_tabs_to_spaces": true,
|
||||||
|
"highlight_line": true,
|
||||||
|
"control_character_style": "names",
|
||||||
|
"trim_trailing_white_space_on_save": "all",
|
||||||
|
"trim_only_modified_white_space": false,
|
||||||
|
"ensure_newline_at_eof_on_save": true,
|
||||||
|
"scroll_speed": 1.2,
|
||||||
|
"show_tab_close_buttons": false,
|
||||||
|
"folder_exclude_patterns": [".svn", ".hg", "CVS", ".Trash", ".Trash-*"],
|
||||||
|
}
|
||||||
@@ -1,12 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
echo
|
|
||||||
echo "==============================================="
|
|
||||||
echo "Installing flatpak and its software..."
|
|
||||||
echo "==============================================="
|
|
||||||
echo
|
|
||||||
|
|
||||||
sudo apt install -y --autoremove \
|
|
||||||
flatpak \
|
|
||||||
gnome-software-plugin-flatpak
|
|
||||||
|
|
||||||
flatpak remote-add --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo
|
|
||||||
@@ -1,49 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
echo
|
|
||||||
echo "==============================================="
|
|
||||||
echo "Installing oci8..."
|
|
||||||
echo "==============================================="
|
|
||||||
echo
|
|
||||||
|
|
||||||
# https://www.oracle.com/cis/database/technologies/instant-client/downloads.html
|
|
||||||
|
|
||||||
#check for
|
|
||||||
# wget https://download.oracle.com/otn_software/linux/instantclient/instantclient-basic-linuxx64.zip
|
|
||||||
# wget https://download.oracle.com/otn_software/linux/instantclient/instantclient-basiclite-linuxx64.zip -- only libociicus.so
|
|
||||||
# wget https://download.oracle.com/otn_software/linux/instantclient/instantclient-sqlplus-linuxx64.zip
|
|
||||||
# wget https://download.oracle.com/otn_software/linux/instantclient/instantclient-tools-linuxx64.zip
|
|
||||||
# wget https://download.oracle.com/otn_software/linux/instantclient/instantclient-sdk-linuxx64.zip
|
|
||||||
#unzip
|
|
||||||
|
|
||||||
sudo mkdir /opt/oracle/
|
|
||||||
sudo mv ~/Downloads/instant_client/ /opt/oracle/
|
|
||||||
|
|
||||||
sudo sh -c "echo /opt/oracle/instant_client > /etc/ld.so.conf.d/oracle-instantclient.conf"
|
|
||||||
sudo ldconfig
|
|
||||||
|
|
||||||
sudo apt install -y --autoremove \
|
|
||||||
php-dev \
|
|
||||||
php-pear \
|
|
||||||
build-essential \
|
|
||||||
libaio1 \
|
|
||||||
default-jdk
|
|
||||||
sudo pecl channel-update pecl.php.net
|
|
||||||
sudo pecl install oci8 # php8
|
|
||||||
#sudo pecl install oci8-2.2.0 # php7
|
|
||||||
|
|
||||||
#sh -c "echo '; priority=10' > /etc/php/7.4/mods-available/oci8.ini"
|
|
||||||
# sudo sh -c "echo 'extension=oci8.so' >> /etc/php/7.4/mods-available/oci8.ini"
|
|
||||||
# sudo chmod 0644 /etc/php/7.4/mods-available/oci8.ini
|
|
||||||
sudo phpenmod oci8
|
|
||||||
php -i | grep oci8
|
|
||||||
|
|
||||||
# instantclient,/opt/oracle/instant_client
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# https://pecl.php.net/package/oci8
|
|
||||||
#sudo pecl install oci8-2.2.0
|
|
||||||
@@ -1,42 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
echo
|
|
||||||
echo "==============================================="
|
|
||||||
echo "Installing phpstorm-url-handler..."
|
|
||||||
echo "==============================================="
|
|
||||||
echo
|
|
||||||
|
|
||||||
installed() {
|
|
||||||
command -v "$1" >/dev/null 2>&1
|
|
||||||
}
|
|
||||||
|
|
||||||
# https://github.com/rozwell/phpstorm-url-handler/
|
|
||||||
# https://askubuntu.com/a/1023143
|
|
||||||
# https://askubuntu.com/a/919825
|
|
||||||
# https://medium.com/swlh/custom-protocol-handling-how-to-8ac41ff651eb
|
|
||||||
# https://www.linuxquestions.org/questions/linux-desktop-74/xdg-open-doesn%27t-recognize-custom-protocol-4175433062/#post4809984
|
|
||||||
|
|
||||||
sudo rm -rf /usr/bin/phpstorm-url-handler >/dev/null
|
|
||||||
sudo rm -rf ~/.local/share/applications/phpstorm-url-handler.desktop >/dev/null
|
|
||||||
sudo rm -rf /usr/share/applications/phpstorm-url-handler.desktop >/dev/null
|
|
||||||
if installed "git"; then
|
|
||||||
sudo git clone https://github.com/rozwell/phpstorm-url-handler.git /usr/src/phpstorm-url-handler
|
|
||||||
else
|
|
||||||
sudo wget https://github.com/rozwell/phpstorm-url-handler/archive/master.zip -O /tmp/phpstorm-url-handler.zip
|
|
||||||
sudo unzip /tmp/phpstorm-url-handler.zip -d /usr/src/phpstorm-url-handler
|
|
||||||
sudo rm -f /tmp/phpstorm-url-handler.zip
|
|
||||||
fi
|
|
||||||
|
|
||||||
info "Copy .desktop"
|
|
||||||
sudo cp /usr/src/phpstorm-url-handler/phpstorm-url-handler.desktop /usr/share/local/applications/phpstorm-url-handler.desktop
|
|
||||||
|
|
||||||
info "Symlink bin"
|
|
||||||
sudo cp /usr/src/phpstorm-url-handler/phpstorm-url-handler /usr/bin/phpstorm-url-handler
|
|
||||||
|
|
||||||
info "desktop-file-install"
|
|
||||||
sudo desktop-file-install phpstorm-url-handler.desktop
|
|
||||||
|
|
||||||
info "update-desktop-database"
|
|
||||||
sudo update-desktop-database -v 2>&1 | grep -E "^(.+)\/phpstorm-url-handler.desktop(.+)$"
|
|
||||||
|
|
||||||
info "xdg-mime"
|
|
||||||
xdg-mime default phpstorm-url-handler.desktop x-scheme-handler/phpstorm
|
|
||||||
@@ -1,46 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
echo
|
|
||||||
echo "==============================================="
|
|
||||||
echo "Installing samp-server v03svr_R2-1..."
|
|
||||||
echo "==============================================="
|
|
||||||
echo
|
|
||||||
|
|
||||||
# https://sampwiki.blast.hk/wiki/Linux_Server
|
|
||||||
# https://team.sa-mp.com/wiki/Server.cfg_RU.html
|
|
||||||
|
|
||||||
cd $HOME
|
|
||||||
wget -qO - https://files.sa-mp.com/samp03svr_R2-1.tar.gz | tar -zxf -
|
|
||||||
# sudo dpkg --add-architecture i386
|
|
||||||
# sudo apt update
|
|
||||||
# sudo apt install -y libc6:i386
|
|
||||||
apt-get install ia32-libs
|
|
||||||
|
|
||||||
echo "echo Executing Server Config...
|
|
||||||
lanmode 0
|
|
||||||
rcon 1
|
|
||||||
language Russian
|
|
||||||
rcon_password bootsector
|
|
||||||
maxplayers 50
|
|
||||||
port 7777
|
|
||||||
hostname My Server
|
|
||||||
gamemode0 bare 1
|
|
||||||
filterscripts base gl_actions gl_property gl_realtime
|
|
||||||
announce 1
|
|
||||||
query 1
|
|
||||||
weburl
|
|
||||||
maxnpc 0
|
|
||||||
onfoot_rate 40
|
|
||||||
incar_rate 40
|
|
||||||
weapon_rate 40
|
|
||||||
stream_distance 800.0
|
|
||||||
stream_rate 1000
|
|
||||||
timestamp 1
|
|
||||||
output 0
|
|
||||||
" > $HOME/samp03/server.cfg
|
|
||||||
|
|
||||||
ln -s $HOME/samp03/samp03svr /usr/local/bin/samp
|
|
||||||
|
|
||||||
echo
|
|
||||||
echo "Success! Now run via 'samp &'"
|
|
||||||
echo
|
|
||||||
|
|
||||||
@@ -1,12 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
echo
|
|
||||||
echo "==============================================="
|
|
||||||
echo "Installing wkhtmltopdf..."
|
|
||||||
echo "==============================================="
|
|
||||||
echo
|
|
||||||
|
|
||||||
# не тестировалось
|
|
||||||
|
|
||||||
wget "https://github.com/wkhtmltopdf/packaging/releases/download/0.12.6-1/wkhtmltox_0.12.6-1.focal_amd64.deb" -O /tmp/wkhtmltopdf.deb
|
|
||||||
sudo dpkg -i /tmp/wkhtmltopdf.deb
|
|
||||||
rm /tmp/wkhtmltopdf.deb
|
|
||||||
95
gen-makefile
Executable file
95
gen-makefile
Executable file
@@ -0,0 +1,95 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
[ -f Makefile ] && mv Makefile Makefile.bak
|
||||||
|
CHR_UPGRADE='^'
|
||||||
|
CHR_UNINSTALL='/'
|
||||||
|
|
||||||
|
cat << EOF > Makefile
|
||||||
|
# Autogenerated at $(date +'%d.%m.%Y %H:%M') using ${BASH_SOURCE[0]}
|
||||||
|
.DEFAULT_GOAL := help
|
||||||
|
|
||||||
|
#===============================================
|
||||||
|
# Scripts listed in ./install
|
||||||
|
#===============================================
|
||||||
|
|
||||||
|
EOF
|
||||||
|
|
||||||
|
for file in ./install/*; do
|
||||||
|
name=${file##*/}
|
||||||
|
name=${name%.sh}
|
||||||
|
desc=$(grep -m 1 -oP "(?<=^##makedesc:\s).*$" ${file})
|
||||||
|
[ -z "$desc" ] && desc='<no description>'
|
||||||
|
echo -e "##${name}: ${desc}\n${name}:\n\t@${file}\n" >> Makefile
|
||||||
|
done;
|
||||||
|
|
||||||
|
cat << EOF >> Makefile
|
||||||
|
|
||||||
|
#===============================================
|
||||||
|
# Scripts listed in ./packs
|
||||||
|
#===============================================
|
||||||
|
|
||||||
|
EOF
|
||||||
|
|
||||||
|
for file in ./packs/*; do
|
||||||
|
cat "$file" >> Makefile
|
||||||
|
echo >> Makefile
|
||||||
|
done;
|
||||||
|
|
||||||
|
|
||||||
|
cat << EOF >> Makefile
|
||||||
|
#===============================================
|
||||||
|
# Scripts listed in ./upgrade
|
||||||
|
#===============================================
|
||||||
|
|
||||||
|
EOF
|
||||||
|
|
||||||
|
for file in ./upgrade/*; do
|
||||||
|
name=${file##*/}
|
||||||
|
name=${name%.sh}
|
||||||
|
desc=$(grep -m 1 -oP "(?<=^##makedesc:\s).*$" ${file})
|
||||||
|
[ -z "$desc" ] && desc='<no description>'
|
||||||
|
echo -e "##${CHR_UPGRADE}${name}: ${desc}\n${CHR_UPGRADE}${name}:\n\t@${file}\n" >> Makefile
|
||||||
|
done;
|
||||||
|
|
||||||
|
cat << EOF >> Makefile
|
||||||
|
#===============================================
|
||||||
|
# Scripts listed in ./uninstall
|
||||||
|
#===============================================
|
||||||
|
|
||||||
|
EOF
|
||||||
|
|
||||||
|
for file in ./uninstall/*; do
|
||||||
|
name=${file##*/}
|
||||||
|
name=${name%.sh}
|
||||||
|
desc=$(grep -m 1 -oP "(?<=^##makedesc:\s).*$" ${file})
|
||||||
|
[ -z "$desc" ] && desc='<no description>'
|
||||||
|
echo -e "##${CHR_UNINSTALL}${name}: ${desc}\n${CHR_UNINSTALL}${name}:\n\t@${file}\n" >> Makefile
|
||||||
|
done;
|
||||||
|
|
||||||
|
cat << EOF >> Makefile
|
||||||
|
#===============================================
|
||||||
|
# Service goals
|
||||||
|
#===============================================
|
||||||
|
|
||||||
|
self:
|
||||||
|
@./gen-makefile
|
||||||
|
help: Makefile
|
||||||
|
@echo "Ubuntu software installator"
|
||||||
|
@echo
|
||||||
|
@echo "Usage:"
|
||||||
|
@echo "\tmake help\t - show this help"
|
||||||
|
@echo "\tmake self\t - regenerate Makefile (alias of ./gen-makefile)"
|
||||||
|
@echo "\tmake GOAL\t - install software"
|
||||||
|
@echo "\tmake ${CHR_UPGRADE}GOAL\t - upgrade software"
|
||||||
|
@echo "\tmake ${CHR_UNINSTALL}GOAL\t - uninstall software"
|
||||||
|
@echo "\nYou can combine GOALs, here are some examples:"
|
||||||
|
@echo "\tmake ${CHR_UNINSTALL}docker docker"
|
||||||
|
@echo "\tmake php ${CHR_UNINSTALL}docker ${CHR_UPGRADE}omz"
|
||||||
|
@echo "\nAvailable GOALs:"
|
||||||
|
@sed -n 's/^##//p' $< | column -ts ':' | sed -e "s/^/\t/"
|
||||||
|
+%:
|
||||||
|
@make $*
|
||||||
|
EOF
|
||||||
|
|
||||||
|
echo "New ./Makefile has been generated!"
|
||||||
|
echo "Old one has been saved as ./Makefile.bak"
|
||||||
|
echo "Now run 'make' to get help"
|
||||||
@@ -1,34 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
mv Makefile Makefile.bak
|
|
||||||
echo -e "# Autogenerated at $(date +'%d.%m.%Y %H:%M') using ${BASH_SOURCE[0]}\n" > Makefile
|
|
||||||
|
|
||||||
for file in ./packs/*; do
|
|
||||||
cat ${file} >> Makefile
|
|
||||||
done;
|
|
||||||
|
|
||||||
for file in ./install/*; do
|
|
||||||
name=${file##*/}
|
|
||||||
name=${name%.sh}
|
|
||||||
desc=$(grep -m 1 -oP "(?<=^##makedesc:\s).*$" ${file})
|
|
||||||
[ -z "$desc" ] && desc='<no description>'
|
|
||||||
echo -e "##${name}: ${desc}\n${name}:\n\t${file}\n" >> Makefile
|
|
||||||
done;
|
|
||||||
|
|
||||||
cat << EOF >> Makefile
|
|
||||||
##help: Show this help message
|
|
||||||
help: Makefile
|
|
||||||
@echo "Usage:"
|
|
||||||
@echo "\tmake <goal>\n"
|
|
||||||
@echo "Available goals:"
|
|
||||||
@sed -n 's/^##//p' $< | column -t -s ':' | sed -e "s/^/\t/"
|
|
||||||
|
|
||||||
##<goal>_: Same as 'cat ./install/<goal>.sh'
|
|
||||||
%_:
|
|
||||||
@cat ./install/\$*.sh
|
|
||||||
EOF
|
|
||||||
|
|
||||||
|
|
||||||
echo "New ./Makefile has been generated!"
|
|
||||||
echo "Old one has been saved as ./Makefile.bak"
|
|
||||||
echo
|
|
||||||
make help
|
|
||||||
20
helpers.sh
Normal file
20
helpers.sh
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
set -oe pipefail
|
||||||
|
|
||||||
|
__root__=$( dirname $(readlink -e -- "${BASH_SOURCE}"))
|
||||||
|
source $__root__/helpers/io.sh || exit 255
|
||||||
|
source $__root__/helpers/git.sh || exit 255
|
||||||
|
source $__root__/helpers/basic.sh || exit 255
|
||||||
|
source $__root__/helpers/debug.sh || exit 255
|
||||||
|
source $__root__/helpers/packages.sh || exit 255
|
||||||
|
|
||||||
|
title() {
|
||||||
|
[[ $__AAA_NO_TITLE = 1 ]] || {
|
||||||
|
[ "$1" ] && title="$1" || title="$(grep -m 1 -oP "(?<=^##makedesc:\s).*$" ${BASH_SOURCE[1]})"
|
||||||
|
info
|
||||||
|
info "==============================================="
|
||||||
|
info "$title"
|
||||||
|
info "==============================================="
|
||||||
|
info
|
||||||
|
}
|
||||||
|
}
|
||||||
111
helpers/arg-parser/README.md
Normal file
111
helpers/arg-parser/README.md
Normal file
@@ -0,0 +1,111 @@
|
|||||||
|
# Argument parser for bash scripts v1.6
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
|
||||||
|
```shell
|
||||||
|
# 1. add these lines after shebang:
|
||||||
|
|
||||||
|
__RAW_ARGS__=("$@")
|
||||||
|
source args.sh
|
||||||
|
|
||||||
|
# 2. read arguments as flags:
|
||||||
|
|
||||||
|
arg a 1 flag_a
|
||||||
|
echo "Flag -a has value '$flag_a'"
|
||||||
|
echo "Flag -a has value '$(arg a 1)'"
|
||||||
|
|
||||||
|
arg b 1 flag_b
|
||||||
|
echo "Flag -b has value '$flag_b'"
|
||||||
|
echo "Flag -b has value '$(arg b 1)'"
|
||||||
|
|
||||||
|
arg c 1 flag_c
|
||||||
|
echo "Flag -c has value '$flag_c'"
|
||||||
|
echo "Flag -c has value '$(arg c 1)'"
|
||||||
|
|
||||||
|
arg d 1 flag_d
|
||||||
|
echo "Flag -d has value '$flag_d'"
|
||||||
|
echo "Flag -d has value '$(arg d 1)'"
|
||||||
|
|
||||||
|
argl flag1 1 flag_1
|
||||||
|
echo "Flag --flag1 has value '$flag_1'"
|
||||||
|
echo "Flag --flag1 has value '$(argl flag1 1)'"
|
||||||
|
|
||||||
|
argl flag2 1 flag_2
|
||||||
|
echo "Flag --flag2 has value '$flag_2'"
|
||||||
|
echo "Flag --flag2 has value '$(argl flag2 1)'"
|
||||||
|
|
||||||
|
# 3. and/or read arguments' values:
|
||||||
|
|
||||||
|
arg a 0 arg_a
|
||||||
|
echo "Arg -a has value '$arg_a'"
|
||||||
|
echo "Arg -a has value '$(arg a 0)'"
|
||||||
|
|
||||||
|
arg b 0 arg_b
|
||||||
|
echo "Arg -b has value '$arg_b'"
|
||||||
|
echo "Arg -b has value '$(arg b 0)'"
|
||||||
|
|
||||||
|
argl arg1 0 arg_1
|
||||||
|
echo "Arg --arg1 has value '$arg_1'"
|
||||||
|
echo "Arg --arg1 has value '$(argl arg1 0)'"
|
||||||
|
|
||||||
|
argl arg2 0 arg_2
|
||||||
|
echo "Arg --arg2 has value '$arg_2'"
|
||||||
|
echo "Arg --arg2 has value '$(argl arg2 0)'"
|
||||||
|
```
|
||||||
|
|
||||||
|
## How it works
|
||||||
|
|
||||||
|
1. Short arguments can be specified contiguously or separately
|
||||||
|
and their order does not matter, but before each of them
|
||||||
|
(or the first of them) one leading dash must be specified.
|
||||||
|
|
||||||
|
> Valid combinations: `-a -b -c`, `-cba`, `-b -azc "value of z"`
|
||||||
|
|
||||||
|
2. Short arguments can have values and if are - value must go
|
||||||
|
next to argument itself.
|
||||||
|
|
||||||
|
> Valid combinations: `-ab avalue`, `-ba avalue`, `-a avalue -b`
|
||||||
|
|
||||||
|
3. Long arguments cannot be combined like short ones and each
|
||||||
|
of them must be specified separately with two leading dashes.
|
||||||
|
|
||||||
|
> Valid combinations: `--foo --bar`, `--bar --foo`
|
||||||
|
|
||||||
|
4. Long arguments can have a value which must be specified after `=`.
|
||||||
|
|
||||||
|
> Valid combinations: `--foo value --bar`, `--bar --foo=value`
|
||||||
|
|
||||||
|
5. If arg value may contain space then value must be "double-quoted".
|
||||||
|
|
||||||
|
6. You can use arg() or argl() to check presence of any arg, no matter
|
||||||
|
if it has value or not.
|
||||||
|
|
||||||
|
More info:
|
||||||
|
* 🇷🇺 [axenov.dev/bash-args](https://axenov.dev/bash-args/)
|
||||||
|
* 🇺🇸 [axenov.dev/en/bash-processing-arguments-in-a-script-when-called-from-the-shell/](https://axenov.dev/en/bash-processing-arguments-in-a-script-when-called-from-the-shell)
|
||||||
|
|
||||||
|
Tested in Ubuntu 20.04.2 LTS in:
|
||||||
|
|
||||||
|
```
|
||||||
|
bash 5.0.17(1)-release (x86_64-pc-linux-gnu) and later
|
||||||
|
zsh 5.8 (x86_64-ubuntu-linux-gnu) and later
|
||||||
|
```
|
||||||
|
|
||||||
|
## Version history
|
||||||
|
|
||||||
|
```
|
||||||
|
v1.0 - initial
|
||||||
|
v1.1 - arg(): improved skipping uninteresting args
|
||||||
|
- arg(): check next arg to be valid value
|
||||||
|
v1.2 - removed all 'return' statements
|
||||||
|
- arg(): error message corrected
|
||||||
|
- new examples
|
||||||
|
v1.3 - argl(): improved flag check
|
||||||
|
- some text corrections
|
||||||
|
v1.4 - new function argn()
|
||||||
|
- some text corrections
|
||||||
|
v1.5 - arg(), grep_match(): fixed searching for -e argument
|
||||||
|
- grep_match(): redirect output into /dev/null
|
||||||
|
v1.6 - removed useless argn()
|
||||||
|
- arg() and argl() refactored and now support values with whitespaces
|
||||||
|
```
|
||||||
158
helpers/arg-parser/args.sh
Executable file
158
helpers/arg-parser/args.sh
Executable file
@@ -0,0 +1,158 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
# Argument parser for bash scripts
|
||||||
|
#
|
||||||
|
# Author: Anthony Axenov (Антон Аксенов)
|
||||||
|
# Version: 1.6
|
||||||
|
# License: MIT
|
||||||
|
# Description: https://git.axenov.dev/anthony/shell/src/branch/master/helpers/arg-parser
|
||||||
|
|
||||||
|
#purpose Little helper to check if string matches PCRE
|
||||||
|
#argument $1 - some string
|
||||||
|
#argument $2 - regex
|
||||||
|
#exitcode 0 - string valid
|
||||||
|
#exitcode 1 - string is not valid
|
||||||
|
grep_match() {
|
||||||
|
printf "%s" "$1" | grep -qE "$2" >/dev/null
|
||||||
|
}
|
||||||
|
|
||||||
|
#purpose Find short argument or its value
|
||||||
|
#argument $1 - (string) argument (without leading dashes; only first letter will be processed)
|
||||||
|
#argument $2 - (number) is it flag? 1 if is, otherwise 0 or nothing
|
||||||
|
#argument $3 - (string) variable to return value into
|
||||||
|
# (if not specified then it will be echo'ed in stdout)
|
||||||
|
#returns (string) 1 (if $2 == 1), value (if correct and if $2 != 1) or nothing
|
||||||
|
#usage To get value into var: arg v 0 myvar or myvalue=$(arg 'v')
|
||||||
|
#usage To find flag into var: arg f 1 myvar or flag=$(arg 'f')
|
||||||
|
#usage To echo value: arg v
|
||||||
|
#usage To echo 1 if flag exists: arg f
|
||||||
|
arg() {
|
||||||
|
[ "$1" ] || { echo "Argument name is not specified!" >&2 && exit 1; }
|
||||||
|
local arg_name="${1:0:1}" # first character of argument name to find
|
||||||
|
local is_flag="$2" || 0 # 1 if we need just find a flag, 0 to get a value
|
||||||
|
local var_name="$3" || 0 # variable name to return value into or 0 to echo it in stdout
|
||||||
|
local value= # initialize empty value to check if we found one later
|
||||||
|
local arg_found=0 # marker of found argument
|
||||||
|
|
||||||
|
for idx in "${!__RAW_ARGS__[@]}"; do # going through all args
|
||||||
|
local arg_search=${__RAW_ARGS__[idx]} # get current argument
|
||||||
|
|
||||||
|
# skip $arg_search if it starts with '--' or letter
|
||||||
|
grep_match "$arg_search" "^(\w|--)" && continue
|
||||||
|
|
||||||
|
# clear $arg_search from special and duplicate characters, e.g. 'fas-)dfs' will become 'fasd'
|
||||||
|
local arg_chars="$(printf "%s" "$arg_search" \
|
||||||
|
| tr -s "[$arg_search]" 2>/dev/null \
|
||||||
|
| tr -d "[:punct:][:blank:]" 2>/dev/null)"
|
||||||
|
|
||||||
|
# if $arg_name is not one of $arg_chars the skip it
|
||||||
|
grep_match "-$arg_name" "^-[$arg_chars]$" || continue
|
||||||
|
arg_found=1
|
||||||
|
|
||||||
|
# then return '1'|'0' back into $value if we need flag or next arg value otherwise
|
||||||
|
[ "$is_flag" = 1 ] && value=1 || value="${__RAW_ARGS__[idx+1]}"
|
||||||
|
break
|
||||||
|
done
|
||||||
|
|
||||||
|
[ "$is_flag" = 1 ] && [ -z "$value" ] && value=0;
|
||||||
|
|
||||||
|
# if value we found is empty or looks like another argument then exit with error message
|
||||||
|
if [ "$arg_found" = 1 ] && ! grep_match "$value" "^[[:graph:]]+$" || grep_match "$value" "^--?\w+$"; then
|
||||||
|
echo "ERROR: Argument '-$arg_name' must have correct value!" >&2 && exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# return '$value' back into $var_name (if exists) or echo in stdout
|
||||||
|
[ "$var_name" ] && eval "$var_name='$value'" || echo "$value"
|
||||||
|
}
|
||||||
|
|
||||||
|
#purpose Find long argument or its value
|
||||||
|
#argument $1 - argument (without leading dashes)
|
||||||
|
#argument $2 - (number) is it flag? 1 if is, otherwise 0 or nothing
|
||||||
|
#argument $3 - (string) variable to return value into
|
||||||
|
# (if not specified then it will be echo'ed in stdout)
|
||||||
|
#returns (string) 1 (if $2 == 1), value (if correct and if $2 != 1) or nothing
|
||||||
|
#usage To get value into var: arg v 0 myvar or myvalue=$(arg 'v')
|
||||||
|
#usage To find flag into var: arg f 1 myvar or flag=$(arg 'f')
|
||||||
|
#usage To echo value: arg v
|
||||||
|
#usage To echo 1 if flag exists: arg f
|
||||||
|
argl() {
|
||||||
|
[ "$1" ] || { echo "Argument name is not specified!" >&2 && exit 1; }
|
||||||
|
local arg_name="$1" # argument name to find
|
||||||
|
local is_flag="$2" || 0 # 1 if we need just find a flag, 0 to get a value
|
||||||
|
local var_name="$3" || 0 # variable name to return value into or 0 to echo it in stdout
|
||||||
|
local value= # initialize empty value to check if we found one later
|
||||||
|
local arg_found=0 # marker of found argument
|
||||||
|
|
||||||
|
for idx in "${!__RAW_ARGS__[@]}"; do # going through all args
|
||||||
|
local arg_search="${__RAW_ARGS__[idx]}" # get current argument
|
||||||
|
|
||||||
|
if [ "$arg_search" = "--$arg_name" ]; then # if current arg begins with two dashes
|
||||||
|
# then return '1' back into $value if we need flag or next arg value otherwise
|
||||||
|
[ "$is_flag" = 1 ] && value=1 || value="${__RAW_ARGS__[idx+1]}"
|
||||||
|
break # stop the loop
|
||||||
|
elif grep_match "$arg_search" "^--$arg_name=.+$"; then # check if $arg like '--foo=bar'
|
||||||
|
# then return '1' back into $value if we need flag or part from '=' to arg's end as value otherwise
|
||||||
|
[ "$is_flag" = 1 ] && value=1 || value="${arg_search#*=}"
|
||||||
|
break # stop the loop
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
[ "$is_flag" = 1 ] && [ -z "$value" ] && value=0;
|
||||||
|
|
||||||
|
# if value we found is empty or looks like another argument then exit with error message
|
||||||
|
if [ "$arg_found" = 1 ] && ! grep_match "$value" "^[[:graph:]]+$" || grep_match "$value" "^--?\w+$"; then
|
||||||
|
echo "ERROR: Argument '--$arg_name' must have correct value!" >&2 && exit 1;
|
||||||
|
fi
|
||||||
|
|
||||||
|
# return '$value' back into $var_name (if exists) or echo in stdout
|
||||||
|
[ "$var_name" ] && eval "$var_name='$value'" || echo "$value"
|
||||||
|
}
|
||||||
|
|
||||||
|
################################
|
||||||
|
|
||||||
|
# This is simple examples which you can play around with.
|
||||||
|
# 1. uncomment code below
|
||||||
|
# 2. call thi sscript to see what happens:
|
||||||
|
# /args.sh -abcd --flag1 --flag2 -e evalue -f fvalue --arg1=value1 --arg2 value2
|
||||||
|
|
||||||
|
# __RAW_ARGS__=("$@")
|
||||||
|
|
||||||
|
# arg a 1 flag_a
|
||||||
|
# echo "Flag -a has value '$flag_a'"
|
||||||
|
# echo "Flag -a has value '$(arg a 1)'"
|
||||||
|
|
||||||
|
# arg b 1 flag_b
|
||||||
|
# echo "Flag -b has value '$flag_b'"
|
||||||
|
# echo "Flag -b has value '$(arg b 1)'"
|
||||||
|
|
||||||
|
# arg c 1 flag_c
|
||||||
|
# echo "Flag -c has value '$flag_c'"
|
||||||
|
# echo "Flag -c has value '$(arg c 1)'"
|
||||||
|
|
||||||
|
# arg d 1 flag_d
|
||||||
|
# echo "Flag -d has value '$flag_d'"
|
||||||
|
# echo "Flag -d has value '$(arg d 1)'"
|
||||||
|
|
||||||
|
# argl flag1 1 flag_1
|
||||||
|
# echo "Flag --flag1 has value '$flag_1'"
|
||||||
|
# echo "Flag --flag1 has value '$(argl flag1 1)'"
|
||||||
|
|
||||||
|
# argl flag2 1 flag_2
|
||||||
|
# echo "Flag --flag2 has value '$flag_2'"
|
||||||
|
# echo "Flag --flag2 has value '$(argl flag2 1)'"
|
||||||
|
|
||||||
|
# arg e 0 arg_e
|
||||||
|
# echo "Arg -e has value '$arg_e'"
|
||||||
|
# echo "Arg -e has value '$(arg e 0)'"
|
||||||
|
|
||||||
|
# arg f 0 arg_f
|
||||||
|
# echo "Arg -f has value '$arg_f'"
|
||||||
|
# echo "Arg -f has value '$(arg f 0)'"
|
||||||
|
|
||||||
|
# argl arg1 0 arg_1
|
||||||
|
# echo "Arg --arg1 has value '$arg_1'"
|
||||||
|
# echo "Arg --arg1 has value '$(argl arg1 0)'"
|
||||||
|
|
||||||
|
# argl arg2 0 arg_2
|
||||||
|
# echo "Arg --arg2 has value '$arg_2'"
|
||||||
|
# echo "Arg --arg2 has value '$(argl arg2 0)'"
|
||||||
127
helpers/basic.sh
Normal file
127
helpers/basic.sh
Normal file
@@ -0,0 +1,127 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
source $( dirname $(readlink -e -- "${BASH_SOURCE}"))/io.sh || exit 255
|
||||||
|
|
||||||
|
########################################################
|
||||||
|
# Little handy helpers for scripting
|
||||||
|
########################################################
|
||||||
|
|
||||||
|
is_bash() {
|
||||||
|
[[ "$(basename "$SHELL")" != "bash" ]]
|
||||||
|
}
|
||||||
|
|
||||||
|
is_sourced() {
|
||||||
|
[[ "${BASH_SOURCE[0]}" != "$0" ]]
|
||||||
|
}
|
||||||
|
|
||||||
|
is_root() {
|
||||||
|
[[ "$(id -u)" -ne 0 || $(ps -o comm= -p $PPID) == "sudo" ]]
|
||||||
|
}
|
||||||
|
|
||||||
|
get_os() {
|
||||||
|
case "$(uname -s)" in
|
||||||
|
Linux*) echo Linux ;;
|
||||||
|
Darwin*) echo Macos ;;
|
||||||
|
CYGWIN*) echo Cygwin ;;
|
||||||
|
MINGW*) echo MinGw ;;
|
||||||
|
MSYS_NT*) echo Git ;;
|
||||||
|
*) return 1 ;;
|
||||||
|
esac
|
||||||
|
}
|
||||||
|
|
||||||
|
get_os_id() {
|
||||||
|
[ -f /etc/os-release ] && source /etc/os-release
|
||||||
|
echo "$ID"
|
||||||
|
}
|
||||||
|
|
||||||
|
# convert relative path $1 to full one
|
||||||
|
abspath() {
|
||||||
|
echo $(realpath -q "${1/#\~/$HOME}")
|
||||||
|
}
|
||||||
|
|
||||||
|
# check if path $1 is writable
|
||||||
|
is_writable() {
|
||||||
|
[ -w "$(abspath $1)" ]
|
||||||
|
}
|
||||||
|
|
||||||
|
# check if path $1 is a directory
|
||||||
|
is_dir() {
|
||||||
|
[ -d "$(abspath $1)" ]
|
||||||
|
}
|
||||||
|
|
||||||
|
# check if path $1 is a file
|
||||||
|
is_file() {
|
||||||
|
[ -f "$(abspath $1)" ]
|
||||||
|
}
|
||||||
|
|
||||||
|
# check if an argument is a shell function
|
||||||
|
is_function() {
|
||||||
|
declare -F "$1" > /dev/null
|
||||||
|
}
|
||||||
|
|
||||||
|
# check if string $1 matches regex $2
|
||||||
|
regex_match() {
|
||||||
|
printf "%s" "$1" | grep -qP "$2"
|
||||||
|
}
|
||||||
|
|
||||||
|
# check if array $2 contains string $1
|
||||||
|
in_array() {
|
||||||
|
local find=$1
|
||||||
|
shift
|
||||||
|
for e in "$@"; do
|
||||||
|
[[ "$e" == "$find" ]] && return 0
|
||||||
|
done
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
|
||||||
|
# join all elements of array $2 with delimiter $1
|
||||||
|
implode() {
|
||||||
|
local d=${1-}
|
||||||
|
local f=${2-}
|
||||||
|
if shift 2; then
|
||||||
|
printf %s "$f" "${@/#/$d}"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# open url $1 in system web-browser
|
||||||
|
open_url() {
|
||||||
|
if which xdg-open > /dev/null; then
|
||||||
|
xdg-open "$1" </dev/null >/dev/null 2>&1 & disown
|
||||||
|
elif which gnome-open > /dev/null; then
|
||||||
|
gnome-open "$1" </dev/null >/dev/null 2>&1 & disown
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# unpack .tar.gz file $1 into path $2
|
||||||
|
unpack_targz() {
|
||||||
|
require tar
|
||||||
|
tar -xzvf "$1" -C "$2"
|
||||||
|
}
|
||||||
|
|
||||||
|
# make soft symbolic link of path $1 to path $2
|
||||||
|
symlink() {
|
||||||
|
ln -sf "$1" "$2"
|
||||||
|
}
|
||||||
|
|
||||||
|
# download file $1 into path $2 using wget
|
||||||
|
download() {
|
||||||
|
require wget
|
||||||
|
wget "$1" -O "$2"
|
||||||
|
}
|
||||||
|
|
||||||
|
# download file $1 into path $2 using curl
|
||||||
|
cdownload() {
|
||||||
|
require curl
|
||||||
|
curl -fsSL "$1" -o "$2"
|
||||||
|
}
|
||||||
|
|
||||||
|
is_int() {
|
||||||
|
[[ "$1" =~ ^[0-9]+$ ]]
|
||||||
|
}
|
||||||
|
|
||||||
|
is_number() {
|
||||||
|
[[ "$1" =~ ^[0-9]+([.,][0-9]+)?$ ]]
|
||||||
|
}
|
||||||
|
|
||||||
|
trim() {
|
||||||
|
echo "$1" | xargs
|
||||||
|
}
|
||||||
3
helpers/debug.sh
Normal file
3
helpers/debug.sh
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
source $( dirname $(readlink -e -- "${BASH_SOURCE}"))/io.sh || exit 255
|
||||||
|
|
||||||
79
helpers/docker.sh
Normal file
79
helpers/docker.sh
Normal file
@@ -0,0 +1,79 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
########################################################
|
||||||
|
# Docker wrappers
|
||||||
|
########################################################
|
||||||
|
|
||||||
|
# Вызывает корректную команду docker compose
|
||||||
|
docker.compose() {
|
||||||
|
require docker
|
||||||
|
|
||||||
|
argl profiles 0 profiles
|
||||||
|
args=${*/--profiles=[a-zA-Z_,0-9]*/}
|
||||||
|
|
||||||
|
if $(docker compose &>/dev/null); then
|
||||||
|
local cmd="docker compose $args"
|
||||||
|
elif installed_pkg "docker-compose"; then
|
||||||
|
local cmd="docker-compose $args"
|
||||||
|
warn
|
||||||
|
warn "docker-compose v1 устарел и не поддерживается, его поведение непредсказуемо."
|
||||||
|
warn "Обнови docker согласно документации: https://docs.docker.com/engine/install/"
|
||||||
|
warn
|
||||||
|
else
|
||||||
|
error "Должен быть установлен docker-compose-plugin!"
|
||||||
|
die "Установи docker согласно документации: https://docs.docker.com/engine/install/" 2
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ "$profiles" ]]; then
|
||||||
|
export COMPOSE_PROFILES=$profiles
|
||||||
|
debug "Выполнено: export COMPOSE_PROFILES=$profiles"
|
||||||
|
fi
|
||||||
|
|
||||||
|
debug "Команда: $cmd"
|
||||||
|
$cmd
|
||||||
|
}
|
||||||
|
|
||||||
|
# Выводит информацию о контейнере
|
||||||
|
docker.inspect() {
|
||||||
|
cmd="docker inspect $*"
|
||||||
|
debug "Команда: $cmd"
|
||||||
|
$cmd 2>/dev/null
|
||||||
|
}
|
||||||
|
|
||||||
|
# Выполняет команду в контейнере от имени root
|
||||||
|
docker.exec() {
|
||||||
|
cmd="docker exec -u root -it $*"
|
||||||
|
debug "Команда: $cmd"
|
||||||
|
$cmd
|
||||||
|
}
|
||||||
|
|
||||||
|
# Выводит информацию о контейнере
|
||||||
|
docker.inspect() {
|
||||||
|
cmd="docker inspect $*"
|
||||||
|
debug "Команда: $cmd"
|
||||||
|
$cmd 2>/dev/null
|
||||||
|
}
|
||||||
|
|
||||||
|
docker.ip() { # not finished
|
||||||
|
if [ "$1" ]; then
|
||||||
|
if [ "$1" = "-a" ]; then
|
||||||
|
docker ps -aq \
|
||||||
|
| xargs -n 1 docker inspect --format '{{.Name}}{{range .NetworkSettings.Networks}} {{.IPAddress}}{{end}}' \
|
||||||
|
| sed -e 's#^/##' \
|
||||||
|
| column -t
|
||||||
|
elif [ "$1" = "-c" ]; then
|
||||||
|
docker-compose ps -q \
|
||||||
|
| xargs -n 1 docker inspect --format '{{.Name}}{{range .NetworkSettings.Networks}} {{.IPAddress}}{{end}}' \
|
||||||
|
| sed -e 's#^/##' \
|
||||||
|
| column -t
|
||||||
|
else
|
||||||
|
docker inspect --format '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' "$1"
|
||||||
|
docker port "$1"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
docker ps -q \
|
||||||
|
| xargs -n 1 docker inspect --format '{{.Name}}{{range .NetworkSettings.Networks}} {{.IPAddress}}{{end}}' \
|
||||||
|
| sed -e 's#^/##' \
|
||||||
|
| column -t
|
||||||
|
fi
|
||||||
|
}
|
||||||
178
helpers/git.sh
Normal file
178
helpers/git.sh
Normal file
@@ -0,0 +1,178 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
_dir=$( dirname $(readlink -e -- "${BASH_SOURCE}"))
|
||||||
|
source "$_dir/io.sh" || exit 255
|
||||||
|
source "$_dir/basic.sh" || exit 255
|
||||||
|
source "$_dir/packages.sh" || exit 255
|
||||||
|
|
||||||
|
########################################################
|
||||||
|
# Shorthands for git
|
||||||
|
########################################################
|
||||||
|
|
||||||
|
git.clone_quick() {
|
||||||
|
require git
|
||||||
|
git clone --depth=1 --single-branch "$@"
|
||||||
|
}
|
||||||
|
|
||||||
|
git.is_repo() {
|
||||||
|
require git
|
||||||
|
[ "$1" ] || die "Path is not specified" 101
|
||||||
|
require_dir "$1/"
|
||||||
|
check_dir "$1/.git"
|
||||||
|
}
|
||||||
|
|
||||||
|
git.require_repo() {
|
||||||
|
require git
|
||||||
|
git.is_repo "$1" || die "'$1' is not git repository!" 10
|
||||||
|
}
|
||||||
|
|
||||||
|
git.cfg() {
|
||||||
|
require git
|
||||||
|
[ "$1" ] || die "Key is not specified" 101
|
||||||
|
if [[ "$2" ]]; then
|
||||||
|
git config --global --replace-all "$1" "$2"
|
||||||
|
else
|
||||||
|
echo $(git config --global --get-all "$1")
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
git.set_user() {
|
||||||
|
require git
|
||||||
|
[ "$1" ] || die "git.set_user: Repo is not specified" 100
|
||||||
|
git.cfg "$1" "user.name" "$2"
|
||||||
|
git.cfg "$1" "user.email" "$3"
|
||||||
|
success "User set to '$name <$email>' in ${FWHITE}$1"
|
||||||
|
}
|
||||||
|
|
||||||
|
git.fetch() {
|
||||||
|
require git
|
||||||
|
if [ "$1" ]; then
|
||||||
|
if git.remote_branch_exists "origin/$1"; then
|
||||||
|
git fetch origin "refs/heads/$1:refs/remotes/origin/$1" --progress --prune --quiet 2>&1 || die "Could not fetch $1 from origin" 12
|
||||||
|
else
|
||||||
|
warn "Tried to fetch branch 'origin/$1' but it does not exist."
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
git fetch origin --progress --prune --quiet 2>&1 || exit 12
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
git.reset() {
|
||||||
|
require git
|
||||||
|
git reset --hard HEAD
|
||||||
|
git clean -fd
|
||||||
|
}
|
||||||
|
|
||||||
|
git.clone() {
|
||||||
|
require git
|
||||||
|
git clone "$*" 2>&1
|
||||||
|
}
|
||||||
|
|
||||||
|
git.co() {
|
||||||
|
require git
|
||||||
|
git checkout "$*" 2>&1
|
||||||
|
}
|
||||||
|
|
||||||
|
git.is_it_current_branch() {
|
||||||
|
require git
|
||||||
|
[ "$1" ] || die "git.is_it_current_branch: Branch is not specified" 19
|
||||||
|
[[ "$(git.current_branch)" = "$1" ]]
|
||||||
|
}
|
||||||
|
|
||||||
|
git.pull() {
|
||||||
|
require git
|
||||||
|
[ "$1" ] && BRANCH=$1 || BRANCH=$(git.current_branch)
|
||||||
|
# note "Updating branch $BRANCH..."
|
||||||
|
git pull origin "refs/heads/$BRANCH:refs/remotes/origin/$BRANCH" --prune --force --quiet 2>&1 || exit 13
|
||||||
|
git pull origin --tags --force --quiet 2>&1 || exit 13
|
||||||
|
# [ "$1" ] || die "git.pull: Branch is not specified" 19
|
||||||
|
# if [ "$1" ]; then
|
||||||
|
# note "Updating branch $1..."
|
||||||
|
# git pull origin "refs/heads/$1:refs/remotes/origin/$1" --prune --force --quiet 2>&1 || exit 13
|
||||||
|
# else
|
||||||
|
# note "Updating current branch..."
|
||||||
|
# git pull
|
||||||
|
# fi
|
||||||
|
}
|
||||||
|
|
||||||
|
git.current_branch() {
|
||||||
|
require git
|
||||||
|
git branch --show-current || exit 18
|
||||||
|
}
|
||||||
|
|
||||||
|
git.local_branch_exists() {
|
||||||
|
require git
|
||||||
|
[ -n "$(git for-each-ref --format='%(refname:short)' refs/heads/$1)" ]
|
||||||
|
}
|
||||||
|
|
||||||
|
git.update_refs() {
|
||||||
|
require git
|
||||||
|
info "Updating local refs..."
|
||||||
|
git remote update origin --prune 1>/dev/null 2>&1 || exit 18
|
||||||
|
}
|
||||||
|
|
||||||
|
git.delete_remote_branch() {
|
||||||
|
require git
|
||||||
|
[ "$1" ] || die "git.remote_branch_exists: Branch is not specified" 19
|
||||||
|
if git.remote_branch_exists "origin/$1"; then
|
||||||
|
git push origin :"$1" # || die "Could not delete the remote $1 in $ORIGIN"
|
||||||
|
return 0
|
||||||
|
else
|
||||||
|
warn "Trying to delete the remote branch $1, but it does not exists in origin"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
git.is_clean_worktree() {
|
||||||
|
require git
|
||||||
|
git rev-parse --verify HEAD >/dev/null || exit 18
|
||||||
|
git update-index -q --ignore-submodules --refresh
|
||||||
|
git diff-files --quiet --ignore-submodules || return 1
|
||||||
|
git diff-index --quiet --ignore-submodules --cached HEAD -- || return 2
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
git.is_branch_merged_into() {
|
||||||
|
require git
|
||||||
|
[ "$1" ] || die "git.remote_branch_exists: Branch1 is not specified" 19
|
||||||
|
[ "$2" ] || die "git.remote_branch_exists: Branch2 is not specified" 19
|
||||||
|
git.update_refs
|
||||||
|
local merge_hash=$(git merge-base "$1"^{} "$2"^{})
|
||||||
|
local base_hash=$(git rev-parse "$1"^{})
|
||||||
|
[ "$merge_hash" = "$base_hash" ]
|
||||||
|
}
|
||||||
|
|
||||||
|
git.remote_branch_exists() {
|
||||||
|
require git
|
||||||
|
[ "$1" ] || die "git.remote_branch_exists: Branch is not specified" 19
|
||||||
|
git.update_refs
|
||||||
|
[ -n "$(git for-each-ref --format='%(refname:short)' refs/remotes/$1)" ]
|
||||||
|
}
|
||||||
|
|
||||||
|
git.new_branch() {
|
||||||
|
require git
|
||||||
|
[ "$1" ] || die "git.new_branch: Branch is not specified" 19
|
||||||
|
if [ "$2" ] && ! git.local_branch_exists "$2" && git.remote_branch_exists "origin/$2"; then
|
||||||
|
git.co -b "$1" origin/"$2"
|
||||||
|
else
|
||||||
|
git.co -b "$1" "$2"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
git.require_clean_worktree() {
|
||||||
|
require git
|
||||||
|
if ! git.is_clean_worktree; then
|
||||||
|
warn "Your working tree is dirty! Look at this:"
|
||||||
|
git status -bs
|
||||||
|
_T="What should you do now?\n"
|
||||||
|
_T="${_T}\t${BOLD}${FWHITE}0.${RESET} try to continue as is\t- errors may occur!\n"
|
||||||
|
_T="${_T}\t${BOLD}${FWHITE}1.${RESET} hard reset\t\t\t- clear current changes and new files\n"
|
||||||
|
_T="${_T}\t${BOLD}${FWHITE}2.${RESET} stash changes (default)\t- save all changes in safe to apply them later via 'git stash pop'\n"
|
||||||
|
_T="${_T}\t${BOLD}${FWHITE}3.${RESET} cancel\n"
|
||||||
|
ask "${_T}${BOLD}${FWHITE}Your choice [0-3]" reset_answer
|
||||||
|
case $reset_answer in
|
||||||
|
1 ) warn "Clearing your work..." && git.reset ;;
|
||||||
|
3 ) exit ;;
|
||||||
|
* ) git stash -a -u -m "WIP before switch to $branch_task" ;;
|
||||||
|
esac
|
||||||
|
fi
|
||||||
|
}
|
||||||
28
helpers/help.sh
Normal file
28
helpers/help.sh
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
#TODO source basic.sh
|
||||||
|
#TODO source args-parser/args.sh
|
||||||
|
|
||||||
|
########################################################
|
||||||
|
# Help functions
|
||||||
|
########################################################
|
||||||
|
|
||||||
|
process_help_arg() {
|
||||||
|
command="${FUNCNAME[1]}"
|
||||||
|
need_help=$(arg help 1)
|
||||||
|
[[ "$need_help" -eq 0 ]] && need_help=$(argl help 1)
|
||||||
|
[[ "$need_help" -eq 1 ]] && help "$command"
|
||||||
|
}
|
||||||
|
|
||||||
|
help() {
|
||||||
|
is_function "help.$1" && help."$1" && exit
|
||||||
|
echo "Main help message"
|
||||||
|
}
|
||||||
|
|
||||||
|
help.example() {
|
||||||
|
echo "Example help message"
|
||||||
|
}
|
||||||
|
|
||||||
|
example() {
|
||||||
|
process_help_arg
|
||||||
|
echo "Example command"
|
||||||
|
}
|
||||||
393
helpers/io.sh
Normal file
393
helpers/io.sh
Normal file
@@ -0,0 +1,393 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
########################################################
|
||||||
|
# Simple and fancy input & output
|
||||||
|
########################################################
|
||||||
|
|
||||||
|
which tput > /dev/null 2>&1 && [[ $(tput -T$TERM colors) -gt 8 ]] && CAN_USE_COLORS=1 || CAN_USE_COLORS=0
|
||||||
|
USE_COLORS=${USE_COLORS:-$CAN_USE_COLORS}
|
||||||
|
|
||||||
|
# Icons (message prefixes)
|
||||||
|
[[ "$USE_COLORS" == 1 ]] && IINFO="( i )" || IINFO=''
|
||||||
|
[[ "$USE_COLORS" == 1 ]] && INOTE="( * )" || INOTE=''
|
||||||
|
[[ "$USE_COLORS" == 1 ]] && IWARN="( # )" || IWARN=''
|
||||||
|
[[ "$USE_COLORS" == 1 ]] && IERROR="( ! )" || IERROR=''
|
||||||
|
[[ "$USE_COLORS" == 1 ]] && IFATAL="( @ )" || IFATAL=''
|
||||||
|
[[ "$USE_COLORS" == 1 ]] && ISUCCESS="( ! )" || ISUCCESS=''
|
||||||
|
[[ "$USE_COLORS" == 1 ]] && IASK="( ? )" || IASK=''
|
||||||
|
[[ "$USE_COLORS" == 1 ]] && IDEBUG="(DBG)" || IDEBUG=''
|
||||||
|
[[ "$USE_COLORS" == 1 ]] && IVRB="( + )" || IVRB=''
|
||||||
|
|
||||||
|
# Text attributes
|
||||||
|
[[ "$USE_COLORS" == 1 ]] && FRESET="$(tput sgr0)" || FRESET='' # Normal
|
||||||
|
[[ "$USE_COLORS" == 1 ]] && FBOLD="$(tput bold)" || FBOLD='' # Bold
|
||||||
|
[[ "$USE_COLORS" == 1 ]] && FDIM="$(tput dim)" || FDIM='' # Dimmed
|
||||||
|
[[ "$USE_COLORS" == 1 ]] && FLINE="$(tput smul)" || FLINE='' # Underlined
|
||||||
|
[[ "$USE_COLORS" == 1 ]] && FENDLINE="$(tput rmul)" || FENDLINE='' # End of underlined
|
||||||
|
[[ "$USE_COLORS" == 1 ]] && FBLINK="$(tput blink)" || FBLINK='' # Blink
|
||||||
|
[[ "$USE_COLORS" == 1 ]] && FREV="$(tput rev)" || FREV='' # Reversed
|
||||||
|
|
||||||
|
# Text colors - normal
|
||||||
|
[[ "$USE_COLORS" == 1 ]] && FBLACK="$(tput setaf 0)" || FBLACK='' # Black
|
||||||
|
[[ "$USE_COLORS" == 1 ]] && FRED="$(tput setaf 1)" || FRED='' # Red
|
||||||
|
[[ "$USE_COLORS" == 1 ]] && FGREEN="$(tput setaf 2)" || FGREEN='' # Green
|
||||||
|
[[ "$USE_COLORS" == 1 ]] && FYELLOW="$(tput setaf 3)" || FYELLOW='' # Yellow
|
||||||
|
[[ "$USE_COLORS" == 1 ]] && FBLUE="$(tput setaf 4)" || FBLUE='' # Blue
|
||||||
|
[[ "$USE_COLORS" == 1 ]] && FPURPLE="$(tput setaf 5)" || FPURPLE='' # Purple
|
||||||
|
[[ "$USE_COLORS" == 1 ]] && FCYAN="$(tput setaf 6)" || FCYAN='' # Cyan
|
||||||
|
[[ "$USE_COLORS" == 1 ]] && FWHITE="$(tput setaf 7)" || FWHITE='' # White
|
||||||
|
|
||||||
|
# Text colors - bright
|
||||||
|
[[ "$USE_COLORS" == 1 ]] && FLBLACK="$(tput setaf 8)" || FLBLACK='' # Black
|
||||||
|
[[ "$USE_COLORS" == 1 ]] && FLRED="$(tput setaf 9)" || FLRED='' # Red
|
||||||
|
[[ "$USE_COLORS" == 1 ]] && FLGREEN="$(tput setaf 10)" || FLGREEN='' # Green
|
||||||
|
[[ "$USE_COLORS" == 1 ]] && FLYELLOW="$(tput setaf 11)" || FLYELLOW='' # Yellow
|
||||||
|
[[ "$USE_COLORS" == 1 ]] && FLBLUE="$(tput setaf 12)" || FLBLUE='' # Blue
|
||||||
|
[[ "$USE_COLORS" == 1 ]] && FLPURPLE="$(tput setaf 13)" || FLPURPLE='' # Purple
|
||||||
|
[[ "$USE_COLORS" == 1 ]] && FLCYAN="$(tput setaf 14)" || FLCYAN='' # Cyan
|
||||||
|
[[ "$USE_COLORS" == 1 ]] && FLWHITE="$(tput setaf 15)" || FLWHITE='' # White
|
||||||
|
|
||||||
|
# Background colors - normal
|
||||||
|
[[ "$USE_COLORS" == 1 ]] && FBBLACK="$(tput setab 0)" || FBBLACK='' # Black
|
||||||
|
[[ "$USE_COLORS" == 1 ]] && FBRED="$(tput setab 1)" || FBRED='' # Red
|
||||||
|
[[ "$USE_COLORS" == 1 ]] && FBGREEN="$(tput setab 2)" || FBGREEN='' # Green
|
||||||
|
[[ "$USE_COLORS" == 1 ]] && FBYELLOW="$(tput setab 3)" || FBYELLOW='' # Yellow
|
||||||
|
[[ "$USE_COLORS" == 1 ]] && FBBLUE="$(tput setab 4)" || FBBLUE='' # Blue
|
||||||
|
[[ "$USE_COLORS" == 1 ]] && FBPURPLE="$(tput setab 5)" || FBPURPLE='' # Purple
|
||||||
|
[[ "$USE_COLORS" == 1 ]] && FBCYAN="$(tput setab 6)" || FBCYAN='' # Cyan
|
||||||
|
[[ "$USE_COLORS" == 1 ]] && FBWHITE="$(tput setab 7)" || FBWHITE='' # White
|
||||||
|
|
||||||
|
# Background colors - bright
|
||||||
|
[[ "$USE_COLORS" == 1 ]] && FBLBLACK="$(tput setab 8)" || FBLBLACK='' # Black
|
||||||
|
[[ "$USE_COLORS" == 1 ]] && FBLRED="$(tput setab 9)" || FBLRED='' # Red
|
||||||
|
[[ "$USE_COLORS" == 1 ]] && FBLGREEN="$(tput setab 10)" || FBLGREEN='' # Green
|
||||||
|
[[ "$USE_COLORS" == 1 ]] && FBLYELLOW="$(tput setab 11)" || FBLYELLOW='' # Yellow
|
||||||
|
[[ "$USE_COLORS" == 1 ]] && FBLBLUE="$(tput setab 12)" || FBLBLUE='' # Blue
|
||||||
|
[[ "$USE_COLORS" == 1 ]] && FBLPURPLE="$(tput setab 13)" || FBLPURPLE='' # Purple
|
||||||
|
[[ "$USE_COLORS" == 1 ]] && FBLCYAN="$(tput setab 14)" || FBLCYAN='' # Cyan
|
||||||
|
[[ "$USE_COLORS" == 1 ]] && FBLWHITE="$(tput setab 15)" || FBLWHITE='' # White
|
||||||
|
|
||||||
|
now() {
|
||||||
|
echo "[$(date +'%H:%M:%S')] "
|
||||||
|
}
|
||||||
|
|
||||||
|
ask() {
|
||||||
|
IFS= read -rp "$(print ${FBOLD}${FBBLUE}${FWHITE}${IASK}${FRESET}\ ${FBOLD}$1 ): " $2
|
||||||
|
}
|
||||||
|
|
||||||
|
print() {
|
||||||
|
# if [ -n "$SPINNER_PID" ] && ps -p $SPINNER_PID > /dev/null; then kill $SPINNER_PID > /dev/null; fi
|
||||||
|
echo -e "$*${FRESET}"
|
||||||
|
}
|
||||||
|
|
||||||
|
link() {
|
||||||
|
echo -e "\e]8;;$2\a$1\e]8;;\a"
|
||||||
|
}
|
||||||
|
|
||||||
|
debug() {
|
||||||
|
if [ "$2" ]; then
|
||||||
|
print "${FDIM}${FBOLD}${FRESET}${FDIM}$(now)${IDEBUG} ${FUNCNAME[1]:-?}():${BASH_LINENO:-?}\t$1 " >&2
|
||||||
|
else
|
||||||
|
print "${FDIM}${FBOLD}${FRESET}${FDIM}$(now)${IDEBUG} $1 " >&2
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
var_dump() {
|
||||||
|
debug "$1 = ${!1}"
|
||||||
|
}
|
||||||
|
|
||||||
|
print_stacktrace() {
|
||||||
|
STACK=""
|
||||||
|
local i
|
||||||
|
local stack_size=${#FUNCNAME[@]}
|
||||||
|
debug "Callstack:"
|
||||||
|
# for (( i=$stack_size-1; i>=1; i-- )); do
|
||||||
|
for (( i=1; i<$stack_size; i++ )); do
|
||||||
|
local func="${FUNCNAME[$i]}"
|
||||||
|
[ x$func = x ] && func=MAIN
|
||||||
|
local linen="${BASH_LINENO[$(( i - 1 ))]}"
|
||||||
|
local src="${BASH_SOURCE[$i]}"
|
||||||
|
[ x"$src" = x ] && src=non_file_source
|
||||||
|
debug " at $func $src:$linen"
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
verbose() {
|
||||||
|
print "${FBOLD}$(now)${IVRB}${FRESET}${FYELLOW} $1 "
|
||||||
|
}
|
||||||
|
|
||||||
|
info() {
|
||||||
|
print "${FBOLD}$(now)${FWHITE}${FBLBLUE}${IINFO}${FRESET}${FWHITE} $1 "
|
||||||
|
}
|
||||||
|
|
||||||
|
note() {
|
||||||
|
print "${FBOLD}$(now)${FDIM}${FWHITE}${INOTE}${FRESET} $1 "
|
||||||
|
}
|
||||||
|
|
||||||
|
success() {
|
||||||
|
print "${FBOLD}$(now)${FBGREEN}${FWHITE}${ISUCCESS}${FRESET}$FGREEN $1 "
|
||||||
|
}
|
||||||
|
|
||||||
|
warn() {
|
||||||
|
print "${FBOLD}$(now)${FBYELLOW}${FBLACK}${IWARN}${FRESET}${FYELLOW} Warning:${FRESET} $1 "
|
||||||
|
}
|
||||||
|
|
||||||
|
error() {
|
||||||
|
print "${FBOLD}$(now)${FBLRED}${FWHITE}${IERROR} Error: ${FRESET}${FLRED} $1 " >&2
|
||||||
|
}
|
||||||
|
|
||||||
|
fatal() {
|
||||||
|
print "${FBOLD}$(now)${FBRED}${FWHITE}${IFATAL} FATAL: $1 " >&2
|
||||||
|
print_stacktrace
|
||||||
|
}
|
||||||
|
|
||||||
|
die() {
|
||||||
|
error "${1:-halted}"
|
||||||
|
exit ${2:-255}
|
||||||
|
}
|
||||||
|
|
||||||
|
# var='test var_dump'
|
||||||
|
# var_dump var
|
||||||
|
# debug 'test debug'
|
||||||
|
# verbose 'test verbose'
|
||||||
|
# info 'test info'
|
||||||
|
# note 'test note'
|
||||||
|
# success 'test success'
|
||||||
|
# warn 'test warn'
|
||||||
|
# error 'test error'
|
||||||
|
# fatal 'test fatal'
|
||||||
|
# die 'test die'
|
||||||
|
|
||||||
|
# experiments ==============================================================================
|
||||||
|
|
||||||
|
# spinner() {
|
||||||
|
# local frames=('⠋' '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')
|
||||||
|
# local spin_i=0
|
||||||
|
# local interval=0.1
|
||||||
|
# printf "\e[?25l"
|
||||||
|
|
||||||
|
# local color="${FGREEN}"
|
||||||
|
|
||||||
|
# while true; do
|
||||||
|
# printf "\r ${color}%s${CL}" "${frames[spin_i]}"
|
||||||
|
# spin_i=$(( (spin_i + 1) % ${#frames[@]} ))
|
||||||
|
# sleep "$interval"
|
||||||
|
# done
|
||||||
|
# }
|
||||||
|
|
||||||
|
# echo "lorem ipsum dolor sit amet"
|
||||||
|
# spinner &
|
||||||
|
# SPINNER_PID=$!
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# ===========
|
||||||
|
|
||||||
|
|
||||||
|
# https://unix.stackexchange.com/a/269085
|
||||||
|
# https://en.wikipedia.org/wiki/ANSI_escape_code#8-bit
|
||||||
|
# https://linuxcommand.org/lc3_adv_tput.php
|
||||||
|
# https://gist.github.com/nowmilano/4055d6df5b6e4ea87c5a72dc2d604193
|
||||||
|
# https://gist.github.com/nick3499/402a6d7dccd474f2bdb679f4311b1238
|
||||||
|
# https://gist.github.com/connorjan/2b02126868157c2b69f9aa0a052cdc86
|
||||||
|
|
||||||
|
# tput setaf 0
|
||||||
|
# echo "BLACK FOREGROUND"
|
||||||
|
# tput setaf 1
|
||||||
|
# echo "RED FOREGROUND"
|
||||||
|
# tput setaf 2
|
||||||
|
# echo "GREEN FOREGROUND"
|
||||||
|
# tput setaf 3
|
||||||
|
# echo "YELLOW FOREGROUND"
|
||||||
|
# tput setaf 4
|
||||||
|
# echo "BLUE FOREGROUND"
|
||||||
|
# tput setaf 5
|
||||||
|
# echo "MAGENTA FOREGROUND"
|
||||||
|
# tput setaf 6
|
||||||
|
# echo "CYAN FOREGROUND"
|
||||||
|
# tput setaf 7
|
||||||
|
# echo "WHITE FOREGROUND"
|
||||||
|
# tput reset
|
||||||
|
|
||||||
|
# ===========
|
||||||
|
|
||||||
|
|
||||||
|
# ===========
|
||||||
|
|
||||||
|
# tohex(){
|
||||||
|
# dec=$(($1%256)) ### input must be a number in range 0-255.
|
||||||
|
# if [ "$dec" -lt "16" ]; then
|
||||||
|
# bas=$(( dec%16 ))
|
||||||
|
# mul=128
|
||||||
|
# [ "$bas" -eq "7" ] && mul=192
|
||||||
|
# [ "$bas" -eq "8" ] && bas=7
|
||||||
|
# [ "$bas" -gt "8" ] && mul=255
|
||||||
|
# a="$(( (bas&1) *mul ))"
|
||||||
|
# b="$(( ((bas&2)>>1)*mul ))"
|
||||||
|
# c="$(( ((bas&4)>>2)*mul ))"
|
||||||
|
# printf 'dec= %3s basic= #%02x%02x%02x\n' "$dec" "$a" "$b" "$c"
|
||||||
|
# elif [ "$dec" -gt 15 ] && [ "$dec" -lt 232 ]; then
|
||||||
|
# b=$(( (dec-16)%6 )); b=$(( b==0?0: b*40 + 55 ))
|
||||||
|
# g=$(( (dec-16)/6%6)); g=$(( g==0?0: g*40 + 55 ))
|
||||||
|
# r=$(( (dec-16)/36 )); r=$(( r==0?0: r*40 + 55 ))
|
||||||
|
# printf 'dec= %3s color= #%02x%02x%02x\n' "$dec" "$r" "$g" "$b"
|
||||||
|
# else
|
||||||
|
# gray=$(( (dec-232)*10+8 ))
|
||||||
|
# printf 'dec= %3s gray= #%02x%02x%02x\n' "$dec" "$gray" "$gray" "$gray"
|
||||||
|
# fi
|
||||||
|
# }
|
||||||
|
|
||||||
|
# for i in $(seq 0 255); do
|
||||||
|
# tohex ${i}
|
||||||
|
# done
|
||||||
|
|
||||||
|
# ===========
|
||||||
|
|
||||||
|
# fromhex(){
|
||||||
|
# hex=${1#"#"}
|
||||||
|
# r=$(printf '0x%0.2s' "$hex")
|
||||||
|
# g=$(printf '0x%0.2s' ${hex#??})
|
||||||
|
# b=$(printf '0x%0.2s' ${hex#????})
|
||||||
|
# printf '%03d' "$(( (r<75?0:(r-35)/40)*6*6 +
|
||||||
|
# (g<75?0:(g-35)/40)*6 +
|
||||||
|
# (b<75?0:(b-35)/40) + 16 ))"
|
||||||
|
# }
|
||||||
|
|
||||||
|
# fromhex 00fc7b
|
||||||
|
|
||||||
|
# ===========
|
||||||
|
|
||||||
|
# mode2header(){
|
||||||
|
# #### For 16 Million colors use \e[0;38;2;R;G;Bm each RGB is {0..255}
|
||||||
|
# printf '\e[mR\n' # reset the colors.
|
||||||
|
# printf '\n\e[m%59s\n' "Some samples of colors for r;g;b. Each one may be 000..255"
|
||||||
|
# printf '\e[m%59s\n' "for the ansi option: \e[0;38;2;r;g;bm or \e[0;48;2;r;g;bm :"
|
||||||
|
# }
|
||||||
|
|
||||||
|
# mode2colors(){
|
||||||
|
# # foreground or background (only 3 or 4 are accepted)
|
||||||
|
# local fb="$1"
|
||||||
|
# [[ $fb != 3 ]] && fb=4
|
||||||
|
# local samples=(0 63 127 191 255)
|
||||||
|
# for r in "${samples[@]}"; do
|
||||||
|
# for g in "${samples[@]}"; do
|
||||||
|
# for b in "${samples[@]}"; do
|
||||||
|
# printf '\e[0;%s8;2;%s;%s;%sm%03d;%03d;%03d ' "$fb" "$r" "$g" "$b" "$r" "$g" "$b"
|
||||||
|
# done; printf '\e[m\n'
|
||||||
|
# done; printf '\e[m'
|
||||||
|
# done; printf '\e[mReset\n'
|
||||||
|
# }
|
||||||
|
# mode2header
|
||||||
|
# mode2colors 3
|
||||||
|
# mode2colors 4
|
||||||
|
|
||||||
|
# ===========
|
||||||
|
|
||||||
|
# printf '\e[48;5;%dm ' {0..255}; printf '\e[0m \n'
|
||||||
|
# for r in {200..255..5}; do
|
||||||
|
# fb=4
|
||||||
|
# g=1
|
||||||
|
# b=1
|
||||||
|
# printf '\e[0;%s8;2;%s;%s;%sm ' "$fb" "$r" "$g" "$b"
|
||||||
|
# done
|
||||||
|
# echo
|
||||||
|
|
||||||
|
# ===========
|
||||||
|
|
||||||
|
# color(){
|
||||||
|
# for c; do
|
||||||
|
# printf '\e[48;5;%dm%03d' $c $c
|
||||||
|
# done
|
||||||
|
# printf '\e[0m \n'
|
||||||
|
# }
|
||||||
|
|
||||||
|
# IFS=$' \t\n'
|
||||||
|
# color {0..15}
|
||||||
|
# for ((i=0;i<6;i++)); do
|
||||||
|
# color $(seq $((i*36+16)) $((i*36+51)))
|
||||||
|
# done
|
||||||
|
# color {232..255}
|
||||||
|
|
||||||
|
# ===========
|
||||||
|
|
||||||
|
# for ((i=0; i<256; i++)) ;do
|
||||||
|
# echo -n ' '
|
||||||
|
# tput setab $i
|
||||||
|
# tput setaf $(( ( (i>231&&i<244 ) || ( (i<17)&& (i%8<2)) ||
|
||||||
|
# (i>16&&i<232)&& ((i-16)%6 <(i<100?3:2) ) && ((i-16)%36<15) )?7:16))
|
||||||
|
# printf " C %03d " $i
|
||||||
|
# tput op
|
||||||
|
# (( ((i<16||i>231) && ((i+1)%8==0)) || ((i>16&&i<232)&& ((i-15)%6==0)) )) &&
|
||||||
|
# printf "\n" ''
|
||||||
|
# done
|
||||||
|
|
||||||
|
# ===========
|
||||||
|
|
||||||
|
# echo "tput character test"
|
||||||
|
# echo "==================="
|
||||||
|
# echo
|
||||||
|
|
||||||
|
# tput bold; echo "This text has the bold attribute."; tput sgr0
|
||||||
|
|
||||||
|
# tput smul; echo "This text is underlined (smul)."; tput rmul
|
||||||
|
|
||||||
|
# # Most terminal emulators do not support blinking text (though xterm
|
||||||
|
# # does) because blinking text is considered to be in bad taste ;-)
|
||||||
|
# tput blink; echo "This text is blinking (blink)."; tput sgr0
|
||||||
|
|
||||||
|
# tput rev; echo "This text has the reverse attribute"; tput sgr0
|
||||||
|
|
||||||
|
# # Standout mode is reverse on many terminals, bold on others.
|
||||||
|
# tput smso; echo "This text is in standout mode (smso)."; tput rmso
|
||||||
|
|
||||||
|
# tput sgr0
|
||||||
|
# echo
|
||||||
|
|
||||||
|
|
||||||
|
# experiments ==============================================================================
|
||||||
|
|
||||||
|
# function delay_spinner(){
|
||||||
|
# ##
|
||||||
|
# ## Usage:
|
||||||
|
# ##
|
||||||
|
# ## $ long-running-command &
|
||||||
|
# ## $ delay_spinner " Please wait msg..."
|
||||||
|
# ##
|
||||||
|
# ## Spinner exists when long-running-command completes
|
||||||
|
# ##
|
||||||
|
# local PROGRESSTXT
|
||||||
|
# if [ ! "$1" ]; then
|
||||||
|
# PROGRESSTXT=" Please wait..."
|
||||||
|
# else
|
||||||
|
# PROGRESSTXT="$1"
|
||||||
|
# fi
|
||||||
|
# # visual progress marker function
|
||||||
|
# # http://stackoverflow.com/users/2869509/wizurd
|
||||||
|
# # vars
|
||||||
|
# local pid=$!
|
||||||
|
# local delay=0.1
|
||||||
|
# local spinstr='|/-\'
|
||||||
|
# echo -e "\n\n"
|
||||||
|
# while [ "$(ps a | awk '{print $1}' | grep $pid)" ]; do
|
||||||
|
# local temp=${spinstr#?}
|
||||||
|
# printf "\r$PROGRESSTXT[%c] " "$spinstr"
|
||||||
|
# local spinstr=$temp${spinstr%"$temp"}
|
||||||
|
# sleep $delay
|
||||||
|
# printf "\b\b\b\b\b\b"
|
||||||
|
# done
|
||||||
|
# printf -- '\n\n'
|
||||||
|
# #
|
||||||
|
# # <-- end function ec2cli_spinner -->
|
||||||
|
# #
|
||||||
|
# }
|
||||||
|
# sleep 10 && echo 'test' &
|
||||||
|
# delay_spinner "Please wait msg..."
|
||||||
13
helpers/log.sh
Normal file
13
helpers/log.sh
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
########################################################
|
||||||
|
# Logging functions
|
||||||
|
########################################################
|
||||||
|
|
||||||
|
# write some message $1 in log file and stdout with timestamp
|
||||||
|
log_path="/home/$USER/logs"
|
||||||
|
log() {
|
||||||
|
[ ! -d "$log_path" ] && log_path="./log"
|
||||||
|
[ ! -d "$log_path" ] && mkdir -p "$log_path"
|
||||||
|
echo -e "[$(date '+%H:%M:%S')] $*" | tee -a "$log_path/$(date '+%Y%m%d').log"
|
||||||
|
}
|
||||||
29
helpers/misc.sh
Normal file
29
helpers/misc.sh
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
########################################################
|
||||||
|
# Misc
|
||||||
|
########################################################
|
||||||
|
|
||||||
|
# https://askubuntu.com/a/30414
|
||||||
|
is_full_screen() {
|
||||||
|
local WINDOW=$(xwininfo -id "$(xdotool getactivewindow)" -stats \
|
||||||
|
| grep -E '(Width|Height):' \
|
||||||
|
| awk '{print $NF}' \
|
||||||
|
| sed -e 's/ /x/')
|
||||||
|
local SCREEN=$(xdpyinfo | grep -m1 dimensions | awk '{print $2}')
|
||||||
|
if [ "$WINDOW" = "$SCREEN" ]; then
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
|
||||||
|
ytm() {
|
||||||
|
youtube-dl \
|
||||||
|
--extract-audio \
|
||||||
|
--audio-format flac \
|
||||||
|
--audio-quality 0 \
|
||||||
|
--format bestaudio \
|
||||||
|
--write-info-json \
|
||||||
|
--output "$HOME/Downloads/ytm/%(playlist_title)s/%(channel)s - %(title)s.%(ext)s" \
|
||||||
|
"$@"
|
||||||
|
}
|
||||||
51
helpers/net.sh
Normal file
51
helpers/net.sh
Normal file
@@ -0,0 +1,51 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
########################################################
|
||||||
|
# Networking functions
|
||||||
|
########################################################
|
||||||
|
|
||||||
|
get_current_ip() {
|
||||||
|
local CURRENT_IP
|
||||||
|
[ -f /etc/os-release ] && source /etc/os-release
|
||||||
|
case "$ID" in
|
||||||
|
debian|ubuntu) CURRENT_IP=$(hostname -I | awk '{print $1}') ;;
|
||||||
|
alpine) CURRENT_IP=$(ip -4 addr show eth0 | awk '/inet / {print $2}' | cut -d/ -f1 | head -n 1) ;;
|
||||||
|
*) CURRENT_IP="Unknown" ;;
|
||||||
|
esac
|
||||||
|
echo "$CURRENT_IP"
|
||||||
|
}
|
||||||
|
|
||||||
|
get_external_ip() {
|
||||||
|
local ip="$(curl -s https://api.myip.com | jq .ip)"
|
||||||
|
echo "$ip" | tr -d '"'
|
||||||
|
}
|
||||||
|
|
||||||
|
is_valid_ipv4() {
|
||||||
|
local ip="$1"
|
||||||
|
local regex="^([0-9]{1,3}\.){3}[0-9]{1,3}$"
|
||||||
|
|
||||||
|
if [[ $ip =~ $regex ]]; then
|
||||||
|
IFS='.' read -r -a parts <<< "$ip"
|
||||||
|
for part in "${parts[@]}"; do
|
||||||
|
if ! [[ $part =~ ^[0-9]+$ ]] || ((part < 0 || part > 255)); then
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
|
||||||
|
curltime() {
|
||||||
|
curl -w @- -o /dev/null -s "$@" <<'EOF'
|
||||||
|
time_namelookup: %{time_namelookup} sec\n
|
||||||
|
time_connect: %{time_connect} sec\n
|
||||||
|
time_appconnect: %{time_appconnect} sec\n
|
||||||
|
time_pretransfer: %{time_pretransfer} sec\n
|
||||||
|
time_redirect: %{time_redirect} sec\n
|
||||||
|
time_starttransfer: %{time_starttransfer} sec\n
|
||||||
|
---------------\n
|
||||||
|
time_total: %{time_total} sec\n
|
||||||
|
EOF
|
||||||
|
}
|
||||||
|
|
||||||
63
helpers/notif.sh
Normal file
63
helpers/notif.sh
Normal file
@@ -0,0 +1,63 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
########################################################
|
||||||
|
# Notifications
|
||||||
|
########################################################
|
||||||
|
|
||||||
|
TITLE="$0"
|
||||||
|
NTFY_CHANNEL="example"
|
||||||
|
|
||||||
|
# отправляет простую нотификацию
|
||||||
|
ntfy_info() {
|
||||||
|
require ntfy
|
||||||
|
ntfy send \
|
||||||
|
--title "$TITLE" \
|
||||||
|
--message "$1" \
|
||||||
|
--priority 1 \
|
||||||
|
"$NTFY_CHANNEL"
|
||||||
|
}
|
||||||
|
|
||||||
|
# отправляет нотификацию с предупреждением
|
||||||
|
ntfy_warn() {
|
||||||
|
require ntfy
|
||||||
|
ntfy send \
|
||||||
|
--title "$TITLE" \
|
||||||
|
--tags "warning" \
|
||||||
|
--message "$1" \
|
||||||
|
--priority 5 \
|
||||||
|
"$NTFY_CHANNEL"
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
notify () {
|
||||||
|
if ! installed "notify-send"; then
|
||||||
|
warning "Notifications toggled on, but 'notify-send' is not installed!"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
[ -n "$1" ] && local title="$1"
|
||||||
|
local text="$2"
|
||||||
|
local level="$3"
|
||||||
|
local icon="$4"
|
||||||
|
case "$level" in
|
||||||
|
critical) local timeout=0 ;;
|
||||||
|
low) local timeout=5000 ;;
|
||||||
|
*) local timeout=10000 ;;
|
||||||
|
esac
|
||||||
|
debug "$title / $text / $level / $icon / $timeout"
|
||||||
|
notify-send "$title" "$text" -a "$0" -u "$level" -i "$icon" -t $timeout
|
||||||
|
}
|
||||||
|
|
||||||
|
# TODO: docblock
|
||||||
|
notify_error() {
|
||||||
|
notify "Error" "$1" "critical" "dialog-error"
|
||||||
|
}
|
||||||
|
|
||||||
|
# TODO: docblock
|
||||||
|
notify_warning() {
|
||||||
|
notify "Warning" "$1" "normal" "dialog-warning"
|
||||||
|
}
|
||||||
|
|
||||||
|
# TODO: docblock
|
||||||
|
notify_info() {
|
||||||
|
notify "" "$1" "low" "dialog-information"
|
||||||
|
}
|
||||||
32
helpers/notifications.sh
Normal file
32
helpers/notifications.sh
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
source $( dirname $(readlink -e -- "${BASH_SOURCE}"))/packages.sh || exit 255
|
||||||
|
|
||||||
|
########################################################
|
||||||
|
# Desktop notifications
|
||||||
|
########################################################
|
||||||
|
|
||||||
|
notify () {
|
||||||
|
require "notify-send"
|
||||||
|
[ -n "$1" ] && local title="$1" || local title="My notification"
|
||||||
|
local text="$2"
|
||||||
|
local level="$3"
|
||||||
|
local icon="$4"
|
||||||
|
case $level in
|
||||||
|
"critical") local timeout=0 ;;
|
||||||
|
"low") local timeout=5000 ;;
|
||||||
|
*) local timeout=10000 ;;
|
||||||
|
esac
|
||||||
|
notify-send "$title" "$text" -a "MyScript" -u "$level" -i "$icon" -t $timeout
|
||||||
|
}
|
||||||
|
|
||||||
|
notify_error() {
|
||||||
|
notify "Error" "$1" "critical" "dialog-error"
|
||||||
|
}
|
||||||
|
|
||||||
|
notify_warning() {
|
||||||
|
notify "Warning" "$1" "normal" "dialog-warning"
|
||||||
|
}
|
||||||
|
|
||||||
|
notify_info() {
|
||||||
|
notify "" "$1" "low" "dialog-information"
|
||||||
|
}
|
||||||
72
helpers/packages.sh
Normal file
72
helpers/packages.sh
Normal file
@@ -0,0 +1,72 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
source $( dirname $(readlink -e -- "${BASH_SOURCE}"))/io.sh || exit 255
|
||||||
|
|
||||||
|
########################################################
|
||||||
|
# Functions to control system packages
|
||||||
|
########################################################
|
||||||
|
|
||||||
|
installed() {
|
||||||
|
command -v "$1" >/dev/null 2>&1
|
||||||
|
}
|
||||||
|
|
||||||
|
installed_pkg() {
|
||||||
|
dpkg --list | grep -qw "ii $1"
|
||||||
|
}
|
||||||
|
|
||||||
|
apt_ppa_add() {
|
||||||
|
sudo add-apt-repository -y $*
|
||||||
|
}
|
||||||
|
|
||||||
|
apt_ppa_remove() {
|
||||||
|
sudo add-apt-repository -ry $*
|
||||||
|
}
|
||||||
|
|
||||||
|
apt_update() {
|
||||||
|
sudo apt update $*
|
||||||
|
}
|
||||||
|
|
||||||
|
apt_install() {
|
||||||
|
sudo apt install -y $*
|
||||||
|
}
|
||||||
|
|
||||||
|
apt_remove() {
|
||||||
|
sudo apt purge -y $*
|
||||||
|
}
|
||||||
|
|
||||||
|
dpkg_install() {
|
||||||
|
sudo dpkg -i $*
|
||||||
|
}
|
||||||
|
|
||||||
|
dpkg_remove() {
|
||||||
|
sudo dpkg -r $*
|
||||||
|
}
|
||||||
|
|
||||||
|
dpkg_arch() {
|
||||||
|
dpkg --print-architecture
|
||||||
|
}
|
||||||
|
|
||||||
|
require() {
|
||||||
|
sw=()
|
||||||
|
for package in "$@"; do
|
||||||
|
if ! installed "$package" && ! installed_pkg "$package"; then
|
||||||
|
sw+=("$package")
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
if [ ${#sw[@]} -gt 0 ]; then
|
||||||
|
info "These packages will be installed in your system:\n${sw[*]}"
|
||||||
|
apt_install ${sw[*]}
|
||||||
|
[ $? -gt 0 ] && die "installation cancelled" 201
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
require_pkg() {
|
||||||
|
sw=()
|
||||||
|
for package in "$@"; do
|
||||||
|
if ! installed "$package" && ! installed_pkg "$package"; then
|
||||||
|
sw+=("$package")
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
if [ ${#sw[@]} -gt 0 ]; then
|
||||||
|
die "These packages must be installed in your system:\n${sw[*]}" 200
|
||||||
|
fi
|
||||||
|
}
|
||||||
89
helpers/testing.sh
Normal file
89
helpers/testing.sh
Normal file
@@ -0,0 +1,89 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
source $( dirname $(readlink -e -- "${BASH_SOURCE}"))/io.sh || exit 255
|
||||||
|
|
||||||
|
########################################################
|
||||||
|
# Testing functions
|
||||||
|
########################################################
|
||||||
|
|
||||||
|
# $1 - command to exec
|
||||||
|
assert_exec() {
|
||||||
|
[ "$1" ] || exit 1
|
||||||
|
local prefix="$(dt)${BOLD}${FWHITE}[TEST EXEC]"
|
||||||
|
if $($1 1>/dev/null 2>&1); then
|
||||||
|
local text="${BGREEN} PASSED"
|
||||||
|
else
|
||||||
|
local text="${BLRED} FAILED"
|
||||||
|
fi
|
||||||
|
print "${prefix} ${text} ${BRESET} ($?):${RESET} $1"
|
||||||
|
}
|
||||||
|
# usage:
|
||||||
|
|
||||||
|
# func1() {
|
||||||
|
# return 0
|
||||||
|
# }
|
||||||
|
# func2() {
|
||||||
|
# return 1
|
||||||
|
# }
|
||||||
|
# assert_exec "func1" # PASSED
|
||||||
|
# assert_exec "func2" # FAILED
|
||||||
|
# assert_exec "whoami" # PASSED
|
||||||
|
|
||||||
|
|
||||||
|
# $1 - command to exec
|
||||||
|
# $2 - expected output
|
||||||
|
assert_output() {
|
||||||
|
[ "$1" ] || exit 1
|
||||||
|
[ "$2" ] && local expected="$2" || local expected=''
|
||||||
|
local prefix="$(dt)${BOLD}${FWHITE}[TEST OUTP]"
|
||||||
|
local output=$($1 2>&1)
|
||||||
|
local code=$?
|
||||||
|
if [[ "$output" == *"$expected"* ]]; then
|
||||||
|
local text="${BGREEN} PASSED"
|
||||||
|
else
|
||||||
|
local text="${BLRED} FAILED"
|
||||||
|
fi
|
||||||
|
print "${prefix} ${text} ${BRESET} (${code}|${expected}):${RESET} $1"
|
||||||
|
# print "\tOutput > $output"
|
||||||
|
}
|
||||||
|
# usage:
|
||||||
|
|
||||||
|
# func1() {
|
||||||
|
# echo "some string"
|
||||||
|
# }
|
||||||
|
# func2() {
|
||||||
|
# echo "another string"
|
||||||
|
# }
|
||||||
|
# expect_output "func1" "string" # PASSED
|
||||||
|
# expect_output "func2" "some" # FAILED
|
||||||
|
# expect_output "func2" "string" # PASSED
|
||||||
|
|
||||||
|
|
||||||
|
# $1 - command to exec
|
||||||
|
# $2 - expected exit-code
|
||||||
|
assert_code() {
|
||||||
|
[ "$1" ] || exit 1
|
||||||
|
[ "$2" ] && local expected=$2 || local expected=0
|
||||||
|
local prefix="$(dt)${BOLD}${FWHITE}[TEST CODE]"
|
||||||
|
$($1 1>/dev/null 2>&1)
|
||||||
|
local code=$?
|
||||||
|
if [[ $code -eq $expected ]]; then
|
||||||
|
local text="${BGREEN} PASSED"
|
||||||
|
else
|
||||||
|
local text="${BLRED} FAILED"
|
||||||
|
fi
|
||||||
|
print "${prefix} ${text} ${BRESET} (${code}|${expected}):${RESET} $1"
|
||||||
|
}
|
||||||
|
# usage:
|
||||||
|
|
||||||
|
# func1() {
|
||||||
|
# # exit 0
|
||||||
|
# return 0
|
||||||
|
# }
|
||||||
|
# func2() {
|
||||||
|
# # exit 1
|
||||||
|
# return 1
|
||||||
|
# }
|
||||||
|
# expect_code "func1" 0 # PASSED
|
||||||
|
# expect_code "func1" 1 # FAILED
|
||||||
|
# expect_code "func2" 0 # FAILED
|
||||||
|
# expect_code "func2" 1 # PASSED
|
||||||
21
helpers/traps.sh
Normal file
21
helpers/traps.sh
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
#TODO source basic.sh
|
||||||
|
#TODO source args-parser/args.sh
|
||||||
|
|
||||||
|
########################################################
|
||||||
|
# Trap usage examples
|
||||||
|
########################################################
|
||||||
|
|
||||||
|
# for sig in SIGHUP SIGINT SIGQUIT SIGABRT SIGKILL SIGTERM SIGTSTP; do
|
||||||
|
# # shellcheck disable=SC2064
|
||||||
|
# trap "set +x && echo && echo && echo '*** Прервано сигналом $sig, остановка ***' && exit" $sig
|
||||||
|
# done
|
||||||
|
|
||||||
|
for sig in SIGHUP SIGINT SIGQUIT SIGABRT SIGKILL SIGTERM SIGTSTP; do
|
||||||
|
trap "myfunc" $sig
|
||||||
|
done
|
||||||
|
|
||||||
|
myfunc() {
|
||||||
|
echo "trapped!"
|
||||||
|
exit
|
||||||
|
}
|
||||||
@@ -1,12 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
##makedesc: Install apache2 (latest)
|
|
||||||
|
|
||||||
echo
|
|
||||||
echo "==============================================="
|
|
||||||
echo "Installing apache2..."
|
|
||||||
echo "==============================================="
|
|
||||||
echo
|
|
||||||
|
|
||||||
sudo apt install -y --autoremove apache2
|
|
||||||
sudo service apache2 restart
|
|
||||||
apache2 -v
|
|
||||||
11
install/apache2
Executable file
11
install/apache2
Executable file
@@ -0,0 +1,11 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
##makedesc: Install apache2 (latest)
|
||||||
|
source "$( dirname $(readlink -e -- "${BASH_SOURCE}"))/../helpers.sh" || exit 255
|
||||||
|
|
||||||
|
title
|
||||||
|
|
||||||
|
apt_install apache2
|
||||||
|
sudo systemctl restart apache2
|
||||||
|
|
||||||
|
success "apache2 installed!"
|
||||||
|
apache2 -v
|
||||||
108
install/apt
108
install/apt
@@ -1,60 +1,50 @@
|
|||||||
#!/bin/bash
|
#!/usr/bin/env bash
|
||||||
##makedesc: Install bunch of software from apt
|
##makedesc: Install software from apt
|
||||||
|
|
||||||
echo
|
sudo apt update && \
|
||||||
echo "==============================================="
|
sudo apt upgrade -y --autoremove && \
|
||||||
echo "Installing software from apt..."
|
sudo apt install -y \
|
||||||
echo "==============================================="
|
alien \
|
||||||
echo
|
apt-transport-https \
|
||||||
|
build-essential \
|
||||||
sudo apt update && sudo apt upgrade -y --autoremove
|
ca-certificates \
|
||||||
sudo apt install -y --autoremove \
|
cmake \
|
||||||
apt-transport-https \
|
curl \
|
||||||
ca-certificates \
|
dconf-editor \
|
||||||
curl \
|
default-jdk \
|
||||||
make \
|
dialog \
|
||||||
cmake \
|
gettext \
|
||||||
dialog \
|
gnupg \
|
||||||
build-essential \
|
gparted \
|
||||||
software-properties-common \
|
hardinfo \
|
||||||
libaio1 \
|
htop \
|
||||||
libssl-dev \
|
libaio1 \
|
||||||
libghc-zlib-dev \
|
libcurl4-gnutls-dev \
|
||||||
libcurl4-gnutls-dev \
|
libexpat1-dev \
|
||||||
libexpat1-dev \
|
libghc-zlib-dev \
|
||||||
gettext \
|
libssl-dev \
|
||||||
gnupg \
|
lsb-release \
|
||||||
ubuntu-restricted-extras \
|
make \
|
||||||
unzip \
|
mc \
|
||||||
mc \
|
meld \
|
||||||
htop \
|
nano \
|
||||||
nano \
|
neofetch \
|
||||||
neofetch \
|
net-tools \
|
||||||
default-jdk \
|
nmap \
|
||||||
terminator \
|
p7zip-full \
|
||||||
dconf-editor \
|
easyeffects \
|
||||||
alien \
|
software-properties-common \
|
||||||
meld \
|
terminator \
|
||||||
vlc \
|
ubuntu-restricted-extras \
|
||||||
gparted \
|
unzip \
|
||||||
hardinfo \
|
vlc \
|
||||||
libreoffice \
|
ffmpeg \
|
||||||
pulseeffects \
|
xclip \
|
||||||
lsp-plugins \
|
inotify-tools \
|
||||||
lsb-release \
|
notify-osd \
|
||||||
net-tools \
|
fonts-open-sans \
|
||||||
nmap \
|
libnotify-bin \
|
||||||
p7zip-full \
|
tree \
|
||||||
sqlitebrowser
|
earlyoom
|
||||||
# gnome-software \
|
# sqlitebrowser
|
||||||
# minder \
|
# etckeeper
|
||||||
# redshift \
|
|
||||||
# redshift-gtk \
|
|
||||||
# nodejs \
|
|
||||||
# compiz \
|
|
||||||
# compizconfig-settings-manager \
|
|
||||||
# earlyoom \
|
|
||||||
# etckeeper \
|
|
||||||
# deepin-screenshot \
|
|
||||||
# geoclue-2.0 \
|
|
||||||
# at
|
|
||||||
|
|||||||
13
install/canon-mg2500
Executable file
13
install/canon-mg2500
Executable file
@@ -0,0 +1,13 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
##makedesc: Install Canon Pixma MG2500 + ppa
|
||||||
|
source "$( dirname $(readlink -e -- "${BASH_SOURCE}"))/../helpers.sh" || exit 255
|
||||||
|
|
||||||
|
title
|
||||||
|
|
||||||
|
apt_ppa_add ppa:thierry-f/fork-michael-gruz
|
||||||
|
|
||||||
|
apt_install cnijfilter-mg2500series
|
||||||
|
apt_install scangearmp-mg2500series
|
||||||
|
|
||||||
|
success "Drivers for Canon Pixma MG2500 installed!"
|
||||||
|
info "Now you must reboot PC and connect your printer."
|
||||||
@@ -1,15 +1,17 @@
|
|||||||
#!/bin/bash
|
#!/usr/bin/env bash
|
||||||
##makedesc: Install google chrome (latest)
|
##makedesc: Install google chrome (latest)
|
||||||
|
source "$( dirname $(readlink -e -- "${BASH_SOURCE}"))/../helpers.sh" || exit 255
|
||||||
echo
|
|
||||||
echo "==============================================="
|
|
||||||
echo "Installing google chrome (latest)..."
|
|
||||||
echo "==============================================="
|
|
||||||
echo
|
|
||||||
|
|
||||||
# https://t.me/axenov_blog/251
|
# https://t.me/axenov_blog/251
|
||||||
|
|
||||||
# sudo snap install chromium
|
title
|
||||||
wget "https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb" -O /tmp/google-chrome-stable_current_amd64.deb
|
|
||||||
sudo dpkg -i /tmp/google-chrome-stable_current_amd64.deb
|
mkdir -p "$HOME/install/deb"
|
||||||
rm /tmp/google-chrome-stable_current_amd64.deb
|
|
||||||
|
download "https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb" \
|
||||||
|
"$HOME/install/deb/google-chrome.deb"
|
||||||
|
|
||||||
|
dpkg_install "$HOME/install/deb/google-chrome.deb"
|
||||||
|
|
||||||
|
success "Google Chrome installed!"
|
||||||
|
google-chrome --version
|
||||||
|
|||||||
6
install/clamav
Executable file
6
install/clamav
Executable file
@@ -0,0 +1,6 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
##makedesc: ClamAV (WIP)
|
||||||
|
|
||||||
|
sudo apt install clamav -y && \
|
||||||
|
echo "DatabaseMirror packages.microsoft.com/clamav" | sudo tee -a /etc/clamav/freshclam.conf && \
|
||||||
|
sudo freshclam
|
||||||
@@ -1,56 +1,38 @@
|
|||||||
#!/bin/bash
|
#!/usr/bin/env bash
|
||||||
##makedesc: Install composer (latest)
|
##makedesc: Install composer (latest)
|
||||||
|
here=$( dirname $(readlink -e -- "${BASH_SOURCE}"))
|
||||||
|
source "$here/../helpers.sh" || exit 255
|
||||||
|
|
||||||
echo
|
# https://getcomposer.org/doc/faqs/how-to-install-composer-programmatically.md
|
||||||
echo "==============================================="
|
|
||||||
echo "Installing composer (latest)..."
|
|
||||||
echo "==============================================="
|
|
||||||
echo
|
|
||||||
|
|
||||||
installed() {
|
title
|
||||||
command -v "$1" >/dev/null 2>&1
|
|
||||||
}
|
|
||||||
|
|
||||||
if installed "php"; then
|
require php
|
||||||
if installed "composer"; then
|
|
||||||
echo "WARNING: You already have composer installed - removing to install actual version"
|
if installed composer; then
|
||||||
sudo apt remove -y --autoremove composer
|
warn "WARNING: Removing current composer to install latest one"
|
||||||
sudo rm -f /bin/composer
|
composer --version
|
||||||
sudo rm -f /usr/bin/composer
|
__AAA_NO_TITLE=1 source $here/../uninstall/composer
|
||||||
sudo rm -f /usr/local/bin/composer
|
|
||||||
sudo rm -rf /usr/src/composer
|
|
||||||
fi
|
|
||||||
sudo mkdir -m 0777 -p /usr/src/composer
|
|
||||||
cd /usr/src/composer
|
|
||||||
# https://getcomposer.org/doc/faqs/how-to-install-composer-programmatically.md
|
|
||||||
EXPECTED_CHECKSUM="$(php -r 'copy("https://composer.github.io/installer.sig", "php://stdout");')"
|
|
||||||
sudo php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
|
|
||||||
ACTUAL_CHECKSUM="$(php -r "echo hash_file('sha384', 'composer-setup.php');")"
|
|
||||||
if [ "$EXPECTED_CHECKSUM" != "$ACTUAL_CHECKSUM" ]; then
|
|
||||||
>&2 echo 'ERROR: Invalid installer checksum'
|
|
||||||
rm composer-setup.php
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
php composer-setup.php --quiet
|
|
||||||
sudo cp /usr/src/composer/composer.phar /usr/local/bin/composer
|
|
||||||
cd - >/dev/null
|
|
||||||
sudo rm -rf /usr/src/composer/
|
|
||||||
installed "composer" && composer --version
|
|
||||||
else
|
|
||||||
echo "WARNING: You need to have php installed"
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# title "Installing composer.phar in home dir..."
|
mkdir -p "$HOME/install/other" "$HOME/.local/bin"
|
||||||
# cd ~
|
|
||||||
# EXPECTED_SIGNATURE="$(wget -q -O - https://composer.github.io/installer.sig)"
|
download "https://getcomposer.org/installer" \
|
||||||
# php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
|
"$HOME/install/other/composer-setup.php"
|
||||||
# ACTUAL_SIGNATURE="$(php -r "echo hash_file('sha384', 'composer-setup.php');")"
|
|
||||||
# if [ "$EXPECTED_SIGNATURE" != "$ACTUAL_SIGNATURE" ]
|
php "$HOME/install/other/composer-setup.php" \
|
||||||
# then
|
--install-dir="$HOME/.local/bin/" \
|
||||||
# >&2 echo 'ERROR: Invalid installer signature'
|
--filename="composer"
|
||||||
# rm composer-setup.php
|
|
||||||
# exit 1
|
COMPOSER_GLOBAL_HOME="$($HOME/.local/bin/composer config -g home)"
|
||||||
# fi
|
NEWPATH="PATH=\"$COMPOSER_GLOBAL_HOME/vendor/bin:\${PATH}\""
|
||||||
# php composer-setup.php --quiet
|
cat "$HOME/.profile" | grep -qoh "$NEWPATH" || {
|
||||||
# RESULT=$?
|
export "$NEWPATH"
|
||||||
# rm composer-setup.php
|
echo "export $NEWPATH" >> "$HOME/.profile"
|
||||||
|
}
|
||||||
|
|
||||||
|
source "$HOME/.profile"
|
||||||
|
|
||||||
|
success "composer installed!"
|
||||||
|
composer --version
|
||||||
|
|
||||||
|
|||||||
@@ -1,34 +1,39 @@
|
|||||||
#!/bin/bash
|
#!/usr/bin/env bash
|
||||||
##makedesc: Install docker (latest) + docker-compose (latest) + ppa
|
##makedesc: Install docker (latest) + ppa
|
||||||
|
source "$( dirname $(readlink -e -- "${BASH_SOURCE}"))/../helpers.sh" || exit 255
|
||||||
echo
|
|
||||||
echo "==============================================="
|
|
||||||
echo "Installing docker (latest)..."
|
|
||||||
echo "==============================================="
|
|
||||||
echo
|
|
||||||
|
|
||||||
# https://docs.docker.com/engine/install/ubuntu/
|
# https://docs.docker.com/engine/install/ubuntu/
|
||||||
|
# https://docs.docker.com/engine/install/linux-postinstall/#manage-docker-as-a-non-root-user
|
||||||
|
|
||||||
sudo apt remove -y docker docker-engine docker.io containerd runc
|
title
|
||||||
sudo apt-get install \
|
|
||||||
ca-certificates \
|
for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do
|
||||||
curl \
|
apt_remove $pkg
|
||||||
gnupg \
|
done
|
||||||
lsb-release
|
|
||||||
sudo mkdir -p /etc/apt/keyrings
|
require ca-certificates lsb-release
|
||||||
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
|
source /etc/os-release
|
||||||
echo \
|
|
||||||
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
|
key="/etc/apt/keyrings/docker.asc"
|
||||||
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
|
|
||||||
sudo chmod a+r /etc/apt/keyrings/docker.gpg
|
sudo install -m 0755 -d /etc/apt/keyrings
|
||||||
sudo apt update
|
sudo cdownload https://download.docker.com/linux/ubuntu/gpg $key
|
||||||
sudo apt install -y --autoremove \
|
sudo chmod a+r $key
|
||||||
docker-ce \
|
|
||||||
docker-ce-cli \
|
echo "deb [arch=$(dpkg_arch) signed-by=$key] https://download.docker.com/linux/ubuntu $VERSION_CODENAME stable" \
|
||||||
containerd.io \
|
| sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
|
||||||
docker-compose-plugin \
|
|
||||||
docker-compose
|
apt_update
|
||||||
sudo usermod -aG docker anthony
|
apt_install \
|
||||||
echo
|
docker-ce \
|
||||||
echo "You need to logout and log in again to apply docker group"
|
docker-ce-cli \
|
||||||
echo
|
containerd.io \
|
||||||
|
docker-buildx-plugin \
|
||||||
|
docker-compose-plugin
|
||||||
|
|
||||||
|
sudo usermod -aG docker $(whoami)
|
||||||
|
newgrp docker
|
||||||
|
|
||||||
|
success "Docker installed!"
|
||||||
|
docker --version
|
||||||
|
info "Probably, you need to relogin to apply 'docker' group permanently."
|
||||||
|
|||||||
22
install/dots
Executable file
22
install/dots
Executable file
@@ -0,0 +1,22 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
##makedesc: Install dotfiles
|
||||||
|
source "$( dirname $(readlink -e -- "${BASH_SOURCE}"))/../helpers.sh" || exit 255
|
||||||
|
|
||||||
|
title
|
||||||
|
|
||||||
|
install_dir="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )"
|
||||||
|
dotfiles_src_dir="`dirname $install_dir`/dotfiles"
|
||||||
|
postfix=".bak-`date '+%Y%m%d%H%M'`"
|
||||||
|
|
||||||
|
install_dotfile() {
|
||||||
|
mv "$HOME/$1" "$HOME/$1$postfix"
|
||||||
|
cp "$dotfiles_src_dir/$1" "$HOME/$1"
|
||||||
|
success "- $1"
|
||||||
|
}
|
||||||
|
|
||||||
|
install_dotfile ".bash_aliases" && \
|
||||||
|
install_dotfile ".profile" && \
|
||||||
|
install_dotfile ".bashrc" && \
|
||||||
|
install_dotfile ".gitconfig" && \
|
||||||
|
install_dotfile ".gitignore" && \
|
||||||
|
install_dotfile ".git_aliases"
|
||||||
@@ -1,20 +1,21 @@
|
|||||||
#!/bin/bash
|
#!/usr/bin/env bash
|
||||||
##makedesc: Install droidcam v1.8.2
|
##makedesc: Install droidcam v1.9.0
|
||||||
|
source "$( dirname $(readlink -e -- "${BASH_SOURCE}"))/../helpers.sh" || exit 255
|
||||||
|
|
||||||
# https://www.dev47apps.com/droidcam/linux/
|
#TODO
|
||||||
|
exit
|
||||||
|
|
||||||
echo
|
# https://droidcam.app/linux/
|
||||||
echo "==============================================="
|
|
||||||
echo "Installing droidcam v1.8.2..."
|
|
||||||
echo "==============================================="
|
|
||||||
echo
|
|
||||||
|
|
||||||
mkdir -p ~/install/droidcam
|
title
|
||||||
wget -O /tmp/droidcam.zip https://files.dev47apps.net/linux/droidcam_1.8.2.zip
|
|
||||||
unzip -o /tmp/droidcam.zip -d ~/install/droidcam
|
|
||||||
rm -rf /tmp/droidcam.zip
|
|
||||||
cd ~/install/droidcam && sudo ./install-client
|
|
||||||
|
|
||||||
echo
|
mkdir -p "$HOME/install/deb/"
|
||||||
echo "Don't forget to install android app: https://play.google.com/store/apps/developer?id=Dev47Apps"
|
|
||||||
echo
|
download "https://beta.droidcam.app/go/droidCam.client.setup.deb" "$HOME/install/deb/droidcam_client_amd64.deb"
|
||||||
|
|
||||||
|
dpkg_install "$HOME/install/deb/droidcam_client_amd64.deb"
|
||||||
|
apt_install v4l2loopback-dkms
|
||||||
|
|
||||||
|
success "droidcam installed!"
|
||||||
|
info "Don't forget to install the android app:"
|
||||||
|
info "https://play.google.com/store/apps/developer?id=Dev47Apps"
|
||||||
|
|||||||
@@ -1,9 +1,21 @@
|
|||||||
#!/bin/bash
|
#!/usr/bin/env bash
|
||||||
##makedesc: Install droidcam-obs plugin v1.5.1
|
##makedesc: Install droidcam-obs plugin v1.5.1
|
||||||
|
|
||||||
|
#TODO
|
||||||
|
# ffmpeg -version | head -n 1 | awk '{print $3}'
|
||||||
|
# https://github.com/dev47apps/droidcam-obs-plugin/releases
|
||||||
|
|
||||||
|
exit
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# https://www.dev47apps.com/droidcam/linux/
|
# https://www.dev47apps.com/droidcam/linux/
|
||||||
# https://www.dev47apps.com/obs/
|
# https://www.dev47apps.com/obs/
|
||||||
# https://www.dev47apps.com/obs/usage.html
|
# https://www.dev47apps.com/obs/usage.html
|
||||||
|
# https://obsproject.com/forum/threads/how-to-start-virtual-camera-without-sudo-privileges.139783/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
echo
|
echo
|
||||||
echo "==============================================="
|
echo "==============================================="
|
||||||
@@ -11,16 +23,21 @@ echo "Installing droidcam-obs..."
|
|||||||
echo "==============================================="
|
echo "==============================================="
|
||||||
echo
|
echo
|
||||||
|
|
||||||
command -v "obs" >/dev/null 2>&1 || echo 'You need to install obs first!'
|
# command -v "obs" >/dev/null 2>&1 || echo 'You need to install obs first!'
|
||||||
|
command -v "obs-studio" >/dev/null 2>&1 || echo 'You need to install obs-studio first!'
|
||||||
|
|
||||||
mkdir -p ~/install/droidcam_obs
|
mkdir -p $HOMEinstall/droidcam-obs
|
||||||
wget -O /tmp/droidcam-obs.zip https://files.dev47apps.net/obs/droidcam_obs_1.5.1_linux.zip
|
wget -O /tmp/droidcam-obs.zip https://files.dev47apps.net/obs/droidcam_obs_1.5.1_linux.zip
|
||||||
unzip -o /tmp/droidcam-obs.zip -d ~/install/droidcam-obs
|
unzip -oq /tmp/droidcam-obs.zip -d $HOMEinstall/droidcam-obs
|
||||||
rm -rf /tmp/droidcam-obs.zip
|
rm -rf /tmp/droidcam-obs.zip
|
||||||
cd ~/install/droidcam-obs && ./install.sh
|
cd $HOMEinstall/droidcam-obs && ./install.sh
|
||||||
|
sudo modprobe v4l2loopback video_nr=2 card_label="OBS Virtual Camera"
|
||||||
|
|
||||||
echo
|
echo
|
||||||
|
echo "Finish!"
|
||||||
echo "Don't forget to:"
|
echo "Don't forget to:"
|
||||||
echo "1) restart OBS if it is running right now"
|
echo "1) restart OBS if it is running right now OR install (if not) and start it"
|
||||||
echo "2) install android app: https://play.google.com/store/apps/developer?id=Dev47Apps"
|
echo "2) install android app: https://play.google.com/store/apps/developer?id=Dev47Apps"
|
||||||
|
echo "3) if virtual camera not starting then execute:"
|
||||||
|
echo -e "\tsudo modprobe v4l2loopback video_nr=2 card_label=\"OBS Virtual Camera\""
|
||||||
echo
|
echo
|
||||||
|
|||||||
54
install/flameshot
Executable file
54
install/flameshot
Executable file
@@ -0,0 +1,54 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
##makedesc: Install flameshot (latest)
|
||||||
|
source "$( dirname $(readlink -e -- "${BASH_SOURCE}"))/../helpers.sh" || exit 255
|
||||||
|
|
||||||
|
title
|
||||||
|
|
||||||
|
# https://github.com/flameshot-org/flameshot?tab=readme-ov-file#compilation
|
||||||
|
# sudo apt install -y --autoremove flameshot && \
|
||||||
|
# sudo systemctl restart flameshot
|
||||||
|
|
||||||
|
dir="$HOME/install"
|
||||||
|
clone_dir="$dir/flameshot"
|
||||||
|
mkdir -p "$dir"
|
||||||
|
|
||||||
|
sudo apt install -y \
|
||||||
|
g++ \
|
||||||
|
cmake \
|
||||||
|
build-essential \
|
||||||
|
qtbase5-dev \
|
||||||
|
qttools5-dev-tools \
|
||||||
|
libqt5svg5-dev \
|
||||||
|
qttools5-dev \
|
||||||
|
libqt5dbus5 \
|
||||||
|
libqt5network5 \
|
||||||
|
libqt5core5a \
|
||||||
|
libqt5widgets5 \
|
||||||
|
libqt5gui5 \
|
||||||
|
libqt5svg5
|
||||||
|
|
||||||
|
if [ ! -d "$clone_dir" ]; then
|
||||||
|
git clone --depth=1 --single-branch https://github.com/flameshot-org/flameshot.git "$clone_dir"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Directory where build files will be placed, may be relative
|
||||||
|
export BUILD_DIR=build
|
||||||
|
|
||||||
|
# Directory prefix where flameshot will be installed. If you are just building and don't want to
|
||||||
|
# install, comment this environment variable.
|
||||||
|
# This excludes the bin/flameshot part of the install,
|
||||||
|
# e.g. in /opt/flameshot/bin/flameshot, the CMAKE_INSTALL_PREFIX is /opt/flameshot
|
||||||
|
# This must be an absolute path. Requires CMAKE 3.29.
|
||||||
|
export CMAKE_INSTALL_PREFIX=/opt/flameshot
|
||||||
|
|
||||||
|
cd "$clone_dir" && \
|
||||||
|
git pull && \
|
||||||
|
cmake -S . -B "$BUILD_DIR" && \
|
||||||
|
cmake --build "$BUILD_DIR"
|
||||||
|
|
||||||
|
[ $? = 0 ] && {
|
||||||
|
echo
|
||||||
|
success "flameshot installed!"
|
||||||
|
# /opt/flameshot/flameshot -v
|
||||||
|
echo
|
||||||
|
}
|
||||||
53
install/frkn
Executable file
53
install/frkn
Executable file
@@ -0,0 +1,53 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
##makedesc: Install Wireguard + FRKN (deprecated)
|
||||||
|
source "$( dirname $(readlink -e -- "${BASH_SOURCE}"))/../helpers.sh" || exit 255
|
||||||
|
|
||||||
|
# https://frkn.org/ru/installation
|
||||||
|
|
||||||
|
title
|
||||||
|
|
||||||
|
mkdir -p "$HOME/install/frkn"
|
||||||
|
cd "$HOME/install/frkn"
|
||||||
|
|
||||||
|
apt_install wireguard jq
|
||||||
|
|
||||||
|
countries=(jp nl tr at ru se)
|
||||||
|
for idx in ${!countries[@]}; do
|
||||||
|
country=${countries[idx]}
|
||||||
|
info "Downloading config for $country ($(expr $idx + 1)/${#countries[@]})"
|
||||||
|
|
||||||
|
json=$(curl -s "https://api.frkn.org/peer?location=$country" | jq)
|
||||||
|
|
||||||
|
iface_address=$(echo $json | jq -r .iface.address)
|
||||||
|
iface_privkey=$(echo $json | jq -r .iface.key)
|
||||||
|
iface_dns=$(echo $json | jq -r .iface.dns)
|
||||||
|
peer_pubkey=$(echo $json | jq -r .peer.pubkey)
|
||||||
|
peer_psk=$(echo $json | jq -r .peer.psk)
|
||||||
|
peer_allowed_ips=$(echo $json | jq -r .peer.allowed_ips)
|
||||||
|
peer_endpoint=$(echo $json | jq -r .peer.endpoint)
|
||||||
|
|
||||||
|
cat << EOF > "frkn-$country.conf"
|
||||||
|
[Interface]
|
||||||
|
Address = $iface_address
|
||||||
|
DNS = $iface_dns
|
||||||
|
PrivateKey = $iface_privkey
|
||||||
|
|
||||||
|
[Peer]
|
||||||
|
PublicKey = $peer_pubkey
|
||||||
|
PresharedKey = $peer_psk
|
||||||
|
AllowedIPs = $peer_allowed_ips
|
||||||
|
Endpoint = $peer_endpoint
|
||||||
|
PersistentKeepalive = 25
|
||||||
|
EOF
|
||||||
|
|
||||||
|
done
|
||||||
|
|
||||||
|
sudo cp frkn-*.conf /etc/wireguard/
|
||||||
|
|
||||||
|
[ $? = 0 ] && {
|
||||||
|
echo
|
||||||
|
success "Wireguard + FRKN installed!"
|
||||||
|
wg --version
|
||||||
|
info "Use 'wg-quick (up|down) frkn-($(implode '|' ${countries[@]}))' to control connections"
|
||||||
|
info "Use 'sudo wg show' to see connection status"
|
||||||
|
}
|
||||||
60
install/git
60
install/git
@@ -1,38 +1,38 @@
|
|||||||
#!/bin/bash
|
#!/usr/bin/env bash
|
||||||
##makedesc: Install git (latest)
|
##makedesc: Install git (latest)
|
||||||
|
source "$( dirname $(readlink -e -- "${BASH_SOURCE}"))/../helpers.sh" || exit 255
|
||||||
|
|
||||||
echo
|
title
|
||||||
echo "==============================================="
|
|
||||||
echo "Installing git (latest)..."
|
|
||||||
echo "==============================================="
|
|
||||||
echo
|
|
||||||
|
|
||||||
installed() {
|
require make
|
||||||
command -v "$1" >/dev/null 2>&1
|
|
||||||
}
|
|
||||||
ENVDIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )"
|
|
||||||
|
|
||||||
! installed make && sudo apt install -y make
|
|
||||||
|
|
||||||
if installed git; then
|
if installed git; then
|
||||||
sudo rm -rf /usr/src/git
|
if [ -d "$HOME/install/git" ]; then
|
||||||
sudo git clone https://github.com/git/git.git --depth=1 /usr/src/git
|
cd "$HOME/install/git" && \
|
||||||
sudo chown -R $USER: /usr/src/git
|
git pull
|
||||||
cd /usr/src/git/
|
else
|
||||||
sudo make prefix=/usr/local all
|
clone "https://github.com/git/git.git" "$HOME/install/git" --depth=1 --single-branch && \
|
||||||
sudo make prefix=/usr/local install
|
cd "$HOME/install/git"
|
||||||
|
fi
|
||||||
|
sudo make prefix=/usr/local all && \
|
||||||
|
sudo make prefix=/usr/local install
|
||||||
else
|
else
|
||||||
! installed wget && sudo apt install -y wget
|
require wget
|
||||||
wget https://github.com/git/git/archive/master.zip -O /tmp/git.zip
|
mkdir -p "$HOME/install/git"
|
||||||
sudo unzip -q /tmp/git.zip -d /usr/src/git
|
download "https://github.com/git/git/archive/master.zip" "/tmp/git.zip" && \
|
||||||
rm /tmp/git.zip
|
unzip -oq "/tmp/git.zip" -d "$HOME/install/git" && \
|
||||||
cd /usr/src/git/git-master
|
rm /tmp/git.zip && \
|
||||||
sudo make prefix=/usr/local all
|
cd "$HOME/install/git/git-master" && \
|
||||||
sudo make prefix=/usr/local install
|
sudo make prefix=/usr/local all && \
|
||||||
cd /usr/src
|
sudo make prefix=/usr/local install && \
|
||||||
sudo rm -rf git
|
cd - && \
|
||||||
sudo git clone https://github.com/git/git.git --depth=1 /usr/src/git
|
rm -rf git && \
|
||||||
sudo chown -R $USER: /usr/src/git
|
clone "https://github.com/git/git.git" "$HOME/install/git" --depth=1 --single-branch
|
||||||
fi
|
fi
|
||||||
|
|
||||||
git --version
|
[ $? = 0 ] && {
|
||||||
|
echo
|
||||||
|
success "git installed!"
|
||||||
|
git --version
|
||||||
|
echo
|
||||||
|
}
|
||||||
|
|||||||
@@ -1,27 +1,28 @@
|
|||||||
#!/bin/bash
|
#!/usr/bin/env bash
|
||||||
##makedesc: Install golang v1.18.3
|
##makedesc: Install golang v1.21.0
|
||||||
|
source "$( dirname $(readlink -e -- "${BASH_SOURCE}"))/../helpers.sh" || exit 255
|
||||||
|
|
||||||
# https://go.dev/dl/
|
# https://go.dev/dl/
|
||||||
# https://golang.org/doc/install
|
# https://golang.org/doc/install
|
||||||
# https://www.vultr.com/docs/install-the-latest-version-of-golang-on-ubuntu
|
# https://www.vultr.com/docs/install-the-latest-version-of-golang-on-ubuntu
|
||||||
|
|
||||||
|
[ $1 ] && VERSION="$1" || VERSION="1.23.0"
|
||||||
|
title "Installing golang v$VERSION..."
|
||||||
|
|
||||||
[ $1 ] && VERSION="$1" || VERSION="1.18.3"
|
|
||||||
FILE="go$VERSION.linux-amd64.tar.gz"
|
FILE="go$VERSION.linux-amd64.tar.gz"
|
||||||
|
|
||||||
echo
|
|
||||||
echo "==============================================="
|
|
||||||
echo "Installing golang v$VERSION..."
|
|
||||||
echo "==============================================="
|
|
||||||
echo
|
|
||||||
|
|
||||||
sudo rm -rf /usr/local/go && \
|
sudo rm -rf /usr/local/go && \
|
||||||
wget "https://golang.org/dl/$FILE" -O /tmp/$FILE && \
|
download "https://golang.org/dl/$FILE" "/tmp/$FILE" && \
|
||||||
sudo tar -xzf /tmp/$FILE -C /usr/local && \
|
sudo tar -xzf "/tmp/$FILE" -C /usr/local && \
|
||||||
rm -rf /tmp/$FILE && \
|
rm -rf "/tmp/$FILE" && \
|
||||||
sudo chown $USER: -R /usr/local/go && \
|
sudo chown $USER: -R /usr/local/go && \
|
||||||
echo 'export PATH="$PATH:/usr/local/go/bin\"' >> $HOME/.profile && \
|
echo 'export PATH="/usr/local/go/bin:$PATH"' >> "$HOME/.profile" && \
|
||||||
echo 'export GOPATH="$HOME/.go"' >> $HOME/.profile && \
|
echo "export GOPATH=\"\$HOME/.go\"" >> "$HOME/.profile" && \
|
||||||
# source ~/.profile && \
|
source ~/.profile
|
||||||
go version && \
|
|
||||||
echo "NOTE: now run 'source ~/.profile' to apply new env vars"
|
[ $? = 0 ] && {
|
||||||
|
echo
|
||||||
|
success "golang installed!"
|
||||||
|
info "NOTE: now run 'source ~/.profile' to apply new env vars"
|
||||||
|
go version
|
||||||
|
echo
|
||||||
|
}
|
||||||
|
|||||||
15
install/grub-customizer
Executable file
15
install/grub-customizer
Executable file
@@ -0,0 +1,15 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
##makedesc: Install grub-customizer (latest + ppa)
|
||||||
|
source "$( dirname $(readlink -e -- "${BASH_SOURCE}"))/../helpers.sh" || exit 255
|
||||||
|
|
||||||
|
title
|
||||||
|
|
||||||
|
sudo add-apt-repository -y ppa:danielrichter2007/grub-customizer && \
|
||||||
|
sudo apt install -y --autoremove grub-customizer
|
||||||
|
|
||||||
|
[ $? = 0 ] && {
|
||||||
|
echo
|
||||||
|
success "grub-customizer installed!"
|
||||||
|
grub-customizer -v
|
||||||
|
echo
|
||||||
|
}
|
||||||
@@ -1,11 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
##makedesc: Install grub-customizer (latest) + ppa
|
|
||||||
|
|
||||||
echo
|
|
||||||
echo "==============================================="
|
|
||||||
echo "Installing grub-customizer (latest)..."
|
|
||||||
echo "==============================================="
|
|
||||||
echo
|
|
||||||
|
|
||||||
sudo add-apt-repository ppa:danielrichter2007/grub-customizer
|
|
||||||
sudo apt install -y --autoremove grub-customizer
|
|
||||||
20
install/jbmono
Executable file
20
install/jbmono
Executable file
@@ -0,0 +1,20 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
##makedesc: Install JetBrains Mono fonts
|
||||||
|
source "$( dirname $(readlink -e -- "${BASH_SOURCE}"))/../helpers.sh" || exit 255
|
||||||
|
|
||||||
|
# https://www.jetbrains.com/lp/mono/#how-to-install
|
||||||
|
|
||||||
|
title
|
||||||
|
|
||||||
|
require unzip
|
||||||
|
|
||||||
|
mkdir -p "$HOME/install/jbmono" "$HOME/.local/share/fonts/"
|
||||||
|
download "https://download.jetbrains.com/fonts/JetBrainsMono-2.304.zip" "$HOME/install/jbmono.zip" && \
|
||||||
|
unzip -oj "$HOME/install/jbmono.zip" "fonts/ttf/*.ttf" -d "$HOME/.local/share/fonts/" && \
|
||||||
|
fc-cache -vf "$HOME/.local/share/fonts/"
|
||||||
|
|
||||||
|
[ $? = 0 ] && {
|
||||||
|
echo
|
||||||
|
success "JetBrains Mono fonts installed!"
|
||||||
|
echo
|
||||||
|
}
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
#!/bin/bash (latest)
|
#!/usr/bin/env bash (latest)
|
||||||
##makedesc: Install KDE Window AppMenu Applet
|
##makedesc: Install KDE Window AppMenu Applet
|
||||||
|
|
||||||
echo
|
echo
|
||||||
@@ -29,7 +29,7 @@ if installed 'git'; then
|
|||||||
sudo git clone https://github.com/psifidotos/applet-window-appmenu.git --depth=1 /usr/src/appmenu-applet
|
sudo git clone https://github.com/psifidotos/applet-window-appmenu.git --depth=1 /usr/src/appmenu-applet
|
||||||
else
|
else
|
||||||
sudo wget https://github.com/psifidotos/applet-window-appmenu/archive/master.zip -O /tmp/appmenu-applet.zip
|
sudo wget https://github.com/psifidotos/applet-window-appmenu/archive/master.zip -O /tmp/appmenu-applet.zip
|
||||||
sudo unzip /tmp/appmenu-applet.zip -d /usr/src/appmenu-applet
|
sudo unzip -oq /tmp/appmenu-applet.zip -d /usr/src/appmenu-applet
|
||||||
sudo mv /usr/src/appmenu-applet/applet-window-appmenu-master/* /usr/src/appmenu-applet/
|
sudo mv /usr/src/appmenu-applet/applet-window-appmenu-master/* /usr/src/appmenu-applet/
|
||||||
sudo mv /usr/src/appmenu-applet/applet-window-appmenu-master/.* /usr/src/appmenu-applet/
|
sudo mv /usr/src/appmenu-applet/applet-window-appmenu-master/.* /usr/src/appmenu-applet/
|
||||||
sudo rm -rf /usr/src/appmenu-applet/applet-window-appmenu-master
|
sudo rm -rf /usr/src/appmenu-applet/applet-window-appmenu-master
|
||||||
|
|||||||
9
install/kde-backports
Executable file
9
install/kde-backports
Executable file
@@ -0,0 +1,9 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
##makedesc: Install KDE Backports
|
||||||
|
source "$( dirname $(readlink -e -- "${BASH_SOURCE}"))/../helpers.sh" || exit 255
|
||||||
|
|
||||||
|
title
|
||||||
|
|
||||||
|
sudo add-apt-repository -y ppa:kubuntu-ppa/backports && \
|
||||||
|
sudo apt update && \
|
||||||
|
sudo apt full-upgrade
|
||||||
118
install/kde-file-templates
Executable file
118
install/kde-file-templates
Executable file
@@ -0,0 +1,118 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
##makedesc: Install file templates (KDE)
|
||||||
|
|
||||||
|
echo
|
||||||
|
echo "==============================================="
|
||||||
|
echo "Installing file templates (KDE)..."
|
||||||
|
echo "==============================================="
|
||||||
|
echo
|
||||||
|
|
||||||
|
TPL_DIR="$HOME/.local/share/templates"
|
||||||
|
TPL_SRC="$TPL_DIR/.source"
|
||||||
|
[ ! -d "$TPL_SRC" ] && mkdir -p "$TPL_SRC"
|
||||||
|
|
||||||
|
echo "- Markdown" ####################################################
|
||||||
|
cat <<EOF > "$TPL_SRC/template.md"
|
||||||
|
# Title
|
||||||
|
|
||||||
|
|
||||||
|
EOF
|
||||||
|
|
||||||
|
cat << EOF > "$TPL_DIR/md.desktop"
|
||||||
|
[Desktop Entry]
|
||||||
|
Name=Документ Markdown
|
||||||
|
Icon=text-markdown
|
||||||
|
Type=Link
|
||||||
|
URL=.source/template.md
|
||||||
|
EOF
|
||||||
|
|
||||||
|
echo "- PHP" ####################################################
|
||||||
|
cat <<EOF > "$TPL_SRC/template.php"
|
||||||
|
<?php
|
||||||
|
declare(strict_types=1);
|
||||||
|
ini_set('error_reporting', E_ALL);
|
||||||
|
ini_set('display_errors', 1);
|
||||||
|
ini_set('display_startup_errors', 1);
|
||||||
|
ini_set('log_errors', 1);
|
||||||
|
|
||||||
|
|
||||||
|
EOF
|
||||||
|
|
||||||
|
cat << EOF > "$TPL_DIR/php.desktop"
|
||||||
|
[Desktop Entry]
|
||||||
|
Name=PHP-скрипт
|
||||||
|
Icon=application-x-php
|
||||||
|
Type=Link
|
||||||
|
URL=.source/template.php
|
||||||
|
EOF
|
||||||
|
|
||||||
|
echo "- Shell" ####################################################
|
||||||
|
cat <<EOF > "$TPL_SRC/template.sh"
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
EOF
|
||||||
|
|
||||||
|
cat << EOF > "$TPL_DIR/sh.desktop"
|
||||||
|
[Desktop Entry]
|
||||||
|
Name=Bash-скрипт
|
||||||
|
Icon=terminal
|
||||||
|
Type=Link
|
||||||
|
URL=.source/template.sh
|
||||||
|
EOF
|
||||||
|
|
||||||
|
echo "- Go" ####################################################
|
||||||
|
cat <<EOF > "$TPL_SRC/template.go"
|
||||||
|
package main
|
||||||
|
|
||||||
|
import "fmt"
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
fmt.Println("hello world")
|
||||||
|
}
|
||||||
|
EOF
|
||||||
|
|
||||||
|
cat << EOF > "$TPL_DIR/go.desktop"
|
||||||
|
[Desktop Entry]
|
||||||
|
Name=Golang файл
|
||||||
|
Type=Link
|
||||||
|
URL=.source/template.go
|
||||||
|
EOF
|
||||||
|
|
||||||
|
echo "- Dockerfile" ####################################################
|
||||||
|
cat <<EOF > "$TPL_SRC/Dockerfile"
|
||||||
|
# https://habr.com/ru/company/ruvds/blog/439980/
|
||||||
|
# https://docs.docker.com/develop/develop-images/dockerfile_best-practices/
|
||||||
|
FROM ubuntu:latest
|
||||||
|
|
||||||
|
|
||||||
|
EOF
|
||||||
|
|
||||||
|
cat << EOF > "$TPL_DIR/dockerfile.desktop"
|
||||||
|
[Desktop Entry]
|
||||||
|
Name=Dockerfile
|
||||||
|
Type=Link
|
||||||
|
URL=.source/Dockerfile.go
|
||||||
|
EOF
|
||||||
|
|
||||||
|
echo "- docker-compose" ####################################################
|
||||||
|
cat <<EOF > "$TPL_SRC/docker-compose.yml"
|
||||||
|
# https://docs.docker.com/compose/gettingstarted/
|
||||||
|
# https://docs.docker.com/compose/compose-file/compose-file-v3/
|
||||||
|
version: "3.9"
|
||||||
|
services:
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
EOF
|
||||||
|
|
||||||
|
cat << EOF > "$TPL_DIR/docker-compose.desktop"
|
||||||
|
[Desktop Entry]
|
||||||
|
Name=docker-compose
|
||||||
|
Type=Link
|
||||||
|
URL=.source/docker-compose.yml
|
||||||
|
EOF
|
||||||
|
|
||||||
|
echo
|
||||||
|
echo "Finish! You can find them here:"
|
||||||
|
echo -e "\t$TPL_DIR"
|
||||||
|
echo
|
||||||
|
|
||||||
19
install/kde-portal
Executable file
19
install/kde-portal
Executable file
@@ -0,0 +1,19 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
##makedesc: Install KDE portal
|
||||||
|
|
||||||
|
echo
|
||||||
|
echo "==============================================="
|
||||||
|
echo "Installing KDE portal..."
|
||||||
|
echo "==============================================="
|
||||||
|
echo
|
||||||
|
|
||||||
|
sudo apt install -y \
|
||||||
|
xdg-desktop-portal \
|
||||||
|
xdg-desktop-portal-kde \
|
||||||
|
xdg-desktop-portal-gtk && \
|
||||||
|
echo "GTK_USE_PORTAL=1" | sudo tee -a /etc/environment && \
|
||||||
|
echo "XDG_CURRENT_DESKTOP=KDE" | sudo tee -a /etc/environment
|
||||||
|
|
||||||
|
echo
|
||||||
|
echo "Finish! Now you need to relogin"
|
||||||
|
echo
|
||||||
11
install/libreoffice
Executable file
11
install/libreoffice
Executable file
@@ -0,0 +1,11 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
##makedesc: Install libreoffice
|
||||||
|
|
||||||
|
echo
|
||||||
|
echo "==============================================="
|
||||||
|
echo "Installing libreoffice..."
|
||||||
|
echo "==============================================="
|
||||||
|
echo
|
||||||
|
|
||||||
|
sudo apt update && \
|
||||||
|
sudo apt install -y --autoremove libreoffice
|
||||||
@@ -1,34 +1,55 @@
|
|||||||
#!/bin/bash
|
#!/usr/bin/env bash
|
||||||
##makedesc: Install lite-xl v2.0.5 (draft)
|
##makedesc: Install lite-xl v2.1.7
|
||||||
|
|
||||||
|
# https://github.com/lite-xl/lite-xl/releases
|
||||||
|
# https://lite-xl.com/setup/getting-started/
|
||||||
|
|
||||||
# DRAFT DRAFT DRAFT DRAFT DRAFT DRAFT DRAFT DRAFT
|
|
||||||
# DRAFT DRAFT DRAFT DRAFT DRAFT DRAFT DRAFT DRAFT
|
|
||||||
# DRAFT DRAFT DRAFT DRAFT DRAFT DRAFT DRAFT DRAFT
|
|
||||||
# DRAFT DRAFT DRAFT DRAFT DRAFT DRAFT DRAFT DRAFT
|
|
||||||
# DRAFT DRAFT DRAFT DRAFT DRAFT DRAFT DRAFT DRAFT
|
|
||||||
|
|
||||||
# https://github.com/lite-xl/lite-xl
|
|
||||||
|
|
||||||
[ $1 ] && LITEXLVER="$1" || LITEXLVER="2.0.5"
|
|
||||||
echo
|
echo
|
||||||
echo "==============================================="
|
echo "==============================================="
|
||||||
echo "Installing lite-xl v${LITEXLVER}..."
|
echo "Installing lite-xl v2.1.7..."
|
||||||
echo "==============================================="
|
echo "==============================================="
|
||||||
echo
|
echo
|
||||||
|
|
||||||
wget "https://github.com/lite-xl/lite-xl/releases/download/v${LITEXLVER}/lite-xl-linux-x86_64.tar.gz" -O /tmp/lite-xl.tar.gz
|
tar_url="https://github.com/lite-xl/lite-xl/releases/download/v2.1.7/lite-xl-v2.1.7-addons-linux-x86_64-portable.tar.gz"
|
||||||
sudo tar -xzf /tmp/lite-xl.tar.gz -C /tmp
|
lpm_url="https://github.com/lite-xl/lite-xl-plugin-manager/releases/download/latest/lpm.x86_64-linux"
|
||||||
mkdir -p $HOME/.local/bin && cp /tmp/lite-xl/bin/lite-xl $HOME/.local/bin
|
tar_filepath="$HOME/install/lite-xl-v2.1.7.tar.gz"
|
||||||
cp -r /tmp/lite-xl/share $HOME/.local
|
untar_dir="$HOME/install"
|
||||||
rm -rf /tmp/lite-xl*
|
|
||||||
echo -e 'export PATH="$PATH:$HOME/.local/bin"' >> $HOME/.bashrc
|
|
||||||
[ -f $HOME/.zshrc ] && echo -e 'export PATH="$PATH:$HOME/.local/bin"' >> $HOME/.zshrc
|
|
||||||
xdg-desktop-menu forceupdate
|
|
||||||
|
|
||||||
### uninstall
|
rm -rf \
|
||||||
# rm -f $HOME/.local/bin/lite-xl
|
"$HOME/.local/bin/lpm" \
|
||||||
# rm -rf $HOME/.local/share/icons/hicolor/scalable/apps/lite-xl.svg \
|
"$HOME/install/lite-xl" \
|
||||||
# $HOME/.local/share/applications/org.lite_xl.lite_xl.desktop \
|
"$HOME/.local/bin/lite-xl" \
|
||||||
# $HOME/.local/share/metainfo/org.lite_xl.lite_xl.appdata.xml \
|
"$HOME/.local/share/lite-xl"
|
||||||
# $HOME/.local/share/lite-xl
|
|
||||||
|
mkdir -vp \
|
||||||
|
"$untar_dir" \
|
||||||
|
"$HOME/.local/bin" \
|
||||||
|
"$HOME/.local/share/lite-xl"
|
||||||
|
|
||||||
|
wget "$tar_url" -O "$tar_filepath" && \
|
||||||
|
wget "$lpm_url" -O "$HOME/.local/bin/lpm" && \
|
||||||
|
chmod +x "$HOME/.local/bin/lpm" && \
|
||||||
|
tar -xzf "$tar_filepath" -C "$untar_dir" && \
|
||||||
|
cp -vf "$untar_dir/lite-xl/lite-xl" "$HOME/.local/bin/" && \
|
||||||
|
cp -vfr "$untar_dir"/lite-xl/data/* "$HOME/.local/share/lite-xl/"
|
||||||
|
|
||||||
|
# echo -e "\nexport LITE_SCALE=1 # https://github.com/lite-xl/lite-xl/issues/1173\n" >> $HOME/.profile
|
||||||
|
cat << EOF > "$HOME/.local/share/applications/org.lite_xl.lite_xl.desktop"
|
||||||
|
[Desktop Entry]
|
||||||
|
Type=Application
|
||||||
|
Name=Lite XL
|
||||||
|
Comment=A lightweight text editor written in Lua
|
||||||
|
Exec=$HOME/.local/bin/lite-xl %F
|
||||||
|
Icon=lite-xl
|
||||||
|
Terminal=false
|
||||||
|
StartupWMClass=lite-xl
|
||||||
|
Categories=Development;IDE;
|
||||||
|
MimeType=text/plain;
|
||||||
|
EOF
|
||||||
|
|
||||||
|
sudo update-desktop-database && \
|
||||||
|
xdg-desktop-menu forceupdate
|
||||||
|
|
||||||
|
echo
|
||||||
|
echo "Finish!"
|
||||||
|
echo
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
#!/bin/bash
|
#!/usr/bin/env bash
|
||||||
##makedesc: Install mariadb (latest) and php-mysql + phpMyAdmin (if php is installed)
|
##makedesc: Install mariadb (latest) and php-mysql + phpMyAdmin (if php is installed)
|
||||||
|
|
||||||
echo
|
echo
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
#!/bin/bash
|
#!/usr/bin/env bash
|
||||||
##makedesc: Install nodejs + npm via nvm
|
##makedesc: Install nodejs + npm via nvm
|
||||||
|
|
||||||
echo
|
echo
|
||||||
@@ -11,20 +11,17 @@ installed() {
|
|||||||
command -v "$1" >/dev/null 2>&1
|
command -v "$1" >/dev/null 2>&1
|
||||||
}
|
}
|
||||||
|
|
||||||
# sudo apt install -y --autoremove nodejs npm
|
installed "nvm" && sudo apt install -y --autoremove nodejs npm nvm
|
||||||
|
|
||||||
if !installed "nvm"; then
|
! installed "nvm" && wget -qO- https://raw.githubusercontent.com/nvm-sh/nvm/master/install.sh | bash
|
||||||
wget -qO- https://raw.githubusercontent.com/nvm-sh/nvm/master/install.sh | bash
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ $(nvm current) == 'system' ]; then
|
export NVM_DIR="$HOME/.nvm"
|
||||||
echo "WARNING: You already have node installed - removing to install actual version"
|
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"
|
||||||
sudo apt remove -y --autoremove nodejs npm
|
[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion"
|
||||||
else
|
|
||||||
nvm install-latest-npm
|
|
||||||
fi
|
|
||||||
|
|
||||||
|
nvm install-latest-npm
|
||||||
nvm install node
|
nvm install node
|
||||||
nvm use node
|
nvm use node
|
||||||
installed "node" && nvm current
|
echo "Finish!"
|
||||||
|
nvm current
|
||||||
nvm ls
|
nvm ls
|
||||||
|
|||||||
25
install/ntfy
Executable file
25
install/ntfy
Executable file
@@ -0,0 +1,25 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
##makedesc: Install ntfy (latest) + ppa
|
||||||
|
|
||||||
|
echo
|
||||||
|
echo "==============================================="
|
||||||
|
echo "Installing ntfy (latest) + ppa..."
|
||||||
|
echo "==============================================="
|
||||||
|
echo
|
||||||
|
|
||||||
|
# https://ntfy.sh/docs/install/#general-steps
|
||||||
|
|
||||||
|
installed() {
|
||||||
|
command -v "$1" >/dev/null 2>&1
|
||||||
|
}
|
||||||
|
|
||||||
|
! installed curl && sudo apt install -y curl
|
||||||
|
|
||||||
|
curl -sSL https://archive.heckel.io/apt/pubkey.txt | sudo apt-key add - && \
|
||||||
|
sudo apt install apt-transport-https && \
|
||||||
|
sudo sh -c "echo 'deb [arch=amd64] https://archive.heckel.io/apt debian main' \
|
||||||
|
> /etc/apt/sources.list.d/archive.heckel.io.list" && \
|
||||||
|
sudo apt update && \
|
||||||
|
sudo apt install ntfy -y && \
|
||||||
|
sudo systemctl enable ntfy && \
|
||||||
|
sudo systemctl start ntfy
|
||||||
33
install/nvim
Executable file
33
install/nvim
Executable file
@@ -0,0 +1,33 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
##makedesc: Install nvim + lazyvim
|
||||||
|
source "$( dirname $(readlink -e -- "${BASH_SOURCE}"))/../helpers.sh" || exit 255
|
||||||
|
|
||||||
|
# https://www.lazyvim.org/installation
|
||||||
|
# https://www.devas.life/effective-neovim-setup-for-web-development-towards-2024/
|
||||||
|
|
||||||
|
title
|
||||||
|
|
||||||
|
require git
|
||||||
|
|
||||||
|
nvimUrl="https://github.com/neovim/neovim/releases/latest/download/nvim-linux-x86_64.tar.gz"
|
||||||
|
installPath="$HOME/install"
|
||||||
|
installTar="$installPath/nvim.tar.gz"
|
||||||
|
|
||||||
|
[ -d "$HOME/.config/nvim" ] && mv "$HOME"/.config/nvim{,.bak}
|
||||||
|
[ -d "$HOME/.local/share/nvim" ] && mv "$HOME"/.local/share/nvim{,.bak}
|
||||||
|
[ -d "$HOME/.local/state/nvim" ] && mv "$HOME"/.local/state/nvim{,.bak}
|
||||||
|
[ -d "$HOME/.cache/nvim" ] && mv "$HOME"/.cache/nvim{,.bak}
|
||||||
|
|
||||||
|
download "$nvimUrl" "$installTar"
|
||||||
|
unpack_targz "$installTar" "$installPath"
|
||||||
|
|
||||||
|
sudo rm -vrf /opt/nvim
|
||||||
|
sudo mv -v "$installPath/nvim-linux-x86_64" /opt/nvim
|
||||||
|
|
||||||
|
git.clone_quick https://github.com/LazyVim/starter "$HOME/.config/nvim"
|
||||||
|
rm -rf "$HOME/.config/nvim/.git"
|
||||||
|
|
||||||
|
sudo update-desktop-database && \
|
||||||
|
xdg-desktop-menu forceupdate
|
||||||
|
|
||||||
|
# export PATH="$PATH:/opt/nvim-linux-x86_64/bin"
|
||||||
10
install/obs-studio
Executable file
10
install/obs-studio
Executable file
@@ -0,0 +1,10 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
##makedesc: Install obs-studio (latest snap)
|
||||||
|
|
||||||
|
echo
|
||||||
|
echo "==============================================="
|
||||||
|
echo "Installing obs-studio (latest snap)..."
|
||||||
|
echo "==============================================="
|
||||||
|
echo
|
||||||
|
|
||||||
|
sudo snap install obs-studio
|
||||||
19
install/omz-clean
Executable file
19
install/omz-clean
Executable file
@@ -0,0 +1,19 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
##makedesc: Install omz (latest)
|
||||||
|
|
||||||
|
echo
|
||||||
|
echo "==============================================="
|
||||||
|
echo "Installing omz (latest)..."
|
||||||
|
echo "==============================================="
|
||||||
|
echo
|
||||||
|
|
||||||
|
installed() {
|
||||||
|
command -v "$1" >/dev/null 2>&1
|
||||||
|
}
|
||||||
|
|
||||||
|
if ! installed zsh || ! installed git || ! installed curl; then
|
||||||
|
echo "ERROR: you need git, zsh and curl to be installed!"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
sh -c "$(curl -fsSL https://raw.github.com/robbyrussell/oh-my-zsh/master/tools/install.sh)"
|
||||||
60
install/omz-fancy
Executable file
60
install/omz-fancy
Executable file
@@ -0,0 +1,60 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
##makedesc: Install omz fancy (powerline10k + MesloLGS font)
|
||||||
|
|
||||||
|
# https://gist.github.com/anthonyaxenov/b8460935d06b9f0da72def03d0f26515
|
||||||
|
|
||||||
|
# Based on:
|
||||||
|
# https://github.com/Powerlevel9k/powerlevel9k/wiki/Install-Instructions
|
||||||
|
# https://github.com/ohmyzsh/ohmyzsh
|
||||||
|
# https://powerline.readthedocs.io/en/latest/installation/linux.html#fonts-installation
|
||||||
|
# https://gist.github.com/dogrocker/1efb8fd9427779c827058f873b94df95
|
||||||
|
# https://linuxhint.com/install_zsh_shell_ubuntu_1804/
|
||||||
|
|
||||||
|
echo
|
||||||
|
echo "==============================================="
|
||||||
|
echo "Installing omz fancy: powerline10k + MesloLGS font..."
|
||||||
|
echo "==============================================="
|
||||||
|
echo
|
||||||
|
|
||||||
|
installed() {
|
||||||
|
command -v "$1" >/dev/null 2>&1
|
||||||
|
}
|
||||||
|
|
||||||
|
if ! installed zsh || ! installed git || ! installed wget; then
|
||||||
|
echo "ERROR: you need git, zsh and wget to be installed!"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ ! -d "$HOME/.oh-my-zsh" ]]; then
|
||||||
|
echo "ERROR: you need omz to be installed!"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo
|
||||||
|
echo "1/3 Installing MesloLGS fonts..."
|
||||||
|
mkdir -p "$HOME/.local/share/fonts/"
|
||||||
|
FONTS_URL="https://github.com/romkatv/powerlevel10k-media/raw/master"
|
||||||
|
wget "$FONTS_URL/MesloLGS%20NF%20Regular.ttf" -O "$HOME/.local/share/fonts/MesloLGS NF Regular.ttf"
|
||||||
|
wget "$FONTS_URL/MesloLGS%20NF%20Bold.ttf" -O "$HOME/.local/share/fonts/MesloLGS NF Bold.ttf"
|
||||||
|
wget "$FONTS_URL/MesloLGS%20NF%20Italic.ttf" -O "$HOME/.local/share/fonts/MesloLGS NF Italic.ttf"
|
||||||
|
wget "$FONTS_URL/MesloLGS%20NF%20Bold%20Italic.ttf" -O "$HOME/.local/share/fonts/MesloLGS NF Bold Italic.ttf"
|
||||||
|
fc-cache -vf "$HOME/.local/share/fonts/"
|
||||||
|
|
||||||
|
echo
|
||||||
|
echo "2/3 Installing powerlevel10k theme..."
|
||||||
|
git clone --depth=1 https://github.com/romkatv/powerlevel10k.git ${ZSH_CUSTOM:-$HOME/.oh-my-zsh/custom}/themes/powerlevel10k
|
||||||
|
sed -i 's#^ZSH_THEME=.*$#ZSH_THEME="powerlevel10k/powerlevel10k"#g' "$HOME/.zshrc"
|
||||||
|
|
||||||
|
echo
|
||||||
|
echo "3/3 Installing plugins..."
|
||||||
|
git clone https://github.com/zsh-users/zsh-autosuggestions.git ${ZSH_CUSTOM:-$HOME/.oh-my-zsh/custom}/plugins/zsh-autosuggestions
|
||||||
|
git clone https://github.com/zsh-users/zsh-syntax-highlighting.git ${ZSH_CUSTOM:-$HOME/.oh-my-zsh/custom}/plugins/zsh-syntax-highlighting
|
||||||
|
sed -i 's/^plugins=/plugins=(git laravel docker docker-compose composer zsh-autosuggestions zsh-syntax-highlighting)/g' $HOME/.zshrc
|
||||||
|
p10k configure
|
||||||
|
|
||||||
|
echo
|
||||||
|
echo "Finish! You need to:"
|
||||||
|
echo "- review your plugins in $HOME/.zshrc"
|
||||||
|
echo "- restart terminal windows to reload fonts and set 'MesloLGS NF Regular' as default font"
|
||||||
|
echo "- log out of your session and login again"
|
||||||
|
echo
|
||||||
31
install/openvpn
Executable file
31
install/openvpn
Executable file
@@ -0,0 +1,31 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
##makedesc: Install openvpn v2.6.3 (src)
|
||||||
|
source "$( dirname $(readlink -e -- "${BASH_SOURCE}"))/../helpers.sh" || exit 255
|
||||||
|
|
||||||
|
# https://openvpn.net/community-downloads/
|
||||||
|
# https://openvpn.net/community-resources/installing-openvpn/
|
||||||
|
|
||||||
|
[ "$1" ] && OVPNVER="$1" || OVPNVER='2.6.3'
|
||||||
|
|
||||||
|
title "Installing openvpn v${OVPNVER} (src)..."
|
||||||
|
|
||||||
|
require libssl-dev \
|
||||||
|
liblzo2-dev \
|
||||||
|
libpam0g-dev
|
||||||
|
|
||||||
|
mkdir -p "$HOME/install/"
|
||||||
|
download "https://swupdate.openvpn.org/community/releases/openvpn-${OVPNVER}.tar.gz" "$HOME/install/openvpn-${OVPNVER}.tar.gz" && \
|
||||||
|
unpack_targz "$HOME/install/openvpn-${OVPNVER}.tar.gz" "$HOME/install/" && \
|
||||||
|
cd "$HOME/install/openvpn-${OVPNVER}" && \
|
||||||
|
sudo ./configure && \
|
||||||
|
sudo make && \
|
||||||
|
sudo make install &&
|
||||||
|
apt_install network-manager-openvpn \
|
||||||
|
network-manager-openvpn-gnome
|
||||||
|
|
||||||
|
[ $? = 0 ] && {
|
||||||
|
echo
|
||||||
|
success "openvpn installed!"
|
||||||
|
openvpn --version
|
||||||
|
echo
|
||||||
|
}
|
||||||
27
install/papirus
Executable file
27
install/papirus
Executable file
@@ -0,0 +1,27 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
##makedesc: Install papirus-icon-theme (latest)
|
||||||
|
source "$( dirname $(readlink -e -- "${BASH_SOURCE}"))/../helpers.sh" || exit 255
|
||||||
|
|
||||||
|
title
|
||||||
|
|
||||||
|
mkdir -p "$HOME/install/papirus-icon-theme" "$HOME/.local/share/icons/"
|
||||||
|
|
||||||
|
if installed git; then
|
||||||
|
clone_quick https://github.com/PapirusDevelopmentTeam/papirus-icon-theme.git "$HOME/install/"
|
||||||
|
else
|
||||||
|
download https://github.com/PapirusDevelopmentTeam/papirus-icon-theme/archive/refs/heads/master.zip -O "$HOME/install/papirus-icon-theme.zip" && \
|
||||||
|
unzip -oq "$HOME/install/papirus-icon-theme.zip" -d "$HOME/install/papirus-icon-theme" && \
|
||||||
|
rm -f "$HOME/install/papirus-icon-theme.zip"
|
||||||
|
fi
|
||||||
|
|
||||||
|
symlink "$HOME/install/papirus-icon-theme/Papirus" "$HOME/.local/share/icons/Papirus" && \
|
||||||
|
symlink "$HOME/install/papirus-icon-theme/Papirus-Dark" "$HOME/.local/share/icons/Papirus-Dark" && \
|
||||||
|
symlink "$HOME/install/papirus-icon-theme/Papirus-Light" "$HOME/.local/share/icons/Papirus-Light"
|
||||||
|
|
||||||
|
[ $? = 0 ] && {
|
||||||
|
echo
|
||||||
|
success "Papirus icons installed!"
|
||||||
|
info "You can find them in $HOME/.local/share/icons/"
|
||||||
|
echo
|
||||||
|
}
|
||||||
|
|
||||||
@@ -1,16 +1,14 @@
|
|||||||
#!/bin/bash
|
#!/usr/bin/env bash
|
||||||
##makedesc: Install postgresql (latest) and php-pgsql (if php is installed)
|
##makedesc: Install postgresql (latest) and php-pgsql (if php is installed)
|
||||||
|
source "$( dirname $(readlink -e -- "${BASH_SOURCE}"))/../helpers.sh" || exit 255
|
||||||
|
|
||||||
echo
|
title
|
||||||
echo "==============================================="
|
|
||||||
echo "Installing postgresql (latest)..."
|
|
||||||
echo "==============================================="
|
|
||||||
echo
|
|
||||||
|
|
||||||
installed() {
|
require postgresql postgresql-contrib && \
|
||||||
command -v "$1" >/dev/null 2>&1
|
sudo service postgresql restart && \
|
||||||
}
|
{
|
||||||
|
echo
|
||||||
sudo apt install -y --autoremove postgresql postgresql-contrib
|
success "openvpn installed!"
|
||||||
sudo service postgresql restart
|
postgres --version
|
||||||
installed 'php' && sudo apt install -y --autoremove php-pgsql
|
echo
|
||||||
|
}
|
||||||
|
|||||||
50
install/php
50
install/php
@@ -1,34 +1,42 @@
|
|||||||
#!/bin/bash
|
#!/usr/bin/env bash
|
||||||
##makedesc: Install php v8.1 + ppa
|
##makedesc: Install php v8.4
|
||||||
|
|
||||||
[ $1 ] && PHPVER="$1" || PHPVER="8.1"
|
[ "$1" ] && PHPVER="$1" || PHPVER="8.4"
|
||||||
echo
|
echo
|
||||||
echo "==============================================="
|
echo "==============================================="
|
||||||
echo "Installing php${PHPVER}..."
|
echo "Installing php${PHPVER}..."
|
||||||
echo "==============================================="
|
echo "==============================================="
|
||||||
echo
|
echo
|
||||||
|
|
||||||
sudo LC_ALL=C.UTF-8 add-apt-repository -y ppa:ondrej/php
|
|
||||||
sudo apt install -y --autoremove \
|
sudo apt install -y --autoremove \
|
||||||
php${PHPVER} \
|
php${PHPVER}-fpm \
|
||||||
|
php${PHPVER}-dev \
|
||||||
|
php${PHPVER}-apcu \
|
||||||
|
php${PHPVER}-bcmath \
|
||||||
php${PHPVER}-cli \
|
php${PHPVER}-cli \
|
||||||
php${PHPVER}-common \
|
php${PHPVER}-common \
|
||||||
|
php${PHPVER}-curl \
|
||||||
|
php${PHPVER}-dev \
|
||||||
|
php${PHPVER}-dom \
|
||||||
|
php${PHPVER}-gd \
|
||||||
|
php${PHPVER}-intl \
|
||||||
|
php${PHPVER}-mbstring \
|
||||||
|
php${PHPVER}-mysql \
|
||||||
|
php${PHPVER}-opcache \
|
||||||
|
php${PHPVER}-pgsql \
|
||||||
|
php${PHPVER}-simplexml \
|
||||||
|
php${PHPVER}-soap \
|
||||||
|
php${PHPVER}-sqlite3 \
|
||||||
php${PHPVER}-xdebug \
|
php${PHPVER}-xdebug \
|
||||||
# php${PHPVER}-bcmath \
|
php${PHPVER}-xml \
|
||||||
# php${PHPVER}-bz2 \
|
php${PHPVER}-xmlrpc \
|
||||||
# php${PHPVER}-curl \
|
php${PHPVER}-zip
|
||||||
# php${PHPVER}-gd \
|
|
||||||
# php${PHPVER}-json \
|
# php${PHPVER}-ldap \
|
||||||
# php${PHPVER}-mbstring \
|
# php${PHPVER}-dba \
|
||||||
# php${PHPVER}-mysql \
|
|
||||||
# php${PHPVER}-opcache \
|
|
||||||
# php${PHPVER}-pgsql \
|
|
||||||
# php${PHPVER}-soap \
|
|
||||||
# php${PHPVER}-xml \
|
|
||||||
# php${PHPVER}-xmlrpc \
|
|
||||||
# php${PHPVER}-xsl \
|
# php${PHPVER}-xsl \
|
||||||
# php${PHPVER}-sqlite3 \
|
|
||||||
# php${PHPVER}-zip
|
echo
|
||||||
# php${PHPVER}-dba
|
echo "Finish!"
|
||||||
# php${PHPVER}-ldap
|
|
||||||
php -v
|
php -v
|
||||||
|
echo
|
||||||
|
|||||||
30
install/php-psalm
Executable file
30
install/php-psalm
Executable file
@@ -0,0 +1,30 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
##makedesc: Install psalm
|
||||||
|
|
||||||
|
echo
|
||||||
|
echo "==============================================="
|
||||||
|
echo "Installing psalm..."
|
||||||
|
echo "==============================================="
|
||||||
|
echo
|
||||||
|
|
||||||
|
installed() {
|
||||||
|
command -v "$1" >/dev/null 2>&1
|
||||||
|
}
|
||||||
|
|
||||||
|
! installed 'php' && echo 'ERROR: You need php to be installed' && exit 1
|
||||||
|
! installed "composer" && echo "ERROR: You need composer to be installed" && exit 2
|
||||||
|
|
||||||
|
COMPOSER_GLOBAL_HOME="$(composer config -g home)"
|
||||||
|
NEWPATH="export PATH=\"$COMPOSER_GLOBAL_HOME/vendor/bin:\${PATH}\""
|
||||||
|
cat "$HOME/.profile" | grep -qoh "$NEWPATH" || {
|
||||||
|
$NEWPATH
|
||||||
|
echo "$NEWPATH" >> "$HOME/.profile"
|
||||||
|
}
|
||||||
|
source "$HOME/.profile"
|
||||||
|
|
||||||
|
composer global require vimeo/psalm --dev
|
||||||
|
|
||||||
|
echo
|
||||||
|
echo "Finish!"
|
||||||
|
psalm --version
|
||||||
|
echo
|
||||||
46
install/php-spx
Executable file
46
install/php-spx
Executable file
@@ -0,0 +1,46 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
##makedesc: Install php-spx
|
||||||
|
|
||||||
|
echo
|
||||||
|
echo "==============================================="
|
||||||
|
echo "Installing php-spx..."
|
||||||
|
echo "==============================================="
|
||||||
|
echo
|
||||||
|
|
||||||
|
installed() {
|
||||||
|
command -v "$1" >/dev/null 2>&1
|
||||||
|
}
|
||||||
|
|
||||||
|
! installed 'php' && echo 'ERROR: You need php to be installed' && exit 1
|
||||||
|
! installed 'phpize' && echo 'ERROR: You need php-dev to be installed' && exit 2
|
||||||
|
! installed 'make' && sudo apt install -y make
|
||||||
|
! installed 'wget' && sudo apt install -y wget
|
||||||
|
|
||||||
|
[ -d "$HOME/install/php-spx" ] || mkdir -p "$HOME/install/php-spx"
|
||||||
|
wget https://github.com/NoiseByNorthwest/php-spx/archive/refs/heads/release/latest.zip -O /tmp/php-spx.zip \
|
||||||
|
&& unzip -oq /tmp/php-spx.zip -d "$HOME/install/php-spx" \
|
||||||
|
&& rm /tmp/php-spx.zip \
|
||||||
|
&& cd "$HOME/install/php-spx/php-spx-release-latest" \
|
||||||
|
&& phpize \
|
||||||
|
&& ./configure \
|
||||||
|
&& make \
|
||||||
|
&& sudo make install
|
||||||
|
|
||||||
|
PHPVER=`php -r 'echo ($v=explode(".",PHP_VERSION))[0].".".$v[1];'`
|
||||||
|
cat << EOF | sudo tee -a "/etc/php/${PHPVER}/mods-available/spx.ini"
|
||||||
|
; https://github.com/NoiseByNorthwest/php-spx/tree/release/latest#configuration
|
||||||
|
; https://habr.com/ru/post/505192/
|
||||||
|
|
||||||
|
; extension=spx.so
|
||||||
|
; spx.data_dir = '/tmp/spx'
|
||||||
|
spx.http_enabled = 0
|
||||||
|
spx.http_key = 'spx'
|
||||||
|
; spx.http_ip_whitelist = "127.0.0.1"
|
||||||
|
|
||||||
|
EOF
|
||||||
|
|
||||||
|
sudo ln -sf "/etc/php/${PHPVER}/mods-available/spx.ini" "/etc/php/${PHPVER}/cli/conf.d/99-spx.ini"
|
||||||
|
|
||||||
|
echo
|
||||||
|
echo "Finish!"
|
||||||
|
echo
|
||||||
32
install/phpcs
Executable file
32
install/phpcs
Executable file
@@ -0,0 +1,32 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
##makedesc: Install phpcs + php-cs-fixer
|
||||||
|
|
||||||
|
echo
|
||||||
|
echo "==============================================="
|
||||||
|
echo "Installing phpcs + php-cs-fixer..."
|
||||||
|
echo "==============================================="
|
||||||
|
echo
|
||||||
|
|
||||||
|
installed() {
|
||||||
|
command -v "$1" >/dev/null 2>&1
|
||||||
|
}
|
||||||
|
|
||||||
|
! installed 'php' && echo 'ERROR: You need php to be installed' && exit 1
|
||||||
|
! installed "composer" && echo "ERROR: You need composer to be installed" && exit 2
|
||||||
|
|
||||||
|
COMPOSER_GLOBAL_HOME="$(composer config -g home)"
|
||||||
|
NEWPATH="export PATH=\"$COMPOSER_GLOBAL_HOME/vendor/bin:\${PATH}\""
|
||||||
|
cat "$HOME/.profile" | grep -qoh "$NEWPATH" || {
|
||||||
|
$NEWPATH
|
||||||
|
echo "$NEWPATH" >> "$HOME/.profile"
|
||||||
|
}
|
||||||
|
source "$HOME/.profile"
|
||||||
|
|
||||||
|
composer global require squizlabs/php_codesniffer --dev
|
||||||
|
composer global require friendsofphp/php-cs-fixer --dev
|
||||||
|
|
||||||
|
echo
|
||||||
|
echo "Finish!"
|
||||||
|
phpcs --version # phpcbf --version
|
||||||
|
php-cs-fixer --version
|
||||||
|
echo
|
||||||
30
install/phpmd
Executable file
30
install/phpmd
Executable file
@@ -0,0 +1,30 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
##makedesc: Install phpmd
|
||||||
|
|
||||||
|
echo
|
||||||
|
echo "==============================================="
|
||||||
|
echo "Installing phpmd..."
|
||||||
|
echo "==============================================="
|
||||||
|
echo
|
||||||
|
|
||||||
|
installed() {
|
||||||
|
command -v "$1" >/dev/null 2>&1
|
||||||
|
}
|
||||||
|
|
||||||
|
! installed 'php' && echo 'ERROR: You need php to be installed' && exit 1
|
||||||
|
! installed "composer" && echo "ERROR: You need composer to be installed" && exit 2
|
||||||
|
|
||||||
|
COMPOSER_GLOBAL_HOME="$(composer config -g home)"
|
||||||
|
NEWPATH="export PATH=\"$COMPOSER_GLOBAL_HOME/vendor/bin:\${PATH}\""
|
||||||
|
cat "$HOME/.profile" | grep -qoh "$NEWPATH" || {
|
||||||
|
$NEWPATH
|
||||||
|
echo "$NEWPATH" >> "$HOME/.profile"
|
||||||
|
}
|
||||||
|
source "$HOME/.profile"
|
||||||
|
|
||||||
|
composer global require phpmd/phpmd --dev
|
||||||
|
|
||||||
|
echo
|
||||||
|
echo "Finish!"
|
||||||
|
phpmd --version
|
||||||
|
echo
|
||||||
31
install/phpstan
Executable file
31
install/phpstan
Executable file
@@ -0,0 +1,31 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
##makedesc: Install phpstan
|
||||||
|
|
||||||
|
echo
|
||||||
|
echo "==============================================="
|
||||||
|
echo "Installing phpstan..."
|
||||||
|
echo "==============================================="
|
||||||
|
echo
|
||||||
|
|
||||||
|
installed() {
|
||||||
|
command -v "$1" >/dev/null 2>&1
|
||||||
|
}
|
||||||
|
|
||||||
|
! installed 'php' && echo 'ERROR: You need php to be installed' && exit 1
|
||||||
|
! installed "composer" && echo "ERROR: You need composer to be installed" && exit 2
|
||||||
|
|
||||||
|
COMPOSER_GLOBAL_HOME="$(composer config -g home)"
|
||||||
|
NEWPATH="export PATH=\"$COMPOSER_GLOBAL_HOME/vendor/bin:\${PATH}\""
|
||||||
|
cat "$HOME/.profile" | grep -qoh "$NEWPATH" || {
|
||||||
|
$NEWPATH
|
||||||
|
echo "$NEWPATH" >> "$HOME/.profile"
|
||||||
|
}
|
||||||
|
source "$HOME/.profile"
|
||||||
|
|
||||||
|
composer global require phpstan/phpstan --dev
|
||||||
|
|
||||||
|
echo
|
||||||
|
echo "Finish!"
|
||||||
|
phpstan --version
|
||||||
|
echo
|
||||||
|
|
||||||
31
install/phpunit
Executable file
31
install/phpunit
Executable file
@@ -0,0 +1,31 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
##makedesc: Install phpunit
|
||||||
|
|
||||||
|
echo
|
||||||
|
echo "==============================================="
|
||||||
|
echo "Installing phpunit..."
|
||||||
|
echo "==============================================="
|
||||||
|
echo
|
||||||
|
|
||||||
|
installed() {
|
||||||
|
command -v "$1" >/dev/null 2>&1
|
||||||
|
}
|
||||||
|
|
||||||
|
! installed 'php' && echo 'ERROR: You need php to be installed' && exit 1
|
||||||
|
! installed "composer" && echo "ERROR: You need composer to be installed" && exit 2
|
||||||
|
|
||||||
|
COMPOSER_GLOBAL_HOME="$(composer config -g home)"
|
||||||
|
NEWPATH="export PATH=\"$COMPOSER_GLOBAL_HOME/vendor/bin:\${PATH}\""
|
||||||
|
cat "$HOME/.profile" | grep -qoh "$NEWPATH" || {
|
||||||
|
$NEWPATH
|
||||||
|
echo "$NEWPATH" >> "$HOME/.profile"
|
||||||
|
}
|
||||||
|
source "$HOME/.profile"
|
||||||
|
|
||||||
|
composer global require phpunit/phpunit --dev
|
||||||
|
|
||||||
|
echo
|
||||||
|
echo "Finish!"
|
||||||
|
phpunit --version
|
||||||
|
echo
|
||||||
|
|
||||||
@@ -1,27 +1,33 @@
|
|||||||
#!/bin/bash
|
#!/usr/bin/env bash
|
||||||
##makedesc: Install postman (latest)
|
##makedesc: Install postman (latest)
|
||||||
|
source "$( dirname $(readlink -e -- "${BASH_SOURCE}"))/../helpers.sh" || exit 255
|
||||||
|
|
||||||
echo
|
# https://learning.postman.com/docs/getting-started/installation-and-updates/#installing-postman-on-linux
|
||||||
echo "==============================================="
|
|
||||||
echo "Installing postman (latest)..."
|
|
||||||
echo "==============================================="
|
|
||||||
echo
|
|
||||||
|
|
||||||
wget "https://dl.pstmn.io/download/latest/linux64" -O /tmp/postman.tar.gz
|
# set -ex
|
||||||
# sudo tar -xvzf /tmp/postman.tar.gz -C /usr/local/bin
|
|
||||||
sudo tar -xzf /tmp/postman.tar.gz -C /usr/local
|
|
||||||
rm /tmp/postman.tar.gz
|
|
||||||
sudo ln -s /usr/local/Postman/Postman /usr/local/bin/postman
|
|
||||||
|
|
||||||
echo "#!/usr/bin/env xdg-open
|
title
|
||||||
|
|
||||||
|
mkdir -p "$HOME/install" && \
|
||||||
|
"$HOME/.local/bin" && \
|
||||||
|
"$HOME/.local/share/applications"
|
||||||
|
|
||||||
|
download "https://dl.pstmn.io/download/latest/linux64" "$HOME/install/postman.tar.gz" && \
|
||||||
|
unpack_targz "$HOME/install/postman.tar.gz" "$HOME/install" && \
|
||||||
|
symlink "$HOME/install/Postman/Postman" "$HOME/.local/bin/postman" && \
|
||||||
|
cat << EOF > "$HOME/.local/share/applications/Postman.desktop" && sudo update-desktop-database
|
||||||
[Desktop Entry]
|
[Desktop Entry]
|
||||||
Name=Postman
|
Name=Postman
|
||||||
Exec=/usr/local/bin/postman
|
Exec=$HOME/.local/bin/postman %U
|
||||||
Icon=/usr/local/Postman/app/icons/icon_128x128.png
|
Icon=$HOME/install/Postman/app/icons/icon_128x128.png
|
||||||
Categories=Utility,Network
|
Categories=Development,Network
|
||||||
Terminal=false
|
Terminal=false
|
||||||
Type=Application
|
Type=Application
|
||||||
Encoding=UTF-8
|
Encoding=UTF-8
|
||||||
" > $HOME/.local/share/applications/Postman.desktop
|
EOF
|
||||||
sudo update-desktop-database
|
|
||||||
|
[ $? = 0 ] && {
|
||||||
|
echo
|
||||||
|
success "Postman installed!"
|
||||||
|
echo
|
||||||
|
}
|
||||||
|
|||||||
25
install/qt5
Executable file
25
install/qt5
Executable file
@@ -0,0 +1,25 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
##makedesc: Install qt5
|
||||||
|
|
||||||
|
echo
|
||||||
|
echo "==============================================="
|
||||||
|
echo "Installing qt5..."
|
||||||
|
echo "==============================================="
|
||||||
|
echo
|
||||||
|
|
||||||
|
sudo apt install -y --autoremove \
|
||||||
|
build-essential \
|
||||||
|
ca-certificates \
|
||||||
|
cmake \
|
||||||
|
g++ \
|
||||||
|
libqt5core5a \
|
||||||
|
libqt5dbus5 \
|
||||||
|
libqt5gui5 \
|
||||||
|
libqt5network5 \
|
||||||
|
libqt5svg5 \
|
||||||
|
libqt5svg5-dev \
|
||||||
|
libqt5widgets5 \
|
||||||
|
openssl \
|
||||||
|
qtbase5-dev \
|
||||||
|
qttools5-dev \
|
||||||
|
qttools5-dev-tools
|
||||||
@@ -1,16 +1,24 @@
|
|||||||
#!/bin/bash
|
#!/usr/bin/env bash
|
||||||
##makedesc: Install rustdesk v1.1.8 (deb)
|
##makedesc: Install rustdesk client v1.4.2 (deb)
|
||||||
|
|
||||||
[ $1 ] && RDVER="$1" || RDVER="1.1.8"
|
[ "$1" ] && RDVER="$1" || RDVER="1.4.2"
|
||||||
echo
|
echo
|
||||||
echo "==============================================="
|
echo "==============================================="
|
||||||
echo "Installing rustdesk v${RDVER}..."
|
echo "Installing rustdesk v$RDVER..."
|
||||||
echo "==============================================="
|
echo "==============================================="
|
||||||
echo
|
echo
|
||||||
|
|
||||||
# https://github.com/rustdesk/rustdesk
|
# https://github.com/rustdesk/rustdesk
|
||||||
|
|
||||||
sudo apt install libxdo3
|
deb_path="$HOME/install"
|
||||||
wget "http://github.com/rustdesk/rustdesk/releases/download/${RDVER}/rustdesk-${RDVER}.deb" -qO /tmp/rustdesk.deb
|
deb_name="rustdesk-$RDVER.deb"
|
||||||
sudo dpkg -i /tmp/rustdesk.deb
|
mkdir -p "$deb_path"
|
||||||
rm /tmp/rustdesk.deb
|
deb="$deb_path/$deb_name"
|
||||||
|
|
||||||
|
sudo apt install -y libxdo3 python3-pip
|
||||||
|
wget "https://github.com/rustdesk/rustdesk/releases/download/$RDVER/$deb_name" -O "$deb"
|
||||||
|
sudo dpkg -i "$deb"
|
||||||
|
|
||||||
|
# flatpak install -y com.rustdesk.RustDesk
|
||||||
|
# https://develop.kde.org/docs/administration/portal-permissions/
|
||||||
|
# flatpak permission-set kde-authorized remote-desktop com.rustdesk.RustDesk yes
|
||||||
|
|||||||
29
install/snap
29
install/snap
@@ -1,4 +1,4 @@
|
|||||||
#!/bin/bash
|
#!/usr/bin/env bash
|
||||||
##makedesc: Install bunch of software from snap
|
##makedesc: Install bunch of software from snap
|
||||||
|
|
||||||
echo
|
echo
|
||||||
@@ -18,27 +18,26 @@ snapi() {
|
|||||||
|
|
||||||
if ! installed snapd; then
|
if ! installed snapd; then
|
||||||
sudo apt update
|
sudo apt update
|
||||||
sudo apt install -y --autoremove snapd gnome-software-plugin-snap
|
sudo apt install -y --autoremove snapd #gnome-software-plugin-snap
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# snapi snap-store
|
# snapi snap-store
|
||||||
snapi telegram-desktop
|
|
||||||
snapi code
|
|
||||||
# snapi phpstorm
|
|
||||||
snapi skype
|
|
||||||
# snapi audacity
|
|
||||||
# snapi flameshot
|
|
||||||
# snapi gtk-common-themes
|
# snapi gtk-common-themes
|
||||||
# snapi gtk2-common-themes
|
# snapi gtk2-common-themes
|
||||||
# snapi kde-frameworks-5-core18
|
|
||||||
snapi zoom-client
|
|
||||||
snapi peek
|
snapi peek
|
||||||
|
# snapi telegram-desktop #todo
|
||||||
|
# snapi code # deb https://github.com/microsoft/vscode/issues/221836
|
||||||
|
snapi skype
|
||||||
|
snapi dbeaver-ce
|
||||||
|
# snapi mysql-workbench-community
|
||||||
|
# snapi discord
|
||||||
|
# snapi phpstorm
|
||||||
|
# snapi audacity
|
||||||
|
# snapi flameshot # deb
|
||||||
|
# snapi zoom-client # deb
|
||||||
|
|
||||||
# https://certbot.eff.org/
|
# https://certbot.eff.org/
|
||||||
# snapi certbot
|
# snapi certbot
|
||||||
# sudo ln -s /snap/bin/certbot /usr/bin/certbot
|
# sudo ln -sf /snap/bin/certbot /usr/bin/certbot
|
||||||
|
|
||||||
# snapi mysql-workbench-community
|
|
||||||
snapi dbeaver-ce
|
|
||||||
# snapi discord
|
|
||||||
# snapi obs-studio
|
|
||||||
|
|||||||
45
install/sublimemerge
Executable file
45
install/sublimemerge
Executable file
@@ -0,0 +1,45 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
##makedesc: Install Sublime Merge
|
||||||
|
source "$( dirname $(readlink -e -- "${BASH_SOURCE}"))/../helpers.sh" || exit 255
|
||||||
|
|
||||||
|
# https://www.sublimemerge.com/download
|
||||||
|
# https://gist.github.com/lugrus2000/1fc55158b87f94d799392a6dd1ac0ce2
|
||||||
|
# https://gist.github.com/maboloshi/feaa63c35f4c2baab24c9aaf9b3f4e47
|
||||||
|
|
||||||
|
[ "$1" ] && SMVER="$1" || SMVER='2102'
|
||||||
|
|
||||||
|
title
|
||||||
|
|
||||||
|
mkdir -p "$HOME/install"
|
||||||
|
DEB_PATH="$HOME/install/sublime-merge_build-${SMVER}_amd64.deb"
|
||||||
|
BIN_PATH="/opt/sublime_merge/sublime_merge"
|
||||||
|
|
||||||
|
if [[ ! -f "$DEB_PATH" ]]; then
|
||||||
|
download https://download.sublimetext.com/sublime-merge_build-${SMVER}_amd64.deb "$DEB_PATH"
|
||||||
|
fi
|
||||||
|
|
||||||
|
sudo dpkg -i "$DEB_PATH"
|
||||||
|
# sudo cp -f $BIN_PATH $BIN_PATH.old
|
||||||
|
|
||||||
|
# if [[ $SMVER = 2102 ]]; then
|
||||||
|
#TODO not working
|
||||||
|
# printf '\x48\xC7\xC0\x19\x01\x00\x00\xC3' | sudo dd of=$BIN_PATH bs=1 seek=$((0x003A5400)) conv=notrunc
|
||||||
|
# printf '\x90\x90\x90\x90\x90' | sudo dd of=$BIN_PATH bs=1 seek=$((0x003A7EC9)) conv=notrunc
|
||||||
|
# printf '\x90\x90\x90\x90\x90' | sudo dd of=$BIN_PATH bs=1 seek=$((0x003A7EE4)) conv=notrunc
|
||||||
|
# printf '\x48\x31\xC0\x48\xFF\xC0\xC3' | sudo dd of=$BIN_PATH bs=1 seek=$((0x003A67FE)) conv=notrunc
|
||||||
|
# printf '\xC3' | sudo dd of=$BIN_PATH bs=1 seek=$((0x003A514E)) conv=notrunc
|
||||||
|
# printf '\xC3' | sudo dd of=$BIN_PATH bs=1 seek=$((0x003A40D2)) conv=notrunc
|
||||||
|
|
||||||
|
#TODO segfault
|
||||||
|
# echo 0045a360: 48 C7 C0 19 01 00 00 C3 | sudo xxd -r - $BIN_PATH
|
||||||
|
# echo 0045d21d: 90 90 90 90 90 | sudo xxd -r - $BIN_PATH
|
||||||
|
# echo 0045d23a: 90 90 90 90 90 | sudo xxd -r - $BIN_PATH
|
||||||
|
# echo 0045b990: C3 | sudo xxd -r - $BIN_PATH
|
||||||
|
# echo 0045a05a: C3 | sudo xxd -r - $BIN_PATH
|
||||||
|
# echo 00459aba: C3 | sudo xxd -r - $BIN_PATH
|
||||||
|
# fi
|
||||||
|
|
||||||
|
echo
|
||||||
|
success "Sublime Merge installed!"
|
||||||
|
$BIN_PATH --version
|
||||||
|
echo
|
||||||
37
install/sublimetext
Executable file
37
install/sublimetext
Executable file
@@ -0,0 +1,37 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
##makedesc: Install Sublime Text
|
||||||
|
source "$( dirname $(readlink -e -- "${BASH_SOURCE}"))/../helpers.sh" || exit 255
|
||||||
|
|
||||||
|
# https://www.sublimetext.com/download
|
||||||
|
# https://gist.axenov.dev/anthony/sublime
|
||||||
|
# https://gist.axenov.dev/anthony/sublime2
|
||||||
|
# https://gist.github.com/lugrus2000/1fc55158b87f94d799392a6dd1ac0ce2
|
||||||
|
# https://gist.github.com/maboloshi/feaa63c35f4c2baab24c9aaf9b3f4e47
|
||||||
|
|
||||||
|
[ "$1" ] && STVER="$1" || STVER='4200'
|
||||||
|
|
||||||
|
title
|
||||||
|
|
||||||
|
mkdir -p "$HOME/install"
|
||||||
|
DEB_PATH="$HOME/install/sublime-text_build-${STVER}_amd64.deb"
|
||||||
|
BIN_PATH="/opt/sublime_text/sublime_text"
|
||||||
|
|
||||||
|
if [[ ! -f "$DEB_PATH" ]]; then
|
||||||
|
download "https://download.sublimetext.com/sublime-text_build-${STVER}_amd64.deb" "$DEB_PATH"
|
||||||
|
fi
|
||||||
|
|
||||||
|
sudo dpkg -i "$DEB_PATH"
|
||||||
|
sudo cp -f "$BIN_PATH" "$BIN_PATH.old"
|
||||||
|
|
||||||
|
if [[ $STVER = 4169 ]]; then
|
||||||
|
echo "00489f39: c640 0501 4885 c9" | sudo xxd -r - "$BIN_PATH"
|
||||||
|
elif [[ $STVER = 4200 ]]; then
|
||||||
|
sudo sed -i 's#\x0F\xB6\x51\x05\x83\xF2\x01#\xC6\x41\x05\x01\xB2\x00\x90#' "$BIN_PATH"
|
||||||
|
else
|
||||||
|
sudo sed -i 's#\x80\x79\x05\x00\x0F\x94\xC2#\xC6\x41\x05\x01\xB2\x00\x90#' "$BIN_PATH"
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo
|
||||||
|
success "Sublime Text installed!"
|
||||||
|
$BIN_PATH --version
|
||||||
|
echo
|
||||||
20
install/suld
Executable file
20
install/suld
Executable file
@@ -0,0 +1,20 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
##makedesc: Samsung Unified Linux Driver repo
|
||||||
|
source "$( dirname $(readlink -e -- "${BASH_SOURCE}"))/../helpers.sh" || exit 255
|
||||||
|
|
||||||
|
# https://www.bchemnet.com/suldr/
|
||||||
|
# https://www.bchemnet.com/suldr/supported.html
|
||||||
|
|
||||||
|
title
|
||||||
|
|
||||||
|
mkdir -vp "$HOME/install"
|
||||||
|
sudo bash -c 'echo "deb https://www.bchemnet.com/suldr/ debian extra" >> /etc/apt/sources.list.d/samsung.list'
|
||||||
|
download \
|
||||||
|
https://www.bchemnet.com/suldr/pool/debian/extra/su/suldr-keyring_3_all.deb \
|
||||||
|
"$HOME/install/suldr-keyring_3_all.deb"
|
||||||
|
sudo dpkg -i "$HOME/install/suldr-keyring_3_all.deb"
|
||||||
|
apt_install suld-driver2-1.00.39
|
||||||
|
|
||||||
|
success "Samsung Unified Linux Driver installed!"
|
||||||
|
info "Don't forget to connect your Samsung printer"
|
||||||
|
info "See more info here: https://www.bchemnet.com/suldr/"
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
#!/bin/bash
|
#!/usr/bin/env bash
|
||||||
##makedesc: Install syncthing (latest) + ppa
|
##makedesc: Install syncthing (latest) + ppa
|
||||||
|
|
||||||
echo
|
echo
|
||||||
@@ -24,5 +24,5 @@ sudo apt install -y --autoremove syncthing
|
|||||||
|
|
||||||
wget "https://raw.githubusercontent.com/syncthing/syncthing/main/etc/linux-desktop/syncthing-start.desktop" -O $HOME/.local/share/applications/syncthing-start.desktop
|
wget "https://raw.githubusercontent.com/syncthing/syncthing/main/etc/linux-desktop/syncthing-start.desktop" -O $HOME/.local/share/applications/syncthing-start.desktop
|
||||||
wget "https://raw.githubusercontent.com/syncthing/syncthing/main/etc/linux-desktop/syncthing-ui.desktop" -O $HOME/.local/share/applications/syncthing-ui.desktop
|
wget "https://raw.githubusercontent.com/syncthing/syncthing/main/etc/linux-desktop/syncthing-ui.desktop" -O $HOME/.local/share/applications/syncthing-ui.desktop
|
||||||
ln -s $HOME/.local/share/applications/syncthing-start.desktop $HOME/.config/autostart/syncthing-start.desktop
|
ln -sf $HOME/.local/share/applications/syncthing-start.desktop $HOME/.config/autostart/syncthing-start.desktop
|
||||||
# или демоном: https://habr.com/ru/post/350892/
|
# или демоном: https://habr.com/ru/post/350892/
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
#!/bin/bash
|
#!/usr/bin/env bash
|
||||||
##makedesc: Install telebit (latest)
|
##makedesc: Install telebit (latest)
|
||||||
|
|
||||||
echo
|
echo
|
||||||
|
|||||||
13
install/telegram
Executable file
13
install/telegram
Executable file
@@ -0,0 +1,13 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
##makedesc: Install telegram (latest)
|
||||||
|
|
||||||
|
echo
|
||||||
|
echo "==============================================="
|
||||||
|
echo "Installing telegram (latest)..."
|
||||||
|
echo "==============================================="
|
||||||
|
echo
|
||||||
|
|
||||||
|
mkdir -p "$HOME/install" "$HOME/.local/bin"
|
||||||
|
wget "https://telegram.org/dl/desktop/linux" -O $HOME/install/telegram.tar.gz && \
|
||||||
|
tar -xJf $HOME/install/telegram.tar.gz -C $HOME/.local/bin
|
||||||
|
$HOME/.local/bin/Telegram/Telegram & disown > /dev/null
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
#!/bin/bash
|
#!/usr/bin/env bash
|
||||||
##makedesc: Install ulauncher (latest) + ppa
|
##makedesc: Install ulauncher (latest) + ppa
|
||||||
|
|
||||||
echo
|
echo
|
||||||
@@ -7,5 +7,7 @@ echo "Installing ulauncher (latest) + ppa..."
|
|||||||
echo "==============================================="
|
echo "==============================================="
|
||||||
echo
|
echo
|
||||||
|
|
||||||
sudo add-apt-repository ppa:agornostal/ulauncher
|
sudo add-apt-repository universe -y
|
||||||
sudo apt install -y --autoremove ulauncher
|
sudo add-apt-repository ppa:agornostal/ulauncher -y
|
||||||
|
sudo apt update
|
||||||
|
sudo apt install ulauncher
|
||||||
|
|||||||
19
install/vivaldi
Executable file
19
install/vivaldi
Executable file
@@ -0,0 +1,19 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
##makedesc: Install Vivaldi + ppa
|
||||||
|
|
||||||
|
# https://repo.vivaldi.com
|
||||||
|
# https://help.vivaldi.com/desktop/#install-update
|
||||||
|
# https://help.vivaldi.com/desktop/install-update/manual-setup-vivaldi-linux-repositories/
|
||||||
|
|
||||||
|
echo
|
||||||
|
echo "==============================================="
|
||||||
|
echo "Installing Vivaldi + ppa..."
|
||||||
|
echo "==============================================="
|
||||||
|
echo
|
||||||
|
|
||||||
|
wget -qO- https://repo.vivaldi.com/archive/linux_signing_key.pub | gpg --dearmor > packages.vivaldi.gpg
|
||||||
|
sudo install -o root -g root -m 644 packages.vivaldi.gpg /etc/apt/trusted.gpg.d
|
||||||
|
sudo sh -c 'echo "deb [arch=amd64,armhf signed-by=/etc/apt/trusted.gpg.d/packages.vivaldi.gpg] https://repo.vivaldi.com/archive/deb stable main" > /etc/apt/sources.list.d/vivaldi.list'
|
||||||
|
rm -f packages.vivaldi.gpg
|
||||||
|
|
||||||
|
sudo apt update && sudo apt install vivaldi-stable
|
||||||
18
install/vscode
Executable file
18
install/vscode
Executable file
@@ -0,0 +1,18 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
##makedesc: VSCode deb-package
|
||||||
|
source "$( dirname $(readlink -e -- "${BASH_SOURCE}"))/../helpers.sh" || exit 255
|
||||||
|
|
||||||
|
title
|
||||||
|
|
||||||
|
mkdir -p "$HOME/install"
|
||||||
|
|
||||||
|
download "https://code.visualstudio.com/sha/download?build=stable&os=linux-deb-x64" \
|
||||||
|
"$HOME/install/vscode.deb" && \
|
||||||
|
sudo dpkg -i "$HOME/install/vscode.deb"
|
||||||
|
|
||||||
|
[ $? = 0 ] && {
|
||||||
|
echo
|
||||||
|
success "VSCode installed"
|
||||||
|
code --version
|
||||||
|
echo
|
||||||
|
}
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
#!/bin/bash
|
#!/usr/bin/env bash
|
||||||
##makedesc: Install wine (latest) + ppa (focal)
|
##makedesc: Install wine (latest) + ppa
|
||||||
|
|
||||||
echo
|
echo
|
||||||
echo "==============================================="
|
echo "==============================================="
|
||||||
@@ -9,6 +9,6 @@ echo
|
|||||||
|
|
||||||
sudo dpkg --add-architecture i386
|
sudo dpkg --add-architecture i386
|
||||||
wget -qO- https://dl.winehq.org/wine-builds/winehq.key | sudo apt-key add -
|
wget -qO- https://dl.winehq.org/wine-builds/winehq.key | sudo apt-key add -
|
||||||
sudo add-apt-repository 'deb https://dl.winehq.org/wine-builds/ubuntu/ focal main'
|
sudo add-apt-repository -y "deb https://dl.winehq.org/wine-builds/ubuntu/ $(lsb_release -cs 2>/dev/null) main"
|
||||||
sudo apt install -y --autoremove winehq-stable
|
sudo apt install -y --autoremove winehq-stable
|
||||||
wine --version
|
wine --version
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user