ACC SHELL
/**
* File: modules/Modem.ycp
* Package: Network configuration
* Summary: Modem data
* Authors: Michal Svec <msvec@suse.cz>
*
* $Id: Modem.ycp 56143 2009-03-16 13:50:56Z mzugec $
*
* Representation of the configuration of modem.
* Input and output routines.
*/
{
module "Modem";
textdomain "network";
import "NetworkInterfaces";
import "NetworkService";
import "Provider";
import "Progress";
import "Routing";
import "Service";
import "Summary";
import "Message";
import "SuSEFirewall4Network";
include "network/complex.ycp";
/* general stuff */
global string description = "";
global string type = "";
global string device = "";
global string unique = "";
global string startmode = "manual";
global boolean usercontrol = false;
global list<string> Requires = [];
/**
* Hotplug type ("" if not hot pluggable)
*/
global string hotplug = "";
/* modem settings */
global string Init1 = "ATZ";
global string Init2 = "AT Q0 V1 E1 S0=0 &C1 &D2 +FCLASS=0";
global string Init3 = "";
global integer BaudRate = 57600;
global boolean PulseDial = true;
global boolean Carrier = true;
global boolean Speaker = true;
global string Device = "/dev/modem";
global string DialPrefix = "";
global string DialPrefixRx = "";
global string PPPDoptions = "";
/* something already proposed? */
global boolean proposal_valid = false;
/*--------------*/
/* PRIVATE DATA */
/**
* Hardware information
* @see ReadHardware
*/
list<map> Hardware = [];
/**
* Abort function
* return boolean return true if abort
*/
global block<boolean> AbortFunction = nil;
/**
* Data was modified?
*/
boolean modified = false;
/**
* Which operation is pending?
*/
symbol operation = nil;
const boolean write_only = false;
/*------------------*/
/* GLOBAL FUNCTIONS */
/**
* Data was modified?
* @return true if modified
*/
global define boolean Modified() {
y2debug("modified=%1",modified);
return modified;
}
include "network/hardware.ycp";
include "network/routines.ycp";
include "network/runtime.ycp";
/**
* Read all network settings from the SCR
* @return true on success
*/
global define boolean Read() {
/* Read dialog caption */
string caption = _("Initializing Modem Configuration");
integer steps = 5;
integer sl = 0; /* 1000; /* TESTING */
sleep(sl);
Progress::New(caption, " ", steps, [
/* Progress stage 1/4 */
_("Detect modems"),
/* Progress stage 2/4 */
_("Read current configuration"),
/* Progress stage 3/4 */
_("Read firewall settings"),
/* Progress stage 4/4 */
_("Read providers"),
/* Progress stage 5/5 */
_("Read routing"),
], [], "");
if(Abort()) return false;
// check the environment
if(!Confirm::MustBeRoot()) return false;
/* Progress step 1/4 */
ProgressNextStage(_("Detecting modems..."));
Hardware = ReadHardware("modem");
sleep(sl);
if(Abort()) return false;
/* Progress step 2/4 */
ProgressNextStage(_("Reading current configuration..."));
NetworkInterfaces::Read();
NetworkService::Read ();
sleep(sl);
if(Abort()) return false;
/* Progress step 3/4 */
ProgressNextStage(_("Reading firewall settings..."));
boolean progress_orig = Progress::set (false);
SuSEFirewall4Network::Read ();
Progress::set (progress_orig);
sleep(sl);
if(Abort()) return false;
/* Progress step 4/4 */
ProgressNextStage(_("Reading providers..."));
Provider::Read();
sleep(sl);
if(Abort()) return false;
/* Progress step 4/4 */
ProgressNextStage(_("Reading routes..."));
if(!proposal_valid) {
Routing::Read();
}
sleep(sl);
if(Abort()) return false;
/* Final progress step */
ProgressNextStage(_("Finished"));
sleep(sl);
if(Abort()) return false;
modified = false;
return true;
}
/**
* Update the SCR according to network settings
* @return true on success
*/
global define boolean Write() {
if(!modified && !Provider::Modified("modem")) return true;
y2milestone("Writing configuration");
/* Write dialog caption */
string caption = _("Saving Modem Configuration");
integer steps = 6;
integer sl = 0; /* 1000; /* TESTING */
sleep(sl);
Progress::New(caption, " ", steps, [
/* Progress stage 1/6 */
_("Write configuration"),
/* Progress stage 2/6 */
_("Write firewall settings"),
/* Progress stage 3/6 */
_("Write providers"),
/* Progress stage 4/6 */
_("Set up network services"),
/* Progress stage 5/5 */
_("Set up smpppd"),
/* Progress stage 9 */
_("Activate network services"),
], [], "");
if(Abort()) return false;
/* Progress step 1/6 */
ProgressNextStage(_("Writing configuration..."));
NetworkInterfaces::Write("modem");
NetworkInterfaces::UpdateModemSymlink();
sleep(sl);
if(Abort()) return false;
/* Progress step 2/6 */
ProgressNextStage(_("Writing firewall settings..."));
boolean progress_orig = Progress::set (false);
SuSEFirewall4Network::Write ();
Progress::set (progress_orig);
sleep(sl);
if(Abort()) return false;
/* Progress step 3/6 */
ProgressNextStage(_("Writing providers..."));
Provider::Write("modem");
sleep(sl);
if(Abort()) return false;
/* Progress step 4/6 */
ProgressNextStage(_("Setting up network services..."));
NetworkService::EnableDisable ();
sleep(sl);
/* Setup SL modem */
if(contains(Requires, "smartlink-softmodem")) {
if(!PackageSystem::CheckAndInstallPackages(Requires))
Popup::Error(sformat("%1 : smartlink-softmodem",Message::CannotContinueWithoutPackagesInstalled()));
y2milestone("Setting up smartlink-softmodem ...");
Service::Stop("slmodemd");
string country = Provider::GetCountry ();
map keys = (map) eval(SCR::Read(.target.yast2, "modem-t35-keys.ycp"));
country = keys[country]:"";
y2milestone("Setting up slmodemd (%1)", country);
if(country != nil && country != "") {
SCR::Write(.sysconfig.slmodemd.SLMODEMD_COUNTRY, toupper(country));
SCR::Write(.sysconfig.slmodemd, nil);
}
Service::Enable("slmodemd");
Service::Start("slmodemd");
}
if(Abort()) return false;
/* Progress step 5/6 */
ProgressNextStage(_("Setting up smpppd(8)..."));
SetupSMPPPD(true);
sleep(sl);
if(Abort()) return false;
/* Progress step 9 */
ProgressNextStage(_("Activating network services..."));
if(!write_only) {
// NetworkModules::HwUp (); // this is needed too
NetworkService::StartStop ();
}
sleep(sl);
if(Abort()) return false;
/* Final progress step */
ProgressNextStage(_("Finished"));
sleep(sl);
if(Abort()) return false;
return true;
}
/**
* Select the given device
* @param dev device to select ("" for new device, default values)
* @return true if success
*/
global define boolean Select(string dev) {
y2debug("dev=%1", dev);
// defaults for a new device
map devmap = $[
"USERCONTROL": "yes",
];
/* dev=="" -> Add */
if(dev == "") {
type = "modem";
device = sformat("modem%1", NetworkInterfaces::GetFreeDevice(type));
}
/* dev!="" -> Edit */
else {
string typ = NetworkInterfaces::device_type(dev);
string num = NetworkInterfaces::device_num(dev);
NetworkInterfaces::Edit(dev);
devmap = NetworkInterfaces::Current;
type = typ;
device = sformat("%1%2",type,num);
// FIXME: why is this here? operation = `edit;
}
/* general stuff */
description = BuildDescription (type, device, devmap, Hardware);
unique = devmap["UDI"]:"";
startmode = devmap["STARTMODE"]:"manual";
usercontrol = devmap["USERCONTROL"]:"no" == "yes";
/* modem settings */
Init1 = devmap["INIT1"]:"ATZ";
Init2 = devmap["INIT2"]:"AT Q0 V1 E1 S0=0 &C1 &D2 +FCLASS=0";
Init3 = devmap["INIT3"]:"";
BaudRate = tointeger(devmap["SPEED"]:"57600");
/* PulseDial = devmap["DIALCOMMAND"]:"ATDT" == "ATDP";
* better heuristics: */
PulseDial = filterchars(devmap["DIALCOMMAND"]:"ATDT", "P") == "P";
Speaker = devmap["INIT8"]:"ATM1" == "ATM1";
Carrier = devmap["INIT9"]:"" == "";
Device = devmap["MODEM_DEVICE"]:"/dev/modem";
DialPrefix = devmap["DIALPREFIX"]:"";
DialPrefixRx = devmap["DIALPREFIXREGEX"]:"";
PPPDoptions = devmap["PPPD_OPTIONS"]:"";
/* provider settings */
Provider::Name = devmap["PROVIDER"]:"";
return true;
}
/**
* Add a new device
* @return true if success
*/
global define boolean Add() {
operation = nil;
if(Select("") != true) return false;
NetworkInterfaces::Add();
operation = `add;
return true;
}
/**
* Edit the given device
* @param name device to edit
* @return true if success
*/
global define boolean Edit(string name) {
operation = nil;
if(Select(name) != true) return false;
NetworkInterfaces::Edit(name);
operation = `edit;
return true;
}
/**
* Delete the given device
* @param name device to delete
* @return true if success
*/
global define boolean Delete(string name) {
operation = nil;
if(Select(name) != true) return false;
NetworkInterfaces::Delete(name);
operation = `delete;
return true;
}
/**
* Commit the pending operation
* @return true if success
*/
global define boolean Commit() {
y2debug("Commit(%1)",operation);
if(operation == `add || operation == `edit) {
map<string,any> newdev = $[
"STARTMODE" : startmode,
"USERCONTROL": usercontrol? "yes": "no",
"BOOTPROTO" : "none",
"UDI" : unique,
"NAME" : description,
"INIT1" : Init1,
"INIT2" : Init2,
"INIT3" : Init3,
"SPEED" : sformat("%1", BaudRate),
"INIT8" : Speaker ? "ATM1" : "ATM0",
"INIT9" : Carrier ? "" : "ATX3",
"DIALCOMMAND" : PulseDial ? "ATDP" : "ATDT",
"MODEM_DEVICE" : Device,
"DIALPREFIX" : DialPrefix,
"DIALPREFIXREGEX" : DialPrefixRx,
"PROVIDER" : Provider::Name,
// "PROVIDER_NAME" : Provider::Current["PROVIDER"]:"",
"PPPD_OPTIONS" : PPPDoptions,
];
NetworkInterfaces::Name = device;
NetworkInterfaces::Current = newdev;
NetworkInterfaces::Commit();
}
else if(operation == `delete) {
NetworkInterfaces::Commit();
}
else {
y2error("Unknown operation: %1", operation);
return false;
}
modified = true;
operation = nil;
return true;
}
/**
* Import data
* @param settings settings to be imported
* @return true on success
*/
global define boolean Import(map settings) {
NetworkInterfaces::Import("modem", settings["devices"]:$[]);
Provider::Import("modem", settings["providers"]:$[]);
return true;
}
/**
* Export data
* @return dumped settings (later acceptable by Import())
*/
global define map Export() {
return $[
"devices" : NetworkInterfaces::Export("modem"),
"providers" : Provider::Export("modem"),
];
}
/**
* Create a textual summary and a list of unconfigured devices
* @param split split configured and unconfigured?
* @return summary of the current configuration
*/
global define list Summary(boolean split) {
return BuildSummary("modem", Hardware, split, false);
}
/**
* Create an overview table with all configured devices
* @return table items
*/
global define list Overview() {
list res = BuildOverview("modem", Hardware);
return maplist( term card, (list<term>)res, {
string id = card[0,0]:"";
list desc = [ card[1]:"", card[2]:"", card[3]:""];
return $[
"id":id,
"rich_descr": card[4]: (desc[1]:_("Unknown")),
"table_descr":desc
];
});
}
global define list<map<string,any> > Unconfigured () {
return BuildUnconfigured ("modem", Hardware);
}
/**
* Select the hardware component
* @param which index of the component
*/
global define void SelectHW(integer which) {
map sel = SelectHardware(Hardware, which);
Init1 = sel["init1"]:"";
Init2 = sel["init2"]:"";
Device = sel["device_name"]:"";
BaudRate = sel["speed"]:57600;
PPPDoptions = sel["pppd_options"]:"";
type = "modem";
}
global list<string> Packages() {
if(size(NetworkInterfaces::List("modem")) < 1) return [];
return ["smpppd"];
}
/**
* Used to see whether we are in the process of adding a new interface
* or editing an existing one.
* @return adding?
*/
global boolean Adding () {
return operation == `add;
}
/* EOF */
}
ACC SHELL 2018