updated config
This commit is contained in:
1 parent
ced999e944
commit
cb6052a9d3
19 files changed
+331
-155
No files matched your search
@@ -1,6 +1,7 @@
|
||||
/* See LICENSE file for copyright and license details. */
|
||||
#include <ifaddrs.h>
|
||||
#include <netdb.h>
|
||||
#include <net/if.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#if defined(__OpenBSD__)
|
||||
@@ -59,3 +60,28 @@ ipv6(const char *interface)
|
||||
{
|
||||
return ip(interface, AF_INET6);
|
||||
}
|
||||
|
||||
const char *
|
||||
up(const char *interface)
|
||||
{
|
||||
struct ifaddrs *ifaddr, *ifa;
|
||||
|
||||
if (getifaddrs(&ifaddr) < 0) {
|
||||
warn("getifaddrs:");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
for (ifa = ifaddr; ifa != NULL; ifa = ifa->ifa_next) {
|
||||
if (!ifa->ifa_addr)
|
||||
continue;
|
||||
|
||||
if (!strcmp(ifa->ifa_name, interface)) {
|
||||
freeifaddrs(ifaddr);
|
||||
return ifa->ifa_flags & IFF_UP ? "up" : "down";
|
||||
}
|
||||
}
|
||||
|
||||
freeifaddrs(ifaddr);
|
||||
|
||||
return NULL;
|
||||
}
|
||||
@@ -29,8 +29,8 @@ get_layout(char *syms, int grp_num)
|
||||
int grp;
|
||||
|
||||
layout = NULL;
|
||||
tok = strtok(syms, "+:");
|
||||
for (grp = 0; tok && grp <= grp_num; tok = strtok(NULL, "+:")) {
|
||||
tok = strtok(syms, "+:_");
|
||||
for (grp = 0; tok && grp <= grp_num; tok = strtok(NULL, "+:_")) {
|
||||
if (!valid_layout_or_variant(tok)) {
|
||||
continue;
|
||||
} else if (strlen(tok) == 1 && isdigit(tok[0])) {
|
||||
|
||||
+38
-23
@@ -11,36 +11,45 @@
|
||||
ram_free(const char *unused)
|
||||
{
|
||||
uintmax_t free;
|
||||
FILE *fp;
|
||||
|
||||
if (pscanf("/proc/meminfo",
|
||||
"MemTotal: %ju kB\n"
|
||||
"MemFree: %ju kB\n"
|
||||
"MemAvailable: %ju kB\n",
|
||||
&free, &free, &free) != 3)
|
||||
if (!(fp = fopen("/proc/meminfo", "r")))
|
||||
return NULL;
|
||||
|
||||
if (lscanf(fp, "MemFree:", "%ju kB", &free) != 1) {
|
||||
fclose(fp);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
fclose(fp);
|
||||
return fmt_human(free * 1024, 1024);
|
||||
}
|
||||
|
||||
const char *
|
||||
ram_perc(const char *unused)
|
||||
{
|
||||
uintmax_t total, free, buffers, cached;
|
||||
uintmax_t total, free, buffers, cached, shmem, sreclaimable;
|
||||
int percent;
|
||||
FILE *fp;
|
||||
|
||||
if (pscanf("/proc/meminfo",
|
||||
"MemTotal: %ju kB\n"
|
||||
"MemFree: %ju kB\n"
|
||||
"MemAvailable: %ju kB\n"
|
||||
"Buffers: %ju kB\n"
|
||||
"Cached: %ju kB\n",
|
||||
&total, &free, &buffers, &buffers, &cached) != 5)
|
||||
if (!(fp = fopen("/proc/meminfo", "r")))
|
||||
return NULL;
|
||||
|
||||
if (lscanf(fp, "MemTotal:", "%ju kB", &total) != 1 ||
|
||||
lscanf(fp, "MemFree:", "%ju kB", &free) != 1 ||
|
||||
lscanf(fp, "Buffers:", "%ju kB", &buffers) != 1 ||
|
||||
lscanf(fp, "Cached:", "%ju kB", &cached) != 1 ||
|
||||
lscanf(fp, "Shmem:", "%ju kB", &shmem) != 1 ||
|
||||
lscanf(fp, "SReclaimable:", "%ju kB", &sreclaimable) != 1) {
|
||||
fclose(fp);
|
||||
return NULL;
|
||||
}
|
||||
fclose(fp);
|
||||
|
||||
if (total == 0)
|
||||
return NULL;
|
||||
|
||||
percent = 100 * ((total - free) - (buffers + cached)) / total;
|
||||
percent = 100 * (total - free - buffers - cached - sreclaimable + shmem) / total;
|
||||
return bprintf("%d", percent);
|
||||
}
|
||||
|
||||
@@ -59,18 +68,24 @@
|
||||
const char *
|
||||
ram_used(const char *unused)
|
||||
{
|
||||
uintmax_t total, free, buffers, cached, used;
|
||||
uintmax_t total, free, buffers, cached, used, shmem, sreclaimable;
|
||||
FILE *fp;
|
||||
|
||||
if (pscanf("/proc/meminfo",
|
||||
"MemTotal: %ju kB\n"
|
||||
"MemFree: %ju kB\n"
|
||||
"MemAvailable: %ju kB\n"
|
||||
"Buffers: %ju kB\n"
|
||||
"Cached: %ju kB\n",
|
||||
&total, &free, &buffers, &buffers, &cached) != 5)
|
||||
if (!(fp = fopen("/proc/meminfo", "r")))
|
||||
return NULL;
|
||||
|
||||
used = (total - free - buffers - cached);
|
||||
if (lscanf(fp, "MemTotal:", "%ju kB", &total) != 1 ||
|
||||
lscanf(fp, "MemFree:", "%ju kB", &free) != 1 ||
|
||||
lscanf(fp, "Buffers:", "%ju kB", &buffers) != 1 ||
|
||||
lscanf(fp, "Cached:", "%ju kB", &cached) != 1 ||
|
||||
lscanf(fp, "Shmem:", "%ju kB", &shmem) != 1 ||
|
||||
lscanf(fp, "SReclaimable:", "%ju kB", &sreclaimable) != 1) {
|
||||
fclose(fp);
|
||||
return NULL;
|
||||
}
|
||||
fclose(fp);
|
||||
|
||||
used = total - free - buffers - cached - sreclaimable + shmem;
|
||||
return fmt_human(used * 1024, 1024);
|
||||
}
|
||||
#elif defined(__OpenBSD__)
|
||||
|
||||
@@ -1,21 +0,0 @@
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "../slstatus.h"
|
||||
#include "../util.h"
|
||||
|
||||
#define WTTR_TEMP "/tmp/wttr"
|
||||
|
||||
const char *weather()
|
||||
{
|
||||
FILE *wttr = fopen(WTTR_TEMP, "r");
|
||||
char temp[10];
|
||||
memset(&temp, '\0', 10);
|
||||
|
||||
fgets(temp, 10, wttr);
|
||||
fclose(wttr);
|
||||
|
||||
temp[strlen(temp)-1] = '\0';
|
||||
|
||||
return bprintf("%s", temp);
|
||||
}
|
||||
+204
-58
@@ -15,86 +15,232 @@
|
||||
(2 * (rssi + 100)))
|
||||
|
||||
#if defined(__linux__)
|
||||
#include <limits.h>
|
||||
#include <linux/wireless.h>
|
||||
#include <stdint.h>
|
||||
#include <net/if.h>
|
||||
#include <linux/netlink.h>
|
||||
#include <linux/genetlink.h>
|
||||
#include <linux/nl80211.h>
|
||||
|
||||
#define NET_OPERSTATE "/sys/class/net/%s/operstate"
|
||||
static int nlsock = -1;
|
||||
static uint32_t seq = 1;
|
||||
static char resp[4096];
|
||||
|
||||
const char *
|
||||
wifi_perc(const char *interface)
|
||||
static char *
|
||||
findattr(int attr, const char *p, const char *e, size_t *len)
|
||||
{
|
||||
int cur;
|
||||
size_t i;
|
||||
char *p, *datastart;
|
||||
char path[PATH_MAX];
|
||||
char status[5];
|
||||
FILE *fp;
|
||||
|
||||
if (esnprintf(path, sizeof(path), NET_OPERSTATE, interface) < 0)
|
||||
return NULL;
|
||||
if (!(fp = fopen(path, "r"))) {
|
||||
warn("fopen '%s':", path);
|
||||
return NULL;
|
||||
while (p < e) {
|
||||
struct nlattr nla;
|
||||
memcpy(&nla, p, sizeof(nla));
|
||||
if (nla.nla_type == attr) {
|
||||
*len = nla.nla_len - NLA_HDRLEN;
|
||||
return (char *)(p + NLA_HDRLEN);
|
||||
}
|
||||
p += NLA_ALIGN(nla.nla_len);
|
||||
}
|
||||
p = fgets(status, 5, fp);
|
||||
fclose(fp);
|
||||
if (!p || strcmp(status, "up\n") != 0)
|
||||
return NULL;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (!(fp = fopen("/proc/net/wireless", "r"))) {
|
||||
warn("fopen '/proc/net/wireless':");
|
||||
return NULL;
|
||||
static uint16_t
|
||||
nl80211fam(void)
|
||||
{
|
||||
static const char family[] = "nl80211";
|
||||
static uint16_t id;
|
||||
ssize_t r;
|
||||
size_t len;
|
||||
char ctrl[NLMSG_HDRLEN+GENL_HDRLEN+NLA_HDRLEN+NLA_ALIGN(sizeof(family))] = {0}, *p = ctrl;
|
||||
|
||||
if (id)
|
||||
return id;
|
||||
|
||||
memcpy(p, &(struct nlmsghdr){
|
||||
.nlmsg_len = sizeof(ctrl),
|
||||
.nlmsg_type = GENL_ID_CTRL,
|
||||
.nlmsg_flags = NLM_F_REQUEST,
|
||||
.nlmsg_seq = seq++,
|
||||
.nlmsg_pid = 0,
|
||||
}, sizeof(struct nlmsghdr));
|
||||
p += NLMSG_HDRLEN;
|
||||
memcpy(p, &(struct genlmsghdr){
|
||||
.cmd = CTRL_CMD_GETFAMILY,
|
||||
.version = 1,
|
||||
}, sizeof(struct genlmsghdr));
|
||||
p += GENL_HDRLEN;
|
||||
memcpy(p, &(struct nlattr){
|
||||
.nla_len = NLA_HDRLEN+sizeof(family),
|
||||
.nla_type = CTRL_ATTR_FAMILY_NAME,
|
||||
}, sizeof(struct nlattr));
|
||||
p += NLA_HDRLEN;
|
||||
memcpy(p, family, sizeof(family));
|
||||
|
||||
if (nlsock < 0)
|
||||
nlsock = socket(AF_NETLINK, SOCK_RAW, NETLINK_GENERIC);
|
||||
if (nlsock < 0) {
|
||||
warn("socket 'AF_NETLINK':");
|
||||
return 0;
|
||||
}
|
||||
if (send(nlsock, ctrl, sizeof(ctrl), 0) != sizeof(ctrl)) {
|
||||
warn("send 'AF_NETLINK':");
|
||||
return 0;
|
||||
}
|
||||
r = recv(nlsock, resp, sizeof(resp), 0);
|
||||
if (r < 0) {
|
||||
warn("recv 'AF_NETLINK':");
|
||||
return 0;
|
||||
}
|
||||
if ((size_t)r <= sizeof(ctrl))
|
||||
return 0;
|
||||
p = findattr(CTRL_ATTR_FAMILY_ID, resp + sizeof(ctrl), resp + r, &len);
|
||||
if (p && len == 2)
|
||||
memcpy(&id, p, 2);
|
||||
|
||||
for (i = 0; i < 3; i++)
|
||||
if (!(p = fgets(buf, sizeof(buf) - 1, fp)))
|
||||
break;
|
||||
return id;
|
||||
}
|
||||
|
||||
fclose(fp);
|
||||
if (i < 2 || !p)
|
||||
return NULL;
|
||||
static int
|
||||
ifindex(const char *interface)
|
||||
{
|
||||
static struct ifreq ifr;
|
||||
static int ifsock = -1;
|
||||
|
||||
if (!(datastart = strstr(buf, interface)))
|
||||
return NULL;
|
||||
|
||||
datastart = (datastart+(strlen(interface)+1));
|
||||
sscanf(datastart + 1, " %*d %d %*d %*d\t\t %*d\t "
|
||||
"%*d\t\t%*d\t\t %*d\t %*d\t\t %*d", &cur);
|
||||
|
||||
/* 70 is the max of /proc/net/wireless */
|
||||
return bprintf("%d", (int)((float)cur / 70 * 100));
|
||||
if (ifsock < 0)
|
||||
ifsock = socket(AF_UNIX, SOCK_DGRAM, 0);
|
||||
if (ifsock < 0) {
|
||||
warn("socket 'AF_UNIX':");
|
||||
return -1;
|
||||
}
|
||||
if (strcmp(ifr.ifr_name, interface) != 0) {
|
||||
strcpy(ifr.ifr_name, interface);
|
||||
if (ioctl(ifsock, SIOCGIFINDEX, &ifr) != 0) {
|
||||
warn("ioctl 'SIOCGIFINDEX':");
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
return ifr.ifr_ifindex;
|
||||
}
|
||||
|
||||
const char *
|
||||
wifi_essid(const char *interface)
|
||||
{
|
||||
static char id[IW_ESSID_MAX_SIZE+1];
|
||||
int sockfd;
|
||||
struct iwreq wreq;
|
||||
|
||||
memset(&wreq, 0, sizeof(struct iwreq));
|
||||
wreq.u.essid.length = IW_ESSID_MAX_SIZE+1;
|
||||
if (esnprintf(wreq.ifr_name, sizeof(wreq.ifr_name), "%s",
|
||||
interface) < 0)
|
||||
return NULL;
|
||||
|
||||
if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
|
||||
warn("socket 'AF_INET':");
|
||||
uint16_t fam = nl80211fam();
|
||||
ssize_t r;
|
||||
size_t len;
|
||||
char req[NLMSG_HDRLEN+GENL_HDRLEN+NLA_HDRLEN+NLA_ALIGN(4)] = {0}, *p = req;
|
||||
int idx = ifindex(interface);
|
||||
if (!fam) {
|
||||
fprintf(stderr, "nl80211 family not found\n");
|
||||
return NULL;
|
||||
}
|
||||
wreq.u.essid.pointer = id;
|
||||
if (ioctl(sockfd,SIOCGIWESSID, &wreq) < 0) {
|
||||
warn("ioctl 'SIOCGIWESSID':");
|
||||
close(sockfd);
|
||||
if (idx < 0) {
|
||||
fprintf(stderr, "interface %s not found\n", interface);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
close(sockfd);
|
||||
memcpy(p, &(struct nlmsghdr){
|
||||
.nlmsg_len = sizeof(req),
|
||||
.nlmsg_type = fam,
|
||||
.nlmsg_flags = NLM_F_REQUEST,
|
||||
.nlmsg_seq = seq++,
|
||||
.nlmsg_pid = 0,
|
||||
}, sizeof(struct nlmsghdr));
|
||||
p += NLMSG_HDRLEN;
|
||||
memcpy(p, &(struct genlmsghdr){
|
||||
.cmd = NL80211_CMD_GET_INTERFACE,
|
||||
.version = 1,
|
||||
}, sizeof(struct genlmsghdr));
|
||||
p += GENL_HDRLEN;
|
||||
memcpy(p, &(struct nlattr){
|
||||
.nla_len = NLA_HDRLEN+4,
|
||||
.nla_type = NL80211_ATTR_IFINDEX,
|
||||
}, sizeof(struct nlattr));
|
||||
p += NLA_HDRLEN;
|
||||
memcpy(p, &(uint32_t){idx}, 4);
|
||||
|
||||
if (!strcmp(id, ""))
|
||||
if (send(nlsock, req, sizeof(req), 0) != sizeof(req)) {
|
||||
warn("send 'AF_NETLINK':");
|
||||
return NULL;
|
||||
}
|
||||
r = recv(nlsock, resp, sizeof(resp), 0);
|
||||
if (r < 0) {
|
||||
warn("recv 'AF_NETLINK':");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return id;
|
||||
if ((size_t)r <= NLMSG_HDRLEN + GENL_HDRLEN)
|
||||
return NULL;
|
||||
p = findattr(NL80211_ATTR_SSID, resp + NLMSG_HDRLEN + GENL_HDRLEN, resp + r, &len);
|
||||
if (p)
|
||||
p[len] = 0;
|
||||
|
||||
return p;
|
||||
}
|
||||
|
||||
const char *
|
||||
wifi_perc(const char *interface)
|
||||
{
|
||||
static char strength[4];
|
||||
struct nlmsghdr hdr;
|
||||
uint16_t fam = nl80211fam();
|
||||
ssize_t r;
|
||||
size_t len;
|
||||
char req[NLMSG_HDRLEN + GENL_HDRLEN + NLA_HDRLEN + NLA_ALIGN(4)] = {0}, *p = req, *e;
|
||||
int idx = ifindex(interface);
|
||||
|
||||
if (idx < 0) {
|
||||
fprintf(stderr, "interface %s not found\n", interface);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
memcpy(p, &(struct nlmsghdr){
|
||||
.nlmsg_len = sizeof(req),
|
||||
.nlmsg_type = fam,
|
||||
.nlmsg_flags = NLM_F_REQUEST|NLM_F_DUMP,
|
||||
.nlmsg_seq = seq++,
|
||||
.nlmsg_pid = 0,
|
||||
}, sizeof(struct nlmsghdr));
|
||||
p += NLMSG_HDRLEN;
|
||||
memcpy(p, &(struct genlmsghdr){
|
||||
.cmd = NL80211_CMD_GET_STATION,
|
||||
.version = 1,
|
||||
}, sizeof(struct genlmsghdr));
|
||||
p += GENL_HDRLEN;
|
||||
memcpy(p, &(struct nlattr){
|
||||
.nla_len = NLA_HDRLEN + 4,
|
||||
.nla_type = NL80211_ATTR_IFINDEX,
|
||||
}, sizeof(struct nlattr));
|
||||
p += NLA_HDRLEN;
|
||||
memcpy(p, &idx, 4);
|
||||
|
||||
if (send(nlsock, req, sizeof(req), 0) != sizeof(req)) {
|
||||
warn("send 'AF_NETLINK':");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
*strength = 0;
|
||||
while (1) {
|
||||
r = recv(nlsock, resp, sizeof(resp), 0);
|
||||
if (r < 0) {
|
||||
warn("recv 'AF_NETLINK':");
|
||||
return NULL;
|
||||
}
|
||||
if ((size_t)r < sizeof(hdr))
|
||||
return NULL;
|
||||
|
||||
for (p = resp; p != resp + r && (size_t)(resp + r-p) >= sizeof(hdr); p = e) {
|
||||
memcpy(&hdr, p, sizeof(hdr));
|
||||
e = resp + r - p < hdr.nlmsg_len ? resp + r : p + hdr.nlmsg_len;
|
||||
|
||||
if (!*strength && hdr.nlmsg_len > NLMSG_HDRLEN+GENL_HDRLEN) {
|
||||
p += NLMSG_HDRLEN+GENL_HDRLEN;
|
||||
p = findattr(NL80211_ATTR_STA_INFO, p, e, &len);
|
||||
if (p)
|
||||
p = findattr(NL80211_STA_INFO_SIGNAL_AVG, p, e, &len);
|
||||
if (p && len == 1)
|
||||
snprintf(strength, sizeof(strength), "%d", RSSI_TO_PERC(*p));
|
||||
}
|
||||
if (hdr.nlmsg_type == NLMSG_DONE)
|
||||
return *strength ? strength : NULL;
|
||||
}
|
||||
}
|
||||
}
|
||||
#elif defined(__OpenBSD__)
|
||||
#include <net/if.h>
|
||||
|
||||
@@ -1,28 +0,0 @@
|
||||
#!/bin/bash
|
||||
|
||||
# This function checks if wttr.in is available before the weather info is fetched
|
||||
ck_curl() {
|
||||
curl -sf ru.wttr.in > /dev/null
|
||||
}
|
||||
|
||||
ck_curl
|
||||
if [ $? -eq 0 ] # $? means "output of the last command"
|
||||
then
|
||||
curl -s v2.wttr.in/tomsk?format="%t\n" > /tmp/wttr
|
||||
wttr_net=1
|
||||
else # Non-zero output would appear both when the site \
|
||||
for (( cntr = 0; cntr < 3; cntr++ )) # is down and when you're physically offline
|
||||
do
|
||||
echo "Probing. " > /tmp/wttr
|
||||
sleep 0.5
|
||||
echo "Probing.. " > /tmp/wttr
|
||||
sleep 0.5
|
||||
echo "Probing..." > /tmp/wttr
|
||||
sleep 0.5 # A wee bit of animation
|
||||
done
|
||||
ck_curl # Online check is rerun only once, if the first check fails.
|
||||
fi # In case you're using wifi, and the cron job runs before \
|
||||
# it authenticates
|
||||
if ! [ $wttr_net ]
|
||||
then echo "Offline fr :'( " > /tmp/wttr
|
||||
fi
|
||||
Reference in new issue
Block a user