Update crontab entries on source update
This commit is contained in:
parent
7737db1883
commit
ff13c845eb
|
@ -46,9 +46,11 @@ intake
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
Each key under `action` defines an action that can be taken for the source. A minimal `intake.json` must contain a `fetch` action with an `exe`. All other configs are optional.
|
Each key under `action` defines an action that can be taken for the source. An action must contain `exe` and may contain `args`. A source must have a `fetch` action.
|
||||||
|
|
||||||
The `fetch` action is executed by `intake update`. All other actions are executable with `intake action`. `intake crontab` will create a crontab entry for each source with a `cron` config defined. The value of `cron` is the crontab spec according to which the source should be updated.
|
Each key under `env` defines an environment variable that will be set when actions are executed.
|
||||||
|
|
||||||
|
If `cron` is present, it must define a crontab schedule. Intake will automatically create crontab entries to update each source according to its cron schedule.
|
||||||
|
|
||||||
## Interface for source programs
|
## Interface for source programs
|
||||||
|
|
||||||
|
@ -66,7 +68,7 @@ The `fetch` action is used to fetch the current state of the feed source. It rec
|
||||||
|
|
||||||
An item must have a key under `action` with that action's name to support executing that action for that item. The value under that key may be any JSON structure used to manage the item-specific state.
|
An item must have a key under `action` with that action's name to support executing that action for that item. The value under that key may be any JSON structure used to manage the item-specific state.
|
||||||
|
|
||||||
All encoding is done with UTF-8. If an item cannot be parsed or the exit code of the process is nonzero, Intake will consider the action to be a failure. No items or other feed changes will happen as a result of a failed action, except for changes to `state` done by the action process.
|
All input and output is treated as UTF-8. If an item cannot be parsed or the exit code of the process is nonzero, Intake will consider the action to be a failure. No items or other feed changes will happen as a result of a failed action, except for changes to `state` done by the action process.
|
||||||
|
|
||||||
## Top-level item fields
|
## Top-level item fields
|
||||||
|
|
||||||
|
|
|
@ -67,19 +67,21 @@
|
||||||
|
|
||||||
# Include some demo instructions
|
# Include some demo instructions
|
||||||
environment.etc.issue.text = ''
|
environment.etc.issue.text = ''
|
||||||
|
###
|
||||||
# Welcome to the intake demo! Log in as `alice` with password `alpha` to begin.
|
# Welcome to the intake demo! Log in as `alice` with password `alpha` to begin.
|
||||||
|
#
|
||||||
# Exit the VM with ctrl+a x, or switch to the qemu console with ctrl+a c and `quit`.
|
# Exit the VM with ctrl+a x, or switch to the qemu console with ctrl+a c and `quit`.
|
||||||
|
###
|
||||||
'';
|
'';
|
||||||
users.motd = ''
|
users.motd = ''
|
||||||
|
###
|
||||||
# To set a password for the web interface, run `intake passwd` and set a password.
|
# To set a password for the web interface, run `intake passwd` and set a password.
|
||||||
|
#
|
||||||
# Within this demo VM, the main intake entry point can be found at localhost:8080. This is also exposed on the host machine at localhost:5234. After you set a password, navigate to localhost:5234 on your host machine and log in to see the web interface.
|
# Within this demo VM, the main intake entry point can be found at localhost:8080. This is also exposed on the host machine at localhost:5234. After you set a password, navigate to localhost:5234 on your host machine and log in to see the web interface.
|
||||||
|
#
|
||||||
# Try updating the currenttime source by running `intake update -s currenttime`. You should see a new item after refreshing the source's feed.
|
# Try updating the `echo` source by running `intake update -s echo`. You should see a new item after refreshing the source's feed. This source uses `env` source configuration, so use `intake edit -s echo` or the web interface to change the message, then update the source again.
|
||||||
|
#
|
||||||
# The `echo` source demonstrates the use of `env` source configuration. Try changing the message in the web interface or via `intake edit -s echo`, then updating the source.
|
# Updating a source will also trigger intake to update the user crontab. If you run `crontab -l`, you should see that the `currenttime` source has a crontab entry. You can change this source's cron schedule in the source config.
|
||||||
|
###
|
||||||
'';
|
'';
|
||||||
}
|
}
|
||||||
|
|
|
@ -19,6 +19,7 @@ from flask import (
|
||||||
)
|
)
|
||||||
|
|
||||||
from intake.core import intake_data_dir
|
from intake.core import intake_data_dir
|
||||||
|
from intake.crontab import update_crontab_entries
|
||||||
from intake.source import LocalSource, execute_action, Item
|
from intake.source import LocalSource, execute_action, Item
|
||||||
|
|
||||||
# Globals
|
# Globals
|
||||||
|
@ -273,6 +274,7 @@ def source_edit(name):
|
||||||
error_message, config = _parse_source_config(config_str)
|
error_message, config = _parse_source_config(config_str)
|
||||||
if not error_message:
|
if not error_message:
|
||||||
source.save_config(config)
|
source.save_config(config)
|
||||||
|
update_crontab_entries(data_path)
|
||||||
return redirect(url_for("root"))
|
return redirect(url_for("root"))
|
||||||
|
|
||||||
# For GET, load the config
|
# For GET, load the config
|
||||||
|
|
|
@ -82,6 +82,7 @@ def cmd_edit(cmd_args):
|
||||||
return 0
|
return 0
|
||||||
|
|
||||||
tmp_path.replace(source.source_path / "intake.json")
|
tmp_path.replace(source.source_path / "intake.json")
|
||||||
|
update_crontab_entries(data_path)
|
||||||
break
|
break
|
||||||
|
|
||||||
return 0
|
return 0
|
||||||
|
@ -297,24 +298,6 @@ def cmd_passwd(cmd_args):
|
||||||
return 0
|
return 0
|
||||||
|
|
||||||
|
|
||||||
def cmd_crontab(cmd_args):
|
|
||||||
"""Update cron with configured source cron entries."""
|
|
||||||
parser = argparse.ArgumentParser(
|
|
||||||
prog="intake crontab",
|
|
||||||
description=cmd_crontab.__doc__,
|
|
||||||
)
|
|
||||||
parser.add_argument(
|
|
||||||
"--data",
|
|
||||||
"-d",
|
|
||||||
help="Path to the intake data directory containing source directories",
|
|
||||||
)
|
|
||||||
args = parser.parse_args(cmd_args)
|
|
||||||
|
|
||||||
data_path: Path = Path(args.data) if args.data else intake_data_dir()
|
|
||||||
update_crontab_entries(data_path)
|
|
||||||
return 0
|
|
||||||
|
|
||||||
|
|
||||||
def cmd_run(cmd_args):
|
def cmd_run(cmd_args):
|
||||||
"""Run the default Flask server."""
|
"""Run the default Flask server."""
|
||||||
parser = argparse.ArgumentParser(
|
parser = argparse.ArgumentParser(
|
||||||
|
|
|
@ -112,6 +112,8 @@ in {
|
||||||
systemd.services =
|
systemd.services =
|
||||||
let
|
let
|
||||||
runScript = userName: pkgs.writeShellScript "intake-run.sh" ''
|
runScript = userName: pkgs.writeShellScript "intake-run.sh" ''
|
||||||
|
# Add the setuid wrapper directory so `crontab` is accessible
|
||||||
|
export PATH="${config.security.wrapperDir}:$PATH"
|
||||||
${pythonEnv}/bin/intake run -d /home/${userName}/.local/share/intake --port ${toString userPort.${userName}}
|
${pythonEnv}/bin/intake run -d /home/${userName}/.local/share/intake --port ${toString userPort.${userName}}
|
||||||
'';
|
'';
|
||||||
# systemd service definition for a single user, given `services.intake.users.userName` = `userCfg`
|
# systemd service definition for a single user, given `services.intake.users.userName` = `userCfg`
|
||||||
|
|
Loading…
Reference in New Issue