diff --git a/README.md b/README.md index 9e63ac4a53b593b81270e5934fe453de8d58cbc2..9dd4057b1760c86a79b8c84845028d17b37bc326 100644 --- a/README.md +++ b/README.md @@ -19,7 +19,3 @@ This project is to demonstrate a possibility to manage customization in a centra ## dependency coreutils bash grep sudo - -## TODO - -init order? what is one init depends on another? diff --git a/examples/template/masterconf.sh b/examples/template/masterconf.sh index 1b282a7d4c05eeffd0575eb8a355ee2f8b8c9d7b..c373c72a556f95044c73e5bdc08f426da3128340 100644 --- a/examples/template/masterconf.sh +++ b/examples/template/masterconf.sh @@ -1,54 +1,48 @@ # we run this master config only once, for each "registered" user. # To use linuxconf: -# sudo linuxconf register () -# linuxconf register () +# sudo linuxconf register path/to/masterconf.sh +# sudo -u ... linuxconf register path/to/masterconf.sh # Common use: -# 1. install archlinux fresh -# 2. copy this linuxconf dir, please it somewhere. (put a linuxconf wrapper script in this dir? automatically install linuxconf from githubi (pkg manager if available) if not installed, then run real linuxconf.) -# 3. ./linuxconf register . -# > check if linuxconf installed, install it if not. -# > create / overwrite config file in /etc/linuxconf.conf, just 1 line: `root=/path/to/...` -# don't touch it if already have correct content, report error if need update & no permission -# > conf.d/basic.sh should install pkgs, (possibly) create new user, (possibly) run `linuxconf register .` again with new user. -# +# 1. install fresh archlinux +# 2. download this directory from somewhere +# 3. ./linuxconf.wrapper register ./masterconf.sh +# > linuxconf would be downloaded & installed automatically. lc_init() will happen right now. # order by filename lc_include conf.d/* -# If you have multiple user.. You might need this in your config file. +# If you have multiple user but this file is for a specific user... lc_assert_user_is root -lc_assert_user_is_not root +# lc_assert_user_is_not root # I strongly suggest u design lc_init() as an idempotent operation. Just in case u accidentally run `linuxconf register` elsewhere. lc_init () { - # as root / as user? - # Some helpful functions.. To stop running current script: - [ -f /usr/bin/apt ] || die "This is not even ubuntu. Stop!" + [ -f /usr/bin/apt ] || lc_die "This is not even ubuntu. Stop!" # To print an error message: - apt install some_package || err "Failed to install my favorite pkg!" - - gsettings set var=123 + apt install some_package || lc_err "Failed to install my favorite pkg!" } lc_startup () { - # as root / as user? - # You want desktop env? Use lc_login() - - # want some daemon in background? + sysctl kernel.sysrq=1 + + # want some daemon in background? Note: linuxconf dir is always your workdir. lc_bgrun /tmp/server.log my_server --arg1 123 --arg2 "hello world !" - # Guaranteed! linuxconf dir is your current workdir. + # want it auto_restart? lc_bgrun /dev/null auto_restart important_service --config files/test.conf + # want some timely task? + lc_bgrun /dev/null every 1h curl https://example-ddns.com/api } lc_login () { # Your desktop environment must implement "XDG autostart". Ref: https://wiki.archlinux.org/title/XDG_Autostart - # Otherwise... Use lc_init to your task into wherever u'd like. # # Warning: Could be called multiple times if user logout/login again. + # Desktop environment available. + echo pass | gnome_keyring_unlock } # watch out! does your user have access to target directory? -# okay to stay inside lc_init() or outside, okay if files/vimrc doesn't exist yet. +# lc_fsmap works inside lc_xxx() or outside, also works even if files/vimrc doesn't exist yet. lc_fsmap files/vimrc $HOME/.vimrc diff --git a/linuxconf b/linuxconf index c76f136df81d0552663e2e63273573193297d670..3c9b4b3a43cbefe158f6359a8025122e1c46b38b 100755 --- a/linuxconf +++ b/linuxconf @@ -15,18 +15,24 @@ function lc_die () { function lc_bgrun () { # Usage: lc_bgrun /var/log/your.log sslocal -s xxx -p 'hello world my password' -l xxx --xxx # Usage: lc_bgrun /var/log/your.log auto_restart frpc -c my_server.ini - # v202504-1 + # Usage: lc_bgrun /dev/null every 1h curl https://example-ddns.com/api + # v202504-2 local logF="$1" shift local cmd="$1" shift + local t=1 + if [ "$cmd" = every ]; then + t="$1" + cmd=auto_restart + fi if [ "$cmd" = auto_restart ] && [ ! -f /tmp/.auto_restart ]; then - echo IyEvYmluL2Jhc2gKCndoaWxlIHRydWU7IGRvCiAgICAiJEAiCiAgICBbWyAkPyA9IDEzMCBdXSAmJiBicmVhawogICAgc2xlZXAgMQpkb25lCg== | base64 -d > /tmp/.auto_restart + echo IyEvYmluL2Jhc2gKd2hpbGUgdHJ1ZTsgZG8KIiRAIgpbWyAkPyA9IDEzMCBdXSAmJiBicmVhawpzbGVlcCAiJHQiCmRvbmUK | base64 -d > /tmp/.auto_restart chmod ugo+rx /tmp/.auto_restart cmd=/tmp/.auto_restart fi echo "[$(date --utc)] EXEC $cmd $@" >> "$logF" - nohup "$cmd" "$@" >> "$logF" 2>&1 & disown + t="$t" nohup "$cmd" "$@" >> "$logF" 2>&1 & disown return $? } @@ -245,7 +251,7 @@ function lci_install_login_hook () { fi } -lci_version=0.2.2 +lci_version=0.2.3 subcommand="$1" if [[ "$subcommand" != register ]] && [[ "$subcommand" != "" ]]; then [[ ! -f /etc/linuxconf.conf ]] && lc_die "Please run '$0 register <path/to/masterconf.sh>' at least once" @@ -258,9 +264,6 @@ if [[ "$subcommand" = register ]]; then lci_install_login_hook || lc_die "failed to install on_login hook" lci_init_if_needed lci_startup_if_needed -elif [[ "$subcommand" = _cron ]]; then - # TODO: implement cron. with crontab or same systemd service? - : elif [[ "$subcommand" = _startup ]]; then lci_startup_if_needed elif [[ "$subcommand" = _startup_all ]]; then