/* * This file is part of Cockpit. * * Copyright (C) 2017 Red Hat, Inc. * * Cockpit is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or * (at your option) any later version. * * Cockpit is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with Cockpit; If not, see . */ "use strict"; import '../lib/patternfly/patternfly-cockpit.scss'; import './recordings.css'; let cockpit = require("cockpit"); let React = require("react"); let ReactDOM = require("react-dom"); let json = require('comment-json'); let ini = require('ini'); class Config extends React.Component { constructor(props) { super(props); this.handleInputChange = this.handleInputChange.bind(this); this.handleSubmit = this.handleSubmit.bind(this); this.setConfig = this.setConfig.bind(this); this.fileReadFailed = this.fileReadFailed.bind(this); this.readConfig = this.readConfig.bind(this); this.file = null; this.config = null; this.state = { config_loaded: false, file_error: false, submitting: "none", shell: "", notice: "", latency: "", payload: "", log_input: false, log_output: true, log_window: true, limit_rate: "", limit_burst: "", limit_action: "", file_path: "", syslog_facility: "", syslog_priority: "", journal_augment: "", journal_priority: "", writer: "", }; } handleInputChange(e) { const value = e.target.type === 'checkbox' ? e.target.checked : e.target.value; const name = e.target.name; const state = {}; state[name] = value; this.setState(state); } handleSubmit(event) { this.setState({submitting:"block"}); let config = { shell: this.state.shell, notice: this.state.notice, latency: parseInt(this.state.latency), payload: parseInt(this.state.payload), log: { input: this.state.log_input, output: this.state.log_output, window: this.state.log_window, }, limit: { rate: parseInt(this.state.limit_rate), burst: parseInt(this.state.limit_burst), action: this.state.limit_action, }, file: { path: this.state.file_path, }, syslog: { facility: this.state.syslog_facility, priority: this.state.syslog_priority, }, journal: { priority: this.state.journal_priority, augment: this.state.journal_augment }, writer: this.state.writer }; this.file.replace(config).done(() => { this.setState({submitting:"none"}); }) .fail((error) => { console.log(error); }); event.preventDefault(); } setConfig(data) { delete data.configuration; delete data.args; var flattenObject = function(ob) { var toReturn = {}; for (var i in ob) { if (!ob.hasOwnProperty(i)) continue; if ((typeof ob[i]) == 'object') { var flatObject = flattenObject(ob[i]); for (var x in flatObject) { if (!flatObject.hasOwnProperty(x)) continue; toReturn[i + '_' + x] = flatObject[x]; } } else { toReturn[i] = ob[i]; } } return toReturn; }; let state = flattenObject(data); state.config_loaded = true; this.setState(state); } getConfig() { let proc = cockpit.spawn(["tlog-rec-session", "--configuration"]); proc.stream((data) => { this.setConfig(json.parse(data, null, true)); proc.close(); }); proc.fail((fail) => { console.log(fail); this.readConfig(); }); } readConfig() { let parseFunc = function(data) { return json.parse(data, null, true); }; let stringifyFunc = function(data) { return json.stringify(data, null, true); }; // needed for cockpit.file usage let syntax_object = { parse: parseFunc, stringify: stringifyFunc, }; this.file = cockpit.file("/etc/tlog/tlog-rec-session.conf", { syntax: syntax_object, superuser: true, }); /* let promise = this.file.read(); promise.done((data) => { if (data === null) { this.fileReadFailed(); } }).fail((data) => { this.fileReadFailed(data); }); */ } fileReadFailed(reason) { console.log(reason); this.setState({file_error: reason}); } componentDidMount() { this.getConfig(); this.readConfig(); } render() { if (this.state.config_loaded === false && this.state.file_error === false) { return (
Loading
); } else if (this.state.config_loaded === true && this.state.file_error === false) { return (
Saving...
); } else { return (

There is no configuration file of tlog present in your system.

Please, check the /etc/tlog/tlog-rec-session.conf or if tlog is installed.

{this.state.file_error}

); } } } class SssdConfig extends React.Component { constructor(props) { super(props); this.handleSubmit = this.handleSubmit.bind(this); this.handleInputChange = this.handleInputChange.bind(this); this.setConfig = this.setConfig.bind(this); this.confSave = this.confSave.bind(this); this.file = null; this.state = { scope: "", users: "", groups: "", submitting: "none", }; } confSave(obj) { this.setState({submitting:"block"}); this.file.replace(obj).done(() => { cockpit.spawn(["chmod", "600", "/etc/sssd/conf.d/sssd-session-recording.conf"], { "superuser": "require" }).done(() => { cockpit.spawn(["systemctl", "restart", "sssd"], { "superuser": "require" }).done(() => { this.setState({submitting:"none"}); }) .fail((data) => console.log(data)); }) .fail((data) => console.log(data)); }); } handleInputChange(e) { const value = e.target.type === 'checkbox' ? e.target.checked : e.target.value; const name = e.target.name; const state = {}; state[name] = value; this.setState(state); } setConfig(data) { if (data === null) { const obj = {}; obj.session_recording = {}; obj.session_recording.scope = "none"; this.confSave(obj); } else { const config = {...data['session_recording']}; this.setState(config); } } componentDidMount() { let syntax_object = { parse: ini.parse, stringify: ini.stringify }; this.file = cockpit.file("/etc/sssd/conf.d/sssd-session-recording.conf", { syntax: syntax_object, superuser: true, }); let promise = this.file.read(); promise.done(() => this.file.watch(this.setConfig)); promise.fail(function(error) { console.log(error); }); } handleSubmit(e) { const obj = {}; obj.session_recording = {}; obj.session_recording.scope = this.state.scope; obj.session_recording.users = this.state.users; obj.session_recording.groups = this.state.groups; this.confSave(obj); e.preventDefault(); } render() { return (
{this.state.scope === "some" && } {this.state.scope === "some" && }
Saving...
); } } class ConfigView extends React.Component { render() { const goBack = () => { cockpit.jump(['session-recording']); }; return (
  1. Session Recording
  2. Configuration
General Configuration
SSSD Configuration
); } } ReactDOM.render(, document.getElementById('view'));