]> git.saurik.com Git - cydia.git/blob - Library/firmware.sh
c01c23ec9d018372fe8854ce913d6303f4baf1f5
[cydia.git] / Library / firmware.sh
1 #!/bin/bash
2
3 set -e
4
5 shopt -s extglob
6 shopt -s nullglob
7
8 version=$(sw_vers -productVersion)
9 cpu=$(uname -p)
10
11 if [[ ${cpu} == arm || ${cpu} == arm64 ]]; then
12 data=/var/lib/dpkg
13 model=hw.machine
14 arch=iphoneos-arm
15 else
16 data=/Library/Cydia/dpkg
17 model=hw.model
18 arch=cydia
19 fi
20
21 model=$(sysctl -n "${model}")
22
23 status=${data}/status
24
25 function lower() {
26 sed -e 'y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/'
27 }
28
29 # Generate New Package {{{
30 function pseudo() {
31 local package=$1 version=$2 description=$3 name=$4
32 echo "/." >"${data}"/info/"${package}".list
33
34 cat <<EOF
35 Package: ${package}
36 Essential: yes
37 Status: install ok installed
38 Priority: required
39 Section: System
40 Installed-Size: 0
41 Architecture: ${arch}
42 Version: ${version}
43 Description: ${description}
44 Maintainer: Jay Freeman (saurik) <saurik@saurik.com>
45 Tag: role::cydia
46 EOF
47
48 [[ -n ${name} ]] && echo "Name: ${name}"
49 echo
50 }
51 # }}}
52
53 before=$(stat -c '%i-%Y' "${status}")
54
55 output=$(mktemp "${data}"/status-tmp.XXXXXX)
56 chmod 644 "${output}"
57 xxxxxx=${output##*/status-tmp.}
58 rm -f "${data}"/status-tmp.!("${xxxxxx}")
59
60 {
61
62 # Delete Old Packages {{{
63 unset firmware
64 unset blank
65
66 while IFS= read -r line; do
67 #echo "#${firmware+@}/${blank+@} ${line}" 1>&2
68
69 if [[ ${line} == '' && "${blank+@}" ]]; then
70 continue
71 else
72 unset blank
73 fi
74
75 if [[ ${line} == "Package: "@(firmware|gsc.*|cy+*) ]]; then
76 firmware=
77 elif [[ ${line} == '' ]]; then
78 blank=
79 fi
80
81 if [[ "${firmware+@}" ]]; then
82 if [[ "${blank+@}" ]]; then
83 unset firmware
84 fi
85 continue
86 fi
87
88 #echo "${firmware+@}/${blank+@} ${line}" 1>&2
89 echo "${line}"
90 done <"${status}"
91
92 #echo "#${firmware+@}/${blank+@} EOF" 1>&2
93 if ! [[ "${blank+@}" || "${firmware+@}" ]]; then
94 echo
95 fi
96 # }}}
97
98 if [[ ${cpu} == arm || ${cpu} == arm64 ]]; then
99 pseudo "firmware" "${version}" "almost impressive Apple frameworks" "iOS Firmware"
100
101 while [[ 1 ]]; do
102 gssc=$(gssc 2>&1)
103 if [[ ${gssc} != *'(null)'* ]]; then
104 break
105 fi
106 sleep 1
107 done
108
109 echo "${gssc}" | sed -re '
110 /^ [^ ]* = [0-9.]*;$/ ! d;
111 s/^ ([^ ]*) = ([0-9.]*);$/\1 \2/;
112 s/([A-Z])/-\L\1/g;
113 s/^"([^ ]*)"/\1/;
114 s/^-//;
115 / 0$/ d;
116 ' | while read -r name value; do case "${name}" in
117 (ipad) for name in ipad wildcat; do
118 pseudo "gsc.${name}" "${value}" "this device has a very large screen" "iPad"
119 done;;
120
121 (*)
122 pseudo "gsc.${name}" "${value}" "virtual GraphicsServices dependency"
123 ;;
124 esac; done
125 fi
126
127 if [[ ${cpu} == arm || ${cpu} == arm64 ]]; then
128 os=ios
129 else
130 os=macosx
131 fi
132
133 pseudo "cy+os.${os}" "${version}" "virtual operating system dependency"
134 pseudo "cy+cpu.${cpu}" "0" "virtual CPU dependency"
135
136 name=${model%%*([0-9]),*([0-9])}
137 version=${model#${name}}
138 name=$(lower <<<${name})
139 version=${version/,/.}
140 pseudo "cy+model.${name}" "${version}" "virtual model dependency"
141
142 pseudo "cy+kernel.$(lower <<<$(sysctl -n kern.ostype))" "$(sysctl -n kern.osrelease)" "virtual kernel dependency"
143
144 pseudo "cy+lib.corefoundation" "$(/usr/libexec/cydia/cfversion)" "virtual corefoundation dependency"
145
146 } >"${output}"
147
148 # XXX: this is a poor replacement for flock
149 test "${before}" = "$(stat -c '%i-%Y' "${status}")"
150 mv -f "${output}" "${status}"
151
152 if [[ ${cpu} == arm || ${cpu} == arm64 ]]; then
153 if [[ ! -h /User && -d /User ]]; then
154 cp -afT /User /var/mobile
155 fi && rm -rf /User && ln -s "/var/mobile" /User
156
157 echo 6 >/var/lib/cydia/firmware.ver
158 fi