1c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu//
2c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// Copyright (C) 2012 The Android Open Source Project
3c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu//
4c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// Licensed under the Apache License, Version 2.0 (the "License");
5c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// you may not use this file except in compliance with the License.
6c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// You may obtain a copy of the License at
7c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu//
8c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu//      http://www.apache.org/licenses/LICENSE-2.0
9c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu//
10c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// Unless required by applicable law or agreed to in writing, software
11c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// distributed under the License is distributed on an "AS IS" BASIS,
12c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// See the License for the specific language governing permissions and
14c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// limitations under the License.
15c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu//
1675897df1154ac38b7a4512a687241ad6a197ee40Paul Stewart
177eb028996873abf5813bbedbff35df0cb78580cbmukesh agrawal#include <errno.h>
187eb028996873abf5813bbedbff35df0cb78580cbmukesh agrawal#include <stdio.h>
1975897df1154ac38b7a4512a687241ad6a197ee40Paul Stewart#include <time.h>
20b893bed2d3dd98a1fe761b078dcd41fe7bffb0beGaurav Shah#include <unistd.h>
21b893bed2d3dd98a1fe761b078dcd41fe7bffb0beGaurav Shah
2275897df1154ac38b7a4512a687241ad6a197ee40Paul Stewart#include <string>
238f317b600a218afe05f2d73c59204bb98269a950mukesh agrawal#include <vector>
2475897df1154ac38b7a4512a687241ad6a197ee40Paul Stewart
257370e4f0e15e9d08a37a90eb9b28d41885a5d977Samuel Tan#include <base/bind.h>
26ee929b7ab2a89bbf2d1aecf85bbd49e53fbea059Chris Masone#include <base/command_line.h>
27a0ddf46e466bd4ba3d20952f0a6988c680c1af14Ben Chan#include <base/files/file_path.h>
28782cdcea789d76a7ad7802cf9410b14a2399c0a9Garret Kelly#include <base/strings/string_number_conversions.h>
29a0ddf46e466bd4ba3d20952f0a6988c680c1af14Ben Chan#include <base/strings/string_split.h>
3003e6719bae1e0903d94853b896673a033196bcf5Alex Vakulenko#include <brillo/minijail/minijail.h>
3103e6719bae1e0903d94853b896673a033196bcf5Alex Vakulenko#include <brillo/syslog_logging.h>
32ee929b7ab2a89bbf2d1aecf85bbd49e53fbea059Chris Masone
3359b397b6ac7fa39edf26d8e0ff2ecac6ac8ebc5bSamuel Tan#include "shill/daemon_task.h"
345a2097c0f4db1704dd5b7b0b874b669bb21c42adJason Simmons#include "shill/error.h"
35b691efd71561246065eae3cdd73a96ca1b8a528dChristopher Wiley#include "shill/logging.h"
36633ac6f0d56a62f8fd21ba7d9a15818fe080fb2fDarin Petkov#include "shill/shill_config.h"
3760ea15d40a3ad77536e01f2bb780181aa9c3c084Samuel Tan#include "shill/shill_daemon.h"
38dde57ef146d3868130cd8597e805b42395440c9aPeter Qiu#include "shill/technology.h"
39dde57ef146d3868130cd8597e805b42395440c9aPeter Qiu
400e1cdeae24dd678a5fe27c840802582c0ca45ec0Albert Chaulkusing base::FilePath;
4175897df1154ac38b7a4512a687241ad6a197ee40Paul Stewartusing std::string;
428f317b600a218afe05f2d73c59204bb98269a950mukesh agrawalusing std::vector;
4375897df1154ac38b7a4512a687241ad6a197ee40Paul Stewart
44ee929b7ab2a89bbf2d1aecf85bbd49e53fbea059Chris Masonenamespace switches {
4575897df1154ac38b7a4512a687241ad6a197ee40Paul Stewart
46ee929b7ab2a89bbf2d1aecf85bbd49e53fbea059Chris Masone// Don't daemon()ize; run in foreground.
47ee929b7ab2a89bbf2d1aecf85bbd49e53fbea059Chris Masonestatic const char kForeground[] = "foreground";
488f317b600a218afe05f2d73c59204bb98269a950mukesh agrawal// Don't attempt to manage these devices.
498f317b600a218afe05f2d73c59204bb98269a950mukesh agrawalstatic const char kDeviceBlackList[] = "device-black-list";
50c1d447354db29b83262c7db0857baa84e05e0c2aChristopher Grant// Manage only these devices.
51c1d447354db29b83262c7db0857baa84e05e0c2aChristopher Grantstatic const char kDeviceWhiteList[] = "device-white-list";
5283d625655edbc7c35fc436b8b8fe744886d0aae1Paul Stewart// Ignore Ethernet-like devices that don't have any driver information.
5383d625655edbc7c35fc436b8b8fe744886d0aae1Paul Stewartstatic const char kIgnoreUnknownEthernet[] = "ignore-unknown-ethernet";
5410e9e4e93537a0673524d47535cbf0f723470a0dPaul Stewart// Technologies to enable for portal check at startup.
5510e9e4e93537a0673524d47535cbf0f723470a0dPaul Stewartstatic const char kPortalList[] = "portal-list";
561d499ed2d5eede24f55c7f6b8aaba06136ef4f22Peter Qiu// When in passive mode, Shill will not manage any devices by default.
571d499ed2d5eede24f55c7f6b8aaba06136ef4f22Peter Qiu// Remote service can instruct Shill to manage/unmanage devices through
581d499ed2d5eede24f55c7f6b8aaba06136ef4f22Peter Qiu// org.chromium.flimflam.Manager's ClaimInterface/ReleaseInterface APIs.
591d499ed2d5eede24f55c7f6b8aaba06136ef4f22Peter Qiustatic const char kPassiveMode[] = "passive-mode";
605a2097c0f4db1704dd5b7b0b874b669bb21c42adJason Simmons// Default priority order of the technologies.
611ce231c71932200e4d02c71567f8e93788120781Paul Stewartstatic const char kTechnologyOrder[] = "default-technology-order";
62c5f89d131e5b03f448b73fd02d16cab30e438521Garret Kelly// Comma-separated list of DNS servers to prepend to the resolver list.
63c5f89d131e5b03f448b73fd02d16cab30e438521Garret Kellystatic const char kPrependDNSServers[] = "prepend-dns-servers";
64782cdcea789d76a7ad7802cf9410b14a2399c0a9Garret Kelly// The minimum MTU value that will be respected in DHCP responses.
65782cdcea789d76a7ad7802cf9410b14a2399c0a9Garret Kellystatic const char kMinimumMTU[] = "minimum-mtu";
6608add488849f90600a5657a6f54f4dbc34701b8fMatthew Wein// Accept hostname from the DHCP server for the specified devices.
6708add488849f90600a5657a6f54f4dbc34701b8fMatthew Wein// eg. eth0 or eth*
6808add488849f90600a5657a6f54f4dbc34701b8fMatthew Weinstatic const char kAcceptHostnameFrom[] = "accept-hostname-from";
69d48fa0c5531e2102d4f537e81b9f92afc2d60955Peter Qiu#ifndef DISABLE_DHCPV6
70d48fa0c5531e2102d4f537e81b9f92afc2d60955Peter Qiu// List of devices to enable DHCPv6.
71d48fa0c5531e2102d4f537e81b9f92afc2d60955Peter Qiustatic const char kDhcpv6EnabledDevices[] = "dhcpv6-enabled-devices";
72d48fa0c5531e2102d4f537e81b9f92afc2d60955Peter Qiu#endif  // DISABLE_DHCPV6
73ee929b7ab2a89bbf2d1aecf85bbd49e53fbea059Chris Masone// Flag that causes shill to show the help message and exit.
74ee929b7ab2a89bbf2d1aecf85bbd49e53fbea059Chris Masonestatic const char kHelp[] = "help";
75ee929b7ab2a89bbf2d1aecf85bbd49e53fbea059Chris Masone
76ee929b7ab2a89bbf2d1aecf85bbd49e53fbea059Chris Masone// The help message shown if help flag is passed to the program.
77ee929b7ab2a89bbf2d1aecf85bbd49e53fbea059Chris Masonestatic const char kHelpMessage[] = "\n"
78ee929b7ab2a89bbf2d1aecf85bbd49e53fbea059Chris Masone    "Available Switches: \n"
79ee929b7ab2a89bbf2d1aecf85bbd49e53fbea059Chris Masone    "  --foreground\n"
80ee929b7ab2a89bbf2d1aecf85bbd49e53fbea059Chris Masone    "    Don\'t daemon()ize; run in foreground.\n"
818f317b600a218afe05f2d73c59204bb98269a950mukesh agrawal    "  --device-black-list=device1,device2\n"
828f317b600a218afe05f2d73c59204bb98269a950mukesh agrawal    "    Do not manage devices named device1 or device2\n"
83c1d447354db29b83262c7db0857baa84e05e0c2aChristopher Grant    "  --device-white-list=device1,device2\n"
84c1d447354db29b83262c7db0857baa84e05e0c2aChristopher Grant    "    Manage only devices named device1 and device2\n"
8583d625655edbc7c35fc436b8b8fe744886d0aae1Paul Stewart    "  --ignore-unknown-ethernet\n"
8683d625655edbc7c35fc436b8b8fe744886d0aae1Paul Stewart    "    Ignore Ethernet-like devices that do not report a driver\n"
877ccc8197eb210aaf7f658008ef22d38c0a70fa17Chris Masone    "  --log-level=N\n"
88156e73f6800eca070d2e3c2a7d40c281c77ecac1Ben Chan    "    Logging level:\n"
89156e73f6800eca070d2e3c2a7d40c281c77ecac1Ben Chan    "      0 = LOG(INFO), 1 = LOG(WARNING), 2 = LOG(ERROR),\n"
90156e73f6800eca070d2e3c2a7d40c281c77ecac1Ben Chan    "      -1 = SLOG(..., 1), -2 = SLOG(..., 2), etc.\n"
91156e73f6800eca070d2e3c2a7d40c281c77ecac1Ben Chan    "  --log-scopes=\"*scope1+scope2\".\n"
92156e73f6800eca070d2e3c2a7d40c281c77ecac1Ben Chan    "    Scopes to enable for SLOG()-based logging.\n"
9310e9e4e93537a0673524d47535cbf0f723470a0dPaul Stewart    "  --portal-list=technology1,technology2\n"
941d499ed2d5eede24f55c7f6b8aaba06136ef4f22Peter Qiu    "    Specify technologies to perform portal detection on at startup.\n"
951d499ed2d5eede24f55c7f6b8aaba06136ef4f22Peter Qiu    "  --passive-mode\n"
965a2097c0f4db1704dd5b7b0b874b669bb21c42adJason Simmons    "    Do not manage any devices by default\n"
975a2097c0f4db1704dd5b7b0b874b669bb21c42adJason Simmons    "  --default-technology-order=technology1,technology2\n"
98c5f89d131e5b03f448b73fd02d16cab30e438521Garret Kelly    "    Specify the default priority order of the technologies.\n"
99c5f89d131e5b03f448b73fd02d16cab30e438521Garret Kelly    "  --prepend-dns-servers=server1,server2,...\n"
100782cdcea789d76a7ad7802cf9410b14a2399c0a9Garret Kelly    "    Prepend the provided DNS servers to the resolver list.\n"
10108add488849f90600a5657a6f54f4dbc34701b8fMatthew Wein    "  --accept-hostname-from=eth0 or --accept-hostname-from=eth*\n"
10208add488849f90600a5657a6f54f4dbc34701b8fMatthew Wein    "    Accept a hostname from the DHCP server for the matching devices.\n"
103d48fa0c5531e2102d4f537e81b9f92afc2d60955Peter Qiu#ifndef DISABLE_DHCPV6
104d48fa0c5531e2102d4f537e81b9f92afc2d60955Peter Qiu    "  --dhcpv6-enabled-devices=device1,device2\n"
105d48fa0c5531e2102d4f537e81b9f92afc2d60955Peter Qiu    "    Enable DHCPv6 for devices named device1 and device2\n"
106d48fa0c5531e2102d4f537e81b9f92afc2d60955Peter Qiu#endif  // DISABLE_DHCPV6
107782cdcea789d76a7ad7802cf9410b14a2399c0a9Garret Kelly    "  --minimum-mtu=mtu\n"
108782cdcea789d76a7ad7802cf9410b14a2399c0a9Garret Kelly    "    Set the minimum value to respect as the MTU from DHCP responses.\n";
109ee929b7ab2a89bbf2d1aecf85bbd49e53fbea059Chris Masone}  // namespace switches
11075897df1154ac38b7a4512a687241ad6a197ee40Paul Stewart
1117eb028996873abf5813bbedbff35df0cb78580cbmukesh agrawalnamespace {
1127eb028996873abf5813bbedbff35df0cb78580cbmukesh agrawal
113ddce70da26f410225a977bc7d9f651f279a5a5b4Peter Qiu#if !defined(__ANDROID__)
1141a212a6b98b22ad1d69652bb26a9e94138635476Paul Stewartconst char* kLoggerCommand = "/usr/bin/logger";
1151a212a6b98b22ad1d69652bb26a9e94138635476Paul Stewartconst char* kLoggerUser = "syslog";
116ddce70da26f410225a977bc7d9f651f279a5a5b4Peter Qiu#endif  // __ANDROID__
117ddce70da26f410225a977bc7d9f651f279a5a5b4Peter Qiu
1181a212a6b98b22ad1d69652bb26a9e94138635476Paul Stewartconst char* kDefaultTechnologyOrder = "vpn,ethernet,wifi,wimax,cellular";
1197eb028996873abf5813bbedbff35df0cb78580cbmukesh agrawal
1207eb028996873abf5813bbedbff35df0cb78580cbmukesh agrawal}  // namespace
1217eb028996873abf5813bbedbff35df0cb78580cbmukesh agrawal
122ee929b7ab2a89bbf2d1aecf85bbd49e53fbea059Chris Masone// Always logs to the syslog and logs to stderr if
123ee929b7ab2a89bbf2d1aecf85bbd49e53fbea059Chris Masone// we are running in the foreground.
124dde57ef146d3868130cd8597e805b42395440c9aPeter Qiuvoid SetupLogging(bool foreground, const char* daemon_name) {
125ee929b7ab2a89bbf2d1aecf85bbd49e53fbea059Chris Masone  int log_flags = 0;
12603e6719bae1e0903d94853b896673a033196bcf5Alex Vakulenko  log_flags |= brillo::kLogToSyslog;
12703e6719bae1e0903d94853b896673a033196bcf5Alex Vakulenko  log_flags |= brillo::kLogHeader;
128ee929b7ab2a89bbf2d1aecf85bbd49e53fbea059Chris Masone  if (foreground) {
12903e6719bae1e0903d94853b896673a033196bcf5Alex Vakulenko    log_flags |= brillo::kLogToStderr;
13075897df1154ac38b7a4512a687241ad6a197ee40Paul Stewart  }
13103e6719bae1e0903d94853b896673a033196bcf5Alex Vakulenko  brillo::InitLog(log_flags);
1327eb028996873abf5813bbedbff35df0cb78580cbmukesh agrawal
133ddce70da26f410225a977bc7d9f651f279a5a5b4Peter Qiu#if !defined(__ANDROID__)
134ddce70da26f410225a977bc7d9f651f279a5a5b4Peter Qiu  // Logger utility doesn't exist on Android, so do not run it on Android.
135ddce70da26f410225a977bc7d9f651f279a5a5b4Peter Qiu  // TODO(zqiu): add support to redirect stderr logs from child processes
136ddce70da26f410225a977bc7d9f651f279a5a5b4Peter Qiu  // to Android logging facility.
1377eb028996873abf5813bbedbff35df0cb78580cbmukesh agrawal  if (!foreground) {
1381a212a6b98b22ad1d69652bb26a9e94138635476Paul Stewart    vector<char*> logger_command_line;
1397eb028996873abf5813bbedbff35df0cb78580cbmukesh agrawal    int logger_stdin_fd;
1401a212a6b98b22ad1d69652bb26a9e94138635476Paul Stewart    logger_command_line.push_back(const_cast<char*>(kLoggerCommand));
1411a212a6b98b22ad1d69652bb26a9e94138635476Paul Stewart    logger_command_line.push_back(const_cast<char*>("--priority"));
1421a212a6b98b22ad1d69652bb26a9e94138635476Paul Stewart    logger_command_line.push_back(const_cast<char*>("daemon.err"));
1431a212a6b98b22ad1d69652bb26a9e94138635476Paul Stewart    logger_command_line.push_back(const_cast<char*>("--tag"));
144dde57ef146d3868130cd8597e805b42395440c9aPeter Qiu    logger_command_line.push_back(const_cast<char*>(daemon_name));
145cc225ef3b77b5e098cc12c661a947e1737480777Ben Chan    logger_command_line.push_back(nullptr);
1468c1706f09b15e6140b89b9a49cd599d8050380d5Jorge Lucangeli Obes
14703e6719bae1e0903d94853b896673a033196bcf5Alex Vakulenko    brillo::Minijail* minijail = brillo::Minijail::GetInstance();
1481a212a6b98b22ad1d69652bb26a9e94138635476Paul Stewart    struct minijail* jail = minijail->New();
149e4c6aff3afa8eec213691e6ab1941d6dd6463ce0Utkarsh Sanghi    minijail->DropRoot(jail, kLoggerUser, kLoggerUser);
1508c1706f09b15e6140b89b9a49cd599d8050380d5Jorge Lucangeli Obes
151cc225ef3b77b5e098cc12c661a947e1737480777Ben Chan    if (!minijail->RunPipeAndDestroy(jail, logger_command_line, nullptr,
152cc225ef3b77b5e098cc12c661a947e1737480777Ben Chan                                     &logger_stdin_fd)) {
1537eb028996873abf5813bbedbff35df0cb78580cbmukesh agrawal      LOG(ERROR) << "Unable to spawn logger. "
1547eb028996873abf5813bbedbff35df0cb78580cbmukesh agrawal                 << "Writes to stderr will be discarded.";
1557eb028996873abf5813bbedbff35df0cb78580cbmukesh agrawal      return;
1567eb028996873abf5813bbedbff35df0cb78580cbmukesh agrawal    }
1577eb028996873abf5813bbedbff35df0cb78580cbmukesh agrawal
1587eb028996873abf5813bbedbff35df0cb78580cbmukesh agrawal    // Note that we don't set O_CLOEXEC here. This means that stderr
1597eb028996873abf5813bbedbff35df0cb78580cbmukesh agrawal    // from any child processes will, by default, be logged to syslog.
1607eb028996873abf5813bbedbff35df0cb78580cbmukesh agrawal    if (dup2(logger_stdin_fd, fileno(stderr)) != fileno(stderr)) {
161af19870a5717a0a9f05c4fd957d4a05f48b8b090Alex Deymo      PLOG(ERROR) << "Failed to redirect stderr to syslog";
1627eb028996873abf5813bbedbff35df0cb78580cbmukesh agrawal    }
1637eb028996873abf5813bbedbff35df0cb78580cbmukesh agrawal    close(logger_stdin_fd);
1647eb028996873abf5813bbedbff35df0cb78580cbmukesh agrawal  }
165ddce70da26f410225a977bc7d9f651f279a5a5b4Peter Qiu#endif  // __ANDROID__
166ee929b7ab2a89bbf2d1aecf85bbd49e53fbea059Chris Masone}
167ee929b7ab2a89bbf2d1aecf85bbd49e53fbea059Chris Masone
168dde57ef146d3868130cd8597e805b42395440c9aPeter Qiuvoid OnStartup(const char *daemon_name, base::CommandLine* cl) {
169dde57ef146d3868130cd8597e805b42395440c9aPeter Qiu  SetupLogging(cl->HasSwitch(switches::kForeground), daemon_name);
170dde57ef146d3868130cd8597e805b42395440c9aPeter Qiu  shill::SetLogLevelFromCommandLine(cl);
1711271d6828b226f951fa69ed9927fa7c9a358318aThieu Le}
1721271d6828b226f951fa69ed9927fa7c9a358318aThieu Le
173ee929b7ab2a89bbf2d1aecf85bbd49e53fbea059Chris Masoneint main(int argc, char** argv) {
174127f2565a985650963d6109fc3a32c3da6a17d32Alex Vakulenko  base::CommandLine::Init(argc, argv);
175127f2565a985650963d6109fc3a32c3da6a17d32Alex Vakulenko  base::CommandLine* cl = base::CommandLine::ForCurrentProcess();
176ee929b7ab2a89bbf2d1aecf85bbd49e53fbea059Chris Masone
177ee929b7ab2a89bbf2d1aecf85bbd49e53fbea059Chris Masone  if (cl->HasSwitch(switches::kHelp)) {
178ee929b7ab2a89bbf2d1aecf85bbd49e53fbea059Chris Masone    LOG(INFO) << switches::kHelpMessage;
179ee929b7ab2a89bbf2d1aecf85bbd49e53fbea059Chris Masone    return 0;
180ee929b7ab2a89bbf2d1aecf85bbd49e53fbea059Chris Masone  }
181b716325521ef1229161198dcb6917b1dfc0a78ccPaul Stewart
18259b397b6ac7fa39edf26d8e0ff2ecac6ac8ebc5bSamuel Tan  shill::DaemonTask::Settings settings;
1831ce231c71932200e4d02c71567f8e93788120781Paul Stewart  if (cl->HasSwitch(switches::kTechnologyOrder)) {
1845a2097c0f4db1704dd5b7b0b874b669bb21c42adJason Simmons    shill::Error error;
1855a2097c0f4db1704dd5b7b0b874b669bb21c42adJason Simmons    string order_flag = cl->GetSwitchValueASCII(
1861ce231c71932200e4d02c71567f8e93788120781Paul Stewart        switches::kTechnologyOrder);
1871ce231c71932200e4d02c71567f8e93788120781Paul Stewart    vector<shill::Technology::Identifier> test_order_vector;
1881ce231c71932200e4d02c71567f8e93788120781Paul Stewart    if (shill::Technology::GetTechnologyVectorFromString(
1891ce231c71932200e4d02c71567f8e93788120781Paul Stewart        order_flag, &test_order_vector, &error)) {
1901ce231c71932200e4d02c71567f8e93788120781Paul Stewart      settings.default_technology_order = order_flag;
1911ce231c71932200e4d02c71567f8e93788120781Paul Stewart    }  else {
1925a2097c0f4db1704dd5b7b0b874b669bb21c42adJason Simmons      LOG(ERROR) << "Invalid default technology order: [" << order_flag
1935a2097c0f4db1704dd5b7b0b874b669bb21c42adJason Simmons                 << "] Error: " << error.message();
1945a2097c0f4db1704dd5b7b0b874b669bb21c42adJason Simmons    }
1955a2097c0f4db1704dd5b7b0b874b669bb21c42adJason Simmons  }
1961ce231c71932200e4d02c71567f8e93788120781Paul Stewart  if (settings.default_technology_order.empty()) {
1971ce231c71932200e4d02c71567f8e93788120781Paul Stewart    settings.default_technology_order = kDefaultTechnologyOrder;
1985a2097c0f4db1704dd5b7b0b874b669bb21c42adJason Simmons  }
1995a2097c0f4db1704dd5b7b0b874b669bb21c42adJason Simmons
2008f317b600a218afe05f2d73c59204bb98269a950mukesh agrawal  if (cl->HasSwitch(switches::kDeviceBlackList)) {
2013a62e235646ec19bee71e8dbee5208282dcd13b5Alex Vakulenko    settings.device_blacklist = base::SplitString(
2023a62e235646ec19bee71e8dbee5208282dcd13b5Alex Vakulenko        cl->GetSwitchValueASCII(switches::kDeviceBlackList), ",",
2033a62e235646ec19bee71e8dbee5208282dcd13b5Alex Vakulenko        base::TRIM_WHITESPACE, base::SPLIT_WANT_ALL);
2048f317b600a218afe05f2d73c59204bb98269a950mukesh agrawal  }
2051271d6828b226f951fa69ed9927fa7c9a358318aThieu Le
206c1d447354db29b83262c7db0857baa84e05e0c2aChristopher Grant  if (cl->HasSwitch(switches::kDeviceWhiteList)) {
2073a62e235646ec19bee71e8dbee5208282dcd13b5Alex Vakulenko    settings.device_whitelist = base::SplitString(
2083a62e235646ec19bee71e8dbee5208282dcd13b5Alex Vakulenko        cl->GetSwitchValueASCII(switches::kDeviceWhiteList), ",",
2093a62e235646ec19bee71e8dbee5208282dcd13b5Alex Vakulenko        base::TRIM_WHITESPACE, base::SPLIT_WANT_ALL);
210c1d447354db29b83262c7db0857baa84e05e0c2aChristopher Grant  }
211c1d447354db29b83262c7db0857baa84e05e0c2aChristopher Grant
2121ce231c71932200e4d02c71567f8e93788120781Paul Stewart  settings.ignore_unknown_ethernet =
2131ce231c71932200e4d02c71567f8e93788120781Paul Stewart      cl->HasSwitch(switches::kIgnoreUnknownEthernet);
21483d625655edbc7c35fc436b8b8fe744886d0aae1Paul Stewart
21510e9e4e93537a0673524d47535cbf0f723470a0dPaul Stewart  if (cl->HasSwitch(switches::kPortalList)) {
2161ce231c71932200e4d02c71567f8e93788120781Paul Stewart    settings.use_portal_list = true;
2171ce231c71932200e4d02c71567f8e93788120781Paul Stewart    settings.portal_list = cl->GetSwitchValueASCII(switches::kPortalList);
21810e9e4e93537a0673524d47535cbf0f723470a0dPaul Stewart  }
21910e9e4e93537a0673524d47535cbf0f723470a0dPaul Stewart
2201ce231c71932200e4d02c71567f8e93788120781Paul Stewart  settings.passive_mode = cl->HasSwitch(switches::kPassiveMode);
2211d499ed2d5eede24f55c7f6b8aaba06136ef4f22Peter Qiu
222c5f89d131e5b03f448b73fd02d16cab30e438521Garret Kelly  if (cl->HasSwitch(switches::kPrependDNSServers)) {
2231ce231c71932200e4d02c71567f8e93788120781Paul Stewart    settings.prepend_dns_servers =
2241ce231c71932200e4d02c71567f8e93788120781Paul Stewart        cl->GetSwitchValueASCII(switches::kPrependDNSServers);
225c5f89d131e5b03f448b73fd02d16cab30e438521Garret Kelly  }
226c5f89d131e5b03f448b73fd02d16cab30e438521Garret Kelly
227782cdcea789d76a7ad7802cf9410b14a2399c0a9Garret Kelly  if (cl->HasSwitch(switches::kMinimumMTU)) {
228782cdcea789d76a7ad7802cf9410b14a2399c0a9Garret Kelly    int mtu;
229782cdcea789d76a7ad7802cf9410b14a2399c0a9Garret Kelly    std::string value = cl->GetSwitchValueASCII(switches::kMinimumMTU);
230782cdcea789d76a7ad7802cf9410b14a2399c0a9Garret Kelly    if (!base::StringToInt(value, &mtu)) {
231782cdcea789d76a7ad7802cf9410b14a2399c0a9Garret Kelly      LOG(FATAL) << "Could not convert '" << value << "' to integer.";
232782cdcea789d76a7ad7802cf9410b14a2399c0a9Garret Kelly    }
2331ce231c71932200e4d02c71567f8e93788120781Paul Stewart    settings.minimum_mtu = mtu;
234782cdcea789d76a7ad7802cf9410b14a2399c0a9Garret Kelly  }
235782cdcea789d76a7ad7802cf9410b14a2399c0a9Garret Kelly
23608add488849f90600a5657a6f54f4dbc34701b8fMatthew Wein  if (cl->HasSwitch(switches::kAcceptHostnameFrom)) {
2371ce231c71932200e4d02c71567f8e93788120781Paul Stewart    settings.accept_hostname_from =
2381ce231c71932200e4d02c71567f8e93788120781Paul Stewart        cl->GetSwitchValueASCII(switches::kAcceptHostnameFrom);
23908add488849f90600a5657a6f54f4dbc34701b8fMatthew Wein  }
24008add488849f90600a5657a6f54f4dbc34701b8fMatthew Wein
241d48fa0c5531e2102d4f537e81b9f92afc2d60955Peter Qiu#ifndef DISABLE_DHCPV6
242d48fa0c5531e2102d4f537e81b9f92afc2d60955Peter Qiu  if (cl->HasSwitch(switches::kDhcpv6EnabledDevices)) {
2433a62e235646ec19bee71e8dbee5208282dcd13b5Alex Vakulenko    settings.dhcpv6_enabled_devices = base::SplitString(
2443a62e235646ec19bee71e8dbee5208282dcd13b5Alex Vakulenko        cl->GetSwitchValueASCII(switches::kDhcpv6EnabledDevices), ",",
2453a62e235646ec19bee71e8dbee5208282dcd13b5Alex Vakulenko        base::TRIM_WHITESPACE, base::SPLIT_WANT_ALL);
246d48fa0c5531e2102d4f537e81b9f92afc2d60955Peter Qiu  }
247d48fa0c5531e2102d4f537e81b9f92afc2d60955Peter Qiu#endif  // DISABLE_DHCPV6
248d48fa0c5531e2102d4f537e81b9f92afc2d60955Peter Qiu
2491ce231c71932200e4d02c71567f8e93788120781Paul Stewart  shill::Config config;
2501ce231c71932200e4d02c71567f8e93788120781Paul Stewart
25160ea15d40a3ad77536e01f2bb780181aa9c3c084Samuel Tan  shill::ShillDaemon daemon(base::Bind(&OnStartup, argv[0], cl), settings,
25260ea15d40a3ad77536e01f2bb780181aa9c3c084Samuel Tan                            &config);
253646c7e891789ea8abadd9e88bdd625d8bea2536dSamuel Tan  daemon.Run();
25475897df1154ac38b7a4512a687241ad6a197ee40Paul Stewart
2558dc5e7b99920ab79d2bee7f99fec9fa5765fda68Paul Stewart  LOG(INFO) << "Process exiting.";
2568dc5e7b99920ab79d2bee7f99fec9fa5765fda68Paul Stewart
25775897df1154ac38b7a4512a687241ad6a197ee40Paul Stewart  return 0;
25875897df1154ac38b7a4512a687241ad6a197ee40Paul Stewart}
259